本文档是Conflux 的 PoS Finality 介绍与经济模型的草案,不是最终确定版,欢迎社区同学在论坛留言讨论
在一个 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 finality 相关的基础概念。本文档里,Conflux 链指目前运行的区块链,PoS 链指新引入的链。
PoS 账户
地址
一般来说,区块链上的账户模型都是:私钥产生公钥,公钥产生地址。PoS 链上的账户类似,但有两个私钥,称为BLS私钥和VRF私钥。对应BLS公钥和VRF公钥。两个公钥计算哈希得到 PoS 的地址,目前是 256 bit.
钱包
Conflux 的 PoS 链只是应对 51% 攻击用的。所以除了对 pivot 区块投票,以及 PoS 链选举共识节点等基本功能外,没有通用的区块链的功能,如转账、合约执行等。PoS 账户也没有余额的概念。
PoS 账户的主要职责是维护 Conflux 的共识协议。每一个 PoS 账户是 Conflux 网络的维护者,而不是普通的用户。
每个 PoS 账户应当运行一个独立的 Conflux 全节点。Conflux 核心代码 conflux-rust
将内置 PoS 账户的钱包功能,包括
- 在 Conflux 节点首次启动时,如果配置文件显示是 PoS 账户模式运行,则自动生成 PoS 私钥,并要求用户输密码,私钥被密码加密后存在本地。
- 在 Conflux 节点再次启动时,如果检索到了加密的私钥文件,则要求用户输入密码解锁私钥文件。
- 运行时自动根据 PoS 的共识协议发送交易,无需用户干预。
与 PoW 账户的绑定
PoS 账户在创建后,需要与 PoW 的账户进行绑定,我们把这个过程叫做注册。PoW 账户通过抵押(Staking)和 PoS 锁仓,为绑定的 PoS 账户赋予投票权。这个过程通过在 Conflux 链上与特定的内置合约交互完成。有了投票权的 PoS 账户才能成为一个 PoS 共识节点。
PoS 参与共识的奖励直接打入绑定的 PoW 账户中。
绑定过程
- 当 PoS 账户被注册后,
conflux-rust
会自动监听注册信息,并进行相应操作,无需用户干预。根据 PoS 共识协议,大约注册后 2 小时(120 个 PoS区块)才可以参与共识协议。大约 4 个小时后开始获得奖励。 - 用户可随时在 Conflux 链上质押更多的 CFX token,并通过 PoS 锁仓来追加票数。
解锁过程
- PoW 绑定的账户可以通过与内置合约交互,注销 PoS 账户投票权重 ,我们把这个过程成为退休。
- 绑定后满 7 天可以退休,退休后 7 天 CFX 解锁,(10080 个 PoS 区块)。解锁后还会以 staking 的方式继续存在,但可以随时提取。
PoS 共识
共识委员会
- PoS 共识由一个至多 300 票的委员会组成,委员会通过 Hotstuff 共识协议运行 PoS 链。
- 委员还对 Conflux 链的 Pivot 区块哈希进行投票。投票满三分之二的 pivot 块哈希可以被 PoS 链打包。集齐签名的 pivot 区块称为 pivot 决议 (pivot decision)
- 根据协议要求,委员只对在 PoW 协议下确认满 5 分钟的区块进行签名。
参选委员会
- 每经过 1 小时(60个 PoS 区块)选举一届委员会,选举出最多 50 票委员,任期 6 小时(360个PoS区块)。这样同时存在共计 6 届,最多 300 票的委员。
- PoS 账户会通过 VRF (Verifiable Random Function, 可验证随机数)参选委员会。VRF 种子通过选举开始时的 pivot 决议区块哈希产生。
- 每一届委员会提前 2 小时(120 个 PoS 区块)开始选举,提前半小时(30 个 PoS 区块)结束选举。
- 在选举时,一个 PoS 账户的每一票视为一个单独的小号。如果一个 PoS 账户有 10 票,则视为 10 个不同的人参选。如果这个账户选入了 2 票,则在这届委员会有 2 票投票权重,剩下 8 票可以参加下一届选举。
- 选举期间,PoS 账户每一票(每个“小号”)会通过 VRF 产生一个哈希值。哈希值最小的 50 票被选入。
- 我们进行了一些系统优化,PoS 账户只需要发一笔交易就可以为全部小号参选。如果入选多票,在参与共识时,PoS 账户也只需要签一个名就可以。
激励方案
两次委员会换届之间(每 60 个 PoS 区块),会根据不同的行为获得积分。最多 6,000,000 分。在此期间 Conflux 链产生的利息会平均分成 6,000,000 份,根据积分分给 PoS 账户绑定的 PoW 账户。如果产生的积分少于 6,000,000 分,没有分掉的利息会销毁。
积分构成
- 参选委员会时,哈希值是最小的 10000 票。每一票 120 分。共计 1,200,000 分。
- 被选入委员会,每一票 90,000 分。50票委员共计 4,500,000 分。
- 成为一个 PoS 区块的 Leader ,每区块 3,000 分。60 区块共计 180,000 分。
- 每个 PoS 区块需要 300 人中的 201 人签名,但 Leader 可以打包多于 200 人的签名。我们鼓励 Leader 打包更多的签名,来证明每一个委员在活跃地参加共识。从 200 个签名开始,每多一个签名,获得 20 分。最大 2,000 分。60块共计 120,000 分。
利息产生
-
每个 Conflux 链的区块,会产生以下这么多利息。
sqrt(总抵押额 * CFX 总发行量) * 4% / Conflux 一年区块数
-
如果连续 7200 个 Conflux 链区块(大约 1 小时)后,PoS 还没有换届分钱,就不再产生新的利息,直到分钱后再产生。这么做是为了防止 PoS 节点故意拖慢共识,以获得更多的钱。
惩罚
- 如果一个人始终不参选委员会,没有任何奖励,也没有惩罚。
- 如果一个人选入委员会,却连续 60 个区块不参与签名,会被强制退休。
- PoS 账户如果为两个高度相同的PoS区块签名,它的 CFX token 将被永久锁死。根据 PoS 共识协议和目前的代码实现,一个诚实的用户永远不会做这种事。