前面我们的主节点+全节点的测试采用的是按需研究,下面我们整理一下真正去完整地启动一条链的步骤,也叫boot sequence,在这过程中,也会包括我结合源码位置 tutorials/bios-boot-tutorial/bios-boot-tutorial.py 脚本进行某些操作的具体实现的分析,步骤如下:
Base 阶段首先我定义为base阶段,因为这些操作我们耳熟能详,这里进行一个总结:
kill所有nodeos以及keosd进程。
killall keosd nodeos || true删除原钱包目录,再创建一个钱包目录,启动keosd,创建钱包,导入keys
配置config.ini(之前提到多次了,可以翻阅查看),启动链进程
使用eosio创建系统级用户:'eosio.bpay','eosio.msig','eosio.names','eosio.ram','eosio.ramfee','eosio.saving','eosio.stake','eosio.token','eosio.vpay'(必须全部创建,否则暂时不报错,但后面会有很多坑)
使用对应的系统级用户部署eosio.token和eosio.msig合约
创建token并issue,注意:创建者为eosio的token就是主币的概念,默认的符号是SYS,是配置在源码中的,如果我们需要修改主币符号需要更改源码重新部署。
eosio账户部署system合约(部署system合约成功以后,无法再使用cleos create account了),然后开启多签名账户授权:cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio,这是上一篇文章中的坑。
Advance 阶段启动序列运行到这里,我们就已经拥有了一个独立节点,它安装了eosio.token, eosio.msig, eosio.system三个合约,目前它有eosio和eosio.msig两个特权账户(eosio.msig账户是eosio.msig合约的owner),以及其他eosio.*系统级用户,目前无普通用户。下面的操作因为我们之前的研究中未涉及,所以这里另起一小节进行描述。
一,股权账户股权账户staked accounts,就是我们理解的普通用户。
持股动作就是为EOSIO 区块链系统中的一个账户分配token,从而获取一个实体(真实世界的实体,例如ICO中个人购买的某些东西)的过程。
反之,抛股就是回购账户的token,从而使其放弃某个实体的拥有权的过程。
持股和抛股是区块链整个生命周期中的重要行为模式。但是在启动阶段时的持股初始化操作是特殊的,账户通过他们的token持股,然而直到producer选举出来之前,token都是冻结状态,也就是说账户的持股身份不可抛弃。因此启动阶段的初始化持股操作的目的是:
分配token到账户,准备使用,然后是参与投票过程,producer才能被选举出来,整个区块链才算是“活了”。
Stake 流程0.1个token(准确来讲,不超过账户token总数的10%)被用来持股内存Ram资源。默认情况下,cleos程序会持有8KB的内存在账户的创建上,是由账户创建者来支付的。在初始化阶段,账户创建者都是eosio。
0.45个token抵押用来持有CPU资源,额外的,0.45个token用来持有network资源。
共需要9个token作为流动liquid token。
剩余的token均分为两部分,用来持有CPU和network各一半。
举例说明①:账户A共拥有100个SYS,初始化持股操作为: entity stakedRAM 0.1 SYS
CPU (0.45+45) SYS
network (0.45+45) SYS
liquid 9 SYS
这个抵押token置换资源使用权的过程很清晰,因为用户的token量是足够的,可以完全按照上面的流程操作。
举例说明②:账户B共拥有5个SYS,初始化持股操作为: entity stakedRAM 0.1 SYS
CPU (0.45+0) SYS
network (0.45+0) SYS
liquid 4 SYS
这个抵押token置换资源使用权的过程与上面稍有不同,因为用户的token量不足,所以按照上面流程操作,第三步流动liquid token的个数不足9个,经历前两步以后,账户B仅剩余4个SYS,免为其难地,liquid token只能抵押4个SYS。而第四步,由于没有剩余token,所以也不必执行了。
帕累托分配模型根据以上对账户持股抵押的研究结果,我们翻回来说boot sequence base 阶段的token SYS的分配策略,这个过程是夹在SYS create和issue的中间。是使用帕累托分配模型(Pareto distribution)将 十亿个SYS分发出去。
帕累托分配模型:是一个80-20规则,即80%的token被20%的人持有。具体实现过程在脚本bios-boot-tutorial.py中是通过Python Numpy库来生成帕累托分配的。
def allocateFunds(b, e): dist = numpy.random.pareto(1.161, e - b).tolist() # 1.161 = 80/20 rule dist.sort() dist.reverse() factor = 1_000_000_000 / sum(dist) total = 0 for i in range(b, e): funds = round(factor * dist[i - b] * 10000) if i >= firstProducer and i < firstProducer + numProducers: funds = max(funds, round(args.min_producer_funds * 10000)) total += funds accounts[i]['funds'] = funds return total