本文来源:天算技术团队 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创业营
我来评几句
登录后评论已发表评论数()