关于区块链:中移链基于EOS测试环境搭建

8次阅读

共计 11105 个字符,预计需要花费 28 分钟才能阅读完成。

id:BSN_2021 公众号:BSN 研习社 作者:中移信息

一、目标

本文档从基本概念登程再到实战搭建 EOS 网络,介绍了中移链测试环境搭建的简略操作流程,同时对常见问题做出梳理,实用于刚退出 EOSIO 区块链生态系统的开发人员,帮忙其疾速理解以及上手 EOS。

二、中移链介绍

中移链是基于 EOS 区块链框架革新的,满足 BSN 凋谢联盟链要求,合乎国内监管政策。凋谢联盟链是对私有链技术进行革新,减少了节点权限管制、零碎合约权限管制、点对点转账管制治理等性能。

此外,中移链与其它 BSN 凋谢联盟链计费模式不同。区别于能量值(Gas)机制,中移链采纳“耗费资源”计费模式,当链账户发动交易时,中移链会依据实时交易解决耗费的算力、网络宽带资源和存储资源从链账户中扣除相应的资源,相较于其余计费模式更加直观明了。

在满足我国信息化监管需要、合规可控的前提下,进一步丰盛了 BSN 技术体系,为 BSN 生态中的企业和开发者用户提供了更加多元化的技术抉择。

三、术语解释

EOS

EOS 是 Enterprise Operation System 的缩写,是商用分布式应用设计的一款区块链操作系统。EOS 引入了一种新的区块链架构 EOSIO,用于实现分布式应用的性能扩大。与比特币、以太坊等货币不同,EOS 是一种基于 EOSIO 软件我的项目公布的代币,也被称为区块链 3.0。

CDT

EOSIO 合约开发工具包,简称 CDT,是与合约编译相干的工具汇合。

cleos

命令行工具,能够与 nodeos 公开的 REST API 进行交互并治理钱包。

nodeos

应用插件配置,以运行节点的外围 EOSIO 节点守护过程,能够生成区块、节点验证、RPC API 接口。

keosd

一个轻客户端钱包,负责管理钱包,能够在播送到网络之前爱护密钥和签订交易,在本地计算机上运行并平安地将 EOSIO 密钥存储在钱包的组件中。

账户

存储在区块链上的人类可读名称。能够依据权限配置,通过集体或集体组的受权来领有。须要一个帐户能力将任何无效交易转移或推送到区块链。

钱包

钱包是存储密钥的客户端,这些密钥可能与一个或多个帐户的权限相关联,也可能不相干。现实状况下,钱包具备受高熵密码保护的锁定(加密)和解锁(解密)状态。EOSIO / eos 存储库捆绑了一个名为 CLI 的客户端,该客户端 cleos 与名为 lite-client 接口的 keosd,一起演示了这种模式。

受权和权限

权限是任意名称,用于定义代表该权限发送的事务的要求。能够通过链接受权或链接身份来为特定合约操作的权限调配权限。

四、搭建 EOS 网络

(一)环境筹备

Linux Distributions

  • Amazon Linux 2
  • CentOS Linux 8.x
  • CentOS Linux 7.x
  • Ubuntu 20.04
  • Ubuntu 18.04

macOS

  • macOS 10.14 (Mojave)
  • macOS 10.15 (Catalina)

(二)装置 EOSIO 二进制文件

以下命令将下载相应操作系统的二进制文件。

Mac OS X Brew 装置

brew tap eosio/eosio
brew install eosio

Ubuntu 20.04 软件包装置

wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb

Ubuntu 18.04 软件包装置

wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-18.04_amd64.deb
sudo apt install ./eosio_2.1.0-1-ubuntu-18.04_amd64.deb

CentOS 7 RPM 包装置

wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio-2.1.0-1.el7.x86_64.rpm
sudo yum install ./eosio-2.1.0-1.el7.x86_64.rpm

CentOS 8 RPM 软件包装置

wget https://github.com/eosio/eos/releases/download/v2.1.0/eosio-2.1.0-1.el8.x86_64.rpm
sudo yum install ./eosio-2.1.0-1.el8.x86_64.rpm

(三)装置 EOSIO.CDT

1、Mac OS X

装置

brew tap eosio/eosio.cdt
brew install eosio.cdt

卸载

brew remove eosio.cdt

2、Ubuntu (Debian)

装置

wget https://github.com/eosio/eosio.cdt/releases/download/v1.8.0/eosio.cdt_1.8.0-1-ubuntu-18.04_amd64.deb

sudo apt install ./eosio.cdt_1.8.0-1-ubuntu-18.04_amd64.deb

卸载

sudo apt remove eosio.cdt

3、CentOS / Redhat (RPM)

装置

wget https://github.com/eosio/eosio.cdt/releases/download/v1.8.0/eosio.cdt-1.8.0-1.el7.x86_64.rpm

sudo yum install ./eosio.cdt-1.8.0-1.el7.x86_64.rpm

卸载

$ sudo yum remove eosio.cdt

4、从源装置

下载

克隆版本 1.8.0 的 eosio.cdt 存储库。

git clone --recursive https://github.com/eosio/eosio.cdt --branch v1.8.0 --single-branch
cd eosio.cdt

建造

./build.sh

装置

sudo ./install.sh

(四)创立开发钱包

1、创立钱包

cleos wallet create --to-console

创立一个默认的钱包。cleos 将返回钱包的明码。钱包每 900 秒就会主动锁定,须要该明码来解锁。

也能够指定钱包的名称:

cleos wallet create -n < 想创立的钱包名称 >

2、关上钱包

启动 keosd 实例时,钱包默认敞开,关上钱包指令:

cleos wallet open

运行以下指令返回钱包列表:

cleos wallet list

3、解锁钱包

cleos wallet unlock

解锁钱包须要提供之前取得的明码,解锁后再返回钱包列表时,解锁的钱包后会有一个星号(*)表明钱包处于解锁状态。

4、创立密钥

cleos wallet create_key

零碎返回一个字符串,作为申请私钥的公钥。

5、导入开发密钥

cleos wallet import

零碎提醒输出私钥,输出开发密钥,失去零碎返回的私钥字符串。

(五)启动 keosd 和 nodeos

1、启动 keosd

keosd &

2、启动 nodeos

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 &

3、验证节点

tail -f nodeos.log

查看 nodeos 是否正在生产区块。

(六)创立开发账户

在零碎合约初始化之前,创立链账户的指令:

cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]
  • Positionals :

    • creator TEXT 创立新帐户的现有帐户的名称
    • name TEXT 新帐户的名称
    • OwnerKey TEXT 新帐户的所有者公钥或权限级别
    • ActiveKey TEXT 新帐户的激活公钥或权限级别
  • Options :

    • -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-usageUINT 设置交易的净应用估算下限,以字节为单位(默认为 0,示意无限度)

示例:

cleos create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9S

(七)创立、配置和启动创世节点

1、创立目录

创立一个目录,后续创世节点将在此目录中创立区块链数据库、日志文件和配置文件。

cd ~
mkdir biosboot
cd biosboot
mkdir genesis
cd genesis

2、在目录中创立一个 genesis.json 文件

创世区块的 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。

3、启动创世节点

(1)启动创世节点

在目录中创立一个 genesis_start.sh shell 脚本文件并关上:

touch genesis_start.sh
nano genesis_start.sh

复制以下 shell 脚本内容并将其粘贴到 genesis_start.sh shell 脚本文件中,替换 EOS_PUB_DEV_KEYEOS_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_pluginhistory_api_plugin 已弃用,将不再保护。请应用 state_history_plugintrace_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

4、查看 nodeos.log 文件

tail -f ./blockchain/nodeos.log

五、常见问题

(一)装置 EOSIO 二进制文件时报错

这是因为 Ubuntu 的版本太高,EOSIO 官网文档对于 EOSIO 反对的操作系统有着明确的要求,例如 CentOS7.x 或 CentOS8.x,而 Ubuntu 版本准确到了具体版本号,即 Ubuntu 20.04 和 Ubuntu 18.04,如果应用非举荐的 Linux 发行版本,会引发一些不稳固的景象,甚至一些未知谬误。因而,倡议开发者明确 Linux 操作系统版本,正当抉择正确且兼容的版本。

(二)启动 keosd 报错

运行 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 时呈现报错,同时 nodeos 节点被回绝连贯。

运行 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_KEYEOS_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"
正文完
 0