比特币区块里的各个字段含义:从nonce开始
李悔之2015
发表于 2022-11-13 23:55:48
155
0
0
nonce是个啥意思?根据bitcoin wiki
" K! U& j x+ {9 }& K& g
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.* \8 @6 @& P! z8 m. c4 L
" d6 I5 I% b6 j! I
nonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。8 \# |$ T6 o c( m" B
; y" ^- y5 i1 }) d
对于块数据的一点点改变(比如nonce)都会引起block hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的block hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。- ~+ k; ~- ]. ?, U& L q. S
% k; \! S' F G" f; |5 [8 ]4 S& T
因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了proof of work
以太坊里的nonce和比特币里的nonce还不太一样!!
关于以太坊里的nonce 网上很多解释,很多一上来就是交易计数器, 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
. y8 u6 U6 ?; Z
**Proof of Work nonce:**一个无意义的值,可以通过调整值得大小来试图满足proof of work的condition。这其实就是挖矿的本质。这个值使得 找出满足proof of work condition的值 变成了一个依靠运气的计算密集型的工作。
**Account nonce:**每个帐户中用来防止重放攻击的交易计数器。例如,一笔从A到B发送20个币的交易可以被B不断重复来消耗A的余额。6 {7 Q3 D& Q; w! h# T8 M9 v
( q1 T: a1 @& I" t L
这是为了防止双花攻击啦。举个例子比如说# a' x# d9 k; t# @; e# Z
你发出了一笔带有normal GASPRICE的交易,正等着被矿工加到块里。, s7 d a+ O2 u1 Y& @
你发出了另一笔带有high GASPRICE的交易想使得在第一次交易之前进行第二次交易, 使得第一笔交易无效。* B4 w, m/ u) o- _
在以太坊中交易中有一个nonce域,double-spends就不会发生,nonce2的交易不会在nonce1的交易之前被添加进块(也就是be mined),还要注意的是nonce不能被跳过,也就是说要是你发送了一个nonce3的交易但是没有发送nonce2,那么这个交易就没用。nonce一定要是顺序的, no skips.$ u1 C) U- p- i% ]1 I
4 q9 ^2 s# e# S+ h7 [, h
那智能合约呢?合约也算是Account的一种,那也有nonce吗?! b- n5 e4 n& o M5 V
. C6 V0 X g$ f: Z
是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
. w0 w/ g* @$ X+ p" s8 d
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):) L; |7 f) _* K/ J- k7 _! Z
/ o7 c7 J+ I% K! }/ {1 u" s; |% y
eth.getTransactionCount(accountAddress)! t5 f2 j% ], J& @
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数…
那好,再来看一下Ethereum Block中的nonce: u& L6 B5 B6 M& ^, [ f: x: W
以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看比特币区块链的POW难度变化。
成为第一个吐槽的人