Sofern die Adresse ungültig ist, der Prüfsummentest für die Großschreibung fehlgeschlagen ist oder es sich um eine indirekte IBAN-Adresse handelt, die nicht konvertiert werden kann , handelt es sich um das Signieren von Nachrichten
Mein Code:
const msgParams = [{
type: 'string', name: 'Message', value: 'Hi, Alice!'
},{ type: 'uint32', name: 'A number', value: '1337'
}];
let from = Merchant.accounts[0];
console.log(window.provider);
let p = window.provider;
console.log(Object.keys(window.web3));
window.web3.eth.sign(from, msgParams, function(err, res) {
console.log(err);
console.log(res);
});
(window.provider ist der aktuelle Anbieter.. window.web3 verliert seinen aktuellen Anbieter, siehe meine andere Frage window.web3.currentProvider ist null für Details)
Wenn ich dies ausführe, erhalte ich den Fehler im Titel
Metamask aufgefordert, zu unterschreiben.. einmal. Jetzt wird die Eingabeaufforderung nicht angezeigt. Die Signieraufforderung enthielt die Alice, 1337-Daten.
Wie signiere ich eine Nachricht mit Metamask, um die verschlüsselte Zeichenfolge dieser signierten Nachricht zu erhalten?
EDIT: Merchant ist meine Utility-Klasse für Metamask. Die protokollierte Ausgabe von Merchant.accounts[0] ist
0x2e290a50d3193753f156e5b0b12e4231bd568526
EDIT 2: Ich habe das versucht:
web3.eth.getAccounts(function(a,b) {
Merchant.accounts = b;
// alert("Saving accounts" + Merchant.accounts);
console.log("Merchant accounts: " + Merchant.accounts);
let x = web3.eth.getBalance;
console.log(x);
});
toChecksumAddress (address) {
address = address.toLowerCase().replace('0x', '')
var hash = createKeccakHash('keccak256').update(address).digest('hex')
var ret = '0x'
for (var i = 0; i < address.length; i++) {
if (parseInt(hash[i], 16) >= 8) {
ret += address[i].toUpperCase()
} else {
ret += address[i]
}
}
return ret
}
reloadKeys() {
const msgParams = [{
type: 'string', name: 'Message', value: 'Hi, Alice!'
},{ type: 'uint32', name: 'A number', value: '1337'
}];
// Merchant.accounts[0]
// let addr = 0x2E290A50d3193753F156e5b0b12e4231Bd568526;
let from = this.toChecksumAddress(Merchant.accounts[0]);
// window.web3.utils.toChecksumAddress();
console.log(typeof(from));
console.log(from);
console.log(Object.keys(window.web3));
window.web3.eth.sign(from, msgParams, function(err, res) {
console.log(err);
console.log(res);
});
Ich bekomme immer noch diesen Fehler.
Ich denke, es gibt zwei Probleme:
web3.eth.sign(dataToSign, accountToSignWith, callback)
, aber Sie übergeben zuerst das Konto zum Signieren.Versuchen Sie dies, um zu beginnen:
web3.eth.sign(web3.utils.sha3("test"), '0x2E290A50d3193753F156e5b0b12e4231Bd568526', function (err, result) { console.log(err, result); });
Stellen Sie sicher, dass das funktioniert, und fahren Sie dann fort, um zu unterschreiben, was Sie wollen.
BEARBEITEN
Laut https://github.com/MetaMask/metamask-extension/issues/1530 ist personal_sign
möglicherweise eine bessere Option:
var fromAddress = '0x2E290A50d3193753F156e5b0b12e4231Bd568526';
web3.currentProvider.sendAsync({
method: 'personal_sign',
params: [
web3.utils.fromAscii('hello world'),
fromAddress,
],
from: fromAddress,
}, function (err, result) {
console.log(err, result);
});
EDIT2
Noch besser eth_signTypedData
:
web3.currentProvider.sendAsync({
method: 'eth_signTypedData',
params: [
[
{ type: 'string', name: 'Message', value: 'Hi, Alice!' },
{ type: 'uint32', name: 'A number', value: 1337 }
],
fromAddress,
],
from: fromAddress,
}, function (err, result) {
console.log(err, result);
});
personal_sign
. Die Benutzeroberfläche ist viel besser.signTypedData
, was anscheinend das ist, wonach Sie gesucht haben.sigUtil.recoverTypedSignature({ data: msgParams, sig: result.result })
Zum Signieren ist eine Prüfsummenadresse erforderlich, die mit der web3-Funktion generiert werden kann toChecksumAddress
. Ihr Code muss also wie folgt angepasst werden:
let from = web3.toChecksumAddress(Merchant.accounts[0]);
Die Prüfsumme wird durch Großschreibung bestimmter hexadezimaler Buchstaben gemäß dem von Vitalk in EIP-55 entwickelten Algorithmus berechnet
web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");
ist aus der Dokumentation ... Ich sehe keine klare Möglichkeit, es zu verwendenweb3.utils.toChecksumAddress
stattdessen.web3.utils.toChecksumAddress
. Ich bekomme den gleichen Fehler.Die Remix-Transaktionsergebnisadresse, die ich zur Verwendung als Vertrag kopiere, ist für web3 tatsächlich nicht mehr als Vertragshash gültig (ich weiß nicht warum). Ich ging zu etherscan.io und sehe alle Transaktionen von meiner Adresse , klicke auf die letzte "Vertragserstellung" , die mir eine andere Adresse als die Remix-Ausgabe gibt.
Ich habe diese Adresse verwendet und dieser Fehler endet.
1 – Remix-Ausgabe-Hash aus Vertrag: 0x866e8ea2987873e4a0b985a5f408181c2b476cc9cf74f41dbb1e5e2231633821
2 – Etherscan-Transaktionsdetail
3 – Vertragsadresse: 0x525d67ef6a08ad80c0956ca04af7eb2cd02a8bf0
hatte ein ähnliches Problem, versuchen Sie, die Adresse direkt von bscscan zu kopieren und als Zeichenfolge zu übergeben, z. B. '0xE60000', keine erneute Konvertierung erforderlich.
Benutzer19510
0x2E290A50d3193753F156e5b0b12e4231Bd568526
? (Das hat die korrekte Prüfsumme für die Großschreibung.)Benutzer22075
Benutzer19510
Benutzer22075