用 hardhat 调用智能合约可以 return 值或字典

Calling smart contract with hardhat can return either value or dictionary

我在智能合约中有一个简单的函数

function getBalance() external view returns (uint) {
    requireMembership(msg.sender);
    return coins[msg.sender];
}

当我从安全帽中调用它时 Contract 反对它 returns 一个数字。另一方面,当我调用这个

function vote(bytes32 merkleHash, bytes32 randomHash) external votePeriod returns (uint) {
    votes.push(Vote (msg.sender, merkleHash, randomHash));
    return votes.length - 1;
}

它returns更多数据

{
  hash: '0x80edd9baca248c121bdd026343c842f9b608ac1827c63998dde48d2c3a87b2c6',
  type: 2,
  accessList: [],
  blockHash: '0xcc1a5d8ac8d92f98e4f1247c4d76e83e27b167cdc29d2fe962f10ee773eaa509',
  blockNumber: 4,
  transactionIndex: 0,
  confirmations: 1,
  from: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266',
  gasPrice: BigNumber { value: "1590942713" },
  maxPriorityFeePerGas: BigNumber { value: "1000000000" },
  maxFeePerGas: BigNumber { value: "2181885426" },
  gasLimit: BigNumber { value: "29025624" },
  to: '0x5FbDB2315678afecb367f032d93F642f64180aa3',
  value: BigNumber { value: "0" },
  nonce: 2,
  data: '0xeeaaf19ded2380097cd5db2b14288f4081b387c78bb556bba20557ee9580b19c4c77aa01e57feaac04642d236597ea01c4f788ded7c59047121e4d1a42fa2daaaa22350a',
  r: '0xdddc05db4d271a1a4c7e1d31bf56fc7e052a5e0d0f15a9309e8ce492a3e46da1',
  s: '0x2968ea8648e0102437efa9c710ecc2188d72e0bb9afab5343b2062a4d5a5ee5b',
  v: 0,
  creates: null,
  chainId: 31337,
  wait: [Function (anonymous)]
}

这是因为 getBalance 只是一个 view 吗?

Is this because getBalance is just a view?

是的,结合您使用的是安全帽(以及我从上下文中假设的,Ethers.js)。

Ethers.js 和其他一些库使用契约 ABI(特别是每个函数的 stateMutability 属性)来决定调用函数时的默认行为。是否使用 read-only call or a read-write transaction.

调用它

EVM 设计为调用公开 returned 值,但不为交易公开它们。

由于您的脚本在 EVM 之外运行,因此它无法从交易调用的函数中访问 return 值。 Ethers.js 作者决定在这种情况下 return 交易数据而不是什么都没有。