版权归原作者所有,如有侵权,请联系我们

[科普中国]-基于交易的权益证明机制

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

2012年,化名Sunny King的网友推出了Peercoin,该加密电子货币采用工作量证明机制发行新币,采用权益证明机制维护网络安全,这是权益证明机制在加密电子货币中的首次应用。

概念2012年,化名Sunny King的网友推出了Peercoin,该加密电子货币采用工作量证明机制发行新币,采用权益证明机制维护网络安全,这是权益证明机制在加密电子货币中的首次应用。

与要求证明人执行一定量的计算工作不同,权益证明要求证明人提供一定数量加密货币的所有权即可。权益证明机制的运作方式是,当创造一个新区块时,矿工需要创建一个“币权”交易,交易会按照预先设定的比例把一些币发送给矿工本身。权益证明机制根据每个节点拥有代币的比例和时间,依据算法等比例地降低节点的挖矿难度,从而加快了寻找随机数的速度。这种共识机制可以缩短达成共识所需的时间,但本质上仍然需要网络中的节点进行挖矿运算。因此,PoS机制并没有从根本上解决PoW机制难以应用于商业领域的问题。1

实现思路Peercoin(点点币,PPC)于2012年8月发布,最大创新是其采矿方式混合了POW及POS两种方式,其中POW主要用于发行代币,未来预计随着挖矿难度上升,产量降低,系统安全主要由POS维护。目前区块链中存在两种类型的区块,POW区块和POS区块。PPC的作者为同样不愿意公开身份的密码货币极客Sunny King,同时也是Primecoin的研发者。

要掌握Peercoin的POS机制,需要重点理解Sunny King专门为PPC设计的几个核心概念:Coinstake,Kernel,Stake Modifier,ModifierInterval,StakeReward,Coinage等。

Coinstake为了实现POS,Sunny King专门设计了一种特殊类型交易,叫Coinstake,Coinstake的设计借鉴于中本聪的Coinbase设计。本质上Coinbase和Coinsake都是一笔交易,只是对他们的输入、输出做了一些硬性限制,这样才不会扰乱系统原有的POW机制。

1) Coinbase结构要求:

(1)输入数量必须等于1,且输入的Prevout字段(指定前一笔交易的输出)必须置空值。

(2)输出数量必须大于等于1。

2 ) Coinstake结构要求。

(1)输入数量大于等于1,且第一个输入的Prevout字段不能为空,即要求Kernel必须存在。

(2)输出数量大于等于2,且第一个输出必须置空值。

这两种特殊交易在区块链中存放的位置也有特殊要求,中本聪规定每个区块的第一笔交易必须放置Coinbase,反之,Coinbase不能出现在区块的其他位置。Sunny King显然不想破坏这个规则,他增加了一条规则,对于POS区块,第二笔交易必须放置Coinstake,反之,Coinstake不能出现在其他地方。换言之,只要第二笔交易是Coinstake,那么这个区块就当POS区块来处理。

Coinbase和Coinstake都不应该被单独广播,而只存在于区块中,因此客户端节点一般都不允许进入内存池,当花费这两种交易时,都需要检测是否已经成熟。

KernelCoinstake的第一个输入(Input 0)叫KernelKernel在POS机制里确实起到核心作用,合格区块的判定与之息息相关。合格区块表述为:

SHA256D(nStakeModifier+txPrev.block.nTime+txPrev.offset+txPrev.nTime+txPrev.vout.n+nTime)

公式中的每一个参数都有明确的设计目的。

nS takeModifier:专门为POS设计的调节器,按照以上公式,如果没有参数nStakeModifier当一个人收到一笔币之后,他立即就能提前计算得知自己在未来何时可以锻造区块,这显然不符合设计目标,Sunny King希望POS矿工和POW矿工一样做盲目探索,以实时在线维护区块链,nStakeModifier的设计就是为了防止POS矿工提前计算。nStakeModifier可以理解为POS区块的一个属性,每一个区块对应一个nS takeModifier值,但nStakeModifier并不是每个区块都变动,不过协议规定每隔一定时间Cmodifier interval)必须重新计算一次,取值与前一个nS takeModifier以及最新区块哈希值有关,因此POS矿工无法提前计算,因为他不知道未来的区块哈希值。

也就是说,在PPC系统中,除了存在区块链、币链(币的交易签名历史),还隐藏着一个很少被提及的链条一一权益调节器链条。

值得一提的是,Sunny King是在PPC后来的版本才加入这个调节器的,一开始他使用nBits。

txPrev: Kernel对应的前一笔交易。

txPrev.block.nTime: txPrev所在区块的时间戳,一笔交易被纳入区块的时间是交易发起者不能确定的,节点有可能通过提前计算预估到未来对自己有利的时间戳,这个参数就是为了防止节点利用这种预估优势提前生成大批交易。

txPrev.offset: txPrev在区块中的偏移量,用以降低网路节点同时生成Coinstake的概率。

txPrev.nTime: txPrev构造时间,设计目标如txPrev.offset。

txPrev.vout.n: Kernel在txPrev中的输出下标,设计目标如txPrev.offset。

bnTarget:全网当前目标难度基准值,类似POW中的当前难度值,由nbits记录。

nCoinDayWeight: Kernel消耗的币龄,加入了一个时间权重。

Coinage币龄,也叫币天,假如1.5个币存在于区块链中10天,币龄数值为

Coinage=1.5×10=15

PPC采用币龄,而不是直接采用余额(Balance)来计算。

StakeReward权益激励,俗称获得利息,计算公式为:

stakeReward=Coinage×33/(365×33+8)×0.01×COIN

公式可简化为

stakeReward=(0.01×Coinage/365)×COIN

其中,Coinage即上文说的币龄,COIN可理解为“币”,1 COIN即通常所说的1个币,本质是一个常量,中本聪在比特币系统里定义为100 000 000,如此设计主要是为了避免浮点数运算,比特币支持8位小数源于此。2

基于权益证明的交易网络上的每一笔交易在网络中都有内含的权益证明。交易的发起者希望网络接受这笔交易,交易的接受方则会根据网络是否已经接受了该交易来决定是否发货。很显然,买方卖方的利益都与网络的健康安全息息相关。毕竟,如果交易无法按预期执行,这个网络就是无价值的。一个运作良好的网络在每个区块都有几千笔的交易。这说明有几千个利益相关者都可以为网络的安全做出贡献。

币天数代表一个特定的币距最后一次在网络上交易的时间。在给定的时间点,只存在有限的币天数,它们在那些长期持有大量货币结余的人手中持续增加。所以币天数可被视为在网络中权益的代表(proxy)。每当这些币有交易时,币天数即被销毁,因此不能被重复使用。

为了在工作量验证系统中成功实施51%攻击,攻击者必须隐藏自己的替代链。一旦他们从第一次支付中锁定利润,它们就可以广播较长的秘密链,使原来的交易失效。自私挖矿攻击中也需要隐藏算出的区块,自私挖矿攻击在拥有远低于51%的哈希算力时也可能是有效的。

为了防止这种行为,我们必须阻止矿工保有秘密区块链。如果广播的每一笔交易都包含最新区块的哈希值,而且区块链执行这样的规则:交易的权益证明只能被记在该区块所构成的区块链上,这样的话就没有人能够建立秘密区块链以影响(leverage)公众链中交易的币销毁天数。

现在,交易提交到某个公众链,最佳的区块链可以通过总销毁币天数来衡量,而不是通过总的工作量来衡量。

本词条内容贡献者为:

肖志勇 - 副教授 - 江南大学