BSV的应用程序架构设计及误区(一)

在我的想法里,矿池是一个非常重要且核心的基础设施,大家理解挖矿这个事情,并不是像很多人想的那样——”矿工在深山老林里偷着电,然后买一些机器往那儿一丢,就保护了比特币的安全“。

这个说法其实很有趣,为什么说矿工一边偷着电,一边还保护了比特币的安全呢?

这里是有一些误区的,真正保护比特币账本安全靠的是矿工(矿工:这里指具备打包权的服务器)对网络持续的监测,来拒绝掉对网络的攻击。

BSV的应用程序架构设计及误区(一)
那么这件事何时发生的呢?就在上一次Craig博士领导的使用Bitcoin SV的节点,对于BCH修改比特币协议这个攻击的反抗上面。
这个保护账本的动作其实很简单,就是使用invalidateblock的方式,把试图攻击的区块给拒绝掉。在这种情况下,矿工用自己的算力投票,来保护比特币真正的账本。

由此延伸一下,在现实生活中,大家会看到的会是什么?
在区块链世界里,最早比特币出来的时候,存在“经过六个区块确认后就会比较安全”的这么一个说法,这也是为什么很多人在钱包转账、入账时都很注意确认数的原因,确认数其实就是你的区块、你的交易已经被某一个区块打包了,写在了某一个可能的分叉账本里。 为什么要六个确认数?是由于在区块链上面随时会出现可能的分叉,它又是否会影响用户的资金安全。
在这个关键问题上,我需要严肃地说明,实际在比特币领域,区块并非一个重要核心理念,交易才是最重要的因素——这是因为每一个交易都经由交易发送方的数字签名,它是一个合法的数字证明,且是依靠交易来保证的,而不是依靠区块。


矿工在不同交易版本的选择上发挥巨大作用,他们的力量是什么呢?每位矿工都独立地验证自己收到的交易信息,并查看它是否合法,同时每位矿工对其他矿工广播自己收到的交易——在这个流程背后,其实存在着经济驱动,为什么这个矿工需要去广播交易呢?
因为当他将交易更快送达至其他矿工时,他打包的区块也更高效传达到了其他矿工手里,这本质上是一种经济驱动,它能够降低每位矿工的孤块率。
对于矿工来说,他们被驱动着与其他矿工保持一种竞争与合作的关系,在这种情况下,这些矿工收益可以得到更大提升,这是另一种经济驱动。
这时候呢,我们假设突然出现了一个双花交易,在矿工看来,他会把这个交易和其它的版本,就是其他矿工手里收到的交易进行对比,看其是否会被其它矿池所接受。如果某一个交易有99%的算力都认可他的话,我们可以认为这个交易在下一个区块进入账本的可能性是极高的,是有99%的可能;如果某一个交易在网络上面并没有收到有双花的通知的话,则可以认为这个交易应该是能够写入账本的,这就是我们讲的零确认交易概念。
**所以,零确认交易并不是指这个网络上不能有双花,这是很重要的一点。**很多做应用的开发者认为,“真正的比特币网络交易就应该是拒绝双花,不能允许它存在”,其实这并不必要,关键只在于,需要收款方能够确定地知道——自己收到的交易是否存在双花的可能性,就是完成任务了。


如果存在双花的可能性的话,有可能是什么原因导致的呢?

只有可能是这个交易的人在作弊导致的这个原因,因为只有他能够签名出另外一个版本的交易,所以从开发者的视角来看这个问题的话:

  1. 把交易作为核心的原则进行控制,而不是看区块确认,区块确认其实不重要。
  2. 在收到交易以后,应该尽快把这个交易和其他所有的矿工进行交叉的确认,确认这个网络上是否存在另外一个版本的交易,这其实对很多开发者来说并没有做到,现在开发者都还依赖于广播这么一个概念,稍后我会说明一下广播这个东西,背后存在什么问题。

如果某一个交易在网络上没有发现同时存在的双花交易(这是一个前提),假设没有看到有人双花,但是10分钟以后我们发现出了一个新的块,这个块出现了一个双花交易,把原先的交易给覆盖了,这就是大家所说的矿工攻击网络,由某恶意矿工打包了一个区块,这个区块双花了用户的币,这个双花过程是可以被其他矿工检测到的,因为每一个原先的交易,矿工要想接受它,并和其它所有的矿池进行确认以后,矿工是知道说这个交易是被所有人看到的,被所有人认可的,没有问题的。但是突然间在网络上出现了另外一个块,双花的交易,使得现在的交易不合法了,那说明只可能是比特币网络受到了攻击。我回到刚才的问题,我们矿工用什么样的方式来保护比特币的账本呢?就是通过检测可能出现的双花交易,并且拒绝掉不被其它矿池认可的版本的交易所在的区块来完成的。


在这时候网络会不可避免出现分叉,因为我们作为诚实的矿工,必须坚守自己认为最真实的账本

所以我们不会允许像别人宣传的那样说——“你收到的攻击的那个块,那个块出来的速度最快,你应该先遵循它,应该把自己的算力切到它那边去,去跟着攻击者的区块走”,这是一个很大的概念误区,如果对对挖矿的概念不太了解的人,就可能会误以为双花比特币SV的成本很低,因为你只需要用全网百分之一点几的算力,就可以发动攻击,就可以带着BSV账本逃跑,就有权利在上面任意修改账本。
如果是这样的话,攻击者大可以放马过来试一下。我们作为矿工会坚守我们看到的诚实的账本,不管背后有多少算力。我们会忠于坚持直到自己破产为止,所以这并非简单一句话说,我只要快速的打了6个块,然后所有其它的账本、交易所全部都跟着我了。

假设你在网络上看到了两个不同版本的账本,一个账本是诚实的,他拿到的算力暂时比较低,另外一个版本是攻击的账本,上面有很多非法的双花交易,那你应该选择哪个账本,是选择算力更大的账本还是选择一个诚实的账本,这个问题我留给所有参与的各方,留给所有的交易所,留给所有的应用开发者,他们会有自己的判断。


此处再返回说明一下前面提到的“广播”

广播其实是一个魔法,这个魔法给很多人带来了幻觉。我作为一个矿工,我现在正在舞台上跟大家广播,我宣布一下收到了什么交易,就像突然间全世界都听到了我这句话,自然的他们在账本上面就记下了新的转帐交易,然后这个转帐就很神奇的达成了。我只要对着天空大吼,我向某某转了多少钱,然后对方就收到钱了,这是大家原本以为的魔法。
在比特币世界里,其实不存在大家想像的这种广播。传统意义上,每个节点只保持6-7个到其它节点的连接,假设你收到了一个交易,你把它转发给下一个节点,你也只能跟6-7个其它节点进行所谓广播。本质上这是交易的传递,它并非一个广播,但现在很多人把它错误理解为广播。

实际不存在一个方法,你只需网络大吼一声,就能够保证它传达至网络上连入的所有其它节点,这件事情是非常难达成的。所以,我们在做开发的时候,需要提醒自己不能依靠P2P网络、广播的方式来传递交易。这种方式,把实际成本转嫁到了接收方手里,对接收方来说,首先需要过滤掉当前网络上的每一条信息,然后找出跟自己相关的那条信息,才能最终确认自己收到的钱。
打一个比方,就好像我要转帐给栗子小姐,然后我在我的支票上面写上了栗子小姐收,然后把它往地上一丢,跟栗子小姐说我钱转给你了,已经丢出去了,什么时候收到,看有谁捡到这个支票以后能传到你手里。


本质上我们使用比特币是因为它能够更节约成本,为什么要通过如此低效率的方式来完成交易传递呢,我直接告诉她,我写完支票直接塞给她就好了,所以这就是大家在了解比特币世界里面的另外一个重要的误区——交易其实是点对点的。
意味着我要把我发给对方的交易,签完名直接发到对方手里,然后只有接受方才在意自己的钱是不是入账了,他会很着急的把这个交易塞给每一个他能接触到的矿工,让这些矿工帮他检测网络上有没有存在双花,并且把这个交易写入这个矿工的账本里,这才是真正的比特币交易的过程。
如果每个交易都还是依赖于P2P网络广播,然后大家再从另外一个接口,用另外一套程序去监听P2P消息的传递,最后才把交易给收下来的话,整个流程效率是极低的,这种做法在我们将来实现GB级别甚至TB级别区块的时候,难度和成本非常之高。
所以,从现在开始,所有的开发者可以尝试完全摒弃掉广播交易的这个做法,以后没有广播的概念。你要把交易发给谁,你就直接把交易签了字,发给对方,由收款方将这个交易进行验证和入账。只有这样,才能够实现比特币的扩容,才能够帮助我们矿工更快的达到TB级别的区块,否则所有的基础设施都会坏掉,当然坏掉的时候不要来找我,这不是我搞坏的。


目前在大家使用这个钱包的时候,包括我们自己的打点钱包,都存在一个问题:当一个用户持续不断的高频的使用,说明有着成千上万个使用过的比特币地址的时候,它就带来的一个巨大的性能问题,就是我们还要监听网络,来保证这么多个收款地址,每一个收到的钱能够安全无误的给用户记上账,整件事有些奇怪。因为我还需要去监听,看看谁在支票背后写上了收款人,然后丢在地上,我想办法把它捡起来。它极大的提升了比特币网络的交易成本,接下来可以想见目前生态里面的很多钱包都会逐渐的摒弃掉这种收款的模式,以后所有的交易都是点对点的,我们也将提供一系列的基础设施,包括PKI、CA,来协助我们的用户完成点对点的、直接的交易,你需要把你的交易直塞给对方。