iT邦幫忙

2022 iThome 鐵人賽

DAY 19
1
Web 3

Smart Contract Development Breakdown系列 第 19

Day 19 - Nonce(內有空投活動)

  • 分享至 

  • xImage
  •  

Nonce

為了增加觸及:大家在下方留言你的 Polygon 地址,前 5 位可以免費獲得最近我同學做的 NFT 空投(Bakajohn)!

在資訊安全中,Nonce 是一個在加密通信只能使用一次的數字。在認證協定中,它往往是一個隨機或偽隨機數,以避免重送攻擊。Nonce 也用於串流加密法以確保安全。如果需要使用相同的金鑰加密一個以上的訊息,就需要 Nonce 來確保不同的訊息與該金鑰加密的金鑰流不同。引用自《維基百科-Nonce》

Synchronization Link Tree

Intro

在以太坊中主要有兩種 Nonce,一種是 Account Nonce,為每一個 Accoun 都有的一個交易計數器;另一種則是 Proof-Of-Work Nonce,是一個區塊(in the block headers)的隨機數。

以下介紹引用自《Yellow Paper》

The Block.: nonce: A 64-bit value which, combined with the mixhash, proves that a sufficient amount of computation has been carried out on this block; formally Hn.

The account state, σ[a]: nonce: A scalar value equal to the number of transactions sent from this address or, in the case of accounts with associated code, the number of contract-creations made by this account. For account of address a in state σ, this would be formally denoted σ[a]n. 引用自《Yellow Paper》


Account Nonce

Account Nonce 並不是 Ethereum Blockchain 中的一個 Global State,而是一個動態計算出來的結果,通常代表目標地址(EOA)發出過的 Confirmed(已打包) 交易數,從前兩天的文章【Cryptography】、【Sign & Transaction】我們可以知道一筆交易通常由九種資訊組成,Nonce 就是其中一個元素。同一個 Account 交易的執行順序以及礦工挑選交易執行順序都跟 Nonce 有關,不可以跳號,要遞增並且連號的執行。

Account Nonce 通常用來解決兩個問題:一個是交易的執行順序,另外一個則是用來防範 replay attack。

1. Order of transactions

在我們把交易送出之後,他會先進到 Mempool 中等待礦工做打包驗證,也就是 Pending 的狀態(這個在 Geth 的文章會稍微提到),但如果我們有意或者無意地把兩筆交易同時送出,但其實我們沒有兩筆交易加起來那麼多錢呢?其實我們沒辦法真正意義上的同時送出兩筆交易,他們之中還是有先後順序的。

這也就是我們如何避免雙重支付(Double Spending),在沒有 Nonce 的情況下礦工沒辦法知道交易的執行順序,也就無法確認要先執行哪筆交易。以太坊的節點們可能沒辦法確定自己會先收到哪個 Nonce 順序的交易,但如果節點發現自己當前收到的交易已經是跳號的,那就不會確認他而是等待中間的連號都被送達並確認,才會繼續驗證。

這樣大家可能會發現一個問題,那就是如果 nonce 1 的 Gas 不足或者交易無效,那後面的交易不就會被卡住了嗎,或者是如果我們傳輸相同 Nonce 的兩筆交易,到底哪一筆交易會被確認呢?

實際上我們必須要自己去追蹤 Nonce 的執行狀況,強迫自己在交易失敗的時候再去發送一筆相同 Nonce 的交易。在通過 Mempool Pending 的狀態之後,只要確認前面的交易是結束的(失敗或者取消皆是),那就可以逕直執行下一筆交易。通常我們追蹤管理 Nonce 都是透過 Wallet,畢竟使用 Geth 還是有一點點麻煩(笑。

2. Prevention of Replay Attacks

Replay Attacks 的意思是當我們的交易被打包到區塊鏈上之後,就會成為一個公開透明的資訊,那有心人士是不是就可以複製他們然後送到區塊鏈網路中呢,例如我們複製某個人要匯款給我們的交易然後不斷執行它們,是不是就可以把某個人的帳戶掏空!這時候 Nonce 便是在其中使其有一個擾動的組成,Nonce 使得送出交易的人必須每次都 Sign,因為即便交易內容相同(收款人、Value 相同),Nonce 也是不同的。此外,如果礦工發現當前處理的交易是過往某一筆交易的複製品,那就會拒絕打包這筆交易。

Contract Nonce(EIP-161)

Contract 同樣也有 nonce 的存在,EIP-161: State trie clearing (invariant-preserving alternative) 規定了 contract nonce 是從 1 開始,而 EIP-161 之前則是從 0 開始。這個 nonce 適用於一個合約產生另外一個合約時使用,如果是 internal call(使用合約呼叫合約函式)則跟 contract nonce 無關。

Appendix: Ethereum vs. Bitcoin

GHOST = Greedy Heaviest Observed Subtree protocol: 代表以太坊的共識機制的一個特色,主要是因為以太坊出塊速度較快,分岔後的區塊可能會在未來被整併進主鏈之中,當然之中的交易也會納入參考,這種分岔的區塊就是叔塊(Uncle Block),

這邊再特別拉 Bitcoin 以及 Ethereum 出來講,比特幣是一個純粹的加密貨幣支付系統,而以太坊有狀態的概念因此平台上可以構建及運行智能合約(去中心化應用程式),這兩個某種程度上是屬於不太一樣的系統架構,用途基本上是完全不同。


Closing

明天會介紹從以太坊消失的 PoW 以及其 Nonce。

Reference


最後歡迎大家拍打餵食大學生0x2b83c71A59b926137D3E1f37EF20394d0495d72d


上一篇
Day 18 - Signature, Sign, Sign Message & Transaction
下一篇
Day 20 - Proof-Of-Work (內有空投活動)
系列文
Smart Contract Development Breakdown30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
DaYuan
iT邦新手 4 級 ‧ 2022-09-19 06:57:11

好文支持
0xc1231608303206D5554304EdaB6Dc7Ec3d20A62e

ALu iT邦新手 3 級 ‧ 2022-09-19 09:53:09 檢舉
0
koopa
iT邦新手 5 級 ‧ 2022-09-19 09:57:05

支持!!
0x5eE7d5Ae60d3FD642d9716a696B71B37aC8927dC

ALu iT邦新手 3 級 ‧ 2022-09-19 10:01:50 檢舉
0
foodchain
iT邦新手 3 級 ‧ 2022-09-19 13:11:14

<3 感謝大哥宣傳

ALu iT邦新手 3 級 ‧ 2022-09-19 13:36:19 檢舉

/images/emoticon/emoticon13.gif

0
Cuvy Jet
iT邦新手 5 級 ‧ 2022-09-19 23:23:35

Account Nonce的部分寫得還滿清楚的。

特別去Etherscan確認了自己地址的交易數。

(有Mint過Bakajohn了,空投機會留給別人)

0

好硬的文章
0xA9648F00a0dD4FC8d5281d20741fD466459c706B

ALu iT邦新手 3 級 ‧ 2022-10-19 13:14:01 檢舉

我要留言

立即登入留言