BIOS 启动顺序
3.1 配置初始的nodeos节点集
将启动一些nodeos节点,将它们指向彼此,并最终对一组生产者进行投票。 所有nodeos节点都在同一服务器上运行。
(1) 为每个nodeos创建配置和数据目录
//在nodeos命令行上将这些目录与--config-dir和--data-dir参数一起使用。
$ mkdir ~/eosio_test
$ for (( i = 1; i <= 5; i++ )); do for (( j = 1 ; j <=5 ; j++ )); do mkdir ~/eosio_test/accountnum$i$j; done; done
(2)准备用于对等通信的IP地址
将生产者指向彼此,以便进行对等通信。确定每个nodeos节点之间的对等通信的IP地址和端口号集,可以通过在启动nodeos时在命令行上设置p2p-peer-address配置属性(每个对等体一个参数),或者通过在config.ini文件中为nodeos设置属性(每个对等体一行)来配置每个nodeos 。
//例如,假设我们为生产者使用端口号9011-9055(即分别为accountnum11-accountnum55),请在nodes命令行上为accountnum12包含以下参数:
--p2p-peer-address localhost:9011 --p2p-peer-address localhost:9013 --p2p-peer-address localhost:9014 ...
//或者在config.mini里设置
p2p-peer-address = localhost:9011
p2p-peer-address = localhost:9013
p2p-peer-address = localhost:9014
无论是使用命令行还是配置文件方法,都注意不要在生成器列表中包含生产者自己的地址。
3.2 启动 “genesis” 节点
“genesis”节点是开始的第一个节点,它将生成区块链。 所有其他节点将从genesis节点派生。 在genesis节点上执行以下操作。
(1)创建一个钱包wallet
$ cleos wallet create
(2)配制genesis.json
位置:eos/tutorials/bios-boot-tutorial
作用:genesis.json文件定义了初始链状态。所有节点必须从相同的初始状态开始。有以下两个重要属性:
initial_timestamp:区块链的开始时间
initial_key :将使用该密钥对启动genesis节点,并使用此密钥对创建eosio的所有帐户。与genesis nodeos的公钥相匹配. 密钥对可以通过nodeos命令行 –private-key 指定,或 config.ini 的 private-key属性。
(3)为eosio帐户创建密钥:
$ cleos create key
(4)启动genesis 节点
$ nodeos -e -p eosio --private-key '[ "${pub-key}","${private-key}" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_api_plugin
3.3 创建重要的系统账户
//系统账户
eosio.bpay
eosio.msig
eosio.names
eosio.ram
eosio.ramfee
eosio.saving
eosio.stake
eosio.token
eosio.vpay
重复以下过程:
$ cleos create key # for eosio.bpay
$ cleos wallet import ${private-key}
$ cleos create account eosio eosio.bpay ${owner-key} ${active-key}
3.4 创建eosio.token合约
此合约可以创建,发布,传输和获取有关token的信息。
$ cleos set contract eosio.token /eos/build/contracts/eosio.token
3.5 创建eosio.msig合约
作用:启用并简化了权限级别的定义和管理、执行多签名操作。
$ cleos set contract eosio.msig eos/build/contracts/eosio.msig
3.6 创建和分配SYS货币
创建最大值为100亿token的SYS货币,然后发行十亿个代币。 可以用特定货币名称替换SYS。
//在 eosio账户中创建10B SYS tokens ,这有效地创造了最大的代币供应,但不会使任何代币进入流通。 没有流通的代币可以被存储。
$ cleos push action eosio.token create '[ "eosio", "10000000000.0000 SYS" ]' -p eosio.token
executed transaction: 0440461e0d8816b4a8fd9d47c1a6a53536d3c7af54abf53eace884f008429697 120 bytes 326 us eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
//eosio.token合同将1B SYS token从存储中移除并将其置于流通中。在发行时,token保存在eosio帐户中。 由于eosio帐户拥有未流通的token储备,因此需要其权限才能执行此操作。
$ cleos push action eosio.token issue '[ "eosio", "1000000000.0000 SYS", "memo" ]' -p eosio
executed transaction: a53961a566c1faa95531efb422cd952611b17d728edac833c9a55582425f98ed 128 bytes 432 us eosio.token <= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}
3.7 创建eosio.system 合约
此合约包含了几乎所有基于toekn的操作。 一旦启用了系统合同,必须支付资源(cpu,网络,内存)、创建新帐户。 系统合同允许标记放样和未标记,要购买的资源,潜在生产者的注册和投票,生产者奖励认领,设置特权和限制等。
$ cleos set contract eosio eos/build/contracts/eosio.system
3.8 从单一生产者过渡到多个生产者
此后,将从单个块生成器(创建节点)转换到多个生成器。到目前为止,只有内置的eosio帐户具有特权并且可以对块进行签名。但目标是通过一系列选定的生产者来管理区块链。
选举产生的生产者名单可以改变,规则不是直接向任何生产者提供特权,而是与名为eosio.prods的特殊内置帐户相关联。该帐户代表当选的生产者组。 eosio.prods帐户(实际上是生产者组)使用eosio.msig合同定义的权限进行操作。
安装eosio.system合同后,尽快将eosio.msig设为特权帐户,以便代表eosio帐户进行授权。 eosio将尽快辞去其权威,由eosio.prods接管。
//使eosio.msig成为特权帐户
$ cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active
3.9 放置token并扩展网络
至此,完成了单主机单节点的以下合约配置:
eosio.token
eosio.msig
eosio.system
帐户eosio和eosio.msig是特权帐户。 其他eosio帐户已创建但没有特权。接下来绑定账户并扩大生产者网络。
3.10 创建赌注账户
放样是将“真实世界”中的实体(例如,以Crowdsale或其他方式购买某物的个人)获得的令牌分配给EOSIO系统内的账户的过程。
对于初始放样过程可以采用如下方法:
1)0.1令牌:赌注RAM。默认情况下,cleos在创建帐户时会占用8 KB的RAM,由帐户创建者支付。在最初的赌注中,eosio账户是进行赌注的账户创建者。在最初的令牌赌注过程中,赌注的代币在达到最低投票要求之前不能保持不变,且要求为流动。
2)为CPU赌注0.45令牌,为网络赌注0.45令牌。
3)最多9个token可用作流动代币。
4)剩余toekn是赌注50/50 CPU和网络。
Example 1. accountnum11 has 100 SYS. It will be staked as 0.1000 SYS on RAM; 45.4500 SYS on CPU; 45.4500 SYS on network; and 9.0000 SYS held for liquid use.
Example 2. accountnum33 has 5 SYS. It will be staked as 0.1000 SYS on RAM; 0.4500 SYS on CPU; 0.4500 SYS on network; and 4.0000 SYS held for liquid use.
使用Pareto分布将1B令牌分发给帐户,模型为80-20规则,即80%的令牌由20%的人口持有。
(1)创建赌注账户
使用以下步骤为每个帐户放置令牌。 必须为每个帐户单独完成这些步骤。
$ cleos create key # for accountnum11
$ cleos wallet import ${private-key}
使用初始资源和公钥创建一个赌注帐户。
cleossystemnewaccounteosio−−transferaccountnum11cleossystemnewaccounteosio−−transferaccountnum11{pubkey} –stake-net “100000.0000 SYS” –stake-cpu “100000.0000 SYS”
3.11 选择生产者
(1)注册为生产者
使用以下命令注册为生产者。 这使得节点成为生产者的候选者,但除非被选举,否则该节点实际上不是生产者。
$ cleos system regproducer accountnum11 ${pubkey} [https://accountnum11.com/$](https://accountnum11.com/$){pubkey}
(2)列出生产者
$ cleos system listproducers
Producer Producer key Url
(3)启动生产者
使用以下命令启动生成。 由于所有生产者都在单个服务器上运行,因此命令行参数用于确保每个生产者使用自己的目录。
在每个生产者的窗口中,运行以下nodeos命令。
$ nodeos --genesis-json ~/eosio_test/accountnum11/genesis.json --block-log-dir ~/eosio_test/accountnum11/blocks --config-dir ~/eosio_test/accountnum11/ --data-dir ~/eosio_test/accountnum11/ --http-server-address 127.0.0.1:8011 --p2p-listen-endpoint 127.0.0.1:9011 --enable-stale-production --producer-name accountnum11 --private-key '[ "pubkey","privatekey" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --plugin eosio::history_api_plugin --p2p-peer-address localhost:9022 --p2p-peer-address localhost:9033 --p2p-peer-address localhost:9044
为方便起见,可以复制以下命令行以在帐户accountnum22,accountnum33和accountnum44的单独shell窗口中运行nodeos。
$ nodeos --genesis-json ~/eosio_test/accountnum22/genesis.json --block-log-dir ~/eosio_test/accountnum22/blocks --config-dir ~/eosio_test/accountnum22/ --data-dir ~/eosio_test/accountnum22/ --http-server-address 127.0.0.1:8022 --p2p-listen-endpoint 127.0.0.1:9022 --enable-stale-production --producer-name accountnum22 --private-key '[ ""pubkey","privatekey" ]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011 --p2p-peer-address localhost:9033 --p2p-peer-address localhost:9044
$ nodeos --genesis-json ~/eosio_test/accountnum33/genesis.json --block-log-dir ~/eosio_test/accountnum33/blocks --config-dir ~/eosio_test/accountnum33/ --data-dir ~/eosio_test/accountnum33/ --http-server-address 127.0.0.1:8033 --p2p-listen-endpoint 127.0.0.1:9033 --enable-stale-production --producer-name accountnum33 --private-key '[ "pubkey","privatekey"]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011 --p2p-peer-address localhost:9022 --p2p-peer-address localhost:9044
$ nodeos --genesis-json ~/eosio_test/accountnum44/genesis.json --block-log-dir ~/eosio_test/accountnum44/blocks --config-dir ~/eosio_test/accountnum44/ --data-dir ~/eosio_test/accountnum44/ --http-server-address 127.0.0.1:8044 --p2p-listen-endpoint 127.0.0.1:9044 --enable-stale-production --producer-name accountnum44 --private-key '[ "pubkey","privatekey"]' --plugin eosio::producer_plugin --plugin eosio::chain_api_plugin --plugin eosio::http_plugin --p2p-peer-address localhost:9011 --p2p-peer-address localhost:9022 --p2p-peer-address localhost:9033
(3)genesis.json
每个节点的输出都在该节点工作目录中的文件stderr中捕获,例如./nodes/accountnum44/stderr。
3.12 销毁eosio账户
一旦选择生产者满足了最低数量要求,即被选出,eosio帐户就可以销毁,将eosio.msig帐户留作唯一的特权帐户。
销毁主要涉及将eosio的所有帐户的密钥设置为null。 使用以下命令清除eosio帐户的所有者和活动密钥:
$ cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner
$ cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active