eosio 编译与部署

1. 名词解释

  1. 创世节点(BIOS) 用于建立初始区块,加载基础合约,供其它节点同步链接。
  2. 矿工节点(BP) 主要用于生产同步区块,计算合约产生的费用归矿工帐号全部。
  3. 查询节点 不产生区块,同步区块信息,提供区块信息查询功能。
  4. 私钥 用来进行签名操做,私钥能够生成惟一对应公钥。
  5. 公钥 用来对私钥的签名进行验证。
  6. 钱包 生成和保存私钥的地方,当须要进行签名操做时,会从钱包读取私钥列表,进行签名。
  7. 带宽 带宽分为cpu带宽和net带宽两种,每次执行合约都会消耗必定的带宽(从帐号中扣取)。
  8. 合约 一段在链上可执行代码,绑定在帐号上,每一个帐号只能绑定一份合约。
  9. 帐号 存储用户信息,包括余额、带宽、合约(若是有)等。
  10. 总票数 总票数=总发行的货币数量。
  11. 投票 投票者抵押货币投票给矿工,当矿工投票数大于总票数的15%时创世节点中止产生区块,转由矿工生产区块。node

    所谓的矿工节点与查询节点,只是为了区分是否生产区块的不一样配置。ios

2. 节点代码编译、程序安装

注意:后面编译依赖GIT,因此务必保证代码根目录的.git完整,以及系统安装有git。
如下以ubuntu系统为例,其它系统步骤相似。git

  1. 先安装GIT,若是已经安装则忽略这一步github

    sudo apt update && sudo apt install git -y
  2. 从GIT上克隆最新代码mongodb

    git clone https://github.com/eosio/eos --recursive --depth 1
  3. 使用eosio_build.sh自动编译json

    脚本会检查系统依赖库,并自动安装,请注意管理员权限提示,若是下载依赖库时中断请检查网络状态,而后再次执行。ubuntu

    cd eosio
    export LOCAL_CMAKE_FLAGS="-DEOSIO_ROOT_KEY=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV -DCORE_SYMBOL_NAME=EOS"
    ./script/eosio_build.sh

    正式环境可使用LOCAL_CMAKE_FLAGS环境变量指定根公钥EOSIO_ROOT_KEY和系统货币符号CORE_SYMBOL_NAMEwindows

  4. 打包和安装api

    编译成功会出现'EOSIO'的ASCII图样提示,请执行如下操做,把程序安装到系统,若是出现编译错误,请提交错误提示给相关人员查看解决。安全

    cd build/packages
     bash ./generate_package.sh [brew|deb|rpm]
     ls
    
     #ubuntu
     sudo dpkg -i eosio-v1.7.3.deb
    
     #redhat
     sudo yum install eosio-v1.7.3.rpm
     #或者
     sudo rpm -ivh eosio-v1.7.3.rpm

    参数说明:

    • brew mac系统
    • deb ubuntu系系统
    • rpm redhat系系统
  5. 从新编译
    若是有修改代码,或者进行版本更新,请先关闭当前运行的钱包和节点程序,以及清除安装到系统的想着程序,再编译。

    pkill -2 keosd nodeos
    #ubuntu
    sudo apt remove eosio
    #redhat
    sudo yum remove eosio

3. 默认配置文件所在目录

Linux: ~/.local/share/eosio/nodeos/config
Mac: ~/Library/Application Support/eosio/nodeos/config

4. 建立默认钱包和公私钥

  1. 启动钱包服务

    keosd --unlock-timeout 3600 # 3600秒后钱包从新锁定
  2. 建立钱包

    请保存输出的钱包密码,下次打开钱包时用的到。

    cleos wallet create -n default
    
    #打开钱包
    cleos wallet open -n default
  3. 建立公私钥

    cleos create key
  4. 把上步生成的私钥导入钱包

    cleos wallet import -n default --private-key [private key]

5. 通用配置

参数名 示例 说明
agent-name p2p网络中标识本身的节点的名字 "eosio bios"
producer-name 矿工的帐号名 "eosio"
signature-provider 矿工的公钥私钥,用于签名 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
p2p-server-address p2p服务监听地址,默认监听0.0.0.0:9876 "0.0.0.0:9876"
http-server-address http服务器监听地址,若是不想提供http服务,能够把地址留空,则不http服务不启动。注意不填写会使用默认地址127.0.0.1:8888 "127.0.0.1:8888"
enable-stale-production 启动后当即开始生产块。若是不是BIOS节点,这里填false。 true
p2p-peer-address 其它节点的p2p同步地址,用于同步数据,此参数能够有多个,即链接到多个节点。 "192.168.0.2:9876"

6. 创世节点配置

6.1. 启动参数配置

  1. 建立eosio系统帐号的公私钥,参见4. 建立钱包和公私钥
  2. 修改genesis.json的initial_key为上一步生成的公钥
  3. 启动节点,注意填写第1步生成的公私钥

    nodeos --agent-name "eosio bios" --producer-name "eosio" \
         --signature-provider [public key]=KEY:[private key] \
         --plugin eosio::chain_plugin --plugin eosio::chain_api_plugin \
         --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" --enable-stale-production

6.2. 部署系统合约

  1. 下载编译合约编译器

    git clone https://github.com/eosio/eosio.cdt.git --recursive --depth 1
     cd eosio.cdt
     ./build.sh
     sudo ./install.sh
  2. 下载编译合约

    git clone https://github.com/eosio/eosio.contracts.git --depth 1
     cd eosio.contracts
     ./build.sh
  3. 建立系统帐号

    OwnerKey与ActiveKey相同,参见6.1生成的公钥

    cleos create account eosio eosio.token [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.msig [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.bpay [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.names [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.ram [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.ramfee [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.saving [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.stake [OwnerKey] [ActiveKey] -p eosio 
    cleos create account eosio eosio.vpay [OwnerKey] [ActiveKey] -p eosio

    若是使用LOCAL_CMAKE_FLAGS参数指定了根公钥,则这里必须相同。

  4. 部署货币合约,请确认在合约代码根目录执行,参见6.2.2下载编译合约

    cleos set contract eosio.token build/eosio.token -p eosio.token
    cleos set contract eosio.msig build/eosio.msig -p eosio.msig
  5. 建立货币

    cleos push action eosio.token create '["eosio", "1000000000000.0000 EOS", 0, 0, 0]' -p eosio.token
    cleos push action eosio.token issue '["eosio", "1000000000000.0000 EOS", "issue"]' -p eosio

    若是使用LOCAL_CMAKE_FLAGS参数指定了系统货币符号,则这里必须相同。

  6. 部署系统合约,请确认在合约代码根目录执行,参见6.2.2下载编译合约

    cleos set contract eosio build/eosio.system -p eosio
    cleos push action eosio init '[0, "4,EOS"]' -p eosio@active
    cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active

7. 矿工节点配置

1. 注册矿工帐号

  1. 建立矿工帐号的公私钥,参见4. 建立钱包和公私钥
  2. 建立矿工帐号

    cleos system newaccount --stake-net [quantity] --stake-cpu [quantity] --buy-ram-kbytes 8192 \
        [creater] [name] [OwnerKey] [ActiveKey] -p [creater]
    # 参数说明
    # creater 矿工帐号的建立者帐号。
    # name 矿工帐号的名字。
    # quantity 购买带宽的资源,从建立者帐号扣取。
    # OwnerKey与ActiveKey相同,矿工帐号的公钥,即上步生成的公钥。
    
    # 示例
    cleos system newaccount --stake-net "50.0000 EOS" --stake-cpu "50.0000 EOS" --buy-ram-kbytes 8888888 eosio eosnewbpa \
    EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL -p eosio
  3. 转帐给矿工帐号

    cleos transfer [from] [recipient] [amount] [momo]
    # 参数说明
    # from 转帐帐号
    # recipient 接收转帐帐号
    # amount 金额
    # momo 注释
    
    # 示例
    cleos transfer eosio eosnewbpa "9000000000.0000 EOS" "trans to eosnewbpa"
  4. 注册成矿工

    cleos system regproducer [name] [ActiveKey] [url]
    # 参数说明
    # name 矿工帐号
    # ActiveKey 矿工帐号的公钥
    # url 矿工的网站
    
    #示例
    cleos system regproducer eosnewbpa  EOS7n1U9Z2NQeVEvQZYjHCedNXRVWshmmuGH2j3r6bD4c8fH4U8QL https://192.168.0.57:8888
  5. 抵押相应的资源

    cleos system delegatebw [name] [name] [stake_net_quantity] [stake_cpu_quantity]
    # 参数说明
    # name 矿工帐号
    # stake_net_quantity 抵押的网络带宽资源
    # stake_cpu_quantity 抵押的CPU带宽资源
    
    # 示例
    cleos system delegatebw eosnewbpa eosnewbpa '4400000000.0000 EOS' '4400000000.0000 EOS'
  6. 投票给本身

    cleos system voteproducer prods [voter] [producers] -p [voter]
    # 参数说明
    # voter 矿工帐号
    # producers 抵押的网络带宽资源
    
    #示例
    cleos system voteproducer prods eosnewbpa eosnewbpa

2. 启动参数配置

  1. 建立eosio系统帐号的公私钥,参见建立钱包和公私钥
  2. 修改genesis.json的initial_key为创世节点(BIOS)生成的公钥
  3. 启动节点,注意填写第1步生成的公私钥

    假设已知bios节点192.168.0.56:9876,BP节点192.168.0.58:9876。

    nodeos --agent-name "eosnewbpa" --producer-name "eosnewbpa" \
        --signature-provider [public key]=KEY:[private key] \
        --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" \
        --p2p-peer-address "192.168.0.56:9876" --p2p-peer-address "192.168.0.58:9876"

8. 查询节点配置

查询节点配置与矿工节点配置相似,只是不注册成矿工,查询节点经常使用来数据查询。建议开启mongo_db_plugin插件。
mongo_db_plugin是保存区块交易信息到mongodb的插件。

假设已知bios节点192.168.0.56:9876,BP节点192.168.0.57:987六、192.168.0.58:9876,而且这三个节点都开启了mongo_db_plugin插件。

nodeos --agent-name "eosnewbpb" --producer-name "eosnewbpb" \
  --signature-provider [public key]=KEY:[private key] \
  --p2p-server-address "0.0.0.0:9876" --http-server-address "127.0.0.1:8888" \
  --p2p-peer-address "192.168.0.56:9876" --p2p-peer-address "192.168.0.57:9876" --p2p-peer-address "192.168.0.58:9876" \
  --plugin eosio::mongo_db_plugin --mongodb-uri mongodb://127.0.0.1:27017/EOSIO

9. 建议

  1. 从安全角度来讲,不要私钥泄露给他人,知道帐户私钥后,能够随意操纵帐户。
  2. 若是使用助记词生成的私钥,请使用复杂度较高的助记词。
  3. 上面传入不少参数都是演示用的,若是正式部署,建议使用配置文件的方式。
  4. 建议使用SIGINT信号来关闭节点,防止程序产生脏数据。

    pkill -2 keosd nodeos
  5. 若是有脏数据产生,请使用--replay-blockchain参数或者--delete-all-blocks参数启动节点,从新同步数据。
  6. 节点启动前,请确认时间及时区正确,时间有偏移会影响区块数据验证。

    sudo mv /etc/localtime  /etc/localtime.bak
    sudo ln -s /usr/share/zoneinfo/UTC /etc/localtime
    # 使用 ntpdate 更新系统时间
    sudo apt install ntpdate ntp -y # yum install ntpdate ntp -y
    sudo timedatectl set-timezone UTC
    sudo ntpdate -u time.windows.com
    sudo hwclock --systohc # 写入硬件
    # 启动ntpd服务
    sudo systemctl enable ntp # systemctl enable ntpd
    sudo systemctl start ntp # systemctl start ntpd
相关文章
相关标签/搜索