美文网首页EOS学习大本营
EOS之Hello智能合约解析

EOS之Hello智能合约解析

作者: P叔 | 来源:发表于2018-06-01 17:10 被阅读133次

    EOS之Hello智能合约解析

    EOS的智能合约与以太坊区别很大, EOS 的智能合约基于 WebAssembly(WASM) 技术执行用户生成的应用程序和代码。WASM是一项新兴的网络标准,得到了谷歌,微软,苹果等公司的广泛支持。

    目前,用于构建编译为WASM的应用程序的最成熟工具链是使用C / C ++编译器的clang / llvm。目前EOS的智能合约仅支持C和C ++编写。我个人认为,EOS的智能合约相较于以太坊的智能合约上手难度要更大一些。一个简单的EOS智能合约都要由多种种文件构成,而以太坊的solidity就相对简单了。

    智能合约文件组成

    前面说到了EOS智能合约需要多种文件组成,接下来我们来看看是哪几种文件。


    image

    通常一个简单的智能合约需要有.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++编写智能合约我个人是不喜欢的,据说一些积极的第三方也在开发其他语言,很期待编写智能合约变得简单。

    知识星球二维码380.png

    相关文章

      网友评论

        本文标题:EOS之Hello智能合约解析

        本文链接:https://www.haomeiwen.com/subject/bfuksftx.html