Discuss / 区块链 / 工作量证明机制疑点

工作量证明机制疑点

Topic source

工作量证明时,需要 Merkle Hash, Timestamp, bits 的参与,但是每一笔交易都会影响到 merkle hash 的值,那么在当前区块产生并进行交易后,它的hash值不就对不上了吗?

以及,在我的理解中,时间戳应该是区块产生的时间,那么将时间戳参与工作量证明机制的运算,不会也对不上吗?比如说,我打在区块头的时间戳是0001分钟,但是我在1分钟内不可能算出nonce的值,时间来到了0002分钟,这样的话我的时间戳又要变成了0002分钟,并重新计算当前时间戳下nonce的值,那这样永远也不可能算得出来啊

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你理解得不对。

矿工先根据交易计算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值就应该要产生变化,矛盾就发生了。而且发生了新的交易后不可能一次次地重新做工作量证明,这样子和发起篡改攻击就无异了。

我知道肯定是我哪里理解错了,但不知道问题出在哪里,希望能够得到解答。

再次感谢您的回复。

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

第一笔交易就是奖励,给自己的,先写好,再计算merkle:

merkle = dhash(tx0 + tx1 + tx2...)

tx1, tx2才是别人正常转账交易

我不是这个意思。

按照我的理解,新区块生成时:

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

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

新交易不管,后面的区块再打包。

当前区块包含的交易已经被矿工确定了,他想打包几个就打包几个

出于经济利益考虑,矿工肯定是按矿工费从高到低尽可能多打包

感谢,理解了。

疑惑的原因是因为我对于区块与交易记录的关系没有弄明白,谢谢。

祝您2021幸福。

请问有一下,矿工是在新块开始后,积累到一定量的交易后才会开始去解这个数学难题吗?

请问有一下,矿工是在新块开始后,积累到一定量的交易后才会开始去解这个数学难题吗?

这个要看矿工本人了,矿工就是记账的,他想怎么记账就这么记账。他想一次记账就记录一个人就记录一个人的。他记账时想记录多个人的账也是可以的。出于经济利益考虑,矿工肯定是按矿工费从高到低尽可能多打包。


  • 1

Reply