传送门: 柏链项目学院



  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无缝地与智能合约进行交互。而wasm是一种字节码,wasm字节码既可以编译成机器码后执行,又可以使用解释器直接执行, 兼容性和性能兼有。

hello智能合约

  了解了各种文件的功能之后,我们来解析一下最简单的hello智能合约。

  • hpp文件

  此hello合约比较简单,也可以不写hpp文件,把类与成员定义在 cpp 文件中。

  • hello.cpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

class hello : public contract {
  public:
      using contract::contract;

      [[eosio::action]]
      void hi( name user ) {
         print( "Hello, ", user);
      }
};

EOSIO_DISPATCH( hello, (hi))

  前面几行不用多说,都是c++基本语法。我们重点看“[[eosio::action]]”后面的几行代码。那么问题来了,什么是action呢?action意为动作。在EOS中,智能合约的方法称为动作,在这里,“hi”就是这个智能合约的动作。当有其他账户调用此合约时,合约回打印hello回应他。一个 EOS 合约中可以有多个动作action,当EOS接收到一个事务后,会将该事务分发给相应的合约,或者说,调用相应的合约的动作。为了确保合约的哪个动作可以调用,需要使用 EOSIO_DISPATCH 宏来告诉 EOS。EOSIO_DISPATCH 宏在 <eosiolib/dispatcher.hpp>头文件中定义,该宏的第一个参数是合约的名字,第二个参数,是多个小括号()扩起来的多个动作的方法名。

  • hello.abi

  hello.abi文件通过eosiocpp工具产生,我们来看看它的内容

{
    "____comment": "This file was generated with eosio-abigen. DO NOT EDIT Tue Nov 20 18:39:18 2018",
    "version": "eosio::abi/1.0",
    "structs": [
        {
            "name": "hi",
            "base": "", 
            "fields": [
                {
                    "name": "user",
                    "type": "name"
                }
            ]
        }
    ],  
    "types": [], 
    "actions": [
        {
            "name": "hi",
            "type": "hi",
            "ricardian_contract": ""
        }
    ],  
    "tables": [], 
    "ricardian_clauses": [], 
    "abi_extensions": []
}

可以看出abi文件中的数据大概可以分为这么几类:

  • types
  • structs
  • actions
  • tables
  • ricardian_clauses

  types应该是合约的类型,structs应该是合约中交易的数据结构,actions里包含了合约的所有动作,tables中应该是合约存储的数据结构,用于定义合约的数据存储。而ricardian_clauses则是李嘉图条款,李嘉图条款是人和机器都能读懂的,此hello合约中为空。

  总而言之,EOS的智能合约编写难度还是比较高的,据说一些积极的第三方也在开发其他语言,很期待编写智能合约变得简单。