Alternative zu filter.watch()

Hier ist ein Szenario:

  1. Das Dapp-Backend stellt über externes HTTP-RPC eine Verbindung zu einem entfernten Ethereum-Knoten her:

const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/janNFDJkMgDfan"));
  1. Der Dapp-Benutzer sendet eine Transaktion an einen Vertrag und übermittelt dann den Hash dieser Transaktion an das Dapp-Backend.
  2. Das Dapp-Backend wartet auf die Bestätigung des ausstehenden Blocks und prüft, ob die Transaktion darin enthalten ist.

Hier ist das Problem :

Wie sich herausstellt, web3kann das Backend, wenn ein Objekt von einem externen Knoten bereitgestellt wird, keine Ereignisse verwenden. Beispielsweise kann das Backend nicht nach neuen Blöcken suchen. Folgendes funktioniert nicht:

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 ist keine Funktion

Das Problem ist also, dass das Backend nicht weiß, wann ein neuer Block abgebaut wird.

Eine Möglichkeit, damit umzugehen:

Das Backend kann die Blockchain alle ~20 Sekunden abfragen, um zu prüfen, ob ein neuer Block abgebaut wurde.

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

und stellen Sie dann sicher, dass die Transaktion des Benutzers enthalten war.

Eine andere Möglichkeit, damit umzugehen, ist:

?????

Zählt „Run your own node“?

Antworten (2)

Ich habe immer noch nicht genug Ruf, um einen Kommentar abzugeben, also schreibe ich nur eine Zeile als Antwort, um zu sagen, dass Sie Ihren Zugangscode aus dem von Ihnen bereitgestellten Beispiel entfernen sollten! ;)

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

Ich bezweifle, dass dies wichtig ist, da dieser JS-Code im Quellcode der dapp angezeigt werden kann, also ist dies wahrscheinlich kein Geheimnis.
Sie können Antworten/Fragen mit 1 Wiederholung bearbeiten.

So habe ich es geschafft, Ereignisse im Backend abzuhören. Das Problem ist, dass die Ereignisse nicht konsistent ausgelöst werden.

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