Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blockchain 使用桩号证明时,为什么区块头需要矿工签字?_Blockchain - Fatal编程技术网

Blockchain 使用桩号证明时,为什么区块头需要矿工签字?

Blockchain 使用桩号证明时,为什么区块头需要矿工签字?,blockchain,Blockchain,我正在阅读以下关于PoS的文章 在这篇文章中,作者说 块散列必须由下注交易的第二个vout中的公钥签名 为什么这是必要的?使用PoS时,由于投币交易的输入来自矿工,因此矿工已经在投币交易的输入上提供了解锁脚本。她为什么要在街区签名 可在PIVX中找到参考实现: class CBlock : public CBlockHeader { public: // network and disk std::vector<CTransaction> vtx; // ppcoin: bloc

我正在阅读以下关于PoS的文章

在这篇文章中,作者说

块散列必须由下注交易的第二个vout中的公钥签名

为什么这是必要的?使用PoS时,由于投币交易的输入来自矿工,因此矿工已经在投币交易的输入上提供了解锁脚本。她为什么要在街区签名

可在PIVX中找到参考实现:

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)