正在阅读:EOSForce超级节点部署与测试网搭建指南EOSForce超级节点部署与测试网搭建指南

2018-11-05 09:24 出处:其他 作者:佚名 责任编辑:liuxiangcheng

EosForce节点部署指南

注意事项

·一般服务器最低配置为2核cpu4G内存 50G ssd硬盘,系统推荐64位ubuntu 16.04操作系统

·部署过程中原力eos主网不可和联盟eos主网同时部署在一台服务器上,即一台服务器只能部署一套EOS主网,主要防止使用过程中出现奇怪的错误

·原力eos生态的第三方应用插件不可和联盟eos主网混合使用,比如联盟的eosjs插件不可和原力eos主网直接对接

·部署原力eos节点前,最好需要之前有过eos的相关的基础知识学习,比如命令行客户端及RPC API使用

·部署BP节点,是部署同步节点的基础上修改下配置,就变成BP节点

·注册bp时,需要钱包账户最低充值100个eos作为注册费

1.同步节点部署

基于linux操作系统 ubuntu 16.04版本 原力eos源码部署方案,docker部署请参考https://github.com/eosforce/genesis

1. 下载源码

apt-get update && apt-get install -y git wget

git clone https://github.com/eosforce/eosforce.git eosforce

2. 执行如下命令安装原力eos

cd eosforce && git submodule update --init --recursive && ./eosio_build.sh

mkdir -p ~/.local/share/eosio/nodeos/config

curl https://raw.githubusercontent.com/eosforce/genesis/master/genesis.json -o ~/.local/share/eosio/nodeos/config/genesis.json

cp build/contracts/eosio.token/eosio.token.abi build/contracts/eosio.token/eosio.token.wasm ~/.local/share/eosio/nodeos/config

cp build/contracts/System/System.abi build/contracts/System/System.wasm ~/.local/share/eosio/nodeos/config

cp build/contracts/eosio.bios/eosio.bios.abi build/contracts/eosio.bios/eosio.bios.wasm ~/.local/share/eosio/nodeos/config

cp build/contracts/eosio.msig/eosio.msig.abi build/contracts/eosio.msig/eosio.msig.wasm ~/.local/share/eosio/nodeos/config

cd build && make install

3. config核心配置文件获取并修改(若想修改p2p地址请参考第二节)

wget http://download.aitimeout.site/config.ini

cp config.ini ~/.local/share/eosio/nodeos/config/

config.ini文件需要修改2个地方:

第一个修改地方:p2p-server-address = ip:7894 (ip为公网服务器ip,端口自行修改,注意防火墙要放行该端口)

第二个修改的地方,修改成自己的genesis.json路径,用绝对路径防止出错:

genesis-json = "/root/.local/share/eosio/nodeos/config/genesis.json"

4. 启动节点并测试

cd build/programs/nodeos && ./nodeos

打开另一个终端查看本地区块高度及对比eos原力官方主网的出块高度

查看本地高度命令如下,并多次执行如下命令区块高度为不断增加,说明同步正常,直到高度和原力主网高度接近时,同步完成

cleos get info

打开浏览器输入如下地址查看原力eos主网区块高度

https://w1.eosforce.cn/v1/chain/get_info

其中head_block_num为区块高度

2.BP节点部署

准备工作

生成一对公私钥给BP节点使用,执行如下命令生成

cleos create key

执行结果如下:

Private key: 5KidVdxbLKbJo9QiTyrbYULNTdKFTzdCb9oZgdaWye2CZfXz2hC

Public key: EOS6Z4fD6isTKZwaeH6Req7QXZLK3Yvb2rQoTxefVcsGXaXsFrBap

其中 Private key为私钥 Public key为公钥, Private 注意Public key在后面注册bp时用到,即执行updatebp

基于以上部署好的同步节点进行修改,只需修改2个地方:

config.ini修改如下:

第一修改的地方:

producer-name = bpname (bpname为你的bp的名称)

第二修改地方:

signature-provider = EOSpubkey=KEY:EOSprivkey (其中EOSpubkey准备工作中生成的公钥,EOSprivkey为准备工作中生成的私钥)

启动节点,执行如下命令

删除旧的数据

rm -rf ~/.local/share/eosio/nodeos/data

启动

cd build/programs/nodeos && ./nodeos

3.BP节点注册

准备工作: 首先要注册一个原力eos账户名,并需要给这个账户转100个eos,注册时需要注册费,账户名必须和bp的名字一样,也为bpname,这样 就有了公钥pub_key,私钥pri_key,账户名 bpname(和bp的名字同名),这个步骤就不详细介绍

创建一个钱包

cleos wallet create

结果如下:

Creating wallet: default

Save password to use in the future to unlock this wallet.

Without password imported keys will not be retrievable.

"PW5HwhcFEfN2Up63iK5LfQwXX7FmkUNkwV1t4TG73tMNxj59YeQws"

生成默认的钱包,最后一行为钱包的密码

导入账户私钥到钱包

cleos wallet import pri_key

执行命令进行注册

cleos -u https://p1.eosforce.cn push action eosio updatebp '{"bpname":"bpname","block_signing_key":"block_signing_key","commission_rate":"commission_rate","url":"https://eosforce.io"}' -p bpname

注册成功返回如下结果:

executed transaction: 34dbe8bb08d0f7c3d5a4453d1e068e35f03c96f25d200c4e2a795e6aec472d60 160 bytes 6782 us

# eosio <= eosio::transfer {"from":"eosforce","to":"user1","quantity":"10.0000 EOS","memo":"my first transfer"}

warning: transaction executed locally, but may not be confirmed by the network yet

其中bpname 为bp的名称。block_signing_key为BP的公钥,commission_rate为佣金比例,设置3000,就是给用户分红70%,bp为30%,详细介绍可以参考 https://github.com/eosforce/contracts/tree/master/System

最后如何检验出块

出块的2个条件:

·投票后排名前23名,可出块

·本地bp节点同步已完成

可以下载我们的eosforce钱包并安装,查看自己的BP有没有出块 (钱包下载地址:https://github.com/eosforce/wallet-desktop/releases)

EOSForce测试主网搭建说明

在很多时候为了方便开发测试,需要自己单独启动一套主网,这里是一个启动主网的说明,也可以作为超级节点运维的参考。

对应eosforce提交: 0e10da90619e05296f166b11e5a7536c5fa78e71

TODO : 添加使用config.ini启动说明 TODO : 添加docker启动说明 TODO : 添加多机器启动说明

0. eosforce 与 eos.io官方版本的区别

eosforce为了保证链的安全性,关闭了很多官方版本中未经验证的功能, eosforce中只添加了最小需求的系统用户和合约,这些用户和合约是内置在代码中的,在节点初始化区块链时加载的, 这样eosforce启动时不需要向官方版本中的bios流程中有大量的创建用户和加载系统合约的步骤。

eosforce在bios时会指定genesis.json中配置的23个初始超级节点,这和eos.io官方版本不同, 所以不需要注册超级节点步骤, 开始启动时,直接启动23个对应的节点即可。

1. eosforce bios基本步骤

1 编译eosforce

2 通过program/genesis工具生成23个节点的公私钥配置和对应的genesis.json

3 启动23个超级节点(也可以少于23个)

步骤要比官方启动少很多,需要注意的就是保证配置正确即可。

注意 这里示例中使用的是ubuntu 18.04版本,需要 python 3.6.

2. 配置说明

nodeos 可以通过指定config.ini配置启动信息, 也可以通过命令行参数指定, 一般来说配置文件比较适合生产环境或者容器启动,如果是测试用的节点可以使用命令行参数,便于脚本启动.

这里我们使用命令行参数启动nodeos,便于脚本启动.

nodeos 参数如下:

这里要特别注意的是 --config-dir eosforce要求这个目录下包含以下文件:

config

├── System.abi

├── System.wasm

├── eosio.token.abi

├── eosio.token.wasm

├── config.ini

└── genesis.json

因为我们使用命令行参数,所以config.ini留一个空文件即可

以下是个例子:

./nodeos \

--blocks-dir ./nodes/20-biosbpt/blocks \

--config-dir ./nodes/20-biosbpt/../../config \

--data-dir ./nodes/20-biosbpt \

--http-server-address 127.0.0.1:8020 \

--p2p-listen-endpoint 127.0.0.1:9020 \

--max-clients 33 \

--p2p-max-nodes-per-host 33 \

--enable-stale-production \

--producer-name biosbpt \

--signature-provider=EOS5bijTJg8ZkGNTuL3VfMcMc3bYdLtZ1faJJPYHRB1ShDZLtkeRY=KEY:5Jgau5mVjCiGrTGrvLr9YcyWfWdWWTrPYVwxUhgaRc5ixKWCCff \

--plugin eosio::http_plugin \

--plugin eosio::chain_api_plugin \

--plugin eosio::producer_plugin \

--p2p-peer-address localhost:9001

注意 启动测试节点的时候,我们可以不是特别的注意安全问题,所以这里启动plugin都是全节点,生产环境中的超级节点需要注意安全问题。

这么长的命令肯定不适合手动输入,可以写脚本来启动,最后我们使用python做一个启动脚本。

3. 启动步骤

3.1 编译eosforce

获取代码:

git clone https://github.com/eosforce/eosforce.git

编译:

cd eosforce

./eosio_build.sh

注意脚本执行过程中会有几次确认,注意通过。

成功会有以下提示:

( ____ \( ___ )( ____ \\__ __/( ___ )

| ( \/| ( ) || ( \/ ) ( | ( ) |

| (__ | | | || (_____ | | | | | |

| __) | | | |(_____ ) | | | | | |

| ( | | | | ) | | | | | | |

| (____/\| (___) |/\____) |___) (___| (___) |

(_______/(_______)\_______)\_______/(_______)

EOSIO has been successfully built. 00:12:35

To verify your installation run the following commands:

export PATH=${HOME}/opt/mongodb/bin:$PATH

/home/fy/opt/mongodb/bin/mongod -f /home/fy/opt/mongodb/mongod.conf &

cd /home/fy/projects/eosforce_gen/build; make test

For more information:

EOSIO website: https://eos.io

EOSIO Telegram channel @ https://t.me/EOSProject

EOSIO resources: https://eos.io/resources/

EOSIO Stack Exchange: https://eosio.stackexchange.com

EOSIO wiki: https://github.com/EOSIO/eos/wiki

这里要注意的是,如果要执行test,最好确认关闭所有 nodeos 进程,否则会引起冲突

编译结果默认的位置是 eosforce/build

为了不污染全局环境而引起一些错误,不建议使用 make install。

3.2 配置

为了方便启动,这里把节点工作目录设置为 eosforce/build/testrun/, 相应的配置文件目录为 eosforce/build/testrun/config/

cd ./build

mkdir testrun

首先生成 genesis.json 这里eosforce提供了一个工具,便于随机生成所有超级节点的key

cd testrun

../programs/genesis/genesis

这时目录下会生成以下文件:

·config.ini 生成的超级节点key,便于复制到config.ini中

·genesis.json 生成的创始配置,我们后续就使用这个配置

·key.json 对应超级节点账户公钥的私钥

·sigkey.json 超级节点签名用的公钥对应的私钥,后面会使用这个来启动nodeos

这里注意区分超级节点 账户key 和 sign_key, 启动超级节点需要使用sign_key作为signature-provider配置。

对于genesis.json,我们直接移动进config目录下:

mkdir ./config

mv ./genesis.json ./config/

复制需要的合约文件进入config,同时创建一个空的config.ini, 注意 : eosforce所使用的合约是 eosforce/contracts/System 和 eosforce/contracts/eosio.token, 不是 不是 不是 eosforce/contracts/eosio.system

cp ../contracts/eosio.token/eosio.token.abi ./config/

cp ../contracts/eosio.token/eosio.token.wasm ./config/

cp ../contracts/System/System.abi ./config/

cp ../contracts/System/System.wasm ./config/

echo "" > ./config/config.ini

这时config下有如下文件

config.ini eosio.token.abi eosio.token.wasm genesis.json System.abi System.wasm

3.3 启动超级节点

完成配置之后可以启动超级节点,这里我们启动三个节点, 由于第0届超级节点是由genesis.json中指定的,我们启动时需要对应genesis.json中的sign_key启动超级节点, 这里我们启动 biosbpa biosbpb biosbpc三个节点。

在genesis.json中配置如下:

{

"initial_timestamp": "2018-05-28T12:00:00.000",

"initial_key": "EOS1111111111111111111111111111111114T1Anm",

...

"initial_configuration": { ... },

"initial_account_list": [{

"key": "EOS5XLWw7xu6qR1yqCCYqxYEMggCyKPWUTDyAjA1pgECFtcd39G41",

"asset": "1.0000 EOS",

"name": "biosbpa"

}],

"initial_producer_list": [{

"name": "biosbpa",

"bpkey": "EOS63o5TEdLsQrxFTUobiDupHQMX8K5pEs7PPk91afmpkrkiprokc",

"commission_rate": 0,

"url": ""

}]

}

initial_account_list中是初始账号的列表,key是账号公钥,对应之前生成的key.json中的私钥 initial_producer_list是超级节点的列表,bpkey对应的私钥在之前生成的sigkey.json中

需要注意的是,eosforce启动之后会处理b1账户,所以为了防止一直报错,需要在initial_account_list中添加一个name为b1的账户。 否则会报以下错误:

2861606ms thread-0 controller.cpp:875 push_transaction ] -------call onfee function tx

2862013ms thread-0 wasm_interface.cpp:933 eosio_assert ] message: b1 is not found in accounts table

2862013ms thread-0 controller.cpp:888 push_transaction ] ---trnasction exe failed--------trace: {"id":"13a4c6b68425acb4fa4aae0d2e92fcb557939fa1f4b2e46228025bc8560b597f","elapsed":0,"net_usage":0,"scheduled":false,"action_traces":[{"receipt":{"receiver":"","act_digest":"0000000000000000000000000000000000000000000000000000000000000000","global_sequence":0,"recv_sequence":0,"auth_sequence":[],"code_sequence":0,"abi_sequence":0},"act":{"account":"","name":"","authorization":[],"data":""},"elapsed":0,"cpu_usage":0,"console":"","total_cpu_usage":0,"trx_id":"0000000000000000000000000000000000000000000000000000000000000000","inline_traces":[]}],"failed_dtrx_trace":null,"except":{"code":3050003,"name":"eosio_assert_message_exception","message":"eosio_assert_message assertion failure","stack":[{"context":{"level":"error","file":"wasm_interface.cpp","line":934,"method":"eosio_assert","hostname":"","thread_name":"thread-0","timestamp":"2018-07-13T03:47:42.013"},"format":"assertion failure with message: ${s}","data":{"s":"b1 is not found in accounts table"}},{"context":{"level":"warn","file":"apply_context.cpp","line":60,"method":"exec_one","hostname":"","thread_name":"thread-0","timestamp":"2018-07-13T03:47:42.013"},"format":"","data":{"_pending_console_output.str()":""}}]}}

2862014ms thread-0 controller.cpp:875 push_transaction ] -------call onfee function tx

也可以启动主网之后手动创建一个b1账户

这里我们启动超级节点需要对应超级节点的name,bpkey和在sigkey.json中的sig_key, 分别在下面的{name},{bpkey},{sig_key}

./nodeos --blocks-dir ./nodes/biosbpa/blocks --config-dir ./config --data-dir ./nodes/biosbpa --http-server-address 127.0.0.1:8021 --p2p-listen-endpoint 127.0.0.1:9021 --max-clients 64 --p2p-max-nodes-per-host 64 --enable-stale-production --producer-name biosbpa --signature-provider={biosbpa-bpkey}=KEY:{biosbpa-sig_key} --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::producer_plugin

./nodeos --blocks-dir ./nodes/biosbpb/blocks --config-dir ./config --data-dir ./nodes/biosbpb --http-server-address 127.0.0.1:8022 --p2p-listen-endpoint 127.0.0.1:9022 --max-clients 64 --p2p-max-nodes-per-host 64 --enable-stale-production --producer-name biosbpb --signature-provider={biosbpb-bpkey}=KEY:{biosbpb-sig_key} --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::producer_plugin --p2p-peer-address localhost:9021

./nodeos --blocks-dir ./nodes/biosbpc/blocks --config-dir ./config --data-dir ./nodes/biosbpc --http-server-address 127.0.0.1:8023 --p2p-listen-endpoint 127.0.0.1:9023 --max-clients 64 --p2p-max-nodes-per-host 64 --enable-stale-production --producer-name biosbpc --signature-provider={biosbpc-bpkey}=KEY:{biosbpc-sig_key} --plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::producer_plugin --p2p-peer-address localhost:9021 --p2p-peer-address localhost:9022

注意其中的 --p2p-peer-address 依照启动顺序监听已经启动的节点

如果启动成功,可以看到节点出块日志

需要注意的是,EOS中如果要出块的节点没有启动,则这一块会轮空,依然会等待出块的间隔,直到能出块的节点出块, eosforce代码中默认出块间隔是3s,这意味着a,b,c三个节点各自出块之后,会等待 20 * 3 = 60s之后,a节点才会出下一个块

3.4 验证执行合约

参见 https://github.com/eosforce/contracts/tree/master/System#command-reference 连接之前设置的http-server-address 127.0.0.1:8022,例如使用如下执行:

./cleos -u http://127.0.0.1:8022 get table eosio eosio bps

获取超级节点列表

3.5 使用客户端钱包连接测试网

TODO

4. 通过python脚本启动

这个脚本改写自 eosforce/tutorials/bios-boot-tutorial/bios-boot-tutorial.py 可以方便的在单机上一键启动23个节点构成测试网。

4.1 脚本

#!/usr/bin/env python3

import argparse

import json

import os

import re

import subprocess

import sys

import time

args = None

logFile = None

unlockTimeout = 999999999

def jsonArg(a):

return " '" + json.dumps(a) + "' "

def run(args):

print('bios-boot-tutorial.py:', args)

logFile.write(args + '\n')

if subprocess.call(args, shell=True):

print('bios-boot-tutorial.py: exiting because of error')

sys.exit(1)

def retry(args):

while True:

print('bios-boot-tutorial.py:', args)

logFile.write(args + '\n')

if subprocess.call(args, shell=True):

print('*** Retry')

else:

break

def background(args):

print('bios-boot-tutorial.py:', args)

logFile.write(args + '\n')

return subprocess.Popen(args, shell=True)

def sleep(t):

print('sleep', t, '...')

time.sleep(t)

print('resume')

def makeGenesis():

run('rm -rf ' + os.path.abspath(args.config_dir))

run('mkdir -p ' + os.path.abspath(args.config_dir))

run('mkdir -p ' + os.path.abspath(args.config_dir) + '/keys/' )

run('cp ' + os.path.abspath(args.contracts_dir) + '/eosio.token/eosio.token.abi ' + os.path.abspath(args.config_dir))

run('cp ' + os.path.abspath(args.contracts_dir) + '/eosio.token/eosio.token.wasm ' + os.path.abspath(args.config_dir))

run('cp ' + os.path.abspath(args.contracts_dir) + '/System/System.abi ' + os.path.abspath(args.config_dir))

run('cp ' + os.path.abspath(args.contracts_dir) + '/System/System.wasm ' + os.path.abspath(args.config_dir))

run('echo "" > ' + os.path.abspath(args.config_dir) + '/config.ini')

run('../programs/genesis/genesis')

run('mv ./genesis.json ' + os.path.abspath(args.config_dir))

run('mv ./key.json ' + os.path.abspath(args.config_dir) + '/keys/')

run('mv ./sigkey.json ' + os.path.abspath(args.config_dir) + '/keys/')

def addB1Account():

run(args.cleos + 'create account eosforce b1 ' + initAccounts[len(initAccounts) - 1]['key'])

def startWallet():

run('rm -rf ' + os.path.abspath(args.wallet_dir))

run('mkdir -p ' + os.path.abspath(args.wallet_dir))

background(args.keosd + ' --unlock-timeout %d --http-server-address 127.0.0.1:6666 --wallet-dir %s' % (unlockTimeout, os.path.abspath(args.wallet_dir)))

sleep(.4)

run(args.cleos + 'wallet create')

def importKeys():

keys = {}

for a in initAccountsKeys:

key = a[1]

if not key in keys:

keys[key] = True

# note : new develop eosforce change this command to wallet import --key pk

# so need change this cmd

run(args.cleos + 'wallet import key ' + key)

def startNode(nodeIndex, bpaccount, key):

dir = args.nodes_dir + ('%02d-' % nodeIndex) + bpaccount['name'] + '/'

run('rm -rf ' + dir)

run('mkdir -p ' + dir)

otherOpts = ''.join(list(map(lambda i: ' --p2p-peer-address localhost:' + str(9001 + i), range(nodeIndex - 1))))

if not nodeIndex: otherOpts += (

' --plugin eosio::history_plugin'

' --plugin eosio::history_api_plugin'

)

print('bpaccount ', bpaccount)

print('key ', key, ' ', key[1])

cmd = (

args.nodeos +

' --blocks-dir ' + os.path.abspath(dir) + '/blocks'

' --config-dir ' + os.path.abspath(dir) + '/../../config'

' --data-dir ' + os.path.abspath(dir) +

' --http-server-address 127.0.0.1:' + str(8000 + nodeIndex) +

' --p2p-listen-endpoint 127.0.0.1:' + str(9000 + nodeIndex) +

' --max-clients ' + str(maxClients) +

' --p2p-max-nodes-per-host ' + str(maxClients) +

' --enable-stale-production'

' --producer-name ' + bpaccount['name'] +

' --signature-provider=' + bpaccount['bpkey'] + '=KEY:' + key[1] +

' --plugin eosio::http_plugin'

' --plugin eosio::chain_api_plugin'

' --plugin eosio::producer_plugin' +

otherOpts)

with open(dir + '../' + bpaccount['name'] + '.log', mode='w') as f:

f.write(cmd + '\n\n')

background(cmd + ' 2>>' + dir + '../' + bpaccount['name'] + '.log')

def startProducers(inits, keys):

for i in range(0, len(inits)):

startNode(i + 1, initProducers[i], keys[i])

def listProducers():

run(args.cleos + 'get table eosio eosio bps')

def stepKillAll():

run('killall keosd nodeos || true')

sleep(1.5)

def stepStartWallet():

startWallet()

importKeys()

def stepStartProducers():

startProducers(initProducers, initProducerSigKeys)

sleep(1)

addB1Account()

sleep(args.producer_sync_delay)

def stepLog():

run('tail -n 1000 ' + args.nodes_dir + 'biosbpa.log')

listProducers()

# Command Line Arguments

parser = argparse.ArgumentParser()

commands = [

('k', 'kill', stepKillAll, True, "Kill all nodeos and keosd processes"),

('w', 'wallet', stepStartWallet, True, "Start keosd, create wallet, fill with keys"),

('P', 'start-prod', stepStartProducers, True, "Start producers"),

('l', 'log', stepLog, True, "Show tail of node's log"),

]

parser.add_argument('--contracts-dir', metavar='', help="Path to contracts directory", default='../contracts/')

parser.add_argument('--cleos', metavar='', help="Cleos command", default='../programs/cleos/cleos --wallet-url http://localhost:6666 ')

parser.add_argument('--nodeos', metavar='', help="Path to nodeos binary", default='../programs/nodeos/nodeos')

parser.add_argument('--nodes-dir', metavar='', help="Path to nodes directory", default='./nodes/')

parser.add_argument('--keosd', metavar='', help="Path to keosd binary", default='../programs/keosd/keosd')

parser.add_argument('--log-path', metavar='', help="Path to log file", default='./output.log')

parser.add_argument('--wallet-dir', metavar='', help="Path to wallet directory", default='./wallet/')

parser.add_argument('--config-dir', metavar='', help="Path to config directory", default='./config')

parser.add_argument('--producer-sync-delay', metavar='', help="Time (s) to sleep to allow producers to sync", type=int, default=10)

parser.add_argument('-a', '--all', action='store_true', help="Do everything marked with (*)")

parser.add_argument('-H', '--http-port', type=int, default=8001, metavar='', help='HTTP port for cleos')

for (flag, command, function, inAll, help) in commands:

__箰讆__360__璺拶__prefix = ''

if inAll: prefix += '*'

if prefix: help = '(' + prefix + ') ' + help

if flag:

parser.add_argument('-' + flag, '--' + command, action='store_true', help=help, dest=command)

else:

parser.add_argument('--' + command, action='store_true', help=help, dest=command)

args = parser.parse_args()

args.cleos += '--url http://localhost:%d ' % args.http_port

logFile = open(args.log_path, 'a')

logFile.write('\n\n' + '*' * 80 + '\n\n\n')

makeGenesis()

with open(os.path.abspath(args.config_dir) + '/genesis.json') as f:

a = json.load(f)

initAccounts = a['initial_account_list']

initProducers = a['initial_producer_list']

with open(os.path.abspath(args.config_dir) + '/keys/sigkey.json') as f:

a = json.load(f)

initProducerSigKeys = a['keymap']

with open(os.path.abspath(args.config_dir) + '/keys/key.json') as f:

a = json.load(f)

initAccountsKeys = a['keymap']

maxClients = len(initProducers) + 10

haveCommand = False

for (flag, command, function, inAll, help) in commands:

if getattr(args, command) or inAll and args.all:

if function:

haveCommand = True

function()

if not haveCommand:

print('bios-boot-tutorial.py: Tell me what to do. -a does almost everything. -h shows options.')

4.2 执行说明

py脚本默认的执行位置在 eosforce/build/XXX 目录下, ‘XXX’可以任意指定

执行即可:

chmod u+x ./bios_boot_eosforce.py

./bios_boot_eosforce.py

成功后会查询所有当前bp,各个节点日志在 eosforce/build/XXX/nodes/ 目录下

关注我们

最新资讯离线随时看 聊天吐槽赢奖品