Skip to content
This repository has been archived by the owner on Sep 28, 2023. It is now read-only.

currency wire format #20

Open
jargoman opened this issue Feb 26, 2014 · 4 comments
Open

currency wire format #20

jargoman opened this issue Feb 26, 2014 · 4 comments

Comments

@jargoman
Copy link

BinarySerializer, write currency.

Your code is correct but ripple rejects "floating point" values whose mantissa doesn't have 16 digits.

Lets say I want to send the value 1.23.
Instead of the way you would expect.
mantissa = 123; // unscaled value
scale = 2; // or negative 2 in some implementations.

ripple expects it to be in wire format
mantissa = 1230000000000000;
scale = 15; // again may be -15

Both values are equal but only the second is accepted by rippled

1230000000000000 * 10 ^ -15 == 123 * 10 ^ -3; // statement is true

This is why the max and min scale have a difference of 16
80 - 96 = 16.
and is also why 54 bits is allocated for the mantissa
9999999999999999 // 54 bit number.

It took me three days to figure out why your code was correct but returning "invalid currency value"

@sublimator
Copy link

A good way of testing implementations of binary parsing/reading is to implement a ShaMap and download some ledgers, calculating the transaction_hash. You can retrieve the transactions in binary form from rippled.

@pmarches
Copy link
Owner

Ah! That would explain why the C++ code iterates *10 and /10 to make the
mantissa 16 digits long. I tried to be smart in avoiding that loop. Do you
have a testcase or transaction that reproduces the problem?

sublimator: If we read the TX from the binary fromat, it actually computes
the hash correctly, since the BigDecimal will be created with a 16 digit
mantissa. The problem lies when we create a new BigDecimal from scratch
that does not have the 16 digit mantissa.

Thank you to both of you for this,

Philippe

On Wed, Feb 26, 2014 at 1:45 PM, sublimator notifications@github.comwrote:

A good way of testing implementations of binary parsing/reading is to
implement a ShaMap and download some ledgers, calculating the
transaction_hash. You can retrieve the transactions in binary form from
rippled.

Reply to this email directly or view it on GitHubhttps://github.com//issues/20#issuecomment-36181238
.

@sublimator
Copy link

You can load from the rippled json too (for sanity testing)

@sublimator
Copy link

Actually a guy on the ripple forum posted a heap of full ledgers

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants