讀過《三體》的朋友對“黑暗森林法則”肯定耳熟能詳了,它是說行進在黑暗森林中的獵人發(fā)現(xiàn)周圍動靜時會選擇直接向其開槍爵卒,而不會先確認其身份和意圖。比特幣網(wǎng)絡中也存在類似的“黑暗森林”蓝撇,網(wǎng)絡中的節(jié)點不會主動向外聲明我自己的實際位置崇决,導致各方互不“可見”。(咳咳颤枪,搞技術的朋友們不要著急汗捡,請聽我后面的解釋)
關于比特幣,生活中大家了解到它無法追蹤到轉(zhuǎn)賬方和收款方畏纲,從而可以避免資金往來被追蹤扇住,是“洗錢”和“暗網(wǎng)”交易的“必備良藥”。如果把比特幣網(wǎng)絡中的各方類比為“獵人”盗胀,那么“獵人”之間是互相不知道的艘蹋,或者說“看不見的”,從這點上說读整,比特幣網(wǎng)絡就是一個“黑暗森林”簿训。對于技術上了解一點點的朋友,可能會有疑問米间,不是說比特幣網(wǎng)絡是一個P2P網(wǎng)絡嗎强品?為什么說網(wǎng)絡中各方不知道呢?不知道的話他們是如何組成P2P網(wǎng)絡的呢屈糊?對于再再深入了解的朋友的榛,可能有更犀利的問題,不是說比特幣網(wǎng)絡或者其衍生的區(qū)塊鏈是一個公開的分布式賬本嗎逻锐?既然是公開的夫晌、分布式的雕薪,那為什么說各方不可見呢?對于再再再深入了解的朋友可能會問晓淀,比特幣網(wǎng)絡不是靠PoW來解決共識的嗎所袁?既然要網(wǎng)絡達成共識,那怎么可能各方是不可見的凶掰? 這么多問題燥爷,Oceanken已經(jīng)汗流浹背了。懦窘。前翎。
洗完臉,擦干汗水畅涂,Oceanken還得回答這些問題港华。為了后面解釋方便,讓我先對比特幣網(wǎng)絡或者說區(qū)塊鏈作一個淺顯直觀的描述午衰。
我先舉個例子立宜,大家知道民國以前,中國人結(jié)婚是沒有結(jié)婚證的臊岸,但絲毫不影響大家認可雙方的夫妻關系赘理。古代結(jié)婚時,講究“八臺大轎”扇单、“明媒正娶”,還要大宴鄉(xiāng)客奠旺,這么一來蜘澜,相當于昭告親戚朋友、鄉(xiāng)里鄉(xiāng)親响疚,雙方結(jié)為夫妻這一事實鄙信。同時,鄉(xiāng)親在聊天時還會將這一信息轉(zhuǎn)告給鄰村的大姑娘小媳婦忿晕,讓周圍村鎮(zhèn)也了解到了雙方已經(jīng)成親的實事装诡。從頭到尾,沒有官方介入践盼,當然也沒有頒發(fā)結(jié)婚證之說鸦采。在日常生活中,大家認為他們的夫妻關系是不證自明的咕幻。知道雙方結(jié)婚的人越多渔伯,那么當發(fā)生糾紛時能夠證明他們夫妻關系的人就越多。假設有一個外鄉(xiāng)人想證明他們是否是夫妻肄程,他只需要問鄉(xiāng)里人就可以了锣吼。從概率上講选浑,如果鄉(xiāng)親中有人想隱瞞或者故意否定他們的夫妻關系,那只有當一半以上鄉(xiāng)親都否認時玄叠,外鄉(xiāng)人才有可能選擇相信他們不是夫妻古徒,否則可以認定他們的夫妻關系。我們再來看看現(xiàn)代結(jié)婚的方式读恃,現(xiàn)在雙方要成為合法夫妻隧膘,可以不必讓外人知道,但必須到民政局交錢領結(jié)婚證狐粱。日后要是發(fā)生糾紛需要證明雙方的夫妻關系舀寓,其他人都不知道,沒法提供人證肌蜻,但只要掏出帶鋼印的結(jié)婚證互墓,那大家就相信了,因為有國家民政部給雙方作證蒋搜。比特幣網(wǎng)絡的工作模式就類似于中國古代人結(jié)婚篡撵,而通過銀行轉(zhuǎn)賬就類似于現(xiàn)代人結(jié)婚。
轉(zhuǎn)賬記錄相當于是上述例子中的結(jié)婚豆挽,在比特幣網(wǎng)絡中育谬,是通過向所有網(wǎng)絡節(jié)點傳播這一轉(zhuǎn)賬記錄,讓所有人都知道這一轉(zhuǎn)賬動作來保證這一記錄的真實和不可篡改的帮哈;而在現(xiàn)代銀行體系中膛檀,是通過銀行的轉(zhuǎn)賬憑證或者銀行自己的電子賬本來保證其真實有效的。也就是說娘侍,在比特幣網(wǎng)絡中咖刃,其中一個節(jié)點上發(fā)起轉(zhuǎn)賬后,將有一條轉(zhuǎn)賬記錄被傳播到整個網(wǎng)絡的所有節(jié)點憾筏,其他節(jié)點就像鄉(xiāng)親記住結(jié)婚實事一樣嚎杨,把這條記錄存在自己的數(shù)據(jù)庫中⊙跹可以看出枫浙,網(wǎng)絡中的每一個節(jié)點(咳咳,技術君不要著急古拴,這里為了方便描述拧揽,作簡化)都存著自己或者其他節(jié)點的轉(zhuǎn)賬記錄憨募。類似地叛溢,通過讓所有人見證的方式來保證這條轉(zhuǎn)賬記錄是真實的罐柳。看到這里满力,喜歡思考的朋友可能就會想了焕参,這條記錄是什么樣子的轻纪,是不是也有匯款方、收款方等信息叠纷?這條記錄怎么傳遞給所有節(jié)點刻帚,有的節(jié)點在那么老遠的位置?還有涩嚣,怎么實現(xiàn)錢(比特幣)的劃賬崇众?最最關鍵是的,憑什么讓大家收到這條轉(zhuǎn)賬記錄時就相信航厚,我又沒看到你轉(zhuǎn)賬顷歌?最最最關鍵的是,大家怎么會同時相信這條轉(zhuǎn)賬記錄呢幔睬,萬一有人就是故意不相信呢眯漩?
簡單地講,轉(zhuǎn)賬記錄描述的就是從比特幣地址A向比特幣地址B轉(zhuǎn)多少比特幣(技術君稍安勿躁麻顶,一切為了簡單易懂)赦抖。但是,比特幣網(wǎng)絡中的轉(zhuǎn)賬記錄的匯款方和收款方并不直接記錄為各自的比特幣地址辅肾,而是與匯款方錢包匹配的UTXO(簡單地講队萤,就是一張只能由本人簽名使用的支票)和能與收款方錢包匹配的UTXO,這里不好理解矫钓,但不深入解釋要尔,可以簡單理解為各自的錢包地址。節(jié)點加入比特幣網(wǎng)絡時新娜,會向一些固定節(jié)點(種子節(jié)點)詢問它們知道的其他節(jié)點的IP地址盈电,得到這些IP列表后,向列表中的IP發(fā)起連接杯活,并向他們告知自己的和自己已知的其他節(jié)點的IP地址。收到新的IP地址的節(jié)點熬词,將新的IP地址存到自己的IP地址庫旁钧,然后再將之廣播到與之連接的其他節(jié)點。經(jīng)過一段時間的傳播后互拾,全網(wǎng)的其他節(jié)點都可能存了新節(jié)點的IP地址歪今,新節(jié)點也收到了其他節(jié)點的IP地址,并與他們中的一些節(jié)點建立了連接颜矿,最終全網(wǎng)實現(xiàn)一個非FushMesh的P2P連接寄猩,使全網(wǎng)可達(熟悉路由協(xié)議的朋友,可以把比特幣中的Peer節(jié)點類比為RIP中鄰居節(jié)點)骑疆。那么田篇,既然轉(zhuǎn)賬記錄中只有錢包地址信息替废,而網(wǎng)絡連接是通過IP地址建立的,如何才能把比特幣轉(zhuǎn)到對應的IP地址呢泊柬?這個問題有點混淆視聽椎镣。我們說了兽赁,比特幣節(jié)點是要把轉(zhuǎn)賬記錄向網(wǎng)絡中廣播状答,并沒有說把比特幣記錄發(fā)送到某個具體的節(jié)點上。這里刀崖,與我們生活中理解的通過銀行轉(zhuǎn)賬到某人的賬戶有區(qū)別惊科。區(qū)別在于,你的轉(zhuǎn)賬行為只是一個記賬的過程亮钦,而不是真正的賬戶數(shù)字劃撥馆截。也就是說,轉(zhuǎn)賬行為只是在比特幣網(wǎng)絡中的賬本上記了一筆而已或悲,你看到的錢包中的余額是對與你相關的轉(zhuǎn)賬記錄統(tǒng)計計算后的結(jié)果顯示(呃孙咪,銀行的朋友不要嫌棄我啰嗦)。好了巡语,我們有了轉(zhuǎn)賬記錄翎蹈,網(wǎng)絡也是全網(wǎng)可達,那么轉(zhuǎn)賬記錄就通過層層轉(zhuǎn)發(fā)男公,使得網(wǎng)絡中所有節(jié)點都收到了這條記錄并存儲下來荤堪。喜歡問問題的朋友又要舉手了:這些記錄到底是怎么存的,是不是一塊一塊的枢赔,因為你們都叫它區(qū)塊鏈么澄阳?呃,確實是一塊一塊的踏拜,而且還是一串起來的一塊塊碎赢。具體的格式是與幾個核心問題相關的,但過于技術化速梗,這里不深入介紹肮塞。簡單地講,節(jié)點收到轉(zhuǎn)賬記錄后姻锁,會作一系列驗證(略枕赵,不深入),確保節(jié)點可以相信這個記錄位隶。其中拷窜,有些特殊節(jié)點會把一系列交易記錄包成一個塊,然后玩命地算一個數(shù)字出來讓大家都相信這個塊中的所有記錄都是可信的(你是在說挖礦嗎?)篮昧,算出來后赋荆,將這個數(shù)字填在這個塊中,然后再向全網(wǎng)廣播恋谭,其他節(jié)點收到這個塊后糠睡,通過驗證這個數(shù)字大家可以一致選擇相信或者不相信這個塊。如果選擇相信疚颊,則把它接存到本地區(qū)塊鏈中狈孔。估計又有人舉手了: 要是同時收到多個塊,咋辦材义?等等均抽,說得太細,有人會不耐煩看了其掂。但這涉及到共識的一部分油挥,Oceanken還是簡要說一下,如果同時收到多個塊款熬,那在節(jié)點上的區(qū)塊鏈會暫時分叉深寥,等一段時間后,每個分支上再“接”上了其他區(qū)塊贤牛,會形成高度不同的區(qū)塊分支惋鹅,而節(jié)點會選擇高度最大的那個分支作為主鏈,其他分支則被無情砍掉殉簸。所有節(jié)點都通過選擇最長分支為主鏈闰集,來保證各節(jié)點上主鏈接一致。我們繼續(xù)般卑,區(qū)塊在經(jīng)過一段時間轉(zhuǎn)發(fā)傳播后武鲁,網(wǎng)絡中所有節(jié)點都收到了包含交易記錄的區(qū)塊。通過這個方式蝠检,比特幣網(wǎng)絡解決了節(jié)點相信交易記錄和所有節(jié)點以概率達成共識的問題沐鼠。熟悉路由協(xié)議的朋友(強烈建議搞網(wǎng)絡的朋友來看看啊),可以把所有交易記錄類比為OSPF中的鏈路狀態(tài)叹谁,區(qū)塊鏈類比LSDB(鏈路狀態(tài)數(shù)據(jù)庫)迟杂。OSPF通過本地的LSDB算出全網(wǎng)拓撲,并進一步獨立算出路由本慕。比特幣網(wǎng)絡也是通過節(jié)點獨立地算出錢包余額和實現(xiàn)傳統(tǒng)意義上的轉(zhuǎn)賬。
也就是說侧漓,比特幣錢包節(jié)點通過查詢本地的交易記錄锅尘,當發(fā)現(xiàn)有些交易(UTXO)的收款信息與當前錢包匹配時,就可以認為當前錢包余額增加了相應數(shù)量。當下次通過該錢包支付時藤违,錢包會從交易記錄中找出所有與當前錢包匹配的記錄浪腐,計算出當前錢包余額,看是否能滿足支付要求顿乒,如果能滿足议街,則創(chuàng)建一個新的交易記錄,收款方指定為對方的比特幣地址璧榄,而支付方為與支付方錢包匹配的UTXO特漩。這里涉及到密鑰體系和比特幣腳本語言,為了便于大家閱讀骨杂,我盡量避免技術描述或者簡化其中過程涂身。前面我們說過,UTXO可以簡單地理解為支票搓蚪。所以一個交易記錄蛤售,簡單理解為支付方用收到的未使用的支票來授權給收款方,未來要使用這張支票時需要收款方的簽名妒潭。
好了悴能,通過上述的介紹,大家可以基本了解到比特幣網(wǎng)絡的一些特點雳灾。喜歡問問題的朋友有沒有發(fā)現(xiàn)一個問題呢漠酿?就是在支付過程中,交易雙方只能間接地知道對方的比特幣地址信息佑女,而比特幣地址信息與IP地址沒有任何綁定關系记靡,也就是說,你可以在全球任何一個IP上進行交易团驱,而外界沒法確切追蹤到這個比特幣地址所對應的位置摸吠。而且,比特幣地址可以由相關工具任意生成嚎花,它是一對密匙對中的公匙經(jīng)Hash加密寸痢、base58Check編碼后的形式,其中私匙可以保存在錢包中紊选。一個錢包可以包含多個私匙啼止,所以你可以向外公布多個比特幣地址,但最終可以用一個錢包收款兵罢。就是說比特幣地址與個人信息沒有絲毫聯(lián)系献烦。
在比特幣網(wǎng)絡中,各方互相不知道對方的位置與個人信息卖词,那么是不是可以說這個網(wǎng)絡就是一個“黑暗森林”巩那,其中的每一個節(jié)點都是“獵人”,為了防止被欺騙和攻擊,將自己隱藏起來即横,不向外界透露一點點信息噪生,哪怕是自己的位置。东囚。跺嗽。