zoukankan      html  css  js  c++  java
  • 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.修改源码中关于投票的节点数

    在~eoseos1contractseosio.systemvoting.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在~eos1contractseosio.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
      运行一下,这里的计票数如何计算暂时还不清楚。
  • 相关阅读:
    VIJOS-P1446 最短路上的统计
    洛谷 CF997A Convert to Ones
    USACO Your Ride Is Here
    NOIP 2006 明明的随机数
    NOIP 2008 传球游戏
    数据结构—链表详解
    洛谷 P1160 队列安排
    洛谷 P1167 刷题
    JDOJ 2982: 最大连续子段和问题
    洛谷 P1123 取数游戏
  • 原文地址:https://www.cnblogs.com/hbright/p/9259456.html
Copyright © 2011-2022 走看看