EOS之Hello智能合约解析
EOS的智能合约与以太坊区别很大, EOS 的智能合约基于 WebAssembly(WASM) 技术执行用户生成的应用程序和代码。WASM是一项新兴的网络标准,得到了谷歌,微软,苹果等公司的广泛支持。
目前,用于构建编译为WASM的应用程序的最成熟工具链是使用C / C ++编译器的clang / llvm。目前EOS的智能合约仅支持C和C ++编写。我个人认为,EOS的智能合约相较于以太坊的智能合约上手难度要更大一些。一个简单的EOS智能合约都要由多种种文件构成,而以太坊的solidity就相对简单了。
智能合约文件组成
前面说到了EOS智能合约需要多种文件组成,接下来我们来看看是哪几种文件。
通常一个简单的智能合约需要有.cpp、.hpp、.abi这几种文件。
- 其中.hpp文件是包含.cpp文件引用的变量、常量和函数的头文件。
- .cpp文件是包含合约功能的源文件,用来实现智能合约的功能和动作等。
- .abi文件是应用程序二进制接口文件,是一种基于JSON的描述,通过ABI描述合约,开发人员和用户可通过JSON无缝地与智能合约进行交互。
- CMakeLists.txt和.wast都是编译时生成的文件,我们不用管它。
Hello智能合约
了解了各种文件的功能之后,我们来解析一下最简单的hello智能合约。
- .hpp文件
此hello合约比较简单,也可以不写hpp文件,把类与成员定义在 cpp 文件中。
- hello.cpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>
using namespace eosio;
class hello : public eosio::contract {
public:
using contract::contract;
/// @abi action
void hi( account_name user ) {
print( "Hello, ", name{user} );
}
};
EOSIO_ABI( hello, (hi) )
前面几行不用多说,都是c++基本语法。我们重点看“@abi action”后面的几行代码。那么问题来了,什么是action呢?action意为动作。在EOS中,智能合约的方法称为动作,在这里,“hi”就是这个智能合约的动作。当有其他账户调用此合约时,合约回打印hello回应他。而EOSIO_ABI是一种宏,它把类的方法暴露出来,其他账户才可以调用。
- hello.abi
hello.abi文件通过eosiocpp工具产生,我们来看看它的内容
{
"____comment": "This file was generated by eosio-abigen. DO NOT EDIT - 2018-05-04T14:34:07",
"types": [],
"structs": [{
"name": "hi",
"base": "",
"fields": [{
"name": "user",
"type": "account_name"
}
]
}
],
"actions": [{
"name": "hi",
"type": "hi",
"ricardian_contract": ""
}
],
"tables": [],
"ricardian_clauses": []
}
可以看出abi文件中的数据大概可以分为这么几类:
- types
- structs
- actions
- tables
- ricardian_clauses
types应该是合约的类型,
structs应该是合约中交易的数据结构,
actions里包含了合约的所有动作,
tables中应该是合约存储的数据结构,用于定义合约的数据存储。
而ricardian_clauses则是李嘉图条款,李嘉图条款是人和机器都能读懂的,此hello合约中为空。
总而言之,EOS的智能合约编写难度还是比较高的。用c++编写智能合约我个人是不喜欢的,据说一些积极的第三方也在开发其他语言,很期待编写智能合约变得简单。