0

我正在尝试将合同连接到我的私人 RPC 服务器。我希望能够更新我的 html 页面上的计数器参数,这反过来又引用了我的 solidity 合同文​​件和浏览器上的更新。但是,我在下面的 html 文件中不断遇到以下错误。index.html 和 contract.sol 也包括以下内容。泰!

在此处输入图像描述 索引.html

<!doctype html>
        <html>
<head>
    <title>myDapp</title>
    <script src="web3.js/dist/web3.min.js"></script>

    <script type="text/javascript">



        var contract_address = "0x68FDbd58D28BeD866E07906f6129bAC86161e243";
        var contract_abi = [ { "constant": true, "inputs": [], "name": "getCreator", "outputs": [ { "name": "", "type": "address", "value": "0xc0f0fb70a63e7b345932da8eb427463f586be95d" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [], "name": "kill", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "myNewNumber", "type": "uint256" } ], "name": "setMyNumber", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "getMyNumber", "outputs": [ { "name": "", "type": "uint256", "value": "3" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" } ];

        if (typeof web3 !== 'undefined') {
            web3 = new Web3(web3.currentProvider);
        } else {
            // set the provider you want from Web3.providers
            web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
        }

        var contract_instance = web3.eth.contract(contract_abi).at(contract_address);
        console.log(contract_instance);


        function getCounter() {
            document.getElementById("myCounter").innerText = contract_instance.getMyNumber().toNumber().call;

}


    </script>
</head>
<body>
<h1>Interact with a contract</h1>

<button onclick="getCounter()">Update Counter</button>
<button onclick="increaseCounter()">Increase Counter</button>

<span id="myCounter"></span> Counter

</body>
</html>

合同.sol

pragma solidity ^0.4.15;
contract MyContract {
    address creator;
    uint256 myNumber;

    function MyContract() public {
        creator = msg.sender;
        myNumber = 3;
    }

    function getCreator() public constant returns(address) {
        return creator;
    }

    function getMyNumber() public constant returns(uint256) {
        return myNumber;
    }

    function setMyNumber(uint256 myNewNumber) public {
        myNumber = myNewNumber;
    }

    function kill() public {
        if(msg.sender == creator) {
            selfdestruct(creator);
        }
    }
}
4

1 回答 1

0

问题是您尝试Metamask直接与之连接web3.js不是您应该这样做的方式。Metamask 基于提供者引擎,提供者引擎不支持同步功能或操作,例如:

你不能做 web3.eth.accounts

但你可以做到web3.eth.getAcounts()

为了最好地使用提供程序引擎来注入您的 web3 并从那里获取它,您会注意到如何为了使事情运行,您将所有内容切换为异步格式。

但在所有情况下都使用 web3.js 异步函数,你会得到你想要的。

于 2017-11-14T12:57:01.543 回答