首页 > 区块链 > 区块链 > 中移链(基于EOS)测试环境搭建
id:BSN_2021 公众号:BSN 研习社 作者:中移信息
本文档从基本概念出发再到实战搭建 EOS 网络,介绍了中移链测试环境搭建的简单操作流程,同时对常见问题做出梳理,适用于刚加入 EOSIO 区块链生态系统的开发人员,帮助其快速了解以及上手 EOS。
中移链是基于 EOS 区块链框架改造的,满足 BSN 开放联盟链要求,符合国内监管政策。开放联盟链是对公有链技术进行改造,增加了节点权限控制、系统合约权限控制、点对点转账控制管理等功能。
此外,中移链与其它 BSN 开放联盟链计费模式不同。区别于能量值( Gas )机制,中移链采用“消耗资源”计费模式,当链账户发起交易时,中移链会根据实时交易处理消耗的算力、网络宽带资源和存储资源从链账户中扣除相应的资源,相较于其他计费模式更加直观明了。
在满足我国信息化监管需求、合规可控的前提下,进一步丰富了 BSN 技术体系,为 BSN 生态中的企业和开发者用户提供了更加多元化的技术选择。
EOS 是 Enterprise Operation System 的缩写,是商用分布式应用设计的一款区块链操作系统。EOS 引入了一种新的区块链架构 EOSIO,用于实现分布式应用的性能扩展。与比特币、以太坊等货币不同,EOS 是一种基于 EOSIO 软件项目发布的代币,也被称为区块链 3.0。
EOSIO 合约开发工具包,简称 CDT,是与合约编译相关的工具集合。
命令行工具,可以与 nodeos 公开的 REST API 进行交互并管理钱包。
使用插件配置,以运行节点的核心 EOSIO 节点守护进程,可以生成区块、节点验证、RPC API 接口。
一个轻客户端钱包,负责管理钱包,可以在广播到网络之前保护密钥和签署交易,在本地计算机上运行并安全地将 EOSIO 密钥存储在钱包的组件中。
存储在区块链上的人类可读名称。可以根据权限配置,通过个人或个人组的授权来拥有。需要一个帐户才能将任何有效交易转移或推送到区块链。
钱包是存储密钥的客户端,这些密钥可能与一个或多个帐户的权限相关联,也可能不相关。理想情况下,钱包具有受高熵密码保护的锁定(加密)和解锁(解密)状态。EOSIO / eos 存储库捆绑了一个名为 CLI 的客户端,该客户端 cleos 与名为 lite-client 接口的 keosd,一起演示了这种模式。
权限是任意名称,用于定义代表该权限发送的事务的要求。可以通过链接授权或链接身份来为特定合约操作的权限分配权限。
以下命令将下载相应操作系统的二进制文件。
brew tap eosio/eosio
brew install eosio
wget
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
wget
sudo apt install ./eosio_2.1.0-1-ubuntu-18.04_amd64.deb
wget
sudo yum install ./eosio-2.1.0-1.el7.x86_64.rpm
wget
sudo yum install ./eosio-2.1.0-1.el8.x86_64.rpm
安装
brew tap eosio/eosio.cdt
brew install eosio.cdt
卸载
brew remove eosio.cdt
安装
wget
sudo apt install ./eosio.cdt_1.8.0-1-ubuntu-18.04_amd64.deb
卸载
sudo apt remove eosio.cdt
安装
wget
sudo yum install ./eosio.cdt-1.8.0-1.el7.x86_64.rpm
卸载
$
sudo yum remove eosio.cdt
下载
克隆版本 1.8.0 的
eosio.cdt 存储库。
git clone --recursive cd eosio.cdt
建造
./build.sh
安装
sudo ./install.sh
cleos wallet create --to-console
创建一个默认的钱包。
cleos 将返回钱包的密码。钱包每 900 秒就会自动锁定,需要该密码来解锁。
也可以指定钱包的名称:
cleos wallet create -n <想创建的钱包名称>
启动keosd实例时,钱包默认关闭,打开钱包指令:
cleos wallet open
运行以下指令返回钱包列表:
cleos wallet list
cleos wallet unlock
解锁钱包需要提供之前获得的密码,解锁后再返回钱包列表时,解锁的钱包后会有一个星号(*)表明钱包处于解锁状态。
cleos wallet create_key
系统返回一个字符串,作为申请私钥的公钥。
cleos wallet import
系统提示输入私钥,输入开发密钥,得到系统返回的私钥字符串。
keosd &
nodeos -e -p eosio \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_plugin \
--plugin eosio::history_api_plugin \
--filter-on="*" \
--access-control-allow-origin='*' \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors >> nodeos.log 2>&1 &
tail -f nodeos.log
检查 nodeos 是否正在生产区块。
在系统合约初始化之前,创建链账户的指令:
cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]
creator
TEXT 创建新帐户的现有帐户的名称 name
TEXT 新帐户的名称 OwnerKey
TEXT 新帐户的所有者公钥或权限级别ActiveKey
TEXT 新帐户的激活公钥或权限级别-h,--help 打印此帮助信息并退出-x,--expiration 以秒为单位设置交易过期前的时间,默认为 30 秒-f,--force-unique 强制交易是唯一的。这将消耗额外的带宽并消除任何防止意外多次发出相同交易的保护措施-s,--skip-sign 指定是否应该使用解锁的钱包密钥来签署交易-d,--dont-broadcast 不要向网络广播交易(只打印到
stdout)-p,--permission
TEXT ... 要授权的帐户和权限级别,如
account@permission(默认为
creator@active)--max-cpu-usage-ms
UINT 为执行事务设置 CPU 使用预算的毫秒数上限(默认为 0,表示无限制)--max-net-usage
UINT 设置交易的净使用预算上限,以字节为单位(默认为 0,表示无限制)示例:
cleos create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9S
创建一个目录,后续创世节点将在此目录中创建区块链数据库、日志文件和配置文件。
cd ~
mkdir biosboot
cd biosboot
mkdir genesis
cd genesis
创世区块的 json 文件内容如下,将
EOS_PUB_DEV_KEY 替换为公钥:
{
"initial_timestamp":
"2018-12-05T08:55:11.000",
"initial_key":
"EOS_PUB_DEV_KEY",
"initial_configuration": {
"max_block_net_usage":
1048576,
"target_block_net_usage_pct":
1000,
"max_transaction_net_usage":
524288,
"base_per_transaction_net_usage":
12,
"net_usage_leeway":
500,
"context_free_discount_net_usage_num":
20,
"context_free_discount_net_usage_den":
100,
"max_block_cpu_usage":
100000,
"target_block_cpu_usage_pct":
500,
"max_transaction_cpu_usage":
50000,
"min_transaction_cpu_usage":
100,
"max_transaction_lifetime":
3600,
"deferred_trx_expiration_window":
600,
"max_transaction_delay":
3888000,
"max_inline_action_size":
4096,
"max_inline_action_depth":
4,
"max_authority_depth":
6
},
"initial_chain_id":
"0000000000000000000000000000000000000000000000000000000000000000"
}
参数说明:
initial_timestamp :时间戳,规定创世区块开始的时间。
.initial_key :创世区块节点的公钥。
initial_configuration :初始化配置
max_block_net_usage :块指令中的最大净使用量;
target_block_net_usage_pct :最大净使用量的目标百分比( 1% == 100, 100%= 10,000 );超过这个会触发拥塞处理;
max_transaction_net_usage :无论账户限制如何,链将允许的最大客观测量净使用量;
base_per_transaction_net_usage :为支付杂费而计费的交易净使用量的基本金额;
net_usage_leeway :执行交易时可用的净使用余地量(在交易结束时仍检查新限制而没有余地);
context_free_discount_net_usage_num :无上下文数据净使用折扣的分子;
context_free_discount_net_usage_den :无上下文数据净使用折扣的分母;
max_block_cpu_usage :一个块的最大可计费 cpu 使用量(以微秒为单位);
target_block_cpu_usage_pct :最大 cpu 使用率的目标百分比 ( 1% == 100, 100%= 10,000 );超过这个会触发拥塞处理;
max_transaction_cpu_usage :链将允许的最大可计费 CPU 使用量(以微秒为单位),无论帐户限制如何;
min_transaction_cpu_usage :链需要的最小可计费 CPU 使用量(以微秒为单位);
max_transaction_lifetime :事务的最大生命周期;
deferred_trx_expiration_window :延迟事务可以第一次执行直到过期的秒数;
max_transaction_delay :授权检查可以作为延迟要求强加的最大秒数;
max_inline_action_size :内联操作的最大大小;
max_inline_action_depth :内联动作的最大深度;
max_authority_depth :权限深度的最大值。
initial_chain_id : 初始链 id 。
(1)启动创世节点
在目录中创建一个
genesis_start.sh shell 脚本文件并打开:
touch genesis_start.sh
nano genesis_start.sh
复制以下 shell 脚本内容并将其粘贴到
genesis_start.sh shell 脚本文件中,替换
EOS_PUB_DEV_KEY 和
EOS_PRIV_DEV_KEY 为之前创建的密钥对,
EOS_PUB_DEV_KEY 用公钥替换,
EOS_PRIV_DEV_KEY 用私钥替换:
#
!/bin/bash
DATADIR="./blockchain"
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;
fi
nodeos \
--genesis-json $DATADIR"/../../genesis.json" \
--signature-provider EOS_PUB_DEV_KEY=KEY:EOS_PRIV_DEV_KEY \
--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 eosio \
--http-server-address 127.0.0.1:8888 \
--p2p-listen-endpoint 127.0.0.1:9010 \
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--p2p-peer-address localhost:9011 \
--p2p-peer-address localhost:9012 \
--p2p-peer-address localhost:9013 \
>
>
$DATADIR
"/nodeos.log" 2>&1 & \
echo $! > $DATADIR"/eosd.pid"
plugin
producer_plugin :节点生成块所需的加载功能。
producer_api_plugin :向 HTTP 插件管理的 RPC API 接口公开了
producer_plugin 的许多端点。
chain_plugin :在 EOSIO 节点上处理和聚合链数据所需的核心插件。
chain_api_plugin :将
chain_plugin 的功能暴露给 HTTP 插件管理的 RPC AP I接口。
http_plugin :nodeos 和 keosd 都支持的核心插件。该插件需要启用 nodeos 或 keosd 实例提供的任何 RPC API 功能。
history_plugin :提供了一个缓存层来获取有关区块链对象的历史数据。这取决于
chain_plugin 数据。
history_api_plugin :将
history_plugin 的功能暴露给由http插件管理的 RPC API 接口,提供对区块链数据的只读访问
history_plugin 的
history_api_plugin 已弃用,将不再维护。请使用
state_history_plugin 或
trace_api_plugin 代替。
Blockvault Client Plugin :使区块链管理员能够实施行业标准的灾难恢复,以最大限度地延长生产者的正常运行时间。该插件允许块生产者将部署为单个逻辑生产者的两个或多个节点聚集在一起。如果其中一个节点出现故障,集群中的其他节点将继续运行,从而满足生产者在最小服务中断的情况下继续运行的某些保证。
db_size_api_plugin :检索有关区块链的分析。
Http Client Plugin :提供
producer_plugin 安全使用外部
keosd 实例作为其区块签名者的能力。它只能在
producer_plugin 配置为生成块时使用。
Login Plugin : 支持使用 EOSIO 区块链进行身份验证的应用程序的概念。
login_plugin API 允许应用程序验证是否允许帐户签名以满足指定的权限。
Net Api Plugin : 将
net_plugin 的功能暴露给
http_plugin 所管理的 RPC API 接口。节点操作员可以使用
net_api_plugin 来管理活动节点的 p2p 连接。
net_api_plugin 提供四个 RPC API 端点:
net Plugin :提供了一个认证的p2p协议来持久地同步节点。
resource_monitor_plugin :监控
nodeos 运行的计算系统中的空间使用情况。
state_history_plugin :捕捉区块链状态的历史数据。
trace_api_plugin :提供一个以消费者为中心的长期 API,用于从指定块中检索已停用的操作和相关元数据。
txn_test_gen_plugin :用于交易测试。
其它
Producer -name $CURDIRNAME \ :生产者名称,在脚本中设置为父目录名称。
http-server-address 127.0.0.1:8011 \ :API 传入请求的 http 侦听端口。
p2p-listen-endpoint 127.0.0.1:9011 \ :输入连接请求的 p2p 侦听端口。
contracts-console :传递
chain_plugin 选项。
--access-control-allow-origin, --http-validate-host, --verbose-http-errors :传递
http-plugin 选项。
enable-stale-production :启用块生产,即使链是陈旧的。
p2p-peer-address localhost:9010 \ :与对等节点 genesis 啮合。
p2p-peer-address localhost:9012 \ :与对等节点 accountnum12 啮合。
p2p-peer-address localhost: 9013 \ :与对等节点 accountnum13 啮合。
将执行权限分配给
genesis_start.shshell 脚本文件,然后执行
genesis_start.sh脚本以启动 genesis
nodeos:
chmod 755 genesis_start.sh
./genesis_start.sh
(2)停止创世节点
停止
nodeos :
在目录中创建一个
stop.sh shell 脚本文件,并将以下
stop.sh 脚本复制到其中:
#
!/bin/bash
DATADIR="./blockchain/"
if [ -f $DATADIR"/eosd.pid" ]; then
pid=`cat $DATADIR"/eosd.pid"`
echo $pid
kill $pid
rm -r $DATADIR"/eosd.pid"
echo -ne "Stoping Node"
while true; do
[ ! -d "/proc/$pid/fd" ] && break
echo -ne "."
sleep 1
done
echo -ne "\rNode Stopped. \n"
fi
stop.sh 从同一目录执行 shell 脚本:
chmod 755 stop.sh
./stop.sh
(3)重启节点
执行 shell 脚本:
nodeos --genesis-json start.sh
(4)
nodeos从头开始
复制以下内容并创建一个 shell 脚本
clean.sh 并赋予它执行权限:
#
!/bin/bash
rm -fr blockchain
ls -al
如果想删除当前配置、区块链数据、配置和日志,首先运行
stop.sh 脚本,然后运行
clean.sh 。
./stop.sh
./clean.sh
./genesis_start.sh
tail -f ./blockchain/nodeos.log
这是因为 Ubuntu 的版本太高,EOSIO 官方文档对于 EOSIO 支持的操作系统有着明确的要求,例如 CentOS7.x 或 CentOS8.x,而 Ubuntu 版本精确到了具体版本号,即 Ubuntu 20.04 和 Ubuntu 18.04,如果使用非推荐的 Linux 发行版本,会引发一些不稳定的现象,甚至一些未知错误。因此,建议开发者明确 Linux 操作系统版本,合理选择正确且兼容的版本。
运行
keosd &出现以下信息:
"3120000 wallet_exception: Wallet exception Failed to lock access to wallet directory; is another keosd running?"
这是因为另一个
keosd进程实例可能正在后台运行。使用
pkill keosd杀死所有实例后重新运行
keosd &即可。
运行
tail -f nodeos.log 时出现以下报错:
"Database dirty flag set (likely due to unclean shutdown): replay required"
这是强制关闭节点导致的错误,由于节点刚刚创立,还没有重要信息,可以采用删除全部区块参数的方法,重新启动创世节点即可。
nodeos --config-dir . --data-dir .
nodeos --delete-all-blocks
需要注意的是,经过该操作以后,节点中的所有内容包括账户、交易都被清空了,所以后续的操作也要重新复现。在创建重复账户时,系统会提示 Error 3050001,表示账户名称已存在。通过验证发现之前创建的账户都不在了,说明在清空节点信息时它们都被同步清空了。之后的搭建中要注意使用 pkill 语句,避免强制杀死 nodeos 进程,否则清空或硬重放将占用大量时间。
硬重放执行的 shell 脚本:
nodeos --config-dir . --data-dir . --hard-replay-blockchain
使用时,如果上次结束时没有运行
stop.sh 停止,在下次开始时需要使用
hard_replay.sh 进行修复重启,log 即可正常。
以下是
hard_replay.sh 的 shell 脚本,替换
EOS_PUB_DEV_KEY 和
EOS_PRIV_DEV_KEY 为之前创建的生产者密钥对:
#
!/bin/bash
DATADIR="./blockchain"
if [ ! -d $DATADIR ]; then
mkdir -p $DATADIR;
fi
nodeos \
--signature-provider EOS_PUB_DEV_KEY=KEY:EOS_PRIV_DEV_KEY \
--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 eosio \
--http-server-address 127.0.0.1:8888 \
--p2p-listen-endpoint 127.0.0.1:9010 \
--access-control-allow-origin=* \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors \
--enable-stale-production \
--p2p-peer-address localhost:9011 \
--p2p-peer-address localhost:9012 \
--p2p-peer-address localhost:9013 \
--hard-replay-blockchain \
>
>
$DATADIR
"/nodeos.log" 2>&1 & \
echo $! > $DATADIR"/eosd.pid"
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70012206/viewspace-2906951/ ,如需转载,请注明出处,否则将追究法律责任。