"Aktualisiert:" Wie wird die "Ausgabe" von "web3.personal.sign" im "Browser" angezeigt? ("Methode personal_sign wird nicht unterstützt")

Hinweis: Ich habe den html/ JavaScript-Code gemäß der Antwort aktualisiert und diesen META-MASK-Beispielcode für den Web3-Anbieter verwendet. Ich erhalte jedoch den gleichen Fehler. Ich habe schließlich nicht verstanden, dass ich testRPC ausführen muss oder nicht? .

Ich führe den folgenden html JavaScriptCode aus, um eine Signatur zu generieren, nachdem ich Meta Mask wie folgt ausgeführt testRPCund verwendet habe :

(1) laufen testRPC:

PS C:\Users\s> testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2

Available Accounts
==================
(0) 0xf4d2b942c3baebef5b81f4b909904015166b238a
(1) 0xef0d1e102d33252f232b39b31950f736ab2535aa
(2) 0x23064a138dc6b681a51a18b837a376f061fbc511
(3) 0x2dfaf5c48bc3c868f63741d6cd0489b336e74b03
(4) 0x372110011158860806d9d9b19aa67c045740727a
(5) 0x3faa74be50e1dfa86e5f6951a8c11b3e726edf65
(6) 0xaecc4c8f0b802b83a2cd84e6c98ecad6b0495c00
(7) 0x36b08ae47ec94870b98b0e0d98fca2646332ae87
(8) 0x1461cfb91f6fd2aca8d722dce9f67f7806732e49
(9) 0x1a0b2fd11e57f6473ae5f9b55e17cbfb6d8b504e

Private Keys
==================
(0) acb8b8ee76ce99fc390127ae88e246d3f8d8ac3db7
(1) 8957622705ccec21da4791f8535c70ab4726bfbe08
(2) 41181e3cf8c0294e949062a894bd96aea15e342db5
(3) c1bad63470c62b56032b034df0f0b827779e678cfd
(4) f49109620e9e56aa0bff9bdeb486d05ca75732cf1a
(5) ed1107372972a702c166924846f6d01234b9d277a7
(6) 10afce272e6a3d1d3474c385bf28be7e58de991995
(7) 0a92c9aa01497d29f01023cdeb50429954be06c949
(8) 87d0c56f9cab4c86ebc66749d0894719b647f72cea
(9) c8ca68e445b249a7d860fc3d76b210d6dd1a1c2197

HD Wallet
==================
Mnemonic:      access invest retire civil eagl
Base HD Path:  m/44'/60'/0'/0/{account_index}

(2) Auswählen 0xf4d2b942c3baebef5b81f4b909904015166b238aals Unterzeichneradresse.

(3) Hinzufügen 0xf4d2b942c3baebef5b81f4b909904015166b238azu Meta Mask .

(4) Folgendes html/ JavaScriptCode in ausführen Google Chrome:

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <title>EthereumJS - Browser Example</title>
</head>

<body>
  <script src="https://rawgit.com/ethereumjs/browser-builds/master/dist/ethereumjs-abi/ethereumjs-abi-0.6.5.js"></script> 
  <script src="https://rawgit.com/ethereum/web3.js/develop/dist/web3.js"></script> 
  <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script>

  <script>

window.addEventListener('load', function() {

   // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    web3 = new Web3(web3.currentProvider);
  } else {
    console.log('No web3? You should consider trying MetaMask!')
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
  }

//  var Web3 
//  web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

  function constructPaymentMessage(contractAddress, amount) 
  {
  return ethereumjs.ABI.soliditySHA3(
    ["address", "uint256"],
    [contractAddress, amount],
  );
  }

  var message = constructPaymentMessage("0x0f0f422477d83bcbed227b0ae2fa3ace7ea3c653", 100);
  console.log(message);

  web3.personal.sign("0x" + message.toString("hex"), "0xF4D2B942c3baebef5B81F4B909904015166b238A", function(err, signature) {
  console.log(signature);
  console.log(err);
  // Be sure to make use of the signature only here.
  // It will not be defined until this callback is invoked.
});

}) 
  </script>
</body>
</html>

Und folgendes ist das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie das

Uint8Array(32) [2, 16, 48, 216, 191, 103, 173, 178, 132, 121, 144, 241, 45, 224, 83, 239, 76, 206, 69, 151, 42, 86, 174, 144, 3, 97, 172, 171, 166, 231, 234, 10]

ist der messageWert und das Ergebnis von console.log(message);und nicht der Signaturwert , und wenn ich console.log(signature);die Ausgabe verwende, ist nur undefined.

Wie kann ich den Signaturwert sehen ?

Und das Folgende ist die Fehlermeldung, Ergebnis von console.log(err);:

Fehler: Methode personal_sign wird nicht unterstützt

Error: Error: Method personal_sign not supported.
    at GethApiDouble.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89858:16)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethDefaults.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89767:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at FilterSubprovider.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:65832:7)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at DelayedBlockFilter.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89595:3)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at ReactiveBlockTracker.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89722:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethApiDouble.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89858:16)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at GethDefaults.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89767:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at FilterSubprovider.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:65832:7)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at DelayedBlockFilter.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89595:3)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at ReactiveBlockTracker.handleRequest (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:89722:12)
    at next (C:\Users\s\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\build\cli.node.js:59378:18)
    at Object.InvalidResponse (https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:3138:16)
    at https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:6375:36
    at XMLHttpRequest.request.onreadystatechange (https://rawgit.com/ethereum/web3.js/develop/dist/web3.js:4377:7)

Zugehörige Frage: "AKTUALISIERT: " "VM-Ausnahme während der Verarbeitung der Transaktion: zurücksetzen"

Es gibt keinen Grund, "web3.js" und "web3.min.js" einzuschließen. Sie sind dasselbe.
@Shawn Tabrizi Meinst du, ich kann einen von ihnen entfernen? Danke
Ja. Sie sollten die Datei wahrscheinlich nur verwenden, web3.min.jses sei denn, Sie möchten sich den Quellcode ansehen. Siehe Minifizierung (Programmierung)
@Shawn Tabrizi Laut Kommentar von smarxmuss ich MetaMast web3 providerden Code hinzufügen. Bedeutet das, dass ich durch etwas anderes ersetzen muss HttpProvider("http://localhost:8545"))? Danke
window.web3 = new Web3(web3.currentProvider);Siehe meine Antwort auf deine andere Frage
@Shawn Tabrizi Ich aktualisiere meinen Code gemäß diesem MetaMaskBeispielcode: github.com/MetaMask/faq/blob/master/DEVELOPERS.md Wenn ich jedoch mit verbunden bin, testrpcerhalte ich denselben Fehler, dh Method personal_sign not supportedweil testrpces nicht unterstützt wird und wenn ich es bin NICHT verbunden mit testrpcerhalte ich diesen Fehler: ` localhost:8545 0 ()` (Screenshot: ibb.co/dFRQpJ ) Danke
zur Info: seit 1.0.0-beta.38akzeptiert web3.eth.personal.signkeinen undefinedWert mehr für das dritte Argument (Passwort für das Konto).

Antworten (1)

Die Signatur wird an Ihren Rückruf gesendet, der in dem von Ihnen freigegebenen Code leer ist. Das sollte funktionieren:

web3.personal.sign("0x" + message.toString("hex"), "0xF4D2B942c3baebef5B81F4B909904015166b238A", function(err, signature) {
  console.log(signature);
  // Be sure to make use of the signature only here.
  // It will not be defined until this callback is invoked.
});

Beachten Sie nebenbei, dass Ihr aktueller Code MetaMask nicht verwendet.

@smartx Danke, ich habe es ersetzt, aber es ist immer noch undefined. Übrigens, im testrpcTerminal erhalte ich eth_getBlockByNumbereinen nach dem anderen, kann das ein Problem sein? Danke
Hier ist die testrpc-Ausgabe: ibb.co/fZHUid Danke
Versuchen Sie dann, die err.
Danke, ich habe meine Frage aktualisiert. Jetzt errist Error: Method personal_sign not supported. Warum? Danke
testrpcunterstützt die Methode nicht personal_sign. Sie müssen geth, Parity, MetaMask oder etwas anderes verwenden, das diese Methode unterstützt.
Danke, ich verwende MetaMaskund nach dem Ausführen testrpcverbinde ich mich MetaMaskmit private network (localhost 8545). aber ohne Ausführung testrpckann ich keine Verbindung zu localhost 8545using herstellen MetaMask. Wie kann ich dieses Problem lösen? Danke noch einmal
Ihr Code muss den MetaMask-Web3-Anbieter verwenden. Stattdessen stellen Sie eine direkte Verbindung zu her testrpc. Und ja, natürlich müssen Sie testrpcMetaMask ausführen, um sich damit verbinden zu können.
Danke, also meinst du, ich muss es HttpProvider("http://localhost:8545"))durch etwas anderes ersetzen MetaMast web3 proviver? Wenn ja, können Sie mir bitte mitteilen, was MetaMast providerdas ist, in das eingefügt werden muss HttpProvider(" ? "))? Danke
Die MetaMask-Dokumentation hilft dabei.
Vielen Dank, ich habe diesen Beispielcode von MetaMask von hier verwendet: Link ist das, was Sie als MetaMask-Dokumentation meinen? Ich habe meine Frage aktualisiert, erhalte jedoch den gleichen Fehler. Danke
Tatsächlich erhalte ich, wenn ich mit verbunden bin, testRPCeine vorherige Fehlermeldung und wenn ich nicht mit verbunden bin, testRPCerhalte ich diesen Fehler: web3.js:4386 OPTIONS http://localhost:8545/ 0 ()Das bedeutet, dass ich nicht mit verbunden bin MetaMast provider. Ich bin wirklich verwirrt ..... Danke
Hier ist ein Screenshot des Fehlers, wenn ich nicht verbunden bin mit testrpc: ibb.co/dFRQpJtestrpc Ich habe schließlich nicht verstanden, dass ich für diesen Code laufen muss javascriptoder nicht? Danke
Ja, wie gesagt, Sie müssen testrpc ausführen. Läuft es?
Danke, ja, wenn es läuft, erhalte ich den vorherigen Fehler: personal_sign not supportedund wenn ich es stoppe, erhalte ich einen weiteren Fehler: Hier ist ein Screenshot des Fehlers, wenn testrpces NICHT läuft: ibb.co/dFRQpJ . In beiden Fällen erhalte ich also eine Fehlermeldung. vielleicht Ropstenwäre testen besser .... ich weiß es nicht. Bitte überprüfen Sie meinen neuen Code, da ich ihn geändert habe. Danke
Sind Sie sicher, dass Sie mit MetaMask verbunden sind? Sehen Sie die Konsolenmeldung „No web3? ...“?
Hier sind die Schritte, die ich mache: (1) Ausführen von testrpc. (2) klicken Sie auf das MetaMask-Symbol und wählen Sie localhost 8545(3) wählen Sie eines der private keysgenerierten aus testrpc(4) wählen Sie import accountaus MetaMask aus und fügen Sie es private keyein Paste your private key string here(5) jetzt ist der Rest dieser Adresse 100 eth(6) fügen Sie diesen address(öffentlichen Schlüssel) in web3.personal.sign ...(7) Öffnung ein htmlDatei von Google Chrome(8) beim Empfang dieser Nachrichten: No web3? You should consider trying MetaMask!& Error: Method personal_sign not supported.Screenshot: ibb.co/i93oRy .Thx
Fehlt etwas in meinen Schritten? weil es anscheinend nicht mit MetaMask verbunden ist. Danke
Diese Antwort: ( ethereum.stackexchange.com/a/46400/23024 ) sagt, dass ich verwenden muss https://mainnet.infura.io/<APIKEY>. hängt das Problem damit zusammen, meine Seite lokal auszuführen? (Laut dieser Antwort) Danke
Diese Meldung bedeutet, dass Sie MetaMask nicht verwenden. (MetaMask hat nicht injiziert web3, also war es undefined.) Wenn Sie Ihre Seite von einer file://URL aus ausführen, dann ja, das ist das Problem. Sie müssen von einer http://oder https://URL aus ausgeführt werden. Das lokale Ausführen ist in Ordnung, aber es muss über einen Webserver erfolgen, nicht über das Dateisystem.
Danke, also muss ich in diesem Fall ex verwenden. Paritymit bsp verbinden. Ropstenund verwenden Sie dann web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));oben im JavaScriptCode und führen Sie diese JSDatei mit node filename.js? Gibt es einen besseren Weg? Danke
Nein. Sie können einfach testrpc ausführen und dann Ihre Webseite über eine http://URL öffnen. Jeder Webserver tut es.
Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .