1. 名词解释

  1. 创世节点(BIOS) 用于创建初始区块,加载基础合约,供其它节点同步连接。

  2. 矿工节点(BP) 主要用于生产同步区块,计算合约产生的费用归矿工账号所有。

  3. 查询节点 不产生区块,同步区块信息,提供区块信息查询功能。

  4. 私钥 用来进行签名操作,私钥可以生成唯一对应公钥。

  5. 公钥 用来对私钥的签名进行验证。

  6. 钱包 生成和保存私钥的地方,当需要进行签名操作时,会从钱包读取私钥列表,进行签名。

  7. 带宽 带宽分为cpu带宽和net带宽两种,每次执行合约都会消耗一定的带宽(从账号中扣取)。

  8. 合约 一段在链上可执行代码,绑定在账号上,每个账号只能绑定一份合约。

  9. 账号 存储用户信息,包括余额、带宽、合约(如果有)等。

  10. 总票数 总票数=总发行的货币数量。

  11. 投票 投票者抵押货币投票给矿工,当矿工投票数大于总票数的15%时创世节点停止产生区块,转由矿工生产区块。

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

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

注意:后面编译依赖GIT,所以务必保证代码根目录的.git完整,以及系统安装有git。

以下以ubuntu系统为例,其它系统步骤类似。

  1. 先安装GIT,如果已经安装则忽略这一步

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

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

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

    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_NAME

  4. 打包和安装

    编译成功会出现'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:9876、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

eosio 编译与部署的更多相关文章

  1. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  2. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  3. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  4. Windows Phone 8初学者开发—第8部分:理解编译和部署

    原文 Windows Phone 8初学者开发—第8部分:理解编译和部署 第8部分:理解编译和部署 原文地址: http://channel9.msdn.com/Series/Windows-Phon ...

  5. Spark编译与部署

    Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建   [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.S ...

  6. Qt 5.9.4 如何静态编译和部署?

    Qt 5.9.4 如何静态编译和部署? MSVC2015 x86 静态编译 Qt 部署静态库 VS2015 部署静态库 1. MSVC2015 x86 静态编译 1.1 Qt 官网下载最新源代码 立即 ...

  7. 使用Remix编译和部署以太坊智能合约

      Remix 是一個开源的 Solidity 智能合约开发环境,提供基本的编译.部署至本地或测试网络.执行合约等功能.Solidity 是 以太坊Ethereum 官方设计和支持的开发语言,专门用于 ...

  8. Spark1.0.0 源码编译和部署包生成

    问题导读:1.如何对Spark1.0.0源码编译?2.如何生成Spark1.0的部署包?3.如何获取包资源? Spark1.0.0的源码编译和部署包生成,其本质只有两种:Maven和SBT,只不过针对 ...

  9. RHEL6 最小化系统 编译安装部署zabbix (mysql)

    RHEL6 最小化系统 编译安装部署zabbix (mysql)官方说明详细见:https://www.zabbix.com/documentation/4.0/manual/installation ...

随机推荐

  1. 831. KMP字符串(模板)

    给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整 ...

  2. opencv3.2.0+opencv_contrib-3.2.0+vs2015相关文件的配置

    包含目录:E:\opencvcontrib\opencv\sources\build\install\include\opencv E:\opencvcontrib\opencv\sources\bu ...

  3. 第一篇 网站基础知识 第3章 DNS的设置

    第3章 DNS的设置 3.1 DNS解析 3.2 Windows 7设置DNS服务器 3.3Windows设置本机域名和IP的对应关系 在自己的电脑里也可以设置域名和IP的对应关系,具体设置是在C:\ ...

  4. JASON

    JSON 数据格式 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人 ...

  5. Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...

  6. NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论:22页2.3-7 描述一个运行时间为O(nlogn)的算法,找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解: a=[1,3,6,7,9,15,29] def find2sum ...

  7. 在github网站上更新fork的repo

    打开fork的repo. 点击Pull request, 这里会跳转到一个页面提示There isn’t anything to compare. 点击switching the base,将orig ...

  8. 【C语言】利用递归函数求n的阶乘

    递归实现n的阶乘     什么是阶乘:0!= 1,n!=n * (n - 1) * (n - 2)......3 * 2 * 1: 解题思路: 1> 分析题意,很明显0是递归出口:        ...

  9. vue基础api

    vue比jq好处 1jq 频繁操作dom 增加了性能消耗 vue 模拟dom 从内存中拿 2jq 数据没有统一管理 vue 统一管理数据 3vue 组件开发可以提取出公共的html或js   mv*好 ...

  10. java基础(十一)之抽象类和抽象函数

    1.抽象函数的语法特征2.抽象类的语法特征3.抽象类的作用 抽象函数 只有函数的定义,没有函数体的函数被称为抽象函数: abstract void func(); 抽象类 使用abstract定义的类 ...