Der einfachste Weg, Infura mit einer Web3/Truffle-App zu integrieren?

Ich habe eine Truffle/Web3-App, die diesen Code in app.js (standardmäßig) enthält, der ausgeführt wird, wenn die Seite geladen wird:

$(document).ready(function () {
  if (typeof web3 !== 'undefined') {
    console.warn('Using web3 detected from external source like Metamask')
    window.web3 = new Web3(web3.currentProvider)
  } else {
    console.warn("No web3 detected. Falling back to http://localhost:8545. You should remove this fallback when you deploy live, as it's inherently insecure. Consider switching to Metamask for development. More info here: http://truffleframework.com/tutorials/truffle-and-metamask")
    window.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'))
  }

Meine truffle.js-Datei sieht so aus:

require('babel-register')

module.exports = {
  networks: {
    "ropsten": {
      host: 'localhost',
      port: 8545,
      network_id: 3, // Ropsten
      gas: 500000
    }
  }
}

Ich habe mich auch bei Infura angemeldet, das mir eine "Anbieter-URL" wie https://ropsten.infura.io/xxxxxxxxxxxxxxxxxxxxx gegeben hat

Wie sollte ich dann meine truffle.js und app.js richtig konfigurieren, damit ich Infura verwende? Ich möchte Infura verwenden, um Benutzer anzuzeigen, die keine MetaMask/Parity/Mist-Daten aus der Blockchain verwenden (damit die App weiterhin Funktionen aus meinem Vertrag aufrufen kann), während Infura ignoriert werden sollte, wenn erkannt wird, dass der Benutzer verwendet MetaMask/Parity/Mist.

Ich habe versucht, meine Ropsten-Provider-URL wie folgt zu verwenden: window.web3 = new Web3(new Web3.providers.HttpProvider(' ropsten.infura.io/xxxxxxxxxxxxxxxxxxxxx' )) Dies führt zu "new BigNumber() not a base 16 number"-Fehlern was die App kaputt macht, glaube ich weil der Infura Node nicht aktuell ist (vielleicht ein paar Minuten hinterherhinkt). Jeder Beitrag von jemandem, der Infura erfolgreich eingesetzt hat, um Daten aus der Blockchain für Benutzer ohne MetaMask abrufen zu können, wäre willkommen.

Antworten (2)

Hier ist ein Beispiel für die Einrichtung eines Infura-Anbieters mit truffle-hdwallet-provider mit einer benutzerdefinierten Brieftasche:

const HDWalletProvider = require('truffle-hdwallet-provider')
const fs = require('fs')

const mnemonic = process.env.MNEMONIC

module.exports = {
  networks: {
    development: {
      host: 'localhost',
      port: 8545,
      gas: 4500000,
      gasPrice: 25000000000,
      network_id: '*' 
    },
    kovan: {
      provider: new HDWalletProvider(mnemonic, 'https://kovan.infura.io'),
      network_id: '*',
      gas: 4500000,
      gasPrice: 25000000000
    },
    rinkeby: {
      provider: new HDWalletProvider(mnemonic, 'https://rinkeby.infura.io'),
      network_id: '*',
      gas: 4500000,
      gasPrice: 25000000000
    },
    mainnet: {
      provider: new HDWalletProvider(mnemonic, 'https://mainnet.infura.io'),
      network_id: '*',
      gas: 4500000,
      gasPrice: 25000000000
    }
  }
}

Stellen Sie dann beim Deployment einfach die Netzwerkoption ein:

truffle migrate --reset --network=rinkeby

So stellen Sie in der Benutzeroberfläche den Web3-HTTP-Anbieter auf infura ein:

if (typeof web3 !== 'undefined') {
    window.web3 = new Web3(web3.currentProvider)
} else {
    window.web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io:443'))
}
Müssen Sie Ihren Infura-API-Code nicht zu den URLs hinzufügen?
@Andrey zum Zeitpunkt des Schreibens dieses Beitrags war dies nicht erforderlich, aber Sie könnten Recht haben

Hier ist ein Tutorial von truffle dazu: https://truffleframework.com/tutorials/using-infura-custom-provider

Ich denke, das Speichern und Handhaben der Mnemonik ist jedoch ziemlich riskant (da sie die volle Kontrolle über die gesamte Brieftasche gibt).

Für mich hat die Verwendung von Infura als HTTPProvider, wie in der obigen Antwort vorgeschlagen, nicht funktioniert, also musste ich auch:

var HDWalletProvider = require("truffle-hdwallet-provider");
var mnemonic = 'xxx xxx xxx... ';

var hd = new HDWalletProvider(mnemonic, "https://ropsten.infura.io/v3/xxxxyyyzzz");    
window.web3 = new Web3(hd); 
Zwei Vorschläge, um dies zur besten Antwort zu machen. Verwenden Sie zunächst dotenv, um den Mnemonik- und Infura-API-Schlüssel in einer nicht festgeschriebenen Datei .env zu speichern. Zweitens hat es bei mir nur funktioniert, nachdem ich zu v1 anstelle von v3 gewechselt hatte.