Contract-Invocation

合約 API 非常困惑

  • March 10, 2022

TL;DR 我對 web3 中的 Contract API 感到非常困惑:https ://web3js.readthedocs.io/en/v1.2.6/web3-eth-contract.html

myContract.methods 在 geth 控制台中不可用,在 Ubuntu 16.0.4 上使用 Geth 1.9.11-stable 和 1.9.12-unstable(快速同步)

是版本問題嗎?我必須回到以前的版本才能使用此功能嗎?

更多詳細資訊我目前正在嘗試從我的 geth 控制台使用此 API 來檢索編碼的交易字元串,以進行簽名和送出

當我在 Remix (remix.ethereum.org) 上使用時,在我編譯 SimpleStorage 合約並部署到 Ropsten 後,我可以訪問以下方法

在混音控制台上:

> abi = [{"constant": false,"inputs": [{"name": "x","type": "uint256"}],"name": "set","outputs": [],"payable": false,"stateMutability": "nonpayable","type": "function"},{"constant": true,"inputs": [],"name": "get","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"}]

> mySimpleStorage = new web3.eth.Contract(abi)

> mySimpleStorage.methods
{
 "set": "function () { [native code] }",
 "0x60fe47b1": "function () { [native code] }",
 "set(uint256)": "function () { [native code] }",
 "get": "function () { [native code] }",
 "0x6d4ce63c": "function () { [native code] }",
 "get()": "function () { [native code] }"
}

> tx = mySimpleStorage.methods.set("x")

> tx.encodeABI()
0x60fe47b10000000000000000000000000000000000000000000000000000000000000005

這就是我根據文件所期望的

使用 Geth 控制台:

web3.eth.Contract(大寫)甚至不存在:

> mySimpleStorage = new web3.eth.Contract(abi)
TypeError: Value is not an object: undefined
       at <eval>:1:19(5)

我必須使用 web3.eth.contract(小寫):

> mySimpleStorage = new web3.eth.contract(abi)
{
 abi: [{
     constant: false,
     inputs: [{...}],
     name: "set",
     outputs: [],
     payable: false,
     stateMutability: "nonpayable",
     type: "function"
 }, {
     constant: true,
     inputs: [],
     name: "get",
     outputs: [{...}],
     payable: false,
     stateMutability: "view",
     type: "function"
 }],
 eth: {},
 at: function(address, callback),
 getData: function(),
 new: function()
}

無論如何,方法屬性失去了,不可能呼叫 encodeABI()

> tx = mySimpleStorage.methods
Undefined
> tx
undefined
const contract = new web3.eth.Contract(abi, address);

我想你忘記了第二個參數,即智能合約地址

我想我理解了這個問題。Geth 控制台支持 web3 0.2xx 而不是 1.x。所以沒有 encodeABI(),你必須改用 getData(),整個語法是不同的。這個舊介面的文件在這裡:https ://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcontract

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