传送门: 柏链项目学院c++
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文件,把类与成员定义在 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>头文件中定义,该宏的第一个参数是合约的名字,第二个参数,是多个小括号()扩起来的多个动做的方法名。spa
hello.abi文件经过eosiocpp工具产生,咱们来看看它的内容code
{ "____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文件中的数据大概能够分为这么几类:blog
types应该是合约的类型,structs应该是合约中交易的数据结构,actions里包含了合约的全部动做,tables中应该是合约存储的数据结构,用于定义合约的数据存储。而ricardian_clauses则是李嘉图条款,李嘉图条款是人和机器都能读懂的,此hello合约中为空。接口
总而言之,EOS的智能合约编写难度仍是比较高的,听说一些积极的第三方也在开发其余语言,很期待编写智能合约变得简单。