您正在查看: 2018年10月

从零开始,纯净机器上部署EOS测试网 (版本v1.4.1)

系统准备

演示的系统为 Ubuntu 18.04 LTS,内存8g以上,硬盘300g+

clone EOS代码

我们以EOS-Mainnet仓库部署,(EOS-Mainnet是部署在目前EOS主网的版本,等于再次在EOSIO仓库测试过的版本,更稳定。)

开始clone 代码

//如果没有安装git,先安装
$sudo apt install git
$git clone https://github.com/EOS-Mainnet/eos.git

切换到最新分支(当前的EOS最新版本为 v1.4.1)

$git fetch
$git checkout -b mainnet-1.4.1

编译代码

$git submodule update --init --recursive
$./eosio_build.sh -s EOS

漫长等待,编译成功

执行安装

$sudo ./eosio_install.sh

安装成功后查看版本

$ nodeos -v
mainnet-1.4.1

各个节点,分别创建钱包和密钥,准备用户名

创建钱包

cleos wallet create --to-console

记得保存返回的钱包解锁密码,丢失无法找回钱包内数据

创建密钥

cleos wallet create_key

创建的密钥会自动添加到钱包,如需查看,可执行

cleos wallet private_keys

输入钱包解锁密码查看

准备用户名

1-5a-z 字符12位,准备好,后面config配置中producer-name用到。

各个节点机器,分别创建目录

选定一个存储位置,用于存储EOS节点配置和节点数据。选定的磁盘存储一般要在300G以上,防止后期不够。
假设我们选定的磁盘位置为/data
然后在当前目录下,新建两个目录

  • eos-tools 用于存放eos节点的配置
  • data 用于存放eos节点数据

创世节点配置

进入eos-tools文件夹

创建genesis.json文件

直接生成genesis.json文件

nodeos --extract-genesis-json genesis.json

创建config.ini文件

创建config.ini文件,并输入以下信息

//修改本地节点rpc 访问端口,默认为8888,修改后,本地访问方式为`cleos -u http://127.0.0.1:8000 get info`
http-server-address = 0.0.0.0:8000
//bp节点间的访问地址,当前节点的p2p-peer-address为,服务器IP或者域名,加上下面设置的端口
p2p-listen-endpoint = 0.0.0.0:8001

#设置一个自己的bp名字
agent-name = "EOS Shen Si"
//创世节点名字必须为eosio
producer-name = eosio
#创建一对密钥 创世节点不能修改私钥
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
#创世节点才需要,其他bp不需要开启
enable-stale-production = true
#添加一些稳定的其他bp节点
# p2p-peer-address =

#以下为通用设置
wasm-runtime = wabt
pause-on-startup = false
abi-serializer-max-time-ms = 3000
chain-state-db-size-mb = 65535
reversible-blocks-db-size-mb = 2048
contracts-console = false
p2p-max-nodes-per-host = 1
allowed-connection = any
max-clients = 100
network-version-match = 1
sync-fetch-span = 500

#filter-on = *
connection-cleanup-period = 30
max-implicit-request = 1500
http-validate-host = false
access-control-allow-origin = *
access-control-allow-headers = *
access-control-allow-credentials = false
verbose-http-errors = true

#添加插件
plugin = eosio::chain_api_plugin
plugin = eosio::history_plugin
plugin = eosio::history_api_plugin
plugin = eosio::producer_plugin

启动节点

$EOS_TOOLS_DIR为eos-tools的当前目录,本例中路径为/data/eos-tools
$EOS_DATA_DIR为eos data的当前目录,本例中路径为/data/data

  • 第一次启动节点,(仅第一次运行使用)
    nodeos --genesis-json $EOS_TOOLS_DIR/genesis.json --max-irreversible-block-age 108000000 --data-dir $EOS_DATA_DIR --config-dir $EOS_TOOLS_DIR --delete-all-blocks

如果此时是创世节点,此时已开始出块。

创世节点配置

导入创世账户eosio的私钥5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3到钱包

cleos wallet import

创建系统账户

先创建10对密钥,用于创建前期10个系统的内置账户

cleos wallet create_key

执行10次

账户名 公钥 私钥
eosio.token EOS5rNiix2ENyUcvGo5pCr7yUukkhCUHySYfcMpFGNH18XERuf9t5
eosio.bpay EOS7YEYexP3yQtddnQHJGV4CDLUF58RkFTDNUZR5MPmD9jx1xFH8f
eosio.msig EOS5SoN8xuQBCA5vBcRZXiVYA9xjkShaVN3UpsMngv1X2dhHojAS4
eosio.names EOS6Q44xh1p35ZkVkfSAguWLPJiqJVCi2B4AuGsxVwchKrKHKkf9T
eosio.ram EOS81nArYKAitRN1h2GUCCNZWS6zArKzrg1JvcgC5zyhFAumQRgrR
eosio.ramfee EOS8HhotHdovvtC1RR5G7bPRgLaHXkFbMGbSfwKKrtkQspy1rapy3
eosio.saving EOS85QMTp1Xm71jCAYYvVhm3dxmxZuobUEHxe1wLNb8qL52kmrfwX
eosio.stake EOS5USZ8g5p3fU965ByvhL8AgfXfWUbeDHXjySe2QiG1wcz5So9KR
eosio.vpay EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6
eosio.sudo EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6

部署系统合约

进入eos/build/contracts

部署eosio.bios
cleos -u http://127.0.0.1:8000 set contract eosio eosio.bios/ -p eosio
创建账户
cleos -u http://127.0.0.1:8000 create account eosio eosio.token EOS5rNiix2ENyUcvGo5pCr7yUukkhCUHySYfcMpFGNH18XERuf9t5 EOS5rNiix2ENyUcvGo5pCr7yUukkhCUHySYfcMpFGNH18XERuf9t5
cleos -u http://127.0.0.1:8000 create account eosio eosio.bpay EOS7YEYexP3yQtddnQHJGV4CDLUF58RkFTDNUZR5MPmD9jx1xFH8f EOS7YEYexP3yQtddnQHJGV4CDLUF58RkFTDNUZR5MPmD9jx1xFH8f
cleos -u http://127.0.0.1:8000 create account eosio eosio.msig EOS5SoN8xuQBCA5vBcRZXiVYA9xjkShaVN3UpsMngv1X2dhHojAS4 EOS5SoN8xuQBCA5vBcRZXiVYA9xjkShaVN3UpsMngv1X2dhHojAS4
cleos -u http://127.0.0.1:8000 create account eosio eosio.names EOS6Q44xh1p35ZkVkfSAguWLPJiqJVCi2B4AuGsxVwchKrKHKkf9T EOS6Q44xh1p35ZkVkfSAguWLPJiqJVCi2B4AuGsxVwchKrKHKkf9T
cleos -u http://127.0.0.1:8000 create account eosio eosio.ram EOS81nArYKAitRN1h2GUCCNZWS6zArKzrg1JvcgC5zyhFAumQRgrR EOS81nArYKAitRN1h2GUCCNZWS6zArKzrg1JvcgC5zyhFAumQRgrR
cleos -u http://127.0.0.1:8000 create account eosio eosio.ramfee EOS8HhotHdovvtC1RR5G7bPRgLaHXkFbMGbSfwKKrtkQspy1rapy3 EOS8HhotHdovvtC1RR5G7bPRgLaHXkFbMGbSfwKKrtkQspy1rapy3
cleos -u http://127.0.0.1:8000 create account eosio eosio.saving EOS85QMTp1Xm71jCAYYvVhm3dxmxZuobUEHxe1wLNb8qL52kmrfwX EOS85QMTp1Xm71jCAYYvVhm3dxmxZuobUEHxe1wLNb8qL52kmrfwX
cleos -u http://127.0.0.1:8000 create account eosio eosio.stake EOS5USZ8g5p3fU965ByvhL8AgfXfWUbeDHXjySe2QiG1wcz5So9KR EOS5USZ8g5p3fU965ByvhL8AgfXfWUbeDHXjySe2QiG1wcz5So9KR
cleos -u http://127.0.0.1:8000 create account eosio eosio.upay EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6 EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6
cleos -u http://127.0.0.1:8000 create account eosio eosio.sudo EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6 EOS8Qk7vEPme8huxpqa4mS9jfuDriQrpM6MJjFDvcvJfiPaKfypR6
部署 eosio.token
cleos -u http://127.0.0.1:8000 set contract eosio.token eosio.token
创建代币
cleos -u http://127.0.0.1:8000 push action eosio.token create '["eosio","10000000000.0000 EOS",0,0,0]' -p eosio.token
发布代币
cleos -u http://127.0.0.1:8000 push action eosio.token issue '["eosio","1000000000.0000 EOS","issue"]' -p eosio
issue 中的发行量(supply),要比上边创建的最大量(max_supply),要少一个0
查询账户余额
cleos -u http://127.0.0.1:8000 get currency balance eosio.token eosio

应返回10000000000.0000 EOS

部署 eosio.msig
cleos -u http://127.0.0.1:8000 set contract eosio eosio.msig -p eosio
cleos -u http://127.0.0.1:8000 push action eosio setpriv '{"account": "eosio.msig", "is_priv": 1}' -p eosio
部署eosio.system
cleos -u http://127.0.0.1:8000 set contract eosio eosio.system -p eosio
部署 eosio.sudo
cleos -u http://127.0.0.1:8000 set contract eosio eosio.sudo -p eosio
cleos -u http://127.0.0.1:8000 push action eosio setpriv '{"account": "eosio.sudo", "is_priv": 1}' -p eosio
创建其他三个bp的账户,(账户名和公钥由各自节点自己提供)
cleos system newaccount eosio eosio.bp1 EOS7mcXeVUSLCZxEf8eBPm2MbmiswNovoB6rk71pPqaZoxwSAeK7b EOS7mcXeVUSLCZxEf8eBPm2MbmiswNovoB6rk71pPqaZoxwSAeK7b  --stake-net '50.00 EOS' --stake-cpu '50.00 EOS'  --buy-ram-kbytes 10000
cleos system newaccount eosio eosio.bp2 EOS6wLrhcEQDZJvfZSCgVkFzsKcv34XTsTTjXXQZajWaBbEhvLPMg  EOS6wLrhcEQDZJvfZSCgVkFzsKcv34XTsTTjXXQZajWaBbEhvLPMg   --stake-net '50.00 EOS' --stake-cpu '50.00 EOS'  --buy-ram-kbytes 10000
cleos system newaccount eosio eosio.bp3 EOS6u8i7rknHyAd7AdziWSnEsAbyJHA3U9So4R8p2z58cA1KeEDv2  EOS6u8i7rknHyAd7AdziWSnEsAbyJHA3U9So4R8p2z58cA1KeEDv2   --stake-net '50.00 EOS' --stake-cpu '50.00 EOS'  --buy-ram-kbytes 10000
查看以创建的用户
cleos -u http://127.0.0.1:8000 get account eosio.bp1
cleos -u http://127.0.0.1:8000 get account eosio.bp2
cleos -u http://127.0.0.1:8000 get account eosio.bp3

确认创建ok

其他bp加入

进入eos-tools文件夹

创建genesis.json文件

将创世节点的genesis.json文件,复制到此目录

创建config.ini文件

将创世节点的config.ini复制到此目录,并修改以下信息

agent-name = "节点的名称,用于信息展示"
producer-name = 节点的账户名
signature-provider = 节点的公钥+私钥,(此配置妥善保存,别手误上传)
enable-stale-production = false
p2p-peer-address = 添加其他的节点地址

启动从节点

$EOS_TOOLS_DIR为eos-tools的当前目录,本例中路径为/data/eos-tools
$EOS_DATA_DIR为eos data的当前目录,本例中路径为/data/data

  • 第一次启动节点,(仅第一次运行使用)
    nodeos --genesis-json $EOS_TOOLS_DIR/genesis.json --max-irreversible-block-age 108000000 --data-dir $EOS_DATA_DIR --config-dir $EOS_TOOLS_DIR --delete-all-blocks

    此时从节点已经接收来自eosio创世节点的数据。

开始投票,从普通节点成为出块节点

给从节点分别转代币

创世节点,先把大于15%主网总发行量,分成当前启动主网节点数份数,目前为了好记,直接一人转100000000.0000 EOS

cleos -u http://127.0.0.1:8000 push action eosio.token transfer '["eosio", "eosio.bp1","100000000.0000 EOS","vote"]' -p eosio
cleos -u http://127.0.0.1:8000 push action eosio.token transfer '["eosio", "eosio.bp2","100000000.0000 EOS","vote"]' -p eosio
cleos -u http://127.0.0.1:8000 push action eosio.token transfer '["eosio", "eosio.bp3","100000000.0000 EOS","vote"]' -p eosio

各个从节点,分别抵押自己的代币

cleos -u http://127.0.0.1:8000 system delegatebw  eosio.bp* eosio.bp* '25000000.0000 EOS' '25000000.0000 EOS'

各个节点分别提交注册出块节点申请

cleos -u http://127.0.0.1:8000 system regproducer eosio.bp*  节点公钥  节点的网址

各个节点,开始投票

cleos -u http://127.0.0.1:8000 system voteproducer prods eosio.bp* eosio.bp*

查看出块节点

cleos -u http://127.0.0.1:8000  get schedule

此时 eosio.bp1-3,三个节点应该都已经在出块了。

eosio等系统账号,将权限交给社区

eosio.bpay
cleos push action eosio updateauth '{"account": "'eosio.bpay'", "permission": "active", "parent": "owner", "auth":{"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": active}}]}}' -p eosio.bpay@active
cleos push action eosio updateauth '{"account": "'eosio.bpay'", "permission": "owner", "parent": "",       "auth":{"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": active}}]}}' -p eosio.bpay@owner

其他账户eosio.msig eosio.names eosio.ram eosio.ramfee eosio.saving eosio.stake eosio.token eosio.vpay eosio.sudo同上

eosio
cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth":{"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": active}}]}}' -p eosio@active
cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "",       "auth":{"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": active}}]}}' -p eosio@owner

其他命令

  • 继续同步数据 (常规退出后,继续执行)
    nodeos --max-transaction-time 1000 --max-irreversible-block-age 108000000 --data-dir $EOS_DATA_DIR --config-dir $EOS_TOOLS_DIR
  • 重建数据,重新接收
    nodeos --hard-replay-blockchain --wasm-runtime wavm --max-irreversible-block-age 108000000 --data-dir $EOS_DATA_DIR --config-dir $EOS_TOOLS_DIR

    其他设置

  • 中文支持:sudo apt-get update && sudo apt-get -y install language-pack-zh-hans
  • 时间同步,sudo apt-get install chrony
    修改ulimit限制
    • ulimit -s 64000
    • sudo vi /etc/security/limits.conf
*               soft    stack            64000
root          soft    stack            64000

为什么EOS Dapp开发这么少?恨铁不成钢吐槽版

对于目前EOS 开发现状,想要做一款基本的Dapp,需要以下人员和配备

  • 所需人员
    1.前端开发(初级)
    2.EOS区块链运维(高级)
    3.EOS合约开发(高级)
  • 硬件配备
    至少一台配置较高的服务器,提供全节点rpc服务(正式环境,一般不会用其他节点的api,难以把控)。
    如果Dapp需要大量自定义查询,以及分析,还要做入库(mongodb或者mysql),并提供对应的api。
    对于常规的EOS全节点维护,已经很费时费力,如果在做入库查询,难度更是上升很多。
  • 软件配备
    1.浏览器运行
    目前EOS扩展只有个Scatter,不说其他的数据设计,只说对于交互逻辑,个人和身边人了解,都是基本反人类。无论一个Dapp多么的小巧,简洁,只要支持Scatter,都要单独写一个文章,教给用户如果使用Scatter才能进入Dapp。先添加网络,再导入私钥,在生成身份...毫无引导,一脸懵逼。90%用户,基本在Scatter就放弃了。。。
    2.App运行
    目前有几款App支持Scatter或者其他私有协议的Dapp运行,只能说部分可用,并且只是移动端的适配,很多Dapp还是适合PC页面展示。
  • 运行成本
    1.获客成本
    EOS注册账户,支持基本的转账等操作的话,基本需要4kb RAM+ 0.1EOS + 0.1NET。当前RAM价格1kb/0.0994EOS,EOS单价按40rmb,总价格为9.6RMB。
    2.数据存储
    数据上链,存储的成本可直接按RAM价格乘以数据量计算。

先说这么多,普通的互联网公司,已经懵了。。。太多的区块链知识,以及EOS相关的,很多公司很难招到相关人员,或者目前公司的规划不了解区块链,很难明确是不是需要做Dapp。

要说做一个传统的web,每个互联网公司都能分分钟做出来,那如何让这些人也能尽量顺畅的做Dapp呢?
下面我们针对上面的吐槽,挨个试着简化。

  • 所需人员
    1.前端开发(初级)- 这个传统互联网都有,开发技术完全一致。
    2.EOS区块链运维(高级)- 交给三方的公司提供支持
    3.EOS合约开发(高级)- 招中级c++开发,只学习合约相关,或者找合约提供开发的三方外包公司。

所以,人员配备可以精简到 一个前端,一个中级的c++开发。

  • 硬件配备
    三方提供数据查询支持

  • 软件配备
    1.浏览器运行
    提供一款基于Scatter的优化版本
    2.App运行
    合作接入三方的App

综上来看,大部分的难度,还是在全节点维护,以及链上数据查询方面,投入较大。

期望的EOS Dapp开发环境

  1. 提供一个 eosservice.js的开发库,对于前端来说,只关心此库的使用,不用关心什么其他的区块链相关的知识(基于eosjs再简化下)。
  2. 三方提供数据查询服务的公司,封装相关的接口,提供查询的js sdk。
  3. 一个类似优化版本的Scatter扩展。
  4. 合约开发文档,案例以及部署调试工具。

最后想说EOS加油,社区加油。

如何计算一个EOS合约部署的成本,以及消耗

本文由来

最近在做一个Dapp,里面有部分功能涉及帮助用户存储一定量的数据,所以需要有个计算用户成本的逻辑,由用户持续为自己消耗的存储付费。

开始计算合约成本

合约的部署成本

等于合约源码编译后WASM文件大小的10倍(mainnet)。相关源码在(GitHub code)查找setcode_ram_bytes_multiplier。这涵盖了VM和其他内存的开销,这是发布合约的最基本消耗。

合约的数据成本

对于系统账户的RAM消耗计算是在eosio代码(GitHub code)中,通过_db检索资源消耗,这需要访问运行的chainbase数据库。据我目前了解,还不能从合约直接这样获取。
那目前预计方案为,跟踪合约执行,并根据每行中存储的数据估算成本。

初步方案实现

用户发起转账到合约账户,内联购买RAM到合约账户,并记录增加的RAM到合约内对应账户下。
新增加数据时,计算本次的使用量,如果合约内账户剩余RAM足够的话,减去对应的数量,不够的话,提示用户充值。
删除数据时,计算本次数据的删除量,增加的内存量到合约内对应账户下。
如果做公益性质,由于数据估算可能有一定量的偏差,可以引入一定量的手续费,避免损失。

TODO

等方案实现完,再来继续完善本文。

参考:

faucet.cryptokylin reach 24 hours max token amount

麒麟网获取测试代币时
http://faucet.cryptokylin.io/get_token?bcskillsurou
返回

{
    msg: "reach 24 hours max token amount"
}

可尝试使用直接ip 访问获取
http://13.230.87.138/get_token?bcskillsurou

get_actions error in version v1.3.+

目前了解到的方案是,nodeos 重新启动,添加以下参数,重建数据,也许之后版本会有新的修复方案

--hard-replay-blockchain

github