Merkle Proofs are one of the main reasons that people attribute Bitcoin's use of Merkle Trees. But I'm struggling to understand how these work in practice. Please explain theoretically as well as practically.
Given that Lightweight Nodes only store Block Headers to limit the storage needed for their copies of the BlockChain, Nodes don't have access to the transactions in a Block; by definition of a Block Header, the only info they have about transactions is the Merkle Root.
But the Merkle Root is not enough to prove a transaction is in a block. All the sibling-values up the Merkle Tree are needed. Where do these values come from if they aren't already stored?
Example. Node 1 has a Block on its Blockchain with Merkle Root =
H_ABC...P. It wishes to see if
H_K is in the block. To do so, it needs the values
H_L; H_IJK; H_MNOP; H_ABC..H. Where and how does it get these?