la suscripción no ocurre en geth+websocketProvider en web3

Inicié el nodo geth (conectar a ropsten testnet) en mi sistema OSX local.
Dominio:geth --testnet --fast --bootnodes "enode://20c9ad97c081d63397d7b685a412227a40e23c8bdc6688c6f37e97cfbc22d2b4d1db1510d8f61e6a8866ad7f0e17c02b14182d37ea7c3c8b9c2683aeb6b733a1@52.169.14.227:30303,enode://6ce05930c72abc632c58e2e4324f7c7ea478cec0ed4fa2528982cf34483094e9cbc9216e7aa349691242576d552a2a56aaeae426c5303ded677ce455ba1acd9d@13.84.180.240:30303" --datadir data--ws --wsport 8546 --wsorigins "*" --rpc --rpcport 8545 --rpccorsdomain "*" --nodiscover --ws --wsport 8546

El nodo Geth no está en estado de sincronización de bloques

eth.syncing => falso

Versión Geth: 1.8.11-estable

XXX-iMac:~ XXXXX$ geth version

Geth
Version: 1.8.11-stable
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.10.3
Operating System: darwin
GOPATH=
GOROOT=/usr/local/Cellar/go/1.10.3/libexec

Versión Web3:
"^1.0.0-beta.34"

Código Javascript que se ejecuta en el entorno del nodo

var web3 = new Web3(
    new Web3.providers.WebsocketProvider('ws://127.0.0.1:8546')
);

const contractAbi =[...];
const contractAddress = 'xxxxx';
const contractInstance = new web3.eth.Contract(contractAbi, contractAddress);
var res = contractInstance.methods.currentTicket.call((err, result) => {
    if (err) {
        console.log("error getting currentTicket", err);
    }
    else {
        console.log("success getting currentTicket", result);
    }
});

Aquí currentTickethay una variable que contiene un valor entero. No se llama nada, busqué varios tickets de problemas de github y nada me ayudó. ¡Cualquier tipo de ayuda será apreciada!

ACTUALIZACIÓN1:

Busqué debajo del ticket de problemas de web3, ¡pero nada me ayudó!
https://github.com/ethereum/web3.js/issues/989
https://github.com/ethereum/web3.js/issues/1093

ACTUALIZACIÓN2:

Subirse al frente funciona bien.

async function callAsync(f, params) {
  if (!params) params = [];
  return new Promise((resolve, reject) => {
    f(...params, function(err, res){
      if (err) reject(err);
      resolve(res);
    });
  });
}
const contract = web3.eth.contract(contractAbi);
const contractInstance = contract.at(contractAddress);
currentTicket = (await callAsync(contractInstance.currentTicket.call)).c[0];

Respuestas (1)

Después de 10 horas de lluvia de ideas, encontré los 2 problemas en mi implementación.
Uno es debido a la sincronización del nodo geth.

Lo he comprobado web3.eth.getBlock(0)y mostró bloque de génesis. Y cuando probé con web3.eth.getBlock(1), imprimió null.

Y también web3.eth.getCode('0xc351acdf577aef7d81d8cc7d750a081d6f07ad93')estaba devolviendo "0x", lo que significa que el nodo geth no está obteniendo el código de bytes del contrato.

El otro está llamando a la función de contrato.
Según la documentación pública, es necesario convertir de contractInstance.methods.currentTicket.calla contractInstance.methods.currentTicket().call.

¡Espero que esto ayude a otros con dolor de cabeza!