3-2直行-調(diào)用智能合約

之前說了轉(zhuǎn)賬交易

那么再談智能合約就簡單了許多。

智能合約有三種輸出方式

1.返回值

2.Storage

3.Notify、Log

其中Notify、Log方式不太容易觀測,他的應(yīng)用也并不是特別廣泛,官方文檔有一篇交易所對接,專門講notify的。

我們拋開這個不講。

針對智能合約的調(diào)用,我們設(shè)計了史稱智能合約三連的例子。

看這里

https://github.com/NewEconoLab/neo-thinsdk-cs

第一個例子

直接用api去查詢storage的當(dāng)前數(shù)據(jù)

var url = Helper.MakeRpcUrl(api, "getstorage", new MyJson.JsonNode_ValueString(scriptaddress), new MyJson.JsonNode_ValueString(key));

第二個例子

用api去invokescript 一段智能合約,invokescript相當(dāng)于智能合約的讀,他不會對區(qū)塊鏈上的數(shù)據(jù)產(chǎn)生影響,也就是不能

sb.EmitParamJson(new MyJson.JsonNode_Array());//參數(shù)倒序入

sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name"));//參數(shù)倒序入

ThinNeo.Hash160 shash = new ThinNeo.Hash160(nnc);

sb.EmitAppCall(shash);//nep5腳本

......

var url = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script));

var result = await Helper.HttpPost(url, postdata);

sb是ScriptBuilder專門用來拼合約的匯編工具,是的你沒聽錯,這是一個匯編工具,寫的好好的智能合約怎么跑出來匯編了。

因為invokescript就是執(zhí)行一段智能合約,我們調(diào)用Nep5的 name方法,就是拼出一個智能合約來調(diào)用另一個nep5合約。

我們所有的調(diào)用已發(fā)布的智能合約,都是拼一段智能合約去調(diào)用他。

合約并不需要發(fā)布,是的,合約并不需要發(fā)布,你可以寫一個沒參數(shù)的智能合約,再編譯出avm文件,再把他invokescript,不用發(fā)布。

但是不發(fā)布的合約也就沒地方存東西,通常我們都是去調(diào)用一個已經(jīng)發(fā)布的合約。

因為這個調(diào)用合約很簡單,通常都是用匯編工具直接搞定了,所以你需要了解一下我們這個匯編工具的套路。

其實很簡單,看例子應(yīng)該能懂。

第三個例子

和轉(zhuǎn)賬一樣發(fā)了一筆nep5轉(zhuǎn)賬交易,但是多了一些看起來像invokescript的部分

emitParamJson 我們加了一些套路,把參數(shù)類型也拼進了字符串里

(address)后面的數(shù)據(jù)當(dāng)一個地址處理

(string)后面的數(shù)據(jù)當(dāng)字符串處理

(integer)后面的數(shù)據(jù)當(dāng)整數(shù)處理

(bytes)后面的數(shù)據(jù)當(dāng)hexstring處理

(hex160)后面的數(shù)據(jù)當(dāng)hex160處理(和hexstring反序,neo的ScriptHash都是這種)

(hex256)后面的數(shù)據(jù)當(dāng)hex256處理(和hexstring反序,neo的TXID、AssetID都是這種)


????????????MyJson.JsonNode_Array JAParams = new MyJson.JsonNode_Array();

????????????JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + address));

? ? ? ? ? ? JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + toaddr));

? ? ? ? ? ? JAParams.Add(new MyJson.JsonNode_ValueString("(integer)" + 1));

? ? ? ? ? ? sb.EmitParamJson(JAParams);//Parameter list

? ? ? ? ? ? sb.EmitPushString("transfer");//Method

? ? ? ? ? ? sb.EmitAppCall(scriptaddress);? //Asset contract

。。。

????????????ThinNeo.Transaction tran = Helper.makeTran(dir[id_GAS], targeraddr, new ThinNeo.Hash256(id_GAS), decimal.Zero);

? ? ? ? ? ? tran.type = ThinNeo.TransactionType.InvocationTransaction;

????????????ThinNeo.InvokeTransData extdata = new ThinNeo.InvokeTransData();

? ? ? ? ? ? extdata.script = sb.ToArray();

? ? ? ? ? ? extdata.gas = 1;

? ? ? ? ? ? tran.extdata = extdata;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容