Solidity
呼叫合約方法的方式
我剛剛開始在乙太坊上學習開發。到目前為止,我使用 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
。