EOS多主機多節點環境配置


 本文使用了四台同網段的主機,第一台做為eosio創世用戶使用,另外三台做為出塊者節點使用,最終實現了EOS多主機多節點的配置。最后EOSIO創世用戶不再出塊,由選舉出來的各個節點輪流出塊,下面將介紹具體的操作流程。

EOS versio: 1.0.7
system: ubuntu
 
四台服務器節點名稱與對應IP:
eosio 10.186.11.211
hml 10.186.11.223
lwz 10.186.11.220
lx 10.186.11.141

一.准備工作

1.獲取EOS源碼

 

2.修改源碼中關於投票的節點數

在~\eos\eos1\contracts\eosio.system\voting.cpp中第80行,源文件中把21個節點寫成數字了,我們需要成為3,即我們只配置三個節點並進行投票
 
原來代碼如下:
top_producers.reserve(21);

for ( auto it = idx.cbegin(); it != idx.cend() && top_producers.size() < 21 && 0 < it->total_votes && it->active(); ++it ) {
 top_producers.emplace_back( std::pair<eosio::producer_key,uint16_t>({{it->owner, it->producer_key}, it->location}) );
}

把21修改為3

top_producers.reserve(_maxbp);

for ( auto it = idx.cbegin(); it != idx.cend() && top_producers.size() < _maxbp && 0 < it->total_votes && it->active(); ++it ) {
 top_producers.emplace_back( std::pair<eosio::producer_key,uint16_t>({{it->owner, it->producer_key}, it->location}) );
}

其中_maxbp在~\eos1\contracts\eosio.system中定義添加定義即可:

class system_contract : public native {
      private:
         voters_table           _voters;
         producers_table        _producers;
         global_state_singleton _global;

         eosio_global_state     _gstate;
         rammarket              _rammarket;

    //Begin: Add by HML Date:2018-06-30
	const uint8_t  		_maxbp = 3;
	//End: Add by HML Date:2018-06-30

 

修改后重新編譯:
cd ~/eos
./eosio_build.sh
 
3.開放端口限制,關閉防火牆
     在配置中需要使用到機器的8888,9876 4321,三個端口,需要與服務器的系統管理員聯系關閉這三個端口的通信限制,這里可以使用telnet自己進行測試端口是否可用。
另外,需要查看一下每台機器的防火牆是否有對端口進行限制,否則也需要進行修改,如果是測試可以直接簡單地關掉防火牆是:ufw disable

二.修改eosio節點配置文件

1.運行nodeos與keosd

對四台主機都在命令行先運行nodeos與keosd,讓其產生各自的配置文件。

2.修改keosd配置文件

錢包在沒有使用的情況下超過900s會自動鎖定,為了減少解鎖的麻煩,我們修改自動鎖定的時間。配置文件路
~/eosio-wallet/config.ini,其中有一項unlock-timeout,默認為900,單位是秒,我們修改為90000,
即unlock-timeout = 90000

3.修改eosio節點配置文件

eosio用戶在機器10.186.11.211 上,其nodeos產生的配置文件路徑:~/.local/share/eosio/nodeos/config/config.ini

配置文件選項以下需要進行修改:
bnet-endpoint = 10.186.11.211:4321    

//for communicatin with cleos
http-server-address = 10.186.11.211:8888  
  
//for sync block
p2p-listen-endpoint = 10.186.11.211:9876 
p2p-peer-address = 10.186.11.223:9876
p2p-peer-address = 10.186.11.220:9876
p2p-peer-address = 10.186.11.141:9876 

agent-name = "EOS Test Agent"

//if eosio, this flag must be true, else must be set false, it decide whether or not 
//product block
enable-stale-production = true

//producer name
producer-name = eosio

//producer key,get by use"cleos ceate key"
private-key =["EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr", "5K463ynhZoCDDa4RDcr63cUwWLTnKqmdcoTKTHBjqoKfv4u5V7p"]

unlock-timeout = 90000

//load plugin
plugin = eosio::chain_api_plugin
plugin = eosio::history_api_plugin
plugin = eosio::chain_plugin
plugin = eosio::history_plugin
plugin = eosio::net_plugin
plugin = eosio::net_api_plugin 

三.創建並導入密匙

1.創建密匙

在進行配置時,我們先統計一下我們需要創建的用戶。先要創建九個系統用戶。另外我們自己需要創建三個節點用戶,三個普通用戶(用於投票)。
節點用戶:前面是節點用戶名稱,后面是將來我們打算分配的機器的IP地址。
hml 10.186.11.223
lwz 10.186.11.220
lx 10.186.11.141
普通用戶:用於抵押與投票。
usera
userb
userc
 
我們將打算使用eosio來創建用戶,那么這里共用15個用戶,這15個用戶對應的密匙分配如下:
  • eosio用戶與九個系統用戶共用一對密匙
  • 三個節點用戶與三個普通用戶各使用一對密匙
所有這里我們共用七對密匙
//eosio key 
EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
5K463ynhZoCDDa4RDcr63cUwWLTnKqmdcoTKTHBjqoKfv4u5V7p

//producers
//lwz
5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b
EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz

//hml
5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu
EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC

//lx
5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ
EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6

//users
//usera
5JtUScZK2XEp3g9gh7F8bwtPTRAkASmNrrftmx4AxDKD5K4zDnr
EOS69X3383RzBZj41k73CSjUNXM5MYGpnDxyPnWUKPEtYQmTBWz4D

//userb
5JUNYmkJ5wVmtVY8x9A1KKzYe9UWLZ4Fq1hzGZxfwfzJB8jkw6u
EOS7yBtksm8Kkg85r4in4uCbfN77uRwe82apM8jjbhFVDgEgz3w8S

//userc
5K6LU8aVpBq9vJsnpCvaHCcyYwzPPKXfDdyefYyAMMs3Qy42fUr
EOS7WnhaKwHpbSidYuh2DF1qAExTRUtPEdZCaZqt75cKcixuQUtdA

另外,需要特別注意的是這里eosio key 是和創世用戶nodeos的配置文件中的private-key是一致的,這里不能弄錯,否則會涉及到權限報錯的問題。其它的密匙對由 cleos create key 命令隨機產生即可。

2.運行eosio的節點程序nodeos

在命令行運行nodeos即可,建議使用nohup后台進行。
 

3.創建錢包並導入密匙

創建一個default錢包,並記錄下返回的密匙,用於將來解鎖錢包。如下:
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet create
PW5JkUedyEiWWK1tz4oFcoqRnn2iR9W5U9RhaLyswajLLLJ1xy7sp

導入六個用戶的密匙對:

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5JtUScZK2XEp3g9gh7F8bwtPTRAkASmNrrftmx4AxDKD5K4zDnr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5JUNYmkJ5wVmtVY8x9A1KKzYe9UWLZ4Fq1hzGZxfwfzJB8jkw6u
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5K6LU8aVpBq9vJsnpCvaHCcyYwzPPKXfDdyefYyAMMs3Qy42fUr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

還有兩個特殊的密匙對,eosio key ,eosio sign,它們都在nodeos的配置文件,我們也導入到default錢包中去:

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet import 5K463ynhZoCDDa4RDcr63cUwWLTnKqmdcoTKTHBjqoKfv4u5V7p

四.創建九個系統用戶

這九個系統用戶的名稱及其作用如下說明:
eosio.bpay:礦工獲取出塊獎勵的臨時代管賬戶,增發EOS的1%的25%會先轉到這個賬戶;
eosio.msig:多重簽名管理的賬戶;
eosio.names:靚號賬戶拍賣管理的賬戶;
eosio.ram:內存買賣管理的賬戶;
eosio.ramfee:內存買賣收取手續費的賬戶,按照每筆交易千分之5的費率收取手續費;
eosio.saving:增發EOS臨時存放賬戶,增發總量 5%,其中80%放在此賬戶,另外 20%再分成25%和75%,分別給eosio.bpay和eosio.vpay;
eosio.stake:管理EOS抵押的賬戶;
eosio.token:發行和管理token的賬戶;
eosio.vpay:礦工按照獲得投票多少比例獲取獎勵的臨時代管賬戶,增發EOS的1%的75%會先轉到這個賬戶.
 
分別創建它們:
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.bpay EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.msig EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.names EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.ram EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.ramfee EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.saving EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.stake EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.token EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 create account eosio eosio.vpay EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvr

五.加載四大合約,發行代幣

使用的命令如下:

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 set contract eosio.token ~/eos/build/contracts/eosio.token/
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 set contract eosio.msig ~/eos/build/contracts/eosio.msig/
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 push action eosio.token create '["eosio", "1000000000.0000 SYS"]' -p eosio.token
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888  push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 set contract eosio ~/eos/build/contracts/eosio.system/ 
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 push action eosio setpriv '["eosio.msig", 1]' -p eosio@active
在這里有幾個需要注意的地方:
  • 加載系統合約的時候有可能會有一個報錯: ......too long. 可以在命令行最后面加上 -x 3000 的選項,3000是一個大概的數字,自行調整這個數據到正確運行為止;
  • 智能合約的文件路徑必須是全路徑,盡量不要使用相對路徑;
  • 代幣發行的大小是用的uint32_t類型,所以代幣發行不能超過這個類型的數字,否則會報錯;
  • 系統合約加載不成功,檢查一下九個系統用戶是否正確創建,其它三個合約是否正確加載;
 
完成以后,在eosio用戶里有10億 SYS 代幣,可以命令查看,詳細的命令見文章最后的相關命令。
 

六.創建節點用戶與普通用戶

 

//create and transfer to producer
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio lwz EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz --stake-net "100000000.0000 SYS" --stake-cpu "100000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio lwz "20000.0000 SYS"

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio hml EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC --stake-net "100000000.0000 SYS" --stake-cpu "100000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio hml "20000.0000 SYS"

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio lx EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 --stake-net "100000000.0000 SYS" --stake-cpu "100000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio lx "20000.0000 SYS"

//create and transfer to user
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio usera EOS69X3383RzBZj41k73CSjUNXM5MYGpnDxyPnWUKPEtYQmTBWz4D --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio usera "20000.0000 SYS"

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio userb EOS7yBtksm8Kkg85r4in4uCbfN77uRwe82apM8jjbhFVDgEgz3w8S --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio userb "20000.0000 SYS"

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system newaccount --transfer eosio userc EOS7WnhaKwHpbSidYuh2DF1qAExTRUtPEdZCaZqt75cKcixuQUtdA --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram "20000.0000 SYS"   
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 transfer eosio userc "20000.0000 SYS"

八.配置並運行三個節點用戶的進程

 1.修改nodeos配置文件
文件同樣是~/.local/share/eosio/nodeos/config/config.ini,我們這里有三台機器需要配置,即:
hml 10.186.11.223
lwz 10.186.11.220
lx 10.186.11.141
我們以IP為10.186.11.223,節點名為hml的機器為例,它需要修改的配置如下:
bnet-endpoint = 10.186.11.223:4321

//communication with cleos
http-server-address = 10.186.11.223:8888

//for sync block
p2p-listen-endpoint = 10.186.11.223:9876
p2p-peer-address = 10.186.22.220:9876
p2p-peer-address = 10.186.11.211:9876
p2p-peer-address = 10.186.11.141:9876

agent-name = "EOS hml Agent"

//if not eosio,it must be fasle
 enable-stale-production = false

//producer name
producer-name =  hml

//producer key
private-key = ["EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu"]

plugin = eosio::chain_api_plugin
plugin = eosio::history_api_plugin
plugin = eosio::chain_plugin
plugin = eosio::history_plugin
plugin = eosio::net_plugin
plugin = eosio::net_api_plugin
對於另外兩個節點的配置文件,可以參照修改,基於以下原則
  • 帶有0.0.0.0的IP換成主機IP地址;
  • producer-name 換成自己節點的名稱;
  • producer key 寫上自己節點的私匙對;
  • agent-name最好參照修改下,暫時不知道其作用;
  • p2p-peer-address 可以添加很多個,表示本節點與其它多個節點進行通信,進行區塊同步;
 

2.開啟nodeos

現在可以啟動三台機器的nodeos進程了,可以發現三個節點開啟后先會同步eosio的歷史區塊,然后再同步接收eosio產生的區塊。
 

九.投票

 1.投票的命令
首先,我們需要有節點候選人,這一步我們在七步已經注冊過了,現在有lwz,hml,lx三個節點候選人,可以使用如下命令查看 節點候選人及其獲得的投票率
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system listproducers

開始的時候獲得的投票率都為零,現在使用命令進行投票

cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system voteproducer prods usera lwz  
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system voteproducer prods userb hml 
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system voteproducer prods userc lx 

分別使用usera,userb,userc給節點用戶lwz,hml,lx進行投票,再次查看投票率,如下:

我們把視圖切到eosio打印的消息上,發現區塊產生者已經變成了lwz,hml,lx三個用戶輪流出塊了,eosio不再出塊,只是在簡單地進行區塊的同步。

 

2.投票原理

  • 所有代幣的15%進行投票后eosio會停止出塊,主網會自動啟動。在這里我們的代幣數據數量總共是10億,那么我們的主網啟動需要1.5億質押的代幣進行投票后才能啟動,使用如下命令查看我們三個用來投票的普通用戶:
  • 質押的代幣計算方式:staked = cpu + net,所以這里usera有1億的質押,使用usera投票后只有1/10的投票率,不夠主網啟動,我們再用userb投票之后,發現主網就開始啟動了,出塊是由lwz和hml這兩個節點用戶進行了,當然,最后用userc給lx投票的時候,節點名為lx的用戶也會加入到出塊者中間。
    最后有producers標志,說明此用戶投票給了名稱為lwz的節點。
     

    十.其它相關命令

     
    //查看用戶的資金
    cleos --wallet-url http://127.0.0.1:8900 -u http://10.186.11.211:8888 get currency balance eosio.token eosio
     
    //獲取用戶信息
    cleos --wallet-url http://127.0.0.1:8900 -u http://10.186.11.211:8888 get account usera
     
    //列舉候選節點
    cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system listproducers
     
    //解鎖錢包
    cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 wallet unlock
     
    //查看投票數
    cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 get table eosio eosio producers
    運行一下,這里的計票數如何計算暫時還不清楚。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM