你去楼下的便利店买牛肉干,扫码付款后,老板点头微笑,双手把牛肉干捧给你,因为他手机响起一个温柔的声音:支付宝到账15元。
但如果没听到这句话,即使看到你手机上付款成功的页面,老板也会心有不安,这是为什么?
他要验证这笔支付是否已被确认。
老板心里没底,直到支付宝开口,才敢向你点头。这是中心化支付系统的确认逻辑:以中心记录为准。
可如果用去中心化的货币支付,你钱包显示已付款,老板要如何确认已到账呢?要知道,他面对的可是一个被不可信节点包围的世界。
如果他确认不了,你就吃不到牛肉干。而且,老板可不想把确认过程弄复杂,比如下载几百GB的交易记录。
因此,在去中心化的货币系统里,每次确认支付前都拦着两排铁丝网:
一是安全:如何应对恶意节点骗人?
二是便利:便利店老板不会容忍不便利的事。
看似无解,但SPV能做到。
SPV(Simplified Payment Verification,SPV)即简单支付验证,是一种即使没有完整交易记录,也能便捷、安全地验证支付的方法。
不用下载全部区块(几百GB),只需下载全部区块头(约40MB),就能轻松验证所有支付。真的吗?
现在看来是真的,因为比特币已正常运行了9年多。
区块头是区块的身份信息,内含一个特殊哈希值——默克尔树根(Merkle Tree Root)。
还记得某人给你的1.5个比特币么?记账员(矿工)在记录时算出每个交易的哈希值(红框)如图2-5所示:
图2-5
矿工把区块内所有交易(约1000—2000笔)的哈希值一字排开,让他们两两牵手,每对交易哈希值牵手后再算出新哈希值(如图2-6左侧框H A 与H B 两个哈希值叠加算出H AB )。矿工验证、记录和整理交易的过程称为“打包”。
图2-6
往上叠加哈希值,直到顶点就完成打包过程。叠加完就是默克尔树,树的顶点就是默克尔树根。真实的默克尔树宽很多,因为2000多笔交易实在没办法横在这页纸上,所以这里只用16笔交易举例。
默克尔树根有一个神奇之处:仅仅一个哈希值,就蕴含该区块内所有交易验证信息。
请注意:是交易验证信息,而不是交易信息。要查询具体的交易信息,你得下载全节点区块数据;但验证一笔交易是否被记录,下载区块头数据已足够,因为有简单支付验证(SPV)方法。
那SPV如何验证交易是否存在呢?
首先明确两个前提:
第一,每笔交易都有标准格式,包括输出地址、输入地址和交易金额等,因此交易一旦发生,该交易哈希值瞬间产生(假设为H k ,见图2-7)。
第二,如果交易被矿工打包过,拥有全部交易数据的节点(称为“全节点”,full node)必然有整棵默克尔树。
图2-7是一个简单支付验证(SPV)的过程。
第一步:老板的钱包软件把哈希值(H K )交给邻近的全数据节点去验证。
第二步:全节点反馈老板钱包为图2-7所示的H ABCDEFGH 、H MNOP 、H IJ 、H 2 的哈希值。
图2-7
第三步:老板的钱包经过4步哈希计算:
·Hash(H K ,H L )
·Hash(H IJ ,H KL )
·Hash(H IJKL ,H MNOP )
·Hash(H ABCDEFGH ,H IJKLMNOP )
即沿图虚线框路径,老板的钱包最终得出哈希值H ABCDEFGHIJKLMNOP 。
第四步:将H ABCDEFGHIJKLMNOP 与自己钱包里下载好的默克尔树根进行对比,若一致就能确认这笔交易存在。
即使有2048笔交易,最多也只需做11次哈希计算,因为log 2 (2048)=11。看到公式先别头疼,这是“2的11次方等于2048”的逆运算表达式。
总之,即使一个区块中交易再多,也没什么了不起的,十来次就能完成验证,不信你算算log 2 (65536)=16。也就是说:就算一个包里有6.5万笔交易,16次哈希计算也就完成验证了。
你还记得吗?每次哈希计算只要0.01秒,因此很便捷,验证过程最多花费0.2秒。
另外,SPV方法能看到有多少区块确认过此交易,如果被超过6个区块确认,则可视为绝对可靠。
因此, 仅用一个哈希值,就能快速、准确地验证该区块内的所有交易。
另外,区块头数据量极小。每个区块头仅80个字节,每年增加4M存储空间,积累100年也就400M,不过半部小电影。
便利性很好,但安全问题如何解决呢?例如,遇到意图抹掉自己已支付记录的恶意节点,怎么办?
仅仅80个字节的默克尔树根,能快速验证支付就算了,为什么还能把恶意节点的攻击全部挡在外面?
答案十分简单:算力上的不可能。
默克尔树根类似于数字签名:公开,但无法伪造。准确地说,伪造需要极大的算力,你可以把“极大”二字理解为人类现有总算力的一万亿倍,量子计算机登场也徒劳。
可是, 如果全网真的被一个强大的恶意算力控制,那将变得很脆弱。 这是比特币理论上最明显的软肋,中本聪在白皮书里坦言:
网络节点能自行确认交易,攻击者如果保持算力优势,SPV方法会被攻击者的虚假交易欺骗。
你一定能想象中本聪写这句话的时候表情是忧郁的,如果去中心化系统被恶意节点侵占,SPV会不堪一击,但他给出了一个解决方案:
可行的策略就是,一旦节点发现非法区块,就立刻发出警报,收到警报的用户立刻开始下载完整交易信息和被警告有问题的交易,以判定信息是否一致。
想想吧,一旦发现恶意节点,你的手机钱包会马上从其他正常节点下载数据,自保防骗,这是帮助比特币维持生命的应激反应,就像我们人类遇到危险、惊吓或其他刺激会肌肉充血一样,人类这样的生理特征帮助我们的基因绵延至今。
比特币以此立命,至今安生。
比特币有个缺陷:确认速度慢——10分钟左右产生1个区块,6个区块都确认后才能确保交易安全。
如果你肚子很饿,却用比特币买牛肉干,那解决不了问题,因为交易确认需要一小时,如果遇到交易拥堵,七八天都未必能确认。
解决方案是提高手续费,就像滴滴在高峰期提价叫车一样,手续费是驱动矿工帮你记账的动力。但在每笔交易手续费已相当于百元人民币的今天,拿比特币去超市买一包15块钱的牛肉干显然是不划算的。
比特币远不完美,也经常遭受非议,但这丝毫不影响它在人们心中的地位一路飙升。因为它用一串前人从未想过的理念,在人类历史上首次用技术手段保证价值在互联网上自由流动,对此,SPV功不可没。
如果没有SPV,去中心化网络不可能普及。毕竟有多少人喜欢没事背个全节点完整数据包出门溜达呢?
因此,确认速度慢就慢点吧,瑕不掩瑜。