<div dir="ltr"><div><div><div><div><div><div><div>Hi all,<br><br></div>If we want to scale big we&#39;ll have to do a HF from time to time. Longer term, we may want to use extension point to add new features, but we are not there yet - more on extension points later on.<br><br></div>There seems to be a few changes that are relatively obvious, but hard to advocate for in a climate where HF are not acceptable.<br><br>The first that come to mind is the ordering of transactions in a block. When transactions spend from each others they need to be in the block in a specific order. This create a situation where the block needs to be verified serially, or where you need to work with a spend tree rather than the UTXO set - and it is significantly larger. Both options are hindering options for vertical scaling. But this ordering is completely unnecessary. Because transaction hash their input, producing an invalid chain of transaction require to break SHA256, and if that happens, transaction ordering is doomed anyway. As a result, we may which to get rid of the transaction ordering rule within a block. Validation would go as follow:<br><br></div>newUTXO = utxo.add(block.getAllOutputs()<wbr>);<br></div>foreach (i; block.GetAllInput()) {<br></div>    if (!newUtxo.spend(i)) {<br></div>        // Error !<br>    }<br>}<br><br></div>utxo = newUTXO;<br><div><div><div><div><div><div><div><br></div><div>Note that it is superior because the live set we are working with is the UTXO set, but all the spend operation do not need to be ordered anymore, so they can processed in parallel, or even on a cluster of machines.<br></div><div><br>Which leads to the way the merkle root is computed. It has a few issues. The first one is that it is susceptible to subtree repetition that would recompute the same root. It is possible to check for this, and indeed the software does it, but any software that does so incorrectly will be susceptible to being fed invalid blocks. This is undesirable. The second problem is that as blocks gets bigger, swapping the coinbase become expensive. On the other hand, we want to deploy solution to build the block over time sub as NG, subchains or alike (not that they are alike in what they do, but the underlying idea, to build the block over time, is the same). This is important for scaling. Finally, if we get rid of the strict ordering rule above, we can define a canonical ordering in the merkle tree so that block can be merged in a deterministic manner which is useful for NG or subchains, but also opens opportunity for extra compression in CB/XThin and allows for proof of absence in a block.<br><br></div><div>The merkle tree computation could be changed as follow:<br><br></div><div>The left branch starting from the root contains only the coinbase.<br></div><div>The right branch contains all the transactions - minus the coinbase, ordered by txid.<br></div><div>Empty subtrees (when there is an odd number of nodes at some level) are 0x000...0001<br><br></div><div>Interestingly enough, this allow for the same kind of merkle proof that already are possible today. In addition, because transaction are ordered by txid, it is possible to prove absence from the tree easily.<br></div><br><div>These changes are not very glamorous, but good data structure as the key for successful scaling and I think these will bring us in that direction.<br></div><div><br></div><div>Now among the more sexy changes. One is adopting a more interesting difficulty adjustment algorithm would also be nice. I discussed this in another email, so there is no point repeating it all here.<br><br></div><div>The maximal target ensure that several bits in the block hash are always 0, no matter what. These bits can be repurposed as an extra nonce. This is a very small and easy patch and current nonce space is not quite large enough.<br></div><div><br></div><div>I voluntarily put the topic of malleability asside here as it is not clear what path forward we should take. Hopefully the one above shouldn&#39;t be too controversial and impact for wallet should be minimal.<br></div><div><br></div></div></div></div></div></div></div></div>