Solidez: el parámetro uint no se ha configurado correctamente

Probando mi contrato localmente con trufa. Tengo una función con la firma:

function purchase(address buyer, address seller, bytes16 bookId, uint tokens) public onlyOwner returns(bool success)

En la consola de trufas llamo a esta función como:

  BookStore.deployed().then(function(instance){return instance.purchase(
'0xab67c3985384f5f4dc2fa828662f1f0601f81e62', //buyer
'0xd74ea687cc995cbbc1af6cf81106b31e32b4aa4f', //seller
[108, 120, 118, 13, 168, 153, 70, 225, 139, 168, 108, 184, 185, 58, 173, 17], //id
 5) //tokens
;}).then(function(result){return result;});

¡Cuando depuro la transacción, veo que tokenstiene el valor 2.316897056402557e+76! Pero estoy pasando 5.. ¿qué está pasando?

¿ Has probado new BigNumber(5)con las importaciones necesarias?
instalado bignumber.js según las instrucciones aquí github.com/MikeMcl/bignumber.js Cambié los 5 anteriores a un nuevo BigNumber('5') pero esto ahora da como resultado el error TypeError: toBigNumber(...).round is not Una función. ¿Alguna sugerencia?
Creo que el siguiente funciona para ti: Math.round(<YourNumber>).toBigNumber()
TypeError: Math.round(...).toBigNumber no es una función

Respuestas (2)

El problema estaba relacionado con la matriz de bytes que estaba pasando para el bookIdcampo. Reemplazando estos bytes con el valor hexadecimal del bookIdvalor fijo fijo para tokens. Mi corazonada es que la matriz ocupa> 16 bytes y esto se desbordó en uint tokensvalor.

tal vez me equivoque, pero ¿no debería ser bytes16[] en lugar de bytes16 ?

Re: La corazonada, no.

Su expectativa está desalineada. Esta es una función de cambio de estado que no está marcada viewo pure(solo lectura) y es correcta porque, de hecho, desea que la función actualice el estado. No vemos el código, pero parece ser un "conjunto", no un "obtener".

Ahora, en todas esas situaciones de cambio de estado, el resultado esperado de la devolución de llamada es un recibo de transacción, no el returnvalor. Los valores devueltos se devuelven a otros contratos pero no al EOA que inició la transacción. Obtiene un recibo como reconocimiento de que la transacción se ha enviado a su nodo, presumiblemente para pasar a la red. El hash de transacción devuelto es un identificador único para la transacción para que pueda verificarlo.

No obtiene el resultado porque el resultado no se puede conocer hasta que se extrae la transacción. Puede verificar/esperar a que la transacción se incluya en un bloque (por el hash devuelto) y luego verificar el nuevo estado.

Este es un tema confuso. Es lógico, pero se necesita algún tiempo para tener una idea de la lógica de la misma. Eche un vistazo a este explicador: https://blog.b9lab.com/calls-vs-transactions-in-ethereum-smart-contracts-62d6b17d0bc2

Espero eso ayude.