Die Länge des Struct-Arrays ist immer 1

Das ist der Vertrag, den ich createPdurchsetzen willPost

    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);
    }

Trüffelcode

        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
        });

Antworten (1)

Sie können eine Funktion in einem Smart Contract auf zwei verschiedene Arten aufrufen:

  1. Sie können calles, in diesem Fall wird keine Transaktion an das Ethereum-Netzwerk gesendet. Das Ergebnis wird lokal berechnet (auf dem Knoten, mit dem Sie verbunden sind) und zurückgegeben. Dies ist schnell und kostenlos, aber es kann kein Zustand mutiert werden.
  2. Sie können eine Transaktion senden, in diesem Fall müssen Sie für Benzin bezahlen, und eine Transaktion wird an das Netzwerk gesendet. Sobald es in einen Block geschürft wird, treten seine Mutationen in Kraft.

Da Sie versuchen, die Zustandsvariable zu ändern posts, müssen Sie tatsächlich eine Transaktion senden. Aber instance.createP.callruft es stattdessen nur so auf, als ob es den Zustand nicht mutieren würde. Verwenden Sie instance.createP.sendTransactionstattdessen.