feat: add BigDecimal type to CVM (bounty #5)#578
Conversation
Implements arbitrary-precision decimal arithmetic for the CVM numeric tower. - CVMBigDecimal.java: wraps java.math.BigDecimal, extends ANumeric - Exact decimal arithmetic (add, sub, multiply, divide) - Type promotion: Decimal op Integer -> Decimal, Decimal op Double -> Double - CAD3 encoding: tag 0x1a + VLQ scale + VLQ byte count + unscaled bytes - Canonical if and only if value has meaningful fractional digits - Decimal.java: type class for CVMBigDecimal (Types.DECIMAL) - Core.java: register 'bigdecimal' (code 260) constructor and 'bigdecimal?' (code 261) predicate - CAD3Encoder.java: decode tag 0x1a for BigDecimal wire format - Juice.java: costNumeric() handles CVMBigDecimal (proportional to unscaled byte length) - RT.java: ensureBigDecimal() conversion utility - Tag.java: BIG_DECIMAL = 0x1a - Symbols.java: BIGDECIMAL, BIGDECIMAL_Q Fixes Convex-Dev#5
|
(Claude Comment) Thanks @aglichandrap — putting this one formally on hold rather than into code review. The reason is upstream of the implementation: we first need to determine whether a decimal type belongs in the CVM numeric tower at all. A new type is a permanent consensus commitment — the CAD3 tag allocation (0x1a is currently unallocated, but allocating it is forever), plus equality/hashing/promotion semantics across the tower, plus juice pricing. Those are specification decisions that belong in a CAD design discussion in the design repo, not a code PR — and the outcome may legitimately be "no" (many platforms deliberately stay with integer + IEEE double, pushing fixed-point decimal semantics to actor-level libraries). If the design discussion concludes it makes sense, it would land via the versioned migration mechanism (v2 at the earliest, using the |
Summary
Implements arbitrary-precision decimal arithmetic for the CVM numeric tower, fulfilling bounty #5.
Changes
CVMBigDecimal.java: Wraps
java.math.BigDecimal, extendsANumericDecimal op Integer → Decimal,Decimal op Double → Double0x1a+ VLQ signed scale + VLQ byte count + unscaled bytesDecimal.java: Type class for
CVMBigDecimalregistered asTypes.DECIMALCore.java: Registers
bigdecimal(code 260) constructor andbigdecimal?(code 261) predicateCAD3Encoder.java: Decodes tag
0x1a→ reads VLQ scale, VLQ byte count, unscaled bytes → constructsCVMBigDecimalJuice.java:
costNumeric()charges proportional to unscaled byte length (same as BigInteger)RT.java:
ensureBigDecimal()conversion from any numeric typeTag.java:
BIG_DECIMAL = 0x1aSymbols.java:
BIGDECIMAL,BIGDECIMAL_QDesign Decisions
bigdecimalconstructor, 261 forbigdecimal?predicateArithmeticException(preserves exactness)Fixes #5