当我想查看智能合约函数的返回值时,为什么需要 .call()?
Why is .call() necessary when I want to see returned values from a smart contract function?
在我的合同中我有这个功能(solc 0.8.4):
function makeDecision(address person) external returns (string memory name, bool approved) {
require(msg.sender == loanOfficer, "Only the loan officer can initiate a decision.");
require(bytes(applicants[person].name).length != 0, "That person is not in the pool of applicants.");
if (applicants[person].credScore > 650 && applicants[person].credAge > 5) {
applicants[person].approved = true;
}
return (applicants[person].name, applicants[person].approved);
}
当我进入我的 truffle 控制台并以这种方式调用我的函数时 loanContract.makeDecision(accounts[1])
一切正常,但我收到了一个 tx 收据作为响应。
当我通过 truffle 控制台以这种方式调用我的函数时 loanContract.makeDecision.call(accounts[1])
我从我的函数中得到了预期的响应。我想要一个解释,告诉我为什么会出现这种反应差异,以便我更深入地了解发生了什么。我讨厌在不理解它们为什么起作用的情况下使用它们。
如果有帮助,我的合约(名为 LoanDisbursement
)在控制台中初始化如下:let loanContract = await LoanDisbursement.deployed()
和我的账户变量:let accounts = await web3.eth.getAccounts()
任何提示都会有所帮助,因为我仍在学习和深入研究这个生态系统。到目前为止,我还没有找到关于此功能的任何合适的文档。谢谢。
Truffle contract functions 创建交易 - return 交易数据。
call function 不会创建交易,它只是进行调用。所以它不能 return 交易收据,Truffle 的作者决定 return 函数值。
没有交易,你的合约状态没有改变。这可能不是您想要的,当您需要将状态更改保存到区块链时,您应该始终创建一个交易。
Truffle 在您创建交易时不会 return 函数值。使用 Truffle,他们推荐两种方法:
正在读取事务产生的事件日志
将事件添加到您的函数 emit MadeDecision(applicants[person].name, applicants[person].approved);
,然后在 result.logs
中的 JS 代码中访问它。
在后续调用中调用 getter。
Tx setValue(5)
然后调用 getValue()
。或者在你的情况下:
Tx makeDecision(0x123)
然后调用applicants[0x123]
(假设applicants
是public)。
在我的合同中我有这个功能(solc 0.8.4):
function makeDecision(address person) external returns (string memory name, bool approved) {
require(msg.sender == loanOfficer, "Only the loan officer can initiate a decision.");
require(bytes(applicants[person].name).length != 0, "That person is not in the pool of applicants.");
if (applicants[person].credScore > 650 && applicants[person].credAge > 5) {
applicants[person].approved = true;
}
return (applicants[person].name, applicants[person].approved);
}
当我进入我的 truffle 控制台并以这种方式调用我的函数时 loanContract.makeDecision(accounts[1])
一切正常,但我收到了一个 tx 收据作为响应。
当我通过 truffle 控制台以这种方式调用我的函数时 loanContract.makeDecision.call(accounts[1])
我从我的函数中得到了预期的响应。我想要一个解释,告诉我为什么会出现这种反应差异,以便我更深入地了解发生了什么。我讨厌在不理解它们为什么起作用的情况下使用它们。
如果有帮助,我的合约(名为 LoanDisbursement
)在控制台中初始化如下:let loanContract = await LoanDisbursement.deployed()
和我的账户变量:let accounts = await web3.eth.getAccounts()
任何提示都会有所帮助,因为我仍在学习和深入研究这个生态系统。到目前为止,我还没有找到关于此功能的任何合适的文档。谢谢。
Truffle contract functions 创建交易 - return 交易数据。
call function 不会创建交易,它只是进行调用。所以它不能 return 交易收据,Truffle 的作者决定 return 函数值。
没有交易,你的合约状态没有改变。这可能不是您想要的,当您需要将状态更改保存到区块链时,您应该始终创建一个交易。
Truffle 在您创建交易时不会 return 函数值。使用 Truffle,他们推荐两种方法:
正在读取事务产生的事件日志
将事件添加到您的函数
emit MadeDecision(applicants[person].name, applicants[person].approved);
,然后在result.logs
中的 JS 代码中访问它。在后续调用中调用 getter。
Tx
setValue(5)
然后调用getValue()
。或者在你的情况下:Tx
makeDecision(0x123)
然后调用applicants[0x123]
(假设applicants
是public)。