比特幣區塊裏的各個字段含義(先寫了個nonce)

https://www.jianshu.com/p/4ffdd8872fa7

nonce是個啥意思?根據bitcoin wiki

The "nonce" in a bitcoin block is a 32-bit (4-byte) field whose value is set so that the hash of the block will contain a run of leading zeros. The rest of the fields may not be changed, as they have a defined meaning.

nonce是一個4-byte大小的區域,nonce的值設定使得該塊的hash是以一串0開頭的。
對於塊數據的一點點改變(比如nonce)都會引起block hash的巨大變化。由於逆向預測hash值相對應的一組bit值(hash原文)是不可行的,在嘗試足夠多的nonce值且計算每個nonce值相對應的block hash之後可以找到一個滿足有指定數量 0 bits (0比特位) 的hash值。而 0 bits的數量值是由difficult設定的。最終產生的hash須得是一個小於當前difficulty值。
因爲這個迭代的計算耗費時間和資源,塊的出現也就是得到了正確的nonce值,這構成了proof of work

以太坊裏的nonce和比特幣裏的nonce還不太一樣!!

關於以太坊裏的nonce 網上很多解釋,很多一上來就是交易計數器, 然而卻把跟POW有關的丟了嗎?事實上以太坊裏的nonce有兩種意思,一個是proof of work nonce,一個是account nonce。

  • Proof of Work nonce:一個無意義的值,可以通過調整值得大小來試圖滿足proof of work的condition。這其實就是挖礦的本質。這個值使得 找出滿足proof of work condition的值 變成了一個依靠運氣的計算密集型的工作。
  • Account nonce:每個帳戶中用來防止重放攻擊的交易計數器。例如,一筆從A到B發送20個幣的交易可以被B不斷重複來消耗A的餘額。
    這是爲了防止雙花攻擊啦。舉個例子比如說
  • 你發出了一筆帶有normal GASPRICE的交易,正等着被礦工加到塊裏。
  • 你發出了另一筆帶有high GASPRICE的交易想使得在第一次交易之前進行第二次交易, 使得第一筆交易無效。
    在以太坊中交易中有一個nonce域,double-spends就不會發生,nonce2的交易不會在nonce1的交易之前被添加進塊(也就是be mined),還要注意的是nonce不能被跳過,也就是說要是你發送了一個nonce3的交易但是沒有發送nonce2,那麼這個交易就沒用。nonce一定要是順序的, no skips.

那智能合約呢?合約也算是Account的一種,那也有nonce嗎?

是的,而且合約裏面的nonce也差不多,也是一個counter。在智能合約裏,nonce的值代表的是該合約創建的合約數量。只有當一個合約創建另一個合約的時候纔會增加nonce的值。但是當一個合約調用另一個合約中的method時 nonce的值是不變的。

在以太坊中nonce的值可以這樣來獲取(其實也就是屬於一個賬戶的交易數量):

eth.getTransactionCount(accountAddress)

但是這個方法只能獲取交易once的值。目前是沒有內置方法來訪問contract中的nonce值的,除了自己定義一個counter來計數...

那好,再來看一下Ethereum Block中的nonce:
以太坊和比特幣區塊鏈一樣,也需要proof of work(計劃轉移到股份證明也早已在做了)。在比特幣區塊鏈中,pow應該是要算出一個符合難度要求的值,通常是以一串0開頭的。這個難度一直在變化。可以查看比特幣區塊鏈的POW難度變化

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章