Как войти в web3 без MetaMask?

Можно ли подписать пользователя в web3 без MetaMask? Я пытаюсь выполнить созданный мной смарт-контракт и использую Infura для подключения к тестовой сети Kovan, но web3.eth.accounts[0] не определен. Как я могу войти в систему без использования MetaMask? Это вообще возможно? Если нет, то как мне подойти к этой проблеме? Пожалуйста и спасибо вам!

Ответы (2)

Что вы должны сделать в этом случае, это использовать 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.

Я думаю, что-то изменилось. Во-первых, мне пришлось добавить myWalletтак: engine.addProvider(new WalletSubprovider(myWallet, {}))возможно, просто изменение API. С этим движком я могу вызывать методы контракта только для чтения, но отправка транзакций приводит к[Error: Method not found] message: 'Method not found', code: -32601
@sudo Я бы предложил использовать альтернативную библиотеку. Я добавил альтернативный фрагмент кода в исходную тему, используя ethers.js, который я считаю довольно интуитивно понятным для пользователя.
Спасибо. Пару дней назад я выяснил, как вручную подписывать свои транзакции с помощью web3 вместо использования библиотеки MetaMask, и да, это было ужасно болезненно. Я попробую вашу настройку ether.js в следующий раз, потому что она выглядит намного лучше. Во всяком случае, это то, что я получил, работая над web3: gist.github.com/AlecZadikian9001/…

возможно, это поможет https://github.com/MetaMask/provider-engine и немного информации здесь http://truffleframework.com/tutorials/using-infura-custom-provider

Хотя это может ответить на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.