當前位置:
首頁 > 最新 > 簡單比特幣原理-區塊鏈的相關應用

簡單比特幣原理-區塊鏈的相關應用

簡單比特幣原理-區塊鏈的相關應用一.引言

比特幣(英語:Bitcoin[注 2])是一種去中心化,非普遍全球可支付的電子加密貨幣[6]。比特幣由中本聰(又譯中本哲史)[注 3](化名)於2009年1月3日,基於無國界的對等網路,用共識主動性開源軟體發明創立。截至2018年1月14日,比特幣是目前市場總值最高的加密貨幣[7]。任何人皆可參與比特幣活動,可以通過稱為挖礦[注 4]的電腦運算來發行。比特幣協議數量上限為2100萬個,以避免通貨膨脹問題。使用比特幣是通過私鑰作為數字簽名,允許個人直接支付給他人,不需經過如銀行、清算中心、證券商等第三方機構,從而避免了高手續費、繁瑣流程以及受監管性的問題[8],任何用戶只要擁有可連接互聯網的數字設備皆可使用。關於區塊鏈,幾乎所有的技術在比特幣之前都已經有了,但是在比特幣之前,沒有人覺得它能用,所以說比特幣是區塊鏈技術的第一個成功的應用,從某種程度講,說比特幣是第一個區塊鏈並無不妥。

接下來以一個虛構的案例簡單解釋比特幣的原理以及區塊鏈技術的簡單應用。

二.一個簡單的案例

A,B,C,D,E五人現整租了一套房,他們之間經常有金錢上的往來,為統一結算,每個月期間產生的費用(水電氣以及房租)以及其他資金借貸約定在月底統一進行結算。於是,為了記錄費用,五人將日常支出記錄在客廳的白板上。

有一天,A與B出門購物,A忘記帶手機與現金,由B付了兩人的購物款1000元(包括A的購物款500元)。於是B說,記到白板上吧,月底再一起付給我。所以,A在客廳的白板上記下:

類似的,白板記錄的後方又添加了如下的一些記錄:

誰都可以在白板上留下記錄,但是有一天D的朋友來訪,為了惡作劇,在客廳的白板上添加了一條記錄:

幸虧A發現了這是一條虛假的記錄,否則在月底,A就需要無緣無故的付給D多餘的50元。為了防止類似的事情在此發生,記賬的時候,每一條記錄付款的一方需要在記錄後方簽名表示確認該條記錄的真實性。如下所示:(X"s signature表示該人的簽名)

後面記錄太多了,白板上已經記錄不下了,於是他們決定使用計算機進行記賬。但是在計算機上就不在能夠使用手寫的簽名,一是在計算機上不方便進行手寫,二是手寫的簽名在計算機上能夠輕易的被複制偽造。所以在計算機上的簽名應當是針對於計算機的數字簽名。

數字簽名手寫簽名一樣要滿足對應性的要求,也就是說,每個數字簽名只能用作於與其對應的數字記錄,不能用作於其他記錄。例如:

A需要付500元給B的數字簽名signature1不能用作於A需要付300元給C的數字簽名。雖然這兩條付款記錄的付款者都是A,但是付款的內容不一樣,數字簽名必須與內容嚴格對應,如果原來的內容發生了改變,則對應的數字簽名應當失效。例如將A需要付500元給B改為A需要付501元給B,則對應的signature1應當失效。

數字簽名一般採用哈希(hash)演算法,哈希演算法的實現有很多種,由於有部分哈希演算法有缺陷,所以採用了SHA256的方式,在目前公開的資料上,還沒有資料顯示SHA256有缺陷。

SHA意思是安全哈希演算法(Secure Hash Algorithm),256表示無論輸入什麼值,這個演算法的計算結果都是一個包含256位數的二進位數。如果把A需要付500元給B輸入SHA256函數,那麼應該得到的結果轉換為16進位應該為:

如果改動一個字或者多加一個空格或者標點,對應得到的結果如下:

可以看到只要發生了任何改動即使是微小的改動,結算的結果也將完全不同,另外需要注意的是,只要該條記錄的內容不變,通過SHA256得到的計算結果總是一致的。

SHA256函數有很多在線工具可以生成,詳情可以參考:Hash在線計算

使用SHA256的計算結果作為每條記錄的簽名可以保證簽名與記錄的內容完全對應,但是,這還不夠,因為數字簽名與手寫簽名一樣,除了需要滿足對應性的要求,還需要滿足可鑒別的要求。

可鑒別指的是,對於任何一個簽名,比如B需要付400元給D對應的簽名中必須能夠判斷這是B的簽名而不是D或者其他人的簽名。而SHA256是一個公開的函數,無論誰輸入B需要付400元給D都可以得到相同的結果,那麼如何使得數字簽名擁有可鑒別的屬性呢?於是他們想出了一個方法:採用非對稱加密對SHA256的計算結果進行加密,把加密之後的結果作為每條記錄的簽名。

三.了解什麼是加密

很多人喜歡用123456作為他個人的某些賬號的密碼,將每個數字加上2得到345678,這就是一種最簡單的加密。而解密則是一個相反的過程,將加密後的結果每個數字減2就可以得到加密前的結果。加密和解密都用到的數字2稱作為密鑰,加密和解密可以理解為一個計算過程,而密鑰則作為計算過程中的一個參數。計算機將需要加密的內容和參數一起輸入到加密的算式中,就得到加密後的結果。由於加密和解密使用的是相同的密鑰,這種加密方法稱作為對稱加密

而在非對稱加密中,加密和解密使用的是不同的密鑰,如下所示:加密時用到的密鑰稱為私鑰,私鑰不能公開,只能加密方自己知道,解密時用到的密鑰成為公鑰,公鑰可以將加密後的內容解密得到加密前的結果。公鑰是將私鑰輸入某個算式計算得出的,通過私鑰可以計算出公鑰,但是通過公鑰不能計算出私鑰。

接下來看看使用非對稱加密是如何使得簽名變得可鑒別:

Because:

SHA256("原始記錄")=哈希值

解密(加密後的哈希值)=哈希值1

SHA256("接收的記錄")=哈希值2

哈希值=哈希值1

哈希值1=哈希值2

Result:

哈希值=哈希值2

原始記錄=接收的記錄

類似的,付款方將其交易記錄放入SHA256函數進行計算得到哈希值,然後使用自己的私鑰對哈希值進行加密,其他人根據記錄內容,付款方的公鑰就可以判斷這個簽名是否對應於內容是否是付款方的簽名,現在這個賬本可以正常運作起來,但是還是有很多的漏洞,只適用於小範圍的使用。

四.關於Bitcoin

A purely peer-to-peer version of electronic cash would allow online payments to be sent directly from one party to another without going through a financial institution. Digital signatures provide part of the solution, but the main benefits are lost if a trusted third party is still required to prevent double-spending. We propose a solution to the double-spending problem using a peer-to-peer network. The network timestamps transactions by hashing them into an ongoing chain of hash-based proof-of-work, forming a record that cannot be changed without redoing the proof-of-work. The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they"ll generate the longest chain and outpace attackers. The network itself requires minimal structure. Messages are broadcast on a best effort basis, and nodes can leave and rejoin the network at will, accepting the longest proof-of-work chain as proof of what happened while they were gone.

2008年11月,網路上出現了一篇署名為中本聰(Satoshi Nakamoto)的文章,其標題翻譯為:比特幣,一種對等式電子現金系統。這篇文章描述了如何使用點對點網路(peer-to-peer network)來構建一種記賬式電子交易系統,2009年1月,比特幣正式上線,出現了比特幣錢包等客戶端軟體,人們可以使用比特幣錢包進行轉賬和接收比特幣。所以,我們可以基於前面的案例中的簡易的電子記賬本,進行相應的改進,就可以得到一個簡單版的比特幣交易系統。

五.改進記賬系統

將元改為BTC,將需要付改為支付,改進之後,只要發出這個消息,自己的簽名以及自己的公鑰,付款方的賬戶就要減去X個BTC,收款方賬戶上將增加X個BTC,這要做的目的就是為了防止月底找不到人。

交易(3)成功的前提是,在這筆交易之前,必須有人支付給B大於或者等於200BTC,且這部分BTC沒有被使用過,在上面的記錄中,由於在(3)之前,有這麼一條記錄(1)A支付500BTC給B,所以(3)符合要求,相應的支付消息改為:A支付500BTC給B -> 支付200BTC給D。支付時,A將這條支付消息,A的針對這條支付消息的數字簽名,A的公鑰一起發給B,B收到這條支付消息後,發現這條消息中的前一個數額為500BTC,後一個數額為200BTC,前一個數額稱為這筆交易的輸入值,後一個數額稱為這筆交易的輸出值,輸入值>=輸出值,則可以確認A有足量的比特幣進行支付,之後,將這條支付消息輸入SHA256函數獲得哈希值1,並用公鑰對A的數字簽名進行解密得到哈希值2,哈希值1=哈希值2,則B可以確認,A的簽名有效,支付成功。

以上有兩點需要注意:(1). 如果A支付100BTC給B,B支付200BTC給D,也就是輸入值支付200BTC給D。(2). 如果C支付100BTC給B+A支付100BTC給B->支付150BTC給D,100+100>150,也就是輸入值>輸出值,這樣該如何處理?比特幣網路中將付款方將支付後剩餘的金額作為找零支付給自己,也就是說,上面的支付消息應該改為C支付100BTC給B+A支付100BTC給B->支付150BTC給D+支付50BTC給B,先前的交易記錄用作轉賬時,則是把交易記錄中的金額一次性用光,因為單筆交易記錄作為一個整體,不可拆分

在blockexplorer中我們可以查看到所有的比特幣交易,比如:解釋:圖中左側是付款方的賬號,右邊是收款方的賬號,黃色高亮部分下方的交易記錄表示賬號1fo9tQdsb5QmU8hx2Pw8mMNqdp2CH9SVy收到一筆BTC轉賬交易,因為有這筆轉賬交易作為基礎,後來才能將BTC轉賬給他人,也就是上方黃色高亮部分的交易記錄。

5.關於轉賬記錄的存儲與維護,比特筆交易的記錄不能只存在一台計算機上,因為每一條記錄都代表資金,如果只存儲在一台計算機上,該計算機出現故障,則整個系統將不能正常的運行。所以需要存放在多台計算機上,而這些計算機的由誰來管理和維護?由一個人或者專門的管理機構進行管理嗎?但是誰能保證在巨大的誘惑或者巨大的威脅之下不對這些記錄進行篡改呢。

比特幣網路的解決方案是,每條比特幣交易記錄都要發送到網路上,讓所有運行比特幣客戶端的計算機存儲所有的比特幣轉賬記錄,這樣,每一條記錄都有很多計算機存儲,不用擔心記錄缺失。但是,這樣會出現三個一致性方面的問題。

第一個問題是:如何進行同步,有的計算機有時候沒有聯網,沒有運行比特幣客戶端或者有時候處於關機狀態,它們將收不到比特幣網路發送的轉賬記錄,這樣不同計算機上的記錄不一致,到底以哪一台計算為主,他們該如何記性同步?

第二個問題是:某個黑客可能會篡改一些計算機上的某一條或者多條交易記錄,導致比特幣交易記錄不一致,甚至記錄之間前後矛盾,從而使得比特幣網路不能正常的運行,那麼如何防止黑客的篡改?

第三個問題是:如何防止同一筆比特幣收入被重複使用,比如有以下兩條支付消息:(1).A支付500BTC給B -> 支付200BTC給D(2).A支付500BTC給B -> 支付200BTC給C

這兩條消息幾乎是同時發出,因為在網路上,消息傳播時經過的路徑不同,這樣就會導致在網路上有的計算機先收到消息(1),有的計算機先收到消息(2),而先收到消息(1)的則認為消息(2)中的A支付500BTC給B是無效的,因為該條記錄在消息(1)中已經使用過。這樣不同計算機對同一條記錄的有效性產生分歧,如果通過銀行進行交易,則可以很容易解決這個問題。但是比特幣系統的目的是為了消除對銀行等金融系統的依賴,那麼,如何解決這三個一致性的問題?

六.區塊鏈

比特幣利用區塊鏈解決這三個一致性方面的問題,所謂區塊鏈,是由一個個區塊串聯而成,區塊中存儲的是檢查校驗之後的交易記錄,比特幣網路僅僅認可和維護同一條區塊鏈,也就是說,比特幣網路上的所有節點,都存儲著完全相同的一條區塊鏈。

當新的交易記錄放入新生成的區塊,而且這個新生成的區塊添加到區塊鏈上後,這些新的交易記錄才被比特幣網路認可(Confirmed Transactions),過程如下圖。

新區塊由比特幣網路上稱作礦工的節點生成,礦工接收發送到比特幣網路上的交易記錄,逐個檢查交易記錄是否符合要求,比如檢查對應交易的數字簽名,每條交易的輸入輸出值等,接著,將符合要求的交易記錄添加到自己正在製作的新區塊中,當礦工成功製作好新區塊,就將這個區塊發送給網路上的各個節點,網路上的節點接收到區塊後,檢查這個新區塊是否符合要求,如果符合要求,則將這個區塊添加到該節點存儲的區塊鏈的末尾。這時,問題來了,比特幣網路上有許許多多的礦工,每個礦工都能生成新的區塊,所以在統一時間內可以生成許多新區塊,假設這些新區塊都不相同,但又是符合要求的,比特幣網路只維護和認可一條區塊鏈,比特幣網路上的所有節點必須選擇同一個區塊並添加到區塊鏈的末尾,但是很難制定一個選擇的標準,至少不能根據時間的先後進行選擇,因為節點分布在世界各地,需要考慮到網路的延遲,每個節點接收到的第一個新區塊一般不同。

所以比特幣網路採用一個巧妙的方法限制單位時間內生成的新區塊的數量,如果每隔十分鐘左右的時間,整個比特幣網路只有一個礦工能夠將其製作的一個新區塊發布到網路上,就不需要進行選擇,所有的節點將這個唯一的區塊添加區塊鏈上,這樣可以保證所有的節點保存的區塊鏈始終相同,這個巧妙的方法就是:當礦工把檢查好的交易記錄填入新區塊時,還要求礦工做一個額外的工作,礦工成功的完成這個額外的工作後,才能將新生成的區塊發布到比特幣網路上。這個額外的工作,整個比特幣網路上一般只有一個礦工能在10分鐘左右的時間成功完成一次,這樣,每隔10分鐘左右的時間,只有一個礦工能將其製作的區塊發布到比特幣網路上。

這個額外的工作包含兩部分:第一部分:將新製作的區塊所包含的內容(前一個區塊的SHA256函數值+新區塊的基本信息+新區塊包含的所有交易記錄)組合成一個字元串,每一個區塊的SHA256函數值與其一一對應,區塊的SHA256函數值就代表這個區塊,如果第Y個區塊包含第X個區塊的SHA256函數值,則表示第Y個區塊的前一個區塊是第X個區塊...區塊鏈中,每一個區塊都包含前一個區塊所有內容的SHA256函數值,區塊鏈就是靠各個區塊的SHA256函數值將這些區塊有序的串聯而成。

第二部分:將第一部分得到的字元串,在這個字元串的末尾添加一個隨機數,組合成一個新字元串

將這個新字元串輸入SHA256函數,得到一個包含256位的二進位數,假如這個二進位數的前73位全是0,才算成功完成了這個額外的工作。這個額外工作的難度非常高,高到整個比特幣網路中平均沒十分鐘只有一個礦工能夠完成,因為SHA256函數每個輸入值都對應一個輸出值,而且每個輸出值都是一個256位的二進位數,但每次運算的輸出值到底是什麼都是隨機的,無法預測,所以,找到符合要求的隨機數的唯一方法就是以最快的速度輸入不同的隨機數不停的試,所以假設要找到這樣一個使得二進位數的前73位全是0的隨機數,概率為1/(2^73),也就是平均需要進行2^73次SHA256計算,才能找到一個符合要求的隨機數。當某個礦工找個這個隨機數後,將隨機數添加到新區塊中,並把新區塊發布到比特幣網路上,網路上的所有節點收到這個區塊後,將這個區塊按照前面的規則組成新字元串,將這個新字元串輸入SHA256函數,檢查二進位數是否符合要求,如果符合要求後,再檢查這個區塊是否符合要求,交易記錄是否符合要求等,如果一切都沒有問題後,就將這個區塊添加到該節點存儲的區塊鏈的末尾,因為只有一個新區塊,所以避免了從很多區塊中選擇一個。

找到這個隨機數純粹靠運氣,但礦工的運算能力越強,則運氣越好,進行SHA256函數計算的速度越快,單位時間能夠試算的隨機數越多,就越可能最快的找到這個隨機數,這個過程就是挖礦。挖礦比拼的就是設備的運算速度,為了運算速度,礦工不斷升級自己的挖礦設備,最初使用的PC每秒大概能夠進行60萬次SHA256函數運算,之後使用安裝有多個專業顯卡的計算機,每秒能進行數億次SHA256函數運算,顯卡進行SHA256運算的速度大大超過CPU進行SHA256函數運算的速度,而現在使用專業的礦機每秒大概能夠進行十萬億次的SHA256函數運算,而礦工會購買許多礦機組合進行挖礦,那麼為什麼礦工會購買這麼多礦機?那是因為比特幣網路對於礦工的獎勵機制,礦工每製作一個新區塊並發布到比特幣網路上,礦工則會得到來自比特幣網路12.5BTC(2017年),除此之外,這個區塊的所有交易記錄的所有交易費用也歸這個礦工所有,2017年每個區塊的交易費大約為2BTC,所以在2017年,每成功製作一個新區塊,礦工將收入14.5BTC約為1,700,000CNY(2017年)。巨大的經濟利益大大刺激了挖礦設備的發展,挖礦設備的升級使得整個網路的運算能力提高,運算能力的提高使得生成一個區塊的速度可能不再需要十分鐘,所以比特幣網路為了維持平均每10分鐘生成一個區塊的速度,每兩周調整一次工作難度,比如要求前74位全是0從而增加工作難度。

那麼有沒有可能兩個礦工同時格子找到一個符合要求的隨機數並且製作了一個新區塊?答:可能,而且經常發生。對於這種情況,比特幣網路是這樣處理的,對於這兩個區塊,比特幣網路選擇將這連個區塊都保留下來,並將這兩個區塊都添加到區塊鏈的末尾,從而區塊鏈出現了分叉,形成了兩個支鏈,礦工也會保存這兩個新區塊,但是,在製作下一個區塊時,礦工都是在自己先接收到的區塊基礎上,創建新區塊,所以有的礦工先接收到區塊1,有的礦工先接收到區塊2,這樣有的礦工就在區塊1的基礎上製作新區塊,有的礦工在區塊2的基礎上製作新區塊,如果新區塊基於區塊1製作,接收到新區塊的節點將會放棄區塊2,也就是說,區塊鏈分叉,出現支鏈的話,網路上的所有節點只認可最長的那條支鏈,保證了區塊鏈的唯一性。如果支鏈的基礎上又同時出現分叉,那麼較短的支鏈將被放棄,被放棄的支鏈上區塊上的所有交易記錄如果沒有添加到主鏈上,則會被重新認定為未確認交易,等待重新加入到新區塊中。比特幣交易中,記錄加入的區塊有可能是支鏈上的區塊,如果該支鏈不能變成主鏈,交易很有可能變成未確認交易,重新等待確認,所以,在交易記錄所在的區塊後方又添加了若干個區塊後,才可以確認自己的交易記錄真正的得到了比特幣網路的認可。那麼若干個到底是幾個?對於小額交易而言,一般是1~2個,大額交易一般為3~6個。

現在,看區塊鏈如何解決上面提到過的三個一致性的問題。一、如何進行同步

所有的比特幣客戶端連接到網路上後會自動向周圍的網路請求自己所沒有的區塊,檢查無誤後將區塊逐一添加到自己存儲的區塊鏈上。

二、如何防止記錄被篡改

當交易記錄輸入到區塊中,且區塊被加入到區塊鏈中,則區塊中的任何記錄都不能被修改,對於區塊的任何修改,都會改變這個區塊的SHA256函數值,導致後面一個區塊所包含的SHA256函數值與這個區塊修改後的SHA256函數值不一致,使得這條區塊鏈斷鏈,這條區塊鏈也就不再是比特幣網路上最長的一條區塊鏈,將不被認可和維護。那麼篡改這有沒有可能自己不斷製作新區塊並添加在斷裂的區塊鏈上使之成為最長的區塊鏈?答:因為製作新區塊需要完成難度很高的額外工作,只有篡改者所擁有的計算能力超過整個網路中其他節點的計算能力總和時,篡改者所製作的區塊鏈的生長速度才可能超過現有的完整區塊鏈的生長速度從而成為主鏈,這種可能性在礦工的不斷加入以及礦工的運算能力越來越強的情況下微乎其微。所以,只要交易記錄添加到區塊中,並且區塊在主鏈上,則這條交易記錄就無法被篡改。而對於大宗交易,一般認定為在所在區塊後添加了3~6個新區塊,就可以放心的認定該筆交易得到了比特幣網路的確認,無法修改或撤銷。

三、如果防止同一筆BTC收入被重複使用

礦工製作新區塊時,會檢查放入新區塊的每條交易記錄的輸入值是否在前面的區塊所包含的交易記錄中使用過,如果被使用過,則認為這條交易記錄無效,不會放入新區塊中。如果兩條交易記錄的輸入值相同,則礦工只會認定其中的一筆交易記錄有效,並只將其加入到新區塊中,而只有放入到區塊中的交易記錄才是被比特幣網路所認可的交易記錄,才是被確認的交易記錄,從而防止同一筆BTC轉賬收入被重複轉賬給他人。

以上所有內容就是比特幣以及區塊鏈技術的簡易應用.^_^Thanks for your reading!

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

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


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

文件內容搜索神奇-PowerGREP4
鄭爽好身材回歸,演繹清純少女風格,連娜扎都忍不住模仿

TAG:全球大搜羅 |