Solidity

呼叫合約方法的方式

  • January 12, 2022

我剛剛開始在乙太坊上學習開發。到目前為止,我使用 truffle / web3js / react-native 創建了幾個本地項目。現在我開始在https://ethernaut.openzeppelin.com/上解決練習。

從契約中呼叫方法時,我有點困惑。在我本地的 web3js 項目中,當我將乙太幣發送到支付功能時,我是這樣做的:

await myContract.methods.myPayableMethod().send({
       from: accounts[0],
       value: ethValue
     });

在 Ethernaut 上,我不得不像這樣呼叫支付方法:

await ethernautContract.contribute({value: ethValue})

而不是這個:

await ethernautContract.methods.contribute().send({
       from: accounts[0],
       value: ethValue
     });

誰能解釋一下契約之間的區別,以便必須以不同的方式呼叫方法?

每個 web3 javascript 庫都會以自己的方式公開合約方法。從 Ethernaut 的介紹頁面:

ethernaut 是一個包裝已部署到區塊鏈的 Ethernaut.sol 合約的 TruffleContract 對象。

我們可以看到他們的合約被實例化為@truffle/contract,它有一個方法呼叫過程,如下所示:

instance.someFunction(5);

另一方面, “經典” web3庫 web3js 將公開一個涉及methods對象的呼叫過程:

myContract.methods.myMethod([param1[, param2[, ...]]]).call(options [, defaultBlock] [, callback])

額外:您可能還會遇到ethers.js的使用,在這種情況下,該庫的結構與 truffle’s 相似instance.method

引用自:https://ethereum.stackexchange.com/questions/118689