我正在尝试使用 ethers.js 调用智能合约中的函数。该函数通过其他函数的帮助检索先前登录用户的信息。以下是该函数代码片段。
function getUser(address _userAddress)
public
onlyAuthCaller
returns (
string memory name,
string memory info,
string memory role,
)
{
User memory tmpData = userDetails[_userAddress];
return (
tmpData.name,
tmpData.info,
tmpData.role
);
}
我用React渲染了一个按钮,用于获取用户信息,代码如下:
const GetUser = () => {
const askUser = async () => {
const provider = new ethers.providers.Web3Provider(window.ethereum);
const account = await window.ethereum.request({
method: "eth_requestAccounts",
});
const signer = provider.getSigner();
const erc20 = new ethers.Contract(
ContractAddress,
ContractABI.abi,
signer
);
try {
const user = await erc20.getUser(account[0]);
console.log(user);
} catch (error) {
console.log("ERROR AT GETTING USER: ", error);
}
};
return (
<div>
<Button type="submit" variant="contained" onClick={askUser}>
GET USER
</Button>
</div>
);
};
我想知道为什么没有得到智能合约 getUser
函数的返回结果,我在等待该函数后期望在 const user
中获得信息。但是实际上在 const user
中,我得到了交易元数据,如下:
{hash: '0x24818569ec29d328b66f58736750a420a5a3bd8e28a72a6a0f72fd8ba5e088d8', type: 2, accessList: null, blockHash: null, blockNumber: null, …}
accessList: null
blockHash: null
blockNumber: null
chainId: 0
confirmations: 0
creates: null
data: "0x6f77926b00000000000000000000000086b2b772014a87730928c7e54f4762d2c09ea4e5"
from: "0x86b2b772014A87730928c7e54F4762d2c09eA4e5"
gasLimit: BigNumber {_hex: '0xd15f', _isBigNumber: true}
gasPrice: BigNumber {_hex: '0x73a20d0c', _isBigNumber: true}
hash: "0x24818569ec29d328b66f58736750a420a5a3bd8e28a72a6a0f72fd8ba5e088d8"
maxFeePerGas: BigNumber {_hex: '0x73a20d0c', _isBigNumber: true}
maxPriorityFeePerGas: BigNumber {_hex: '0x73a20d00', _isBigNumber: true}
nonce: 5
r: "0x6a8fed76397e03a2fc564d18e1ec12abdf39a38fbe825df990f744bb50fc4a8b"
s: "0x66e9b4513047b65aac724dc6fb07d069967f6ca6fd8cd5fe85f6dbe495864765"
to: "0x9719E9dC77A7eDD3825844c77a68c896d4a7BB2b"
transactionIndex: null
type: 2
v: 0
value: BigNumber {_hex: '0x00', _isBigNumber: true}
wait: confirmations => {…}
length: 1
name: ""
arguments: (…)
caller: (…)
[[FunctionLocation]]: index.ts:336
[[Prototype]]: ƒ ()
[[Scopes]]: Scopes[4]
[[Prototype]]: Object
当我在Remix IDE上尝试我的合约函数时,所有功能都按预期工作。例如,在Remix中,我得到了这个答案,其中由函数检索的数据位于
解码输出
中。status true Transaction mined and execution succeed
transaction hash 0x206af46a0f8e6bcc04ae632c85da005c901d8fc82f650e8d40a445f6988adcc2
from 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
to SupplychainUser.getUser(address) 0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B
gas 61639 gas
transaction cost 53599 gas
execution cost 53599 gas
input 0x6f7...35cb2
decoded input {
"address _userAddress": "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"
}
decoded output {
"0": "string: name Carl Bertz",
"1": "string: info 0987654321",
"2": "string: role processor",
}
logs []
val 0 wei
我希望进行相同操作,但是使用React,请问如何从合约的
getUser
函数中获取返回数据?
callStatic
吗? - 0x55b1E06FF.callStatic
是否与 web3.js 中的.call
相同? - 0x55b1E06FF