原本,這篇文章的標(biāo)題是《區(qū)塊鏈所預(yù)示的未來(lái)业汰,需要什么樣的基礎(chǔ)設(shè)施伙窃?》,后來(lái)我反復(fù)想了好久蔬胯,突然有一個(gè)有趣的念頭緊緊的拽住了我对供,于是我完全沉迷其中無(wú)法自拔,只能放棄原來(lái)的寫(xiě)作內(nèi)容與提綱氛濒,而是努力試圖將自己的這個(gè)設(shè)想产场,闡述明白。
當(dāng)然舞竿,這還遠(yuǎn)遠(yuǎn)稱(chēng)不上一份白皮書(shū)!
一京景、區(qū)塊鏈的本質(zhì)是什么?
有人說(shuō)是:分布式數(shù)據(jù)庫(kù)骗奖;有人說(shuō)是:分布式賬本确徙;還有人會(huì)進(jìn)一步說(shuō)明:就是一種以分布式方式記錄賬本的數(shù)據(jù)庫(kù),但是执桌,這個(gè)數(shù)據(jù)庫(kù)只能添加鄙皇、讀取,不能修改仰挣,刪除伴逸。
在苦思冥想的過(guò)程中,我突然想到膘壶,什么“賬本”呀错蝴,這完全就是一套版本控制系統(tǒng)。
- 除了初始提交颓芭,每一個(gè)提交都會(huì)有父提交——全部的提交歷史顷锰,也構(gòu)成了一個(gè)鏈,每一個(gè)commit亡问,也可以說(shuō)是一個(gè)block
- 如果不經(jīng)過(guò)特殊操作官紫,所有的提交都不會(huì)消失,只會(huì)增加——區(qū)塊鏈在這方面的限制更加嚴(yán)格
所以:我們也許可以借助對(duì)版本管理系統(tǒng)的理解州藕,來(lái)理解區(qū)塊鏈万矾。
二、聯(lián)想:SVN與Git的區(qū)別
更遠(yuǎn)的版本管理系統(tǒng)慎框,咱們不去提他良狈,單說(shuō)SVN與Git的區(qū)別,SVN的版本號(hào)笨枯,是一個(gè)自增長(zhǎng)的數(shù)字薪丁,因此:只能有一條鏈:
Git的版本號(hào)遇西,是一串Hash值,不存在必須自增長(zhǎng)的限制严嗜,因此Git的版本樹(shù)形狀會(huì)非常多樣粱檀,通稱(chēng)DAG(有向無(wú)環(huán)圖)
如果每一個(gè)節(jié)點(diǎn),記錄世界上的一批交易的話(huà)漫玄,我們就會(huì)發(fā)現(xiàn)SVN與Git的兩種模式茄蚯,存在性能上的巨大差距。因?yàn)镾VN記錄的交易睦优,必須是串行的渗常,任憑世界上同時(shí)發(fā)生多少交易,都必須依次記錄汗盘!相比之下皱碘,Git的版本,就不必嚴(yán)格依序發(fā)生隐孽,最后的版本合并癌椿,也容易得多,這就是使得Git的并發(fā)性能菱阵,會(huì)好很多踢俄!
如果我沒(méi)有理解錯(cuò)誤的話(huà):IOTA的DAG Tangle,應(yīng)該受到Git的很多啟發(fā)晴及。
三褪贵、繼續(xù)完善我們的設(shè)想——基于Git的分布式記賬系統(tǒng)
1. 創(chuàng)造一個(gè)初始賬戶(hù)
- 建一個(gè)空的git倉(cāng)庫(kù)
- 創(chuàng)建一個(gè)root account文件,內(nèi)容是:
100000000
- 創(chuàng)建一個(gè)初始提交:
init root account, 100000000
2. 新增一個(gè)賬戶(hù)A抗俄,并且從root得到轉(zhuǎn)賬
- 新建一個(gè)文件A,內(nèi)容是:
+20 from root
- 修改root文件世舰,添加一行:
-20 to A
- 創(chuàng)建第二次提交:
root to A, 20
3. 如上所述动雹,再創(chuàng)建第二個(gè)賬戶(hù)B,也從root得到轉(zhuǎn)賬
- 新建一個(gè)文件B跟压,內(nèi)容是:
+20 from root
- 修改root文件胰蝠,添加一行:
-20 to B
- 創(chuàng)建第三次提交:
root to B, 20
4. 創(chuàng)建一個(gè)fork倉(cāng)庫(kù),包含原來(lái)的全部賬本
5. 原始倉(cāng)庫(kù)繼續(xù)發(fā)生交易
- 新建一個(gè)文件C震蒋,內(nèi)容是:
+20 from root
- 修改root文件茸塞,添加一行:
-20 to C
- 創(chuàng)建第四次提交:
root to C, 20
6. 在fork倉(cāng)庫(kù)中,發(fā)生另一次交易
- 修改A文件查剖,內(nèi)容是:
-10 to B
- 修改B文件钾虐,內(nèi)容是:
+10 to A
- 創(chuàng)建一次新的提交:
A to B, 10
7. 原始倉(cāng)庫(kù)合入fork倉(cāng)庫(kù)的變更
- fork倉(cāng)庫(kù)發(fā)起一次pull request
- 原始倉(cāng)庫(kù)accept pull request
- 由于兩邊的文件變更不存在沖突,所以合入直接完成笋庄,A向B轉(zhuǎn)賬的交易效扫,也被計(jì)入主線
- fork倉(cāng)庫(kù)同步原始倉(cāng)庫(kù)的版本(git pull)倔监,fork倉(cāng)庫(kù)的賬本同步至最新版本
四、基于Git的分布式記賬系統(tǒng)——要點(diǎn)
1. 每一臺(tái)Git Server菌仁,就是一個(gè)賬本庫(kù)浩习。因此,一筆交易的雙方济丘,可以選擇任意一臺(tái)服務(wù)器谱秽,記錄他們的交易。前提是:
- 這臺(tái)服務(wù)器上的賬本摹迷,是最新的(至少保存了交易雙方賬本的最新版本)
- 交易雙方都信任這臺(tái)服務(wù)器的記錄是準(zhǔn)確疟赊,且及時(shí)的
- 理論上,這臺(tái)服務(wù)器提供了轉(zhuǎn)賬與記賬的服務(wù)泪掀,可以收取服務(wù)費(fèi)
2. 交易雙方經(jīng)過(guò)協(xié)商听绳,可以選擇任何一臺(tái)服務(wù)器進(jìn)行交易,并且支付費(fèi)用异赫。因此:賬本服務(wù)器椅挣,存在競(jìng)爭(zhēng)關(guān)系。理論上塔拳,以下優(yōu)點(diǎn)將幫助交易服務(wù)器勝出:
- 交易賬本數(shù)據(jù)最新最全(這是核心競(jìng)爭(zhēng)力鼠证,否則交易速度將會(huì)變慢)
- 交易記錄速度最快
- 交易費(fèi)用最低(這需要一個(gè)平衡)
3. 數(shù)據(jù)同步成功率與服務(wù)可信度
- 為了確保自己的服務(wù)器上,擁有最新最全的數(shù)據(jù)靠抑。各家服務(wù)器都會(huì)有動(dòng)力量九,頻繁的拉取其他服務(wù)器的賬本數(shù)據(jù)(git pull)
- 可能存在這樣的現(xiàn)象:A拉取B服務(wù)器的數(shù)據(jù),但是出現(xiàn)了版本沖突颂碧,因?yàn)橛匈~戶(hù)x荠列,同時(shí)在A、B記錄了兩筆不同的交易载城。理論上肌似,需要B先拉取A服務(wù)器的數(shù)據(jù),然后A才能成功拉取B服務(wù)器的數(shù)據(jù)诉瓦。類(lèi)似于我們git push之前川队,需要先git pull
- 當(dāng)A服務(wù)器拉取失敗時(shí),他有義務(wù)通知B服務(wù)器:“你的版本太老”睬澡。于是B服務(wù)器會(huì)拉取A服務(wù)器的數(shù)據(jù)固额。當(dāng)A服務(wù)器再次重試時(shí),拉取成功了煞聪。
- 于是斗躏,長(zhǎng)期來(lái)看,A服務(wù)器拉取B服務(wù)器的數(shù)據(jù)昔脯,就會(huì)有一個(gè)成功率的記錄瑟捣。我們也可以記錄馋艺,某臺(tái)服務(wù)器,針對(duì)其他所有服務(wù)器的拉取請(qǐng)求迈套,其成功率的數(shù)據(jù)捐祠。這樣的數(shù)據(jù),就代表其服務(wù)可信度桑李。
4. 可信度最高的服務(wù)器踱蛀,通常為了確保其數(shù)據(jù)的及時(shí)與準(zhǔn)確性,需要投入大量的成本贵白,他們的交易服務(wù)費(fèi)用率拒,也將會(huì)比較高(好的服務(wù),當(dāng)然應(yīng)該貴一些)
- 于是:我們得到了一個(gè)良性的禁荒,分布式多中心的猬膨,交易賬本系統(tǒng)!
五呛伴、三種交易類(lèi)型與應(yīng)對(duì)策略
1. 最簡(jiǎn)單的交易勃痴,就是發(fā)生在兩個(gè)賬戶(hù)之間的。參考復(fù)式記賬法热康,一筆交易我們至少需要同時(shí)修改兩個(gè)文件沛申,因此我們需要確保在那臺(tái)git server上,兩個(gè)賬戶(hù)文件都已經(jīng)是最新版本了
- 賬戶(hù)A說(shuō):我的賬戶(hù)地址是XXXX1姐军,我的最新版本是YYYY1铁材,你可以去以下服務(wù)器查證。
- 賬戶(hù)B說(shuō):我的賬戶(hù)地址是XXXX2奕锌,我的最新版本是YYYY2著觉,你可以去以下服務(wù)器查證。
- 兩個(gè)賬戶(hù)惊暴,都可以選擇更加保守的策略饼丘,在更多的服務(wù)器上,互相查證對(duì)方的賬戶(hù)版本缴守,是否為最新。并且最終商議出一個(gè)雙方共同認(rèn)可的交易服務(wù)器
- 假設(shè)找不到一臺(tái)服務(wù)器镇辉,同時(shí)保存了雙方賬戶(hù)的最新版本屡穗,那就只能等待某一臺(tái)服務(wù)器,最終同步到了最新的版本忽肛,然后再執(zhí)行交易
2. 對(duì)于頻繁收錢(qián)村砂,或者頻繁支出的賬戶(hù),如果每次都需要交易雙方協(xié)調(diào)版本屹逛,那交易成本就太高了
- 以頻繁收錢(qián)的賬戶(hù)為例础废,他可以對(duì)外公布一個(gè)自己的收款地址+服務(wù)器地址汛骂。所有的支付者,都到這個(gè)服務(wù)器上评腺,與他交易
- 付款者向指定服務(wù)器發(fā)出付款要求帘瞭,指定服務(wù)器首先同步付款者的賬戶(hù)到最新版。交易服務(wù)器完成交易蒿讥。
- 對(duì)于收款者而言蝶念,并發(fā)的支付請(qǐng)求,在交易服務(wù)器上被批量處理并記錄芋绸。不必嚴(yán)格遵守交易的先后次序媒殉,只要最終被全部記錄且數(shù)據(jù)一致即可
- 頻繁支出的賬戶(hù),也可以按類(lèi)似方式處理摔敛。
3. 從個(gè)人賬戶(hù)到銀行賬戶(hù)
- 如果是個(gè)人對(duì)個(gè)人的交易廷蓉,大家都是從我的錢(qián)包到你的錢(qián)包,這樣的交易可以和具體的交易服務(wù)器無(wú)關(guān)马昙,也可以說(shuō)每次交易都可以選擇任意的交易服務(wù)器桃犬。但是,如果是經(jīng)常存在賬戶(hù)進(jìn)出的情況给猾,那么選擇在某家“銀行”開(kāi)戶(hù)疫萤,就變成很自然的事情
- 過(guò)去是從個(gè)人錢(qián)包發(fā)起交易,每次選擇交易記賬的服務(wù)「疑欤現(xiàn)在變成直接委托某個(gè)交易服務(wù)器扯饶,完成進(jìn)出。那么池颈,不僅僅是完成數(shù)字貨幣進(jìn)出尾序,也完全可以將一部分?jǐn)?shù)字貨幣,保存在那個(gè)“銀行”里躯砰。這樣當(dāng)然會(huì)更加方便快捷每币。
- 后續(xù)的發(fā)展,我們可以想象:現(xiàn)在的銀行能夠?yàn)榭蛻?hù)提供哪些服務(wù)琢歇,今后的數(shù)字貨幣銀行兰怠,同樣也有機(jī)會(huì)提供出來(lái)。
六李茫、聯(lián)想與結(jié)語(yǔ)
本文未完善之處
- 我沒(méi)有深入去思考:如何達(dá)成信任這件事情揭保。或者說(shuō):我認(rèn)為通過(guò)算法保障信任魄宏,其實(shí)非常危險(xiǎn)秸侣。因?yàn)榻^大多數(shù)人,是無(wú)法真正理解算法,最后也只能是盲目信任味榛。所以椭坚,信任只能來(lái)自于歷史上是否清白,是否存在污點(diǎn)搏色?算法公開(kāi)是不夠的善茎,數(shù)據(jù)要公開(kāi),過(guò)程要公開(kāi)继榆,所有歷史數(shù)據(jù)巾表,都需要公開(kāi),這樣才能夠談得上信任略吨。換言之集币,信任不是0/1的選擇,信任是一個(gè)X%的事情翠忠。我對(duì)這個(gè)服務(wù)有80%的信任鞠苟,于是我愿意冒著20%的風(fēng)險(xiǎn),去使用這一服務(wù)秽之,如此而已当娱。
- 沒(méi)有深入思考算法與協(xié)議的細(xì)節(jié):為了實(shí)現(xiàn)一個(gè)幾乎沒(méi)有漏洞的架構(gòu),我現(xiàn)在大概只能算是完成了1%的工作考榨,開(kāi)了一個(gè)頭而已跨细。要是有朋友對(duì)于這個(gè)架構(gòu),也非常感興趣河质,大家倒是可以一起研究一下冀惭。
未來(lái)的數(shù)字貨幣架構(gòu)
一個(gè)逐漸完善的架構(gòu),肯定是分層掀鹅、分模塊散休,多個(gè)組件是可以組合/替換的。目前的大多數(shù)公鏈乐尊,都想的是打造一個(gè)完整的戚丸,全面可用的架構(gòu)。我覺(jué)得他們多半都會(huì)失敗扔嵌。但是限府,有誰(shuí)能夠構(gòu)造一個(gè)類(lèi)似于TCP/IP這一的協(xié)議族呢?我非常期待痢缎!
下期預(yù)告
下一篇文章胁勺,會(huì)聊聊烏托邦的事情,這是IT技術(shù)牺弄,最接近革命的狀態(tài)姻几,也許未來(lái)真的會(huì)是某種DAO也未可知!
————————
補(bǔ)充一段霍炬對(duì)這篇文章的評(píng)論:
這是道思考題啊势告,git和區(qū)塊鏈的異同比較可以做面試題蛇捌。
你這個(gè)恰好回答了這個(gè)問(wèn)題,這個(gè)系統(tǒng) 1 不是拜占庭容錯(cuò)系統(tǒng) 2 沒(méi)法阻止異步時(shí)候的雙花咱台。
把這倆問(wèn)題解決了之后就會(huì)發(fā)現(xiàn)它跟主流區(qū)塊鏈解決方案基本一樣了络拌。
你這個(gè)叫做PoA,Proof-of-authority回溺。以太坊早期啟動(dòng)時(shí)候算力不夠用過(guò)一段這個(gè)辦法春贸。我們要pow是因?yàn)樵跀?shù)學(xué)上可以證明它成立,普通人懂不懂沒(méi)關(guān)系遗遵。但是它得是可證明的萍恕。不然還搞區(qū)塊鏈做什么,直接信任銀行好了车要。允粤。
你說(shuō)的那種就是Pos或者DPos。前者是你抵押足夠多的資產(chǎn)翼岁,讓?xiě)土P足夠大类垫,從而讓你不敢搗亂。后者是經(jīng)過(guò)選舉大家選出來(lái)的琅坡,搗亂就干掉你破壞你前期投入悉患。
git為什么不能和區(qū)塊鏈相比,因?yàn)殛P(guān)鍵就在這個(gè)P-o- xxxx 啊榆俺。售躁。
我的感想:
作為一個(gè)外行,我大概又搞懂了一些什么谴仙。雖然是自己瞎想迂求,然后也許慢慢會(huì)理解“前輩”們的取舍和決策依據(jù)了。