Можно ли подписать пользователя в web3 без MetaMask? Я пытаюсь выполнить созданный мной смарт-контракт и использую Infura для подключения к тестовой сети Kovan, но web3.eth.accounts[0] не определен. Как я могу войти в систему без использования MetaMask? Это вообще возможно? Если нет, то как мне подойти к этой проблеме? Пожалуйста и спасибо вам!
Что вы должны сделать в этом случае, это использовать web3-provider-engine. Пример фрагмента кода, работающего с пользовательским закрытым ключом и URL-адресом Infura API (или даже TestRPC), будет следующим:
//Provider Engine sub-modules
const ProviderEngine = require('web3-provider-engine')
const CacheSubprovider = require('web3-provider-engine/subproviders/cache.js')
const FixtureSubprovider = require('web3-provider-engine/subproviders/fixture.js')
const FilterSubprovider = require('web3-provider-engine/subproviders/filters.js')
const VmSubprovider = require('web3-provider-engine/subproviders/vm.js')
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js')
const RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js')
//EthereumJS Wallet Sub-Provider
const WalletSubprovider = require('ethereumjs-wallet/provider-engine')
const walletFactory = require('ethereumjs-wallet')
//Web3 Module
const Web3 = require('web3')
//Wallet Initialization
var privateKey = "3a1076bf45ab87712ad64ccb3b10217737f7faacbf2872e88fdd9a537d8fe266"
var privateKeyBuffer = new Buffer(privateKey, "hex")
var myWallet = walletFactory.fromPrivateKey(privateKeyBuffer)
//Engine initialization & sub-provider attachment
var engine = new ProviderEngine();
engine.addProvider(new FixtureSubprovider({
web3_clientVersion: 'ProviderEngine/v0.0.0/javascript',
net_listening: true,
eth_hashrate: '0x00',
eth_mining: false,
eth_syncing: true,
}))
// cache layer
engine.addProvider(new CacheSubprovider())
// filters
engine.addProvider(new FilterSubprovider())
// pending nonce
engine.addProvider(new NonceSubprovider())
// vm
engine.addProvider(new VmSubprovider())
// Here the URL can be your localhost for TestRPC or the Infura URL
engine.addProvider(new RpcSubprovider({
rpcUrl: 'https://mainnet.infura.io/YOUR_ACCESS_TOKEN',
}))
// Wallet Attachment
engine.addProvider(new WalletSubprovider(myWallet))
// network connectivity error
engine.on('error', function(err){
// report connectivity errors
console.error(err.stack)
})
// start polling for blocks
engine.start()
//Actual Initialization of the web3 module
var web3 = new Web3(engine)
Вы сможете подписывать любые транзакции с помощью предоставленного закрытого ключа, указав свой открытый ключ в качестве значения «от» в объекте настроек каждого вызова функции web3.
РЕДАКТИРОВАТЬ: я лично презираю библиотеку web3, и в результате я решил переделать фрагмент, чтобы использовать библиотеку ethers.js, которая имеет более удобочитаемый API:
//Provider Engine sub-modules
const ethers = require('ethers');
const Wallet = ethers.Wallet;
const Contract = ethers.Contract;
const utils = ethers.utils;
const providers = ethers.providers;
//Note the "0x" appended at the start
let privateKey = "0x3a1076bf45ab87712ad64ccb3b10217737f7faacbf2872e88fdd9a537d8fe266";
let network = "http://192.168.1.1:8545";
//let network = "kovan";
//let network = "ropsten";
//let network = "rinkeby";
//let network = "homestead";
//let infuraAPIKey = "9LPi9fDukz8phfLXdy5K";
let provider = new providersJsonRpcProvider(network, 'homestead');
//let provider = new providers.InfuraProvider(network, infuraAPIKey);
let serverWallet = new Wallet(privateKey, provider);
Это в основном все. Теперь вы можете отправлять с ним транзакции или создавать объекты Contract для взаимодействия с контрактами. Дополнительную информацию см. в документации по ethers.js.
возможно, это поможет https://github.com/MetaMask/provider-engine и немного информации здесь http://truffleframework.com/tutorials/using-infura-custom-provider
судо
myWallet
так:engine.addProvider(new WalletSubprovider(myWallet, {}))
возможно, просто изменение API. С этим движком я могу вызывать методы контракта только для чтения, но отправка транзакций приводит к[Error: Method not found] message: 'Method not found', code: -32601
Алекс Папагеоргиу
судо