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 geth
den 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.
Die Methode sendTransaction
funktioniert, 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, sendRawTransaction
um 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.
Viktor Baranow
Niksmac
Alex GP
Alex GP