之前說了轉(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;