以send的方式调用合约方法需要参数么

目前刚刚开始学习AppChain,在查看demo的代码时,有一个小疑问:

通过 myContract.methods.myMethod().send(transaction)的方式调用时,必须要transaction这个参数吗?

如果是的话,是不是意味着只要是和Appchain交互就必须要transaction,为什么呢?

myContract.methods.myMethod().send(transaction) 中的 transaction 是必须的, 这里的 send 方法会发出 json-rpc 中 sendTransaction 请求, 因此必须包含交易信息(比如 validUntilBlock)

但不是每个 AppChain 的请求都需要 transaction 参数, 比如 myContract.methods.myMethods().call() 如果智能合约不要求 msg.sender 等参数, 就不需要传入 transaction 来发起请求.

如果是要传入智能合约方法中的参数, 则是通过 myContract.methods.myMethods(parameters).call() 的方式传入

1 Like

其实我感到疑惑的原因主要是:

  • 我之前用过web3的方式调用,但在web3中似乎并不需要提供transaction参数
  • 现在我知道transactionnervos.js中的send()是必须的,那么为什么在web3中不需要呢而nervos中需要呢,有什么设计上的考虑么?
1 Like

https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#methods-mymethod-send

myContract.methods.myMethod([param1[, param2[, ...]]]).send(options[, callback])

你看的可能是 0.2 版本, web3 1.0 版本里也是需要提供的, 对应上面一行代码里的 options

不过在web3 1.0里面, option中只有from是必须提供的

那么在nervos.js中是transaction中所有内容都必须提供对吧,所有才会创建transaction的模板

在调用 send 方法的时候是必须的, 因为是发交易, AppChain 会对一些关键参数做校验, 比如 validUntilBlock
如果是调用 call 方法, 则根据合约需要的参数传入 transaction 部分字段