读过《天龙八部》小说或者看过《天龙八部》影视剧的朋友们对无崖子将自己毕生功力传给虚竹都应该不算陌生。我们平时在了解或者熟悉基于各种语言或环境的智能合约开发的时候都不可避免的接触到交易这个概念,即token从一个账户到另一个账户之间转移的过程,那么无崖子传功虚竹是否也是类似的一个过程呢?将功力从无崖子转到虚竹,今天我们就尝试着将这个过程通过eos智能合约开发的形式简单的展示一下。
上一篇文章介绍eos命令行工具cleos中的httpserver架构的实现,该服务是基于boost::asio,通过iocp的方式实现的。可能很多人读完之后有些云里雾里的感觉,并不知道我们在讲些什么,那么今天我们就以官方wiki为基础,简单的介绍下cleos命令行操作的用法,实现一个智能合约,并发送action到这个合约,最后打印出相关内容。
由于eos代码更新速度较快,在写下这些内容的时候,已经更新至4.0版本,有很多朋友还在群里或者私聊我个人关于eos环境的搭建,那么我们就再简单的介绍下eos环境的搭建(基于3.0版本进行,4.0版本还有若干缺陷等待BM团队继续更新),该教程基于官方wiki给出的指导进行,如有疑问可在公众号后台留言,有时间的话我会尝试着进行解释,当然也有可能出现理解错误的地方,还请各位多多批评指正。
一、eos环境的搭建
git clone代码至本地
git clone https://github.com/EOSIO/eos --recursive
eos的编译对操作系统有以下要求
本文基于ubuntu 16.04进行,同时eos代码的编译还需要有至少8G以上的物理内存以及20G或者以上的磁盘空间,当然有的朋友会问,我的内存不足8G或者装的虚拟机可以进行编译么?当然也可以,我们可以打开eosscripts下找到对应操作系统的sh文件,将其中对内存大小的判断注释掉即可,以ubuntu为例,把exit注释掉即可:
代码clone下来之后,执行以下命令进行编译:
cd eos
./eosio_build.sh
该sh文件集成了很多内容,免去了2.0版本中一步步安装依赖和库的尴尬,当然如果想了解更多,可以参考一下这篇文章:eos源码赏析(一):Ubuntu下eos代码编译具体eos代码的编译过程中都使用了哪些库,这些库的作用是什么。
编译完成之后我们会发现eos目录下多了一个build的文件夹,其中包含了nodeos、cleos、keosd等,这些都将是我们的重点关注对象。执行以下命令进行安装:
cd build
sudo make install
安装完成之后,我们尝试着去nodeos运行一个测试网络的单节点,可以执行以下命令:
cd build/programs/nodeos
./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin
不出什么意外的话节点便可以运行了,当然这是在测试网络上进行的。在运行节点的时候可能会出现以下情况,就是上次正在运行的节点异常关闭或者异常关机会导致出现以下报错:
这是因为异常关闭或者异常关机导致的区块头的indexcode和当前链状态不一致导致的。此时我们可以通过使用以下命令来对代码进行编译:
./nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin –resync
即在刚才运行节点的命令后面加上—resync即可。
当出现以下界面的时候,代表测试网络的eos节点或者称之为服务运行起来了。
二、eos智能合约之无崖子传功虚竹
大多开发人员,不管什么开发语言,都是hello world来迎接自己,下面我们尝试着写一个最简单的智能合约来演示无崖子是如何把神功传给虚竹的。
一个智能合约包含了很多内容,如c 代码以及c 代码生成的ABI文件,WAST文件等。为了演示无崖子是如何传功给虚竹的,我们现在contracts文件夹下新建一个wuyazi的文件夹然后在该文件夹下创建wuyazi.cpp文件并编辑以下内容:
eos提供了一个称之为eoscpp的工具可以对其进行编译,我们可以执行以下命令来生成wast文件和abi文件:
eosiocpp -o wuyazi.wast wuyazi.cpp
eosiocpp -g wuyazi.abi wuyazi.cpp
执行之后我们可以看到wuyazi.cpp所在文件夹存在有
wuyazi.cpp、wuyazi.abi、wuyazi.wast三个文件,如图所示:
接下来我们就要展示cleos的神奇了,在创建智能合约之前首先要给无崖子和虚竹一人一个账户,这样才能把无崖子账户里面的功力传输给虚竹,为此我们要经过
1、创建密钥对和钱包,如下图示:
2、把私钥导入钱包,如下图示:
3、用上面生成的公钥创建一个账户:
4、发布一个智能合约:
5、无崖子传功给虚竹:
当无崖子把自己近80年的功力传给虚竹之后,一个简单的智能合约就发布完成并且演示了一个交易的过程。最终在终端界面上打印出了:我无崖子把所有功力都传给你了~~虚竹
本文以一个简单的智能合约的开发介绍了在代码更新到3.0或者4.0版本之后nodeos环境的搭建以及cleos的一些具体命令行的使用,使用该命令创建钱包、账户、密钥对等内容,最终实现一个类似hello world功能的智能合约,将无崖子的功力传输给了虚竹。