Web3回调函数问题 - Solidity
问题描述:
我正尝试将合同连接到我的私有RPC服务器。我希望能够更新我的html页面上的计数器参数,这反过来又引用了我的浏览器上的solidity contract文件和更新。但是,我一直在遇到下面的错误为我的HTML文件。 index.html和contract.sol也包含在下面。 TY!Web3回调函数问题 - Solidity
<!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>
contract.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);
}
}
}
答
问题是你试图直接与web3.js
连接Metamask
,是不是你应该怎么做。 Metamask基于provider Engine和供应商eninge不支持同步功能或操作,例如:
你不能这样做 web3.eth.accounts
,但你可以做web3.eth.getAcounts()
。
为了最好地使用提供程序引擎来注入web3并从中取出它,您将注意到为了使事情运行,您将切换到异步格式。
但在所有情况下使用web3.js异步功能,你会得到你想要的。
[**不要发布代码或错误的图像!**](https://meta.*.com/q/303812/995714)图像和屏幕截图可以是一个很好的补充,但请如果没有他们,那么帖子仍然清晰有用。如果您发布代码图片或错误消息,请确保您也直接复制并粘贴或将实际代码/消息输入到帖子中。 – Rob