
读过《三体》的朋友对“黑暗森林法则”肯定耳熟能详了,它是说行进在黑暗森林中的猎人发现周围动静时会选择直接向其开枪,而不会先确认其身份和意图。比特币网络中也存在类似的“黑暗森林”,网络中的节点不会主动向外声明我自己的实际位置,导致各方互不“可见”。(咳咳,搞技术的朋友们不要着急,请听我后面的解释)
关于比特币,生活中大家了解到它无法追踪到转账方和收款方,从而可以避免资金往来被追踪,是“洗钱”和“暗网”交易的“必备良药”。如果把比特币网络中的各方类比为“猎人”,那么“猎人”之间是互相不知道的,或者说“看不见的”,从这点上说,比特币网络就是一个“黑暗森林”。对于技术上了解一点点的朋友,可能会有疑问,不是说比特币网络是一个P2P网络吗?为什么说网络中各方不知道呢?不知道的话他们是如何组成P2P网络的呢?对于再再深入了解的朋友,可能有更犀利的问题,不是说比特币网络或者其衍生的区块链是一个公开的分布式账本吗?既然是公开的、分布式的,那为什么说各方不可见呢?对于再再再深入了解的朋友可能会问,比特币网络不是靠PoW来解决共识的吗?既然要网络达成共识,那怎么可能各方是不可见的? 这么多问题,Oceanken已经汗流浃背了。。。
洗完脸,擦干汗水,Oceanken还得回答这些问题。为了后面解释方便,让我先对比特币网络或者说区块链作一个浅显直观的描述。
我先举个例子,大家知道民国以前,中国人结婚是没有结婚证的,但丝毫不影响大家认可双方的夫妻关系。古代结婚时,讲究“八台大轿”、“明媒正娶”,还要大宴乡客,这么一来,相当于昭告亲戚朋友、乡里乡亲,双方结为夫妻这一事实。同时,乡亲在聊天时还会将这一信息转告给邻村的大姑娘小媳妇,让周围村镇也了解到了双方已经成亲的实事。从头到尾,没有官方介入,当然也没有颁发结婚证之说。在日常生活中,大家认为他们的夫妻关系是不证自明的。知道双方结婚的人越多,那么当发生纠纷时能够证明他们夫妻关系的人就越多。假设有一个外乡人想证明他们是否是夫妻,他只需要问乡里人就可以了。从概率上讲,如果乡亲中有人想隐瞒或者故意否定他们的夫妻关系,那只有当一半以上乡亲都否认时,外乡人才有可能选择相信他们不是夫妻,否则可以认定他们的夫妻关系。我们再来看看现代结婚的方式,现在双方要成为合法夫妻,可以不必让外人知道,但必须到民政局交钱领结婚证。日后要是发生纠纷需要证明双方的夫妻关系,其他人都不知道,没法提供人证,但只要掏出带钢印的结婚证,那大家就相信了,因为有国家民政部给双方作证。比特币网络的工作模式就类似于中国古代人结婚,而通过银行转账就类似于现代人结婚。
转账记录相当于是上述例子中的结婚,在比特币网络中,是通过向所有网络节点传播这一转账记录,让所有人都知道这一转账动作来保证这一记录的真实和不可篡改的;而在现代银行体系中,是通过银行的转账凭证或者银行自己的电子账本来保证其真实有效的。也就是说,在比特币网络中,其中一个节点上发起转账后,将有一条转账记录被传播到整个网络的所有节点,其他节点就像乡亲记住结婚实事一样,把这条记录存在自己的数据库中。可以看出,网络中的每一个节点(咳咳,技术君不要着急,这里为了方便描述,作简化)都存着自己或者其他节点的转账记录。类似地,通过让所有人见证的方式来保证这条转账记录是真实的。看到这里,喜欢思考的朋友可能就会想了,这条记录是什么样子的,是不是也有汇款方、收款方等信息?这条记录怎么传递给所有节点,有的节点在那么老远的位置?还有,怎么实现钱(比特币)的划账?最最关键是的,凭什么让大家收到这条转账记录时就相信,我又没看到你转账?最最最关键的是,大家怎么会同时相信这条转账记录呢,万一有人就是故意不相信呢?
简单地讲,转账记录描述的就是从比特币地址A向比特币地址B转多少比特币(技术君稍安勿躁,一切为了简单易懂)。但是,比特币网络中的转账记录的汇款方和收款方并不直接记录为各自的比特币地址,而是与汇款方钱包匹配的UTXO(简单地讲,就是一张只能由本人签名使用的支票)和能与收款方钱包匹配的UTXO,这里不好理解,但不深入解释,可以简单理解为各自的钱包地址。节点加入比特币网络时,会向一些固定节点(种子节点)询问它们知道的其他节点的IP地址,得到这些IP列表后,向列表中的IP发起连接,并向他们告知自己的和自己已知的其他节点的IP地址。收到新的IP地址的节点,将新的IP地址存到自己的IP地址库,然后再将之广播到与之连接的其他节点。经过一段时间的传播后,全网的其他节点都可能存了新节点的IP地址,新节点也收到了其他节点的IP地址,并与他们中的一些节点建立了连接,最终全网实现一个非FushMesh的P2P连接,使全网可达(熟悉路由协议的朋友,可以把比特币中的Peer节点类比为RIP中邻居节点)。那么,既然转账记录中只有钱包地址信息,而网络连接是通过IP地址建立的,如何才能把比特币转到对应的IP地址呢?这个问题有点混淆视听。我们说了,比特币节点是要把转账记录向网络中广播,并没有说把比特币记录发送到某个具体的节点上。这里,与我们生活中理解的通过银行转账到某人的账户有区别。区别在于,你的转账行为只是一个记账的过程,而不是真正的账户数字划拨。也就是说,转账行为只是在比特币网络中的账本上记了一笔而已,你看到的钱包中的余额是对与你相关的转账记录统计计算后的结果显示(呃,银行的朋友不要嫌弃我啰嗦)。好了,我们有了转账记录,网络也是全网可达,那么转账记录就通过层层转发,使得网络中所有节点都收到了这条记录并存储下来。喜欢问问题的朋友又要举手了:这些记录到底是怎么存的,是不是一块一块的,因为你们都叫它区块链么?呃,确实是一块一块的,而且还是一串起来的一块块。具体的格式是与几个核心问题相关的,但过于技术化,这里不深入介绍。简单地讲,节点收到转账记录后,会作一系列验证(略,不深入),确保节点可以相信这个记录。其中,有些特殊节点会把一系列交易记录包成一个块,然后玩命地算一个数字出来让大家都相信这个块中的所有记录都是可信的(你是在说挖矿吗?),算出来后,将这个数字填在这个块中,然后再向全网广播,其他节点收到这个块后,通过验证这个数字大家可以一致选择相信或者不相信这个块。如果选择相信,则把它接存到本地区块链中。估计又有人举手了: 要是同时收到多个块,咋办?等等,说得太细,有人会不耐烦看了。但这涉及到共识的一部分,Oceanken还是简要说一下,如果同时收到多个块,那在节点上的区块链会暂时分叉,等一段时间后,每个分支上再“接”上了其他区块,会形成高度不同的区块分支,而节点会选择高度最大的那个分支作为主链,其他分支则被无情砍掉。所有节点都通过选择最长分支为主链,来保证各节点上主链接一致。我们继续,区块在经过一段时间转发传播后,网络中所有节点都收到了包含交易记录的区块。通过这个方式,比特币网络解决了节点相信交易记录和所有节点以概率达成共识的问题。熟悉路由协议的朋友(强烈建议搞网络的朋友来看看啊),可以把所有交易记录类比为OSPF中的链路状态,区块链类比LSDB(链路状态数据库)。OSPF通过本地的LSDB算出全网拓扑,并进一步独立算出路由。比特币网络也是通过节点独立地算出钱包余额和实现传统意义上的转账。
也就是说,比特币钱包节点通过查询本地的交易记录,当发现有些交易(UTXO)的收款信息与当前钱包匹配时,就可以认为当前钱包余额增加了相应数量。当下次通过该钱包支付时,钱包会从交易记录中找出所有与当前钱包匹配的记录,计算出当前钱包余额,看是否能满足支付要求,如果能满足,则创建一个新的交易记录,收款方指定为对方的比特币地址,而支付方为与支付方钱包匹配的UTXO。这里涉及到密钥体系和比特币脚本语言,为了便于大家阅读,我尽量避免技术描述或者简化其中过程。前面我们说过,UTXO可以简单地理解为支票。所以一个交易记录,简单理解为支付方用收到的未使用的支票来授权给收款方,未来要使用这张支票时需要收款方的签名。
好了,通过上述的介绍,大家可以基本了解到比特币网络的一些特点。喜欢问问题的朋友有没有发现一个问题呢?就是在支付过程中,交易双方只能间接地知道对方的比特币地址信息,而比特币地址信息与IP地址没有任何绑定关系,也就是说,你可以在全球任何一个IP上进行交易,而外界没法确切追踪到这个比特币地址所对应的位置。而且,比特币地址可以由相关工具任意生成,它是一对密匙对中的公匙经Hash加密、base58Check编码后的形式,其中私匙可以保存在钱包中。一个钱包可以包含多个私匙,所以你可以向外公布多个比特币地址,但最终可以用一个钱包收款。就是说比特币地址与个人信息没有丝毫联系。
在比特币网络中,各方互相不知道对方的位置与个人信息,那么是不是可以说这个网络就是一个“黑暗森林”,其中的每一个节点都是“猎人”,为了防止被欺骗和攻击,将自己隐藏起来,不向外界透露一点点信息,哪怕是自己的位置。。。
网友评论