1. 程式人生 > >Bitcoin 比特幣 Blockchain 區塊鏈 基礎技術解釋

Bitcoin 比特幣 Blockchain 區塊鏈 基礎技術解釋

前言:

好長時間沒寫Blog了,因為都在搞Bitcoin這玩意,現在網上大部分都是些概念性的東西,真正的實質內容不多,聽到最多的詞就是去中心化,去第三方,這對於理解比特幣或是區塊鏈技術根本沒有半毛錢的幫助,因此我在這總結下關於比特幣的種種。

比特幣,區塊鏈簡述:

這個簡述主要是為了讓大家有個概念,以便能接受接下來的各種解釋。

比特幣:

首先,什麼是比特幣?網上傳的神乎其技,什麼虛擬貨幣,什麼全球通用的加密網際網路貨幣,聽上去牛到不行。看上去像是加密型的支付寶,或者電子美元什麼的。其實和其餘電子貨幣相比,Paypal,支付寶等屬於支付平臺,其中的錢都和真實的錢掛鉤,存1元,賬戶才有一元,而比特幣一類的電子貨幣是一種特殊的貨幣,你可以理解為美元,歐元等外國的貨幣,但是外國的貨幣都是有外國國家政府擔保,國內的貨幣有國內政府擔保才能發行,能被大家認可。而比特幣卻是由程式做擔保,由程式所創造,一旦比特幣一類的貨幣上線,便不是個人或者創始者能控制的事情了,一切都是按照程式來走,或是按照大家的共識來改變。

另外提一句,各國不承認比特幣十有八九就是因為不可控,不能隨便印刷。

區塊鏈:

區塊鏈是種技術,剛剛起步的技術,很多地方都需要完善,因此很多東西都很模糊。

上圖是一個比特幣的交易過程,區塊裡存的是10分鐘之內的所有交易內容,因此每10分鐘更新一次,區塊間相互聯絡形成一個鏈。網路節點可以理解為一個數據庫,每個節點都包含了比特幣的所有交易資訊,而且相互連線,形成一個比特幣的區塊鏈。

總結:

總而言之,比特幣是一種虛擬的貨幣,和一切的實體的有價值的東西都不掛鉤的虛擬貨幣。區塊鏈是一種承載比特幣網路的技術。

錢包:

支付寶存錢你要有個賬戶,銀行存錢也得有個銀行卡,而比特幣中用的是錢包。何為比特幣錢包,說白了,就是一串隨機的256位數字,代表私鑰。而一旦你的私鑰掉了,任意一人都能隨便的使用你的賬戶。私鑰能進一步轉換成公鑰和比特幣的交易地址。


私鑰經過橢圓曲線演算法得出公鑰,這裡要提一下,中本聰真的是厲害,稜鏡門曝光的雙橢圓曲線(Dual Elliptic Curve)演算法有認為後面,中本聰不知是運氣還是實力,沒選用這種國際通用的曲線演算法,而是自己另找一條。之後公鑰進過雜湊能得到地址。地址是比特幣交易時唯一暴露的與個人資訊有關的東西,而私鑰的兩次加密方式都是非對稱加密,因此完全不用擔心任何個人資訊被洩露。

交易:

關於交易,首先我們得知道幾個比特幣中的概念:

UXTO:

又稱未花費支出。本質上是一串獨一無二的字串,但是代表了一定面值的比特幣,本身可以再分割成面值更小的比特幣。在比特幣中充當貨幣的作用,最大分割面值是10^-8,稱為1聰。下圖就是一筆交易中分割UTXO的演示:


優點:防止貨幣被二次使用,可以對每個貨幣進行追蹤,防止莫名其妙的出現貨幣,有人民幣上的號碼一樣的作用。

缺點:交易會收取手續費,分割的太頻繁,現在導致區塊鏈的越來越龐大(雖然和現階段金融領域的一天幾T沒法比,但是相較於過去數年的資料,現在已經是爆炸性增長了。)

鎖定指令碼:

一串指令碼,用於鎖定UTXO,並等待滿足解鎖條件後再解鎖這個UTXO的使用。在比特幣領域,用於鎖定UTXO,解鎖條件為拿出一個簽名和被轉賬公開地址能匹配的,就轉給他。傳送方進行指令碼的製作。

解鎖指令碼:

用於滿足鎖定指令碼的一系列條件。在比特幣中就是簽名育公開地址匹配。接收方進行指令碼的製作。

交易流程:

假設傳送方A要進行交易,轉給接收方B比特幣。

1.建立交易:

個人使用者一般是訪問節點,得到錢包中還有哪些UTXO可以使用,尋找,拼湊或分解得到想要交易的UTXO值,並且得到B的地址。使用鎖定指令碼鎖定UTXO的使用權,釋出到比特幣網路中的任一節點。當然別忘了,每筆交易都是要手續費的。

2.廣播:

任一節點收到一條交易資訊都會進行廣播,給比特幣網路中的其餘節點,直到所有節點都接收到這條訊息。因此就等B連線至進入比特幣網路,確認這筆交易,具體步驟就行進行簽名,使用解鎖指令碼,解鎖被鎖定的UTXO,10分鐘之內,所有節點都會記錄這筆賬,也就真正的成交了。

3.結尾

這樣就會被記錄在案,這是普通使用者所需要知道的交易流程,而身為比特幣節點的所有者,也就是礦工,所需要做的也就複雜的多了。

節點:

前面說到,比特幣是種憑空被創造出來的貨幣,那麼既然是創造,也得按照基本法來創造。在比特幣的世界中,一般是節點上的礦工們能獲得被創造的貨幣。因為有利益,因此礦工樂此不疲的配置節點,幫助完成交易。那麼身為一個節點,到底要做哪些事情,怎麼得到貨幣,首先你要了解這些事情:

區塊:

首先要了解,交易最基本的儲存形式,就是區塊。

上圖為一個區塊的大致結構,其中區塊頭中有:

總結下,就是說,所有的交易資訊,從時間,金額,地址以及交易時的各種引數都是存放在區塊中的。

區塊鏈:

多了個鏈子,顧名思義就是將各個區塊以某種方式相連起來,如下圖:

隨機數是為了工作量證明準備的(後面會提到)。每個新區塊都會加上上一區塊的雜湊雜湊,並且生成一個新的雜湊雜湊,一是為了節點之間相互驗證完整性,二是讓交易變得可追溯,使得記錄無法修改(或修改成本過高)。這樣變形成了一個區塊鏈。

工作量證明:

區塊是10分鐘生成一個,每人記自己的帳肯定會亂掉,因此記賬人只能有一個。現在比特幣10分鐘25枚,1枚寫這篇文章時應該是6000+RMB左右,足以讓大家都拼了命的去記賬。因此如何確立一個記賬人便是個問題,比特幣引入了工作量證明系統。

首先區塊要使用到雜湊計算中的隨機數,因此當前區塊的雜湊雜湊計算是:上一區塊的雜湊+當前區塊+隨機數=當前區塊的雜湊雜湊。工作量證明便是要求得出的當前區塊的雜湊雜湊必須要滿足一定條件,比如:前面幾位要都是0。因為雜湊雜湊是單向運算,運算結果是什麼也是在運算前無法得知的,因此只能通過大量的運算去猜這個隨機數,而第一個釋出該隨機數的便能得到所有節點的認可。

合約:

比特幣中有點抽象化的東西,是種大家都認可的規則。就比如說,比特幣中工作量證明就是種合約,大家相約好,誰先找到這個隨機數,比特幣就歸誰。即使有人或有節點不認可,但是大部分節點都會認可,因此不認可正確合約的節點就被排除在外了。如果有喪心病狂的攻擊者,湊齊了>50%的節點,按照比特幣的這種情況,也只會導致攻擊成本和收益不成正比。

區塊建立步驟:

1.節點接受交易資訊,具體接受解鎖指令碼和鎖定指令碼,配成一對得到交易資訊。

2.與上一塊的交易摘要(也就是雜湊雜湊)和隨機數一起進行雜湊計算,滿足工作量證明就廣播,沒滿足繼續。

3.如果別的節點優先滿足了工作量證明,驗證交易資訊是否正確,驗證工作量證明是否正確,正確遍更新區塊。

以上步驟俗稱挖礦。

番外:

因為區塊鏈技術也是剛剛起步,比特幣也只是作為區塊鏈起步的試驗品而已,因此比特幣的整個系統也不是特別的完備,也是有很多改進的空間的。這裡介紹幾種現在比較流行的變體。

區塊鏈:

公有鏈:

類似比特幣的系統,人人滿足一定條件就可以做節點,系統對每個人都是開放的。

許可鏈/聯盟鏈:

節點需要經過認可,因此安全性有保障的區塊鏈,半開放式,外界可以使用,但是可能有一定限制,例如銀行之間建立的區塊鏈。

私有鏈:

顧名思義,類似於公司內部的區塊鏈,私有節點。

工作量證明替代:

權益證明:

這裡要引入一個幣齡的概念,持有10幣2年=20年幣齡。區塊鏈以現在的技術,唯一可能攻破的只有雙花攻擊,而雙花攻擊的基本條件是要連續算出數個區塊。因此權益證明引入了幣齡的概念,為了防止同一個節點連續算出區塊。權益證明使用幣齡來控制工作量的難度,幣齡越大,計算量難度越小,幣齡越小,計算量難度越大。並且當一個節點更新區塊後,此節點的所有幣齡都重新計算。

委任權益證明:

更進一步了,只要 算力滿足一定條件,便能被投票變成記賬人中的一員,輪流進行記賬。如果有人錯過了記賬的時候,或者亂記賬,則會被去掉記賬人身份。另外,每個記賬人都需要預先繳納100倍的保證金。

交易方式:

比特幣中使用的是P2PKH,pay to public key hash,需要傳送方一個鎖定指令碼,接收方一個解鎖指令碼。而今可以替換成另一種交易方式p2sh,pay to script hash,這種交易方式僅僅需要交易方傳送一個Hash雜湊,接收方生成指令碼(贖回指令碼),因此極大的減輕了伺服器的負擔。