okchain源码阅读[1]:宏观框架
2021-05-29

摘要

okchain作为okex的公链项目,功能面向交易所交易撮合。
代码实现上,基于cosmos和tendermint两个框架来实现。
这里记录一下他的实现的大概框架。
公链项目链接是https://github.com/okex/okchain


重点框架

  • 投票机制——一票多投
    涉及模块

staking 投票质押逻辑
distribution
slashing 非法投票惩罚 ( 感觉这个会是审计重点

  • opendex
    涉及模块

order
token
dex


投票机制

创建validator或cva

  • msd数量就是va的初始票数,msd对应的初始票不能一票多投。
  • va可以是脱离node的存在。可以通过unbond操作使node和va分开。
  • 任意一个va最终所得票(share) == msd + 其他节点投给自己的token

注销va或cva

状态改变
bonded -> unbonding -> unbonded

  • 该操作是赎回msd的唯一手段。

投票

  • 投票的权重每周衰减一次。

撤销投票

就是撤销投票

抵押

就是抵押


如何出块

252个块一轮,21个va轮流出块。
每轮结束 重新选举21个va。

如何选举

share得票按数量排序,选前21个。其他为cva。

增发

每年增发1%
没3秒一个块,一年有10512000个块。

奖励

每个块的奖励1/4给va,3/4给投票给va的va和cva们。
每个块上链时立刻结算,会存放到奖金池中,需要节点自己手动领取。


opendex

基本功能

  • 上架数字资产交易对

Dex运营方发型数字资产交易对,手续费20000OKT。

  • 下架数字资产交易对

DEX运营方下架数字资产交易对,手续费0.0125OKT。

  • 增加数字资产交易对撮合金

DEX运营方抵押任意数量OKT,优先撮合撮合金高的币对交易,手续费归DEX运营方

  • 提取数字资产交易对撮合金
  • 手续费

预先锁定259200个区块高度所使用的手续费(单位OKT),余额不足下单失败,默认0.25920OKT。当订单被撮合或者过期时,将手续费分给BP节点们。
多余的手续费会返还。

额外功能

  • 限制数字资产交易对的高频上架
  • 限制重名币或诈骗币
  • 限制垃圾币和有价值的币之间产生系统资源竞争
  • 交易对所有权转移

va bond状态变换

每个va都维护了state变量,来描述va的合法性。是正常运行、崩溃、还是非法运行等。
va创建之后会进入unbonded状态。被区块确认权限之后,进入bonded状态。

bonded -> unbonding

  • 执行destroy validator
  • 出块超时
  • 正常轮替

unbonding -> unbonded

  • unbonding周期结束 自动进入unbonded

unbonded -> bonded

  • 正常轮替 (但是如果jailed,需要提前发起unjailed tx

unbonded -> kicked off

share 和msd都为0,就会被剔除va set。
也就是没人选它,把投给他的token都赎回。而且他自己也赎回了msd

unbonding -> kicked off

unbonding周期结束后,如果 share == 0 and msd == 0,就直接kicked off

unbonding -> bonded

无需等待unbonding周期结束,过程中如果share票数极高,排名在全网前21名内,直接进入bonded状态。


slashing

节点非法行为的处罚机制

在同一高度,对多个block签名。

  • 罚款所有抵押的5%
  • bonded -> unbonding
  • jailed 为 无期徒刑,不能上诉。

validator 漏签名了太多的block

  • 漏签50个block 会惩罚一次
  • 每次惩罚 va全部抵押的 1%
  • jailed 600s 刑满之后,要主动发起unjailed tx才能被释放。

主动发送 destroy validator交易

  • bonded -> unbonding
  • unbonding -> unbonding
  • jailed 为无期徒刑
  • msd进入赎回状态

遗留问题

文档中的概念疑惑点

  • 数字资产交易对是个啥
  • 最小自委托msd是什么
  • va从unbonded到bonded这个确认promotion的过程怎么实现的?
  • bonded到底是什么意思?区分va和cva?
  • 正常轮替是什么意思
  • unbonding 周期具体实现?时间还是啥?
  • va miss 签名 指的是不是 没有vote
  • miss50 是连续还是累计?

可能出现的问题

  • 返还手续费这个地方 有没有快乐溢出。
  • 余额不足下单失败的地方,有没有快乐溢出。
  • 如何限制重名币,是否存在恶意抢注币名
  • 恶意诬陷validator 使之jailed
  • 如何判定MSD初始票和一般票之间的区别,从而限制一票多投。
  • 赎回msd的时候,能不能做些文章,比如归还给谁;先还钱后注销;等问题。
  • 能不能给死人投票?只要票数足够,死人无法卸任?
  • block出块时签名如果重用,直接死刑。这个如果能诬陷就严重了。
  • 以他人身份发送 destroy validator交易,判死刑