Nonce 是否儲存在狀態中?
我從白皮書和掌握乙太坊一書中閱讀了這些段落。我很困惑。nonce 是否儲存在 state 中?
白皮書說:
如果由於發送者沒有足夠的錢,或者程式碼執行用盡了gas,導致價值轉移失敗,則恢復除支付費用之外的所有狀態更改,並將費用添加到礦工的賬戶中。
當我們的交易耗盡gas時,我們的隨機數會增加(我測試過)。因此,對於本段,nonce 不儲存在 state 中。
掌握乙太坊書說:
嚴格來說,nonce 是始發地址的一個屬性;也就是說,它僅在發送地址的上下文中才有意義。但是,nonce 並未明確儲存為區塊鏈上帳戶狀態的一部分。相反,它是通過計算來自某個地址的已確認交易的數量來動態計算的。
所以,沒關係。這些段落說的是同一件事:Nonce 不儲存在狀態中。
但後來在同一本書中:
在頂層,我們有乙太坊世界狀態。世界狀態是乙太坊地址(160 位值)到賬戶的映射。在較低級別,每個乙太坊地址代表一個賬戶,包括一個乙太餘額(儲存為該賬戶擁有的 wei 數量)、一個隨機數(如果它是一個 EOA,則表示從該賬戶成功發送的交易數量,或者數字如果它是合約賬戶,則由它創建的合約的數量)、賬戶的儲存(這是一個永久數據儲存,僅由智能合約使用)和賬戶的程式碼(同樣,僅當賬戶是智能合約賬戶時)。EOA 將始終沒有程式碼和空儲存。
和,
隨著程式碼執行的進行,gas 供應量會根據執行操作的 gas 成本而減少。如果在任何時候氣體供應減少到零,我們會得到“氣體不足”(OOG)異常;執行立即停止並放棄交易。不會對乙太坊狀態進行任何更改,除了發送者的隨機數增加並且他們的乙太幣餘額下降以支付塊的受益人用於執行程式碼到停止點的資源。
據我了解,最後兩段說:Nonce 儲存在狀態中。
這到底是怎麼回事?哪一個是真的?我錯過了什麼嗎?
我幾乎可以肯定 nonce 儲存在 state 中,而不是在每次需要時動態確定。(考慮到其他州嘗試的佈局,我無法立即找到一種容易確定的方法……請參見此處。)
黃皮書第 4.1 節規定如下:
賬戶狀態,σ
$$ a $$, 包括以下四個欄位:
- nonce:一個標量值,等於從該地址發送的交易數量,或者,對於具有關聯程式碼的賬戶,該賬戶創建的合約數量。由於地址 a 處於狀態 σ,這將正式表示為 σ$$ a $$ñ。
- 餘額:…
- 儲存根:…
- 程式碼雜湊:…