专栏名称: Delphy
Delphy 是一个基于以太坊的去中心化的社交性预测市场平台。
目录
相关文章推荐
51好读  ›  专栏  ›  Delphy

【Delphy团队】EOS合约开发 - 本地测试环境搭建

Delphy  · 公众号  ·  · 2018-07-30 20:31

正文

请到「今天看啥」查看全文


EOS主网上线已经一个多月了,我在近期也开始着手研究EOS平台上的智能合约开发。在这里写一些文章,希望能帮助到想学习相关知识的开发者。这第一篇文章,我们便来首先搭建一个本地测试环境。事实上,网络上有非常多文章讲述本地测试网的搭建,但这些文章大多在区块开始产生后便戛然而止。对于开发者而言,这里面缺少了很多东西,包括系统合约的部署以及系统代币的发行。更令我诧异的是,就连EOS官方的开发者网站中给出的部署步骤,都与主网的情况有不小差异(官方文档中指导部署eosio.bios合约,而主网中部署的是eosio.system合约)。希望这篇文章能帮助到和我首次接触EOS合约开发时一样困惑的开发者们。


下载代码并编译、安装


首先是系统环境的选择,我推荐使用Ubuntu 18.04 LTS。


Windows系统并不在官方支持的列表当中,但如果你非要使用Windows进行开发,也并非没有办法。除了安装虚拟机之外,还可以使用Windows 10中的WSL(Windows Subsystem for Linux)进行开发。然而在我使用WSL的测试中,发现了不少问题:


首先是效率问题。编译EOS源码需要花费大量时间,WSL的效率要比原生Ubuntu慢上好几倍,这就浪费不少时间。


更重要的是,在区块生产过程中,进程总会无故卡死,需要Ctrl+C并重新开启才能继续产生区块。


接下来,我都会默认读者使用的是Ubuntu 18.04 LTS系统。


复制代码:$ git clone https://github.com/eosio/eos.git --recursive
$ cd eos


编译代码:$ ./eosio_build.sh

这是官方提供的编译脚本,它会自动完成依赖项的下载、安装和代码的编译。过程中,会有数次要求输入管理员密码。


需要注意的是,MongoDB是EOS的依赖项之一,而在墙内下载该依赖项会失败, 请先科学上网,再开始编译,否则会无法下载MongoDB导致编译失败。


当你看到如下图的提示时,表明你的编译已经顺利完成了:


这时候便可以开始安装了:

$ cd build
$ sudo make install


命令执行完成后,你便完成了EOS的编译和安装,接下来可以开始搭建测试节点了。


配置并运行节点


在任意位置新建一个脚本,用来启动测试节点,我选择在用户主目录下创建local-testnet.sh文件:


$ cd
$ touch local-testnet.sh
$ chmod 744 local-testnet.sh


在脚本文件中,输入以下内容:

nodeos -e -p eosio -d /data/eos --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin --contracts-console --filter-on "*" --access-control-allow-origin "*"


接下来逐一解释这些参数:

-e

开启Stale Production,

即便当前时间已经超过规定的区块生产时限,也继续产生。

-p eosio

区块产生者的账户,这里设定为系统账户eosio。

-d /data/eos

这是区块链数据存放的目录,根据你的配置修改为相应的路径。

--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开发中,网站会报错。

保存并运行脚本:

$ ./local-testnet.sh

这时本地测试网便已开始产生区块。在新的窗口中,执行以下命令测试:

$ cleos get info


钱包私钥导入



由于在运行节点时,并为指定配置文件,系统会使用默认的配置文件:~/.local/share/eosio/nodeos/config/config.ini


打开配置文件,定位到该行:

signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3


这是指定了默认区块产生者eosio的公私钥对,其中公钥为:EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV


相对应的私钥为:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3


为了可以控制系统账户,我们需要在钱包中导入该私钥。


首先,创建一个名为local的钱包:

$ cleos wallet create -n local
"/usr/local/bin/keosd" launched
Creating wallet: local
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KUby12KTLCtxpURP4JYbVsgPRfyPX8H37qMZ1oi7ogRpkKdmMJ"


程序会自动生成钱包的密码,以上例子中,密码即为PW5KUby12KTLCtxpURP4JYbVsgPRfyPX8H37qMZ1oi7ogRpkKdmMJ。


钱包创建完成后,导入eosio账户的私钥:

$ cleos wallet import -n local 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3


接下来,为了区分我们自己创建的账户和系统账户,我们在钱包里新建一个公私钥对:

$ cleos wallet create_key -n local
Created new private key with a public key of: "EOS5CnfZyU1KDK6DJids2929xTxMRQVE5KLwhXzYu67bMHnMYfHA7"


这时,local钱包中便有了两个私钥,我们可以开始账户的创建和合约的部署了。

,也就厌了。


系统合约部署


事实上,到这里,本地的测试网以及可以进行账户创建和合约部属等操作了。但是,此时网络状况与主网差异相当大:


测试网中无Token:执行命令cleos get account eosio可以看到结果中并无显示Token余额创建的账户资源都是无限的,这与实际情况相差很大。


因为,我们要部署系统合约,使得本地测试环境与主网环境更加接近。


在部署eosio.system合约之前,必须先创建如下账户:

systemAccounts = [
'eosio.bpay',
'eosio.msig',
'eosio.names',
'eosio.ram',
'eosio.ramfee',
'eosio.saving',
'eosio.stake',
'eosio.token',
'eosio.upay',
]

执行如下命令来创建这些账户:

$ cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio

eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


$ cleos create account eosio eosio.upay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV;


接下来将代币合约部署到eosio.token账户中:

# 进入编译后的合约目录
$ cd ~/repos/eos/build/contracts
$ cleos set contract eosio.token ./eosio.token


创建并发行10亿个SYS代币(SYS相当于主网中的EOS):

$ cleos push action eosio.token create '["eosio","1000000000.0000 SYS"]' -p eosio.token@active
$ cleos push action eosio.token issue '["eosio","1000000000.0000 SYS"]' -p eosio@active


如果不理解这几行命令也不要紧,我们在接下来的文章里,会详细探讨eosio.token这个合约的代码。

发行了系统代币后,就可以部署eosio.system合约了:

$ cleos set contract eosio ./eosio.system

至此,系统合约部署完毕,我们可以创建自己的账户了。


创建自己的账户


刚才我们用cleos create account命令来创建系统账户,但现在我们已经部署了系统合约,再使用该命令的话,会报错而无法创建账户。原因是没有为该用户购买所需的系统资源(这里主要是没买内存)。


因此,我们要使用cleos system newaccount命令来进行账户创建。这个命令可以指定需要购买的系统资源。


下面的命令中,将公钥替换为你在上面钱包创建步骤中产生的公钥,否则你将无法控制该账户:

$ cleos system newaccount --buy-ram "1000.0000 SYS" --stake-net "100.0000 SYS" --stake-cpu "100.0000 SYS" eosio jonathan EOS5CnfZyU1KDK6DJids2929xTxMRQVE5KLwhXzYu67bMHnMYfHA7


再从eosio账户中向该帐户转入一定数量的代币:

$ cleos push action eosio.token transfer '["eosio","jonathan","10000.0000 SYS"]' -p eosio@active


至此我们的本地测试环境就部署完毕了,接下来的文章里,我们会细读EOS系统合约代码,并写一些简单的 合约。



以上内容来自天算技术团队 johnason 的分享,对技术感兴趣的朋友可以关注小哥哥在币乎的账户: EOS创业营


公众号回复关键词了解天算Delphy

项目信息


【白皮书英文版】编辑回复关键词:"白皮书英文版"

【天算FAQ】编辑回复关键词:“FAQ"

【项目进度】、【每月赠币】、【往期直播点】

击【主菜单】:"历史消息跳转查看"


加入社区互动


官方网站: https://delphy.org

电邮: [email protected]

微信: delphy_org

推特: https://twitter.com/Delphy_org

中文电报: https://t.me/Delphyfans

英文电报: https://t.me/DelphyCHAT


扫码加入天算官方社群

点 “阅读原文” 为 johnason 点赞!







请到「今天看啥」查看全文