The latest version of the day:
Solving the Scalability issue for Bitcoin
What am I trying to solve? Currently Bitcoin’s blockchain is around 140GB.
In 2011 it took 1GB, and it was predicted back then that in 2020 that size would be 4GB.
As you can see it is not yet 2020, and we are way over that predicted size.
At
our current time, prune nodes which make the block smaller, but they
can not be validated without the full node. And this full node is
getting exponentially bigger, we need to stop that. Because if we don’t
no private citizen will have the capability of storing the full node in
his computer, and all full nodes will be at private multi-million dollar
companies. That would literally be the end of decentralization (or
non-centralization).
What I am proposing also makes sure the
blockchain has a maximum finite size, because today the blockchain can
grow to any size without limit while it approaches an infinite size!
Today
our blockchain is growing at speed which is much faster than Moore’s
law! This proposal will help set storage growth at a reasonable number.
A short list of what I am about to explain: Steps that need to be taken:
---------------------------------------------------------------------------------------------------------------------
(The details are not described in this order)
1)
Create a pair of keys, called the Genesis Pair, or Genesis Account, a
private and public key which will be publicly known to all and yet it’s
use will be restricted and monitored by all. The key will be the source
of all funds (Point A).
2) Preserve the Genesis Block, its hash code is needed. And personally I think its of historical value.
3)
Combine all Blocks up to the most recent (not including the Genesis
Block), and cut out all intermediary transactions, by removing All
transactions, and replacing them with new transactions sent from A to
every public key which has funds in the most recent block, in the amount
they have. And sign these transactions with A’s private-key. And create
a new block with this information.
4) This Combined/Pruned Block
should point to the Genesis Block hash, and the next block created
should point to the Pruned Blocks hash. The random number used for this
pruned block will be predefined, this random number normally used to
meet the hash difficulty requirement in this case is not needed, since
no difficulty setting is necessary for this block, and by predefining
it, this block can be easily identified.
5) Download the pruned block
from another node or create it yourself, the hash code will be
identical for everyone, since the block will be created exactly the same
everywhere.
6) Preserve a certain amount of the most recent blocks,
just in case a longer blockchain is discovered, and then the Pruned
Block should be recalculated.
---------------------------------------------------------------------------------------------------------------------
Now for a more detailed description:
I have this idea to solve the scalability problem I wish to make public.
If I am wrong I hope to be corrected, and if I am right we will all gain by it.
Currently
each block is being hashed, and in its contents are the hash of the
block preceding it, this goes back to the genesis block.
What if
we decide, for example, we decide to combine and prune the blockchain in
its entirety every 999 blocks to one block (Genesis block not included
in count).
How would this work?: Once block 1000 has been
created, the network would be waiting for a special "pruned block", and
until this block was created and verified, block 1001 would not be
accepted by any nodes.
This pruned block would prune everything from
block 2 to block 1000, leaving only the genesis block. Blocks 2 through
1000, would be calculated, to create a summed up transaction of all
transactions which occurred in these 999 blocks.
And its hash pointer would be the Genesis block.
This
block would now be verified by the full nodes (or created by them),
which if accepted would then be willing to accept a new block (block
1001, not including the pruned block in the count).
The new block
1001, would use as its hash pointer the pruned block as its reference.
And the count would begin again to the next 1000. The next pruned block
would be created, its hash pointer will be referenced to the Genesis
Block. And so on..
In this way the ledger will always be a maximum of 1000 blocks.
A bit more detail:
All
the relevant outputs needed to verify early transactions will all be
preserved in the pruning block. The only information you lose are of the
intermediate transactions, not the final ones the community has already
accepted. Although the origin of the funds could not be known, there
destination is preserved, as well a validation that the transactions are
legitimate.
For example:
A = 2.3 BTC, B=0 BTC, C=1.4 BTC. (Block 1)
If A sends 2.3 BTC to B. (Block 2)
And then B sends 1.5 BTC to C. (Block 3)
The pruning block will report:
A->B = 0.8 BTC and A->C=2.9 BTC.
The
rest of the information you lose, is irrelevant. No one needs to know,
what exactly happened, who sent who what, or when. All that is needed is
the funds currently owned by each key.
Note: The Transaction
Chain would also need to be rewritten, to delete all intermediate
transactions, it will show as though transactions occurred from the
Genesis block directly to the pruned block, as though nothing ever
existed in between. This will be described below in more detail.
You
can keep the old blocks on your drive for 10 more blocks or so, just in
case a longer block chain is found, but other than that the information
it holds is useless, since it has all been agreed upon. And the pruning
block holds all up to date account balances, so cheating is impossible.
Granted
this pruning block can get extremely large in the future, it will not
be the regular size of the other blocks. For example if every account
has only 1 satoshi in it, which is the minimum, then the amount of
accounts will be at its maximum. Considering a transaction is about
256bytes. That would mean the pruning block would be approximately
500PB, which is 500,000 Terra-bytes. That is a theoretical scenario,
which is not likely to occur. (256bytes*21M BTC*100M (satoshis in 1
BTC))
A scenario which could be solved by creating a minimum
transaction fee of for example: 100 satoshis, which would insure that
even in the most unlikely scenario, at worst the pruning block would be
5PB in size.
Which is still extremely large for today. But without
implementing this idea the blockchain literally does not have a finite
maximum size, and over time approaches infinity!
Also, this
pruning block does not even need to be downloaded, it could be created
by already existing information, each full node by itself, by:
1) combining and pruning all previous blocks
2) using the genesis block as its hash pointer
3)
using a predefined random number "2", which will be used by all. A
random number which is normally added to a block to ensure the block's
hash-rate difficulty, is not needed in this case, since all information
can be verified by each node by itself through pruning.
This number can also be used to identify this block as the Pruned/Combined Block since it is static.
4)
Any other information which is needed for the SHA256 hash, for example a
time-stamp could be copied off the last block in the block chain.
These steps will ensure each full node, will get the exact hash code as the others have gotten for this pruning block.
And as I previously stated the next block will use this hash code as its hash reference.
By
creating a system like this, the pruning block does not have to be
created last minute, but gradually over time, every time a new block
comes in, and only when the last block arrives (block 1000), will it be
finalized, and hashed.
And since this block will always be second, it should go by the name "Exodus Block".
Above,
I showed a way to minimize the blocks on the block chain, to lower the
amount of space it takes on the hard drive, without losing any relevant
information.
I added a note, saying that the transaction chain needs to be rewritten, but I did not give much detail to it.
Here is how that would work:
The Genesis Account (Key Pair):
---------------------------------------------------
The
problem with changing the transaction and block chain, is that it
cannot be done without knowing the private key of the sender of the of
the funds for each account.
To illustrate the problem: If we have a
series of block chains with a string of transactions that are A→B→C→D,
and to simplify the problem, all money was sent during each transaction,
so that no money is left in A or B or C. And I was to prune these
transactions, by replacing them with A→D. Only this transaction never
occurred, nor can anyone create it without A’s private key.
There is
however a way to circumvent that problem. That is to create a special
account called the “Genesis Account”, this account’s Private Key and
Public Key will be available to everyone.
(Of course, accounts do not really exist in Bitcoin, when I say account what I really mean is a Private/Public Key pair)
This account will be the source of all funds
But
this account will not be able to send or receive any funds in a normal
block, it will be blocked--blacklisted. So no one can intentionally use
it. The only time this account will be used is in the pruning block,
a.k.a Exodus Block.
When creating the new pruned block chain and
transaction chain, all the funds that are now in accounts must be
legitimate, and it would be difficult to legitimize them unless they
were sent from a legitimate private key, which can be verified. That is
where the Genesis account comes in. All funds in the Exodus Block will
show as though they originated and were sent with the Genesis
private-key to generate each transaction.
The funds which are sent, must match exactly the funds existing in the most updated ledger in block 1000.
In
this way the Exodus Block can be verified, and the Genesis Account
cannot give free money to anyway, because if someone tried to, it would
fail verification.
Now the next problem is that the number of
Bitcoins keeps expanding and so the funds in the Genesis Account need to
expand as well. That can be done by showing as though this account is
the account which is mining the coins, and it will be the only account
in the Exodus Block which “mines” the coins, and receives the mining
bonus. In the Exodus Block all coins mined by the real miners will show
as though they were mined by Genesis and sent to the miners through a
regular transaction.
I hope this proposal will be implemented as
soon as possible so that we can avoid a problem which is growing by the
minute. It was brought up about 6 years ago when the blockchain was only
1GB in size, nobody imagined back then that it would grow so quickly,
and the problem was ignored.
Today all solutions implemented have
been implemented by software, and not on the blockchain itself, these
solutions are not helpful in the long run.
The full node needs to
be publicly available to everyone, and at this rate, nobody will have
the hard-drive capacity to store. This will make us more dependent on
private corporation’s to store the blockchain, which will lead us
quickly to a centralized currency platform. By then it will be too late,
and the corporations will have complete control of what happens next.
Please take this problem seriously and work with me, to prevent it while we still have some time.
The
exact details can be worked out at a later time, but for now we need at
least an acknowledgment that this problem is dire, and needs to be
solved in a year’s time. I have presented a solution, if someone has a
better one, then let him/her step forward, but in any case a solution
needs to be implemented as soon as possible.
I have given a
basic proposal, I am sure there are those among us with more technical
understanding to the nuances of how this idea should be implemented. I
am counting on their help to see this through.
Adam Shem-Tov