web3.js Proxy-Vertragsfehlerbehandlung

Ich habe kürzlich an der Fehlerbehandlung mit dem Ereignisemitter gearbeitet. Wenn ich eine Funktion direkt aus einem Vertrag heraus aufrufe (unter Verwendung von contract.methods.myMethod().send{from: Ganache provided account}) mit einer Eingabe, die gegen eine require-Anweisung verstößt, wird der .error-Teil des Event-Emitters aufgerufen. Das funktioniert so, wie ich es erwarten würde.

Wenn ich jedoch eine Funktion über einen Proxy-Vertrag mit einer Eingabe aufrufe, die gegen eine require-Anweisung verstößt, wird der .error-Teil des Ereignis-Emitters nicht aufgerufen. Ich möchte darauf hinweisen, dass die Ereignisse „transactionHash“, „receipt“ und „confirmation“ des Ereignis-Emitters funktionieren, wenn Proxy-Verträge durchlaufen werden. Ich erhalte jedoch eine Benachrichtigung über einen Fehler über die Konsole, obwohl ich keine console.log()-Anweisungen in meinem Code habe. Siehe unten:

web3.min.js:20 Uncaught (in promise) Error: Returned error: VM Exception while processing transaction: revert Number of offices can't be less than one
    at Object.ErrorResponse (web3.min.js:20)
    at Object.callback (web3.min.js:20)
    at web3.min.js:30
    at Array.forEach (<anonymous>)
    at s._onMessage (web3.min.js:30)
ErrorResponse @ web3.min.js:20
(anonymous) @ web3.min.js:20
(anonymous) @ web3.min.js:30
s._onMessage @ web3.min.js:30
async function (async)
initializeElectionProxy @ playing.js:743
dispatch @ jquery.min.js:3
r.handle @ jquery.min.js:3

ODER

Uncaught (in promise) Error: Returned error: VM Exception while processing transaction: revert Number of offices can't be less than one
    at Object.ErrorResponse (errors.js:28)
    at Object.callback (index.js:303)
    at index.js:114
    at Array.forEach (<anonymous>)
    at s._onMessage (index.js:102)

Ich habe versucht, meinen Funktionsaufruf in Try-Catch-Blöcken zu kapseln, aber das hat nichts bewirkt.

Ich glaube, dass dieses Problem mit den Unterschieden zwischen der Truffle-Vertragsinstanz und dem Vertragsobjekt web3.js zusammenhängt. Ich habe einige Dateien zusammengestellt, die das Problem auf Github veranschaulichen. In der Readme-Datei finden Sie Anweisungen, wie Sie es zum Laufen bringen, wie Sie die Funktionen ausführen und worauf Sie achten müssen. Hoffentlich ist das genug, um Ihnen das Problem zu zeigen, das ich erlebe. Wenn nicht, lassen Sie es mich bitte wissen und ich werde es klären. Wenn es jemandem nichts ausmachen würde, einen Blick darauf zu werfen und mir seine Meinung mitzuteilen, wäre das ausgezeichnet.

Der Link zum Github-Repository lautet https://github.com/cjd9s/ProxyErrorWeb3jsDemo .

Ich sollte erwähnen, dass ich hier einen Beitrag gefunden habe, der sich möglicherweise mit demselben Problem befasst hat. Der Link und die Zitate, die meine Aufmerksamkeit erregt haben, sind unten:

Korrekte Behandlung von Anforderungs-/Assert-Fehlern in einer Node.JS-App?

„Die Herausforderung besteht darin, auf diese Nachricht weiter oben im Stack in Web3 und Node zuzugreifen. In der Zwischenzeit können Sie try und .catch() in versprochenem Code wie einer Truffle-Contract-Abstraktion verwenden.“

In meinem Fall funktioniert .catch mit der Truffle-Contract-Abstraktion, aber nicht mit dem web3.js-Objekt. Bringt das Licht ins Dunkel?

Nochmals vielen Dank für Ihre Zeit; Ich bin sehr dankbar. Beifall.

Mit freundlichen Grüßen Craig

Antworten (1)

Es ist mir peinlich, Ihnen mitteilen zu müssen, dass ich mein Problem gefunden habe. Es hatte nichts mit der Truffle-Vertragsabstraktion oder dem Vertragsobjekt von web3.js zu tun. Das Problem lag in der web3.js-Funktion schätztGas. Diese Funktion gibt Ihnen nicht nur eine Gasschätzung, sie simuliert die Transaktion und wirft so alle Fehler aus, die der Funktionsaufruf auswerfen würde, wenn er in Wut verwendet wird. Als es also einen Funktionsaufruf schätzte, der gegen eine Anforderungsaussage für den Vertrag verstieß, gab es den entsprechenden Umkehrfehler aus.

Der folgende Link gibt eine kurze Erklärung. https://medium.com/@suyashsumaroo/go-ethereum-mistakes-and-solutions-854c172ebfcb

Wie auch immer, ich weiß es zu schätzen, dass Sie zugehört haben, und entschuldige mich dafür, dass Sie Ihre Zeit verschwendet haben. Beifall.