Почему функция моего смарт-контракта всегда возвращает 0?

Я новичок в Эфириуме. Я пытаюсь развернуть свой первый смарт-контракт в своем частном блокчейне, но моя функция всегда возвращает 0. Я написал простой смарт-контракт:

pragma solidity^0.5.0;

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

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

Я сгенерировал Abi и BIN с помощью solc

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

корзина результатов

60806040523480156100115760006000fd5b505b600460006000508190909055505b610026565b6090806100346000396000f3fe608060405234801560105760006000fd5b5060043610602c5760003560e01c806376dad22314603257602c565b60006000fd5b6038604e565b6040518082815260200191505060405180910390f35b6000600490506058565b9056fea265627a7a7231582090f812ea4d2db2a047f1e42576b9cd85f3c0bef7e9392797864143a00ce269c664736f6c634300050b0032

результат АБИ:

[{"константа":true,"входы":[],"имя":"showNumber","выходы":[{"internalType":"int256","имя":"","тип":"int256 "}","оплачиваемый":ложь,"stateMutability":"чистый","тип":"функция"},{"входы":[],"оплачиваемый":ложь,"stateMutability":"неоплачиваемый"," тип":"конструктор"}]

в моей оболочке, подключенной к моему частному блокчейну:

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.** 

Заранее большое спасибо за вашу помощь и извините за глупый вопрос, но я новичок в Ethereum. Что я делаю не так?

Ответы (1)

Ваш код Javascript должен быть асинхронным (либо с async/ await, либо с использованием Promiseобъектов), потому что оба contract.newи object.showNumberвозвращают Promise.

Например:

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);
}

Затем вы можете либо вызвать run()в конце вашего скрипта, либо вызвать await run()из какой-либо другой asyncфункции.