區塊鏈(Block Chain)+比特幣(Bit Coin)技術筆記

區塊鏈(The Block Chain)技術

背景知識

0.比特幣是區塊鏈技術的第一個應用
1.區塊鏈是比特幣參與者集體維護的一個總帳本(分散式帳本)
2.維護一條不段增長的鏈,只可以添加,過去發生的不能篡改
3.技術應用:公信的數位貨幣>>比特幣、公信的交易處理>>乙太坊
4.商業價值:可信任性、降低成本、增強安全

5.1.0版是用來記帳一筆交易、2.0版是智能合約、3.0版是共通平台

核心價值

0.關鍵詞:去中心化(Decentralized)、去信任(Trustless)、集體維護(Collectively maintain)、可靠數據庫(Reliable Database)
1.去中心化(分散式):
透過多個參與者的數據維護,即使單一節點遭受攻擊,依然可以隨時回復。且因為多人持有,可以隨時從最近的節點提取資訊。(因此區塊鏈可以看成具有權威的記錄所有交易的公開總賬簿)
2.集體維護:
透過集體維護和監督,數據難以偽造。
3.不可撤銷:
以比特幣為例,只要該筆交易一經過6個以上的確認就被記錄了,想要撤銷是不可行的(無法刪除)。
4.可驗證性:
小至1bit的資料都可以被驗證,可判定其合法、合理、完整性。

技術原理

0.交易(Transaction):一次操作,導致帳本狀態的一次改變,如添加一條紀錄
1.區塊(Block):記錄一段時間內發生的交易和狀態結果,是對當前賬本狀態的一次共識
2.鏈(Chain):由一個個區塊按照發生順序串聯而成,是整個狀態變化的日誌記錄。

3.雜湊函數:雜湊函數可以看成是將一個不固定長度的整數中的資訊打亂混合成另一個固定長度的雜湊值,特徵是不同數字的雜湊值重複機率相當小,且雜湊值很難逆推回整數(不可逆),另外就是雜湊函數的範圍比輸入數字還要小很多,因此可以達到摘要的功能。而區塊鏈中,透過雜湊函數的利用,將上一筆資資訊的摘要結合當前資訊的摘要,傳給下一筆資訊做摘要,如此環環相扣,幾乎無法篡改,達到安全的目的。
4.資料結構為一線性鏈表,由許多區塊組成,新的數據要加入,必須放到一個新區塊中,任何維護的節點都可以提出一個新區塊,但每個新區塊都必須通過檢驗,達到共識後才能加入鏈結。


如何成立一筆交易

Ans:
當客戶端發起一筆交易後,會發出廣播道網路中,網路中的節點會將區塊的雜湊值和等待確認的交易紀錄打包在一起成為一個「候選區塊」,接著試圖找到一個nonce串放到區塊裡,使得候選區塊裡頭的區塊頭雜湊值滿足一定條件(條件通常是小於某個值、或小於某個難度目標)
一旦算出小於難度目標的雜湊值,這個區塊在"格式"上就合法了,接著可進行全網廣播,成為「提案區塊」,當大家驗證成功,確認合法後,就加入到鏈上。



比特幣 - 挖礦

數位貨幣挑戰

0.貨幣的真偽
1.貨幣確實交易
2.雙重支付

價值

0.比特幣結合PoW(Proof of Work)、共識機制,首次實現去中心化、安全可靠的數位貨幣機制。
1.希望解決問題:被掌控在發行機構手中、自身的價值無法保證、無法匿名化交易。

技術說明

如何實現去中化化共識:
獨立驗證:交易語法跟資料結構必須正確、輸入輸出列表不能為空…
採礦競賽:各節點各自找尋nonce值滿足難度目標需求
區塊鏈接:每個節點獨立的對新區塊進行校驗並組裝進區塊鏈
分叉共識:將區塊集合至有最大工作量證明的鏈中(可能是父區塊為頂點的主鏈,也可能是備用鏈)

比特幣交易

0.設計原理:確保比特幣交易可以被生成,能在比特幣網路中被傳播,最終加入區塊鏈
1.交易本質是資料結構
2.交易生命週期:交易誕生(包含數個簽名,表示使用許可)>>廣播到網路,被各節點初步驗證合法性(驗證成功就回傳接受資訊個發起者),並繼續給此節點連接的其他節點,直到大多數節點都接收到(如果驗證無效,會拒絕接受,停止繼續傳送,並返回一個資訊給發起者) >> 最終被一個節點驗證後加入到記錄著許多比特幣交易的區塊中 >> 候選區塊 >> 加入區塊鏈 >> 交易時分給新使用者的比特幣進入新的交易
3.UTXO(Unspent Transaction Output,未經使用的交易輸出),交易的基本單位(可以想成就是比特幣),可以記錄下一筆交易的輸入。
4.比特幣網路記錄著所有尚未使用的UTXO
5.一個用戶擁有的比特幣會分散到數百個交易或者區塊中,不存在一個帳戶餘額的地點,是分散並鎖住的
6.UTXO可以是任意值,但一旦被創建就不可分割,因此如果拿來支付,會消耗一整個個體,像是買一元餅乾,但只能付手中擁有的完整100元,剩下由生成的零頭UTXO給你(也就是會產生兩筆輸出^,一筆是支付買餅乾的1元,一筆支付到自己的戶頭)
7.交易過程就是在交易鏈中創造跟消耗UTXO,由UTXO擁有者簽名解鎖(證明所有權)創造交易輸入,並使用新的所有者的比特幣地址來鎖定並創建UTXO輸出
8.交易的鎖定時間:此交易能被加到區塊鏈裡的最早時間(通常設定為0,表示立即執行,可以理解成支票的兌現時間,延後支付的概念)
9.交易的驗證依賴兩種腳本的驗證:1.鎖定腳本>>明確定義今後花費這筆輸出的條件 2.解鎖腳本:提供或滿足花費條件的腳本(所以交易時,會先檢索鎖定腳本,接著執行解鎖腳本,如果執行結果為真,表示交易成立,此UTXO可用)
10.UTXO的優點是私密性的提升,使用者只要不停更改帳戶地址,很難找出交易之間的相聯性。

11.交易大多是P2PKH(Pay-to-Public-Key-Hash)交易

實際場景 - 交易過程

Alice用現金跟朋友Joe換了0.10的比特幣,然後將比特幣拿去Bob咖啡店買咖啡,Alice交易紀錄會長這樣

※由上圖可以看見,每筆交易的第一行都會出現一個代表此交易所有內容的雜湊值,每個交易的輸入(雜湊值)接來自於上個輸出(雜湊值),形成一條鏈,冒號後面為序號,0開始
※Alice持有的比特幣會被Alice的金鑰和私鑰鎖定,只有同時提出公私鑰才能使用這筆錢
※Alice給Bob的錢,會鎖定那比輸出,指名要Bob簽名才能消費,且這筆交易會形成兩個輸出,一個給Bob,另一個是找零,會輸出到Alice的帳戶供下次使用


※可以看見每筆交易輸入!=輸出,為了讓交易盡快被網路處理(交易費越高優先處理權越高,但就算沒有交易費,交易最終仍然會被處理),交易會多付一小筆費用,當輸入差值<0.1(像是找零的時候),會自動變成礦工的交易費

實際場景 - 如何加入區塊鏈(挖礦)

0.每筆新交易的大小為258 Byte,包含輸入金額、輸出金額
1.藉由比特幣用戶端所組接而成的P2P網路來將交易和區塊傳播給所有參與者
2.交易在比特幣網路上散播開,被網路上的礦工或礦池蒐集並驗證,然後放至各自的臨時交易池,每當500~4000個交易紀錄蒐集完成便打包成一個「候選區塊」(平均每10分鐘,從上個區塊加入區塊鏈後開始計算)(打包時會一起加入區塊頭和創幣區塊,註明礦工的報酬),並進行「採礦運算」(通常是嘗試解決一個很難的問題來證明這區塊的合法性(Proof of Work)),一旦領先其他礦工採礦完成,便廣播這個候選區塊,其他礦工接收到這個區塊並驗證無誤後,便放棄對同候選區塊進行中的採礦運算,並接納其成為區塊鏈中的一員,並馬上開始下一個新區塊的運算
3.每筆交易必須經過挖礦且加入一個區塊後才能成為區塊鏈的一部份

4.由於不是每個礦工都同時收到所有的廣播區塊,因此會採取最先收到的來串連,之後如果確認其他人挖得比較快,再調整自己的區塊鏈(除了尚未成熟的區塊,所有礦工的區塊鏈資訊應該保持一致,且定時更新),過去挖錯(被超過)的區塊會被保存下來,通常主分支是最長的那條,當一個區塊被提出為候選區塊100次後,只有處於主分支上的該區塊提出者(礦工) 才能得到獎勵。

挖礦知識

0.交易被放進區塊需要大量運算來證明,但驗證已被證明只需要少量資源
1.在創建區塊(採礦運算)時,會創造新的比特幣,隨著發行時間變長,產生的比特幣越來越少
2.當區塊被確認,隨著越來越多的交易區塊疊加,表示信任越來越多(更改的可能性小)
3.每個礦工在構建區塊時,都會包含一個特殊的交易,稱之為「創幣交易」,如果礦工找到新區塊的有效的解法,便能將「創幣交易」產生的報酬(目前是12.5比特幣)加上新區塊內所有的交易費手續費總額做為報酬支付到自己的錢包 >> 挖礦完成就表示取得此區塊的記帳權
4.隨著區塊越串越長,驗證越來越複雜(還要順便驗證以前的),所以計算複雜度會越來越高,一旦某區塊獲得六次(每次10分鐘會有新區塊產生,新區塊產生會順便驗證舊區塊,所以大概一小時)以上的證明,便被認定不可撤銷
5.進行挖礦時,候選區塊會有兩個亂數欄位,一個在區塊頭(約4bytes)、一個在創幣交易中(約5bytes)

※下圖是區塊頭資料結構
(merkle是用來總結區塊內所有交易的雜湊值)
6.礦工藉由更改這些亂數欄位值來使候選區塊的雜湊值滿足預設的難度目標(使區塊頭的雜湊值<預設難度目標,類似猜數字遊戲,但是是1bit為單位一直猜下去,所以嘗試次數為2^n),一旦搶先其他礦工,並通過其他礦工的驗證,即挖礦成功

比特幣 - 資安

四大需求

1.資料保密性(Confidentiality)
說明:避免資料在未經授權下被讀取。
作法:透過對私鑰的對稱加密、對公鑰的非對稱加密
2.資料完整性(Integrity)
說明:確保資料完整,沒有被不當修改
作法:雜湊函數的利用(EX:SHA-256)
3.確認性(Authentication)
說明:確認通訊者雙方身分、並保證雙方收到的資料來源無誤
作法:交換電子憑證、出示雜湊前的資訊
4.不可否證性(Nonrepudiation)
說明:避免通訊雙方否認曾參與的通訊行為
作法:數位簽章
※共識攻擊 >> 51%攻擊(不一定要51%計算能力才能發起,但只要到51%幾乎一定成功),由於超過一半以上計算能力聯合攻擊,可能通過故意製造區塊鏈分叉來實現“雙重支付”(雙重支付可以理解成,有心且有大量計算能力的人士模擬出一個跟被害者的交易一模一樣的UTXO給比特幣上網路上的節點知道,但收款人變成有心人的錢包地址,且它利用自己的計算能力,計算出一個更新的區塊,比被害者原有的比特幣所在區塊更高一個區塊,因此新的區塊鏈就會取代原有的區塊鏈,而其他節點完全不會察覺異樣)或者通過拒絕服務的方式來阻止特定的交易或者攻擊特定的錢包位址

加密技術基礎

1.私密金鑰:使用「對稱加密法」、「單一金鑰加密法」,主要技術是「替代」、「置換」,主要工具是「DES」、「AES」>>加密時的鑰匙跟解密者的鑰匙為同一把
2.公開金鑰:使用「非對稱加密法」、「雙金鑰加密法」,主要技術是橢圓曲線離散對數(ECC) >> 加密時的鑰匙跟解密者的鑰匙為不同把,加密時用接收者的公開金鑰,解密時則是接收者的秘密金鑰
3.雜湊函數(Hash Function):是一種單向函數、給任意長度的X值,可以得出H(X)->Y,Y則是固定長度

比特幣加密

1.利用ECC做為比特幣擁有者身分證明
2.利用公鑰的雜湊值表示身分(比特幣地址)
3.利用交易輸出之雜湊值做簽章,證明比特幣擁有權
4.Proof of Work:利用調整候選區塊裡面的亂數值,使候選區塊之雜湊值滿足預設條件,一旦滿足條見表是競爭成功,挖礦完成!
5.ECC橢圓加密:金鑰長度160bits
6.比特幣任何一筆錢可用私鑰k、公鑰K、比特幣地址A來表示
7.透過亂數產生一256bits的亂數成為私鑰k,k經過橢圓曲線相乘得到公鑰K,K再經過Hash Function([SHA256+RIPEMD160]雙哈希或者Hash160)得到比特幣地址A(上述過程都不可逆)


優質好文
優質好文 

留言