Alternativa a filter.watch()

Aquí hay un escenario:

  1. El backend de Dapp se conecta a un nodo Ethereum remoto mediante HTTP RPC externo:

const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/janNFDJkMgDfan"));
  1. El usuario de Dapp envía la transacción a un contrato y luego envía el hash de esta transacción al backend de Dapp.
  2. El backend de Dapp espera a que se confirme el bloque pendiente y verifica si la transacción está incluida en él.

Aquí está el problema :

Resulta que cuando web3el backend de un nodo externo proporciona un objeto, no puede usar eventos. Por ejemplo, el backend no puede buscar nuevos bloques. Lo siguiente no funciona:

var filter = web3.eth.filter('latest');

filter.watch(function(error, result){
  var block = web3.eth.getBlock(result, true);
  console.log('current block #' + block.number);
});

TypeError: filterCreationErrorCallback no es una función

Entonces, el problema es que el backend no sabe cuándo se extrae un nuevo bloque.

Una forma de manejar esto:

El backend puede consultar la cadena de bloques cada ~20 segundos para verificar si se ha extraído un nuevo bloque.

check(){
    web3.eth.getBlock("pending", (error, result) => {
      console.log('error:', error);
      console.log('results', result);
    });
}
setTimeout(check, 20000);

y luego asegúrese de que se haya incluido la transacción del usuario.

Otra forma de manejar esto es:

?????

¿Cuenta "ejecutar su propio nodo"?

Respuestas (2)

Todavía no tengo suficiente reputación para comentar, así que solo estoy escribiendo una línea como respuesta para decir que debe eliminar su código de acceso del ejemplo que proporcionó. ;)

const web3 = new Web3(new Web3.providers.HttpProvider(" https://ropsten.infura.io/ ***********"));

Dudo que esto sea importante ya que este código JS se puede ver en el código fuente de la dapp, por lo que probablemente no sea un secreto.
Puede editar respuestas/preguntas con 1 repetición.

Así es como he logrado escuchar eventos en el backend. El problema es que los eventos no se disparan consistentemente.

const Web3 = require('web3');
const ProviderEngine = require('web3-provider-engine/index.js');
const ZeroClientProvider = require('web3-provider-engine/zero.js');

const engine = ZeroClientProvider({
  getAccounts: function(){},
  rpcUrl: 'https://ropsten.infura.io/WEQuhowqe78qdqweqw', //RANDOM ID, TO GET A REAL ONE, REGISTER AT INFURA.IO
})
const web3 = new Web3(engine);

const contractAddress = '0xc740ab099da657612143c34c5f7593a3af5ee6e8';
const contractAbi = [{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"emit","outputs":[],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"x","type":"uint256"}],"name":"myEvent","type":"event"}];
const contract = web3.eth.contract(contractAbi).at(contractAddress);

const event = contract.myEvent({x: null})
event.watch(function(error, result){
  console.log(error, result.args.x.toNumber());
});