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的智能合約編寫難度仍是比較高的,聽說一些積極的第三方也在開發其餘語言,很期待編寫智能合約變得簡單。



相關文章
相關標籤/搜索