web3.js: Fehler: Die Methode shh_newSymKey existiert nicht/ist auf Web3.js nicht verfügbar

Mein Hauptziel ist es, web3.shhFunktionen mit RPC API, Web3.pyoder aufzurufen Web3.js. Ich kann Funktionen aufrufen web3.shh, wenn ich geth attach; Das ist meine letzte Option.

Ich folge dieser Antwort .

  • geth-Version:1.8.0-unstable
  • Ich laufe gethmit --shhFahne und--rpcapi "admin,eth,net,web3,debug,shh"

  • console.log(web3.version);gibt zurück: api: '0.20.5'.

Wenn ich folgendes Skript ausführe:

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

if(!web3.isConnected()){ //web3@0.20.5
//if(!web3.eth.net.isListening().then(console.log)){ //web3@1.0.0-beta.34
    console.log("notconnected");
    process.exit();
}

var kId = web3.shh.newSymKey(); //Error occurs. 

var kId = web3.shh.newSymKey();gibt folgenden Fehler mit web3@'0.20.5':

Error: The method shh_newSymKey does not exist/is not available
    at Object.InvalidResponse (/home/alper/eBlocBroker/node_modules/web3/lib/web3/errors.js:38:16)
    at RequestManager.send (/home/alper/eBlocBroker/node_modules/web3/lib/web3/requestmanager.js:61:22)
    at Shh.send [as newSymKey] (/home/alper/eBlocBroker/node_modules/web3/lib/web3/method.js:145:58)
    at Object.<anonymous> (/home/alper/eBlocBroker/dd.js:9:20)
    at Module._compile (module.js:649:30)
    at Object.Module._extensions..js (module.js:660:10)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:501:12)
    at Function.Module._load (module.js:493:3)
    at Function.Module.runMain (module.js:690:10)

Bitte beachten Sie, dass ich es damit versucht habe, web3@1.0.0-beta.34dass auch dieser Fehler auftritt, der wie derselbe Fehler aussieht:

Promise { <pending> }
true
(node:16162) UnhandledPromiseRejectionWarning: Error: Returned error: The method shh_newSymKey does not exist/is not available
    at Object.ErrorResponse (/home/alper/eBlocBroker/node_modules/web3-shh/node_modules/web3-core-helpers/src/errors.js:29:16)
    at /home/alper/eBlocBroker/node_modules/web3-shh/node_modules/web3-core-requestmanager/src/index.js:140:36
    at XMLHttpRequest.request.onreadystatechange (/home/alper/eBlocBroker/node_modules/web3/node_modules/web3-providers-http/src/index.js:77:13)
    at XMLHttpRequestEventTarget.dispatchEvent (/home/alper/eBlocBroker/node_modules/xhr2/lib/xhr2.js:64:18)
    at XMLHttpRequest._setReadyState (/home/alper/eBlocBroker/node_modules/xhr2/lib/xhr2.js:354:12)
    at XMLHttpRequest._onHttpResponseEnd (/home/alper/eBlocBroker/node_modules/xhr2/lib/xhr2.js:509:12)
    at IncomingMessage.<anonymous> (/home/alper/eBlocBroker/node_modules/xhr2/lib/xhr2.js:469:24)
    at IncomingMessage.emit (events.js:185:15)
    at endReadableNT (_stream_readable.js:1101:12)
    at process._tickCallback (internal/process/next_tick.js:114:19)
(node:16162) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:16162) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

[F] Wie kann ich diesen Fehler beheben? Was mache ich falsch?

Bitte beachten Sie, dass verfügbare shhFunktionen hier zu sehen sind ; Ausgabe von console.log(web3.shh).

Was ist Ihre Web3-Version?
Ich meinte Ihre web3-Version, ist es web3 1.0 oder 0.x, weil letztere die Methode newSymKey() ab diesen Dokumenten nicht hat: github.com/ethereum/wiki/wiki/JavaScript-API#web3shh
Ah, tut mir leid, dass ich vergessen habe, es hinzuzufügen. Ich habe es getan console.log(web3.version)und es kommt zurück: api: '0.20.5'@KakiMasterOfTime
Wie ich es in Ihrem clientseitigen js getan habe, verwenden Sie die Version web3 0.x, sodass diese Methode nicht beendet wird. Sie sollten die neuere Version von web3 1.0 verwenden, sie ist bereits stabil.
Aber web3.shhgibt die Methode zurück, aber wenn ich sie aufrufe, gibt es den Fehler. @KakiMasterOfTime
Bitte sehen Sie sich meine aktualisierte Antwort mit try on an 1.0.0-beta.34. @KakiMasterOfTime
Ich habe versucht, geth mit --shh auszuführen und dann web3 zu verwenden, und es hat perfekt funktioniert, aber ich verwende die Sable-Version von geth 1.8.7 und das neueste web3 1.0. können Sie die web3.shh von der Javascript-Geth-Konsole ( geth attach) verwenden? Wenn nicht, versuchen Sie es und sehen Sie, ob shhes richtig aktiviert ist.
Von geth attach; web3.shh.newSymKey()funktioniert! Aber warum funktioniert es nicht über das Skript (das ich auf meine Frage zeige)? @KakiMasterOfTime
Von hier ( github.com/ethereum/go-ethereum/wiki/Whisper-v5-RPC-API ); Ich habe versucht, as zu verwenden, curl -X POST --data ...aber es sagt auch curl: no URL specified!. Ich kann nicht herausfinden, wie ich es über curl@KakiMasterOfTime verwenden könnte

Antworten (1)

Die newSymKey();Funktion gibt ein Promise zurück, das aufgelöst werden muss, um den zurückgegebenen Wert zu erhalten.

Aus diesem Grund web3@1.0.0-beta.34gibt Ihnen der Fehler in der Version eine promise pendingMeldung mit UnhandledPromiseRejectionWarningund in der web3@0.20.5Version den Fehlerstatus shh_newSymKey does not exist/is not available. [noch]

Also versuchevar kId = web3.shh.newSymKey().then(console.log);

odervar kId = web3.shh.newSymKey().then(function(result) { console.log(result) //will log results. })

Ich bevorzuge die Verwendung der neueren async / await-Funktion anstelle von Versprechungen (liest sich einfacher):

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

async function connect() { //note async function declaration
    if(!await web3.isConnected()){ //await web3@0.20.5
    //if(!await web3.eth.net.isListening()){ //await web3@1.0.0-beta.34
        console.log("notconnected");
        process.exit();
    }

    var kId = await web3.shh.newSymKey(); //note await
    console.log(kId);

}

connect();
Denn shh.getPrivateKey(kId).then(console.log)es kommt zurück: UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Returned error: invalid argument 0: json: cannot unmarshal object into Go value of type stringWie könnte ich diesen Fehler auch beheben? @Herold
Ich nehme an, Sie haben diese Folgefragen hier gepostet: ethereum.stackexchange.com/questions/52112/…
Es wird durch das gleiche Problem verursacht, das Sie zuvor hatten, die Zeile wird ausgeführt, bevor das Versprechen der vorherigen Zeilen aufgelöst wurde. Daher ist kId leer, wenn Sie getPrivateKey aufrufen. Sie müssen awaitwie oben gezeigt verwenden oder shh.getPrivateKey(kId) aufrufen; In einer Callback-Funktion anstelle der Konsolenprotokollierung der kId lauten die Funktionsdefinitionen gemäß Dokumentation: web3.shh.newSymKey([callback]) web3.shh.getPrivateKey(id, [callback])
Anstatt kId anzugeben, habe ich eine Zeichenfolge bereitgestellt, die immer noch mit demselben Fehler konfrontiert ist.
Wir können mit der Folgefrage fortfahren.