溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

EOS智能合約怎么實現(xiàn)

發(fā)布時間:2021-12-29 14:07:35 來源:億速云 閱讀:159 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(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ū)塊鏈,就可以開始了工作了。在整個指南中,我們將引用一些實用程序,如cleoseosiocpp。 你可以在eos/programs文件夾中找到這些內(nèi)容。

建立ping智能合約

在本教程中,我們將創(chuàng)建和部署分布式系統(tǒng)的“Hello World”:ping/pong。對于沒有經(jīng)驗的人,我們將向服務(wù)器發(fā)送一個“ping”命令,它將以“pong”響應。 智能合約由以下幾個部分組成:C++代碼,ABI(應用程序二進制接口)和基于C++代碼的WAST(Web程序集文本文件)。這是看起來像:

EOS智能合約怎么實現(xiàn)

實現(xiàn)ping

在我們完成工具環(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的工作量。

構(gòu)建合約

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

部署到本地網(wǎng)絡(luò)

現(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。

與ping交互

一旦部署了新合約,就可以與它進行交互了!讓我們使用相同的密鑰創(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ì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

eos
AI