Solidity
推送到數組實際上並不推送
社區,
我一直在努力解決以下問題,希望您能發現我的錯誤。
Populus
我使用on部署以下契約Testrpc
。這是一個非常簡單的合約:pragma solidity ^0.4.19; contract ICO { address public owner; mapping(address => uint) public balances; address[] public buyers; uint constant public MULTIPLIER = 1000; function ICO() public { owner = msg.sender; } function getBuyersLength() public constant returns (uint) { return buyers.length; } function buy() public payable { uint coins = msg.value * MULTIPLIER; balances[msg.sender] += coins; buyers.push(msg.sender); } }
我
buy
通過以下方式使用 Web3js 呼叫該函式:let contract; let account; window.addEventListener('load', function () { if (typeof web3 !== 'undefined') { console.log('Using MetaMask connection'); w3 = new Web3(web3.currentProvider); } else { w3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); } contract = w3.eth.contract(contractABI).at(contractAddress); account = w3.eth.defaultAccount; main() }); function main() { let amount = w3.toWei(10, 'ether'); contract.buy({'value': amount}, function (err, res) { if (err) { console.error('Error occurred: ' + err); } else { console.log('Transaction created: ' + res); } }) }
在等待事務被包含在一個塊中之後(自從我執行後幾乎立即發生
testrpc
,我這樣呼叫getBuyersLength()
函式:function updateBalances() { contract.getBuyersLength(function (err, res) { if (err) { console.error('Error in getBuyers: ' + err); } else { console.log('Count of Buyers: ' + res); } } }
但是,結果總是
0
,這意味著buyers.length
保持不變。你能看出我犯了什麼錯誤嗎?
剛剛解決了。問題是我如何將契約部署到
TestRPC
. 我曾經populus deploy ICO -c testrpc
部署過合約,但不知何故,合約從未保存在測試區塊鏈上。我現在從前端部署合約,這不是最好的解決方案,但它現在可以工作。就是這樣:w3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); account = w3.eth.defaultAccount; let contractScheme = w3.eth.contract(contractABI); let gasEstimate = w3.eth.estimateGas({data: contractBytecode}); contract = contractScheme.new({ data: contractBytecode, from: account, gas: gasEstimate }, function (err, res) { if (err) { console.error('Error occurred in Contract Creation: ' + err) } else { // Callback fires twice. Once upon reception of the TransactionHash and // once the contract receives an address. if (!res.address) { console.log('TransactionID for Contract Creation ' + res.transactionHash) } if (res.address) { console.log('Contract Address: ' + res.address); main() } } });
你的契約似乎沒問題。可能是您的 Js 主文件
w3.toWei
功能中的問題。我猜你沒有將任何 web3 對象分配給 w3。所以 w3 是未定義的,Javascript 會拋出錯誤。因為沒有找到神化w3.toWei
。所以你的語句不會執行,contract.buy()
不會執行。如果不執行此方法,則 Eth 客戶端中沒有 trans。因此,當您呼叫getBuyersLength()
它時,它只會返回 0。function main() { let contract = web3.eth.contract(CONTRACT_ABI).at(CONTRACT_ADDR); let amount = web3.toWei(10, 'ether'); contract.buy({'value': amount}, function (err, res) { if (err) { console.error('Error occurred: ' + err); } else { console.log('Transaction created: ' + res); } }) }
用上述程式碼替換您的程式碼。如果您的問題未解決,請使用 Javascript 日誌更新您的 qus。