尝试记录 Remix 合同时旧版本的 Web3 出错

Posted

技术标签:

【中文标题】尝试记录 Remix 合同时旧版本的 Web3 出错【英文标题】:Error with old version of Web3 when trying to log Remix contract 【发布时间】:2021-07-24 20:25:28 【问题描述】:

我正在尝试从一个简单的 Remix 合约中获取登录到浏览器控制台的详细信息。 但是,当我尝试以下 html 时,我收到一条错误消息:

web3.eth.contract 不是函数

查看文档,我看到了变化:

var RemixContract = web3.eth.contract([

为此:

var RemixContract = new web3.eth.Contract([

至少允许分配合约变量,但是我无法使用RemixContract.at 函数调用智能合约数据。 我相信这与旧的 Web3 版本有冲突,但我不知道如何将数据带入浏览器控制台。

所需的输出是:能够在浏览器控制台上查看我的合同的详细信息。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Deploy a Remix Contract</title>

    <link rel="stylesheet" type="text/css" href="main.css">
    <!--The following line contains the source of web3 in case it is not on the directory-->
    <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>
</head>

<body>
    <div>
        <h1>Deploy a Remix Contract</h1>
    </div>

    <script>

        // Connect to the web3 provider
        if (typeof web3 !== 'undefined') 
            web3 = new Web3(web3.currentProvider);
         else 
            web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
        

        // Set a default account
        web3.eth.defaultAccount = web3.eth.accounts[0];

        // Get the contract abi
        // To get the contract ABI from Remix, go to the Compile tab and grab the ABI
        var RemixContract = web3.eth.contract([
    
        "constant": false,
        "inputs": [
            
                "name": "x",
                "type": "string"
            
        ],
        "name": "setMessage",
        "outputs": [],
        "payable": false,
        "stateMutability": "nonpayable",
        "type": "function"
    ,
    
        "constant": true,
        "inputs": [],
        "name": "getMessage",
        "outputs": [
            
                "name": "",
                "type": "string"
            
        ],
        "payable": false,
        "stateMutability": "view",
        "type": "function"
    
]);

        // Get the contract address
        var myMessage = RemixContract.at('0xd9145CCE52D386f254917e481eB44e9943F39138')

        console.log(myMessage);

    </script>
</body>

</html>

【问题讨论】:

【参考方案1】:

找到了答案,我使用的是 web3 的旧语法,我应该替换这个:

// Get the contract address
var RemixContract = web3.eth.contract(CONTRACT-ABI-HERE);
// Get the contract abi
var myMessage = RemixContract.at('CONTRACT ADDRESS HERE');
console.log(myMessage);

用这个:

var RemixContract = new web3.eth.Contract(CONTRACT-ABI, CONTRACT ADDRESS);
console.log(RemixContract)

【讨论】:

以上是关于尝试记录 Remix 合同时旧版本的 Web3 出错的主要内容,如果未能解决你的问题,请参考以下文章

Web3 web3.eth.sendSignedTransaction 无效参数

如何检测将在 web3js 中失败的事务

Remix Ethereum 合约去哪儿了?

Remix IDE 不显示子合同

使用 web3 将 ERC20 代币从地址 A 转移到地址 B

remix Web3 provider连接不上探究