On 13 Sep 2012, at 16:51, Gregory Maxwell <gmaxw...@gmail.com> wrote:

> I thoroughly understand the value of tree hashes. That wasn't what I
> was asking about.
> 
> If you're validating a block you need all the transactions, once you
> have them or their hashes you can build the tree without transferring
> more, e.g. what a fully validating node needs. If you're checking a
> single transaction to need the path from the transaction to the root
> (what a SPV nodes need, for example).
> 
> Can you spell out the 'end user'ish application for fetching a tree level?

A merkle tree root is found by hashing the two children together and those 
children are found the same way until you get to the greatest level down the 
tree. This means you can validate children as being correct as long as they 
hash together to form the root. This means you do not need all the transaction 
hashes to validate segments of the block, you only need the root hashes for all 
the segments you want. Let's say there are 8 transactions and you want to 
verify 4 segments (2 transactions each), The merkle tree looks like this (Might 
not work depending on the font):

Level 0:               *
                      / \
                     /   \
                    /     \
                   /       \
                  /         \
                 /           \
                /             \
Level 1:       *               *
              / \             / \
             /   \           /   \
            /     \         /     \
Level 2:   *       *       *       *
          / \     / \     / \     / \
Level 3: *   *   *   *   *   *   *   *

When you look at any non-leaf node you can see a separate merkle tree where the 
root can be found exactly the same as any other merkle tree. In this example 
you want four segments, so you ask for level 2. Now imagine a tree without 
level 3, you can validate the root with level 2. In fact you can validate that 
the root exists for any level. So you first check that the level 2 hashes do 
indeed calculate to the root. Once this is done you can now use these hashes to 
validate the segments. When you receive a segment, you check that segment 
against the segment's root. So you've validated the segment transactions for 
the segment root and the segment root was validated for the entire tree's root. 
You validate the segments for each segment root and this way you know all the 
transactions are valid for the four segments and thus are valid for the entire 
tree. This way you have downloaded 4 hashes instead of 8. 

Downloading the transactions hashes are therefore not necessary only the level 
for the segment roots. You might for instance want to divide the block into two 
segments in which case you ask for level 1 and download 2 hashes.

I hope that made sense.

And yes the merkle tree is particularly useful for validating a single 
transaction exists in a block as that saves a large proportion of the data 
required. The redundant data removed in the proposal here is smaller as a 
proportion of the total data (Because most of the data is the actual 
transactions themselves), so you might argue it's not worth it but it's simple 
to implement.
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Bitcoin-development mailing list
Bitcoin-development@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bitcoin-development

Reply via email to