Solidity

結構數組長度始終為 1

  • January 18, 2018

createP這是我要求推送的契約Post

   struct Post {
       uint256 amt;
       bool isActive;
       address owner;
   }

   Post[] public posts;

   function createP(uint256 amt) public payable returns(uint a) {
       posts.push(Post({
           amt: amt,
           isActive: false,
           owner: msg.sender
       }));
       return (posts.length);
   }
   function getPostLength() returns(uint a){
       return (posts.length);
   }

松露程式碼

       MyContract.deployed()
       .then(async instance => {
           const weiSpend = web3.toWei(2, "ether");
           var id = await instance.createP.call(10,{
               from: accounts[0],
               value: weiSpend
           });
       var id2 = await instance.createP.call(50,{
         from: accounts[1],
         value: weiSpend
       });
       var id3 = await instance.createP.call(100,{
         from: accounts[2],
         value: weiSpend
       });                        
       var last = await instance.getPostLength.call();
       console.log(id3.toString()); // returns 1 instead of 3
       console.log(last.toString()); // returns 0 instead of 3
       });

您可以通過兩種不同的方式呼叫智能合約中的函式:

  1. 你可以call,在這種情況下,不會向乙太坊網路發送任何交易。結果在本地計算(在您連接到的任何節點上)並返回。這是快速且免費的,但任何狀態都不能改變。
  2. 您可以發送一筆交易,在這種情況下您必須支付 gas 費用,然後一筆交易會發送到網路。一旦它被開採成一個塊,它的突變就會生效。

因為您正在嘗試修改狀態變數posts,所以您需要實際發送交易。但是instance.createP.call只是將其稱為好像它不會改變狀態。改為使用instance.createP.sendTransaction

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