Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文

; E0 p" i: F6 u: o1 m5 [, ynonce是个啥意思?根据bitcoin wiki2 `6 c: S7 e: `& ]. r( w( a
0 I, j6 B/ n# W, l, ~8 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.
; ~4 d6 f0 q8 j" c7 x) h7 W: `: w' D0 j
nonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。
* [2 W/ m6 g0 I& ]! j. ~" W/ m8 E6 p+ W& X
对于块数据的一点点改变(比如nonce)都会引起block hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的block hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。
# m8 ^7 P2 T* M- J
5 f1 z0 d* C+ o' z5 [$ U5 ]  e因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了proof of work1 e" V4 b$ O+ n, }6 v  U+ D

& j8 m8 T; f8 _* t# W/ ~/ S. h' J以太坊里的nonce和比特币里的nonce还不太一样!!
+ }+ w7 K- t$ n% }% N% m
5 O* e. x: M! P/ v% y3 K关于以太坊里的nonce 网上很多解释,很多一上来就是交易计数器, 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
9 Y. V& |6 e7 t# U
4 a) b* C4 \% U9 e6 T( n. c**Proof of Work nonce:**一个无意义的值,可以通过调整值得大小来试图满足proof of work的condition。这其实就是挖矿的本质。这个值使得 找出满足proof of work condition的值 变成了一个依靠运气的计算密集型的工作。- |: c  i, g$ g" t# |

6 l) _; w! K* ]# \2 E; c9 c) k  p**Account nonce:**每个帐户中用来防止重放攻击的交易计数器。例如,一笔从A到B发送20个币的交易可以被B不断重复来消耗A的余额。
- ?0 z2 i! ^2 T: L2 w3 z
) C* d/ V5 F0 c这是为了防止双花攻击啦。举个例子比如说
% [- N- X$ P! L7 j2 H- R- _, l& D/ n" R1 X% V
你发出了一笔带有normal GASPRICE的交易,正等着被矿工加到块里。! \( P- O, S: n+ Q( ^8 O, G

. D& k7 p4 u4 E, W/ K! |你发出了另一笔带有high GASPRICE的交易想使得在第一次交易之前进行第二次交易, 使得第一笔交易无效。
! T' g6 t& }0 M
/ O! T: X7 l$ a  e0 C3 \在以太坊中交易中有一个nonce域,double-spends就不会发生,nonce2的交易不会在nonce1的交易之前被添加进块(也就是be mined),还要注意的是nonce不能被跳过,也就是说要是你发送了一个nonce3的交易但是没有发送nonce2,那么这个交易就没用。nonce一定要是顺序的, no skips.
$ O% g7 I; c: G$ ^+ a3 T; P/ U4 ]% D5 L6 m/ O2 p
那智能合约呢?合约也算是Account的一种,那也有nonce吗?
4 N0 x% A- y, f: j- U; a, M& c3 A/ J, S' z6 t1 {0 a0 n7 ^
是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。! c6 o4 I6 a1 [1 I9 M8 A$ r
6 h- i7 d) s* }
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
6 |1 t2 A- n' G6 e( Q+ X% w/ Z. f. ]7 ~
eth.getTransactionCount(accountAddress)1 }4 k/ i% J% a% g! [0 m9 T. p+ @
5 t1 X+ n  d8 W3 a2 r
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数…
9 W! B. @) E/ }6 \$ w4 u& H
) ]2 s: f* q0 L0 ]1 d& w: X那好,再来看一下Ethereum Block中的nonce:; B4 x/ a' ^5 ~9 g) D

; B# h1 k$ L3 L8 ^以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看比特币区块链的POW难度变化。$ X/ h6 }' G9 N+ w, i4 A) y
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13