找回密码
 立即注册

扫一扫,登录网站

首页 自媒体 查看内容
  • 3136
  • 0
  • 分享到

【深度】如何将简单支付验证SPV技术应用在实际生活中

2018-5-27 23:00

来源: huoqiucj

正文共:3329

预计阅读时间3分钟


支付确认速度慢就慢点吧,大美女脸上长颗痣,那是白璧微瑕。

你去楼下超市买牛肉干,扫码付款后,老板点头微笑,双手把牛肉干捧给你,因为他手机响起一声温柔:支付宝到账15元。

但如果没听到这句话,即使看到你手机上付款成功的页面,老板也会板起脸来一手按下牛肉干,一手拼命掐手机,这是干嘛?

他在验证这笔支付是否已被确认。

老板心里没底,直到支付宝开口,才敢向你点头。这是中心化支付系统的确认逻辑:以中心记录为准。

可如果用去中心化的货币支付,你钱包显示已付款,老板如何确认已到账呢?你要知道,他面对的可是一个被不可信节点包围的世界。

如果他确认不了,你就吃不到牛肉干。而且,老板可不想把确认过程弄复杂,比如下载几百G交易记录。

所以,在去中心化的货币系统里,每次确认支付前都拦着两排铁丝网:

一是安全:如何应对恶意节点骗人?

二是便利:便利店老板不会容忍不便利的事。

看似无解,但中本聪淡淡地说:SPV能。

一、什么是SPV?

SPV(Simplified Payment Verification,简单支付验证):一种即使没有完整交易记录,也能便捷、安全地验证支付的方法。

不用下载全部区块(几百G),只需下载全部区块头(约40M),就能轻松验证所有支付。真的么?说得像电视购物广告一样。

但现在看来是真的,因为比特币已正常跑了8年多。

区块头是区块的身份信息,内含一个特殊哈希值——默克尔树根(Merkle Tree Root)。

记账员(矿工)在记录时算出每个交易的哈希(红框):

矿工把区块内所有交易(约1-2千笔)的哈希值一字排开,让他们两两牵手,每对交易哈希牵手后再算出新哈希(如下图红框HA与HB两个哈希值叠加算出HAB)。矿工验证、记录和整理交易的过程称为“打包”。


默克尔树

往上叠加哈希值,直到顶点就完成打包过程。叠完就是默克尔树,树的顶点就是默克尔树根。真实的默克尔树宽很多,因为2,000多笔交易实在没办法横在你手机屏幕前,所以这里只用16笔交易举例,你能懂。

默克尔树根的神奇之处有两个:第一,作为树根,它居然可以长到脑门上;第二:仅仅一个哈希值,就蕴含该区块内所有交易验证信息。

请注意:是交易验证信息,而不是交易信息。查询具体交易信息,你得下载全节点区块数据;但验证一笔交易是否被记录,下载区块头数据已足够,因为有简单支付验证(SPV)方法。

那SPV如何验证交易是否存在呢?

二、SPV的过程

首先明确两个前提:

第一,每笔交易都有标准格式:输出地址、输入地址和交易金额等,所以交易一旦发生,该交易哈希值瞬间产生(假设为HK,图3绿框)。

第二,如果交易被矿工打包过,拥有全部交易数据的节点(称为“全节点”:full node)必然有整棵默克尔树。

所以:

第一步:老板的钱包软件把哈希值(Hk)交给临近的全数据节点去验证。

第二步:全节点反馈老板钱包下图4个蓝块的哈希值。

简单支付验证(SPV)的过程

第三步:老板钱包经过4步哈希计算:

1、Hash(HK,HL)

2、Hash(HIJ,HKL)

3、Hash(HIJKL,HMNOP)

4、Hash(HABCDEFGH,HIJKLMNOP)

即:沿图3虚线框路径,老板的钱包最终得出哈希值HABCDEFGHIJKLMNOP。

最后一步:将HABCDEFGHIJKLMNOP与自己钱包里下载好的默克尔树根对比,若一致就能确认这笔交易存在。

即使有2048笔交易,最多也只需做11次哈希计算,因为log2(2048)=11。看到公式先别抽搐,这不是高数,而是高中数学,是“2的11次方等于2048”的逆运算表达式。

总之你记得,即使一个区块中交易再多,也没什么了不起的,十来下就能搞定验证,不信你算算log2(65536)=16。也就是说:就算一个包里有6.5万笔交易,16次哈希就搞定验证了。

你还记得么?每次哈希计算只要0.01秒哦,所以很便捷,验证过程最多耽误0.2秒。

另外,SPV方法能看到有多少区块确认过此交易,如果被超过6个区块确认,则可视为绝对可靠。

所以,电视购物广告的神奇居然是真的:仅用一个哈希值,就能快速、准确验证该区块内的所有交易。

One more thing:区块头数据量极小:每个区块头仅80个字节,每年增加4M存储空间,积累100年也就400M:不过半部小电影。

便利性很赞,但安全问题如何解决。

三、如果出现恶意节点怎么办?

这是一个你眼熟的老问题,我们好像每篇文章都能遇到,于是我必须挖空心思变换措辞,因为文章看腻了你就不会继续学下去。

仅仅80个字节的默克尔树根,能快速验证支付就算了,为什么还能把恶意节点的攻击全部挡在外面?

答案简单到腻:算力上的不可能。

默克尔树根类似数字签名:公开、但无法伪造。准确地说,伪造需要极大的算力,你可以把“极大”二字理解为人类现有总算力的一万亿倍,量子计算机登场也然并卵。

可是:

如果全网真的被一个强大的恶意算力控制,那将变得很脆弱。这是比特币理论上最明显的软肋,中本聪在白皮书里坦言:

While network nodes can verify transactions for themselves, the simplified method can be fooled by an attacker's fabricated transactions for as long as the attacker can continue to overpower the network.

网络节点能自行确认交易,攻击者如果保持算力优势,SPV方法会被攻击者的虚假交易欺骗。

你一定能想象中本聪写这句话的时候表情是忧郁的,如果去中心化系统被恶意节点侵占,SPV会像傻子一样不堪一骗,但他给出一个解决方案:

One strategy to protect against this would be to accept alerts from network nodes when they detect an invalid block, prompting the user's software to download the full block and alerted transactions to confirm the inconsistency.

可行的策略就是,一旦节点发现非法区块,就立刻警报,收到警报的用户立刻开始下载完整交易信息和被警告有问题的交易,以判定信息的不一致。

想想吧,一旦发现恶意节点,你的手机钱包会马上从其他正常节点下载数据,自保防骗,这是帮助比特币维持生命的应激反应,就像我们遇到危险、惊吓或其他刺激会肌肉充血一样,正是这样的设计帮助我们的基因绵延至今。

比特币以此立命,至今安生。

结语

比特币有个缺陷:确认速度慢——10分钟左右产生1个区块,6个区块确认后才能确保交易安全。

如果你肚子饿、却用比特币买牛肉干,那解决不了问题,因为交易确认需要一小时,如果遇到交易拥堵,七八天都未必能确认。

解决方案是提高手续费,就像滴滴在高峰期提价叫车一样,手续费是驱动矿工帮你记账的动力。但在每笔交易手续费已达等值百元人民币的今天,拿比特币去超市买一包15块钱的牛肉干只能显得你很牛。

比特币远不完美,也每天遭受非议,但这丝毫不影响它在人们心中的地位和它的价格一起向上爬。因为它用一串前人从未想过的理念,在人类历史上首次用技术手段保证价值在互联网上自由流动,SPV功不可没。

如果没有SPV,去中心化网络不可能普及。毕竟有多少人喜欢没事背个全节点完整数据包出门溜达呢?

所以,确认速度慢就慢点吧,大美女脸上长颗痣,那是白璧微瑕。

版权申明:本内容来自于互联网,属第三方汇集推荐平台。本文的版权归原作者所有,文章言论不代表链门户的观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。
相关新闻
发表评论

请先 注册/登录 后参与评论

    回顶部