進階篇:帶你真正從0 1認識區塊鏈、比特幣和側鏈技術
這是司馬特小分隊第12篇原創文章
上篇文章的效果出乎我的意料,看了下後台數據自然轉發人數有60人之多(基礎篇點此進入),閱讀量也有700多還可以,當然跟大號還是沒法比。凡事預則立,不預則廢~歡迎大家多多關注,么么噠~
——比特幣進階篇——
1.1、在比特幣世界中一定要重點講一下「礦工」——這個在虛擬幣世界中很神奇的角色。
我們在上一篇中大致介紹了礦工的工作內容,這裡做一些補充:
礦工在比特幣中扮演著舉足輕重的地方,因為這套系統要想運作下去,要想有人記賬、要想不斷生成區塊,就必須需要礦工。從創世區塊(第一個區塊)的第一階段規定每個區塊產生50個新的比特幣用於獎勵礦工的記賬行為。此獎勵每四年減半一次,經過長年累月後最終通過挖礦獲得的比特幣將無限趨近於0。最終比特幣總量約為2100萬。另外礦工必須依照一個原則:那就是一旦有新的區塊廣播了,必須停下手上的採礦行為,開始以新區塊為父區塊計算下一個區塊了。
可以看到比特幣挖礦是一個利益驅動的行為,利益越高的交易,節點會優先把這筆交易納入到最新的區塊中,礦工會優先記錄他。這符合了市場追逐利益的本質
另外關於比特幣的區塊還需要做如下解釋:
比特幣區塊大小限制目前為1MB,區塊頭是80位元組,平均每筆交易至少是250位元組,1M空間差不多能寫入4096筆交易,按平均十分鐘生成一個區塊,每秒交易上限約為7筆。
那麼為什麼要限定區塊大小呢?
比特幣中的限定,包含區塊大小、區塊生成時間,均為了降低並發性,以減少數據衝突或錯誤的可能性。在比特幣建立初期,受限於網路、存儲空間、處理器速度等問題,將區塊大小先定位1MB。目前大多數區塊仍達不到限定容積。但隨著時間推移,交易量增加,而挖礦獎勵減少,礦工不得不通過講更多交易融入一個區塊中以獲取更多手續費時,區塊容積不足的問題將凸顯出來。而區塊的增加導致廣播(新區塊傳輸至全網)時間延長,這將造成礦工在無效、廢棄區塊上消耗的能源增加。而當礦工挖礦收益不足以支撐能源消耗後,挖礦行為將大幅度減少。而用戶為了保證交易儘快確認,不得不提高手續費,導致交易成本增加。因此是否增加區塊大小仍在爭論中~當然區塊大小增加很直觀的一個問題就是下載數據的時間大大增加
1.2、比特幣的交易:
在比特幣世界中因為沒有中心化機構進行賬本記錄,所以其實你是不知道餘額,交易時必須要驗證是否有足夠餘額可供支出、是否存在雙花、腳本能否通過等等,通常由運行節點的礦工來完成。
中心化的賬本管理以支付寶為例,比如支付寶存儲了我的餘額100,我要花50,只要支付寶判斷下我的賬戶餘額有沒有50元,加上我的授權,就可以直接支付了。但是在這裡,必須要做到每筆交易都可溯源,為什麼?因為沒有一個所謂的賬戶中心來記錄你有多少餘額,是不是有足夠多的錢可進行交易,只能通過你的歷史交易來計算是否滿足交易條件。這個過程需要遍歷完整的區塊鏈數據才行。
說到比特幣交易,這裡必須要講一個概念:「非對稱公私鑰」。
每個人都有2個密鑰,一個「私鑰」由系統自動生成的;然後通過「私鑰」生成對應的唯一「公鑰」。公鑰是公開的,而私鑰只有自己手裡有。一個賬戶用公鑰加密後只能通過自己的私鑰進行解密。當然由於私鑰轉化成公鑰是不可逆的,所以公鑰是無法反推出私鑰的。
可能你很好奇這個原理:
舉個很簡單的例子:比如A隨機生成2個質數(147、343),組合成一個6位數的私鑰「147343」,公鑰則是2個數相乘147*343=50421,當A只想讓某個數據只能被B修改時,他可以在這個數據後加上公鑰「50421」,並聲明只有私鑰左三位乘以右三位等於公鑰時,才可以修改這個數據。如果是一個黑客,那隻能採用枚舉法進行不斷的嘗試,當這個規則足夠複雜的時候,其實是很難破解的,因此可以說只有B拿到A的公鑰才能解開,保證了安全性。
而在比特幣系統里,則是將一個人的公鑰作為他的收款賬號(或者是地址)。於是我們模擬這樣一個場景,A把5個比特幣轉給B,他只要輸入附帶上B的公鑰,那麼系統會自動幫你把這筆「幣」用B的公鑰鎖定,這樣這筆「幣」就默認屬於B了,但是可能是鎖定狀態無法使用。只有當B用自己的私鑰解開後,這筆「幣」也算真正劃撥到B的收款賬戶(地址)上,B才能使用。
所以簡單理解來說,私鑰就相當於你的賬戶密碼,只有你有許可權解開和移動比特幣。它保證了交易的安全性。
1.3、比特幣錢包:
比特幣錢包中存放的是一張張有面值的「一次性支票」(未花費的交易輸出UTXO)和對應的「印章」(私鑰)
每筆交易都有若干個Tx_in(交易輸入)和Tx_out(交易輸出)
交易輸入:說白了就是資金來源,一種是挖礦獎勵,出現在每個區塊的第一筆交易中;另一種是之前交易給自己的還沒有使用的資金,而它本質上也是上一個交易的輸出;
交易輸出:就是資金去向,一種是已經交易出去的金額;另一種已經在另一個人名下,但是他還沒使用,或者說還在凍結狀態的資金。本質上這兩者都不屬於你了,你已經沒有支配權了。
用戶錢包中的比特幣實際上是用戶擁有支配權的、且尚未花費的Tx_out中記錄的金額總和,即用戶可支配的所有UTXO金額之和。完整的錢包中應存有若干個UTXO和支配每個UTXO時所對應的私鑰。
當一個用戶安裝了第三方的錢包後,下載全網所有比特幣區塊數據,然後在本地存儲所有的UTXO,然後就可以開心地在錢包里查詢自己地址下的UTXO數據啦。
——————
聰明的你於是又提出了一個問題,怎麼在錢包下載數據的時候保證數據的準確性和完整性,或者說驗證某筆交易是否真實存在?
因為下載數據的時候都是從周邊節點下載的,但是可能存在周邊節點數據不準確的情況,或者在下載過程中出現數據丟失,從而導致下載後的數據是不準確的。
這個時候就需要去驗證數據準確性了。
我們知道驗證某筆交易的有效性或者數據的準確性,其實就是驗證那筆交易是否已經收錄於有效區塊鏈中,並得到了6次確認。
那麼最最常規的方法:我們可以通過下載全部數據(區塊體中包含了所有交易數據),然後和可信鏈路上的數據進行一一比對,來確保某一筆交易的準確性。
但是很顯然,下載一個幾十G的數據包實在是太浪費時間和空間了,況且一旦出錯,又得重新下載一次全部數據。我覺得是個人應該都會瘋~
針對這個問題,聰明的聰老師採用了更為「優美」的SPV驗證。
那麼什麼是SPV驗證呢?SPV又叫簡單支付驗證。它不需要下載所有數據,只需要保存所有區塊頭數據就可以驗證某筆交易了。那麼這到底是怎麼實現的呢?
說到SPV就要講到Merkle樹了,因為SPV驗證離不開Merkle樹。
我們前面有張圖區塊頭裡包含了Merkle根(說白了就是個哈希值,見上圖),Merkle根哈希是怎麼算出來的?
在點對點網路數據傳輸時,會從多個節點上下載數據,如果每次都下載所有數據,那麼就太耗資源了,更好的方式是把所有數據拆分成一小塊一小塊數據。這樣的好處是,如果小塊數據在傳輸過程中損壞了,那麼只要重新下載這一小塊數據就行了,不用重新下載整個文件。
接著我們對每個小數據塊做哈希(或者叫SPV節點),然後把相鄰2個小塊數據的Hash值拼到一起,然後對這個長字元串在作一次Hash運算,不斷地組合、哈希進行遞歸,最後得到整個樹的根Hash(Top Hash or Root Hash)
那麼回到主問題「怎麼驗證某筆交易是否真實存在?」
聰明的你肯定能想到:很簡單啊,先從可信數據源(最長主鏈)得到該筆交易所在區塊的Merkle根哈希,然後跟下載下來的Merkle根哈希進行比較,如果一致,那麼就說明所有數據都是準確的。
那麼怎麼定位這筆交易在哪個區塊中?
比特幣提供了一種叫做布隆過濾器(Bloom filter)的功能,節點會在通信鏈路上建立一個這樣的過濾器,限制只接受含有目標地址的交易,從而能過濾掉大量不相關的數據,減少客戶端不必要的下載量。比如,SPV節點會收到少於1KB的有關區塊頭和Merkle路徑的數據,其數據量只約佔一個完整區塊(目前大約1MB)的千分之一。根據該交易的hash和某個區塊的Merkle路徑上的數據進行比對,就能知道是否在該區塊中。
那麼假如根hash不一致呢?下載下來的數據到底哪裡出問題了呢?
比如:8對應的數據被人篡改,通過Merkle Tree很容易定位找到問題在8處,因為哈希樹可以通過一條分支1—2—4—8的哈希值的比對驗證來定位。
——區塊鏈的延伸及發展——
其實現在的比特幣都屬於公有鏈,即只要有一台礦機,誰都可以加入其中。於是乎就有人想針對某個群體、某類組織內部建立一套區塊鏈系統,不對外開放~
2.1、聯盟鏈:區塊鏈受預選節點(特定機構/人)控制,預選節點打包區塊後,獲得超過半數的節點認可即可確認,允許某個人或固定參與者可讀取。
聯盟鏈的優勢和劣勢:
(1)節點減少後可以有效減少分叉產生的可能性。在節點大幅度減少的情況下,生成區塊的時間可以大大縮短。
(2)預選節點可以減少公眾對於區塊鏈的控制權,從而使得區塊鏈可以更好的為各種應用服務。
當然很明顯,它也有自己的缺點,那就是失去了真正的中心化記賬,由於其有限的節點,很可能出現超過50%以上節點竄通後篡改數據,而失去了公正性。
馬特查詢了下聯盟鏈的應用案例,發現馬爸爸早已開始布局了。
阿里巴巴打造了透明可追溯的跨境商品供應鏈,即為每個跨境跨境商品生成一條特定聯盟鏈。商品生產廠商、商品檢測機構、境外海關、境內海關、物流公司等作為預選節點。用戶可通過開放API查詢商品從生成到送達的全過程。
2.2、私有鏈:寫入許可權完全掌握在一個組織手中的區塊鏈。讀取許可權或開放或進行限制.
隨著比特幣、以太幣、以及各種山寨幣的橫空出世,投資者手頭上就開始囤積各種類型的幣了,就好像既買了美元,又買了人名幣,毫無疑問美元和人民幣之間的兌換需求隨之而來。但是兩種不同的代幣就像2個完全不同的系統,都是獨立運行的,怎麼實現幣幣交易呢?
2.3、於是出現了側鏈(Sidechains)技術,我們先來了解下側鏈的概念:
側鏈是一種特殊的區塊鏈。它使用一種叫做「SPV 楔入」的技術實現與其他區塊鏈之間的資產轉移,這使得用戶能用已有的資產來使用新的加密貨幣系統。並且由於側鏈是一個獨立的、隔離的系統,側鏈中出現的嚴重問題只會影響側鏈本身,這極大地降低了創新的風險和成本。目前,側鏈技術主要是由Blockstream公司負責開發。
側鏈只要理解它的2個要素就可以了:
(1)側鏈是獨立於主鏈的存在,側鏈中的交易不影響主鏈,主鏈中的交易也不影響側鏈。
(2)實現雙向錨定。什麼意思?
舉個簡單的例子:比特幣(主鏈)的持有者A發起一筆交易給B,如果B又是以太坊(側鏈)的一個節點(B的地址包含比特幣系統的地址和側鏈以太坊的地址,兩者是互相映射的),那麼按照我們前面講的,A 交易給B 5個比特幣後先被鎖定,同時側鏈會產生一個輸入來源為主鏈的交易,B在側鏈的地址上會按照對應的比例(假如比例是5:8)解鎖8個以太幣,說白了B的資產從主鏈的地址上轉移到了側鏈的地址上。
這時作為交換,假如B要把8個以太幣給A。
我們知道主鏈比特幣上是無法創建和流通比特幣以外的其他幣的,所以理論上B只能把8個以太幣在側鏈上轉移到A的側鏈的地址上,然後A的8個以太幣被鎖定,同時主鏈會產生一個輸入來源為側鏈的交易,A在主鏈上之前鎖定的5個比特幣就解鎖了,A可以在主鏈上轉移這5個比特幣了。
這就是雙向錨定。主鏈錨定側鏈,側鏈錨定主鏈。
但是這裡需要說明一點:側鏈一旦出現安全事故導致解開比特幣的私鑰遺失,那麼這個比特幣也就無法找回了。
側鏈技術進一步擴展了區塊鏈技術的應用範圍和創新空間,使傳統區塊鏈可以支持多種資產類型,以及小微支付、智能合約、安全處理機制、真實世界財產註冊等,並可以增強區塊鏈的隱私保護。
那麼它目前有相應的應用嗎?
以火幣網(一個比特幣和代幣的交易中心,類似上海證券交易所)為例,要完成幣幣交易,需要比特幣錢包中的BTC轉到火幣網的BTC地址上,然後通過火幣網進行交易,這裡火幣網的角色其實是幫你代為保管比特幣、資金,同時保證交易安全性的第三方機構。
一般來說在火幣網這種虛擬幣交易平台上,一個賣家想要出售比特幣,那麼他必須先把BTC打到火幣網的地址上,然後買家在平台上針對這個出售單進行購買,錢直接打給該賣家,賣家收到錢後進行確認,然後平台會把該幣轉移給買家。
那麼火幣網是怎麼實現幣幣交易這個過程的,這裡有兩種方式供大家參考:
1、火幣網在各個幣種的區塊鏈上開一個節點,通過哈希鎖定實現幣幣交易
2、火幣網自己開一條側鏈,然後在側鏈中根據多條主鏈的要求自行進行交易
大家可以自行腦補結合下前面的知識點,思考這兩個方式。
2.4、中繼鏈(relays):在A.B兩個鏈中,存在第三方數據結構C,那麼這個C就是A和B的中繼,如果C也是區塊鏈結構,那麼就稱relay-chain。實現方式為:當檢測到A鏈中發生了某個事件,或者在特定時間內,A鏈中的某個對象包含了一個特定值,將在B鏈執行某個智能合約。假設進行比特幣和以太幣交易時,設定在某個X時間內,比特幣主鏈中確認了這筆交易,則通過中繼鏈,將在以太幣鏈中執行交易。
簡單來說中繼鏈和側鏈差不多~
2.5、哈希鎖定(Hash-locking):A和B進行比特幣和以太幣交易。A隨機生成一個數值,經過hash計算後發送給B。A和B都遵守以下智能合約來鎖定他們的資產(A先鎖定,B在A鎖定成功後鎖定):設定一個時間X,對於A的資產,如果有人能在2X時間內猜出這個隨機數值,那麼資產將被轉移到B,否則將返還給A;對於B的資產,如果有人能在X時間內猜出這個隨機數值,那麼資產將被轉移給A,否則將返還給B。此時,A在X時間內將這個隨機數值提供給B,以確保B的資產能轉移給A,在這個過程中,就確保了B知道這個隨機數值,那麼B就可以提供這個隨機數值給A,在2X時間內獲得A轉移給B的資產。
哈希鎖定的本質是在私鑰的基礎再加一層鎖,保證交易的公正性。
進階篇的內容基本上講到這裡也差不多了。下一篇我們將選擇1~2個行業和領域,深度解析到底該如何應用區塊鏈技術,怎麼改變現有的痛點,以及怎樣實現商業價值。盡請期待~
參考文獻:
1、chehw的《SPV、SPV節點和SPV錢包》
2、zerok775《Merkle Tree演算法詳解》
TAG:司馬特小分隊 |