您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“EOS智能合約怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
隨著對EOS的所有興奮而來的,對于大多數(shù)希望參與其中的開發(fā)人員仍然充滿挑戰(zhàn)的領(lǐng)域是開始使用智能合約。新開發(fā)人員通常需要克服兩個障礙:獲取工具和設(shè)置,并了解如何編寫智能合約本身。
EOS智能合約是用C++編寫的,并編譯成Web Assembly。Dan Larimer選擇C++來利用其類型和模板系統(tǒng),這使得更安全的合約,并補充說,因為智能合約的運行時間很短,大多數(shù)內(nèi)存問題都會消失。
使用EOS的部分挑戰(zhàn)是設(shè)置本地區(qū)塊鏈。幸運的是,EOS為設(shè)置本地EOS環(huán)境提供了一些基礎(chǔ)。對于本指南,我們將使用EOSIO Dawn 3.0。
該指南的摘要可以壓縮為幾個關(guān)鍵命令:
$ git clone https://github.com/EOSIO/eos --recursive $ cd eos $ ./eosio_build.sh $ cd build && make install $ cd programs/nodeos $ ./nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin --access-control-allow-origin=*
安裝需要一些時間,但很簡單。一旦在本地啟動并運行本地EOS區(qū)塊鏈,就可以開始了工作了。在整個指南中,我們將引用一些實用程序,如cleos
和eosiocpp
。 你可以在eos/programs
文件夾中找到這些內(nèi)容。
在本教程中,我們將創(chuàng)建和部署分布式系統(tǒng)的“Hello World”:ping/pong。對于沒有經(jīng)驗的人,我們將向服務(wù)器發(fā)送一個“ping”命令,它將以“pong”響應。 智能合約由以下幾個部分組成:C++代碼,ABI(應用程序二進制接口)和基于C++代碼的WAST(Web程序集文本文件)。這是看起來像:
在我們完成工具環(huán)境設(shè)置之后,讓我們進入合約!要編寫ping智能合約,我們只需要一個實現(xiàn)一個操作的合約:ping。所有這些方法需要做的就是打印“Pong”作為響應。
在contract中創(chuàng)建一個名為ping的文件夾,并在ping/ping.cpp文件中創(chuàng)建一個文件:
#include <eosiolib/eosio.hpp> #include <eosiolib/print.hpp> class ping_contract : public eosio::contract { public: using eosio::contract::contract; void ping(account_name receiver) { eosio::print("Pong"); } }; EOSIO_ABI( ping_contract, (ping) )
這里有一個簡單的小例子,你可以測試,以便更熟悉。讓我們分解這里發(fā)生的事情:
我們包含一些定義來寫我們的合同。
我們創(chuàng)建了一個繼承自eos::contract的新合約類。
我們創(chuàng)建了一個打印“Pong”的方法。
最后一行是最近添加的宏,它通過基于我們傳遞給第二個參數(shù)的方法生成一個來節(jié)省我們維護自己的手寫ABI的工作量。
EOS塊生成器在執(zhí)行智能合約時不運行C++代碼,他們期望web-assembly。EOS提供了一個名為eosiocpp
的工具,用于將C++代碼轉(zhuǎn)換為Web Assembly Text。我們現(xiàn)在就這樣做eosiocpp -o ping.wast ping.cpp
。這一步將產(chǎn)生一些警告,但我們現(xiàn)在可以忽略這些警告。
接下來,我們需要應用程序二進制接口。基本上,你的智能合約的ABI將描述方法及其相應的簽名。由于我們在文件的末尾添加了EOSIO_ABI宏,而不手動編寫,我們可以使用以下命令生成它:eosiocpp -g ping.abi ping.cpp
。
此時,您的文件夾應如下所示:
├── ping.abi ├── ping.cpp └── ping.wast
現(xiàn)在我們擁有了智能合約所需的所有資源,讓我們來部署它。確保你有一個錢包創(chuàng)建了cleos wallet create
并確保它通過運行cleos wallet unlock
并在提示時鍵入你的錢包密碼來解鎖。我們將在另一個帳戶下部署我們的智能合約。
為此,我們需要創(chuàng)建一個新的密鑰對,讓我們通過運行:cleos create key
來實現(xiàn)。這將為你生成隨機的公鑰和私鑰。在本教程的其余部分中,請務(wù)必使用你剛剛收到的值替換文中的[public_key]/[private_key]。
將私鑰導入當前未鎖定的帳戶錢包:cleos wallet import [private_key]
,使用公鑰設(shè)置合約帳戶:cleos create account eosio ping.ctr [owner_key:public_key] [active_key:public_key]
。
將合約與新創(chuàng)建的帳戶鏈接,ping.ctr ../ping -p ping.ctr
。
一旦部署了新合約,就可以與它進行交互了!讓我們使用相同的密鑰創(chuàng)建一個測試人員帳戶來運行交易:cleos create account eosio tester [public_key] [public_key]
現(xiàn)在我們可以在命令行上測試它:
$ cleos push action ping.ctr ping '["tester"]' -p tester executed transaction: e89ebeaad8f3623e42d966f62d4d0adbf6a7412b6bb4d7be61f04a22d3cd485e 232 bytes 102400 cycles # ping.ctr <= ping.ctr::ping {"account":"tester"} >> Received ping
應該可以了!
這對我們的程序員來說是令人興奮的,但是大多數(shù)用戶都不會設(shè)置他們的命令行來與你的智能合約進行交互。因此,讓我們將這種互動帶到他們更熟悉的界面:他們的瀏覽器。
要從前端與EOS交互,我們將使用EOS.js. 由于我們在EOS支持上使用dawn3,我們需要確保在安裝時使用dawn3
分支:npm install eosjs @ dawn3。
我們從配置開始:
Eos = require('eosjs') eos = EOS.Localnet({ keyProvider: ['{replace_with_your_private_key}'], httpEndpoint: 'http://127.0.0.1:8888' })
配置完成后,我們必須指定一些細節(jié):
eos.contract('ping.ctr').then((contract) => { contract.ping("tester", { authorization: ['tester'] }).then((res) => { console.log(res) }) })
請注意ping.ctr
,它與我們之前部署的合約的名稱相匹配。一旦我們獲取了合約接口(或ABI),我們就可以與它進行交互,就好像它是本機Javascript一樣。合約返回一個promise,其中包含resolve函數(shù)中包含的交易詳細信息。這是從前端與我們的ping智能合約進行交互的核心思想。
“EOS智能合約怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。