I was also thinking it may be possible to redesign the idea such that the old chain is not empty. This could be achieved by introducing a new transaction version number, e.g. version=2, and all version 2 transactions cannot appear in the legacy transformed f(B) blocks. However, old version=1 transactions can appear subject to the 1MB blocksize limit. However, once a coin has been used in a version=2 transaction, it and all child transactions can never again appear in the legacy block.
So:
NewBlock := BlockHeader ++ NumTx ++ Ver1Txs ++ Ver2Txs
f(NewBlock) = BlockHeader ++ |Ver1Txs| ++ Ver1Txs
And the MerkleRoot in the header corresponds to the transformed block.
This is more like extension/aux blocks, except:
* There is no need to explicitly move coins to the extension. Instead they are moved "automatically" when an new client issues a version=2 transaction.
* Coins can never be moved back out from the extension. There is no need to do this anyway, since there is no aim to support old clients indefinitely (remember this is a proposed alternative to a hardfork, which is
immediately incompatible with old clients anyway).
This means old clients can still
send coins, but may not be able to see
received coins unless they upgrade.