2

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 扩展分配?

4

1 回答 1

3

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

这些是文档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-01-22T00:34:14.680 回答