Quiero obtener el valor de retorno de una función para el contrato de solidez. Implementé usando el navegador solidity en testnet. Estoy usando el cliente nodejs y usa geth para el proveedor web3. Aquí están los detalles
contrato (del ejemplo de solidez)
contract ShapeCalculator{
function rectangle(uint w, uint h) returns (uint s, uint p) {
s = w * h;
p = 2 * (w + h);
}
}
codigo del cliente ::
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
web3.eth.defaultAccount=web3.eth.accounts[0];
var abi = '[{"constant":false,"inputs":[{"name":"w","type":"uint256"},{"name":"h","type":"uint256"}],"name":"rectangle","outputs":[{"name":"s","type":"uint256"},{"name":"p","type":"uint256"}],"payable":false,"type":"function"}]';
var address = "address which I received after deployment";
var shapeCalculatorContract = web3.eth.contract( JSON.parse(abi)).at(address);
var holdReturnValue = shapeCalculatorContract.rectangle(10,20);
console.log(holdReturnValue);
En la consola obtengo "0x83ddb750b799c62f73013c34f89295e3ff2af5cc98755a51e41e00a13c389735", esperaba el área y el perímetro. Agradezco cualquier ayuda.
Si invoca una función de contrato por su nombre como lo ha hecho allí, genera una transacción y no podrá ver el valor devuelto fuera del contrato (lo que obtiene es el recibo de la transacción). Si su función necesita modificar el estado en la cadena de bloques, entonces las transacciones son el camino correcto a seguir, y para obtener acceso a los valores devueltos, debe considerar el uso de Eventos. Si, como en este caso, no está cambiando ningún valor en la cadena de bloques con su función, puede usar una llamada de función en su lugar y recuperar los valores devueltos directamente en su código javascript. En su caso, eso sería (usando promesas, por ejemplo)
shapeCalculatorContract.rectangle.call(10,20).then(function(s,p){
console.log("s=%d, p=%d", s, p);
}); // insert catch error block here
para una mejor comprensión de las transacciones y llamadas y su diferencia ver esta respuesta o la documentación de web3.
Badr Bellaj
arrendajo
Daniel Luca CleanUnicornio
mirg
ivicaa