打印
分类:极客论道
点击数:10773

比特币原理研究之nounce

nounce是一个4字节数字,用来改变blockhash。

其实本可以不用nounce, 因为只要改变coinbase,就会改变block hash。

但是,如果不加nounce,打包的tx越多,算hash就越费时。所以矿工为了保证挖矿效率,会彻底不打包tx,拿一个光板coinbase去算blockhash。那么tx没人确认,比特币就等于判死刑了。

所以,加nounce是基于商业考虑,而非技术考虑。很有意思。

那么,nounce为什么是4个字节,而不是32个字节呢?

4个字节就是4G,现在单个芯片的算力都在10G左右了,遍历一遍nounce只需不到1秒。而且将来算力会继续增长,遍历4个字节需要的时间会越来越短。

其实真的可以是32个字节,一个block省28个字节,没啥意义。

这样设置nounce有一个好处,还是鼓励打包tx。假设nounce是32个字节,那么最快的方法就是做好merkel root,持续算,这样新出来的tx就没空打包了,只能等下一个block。

而如果用4字节nounce,当nounce遍历过之后,必须改变merkel root了,要么改coinbase,要么加入新tx,那当然是加新tx好了,还可以有一些手续费收入。

nounce的另一个好处是抑制了矿池效率,进而促进矿池多元化。因为矿工是收merkel root来算hash的,所以遍历4个字节之后,必须要重发新的merkeltree。这样增加了通讯频率,不管程序如何优化,通讯频率的提高肯定会降低挖矿效率。

当然了,矿池优化也很容易(暂时卖关子不说)。所以这个好处肯定不是设计初衷。

其实倒回来想,中本聪肯定以为4个字节100年都够用了,不会想到可能在几年之内就被用光。