Qtum量子链的基本特性及原理解析(4)
时间:2023-09-22 14:16 来源:网络整理 作者:墨客科技 点击:次
“币龄”这个概念其实早就从共识机制中移除,现在的 PoS3.0 系统已经可以解决很多初始版本遇到的安全性问题,甚至在抵抗 51% 攻击上比 PoW 系统更具优势。 02、PoS + 智能合约带来的问题 Qtum 没有直接采用 PoS3.0,不是因为共识机制本身有问题,而是由于 PoS 和智能合约的结合可能带来潜在的攻击可能。攻击者可以通过支付比较昂贵的 gas 发起一系列“垃圾合约”。虽然这将消耗很多的 gas,但由于矿工可以获得交易中的 gas 作为奖励,只要攻击者的合约设计得当,就能保证其他节点无法正常处理该交易,而攻击者则可利用先验知识成为区块的生产者,从而将攻击成本全部收回,实现零成本的 DoS 攻击。 但是为何现有用 PoS 共识机制的区块链项目就不会有这个问题,因为它们大部分只支持非图灵完备的脚本语言,无法支持上述的“垃圾合约”(实际上需要循环操作)。但是在Qtum 上既支持 PoS,又支持智能合约,使上述攻击成为可能。 Qtum 的解决方案是 :通过和其他节点分享收益并将收益延迟化,增加攻击的成本。Qtum 在 PoS3.0 的基础上修改激励返还机制,实现了 MPoS(Mutualized Proof-of-Stake)。 MPoS 的基本原理 :每个区块奖励由 10 个矿工平分,其余奖励延迟 500 区块。即 1/10 区块奖励立刻获得,其余 9/10 奖励在 500 个区块之后连续 9 个块中获得。挖矿奖励 = 区块所得 + 手续费 + 运行智能合约 gas 费用。这个简单改进在不改变 PoS3.0 的核心逻辑的前提下,使攻击者无法预测获得区块奖励的多少,也无法立即获得区块奖励,从而极大提高了发动上述“垃圾合约”攻击的成本(仅存在理论可能性,实际操作中完全无法实现)。 03、PoS 的实现细节 Qtum 的底层代码源于比特币,其采用的是 PoW 共识机制。如何将 PoS 应用到其中,并进一步实现 MPoS 呢?Qtum 团队做了以下实现,供公链开发者参考 ,实现 PoS 区块验证和挖矿功能,具体细节如下 : • 同时支持 PoW 和 PoS 区块,因为在初始阶段需采用 PoW 生成初始代币,在一定高度后变为纯 PoS • 每个区块的 stake modifier 都会发生改变 • coinage(币龄)不能改变 PoS 哈希值 • 交易费不会作为共识规则 • 需要最近的 500 个区块用于验证 PoS,这里区块不宜太多,否则数据量太大难以处理 • 没有币龄概念,只需要币达到一定的确认数(如 500 个区块)就可以进行 PoS 挖矿 • 增加 PoS 相关的共识参数:区块签名,区块类型(PoW 还是 PoS),前一个 stake 位置,以及 staking 交易创建时间等 • 区块出 coinbase 交易外(实际上 coinbase 交易已经没有实际作用),还需要增加coinstake 交易,用于生成和分配区块奖励 • 接收区块时要检查区块头,因为处理 PoS 区块时,需要处理重复哈希和孤块问题 • Staker 只需要才成功发现 stake 后才继续处理交易,否则将导致交易被多次处理,特别是对于合约交易,多次处理可能会浪费大量时间,这点与 PoW 区块的交易处理略有不同 • 由于 AAL 引入了智能合约,PoS 区块的交易不仅需要估计交易本身自带的 sigop 的大小,还需要考虑由于智能合约产生的“condensing 交易”所引入的额外交易,否则将导致有可能生成超过区块大小限制的交易,影响系统安全性。 关于 MPoS 的实现细节包括 : • 发送给 MPoS staker 的区块奖励必须来自于 staking 区块 • stake 交易必须包含至少 10 个输出(outputs),1 个给区块创建者,9 个给 MPoS staker • stake 交易的第 1 个 10 个 outputs 是共识相关的,必须准确地按照 MPoS staker 挖矿的区块高度正确地排列,且创建者为第一个 output • stake 交易可以包含额外的 outputs,例如,将一个大的 staking UTXO 分成多个 UTXO,input 也可以包含多个输入,比如讲零散的 UTXO 自动合并成较大的 UTXO。在第 10个 output 后,对于 output 不应该有任何特殊的共识规则,只要交易的 output 值不会41超过输入值 + 区块奖励 + 费用 • 前 500 个 PoS 区块不使用 MPoS,因此区块的创建者获得全部的奖励,不需要使用前面的规则 点击阅读原文查看,Qtum 原始设计文档及源码 04、小结 (责任编辑:admin) |