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