EOS多主机多节点环境配置

 本文使用了四台同网段的主机,第一台做为eosio创世用户使用,另外三台做为出块者producer节点使用,最终实现了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源码

源码的获取参考wiki:https://github.com/EOSIO/eos/wiki/Local-Environment#1-getting-the-code

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

1

2

3

4

5

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中定义添加定义即可:

1

2

3

4

5

6

7

8

9

10

11

12

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.sh system voteproducer prods YOUR_ACCOUNT eoscannonchn -p YOUR_ACCOUNT
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

    运行一下,这里的计票数如何计算暂时还不清楚。

    使用命令:

 
//create contract
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
 
//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"
 
regproducer
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system regproducer lwz EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://lwz.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system regproducer hml EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://hml.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
cleos --wallet-url http://127.0.0.1:8900 --url http://10.186.11.211:8888 system regproducer lx EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://lx.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
 
 
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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant是Java程序员的一个好的工具,主要可以帮助程序员进行java项目的的管理,包括批量编译、部署、文档生成等工作,其用途远不止如此,ant内置了大量的API进行各种文件系统操作,在各种应用服务器中都被广泛应用于程序和资源的部署。 Ant功能强大的地方在于,程序员不仅能通过编写Ant的脚本(build.xml)来进行各种文件部署管理操作,还可以通过调用Ant的丰富的API,甚至扩展Ant的API进行编程。 1. 目录操作: 1) 创建目录 1. Project prj=new Project(); 2. Mkdir mkdir=new Mkdir(); 3. mkdir.setProject(prj); 4. mkdir.setDir(new File("d:tempdir1")); 5. mkdir.execute(); 2) 删除目录 1. Project prj=new Project(); 2. Delete delete=new Delete(); 3. delete.setProject(prj); 4. delete.setDir(new File("d:tempdir1")); //可同时将子目录及所有文件删除 5. delete.execute(); 注:对每一个Ant Task,如Mkdir,Delete、Copy、Move、Zip等,都必须设置一个Project对象,可以几个Ant Task共用一个Project对象,但不能有Ant Task不设置Project对象。 2. 文件拷贝和移动、更名 1)文件copy 1. Project prj=new Project(); 2. Copy copy=new Copy(); 3. copy.setProject(prj); 4. copy.setFile(new File("d:tempf1.txt"); 5. copy.setTodir(new File("d:tempdir1")); 6. copy.execute(); //将f1.txt文件copy到dir1中 2)copy文件并同时替换其中的内容, 如将 xml中的 @eosapp_name@ 替换成真正的应用名称 1. Project prj=new Project(); 2. Copy copy = new Copy(); 3. copy.setEncoding("UTF-8"); 4. copy.setProject(prj); 5. copy.setTodir("d:temp"); 6. 7. FileSet fileSet=new FileSet(); 8. fileSet.setDir(new File(eosHome "/base/template.app")); 9. fileSet.setIncludes("**/*.xml"); 10. copy.addFileset(fileSet); 11. 12. FilterSet filter=copy.createFilterSet(); 13. filter.addFilter("eosapp_name","app1"); 14. copy.execute(); 2)文件或目录移动 Move的用法和Copy用法基本一致,Move本身为Copy的子类。 1. Project prj=new Project(); 2. Copy copy=new Copy(); 3. copy.setProject(prj); 4. copy.setFile(new File("d:tempf1.txt"); 5. copy.setTodir(new File("d:tempdir1")); 6. copy.execute(); //将f1.txt文件移动到dir1中 3)文件改名: 1. Project prj=new Project(); 2. Copy copy=new Copy(); 3. copy.setProject(prj); 4. copy.setFile(new File("d:tempf1.txt"); 5. copy.setTodir(new File("d:tempf2.txt")); 6. copy.execute(); //将f1.txt文件更名为f2.txt中 4)目录更名: 1. Project prj=new Project(); 2. Copy copy=new Copy(); 3. copy.setProject(prj); 4. copy.setFile(new File("d:tempdir1"); 5. copy.setTodir(new File("d:tempdir2")); 6. copy.execute(); //将dir1目录更名为dir2,相当于将dir1目录下的所有文件移到dir2目录下 3.使用文件集 FileSet 使用文件集可以同时将多个满足匹配条件的文件集合进行copy、move和压缩等操作。 1. Project prj=new Project(); 2. Copy copy=new Copy(); 3. copy.setProject(prj); 4. copy.setTodir(new File("d:temptodir")); 5. 6. FileSet fs=new FileSet(); 7. fs.setProject(prj); 8. fs.setDir(new File("d:javaprjsrc")); 9. fs.setIncludes("**/*.*"); //包含所有文件 10. fs.setExcludes("**/CVS,**/*.class"); //排除CVS相关文件,以及.class文件 11. copy.addFileset(fs); 12. 13. copy.execute(); 注: FileSet的setIncludes, 和setExcludes方法输入pattern, pattern是一个使用“,”或空格分隔的匹配字符串,其中, “**”代表所有文件或目录,“*.*”代表说有文件, “*.java”代表所有扩展名为java的文件。 4.目录扫描,查找文件 1. DirectoryScanner ds=new DirectoryScanner(); 2. ds.setBasedir(new File("d:tempwar")); 3. ds.setIncludes(new String[] ); 4. ds.scan(); 5. if(ds.getIncludedFilesCount()>0) { 6. System.out.println("found jsp!"); 7. String[] includeFiles=ds.getIncludedFiles(); 8. for(String file:includeFiles){ 9. System.out.println(file); 10. } 11. } 5.文件压缩,打包 //压缩为zip文件 1. Project prj=new Project(); 2. Zip zip=new Zip(); 3. zip.setProject(prj); 4. zip.setDestFile(new File("d:tempsrc.zip")); 5. FileSet fileSet=new FileSet(); 6. fileSet.setProject(prj); 7. fileSet.setDir(new File("d:javaprjprj1src")); 8. fileSet.setIncludes("**/*.java"); 9. zip.addFileset(fileSet); 10. zip.execute(); 11. 12. //将class文件打成jar包 13. Project prj=new Project(); 14. Jar jar=new Jar(); 15. jar.setProject(prj); 16. jar.setDestFile(new File("d:tempprj1.jar")); 17. FileSet fileSet=new FileSet(); 18. fileSet.setProject(prj); 19. fileSet.setDir(new File("d:javaprjprj1bin")); 20. fileSet.setIncludes("**/*.class,**/*.properties"); 21. jar.addFileset(fileSet); 22. jar.execute(); 6.文件解压 1)将压缩文件中的所有文件解压 1. Project prj=new Project(); 2. Expand expand=new Expand(); 3. expand.setProject(prj); 4. expand.setSrc(new File("d:tempsrc.zip")); 5. expand.setOverwrite(overwrite); 6. expand.setDest("d:tempoutsrc"); 7. expand.execute(); 2)将压缩文件中的符合匹配条件的文件解压 1. Project prj=new Project(); 2. Expand expand=new Expand(); 3. expand.setProject(prj); 4. expand.setSrc(new File("d:tempsrc.zip")); 5. expand.setOverwrite(overwrite); 6. expand.setDest("d:tempoutsrc"); 7. PatternSet patternset = new PatternSet(); 8. patternset.setIncludes("**/*.java"); 9. patternset.setProject(prj); 10. expand.addPatternset(patternset); 11. expand.execute(); 3)利用Mapper解压文件: 如将 .../lib/*.jar 解压到 .../WEB-INF/lib目录下(去除目录结构) 1. Expand expand = new Expand(); 2. expand.setProject(prj); 3. expand.setSrc(new File(zipFilePath)); 4. expand.setDest(new File(webDir "/WEB-INF/lib")); 5. 6. PatternSet pattern = new PatternSet(); 7. pattern.setIncludes("lib/*.jar"); 8. expand.addPatternset(pattern); 9. 10. FileNameMapper mapper=new FlatFileNameMapper(); 11. expand.add(mapper); 12. 13. /* another way using mapper 14. Mapper mapper=expand.createMapper(); 15. MapperType type=new MapperType(); 16. type.setValue("flatten"); 17. mapper.setType(type); 18. */ 19. expand.execute(); 7.读取zip文件 1) 读取zip文件中的文件和目录 1. ZipFile zipfile = new ZipFile(new File(filepath)); 2. for (Enumeration entries = zipfile.getEntries(); entries.hasMoreElements();) { 3. ZipEntry entry = (ZipEntry) entries.nextElement(); 4. if(entry.isDirectory()) 5. System.out.println("Directory: " entry.getName()); 6. else 7. System.out.println("file: " entry.getName()); 8. } 9. zipfile.close(); //ZipFile用完必须close,否则文件被锁定 2)zip文件扫描,在Zip文件中查找目录或文件 1. ZipScanner scan=new ZipScanner(); 2. scan.setSrc(new File("d:temptest.zip")); 3. scan.setIncludes(new String[] ); //查找目录(一、二级目录); 4. scan.scan(); 5. String dirs[]=scan.getIncludedDirectories(); 6. scan.setIncludes(new String[]); //查找文件 7. scan.scan(); 8. String files[]=scan.getIncludedFiles(); 从之前发布其他chm文件下载用户的反映看,有不少朋友反映下载后打开无法显示,这一般不是chm文件的问题,这里统一说明一下解决办法: 如果文件打开看不到右边的内容,是因为你的操作系统为了安全对下载的chm文件进行了锁定,只需要在打开前右键单击该chm文件选择“属性”,然后在“常规”选项卡的下方单击“解除锁定”按钮就可以了。如果还是不能看,请再查看一下你的chm文件所存储的目录或文件名是否有特殊字符如“#”号字符等,去掉特殊字符即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值