Entsperren Sie das Remote-Konto

Ich habe einen intelligenten Vertrag bereitgestellt, der Gelder akzeptiert (über die Fallback-Funktion function() payable { ... }). Außerdem habe ich ein Frontend mit web3, um Geld zu senden.

Als ich es mit einem lokalen Knoten (und lokal präsentierten JSON-Geldbörsen) getestet habe, funktioniert alles einwandfrei - web3.personal.unlockAccount(account, password)entsperrtes Konto mit Daten, die vom Benutzer bereitgestellt werden, und dann Gelder, die an den Vertrag gesendet werden.

Jetzt habe ich gethden Knoten auf einem eigenständigen VPS bereitgestellt und mit Code eine Verbindung hergestellt:

var Web3 = require('web3');
this.web3 = new Web3();
this.web3.setProvider(new Web3.providers.HttpProvider('http://my-node-addr.net:18545/'));

if(this.web3.isConnected()) {
  console.log('web3 connected');
} else {
  console.log('web3 NOT connected');
}

Es zeigt, dass der Client erfolgreich verbunden ist. Aber wenn ich versuche, den Geldcode online zu senden, ist dies fehlgeschlagen

web3.personal.unlockAccount(account, password);

mit Fehler Error: no key for given address or file. Natürlich kann mein Knoten nicht alle Brieftaschendateien des Kunden enthalten (niemand möchte sie hochladen).

So sende ich die Transaktion:

this.contract.sendTransaction({ from: account, value: amount, gas: 400000 })
.then(() => {
    // OK, everything fine!
})
.catch(error => {
    // I am here
    console.log('Oops...', 'Error happened during your payment: ' + error, 'error');
});

UPD: Was ich will: eine HTML-Seite mit den Feldern "Konto", "Passwort" und "Betrag" bereitstellen, die es Benutzern ermöglicht, Ether an eine vordefinierte Adresse zu senden. Natürlich wird mein Knoten keine UTC-.....Dateien (Wallets) haben.

Haben Sie darüber nachgedacht, das MetaMask-Browser-Plugin zu verwenden, um die Brieftaschen des Kunden zu speichern und Transaktionen von der Kundenseite zu senden? In diesem Fall müssen Sie kein Konto entsperren. Vielleicht hilft es dir.
@ViktorBaranov Ich möchte Kunden nicht zwingen, Pugins, Chrome-Browser oder irgendetwas anderes zu installieren. Alles, was ich möchte, ist, eine HTML-Seite mit den Feldern "Konto" und "Passwort" bereitzustellen, mit denen Benutzer Ethereum an ein vordefiniertes Konto senden können.
@niksmac Diese Frage ist völlig unabhängig, da dieses OP keine Probleme mit dem Entsperren von Konten hat und wie ich sehe, meint er Konten, deren Brieftaschen auf dem Zielknoten angezeigt werden. Meine Frage bezieht sich auf das Entsperren von Konten, deren Brieftaschen nicht auf dem Knoten angezeigt werden.

Antworten (1)

Die Methode sendTransactionfunktioniert, weil geth Zugriff auf den privaten Schlüssel hat. Da sich der private Schlüssel in Ihrem Szenario im Client befindet, hat geth keinen Zugriff darauf und kann die Transaktion nicht signieren.

Sie müssen die Transaktion auf der Clientseite signieren und verwenden, sendRawTransactionum Ihre signierte Transaktion zu übertragen. Sie können eth-lightwallet verwenden , um Schlüssel clientseitig zu verwalten. Wenn Sie etwas auf niedrigerer Ebene wünschen, können Sie ethereumjs-tx verwenden , um Ihre eigenen Transaktionen zu erstellen und zu signieren.

Um eine Rohtransaktion zu signieren, brauche ich einen privaten Schlüssel vom Benutzer, richtig?
Ja, Sie benötigen den privaten Schlüssel des Benutzers.