让我们考虑一个场景:假设2个矿工捡起2个不同的未确认交易,并且他们完成了工作证明。如果矿工A首先将区块添加到blockChain,那么矿工B产生的区块将是错误的/无用的,因为他使用的last_Hash现在是错误的,并且他必须使用矿工A的last_hash在第二次添加之前添加添加他的块。 例如
<b>current chian: block1--block2--block3</b>
<table>
<tr>
<td>Miner A </td>
<td>Miner B</td>
</tr>
<tr>
<td>LastHast=block3-hash<br>
currentHast=SHA(block3's_hash,timestemp,data,nonce) <br>
proof of work <br>
add---- Successfully add block4 <br>
</td>
<td>LastHast=block3-hash<br>
currentHast=SHA(block3's_hash,timestemp,data,nonce) <br>
proof of work <br>
add---- Fail because the last hash is now block4's not block3's So currentHash is wrong so the proof of work<br>
</td>
</tr>
</table>
**
答案 0 :(得分:1)
通过让其他矿工验证分类帐上的拟议更改来避免双重支出。 在您的情况下,两个矿工验证了交易,并将结果发布到网络上,并且根据您的协议,这可能很好,因此将在分类账上进行更改。
除此之外,该时间戳服务器可确保您始终构建在唯一的块链之上。
答案 1 :(得分:1)
有效交易总是在最长的链上,最长的是,我的意思是区块数更大。
如果 minerA 和 minerB 同时完成了PoW,则会创建 fork
当前, minerA 和 minerB 事务都存储在完整节点上,并且完整节点正在等待下一个区块的产生。
在下一个阻止时间内, minerA 首先完成PoW,然后认为 minerA 上的派生(数据链)较长,因此 minerA 成为最长的链并被视为有效, minerB 上的区块被视为无效并被隔离。
答案 2 :(得分:1)
首先,这一直在发生,并且建立了协议来处理它。
假设有两个矿工A和B,他们同时为一组不同的交易找到PoW。
矿工下一步要做的就是通过网络广播他们新发现的区块。
此广播不是瞬时的(光速不是瞬时的),因此A附近的矿工将首先从A接收广播,B附近的矿工将首先从B接收广播。
那一刻,A邻居将开始在A块顶部的新块上工作,而B邻居将开始在B块顶部的新块上工作。
网络刚刚分叉,一部分网络正在以区块A结尾的区块链上工作,另一部分网络正在以区块B结尾的区块链上工作。
让我们假设现在有2个新矿工C和D。C是A邻居,并且正在A块之上的新块上工作。 D是B邻居,并且正在B块顶部的新块上工作。
想象一下,C比D首先找到一个新块的PoW。C将把这个块广播到网络。最终,D将收到此C块,并将意识到区块链X-> A-> C的PoW比其正在工作的X-> B还要多。
根据协议规则,D将立即丢弃其正在处理的内容,并将开始在PoW上为X-> A-> C之上的新块工作,从而解决了网络分叉。