El código a continuación me da el error de transacción que excede la asignación o siempre falla, pero cuando reviso mi contrato en remix, puedo ver que la transacción se lleva a cabo, hace los cambios de estado correctos y funciona como se esperaba. En La asignación executionMetrics
se vuelve indefinida. He estado sentado tratando de resolver el problema durante 4 horas y estoy completamente atascado. ¿Alguien sabe lo que está pasando?
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)
})
}
La función de contrato inteligente invocada:
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);
}
Registro de errores:
(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)
Como goodvibration señaló en sus comentarios, esto no fue un problema de ethereum o web3, sino un error de programación javascript/básico puro. El gran error en el código fue regresar en la then()
declaración y asumir que sería el valor de retorno de executePromises()
. Ese no era el caso y lo he corregido.
buena vibración
await
Solo se puede usar dentro de unaasync
función. La primera línea de código en su pregunta no cumple con esa regla. Y dado que su pregunta es específicamente acerca de que esta tarea se vuelve indefinida, debe explicar exactamente cómo está haciendo las cosas. ¡Este código ni siquiera comenzará a ejecutarse!Conviley
buena vibración
Conviley
buena vibración
someAsyncFunc
en ninguna parte de su código! Incluso si lo hizo, no está devolviendo nada, no está asignando ninguna variable no local. Entonces, ¿cuál es exactamente el propósito de esta función y cómo espera que la variable localexecutionMetrics
tenga algún significado fuera de ella?buena vibración
return
declaración explícitamente en cada ruta de ejecución dentro de esa función. Una variable local no tiene significado fuera de la función en la que se declara.Conviley