當前位置:
首頁 > 最新 > 從原理到實例,他用區塊鏈技術做一了個COIN 客戶端

從原理到實例,他用區塊鏈技術做一了個COIN 客戶端

本文來自作者LijiaGitChat上分享 「手動做一個自己的 COIN 客戶端:附區塊鏈核心代碼解讀」

基本原理和設計

2008年初,中本聰團隊發布了一篇名為「比特幣:一種點對點的電子現金系統」學術論文,之所以選擇在金融危機這年發布,也許別有深意。他認為傳統貨幣最根本的問題在於信任,銀行必須讓人相信,它能幫我們管好錢財,但是它卻在用貨幣製造信貸泡沫,通貨膨脹使人財富縮水。

首先中本聰把比特幣定義為一種點對點的電子現金系統, 目的很明確:希望這套系統不要依賴任何一個中心,比如中央銀行,所以這個系統必須是分散式系統。

區塊鏈的概念是在中本聰設計比特幣系統的時候首次提出的,也是區塊鏈技術得以落地並且運用得最成功的一次。比特幣是一種業務場景,區塊鏈是比特幣這種業務場景實現的技術基礎。要了解區塊鏈,我們要看一下下圖所示的區塊鏈項目基本運行機制。

去中心化的重要性

主要是為了安全與信任,互聯網從當初到現集群服務方式,無非就是業務邏輯的需要與數據的可靠性,所以安全與信任是最重要的。之前的模式都基於 B/S 或是 C/S,比如微信支付,當 A 用戶向 B 用戶支付,事實上是 A 發起請求然後微信支付系統網關進行確認,然後把 A 的錢轉向 B 的帳戶。

這個時間內,如果微信支付網關伺服器一旦出現問題,所有的用戶都會受到影響,一旦被黑客攻擊,數據就非常容易被修改;而分散式網路中,可以理解為 CDN 機制,比如 Nginx 進行數據緩存,當有100台 CDN,如果中間有幾台伺服器數據丟了,或是被黑客攻擊,這時不會影響全網的服務,因為中心有一個調度機制,可以快速切換到新的或是可靠的 CDN 節點上。

分散式系統中,全球每個節點是客戶端同時也是伺服器,除非同時50.1%以上節點被篡改,如果超過這個值,那就意味調度系統不能正常分析那個是真實的伺服器,所以去中心化的機制,所有的數據都是透明,不屬於任何一個中心伺服器或是客戶端,每個人都是節點上的一個貢獻者,一個維護者。

可能有人會問,本來是伺服器上的數據,我們不可見,現在把數據都安裝到本地,是不是意味著客戶端有存在數據,那是不是更不安全了,事實上是這樣,但是這也是區塊鏈項目的一個屬性,所有的數據都是通過加密方式存在。

重要概念

接下來,我們看看區塊鏈中的重要概念。

P2P協議

P2P 是一種分散式網路,網路的參與者共享他們所擁有的一部分硬體資源(處理能力、存儲能力、網路連接能力),這些共享資源需要由網路提供服務和內容,能被其它對等節點(Peer)直接訪問而無需經過中間實體。在此網路中的參與者既是資源(服務和內容)提供者(Server),又是資源(服務和內容)獲取者(Client)。

其有兩個特點,一是無中央伺服器,二是用戶之間互聯並分享文件或通信。

共識機制

共識機制,就是所有記賬節點之間如何區域達成共識,來選擇和認定記錄的真實性和有效性。全網認可的是最長的一條區塊鏈,因為在此之上的工作量最大。如果想要修改某個區塊內的交易信息,就必須將該區塊和後面所有區塊的信息進行修改。這種共識機制既可以作為認定的手段,又可以避免虛假交易和信息篡改。

智能合約

智能合約主要基於區塊鏈系統里可信的不可篡改的數據,自動地執行一些預先定義好的規則和條款,如新區塊的自動記錄。便捷快速智能。

非對稱加密

非對稱加密,即在加密和解密的過程中使用一個「密鑰對」,「密鑰對」中的兩個密鑰具有非對稱的特點,即在信息發送過程中,發送方通過一把密鑰將信息加密,接收方在收到信息後,只有通過配對的另一把密鑰才能對信息進行解密。

非對稱加密使得任何參與者更容易達成共識,將價值交換中的摩擦邊界降到最低,還能實現透明數據後的匿名性,保護個人隱私。

挖礦基本原理

區塊鏈網路中,數據以文件的形式被永久記錄,我們稱之為區塊。一個區塊是一些或所有最新比特幣交易的記錄集,且未被其他先前的區塊記錄。區塊可以想像為一個城市記錄者的記錄本上的單獨一頁紙(對房地產產權的變更記錄)或者是股票交易所的總帳本。

在絕大多數情況下,新區塊被加入到記錄最後(在比特幣中的名稱為:塊鏈),一旦寫上,就再也不能改變或刪除。每個區塊記錄了它被創建之前發生的所有事件。

區塊結構如下圖所示。

每個區塊包括一些或所有近期交易、前一個區塊的引用,以及其他數據。它還包括一個挖礦難度的答案——該答案對每個區塊是唯一的。新區塊如果沒有正確答案,不能被發送到網路中——「挖礦」的過程本質上是在競爭中 「解決」當前區塊。每個區塊中的數學問題難以解決,但是一旦發現了一個有效解,其他網路節點很容易驗證這個解的正確性,對於給定的區塊可能有多個有效解,但對於要解決的區塊來說只需一個解。

因為每解決一個區塊,都會得到新產生的比特幣獎勵,每個區塊包含一個記錄,記錄中的比特幣地址是有權獲得比特幣獎勵的地址。這個紀錄被稱為生產交易或者 Coinbase 交易,它經常是每個區塊的第一個交易。每個區塊生產的比特幣數量是50個,每產生21萬個區塊後減少一半(時間大約是4年)。

發送者在網路中廣播比特幣交易,所有試圖解決區塊的礦工節點,收集了這些交易記錄,把它們加到礦工節點正在解決的區塊中。

挖礦難度由比特幣網路自動調整,使之實現平均每小時解決6個區塊的目標。每2016個區塊(大約兩周)後,所有客戶端把新區塊的實際數目與目標數量相比較,並且按照差異的百分比調整目標 Hash 值,來增加(或降低)產生區塊的難度。

共識機制

共識機製為區塊鏈應用項目穩定性的一個重要的屬性,而事實上沒有任何一個機制是完美的。

其主要包括以下模式,很多項目都採用混合機制。如下實例也是通過一個 POS+POW 方式進行的。

POW:Proof of Work,工作證明。

比特幣在 Block 的生成過程中使用了 POW 機制,一個符合要求的 Block Hash 由 N 個前導零構成,零的個數取決於網路的難度值。要得到合理的 Block Hash 需要經過大量嘗試計算,計算時間取決於機器的哈希運算速度。當某個節點提供出一個合理的 Block Hash 值,說明該節點確實經過了大量的嘗試計算,當然,並不能得出計算次數的絕對值,因為尋找合理 Hash 是一個概率事件。當節點擁有佔全網 n% 的算力時,該節點即有 n/100 的概率找到 Block Hash。

POS:Proof of Stake,股權證明。

POS,也稱股權證明,類似於財產儲存在銀行,這種模式會根據你持有數字貨幣的量和時間,分配給你相應的利息。

簡單來說,就是一個根據你持有貨幣的量和時間,給你發利息的一個制度,在股權證明 POS 模式下,有一個名詞叫幣齡,每個幣每天產生1幣齡,比如你持有100個幣,總共持有了30天,那麼,此時你的幣齡就為3000,這個時候,如果你發現了一個 POS 區塊,你的幣齡就會被清空為0。

你每被清空365幣齡,你將會從區塊中獲得0.05個幣的利息(假定利息可理解為年利率5%),那麼在這個案例中,利息 = 3000 * 5% / 365 = 0.41個幣,這下就很有意思了,持幣有利息。

DPOS:Delegated Proof of Stake,委任權益證明。

比特股的 DPoS 機制,中文名叫做股份授權證明機制(又稱受託人機制),它的原理是讓每一個持有比特股的人進行投票,由此產生101位代表,我們可以將其理解為101個超級節點或者礦池,而這101個超級節點彼此的權利是完全相等的。

從某種角度來看,DPOS 有點像是議會制度或人民代表大會制度。如果代表不能履行他們的職責(當輪到他們時,沒能生成區塊),他們會被除名,網路會選出新的超級節點來取代他們。DPOS 的出現最主要還是因為礦機的產生,大量的算力在不了解也不關心比特幣的人身上,類似演唱會的黃牛,大量囤票而絲毫不關心演唱會的內容。

PBFT:Practical Byzantine Fault Tolerance,實用拜占庭容錯演算法。

PBFT 是一種狀態機副本複製演算法,即服務作為狀態機進行建模,狀態機在分散式系統的不同節點進行副本複製。每個狀態機的副本都保存了服務的狀態,同時也實現了服務的操作。

將所有的副本組成的集合使用大寫字母 R 表示,使用0到 |R|-1 的整數表示每一個副本。為了描述方便,假設 |R|=3f+1,這裡 f 是有可能失效的副本的最大個數。儘管可以存在多於 3f+1 個副本,但是額外的副本除了降低性能之外不能提高可靠性。

以上主要是目前主流的共識演算法。

從時間上來看,這個順序也是按該共識演算法從誕生到熱門的順序來定。

對於 POW,直接讓比特幣成為了現實,並投入使用。而 POS 的存在主要來自經濟學上的考慮和創新。而最終由於專業礦工和礦機的存在,讓社區對這個標榜去中心化的演算法有了實質性的中心化擔憂,即傳聞60%~70%的算力集中在中國。

因此後來又出現 DPOS,這種不需要消耗太多額外的算力來進行礦池產出物的分配權益方式。但要說能起到替代作用,DPOS 來單獨替代 POW,POS 或者 POW+POS 也不太可能,畢竟存在即合理。每種演算法都在特定的時間段中有各自的考慮和意義,無論是技術上,還是業務上。

如果跳出技術者的角度,更多結合政治與經濟的思考方式在裡面,或許還會跳出更多的共識演算法,如結合類似 PPP 概念的共識方式,不僅能達到對惡意者的懲罰性質,還能達到最高效節約算力的目的也說不定。

至於說演算法的選擇,這裡引用萬達季總的這一段話作為結束。

一言以蔽之,共識最好的設計是模塊化,例如 Notary,共識演算法的選擇與應用場景高度相關,可信環境使用 Paxos 或者 Raft,帶許可的聯盟可使用 PBFT,非許可鏈可以是 POW、POS、Ripple 共識等,根據對手方信任度分級,自由選擇共識機制,這樣才是真的最優。

側鏈

側鏈,是對於某個主鏈的一個相對概念。英文為 sidechains。側鏈概念的提出主要是為了實現比特幣和其他數字資產在多個區塊鏈間的轉移,簡單的說,側鏈就是一種使貨幣在兩條區塊鏈間移動的機制。側鏈是以融合的方式實現加密貨幣金融生態的目標,而不是像其它加密貨幣一樣排斥現有的系統。利用側鏈,我們可以輕鬆的建立各種智能化的金融合約,股票、期貨、衍生品等等。

側鏈的產生

最開始,側鏈的出現是為了彌補比特幣區塊鏈運行中的一些問題,比如比特幣區塊鏈是一個單一原生的數字資產,不能與其他任何資產相兌換,以及在比特幣區塊鏈中,由於本身強大的共識機制反而導致交易緩慢等,這些都需要比特幣區塊鏈考慮是否進行技術上的升級,來滿足人們對區塊鏈更多的需求。

然而比特幣區塊鏈對整個系統的完備性和安全性都有很高的要求,對比特幣系統本身的升級改造需要很嚴密的驗證以及需要一個安全升級的途徑。為了滿足更多更新的需求,就需要一種輔助的區塊鏈。

首先,能夠實現將比特幣以一種虛擬的方式轉移到側鏈中,然後,不同的側鏈可以根據對應的需求進行針對性開發,以幫助比特幣區塊鏈或者說主鏈實現其他需求,而不需要主鏈頻繁的更新。

同時,在側鏈完成操作之後,在側鏈中的資產可以隨時的轉移回比特幣區塊鏈或者主鏈中,從而實現資產的安全迴流。由此就產生了開發側鏈的需求。

側鏈的原理

為了能夠實現側鏈,首先需要明確清晰的認識到側鏈的目的,在實現主鏈暫時不能勝任的新需求時,能夠將主鏈上的資產無縫的轉移到側鏈上,而且側鏈上的資產不是一種新的獨立的幣,因為如果每一種側鏈都引人一種新的數字貨幣,那麼,在主鏈向側鏈進行資產互通的過程中還要處理大量的匯率轉換問題。所以側鏈和主鏈使用統一的數字貨幣,貨幣的發行機制以及本身的安全性都由主鏈來整體維護,側鏈只需要關注技術上的創新就行了。

我們從實現的角度出發,當資產從 A 區塊鏈向 B 區塊鏈轉移時,我們在 A 鏈上創建一個鎖定資產的交易,然後在 B 鏈上創建一筆交易,該交易的輸入中包含一個密碼學證明憑證,來解鎖側鏈中的等值資產。而反過來操作的話,就是先將 B 鏈中的資產通過交易鎖定,然後在 A 鏈中將等值資產解鎖,來實現貨幣在不同區塊鏈中的轉移。

其中的 A 鏈我們稱之為主鏈,B 鏈則稱為側鏈。在某些模型中,兩條鏈可以對等地來處理。從概念上講,我們打算將資產從(初始)主鏈轉移到一條側鏈,可能會再轉移到別的側鏈,最終還能轉回至主鏈,並保全初始資產。一般我們把主鏈看成是比特幣系統,側鏈是其他區塊鏈中的某一個。

當然,側鏈中的幣也可以在側鏈間傳遞,並非只能與比特幣系統進行往來;不過,由於任何一個最初從比特幣系統移動的幣都可以移回去,所以不管變成什麼樣,它仍是個比特幣。

要完成轉移資產方式的實現,有一個難點,就是側鏈是如何知道資產已經在主鏈上完全鎖定了。逆向轉移同樣也需要考慮這個問題。在上面我們說過,要利用一個密碼學證明憑證。而這個證明機制其實就是利用之前在比特幣區塊鏈中提到的 SPV 證明,SPV 證明即簡單支付驗證,可以輕量級的驗證某一個支付的安全性,而不必獲取整個區塊鏈數據。

我們仍然以比特幣區塊鏈作為主鏈來講解,首先在主鏈上將主鏈幣發送至一個特定的輸出,這個特定的輸出包含了側鏈信息的特殊地址。然後在側鏈中利用 SPV 證明去驗證這個支付是可靠的,沒有出現雙花等安全性問題,之後就會在側鏈中產生一個來自主鏈的輸入,接收到這個輸入之後,就可以在側鏈中自由的使用這個資產了。

在這個兩種鏈之間資產轉移的過程中,我們需要兩個等待期來同步這兩個鏈。

分叉

因為區塊鏈是去中心化的數據結構,所以不同副本之間不能總是保持一致。區塊有可能在不同時間到達不同節點,導致節點有不同的區塊鏈視角。解決的辦法是,每一個節點總是選擇並嘗試延長代表累計了最大工作量證明的區塊鏈,也就是最長的或最大累計難度的鏈。

節點通過將記錄在每個區塊中的難度加總起來,得到建立這個鏈所要付出的工作量證明的總量。只要所有的節點選擇最長累計難度的區塊鏈,整個比特幣網路最終會收斂到一致的狀態。分叉即在不同區塊鏈間發生的臨時差異,當更多的區塊添加到了某個分叉中,這個問題便會迎刃而解。

手動製作自己的COIN

主要基於 Bitcoin 方式進行創建一個自己的 COIN,接下來我們了解下基本環境要求與編譯工具。

環境要求: Windows 10。

編譯環境:使用交叉編譯環境(因為 Windows 編譯環境相對比較麻煩,所以我們提供 VMware 鏡像包文件,用戶可以通過鏡像包進行一鍵導入使用。為了保證編譯速度,建議使用4G或以上內存進行編譯)。

當前編譯環境是最新版的,如要升級編譯組件建議使用官網的 OpenSSL 與 QR Code 進行升級。

書寫工具: Sublime。

製做流程如下圖所示。

具體實例我們使用一個現有的項目進行解讀,最終錢包圖如下所示。

註:以上 TCO 項目為公網源碼開放項目,與本教程沒有任何關係,具體代碼地址可以通過 GitHub 進行下載或是查看學習。

創世塊修改

使用 Sublime 打開 SRC 目錄下面的 chainparams.cpp 文件。從156行開始,具體代碼如下。

第一步先將 genesis.nNonce、hashGenesisBlock、genesis.hashMerkleRoot 設為0,然後編譯,編譯生成 EXE 應用程序後,運行錢包文件後會提示程序錯誤,此時沒有關係,我們打開 C 盤 APPDATA 裡面進行查看要 Debug 文件,裡面會記錄信息,然後把以上三個值的信息以同樣的格式寫到 chainparams.cpp 文件裡面。

修改網路魔數

網路魔數非常重要,直接關係到區塊網路的安全性問題。

具體代碼如下。

比如,比特幣的魔數是 0xd9b48ef9 這個值,當用戶發生交易或是連接時候,用戶可以通過抓包軟體進行分析查看當前網路報文前綴內容,所以這個值非常重要,一方面可以區分不同鏈之類的信息,另一方面可以方便調試人員進行數據抓包調試。

修改前綴地址

具體代碼如下。

前綴地址指的是用戶收款地址的前綴,一般建議進行修改,具體修改對照表。

用戶可以訪問這裡進行對接轉換。

修改網路連接埠

具體代碼如下。

修改種子連接數

打開 chainparams.cpp文件,從 240行開始,具體代碼如下。

用戶可以把註解去掉。這個功能主要用於種子節點的,最好選擇 VPS 或雲主機,同時保證伺服器必須是7X24小時開機的,建議使用二級域名方式。

修改工作模式機制

打開源碼文件 miner.cpp,核心代碼如下。

函數 BitcoinMiner() 裡面創建新的 block,設定時間戳,獲取 mempool 裡面的最新交易,調用 ScanHash() 搜索隨機數。

注意:獨立挖礦的條件可以 chainparams.cpp 裡面設置。

挖礦代碼如下。

代碼預置的 Hash 演算法(sha256、scrypt等),用戶可以通過 block 的版本區分,那麼在 scanhash 裡面調用 ComputePowHash 的時候,可以選擇不同的 POW 演算法,甚至你可以把這些演算法串聯起來進行加密。

修改獎勵機制

修改挖礦獎勵的成熟時間,源代碼請訪問 main.h。

修改交易確認塊數推薦值,源代碼請訪問 qt/transactionrecord.h,核心代碼如下。

修改難度配置

修改難度配置,請訪問源文件 chainparams.cpp,核心代碼如下。

下面解釋下幾處重要的代碼。

A.bnProofOfWorkLimit=~uint256(0) >> 32;是一個大整數(256 bit)表示,前面32個位數是0,這個參數表示全網允許的最小難度,低於這個難度的 block 是不會被挖掘的。

B.nGenesisSubsidy = 100;表示初始津貼,比特幣的第一個塊的獎勵是50個 BTC。

C.nSubsidyHavlingInterval = 210000; 這個參數決定了多少個 block 以後比特幣的獎勵(補貼,挖礦獎勵)會減半。這個參數結合初始獎勵(比如比特幣50)基本可以估算全網總的貨幣產量(比如比特幣的2100萬),這個初始津貼也是可以配置的,如 B 所示。比如比特幣,一個等比數列求和公式就可以計算貨幣總量 50(1/(1 - 0.5))*210000=2100萬 BTC。

上面兩個參數在查詢區塊獎勵的時候用到,請查看 main.cpp 的 GetBlockValue(height, fees) 找到細節。

幣總量,請查看 srcmain.cpp 裡面的951行處代碼。

D.難度調節周期請見以下兩處代碼。

這裡的設置是60分鐘(3600秒,因為預期60秒鐘1個 block,那麼就是60個 blocks 後計算新難度,否則使用上一個 block 的難度),重新評估難度,下一個塊的挖掘可能就要使用新的難度設置了。

修改界面

用戶可以通過 QT 進行設計。主要的文件請訪問 srcqt,語言包文件為 srcqtlocale。

接下來,我們看看 POS 與 POW 模式切換修改。

取消 POS 挖礦的幣量代碼如下。

修改成為:

那就意味著 POS 利息變成0,如果還想使用 POW+POS 這些代碼可以不用修改。

特別聲明:本教程通過技術視角進行講解與說明,任何個人與組織不得通過教程內容進行一些金融或是發布 COIN 等活動。

註:投資有風險入市需謹慎。沒有應用的區塊鏈項目都是高風險的行為。

想和作者做進一步的溝通嗎?

想要獲得更多的乾貨指導嗎?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN技術頭條 的精彩文章:

從原理到策略演算法再到架構產品看推薦系統

TAG:CSDN技術頭條 |