Show / Hide Table of Contents

invokecontractverify 方法

调用合约的验证(Verify)方法。该方法与 invokefunction 不同, invokefunction 是通过 Application 触发器执行智能合约,而 invokecontractverify 方法是通过 Verification 触发器执行智能合约。并且可以传入 Verify 的参数(params)、签名账户列表(signers)。具体参数类型和数量取决于所调用的智能合约。

  • 此方法用于测试你的虚拟机脚本,调用时只是在 RPC 对应的节点试运行脚本并返回结果,不会对区块链数据产生影响。

  • 此方法由插件提供,需要安装 RpcServer 插件才可以调用

参数说明

  • scripthash:智能合约脚本哈希。

  • params:传递给智能合约操作的参数,必须为空数组[], 因为默认neo只接受参数个数为零的verify函数。

  • signers: 签名账户列表,可选。

    • account: 签名账户

    • scopes: 签名的作用域,允许的值: FeeOnly, CalledByEntry, CustomContracts, CustomGroups, Global

    • allowedcontracts: 如果 scopes 是 CustomContracts,该字段是签名生效的合约 Hash 列表

    • allowedgroups: 如果 scopes 是 CustomGroups,该字段是签名生效的公钥列表。

你需要根据传入地址的数据类型,使用正确的字节序格式。如果数据类型为 Hash160,输入大端序 scripthash;如果数据类型为 ByteArray,则输入小端序 scripthash。

例如:

`json { "type": "String", "value": "Hello" } `

  {
    "type": "Hash160",
    "value": "0xf621168b1fce3a89c33a5f6bcf7e774b4657031c"
  }
  {
    "type": "ByteArray",
    "value": "7472616e73666572"
  }

调用示例

请求正文:

部署合约如下:

{
  "jsonrpc": "2.0",
  "method": "invokecontractverify",
  "params": [ 
  "0x92f5c79b88560584a900cfec15b0e00dc4d58b54", 
  [ ],
  [
      {
        "account": "NTpqYncLsNNsMco71d9qrd5AWXdCq8YLAA",
        "scopes": "CalledByEntry"
      }
  ]
],
  "id": 1
}

响应正文:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "script": "VgEMFFbIjRQK0swPKQN90Qp/AGCitShcYEBXAANAQZv2Z84MBWhlbGxvDAV3b3JsZFNB5j8YhEBXAQAMFFbIjRQK0swPKQN90Qp/AGCitShcQfgn7IxwaEA=",
    "state": "HALT",
    "gasconsumed": "1017810",
    "exception": null,
    "stack": [
      {
        "type": "Boolean",
        "value": true
      }
    ]
  }
}

响应说明:

  • script:合约的调用脚本,参考 Neo 数据转换 页面,可以将脚本转为 OpCode

  • state:虚拟机状态, HALT 表示虚拟机执行成功, FAULT 表示虚拟机执行时遇到异常退出。

  • gasconsumed:调用智能合约时消耗的系统手续费。

  • stack:合约执行结果,其中 value 如果是字符串或 ByteArray,则是 Base64 编码后的结果。