之前说了转账交易
那么再谈智能合约就简单了许多。
智能合约有三种输出方式
1.返回值
2.Storage
3.Notify、Log
其中Notify、Log方式不太容易观测,他的应用也并不是特别广泛,官方文档有一篇交易所对接,专门讲notify的。
我们抛开这个不讲。
针对智能合约的调用,我们设计了史称智能合约三连的例子。
看这里
https://github.com/NewEconoLab/neo-thinsdk-cs
第一个例子
直接用api去查询storage的当前数据
var url = Helper.MakeRpcUrl(api, "getstorage", new MyJson.JsonNode_ValueString(scriptaddress), new MyJson.JsonNode_ValueString(key));
第二个例子
用api去invokescript 一段智能合约,invokescript相当于智能合约的读,他不会对区块链上的数据产生影响,也就是不能
sb.EmitParamJson(new MyJson.JsonNode_Array());//参数倒序入
sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name"));//参数倒序入
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就是执行一段智能合约,我们调用Nep5的 name方法,就是拼出一个智能合约来调用另一个nep5合约。
我们所有的调用已发布的智能合约,都是拼一段智能合约去调用他。
合约并不需要发布,是的,合约并不需要发布,你可以写一个没参数的智能合约,再编译出avm文件,再把他invokescript,不用发布。
但是不发布的合约也就没地方存东西,通常我们都是去调用一个已经发布的合约。
因为这个调用合约很简单,通常都是用汇编工具直接搞定了,所以你需要了解一下我们这个汇编工具的套路。
其实很简单,看例子应该能懂。
第三个例子
和转账一样发了一笔nep5转账交易,但是多了一些看起来像invokescript的部分
emitParamJson 我们加了一些套路,把参数类型也拼进了字符串里
(address)后面的数据当一个地址处理
(string)后面的数据当字符串处理
(integer)后面的数据当整数处理
(bytes)后面的数据当hexstring处理
(hex160)后面的数据当hex160处理(和hexstring反序,neo的ScriptHash都是这种)
(hex256)后面的数据当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;