Signiernachricht: Angegebene Adresse ist ungültig, der Groß-/Kleinschreibungstest ist fehlgeschlagen oder es handelt sich um eine indirekte IBAN-Adresse, die nicht umgewandelt werden kann

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.

Hast du es versucht 0x2E290A50d3193753F156e5b0b12e4231Bd568526? (Das hat die korrekte Prüfsumme für die Großschreibung.)
Was ist der Unterschied?
Der Unterschied liegt in der Großschreibung.
@smarx Ich habe versucht, let addr = "0x2E290A50d3193753F156e5b0b12e4231Bd568526"; let from = this.toChecksumAddress(addr); window.web3.eth.sign(von ... gleicher Fehler

Antworten (4)

Ich denke, es gibt zwei Probleme:

  1. In Web3.js 1.0.0 ist die Reihenfolge der Parameter web3.eth.sign(dataToSign, accountToSignWith, callback), aber Sie übergeben zuerst das Konto zum Signieren.
  2. Ich glaube nicht, dass es eine Möglichkeit gibt, solche Objekte zu signieren, obwohl Sie vielleicht etwas wissen, was ich nicht weiß?

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_signmö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);
});
Hey, ich kann eine Nachricht signieren, wenn ich den 2. Param zu einer meiner Adressen ändere! Daher markiere ich das jetzt mal als richtig. Wenn ich jedoch den ersten Parameter in eine normale Zeichenfolge ändere, z. "test", wenn ich auf das Zeichen klicke, bleibt Metamask beim Drehen hängen (seltsam). Meine Absicht hinter diesem Prozess ist es, eine Nachricht zu signieren, die beweist, dass der Unterzeichner der Nachricht die Adresse ist, für die sie sich ausgeben
Ich glaube, die zu signierenden Daten müssen 32 Bytes groß sein. Wenn ich es mit einer kürzeren Zeichenfolge versuche und das MetaMask-Popup inspiziere, sehe ich einen in der Konsole protokollierten Fehler: „Nachrichtenlänge ist ungültig“. Siehe github.com/MetaMask/metamask-extension/issues/1530 .
Danke, ich bekomme keinen Fehler, nur ein Windrad in der Metamaske
Wenn Sie mit der rechten Maustaste auf das MetaMask-Popup klicken und auf "Inspizieren" klicken und dann die Konsole anzeigen, sollten Sie dort einen Fehler sehen, der, wenn er erweitert wird, die von mir erwähnte Meldung enthält.
Bitte beachten Sie auch meine Bearbeitung. Basierend auf diesem GitHub-Problem bevorzugen Sie möglicherweise die Verwendung von personal_sign. Die Benutzeroberfläche ist viel besser.
Rechtsklick funktioniert nicht - kein Menü auf Metamask. Auf dem Mac ist das vielleicht der Grund. (Ich habe gerade die reguläre Konsole aus den Entwicklertools überprüft.)
Seltsam. Ich bin auch auf einem Mac. Ich denke jedenfalls, dass wir das Problem kennen.
Und siehe meine zweite Bearbeitung für die Verwendung von signTypedData, was anscheinend das ist, wonach Sie gesucht haben.
Cool, also kann ich TypedData signieren, um eine Nachricht zu überprüfen, und dann mit wiederherstellensigUtil.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

Hallo. web3.toChecksumADdress ist nicht definiert. web3.eth.iban.checksum var i = new web3.eth.iban("XE81ETHXREGGAVOFYORK");ist aus der Dokumentation ... Ich sehe keine klare Möglichkeit, es zu verwenden
Möglicherweise verwenden Sie eine Betaversion von web3 1.0.0. Wenn ja, web3.utils.toChecksumAddressstattdessen.
Hallo @smarx , ich benutze Beta und habe es versucht web3.utils.toChecksumAddress. Ich bekomme den gleichen Fehler.
@smarx sieht so aus, als gäbe es eine Möglichkeit, Objekte zu signieren. medium.com/metamask/… , github.com/danfinlay/js-eth-personal-sign-examples << scheint beim Signieren zu funktionieren, muss die Verifizierung testen

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

#1 ist der TX-Hash. Transaktionsergebnis != Vertragsadresse

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.

So wie es derzeit geschrieben steht, ist Ihre Antwort unklar. Bitte bearbeiten Sie, um zusätzliche Details hinzuzufügen, die anderen helfen zu verstehen, wie dies die gestellte Frage beantwortet. Weitere Informationen zum Verfassen guter Antworten finden Sie in der Hilfe .