美文网首页
3-2直行-调用智能合约

3-2直行-调用智能合约

作者: 疯光无线 | 来源:发表于2018-04-24 14:16 被阅读0次

    之前说了转账交易

    那么再谈智能合约就简单了许多。

    智能合约有三种输出方式

    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;

    相关文章

      网友评论

          本文标题:3-2直行-调用智能合约

          本文链接:https://www.haomeiwen.com/subject/dsyllftx.html