[Daozy][区块链 EOS 课程]第2课 EOS编译和启动

椟夜学院-- 区块链 EOS 课程

官方网站:http://www.daozy.net
@(区块链 EOS 课程)

椟夜学院-- 区块链 EOS 课程

官方网站:http://www.daozy.net

开发环境

centos、ubuntu均可,可以在windows上安装虚拟机。

下载源码

  • 源码在github上:https://github.com/EOSIO/eos
  • 可以先fork到自己的账户下,再git clone,也可以直接clone。
一步到位,下载所有子模块, 参数–recursive表示下载所有子模块:
git clone --recursive https://github.com/tencupofkaiwater/eos.git
如果开始没有加–recursive,后续可以进入到eos目录,使用下面的进行更新:
git submodule update --init --recursive

编译源码

在源码根目录下:

# ./eosio_build.sh
错误1:
Enabling Centos devtoolset-7.

Unable to enable Centos devtoolset-7 at this time.

解决这问题的思路就是安装一个高版本的gcc。那么在 CentOS7中,安装高版本gcc,一般有两个方法:

  1. 使用源码。

  2. 使用SCLo, 什么是SCLo,简单的说,就是比epel更丰富的软件包集合。https://www.softwarecollections.org/en/about/

快速使用方法:https://www.softwarecollections.org/en/docs/
  • 使用SCLo,顺序安装:
yum install centos-release-scl

好了,有了SCLo库之后,我们就可以安装GCC7了。

yum install devtoolset-7-gcc
yum install devtoolset-7-gcc-g++

再装GCC7的 libasan

yum install devtoolset-7-libasan-devel

他们是devtoolset,和常规的软件还不太一样

devtoolset-7 - Developer Toolset is designed for developers working on CentOS or Red Hat Enterprise Linux platform. It provides current versions of the GNU Compiler Collection, 
GNU Debugger, and other development, debugging, and performance monitoring tools.

因为他们都是装在opt下面的,

[root@dpdk chimpanzee]# rpm -ql devtoolset-7-libasan-devel
/opt/rh/devtoolset-7/root/usr/lib/gcc
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libasan.a
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libasan.so
/opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libasan_preinit.o
/opt/rh/devtoolset-7/root/usr/share/doc/devtoolset-7-libasan-devel-7.2.1
/opt/rh/devtoolset-7/root/usr/share/doc/devtoolset-7-libasan-devel-7.2.1/ChangeLog.bz2
/opt/rh/devtoolset-7/root/usr/share/doc/devtoolset-7-libasan-devel-7.2.1/LICENSE.TXT
[root@dpdk chimpanzee]# 

配置一下,就可以用了

[root@dpdk chimpanzee]# source /opt/rh/devtoolset-7/enable 
[root@dpdk chimpanzee]# gcc -v
... ...
gcc version 7.2.1 20170829 (Red Hat 7.2.1-1) (GCC) 
这个 enable 属于软件 devtoolset-7-runtime

[root@dpdk chimpanzee]# rpm -qf /opt/rh/devtoolset-7/enable 
devtoolset-7-runtime-7.0-8.el7.sc1.x86_64

这个时候,再去使用sanitizer编译程序,之后就能够看见调试信息了,也能够成功的断到libasan的断点了。

继续build

# ./eosio_build.sh

开始会下载依赖包,然后是更新包同时也会安装一些依赖包,出现如下部分包安装失败,暂时不知会不会影响后期编译。

错误2
  正在安装    : python-urllib3-1.10.2-5.el7.noarch                                                                                                  295/2018 
error: unpacking of archive failed on file /usr/lib/python2.7/site-packages/urllib3/packages/ssl_match_hostname: cpio: rename
  正在安装    : python-requests-2.6.0-1.el7_1.noarch                                                                                                296/2018 
error: python-urllib3-1.10.2-5.el7.noarch: install failed
  正在安装    : python2-pyasn1-modules-0.1.9-7.el7.noarch 
  
  
  正在更新    : 1:java-1.8.0-openjdk-headless-1.8.0.171-8.b10.el7_5.x86_64                                                                          342/2018 
warning: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre/lib/security/java.security created as /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre/lib/security/java.security.rpmnew
restored /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre/lib/security/java.security.rpmnew to /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre/lib/security/java.security  


warning: /var/lib/logrotate.status saved as /var/lib/logrotate.status.rpmsave
  清理        : plymouth-core-libs-0.8.9-0.24.20140113.el7.centos.x86_64     
解决上面依赖安装错误
手动安装python-urllib3
yum install python-urllib3
再次build
# ./eosio_build.sh

又提示安装依赖包,输入yes,继续安装。

安装
# cd build
# make install

编译完成后,在系统环境下已经安装好eos
image

同时生成的这些目标文件也在当前目录下的./programs目录下。

# cd programs/
# ll
drwxrwxr-x 3 duye duye  119 5月  31 07:14 cleos
drwxrwxr-x 2 duye duye   65 5月  31 07:07 CMakeFiles
-rw-rw-r-- 1 duye duye 1653 5月  31 07:07 cmake_install.cmake
-rw-rw-r-- 1 duye duye  396 5月  31 00:58 CTestTestfile.cmake
drwxrwxr-x 3 duye duye  109 5月  31 07:13 eosio-abigen
drwxrwxr-x 3 duye duye   90 5月  31 07:07 eosio-applesedemo
drwxrwxr-x 4 duye duye 4096 6月   5 07:52 eosio-launcher
drwxrwxr-x 3 duye duye  102 5月  31 07:13 keosd
-rw-rw-r-- 1 duye duye 7285 5月  31 00:58 Makefile
drwxrwxr-x 3 duye duye  120 6月   5 07:50 nodeos

我们需要关心三个主要的进程:

  • cleos

    它是一个命令行程序,通过控制台命令给EOS下达指令。

  • nodeos

    其实它就是挖矿客户端。在启动Nodeos之后,它自然就会产生区块。

  • keosd

    它的目的主要是管理钱包,可以创建私钥。

为什么分成Nodeos和Keosd?

Keosd可以认为是个轻客户端,因为有时候只需要进行钱包操作,不需要挖矿,就可以启动Keosd

启动节点
./nodeos

或者

./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin

启动nodeos

第一次启动,肯定是不会成功的,不过没有关系,困难有多少办法就有多少。

坑001
[root@localhost nodeos]# ./nodeos 
538093ms thread-0   chain_plugin.cpp:130          plugin_initialize    ] initializing chain plugin
538095ms thread-0   main.cpp:112                  main                 ] /home/duye/eos/libraries/chainbase/src/chainbase.cpp(106): Throw in function chainbase::database::database(const boost::filesystem::path&, chainbase::database::open_flags, uint64_t)
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >
std::exception::what: database dirty flag set (likely due to unclean shutdown) replay or resync required

解决办法:

./nodeos --resync

或者加载插件运行,根据自己的需求加载。

./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --resync

指定数据目录和配置目录运行, 如果配置文件放在当前目录

./nodeos -e -p eosio --data-dir . --config-dir . --contracts-console --resync
配置

默认配置路径:~/.local/share
配置文件:~/.local/share/eosio/nodeos/config

配置:config.ini

# the endpoint upon which to listen for incoming connections (eosio::bnet_plugin)
bnet-endpoint = 0.0.0.0:4321

# the number of threads to use to process network messages (eosio::bnet_plugin)
# bnet-threads = 

# remote endpoint of other node to connect to; Use multiple bnet-connect options as needed to compose a network (eosio::bnet_plugin)
# bnet-connect = 

# this peer will request no pending transactions from other nodes (eosio::bnet_plugin)
bnet-no-trx = false

# the location of the blocks directory (absolute path or relative to application data dir) (eosio::chain_plugin)
blocks-dir = "blocks"

# Pairs of [BLOCK_NUM,BLOCK_ID] that should be enforced as checkpoints. (eosio::chain_plugin)
# checkpoint = 

# Override default WASM runtime (eosio::chain_plugin)
# wasm-runtime = 

# Maximum size (in MB) of the chain state database (eosio::chain_plugin)
chain-state-db-size-mb = 1024

# Maximum size (in MB) of the reversible blocks database (eosio::chain_plugin)
reversible-blocks-db-size-mb = 340

# print contract's output to console (eosio::chain_plugin)
contracts-console = false

# Account added to actor whitelist (may specify multiple times) (eosio::chain_plugin)
# actor-whitelist = 

# Account added to actor blacklist (may specify multiple times) (eosio::chain_plugin)
# actor-blacklist = 

# Contract account added to contract whitelist (may specify multiple times) (eosio::chain_plugin)
# contract-whitelist = 

# Contract account added to contract blacklist (may specify multiple times) (eosio::chain_plugin)
# contract-blacklist = 

# Track actions which match receiver:action:actor. Actor may be blank to include all. Receiver and Action may not be blank. (eosio::history_plugin)
# filter-on = 

# PEM encoded trusted root certificate (or path to file containing one) used to validate any TLS connections made.  (may specify multiple times)
#  (eosio::http_client_plugin)
# https-client-root-cert = 

# true: validate that the peer certificates are valid and trusted, false: ignore cert errors (eosio::http_client_plugin)
https-client-validate-peers = 1

# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin)
http-server-address = 127.0.0.1:8888

# The local IP and port to listen for incoming https connections; leave blank to disable. (eosio::http_plugin)
# https-server-address = 127.0.0.1:8888

# Filename with the certificate chain to present on https connections. PEM format. Required for https. (eosio::http_plugin)
# https-certificate-chain-file = 

# Filename with https private key in PEM format. Required for https (eosio::http_plugin)
# https-private-key-file = 

# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)
# access-control-allow-origin = 

# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)
# access-control-allow-headers = 

# Specify the Access-Control-Max-Age to be returned on each request. (eosio::http_plugin)
# access-control-max-age = 

# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)
access-control-allow-credentials = false

# The actual host:port used to listen for incoming p2p connections. (eosio::net_plugin)
p2p-listen-endpoint = 0.0.0.0:9876

# An externally accessible host:port for identifying this node. Defaults to p2p-listen-endpoint. (eosio::net_plugin)
# p2p-server-address = 

# The public endpoint of a peer node to connect to. Use multiple p2p-peer-address options as needed to compose a network. (eosio::net_plugin)
# p2p-peer-address = 

# Maximum number of client0nodes from any single IP address (eosio::net_plugin)
p2p-max-nodes-per-host = 1

# The name supplied to identify this node amongst the peers. (eosio::net_plugin)
agent-name = "EOS Test Agent"

# Can be 'any' or 'producers' or 'specified' or 'none'. If 'specified', peer-key must be specified at least once. If only 'producers', peer-key is not required. 'producers' and 'specified' may be combined. (eosio::net_plugin)
allowed-connection = any

# Optional public key of peer allowed to connect.  May be used multiple times. (eosio::net_plugin)
# peer-key = 

# Tuple of [PublicKey, WIF private key] (may specify multiple times) (eosio::net_plugin)
# peer-private-key = 

# Maximum number of clients from which connections are accepted, use 0 for no limit (eosio::net_plugin)
max-clients = 25

# number of seconds to wait before cleaning up dead connections (eosio::net_plugin)
connection-cleanup-period = 30

# True to require exact match of peer network version. (eosio::net_plugin)
network-version-match = 0

# number of blocks to retrieve in a chunk from any individual peer during synchronization (eosio::net_plugin)
sync-fetch-span = 100

# maximum sizes of transaction or block messages that are sent without first sending a notice (eosio::net_plugin)
max-implicit-request = 1500

# Enable block production, even if the chain is stale. (eosio::producer_plugin)
enable-stale-production = true 

# Start this node in a state where production is paused (eosio::producer_plugin)
pause-on-startup = false

# Limits the maximum time (in milliseconds) that is allowed a pushed transaction's code to execute before being considered invalid (eosio::producer_plugin)
max-transaction-time = 30

# Limits the maximum age (in seconds) of the DPOS Irreversible Block for a chain this node will produce blocks on (use negative value to indicate unlimited) (eosio::producer_plugin)
max-irreversible-block-age = -1

# ID of producer controlled by this node (e.g. inita; may specify multiple times) (eosio::producer_plugin)
producer-name = eosio

# (DEPRECATED - Use signature-provider instead) Tuple of [public key, WIF private key] (may specify multiple times) (eosio::producer_plugin)
# private-key = 

# Key=Value pairs in the form <public-key>=<provider-spec>
# Where:
#    <public-key>    	is a string form of a vaild EOSIO public key
# 
#    <provider-spec> 	is a string in the form <provider-type>:<data>
# 
#    <provider-type> 	is KEY, or KEOSD
# 
#    KEY:<data>      	is a string form of a valid EOSIO private key which maps to the provided public key
# 
#    KEOSD:<data>    	is the URL where keosd is available and the approptiate wallet(s) are unlocked (eosio::producer_plugin)
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

# Limits the maximum time (in milliseconds) that is allowd for sending blocks to a keosd provider for signing (eosio::producer_plugin)
keosd-provider-timeout = 5

# Lag in number of blocks from the head block when selecting the reference block for transactions (-1 means Last Irreversible Block) (eosio::txn_test_gen_plugin)
txn-reference-block-lag = 0

# The path of the wallet files (absolute path or relative to application data dir) (eosio::wallet_plugin)
wallet-dir = "."

# Timeout for unlocked wallet in seconds (default 900 (15 minutes)). Wallets will automatically lock after specified number of seconds of inactivity. Activity is defined as any wallet command e.g. list-wallets. (eosio::wallet_plugin)
unlock-timeout = 900

# eosio key that will be imported automatically when a wallet is created. (eosio::wallet_plugin)
# eosio-key = 

# Plugin(s) to enable, may be specified multiple times
# plugin = 
plugin = eosio::producer_plugin
plugin = eosio::chain_api_plugin
plugin = eosio::wallet_api_plugin
plugin = eosio::http_plugin
#plugin = eosio::account_history_api_plugin
#plugin = eosio::mongo_db_plugin

配置:genesis.json

{
  "initial_timestamp": "2018-03-02T12:00:00.000",
  "initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
  "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,
    "max_generated_transaction_count": 16
  },
  "initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
数据目录

~/.local/share/eosio/nodeos/data

不带参数启动

./nodeos --resync

–resync: 重新加载配置

启动钱包

钱包配置,默认在 ~/eosio-wallet/config.ini

# The local IP and port to listen for incoming http connections; set blank to disable. (eosio::http_plugin)
http-server-address = 0.0.0.0:80

# The local IP and port to listen for incoming https connections; leave blank to disable. (eosio::http_plugin)
https-server-address = 0.0.0.0:443

# Filename with the certificate chain to present on https connections. PEM format. Required for https. (eosio::http_plugin)
https-certificate-chain-file = ./key/server-cert.pem

# Filename with https private key in PEM format. Required for https (eosio::http_plugin)
https-private-key-file = ./key/server-key.pem

# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)
# access-control-allow-origin = 

# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)
# access-control-allow-headers = 

# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)
access-control-allow-credentials = false

# The path of the wallet files (absolute path or relative to application data dir) (eosio::wallet_plugin)
wallet-dir = "."

# Timeout for unlocked wallet in seconds (default 900 (15 minutes)). Wallets will automatically lock after specified number of seconds of inactivity. Activity is defined as any wallet command e.g. list-wallets. (eosio::wallet_plugin)
unlock-timeout = 900

# eosio key that will be imported automatically when a wallet is created. (eosio::wallet_plugin)
# eosio-key = 

# Plugin(s) to enable, may be specified multiple times
# plugin = 

启动:

# ./keosd
1241613ms thread-0   wallet_plugin.cpp:41          plugin_initialize    ] initializing wallet plugin
1241613ms thread-0   http_plugin.cpp:264           plugin_initialize    ] configured http to listen on 0.0.0.0:80
1241613ms thread-0   http_plugin.cpp:286           plugin_initialize    ] configured https to listen on 0.0.0.0:443 (TLS configuration will be validated momentarily)
1241613ms thread-0   wallet_api_plugin.cpp:112     plugin_initialize    ] 
*************************************
*                                   *
*  --   Wallet NOT on localhost  -- *
*  - Password and/or Private Keys - *
*  - are transferred unencrypted. - *
*                                   *
*************************************

1241613ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/keosd/stop
1241613ms thread-0   http_plugin.cpp:302           plugin_startup       ] start listening for http requests
1241613ms thread-0   http_plugin.cpp:321           plugin_startup       ] start listening for https requests
1241617ms thread-0   wallet_api_plugin.cpp:68      plugin_startup       ] starting wallet_api_plugin
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/create
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/create_key
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/get_public_keys
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/import_key
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/list_keys
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/list_wallets
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/lock
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/lock_all
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/open
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/set_timeout
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/sign_transaction
1241617ms thread-0   http_plugin.cpp:342           add_handler          ] add api url: /v1/wallet/unlock

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道知极限编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值