Este es el contrato que estoy llamando createP
para 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
});
Puede llamar a una función en un contrato inteligente de dos maneras diferentes:
call
hacerlo, 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.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.sendTransaction
en su lugar.