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++ API
是C 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工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用React和EOS的各知識點完成一個便籤DApp的開發。
如果你希望學習以太坊,那下面的一些教程可以幫到你:
部落格原文在:這裡