「Hello,Gakki」背後的知識|大狗教你EOS開發(七)

「Hello,Gakki」背後的知識|大狗教你EOS開發(七)

本期是 IMEOS EOS教程的第 7 期,主要分析 第 4 期 「Hello,Gakki」智能合約背後的重要概念:李嘉圖合約與 WebAssembly ,並給出 hello.cpp 的一個詳細註釋版,以讓大家更好的理解智能合約。

1 啥是李嘉圖合約?

只要是智能合約,都會匹配一份「李嘉圖合約( Ricardian Contract )」。李嘉圖合約相當於一份法律文件,規定著與智能合約發出的每個動作( Action )相關的被法律約束的行為( Behavior )。「 Hello,Gakki 」智能合約對應的李嘉圖合約請查看以下鏈接:

https://pan.baidu.com/s/1JEgOABGUKwLT35Fl7NcPFw

李嘉圖合約是EOS的重要組成部分。不僅每份智能合約能匹配一份李嘉圖合約,而且 EOS 的憲法也被規範為李嘉圖合約,具體內容可參閱官網。

2 啥是 WebAssembly ?

在編寫「 Hello,Gakki 」智能合約的時候,我們經將cpp編譯出wast(Web Assembly 文本文件),然後又編譯出 ABI( Application Binary Interface —— 應用二進制接口)。整個過程如圖所示:

「Hello,Gakki」背後的知識|大狗教你EOS開發(七)

注:本圖來自 EOSAsia

之所以有點複雜,是因為 EOS 用到了 WebAssembly 技術。

這個 WebAssembly 是什麼?

作為硬核程序員,BM 使用 C++ 作為智能合約開發語言。但是,操作智能合約總不能通過命令行來進行,需要有一種方式讓用戶通過網頁來操作智能合約,所以 WebAssembly 就登場了。

簡而言之,WebAssembly 是這樣一個東西,他讓我們能通過 Nodejs 來操作智能合約。

WebAssembly 有什麼樣的優勢呢?

一言以蔽之:

Javascript 是一個叫 Brendan Eich 的傢伙用10天時間做出來的,因此……Javascript 存在一些天坑,而其中最大的坑是——!隨著 Web App 越來越複雜,這個慢漸漸變得不可忍受了。然後,各種解決方案被提出,最新的一種就是這個 Webassembly 了—— C++ 代碼編譯為 wast 文件,然後 Nodejs 能直接執行 wast,從而速度變得嗖嗖的快,乃至Web App 也有望達到原生 App 的性能!

從這一點來看,EOS 的確有著追求效率的基因。

3 hello.cpp 詳細註釋版

#include

//通用eos庫,寫智能合約都要先把這個加載上

//裡面集合了types, action, print, math, multi_index, dispatcher, contract這幾個hpp

#include

using namespace eosio;

//命名空間eosio

class hello : public eosio::contract {

//此處定義了hello類,派生自eosio的contract部分

public:

using contract::contract;

/// @abi action

void hi( account_name user ) {

require_auth( user );

print( "Hello, ", name{user} );

}

};

EOSIO_ABI( hello, ( hi ) )

//'EOSIO_ABI'是一個生成智能合約初始化函數的批處理工具,生成的函數是智能合約的入口,採用Switch case的方式調用具體Action對應的函數

4 總結與預告

在 第 5 期 和 第 6 期 「插播」了 Docker 下的 EOS 配置及使用方案後,我們迴歸了主線,繼續來講智能合約。但是,到目前為止,智能合約還都是通過 cleos 工具來運行的,還不能說我們構建了一個區塊鏈應用。

在下一期,我們會打通 Javascript 和智能合約,實現一個功能最簡但完整的「區塊鏈應用」。

下期見!


分享到:


相關文章: