您的位置:首頁>>區塊鏈

想開發區塊鏈應用,你被solidity拖后腿了嗎?

發布時間:2019-04-30 21:59:39  來源:互聯網    采編:即時新聞  背景:

 

  作為一個前端開發,我接觸智能合約開發已經快一年了,期間也開發了幾個智能合約應用,看過了一些以太坊合約代碼。

  在使用Solidity開發基于EVM的智能合約的過程中曾不可避免的踩過許多坑,因此當我得知迅雷鏈最近推出了支持C/C++開發基于WASM合約的時候,迫不及待的來上手嘗試了一番,期望能夠獲的比使用Solidity開發合約時更好的體驗。

  以下是我基于Catalyst的TRC3模板合約體驗及一些簡單的合約移植后代碼修改的流程,主要介紹一下曾經在使用Solidity時出現的問題,以及后來使用C/C++在WASM實現中的對比

  Dapp合約開發經歷

  我曾經使用Solidity寫過一個溯源存證類的合約,主要就是把用戶通過表單提交的一些信息,存入到區塊鏈上。最初按照傳統的方案實現,直接將數據庫表字段映射到合約里的結構體,然后調用合約方法存儲到Map里。

  如果大家有過相似的開發經歷的話,大都會遇到一個很直接的問題:stack too deep, try using fewer variables。如下面這段代碼:

  pragma solidity ^0.4.20;

  contract Test {

  struct Tstr {

  string a1;

  string a2;

  string a3;

  string a4;

  string a5;

  string a6;

  string a7;

  string a8;

  }

  mapping(uint => Tstr) public tmap;

  function test(string _a1, string _a2, string _a3, string _a4, string _a5, string _a6, string _a7, string _a8) public {

  Tstr memory tstr = Tstr(_a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8);

  tmap[0] = tstr;

  }

  }

  這個錯誤是由于EVM限制了棧最多能取到stack[15]就是從棧頂向下第16個棧元素的內容,這就導致了如果一個函數方法的入參、返回值、函數內參數的個數如果大于一定量的時候很可能會觸發這個錯誤,實際情況要根據opcode來分析。

  理論上來說如果合約業務邏輯復雜,總會有不可避免的情況會遇到上述問題。

  比如,理論上我們可以通過拆分合約邏輯,優化代碼結構來修復。但這就是一個典型的EVM限制開發的問題。 另外還有像EVM限制合約Bytecode大小不超過24K,Solidity無法在合約外返回變長數組、沒有迭代器來遍歷map,不支持原生string的操作等等這些問題。

  抱著這些使用Solidity過程中產生的疑惑和對WASM的期待,我們來看一下使用C/C++開發合約的過程。

  使用Catalyst

  首先我從迅雷鏈的Catalyst工具開始,因為目前為止想通過迅雷鏈部署WASM類型的合約,還只能通過官方提供的Catalyst做編譯測試。

  對Catalyst的使用這里不做過多介紹,因為其實整體和remix的使用體驗很貼近,只是編譯、部署和執行都是通過迅雷鏈測試環境實現的。

  而Catalyst里提供了一份WASM類型的模板合約,實現的是TRC3標準的token,也就是ERC20的token合約。接觸過區塊鏈的應該都知道這是以太坊的token通證發行標準,并且已經有很多基于Solidity的成熟的實現。

  我們以這里的C++實現的token合約模板來解析。

  結構

  可以看到模板里TRC3 token合約分為三個文件來實現,其中ITRC3.hpp定義了TRC3的必須要實現的方法,以及兩個事件;TRC3.hpp則繼承自ITRC3,并定義了一般token所需要的私有屬性,私有方法(transfer,approve),并實現了接口類的方法; TRC3.cpp則是通過thunderchain_main初始化了TRC3的合約實例,定義了一系列ACTION提供對外調用的邏輯入口,并調用TRC3對應方法實現最終函數。

  使用TC宏

  每個文件里都引用了 tcapi.h 頭文件,這應該是迅雷鏈為WASM合約開發提供的一個工具函數庫,比如合約里使用到的address 類型定義、TCStorage的操作,TCnotify事件操作等,這些api都是可以通過迅雷鏈的文檔查到的,鏈接https://open.onethingcloud.com/site/wasm.htm

  這一段自定義了范型參數的類TCMap,實現私有屬性 _balances 和 _allowed

  // Mapping from address to balance

  TCMap

  // Mapping from spender to approvals

  TCMap_allowed{"allowed_"};

  另外合約事件的宏定義及參數的傳遞如下

  #define EMIT(eventID, arg1, arg2, arg3) {

  void *jsroot = TC_JsonNewObject();

  TC_JsonPutString(jsroot, #arg1, arg1);

  TC_JsonPutString(jsroot, #arg2, arg2);

  TC_JsonPutString(jsroot, #arg3, arg3);

  TC_Notify(_transferEventID, TC_JsonToString(jsroot));

  }

  使用TC_Json相關Api可以輕松實現json數據,然后通過事件將json string觸發。

  其他transfer的常規實現利用C++以及迅雷鏈提供的一些Api,可以說基本照搬Solidity中對ERC20合約的實現即可。

  ACTION

  從TRC3.cpp合約的實現來看,所有的合約需要有一個名為thunderchainmain的主函數入口,并且通過ACTION case來路由對應的方法調用。thunderchainmain的參數只有兩個,就是要執行的方法action名稱,以及執行方法的參數json。 因為這里將所有的參數都轉為json形式傳入,并且WASM對棧的使用無限制,所以不會出現像EVM一樣的stack too deep的問題。

  但是這種方法路由的實現方式也是有一些弊端:比如合約調用方必須準確匹配要調用的合約名稱,以及參數的名稱(json參數取值根據參數名獲取),否則就會執行到默認action。

  基于上述方式的合約方法調用以及查詢,是將交易data按照|的形式,action與args以"|"分割,這種實現相比于Solidity基于ABI編碼參數和解碼返回值,更加直接。

  對比

  通過對比使用C/C++開發合約的過程,現在對這種實現有了一些簡單的認識。

  從開發的角度來看,WASM虛擬機更多的意義在于帶來了一種常見語言(以后也許能支持更多語言)支持合約的開發,使開發者有了一定的可選擇性。

  而C/C++作為更成熟的語言,大部分的開發者會有一定的開發基礎。

  編寫的便利性得到提升,安全性也有一定的保障。

  還有一個比較好的地方體現在,隨著越來越多的人加入,工具庫和合約被開發和復用,合約的開發也將會更加便捷高效。

  也歡迎使用迅雷鏈開發的人多跟我溝通和交流。




關注ITBear科技資訊公眾號(itbear365 ),每天推送你感興趣的科技內容。

特別提醒:本網內容轉載自其他媒體,目的在于傳遞更多信息,并不代表本網贊同其觀點。其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,并請自行核實相關內容。本站不承擔此類作品侵權行為的直接責任及連帶責任。如若本網有任何內容侵犯您的權益,請及時聯系我們,本站將會在24小時內處理完畢。


返回網站首頁 本文來源:互聯網

本文評論
迅雷鏈率先支持雙虛擬機 推動區塊鏈行業發展
迅雷鏈正在推出更加強大的開發環境,以降低程序員們學習和進行區塊鏈開發的門檻,從而加速更多區塊...
日期:04-30
共識更高效,BOSCore讓LIB進入秒級時代
以比特幣、以太坊為代表的公鏈項目向我們展示了區塊鏈的巨大發展前景,可由于區塊鏈本身技術特點,...
日期:04-15
區塊鏈大規模普及: 驟變前夜-RedFox Labs采訪實錄
大規模普及?目前短期內仍然難以實現
  英國金融市場行為監管局(Financial Conduct Authority...
日期:04-12
迅雷鏈落地應用案例盤點   解鎖區塊鏈技術打開方式
區塊鏈正在“入侵”你的日常生活。
超市里里的生鮮、大米多了一個溯源二維碼;互助保險產...
日期:04-02
卞農談蘇寧大快消供應鏈:萬物皆可“盤”
“我想問一個問題,何處樓臺先得月?”
日期:03-19
EOS Fund創始人:區塊鏈在航空安全的應用
近日,EOS Fund創始人,知名區塊鏈技術專家Sean D. Murray接受科帝客采訪時,論述了區塊鏈技術在航...
日期:03-19
首部區塊鏈游戲開發者紀錄片《我是游戲開發者》即將上線
相較于2018年,2019年春的區塊鏈行業要冷靜許多。
日期:03-08
迅雷業績持續增長 區塊鏈讓共享計算更具商業價值
日前,迅雷發布了2018年Q4季度和全年財報,數據顯示,去年Q4季度,迅雷營收為4,230萬美元。2018年迅...
日期:03-08
網心科技中標國企聯盟鏈項目 迅雷區塊鏈應用邊界再擴展
3月4日,互鏈脈搏觀察到中國招標投標公共服務平臺上,發布了一則國企采購區塊鏈項目的中標公告。
日期:03-05
 
北京pk10开奖记录