摘要:所以最簡單的智能合約只需實現(xiàn)文件。我們看到文件中已經(jīng)聲明了這個,并說明了這個的李嘉圖合約,大概意思是本合約的輸入為一串字符,本合約意圖是打印輸出,沒有其他效果。
Hello World!
稍微了解 EOS 系統(tǒng),你就會知道 EOS 的智能合約基于 WebAssembly(WASM) 技術,這種技術在性能和跨平臺兼容性之間取得了很好的平衡,通過將原始代碼編譯成字節(jié)碼,使得代碼可以在多種平臺的 WASM 虛擬機(或者叫解釋器)中執(zhí)行。得到了蘋果和谷歌等科技巨頭的支持,被譽為下一代互聯(lián)網(wǎng)前端技術。目前的 WebAssembly 技術支持 C/C++ 語言,并開發(fā)了 JavaScript 接口,并被 Chrome、Edge、Safari、Firefox 等幾乎所有的主流瀏覽器支持。
因為使用了 WebAssembly,目前的 EOS 智能合約只支持 C/C++ 語言,簡單的智能合約由 3 種文件組成:.hpp文件、.cpp文件、.abi 文件。其中 hpp 為 C++ 頭文件,一般用來定義類及其成員變量與成員函數(shù)。cpp 為 C++ 文件,用來實現(xiàn) hpp 中聲明的成員函數(shù),實現(xiàn)智能合約的業(yè)務邏輯。abi(Application Binary Interface) 文件為二進制接口文件,文件格式類似 JSON,用來定義智能合約與 EOS 系統(tǒng)外部交互的數(shù)據(jù)接口。
如果智能合約的非常簡單,只有一個 cpp 文件,可以省略 hpp 文件,將類與成員定義在 cpp 文件中。abi 文件應該由 C++ 程序需要的數(shù)據(jù)庫空間和外部接口生成,不過 EOS 開發(fā)了 abi 自動生成工具,可以根據(jù)智能合約代碼自動生成 abi 文件,減輕了開發(fā)工作量。所以最簡單的智能合約只需實現(xiàn) cpp 文件。
Hello 智能合約一般的操作系統(tǒng)上手時,慣例是編寫一個 Hello World 程序,結果是主動輸出一句話。但我們不一樣,我們編寫的是一個智能合約,智能合約強調的是互動,在 EOS 里叫做 Action,Action 表示別人可以對合約做什么動作,所有智能合約代碼都是對 Action 的回應,是被動的。下面就是第一個 Hello 智能合約:
hello.cpp:
#include#include 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) )
我們在代碼中定義了一個類:hello,這個類名與合約的賬戶名沒關系,類中只有一個簡單的方法:
void hi( account_name user ) { print( "Hello, ", name{user} ); }
這就是 EOS 智能合約里所謂的 Action,我們定義了一個叫 hi 的 Action,參數(shù)是另一個賬戶名,函數(shù)體是打印一句話,回應 hello。 也就是說別的賬戶可以調用這個合約的 hi Action,這個 hello 合約就會打印一句 hello 來回應。
最后一行代碼:
EOSIO_ABI( hello, (hi) )
EOSIO_ABI 是一個宏,將特定類的特定方法暴露給系統(tǒng),成為別的賬戶可以調用的 Action。
編譯智能合約我們使用 eosiocpp 工具將寫好的 hello.cpp 編譯成為字節(jié)碼文件(.wast):
$ eosiocpp -o hello.wast hello.cpp
然后使用 eosiocpp 工具自動生成 abi 文件:
$ eosiocpp -g hello.abi hello.cpp Generated hello.abi
看一下生成的 abi 文件內容:
{ "____comment": "This file was generated by eosio-abigen. DO NOT EDIT - 2018-04-16T13:37:55", "types": [], "structs": [{ "name": "hi", "base": "", "fields": [{ "name": "user", "type": "account_name" } ] } ], "actions": [{ "name": "hi", "type": "hi", "ricardian_contract": "# CONTRACT FOR hello::hi## ACTION NAME: hi ### Parameters### Parameters Input paramters:Input paramters: * `user` (string to include in the output)* `user` (string to include in the output) Implied parameters: Implied parameters: * `account_name` (name of the party invoking and signing the contract)* `account_name` (name of the party invoking and signing the contract) ### Intent### Intent INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect. ### Term### Term TERM. This Contract expires at the conclusion of code execution.TERM. This Contract expires at the conclusion of code execution. " } ], "tables": [], "ricardian_clauses": [ ... ... ... ] }
我們省略了 ricardian_clauses ,也就是李嘉圖條款部分(李嘉圖合約指的是人與機器都能讀懂的合同,EOS 最近才將其加入智能合約中)。我們看到 abi 文件中已經(jīng)聲明了 hi 這個 Action,并說明了這個 Action 的李嘉圖合約,大概意思是本合約的輸入為一串字符(user),本合約意圖是打印輸出,沒有其他效果。
上傳智能合約上傳智能合約之前,我們要先給智能合約建立一個賬戶 EOS 里賬戶和智能合約是一一對應的。使用 EOS 的 cleos 命令行工具創(chuàng)建賬戶:
$ cleos create account eosio hello.code EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
命令中,hello.code 就是這個智能合約的賬戶名,EOS系統(tǒng)的賬戶名要求 12 字符以內。后面兩個公鑰是在本地測試網(wǎng)絡中有建立賬戶權限的公鑰(對應本地測試網(wǎng)絡中的 eosio 賬戶)。
然后就可以上傳智能合約了:
$ cleos set contract hello.code ../hello -p hello.code使用智能合約
我們使用 user 賬戶調用 hello.code 的 hi Action:
$ cleos push action hello.code hi "["user"]" -p user
hello.code 表示執(zhí)行 hello.code 合約,hi 表示執(zhí)行合約里的 hi Action,"["user"]" 是根據(jù) abi 寫的傳入?yún)?shù), -p 參數(shù)表示使用哪個賬戶的權限 (permission)。
以下是系統(tǒng)回應:
executed transaction: 4c10c1426c16b1656e802f3302677594731b380b18a44851d38e8b5275072857 244 bytes 1000 cycles # hello.code <= hello.code::hi {"user":"user"} >> Hello, user
說明執(zhí)行了 hello.code 合約的 hi Action,并且系統(tǒng)輸出為 Hello, user,智能合約成功對 Action 進行了回應。
【許曉笛】EOS 新增的 WebAssembly 解釋器,是什么鬼?
圓方圓學院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術課程。 在各大平臺都長期有優(yōu)質免費公開課,歡迎報名收看。
公開課地址:https://ke.qq.com/course/345101
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24435.html
摘要:構造函數(shù)為空,參數(shù)為智能合約賬戶名。每個智能合約類都要繼承類類構造函數(shù)創(chuàng)建代幣函數(shù)聲明函數(shù),這個函數(shù)用來新建一種代幣,并輸入代幣的各種屬性,同時函數(shù)也是一個。 詳解 EOS 智能合約的 hpp 文件 為了幫助大家熟悉 EOS 智能合約,EOS 官方提供了一個代幣(資產(chǎn))智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個別功能還沒有完...
摘要:文件地址智能合約文件由部分組成定義類型的別名各個類型的數(shù)據(jù)結構智能合約的數(shù)據(jù)結構體李嘉圖條款注格式不支持注釋,上面的雙斜線大家理解就好。是李嘉圖合約,剛剛被加入到智能合約中,官方還沒有進一步說明。 詳解 EOS 智能合約的 abi 文件 這次向大家介紹 eosio.token 智能合約的最后一個文件 —— abi文件。ABI 全稱 Application Binary Interfac...
摘要:與數(shù)據(jù)庫交互的被官方稱為,中文可以叫做持久化。下圖為數(shù)據(jù)結構。所有對數(shù)據(jù)的操作必須通過迭代器完成。迭代器會移動到需要的數(shù)據(jù)對象上。相關文章和視頻推薦許曉笛數(shù)據(jù)庫與持久化實戰(zhàn)圓方圓學院匯集大批區(qū)塊鏈名師,打造精品的區(qū)塊鏈技術課程。 EOS 數(shù)據(jù)庫結構詳解 在 EOS 中,智能合約執(zhí)行完畢后,所占用的內存會釋放。程序中的所有變量都會丟失。如果智能合約里要持久地記錄信息,比如游戲智能合約要記...
摘要:為了解決這個問題,采取了三步用戶賬戶自定義分級權限。用戶權限與智能合約之間的映射。圖中不難看出,權限是賬戶最高權限,可以執(zhí)行權限。如果沒有發(fā)現(xiàn)任何符合的映射,會直接檢查本次執(zhí)行是否滿足了權限,若不足,會檢查。 到底什么叫智能合約? 名詞解釋:本篇文章出現(xiàn)很多 Action 和 Active,Action (動作)為 EOS 中賬戶可以接受的動作,也就是別人可以對你做什么;Active ...
摘要:說點題外話如果你想提高英語的話,持有一點代幣吧,你會急于搞清楚白皮書在講什么,要是想短時間快速提高英語,持有大量代幣吧,別問我是怎么知道的。 最近發(fā)現(xiàn)很多人投資了EOS,卻并不關心 EOS 目前的開發(fā)進度和技術細節(jié),如果你投資了 EOS, 還有一定的技術基礎,那就更應該關心 EOS 的開發(fā)情況了,下面我們就從 EOS 的源代碼說起: Github 是目前最流行的源碼管理網(wǎng)站,無數(shù)明星項...
閱讀 2123·2023-04-25 14:56
閱讀 2440·2021-11-16 11:44
閱讀 2696·2021-09-22 15:00
閱讀 1902·2019-08-29 16:55
閱讀 2177·2019-08-29 14:04
閱讀 2305·2019-08-29 11:23
閱讀 3678·2019-08-26 10:46
閱讀 1907·2019-08-22 18:43