Solidity
結構數組長度始終為 1
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 });
您可以通過兩種不同的方式呼叫智能合約中的函式:
- 你可以
call
,在這種情況下,不會向乙太坊網路發送任何交易。結果在本地計算(在您連接到的任何節點上)並返回。這是快速且免費的,但任何狀態都不能改變。- 您可以發送一筆交易,在這種情況下您必須支付 gas 費用,然後一筆交易會發送到網路。一旦它被開採成一個塊,它的突變就會生效。
因為您正在嘗試修改狀態變數
posts
,所以您需要實際發送交易。但是instance.createP.call
只是將其稱為好像它不會改變狀態。改為使用instance.createP.sendTransaction
。