La longitud de Struct Array siempre es 1

Este es el contrato que estoy llamando createPpara impulsarPost

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

Código de trufa

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

Respuestas (1)

Puede llamar a una función en un contrato inteligente de dos maneras diferentes:

  1. Puede callhacerlo, en cuyo caso no se envía ninguna transacción a la red Ethereum. El resultado se calcula localmente (en cualquier nodo al que esté conectado) y se devuelve. Esto es rápido y gratuito, pero no se puede mutar ningún estado.
  2. Puede enviar una transacción, en cuyo caso debe pagar el gas, y se envía una transacción a la red. Una vez que se extrae en un bloque, sus mutaciones surten efecto.

Debido a que está tratando de modificar la variable de estado posts, debe enviar una transacción. Pero instance.createP.call, en cambio, solo lo llama como si no cambiara de estado. Utilice instance.createP.sendTransactionen su lugar.