EOS之hello智能合约解析


传送门: 柏链项目学院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文件

  此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>头文件中定义,该宏的第一个参数是合约的名字,第二个参数,是多个小括号()扩起来的多个动做的方法名。spa

  • hello.abi

  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

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

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



相关文章
相关标签/搜索