invokefunction 方法
使用给定的操作和参数,通过合约脚本哈希调用智能合约之后返回结果。
note
- 此方法用于测试你的虚拟机脚本,调用时只是在 RPC 对应的节点试运行脚本并返回结果,不会对区块链数据产生影响。
- 此方法由插件提供,需要安装 RpcServer 插件才可以调用
#
参数说明scripthash:智能合约脚本哈希。
operation:操作名称(字符串)。
params:传递给智能合约操作的参数,可选。
signers: 签名账户列表,可选。
- account: 签名账户
- scopes: 签名的作用域,定义用户签名的可用范围,防止未经授权的合约随意使用用户签名。允许的值为:
- None:空,只对交易签名,不允许任何合约使用该签名
- CalledByEntry:只作用链式调用的入口,比如用户调用 A 合约,那么只有 A 合约可以使用签名,A 合约再调用 B 合约,在 B 合约中是不能使用用户签名的。建议作为钱包的默认签名作用。
- CustomContracts:自定义合约,在指定的合约中可以使用该签名。可与 CalledByEntry 配合使用。
- CustomGroups:自定义合约组,在指定的合约组中可以使用该签名。可与 CalledByEntry 配合使用。
- Global:全局。风险极高,合约有可能会转移地址中的所有资产,仅在极其信任该合约时选择。
- allowedcontracts: 如果 scopes 是 CustomContracts,该字段是签名生效的合约 Hash 列表
- allowedgroups: 如果 scopes 是 CustomGroups,该字段是签名生效的公钥列表。
note
你需要根据传入地址的数据类型,使用正确的字节序格式。如果数据类型为 Hash160,输入大端序 scripthash;如果数据类型为 ByteArray,则输入小端序 scripthash。
例如:
{ "type": "String", "value": "Hello"}
{ "type": "Hash160", "value": "0xf621168b1fce3a89c33a5f6bcf7e774b4657031c"}
{ "type": "ByteArray", "value": "7472616e73666572"}
#
调用示例请求正文:
{ "jsonrpc": "2.0", "id": 1, "method": "invokefunction", "params": [ "0xf61eebf573ea36593fd43aa150c055ad7906ab83", "transfer", [ { "type": "Hash160", "value": "0x86df72a6b4ab5335d506294f9ce993722253b6e2" }, { "type": "Hash160", "value": "0xebae4ab3f21765e5f604dfdd590fdf142cfb89fa" }, { "type": "Integer", "value": "10000" }, { "type": "String", "value": "" } ], [ { "account": "0x86df72a6b4ab5335d506294f9ce993722253b6e2", "scopes": "CalledByEntry", "allowedcontracts": [], "allowedgroups": [] } ] ]}
响应正文:
{ "jsonrpc": "2.0", "id": 1, "result": { "script": "DAABECcMFPqJ+ywU3w9Z3d8E9uVlF/KzSq7rDBTitlMicpPpnE8pBtU1U6u0pnLfhhTAHwwIdHJhbnNmZXIMFIOrBnmtVcBQoTrUP1k26nP16x72QWJ9W1I=", "state": "HALT", "gasconsumed": "9999720", "exception": null, "stack": [ { "type": "Boolean", "value": true } ], "tx": "AI3PBQRolZgAAAAAAMrSEgAAAAAAtRcAAAHitlMicpPpnE8pBtU1U6u0pnLfhgEAWQwAARAnDBT6ifssFN8PWd3fBPblZRfys0qu6wwU4rZTInKT6ZxPKQbVNVOrtKZy34YUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSAUIMQB87UjubTE7Kb/fOe8Yu2QDUQJ6c5pL9LjcoFaNkEiJzLY5yd72jrsvVbVFNZ6ObWloAmLkjCgDXw9enkVtwVBMrEQwhAs7UMjl93ETtugMcC8O5M/KP3ZZ3eS17IObANt2qrPHiEQtBE43vrw==" }}
响应说明:
script:合约的调用脚本,在 Neo 官网上可以解析 https://neo.org/converter
SYSCALL System.Contract.CallPUSHDATA1 0xf61eebf573ea36593fd43aa150c055ad7906ab83PUSHDATA1 transferPUSHDATA1 0x86df72a6b4ab5335d506294f9ce993722253b6e2PUSHDATA1 0xebae4ab3f21765e5f604dfdd590fdf142cfb89faPUSHINT16 10000PUSHDATA1
state:虚拟机状态,
HALT
表示虚拟机执行成功,FAULT
表示虚拟机执行时遇到异常退出。gasconsumed:调用智能合约时消耗的系统手续费。
stack:合约执行结果,其中 value 如果是字符串或 ByteArray,则是 Base64 编码后的结果。
tx:本次调用合约交易的 Base64 编码,需要打开钱包并且传入正确的签名账户参数,否则 tx 为 null。
#
特别说明当合约执行结果里包含迭代器时,会根据 RpcServer
插件的 config
文件中 MaxIteratorResultItems
设置的值来限制迭代次数,默认为 100 次。
在下面的示例中,实际最多可获得6个返回结果。当设置MaxIteratorResultItems
值为 5 时,只返回5次迭代结果,且 truncated
为 true ,提示还有数据未返回:
{ "jsonrpc": "2.0", "id": 3, "result": { "script": "wh8MBnRva2VucwwUR7xWZRSFd3BpKcM7Mj3g3v4/u3ZBYn1bUg==", "state": "HALT", "gasconsumed": "2288880", "exception": null, "stack": [ { "type": "InteropInterface", "iterator": [ { "type": "ByteString", "value": "Ymp5eDMuY3A=" }, { "type": "ByteString", "value": "Ymp5eDUuY3A=" }, { "type": "ByteString", "value": "Ymp5eDEuY3A=" }, { "type": "ByteString", "value": "Ymp5eDIuY3A=" }, { "type": "ByteString", "value": "Ymp5eDQuY3A=" } ], "truncated": true } ] }}
当设置MaxIteratorResultItems
值为大于等于 6 时,会返回6次迭代结果,且 truncated
为 false ,提示已返回全部数据:
{ "jsonrpc": "2.0", "id": 3, "result": { "script": "wh8MBnRva2VucwwUR7xWZRSFd3BpKcM7Mj3g3v4/u3ZBYn1bUg==", "state": "HALT", "gasconsumed": "2288880", "exception": null, "stack": [ { "type": "InteropInterface", "iterator": [ { "type": "ByteString", "value": "Ymp5eDMuY3A=" }, { "type": "ByteString", "value": "Ymp5eDUuY3A=" }, { "type": "ByteString", "value": "Ymp5eDEuY3A=" }, { "type": "ByteString", "value": "Ymp5eDIuY3A=" }, { "type": "ByteString", "value": "Ymp5eDQuY3A=" }, { "type": "ByteString", "value": "Ymp5eDYuY3A=" } ], "truncated": false } ] }}