Duda en la ejecución de la función javascript

hola chicos tengo esta función de contrato:

function teste(uint _oX) public returns (uint value) {
    return 34;
}

Y trato de llamar a JS de esta manera:

 MyContract.teste(1).then(value => console.log(value) );  

Pero recibí esto en lugar del valor 34:

{blockHash: "0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da", blockNumber: 2600, contractAddress: null, cumulativeGasUsed: 21722, from: "0xc5a5d47b525851bde4811aa870a331024156eeec", …}blockHash: "0xd43e64033fdc8058be7da224059f15ef5f3268813294f2a9087a747d1ed674da"blockNumber: 2600contractAddress: nullcumulativeGasUsed: 21722events: {}from: "0xc5a5d47b525851bde4811aa870a331024156eeec"gasUsed: 21722logsBloom : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"status: "0x1"to: "0x7b475783cee479de3b270193b61450c649b2abef"transactionHash: "0x4455026eeae746f58e49f977f42597321426f9fe6cc3818deffac63dd9c61909"transactionIndex: 0__proto__: ObjectObjetoObjeto

alguien me puede ayudar con esto :| Gracias

Respuestas (1)

Los contratos de Ethereum tienen dos métodos de invocación.

Una forma es consultar el nodo local y su copia de la cadena de bloques en modo de solo lectura. De esta manera volverá 34como se esperaba.

La otra forma es enviar una transacción a la red que potencialmente cambiará el estado del contrato. Aunque su función no almacene nada, dicha transacción aún circularía y sería extraída y aparecería en un bloque para que todos los nodos puedan estar de acuerdo en que no pasó nada.

Está utilizando el segundo método para obtener información sobre la transacción enviada34 , su éxito, el hash de la transacción, el número de bloque... todo tipo de cosas excepto . Esto se debe a returnque los valores no son accesibles por este método.

Lo que quieres es leer el contrato. Hay dos maneras de hacerlo.

Puede dejar el contrato en paz e invocar la función con el .call()método para decir explícitamente que el cliente quiere que sea una operación de solo lectura y usted realmente quiere 34.

MyContract.teste.call(1).then(value => console.log(value) );

Puede incluir este comportamiento en el contrato, que es una buena forma para las funciones que no hacen nada al estado, es decir, están destinadas a inspeccionar el estado. purees puramente computacional y no necesita acceso al estado, y viewes de solo lectura pero necesita acceso al estado.

function teste(uint _oX) public pure returns (uint value) { return 34; } Más sobre esto: https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

Hacia adelante. La respuesta será algo extraño. Es un "bigNumber" (tema separado) porque JavaScript no puede manejar los números enteros de 256 bits de Ethereum. Puede descomprimirlo así y debería obtener 34.

console.log(value.toString(10));

Espero eso ayude.

Tanque, Rob, esto realmente me ayuda :)