最近比特儿NXT被盗事件闹得沸沸扬扬,当时比特儿提出一种解决方法就是回滚,似乎有些抽象,接下来笔者用简单话语来解释一下回滚,希望大家能看懂。
首先大家需要明确的是,rollback(回滚)本身是个数据库操作概念,只是延伸到电子币领域来使用,通常来说,传统数据库领域的rollback只能在commit(提交)前才会起作用,它的执行将意味着在rollback之前的某个或全部的操作无效,在正式commit数据之后则应无法rollback。但是,针对电子币领域的回滚,则无时无刻都可以发挥效果。
可能有些朋友会奇怪了,甚至会震惊了,为什么在去中心化的电子币领域中,会发生这种看上去好像非常“中心化”的数据回滚现象呢?其实,这长期以来都是“外行人”的一种误区,因为根本上讲,绝对的“去中心”,无论在技术上或现实中,都是不存在的——根本就没那么一码子事。
没错,不管是P2P也好,C2C也罢,其实无论如何,“去中心”都是一个相对概念,而无法成为绝对概念。就像声音需要空气传播,电需要导体传播一样,无论任何东西想要传播出去,都需要一个相对固定的“渠道”,而这个渠道,无论怎么样,也都会成为一个相对的“中心”般存在。
比如我们大家常说电子币是基于P2P(Peer to Peer)的,好像有了这种技术,我们的电子币网络就可以不受约束,随心所欲的任意传输,并且彻底去中心化了。然而,事实上真的是这样吗?显然不是的。
事实上,P2P化的电子币数据要想传送出去,也必须要利用必要的“渠道”才能做到,而这“渠道”,通常分为两种:
一种是向邻近地址发送广播请求,查看有无可用的电子币数据进行同步。具体来说,这种方式近似于有个人拿喇叭喊话,听到喊声的人再传给下一个,但是大家也都知道,声音的传播距离非常有限,而过用户不够密集的话,这种广播式数据同步是传不了多远的。最典型例子,比如你的电子币仅限于局域网环境中,假设你的IP地址是192.168.0.1,那么尝试请求的地址就是192.168.0.2,192.168.0.3之类一直到192.168.0.255,如果都找不到数据进行同步,这个币就同任何人都没有连接,连接的条数就始终是0,也就是将使用处于不可用状态。典型案例的是在国内联通环境下使用美卡币,因为该币中心服务器地址被墙(至少联通连不通),而用户量也非常少,所以在不“翻阅”的前提下,根本无法同步其网络数据。
二是通过中心服务器获得数据(或可用的固定数据同步地址),再进行计算机之间的随机同步。具体来说,这就像是开了个固定位置的劳务市场,然后各种各样的人都到这里来早工作,由劳务市场来分配给不同的人(不同IP)不同的任务(数据包)进行同步。事实上,目前所有的电子币都有这一步骤,差异仅仅在验证过程的严谨性,以及是否存在纠错判定上面。
而电子币的rollback(回滚)是怎么一回事呢?很简单,就是这个中心服务器地址突然告诉你的电子币,只有这样一种数据才是对的,其它的都是错误的。一旦你的电子币客户端接受了这样一类信息,那么,无论服务器发送给你的数据包结果正确与否,就都会按照这种数据来执行了。
具体到NXT的情况,目前NXT开发团队给出的解决方案是:
This release disables all outgoing transactions from the BTER account:10715382765594435905 after block height 209885.
也就是说,他们修改了NXT的数据库文件(nxt.h2.db),进行了“靶向攻击”,只把由10715382765594435905(Bter的NXT账号)发出的,经由209985这个block中转的所有交易无效化,而其它交易则不受影响。根本上讲,是开发团队启动“非常手段”,强制把NXT归还给Bter了。
而NXT为什么能够做到这点呢?非常简单,我们翻看DbVersion.java代码,就能发现其数据库中已经硬性规定了允许用户访问的“中心服务器”列表,只要这些列表中超过51%的地址接受了NXT官方团队的修改后数据,并且同步到自己的服务器端,那么,其它的用户无论是否接受他们的修改,一旦联网,你们的数据也就自然变成了他们修改后的结果了。(另外,对POW币来说,各大矿池全部反水的后果也是这样,或者Bitcoin-qt客户端故意给你们同步错误数据,并且超过51%用户下载了这个客户端的结果也差不多)
但是,就正常运作的情况而言,黑客盗币并不是回滚的理由,blockchain任何情况下都应该是不能回滚的。最关键的问题在于,按照常识来说,回滚区块意味着开发团队在向整个世界宣布,区块链系统完全受到个了开发者的彻底控制,他们能回滚区块,也能修改区块。这样的系统根本无法保护你的财产,更谈不上去中心化。
比如Bitcoin或Ripple之类,已经运行了很长时间,并且承载着上千万上亿美金交易任务的币种,除非是遇到严重技术BUG,否则无论任何情况下也不会出现rollback(回滚)的情况(尤其是Ripple,它作为金融协议复杂性远超Bitcoin之类的一般电子币,根本不可能也不敢进行任何人为干预,前一阵Jed闹的那么厉害,也没见RL敢上手段动他的币,当然,更主要的是Rippled不止一个,而且大多掌握在其它商业机构手中,官方也无法保障别人跟他们一起同步),因为但凡程序出身的人就会明白,对一套成熟的金融系统而言,你rollback付出的代价,远远超出被盗币本身所将付出的代价。
某些网友天真的以为,仅仅凭借开发团队修改客户端,无法干预到电子币的最终运行数据。
而事实上又如何呢?本着“有教无类”的科学精神,我们就来看看前两天NXT紧急更新的1.2.5b和1.2.5f版本,其中更新了什么呢?很简单,其实BlockchainProcessorImpl中仅仅新加了一小段代码。
if (transaction.getSenderId().equals(Convert.parseUnsignedLong("10715382765594435905"))
&& previousLastBlock.getHeight() >= 209885) {
throw new TransactionNotAcceptedException("Account disabled", transaction);
}
这是什么意思呢?所有经由10715382765594435905地址产生,BlockHeight大于或等于209885的交易,一律无效。也就是只要你下载了这个新版本的NXT,那么,不管你数据中如何记录的交易,所有Bter所谓“被盗”的相关数据,在你同步区块的那一瞬间,就一律【没有】了,Bter被盗这回事,也就彻底不存在了。
怎么?你说你不更新不就成了?嘿嘿,凡是用NXT的,你能今天不更新,你能明天不更新,但你能一辈子不更新吗?难道以后出Bug你自己修复,加新功能你自己添加,编译文件你自己编译吗?对大多数人来说,恐怕不能吧?那么,只要你下载新版本,以后就都是这样了。
更关键是,你能让各大交易所,特别是Bter也不更新这个版本吗?恐怕更不能吧。
而交易所只要一更新客户端,其实根本不必管你51%或52%的认可,只要你和他的客户端数据结果不一样,交易将一律无效。也就是说,不管你们多少人想更新,或者不想更新。一旦交易所更新了这个版本,你们发过去的涉及相关交易区块的交易,就必须按照交易所的客户端结果走,否则全都作为伪币无效了。以后你们善意取得也好,恶意盗取也罢,不管你们同意分叉也好,不同意分叉也罢,总之将来所有涉及到209885这个区块(且由10715382765594435905地址)产生的交易,人家就统统都给你们当伪币“没收”(无效化)了。
为什么人家这么牛气呢?人家说,“NXT开发小组支持我们这么干的啊”。
结果大家需要怎么办呢?很简单,不管你支持还是不支持,都必须把自己的NXT升级到最新版本,否则,一切后果请自负哦~
这么形容,够简单易懂的了吧?
摘自:
比特帮