权益证明
计算机术语
2012年,化名Sunny King的网友推出了Peercoin,该加密电子货币采用工作量证明机制发行新币,采用权益证明机制维护网络安全,这是权益证明机制在加密电子货币中的首次应用。
定义
2012年,化名Sunny King的网友推出了Peercoin,该加密电子货币采用工作量证明机制发行新币,采用权益证明机制维护网络安全,这是权益证明机制在加密电子货币中的首次应用。
与要求证明人执行一定量的计算工作不同,权益证明要求证明人提供一定数量加密货币的所有权即可。权益证明机制的运作方式是,当创造一个新区块时,矿工需要创建一个“币权”交易,交易会按照预先设定的比例把一些币发送给矿工本身。权益证明机制根据每个节点拥有代币的比例和时间,依据算法等比例地降低节点的挖矿难度,从而加快了寻找随机数的速度。这种共识机制可以缩短达成共识所需的时间,但本质上仍然需要网络中的节点进行挖矿运算。因此,PoS机制并没有从根本上解决PoW机制难以应用于商业领域的问题。
实现思路
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都不应该被单独广播,而只存在于区块中,因此客户端节点一般都不允许进入内存池,当花费这两种交易时,都需要检测是否已经成熟。
Kernel
Coinstake的第一个输入(Input 0)叫KernelKernel在POS机制里确实起到核心作用,合格区块的判定与之息息相关。合格区块表述为:
SHA256D(nStakeModifier+txPrev.block.nTime+txPrev.offset+txPrev.nTime+txPrev.vout.n+nTime)< bnTarget X nCoinDayWeight
公式中的每一个参数都有明确的设计目的。
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位小数源于此。
思路总结
POS一并解决了POW浪费能源和算力集中两个痛点,理论上还能缩短了共识时间,但同时也丢弃了POW的某些优势,因此更容易分叉,一笔交易需要等待更多确认才能确保安全,而POS最大的问题是其安全性和容错性还没有得到严格的数学论证。
参考资料
最新修订时间:2024-07-01 11:21
目录
概述
定义
参考资料