You've already forked CHIP-MilliSatoshi
f408928024
A couple of main changes * it is considered dangerous to change the mode multiple times in a script. What do we expect when it is changed after one fetch and before a second. No, that is a timebomb. * It makes no sense to ever change the default mode, since old scripts will then start failing. As a result of those two points the idea to pass in an enum value is just a waste. So unless someone has more enum values, the KISS principle comes to one OP_milli-sats-mode opcode.
362 lines
16 KiB
Markdown
362 lines
16 KiB
Markdown
# CHIP 2024-milli-Satoshi: increase accuracy in transactions
|
|
|
|
Title: Milli-Satoshi storage of amounts
|
|
Type: protocol upgrade
|
|
Layer: All
|
|
Owner: You?
|
|
Author(s): Tom Zander
|
|
Status: Draft
|
|
Initial Publication Date: 2024-01-02
|
|
Latest Revision Date: 2024-03-11
|
|
Version: 0.0.5
|
|
|
|
<details>
|
|
|
|
<summary><strong>Table of Contents</strong></summary>
|
|
|
|
- [Summary](#summary)
|
|
- [Deployment](#deployment)
|
|
- [Motivation](#motivation)
|
|
- [Technical Specification](#technical-specification)
|
|
- [Feedback & Reviews](#feedback-reviews)
|
|
- [Changelog](#changelog)
|
|
- [Copyright](#copyright)
|
|
|
|
</details>
|
|
|
|
## Summary
|
|
|
|
This proposal is a small change in transactions in order to allow us to
|
|
move from 8 digits dividing a whole BitcoinCash to add several more.
|
|
|
|
## Deployment
|
|
|
|
This is a minor protocol upgrade in the form of a new transaction version
|
|
where a small change is needed in software that interprets raw
|
|
transactions. A more detailed explanation can be found in [teams](teams.md).
|
|
|
|
## Motivation
|
|
|
|
BitcoinCash follows the lessons from economics and this means that the
|
|
total supply of coins ever created is limited. You probably heard about the
|
|
idea; there will never be more then 21 million Bitcoin.
|
|
|
|
There are obviously a lot more people that are intended to use and own some
|
|
Bitcoin than 21 million and therefore there are 8 zero's behind the
|
|
separator. A single unit is called "a Satoshi". Leading to not 21 million
|
|
but two quadrillion one hundred trillion Satoshi. (21 e+14).
|
|
|
|
While this is a lot, with a population of 8 Billion people that leaves only
|
|
2625.00 for each person on average. The actual number of Satoshi for many
|
|
people will be a lot less as wealth is simply not evenly spread and this
|
|
raises the question if this can work as a world currency. A single Satoshi
|
|
would be worth a lot of coffees and breads.
|
|
|
|
The idea of sub-Satoshis is not novel, it is the simple concept that
|
|
instead of a bread costing $4.00 it overnight changes to cost $4.00000.
|
|
Which is actually exactly the same amount, but with extra precision.
|
|
|
|
The idea, as tested in economics and concepts like stock-splits, is that we
|
|
simply multiply the amount of money stored in any users wallet. Or, maybe
|
|
easier to understand. We add a couple of digits behind the separator.
|
|
Instead of owning $123.12, you now own $123.1200. Which is, exactly the
|
|
same amount. But with more zeros at the end. We call that higher precision,
|
|
or milli-Satoshis since there are 3 in our proposal.
|
|
|
|
The benefit is that as the value rises due to BitcoinCash absorbing more
|
|
and more of the worlds economy, it becomes possible to start using
|
|
milli-Satoshi prices for payments. We can also split the money over more
|
|
people than before. Essentially it allows us to keep growing whereas
|
|
otherwise the system may hit a glass ceiling where it simply can't on-board
|
|
more people.
|
|
|
|
### The Fee Problem
|
|
|
|
While nodes currently will not relay any transaction with a fee less than
|
|
1000 sats/kB (1 sat/byte), this parameter is trivial to change on the node
|
|
level, and miners can directly accept transactions with any fee rate they
|
|
wish.
|
|
|
|
If social consensus agrees that fees on BCH should not exceed something
|
|
like $0.10 (2024 USD), it’s inevitable that 1 sat/byte will not be able to
|
|
deliver that promise. 1 sat per USD is a price of $100,000,000 USD/BCH.
|
|
That would make $546 USD the smallest transaction possible at 1 sat/byte
|
|
due to dust limits, and the fee to do so would be ~$219 USD.
|
|
|
|
Measuring fees in millisats is the only way to alleviate this. At 1
|
|
millisat per byte (1 sat/kB), the minimum transaction amount becomes $0.546
|
|
USD and the fee becomes $0.219 USD instead, which is significantly closer
|
|
to the fee rates we expect on BitcoinCash.
|
|
|
|
Unfortunately, this still exceeds our arbitrary $0.10 USD desired fee
|
|
threshold, but we can also reasonably expect that by the time we are
|
|
measuring fees in millisats, $0.10 in 2024 USD will probably be something
|
|
more like $1.00 in 2036 USD.
|
|
|
|
# Technical Specification
|
|
|
|
## Space for more digits
|
|
|
|
The 'amount' field in a transaction is capable of expansion. It it an
|
|
8-byte number and the design is that in 120 years we'd get 20 999 999.976
|
|
900 00 BCH. (see "[Controlled
|
|
Supply](https://en.bitcoin.it/wiki/Controlled_supply#Projected_Bitcoins_Long_Term)")
|
|
This, in Satoshi, is the same but without that dot. In a transaction
|
|
formatting this is 6 bytes. Hex: 0x0000BEFE6F6399A8
|
|
|
|
What that means is that if 100% of all block rewards since the beginning of
|
|
time end up in 1 transaction-output, the number in that transaction-output
|
|
will only need 6 bytes to record the amount. The actual space reserved for
|
|
this field in every transaction is actually 8 bytes. So we have space for
|
|
more digits. Lets find out how much space we have, shall we?
|
|
|
|
To find out, we repeatedly multiply this huge number by 10, stopping when
|
|
the total amount every minted no longer fits in 8 bytes, we get to the
|
|
following outcome:
|
|
|
|
* An extra 3 digits behind the separator.
|
|
* The block reward doesn't stop after 33 halvings, but after 42.
|
|
* The extra block rewards for that 36 years add a total of 0.02307 BCH to the entire supply.
|
|
|
|
The total amount is then 2099999999997060000 Satoshi, or in hexadecimal: 0x1d24b2dfac2523a0
|
|
|
|
<details>
|
|
<summary><strong>Supply Era's</strong></summary>
|
|
|
|
A [simple program](supply.cpp) can do the math. Below is the output:
|
|
|
|
Today's reward schedule:
|
|
|
|
| Era | Added in Era | Total supply |
|
|
| --- | ---| ---|
|
|
| 00| 1050000000000000 | 1050000000000000 |
|
|
| 01| 525000000000000 | 1575000000000000 |
|
|
| 02| 262500000000000 | 1837500000000000 |
|
|
| 03| 131250000000000 | 1968750000000000 |
|
|
| 04| 65625000000000 | 2034375000000000 |
|
|
| 05| 32812500000000 | 2067187500000000 |
|
|
| 06| 16406250000000 | 2083593750000000 |
|
|
| 07| 8203125000000 | 2091796875000000 |
|
|
| 08| 4101562500000 | 2095898437500000 |
|
|
| 09| 2050781250000 | 2097949218750000 |
|
|
| 10| 1025390520000 | 2098974609270000 |
|
|
| 11| 512695260000 | 2099487304530000 |
|
|
| 12| 256347630000 | 2099743652160000 |
|
|
| 13| 128173710000 | 2099871825870000 |
|
|
| 14| 64086750000 | 2099935912620000 |
|
|
| 15| 32043270000 | 2099967955890000 |
|
|
| 16| 16021530000 | 2099983977420000 |
|
|
| 17| 8010660000 | 2099991988080000 |
|
|
| 18| 4005330000 | 2099995993410000 |
|
|
| 19| 2002560000 | 2099997995970000 |
|
|
| 20| 1001280000 | 2099998997250000 |
|
|
| 21| 500640000 | 2099999497890000 |
|
|
| 22| 250320000 | 2099999748210000 |
|
|
| 23| 125160000 | 2099999873370000 |
|
|
| 24| 62580000 | 2099999935950000 |
|
|
| 25| 31290000 | 2099999967240000 |
|
|
| 26| 15540000 | 2099999982780000 |
|
|
| 27| 7770000 | 2099999990550000 |
|
|
| 28| 3780000 | 2099999994330000 |
|
|
| 29| 1890000 | 2099999996220000 |
|
|
| 30| 840000 | 2099999997060000 |
|
|
| 31| 420000 | 2099999997480000 |
|
|
| 32| 210000 | 2099999997690000 |
|
|
| 33| 0 | 2099999997690000 |
|
|
|
|
New schedule from the point where the previous would hit zero, and with everything multiplied by 1000.
|
|
|
|
| Era | Added in Era | Total supply |
|
|
| --- | ---| ---|
|
|
| 33| 122220000 | 2099999999875680000 |
|
|
| 34| 61110000 | 2099999999936790000 |
|
|
| 35| 30450000 | 2099999999967240000 |
|
|
| 36| 15120000 | 2099999999982360000 |
|
|
| 37| 7560000 | 2099999999989920000 |
|
|
| 38| 3780000 | 2099999999993700000 |
|
|
| 39| 1890000 | 2099999999995590000 |
|
|
| 40| 840000 | 2099999999996430000 |
|
|
| 41| 420000 | 2099999999996850000 |
|
|
| 42| 210000 | 2099999999997060000 |
|
|
|
|
</details>
|
|
|
|
This 1000x is us limiting ourselves based on the assumption that 100% of
|
|
all BCH ever minted should still be possible to store in a single
|
|
transaction-output. It should be noted that since this is never actually
|
|
going to happen in practice, a further 2 zero's should be easy and mostly
|
|
safe to add. But the complexity in the full node might go up as a result.
|
|
For now we propose to just stick to 1000x.
|
|
|
|
## New transaction version
|
|
|
|
In the May 2023 we introduced [the protocol
|
|
rule](https://codeberg.org/bitcoincash/CHIPs/src/branch/master/CHIP-2021-01-Restrict%20Transaction%20Versions.md)
|
|
that transaction versions not known to the network are not allowed. This
|
|
gives us a good opportunity to allow applications to use the transaction
|
|
version as an indication that something is to be used slightly different
|
|
again. Similar to how this is happening with version 2 transactions and
|
|
BIP68.
|
|
|
|
For transactions that are marked as version 10 or later, the 'outputValue'
|
|
field in each output is to be interpreted as being a number that includes
|
|
milli-Satoshis.
|
|
|
|
Payments from a transaction-output with version lower than 10, to a version 10 (or higher) transaction-output will thus convert the outputValue by multiplying it with 1000. And vice versa.
|
|
|
|
A version 10 transaction can thus split an outputValue in milli-Satoshis
|
|
among its outputs, should it wish to do so. Conversely, moving from a
|
|
version 10 to an older transaction version will lose the spare change and
|
|
that can go to the miner.
|
|
A big reason to aim for the May 2025 upgrade slot is to make losing
|
|
milli-coins this way not an issue. The monetary value of a single Satoshi
|
|
is still low enough that that unupgraded software accidentally losing
|
|
milli-Satoshis is not something that hurts them. The miner simply gets a
|
|
tiny big more income. This low cost enables us the ability to be backwards
|
|
compatible with old transaction generators. A very valuable feature for our
|
|
growing ecosystem.
|
|
|
|
The choice of version 10 is based on the fact that various versions have
|
|
been used already in the history of BitcoinCash. Various versions have been
|
|
created before the consensus rule forbidding it was created. But nothing
|
|
higher than version 4. See the [tx-versions.csv](./tx-versions.csv) file
|
|
for details on usage. As the first new version in years, we just jump to
|
|
version 10 and any software parsing any (historical) transaction will
|
|
safely be able to determine how to handle the Value field.
|
|
|
|
## Scripting
|
|
|
|
Money on BitcoinCash can be unlocked and transferred only when a specific
|
|
[predicate](https://satoshi.nakamotoinstitute.org/posts/bitcointalk/126/)
|
|
is affirmed to be true. The predicate is expressed in "Bitcoin Script" and
|
|
parts of it are relevant to the milli-Satoshi proposal since in 2022
|
|
BitcoinCash added the [Native Introspection](https://flowee.org/docs/spec/forks/native-introspection/)
|
|
scripting-opcodes. The relevant [instructions](https://flowee.org/docs/spec/blockchain/script/#introspection)
|
|
are the to `OP_UTXOVALUE` / `OP_OUTPUTVALUE`.
|
|
|
|
Value based opcodes today operate on the smallest unit, a single Satoshi.
|
|
Where we have 100.0 00.000 Satoshi's in a full Bitcoin. This raises the
|
|
question what to do when the introspected transaction is a milli-satoshi
|
|
transaction and the values are 1000 times as large.
|
|
Noteworthy in this question is that with cash-tokens, a script can be
|
|
forced to be copied from one transaction to the next and that means that we
|
|
can't assume the script can be written to only work on one
|
|
transaction-version, it should be able to function on both types of
|
|
transactions.
|
|
|
|
Consider also the various math operations we have today, since 2022 we [use
|
|
64-bit math](https://flowee.org/docs/spec/forks/bigint/). While that is a
|
|
very signification widening of range, some scripts may prefer to use the
|
|
old style `Value`, in full Satoshi's, in order to avoid overflows due to
|
|
bigger integer numbers of value. The [Bigger Integers
|
|
CHIP](https://flowee.org/docs/spec/forks/bigint/#limiting-arithmetic-operations-to-8-byte-script-numbers)
|
|
goes into some detail on this topic.
|
|
|
|
The introspection opcodes should be able to dictate which of the two
|
|
representations of value they want to use. Notice, however, that such a
|
|
choice should only ever happen once per script since changing
|
|
mid-calculation is bound to cause problems.
|
|
|
|
We introduce `OP_milli_sats_MODE` a new opcode with code-point `0xTODO`
|
|
that switches from the default of Values with 8 digits behind the full unit
|
|
to the milli-satoshi resolution of 11 digits.
|
|
|
|
|
|
| Operation | Codepoint | Description |
|
|
| ---------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| OP_milli_sats_MODE | `0xff` (-1) | Change value operators to use
|
|
big numbers (11 zeros behind the dot) |
|
|
|
|
This opcode, when needed, shall be present once in the
|
|
script-initialization. Script initialization is the start of the script, it
|
|
can contain pushes and it can contain this new value-mode opcode. The
|
|
script initialization ends when any other opcode is encountered by the
|
|
interpreter.
|
|
|
|
milliSatsMode specifically makes the following existing opcodes change
|
|
their output data to report milli-satoshi's instead of satoshis:
|
|
|
|
* OP_UTXOVALUE
|
|
* OP_OUTPUTVALUE
|
|
|
|
## Overview
|
|
|
|
quick overview of technical changes:
|
|
|
|
* TX version would tell parsers they need to decode the TX differently.
|
|
* OPcode would maintain past & future contracts consistent:
|
|
* if executed then OP_*VALUE introspection opcodes would return
|
|
millisats instead of sats (irrespective of TX version)
|
|
* if not executed then OP_*VALUE introspection would return sats
|
|
irrespective of TX version, and if underlying prevout/output used
|
|
millisats then they are truncated e.g. returned value will be:
|
|
millisats / 1000, where / is integer division.
|
|
|
|
# Feedback & Reviews
|
|
|
|
Kallisti, developer and lead engineer on the Selene wallet, supported this
|
|
proposal in a bitcoincashresearch post on March 8th, 2024.
|
|
https://bitcoincashresearch.org/t/1213/34
|
|
|
|
|
|
# Discussion
|
|
|
|
## more digits
|
|
|
|
This specification explains why we can safely get 3 extra zero's with no
|
|
real downsides in our software stacks.
|
|
The rationale there is based on the total issued supply of sats, however.
|
|
Which will never be seen in practice on a single output, or even a single
|
|
transaction.
|
|
|
|
It is fair to say that 1% of all coins will never be on a single input or
|
|
output and as a result we could be mostly safe about adding an additional 2
|
|
digits for nearly free. It fits in the same 8 byte number, as long as no
|
|
more than 1% of total issuable supply never ends up on a single UTXO.
|
|
|
|
The author's personal opinion is that in the far future if this is deemed
|
|
needed and safe, we can simply do it then. Same trick with a new
|
|
transaction version, but 50 years from now. We'd even be able to reuse the
|
|
opcode and simply add an extra enum value.
|
|
|
|
## Why not wait?
|
|
|
|
The obvious question that comes up is based on today's price and the
|
|
absolute value of a single Satoshi being so low that we don't expect we'll
|
|
need this for quite some time. So, why not wait until we actually need
|
|
this?
|
|
|
|
It is a fair question and there are various answers to this. First, today's
|
|
M2 (circulating money supply in dollars) was in March 2023 about the same
|
|
(in dollar-cents) as the amount of Satoshi's are in BitcoinCash. Having an
|
|
optimistic outlook on the world economy means that on a long enough
|
|
timescale we will actually need the the added accuracy. Coming to the
|
|
conclusion that we will need it, the question left is one of when it would
|
|
be best to do.
|
|
|
|
This proposal uses the fact that a single-Satoshi has extremely low value
|
|
as an advantage. [Most teams](teams.md) do not need to upgrade their
|
|
software, because going from a transaction with milli-Satoshi to one without
|
|
loses a minuscule fraction of a penny to fees.
|
|
|
|
Doing the upgrade earlier allows everyone to get used to the idea and plan
|
|
their setup accordingly. And that makes 'now' the cheapest time to do the
|
|
upgrade for the entire BitcoinCash ecosystem.
|
|
|
|
# Changelog
|
|
|
|
At the end of 2023 the proposal was massively simplified after realization
|
|
that some problems that were solved with the extra complexity was a
|
|
non-issue in practice. Check git if you're curious.
|
|
|
|
March 2024 this proposal got renamed from 'CHIP-subSatoshi' to the more apt
|
|
'CHIP-milli-satoshi'
|
|
|
|
# Copyright
|
|
|
|
Copyright (C) 2023-2024 Tom Zander
|
|
Copyright (C) 2024 Kallisti
|
|
Copyright (C) 2024 BitcoinCashAuthist
|
|
|
|
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|