用 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 交易数据而不是什么都没有。
我在智能合约中有一个简单的函数
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 aview
?
是的,结合您使用的是安全帽(以及我从上下文中假设的,Ethers.js)。
Ethers.js 和其他一些库使用契约 ABI(特别是每个函数的 stateMutability
属性)来决定调用函数时的默认行为。是否使用 read-only call or a read-write transaction.
EVM 设计为调用公开 returned 值,但不为交易公开它们。
由于您的脚本在 EVM 之外运行,因此它无法从交易调用的函数中访问 return 值。 Ethers.js 作者决定在这种情况下 return 交易数据而不是什么都没有。