EOS開發教程(3.2):啟動序列(3)

in #eos18 days ago

2.從單節點到多節點
在下面的步驟中,我們將從單個區塊生產者(創世節點)轉換到多個生產者。到目前為止,只有內置的eosio賬戶有權對區塊進行簽名。我們的目的是用壹系列被選出的生產者來管理區塊鏈,生產區塊的規則是2/3+1個生產者在區塊完成前同意該區塊。
生產者通過選舉產生。生產者的名單是不斷變化的。治理規則與壹個特殊的內置賬號eosio.prods聯合,而不是把授權權限直接賦予區塊生產者。eosio.prods這個賬號代表了選出的生產者集合。eosio.prods賬號使用由eosio.msig合約定義的權限進行操作。
安裝了eosio.system合約之後,盡快指定eosio.msig為超級賬號,這樣它就能代表eosio賬號進行授權。eosio會盡快重新簽署它的權限,eosio.prods將會接管過來。
2.1. 指定eosio.msig為超級賬號
使用下面的命令指定eosio.msig為超級賬號:
cleos push action eosio setpriv ‘[“eosio.msig”, 1]’ -p [email protected]
2.2. 初始化系統賬號
使用代號0,精確位數為4的SYS代幣(精確位數範圍可以是0到18)初始化system賬號,
cleos push action eosio init ‘[“0”, “4,SYS”]’ -p [email protected]
2.3. 抵押代幣並拓展網絡
如果妳壹直跟著上面的步驟做到這裏,那麽妳現在有壹個單壹的主機,單節點配置,安裝了以下合約 :
· eosio.token
· eosio.msig
· eosio.system
eosio和eosio.msig賬號均是超級賬號。其他的eosio.*賬號是新建的,但不是超級賬號。現在我們準備好抵押賬號並拓展生產者網絡了。
2.4. 創建抵押賬號
抵押就是把代幣分配給EOSIO系統中的賬號的過程,這需要由“現實世界”中的實體進行。抵押與取消抵押是壹個持續的過程,貫穿區塊鏈的整個生命周期。初始的抵押在bios boot過程中完成,這個過程比較特殊。
在bios啟動序列期間,賬號使用他們的代幣進行抵押。然而,代幣是處於凍結狀態的,除非選出了生產者。因此,bios啟動序列期間的初始抵押就是把代幣分配給他們的賬號,並啟動投票程序,這樣才能選舉生產者,區塊鏈才能運行起來。
對於初始抵押程序,我們推薦以下做法 :

  1. 抵押0.1個代幣(不是賬號代幣的10% ) 給 RAM. 默認的, cleos 抵押 8 KB 的 RAM用於賬號創建, 由賬號創建者支付. 初始抵押過程,eosio賬號是賬號創建者。初始代幣抵押程序中抵押的代幣不能取消抵押,並且,在滿足了投票規則的最低要求之後,才能流通。.
  2. 抵押0.45 個代幣給CPU, 抵押0.45 個代幣給網絡.
  3. 另外的9個代幣用作流通.
  4. 代幣的cpu和網絡的抵押率保持在50/50..
    示例1. accountnum11 有100 個SYS. 它將把 0.1000個 SYS 抵押給 RAM; 把45.4500 個SYS 抵押給 CPU;把 45.4500 個SYS 抵押給網絡; 剩下的9.0000 個SYS 留著作為流通.
    示例2. accountnum33 有5 個SYS. 它將把 0.1000個 SYS 抵押給 RAM; 把0.4500 個SYS抵押給 CPU; 把0.4500個SYS 抵押給網絡; 剩下的 4.0000個 SYS 留著作為流通
    為了讓教程更貼近現實,我們使用Pareto 發行了十億的代幣給賬號。Pareto 分發遵循80–20的原則,在本例中,80%的代幣將由20%的人持有。這裏的例子不涉及怎麽進行Pareto分配,而是聚焦於抵押功能。本教程搭配的Bios-boot-tutorial.py腳本使用 Python NumPy (numpy)來生成Pareto 分配。
    使用下面的步驟為每個賬號抵押代幣。每個賬號都要單獨地執行這些步驟:
    註意
    本例的私鑰對已經創建好了。在實際的情景中,壹個賬號下的健值對與代幣應該通過安全的方式創建..
    $ cleos create key — to-console
    Private key: 5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
    Public key: EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
    cleos wallet import — private-key 5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
    imported private key for: EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
    使用初始資源和公鑰創建壹個抵押賬號.
    cleos system newaccount eosio — transfer accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt — stake-net “100000000.0000 SYS” — stake-cpu “100000000.0000 SYS” — buy-ram-kbytes 8192
    775292ms thread-0 main.cpp:419 create_action ] result: {“binargs”:”0000000000ea30551082d4334f4d113200200000"} arg: {“code”:”eosio”,”action”:”buyrambytes”,”args”:{“payer”:”eosio”,”receiver”:”accountnum11",”bytes”:8192}}
    775295ms thread-0 main.cpp:419 create_action ] result: {“binargs”:”0000000000ea30551082d4334f4d113200ca9a3b00000000045359530000000000ca9a3b00000000045359530000000001"} arg: {“code”:”eosio”,”action”:”delegatebw”,”args”:{“from”:”eosio”,”receiver”:”accountnum11",”stake_net_quantity”:”100000.0000 SYS”,”stake_cpu_quantity”:”100000.0000 SYS”,”transfer”:true}}
    executed transaction: fb47254c316e736a26873cce1290cdafff07718f04335ea4faa4cb2e58c9982a 336 bytes 1799 us

eosio <= eosio::newaccount {“creator”:”eosio”,”name”:”accountnum11",”owner”:{“threshold”:1,”keys”:[{“key”:”EOS8mUftJXepGzdQ2TaC…

eosio <= eosio::buyrambytes {“payer”:”eosio”,”receiver”:”accountnum11",”bytes”:8192}

eosio <= eosio::delegatebw {“from”:”eosio”,”receiver”:”accountnum11",”stake_net_quantity”:”100000.0000 SYS”,”stake_cpu_quantity…

2.5. 把新賬號註冊為生產者
執行以下命令把新賬號註冊為生產者:
cleos system regproducer accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt https://accountnum11.com EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt
1487984ms thread-0 main.cpp:419 create_action ] result: {“binargs”:”1082d4334f4d11320003fedd01e019c7e91cb07c724c614bbf644a36eff83a861b36723f29ec81dc9bdb4e68747470733a2f2f6163636f756e746e756d31312e636f6d2f454f53386d5566744a586570477a64513254614364754e7553504166584a48663232756578347534316162314556763945416857740000"} arg: {“code”:”eosio”,”action”:”regproducer”,”args”:{“producer”:”accountnum11",”producer_key”:”EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt”,”url”:”https://accountnum11.com/EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt","location":0}}
executed transaction: 4ebe9258bdf1d9ac8ad3821f6fcdc730823810a345c18509ac41f7ef9b278e0c 216 bytes 896 us

eosio <= eosio::regproducer {“producer”:”accountnum11",”producer_key”:”EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt”,”u…

這樣壹來,這個節點就成為了生成節點的候選節點,但是只有該節點被選上以後,它才能成為生產者。
2.6. 列出生產者
列出可用的生產者,來幫助投票程序。此時,妳會看到只有壹個賬號註冊成了生產者。
使用以下命令列出生產者:
cleos system listproducers
Producer Producer key Url Scaled votes
accountnum11 EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt https://accountnum11.com/EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22 0.0000
2.7. 設置並啟動壹個新生產者
我們將使用之前創建的accountnum11賬號來設置壹個新生產者。要設置新生產者,執行這些步驟,創建壹個專用的文件夾:
cd ~/netbios/
mkdir accountnum11
cd accountnum11
copy ~/netbios/genesis/stop.sh
copy ~/netbios/genesis/clean.sh
創建下面三個shell腳本文件,並賦予它們執行權限 genesis_start.sh, start.sh, hard_start.sh。.
#!/bin/bashDATADIR=”./blockchain”CURDIRNAME=${PWD##/}
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;fi
nodeos
— genesis-json $DATADIR”/../../genesis.json”
— signature-provider EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt=KEY:5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
— plugin eosio::producer_plugin
— plugin eosio::producer_api_plugin
— plugin eosio::chain_plugin
— plugin eosio::chain_api_plugin
— plugin eosio::http_plugin
— plugin eosio::history_api_plugin
— plugin eosio::history_plugin
— data-dir $DATADIR”/data”
— blocks-dir $DATADIR”/blocks”
— config-dir $DATADIR”/config”
— producer-name $CURDIRNAME
— http-server-address 127.0.0.1:8011
— p2p-listen-endpoint 127.0.0.1:9011
— access-control-allow-origin=

— contracts-console
— http-validate-host=false
— verbose-http-errors
— enable-stale-production
— p2p-peer-address localhost:9010
— p2p-peer-address localhost:9012
— p2p-peer-address localhost:9013 >> $DATADIR”/nodeos.log” 2>&1 & \echo $! > $DATADIR”/eosd.pid”
#!/bin/bashDATADIR=”./blockchain”CURDIRNAME=${PWD##/}
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;fi
nodeos
— signature-provider EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt=KEY:5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
— plugin eosio::producer_plugin
— plugin eosio::producer_api_plugin
— plugin eosio::chain_plugin
— plugin eosio::chain_api_plugin
— plugin eosio::http_plugin
— plugin eosio::history_api_plugin
— plugin eosio::history_plugin
— data-dir $DATADIR”/data”
— blocks-dir $DATADIR”/blocks”
— config-dir $DATADIR”/config”
— producer-name $CURDIRNAME
— http-server-address 127.0.0.1:8011
— p2p-listen-endpoint 127.0.0.1:9011
— access-control-allow-origin=

— contracts-console
— http-validate-host=false
— verbose-http-errors
— enable-stale-production
— p2p-peer-address localhost:9010
— p2p-peer-address localhost:9012
— p2p-peer-address localhost:9013 >> $DATADIR”/nodeos.log” 2>&1 & \echo $! > $DATADIR”/eosd.pid”
#!/bin/bashDATADIR=”./blockchain”CURDIRNAME=${PWD##/}
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;fi
nodeos
— signature-provider EOS8mUftJXepGzdQ2TaCduNuSPAfXJHf22uex4u41ab1EVv9EAhWt=KEY:5K7EYY3j1YY14TSFVfqgtbWbrw3FA8BUUnSyFGgwHi8Uy61wU1o
— plugin eosio::producer_plugin
— plugin eosio::producer_api_plugin
— plugin eosio::chain_plugin
— plugin eosio::chain_api_plugin
— plugin eosio::http_plugin
— plugin eosio::history_api_plugin
— plugin eosio::history_plugin
— data-dir $DATADIR”/data”
— blocks-dir $DATADIR”/blocks”
— config-dir $DATADIR”/config”
— producer-name $CURDIRNAME
— http-server-address 127.0.0.1:8011
— p2p-listen-endpoint 127.0.0.1:9011
— access-control-allow-origin=

— contracts-console
— http-validate-host=false
— verbose-http-errors
— enable-stale-production
— p2p-peer-address localhost:9010
— p2p-peer-address localhost:9012
— p2p-peer-address localhost:9013
— hard-replay-blockchain >> $DATADIR”/nodeos.log” 2>&1 & \echo $! > $DATADIR”/eosd.pid”
如果執行這些步驟過程中都沒有錯誤,那麽妳的文件夾的結構應該是這樣的:
cd ~/biosboot/accountnum11/ls -al
drwxr-xr-x 8 owner group 256 Dec 7 14:17 .
drwxr-xr-x 3 owner group 960 Dec 5 10:00 ..
-rwxr-xr-x 1 owner group 40 Dec 5 13:08 clean.sh
-rwxr-xr-x 1 owner group 947 Dec 5 14:31 genesis_start.sh
-rwxr-xr-x 1 owner group 888 Dec 5 13:08 hard_start.sh
-rwxr-xr-x 1 owner group 901 Dec 6 15:44 start.sh
-rwxr-xr-x 1 owner group 281 Dec 5 13:08 stop.sh
現在壹切準備妥當,可以開啟第二個生產節點了,可以通過下面的命令來開啟第二個生產節點:
cd ~/biosboot/accountnum11/
./genesis_start.shtail -f blockchain/nodeos.log
執行了上面的命令之後,妳會在命令shell中看到壹個實時的nodeos.log流文件,它由nodeos生成,nodeos不停地向其中寫入內容。妳可以按CTRL+C按鍵,停掉實時監控流.
要停掉新的節點,妳需要執行stop.sh 腳本,如果要重啟節點,需要執行start.sh腳本而不是genesis_start.sh(這個腳本只在1.5步驟中,用來開啟創世節點,且只執行壹次).
可以執行下面壹系列命令,刪除所有內容,然後從頭開始:
cd ~/biosboot/accountnum11/
./stop.sh
./clean.sh
./genesis_start.shtail -f blockchain/nodeos.log
2.8.重復這個過程,創建多個生產者
現在妳可以重復上面的過程(從2.4到2.7),使用各自的抵押賬號,專屬文件夾,創建多個生產者,妳想要多少個就創建多少個,賬號命名為accountnumXY(x和y都是整數,範圍從1到5),這些賬號在他們各自的文件夾裏有自己的腳本文件genesis_start.sh, start.sh, stop.sh, clean.sh:
特别要注意 genesis_start.sh, start.sh 以及 hard_start.sh脚本文件中的下面参数:
— producer-name $CURDIRNAME \ # Producer name, set in the script to be the parent directory name

— http-server-address 127.0.0.1:8011 \ # http listening port for API incoming requests
— p2p-listen-endpoint 127.0.0.1:9011 \ # p2p listening port for incoming connection requests


— p2p-peer-address localhost:9010 \ # Meshing with peer genesis node
— p2p-peer-address localhost:9012 \ # Meshing with peer accountnum12 node
— p2p-peer-address localhost:9013 . # Meshing with peer accountnum13 node
2.9. 給每個啟動的區塊生產者投票
此時,節點已經開啟,加入到網絡中來了,他們可以從創世節點接收區塊,但還不能生產區塊。.
15%
節點要想能生產區塊,必須抵押15%的代幣,然後給所有可用生產者投票。之前我們給accountnum11賬號發行了足夠的代幣。要選舉區塊生產者,要執行下面的命令,使壹個賬號通過區塊生產者的賬號名稱給他們投票,最多可投30個區塊生產者:
cleos system voteproducer prods accountnum11 accountnum11 accountnum12 accountnum13