治理合约
在TON中,与TVM、catchain、费用和链拓扑(以及这些参数如何存储和更新)有关的节点操作共识参数由一组特殊的智能合约控制(与前几代区块链采用的旧式和不灵活的硬编码这些参数的方式不同)。通过这种方式,TON实现了全面透明的链上治理。这组特殊合约本身受参数控制,目前包括选举人、配置合约和DNS合约,将来将通过额外的货币铸币和其他合约进行扩展。
选举人(Elector)
选举人智能合约控制验证轮次的更替方式、谁获得验证区块链的职责以及如何分配验证奖励。如果您想成为验证者并与选举人互动,请查看验证者说明。
选举人存储未提取的Toncoin数据在credits
哈希表中,新的申请在elect
哈希表中,以及关于以往选举的信息在 past*elections 哈希表中(后者存储在关于验证者不当行为的 complaints 和_frozen*-已完成轮次的验证者质押中,这些质押被扣留用于 stake_held_for
(配置参数15))。选举人合约有三个目的:
- 处理验证者选举的申请
- 举行选举
- 处理验证者不当行为的报告
- 分配验证奖励
处理申请
要创建申请,未来的验证者需要形成一个包含相应参数(ADNL地址、公钥、max_factor
等)的特殊消息,将其附加到一定数量的TON(称为质押),并发送给选举人。反过来,选举人检查这些参数,要么注册申请,要么立即将质押退还给发送者。请注意,只接受来自主链地址的申请。
举行选举
选举人是一个特殊的智能合约,可以在每个区块的开始和结束时被强制调用(所谓的Tick和Tock交易)。选举人确实在每个区块上被调用,并检查是否是举行新选举的时候。
选举过程的总体概念是考虑所有申请,特别是它们的TON数量和max_factor
(此申请人同意做的验证工作与最弱验证者做的验证工作相比的最大比例),并按照TON数量为每个验证者设置权重,但要满足所有max_factor
条件。
技术实现如下:
- 选举人取出所有质押金额高于当前网络最低
min_stake
(配置参数17)的申请。 - 按质押金额降序排列。
- 如果参与者多于验证者的最大数量(
max_validators
配置参数16),则舍弃名单尾部。 - 从
1
循环到N
(剩余参与者数量)。
- 取名单中按降序排列的第
i
个元素 - 假设第_i_个候选人将是最后一个被接受的(因此权重最低),并根据
max_factor
计算有效质押(true_stake
)。换句话说,第_j_个(j<i
)申请人的有效质押计算为min(stake[i]*max_factor[j], stake[j])
。 - 计算第1个到第_i_个参与者的总有效质押(TES)。如果这个TES高于先前已知的最大TES,则将其视为当前最佳权重配置。
- 获取当前最佳配置,即最大化利用质押的权重配置,并将其发送给配置合约(下面的配置合约)以成为新的验证者集合。
- 将所有未使用的质押,例如那些没有成为验证者的申请人和多余的部分(如果有的话)
stake[j]-min(stake[i]*max_factor[j], stake[j])
放入credits
表中,申请人可以从中请求拿回它们。
这样,如果我们有9个候选人,每个人有100,000和2.7的因子,最后一个参与者不会被选举:没有他,有效质押将是900,000,有他,只有9 * 27,000 + 10,000 = 253,000。相反,如果我们有一个候选人有100,000和2.7的因子和9个参与者各有10,000,他们都将成为验证者。但是,第一个候选人只会质押10*2.7 = 27,000 TON,多出的73,000 TON进入credits
。
请注意,对结果验证集有一些限制(显然由TON配置参数控制),特别是min_validators
、max_validators
(配置参数16)、min_stake
、max_stake
、min_total_stake
、max_stake_factor
(配置参数17)。如果目前的申请无法满足这些条件,选举将被推迟。