Hi 游客

更多精彩,请登录!

比特池塘 区块链技术 正文
9 K) h5 F& I( g: M" c. e. d
nonce是个啥意思?根据bitcoin wiki
8 Q6 c6 _; @. i; e3 H% z8 D5 c% Z2 c( p; b6 Z% F" r: o8 @# b  ~" B
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.9 x6 n; z! L  V3 P( d  u

& c* P( I4 m  Wnonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。
2 l+ s7 W7 |; U# w4 e$ N7 C0 T" F) q( z% r6 c; r
对于块数据的一点点改变(比如nonce)都会引起block hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的block hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。) T- T( V5 i1 e0 K1 t4 d
& S- r1 X1 C2 A6 M) G0 }% S
因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了proof of work
( F. X8 U  T2 O0 e; m2 W& B- i/ j& ^) O. w2 }
以太坊里的nonce和比特币里的nonce还不太一样!!) h9 }8 P: S* ]+ g# y

, V- e6 v' ~& w; Q/ U关于以太坊里的nonce 网上很多解释,很多一上来就是交易计数器, 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
$ P0 x0 r$ }. i, U; A) Q5 m
  _9 \' g/ q8 u7 Y" J**Proof of Work nonce:**一个无意义的值,可以通过调整值得大小来试图满足proof of work的condition。这其实就是挖矿的本质。这个值使得 找出满足proof of work condition的值 变成了一个依靠运气的计算密集型的工作。
) }1 [# Q0 Z1 a$ W2 q' L3 s/ h9 A
1 d' p: N1 R9 ?% E**Account nonce:**每个帐户中用来防止重放攻击的交易计数器。例如,一笔从A到B发送20个币的交易可以被B不断重复来消耗A的余额。3 [1 N2 z! C& r# y; h. H

9 o" ~, @( |3 I+ R, u1 w, T. X这是为了防止双花攻击啦。举个例子比如说
3 U  y+ {5 L; j; f
% B* }5 ?6 f) d* ^* ?( i  J你发出了一笔带有normal GASPRICE的交易,正等着被矿工加到块里。. d8 b4 I5 ?) b! n; W. f- ]$ L

+ K* E4 P7 M2 b0 Z  @8 Q8 Y你发出了另一笔带有high GASPRICE的交易想使得在第一次交易之前进行第二次交易, 使得第一笔交易无效。
8 u& N% R) g4 a$ o
, Y& a0 U* n8 ^  M: e5 d& L- ?+ A在以太坊中交易中有一个nonce域,double-spends就不会发生,nonce2的交易不会在nonce1的交易之前被添加进块(也就是be mined),还要注意的是nonce不能被跳过,也就是说要是你发送了一个nonce3的交易但是没有发送nonce2,那么这个交易就没用。nonce一定要是顺序的, no skips.. d9 `. W3 {% z- f! i
4 I" W" I% \4 |) \) W. l) W% p
那智能合约呢?合约也算是Account的一种,那也有nonce吗?
: J; t3 \7 o% Q$ N9 g8 l
, W7 }6 b! w0 p$ c# o" K是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。8 H4 x! a' `& f+ x: j
8 \+ a( X* r1 B* Q% {$ ~$ o0 @1 d+ E
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
* n" U' z4 e, z9 _/ U) F: l
* X5 U+ I$ F9 l5 q7 `4 meth.getTransactionCount(accountAddress)
3 m, ?2 W/ b# E4 D! }1 F8 k
: d# h- y" K; S- q但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数…, l6 {# `1 |+ u# w

& u# c( `8 G" N# q: R! O9 M: w那好,再来看一下Ethereum Block中的nonce:/ J% {1 {% b, \& P" B

* k  T5 z7 _; u7 f& x以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看比特币区块链的POW难度变化。
$ E1 h# F& n& ?( T" Y7 f2 |
BitMere.com 比特池塘系信息发布平台,比特池塘仅提供信息存储空间服务。
声明:该文观点仅代表作者本人,本文不代表比特池塘立场,且不构成建议,请谨慎对待。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

成为第一个吐槽的人

李悔之2015 初中生
  • 粉丝

    1

  • 关注

    0

  • 主题

    13