Blockchain 使用桩号证明时,为什么区块头需要矿工签字?
我正在阅读以下关于PoS的文章 在这篇文章中,作者说 块散列必须由下注交易的第二个vout中的公钥签名 为什么这是必要的?使用PoS时,由于投币交易的输入来自矿工,因此矿工已经在投币交易的输入上提供了解锁脚本。她为什么要在街区签名 可在PIVX中找到参考实现:Blockchain 使用桩号证明时,为什么区块头需要矿工签字?,blockchain,Blockchain,我正在阅读以下关于PoS的文章 在这篇文章中,作者说 块散列必须由下注交易的第二个vout中的公钥签名 为什么这是必要的?使用PoS时,由于投币交易的输入来自矿工,因此矿工已经在投币交易的输入上提供了解锁脚本。她为什么要在街区签名 可在PIVX中找到参考实现: class CBlock : public CBlockHeader { public: // network and disk std::vector<CTransaction> vtx; // ppcoin: bloc
class CBlock : public CBlockHeader
{
public:
// network and disk
std::vector<CTransaction> vtx;
// ppcoin: block signature - signed by one of the coin base txout[N]'s owner
std::vector<unsigned char> vchBlockSig;
在PoW系统中,不需要块签名,因为通过哈希有效负载事务的Merkle树根(Merkle根)和nonce生成块ID,直到哈希小于目标 如果在PoS系统中使用类似的方法,恶意minter可以从同一个内核UTXO(transaction output,mints coins)使用不同的输出哈希生成大量尝试-只需修改nonce和/或重新排列Merkle树中的事务,就有很多组合。通过这种方式,他可以将PoS减少到PoW(使用相同数据进行大量哈希尝试) 为了防止这种降级,PoS加密(PPC、EMC等)限制了某些特定UTXO的尝试次数。散列结果(与目标相比)仅取决于内核UTXO和当前时间,而与nonce、块负载等无关。因此,PoS minter每秒只能对每个成熟的UTXO进行一次尝试 但是,通过这种方法,块内容不参与内核散列,而内核散列与目标散列相比较 因此,如果minter没有对块进行签名,恶意参与者可以进行以下攻击:他可以从网络截获minter新创建的块,修改有效负载事务和Merkle树和块哈希(例如,添加double-spend TX),并在网络上重新分发修改后的块。这样的块将包含有效的coinstack事务(使用内核UTXO),并将被网络节点接受 为了防止这种“动态修改新创建的块”,块由内核UTXO的地址签名。通过这个签名,minter提供了一个证据:区块是由同一个minter创建的,他生成了一个CoinStack TX 因此,对于PoS,块生成如下:
- 找到合适的内核UTXO
- 生成CoinStack事务,该事务将硬币从内核UTXO地址发送到自身李>
- 创建一个新的块,包含此CoinStack TX和payload TX
- 使用内核UTXO的硬币地址对此块进行签名
实际上,只要签署一个标题,就足以包含Merkle根。感谢您的解释。我的理解是,恶意参与者很可能会修改硬币赌注交易的输出,以将奖励发送给自己。恶意参与者无法修改硬币赌注输出,就像他无法修改任何其他交易的输出一样,接收到mempool中。若他这样做,他将使TX签名无效,交易也将无效。我理解你们的意思。没有人能够修改tx,因为事务的每个输入都包含一个签名。然后我的问题变成了恶意参与者修改PoS块的动机是什么?通过修改一个块,恶意参与者很可能会创建一个链叉,然后经过一段时间,叉将被解决,因此恶意行为的效果将是徒劳的。是的,叉将被解决。但很有可能-针对恶意参与者,即其更新的块将被接受为“受信任”。通过这一行动,恶意“窃取”无辜铸币者的铸币权力。如果他有系统地做到这一点,他可以巩固高“铸造能力”,并创造51%的攻击。
key.Sign(block.GetHash(), block.vchBlockSig)