1. 程式人生 > >EOS 智慧合約如何除錯?

EOS 智慧合約如何除錯?

為了能夠除錯智慧合約,需要配置本地節點。這個本地節點可以作為單獨的私有鏈或公有鏈的擴充套件來執行。這個本地節點還需要執行在合約控制檯選項上,或者通過命令列 加引數--contracts-console,或者通過config.ini設定contracts-console = true

當第一次建立智慧合約時,建議首先在私有鏈上測試和除錯智慧合約,因為你完全控制整個區塊鏈。這使你可以擁有無限量的EOS幣,並且可以隨時重置區塊鏈的狀態。當它已經完全準備好,並打算正式上線時,可以通過將本地nodeos連線到公有testnet鏈(或官方測試鏈testnet)來完成對公有testnet鏈(或官方測試鏈testnet)的除錯,這樣就可以在本地nodeos

中檢視測試鏈的日誌。

理解了這個意思的話,對於下面的內容,就使用私有鏈進行除錯。

如果你沒有配置好自己的本地nodeos,請參考eos開發環境安裝。預設情況下,本地nodeos將只執行在私有鏈中,除非你修改配置檔案config.ini以與公有testnet鏈(或官方測試鏈testnet)的節點連線,如這裡中所述。

方法

除錯智慧合約的主要方法是Caveman Debugging,我們利用列印功能來檢查變數的值並檢查合約的流程。智慧合約中的列印可以通過Print C API(C和C++)來完成。C++ APIC API的封裝包,所以我們通常只使用C++ API

列印

Print C API

支援的可以列印的資料型別如下:

  • prints:空終止字元陣列(字串)
  • prints_l:給定大小的任意字元陣列(字串)
  • printi:64位無符號整數
  • printi128:128位無符號整數
  • printd:雙重編碼為64位無符號整數
  • printn:編碼為64位無符號整數的base32字串
  • printhex:二進位制資料及其大小給定為十六進位制

雖然Print C++ API通過過載print()函式來封裝一些上面的C API,所以使用者不需要確定自己使用的特定的print函式Print C++ API支援:

  • 空終止字元陣列(字串)
  • 整數(128位無符號,64位無符號,32位無符號,有符號,無符號)
  • 編碼為64位無符號整數的Base32字串
  • 具有print()的結構體型別

例子

讓我們以一個新的合約作為示例進行除錯。

debug.hpp

C++

#include <eoslib/eos.hpp>
#include <eoslib/db.hpp>

namespace debug {
    struct foo {
        account_name from;
        account_name to;
        uint64_t amount;
        void print() const {
            eosio::print("Foo from ", eosio::name(from), " to ",eosio::name(to), " with amount ", amount, "\n");
        }
    };
}

debug.cpp

C++

#include <debug.hpp>

extern "C" {

    void apply( uint64_t code, uint64_t action ) {
        if (code == N(debug)) {
            eosio::print("Code is debug\n");
            if (action == N(foo)) {
                 eosio::print("Action is foo\n");
                debug::foo f = eosio::current_message<debug::foo>();
                if (f.amount >= 100) {
                    eosio::print("Amount is larger or equal than 100\n");
                } else {
                    eosio::print("Amount is smaller than 100\n");
                    eosio::print("Increase amount by 10\n");
                    f.amount += 10;
                    eosio::print(f);
                }
            }
        }
    }
} // extern "C"

debug.hpp

C++

{
  "structs": [{
      "name": "foo",
      "base": "",
      "fields": {
        "from": "account_name",
        "to": "account_name",
        "amount": "uint64"
      }
    }
  ],
  "actions": [{
      "action_name": "foo",
      "type": "foo"
    }
  ]
}

讓我們部署完成後傳送一個訊息給它。假設你已經建立了除錯帳戶並在錢包中有它的金鑰。

$ eosiocpp -o debug.wast debug.cpp
$ cleos set contract debug debug.wast debug.abi
$ cleos push message debug foo '{"from":"inita", "to":"initb", "amount":10}' --scope debug

當你檢查本地節點日誌時,在傳送上述訊息後,將看到以下幾行:

Code is debug
Action is foo
Amount is smaller than 100
Increase amount by 10
Foo from inita to initb with amount 20

在那裡,可以確認你的訊息將進入正確的控制流,並且正確地更新該值。你可能會看到上述訊息至少2次,這是正常的,因為每個交易都在驗證、塊生成和區塊鏈應用中用到。

另:《EOS智慧合約與DApp開發入門》教程已經上線,愛學習等不及的可以抓緊體驗一下:

分享一個EOS智慧合約與DApp開發入門教程,歡迎大家來學習互動:

EOS教程

本教程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用React和EOS的各知識點完成一個便籤DApp的開發。

如果你希望學習以太坊,那下面的一些教程可以幫到你:

  • web3j教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
  • 以太坊教程,主要介紹智慧合約與dapp應用開發,適合入門。
  • 以太坊開發,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和事件等內容。

部落格原文在:這裡