精通EOS系列 | EOS 源码编译、连接主网与单节点网络

一、从源代码编译与安装 前一章,我们讲解了 EOS 在 Docker 环境下的简单使用,作为一个码农,不亲自从源码编译怎么对待起码农这两个字,本章我们开始从源代码的获取开始,依次讲解编译、启动和插件系统。

现在 EOS 的编译比起以前有了很大的改善,几乎不用费什么麻烦就可以从源代码编译成功。从本章,假设你用的系统为 Mac OS,如果不是请遵守各自系统的规定。

首先,我们来安装相关的信赖,对于 Mac 系统来说,当然是安装神器 brew 了。在 Shell 下输入下面的命令,即可以安装所有必需的依赖:

brew install automake
brew install libtool
brew install llvm
brew install cmake
brew install gmp
brew install mongodb
brew install doxygen
brew install graphviz
brew install lcov
如果系统中已经安装过 gettext,那么需要执行下面的命令来重新生成连接。
brew unlink gettext && brew link --force gettext
在 Mongodb 安装后,我们可以使用下面两个命令之一来启动它
brew services start mongodb
mongod --config /usr/local/etc/mongod.conf
接下来,就要 github 下载 EOS 源了代码,Shell 中输入以下命令:
git clone https://github.com/EOSIO/eos --recursive
具体下载时间要取决于你的网络。在代码下载完成之后,就可以进行编译了,命令如下:
cd eos
./eosio_build.sh
如果没有什么意外,一段时间之后,你就会看到下图:

如果你能看到上面和图片,那么恭喜你,你的 EOS 编译成功了。

当编译成功之后,接下来我们就开始安装 eos,输入以下命令:

sudo ./eosio_install.sh
几分钟之后,你就会看到下图

在上面的图片中我们注意到 EOS 相关的可执行命令被放入 /usr/local/eosio/bin 目录,我们把这个目录加入系统 PATH 变量中,然后就可以在 Shell 中执行相关的命令了。

二、启动 EOS 节点 对于同步主网、测试网,外加自己单节点测试的,可以不执行上面的安装,而是单独执行 build 目录下面的各个程序。
cd build/programs/nodeos
./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin 
其中,参数 -e 的作用是开始生成区块,-p eosio 是指定节点的名称,--plugin 指定了两个插件,第一个插件可以获取链上的信息,提交交易信息,提供了 /v1/chain 开头的各种 RPC,第二个插件提供了获取指定账号的交易历史记录,这些 API 以 /v1/history 为开头,--hard-replay-blockchain 参数是为了 注意:

如果启动时候出现 dirty-flag 这样的错误,需要加上 --hard-replay-blockchain 参数。

如果启动时候出现 3190003 block_log_not_found: block log can not be found 错误,需要把 --hard-replay-blockchain 参数去掉。 执行上面的命令可以看到如下图所示的内容:

注意红框中的内容,这个表示节点已经在产生区块了。

既然本地节点已经运行,并且开始生成区块了,那我们就另起一个终端,执行 cleos 来查看当前网络信息:

cd build/programs/cleos
./cleos get info
执行上面的命令就会显示网络的信息:

我们注意到上图中 chain_id 等于 cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f 这个代表了当前我们运行的是本地测试网,对于公共测试网络的网络 id 是 038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca

连接到主网

默认情况下,我们连接到的是自己单节点的私网。如何连接到 EOS 主网?在回答这个问题之前,我们先要想一下为什么要连接到主网。因为,只有连接到主网,我们才有可能注册成为生产区块的节点,并拉票成为超级节点,获得真正出块的权力。既然连接到主网这么重要,那么如何才能连接到主网呢,下面我们就来研究这个问题。

如何连接到主网,其实非常简单,只需要主网的一份创世区块和主网的节点列表就可以了。

为了方便大家,这里我们提供一份主网的创世区块。

{
  "initial_timestamp": "2018-06-08T08:08:08.888",
  "initial_key": "EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3",
  "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": 200000,
    "target_block_cpu_usage_pct": 1000,
    "max_transaction_cpu_usage": 150000,
    "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
  }
}
我们在当前目录,即 build/programs/cleos 目录下,新建一个文件 genesis.json ,内容为上面的 JSON 内容。

接下来,我们要在配置文件 config.ini 中增加主网的节点列表,这个文件位于 ~/Library/Application\ Support/eosio/nodeos/config 目录下,打开这个文件,增加如下节点列表:

p2p-peer-address = p2p.prod.eosgravity.com:80
p2p-peer-address = eu-west-nl.eosamsterdam.net:9876
p2p-peer-address = p2p.mainnet.eosgermany.online:9876
p2p-peer-address = 54.38.250.15:19878
p2p-peer-address = p2p.genereos.io:9876
p2p-peer-address = mainnet.eospay.host:19876
p2p-peer-address = 130.211.59.178:9876
p2p-peer-address = 54.153.59.31:9999
p2p-peer-address = 94.130.250.22:9806
p2p-peer-address = peer.main.alohaeos.com:9876
p2p-peer-address = peer.eosn.io:9876
p2p-peer-address = prod.mainnet.eos.cybex.io:9888
p2p-peer-address = p2p-1.eosnetwork.io:9876
p2p-peer-address = p.jeda.one:3322
p2p-peer-address = eosbattles.com:9877
p2p-peer-address = 34.226.76.22:9876
p2p-peer-address = mainnet.eosoasis.io:9876
p2p-peer-address = node.eosflare.io:1883
p2p-peer-address = p2p.eosio.cr:1976
p2p-peer-address = p2p.eosio.cr:5418
p2p-peer-address = eno.eosvan.io:19866
然后,执行下面的命令:

./nodeos -e --genesis-json ./genesis.json --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin 注意:

1、如果出现 Incorrect plugin configuration Genesis state can only be set on a fresh blockchain. 这个错误,请在命令行上加入 --delete-all-blocks 参数,或者删除 ~/Library/Application\ Support/eosio/nodeos/data 这个目录。

2、如果出现 Not producing block because I don't have the private key for EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3 这个错误,请把命令上的 -p eosio 参数去掉。

3、为了本地开发,不建议直接修改 config.ini 文件,而是应该通过增加 --p2p-peer-address 参数来指定主网的节点。上面的节点转化为 --p2p-peer-address p2p.prod.eosgravity.com:80 --p2p-peer-address eu-west-nl.eosamsterdam.net:9876 --p2p-peer-address p2p.mainnet.eosgermany.online:9876 --p2p-peer-address 54.38.250.15:19878 --p2p-peer-address p2p.genereos.io:9876 --p2p-peer-address mainnet.eospay.host:19876 --p2p-peer-address 130.211.59.178:9876 --p2p-peer-address 54.153.59.31:9999 --p2p-peer-address 94.130.250.22:9806 --p2p-peer-address peer.main.alohaeos.com:9876 --p2p-peer-address peer.eosn.io:9876 --p2p-peer-address prod.mainnet.eos.cybex.io:9888 --p2p-peer-address p2p-1.eosnetwork.io:9876 --p2p-peer-address p.jeda.one:3322 --p2p-peer-address eosbattles.com:9877 --p2p-peer-address 34.226.76.22:9876 --p2p-peer-address mainnet.eosoasis.io:9876 --p2p-peer-address node.eosflare.io:1883 --p2p-peer-address p2p.eosio.cr:1976 --p2p-peer-address p2p.eosio.cr:5418 --p2p-peer-address eno.eosvan.io:19866

4、只有第一次启动主网时,需要指定创世区块,随后启动时不需要指定。 如果一切正常,那么在另一个 Shell 中执行命令:

./cleos get info
就能看到下面类似的图,之所说是类似,因为截屏的时间不同,显示的区块头部数量和最后一个区块的数量也不一样。

这次我们看到的网络 id 是 aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906,也就是主网络。

三、单节点网络 当我们启动本地节点进行开发、调用时,其实启动了一个本地的单节点网络,在这个网络中包括 4个不同的部分,它们是: nodeoskeosdcleoseosiocpp,它们分别承担不同的工作,下面分别进行简要介绍。
  • nodeos通过配置不同插件,启动节点,同步EOS网络数据或者自己生成块,也可作为API节点供调用。
  • keosd管理钱包,钱包中包含EOS公私钥对信息
  • cleos命令行交互接口,连接钱包与EOS网络,执行查看网络信息,推送交易信息,部署智能合约等
  • eosiocpp编译智能合约,生成wasm文件及abi文件
它们构成的网络如下图所示:

四、后记 由于本人水平所限,文中错误在所难免,欢迎您踊跃指出错误,在下感激不尽。我的微信联系方式:joepeak。

原创不易,尤其寒冬,欢迎赞助我一杯咖啡,本人比特币地址如下:3C1gyc2tsVudvVNQCZfrwHviDQeUpPeT95

本文来源: BTCsos 速援财经 · 为快不破 文章作者: 佚名
    下一篇