Ist es möglich, sich ohne einen web3-Provider mit infura zu verbinden?

Ich versuche, Fallback-Funktionalität für meine DApp zu implementieren, was bedeutet, dass ich, wenn kein Web3-Anbieter (z. B. Metamask/Trustwallet usw.) gefunden wird, immer noch Anrufe in das Ethereum-Netzwerk tätigen kann, aber ich scheine immer das gleiche Problem zu bekommen.

Dies ist meine Fallback-Logik:

 let bootStrappedWeb3;

  // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    bootStrappedWeb3 = new Web3(web3.currentProvider);
  } else {
    console.log('No Web3 Detected... falling back to using default mainnet HTTP Provider');
    bootStrappedWeb3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/<MY_API_KEY>"));
  }
  window.web3 = bootStrappedWeb3;

  // Listen for when web3 is connected and then bootstrap the app
  window.web3.eth.net.isListening()
    .then(() => {
      console.log('is connected');

      // Bootstrap the full app
      this.$store.dispatch(actions.INIT_APP, bootStrappedWeb3);
    })
    .catch(e => console.log('Something went wrong', e));

Ich sehe is connectedund dann INIT_APPwird gerufen.

INIT_APPDann setzt der Anbieter meinen Trüffelvertrag so um:

MyContract.setProvider(web3.currentProvider);

Ich kann das aktuelle Netzwerk korrekt lesen, das sich wie auf Mainnet, ID 1 meldet, aber wenn ich dann versuche, Trüffel zu verwenden, fällt dies um.

Der Call to Trüffel sieht so aus:

 MyContract.deployed()
    .then((contract) => {
      // Do stuff 
    }).catch((error) => console.log("Something went bang!", error));

Eine Ausnahme ist throw und ich gebe den Fehler aus, der wie folgt lautet:

Something went bang! TypeError: Cannot read property 'apply' of undefined
at Provider.sendAsync (contract.js?6b6f:24)
at RequestManager.sendAsync (requestmanager.js?e4d9:80)
at Object.get [as getNetwork] (property.js?7a8c:116)
at eval (contract.js?6b6f:512)
at new Promise (<anonymous>)
at Function.detectNetwork (contract.js?6b6f:503)
at Function.deployed (contract.js?6b6f:451)
at Store.eval (index.js?e3b1:444)
at Array.wrappedActionHandler (vuex.esm.js?edaa:704)
at Store.dispatch (vuex.esm.js?edaa:426)
at boundDispatch (vuex.esm.js?edaa:332)
at eval (index.js?e3b1:273)
at tryCatcher (bluebird.js?e531:5063)
at Promise._settlePromiseFromHandler (bluebird.js?e531:3095)
at Promise._settlePromise (bluebird.js?e531:3153)
at Promise._settlePromise0 (bluebird.js?e531:3198)
at Promise._settlePromises (bluebird.js?e531:3281)
at eval (bluebird.js?e531:162)
at MutationObserver.eval (bluebird.js?e531:4330)

Hat jemand irgendwelche Ideen? Aus der Dokumentation und den Beispielen, die ich gelesen habe, glaube ich, dass dies funktionieren sollte, und alle Hilfe wird geschätzt!

Vielen Dank.

Ich habe das gefunden, was ähnlich aussieht github.com/trufflesuite/truffle-contract/pull/50
Nachdem ich den vorgeschlagenen Fix/Hack für das obige Trüffelproblem ausprobiert habe, behebt er mein Problem, nicht ideal, z. B. change contract.js Provider.prototype.sendAsync = function() { if (this.provider.sendAsync != null) { return this .provider.sendAsync.apply (dieser.Provider, Argumente); } return this.provider.send.apply (this.provider, arguments); };

Antworten (1)

Ich habe festgestellt, dass die Verwendung der beschriebenen Problemumgehung für dieses Ticket das Problem für mich gelöst hat: https://github.com/trufflesuite/truffle-contract/issues/57

z.B

MyContract.setProvider(web3.currentProvider);
if (typeof MyContract.currentProvider.sendAsync !== "function") {
     MyContract.currentProvider.sendAsync = function() {
        return MyContract.currentProvider.send.apply(
            MyContract.currentProvider, arguments
        );
    };
}