user4783: When the Bitcoin client receives a transaction, it checks if the transaction is confirmed. This is done by verifying that the transaction hashes correctly, in the merkle tree, to the merkle root in a block.
How does the client know which block holds the merkle root of the transaction?
After finding the correct block, how is the merkle branch acquired?

user208: There is no way in the current P2P protocol to request a historical (=confirmed) transaction, without requesting the block it is in. Supporting that would require the peer to have a full index of all transactions ever, which isn't necessary for normal operation.
To request a transaction, you will either:

Use getdata MSG_TX <txid> to request a memory pool or recently relayed transaction. In this case, no block information exists.
Use getdata MSG_BLOCK <blkid> to request a full block, in which case you get the block with it, and need to check the full merkle tree anyway.
Use getdata MSG_FILTERED_BLOCK <blkid> to request a filtered block (see BIP37), in which case you can check the partial merkle tree to verify the transaction is indeed part of the block.


4783: <p>When the Bitcoin client receives a transaction, it checks if the transaction is confirmed. This is done by verifying that the transaction hashes correctly, in the merkle tree, to the merkle root in a block.</p>

<p>How does the client know which block holds the merkle root of the transaction?</p>

<p>After finding the correct block, how is the merkle branch acquired?</p>
 208: <p>There is no way in the current P2P protocol to request a historical (=confirmed) transaction, without requesting the block it is in. Supporting that would require the peer to have a full index of all transactions ever, which isn't necessary for normal operation.</p>

<p>To request a transaction, you will either:</p>

<ul>
<li>Use <code>getdata MSG_TX &lt;txid&gt;</code> to request a memory pool or recently relayed transaction. In this case, no block information exists.</li>
<li>Use <code>getdata MSG_BLOCK &lt;blkid&gt;</code> to request a full block, in which case you get the block with it, and need to check the full merkle tree anyway.</li>
<li>Use <code>getdata MSG_FILTERED_BLOCK &lt;blkid&gt;</code> to request a filtered block (see BIP37), in which case you can check the partial merkle tree to verify the transaction is indeed part of the block.</li>
</ul>
