The 9 decimals comes from efficient use of u64 integer.
2^32 SNT is 10 digits. Nine decimals means then that is 19 digits.
A u64 has 19 1/2 digits (the 1/2 is part use of the 20th digit). So then using 9 decimals is maximising the use of the u64 variable.
u96 gives 28 1/2 digits which would allow 18 decimals.
u128 gives 38 1/2 digits which would allows 28 decimals
Granted that is correct, although Safe has the better chance since its all in the DBCs
If the version is built in up front then the installed software base can recognise the difference. It is not a reason to say we only keep the original.
Personally I would like to see u128 implemented from the start even though 28 decimals is too much for reasonable use for the forseeable future. But personally, and I argued this last time, 9 decimals is building in a limit that is short sighted. 18 decimals would be far better and 28 while not likely to be usefully for decades will not be an issue.
But I can see that to go above 9 decimals at this stage is to invite spamming using 1 x 10^-28 dust. But with all the work the client has to do to split a DBC and send it, may mitigate this issue where sending dust will cost the spammer more than actually spam.
One way to implement 9 decimals now and increase later is to use a u128, but the core code will not approve a DBC with more than 9 decimals. Then during an upgrade the node software can then increase the number of decimals to say 12, and next time to 15, etc. Since Nodes have to upgrade within a reasonable period (ie only be a couple of versions behind). And the enable point/trigger is worked into the upgrade which occurs after the time all nodes will have had to install to still be allowed on the network.
@JimCollinson I consider hard setting the decimals to 9 places will sorely limit usefulness of micro payments since the perception (& hope of many) that SNT will rise to 1000$ or more and thus 1x10^-9 is at the limit of a micro $ payment. Even 12 decimals will cover this even if/when SNT is worth a lot more in 20 years.
I suggest that DBCs use u128 (allows 28 decimals) even though we would not want 28 decimal places, but this would then provide a simple path, through code upgrades, to increase the allowed decimal places from the original 9 over time as its needed and/or compute power/net-speeds is higher.
Basically there is 28 decimals from the start but the last 19 places have to be zeros while decimals is limited to 9