Cómo obtener el valor de retorno de la función para el contrato de solidez

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.

declarar tal función como constante
Soy nuevo en solidez. Quiero imprimir el valor de w y h dentro de la función de rectángulo. ¿Cómo puedo hacer eso? contract ShapeCalculator{ función rectángulo(uint w, uint h) devuelve (uint s, uint p) { //imprime el valor de w y hs = w * h; p = 2 * (ancho + alto); } }
Por favor, no publique preguntas como respuestas. Ya hiciste tu pregunta, continúa la discusión allí.
Si tiene una nueva pregunta, hágala haciendo clic en el botón Preguntar . Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. - De la revisión
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente reputación , podrá comentar cualquier publicación ; en su lugar, proporcione respuestas que no requieran aclaración por parte del autor de la pregunta . - De la revisión

Respuestas (1)

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.

hola @manuhalo, que es la forma recomendada de usar el evento o invocar a través de una llamada, agradezco su opinión
@ user1687711 como se mencionó anteriormente, depende de lo que esté tratando de lograr. Para esta función en particular, parece que una llamada está perfectamente bien, ya que no está cambiando ninguna variable en su contrato, solo usa los argumentos de entrada para generar una salida que no está almacenada. Sin embargo, si quisiera guardar el área calculada para un miembro privado de su contrato por algún motivo, entonces necesitaría usar transacciones y eventos. Ver truffleframework.com/docs/getting_started/… para una mejor explicación de esto.