区块链技术指南笔记(二):区块链技术
區塊鏈技術基本概念
區塊鏈提供了一種去中心化的、無需信任積累的信用建立范式,目前已經引起金融行業、科研機構、政府部門和投資公司的高度重視與廣泛關注。區塊鏈技術通過建立一個共同維護且不可被篡改的數據庫來記錄過去的所有交易記錄和歷史數據,所有的數據都是分布式存儲且公開透明的。在這種技術下,任何互不相識的網絡用戶都可以通過合約、點對點記賬、數字加密等方式達成信用共識,而不需要任何的中央信任機構。在這種技術下,我們可以建立數字貨幣、數字資產、智能財產以及智能合約等。
區塊鏈本質上是一個對等網絡的分布式賬本數據庫。比特幣的底層就采用了區塊鏈的技術架構。區塊鏈本身其實是一串鏈接的數據區塊,其鏈接指針是采用密碼學哈希算法對區塊頭進行處理所產生的區塊頭哈希值。每一個數據塊中記錄了一組采用哈希算法組成的樹狀交易狀態信息,這樣保證了每個區塊內的交易數據不可篡改,區塊鏈里鏈接的區塊也不可篡改。
一個完整的區塊鏈系統包含了很多技術,其中有存儲數據的數據區塊及其之上的數字簽名、時間戳等技術,有作為支撐的P2P網絡和維護系統的共識算法,有挖礦和工作量證明機制,有匿名交易機制和比特幣錢包,還有鏈齡、UTXO、Merkle樹、雙花等相關技術概念。正是這些技術,使得區塊鏈在無中心的網絡上形成了運轉不息的引擎,為區塊鏈的交易、驗證、鏈接等功能提供了源源不斷的動力。
?
1.數據區塊
比特幣的交易記錄會保存在數據區塊中,比特幣系統中大約每10分鐘會產生一個區塊,每個數據區塊一般包含區塊頭和區塊體兩部分。
區塊頭封裝了當前的版本號、前一區塊的地址、時間戳、隨機數、當前區塊的目標哈希值、Merkle樹的根值等信息。
區塊體中則主要包含交易計數和交易詳情。交易詳情就是比特幣系統中的記賬本,每一筆交易都會被永久的記入數據區塊中,而且任何人都可以查詢。區塊體中的Merkle樹將會對每一筆交易進行數字簽名,如此可以確保每一筆交易都不可偽造且沒有重復交易。所有的交易將通過Merkle樹的Hash過程產生一個唯一Merkle根值記入區塊頭。
?
2.挖礦與分叉問題
區塊在挖礦過程中產生。所謂挖礦,實際上是窮舉隨機數算法,把上個區塊的哈希值加上10分鐘內的全部交易單打包,再加上一個隨機數,算出一個256位的字符串哈希值,輸入的隨機數Nonce使哈希值滿足一定條件就獲得這個區塊的交易記賬權。新產生的區塊需要快速廣播出去,以便其他節點進行對其驗證,以防造假。每個區塊存著上一個區塊的哈希值,可以溯源到源頭,只有經過驗證后才能最終獲得區塊的交易記賬權。比特幣系統會讓挖礦的礦工競爭記賬權(在主鏈上鏈接區塊的權利),這個競爭機制就是工作量證明機制。挖礦需要付出大量的能源和時間,誰付出的工作量多就能以更大的概率獲得一個區塊的記賬權。獲取記賬權的礦工將當前區塊鏈接到前一區塊,形成最新的區塊主鏈,該礦工也會得到系統獎勵的一定數量的比特幣。所有的區塊鏈接在一起形成了區塊鏈的主鏈,從創世區塊到當前區塊,在區塊鏈之上的所有數據歷史都可以被追溯和查詢。
可能會出現不同地區的兩個礦工同時”挖出”兩個新區塊加以鏈接的情況,這時主鏈會出現”分叉”。系統并不會馬上確認哪個區塊不合理,而是約定后續礦工總是選擇累計工作量證明最大的區塊。因此,當主鏈分叉以后,后續區塊的礦工將通過計算和比較,將其區塊鏈接到當前累計工作量證明最大化的備選鏈上,形成更長的新主鏈,并自動拋棄分叉處的短鏈,從而解決分叉問題。
?
3.時間戳和不可篡改性
時間戳是指從格林威治時間1970年1月1日00時00分00秒起至現在的總秒數,通常是一個字符序列,唯一地標識某一刻的時間。在比特幣體統中,獲得記賬權的節點在鏈接區塊時需要在區塊頭中加蓋時間戳,用于記錄當前區塊數據的寫入時間。每一個隨后區塊中的時間戳都會對前一個時間戳增強工作量證明,形成一個時間遞增的鏈條。時間戳技術本身并沒有多復雜,但在區塊鏈技術中應用時間戳卻是一個重大創新,時間戳為未來基于區塊鏈的互聯網和大數據增加了一個時間維度,使得數據更容易追溯,重現歷史也成為可能。同時,時間戳可以作為存在性證明的重要參數,他能夠證實特定時刻是的確存在的,這保證了區塊鏈數據庫是不可篡改和不可偽造的,這也為區塊鏈技術應用于公證、知識產權注冊時間等時間敏感領域提供了可能。
?
4.分布式數據庫
比特幣系統中的區塊就像一個記賬本一樣,記錄了所有比特幣的交易信息,每一個比特幣用戶的比特幣收支情況都被永久的嵌入了數據區塊中以供別人查詢。這些數據區塊中的交易數據存放在一個比特幣用戶的客戶端節點中,所有的這些節點則組成了比特幣及其堅韌的分布式數據庫系統。任何一個節點的數據被破壞都不會影響整個數據庫的正常運轉,因為其他健康節點中都保存了完整的數據庫。
?
5.UTXO交易模式
UTXO(Unspent Transaction Outputs)是未花費的交易輸出,它是比特幣交易過程中的基本單位。除創世塊以外,所有區塊中的交易(Tx)會存在若干個輸入(Tx_in,也稱資金來源)和若干個輸出(Tx_out,也稱資金去向),創世區塊和后來挖礦產生的區塊中給礦工的交易沒有輸入,除此之外,在比特幣系統中,某筆交易的輸入必須是另一筆交易未被使用的輸出,同時這筆輸入也需要上一筆輸出地址所對應的私鑰進行簽名。當前整個區塊鏈網絡中的UTXO會被存儲在每個節點中,只有滿足了來源于UTXO和數字簽名條件的交易才是合法的。所以區塊鏈系統中的新交易并不需要追溯整個交易歷史,就可以確認當前交易是否合法。
?
6.哈希函數
哈希函數在比特幣系統中也有著重要的應用,區塊鏈中的數據并不只是原始數據或者交易記錄,還包括它們的哈希函數值,即將原始數據編碼為特定長度的、由數字和字母組成的字符串后,記入區塊鏈。哈希函數有著很多適合存儲區塊鏈數據的優點。
①哈希函數處理過的數據時單向性的,通過處理過的輸出值幾乎不可能計算出原始的輸入值。
②哈希函數,例如SHA256,將需要處理的數據分塊,每塊512字節,然后用Merkle-Damgard轉換函數把初始向量和第一塊做輸入,生成256字節,再作為初始向量與下一數字塊進行Merkle-Damgard轉換,如此重復直到最后一個數據塊。最后結果就是一個256字節的哈希值。因此,輸入數據越長,哈希函數處理的時間就越長。
③哈希函數的輸入值即使只相差一個字節,輸出值的結果也是迥然不同。比特幣系統中最常采用的哈希函數是雙SHA256哈希函數,通俗來說就是將不同長度的原始數據用兩次SHA256哈希函數進行處理,再輸出長度為256的二進制數字來進行統一的識別和存儲。
?
7.Merkle樹
Merkle樹是數據結構中的一種樹,可以是二叉樹,也可以是多叉樹,它具有樹結構的所有特點。比特幣區塊鏈系統中的采用的是Merkle二叉樹,它的作用主要是快速歸納和校驗區塊數據的完整性,它會將區塊鏈中的數據分組進行哈希運算,向上不斷遞歸運算產生新的哈希節點,最終只剩下一個Merkle根存入區塊頭中,每個哈希節點總是包含兩個相鄰的數據塊或其哈希值。在比特幣系統中使用Merkle樹有諸多優點:首先是極大的提高了區塊鏈的運行效率和可擴展性,使得區塊頭只需包含根哈希值而不必封裝所有底層數據,這使得哈希運算可以高效的運算在智能手機甚至物聯網設備上;其次是Merkle樹可支持”簡化支付驗證協議”(SPV),即在不運行完整區塊鏈網絡節點的情況下,也能夠對交易數據進行檢驗。所以,在區塊鏈中使用Merkle樹這種數據結構是非常具有意義的。
?
8.雙重支付
雙重支付問題又稱為”雙花”問題,即利用貨幣的數字特性用”同一筆錢”完成兩次或多次支付。在傳統的金融和貨幣體系中,由于金錢貨幣是物理實體,具有客觀唯一存在的屬性,所以可以避免雙重支付的情況。但在其他的電子貨幣系統中,則需要可信的第三方管理機構提供保證。區塊鏈技術則在去中心化的系統中不借助任何第三方機構而只通過分布式節點之間的相互驗證和共識機制,有效地解決了雙重支付的問題,在信息傳輸的同時完成了價值轉移。區塊鏈技術通過區塊鏈接形成的時間戳技術加上驗證比特幣是否滿足UTXO(未花費交易)和數字簽名,有效避免了雙重支付的問題。如果有人用同一筆UTXO構造了兩筆賦給不同交易方的交易,則比特幣客戶端只會轉發最先被偵聽到的那個。礦工會選擇將那筆交易包入未來區塊,當其中一筆交易所在的區塊后有5個鏈接的區塊,這筆交易已經得到了6次確認。在比特幣區塊鏈上,通常的做法是6次確認后基本上該比特幣被雙花的概率很小。按照中本聰在比特幣白皮書中的計算,6次確認后雙花的概率大概在0.024%。
?
9.P2P網絡
P2P網絡是一種對等者之間分配任務和工作負載的分布式應用框架,是對等計算模型在應用層形成的一種組網或網絡形式。因此,從字面上,P2P可以理解為對等計算或對等網絡。迅雷軟件采用的就是P2P技術。區塊鏈系統是在建立在IP通信協議和分布式網絡的基礎上的,它不依靠傳統的電路交換,而是建立在網絡通信之上,完全通過互聯網去交換信息。網絡中所有的節點具有同等的地位,不存在任何特殊化的中心化節點和層級結構,每個節點均會承擔網絡路由、驗證數據區塊等功能。網絡的節點根據存儲數據量的不同可以分為全節點和輕量級節點,全節點存儲了從創世塊以來的所有區塊鏈數據。全節點的優點是進行數據校驗時不需要依靠別的節點,僅依靠自身就可以完成校驗更新等操作,缺點是硬件成本較高。輕量級節點只需要存儲部分數據信息,當需要別的數據時可以通過簡易支付驗證方式向鄰近節點請求所需數據來完成驗證更新。
?
10.加密算法
除了哈希算法外,比特幣中還存在一種為交易加密的非對稱加密算法(橢圓曲線加密算法)。非對稱加密算法指的就是存在一對數學相關的密鑰,使用其中一個密鑰進行加密的數據信息,只有使用另一個密鑰才能對該信息進行解密。這對密鑰中,對外公開的密鑰叫作公鑰,不公開的密鑰就叫作私鑰。打個比方,公鑰就像銀行的賬戶,私鑰就像是該賬戶的密碼或賬戶所有者的簽名。區塊鏈之上的有效交易有一個用于交易發起方私鑰簽名有效的數字簽名,而該交易的簽名可以通過使用交易發起方的公鑰進行驗證。公鑰可以通過算法從私鑰中計算得出,但私鑰卻不能從公鑰中推出。比特幣系統使用的就是一種非常典型的非對稱加密算法——橢圓曲線加密算法(ECC)。比特幣系統一般從操作系統底層的一個密碼學安全的隨機源中取出一個256位隨機數作為私鑰,私鑰的總數為2^256個,所以很難通過遍歷所有可能的私鑰得出與公鑰對應的私鑰。用戶使用的私鑰還會通過SHA256和Base58轉換成易書寫和識別的50位長度的私鑰,公鑰則首先由私鑰和Secp256k1橢圓曲線算法生成65字節長度的隨機數。一般情況下,比特幣錢包的地址也由公鑰所生成,其生成過程為首先將公鑰進行SHA256和RIPEMD160雙哈希運算,并生成20字節長度的摘要結果(即Hash160結果),這個將作為比特幣地址的主體信息,再在前面加上版本前綴0x00,在后面添加4個字節的地址校驗碼。地址校驗碼通過對摘要結果進行兩次SHA256運算,取哈希值得前4位產生。最后通過Base58處理把連在一起的版本前綴、主體信息和校驗碼轉換成可以容易讓人識別的比特幣字符地址。
?
11.數字簽名
數字簽名就是在信息后見加上一段內容,作為發送者的證明并且證明信息沒有被篡改。一般是發送者將信息用哈希算法處理得出一個哈希值,然后用私鑰對該哈希值進行加密,得出一個簽名。然后發送者再將信息和簽名一起發送給接受者。接收者使用發送者的公鑰對簽名進行解密,還原出哈希值,再通過哈希算法來驗證信息的哈希值和解密簽名還原出來的哈希值是否一致,從而可以鑒定信息是否來自發送者或驗證信息是否被篡改。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的区块链技术指南笔记(二):区块链技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链技术指南笔记(一):区块链基本概念
- 下一篇: 区块链技术指南笔记(三):区块链运作的核