Код JavaScript для развертывания контракта (аутентификация)

Когда я запускаю свой код развертывания контракта в браузере (даже если MetaMask установлен), я получаю эту ошибку:

authentication needed: password or unlock

Код следующий:

var owner = $('#account').val();
var contract = web3.eth.contract(abi);
var contractInstance = contract.new(
    tokenName, tokenSymbol, { data: bytecode, from: owner, gas: 6721975 }
);

Пожалуйста, объясните, пожалуйста, как сделать аутентификацию, чтобы пользователь мог развернуть мой контракт.

web3.js 0.20.6.


Я подключаюсь к сети с помощью следующего кода:

    var provider = new Web3.providers.HttpProvider('http://localhost:8545');
    var web3 = new Web3(provider);
Если вы используете MetaMask, я считаю, что вы не должны видеть это сообщение. Можете ли вы поделиться кодом, где вы создаете экземпляр web3? Я предполагаю, что на самом деле вы не используете провайдера MetaMask и все еще подключаетесь к какому-то другому узлу (возможно, локальному экземпляру geth/parity), который требует пароль для разблокировки учетной записи.
@smarx Ваше предположение верно: я подключаю MetaMask к своему локальному узлу Geth и подключаю свое веб-приложение (которое я отлаживаю) к тому же узлу Geth. Должен ли я подключать MetaMask к Get и мое веб-приложение к MetaMask? (Как подключиться к MetaMask?)
@smarx я отредактировал вопрос, как вы просили

Ответы (2)

Чтобы использовать MetaMask, вам нужен код, который выглядит так:

var web3 = new Web3(web3.currentProvider);

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

Чтобы MetaMask подключился к вашему локальному узлу geth, просто щелкните раскрывающийся список в пользовательском интерфейсе MetaMask, который позволяет выбрать вашу сеть. Один из вариантов должен быть «localhost 8545». Если вы не используете этот порт, вы можете выбрать «Пользовательский RPC» и указать URL-адрес.

Хорошо, теперь это работает с MetaMask. Но как это сделать пользователям без MetaMask?
Для пользователей, не использующих MetaMask (или Mist, или какой-либо другой провайдер web3), я полагаю, им нужно будет запустить локальный узел (например, geth или parity) и оставить там учетную запись разблокированной. Но это невероятная степень доверия пользователя к вашему приложению, поэтому, надеюсь, пользователи этого не сделают.
Разве пользователи без MetaMask не могут просто явно ввести закрытый ключ (без запуска локального узла)?
Они могли бы, хотя предоставление вашему приложению своего закрытого ключа так же опасно, как и предоставление вам доступа к узлу с разблокированной учетной записью. Чтобы использовать закрытый ключ, вам понадобится код для локальной подписи транзакций, а затем их трансляция на общедоступный узел через sendRawTransaction/ sendSignedTransaction(зависит от версии web3.js). Но опять же, пользователи не должны доверять вам свои закрытые ключи.

Вы также можете настроить его так:

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');

const provider = ganache.provider();
const web3 = new Web3(provider);

const { interface, bytecode } = require('../compile');

let accounts;
let inbox;

beforeEach(async () => {
  // Get a list of accounts
  accounts = await web3.eth.getAccounts();

  // Use one of those accounts to deploy contract
  inbox = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({
      data: bytecode,
      arguments: ['hi there']
    })
    .send({ from: accounts[0], gas: '1000000' });

  inbox.setProvider(provider);
});