技术 | EOS智能合约开发之本地测试环境搭建

本文来源:天算技术团队 jonhnson  

EOS主网上线已经一个多月了,很多开发者已经开始着手研究EOS平台上的智能合约开发。在这里写一些文章,希望能帮助到想学习相关知识的开发者。

第一篇文章,首先搭建一个本地测试环境。事实上,网络上有非常多文章讲述本地测试网的搭建,但这些文章大多在区块开始产生后便戛然而止。对于开发者而言,这里面缺少了很多东西,包括系统合约的部署以及系统token的发行。更令人诧异的是,就连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" launchedCreating wallet: localSave 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 localCreated 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;

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

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

创建并发行10亿个SYStoken(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这个合约的代码。

发行了系统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账户中向该帐户转入一定数量的token:

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

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

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

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章