BSN智能合約開發(fā)培訓-XuperChain(四)

百度超級鏈XuperChain是一個支持多語言合約的區(qū)塊鏈框架扰法,有多種語言來供大家選擇使用開發(fā)智能合約司训。目前超級鏈的智能合約可以使用C++ 或者 Go 語言來編寫刁岸,理論上任何可以編譯成Wasm字節(jié)碼的語言都可以用來編寫超級鏈的智能合約。C++ 合約相對Go合約性能會更好些果漾,go合約在易用性上更好球切,開發(fā)者可以根據(jù)需要選擇自己喜歡的語言來編寫智能合約,這篇文章會通過一步步的指引來幫助大家使用C++ 或者Go來編寫超級鏈的智能合約绒障。下面的內(nèi)容將按照步驟拆解吨凑,手把手教你如何順利完成智能合約的編寫,部署和測試户辱,耐心讀完本文相信你會對超級鏈智能合約建立完整認知鸵钝,快速get新技能。

1. 準備工作

1.1?環(huán)境要求

目前超級鏈節(jié)點主要運行在linux和mac上庐镐,windows不能運行超級鏈節(jié)點恩商。

1.?go >= 1.12.x && <= 1.13.x

2.?g++ >= 4.8.2 或者 clang++ >= 3.3

3.?Docker

1.2?下載編譯XuperChain

智能合約只有部署到鏈上才能運行,因此我們首先要編譯并啟動xuperchain節(jié)點必逆。

如果需要使用特定分支怠堪,使用git checkout來切換特定分支揽乱,如 git checkout v3.7

1.3?設置環(huán)境變量

這些環(huán)境變量有助于我們更方便的執(zhí)行一些命令而不用指定命令的全路徑。

1.4?啟動XuperChain

--vm ixvm參數(shù)是選擇ixvm合約虛擬機粟矿,開發(fā)合約過程中使用ixvm虛擬機能加快合約部署

1.5?創(chuàng)建合約賬號

合約賬號用來進行合約管理凰棉,比如合約的權(quán)限控制等,要部署合約必須創(chuàng)建合約賬號嚷炉,同時合約賬號里面需要有充足的xuper來部署合約渊啰。

創(chuàng)建合約賬號 XC1111111111111111@xuper

給合約賬號轉(zhuǎn)賬

$ ./xchain-cli transfer --to XC1111111111111111@xuper --amount 100000000

cd26657006f6f75f07bd53ad0a7fe74d76985cd592542d8cc87dc3fcdde115f5

1.6?小結(jié)

至此我們完成了所有的準備工作探橱,包括編譯XuperChain申屹,創(chuàng)建鏈,啟動節(jié)點隧膏,創(chuàng)建合約賬號哗讥,后面我們開始體驗怎么編譯,部署和調(diào)用智能合約胞枕。

2.?快速體驗

在開始編寫智能合約之前首先通過一個簡單的例子來給大家演示合約是如何從代碼到字節(jié)碼杆煞,以及如何部署到鏈上,如何發(fā)起對智能合約的調(diào)用腐泻。我們使用一個c++合約為例來展示如何編譯决乎、部署、調(diào)用合約派桩。

2.1?創(chuàng)建合約工程

xdev工具是隨XuperChain發(fā)布的一個合約編譯和測試工具构诚,在編譯完xuperchain之后生成在output目錄。

xdev提供了一個默認的c++合約工程模板

這個命令創(chuàng)建了一個hello-cpp的合約工程

2.2?編譯合約

第一次編譯的時間會長一點铆惑,因為xdev需要下載編譯器鏡像范嘱,以及編譯超級鏈的標準庫。

編譯結(jié)果為hello.wasm员魏,后面我們使用這個文件來部署合約

2.3?部署合約

此命令看起來很長丑蛤,但是其中很多參數(shù)都有默認值,我們先來看一下參數(shù)的含義:

? wasm deploy :此為部署wasm合約的命令參數(shù)撕阎,不做過多解釋

???--account XC1111111111111111@xuper:此為部署wasm合約的賬號(只有合約賬號才能進行合約的部署)

???--cname hello:這里的hello是指部署后在鏈上的合約名字受裹,可以自行命名(但有規(guī)則,長度在4~16字符)

??--runtime c 指明我們部署的是一個c++代碼編譯的合約虏束,如果是go合約這里填go即可棉饶。

??--fee 為我們部署這個合約所需要的xuper

??最后的hello.wasm是合約編譯好的文件

2.4?調(diào)用合約

參數(shù)解釋如下:

??wasm invoke 表示我們要調(diào)用一個合約

??--method hello 表示我們要調(diào)用合約的hello方法

??--fee 指明我們這次調(diào)用合約花費的xuper

??最后的參數(shù)指明我們調(diào)用的合約名字hello

2.5?小結(jié)

通過本節(jié)的學習,我們快速掌握了如果編譯魄眉,部署和調(diào)用合約砰盐,在下面的章節(jié)里面我們學些如果使用C++或者Go語言來編寫智能合約。

3.?合約編寫詳解

XuperChain目前主要支持兩種編譯成wasm格式的合約語言坑律,c++和go岩梳,合約框架的整體結(jié)構(gòu)是一致的囊骤,在不同語言上的表現(xiàn)形式不太一樣,但熟悉一種語言的SDK之后很容易遷移到其他語言冀值。

下面大概說明如何編寫這兩種類型的合約

3.1 C++合約

以counter合約為例來看如何編寫一個C++合約也物。

3.1.1?合約樣例

代碼在contractsdk/cpp/example/counter.cc

3.1.2?代碼解析

下面我們逐行解析合約代碼:

??#include <xchain/xchain.h>為必須的,里面包含了編寫合約所需要的庫列疗。

? struct Counter : public xchain::Contract {}; 聲明了我們的合約類滑蚯,所有的合約類都要繼承自xchain::Contract。

? DEFINE_METHOD(Counter, initialize) 我們通過DEFINE_METHOD來為合約類定義合約方法抵栈,在這個例子里面我們?yōu)镃ounter類定義了一個叫initialize的合約方法告材。

? xchain::Context* ctx = self.context();用來獲取合約的上下文,每個合約都有一個對應的合約執(zhí)行上下文古劲,通過上下文我們可以獲取合約參數(shù)斥赋,寫入合約數(shù)據(jù),context對象是我們經(jīng)常要操作的一個對象产艾。

? const std::string& creator = ctx->arg("creator");疤剑,用于從合約上下文里面獲取合約方法的參數(shù),這里我們獲取了名字叫creator的合約參數(shù)闷堡,合約的參數(shù)列表是一個map結(jié)構(gòu), key為合約參數(shù)的名字隘膘,value為參數(shù)對應的用戶傳遞的值。

? ctx->put_object("creator", creator); 通過合約上下文的put_object方法杠览,我們可以向鏈上寫入數(shù)據(jù)弯菊。

? ctx->ok("initialize succeed"); 用于返回合約的執(zhí)行結(jié)果,如果合約執(zhí)行失敗則調(diào)用ctx->error倦零。

通過上面的代碼分析我們得到了如下知識

??一個合約有多個方法組成误续,如counter合約的initialize,increase, get方法扫茅。

? initialize是每個合約必須實現(xiàn)的方法蹋嵌,這個合約方法會在部署合約的時候自動執(zhí)行。

??每個合約方法有一個Context對象葫隙,通過這個對象我們能獲取到很多有用的方法栽烂,如獲取用戶參數(shù)等。

??通過Context對象的ok或者error方法我們能給調(diào)用方反饋合約的執(zhí)行情況:成功或者失敗恋脚。

更多的c++語言合約例子在超級鏈項目的core/contractsdk/cpp/example里面尋找腺办。

3.2 Go合約

以counter合約為例來看如何編寫一個go合約。

3.2.1?合約樣例

代碼在contractsdk/go/example/counter/counter.go

go合約的整體框架結(jié)構(gòu)跟c++合約一樣糟描,在表現(xiàn)形式上稍微有點不一樣:

??c++合約使用DEFINE_METHOD來定義合約方法怀喉,go通過結(jié)構(gòu)體方法來定義合約方法

??c++通過ctx->ok來返回合約數(shù)據(jù),go通過返回code.Response對象來返回合約數(shù)據(jù)

? go合約需要在main函數(shù)里面調(diào)用driver.Serve來啟動合約船响。

更多的go語言合約例子在超級鏈項目的core/contractsdk/go/example里面尋找躬拢。

3.2.2?合約編譯

Go合約使用如下命令來編譯合約

3.2.3?合約部署

Go合約部署唯一跟c++合約不一樣的地方在于--runtime參數(shù)躲履,完整命令如下

Go合約的調(diào)用跟c++合約參數(shù)一致。

3.3?小結(jié)

在這個章節(jié)里面我們學習了如何使用c++和go語言來編寫合約聊闯,更多的合約例子可以在對應語言SDK的example目錄里面尋找工猜,在下一章節(jié)我們學習如果給合約編寫單元測試。

4.?合約單測

如果每次測試合約都需要部署到鏈上再發(fā)起調(diào)用會特別麻煩菱蔬,xdev工具提供了單測能力篷帅,可以脫離鏈上環(huán)境運行合約。

test目錄下放著合約測試文件拴泌,文件以 .test.js結(jié)尾魏身,可以有多個測試文件。以hello-cpp目錄下的test/hello.test.js為例弛针,文件內(nèi)容如下:

使用Test函數(shù)來定義測試case叠骑,hello為測試名字, 匿名js function作為測試的body李皇。全局對象xchain是我們跟xchain環(huán)境打交道的入口削茁,xchain.Deploy用來部署一個合約到xchain環(huán)境,返回的contract對象掉房,調(diào)用contract.Invoke方法即可調(diào)用合約茧跋。Deploy和Invoke方法都是通過拋出異常的方式來處理錯誤,測試框架會自動捕獲錯誤來結(jié)束測試case卓囚。t.Run可以定義子測試case瘾杭。

使用如下命令來啟動測試

5. VSCode編輯器集成

配置編譯和測試task

為了方便在vscode里面編譯和測試合約,在.vscode/tasks.json里面添加如下內(nèi)容

編譯合約

Run Build Task(??B)來啟動構(gòu)建

跑合約單測

調(diào)用Run Task命令之后哪亿,選擇xdev test來觸發(fā)單元測試

代碼補全

為了讓vscode幫我們自動補全代碼粥烁,需要做如下配置,在項目的.vscode/settings.json文件里面加上這一個配置

之后就能用vscode的自動補全功能了.

6.?開放網(wǎng)絡集成環(huán)境

超級鏈開放網(wǎng)絡是基于百度自研底層技術搭建的區(qū)塊鏈基礎服務網(wǎng)絡蝇棉,符合中國標準讨阻,超級節(jié)點遍布全國,區(qū)塊鏈網(wǎng)絡完全開放篡殷,為用戶提供區(qū)塊鏈快速部署和運行的環(huán)境钝吮,最低2元錢就用上的區(qū)塊鏈服務,讓信任鏈接更加便利板辽。

超級鏈開放網(wǎng)絡為開發(fā)者提供了合約開發(fā)奇瘦、編譯、部署劲弦、管理的一站式可視化集成環(huán)境耳标,下面介紹如何在開放網(wǎng)絡上開發(fā)部署智能合約。

6.1?賬戶注冊

1. 在超級鏈官網(wǎng)https://xchain.baidu.com/使用百度賬號登錄邑跪,如果沒有百度賬號請先注冊次坡。

2. 進入超級鏈開放網(wǎng)絡控制臺纲仍,第一次登錄的用戶,平臺會為用戶創(chuàng)建區(qū)塊鏈賬戶贸毕,請按照創(chuàng)建賬戶指引文檔完成安全碼設置郑叠,并記錄自己的助記詞和私鑰。

3.?????????

6.2?創(chuàng)建合約賬戶

1.?在工作臺明棍,選擇「開放網(wǎng)絡 —> 合約管理」乡革,點擊「創(chuàng)建合約賬戶」

2.?進入創(chuàng)建合約賬戶頁,輸入安全碼后點擊「確認創(chuàng)建」摊腋,系統(tǒng)自動生成賬戶名稱后沸版,即創(chuàng)建完畢

3.??????????

6.3?合約開發(fā)和部署

1.?在工作臺,選擇「開放網(wǎng)絡 —> 合約管理」兴蒸,點擊「創(chuàng)建智能合約」

2. 進入新頁面视粮,按要求填寫基本信息、編輯合約代碼橙凳,編譯成功后點擊「安裝」蕾殴,即可進入合約安裝(部署)流程。合約代碼編譯有兩種方式:

??模板合約岛啸;選擇模板后钓觉,只需在模板代碼中填寫相關參數(shù)即可(參考模板詳情完成參數(shù)填寫)

??自定義合約;在編輯器內(nèi)完成C++語言的合約編輯即可

?????????

3. 進入安裝流程坚踩,用戶需按合約代碼完成預執(zhí)行操作荡灾。點擊「開始驗證」,執(zhí)行通過會進入安裝確認頁

??模板合約瞬铸;系統(tǒng)會提供模板的函數(shù)批幌,只需填寫參數(shù)即可(可參考模板詳情)

??自定義合約;根據(jù)頁面操作說明嗓节,完成函數(shù)荧缘、參數(shù)填寫

? ??

4. 進入確認安裝頁,頁面顯示安裝合約預計消耗的余額赦政。點擊「安裝合約」將合約上鏈胜宇,上鏈過程需要等待10S左右。安裝完成后恢着,在合約管理列表中可看到合約狀態(tài)變更為‘安裝成功’桐愉,即該合約已完成安裝。

6.4?合約調(diào)用

目前開放網(wǎng)絡支持通過Go和Javascript兩種SDK調(diào)用智能合約掰派。

? Go SDK:

https://github.com/xuperchain/xuper-java-sdk

? Javascript SDK:

https://github.com/xuperchain/xuper-sdk-js

7.?結(jié)語

以上就是關于如何編寫超級鏈智能合約的錦囊秘籍从诲,可以助你從小白秒變資深區(qū)塊鏈開發(fā)者。百度超級鏈正在聯(lián)合BSN舉辦區(qū)塊鏈創(chuàng)新開發(fā)者大賽靡羡,現(xiàn)在基于百度超級鏈編寫智能合約將有機會獲得萬元大獎系洛,免費享受專業(yè)的區(qū)塊鏈開發(fā)培訓俊性,點擊閱讀原文速去報名吧!

來源:百度超級鏈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末描扯,一起剝皮案震驚了整個濱河市定页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绽诚,老刑警劉巖典徊,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恩够,居然都是意外死亡卒落,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門蜂桶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡毕,“玉大人,你說我怎么就攤上這事扑媚⊙澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵钦购,是天一觀的道長檐盟。 經(jīng)常有香客問我秤掌,道長惨撇,這世上最難降的妖魔是什么恤批? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮唱凯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谎痢。我一直安慰自己磕昼,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布节猿。 她就那樣靜靜地躺著票从,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滨嘱。 梳的紋絲不亂的頭發(fā)上峰鄙,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音太雨,去河邊找鬼吟榴。 笑死,一個胖子當著我的面吹牛囊扳,可吹牛的內(nèi)容都是我干的吩翻。 我是一名探鬼主播兜看,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狭瞎!你這毒婦竟也來了细移?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊锭,失蹤者是張志新(化名)和其女友劉穎葫哗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體球涛,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡劣针,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亿扁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺典。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖从祝,靈堂內(nèi)的尸體忽然破棺而出襟己,到底是詐尸還是另有隱情,我是刑警寧澤牍陌,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布擎浴,位于F島的核電站,受9級特大地震影響毒涧,放射性物質(zhì)發(fā)生泄漏贮预。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一契讲、第九天 我趴在偏房一處隱蔽的房頂上張望仿吞。 院中可真熱鬧,春花似錦捡偏、人聲如沸唤冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽你虹。三九已至,卻和暖如春彤避,著一層夾襖步出監(jiān)牢的瞬間傅物,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工忠藤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挟伙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像尖阔,于是被迫代替她去往敵國和親贮缅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容