閱讀305 返回首頁    go 阿裏雲 go 技術社區[雲棲]


蔣勇 | 白話區塊鏈技術棧與應用


image


(中生代技術&華章科技區塊鏈技術分享第一期)
(本文約12000字,閱讀完本文預計10分鍾)
(如果電腦上閱讀出現方框亂碼,請下載PDF原文:鏈接:https://pan.baidu.com/s/1jHEyjEA 密碼:zg30)

內容概要

現如今說起比特幣,相信不少朋友已是耳熟能詳了,尤其是這兩年隨著其價格飆升,甚至超過了黃金 ,超過了房地產,各大財經媒體乃至央視都有所關注報道;

在很多朋友心目中,比特幣似乎就是一個類似於遊戲幣、郵幣卡這樣的炒作標的物,除了驚歎於它的價格上升速度外,對其了解還是寥寥。

然而,這一切的背後,到底是什麼在支撐,現如今除了比特幣,還有很多其他的類似係統, 比如萊特幣、以太坊、 比特股等等,不勝其多,但凡介紹這些內容的軟文, 大體都會提到一個名詞:區塊鏈

一切似乎都是由區塊鏈引起的,那麼,就讓我們剖開迷霧,揭開神秘的麵紗,來看看這裏頭到底是個什麼,它有什麼特點,能有什麼用處。

白話區塊鏈技術棧與應用

導讀:本章內容主要介紹區塊鏈本身的含義以及代表性的技術組成,並由此介紹比特幣是怎麼通過這樣的技術產生的。

1. 什麼是區塊鏈

1.1 一個有趣的數據記錄格式

區塊鏈,拆開來就是“區塊+鏈”,實際上是一種數據的記錄格式,軟件在處理數據的時候,總是需要按照某種格式來讀寫,比如我們通常使用的關係型數據庫,數據是按照一條一條的記錄保存,或者再通俗的說,就像會計記賬,將每一筆發生的業務都記在賬本中,每一筆記錄的賬務稱之為是憑證,一個月下來,將記錄的一堆憑證數據匯總成 一個賬簿,每過一個月就月結一下。區塊鏈的格式,跟會計的這種記賬方法很類似,所謂區塊也就是一大坨數據的意思,我們可以將會計每個月所有記錄的記賬憑證看成是一個個的區塊,區塊之間通過年 月串聯起來,這樣看起來就像是一條數據鏈一樣,區塊鏈其實就是這麼簡單的一個格式,我們看個示意圖:


image

如圖所示,就是區塊鏈格式的樣子了 ,在比特幣中,不是每個月存儲一個區塊, 而是大約每10分鍾一個區塊(注意隻是大約,不是精確的10分鍾),區塊中存儲的數據是最近的10分鍾內發 生的交易 事務(最近的10分鍾這個說法其實並不嚴謹,現在可以就這麼理 解,在下麵另有解釋),可以理解為就是流水賬。

大家看到這樣的格式後,不知道是否有些似曾相識的聯想,其實這樣的數據格式,在生活中是有很多相似的;

比如工廠倉庫的出入庫記錄,這個跟會計賬本是類似的,還有家譜或者族譜,每一代人之間的關係是一個區塊,到了下一代 又是一個區塊,區塊之間是父輩與子 女的關係連接,等等;而如果是計算機專業的朋友,一眼看上去,這不就是個線性表嗎?是的,這就是比特幣軟件的主要數據存儲格式,也是其他所有基於區塊鏈技術的係統存取數據的格式。

這是一個很有趣的數據格式,它將連續不斷的發生的數據分成了一個 一個的數據塊,這樣每個區塊就都有自己的數字編號,也可以有自己的身份證號(通過哈希算法計算得到),在下載同步這些數據的時候,可以並行的從各個節點來獲得,無論數據先後,到達本地後再根據區塊號或者身份證號來組裝起來就行 。

另外,這種格式是一種鏈條的格式,鏈條最大的特點就是一環扣一環,很難從中間去破壞, 比如有人篡改了中間的5號區塊,那麼如果要讓數據看起來是完整的,就得同步把5號區塊後續的所有區塊都要更改掉,這個難度就大了,這也是區塊鏈數據格式不可篡改的其中一個原因(當然了,如果僅僅隻是本機的數據,也沒什麼不可篡改的,區塊鏈係統真正的防篡改能力是通過無數個區塊鏈係統運行的節點網絡以及共識算法來實現的,這個在下麵再介紹)。

這種格式還要個妙處,如果這個數據總是由一個人來記錄的,那自然也沒什麼,但是如果放到網絡中, 大家共同來記錄這個數據,那就有點意思了,每個區塊數據由誰來記錄或者說打包,是可以設置一個遊戲規則的,比如說擲骰 子,大家約定誰能連續3次擲出6,那就讓他來記這個數據,為了補償 一下他的勞動投入,獎勵給他一些收益, 比特幣正是使用了這樣的原理來不斷的發行新的比特幣出來,獎勵給打包的那個人的比特幣就是新發行的比特幣。

說到這裏,大家覺得有點意思了吧?

1.2 一組技術的代表稱唿

剛剛我們說了,區塊鏈是一種數據的記錄格式,可如果僅僅如此的話,實在不算是什麼大不了的創新,事實上,在技術上區塊鏈是一組技術的代名詞,我們通常都說使用了區塊鏈技術就是這個意思,那麼既然是一組技術,那是由哪些技術組合起來的呢?我們來看一組關鍵詞:

  • 公開密鑰算法
  • 網絡共識算法(挖礦)
  • 梅克爾數據證明
  • 可編程腳本合約
  • 區塊鏈賬本

1.公開密鑰算法
屬於計算機密碼學⾥麵傳統的技術,公開密鑰算法是⼀種不對稱的加密算法,擁有兩個密鑰,可以互相加解密,通常其中的一個密鑰是公開的稱之為公鑰,另外一個密鑰是保密的稱之為私鑰;

2.哈希算法
也是屬於計算機密碼學中傳統的技術,應⽤就更廣泛了,主要⽤來對⼀段數據進行計算,得出⼀個摘要信息,通俗點說就是給一段數據⽣成⼀個身份證號;不同的消息生成的摘要數據是不⼀樣的(某些抗碰撞能力弱的哈希算法可能在這⽅麵會有些問題,但是使⽤廣泛的⼀些知名的哈希算法,發⽣碰撞的概率很低),相當於給⼀段數據⽣成了一個身份證號這麼個意思,在區塊鏈係統中,哈希算法的使⽤很多,⽐如區塊與區塊之間,就是通過區塊頭的哈希關聯起來的,⽽區塊中的每⼀筆交易事務也都會⽣成⼀個哈希值作為交易易數據的ID,通過這些身份證號可以⽅便的檢索或者關聯區塊,也能⽅便的指定某⼀筆交易事務。

哈希算法還可以用來生成梅克爾樹,在下麵我們再詳細介紹,我們說了,哈希算法的特點是,隻要目標數據有哪怕⼀點點的改動,生成的哈希值就會完全不不一樣,因此可以⽤用來驗證數據是否被改動過。

3.⽹絡共識算法
在很久前就有計算機科學家研究過,並且提出過一些模型,⽐如拜占庭容錯算法之類,比特幣、以太坊這些使用的是⼀種工作量證明算法,其它的一些區塊鏈係統有使用其他各種衍⽣的算法,⽽算法的原理都很簡單,就是約定⼀個規則,通過共同執行這個規則,讓每個分布式的節點數據都保持最終一致;

4.梅克爾數據證明
這是利用哈希算法將⼀組數據創建為⼀棵哈希樹結構,⽤於驗證數據完整性的一種結構,同時也應⽤在了輕量級錢包中。不同的區塊鏈係統對梅克爾樹的應⽤不盡相同,比特幣中是⼆叉梅克爾樹,比較簡單,通過交易事務的哈希值兩兩配合生成一棵樹,以太坊這種就複雜的多了,稱之為梅克爾.帕特⾥夏樹,這裏暫時不贅述。

5.可編程腳本合約
什麼叫合約?就是⼀組約定的規則,⽐如銀行的結算係統,⼩明轉賬100給小王,在這麼⼀個過程中,銀⾏係統就會根據⼀組規則自動執行,規則包含⽐如檢測⼩明的密碼是否正確,餘額是否⾜夠,⼩王的賬號是否正確,檢測通過則分別更改兩者的賬戶⾦額並寫⼊事務⽇誌。是的,這就是合約的意思了,當然,如果範圍再⼴泛些,各種商業合約也都是這麼個意思,因此可編程腳本合約也沒什麼好稀奇的,然⽽,如果將這種編程合約放到區塊鏈的環境中,就⽐較有趣了,看兩個特點:
第⼀個,區塊鏈係統是⽆中⼼的分布式⽹絡,沒有邊界
第⼆個,區塊鏈係統通過⼀係列的技術實現了可信任⽹絡
加起來,就是⽆邊界的可信任⽹絡,在這樣的⼀個⽹絡中執⾏既定的合約,成本低⽽而且安全,⽐特幣在本質上也是屬於這麼⼀種腳本合約,隻不過在⽐特幣軟件中,合約中處理的事情是⽐特幣的轉賬,如果擴展這個概念,眾籌、擔保、分潤等各種合約種類都能應⽤在這上⾯,⽤戶也可以⾃行編寫合約規則,以太坊便是這⽅麵的⼀個典型代表,並由此帶出了智能合約的應⽤。
這些技術的具體解釋,我們在下⾯⼀一詳述。
其中的【區塊鏈賬本】我們已經介紹過了,不再贅述,那麼其他的技術都具體是什麼意思呢,它們是怎麼與區塊鏈賬本結合起來的?我們來一一說明一下:

1.3 創世應用“比特幣”

說了這麼多,我們知道,區塊鏈技術反正就是一套軟件開發技術,跟我們平時的網站開發技術、遊戲開發技術、手機APP開發技術類似,隻不過,與其他的開發技術不同的是,它能開發出一款軟件,這種軟件能製造“貨幣”出來,這就讓人覺得有些不可思議了,比特幣正是區塊鏈技術的第一個應用軟件,因此我們稱它為“創世應用”。
正是比特幣把區塊鏈的技術理念帶到了我們的視野中,雖然⽐特幣的創始人中本聰⼀直都是⼀個謎,沒有搞得清楚他到底是⼀個⼈人還是⼀個組織,但這些都不重要,重要的是⽐特幣係統以⼀種極其天才的創新設計,解決了人們⼀直以來都難以解決的問題,那就是異步⽹絡環境中實現數據的可信任共識的⽅案。我們拋開⽐特幣這個貨幣的概念,純粹站在軟件或者⽹絡的⻆度來看⼀下,假設我們是當初的中本聰,模擬⼀下當時的想法,⾸先,希望實現⼀套係統,可以聯⽹,並且通過網絡傳遞數據,如果是使⽤中心服務器這個結構的話,那顯然是不夠安全的,隻要服務器上的數據損壞或者被攻擊,係統等於就被癱瘓了,因此,決定采⽤分布式的結構,可是分布式結構有幾個問題;

第一個,這些分布式的係統節點運⾏在哪呢,誰願意提供計算機設施來運⾏行,靠⾃己來部署,那個成本就沒底了;

第⼆個,分布式的節點,那麼數據的⼀致性就是個問題,沒有了服務器,數據來源也就沒有權威的保證了;

第三個,怎麼來驗證⽹絡中的數據呢?

對於第⼀個問題,站在經濟⻆度,如果係統提供⼀種激勵措施,讓運⾏節點的⼈有利可圖應該就能解決了,因此設計這個係統,得要有⼀個獎勵或者激勵的規則,在⽐特幣中,打包區塊的礦⼯工能夠獲得⼀定數量量的⽐特幣獎勵,這就是激勵措施了。
對於第⼆個,這個問題是個難點,比特幣要運⾏在公⽹上,各種情況都有,數據可能被篡改,⽹絡可能不穩定,就連節點什麼時候運⾏也不在控製之中,如何來解決這些問題呢?得要有⼀個機製,這個機製必須要有公正性,既然網絡是可能不可靠不穩定的,那這個機製中就不能有太多對其他節點的依賴,得是⼀個主要依靠本機就能實⾏的⼀個做法。
換成是我,還真的很難想到⼀個好方法,傳統的⼀些技術都有些問題,如果是在⼀個節點明確,網絡也較為良好的場合,還好處理理⼀些,可是⽐特幣的情況要⽐這個複雜的多。著名的CAP原理,闡述了這麼⼀個結論:分布式計算係統不可能同時確保⼀致性、可⽤性和分區容忍性。看下這三個術語分別是是什麼意思吧:
【⼀致性】:這⾥是指強⼀致性,發⽣在後⾯的事件能看到前⾯事件發⽣導致的結果
【可⽤性】:在有限時間內,任何⾮失敗節點都能應答請求
【分區容忍性】:也就是說⽹絡有可能發⽣分區,也就是說節點之間的通信不可保障不能同時確保,那就隻能靠弱化某⼀個或者某兩個特性,⽽而增強其中⼀個特性了。

中本聰在實現的時候,設計了⼀個工作量證明,很有意思,設置⼀個難度值,大家都通過⼀個類似於擲骰⼦的算法來命中⼀個結果,若結果符合預期的要求,就成功,成功者可以獲得數據的記賬權也就是區塊數據打包,打包完畢後⼴廣播給其他⼈,其他⼈驗證後寫⼊⾃己的數據中。
在這個過程中,由於使⽤的算法是⼀個類似於暴力破解的算法,除了靠提⾼計算機算力沒有更高的辦法去討巧(這就⼀定程度上實現了⼀定程度的公正,當然了,⼟豪有能⼒購買更高性能的計算機設施,從⽽比普通⽤戶更加具有搶得打包權的能力,這也是⼀個問題,不過⼀種技術總是隻能解決⼀定範圍的技術問題),但是大家需要注意的是,能夠算出⼀個命中的值的,可並不⼀定隻有⼀個⼈,如果出現了多個呢?那大家就隻能進⾏區塊的⼴播競爭了,誰被其他的節點接收的多,誰就被最終認可,⽽其他同樣挖礦成功的就會被丟棄,從⽽得不到獎勵。
因此,比特幣中的這種數據⼀致性的算法是最終⼀致性而不是實時的⼀致性,這個大家⼀定要注意了。
對於第三個問題,怎麼驗證⽹絡中的數據,在⽐特幣⽹絡中,每個節點都是獨⽴的驗證數據的,在驗證過程不需要⽹絡中其他節點提供依賴的服務。

2. 區塊鏈技術棧

2.1 記錄格式—區塊.鏈

見【1.1 一個有趣的數據記錄格式】

2.2 網絡結構-P2P

現如今,⼤概很少軟件是單機版的了,就連輸⼊法⽐如搜狗輸⼊法、訊飛輸⼊法也都是要通過聯⽹來更新詞庫以及提供其他⼀些智能功能的,那麼,既然是聯⽹的軟件,就避不開⼀個問題,那就是⽹絡結構,就好⽐我們要造房⼦,總得設計下房屋的結構吧,磚瓦結構呢還是框架結構,單獨的平⽅呢還是連⽚的⼩區。
迄今為⽌,⽆論什麼樣的⽹絡結構,總體來區分⼀下的話,就是兩種:客戶端-服務器結構、P2P結構。

P2P也就是peer to peer的意思,中⽂點對點,也就是對等的意思。

區塊鏈中的特點之⼀就是分布式,每個節點都維持完整的賬本數據,可以獨⽴的進⾏數據驗證,獨立的發送數據接收數據,彼此之間通過共識來實現數據的不可篡改和⼀致性,⽽每個節點都獨⽴的按照規則做著⾃己的事情。任何⼀個節點的損壞或者圖退出都不⾜以影響整個⽹絡的正常使⽤,尤其當節點數量很多的事情,這也就避免了單點故障。
由於不存在⼀個服務器,也因此對等⽹絡結構中的節點,是需要有⼀個認識彼此的機製的,這就是⽹絡路由功能,簡單來說,就是每個節點都會負責為其他節點提供地址信息,同時也會去索取和更新有效的節點地址。

就個⼈理解來說,對等⽹絡結構最核⼼的就是⽹絡共識機製,每個節點既當客戶端也當服務器器,通過共識機製來協同。

2.3 同步機製-共識算法

區塊鏈係統是對等⽹絡結構,每個運⾏的節點都各⾃保存⾃⼰的數據副本,那麼問題就來了,怎麼來保證彼此之間的數據統⼀呢,既然沒有⼀個中⼼服務器,⾃然也就沒有⼀個傳統意義上的權威數據來源了,⽽且對等⽹絡中的每個節點都是平等的,那要是彼此的數據不⼀致,以誰的為準呢?這就要使⽤到⼀個同步機製,也就是共識算法。

共識算法的主要⽬的就是通過⼀種機製,使得⽹絡中產⽣的數據讓⼤家都能認可也就是所謂的共識,⽽對於那些⾮法的⽆效的數據會被丟棄掉,可以說,共識算法是確保區塊鏈⽹絡數據同步以及數據安全的重要環節。每⼀種不同的區塊鏈係統都會有⾃⼰的⼀套共識算法,⽐如PoW(proof of work,⼯作量量證明)、PoS(proof of stake,權益證明)、DPoS(Delegated proof of stake,股份授權證明)、PBFT(Practical Byzantine Fault Tolerance,拜占庭容錯算法)等等,很多,每種不同的算法也各有特點和優劣。

再具體說明之前,有朋友可能會有疑問,就算是對等⽹絡,沒有⼀個服務器來權威的提供數據來源,但隻要節點之間彼此都連接,隨時保持⼀致不就⾏了,如果是在⼀個⽹絡良好的局域⽹中,並且運⾏的節點是受到嚴格的管理的,那⼤概也就沒什麼問題了,可事實上是,類似⽐特幣這樣的區塊鏈係統是運⾏在互聯⽹上的,⽽且誰也不能保證⽹絡是個什麼狀況,甚⾄就連運⾏的節點什麼時候啟動什麼時候會關閉掉都不知道,⽐如我們使⽤微信聊天,假設沒有⼀個微信服務器存在,當⼩明發消息給⼩王時,⼩王正好沒開微信,或者⼩王正好在地下停⻋場,沒⽹絡,那怎麼辦?種種情況,都不能保證節點之間能夠隨時連接在⼀起,因此區塊鏈中的共識算法,要解決的是這樣⼀個情況異常複雜的⽹絡環境中的數據同步問題。

為了讓⼤家⽐較能夠形象的理解,我們還是以⽐特幣為例,⽐特幣中使⽤的是⼀種⼯作量量證明算法,其原理很簡單,如下:

我們還是以⽐特幣為例來說明,⽐特幣中的⽹絡共識算法的過程原理相對簡單,理解了這部分,再去理解其他的共識算法就會⽐較有基礎。
在⽐特幣中,使⽤的共識算法是⼀種⼯作量量證明算法,說通俗點,⼤家通過⼀種競爭算法來搶奪區塊數據的打包權,誰搶到了誰就能將發⽣的交易易數據打包成區塊,並且⼴播出去,其他節點驗證後沒有問題就保存到⾃⼰的區塊鏈賬本中,這種競爭算法的原理很簡單,係統會計算出⼀個難度⽬標值,然後⼤家通過對區塊頭進⾏⼀個加入了隨機數的哈希計算,直到算出的值⼩於難度⽬標值,那就算是成功拿到記賬權了,就跟擲骰子差不多意思,誰擲出了⼀組符合條件的數字誰就贏了。
有朋友可能問,那要是不⽌⼀個⼈算出了那麼⼀個數字呢,以誰的為準呢?嗬嗬,這個時候,就要靠運⽓了,假如A和B都得到了符合條件的⽬標數據,都打包,都⼴播了,這個時候就看誰⼴播的範圍最⼤,影響最⻓遠了,最後⽐特幣⽹絡會保留⼴播範圍最⼤的那個。

⼤家看到在這個⼩節的標題上放了個“挖礦”的字樣,是不是共識算法都稱之為是挖礦算法呢?答案是否定的。在這⾥之所以放⼀個“挖礦”的字樣,是因為在不少的公鏈係統中,⽐如⽐特幣、萊特幣、以太坊等,都是通過這樣的⼀個共識算法來發行新幣的,怎麼發⾏呢,就是獎勵⼀定數量量的幣給成功挖到區塊的礦⼯。

2.4 完整證明-梅克爾樹

梅克爾樹是一種數據結構,跟區塊鏈賬本數據格式一樣,是用於維護 一類數據的,區塊鏈的賬本格式是一條鏈,梅克爾樹,顧名思義是 一種樹結構,梅克爾樹的目的是為了實現完整性證明,在不同的區塊鏈係統中,對梅克爾樹的使 用不盡相同,比特幣中使用的稱之為二叉梅克爾樹,而比如以太坊係統中使用的則是梅克爾-帕特裏夏樹,相對來說, 二叉梅克爾樹要簡單許多,咱們就從簡單的開始介紹吧,還是以比特幣中的為例 。

既然是樹結構,那就有一個個的樹節點,那麼比特幣中的樹節點中都是哪些數據呢?實際上,在比特幣中,每個區塊中都包含有一顆梅 克爾樹,我們來看看,這棵樹是怎麼種出來的。

在每個區塊中都包含有很多交易事務,每條事務都有一個身份證號,這是通過哈希算法計算而來的,可以唯一的表示某條事務記錄,假如說某個區塊中有6條事務記錄,那我們就拿出6條事務記錄的身份證號也就是哈希值,進行兩兩配對,然後分別再計算出兩兩配對的事務哈希值,依次往上,直到最後計算出一個根哈希,我們來看個圖示:

image
image

在⽐特幣中,每個區塊都能⽣成⼀顆梅克爾樹,是通過什麼來⽣成的呢?是通過交易事務,在⼀個區塊中,每條交易事務都會被計算⼀個哈希值,假設某個區塊有4條事務,則如圖所示,Hash1到Hash4就是這4條事務的哈希值,接下來再次對事務的哈希值兩兩哈希,直到最後⽣成⼀個根哈希,如此,⼀棵梅克爾樹就⽣成了。那麼,這樣的⼀棵樹⽣成後有什麼⽤呢?

⾸先,⽐特幣的節點在進⾏數據同步的時候,會向多個節點下載數據,這個時候,就會有個問題,怎麼來驗證獲得的數據是完整的還是不完整的呢,是有問題還是沒問題的呢?在點對點⽹絡中進⾏數據傳輸的時候,顯然並不隻是從⼀台服務器上下載數據,⽽且其中的⼀些機器還可能是不穩定的,甚⾄是不可信的,這個時候,通過上述的⼀個⼤文件⼀個哈希值的⽅式就不太能起作⽤了。

然後通過梅克爾樹,假設圖中的2號事務數據下載有問題,則計算出的Hash12必然是與其他節點不⼀致的,很快就能定位到問題塊,除了能夠快速定位到數據塊外,還有⼀個作⽤,就是對SPV(Simplified Payment Verification, 簡單⽀付驗證)的支持,我們知道,⽐特幣核⼼錢包是要搭配完整的區塊鏈數據使⽤的,包含了所有發⽣的交易事務,也因此,可以對接收或者發起的交易事務進⾏完整的驗證,⽐如是否包含⾜夠的餘額,是否雙花等,但是這種卻也有個很⼤的問題,它必須要帶上⼀個數據量很⼤的賬本副本,這就限製了⽐特幣錢包的使⽤,有時候我們隻是想驗證⼀下⽀付是否發⽣過就⾏了,完整的交易可以交給核心節點,那怎麼辦呢?可以通過如下的過程來實現:

  1. ⾸先下載完整的區塊頭數據,注意是區塊頭不是所有的區塊鏈數據,區塊頭中包含有區塊的梅克爾根

  2. 如果是想要驗證某筆⽀付交易,則計算出這筆交易事務的哈希值txHash

  3. 找到txHash所在的區塊,驗證⼀下所在區塊的區塊頭是否包含在區塊鏈賬本中

  4. 獲得所在區塊中計算梅克爾根所需要的哈希值,注意我們並不需要所有的事務哈希值,如圖所示,如果是要校驗Hash1的話,我們隻需要再搜集Hash2、Hash34即可

  5. 計算出梅克爾根

  6. 若計算結果與所在區塊的梅克爾根相等,則⽀付交易是存在的。

  7. 根據該block header所處的位置,還可以確定該交易得到了多少個確認

從中我們可以看到,梅克爾樹是相當重要的。⼤家可以設想⼀下,這種結構還能應⽤在哪些場景下。

2.5 賬戶管理 -公開密鑰算法

我們在使用通常的網絡服務時,都會注冊一個用戶名,無論是使用淘寶、京東、微信等,還是玩網絡遊戲之類,都會去注冊一個用戶名,那麼區塊鏈係統中是怎麼來注冊用戶名的呢?實際上在區塊鏈係統中 一般是沒有用戶名這個概念的,而隻有一個賬戶地址的概念, 無論是使用比特幣還是以太坊還是其他的,基本都是通過一個地址來表示的,對於支持數字貨幣的區塊鏈係統這個地址也稱之為是錢包地址,那麼這個地址是從何而來的呢?我們先來了解一下公開密鑰算法:

這是⼀種加密算法,通常的加密算法,密鑰隻有⼀個,舉個例子,我們希望對⼀串串數字進⾏行加密,約定將每⼀個數字都加上2,⽐如1,2,3,4,5就變成了3,4,5,6,7,如果有誰知道了這種加密⽅法,那同時也就知道了解密算法,這種⼀般稱之為叫對稱密碼算法;

如果希望加密的⽅法與解密的⽅法是可以獨⽴的且⽆無法互相直接推倒出來,那麼,這種算法就是不對稱加密算法,也就是所說的公開密鑰算法,為什麼叫公開密鑰呢,因為這種擁有兩種密鑰,⼀個是保密的稱之為私鑰,⼀個是可以公開的,稱之為公鑰,使⽤用私鑰加密的數據可以通過公鑰解密,反過來使⽤公鑰加密的數據可以通過私鑰解密,⽬目前這種算法應⽤比較多的有RSA算法和ECC橢圓曲線算法,前者是利用了⼤素數分解難度的原理理,後者是利用了橢圓曲線離散對數的計算難度,具體細節基於篇幅這⾥不再展開,區塊鏈係統中,通常橢圓曲線算法應⽤的最多。

以⽐特幣為例,⽤戶可以在⾃己的錢包中創建地址,這個地址類似於銀⾏賬號,我們可以將⽐特幣從⼀個地址發往另外⼀個地址,那麼,這個地址從何⽽來的呢,實際上,從本質上來講,並沒有⽐特幣地址這麼⼀個東⻄存在,為什麼這麼說?⽤戶在創建錢包地址時,實際上是創建了⼀對公鑰和私鑰,⽽所謂的地址隻是公鑰的⼀種格式化表示。 ⽤戶通過私鑰簽名證明⾃己擁有某筆⽐特幣,⽽通過公開的公鑰可以驗證⾃己的身份,隻要⾃己通過私鑰簽名⼀筆交易或者簽名⼀筆消息,任何⼈人都可以通過公開的公鑰來確認是否是合法的用戶。也就是說,公開密鑰算法不但⽤來識別某個地址用戶,也是⽤來完成交易事務的,不但是⽐特幣,其他的區塊鏈係統也是同樣的原理。

2.6 智能合約-可編程狀態邏輯

這是區塊鏈係統⾮常重要的特點,我們知道,區塊鏈係統可以創建⼀個可信任的⽹絡,在這樣⼀個可信任的網絡中可以放心的通過⼀組代碼編寫的既定規則,轉移數據的所有權,變更數據的狀態。⽐特幣⽹絡中可以轉移⽐特幣,以太坊⽹絡中可以轉移以太坊還可以通過其他的智能合約實現按規則的狀態變更。

這些到底是什麼意思呢?

通常,在⼀個傳統係統中,⽐如銀⾏行的賬戶係統,是怎麼來表明⼀筆錢是誰的呢?是通過賬戶和密碼,⽐如⼩明轉了了100元給⼩王,這100的⾦金金額數值就會寫⼊到⼩王的賬戶,然後扣除掉⼩明賬戶⾥100,⼩王的賬戶隻有通過⼩王⾃己的密碼才能驗證通過使⽤,這個邏輯看起來很正常,⼀直以來我們都是來的。然⽽而,區塊鏈係統中卻不是這麼來實現的。

讓我們來站在⼀個⽐較⾼的⻆角度來看待⼀下,以銀⾏賬戶為例,⽆論是轉賬,存錢還是扣除費⽤等,不管是什麼樣的業務,對於賬戶來說,站在數據的層⾯,無⾮就是數據狀態的不斷變更,⽽每⼀次的變更都是通過⼀係列的規則驗證的,這麼⼀來,我們可以將這個賬戶看成是⼀個狀態機,如下:


image


這個圖很好理解,那麼我們可以看到,最主要的不是狀態本身,⽽是狀態變更的觸發條件,在這個圖中,每個狀態之間的變更都是有條件的,區塊鏈係統中通常會怎麼來實現這麼⼀個條件的觸發呢?我們以轉賬來說明:
1. 發送⽅發起⼀個轉賬交易,類似於開了⼀張⽀票,然後簽上⾃⼰的名字(私鑰簽名)

  1. 在⽀票上寫上對⽅的賬戶地址(對⽅的錢包地址,我們知道錢包地址就是通過公鑰轉換⽽來的)

  2. 向⽹絡中發送這筆交易,每個節點都可以來驗證這條交易是否有效(⽐如發送⽅的餘額是否⾜足夠,私鑰簽名是否合法等)

  3. 節點如果驗證沒問題就能通過,這條交易事務最終會被礦⼯打包到區塊(相當於正式的記了個賬)

  4. 接收⽅可以通過⾃⼰的私鑰來驗證⾃⼰對這條轉賬交易的擁有權(這句話⼀定要理解⼀下),通過⾃⼰的私鑰和⽀票上的公鑰轉成的地址匹配,若能成功,就表明⾃⼰擁有這條交易事務轉賬的所有權,那麼⾃⼰就能花這筆錢了。

這樣的⼀個過程是通過什麼來實現的呢,是通過⼀組腳本程序,在⽐特幣中是⼀對鎖定與解鎖腳本,在以太坊中是更為複雜的編程腳本,總之,就是通過這樣的程序邏輯實現了狀態變更的觸發條件,隻要腳本程序寫好,達到觸發條件,程序就會嚴格的執⾏,剛正不阿,不留留半點情⾯麵^_^。
那麼,我們可以發現,這個程序,實際上相當於就是⼀份合約,大家約定了⼀個規則,符合規則了就照章辦事,⽽具體是什麼樣的規則,這個是可以事先編寫的(⽐特幣中功能⽐較受限,⼀般也就能實現轉賬交易,以太坊則可以⾃定義編寫各種合約規則),將這樣的⼀份合約放在這樣的⼀個去中⼼,分布式的環境中,由⽹絡共識來保證不可篡改,這是多麼創新的⼀個思路啊,這種可編程合約的思想可以⼴泛的應⽤於各種商業環境之下包括金融領域。

3. 應用特點

3.1 分布式網絡

P2P⽹絡本身就是⼀個分布式⽹絡,區塊鏈⽹絡中並沒有⼀個真正意義上的服務器,內部的運⾏邏輯也並不假設有服務器的存在。在區塊鏈之前,也有過不少的分布式⽹絡係統,⽐如⼤家很熟悉的電驢下載、BT下載,互聯⽹初期的時候,⼤家都是到⽹站服務器去下載,下載的⼈多了,速度就會慢,因為占流量了或者說服務器更繁忙了,然而BT下載這種,確實下載的⼈越多,速度越快,我們不來詳細的解析BT下載的具體技術細節,就光從⽹絡結構上來講,分布式的⽹絡結構,使每個節點都既是使⽤者也是服務的提供者,也就形成了⼈多力量⼤的效果。

分布式⽹絡中,首要的⼀個問題就是,如何保證數據的⼀致性,有些對數據的⼀致性要求不⾼⽐如⽹⻚資源,⽂件服務,早點晚點影響也不⼤;有些則希望在⼀個能承受的時間範圍內達成⼀致,⽐特幣就是這種,通常會建議發送⼀筆交易事務後,等待⾄少6個區塊,原因就是6個區塊後,數據基本上被⼤部分節點收納的概率就很⼤了,還有⼀些對⼀致性的要求很即時,⽐如銀⾏結算,不可能說要等段時間,賬本才能⼀致,那對銀⾏來說不能接受。

針對不同的使⽤場景,分布式⽹絡也會不同的擴展,⼤家要注意的是,分布式⽹絡並不是說完全沒有中心,而是說在整個⽹絡結構上是分散的,分布式的,但是每個單元還是有可能會存在中⼼的,畢竟在某些效率要求⾼的場合,中⼼結構的效率是最⾼的,這兩者之間並不是互相對立的,⽽是互補的。

3.2 數據不可篡改性

我們可以反過來看⼀下,什麼情況下數據是可篡改的。
⽐如數據都管理在⼀個服務器上,那⾃然是可篡改的,再怎麼設置身份認證之類,隻要突破進去就是⼀馬平川了;

再⽐如數據雖然不在⼀個服務器上,但是對數據的驗證是⼀個人說了了算的,⽐如現在很多的⽹站服務,⽐如各種電商⽹站啊,甚⾄包括銀行(當然,不是說這些係統就會被隨意的修改,這⾥隻是參照⼀個例子),數據的管理權在⼀個管理員⼿中,數據怎麼改並不需要得到其他不受⾃⼰控製的係統驗證; 數據的記錄權限在⼀個管理員⼿中,跟第二點類似,⾃⼰說了算;

區塊鏈係統怎麼保證數據不可篡改性的,對於第⼀點,區塊鏈係統是分布式的,因此不存在⼀個明顯的服務器目標;第二點,區塊數據需要被⽹絡中其他節點驗證,⼤家都認可才會被記錄在賬本中由此達成共識,除非控製了大部分的節點,否則是不現實的;

對於第三點,區塊鏈係統中使⽤各種共識算法,記賬權不會掌握在⼀家⼿中,⽐如⽐特幣的挖礦算法。

這種特性對於⼀些公眾數據的記錄是很有意義的,⽐如公證類數據,⽐如眾籌賬務,慈善款項等。

3.3 規則強製執行性

  • 代碼即法律
  • 智能合約的條件執行

3.4 無邊界價值轉移

區塊鏈網絡可以創造一個可信任網絡,可信任就表示有信用,而信 用是一切金融傳遞的基礎

區塊鏈係統可以自帶金融屬性,通過比特幣的例子我們也能看到,它可以通過網絡在全球各地進行轉賬交易,通過這種原理,不但可以傳遞貨幣,也可以傳遞其他任何的數字資產。

傳統的比如遊戲幣,遊戲道具,某平台的積分等,一定程度上也可以轉移價值,但都是很難做到無邊界傳遞的,而且其本身的信用程度也並不高,區塊鏈⽹絡⽆無邊界,並且可以維持⼀個可信任的網絡,這就為資產或者說價值的傳遞構造了一個成本相當低廉且傳播很廣泛的⽹絡基礎設施。

3.5 自治網絡係統

這個其實是一個未來的願景展望,可編程社會的一個基礎模型

4. 應用場景

4.1 數字代幣

比特幣、萊特幣、以太坊以及基於以太坊的各種合約代幣

4.2 眾籌合約

屬於智能合約的 一種

4.3 跨境 支付

無邊界的價值轉移能力以及智能合約的特點,很適合應用在金融的跨境支付領域,目前的跨境支付手續繁雜,等待時間也很長,效率不 高,可以考慮在各國銀行之間建立一個基於區塊鏈的支付係統。

R3聯盟
swift應用超級正本的fabric建立支付網絡

4.4身份證明

使用區塊鏈來構建身份管理係統

4.5去中心交易

目前的案例,Bitshares以及Openledger
基於區塊鏈的交易係統,通過預言機創建鏈上資產,通過代碼規則運行公開透明的交易邏輯

5.主流技術平台

5.1比特幣

曆史上第一個區塊鏈係統,第一個加密數字貨幣係統,其他的係統基本都是在比特幣的基礎上開發的

5.2以太坊

數字貨幣+智能合約,既是一個數字貨幣係統,也是一個智能合約的開發平台

5.3超級賬本

包含一係列的項目
比較著名的就是fabric,是一個麵向商業的區塊鏈係統開發框架,其本身其實並不是一個運行的區塊鏈係統而是一套開發框架,一套開發用的半成品基礎設施,是由Linux基金會主導的項目。

來源:中生代技術

最後更新:2017-08-29 12:02:22

  上一篇:go  阿裏巴巴機器學習係列課程
  下一篇:go  【重磅】2017中國機器人產業發展報告權威發布,智能技術比肩歐美(2萬字,57PDF)