请允许我这里用“山寨”这个词,只为形象。

比特币的全部根基,都在于民主化的确认机制:用挖矿争得确认权,然后确认交易是否合规,合规的交易录入block,赚取手续费。

只有比特币长期生存,矿工才会受益,所以我们假设矿工是会认真确认交易的。

但是,这个假设忽略了一个分工:“矿工”或者“矿池”,不是一个人,而是一个团队。老板也许是比特币外行,根本不懂啥叫风险。程序员可能是冒充的比特币内行,网上找一些代码,拼凑一下,就开始挖矿了。

由于C++很晦涩,所以开发钱包大多用基于java的bitcoinj。

bitcoinj是google公司开发的,从文档质量上看,这是一个不小的团队。又出现“团队”这个词了。也许这个团队的头懂比特币,但是我们不能保证团队每个成员懂比特币。于是,我发现Bitcoinj里面的交易确认功能,是不进行签名验证的,只是简单地看看输入输出格式对不对,甚至连手续费都懒的算。(真的希望我是错的)

Multibit是基于Bitcoinj的,Bitcoin手机钱包也是基于Bitcoinj的。如果哪天有矿池或者大矿工的程序是基于Bitcoinj的,灾难就要开始了:

恶意攻击者可以在没有私钥的前提下,随意生成新交易,把币打到自己的账户。

由于基于BitcoinJ的节点不验证签名,于是他们就会傻乎乎的转发这些交易。然后,基于Bitcoinj矿池/矿机也不验证,直接收录。收录后,基于Bitcoinj的钱包程序还会接受和传播含义不合格交易的区块;而QT钱包和正规