user117463: I understand Merkle roots can be used for Merkle inclusion proofs, where a client/validator can quickly check if a transaction is part of the block without requesting all the transactions in the block.
The question I have is this: for this process of performing the Merkle proof, where does the client performing the proof get the merkle root from? And how is the client guaranteed that the merkle root it is given is the correct one?
I am thinking of a scenario where an attacker could convince a client/validator that a transaction is part of a block by sending it a fraudulent Merkle root and corresponding hashes.
What properties of Merkle trees and how it is used in Merkle inclusion proof in bitcoin prevent this from happening?

user5406: Generally, thin-clients at least download, validate, and store the header for each block. Since the Merkle root is part of the header, they already know all the Merkle roots for the whole blockchain. While a block header is insufficient for checking the corresponding block's validity (even the complete block would be insufficient if the validator doesn't know the current UTXO set), just from the header, a thin-client can verify that…

the block header is well-formed
the block header provides sufficient proof-of-work to pass the difficulty requirement
the block header commits to the previous block, and inductively connects to the Genesis Block

Since each header is only 80 B, the whole header chain is just ~57.5 MB. Thin-clients then gain some confidence in the chain-tip they're following by waiting for additional blocks extending it under the assumption that only the best chain would be acquiring significant additional POW over time.
Now, when a thin-client receives a transaction along with its Merkle branch, it can check whether it attaches to the header chain by hashing the transaction, combining it with the corresponding hashing partners that were part of the Merkle branch, and whether that ends up matching a Merkle root in one of the block header's it has.

117463: <p>I understand Merkle roots can be used for Merkle inclusion proofs, where a client/validator can quickly check if a transaction is part of the block without requesting all the transactions in the block.</p>
<p>The question I have is this: for this process of performing the Merkle proof, where does the client performing the proof get the merkle root from? And how is the client guaranteed that the merkle root it is given is the correct one?</p>
<p>I am thinking of a scenario where an attacker could convince a client/validator that a transaction is part of a block by sending it a fraudulent Merkle root and corresponding hashes.</p>
<p>What properties of Merkle trees and how it is used in Merkle inclusion proof in bitcoin prevent this from happening?</p>
 5406: <p>Generally, thin-clients at least download, validate, and store the header for each block. Since the Merkle root is part of the header, they already know all the Merkle roots for the whole blockchain. While a block header is insufficient for checking the corresponding block's validity (even the complete block would be insufficient if the validator doesn't know the current UTXO set), just from the header, a thin-client can verify that…</p>
<ul>
<li>the block header is well-formed</li>
<li>the block header provides sufficient proof-of-work to pass the difficulty requirement</li>
<li>the block header commits to the previous block, and inductively connects to the Genesis Block</li>
</ul>
<p>Since each header is only 80 B, the whole header chain is just ~57.5 MB. Thin-clients then gain some confidence in the chain-tip they're following by waiting for additional blocks extending it under the assumption that only the best chain would be acquiring significant additional POW over time.</p>
<p>Now, when a thin-client receives a transaction along with its <a href="https://bitcoin.stackexchange.com/a/50680/5406">Merkle branch</a>, it can check whether it attaches to the header chain by hashing the transaction, combining it with the corresponding hashing partners that were part of the Merkle branch, and whether that ends up matching a Merkle root in one of the block header's it has.</p>
