本文作者:陈进坚
个人博客:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:jian1098@qq.com
环境要求
- Ubuntu 16.04及以上
- 内存4G以上(官方要求8G,可以通过修改文件降低要求)
编译安装
clone源码
1 | root@iZj6c4i3ovav4gk164bft3Z:~# git clone https://github.com/eosio/eos.git --recursive |
如果要编译指定版本,可以加上参数,例如:
1 | git clone -b release/1.7.x https://github.com/eosio/eos.git --recursive |
需要注意的是,MongoDB是EOS的依赖项之一,而在墙内下载该依赖项会失败,请先科学上网,再开始编译,否则会无法下载MongoDB导致编译失败。
编译
1 | root@iZj6c4i3ovav4gk164bft3Z:~# cd eos/scripts |
如果提示下面的信息,说明内存达不到要求,至少需要7G以上内存空间
1 | ...... |
将VMware的内存增加到4G多一点,记住要多一点,然后修改./scripts/eosio_build_ubuntu.sh
文件,查找报错的那行代码
1 | [[ $MEM_GIG -lt 7 ]] && echo "Your system must have 7 or more Gigabytes of physical memory installed." && exit 1 |
将7修改为4即可,意思是将配置要求降低到4G内存
如果看到下面的5个红色大字表示已经编译完成了,除开填坑的时间花了整整4个小时
1 | [100%] Built target print_floats |
编译完成后安装、设置软连接
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cd build |
在./programs这个文件夹中可以找到eos的几个核心程序
nodeos
: 区块链服务器节点生成组件。nedeos
的配置文件位于~/Library/Application Support/eosio/nodeos/config
文件夹中,区块数据存储在文件~/Library/Application Support/eosio/nodeos/data
中cleos
: 和区块链交互的接口命令,要指定服务器地址和端口请使用参数-u http://127.0.0.1:8888
keosd
: EOS 钱包,作用是存储私钥,以便cleos
用以签署交易并发送到区块链中。keosd
在本机运行,并且将私钥存储在本地。keosd
会随着cleos
自动启动。eosio-launcher
:节点网络组成和部署的应用
配置文件
修改配置文件
1 | root@iZj6c4i3ovav4gk164bft3Z:~# cd ~/.local/share/eosio/nodeos/config |
将下面的内容添加到配置文件的最后保存
1 | # The local IP and port to listen for incoming http connections; |
启动节点
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# nodeos -e -p eosio -d /root/eos/data --contracts-console --trace-history --verbose-http-errors --disable-replay-opts |
参数说明:
-p:表示使用了 本地测试系统提供的原始账户 eosio 账户的权限
-d:区块数据存放目录
–plugin:插件
-e:开启Stale Production,即即便当前时间已经超过规定的区块生产时限,也继续产生
–plugin eosio::chain_api_plugin:开启区块链JSON API插件。
–plugin eosio::history_api_plugin:开启历史数据插件,有了这个插件,便能查询许多不在State中的数据,譬如一个公钥所对应的所有账户等等。
–contracts-console:开启合约控制台。如果不开启的话,合约中调用print函数输出的信息将会不可见。
–filter-on “*”:开启所有账户的历史纪录。默认状态下,节点不会记录账户的历史数据,从而使得命令cleos get actions返回空。
–access-control-allow-origin “*”:允许任意域名跨域访问API,如果不开启,在dApp开发中,网站会报错。
- 如果启动节点报错
database dirty flag set (likely due to unclean shutdown): replay required
,说明节点非正常退出导致数据异常,需要在启动命令加上参数--hard-replay
停止节点
按下Ctrl+C即可停止节点
创建脚本
由于启动命令太长不方便记忆,我们需要写一个启动脚本方便启动和停止,并且在后台运行程序
1 | vi start_nodeos.sh |
将下面的内容复制进去保存,启动命令根据自己的需求修改
1 | #!/bin/bash |
然后制作停止脚本
1 | vi stop_nodeos.sh |
将下面的内容复制进去保存
1 | #!/bin/bash |
配置脚本执行权限
1 | chmod u+x st*.sh |
查看权限
1 | ls -la *.sh |
后台要启动nodeos
程序只要执行./start_nodeos.sh
即可,查看日志文件
1 | tail -f nodeos.log |
导入私钥
首先我们需要创建一个默认的钱包,请记住的到的私钥
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos wallet create --to-console |
这里创建了钱包名为default,密码为PW5JpwC9Xbakce63ZEFRpqh2LEFSRwdXhrCDo67L86gKnxYPJihZA
的钱包。
进入配置文件
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/programs/cleos$ cd ~/.local/share/eosio/nodeos/config |
找到这一行
1 | # signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 |
这是指定了默认区块产生者eosio
的公私钥对,其中公钥为:EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
相对应的私钥为:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
为什么钱包中已经有密钥对了还要再添加?
每个EOS帐户都拥有owner
(所有者)和active
(活动权限)两个权限,因此,在大多数情况下,需要创建两个密钥,以便可以将一个密钥与每个权限相关联。
首先创建两个密钥对
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cd ~/eos/build/programs/cleos |
然后依次将eosio
的私钥和两个Private key
导入到创建的默认钱包中
1 | root@iZj6c4i3ovav4gk164bft3Z:~/.local/share/eosio/nodeos/config# cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 |
可以看到导入私钥后会自动给出对应的公钥。
在次打开默认钱包可以看到默认钱包中已经有3个密钥对了
1 | root@iZj6c4i3ovav4gk164bft3Z:~/.local/share/eosio/nodeos/config# cleos wallet keys |
发行代币
在部署eosio.EOStem合约之前,必须先创建如下账户,创建账号使用eosio的公私钥对:
1 | EOStemAccounts = [ |
创建命令如下:
1 | cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV; |
执行的结果如下:
1 | executed transaction: 9da6a67895e9efc1a794e4beae1f8134e6a3a0e866a5092cdfb55f77b7642c5d 200 bytes 192 us |
接下来将代币合约部署到eosio.token账户中:
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/programs/cleos$ cd /root/eos/build/unittests/contracts # 进入编译后的合约目录 |
创建1亿个EOS代币(这里的EOS币相当于主网中的EOS):
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/unittests/contracts# cleos push action eosio.token create '["eosio","10000000000.0000 EOS",0,0,0]' -p eosio.token |
发行代币,数量:10000000000,代币符号:EOS。
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/unittests/contracts# cleos push action eosio.token issue '["eosio","10000000000.0000 EOS","issue"]' -p eosio |
查询余额
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/unittests/contracts# cleos get currency balance eosio.token eosio |
创建账号
在EOS中,为了控制权限,创建账号是需要指定一个创建者的,例如默认钱包的创建者是eosio,所以创建default账号中含有eosio的私钥。
创建账户的格式如下:
1 | cleos create account AUTHORIZING_ACCOUNT NEW_ACCOUNT OWNER_KEY ACTIVE_KEY |
authorizing_account
是新账户的创建者。在此教程中,由于我们运行的是一个单节点测试网络,所以我们拥有一个名为eosio
的系统账户,因此我们使用eosio
作为新账户的创建者new_account
是要创建的账户名称owner_key
是账户owner
权限的公钥active_key
是账户active
权限的公钥
我们使用account1
作为新账户名称,使用eosio
作为新账户的创建者,使用之前生成并导入default
钱包的两个公钥EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt
和EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa
分别作为owner
权限和active
权限的公钥,注意这里是使用公钥!!!
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/unittests/contracts# cleos create account eosio account1 EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa |
我这里报错了,因为交易是需要RAM资源的。如果没有报错请忽略下面一步。
1 | Error 3080001: Account using more than allotted RAM usage |
将创建命令改为下面的才能成功
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/programs/cleos$ sudo ./cleos system newaccount eosio account1 EOS5Fwtc4vnQE8AigimXvHrERrK7XFpycQ8Dijq2611timbVTReDt EOS75hPAeMGgAw9FYLTAHqjHyicjW82bB1q9grXqDtCdMDMpe1eoa --stake-net '0 EOS' --stake-cpu '0 EOS' --buy-ram-kbytes 3 -x 30 |
查询刚刚创建的账号:
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos/build/unittests/contracts# cleos get account account1 |
锁定钱包
锁定默认钱包
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos wallet lock |
锁定指定钱包
1 |
|
keosd
会在没有钱包指令的15分钟后自动锁定钱包,可以在~/eosio-wallet/config.ini
中进行时长修改。可以设置一个超大数来取消这项功能。如果设为0,将会导致钱包永久锁定。
解锁钱包
没有-n
指定钱包名会解锁默认钱包,默认钱包解锁密码是”导入私钥”中创建钱包时得到的PW
开头的私钥
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos wallet unlock -n accountname |
再次查看钱包,可以看到有*号表示已经解锁了
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos wallet list |
发送交易
转100个币到account1
账号中
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos push action eosio.token transfer '["eosio", "account1","100.0000 EOS","memo"]' -p eosio |
查询account1
账号的余额
1 | root@iZj6c4i3ovav4gk164bft3Z:~/eos# cleos get currency balance eosio.token account1 |
参考文章
RPC中文文档:http://cw.hubwiz.com/card/c/eos-rpc-api
EOS WiKi中文版:https://eoswiki.readthedocs.io/zh_CN/latest/
https://www.jianshu.com/nb/24907261
https://zhuanlan.zhihu.com/p/40009564
https://blog.csdn.net/littlefool5201314/article/details/79869114