简介
中本聪在其开创性的比特币论文中首次将分布式时间戳协议应用于去中心化金融网络,后续从业余爱好者和专业人士那里该领域已经取得了爆发式的研究进展,各方的相互竞争促进了对现有协议的扩展、调整、改进和细化。引人注目的新想法的实现包括Ethereum (其扩展了脚本)、CryptoNotes(其改进了隐私)和侧链(其研究了与比特币代币的1:1双向锚定)。这些协议都实现了最初在比特币白皮书里描述的工作量证明(PoW)。
对于比特币协议的一个常见扩展是修改其共识机制,使用部分或者完全的权益证明(PoS)或者使用一个权益(Token), 而不是算力来参与时间戳的处理。第一个基于比特币协议的权益证明区块链在2012年由King和Nada实现,包含了PoW 和PoS,随着时间的推移该区块链项目会逐渐转向完整的PoS。对于纯PoS共识系统的批评是很多的,最强烈的反对来自于那些使用纯PoW区块链的人士。对于分布式时间戳系统,最常见的对于PoS的反对意见是“不承担任何风险”或“不花钱的模拟”,其描述了系统的不稳定性来源于权益持有者能够毫不费力地生成相应的时间戳历史。
尽管有争议,但很明显,那些叠加在PoW时间戳系统之上的PoS系统很显然也可以独立地实现共识。Bentov 和同事在他们的论文中探讨了活动量证明(PoA),这似乎是对于PoW协议的-个可行性扩展并且可能会启用- -些新的有趣属性。2013年早些时候Mackenzie提出了类似的称为MC2的设计。本文我们阐述了类似的我们称之为“Decred”的共识系统的搭建和实现。
1.混合PoW/PoS设计
与前述中本聪机制的主要差别是一个新的彩票系统,在可以选择和消费彩票之前必须购买彩票并等待到期的时期。根据区块头部中包含的伪随机数,在到期的票池中按字典序为区块进行彩票的选择。因为在PoW系统中操纵这种伪随机数是很困难的,所以选票操作会与PoW矿工的基本成本相关联。我们可以通过概率密度的数来描述一段时间之内的选票选择问题,其类似于在恒定的难度下以恒定的哈希速率在PoW共识机制中生成区块的概率,以近似于一半票池大小的模式产生一个概率分布。选票的购买价格是由一个新的权益难度控制的,而权益难度由购票的指数权重平均值以及先前区块中的到期选票数目来决定。
以下步骤解释了PoW区块的确认过程:
i.区块是由PoW矿工挖矿产生的,矿工选择交易并放入区块里。与权益系统相关的交易被插入到UTXO集合中。
ii. PoS矿工通过他们的选票发起一个投票 交易在区块上进行投票,投票能够在前一个区块之上构建一个区块,并且不管前一一个常规交易树(包含coinbase和非权益相关的交易)是否有效,都会选择一个区块。
ili另外一个PoW矿工开始构建一个区块并插入PoS矿工的投票。已投选票的大多数都会被包含在后续的区块中,并被网络所接受。在这个新区块的投票交易中,PoW矿工会检查一个标记来确定PoS矿工是否指示了区块的常规交易树是有效的。这些投票标记会被记录。如果前一个区块的常规交易树是有效的,那么会在区块中基于大多数选票来设置一个比特位标记来指明该信息。
iv.最后会找到一个满足网络难度的随机数,并且该区块被插入到区块链中。如果确认了前一个区块的常规交易树,就将这些交易插入到UTXO集合中,并返回到第i步。
为了防止对于已经纳入的选票的操纵,如果矿工没有将所有的投票交易纳入区块中,那么会对当前的区块采用线性的补贴处罚。对以前那些交易树进行失效动作的“软”处罚有助于防止丢弃工作,这对于确保系统安全是必要的,并且假设下一个区块将由一个无私的保留前面区块补贴的矿工获得,以便获得支持。即使不是这样的情况,具有高哈希率的恶意矿工仍然至少需要(数量为大多数的数目/2)+1个选票支持他们之前区块的交易树,以便产生一个新区块,使得他们可以从前面的区块获得任何补贴。
比特位标记会被显式地添加到区块头部和投票中以便矿工可以轻松地进行硬分叉或者软分叉。
2.去中心化权益池
早先的PoS设计带来的一个问题就是如何在PoS挖矿时执行类似于PoW挖矿的池化矿池对PoW矿池是有利的,但是PoS矿池除了简单地运行一个节点,.不需要专门的硬件,而且也不像PoW挖矿那样,集中化推进挖矿的场景会随着成本增加带来利润下降。Decred通过允许为同一张选票的同–笔购买交易拥有多个输入并为每一个输入按比例提供UTXO补贴金额,同时也为这些按比例的奖励提供一个新的输出公钥或者脚本,从而解决了这个问题。这些补贴奖励那些在不可信环境下生成选票的矿工,并且在提交到区块链网络之前使用RoundRobin轮询方式进行签名。重要的是,控制选票产生的本身实体就是另外一个公钥或者脚本,该脚本不能操纵给予接受者的补贴,利用选票中的多重签名脚本可以以分布式的方式来产生选票。
3. 小的设计元素
3.1 椭圆曲线签名算法
段还没有已知的攻击会使用一个稍大的m值。人们也提出了其它一些对于secp256k1使用参数的反对意见。
另一个非常受欢迎的采用128位加密的数字签名算法(DSA)是Ed25519,它在曲线上使用双有理的等效于Curve25519的EdDSA签名算法,这个算法如今是被广泛应用的。与secp256k1的ECDSA不同,Ed25519使用更简单的Schnorr签名,在随机预言机模型[附录A]中是可证明安全的。
Schnorr签名也被用于比特币,然而Decred使用了一个新的操作码一OP_CHECKSIGALT来验证–个拥有无限数量的新签名的机制,而不是使用Schnorr签名专属的一个实现了secp256k1 曲线参数的操作码。在目前的实现中,secp256k1 Schnorr 签名和Ed25519签名均可用于作为secp256k1的ECDSA签名的增补。将来,在软分叉中添加新的签名方案也是非常简单的,例如量子安全的方案。拥有这两个Schnorr套件也允许生成一个占用空间与正常签名相同的简单组签名,这两者目前都已经实现了。在将来,使用无代理的加密共享的门限签名还将使得(,n)i限签名占据相同的空间量。
3.2 哈希函数
用于比特币的SHA256由于其Merkle Damgard数据结构从而具有很多技术缺陷,这些漏洞导致了SHA3有机会竞争基于不同的基础数据结构的新哈希函数。Decred 选择了BLAKE256作为其哈希函数的最终赢家。该哈希函数基于HAIFA数据结构,其结合了Bernstein 的ChaCha流式密码变体。该哈希函数在x86-64微架构上有着显著的高性能,与SHA256相比,短消息的速度更快,尽管该哈希函数被认为在14轮时具有更高的安全边际开销。
3.3脚本扩展
除了之前提到的OP_ CHECKSIGALT和OP CHECKSIGALTVERIFY之外,我们也对其它比特币脚本做了修改。在输出脚本中添加了一个版本字节,以便启 用简单的软分叉到一个新的脚本语言,正如先前Wuille建议的。所有和数学及逻辑相关的操作码都已被重新启用,现在可以运行in在t32寄存器上。各种字节字符串操作操作码也已实现并重新启用。剩下的未使用的比特币操作码已被重新用于未来的软分叉,此外,也修复了比特币脚本语言长期存在的一些bug。
3.4 签名脚本隔离和防伪证明
为了防止交易可塑性以及产生的交易具有相同的输入引用和输出,但是交易;ID却不同,已经从交易哈希的计算中移除了输入脚本。尽管在CryptoNote币和侧链中已经实现了这个修改,但这个修改的由来还是颇有争议的。现在有提议将比特币的软分叉称为“隔离见证”,比如在侧链实现中,对见证人数据的承诺是包含在区块的merkle树中的。另外,比特币的软分叉提出的防伪证明是由矿工设定的,并且也致力于作为merkle树中数据的一部分。
3.5 交易扩展
添加了交易到期这个属性,如果区块已经达到一定的高度,那么允许从内存池中刪除交易。以前从内存池删除交易的唯一方法是双花。
3.6 其他改进
在比特币中,补贴是以区块高度呈指数衰减的。然而,Decred 的算法虽然也非常简单,但随着时间的推移也更好地融入了这种衰减,以免产生与CryptoNote类似的由于补贴急剧下降导致的市场震荡。像PeerCoin一样,PoW难度是根据先前区块时间的指数加权平均值计算的。然而,这个计算也被融入到了类比特币的数字货币的难度窗口周期中。通过确保区块时间中的每个差异被纳入到难度计算中,比特币中的“fimewarp” bug得到了纠正。
还应该指出,许多众所周知的挖矿攻击,比如selfish mining和stubbonmining, 在一个高效的去中心化权益挖矿以及没有PoW-PoS矿工合谋的系统中将不再有效,这是因为没有PoS矿工的协助,它是不可能对区块产生加密扩展的。针对前述的以及针对我们系统的特定的新挖矿攻击方法的保护弹性将会成为未来研究的一个富有成果的领域。