作者:何巖询张,禁止轉(zhuǎn)載。
0.前言
在上一篇中浙炼,中本聰和Gilfoyle搞定了最簡單的點(diǎn)對點(diǎn)網(wǎng)絡(luò)份氧。但是無法正常運(yùn)行唯袄,因?yàn)橘~本還沒實(shí)現(xiàn)同步機(jī)制。為了解決賬本的同步蜗帜,需要先引出交易的同步越妈。
1.賬本不一致
咖啡館,中本聰對著老板Bob說:“老板钮糖,這幾天Bitcoin系統(tǒng)要升級梅掠,暫時無法用了”
Bob說:“我看到了,你們又是搬機(jī)器店归,又是寫代碼阎抒,這次升級動靜夠大的∠矗”
中本聰說:“是啊且叁,Bitcoin要發(fā)生質(zhì)變了,對了秩伞,你家要是有不用的機(jī)器也搬過來逞带,我們需要更多節(jié)點(diǎn)∩葱拢”
Bob說:“好啊展氓,我家還真有一臺,不過運(yùn)行Bitcoin我能得到什么好處呢脸爱?”
中本聰說:“好處......這個我得想想遇汞,暫時還沒有,純是友情支持簿废】杖耄”
Bob說:“好吧,看在你是我的老客戶族檬,我去給你搬過來歪赢。”
中本聰說:“太好了单料!你真是個慷慨的老板埋凯!”
中本聰對Gilfoyle說:“我們將要有第3個節(jié)點(diǎn)啦!現(xiàn)在看尼,我們來解決賬本的同步問題吧递鹉!”
我們假設(shè)一個交易場景:
1.Alice賬本中的余額是50盟步,并且記賬節(jié)點(diǎn)1和記賬節(jié)點(diǎn)2的賬本一致藏斩。
2.Alice的客戶端連接的是記賬節(jié)點(diǎn)1。
3.Carol的客戶端連接的是記賬節(jié)點(diǎn)2却盘。
4.Alice向節(jié)點(diǎn)1發(fā)送一個交易消息:Alice to Bob 50
5.Carol向節(jié)點(diǎn)2發(fā)送一個交易消息:Carol to Alice 30
6.這時候的Alice的正確余額本應(yīng)該是30狰域。但是由于賬本沒有同步媳拴,所以在節(jié)點(diǎn)1中Alice的余額是0,在節(jié)點(diǎn)2中Alice的余額是80兆览,都不正確屈溉。(見下圖)
面對這個場景,應(yīng)該如何解決賬本不一致的問題呢抬探?
中本聰解釋到:“解決這個場景還算簡單子巾。只需要節(jié)點(diǎn)互相將自己的賬本發(fā)送給對方節(jié)點(diǎn),收到對方的賬本后小压,找出自己賬本中缺少的交易記錄线梗,然后將此交易記錄補(bǔ)充到自己的賬本,這樣倆個節(jié)點(diǎn)的賬本就又一致了怠益∫巧Γ”
在上面這個場景中,
節(jié)點(diǎn)1補(bǔ)充進(jìn)自己賬本的交易記錄是:Carol to Alice 30蜻牢。
節(jié)點(diǎn)2補(bǔ)充進(jìn)自己賬本的交易記錄是:Alice to Bob 50烤咧。
這樣在倆個節(jié)點(diǎn)中的賬本又恢復(fù)一致,Alice的余額都顯示為30抢呆。(見下圖)
Gilfoyle感嘆到:“多虧了UTXO機(jī)制煮嫌,由于沒有賬戶模型,交易不會修改過去的記錄抱虐,只會在賬本中新增交易記錄立膛,所以,節(jié)點(diǎn)間賬本不一致也只會缺失彼此的交易記錄梯码,而不會存在數(shù)據(jù)沖突”
中本聰笑到:“別高興的太早宝泵,我感覺不會這么簡單⌒ⅲ”
中本聰?shù)闹庇X是準(zhǔn)確的儿奶,這個同步機(jī)制的確存在漏洞,那就是所謂的雙花鳄抒,這還是等后面問題發(fā)生了闯捎,我們再去討論,現(xiàn)在我們看看現(xiàn)在的賬本同步方案许溅,有沒有什么優(yōu)化空間瓤鼻。
2.交易的同步
中本聰說:“每次節(jié)點(diǎn)接受到新的交易,都發(fā)送全量賬本給對方節(jié)點(diǎn)贤重,這樣做太浪費(fèi)網(wǎng)絡(luò)資源了茬祷,其實(shí)只需要將新增的交易記錄發(fā)送給對方節(jié)點(diǎn)就夠了。對方節(jié)點(diǎn)只需要將這條交易記錄補(bǔ)充到自己的賬本即可并蝗〖婪福”
Gilfoyle說:“那就是不再同步賬本秸妥,而只同步增量交易記錄∥执郑”
中本聰說:“如果只考慮新增交易記錄的同步粥惧,那么具體步驟應(yīng)該是這樣的∽钪眩”
中本聰解釋著詳細(xì)的增量交易同步機(jī)制:
1.節(jié)點(diǎn)1接受到用戶通過輕節(jié)點(diǎn)發(fā)來的最新交易:Alice to Bob 50
2.節(jié)點(diǎn)1將這條交易記錄寫入賬本突雪,同時將交易記錄通過自己的Socket Server廣播出去。(這里之所以將Socket Server發(fā)送消息說成是廣播涡贱,是因?yàn)橐粋€Socket Server會連接多個Socket Client挂签,這個傳播路徑很像廣播。而反過來看盼产,Socket Client主動連接Socket Server的行為則是:訂閱饵婆,就好像用戶通過收音機(jī)訂閱了一個廣播頻道一樣。所以戏售,每個記賬節(jié)點(diǎn)即能廣播又能訂閱侨核。)
3.節(jié)點(diǎn)2由于訂閱了節(jié)點(diǎn)1,所以可以收到這條新增交易消息灌灾。
4.節(jié)點(diǎn)2不可以直接寫入自己的賬本搓译,因?yàn)樽约旱馁~本中沒準(zhǔn)已經(jīng)存在相同的交易記錄。所以要驗(yàn)證這條交易記錄是否已經(jīng)在賬本中存在锋喜。
Gilfoyle不解的問到:“為什么會存在相同交易記錄呢些己?”
中本聰解釋到:“可能是Alice通過客戶端同時在向節(jié)點(diǎn)1和節(jié)點(diǎn)2發(fā)起相同的交易請求。
也可能節(jié)點(diǎn)1發(fā)送同步消息的時候發(fā)重復(fù)了嘿般,這樣第一遍節(jié)點(diǎn)2就已經(jīng)將其寫入賬本了段标。”
5.如果本交易記錄已經(jīng)存在于節(jié)點(diǎn)2的賬本中炉奴,則什么都不做逼庞,結(jié)束本次同步行為。
6.如果本交易記錄不存在于節(jié)點(diǎn)2的賬本中瞻赶,則將其寫入賬本赛糟,同時將這條交易記錄廣播出去。提供給其它訂閱自己的節(jié)點(diǎn)砸逊,讓其它節(jié)點(diǎn)進(jìn)行增量交易的同步璧南。
Gilfoyle問:“為什么節(jié)點(diǎn)2還要再次廣播這條同步記錄,這條消息源頭就是節(jié)點(diǎn)1給節(jié)點(diǎn)2的师逸,節(jié)點(diǎn)2如果再廣播出去司倚,不就又到了節(jié)點(diǎn)1這里,這樣不就形成消息的無限循環(huán)了嗎?”
中本聰解釋到:“不會循環(huán)的对湃,因?yàn)槟憧吹?條崖叫,如果發(fā)現(xiàn)交易記錄之前存在遗淳,就會終止拍柒。”
中本聰繼續(xù)解釋到:“而節(jié)點(diǎn)2為什么要再次廣播呢屈暗?這是因?yàn)椴鹧叮绻?jié)點(diǎn)3加入到了記賬網(wǎng)絡(luò)中,而節(jié)點(diǎn)3只訂閱了節(jié)點(diǎn)2养叛,沒有訂閱節(jié)點(diǎn)1种呐,那么就需要節(jié)點(diǎn)2作為一個傳話筒,將自己訂閱節(jié)點(diǎn)1的同步消息傳遞給節(jié)點(diǎn)3弃甥∷遥”(見下圖)
Gilfoyle說:“明白了,這樣就嚴(yán)謹(jǐn)了淆攻,在點(diǎn)對點(diǎn)的網(wǎng)絡(luò)中阔墩,節(jié)點(diǎn)的角色即是消費(fèi)者,又是服務(wù)者瓶珊。真是人人為我啸箫,我為人人啊伞芹!”
中本聰說:“對忘苛,這樣任何一個節(jié)點(diǎn),廣播任何一條消息唱较,都可以一瞬之間傳遍整個網(wǎng)絡(luò)扎唾,一石激起千層浪∧匣海”
Gilfoyle說:“這讓我想到稽屏,上周在我家后院看到了一個飛行中的蜂群,蜂群中沒有任何一個蜜蜂發(fā)出中心化的指令西乖,但是任何蜜蜂根據(jù)自己前方的外界環(huán)境刺激狐榔,發(fā)出的信號可以瞬間傳遍整個蜂群中的每個個體,使得蜂群可以像一只靈活的動物一樣精準(zhǔn)的躲避樹木等障礙物获雕。這個飛行的怪物看上去智商還很高呢薄腻!這就是點(diǎn)對點(diǎn)網(wǎng)絡(luò)的精髓之處,網(wǎng)絡(luò)中的每個個體只需要遵守簡單的底層規(guī)則届案,大家連接在一起就可以通過平等的協(xié)作涌現(xiàn)極其復(fù)雜的行為庵楷!”
中本聰說:“簡單規(guī)則衍生復(fù)雜行為,群系統(tǒng)很神奇吧!”
3.交易內(nèi)存池
中本聰說:“既然賬本不用頻繁同步了尽纽,我們可以再優(yōu)化一下咐蚯,在記賬節(jié)點(diǎn)中創(chuàng)建一個交易的內(nèi)存池。將每次收到的新增交易第一時間放入交易內(nèi)存池中弄贿,而不是寫入賬本春锋。等內(nèi)存池中的交易積累了一段時間(例如每隔10分鐘),再一次性的寫入到賬本中差凹∑诒迹”
Gilfoyle說:“這么做的目的是什么?減少硬盤的頻繁寫入嗎危尿?”
中本聰說:“對呐萌,減少頻繁寫硬盤,因?yàn)橘~本是文件谊娇,寫文件就是在寫硬盤肺孤。內(nèi)存訪問速度就要比硬盤訪問速度快上10萬倍以上〖没叮”
這就像什么呢赠堵?內(nèi)存就好似人的短期記憶,比如我們在馬路上搭訕了一個美女船逮,問人家要電話號顾腊,人家告訴你之后,你先記在腦子里挖胃,然后繼續(xù)和美女聊家常杂靶,這樣搭訕的節(jié)奏才flow。等美女走了酱鸭,你馬上要將剛才腦子里記住的電話號碼寫在小本子上吗垮,以免自己忘了。這就好像交易內(nèi)存池和賬本的關(guān)系凹髓。
記在腦子里的電話號烁登,方便快捷,不會打斷你的搭訕動作連續(xù)性蔚舀,但不穩(wěn)固饵沧,沒準(zhǔn)一個節(jié)點(diǎn)斷電重啟就丟了。而寫在小本子上就很麻煩笨重赌躺,但很穩(wěn)固狼牺,節(jié)點(diǎn)斷電也不會丟。
另外礼患,不光是用戶的新增交易是钥,節(jié)點(diǎn)間的交易同步也會先寫入到交易內(nèi)存池掠归。
這樣,就引出了“交易內(nèi)存池”這個概念悄泥。(見下圖)
4.后記
雖然加入了交易的同步機(jī)制虏冻,但是現(xiàn)在的同步機(jī)制還是有很多漏洞,需要賬本的同步來填補(bǔ)漏洞弹囚。
本篇重點(diǎn)討論了交易的同步厨相,并引出了點(diǎn)對點(diǎn)網(wǎng)絡(luò)的廣播機(jī)制和交易內(nèi)存池等概念,下一篇將要討論賬本的同步余寥。
BSV打賞地址:1BudFu186jzdP9CBJTTPGsdbSJinbzzCyB
相關(guān)文章:
重新創(chuàng)造比特幣1:從一個簡單的web交易系統(tǒng)開始
重新創(chuàng)造比特幣3:舍棄賬戶模型领铐,讓交易更自由
重新創(chuàng)造比特幣8:基于UTXO的系統(tǒng)重構(gòu)
重新創(chuàng)造比特幣11:群系統(tǒng)(上)
重新創(chuàng)造比特幣12:群系統(tǒng)(下)
重新創(chuàng)造比特幣13:P2P網(wǎng)絡(luò)
重新創(chuàng)造比特幣17:網(wǎng)絡(luò)的彈性
比特幣SV(Bitcoin satoshi vision,BSV)是目前唯一一個遵循中本聰原始白皮書悯森,遵循中本聰原始協(xié)議和設(shè)計的比特幣宋舷。BSV是唯一的公共區(qū)塊鏈,維持比特幣的原始愿景瓢姻,并將大規(guī)模擴(kuò)容成為企業(yè)級區(qū)塊鏈和世界新貨幣祝蝠。