¿Por qué la función de mi contrato inteligente siempre devuelve 0?

Soy nuevo en Ethereum. Estoy tratando de implementar mi primer contrato inteligente en mi cadena de bloques privada, pero mi función siempre devuelve 0. Escribí el contrato inteligente simple:

pragma solidity^0.5.0;

contract helloNumber {
    int256 internal thisNumber;
    constructor() public {
        thisNumber = 4;
    }

   function showNumber() external pure returns (int256) {
        return 4;  
   }
} 

Generé Abi y BIN con solc

 solcjs --bin helloNumber.sol
 solcjs --bin helloNumber.sol

bandeja de resultados

60806040523480156100115760006000fd5b505b600460006000508190909055505b610026565b6090806100346000396000f3fe608060405234801560105760006000fd5b5060043610602c5760003560e01c806376dad22314603257602c565b60006000fd5b6038604e565b6040518082815260200191505060405180910390f35b6000600490506058565b9056fea265627a7a7231582090f812ea4d2db2a047f1e42576b9cd85f3c0bef7e9392797864143a00ce269c664736f6c634300050b0032

resultado IAB:

[{"constante":verdadero,"entradas":[],"nombre":"showNumber","salidas":[{"internalType":"int256","nombre":"","tipo":"int256 "}],"pagadero":falso,"estadoMutabilidad":"puro","tipo":"función"},{"entradas":[],"pagadero":falso,"estadoMutabilidad":"no pagadero"," tipo":"constructor"}]

en mi caparazón conectado a mi cadena de bloques privada:

var contract = eth.contract(ABI)
var bytecode = '0xBIN'
var deploy = {from:eth.coinbase, data:bytecode, gas: 2000000}
var object= contract .new(deploy)

object.address //returns the hashcode of smart contract on private blockchain. 

object.showNumber() **//returns always 0.** 

Muchas gracias de antemano por su ayuda y disculpe si es una pregunta tonta, pero soy nuevo en Ethereum. ¿Qué estoy haciendo mal?

Respuestas (1)

Su código Javascript debe ser asíncrono (ya sea con async/ awaito usando Promiseobjetos), porque ambos contract.newy object.showNumberdevuelven un archivo Promise.

Por ejemplo:

async function run() {
    var contract = eth.contract(ABI);
    var bytecode = '0xBIN';
    var deploy = {from: eth.coinbase, data: bytecode, gas: 2000000};
    var object = await contract.new(deploy);
    var n = await object.showNumber();
    console.log(n);
}

Luego, puede llamar run()al final de su script o llamar await run()desde alguna otra asyncfunción.