Truffle-Migration: Fehler: Authentifizierung erforderlich: Passwort oder Entsperren

Ich stelle den Vertrag mit Truffle bereit und habe eine Fehlermeldung erhalten Error: authentication needed: password or unlock. Ich habe bereits verwandte Fragen überprüft und nur hässliche Hacks wie "Gewünschtes Konto direkt auf dem Knoten entsperren mit" gefunden . Aber ich möchte nicht jedes Mal eine Verbindung zu meinem Knoten herstellen (ich habe 3 Testnetzwerke in meinem ), wenn ich eine neue Version bereitstellen möchte. web3.personal.unlockAccounttruffle.js

fromMeine Frage ist: Gibt es eine Möglichkeit, ein Passwort in der Truffle-Infrastruktur anzugeben, um das im Feld unter dem networkElement angegebene Konto zu entsperren ? passwordoder passfunktioniert nicht.

Mit Truffle können Sie eine Anbieter-Engine wie diese truffleframework.com/tutorials/using-infura-custom-provider verwenden , aber mit Ihrem eigenen Knoten.
@Ismael danke für die Antwort, aber Infura bietet sehr schlechte RPC-Aufrufe. Beispielsweise können Sie mit Infura kein Abonnement verwenden, da jedem „subscribe“-Aufruf ein „createFilter“-Aufruf vorausgeht, der von Infura nicht unterstützt wird. Ich habe es bereits versucht.
Es sollte genauso funktionieren, wenn Sie anstelle der Infura-URL Ihre eigene URL zur Geth-Instanz verwenden.
Dieser Artikel wurde zweimal überprüft. Sieht für meinen Fall absolut unbrauchbar aus. Könnten Sie mir bitte zeigen, wo genau in Ihrem Artikel der Vorgang zum Entsperren des Kontos angegeben ist? Ich sehe nur die Wallet-Ableitung, die Verbindung zum Remote-Knoten und ... das ist alles.
Um eine UTC-Datei anstelle der HD-Wallet zu verwenden, sollten Sie so etwas tunconst EthereumWallet = require('ethereumjs-wallet'); const jsonWallet = fs.readFileSync('<<path to UTC file>>'); const parsedWallet = JSON.parse(jsonWallet); const wallet = EthereumWallet.fromV3(parsedWallet, '<<YOUR_PASSWORD_GOES_HERE>>');
@Ismael Ich habe es auch so versucht, aber es ist ein schlechter Ansatz, weil ich die Brieftasche lokal aufbewahren muss (in meinem Fall im Git-Baum).

Antworten (2)

Ok, endlich habe ich einen Code hinzugefügt, um das Konto spontan zu entsperren. Ich möchte das Passwort nicht speichern truffle.js(aber es ist möglich), also mache ich die nächsten Dinge:

1_initial_migration.jsSo geändert :

const Web3 = require('web3');

const TruffleConfig = require('../truffle');

var Migrations = artifacts.require("./Migrations.sol");


module.exports = function(deployer, network, addresses) {
  const config = TruffleConfig.networks[network];

  if (process.env.ACCOUNT_PASSWORD) {
    const web3 = new Web3(new Web3.providers.HttpProvider('http://' + config.host + ':' + config.port));

    console.log('>> Unlocking account ' + config.from);
    web3.personal.unlockAccount(config.from, process.env.ACCOUNT_PASSWORD, 36000);
  }

  console.log('>> Deploying migration');
  deployer.deploy(Migrations);
};

Und anstatt anzurufen, truffle deployführe ich es so aus:

ACCOUNT_PASSWORD=MySup4P@ssw0rd truffle deploy

Wie Sie sehen können, stammen die Knoten-URL und der Port aus der Konfiguration, daher ist es möglich, dort Felder hinzuzufügen passwordund dann die Migration auf "Aufrufbarkeit" zu überprüfen, dh:

...
password: function() { return process.env.ACCOUNT_PASSWORD }
...

-- dasselbe, aber die Passwortlogik wird verschobentruffle.js

Sie möchten das Passwort nicht in truffle.js speichern, sind aber damit einverstanden, es in Ihrer Umgebung und Ihrem Konsolenbefehlsverlauf zu haben?
Funktioniert, muss aber web3.eth.personal.unlockAccountab web3 1.0 sein.
Dies funktioniert bei mir nicht, wenn ich es in einer Quorum-Kette bereitstelle. Empfangen abort(Error: Invalid JSON RPC response: "")zusammen mit einer 630-kb-Fehlerausgabe. Irgendwelche Updates dazu?

Wenn Sie dies für Entwicklungszwecke verwenden, könnte es eine andere Möglichkeit geben, ein Skript zu haben, das die Konten regelmäßig entsperrt. Der Vorteil dieser Methode besteht darin, dass die Migrationsskripte nicht aktualisiert werden müssen.

Ein Beispiel dafür findet sich in trufflesuite/truffle geth-accounts.js . Obwohl die obige Methode immer noch sehr ineffizient ist, da sie versucht, Konten in einer Endlosschleife zu entsperren. Eine leicht veränderte Version sieht so aus


 function unlockAccounts () {
  eth.accounts.forEach(function (account) {
    console.log('Unlocking ' + account + '.');
    personal.unlockAccount(account, '', 86400);
  });
}


function createAccounts() {
  for (var i = 0; i < 10; i++) {
    acc = personal.newAccount("");
    eth.sendTransaction({
      from: eth.accounts[0], 
      to: acc, 
      value: web3.toWei(100, "ether")
    });
  }
  unlockAccounts();
  setInterval(unlockAccounts, 86000);
}

createAccounts();