【问题标题】:web3 calls Solidity contract function with extra parameter?web3 调用带有额外参数的 Solidity 合约函数?
【发布时间】:2018-01-22 00:23:38
【问题描述】:

http://truffleframework.com/tutorials/pet-shop的例子中,有如下合约,函数adopt(uint petId)只有一个参数。

contract Adoption {
    address[16] public adopters;

    function adopt(uint petId) public returns (uint) {
        require(petId >= 0 && petId <= 15);
        adopters[petId] = msg.sender;
        return petId;
    }

    function getAdopters() public returns (address[16]) {
        return adopters;
    }
}

但是,在 javascript 代码 app.js 中,handleAdopt 函数使用以下代码调用合约函数。

  App.contracts.Adoption.deployed().then(function(instance) {
    adoptionInstance = instance;
    return adoptionInstance.adopt(petId, {from: account});
  })

使用额外对象{from: account} 调用该函数。为什么?这个参数在solidity代码中被丢弃了吗?

顺便说一句,有一个未定义的全局变量web3?该值是否由 MetaMask 扩展分配?

【问题讨论】:

  • 请参阅我发布的有关交易对象的答案。如果您安装了插件,则 MetaMask 会注入 web3 对象。否则,您可以实例化您自己的 web3 对象,并传入 web3 提供程序。例如,要使用 HttpProvider: const web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider(providerUrl));

标签: ethereum solidity truffle consensys-truffle


【解决方案1】:

这是transactionObject,它描述了有关所有交易调用的一般信息(gas 限制、价格、要发送的以太币数量等)。您发布的 JS 代码使用的是 web3 库。这不是对合约 API 的直接调用。 web3 库将其转换为 RPC。 transactionObject 位于所有合约参数之后。后面还有另一个参数是带有合约调用结果的回调(参见here)。

这些是docs 中描述的transactionobject 的所有选项:

  • from: String - 发送账户的地址。如果未指定,则使用 web3.eth.defaultAccount 属性。
  • to: String -(可选)消息的目标地址,未定义用于创建合约的交易。
  • value: Number|String|BigNumber - (可选)在 Wei 中为交易转移的价值,如果是合约创建交易,也是捐赠。
  • gas: Number|String|BigNumber -(可选,默认值:待确定)用于交易的 gas 量(未使用的 gas 将被退还)。
  • gasPrice: Number|String|BigNumber -(可选,默认值:待确定)此交易的 gas 价格(以 wei 为单位),默认为平均网络 gas 价格。
  • data: String -(可选)包含消息相关数据的字节字符串,或者在合约创建交易的情况下,初始化代码。
  • nonce: Number -(可选)nonce 的整数。这允许覆盖您自己的使用相同 nonce 的待处理事务。

【讨论】:

  • 谢谢,我有点惊讶该调用允许将发送帐户的地址覆盖为某些值。那么我可以代为调用合约吗?会不会是安全问题?
  • 账户需要解锁才能发起交易。
猜你喜欢
  • 2018-09-16
  • 2021-08-20
  • 2018-10-16
  • 2018-12-06
  • 2019-03-28
  • 2020-03-23
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
相关资源
最近更新 更多