(ethereum/solidity/truffle) 从 test/client 问题中调用智能合约方法

(ethereum/solidity/truffle) calling smart contract method from test/client question

我正在上 udemy 课程,遇到这样的代码

https://github.com/acloudfan/Blockchain-Course-Basic-Solidity/blob/93ca256bcf8c436c144425291257dcff5c3b269f/test/constants_payable.js#L45

我很困惑为什么直接调用一个方法而不是使用.call什么的,其中如果我这样做google,调用合约方法的方式要么使用.call要么.send 但是此时作者直接调用了,这样可以吗,为什么?

这里是合约代码 https://github.com/acloudfan/Blockchain-Course-Basic-Solidity/blob/master/contracts/ConstantsPayable.sol

或多或少,这里从松露测试调用智能合约方法的上下文是什么?是像真实环境一样等待交易被挖完再返回还是做测试直接像普通函数一样调用?

因为udemy课程的作者没有回复,已经快一个星期了,还有十几个问答问题都没有回答,所以我把它发在这里,所以作者可能很忙或者已经忘记了课程(因为这是一门老课程,但评价很好。

在 Truffle returns 合约 instance (line 41) 之前,它使用 ABI 接口(由 Solidity 编译器提供)构建一个 JS 函数映射,用于与合同,包括 receiveEthers().

what is the context of calling smart contract method from a truffle test here

尽管 Truffle JS 测试可以连接到 public 测试网或主网,但它通常与另一个 Truffle 工具一起使用 - 本地 EVM 和称为 Ganache (see the config file 的区块链模拟器,作者定义连接到本地区块链)。默认情况下,Ganache 在每次交易后都会挖出一个区块,因此您(作为开发人员或测试人员)无需担心在设置网络时的挖矿和其他过程,并且它几乎会立即返回本地区块链的响应。

if I do google, the way to call a method of a contract is either using .call or .send

仅回答关于 Truffle 的问题。 其他包,如 Web3js 或 Ethers.js 可能有稍微不同的规则。 并且在 Solidity 中有 .call().send() 方法(用于与其他合约或地址交互),它们的行为也与此处解释的不同:

您可以通过两种不同的方式与合约互动:

  • 交易(可以改变状态——改变合约存储,发出事件)
  • 调用(仅读取合约数据 - 无状态变化)

默认情况下,如果您不指定是要进行交易还是调用,Truffle makes a transaction. You can override this decision and make a call 而是使用 .call() 方法。

.send()方法仅用于低级构建事务。一个常见的用例是发送 ETH - 您需要构建交易 data 字段,填写 (ETH) value,然后调用 .send() 方法(假设您已将 Truffle 配置为使用您的签署交易的私钥)。