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 tokens
tiene el valor 2.316897056402557e+76
! Pero estoy pasando 5.. ¿qué está pasando?
El problema estaba relacionado con la matriz de bytes que estaba pasando para el bookId
campo. Reemplazando estos bytes con el valor hexadecimal del bookId
valor fijo fijo para tokens
. Mi corazonada es que la matriz ocupa> 16 bytes y esto se desbordó en uint tokens
valor.
Re: La corazonada, no.
Su expectativa está desalineada. Esta es una función de cambio de estado que no está marcada view
o 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 return
valor. 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.
Lauri Peltonen
new BigNumber(5)
con las importaciones necesarias?Simón Rubín
Mehmet Dogan
Simón Rubín