工作量证明机制疑点
Topic source你理解得不对。
矿工先根据交易计算merkle hash,这样整个区块数据除了需要填入的nonce,其他都固定了:
version: xxx
prevHash: xxx
merkle: xxx
timestamp: xxx
bits: xxx
nounce: ???
tx-0, tx-1, tx-2...
现在就剩下计算block hash了。nounce需要用不同的值填进去试,试到哪个成功就用哪个
timestamp并不是100%准的,它只要比上一个区块大就行,自己估一个值
区块的时间只是个大概,根本不可能准,就算你填准了,等网络传到别人那里每个人收到的时间都不同
非常感谢您的回复。
关于时间戳的问题我理解了,感谢您的解答。
不过关于第一个问题,我知道产生新的区块时计算merkle hash是通过系统奖励的第一笔交易得来的。我疑惑的点在于,新的区块产生后,对这个区块肯定要产生新的交易,比如区块创建者向其它人转账的第二笔交易,那么这第二笔交易应该是要影响到区块头中的merkle hash值的(如果没理解错的话)。一旦发生了新的交易,merkle hash值产生了变化,那么通过仅有第一笔交易得到的整个区块的hash值就应该要产生变化,矛盾就发生了。而且发生了新的交易后不可能一次次地重新做工作量证明,这样子和发起篡改攻击就无异了。
我知道肯定是我哪里理解错了,但不知道问题出在哪里,希望能够得到解答。
再次感谢您的回复。
我不是这个意思。
按照我的理解,新区块生成时:
version: xxx
prevHash: xxx
merkle: merkle_0
timestamp: xxx
bits: xxx
nounce: nounce_0
tx0
merkle_0 = dhash(tx0)
blockHash_0 = sha256(xxx, xxx, merkle_0, xxx, xxx, nounce_0)
新交易记录产生后:
version: xxx
prevHash: xxx
merkle: merkle_1
timestamp: xxx
bits: xxx
nounce: nounce_1
tx0, tx1
merkle_1 = dhash(tx0, tx1)
blockHash_1 = sha256(xxx, xxx, merkle_1, xxx, xxx, nounce_1)
由于增加了交易记录tx1,导致merkle_1发生了变化,那么就需要重新计算nounce_1,以及blockHash_0 != blockHash_1
请问有一下,矿工是在新块开始后,积累到一定量的交易后才会开始去解这个数学难题吗?
这个要看矿工本人了,矿工就是记账的,他想怎么记账就这么记账。他想一次记账就记录一个人就记录一个人的。他记账时想记录多个人的账也是可以的。出于经济利益考虑,矿工肯定是按矿工费从高到低尽可能多打包。
- 1
用户6474990672
工作量证明时,需要 Merkle Hash, Timestamp, bits 的参与,但是每一笔交易都会影响到 merkle hash 的值,那么在当前区块产生并进行交易后,它的hash值不就对不上了吗?
以及,在我的理解中,时间戳应该是区块产生的时间,那么将时间戳参与工作量证明机制的运算,不会也对不上吗?比如说,我打在区块头的时间戳是0001分钟,但是我在1分钟内不可能算出nonce的值,时间来到了0002分钟,这样的话我的时间戳又要变成了0002分钟,并重新计算当前时间戳下nonce的值,那这样永远也不可能算得出来啊