區塊鍊簡介
區塊鍊定義
區塊鍊可以了解為是基于區塊鍊技術形成的公共資料庫。而區塊鍊技術是比特币的底層技術,包含現代密碼學、分布式一緻性協定、點對點網絡通信等技術。下圖是區塊鍊技術架構,大緻可以看到是這些技術通過一定的規則協定,最終形成區塊鍊技術。
區塊鍊分類
以參與方分類,區塊鍊可以分為:公共鍊、聯盟鍊、私有鍊。
公共鍊
公共鍊就是對外公開,任何人都可以參與。公共鍊是真正意義上的完全區去中心化的區塊鍊,它通過密碼學保證交易不可篡改,同時利用密碼學驗證以及經濟上的獎勵,在互為陌生的網絡環境中建立共識,進而形成去中心化的信用機制。比特币和以太坊都是公共鍊。比特币:
https://bitcoin.org/;以太坊:
https://www.ethereum.org/聯盟鍊
僅限于聯盟成員參與,區塊鍊上的讀寫權限、參與記賬權限按聯盟規則來制定。Hyperledger項目屬于聯盟鍊。Hyperledger:
http://cn.hyperledger.org/私有鍊
僅限私有組織使用,區塊鍊上的讀寫權限、參與記賬權限按私有組織規則來制定。
特點
去中心化
區塊鍊資料的存儲、傳輸、驗證等過程均基于分布式的系統結構,整個網絡中不依賴一個中心節點。公共鍊網絡中所有參與的節點都可以具有同等的權利與義務。
可靠資料庫
區塊鍊系統中的資料庫采用分布式存儲,任一參與節點都可以擁有一份完整的拷貝。在比特币中,除非能控制系統中超過一半以上的算力,否則在節點上對資料庫的修改都将是無效的。
安全可信
區塊鍊技術采用非對稱密碼雪原理對交易進行簽名,使得交易不能被僞造;同時利用雜湊演算法保證交易資料不能被輕易篡改,最後借助分布式系統各節點的工作量證明等共識算法形成強大的算力來抵禦破壞者的攻擊,保證區塊鍊中的區塊及區塊内的交易資料不可篡改和不可僞造,是以具有極高的安全性。
區塊鍊的應用
這個不多說了,簡單以下圖所示:
基本概念
資料區塊
在區塊鍊技術中,資料以區塊的方式永久儲存。區塊按時間順序逐個先後生成并連接配接成鍊,每一個區塊記錄了建立期間發生的所有交易資訊。區塊的資料結構一般分為區塊頭和區塊體。其中,區塊頭用于連結到前一個區塊并且通過時間戳特性保證曆史資料的完整性;區塊體則包含了經過驗證的、區塊建立過程中産生的所有交易資訊。
[html] view plain copy- //這段代碼摘自比特币源代碼中區塊頭的定義
- /** Nodes collect new transactions into a block, hash them into a hash tree,
- * and scan through nonce values to make the block's hash satisfy proof-of-work
- * requirements. When they solve the proof-of-work, they broadcast the block
- * to everyone and the block is added to the block chain. The first transaction
- * in the block is a special one that creates a new coin owned by the creator
- * of the block.
- */
- class CBlockHeader
- {
- public:
- // header
- int32_t nVersion;
- uint256 hashPrevBlock;
- uint256 hashMerkleRoot;
- uint32_t nTime;
- uint32_t nBits;
- uint32_t nNonce;
- .......
挖礦
區塊在挖礦過程中産生。挖礦,實際上就是窮舉随機數算法,找到一個随機數Nonce使得計算出來的哈希值滿足一定的條件,以獲得該區塊的記賬權,同時擷取系統給的一定數量的比特币獎勵。
哈希函數、Merkle樹
參考另一篇博文:
http://blog.csdn.net/s_lisheng/article/details/77937202雙重支付(double-spending)
雙重支付問題又稱為“雙花”問題,即利用貨币的數字特性用“同一筆錢”完成兩次或多次支付。這個問題引申出來的就是如何保證每一筆數字現金都隻會被花掉一次,避免重複支出。比特币運作的底層技術區塊鍊技術很大程度上就是在解決這個問題以及“拜占庭将軍問題”。這裡隻簡述相關概念。
在傳統的金融和貨币體系中,由于金錢貨币是實體實體,具有客觀唯一存在的屬性,是以可以避免雙重支付的情況。但在其他的電子貨币系統中,則需要可信的第三方管理機構提供保證。區塊鍊技術則在去中心化的系統中不借助任何第三方機構而隻通過分布式節點之間的互相驗證和共識機制,有效地解決了雙重支付問題,在資訊傳輸的同時完成了價值轉移。
P2P網絡
P2P網絡技術是區塊鍊系統連接配接各對等節點的組網技術,不同于中心化網絡模式,P2P網絡中各節點的計算機地位平等,每個節點有相同的網絡權力,不存在中心化的伺服器。所有節點間通過特定的軟體協定共享部分計算資源、軟體或者資訊内容。在比特币出現之前,P2P網絡計算技術已被廣泛用于開發各種應用,如即時通訊軟體、檔案共享和下載下傳軟體、網絡視訊播放軟體、計算資源共享軟體等。P2P網絡技術是構成區塊鍊技術架構的核心技術之一。
加密算法
非對稱加密算法是指使用公私鑰對資料存儲和傳輸進行加密和解密。公鑰可公開釋出,用于發送方加密要發送的資訊,私鑰用于接收方解密接收到的加密内容。常用的非對稱加密算法有RSA和ECC。非對稱加密算法的過程如下圖所示。區塊鍊正是使用非對稱加密的公私鑰對來建構節點間信任的。
以比特币為例,在⽐特币系統中,我們⽤公鑰加密建立⼀個密鑰對,⽤于控制⽐特币的擷取。密鑰對包括⼀個私鑰,和由其衍⽣出的唯⼀的公鑰。公鑰⽤于接收⽐特币,⽽私鑰⽤于⽐特币⽀付時的交易簽名。公鑰和私鑰之間的數學關系,使得私鑰可⽤于⽣成特定消息的簽名。此簽名可以在不洩露私鑰的同時對公鑰進⾏驗證。⽀付⽐特币時, ⽐特币的目前所有者需要在交易中送出其公鑰和簽名(每次交易的簽名都不同,但均從同⼀個私鑰⽣成)。⽐特币⽹絡中的所有⼈都可以通過所送出的公鑰和簽名進⾏驗證,并确認該交易是否有效,即确認⽀付者在該時刻對所交易的⽐特币擁有所有權。
數字簽名(Digital Signature)
- 目的:保證資訊傳輸的完整性、發送者的身份認證、防止交易中的抵賴發生。
- 實作過程:數字簽名技術是将摘要資訊用發送者的私鑰加密,與原文一起傳送給接收者。接收者隻有用發送者的公鑰才能解密被加密的摘要資訊,然後用HASH函數對收到的原文産生一個摘要資訊,與解密的摘要資訊對比。如果相同,則說明收到的資訊是完整的,在傳輸過程中沒有被修改,否則說明資訊被修改過,是以數字簽名能夠驗證資訊的完整性。
- 數字簽名是個加密的過程,數字簽名驗證是個解密的過程。
- 數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。
基本原理
首先要了解什麼叫非對稱加密和消息摘要。
1. 非對稱加密
在通信雙方,如果使用非對稱加密,一般遵從這樣的原則:公鑰加密,私鑰解密。同時,一般一個密鑰加密,另一個密鑰就可以解密。
因為公鑰是公開的,如果用來解密,那麼就很容易被不必要的人解密消息。是以,私鑰也可以認為是個人身份的證明。
如果通信雙方需要互發消息,那麼應該建立兩套非對稱加密的機制(即兩對公私鑰密鑰對),發消息的一方使用對方的公鑰進行加密,接收消息的一方使用自己的私鑰解密。
2.消息摘要
消息摘要可以将消息哈希轉換成一個固定符長度的值唯一的字串。值唯一的意思是不同的消息轉換的摘要是不同的,并且能夠確定唯一。該過程不可逆,即不能通過摘要反推明文。
利用這一特性,可以驗證消息的完整性。
3.數字簽名
假設現在有通信雙方A和B,兩者之間使用兩套非對稱加密機制。
現在A向B發消息。
那麼,如果在發送過程中,有人修改了裡面密文消息,B拿到的密文,解密之後得到明文,并非A所發送的,資訊不正确。
要解決兩個問題:1. A的身份認證 2. A發送的消息完整性 那麼就要用到上面所講的基礎知識。
數字簽名的過程如下圖:
簡單解釋:
A:将明文進行摘要運算後得到摘要(消息完整性),再将摘要用A的私鑰加密(身份認證),得到數字簽名,将密文和數字簽名一塊發給B。
B:收到A的消息後,先将密文用自己的私鑰解密,得到明文。将數字簽名用A的公鑰進行解密後,得到正确的摘要(解密成功說明A的身份被認證了)。
對明文進行摘要運算,得到實際收到的說明消息沒有被篡改(消息完整性)。
區塊鍊運作的核心技術
區塊鍊的連結
區塊鍊是由一個個區塊組成的鍊,每個區塊分為區塊頭和區塊體兩部分。區塊主體隻負責記錄前一段時間内的所有交易資訊,區塊鍊的大部分功能都由區塊都實作。
共識機制
區塊鍊是分布式的,如何在沒有中心控制的情況下,在互相沒有資訊基礎的個體之間就交易的合法性等達成共識?這裡就需要共識機制去解決。區塊鍊的共識機制目前主要有4類:PoW、PoS、DPoS、分布式一緻性算法。
這裡隻簡要概述,詳見:
http://blog.csdn.net/s_lisheng/article/details/78022645PoW
PoW,比特币中采用的就是這個,礦工通過把網絡尚未記錄的現有交易打包到一個區塊,然後不斷周遊嘗試來尋找一個随機數Nonce,使得新區塊加上随機數的哈希值滿足一定的難度條件。找到滿足條件的随機數,就确定了區塊鍊最新的一個區塊,獲得了區塊鍊的本輪記賬權。礦工把滿足難度條件的區塊在網絡中廣播出去,全網其他節點在驗證該區塊滿足挖礦難度條件,同時區塊裡的交易資料符合協定規範後,将各自把該區塊連結到自己版本的區塊鍊上,進而在全網形成對目前網絡狀态的共識。
- 優點:完全去中心化,節點自由進出,避免了建立和維護中心化信用機構的成本。隻有網絡破壞者的算力不超過網絡總算力的50%,網絡的交易狀态就能達成一緻。
- 缺點:目前比特币挖礦造成了大量的資源浪費;挖礦的激勵機制也造成了礦池算力的高度集中,背離了去中心化的初衷。更大的問題是PoW機制的共識達成的周期較長,每秒最多做7筆交易,不适合商業應用。
PoS
PoS權益證明,要求節點提供擁有一定數量的代币證明來獲得競争區塊鍊記賬權的一種分布式共識機制。如果單純依靠代币餘額來決定記賬者必然使得富有者勝出,導緻記賬權的中心化,降低共識的公正性,是以不同的PoS機制在權益證明的基礎上,采用不同的方式來增加記賬權的随機性來避免中心化。例如點點币PoS機制中,擁有最長鍊齡的比特币獲得記賬權的幾率就越大。
- 優點:在一定程度上縮短了共識達成的時間,降低了PoW機制的資源浪費。
- 缺點:破壞者對網絡攻擊的成本低,網絡安全性有待驗證。另外擁有代币數量大的節點獲得記賬權的幾率更大會使得網絡的共識受少數富裕賬戶支配,進而失去公正性。
DPoS
與PoS的主要差別在于節點選舉若幹代理人,由代理人驗證和記賬。
- 優點:大幅縮小參與驗證和記賬節點的數量,可以達到秒級的共識驗證。
- 缺點:有可能不适用于完全去中心化的場景。在網絡節點數少的場景,選舉的見證人的代表性不強。
分布式一緻性算法
分布式一緻性算法是基于傳統的分布式一緻性技術。其中有分為解決拜占庭将軍問題的拜占庭容錯算法,如PBFT。另外解決非拜占庭問題的分布式一緻性算法(Paxos、Raft),該類算法目前是聯盟鍊和私有鍊場景中的常用的共識機制。
- 優點:實作秒級的快速共識機制,保證一緻性。
- 缺點:去中心化程度不如公有鍊上的共識機制;更适合多方參與的多中心商業模式。
解鎖腳本
腳本是區塊鍊上實作自動驗證、自動執行合約的重要技術。腳本類似一套規則,它限制着接收方怎樣才能花掉這個輸出上鎖定的資産。交易和合法性驗證也依賴于腳本。鎖定腳本和解鎖腳本。
鎖定腳本是在輸出交易上加上的條件,通過一段腳本語言來實作,位于交易的輸出。解鎖腳本隻有滿足鎖定腳本要求的條件,才能花掉這個腳本上對應的資産,位于交易的輸入。解釋腳本是通過類似程式設計領域裡的“虛拟機”,它分布式運作在區塊鍊網絡裡的每一個節點。
比特币中的腳本機制相對簡單,以太坊深入增強了腳本機制,發展成了支援腳本的一套圖靈完備語言,該腳本語言通過“虛拟機”執行,可以說,以太坊實作了一個支援圖靈完備腳本語言的區塊鍊平台。
交易規則
區塊鍊的交易就是構成區塊的基本機關,也是區塊鍊負責記錄的實際有效内容。一個區塊交易可以是一次轉賬,也可以是智能合約的部署等其他事務。就比特币而言,交易即指一次支付轉賬。其交易規則如下:
- 交易的輸入和輸出不能為空。
- 對交易的每個輸入,如果其對應的UTXO輸出能在目前交易池中找到,則拒絕該交易。因為目前交易池是未被記錄在區塊鍊中的交易,而交易的每個輸入,應該來自确認的UTXO。如果在目前交易池中找到,那就是雙花交易。
- 交易中的每個輸入,其對應的輸出必須是UTXO。
- 每個輸入的解鎖腳本必須和相應輸出的鎖定腳本共同驗證交易的合規性。
對于以太坊來說,交易還可能是智能合約的部署。交易規則就确定了符合一定文法的規則的合約才能被部署在區塊鍊上。
交易優先級
區塊鍊交易的優先級由區塊鍊協定規則決定。對于比特币而言,交易被區塊包含的優先次序由交易廣播到網絡上的時間和交易額的大小決定。随着交易廣播到網絡上的時間的增長,交易的鍊齡增加,交易的優先級就被提高,最終會被區塊包含。對于以太坊而言,交易的優先級還與交易的釋出者願意支付的交易費用有關,釋出者願意支付的交易費用越高,交易被包含進區塊的優先級就越高。
Merkle證明
比特币的Merkle樹
Merkle樹的一個重要應用是快速支付驗證。輕量級節點不用下載下傳每一筆交易以及每一個區塊,可以僅下載下傳鍊的區塊頭,如下面這段代碼,資料塊頭部大小為80位元組。如果一個輕用戶端希望确定一筆交易的狀态,它可以簡單地要求一個Merkle證明,顯示出一個在Merkle樹特定的交易。
- //摘自比特币源碼
- class CBlockHeader
- CBlockHeader()
- {
- SetNull();
- }
- ADD_SERIALIZE_METHODS;
- template <typename Stream, typename Operation>
- inline void SerializationOp(Stream& s, Operation ser_action) {
- READWRITE(this->nVersion);
- READWRITE(hashPrevBlock);
- READWRITE(hashMerkleRoot);
- READWRITE(nTime);
- READWRITE(nBits);
- READWRITE(nNonce);
- void SetNull()
- nVersion = 0;
- hashPrevBlock.SetNull();
- hashMerkleRoot.SetNull();
- nTime = 0;
- nBits = 0;
- nNonce = 0;
- bool IsNull() const
- return (nBits == 0);
- uint256 GetHash() const;
- int64_t GetBlockTime() const
- return (int64_t)nTime;
- };
(如果對比特币源碼感興趣,在這裡:
https://github.com/bitcoin)
以太坊中的就複雜些,以太坊的每一個區塊頭中并非隻包含一棵Merkle樹,而是包含了3棵Merkle樹。下圖是以太坊的Merkle證明樹:
這裡還沒有了解,深入了解可以參考這篇博文——Merkle Patricia Tree詳解:
http://ethfans.org/posts/588RLP
RLP(Recursive Length Prefix,遞歸長度字首編碼)
是Etherenum中對象序列化的一個主要編碼方式,其目的是對任意嵌套的二進制資料的序列進行編碼。以太坊中的所有資料都以RLP形式存儲,這種編碼格式将任意長度和次元的字元串構成的數組串連接配接成字元串。更多參考:
https://github.com/ethereum/wiki/wiki/RLP區塊鍊交易流程
以比特币的交易為例,區塊鍊的交易并不是通常意義上的一手交錢一手交貨的交易,而是轉賬。如果每一筆轉賬都需要構造一筆交易資料會比較笨拙,為了使得價值易于組合與分割,比特币的交易被設計為可以納入多個輸入和輸出,即一筆交易可以轉賬給多個人。從生成到在網絡中傳播,再到通過工作量證明、整個網絡節點驗證,最終記錄到區塊鍊,就是區塊鍊交易的整個生命周期。整個區塊鍊交易流程如下圖所示:
- 交易的生成——所有者A利用他的私鑰對前一次交易和下一位所有者B簽署一個數字簽名,并将這個簽名附加在這枚貨币的末尾,制作成交易單。(B以公鑰作為接收方位址)
- 交易的傳播——A将交易單廣播至全網,每個節點都将收到的交易資訊納入一個區塊中。(對B而言,該筆比特币會即時顯示在比特币錢包中,但直到區塊确認成功後才可用。目前一筆比特币從支付到最終确認成功,得到6個區塊确認之後才能真正确認到賬)
- 工作量證明——每個節點通過相當于解一道數學題的工作量證明機制,進而獲得建立新區塊的權力,并争取得到數字貨币的獎勵。(新比特币在此過程中産生)
- 整個網絡節點驗證——當一個節點找到解時,它就向全網廣播該區塊記錄的所有蓋時間戳交易,并由全網其他節點核對。(時間戳用來正式特定區塊必然于某特定時間是的确存在的,比特币網絡采取從5個以上節點擷取時間,然後取中間值的方式作為時間戳)
- 記錄到區塊鍊——全網其他節點核對該區塊記賬的正确性,沒有錯誤後他們将在該合法區塊之後競争下一個區塊,這樣就形成了一個合法記賬的區塊鍊。(每個區塊的建立時間大約在10分鐘。随着全網算力的不斷變化,每個區塊的産生時間會随算力增強而縮短、随算力減弱而延長。其原理是根據最近産生的2016個區塊的時間差,自動調整每個區塊的生成難度,使得每個區塊的生成時間是10分鐘)
補充——比特币難度調整公式
新難度計算公式: .
補充概念
拜占庭将軍問題
“拜占庭将軍問題”就是軍中可能有叛徒,将軍們無法互相信任,又相隔較遠,能否找到一種分布式協定讓他們遠端協商,以保證進攻的一緻性。由此引申到計算領域,發展成了一種容錯理論。
拜占庭容錯技術(Byzantine Fault Tolerance,BFT)是一類分布式計算領域的容錯技術。拜占庭假設是對現實世界的模型化,由于硬體錯誤、網絡擁塞或中斷以及遭到惡意攻擊等原因,計算機和網絡可能出現不可預料的行為。拜占庭容錯技術被設計用來處理這些異常行為,并滿足所要解決的問題的規範要求。
UTXO(Unspent Transaction Outputs,未花費交易輸出)
Unspent Transaction Outputs,未花費交易輸出,它是比特币交易過程中的基本機關。
公鑰密碼體制(Public-key cryptography)
公鑰密碼體制分為三部分:公鑰、私鑰、加密解密算法。加密是指通過加密算法和公鑰/私鑰對内容(明文)進行加密,得到密文,加密過程需要用到公鑰;解密是通過解密算法和私鑰/公鑰對密文進行解密,得到明文,解密過程需要用到解密算法和私鑰。
公鑰密碼體制的公鑰和算法都是公開的(這也是公鑰密碼體制名稱的來源),私鑰是保密的。針對不同的用途,可選擇采用公鑰還是私鑰進行加密,再用對應的私鑰或者公鑰進行解密。
加密算法分為對稱加密算法和非對稱加密算法。對稱加密算法中,加密的密鑰和解密的密鑰是相同的;非對稱加密算法中,加密使用的密鑰和解密使用的密鑰是不相同的。比特币的區塊鍊上使用的是非對稱加密算法中比較典型的代表“橢圓曲線算法”(ECC)。
私鑰的生成一般是通過在一個密碼學安全的随機源中取出一長串随機位元組,對其使用SHA256雜湊演算法進行運算,這樣就可以友善地産生一個256位的數字。如果運算結果小于n-1(其中n=1.158*1077,略小于2256),我們就有了一個合适的私鑰。否則,我們就用另一個随機數再重複一次。公鑰的生成可通過加密算法從私鑰中獲得,而反向從公鑰推到出私鑰被證明幾乎不可能。
比特币錢包
比特币錢包是個形象的概念,比特币本身是由一對數字密鑰(私鑰、公鑰)來決定歸屬,因為擁有私鑰就能擁有對應位址比特币的處置權,可以說私鑰就等同于比特币,是以通常将管理這些數字密鑰的軟體稱為“錢包”。
圖靈完備
一個能計算出每個圖靈可計算函數(Turing-computable function)的計算系統被稱為圖靈完備的。一個語言是圖靈完備的,意味着該語言的計算能力與一個通用圖靈機 (Universal Turing Machine)相當,這也是現代計算機語言所能擁有的最高能力。
原文釋出時間為:2018年01月30日
本文作者:MOJY_1825
本文來源:
CSDN,如需轉載請聯系原作者。