Uncaught TypeError: web3.personal.sign ist keine Funktion, wenn eine mit Trüffel erstellte DApp verwendet wird

Ich verwende Metamask auf Chrome.

Wenn ich Folgendes in der Entwicklerkonsole auf einer zufälligen Seite ausführe oder sogar Etherdelta Metamask mich auffordert, eine Nachricht zu signieren, und dies das erwartete Verhalten ist.

web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)

Wenn ich jedoch versuche, dasselbe in der Entwicklungskonsole auf der von erstellten Basis-Dapp auszuführen, $ truffle init webpackerhalte ich eine Fehlermeldung, die besagt:

Uncaught TypeError: web3.personal.sign is not a function

web3.personal hat keine Funktion "Signieren", sondern hat nur ["_requestManager", "newAccount", "unlockAccount", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"]auf der Trüffel-Dapp, aber auf anderen Websites Folgendes ["_requestManager", "newAccount", "importRawKey", "unlockAccount", "ecRecover", "sign", "sendTransaction", "lockAccount", "listAccounts", "getListAccounts"].

Hinweis: web3.eth.sign(web3.eth.coinbase, '0x68656c6c6f', console.log)Funktioniert trotzdem.

Warum passiert das?


Schritte zum Reproduzieren des Problems:

  1. Erstellen Sie die grundlegende Trüffel-Dapp, indem Sie die folgenden Befehle ausführen:

    • truffle init webpack
    • Trüffel kompilieren
    • Trüffel wandern
    • npm laufen dev
  2. Öffnen Sie http://127.0.0.1:8081 in Chrome

  3. Führen Sie web3.personal.sign('0x68656c6c6f', web3.eth.accounts[0], console.log)in der Entwicklungskonsole aus.

Antworten (1)

In Summe

Verwenden Sie web3.eth.sign()stattdessen.

Warum nicht web3.personal?

Obwohl web3.personales in einigen Implementierungen definiert ist, ist es, soweit ich das beurteilen kann, kein Standard.

Die v0 web3.js-API listet die persönliche API nicht auf. Dasselbe gilt für v1, mit Ausnahme von web3.eth.personal, was möglicherweise das ist, was Sie möchten.

Ich glaube, dass Metamask die nicht standardmäßige API aufdeckt web3.personal. (So ​​ist das web3 in enthalten geth attach)

Update: Bestätigung von Metamask

Als Antwort von Metamask auf meine Frage: "Welche Spezifikation haben Sie zugrunde gelegt web3.personal?"

kumavis kommentierte vor 15 Minuten

@carver et al . Geth-
Thread: ethereum/go-ethereum#2940
unsere Implementierung: https://github.com/metamask/eth-sig-util
Anwendungsbeispiele: https://github.com/flyswatter/js-eth-personal -Zeichen-Beispiel

Das bestätigt meine Vermutung, das web3.personalist kein Standard. Manche Kunden kopieren, was andere Kunden gemacht haben. Man kann also nicht davon ausgehen, dass es überall gleich gemacht wird.

Web3.js v0 vs. v1 in Trüffel

Der neueste Versionshinweis von Truffle , in dem web3.js erwähnt wird, lautet:

v3.4.6 ... Intern: Wir verwenden jetzt web3 v0.20.1 innerhalb von Truffle

Sie müssen sich also mit der Implementierung von v0 web3.js begnügen, web3.eth.signbis sie auf v1 aktualisiert werden. V1 befindet sich noch in der Beta-Phase, daher kann es sein, dass es nicht sofort passiert.