Solidity

推送到數組實際上並不推送

  • February 19, 2018

社區,

我一直在努力解決以下問題,希望您能發現我的錯誤。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。

引用自:https://ethereum.stackexchange.com/questions/40120