成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

智能合約之 eosio.cdt 我們需要知道的那些事

zhigoo / 1227人閱讀

摘要:宏命令被移除,不能直接用去聲明一個要用去實例化一個對象,也將一些針對的函數(shù)整合進了。重構(gòu)了,修改成構(gòu)造函數(shù)增加和參數(shù)。

eosio.cdt 在 1.2.x 和 1.3.x 的改動比較大, 雖然虛擬機是向后兼容的, 但是為了避免意外情況, 我們都會將陸續(xù)將合約代碼升級。下面來介紹一下大致的改動。

# 安裝 eosio.cdt, 因為 llvm 庫比較大, 所以執(zhí)行 clone 的時候比較慢
$ git clone https://github.com/EOSIO/eosio.cdt.git
$ git submodule update --init --recursive
$ ./build.sh
$ sudo ./install.sh
1.2.x 和 1.3.x 的區(qū)別 eoslib C API

uint64_t 別名 account_name, permission_name, scope_name, table_name, action_name 全部移除, 新增 typedef capi_name uint64_t
symbol_name 別名移除,用 symbol_code 代替
移除 time , weight_type typedefs
移除 transaction_id_type, block_id_type typedefs
checksum160 -> capi_checksum160, checksum256 -> capi_checksum256, checksum512 -> capi_checksum512, public_key -> capi_public_key, signature -> capi_signature
移除掉未實現(xiàn)的 api : require_write_lock 和 require_read_lock

eoslib C++ API

移除 bytes typedefs
移除文件 eosiolib/types.hpp
移除文件 eosiolib/optional.hpp, 用 std::optional 代替
移除 eosiolib/core_symbol.hpp 文件, 以后合約需要自行聲明 core_symbol
增加文件 eosiolib/name.hpp

eoslib/types.hpp

將 typedef eosio::extensions_types 移到 eosiolib/transaction.hpp
移除掉對 checksum struct 的 == 和 != 的重載
移除掉 API eosio::char_to_symbol, eosio::string_to_name, eosio::name_suffix, 都整合進了 name struct
移除掉宏命令 N(X), 重載運算符 ""_n ,例如 "foo"_n 或者 name("foo") 來轉(zhuǎn)換成 name struct 類型
將 eosio::name struct 的定義 和 ""_n 運算符 移至 eosiolib/name.hpp
ps: 讀者可以使用 #define N(X) name(#X) 來減少代碼的改動了哈。

eosiolib/name.hpp

移除name 顯式 隱式轉(zhuǎn)換成 uint64_t
添加 enum class eosio::name::raw : uint64_t 用于從 name struct 隱式轉(zhuǎn)換成 raw
添加 bool 類型轉(zhuǎn)換,會返回 name struct 轉(zhuǎn)化成 uint64_t 是否為 0
構(gòu)造函數(shù)都用 constexpr, 確保 name struct 實例化時,都會給 value 賦初值
添加新的 constexpr 方法 eosio::name::length, eosio::name::suffix
添加 name struct 的比較函數(shù)

eosiolib/symbol.hpp

移除 eosio::symbol_type strcut , 用 eosio::symbol class 代替
添加 eosio::symbol_code struct
移除掉 eosio::string_to_symbol, eosio::is_valid_symbol, eosio::symbol_name_length 方法,都整合進了 symbol_code struct
移除宏命令#define S(P,X) ::eosio::string_to_symbol(P,#X), 直接實例化 symbol class eg: symbol(symbol_code("SYS"), 4) or symbol("SYS", 4)
重構(gòu) eosio::extended_symbol struct

eosiolib/asset.hpp

構(gòu)造器現(xiàn)需要顯式傳入 quantity 和 symbol, 不再有默認(rèn)值

eosiolib/contract.hpp

Rename EOSIO_ABO to EOSIO_DISPATCH, 更加明確的表達該宏指令的作用
根據(jù) contract 的改動重構(gòu) EOSIO_DISPATCH

eosiolib/multi_index.hpp

索引不能直接用 name struct 需要使用 eosio::name::raw
multi_index code 不再使用 uint64_t, 使用 eosio::name

eosiolib/singleton.hpp

同 multi_index, 用 eosio::name 替代 uint64_t

eosiolib/action.hpp

添加 inline function: eosio::require_auth, eosio::has_auth, eosio::is_account
重構(gòu) eosio::permission_level, 用 eosio::name 替換 uint64_t
移除 宏命令 ACTION,整合到了 eosio.hpp
新增 action_wrapper struct, 它的出現(xiàn),讓我們對inline action 的使用更加便利化,相當(dāng)于把 inline action 封裝成一個 struct,直接實例化便可以發(fā)送一個 inline action, 下面會寫例子。

eosiolib/permission.hpp

修改 eosio::check_transaction_authorization 參數(shù)類型 std::set to std::set , 使得能和 eosio 的 public_key 兼容。
eosio::check_permission_authorization 參數(shù) account, permission 類型從 uint64_t 修改成 eosio::name

eosiolib/ignore.hpp

新增 ignore struct, 會讓ABI 生成對應(yīng)的類型, 但datastream 不會去序列化它
新增 ignore_wrapper, 方便其他合約調(diào)用聲明的 action。

下面我們挑些改動比較大的地方來說下。 1.移除 uint64_t 的多數(shù)別名,只留下了一個 capi_name。

其中最大的地方當(dāng)屬 去掉了 uint64_t 的別名,需要用 name struct 來代替, 不應(yīng)該用新的別名 capi_name。 不說了,筆者改代碼改到想哭了。但為什么要做這個改動呢, 目前對于 account_name 等所使用的都是 implicit, 這意味著可能有一些 bad implicit。
Eg:

//@abi action
void hi(){
  name acc = name{10};
  print(acc==10);
}

我本意是要判斷 兩個 name struct 是否相等, 但是隱式轉(zhuǎn)換使我直接比較整數(shù) 10 也能返回 true。
所以重構(gòu)了 name struct,消除了這種風(fēng)險。
這次的改動也變得比較偏面向?qū)ο笏季S, 像 eosio::char_to_symbol, eosio::string_to_name, eosio::name_suffix 都被整合進了 name struct 里面。
symbol 和 symbol_code 也被重構(gòu)了。宏命令 S 被移除,不能直接用 S(4, SYS) 去聲明一個 token symbol, 要用 symbol(symbol_code("SYS"), 4) or symbol("SYS", 4)去實例化一個symbol 對象, 也將一些針對 symbol 的函數(shù)整合進了 class。

2.重構(gòu)了contract.hpp , EOSIO_ABI 修改成 EOSIO_DISPATCH
contract( name receiver, name code, datastream ds ):_self(receiver),_code(code),_ds(ds) {}

構(gòu)造函數(shù)增加 code 和 ds 參數(shù)。增加 ds 參數(shù)是為了方便我們手動解析數(shù)據(jù)。 這跟后面要說到的 ignore struct 有比較大的關(guān)系。
這種改動也意味著我們重寫 apply 的方式要改動.
Eg:

extern "C" {
  void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
    auto self = receiver;
    // 攔截 失敗的 deferred_trx
    if( code == "eosio"_n.value && action == "onerror"_n.value ) {
      const auto act_data = unpack_action_data();
      auto sender = uint64_t( act_data.sender_id >> 64);
      if( sender == self){
        test bos(eosio::name(receiver), eosio::name(code),datastream(nullptr, 0));
        bos.resend( act_data.unpack_sent_trx(), uint64_t( act_data.sender_id) );
      }
    // 攔截 eosio.token 的 EOS 轉(zhuǎn)賬操作
    } else if ( code == "eosio.token"_n.value ){
      test bos(eosio::name(receiver), eosio::name(code),datastream(nullptr, 0));
      const auto t = unpack_action_data();
      if(t.from.value != self && t.to.value == self){
        bos._transfer(t.from, t.to, t.quantity, t.memo);   
      }
    }else if ( code == self || action == "onerror"_n.value ) {
      switch( action ) {
        EOSIO_DISPATCH_HELPER( test, (hi))
      }
    }
  }
}
3. ignore struct , ignore_wrapper 和 action_wrapper 的使用

在 action 的參數(shù)加上 ignore struct, 會告訴虛擬機,不要解析此數(shù)據(jù), 讓自己手動解析。
使用 action_wrapper 把 hello:hi action 包裝起來。
使用inline action 時,用 ignore_wrapper 表明該參數(shù)是一個 ignore 類型。
Eg:

#include 
#include
using namespace eosio;

CONTRACT hello : public eosio::contract {
 public:
   using contract::contract;

   ACTION hi( name user, ignore, ignore) {
     print_f( "Hello % from hello", user );

     // 讀取 ignore 數(shù)據(jù)。
     uint64_t test;
     _ds >> test;
     printui(test);
     std::string str;
     _ds >> str;
     prints_l(str.c_str(),str.size());
   }

   // 用 action_wrapper , 把 hello::hi action 包裝起來
   using hi_action = action_wrapper<"hi"_n, &hello::hi>;

   ACTION inlineaction( name user, name inlinecode ){
     print_f( "Hello % from send_inline", user );
     // constructor takes two arguments (the code the contract is deployed on and the set of permissions)
     // 實例化 hi_action, 并進行調(diào)用。
     // inlinecode 參數(shù)及對應(yīng)的 hi action 的合約賬號。
     hello::hi_action hi(inlinecode, {_self, "active"_n});
     hi.send(user,ignore_wrapper(22),ignore_wrapper("asdfa"));
   }

};

EOSIO_DISPATCH( hello, (hi)(inlineaction) )

結(jié)論:兩個版本的主要改動是消除隱式轉(zhuǎn)換的風(fēng)險。 也重構(gòu)了一些模塊的代碼, 變得更加直觀。 新增了 action_wrapper struct, 使得 inline action 的使用更加方便快捷。

轉(zhuǎn)載請注明來源:https://eos.live/detail/17811

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24449.html

相關(guān)文章

  • 如何安裝EOS智能合約開發(fā)工具包CDT

    摘要:本文簡單的介紹一下如何安裝智能合約開發(fā)工具包,簡稱,是與智能合約編制相關(guān)的工具集合。對于初學(xué)者來說,可以通過使用來編譯智能合約和生成。 本文簡單的介紹一下如何安裝EOS智能合約開發(fā)工具包(Contract Development Toolkit),簡稱CDT,是與智能合約編制相關(guān)的工具集合。對于EOSIO初學(xué)者來說,可以通過使用CDT來編譯智能合約和生成ABI。 從1.3.x開始,CD...

    lx1036 評論0 收藏0
  • EOS DApp開發(fā)入門(二): 智能合約探究

    摘要:在看啟動腳本輸出的時候,發(fā)現(xiàn)了這兩樣輸出設(shè)置和智能合約,以及安裝合約開發(fā)工具。合約開發(fā)工具是的工具鏈和一組工具,用于促進平臺的合同編寫。系統(tǒng)智能合約,可以進行很多系統(tǒng)級別的操作,比如用戶投票將用戶注冊成為生產(chǎn)者。 Previously 在EOS DApp開發(fā)入門(一)中,通過docker image的方式架起了本地的eos區(qū)塊鏈,使Note chain DApp與本地區(qū)塊鏈進行交互,成...

    Honwhy 評論0 收藏0
  • 使用docker compose在EOS本地Testnet上開發(fā)

    摘要:為本地配置的錢包。以太坊,主要是針對工程師使用進行區(qū)塊鏈以太坊開發(fā)的詳解。以太坊,主要是介紹使用進行智能合約開發(fā)交互,進行賬號創(chuàng)建交易轉(zhuǎn)賬代幣開發(fā)以及過濾器和交易等內(nèi)容。這里是如何使用和在本地上開發(fā) EOS區(qū)塊鏈的開發(fā)并不是立竿見影的,因為需要一些非顯而易見的組件,需要對它們進行配置和協(xié)同工作。 nodeos:塊生成器守護程序。 keosd:錢包守護進程,存儲私鑰。 eosio-cp...

    cod7ce 評論0 收藏0
  • EOS開發(fā)中數(shù)據(jù)持久性問題(上)

    摘要:需要對構(gòu)造函數(shù)進行命名和配置,以使用我們之前定義的結(jié)構(gòu)。我們的構(gòu)造函數(shù)傳遞的范圍參數(shù)是正在部署合約的區(qū)塊鏈上的帳戶。此方法接受兩個參數(shù),即此記錄的范圍和回調(diào)函數(shù)。回調(diào)函數(shù)用于處理表的修改。但是如果用戶想要完全刪除記錄呢請看的數(shù)據(jù)持久性下。 本教程假定你已經(jīng)完成了EOS開發(fā)從智能合約開始。 要了解數(shù)據(jù)持久性,請編寫一個簡單的智能合約,作為地址記錄。雖然這個用例由于各種原因而不太適合作為生...

    cikenerd 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<