EOS的基礎知識(二)開發簡單的合約

2021-08-22 07:07:45 字數 3209 閱讀 9292

本教程預設你已經安裝了 eosio ,並且已經生成了 nodeos、cleos 工具。

part1·啟動乙個私鏈

你可以使用下面命令執行單節點網路:

該命令設定了許多標誌並載入了一些可選的外掛程式,我們將在本教程的其餘部分中使用這些外掛程式。假設一切正常,你應該每0.5秒看到乙個區塊生成訊息。

part2·建立乙個錢包

錢包是乙個可授權對區塊鏈執行操作的私鑰庫。這些秘鑰加密後儲存在磁碟上,加密密碼是隨機生成的高強度密碼,建議把這個密碼儲存在安全的密碼管理器中。

為了實現這個簡單的開發環境,你的錢包由本地節點配置的 eosio::wallet_api_plugin 管理,這個外掛程式在我們啟動 nodeos 時自動啟用。無論任何時候你重新啟動 nodeos ,在你使用金鑰之前,你必須要解鎖你的錢包。

在命令列中直接使用密碼通常是不安全的,它會被記錄到你的 bash 歷史記錄中。因此你也可以在互動模式下解鎖:

出於安全考慮,通常最好在不使用錢包時鎖定錢包。要鎖定你的錢包而不關閉 nodeos ,你可以這樣做:

本教程的其餘部分需要你解鎖錢包後執行。所有新的區塊鏈都是以唯一初始帳戶 eosio 的私鑰開始。為了與區塊鏈互動,你需要將此初始帳戶的金鑰匯入錢包。將 eosio 帳戶的私鑰匯入你的錢包

part3·載入 bios 合約

現在我們有乙個帶有 eosio 使用者私鑰的錢包,我們可以設定預設的系統合約。為了開發的目的,預設可以使用 eosio.bios 合約。此合約使你可以直接控制其他帳戶的資源分配並訪問其他特權 api 。在公鏈中,該合同將管理 token 的 staking 和 unstaking ,為合約預留 cpu 、網路活動和記憶體資源。

智慧型合約 eosio.bios 在 eosio 源**的 contracts 資料夾裡。cleos 指令預設是在 eosio 原始碼根目錄中執行,但可以通過指定 $/contracts/eosio.bios 的全路徑從任意位置來執行。

cleos 用兩個 action 產生乙個交易, eosio::setcode 和eosio::setabi

**定義了合約如何執行,abi 描述了如何在 binary 和引數的 json 描述檔案之間轉換。雖然 abi 檔案是可選的,但是所有的 eosio 工具都依賴於它以便於使用。

無論何時,你執行乙個交易都會看到如下輸出:

這可以理解為:由 eosio 所定義的 action 'setcode' 被 eosio 合約以引數 執行。

正如我們稍後會看到的,actions 可以被多個合約所處理。這次呼叫的最後乙個引數是 -p eosio ,這個引數告訴 cleos 使用我們之前匯入的 active 許可權私鑰來簽名這個 action。

part4·建立乙個賬戶

現在我們已經建立了基礎系統合約,我們可以開始建立自己的賬戶。

為此,我們首先為該帳戶生成一對金鑰。

然後我們將私鑰匯入我們的錢包:

金鑰不會自動新增到錢包,因此跳過此步驟可能會導致你對你的帳戶失去控制權。

part5·建立兩個使用者賬號

因為我們正在使用 eosio::account_history_api_plugin ,所以我們能夠查詢所有由我們的金鑰控制的賬戶:

part6·建立token合約

在這個階段,區塊鏈還不能做很多事,讓我們來部署 eosio.token 合約。該合約允許建立許多不同的 token,這些 token 都執行在同乙個合約上,但可能由不同的使用者管理。

首先需要建立乙個賬戶來部署這個合約。

接下來就可以開始部署了(合約**位於 $/contracts/eosio.token )

part7·建立eos token

你可以在 contracts/eosio.token/eosio.token.hpp 標頭檔案中檢視定義 eosio.token 合約的介面:

要建立乙個新的 token,我們必須用合適的引數來呼叫 create(...) action。該命令將使用最大的符號,用來從其他 token 中,唯一地鑑別這個 token。發行人將有權要求發行和執行其他 action,例如凍結,召回以及將所有者列入白名單。

根據引數位置來呼叫這個方法:

也可以使用引數名鍵值對來呼叫:

該命令建立了乙個名為 eos 的新的 token,其精密度為 4 位數,最大**量為 1000000000.0000 eos。

為了建立這個 token,我們需要獲得 eosio.token 合約的許可,因為它「擁有」符號(比如 eos)的命名空間。該合約的未來版本可能允許其他地方自動購買符號名稱。當前我們必須通過 -p eosio.token 在此授權。

part8·發行tokens 給使用者

現在我們已經建立了 token,發行者可以用我們之前建立的 user 賬戶發行新的 token。我們根據引數位置來呼叫 issue 這個 action。

這次輸出包含著幾個不同的 action, issue 和 3 次轉賬。儘管我們僅僅執行了 issue這個 action,但是 issue action 預設執行了 "inline transfer","inline transfer" 通知了發件人和收件人帳戶。輸出指明所有被呼叫的 action 處理程式、被呼叫的順序,以及是否生成任何輸出。

從技術上說,eosio.token 合約可以跳過 inline transfer 並選擇直接修改餘額,但在這種情況下,eosio.token 合約遵循我們的 token 約定,該約定要求所有賬戶餘額可以通過他們傳輸 actions 的總和推論出來。它還要求通知資金的傳送者和收款人,以便他們能夠自動處理存款和提款。

如果你想要看到廣播的實際交易,你可以使用 -d -j 選項來表示 "don't broadcast" 和 "return transaction as json".

part9·轉移 tokens 到 tester

現在 user 賬戶有一些 token, 我們將會把他們轉移到賬戶 tester 並使用許可權 -p user。

part10·hello world 合約

hello/hello.cpp

然後你可以像這樣將它編譯成 web assembly(.wast):

接著你可以生成 abi:

現在我們可以執行合約:

這時合約允許任何人授權,我們也可以這樣:

這時 tester 是授權者,user 只是乙個引數。如果想要合約對使用者進行身份認證,那麼我們可以修改下 hi() 方法:

現在,使用者(對應下文的 tester )和授權者(對應下文的 user )不匹配,那麼合同會丟擲乙個錯誤

我們可以通過授予 tester 許可權來解決此問題

part11·部署 exchange 合約

Docker 的簡單基礎知識

搜尋映象 到docker hub上查 docker search 映象名 拉取映象 docker pull 映象名 版本號 不寫版本號,預設最新 刪除映象 docker rmi image id docker rmi repository tag docker rmidocker images q全...

PHP的基礎知識(二)

首先來區別一下下面兩種字串 echo hello world echo hello world 注意 這裡第一條是乙個字串,第二條是兩個字串 這裡用strpos 命令 用法 strpos 要操作的字串,要查詢的字元 返回查詢字元的位置 str hello world echo strpos str,...

EOS 智慧型合約開發實踐(一)EOS錢包的簡單使用

eos,全稱enterprise operation system,即商用分布式作業系統。eos是一種全新的區塊鏈架構,旨在實現分布式應用的效能擴充套件。注意,它並不是像位元幣和以太坊那樣的貨幣,而是基於eos軟體專案之上發布的代幣,被稱為區塊鏈3.0。2.eos通過並行鏈和dpos的方式解決了延遲...