У меня есть приложение 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.
Вот пример настройки провайдера 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'))
}
Вот учебник от трюфеля по этому вопросу: 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);
ЧжоуВ