Revised - Solving the Scalability Problem on Bitcoin
Add Reply
Adam Tamir Shem-Tov via bitcoin-dev
2017-08-27 04:09:08 UTC
Raw Message
This is a link to the most updated version of the problem and my proposed
solution, granted it still needs work, but this problem needs to be
resolved quickly. So I hope it will receive the attention it deserves, even
if the solution comes from somebody else.

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

*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
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
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
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