The problem is that you didn't even understand the logic of the arguments here.
Nope, you've misconstrued what they've said. They're saying that SPV users rely on someone to give them a correct copy of the blockchain because SPV clients are not checking the history to validate if what they've received is correct. The theoretical double spend wouldn't be in the actual blockchain that everyone else can see, it would be in the fraudulent copy being given to the SPV user. Read what achow101 said again:
No,
that is cryptographically impossible. You cannot give a "fraudulent copy of the block chain headers" to an SPV user, if that user knows the currently actual block chain headers, in exactly the same way full nodes do. In as much as full nodes can know the latest few block headers, an SPV user can know them too, and in as much as you can trick an SPV user into believing the last few block headers are different from what is actually mined on right now, you can just as well trick a full node into that.
Moreover, "tricking someone into a false block chain header list" requires you in any case
to spend PoW on that block chain header list of the same order of magnitude than the prong you want your SPV victim to believe. If you do that, you can just as well trick a full node into your prong.
You could think you had received some BTC from a transaction, but when you tried to spend it, the rest of the network wouldn't validate it because you didn't actually have the funds, despite the copy of the blockchain you received saying you do have the funds. SPV users have to rely on honest nodes.
No, as I outlined, that is not possible. In order to trick me into believing that, you have to provide me with of course the fake transaction, but you also have to provide me with the leg of the Merkle tree that connects its root to the transaction. That Merkle root is included in the block chain header list I have.
If that header list is ending on the block chain headers that mining pools are currently mining on, then I know that that transaction is a part of the very block chain miners are mining on right now. That is exactly the same block chain that full nodes have right now also.
Again:
if, of two block chains, the leading heads of the header blocks are the same, both the ENTIRE BLOCK CHAINS are identical.So
there's no such thing as a rogue SPV server, IF I can have access to the latest block headers being mined right now. And even if I cannot have access to the latest blocks being mined (and then, my full node wouldn't get access either), that "rogue SPV server" still has to spend a lot of PoW to make the false prong. He will have to spend as much PoW grossly as attacking the real chain, and for this attack to succeed, he must also ensure himself to avoid me of learning about the real chain (that may have somewhat more PoW).
A full node is just as "vulnerable" to such an attack.There is no more a rogue SPV server, than there can be another rogue document server of a document of which I know the hash. If I know the hash of a given piece of software, then no server can trick me in installing another piece of software. As the last block header mined is equivalent to a kind of hash of the entire block chain, no-one is going to be able to serve me anything else and make me believe it.
However, the structure of the block chain makes it possible to "chop up" the document in small pieces: the transactions. That's exactly why Satoshi did so.
If I can know the latest headers, I cannot be tricked into accepting anything in the block chain that a full node that is accepting these latest headers, wouldn't have accepted either.
The argument that achow101 put forward, was another situation, namely where in the actual chain, there were double spends included. Indeed, as an SPV node, I can be made aware of an existing transaction in the actual chain, but I cannot know that that actual chain also includes a double spend, while a full node can. But then, as I said, bitcoin is broken already.
Just to be absolutely clear: in the SPV system,
the SPV user has the full block header chain of course, from the genesis block up to the current blocks.
He simply doesn't have the block bodies. But he has all the headers.