Der folgende Code gibt mir die Überschreitungsgrenze oder den immer fehlgeschlagenen Transaktionsfehler, aber wenn ich meinen Vertrag auf Remix überprüfe, kann ich sehen, dass die Transaktion durchläuft, die richtigen Statusänderungen vornimmt und wie erwartet funktioniert. In Die Zuordnung executionMetrics
wird undefiniert. Ich habe 4 Stunden lang versucht, das Problem herauszufinden, und ich stecke völlig fest. Weiß jemand was los ist?
async function someAsyncFunc(){
bookingPromiseArr = []
let promise = instance.methods.bookTrip(tripKey).send({
from: accounts[0],
gasPrice: GAS_PRICE,
value: 1,})
bookingPromiseArr.push(promise)
let executionMetrics = await executePromises(bookingPromiseArr, txStartTime)
}
async function executePromises(promisesArr, txStartTime) {
await Promise.all(promisesArr)
.then((receipts) => {
let totalGasUsed = 0
let txElapsedTime = Date.now() - txStartTime
let lastBlock = receipts[receipts.length - 1].blockNumber
receipts.forEach((receipt) => {
totalGasUsed += receipt.gasUsed
lastBlock =
receipt.blockNumber > lastBlock ? receipt.blockNumber : lastBlock
})
// I've console logged here and seen that I've reached this point
return {
txElapsedTime: txElapsedTime,
totalGasUsed: totalGasUsed,
lastBlock: lastBlock,
}
})
.catch((error) => {
console.log('multipleTX():', error)
process.exit(1)
})
}
Die aufgerufene Smart-Contract-Funktion:
function bookTrip(uint256 key) external payable requireTrip(key) nonBookedPassenger(key){
Trip storage trip = trips[key];
trip.passengers[msg.sender] = trip.price;
trip.passengerCount++;
emit LogNewTripPassenger(msg.sender, key, trip.price);
}
Fehlerprotokoll:
(node:23524) UnhandledPromiseRejectionWarning: Error: gas required exceeds allowance (8000029
) or always failing transaction
at C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\node_modules\@truffle\hdw
allet-provider\node_modules\web3-provider-engine\subproviders\provider.js:18:36
at XMLHttpRequest.request.onreadystatechange (C:\Users\Diddi\Documents\mjukvaruteknik\exa
mensarbete\tqdt33\node_modules\web3-providers-http\src\index.js:96:13)
at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\Diddi\Documents\mjukvaruteknik\exame
nsarbete\tqdt33\node_modules\xhr2-cookies\xml-http-request-event-target.ts:44:13)
at XMLHttpRequest._setReadyState (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\t
qdt33\node_modules\xhr2-cookies\xml-http-request.ts:219:8)
at XMLHttpRequest._onHttpResponseEnd (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbe
te\tqdt33\node_modules\xhr2-cookies\xml-http-request.ts:345:8)
at IncomingMessage.<anonymous> (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqd
t33\node_modules\xhr2-cookies\xml-http-request.ts:311:39)
at IncomingMessage.emit (events.js:228:7)
at endReadableNT (_stream_readable.js:1185:12)
at processTicksAndRejections (internal/process/task_queues.js:81:21)
(node:23524) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error origin
ated 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:23524) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In th
e future, promise rejections that are not handled will terminate the Node.js process with a n
on-zero exit code.
TypeError: Cannot read property 'txElapsedTime' of undefined
at multipleTx (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\client\cl-int
eraction\contractInteract.js:65:24)
at processTicksAndRejections (internal/process/task_queues.js:94:5)
at test (C:\Users\Diddi\Documents\mjukvaruteknik\examensarbete\tqdt33\client\cl-interacti
on\profile1.js:26:5)
Wie goodvibration in seinen Kommentaren betonte, war dies kein Ethereum- oder Web3-Problem, sondern ein reiner Javascript-/Grundlegender Programmierfehler. Der große Fehler im Code war die Rückgabe in der then()
-Anweisung und die Annahme, dass dies der Rückgabewert für wäre executePromises()
. Das war nicht der Fall und ich habe es korrigiert.
gute Stimmung
await
Sie können nur innerhalb einer Funktion verwendenasync
. Die erste Codezeile in Ihrer Frage hält sich nicht an diese Regel. Und da Ihre Frage speziell darauf abzielt, dass diese Zuordnung undefiniert wird, müssen Sie genau erklären, wie Sie die Dinge tun. Dieser Code wird nicht einmal gestartet!Conviley
gute Stimmung
Conviley
gute Stimmung
someAsyncFunc
nirgendwo in Ihrem Code auf! Selbst wenn Sie dies getan haben, gibt es nichts zurück und weist keine nicht-lokalen Variablen zu. Was genau ist also der Zweck dieser Funktion, und wie erwarten Sie, dass die lokale VariableexecutionMetrics
außerhalb davon eine Bedeutung hat???gute Stimmung
return
in jedem Ausführungspfad innerhalb dieser Funktion explizit eine Anweisung hinzu. Eine lokale Variable hat außerhalb der Funktion, in der sie deklariert ist, keine Bedeutung.Conviley