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