我只有ropsten的智能合同地址,所以我试图通过web3.js使用:
window.web3.eth.Contract(abi, address)但是我在文档中看到它接收两个参数,我没有abi,所以它需要吗?我发现在旧版本中我们只需要地址。
I'm using "web3": "^1.3.4"谢谢
发布于 2021-04-18 08:42:01
简短的回答:你需要ABI来打电话给合同。
让我们谈谈如何获得它,然后讨论一种方法,如果您没有契约,您仍然能够与契约交互(通过为您需要交互的部分编写您自己的部分)。
以太扫描公司有一种叫做“确认合同”的东西。您可以通过转到Ropsten以太扫描位点并输入地址的约定来检查您想要与之交互的契约是否已被验证。在合同的以太扫描页面上向下滚动一点,应该有一个“合同”选项卡。如果它有一个带标号的绿色圆圈,那么它就是一个经过验证的合同。点击“合同”选项卡,如果你向下滚动,你会看到一个选项,把ABI复制到你的剪贴板上。
(一个小提示:如果您正在与令牌契约交互,Etherscan通常有两个单独的页面,一个用于令牌,另一个用于契约。如果您登录在标记页面上,无法找到是否验证了合同,则在顶部的右侧应该有一个选项可以单击到合同页面,这有时会有所帮助。)
如果您有一个信托、草帽或类似的环境正在运行,并且还可以访问您希望与之交互的契约的源代码,您可以自己编译ABI。
松露:
truffle compile工件将放置在build/contracts中-您将看到一个带有契约名称的JSON (如契约中定义的那样,而不是文件名)。
安全帽:
npx hardhat compile工件将放置在artifacts/中。
请注意(无论是块菌还是草帽):您可能必须选择JSON的abi字段--实际JSON包含的比ABI更多。
您也可以使用solc编译器来编译ABI,但要使它与正确的版本一起工作可能要精细得多。
如果您正在与之交互的合同来自一个主要的开发人员,那么您也可以通过接触他们的交流渠道来获得它。
事实是,正如Morten在评论中所指出的,我们一直在讨论到现在为止,要把整个ABI都做好。你可能不需要整个ABI,事实上,很有可能你不需要。如果你只与合同中的某些功能交互,你只需要一个具备这些功能的ABI,而可以忽略其他功能。这意味着,如果您知道一个函数的名称、参数和参数,您就有了一个解决方案:编写您自己的ABI!
让我们举个例子。ERC20标准有一个名为transfer的函数:
function transfer(address _to, uint256 _value) public returns (bool success)使用标准,我们可以知道如何在ERC20合同(遵循标准)上构造ERC20对象,即使我们没有ABI。看起来会是这样的:
[
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]不可能为所有不同的字段遍历所有不同的选项,但是使用此示例和指向规范的链接,您可能能够为您熟悉的函数创建一个ABI。
https://ethereum.stackexchange.com/questions/97312
复制相似问题