如何用 CITA 实现一个类 DPoS 的高性能区块链
导读:Nervos Network通过分层的设计来解决区块链的“不可能三角”,Layer 1主要关注安全,Layer 2关注性能。作为Nervos Network的Layer 2,让我们来看看如何用CITA实现一个DPoS的高性能区块链。 早期的 CITA 是针对联盟链进行场景优化的。目前的 CITA 是一个通用的区块链框架,其设计目标是可以灵活实现各种类型的区块链。CITA 默认的配置是 BFT 共识 + EVM 虚拟机,同时编程框架支持微服务可替换。例如,CITAHub 社区的小伙伴们通过底层修改实现了 POA 和 WASM 虚拟机等功能。不过利用 CITA 强大的合约功能可以更简单地实现记账机制的定制化。本文中,我们将介绍如何不修改底层代码,仅在合约层定制实现一个类 DPoS 的高性能公链。 以 EOS 为代表的 DPoS 公链通常采用代理选举候选节点、节点上任、定期更新记账节点的方式实现记账节点的民主化更替。对应地,CITA 也需要实现选举合约、共识节点治理、节点分类激励以及共识节点出块比例管理等功能。 选举合约 节点选举合约是一个标准的链上智能合约,负责节点注册、收集用户的投票并输出选举结果到节点管理合约。不同的社区可能会对节点选举具有不同的要求,所以这里的投票方案非常灵活。既可以使用系统代币投票,也可以指定某个 ERC20 的代币投票,也可以按账号投票等等。例如,在偏公链的场景下,节点需要抵押代币,用户使用代币进行投票对节点进行支持;而在一个存在实名认证服务的场景下,节点可能需要获得尽可能多的实名用户的支持。 选举合约应该能够周期性地输出得票最多的若干个节点到节点管理合约,同时能够给出得票次之的候选节点,他们可以同时获得系统激励合约的激励。 节点管理合约 CITA 的节点管理合约( https://docs.citahub.com/zh-CN/cita/system/node[1] 2 )具备两个重要的系统功能:增删共识节点、调整节点的出块权重。这两个功能是我们实现一个“类 DPoS”共识的高性能区块链的核心。节点管理合约只能由系统超级管理员权限的账号发起调用,我们可以将前面的选举合约设置为系统超级管理员权限,并允许它调用节点管理合约。具体方法可以参考 CITA 治理机制的定制化设计代码( https://github.com/cryptape/appchain-gov-general[2] 2 )。这样,选举合约给出的记账节点上任信息就可以直接转化为节点管理合约的输入,实现记账节点的无缝更替。 此外,节点管理合约还可以接收记账节点的权重参数,实现不同的记账节点由于得票占比不同,出块比例不同的功能。不同的出块比例意味着后续出块的激励不同、记账话语权不同,从而实现类似 DPoS 的效果。 需要指出的是,这种模式下 CITA 的每一轮投票仍然是采取 BFT 的每个节点一票方式,记账权重体现在长期(例如1000个块)不同记账权重的节点出块的数量比例不同,并非 EOS 等区块链的 DPoS 共识中不同权重的节点 BFT 投票权重不同。当然,作为区块链框架,CITA 也可以通过修改底层的方式实现相同的功能,有兴趣的开发者可以提 issue 实现。 激励合约 获得记账权的节点以及暂未获得记账权但获得足够多的投票的候选节点按照社区同行的规则可以获得出块奖励或分红。CITA 采用了“系统自动执行合约”的机制,可以实现每区块自动执行一个代币分发合约( https://docs.citahub.com/zh-CN/cita/system-contract-interface/auto-exec[3] 3 ),从而为记账节点和候选节点分发奖励。 运营方可以在创世块创建足够多的系统代币,锁定到一个激励合约,并在激励合约中编写按照选举合约结果分发出块奖励的命令。具体命令可以是类似每区块将预定代币的 40% 分配给当前记账节点,并将 40% 平均分给在任的记账节点,剩余 20% 平均分配给候选节点。当然,类似的方案完全由社区决定,并可以通过投票随时修改。 结论 不同的社区、不同的行业领域绝不可能千篇一律,必须有不同的协作模式。如果每种模式都需要修改底层协议,编写底层代码,那么其开发难度是不可想象的。CITA 灵活的框架结构以及治理和经济模型可以实现非常适合特定社区的记账、激励模式。期待开发者利用 CITA 实现更多创新的落地场景。...