这是⼀个针对 Conflux PoS Finality 的介绍性⽂件,没有实操的细节。它在于帮助读者⼤体了解 PoS,是阅读技术细节⽂档的必要条件。
在⼀个 PoW 链⽣态的早期,在全⽹算⼒较低的时候,可能会出现 51% 攻击的问题。特别是公有链的发展催⽣了⼀些算⼒租借平台的时候。在去年,以太经典、Grin 和Verge 都曾出现了 51% 攻击的问题。
为了应对 51% 攻击可能带来的威胁,Conflux 将引⼊⼀条独⽴运⾏的 PoS 链。PoS链的共识参与者将定期对树图结构 pivot 区块签名。拥有⾜够多签名的 pivot 区块应当被所有 PoW 矿⼯选进 pivot 链,哪怕它的兄弟区块权重更⼤。简单来说,PoS 链指定了⼀个 pivot 区块,所有的 PoW 矿⼯都应该跟随。
这意味着,⼀旦 PoS 共识对⼀个 pivot 区块投票,即使 51% 攻击者尝试逆转这个区块,也不会被 PoW 节点认可。
Conflux 要求 PoS 共识克制地使⽤“指定 pivot 区块”的权⼒。⼀个区块⾸先要根据PoW 的规则确认满⼏分钟,诚实的 PoS 节点才会对它进⾏签名。这意味着,树图结构的区块排序和确认依然由 PoW 的矿⼯完成。
PoS 链只是应对 51% 攻击⽤的。所以除了 pivot block 投票,投票委员会的选举等基本功能外,不包含通⽤区块链的功能,如转账、合约执⾏等。
PoS 链的功能内置在 Conflux 节点⾥⾯,对外还是 conflux-rust ⼀个程序。
本⽂档⾥,Conflux 链指⽬前运⾏的区块链,PoS 链指新引⼊的链。
PoS 区块⼤约⼀分钟⼀个,以下说的所有时间,都是对应的区块数。
PoS 账户
地址
⼀般来说,区块链上的账户模型都是:私钥产⽣公钥,公钥产⽣地址。PoS 链上的账户类似,但有两个私钥,称为BLS私钥和VRF私钥。对应BLS公钥和VRF公钥。两个公钥计算哈希得到 PoS 的地址,⽬前是 256 bit.
钱包
PoS 账户的主要职责是维护 Conflux 的共识协议。每⼀个 PoS 账户应当运⾏⼀个独⽴的 Conflux 节点。因此 Conflux 核⼼代码 conflux-rust 内置了 PoS 账户的钱包功能,包括
- 在 Conflux 节点⾸次启动时,如果是 PoS 账户模式运⾏,则⾃动⽣成 PoS 私钥,并要求⽤户输密码,密码加密私钥存在本地。
- 在 Conflux 节点再次启动时,如果检索到了加密的私钥⽂件,则要求⽤户输⼊密码解锁私钥⽂件。
- 运⾏时⾃动根据 PoS 的共识协议发送交易,⽆需⽤户⼲预。
由于钱包是全节点实现的,所以和钱包的交互⽅式⾮常原始,基本上就是⼿动拷⻉⽂件什么的。
成为共识节点
PoS 账户在创建后,需要在PoW链上通过质押和注册的⽅法,才能成为⼀个合法的共识节点。
- 质押:和当前的质押流程没有区别
- 注册:在 Conflux 链和固定的 internal contract 进⾏交互,提交全节点提供的相关信息,和锁定质押的⾦额。每锁定 1000CFX 获得 1 票
当注册完成后,进⾏质押的 PoW 账户和注册的 PoS 账户构成⼀个⼀⼀绑定的关系。PoS 账户所绑定的 PoW 账户不可更改。PoW 账户绑定的 PoS 账户,可以在 PoS 账户完全解锁后,绑定其他 PoS 账户。
参与 PoS 共识
获得投票权重
PoS 账户可以锁定 CFX 并获得投票权重,流程⻅“成为共识节点”章节。
- 当 PoS 账户被注册后, conflux-rust 会⾃动监听注册信息,并进⾏相应操作,⽆需⽤户⼲预。
- ⽤户可随时在 Conflux 链上锁定更多的 CFX token 来追加票数。
- 锁定 token 后状态从 Conflux 链同步到 PoS 链⼤约需要 10 分钟左右,此时⽤户将获得投票权。
注销投票权重
PoS 账户可以注销投票权重,并解锁 CFX
- ⽤户需要使⽤绑定的 PoW 账户在 Conflux 链上发交易,申请解锁 token(代码中称为退休)。⽤户可以申请解锁⼀部分⽽⾮全部锁定 token。
- ⽤户可随时申请解锁。申请解锁后,相应的投票权⽴刻失效。但需同时满⾜以下两个条件才能完成解锁:①锁定满 14 天 ②申请解锁满 7 天
- 如果有多次锁定 token 的操作,在解锁时,会根据时间从早到晚,依次进⾏解锁,直到满⾜要求的解锁数量。
⼀个例⼦
假设⽤户 A 在 1⽉1⽇、3⽇,5⽇分别锁定了 2000 CFX ,在1⽉9⽇,申请解锁 3000 CFX.
• 1⽉1⽇的 2000 CFX ⾸先被解锁。
◦ 锁定满 14 天:1⽉1⽇+14天=1⽉15⽇
◦ 申请解锁满 7 天:1⽉9⽇+7天=1⽉16⽇
◦ 所以有 2000 CFX 在 1⽉16⽇完成解锁。
• 1⽉3⽇的 1000 CFX 然后被解锁。
◦ 锁定满 14 天: 1⽉3⽇+14天=1⽉17⽇
◦ 申请解锁满 7 天:1⽉9⽇+7天=1⽉16⽇
◦ 所以有 1000 CFX 在 1⽉17⽇完成解锁。
这⼀操作后,⽤户还剩下锁定于1⽉3⽇的 1000 CFX与锁定于1⽉5⽇的 2000 CFX
PoS 共识的⼯作
以下内容是 PoS 节点⾃动做的事情,仅供了解。
参选委员会
• PoS 账户会通过 VRF 参选⼀个⾄多 300 席位的委员会
• 委员会由 6 届委员组成,每届包含 50 席位
• 每 1 ⼩时,任职时间最⻓的⼀届委员会任期期满,新⼀届委员接替
• 每⼀届委员会提前 1.5 ⼩时开始选举,提前半⼩时结束选举。
• 在选举时,每⼀个 PoS 账户的每⼀票视为⼀个独⽴的参选⼈。如果⼀个 PoS 账户有 10 票,则视为 10 个不同的⼈参选。如果这个账户选⼊了 2 票,则在这届委员会占有 2 个席位,剩下 8 票可以参加下⼀届选举。
• 选举期间,PoS 账户提交 VRF 的结果,根据结果算哈希值。哈希值最⼩的 50 票被选⼊。
例如,VRF 结果是 x ,PoS 账户有5票,那么哈希值是 hash(x,0) ~
hash(x,4)
作为委员
• PoS 账户的委员将参与 PoS 的共识,并对 Conflux 链的 pivot block 投票。
激励⽅案
Conflux 现有的抵押利息将取消。
• 当 PoS 账户参选或成为委员后,会根据不同的⾏为获得积分。共计 6,000,000分。
• 积分在委员会换届时结算(每60个区块),在此期间 Conflux 链产⽣的利息会平均分成 6,000,000 份,根据积分分给 PoS 账户绑定的 PoW 账户。
• ⼀届委员会产⽣的积分可能少于 6,000,000. 没有分掉的利息会烧掉。
积分构成
• 参选委员会,哈希值是最⼩的 10000 票。每⼀票 120 分。共计 1,200,000 分。
• 选⼊委员会,每⼀票 15,000 分。300票委员共计 4,500,000 分。
• 成为⼀个 PoS 区块的 Leader (PoS 共识的概念),每块 3,000 分。60块共计180,000 分。
• 每个 PoS 区块需要 300 ⼈中的 201 ⼈签名,但 Leader 可以打包多于 200 ⼈的签名。从 200 个签名开始,每多⼀个签名,获得 20 分。最⼤ 2,000 分。60块共计 120,000 分。
利息产⽣
• 每个 Conflux 链的区块,会产⽣这么多利息。因为抵押额和总发⾏量在变,所以每个块产⽣的利息也在变。sqrt(总抵押额 * CFX 总发⾏量) * 4% / Conflux ⼀年区块数
• 如果连续 7200 个 Conflux 链区块后,PoS 还没有换届分钱,就不产⽣利息。直到分钱后再产⽣利息。这么做是为了防⽌ PoS 节点故意拖慢共识,以获得更多的钱。
⻛险提示
本⾦丢失
PoS 账户如果为两个⾼度相同的不同 PoS 区块签名,它的 CFX token 将被永久锁死。这种情形可能发⽣在:
• 通过修改 Conflux 节点,致使该账户出现攻击共识协议的⾏为
• 在多个 Conflux 节点使⽤相同的 PoS 账户。(这会导致同⼀账户做出⾃相⽭盾的操作,被判定为攻击共识协议)
• PoS 私钥⽂件私钥丢失
流动性损失
• 如果⼀个⼈被选⼊委员会,却在两次换届之间不参与签名,会被⾃动解锁所有锁仓。且在未来 7 天内所有的新增锁仓都会被⾃动解锁。
收益损失
• 如果 PoS 账户绑定的节点没有成功运⾏,可能不会有任何收益