Самый простой способ интегрировать Infura с приложением Web3/Truffle?

У меня есть приложение Truffle/Web3 с этим кодом в app.js (по умолчанию), которое запускается при загрузке страницы:

$(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'))
  }

Мой файл truffle.js выглядит так:

require('babel-register')

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

Я также подписался на Infura, которая предоставила мне «URL-адрес провайдера», например https://ropsten.infura.io/xxxxxxxxxxxxxxxxxxxxx .

Как мне правильно настроить truffle.js и app.js, чтобы использовать Infura? Я хотел бы использовать Infura, чтобы показать пользователям, которые не используют данные MetaMask/Parity/Mist из блокчейна (чтобы приложение могло по-прежнему вызывать функции из моего контракта), в то время как Infura следует игнорировать, если обнаружено, что пользователь использует MetaMask/Parity/Mist.

Я попытался использовать URL-адрес своего провайдера ropsten следующим образом: window.web3 = new Web3(new Web3.providers.HttpProvider(' ropsten.infura.io/xxxxxxxxxxxxxxxxxxxxx' )) Это приводит к ошибкам «new BigNumber() not a base 16 number» которые ломают приложение, я полагаю, потому что узел Infura не обновлен (возможно, отстает на несколько минут). Будем признательны за любой вклад от кого-то, кто успешно использовал Infura для получения данных из блокчейна для пользователей без MetaMask.

Ответы (2)

Вот пример настройки провайдера infura с помощью truffle-hdwallet-provider с пользовательским кошельком:

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
    }
  }
}

Затем просто установите параметр сети при развертывании:

truffle migrate --reset --network=rinkeby

Вот как в пользовательском интерфейсе установить поставщика HTTP Web3 для infura:

if (typeof web3 !== 'undefined') {
    window.web3 = new Web3(web3.currentProvider)
} else {
    window.web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby.infura.io:443'))
}
Вам не нужно добавлять свой API-код Infura в URL-адрес?
@Андрей на момент написания этого поста это не требовалось но может ты и прав

Вот учебник от трюфеля по этому вопросу: https://truffleframework.com/tutorials/using-infura-custom-provider

Я полагаю, что хранить и обрабатывать мнемонику довольно рискованно (поскольку она дает полный контроль над всем кошельком).

Для меня использование Infura в качестве HTTPProvider, как предложено в ответе выше, не сработало, поэтому мне также пришлось:

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); 
Два предложения, чтобы сделать это лучшим ответом. Во-первых, используйте dotenv, чтобы сохранить мнемонику и ключ API infura в незафиксированном файле .env. Во-вторых, у меня это сработало только после перехода на v1 вместо v3.