目錄
- 一、數字貨幣
- 二、接觸區塊鏈的小故事
- 三、區塊鏈的起源
- 四、位元幣
- 1. 位元幣與區塊鏈的關系
- 2. 位元幣的作用機制
- 五、信任的建立和區塊鏈的形象解釋
- 1. 區塊鏈建立信任的方式
- 2. 區塊鏈的定義
- 3. 區塊鏈的分類
- 六、哈希演算法
- 1. 哈希演算法的特征
- 2. 典型的哈希演算法
- 3. 哈希演算法在區塊鏈中發揮著怎樣的作用
- 4. Merkle樹在區塊鏈中發揮著怎樣的作用
- 七、 共識演算法
- 1. 共識機制
- 2. 共識演算法
- 3. 位元幣的共識機制——作業量證明機制
- 八、挖礦
- 1. 作業量證明
- 2. 作業量證明的程序
- 九、 錢包、私鑰、簽名與交易
- 1. 錢包
- 2. 位元幣交易
- 十、 雙花攻擊和UTXO
- 1. 數字貨幣中的雙花問題
- 2. UTXO
- 十一、 區塊高度,51%攻擊,礦池與算力
- 1.區塊高度
- 2. 礦池與算力
- 3. 51%攻擊
- 一個典型51%攻擊案例
- 51%攻擊悖論
- 十二、 總結(基本概念)
一、數字貨幣
區塊鏈確實脫胎于數字貨幣,它生來就是為數字貨幣服務的,另一方面,區塊鏈的分布式記賬機制,又依賴于數字貨幣的激勵,可以說區塊鏈和數字貨幣是一對孿生兄弟,在某中程度上互相依存,
為什么要研究貨幣數字化?
便捷;
去除對中心節點的依賴;

數字貨幣化需解決的問題(解決這些問題的鑰匙是區塊鏈)
賬戶數字化;
簽名數字化;
記賬去中心化;
(中心化的意思是中心決定節點,節點必須依賴中心,節點離開了中心就無法生存,)
本質問題(解決這些問題的強有力工具是密碼學)

二、接觸區塊鏈的小故事
有個封閉的山村叫玉石村,村民的主要作業就是挖玉石,村里的財富也是用玉石來計算,大家挖了的玉石堆放到一起,村長來清點記賬,張三、李四、王五各自的財富都記錄在村長的賬本上,他們可以依此來換取其他的生活用品,可是村長這個人有點不厚道,記賬時看到貌美的農婦多記兩筆,遇到刺頭就少記一筆,然后賬本保管也經常出問題,有的地方受潮模糊,還有的地方被老鼠啃掉,更過分地是村長的兒子趙六還常常偷偷涂改賬本,于是村民決定將不干活包吃飯還老出錯的村長廢除掉,那么誰來記賬呢?村民們想了一個辦法,每個人都帶著一本賬本,誰挖到玉石時自己記錄的同時用村口的大喇叭通知所有人,大家都在各自的本子幾下同樣的內容,每個村民都保管各自的賬本,以后村民直接的物品換取、交換玉石也通過這個方式記賬,這樣既節省了一個記賬的勞力,還避免了賬本受潮等問題,即使小寡婦涂改了張三的賬本,但大家拿李四、王五、孫六的賬本出來對比就能馬上發現問題并更正,只要村民的數量足夠多,即使小寡婦性能再強大也無法篡改過半人的賬本,這就是去中心化的分布式記賬,
李四提出了一個新的問題“我把已經記錄的玉石拿來再記一次,財富豈不是很快翻倍再翻倍了”,村民為了解決李四的弄虛作假想了一個辦法,給每塊玉石都做標記,記錄挖掘到的時間、地點、人物以及上一塊被挖到的玉石的資訊,因此每個村民的賬本都記錄了每塊玉石的完整資訊,每塊玉都與上一塊玉資訊關聯,形成一個鏈條,李四既無法憑空捏造,也無法更改之前的記錄,這就是區塊鏈—P2P分布式記賬,
區塊鏈去中心化思想
經過改革以后,玉石村的每一個村民手里都擁有一個賬本,每個賬本里頭都記錄著村民挖出玉石的資訊,摒棄了以往只有村長手里唯一賬本的“中心化”的記賬方式,采取了人手一個賬本的“去中心化”的分布式記賬方式,
區塊鏈防篡改思想
在每個村民的賬本里頭給每塊玉石都做標記,記錄了玉石挖掘到的時間、地點和人物,以及上一塊被挖到的玉石的資訊,每塊玉都與上一塊玉有資訊關聯,形成一個鏈條,這樣誰都無法憑空捏造,也無法更改之前的記錄,做到了防篡改,
交易資訊公開透明的思想
在村民挖到玉石之后,在自己的賬本記錄的同時,用村口的大喇叭通知所有人,大家都在各自的本子上寫下同樣的內容,所有村民都擁有一份完整的玉石資訊,他們可以隨時翻閱自己的賬本,對記錄的玉石資訊進行查詢,
共識的思想
當某個村民發現有一筆玉石資訊記錄錯誤了,需要更正,這個時候需要至少51%的村民同意,才可以修改這筆記錄,換句話來說,只有至少51%的村民認同這筆玉石資訊,才可以把它記錄在每個人的記100%賬本中,這就體現出一個很簡單的共識的思想,
三、區塊鏈的起源
- 密碼朋克的成立
1992年,英特爾高級科學家蒂姆·梅在自己的家中和朋友聚會,聚會上他和朋友討論著互聯網應該如何更好的保護人們的隱私,怎樣保護全世界民眾的隱私在互聯網上不被別有用心的人利用呢?他們成立了一個小組:密碼朋克,埃里克·休斯就寫了個程式,可以接收加密郵件,擦除所有身份標記,并將它們發送回用戶串列,當你簽名后,你會得到休斯的回信,1993年,埃里克·休斯等人升級迭代了加密電子郵件系統,直接把系統改名叫“密碼朋克”, - Ecash
大衛·喬姆發明了密碼學匿名現金支付系統,Ecash,喬姆認為分布式的、真正的數字現金系統應該為人們的隱私加密,因此他的系統里的加密使用了數學編碼,還有一個小特點就是支付時付款方是匿名的,但是收款方是非匿名的, - 哈希現金
1997年,亞當貝克發明了哈希現金,用到了作業量證明系統(proof of work),其實亞當貝克最初發明這個系統是想解決垃圾郵件的問題,也就是為了避免其他人發送包含有相同資訊的郵件,它的作業量證明系統,解決了數字貨幣的一大難題:如何保證數字貨幣不被交易過很多次?這就要求計算機在獲得資訊之前,做一定的作業量計算來避免重復交易, - 時間戳概念
時間戳保證了數字貨幣安全問題,可以保證檔案的先后順序,要求在檔案創建后,不能改動,當一個虛擬貨幣被交易時,被蓋上時間戳,它就無法篡改,在區塊鏈系統中,每一個新區快生成時,都會被打上時間戳,最終依照區塊生成時間的先后順序相連成區塊鏈,

- 位元幣誕生
中本聰對Ecash進行了優化,綜合了時間戳、作業量證明機制、非對稱加密技術、UTXO的結構,最終發明了位元幣,人們就把位元幣的底層技術稱為區塊鏈,
區塊鏈技術從誕生到現在經歷了三個階段
區塊鏈1.0-----數字貨幣,以位元幣為代表的去中心化的數字支付,
區塊鏈2.0-----智能合約,以以太坊為代表的支持用戶自己撰寫智能合約,構建去中心化的應用DAPP,
區塊鏈3.0-----延伸到各個領域,也就是將區塊鏈運用到各行業具體的場景中去,
四、位元幣
1. 位元幣與區塊鏈的關系
“對于位元幣而言,區塊鏈對于它的意義,就如同互聯網對郵件的意義一樣,”


2. 位元幣的作用機制
(1). 位元幣的不依靠指定的貨幣發行機構,而依據特定演算法,通過大量的計算產生,也就是“挖礦”,
(2). 總數量有限,具有極強的稀缺性,位元幣的總數量在最初設定時,就被系統永久限制在2100萬個,
五、信任的建立和區塊鏈的形象解釋
1. 區塊鏈建立信任的方式
區塊鏈本質就是一個去中心化的分布式賬本,原來需要通過銀行或第三方支付才能完成的交易,現在可以通過分布式節點組成的網路來完成,

交易的規則制定、系統治理,由各常委共同執行,同時每一個常委都擁有一個賬本,每個交易資訊在各個常委驗證通過之后,由各個常委記入自己的賬本之中,因此每個賬本記錄的資訊都是一樣的,
2. 區塊鏈的定義
(1). 狹義來講,區塊鏈是一種按照時間順序,將資料區塊以順序相連的方式組合成的一種鏈式資料結構,并以密碼學方式保證的不可篡改和不可偽造的分布式賬本,
(2). 廣義來講,區塊鏈是利用塊鏈式資料結構來驗證與存盤資料、利用共識演算法來生成和更新資料、利用密碼學的方式保證資料安全、利用智能合約來編程和操作資料的一種全新的分布式基礎架構與計算范式,
區塊鏈本質上是一個去中心化的分布式賬本,如果說區塊鏈就是賬本,那么構成區塊鏈的每一個區塊就是賬本的每一頁,每增加一個區塊,帳本后面就會增加一頁,區塊鏈有多長,帳本就有多厚,這個帳本存在網路中各自節點的手里,而不是統一存盤在一個中心節點,并且是任何人都可以看得到的公開賬本,
3. 區塊鏈的分類
根據節點的加入或退出是否需要批準,將區塊鏈分為公有鏈、私有鏈、聯盟鏈,(節點就是網路的骨干,用來驗證和記錄交易,通常指區塊鏈網路中的計算機,手機、礦機、臺式機和服務器等,)
(1). 公開鏈就是公開的區塊鏈,所有人都可以作為網路中的一個節點自由加入或退出,節點之間基于共識機制開展作業,是真正意義上完全的去中心化,
(2). 私有鏈一般用在企業內部,系統的運作規則、節點的讀取和修改權限根據企業的要求進行設定,
(3). 聯盟鏈是一種多中心化或者部分去中心化的區塊鏈,共識機制受某些指定節點控制,一般是由若干機構聯合發起,比如行業內部,它介于公有鏈和有鏈之間,兼具部分去中心化的特性,
六、哈希演算法
哈希加密演算法,SHA256,是由美國國家安全域研發,由美國國家標準與技術研究院在2001年發布,將任何一串資料輸入到SHA256將得到一個256位的Hash值,其特點是相同的資料輸入將得到相同的結果,輸入資料只要稍有變化(比如資料中一個1變成了0)則將得到一個千差萬別的結果,且結果無法事先預知,具體來說就是哈希演算法將資料打亂、混合、壓縮成一個摘要,使得資料量變小,重新創建—個叫做哈希值的指紋,
1. 哈希演算法的特征
一是單向性,哈希演算法必須具備單向性;
- 只能由輸入的資料或者訊息計算出一個定長的哈希值,而不能通過這個哈希值反向推算出輸入的資料或者訊息,
二是可以根據任意長度的訊息計算出固定長度的散列;
- 哈希演算法生成的哈希值的長度必須是固定的,而且是針對任意長度的輸入資料,
- 這一性質保證了哈希演算法的易用性,
- 因為哈希演算法的一個使用目的就是用最后的哈希值來代表輸入資料,那么最后的哈希值很長、不固定或跟原始資料一樣長,那么通過哈希值的對比來確定原始資料就跟直接校驗原始資料一樣費力沒有區別了,
- 最后的長度要控制在一個固定的、合適的值,才能體現出哈希值作為原資料指紋或者說摘要的特征,
三是不同的輸入就有不同的輸出;
- 哈希演算法被發明的目的之一就是根據此需求來的,也成為了哈希演算法的一大特性,
- 可以實作對資料完整性和一致性的判定,只有一模一樣的資料經過同一個哈希運算得到的哈希值才是一樣的,
- 無論輸入資料的長度大小,都會產生定長的哈希值,這樣比對結果就比較快速方便,
- 對于資料的防篡改、防缺失都是很好的校驗方式,
四是演算法效率高,計算哈希值的時間短,
- 保證不管資料有多長,都能在可接受的范圍內得到哈希結果,
2. 典型的哈希演算法
著名的是MD系列和SHA系列,SHA代表安全散列演算法,是根據MD4和MD5開發的演算法,由美國國家安全域發布,作為美國政府標準,
哈希演算法運用的哈希函式是一類比較成熟的散列函式,
哈希演算法的特征:
- 可以用于“任意”長度的訊息,
- 產生的Hash值是固定長度的,
- 對于任意給定的訊息,容易計算訊息對應的哈希值,
- 不能通過給定的哈希值反向推算出輸入的資料或者訊息,
3. 哈希演算法在區塊鏈中發揮著怎樣的作用
(1)必須知道區塊鏈中哈希指標的概念
普通的指標只是保存結構體在記憶體中的位置,而哈希指標是不僅要保存結構體在記憶體中的位置,還要保存結構體的哈希值,
好處是不僅能夠找到結構體的位置,還能夠知道結構體是否被篡改,
區塊鏈和普通鏈表的區別
/*位元幣背后的技術主要是區塊鏈,而區塊鏈是由一個個區塊連接而成,區塊鏈和普通鏈表的主要區別就在于用哈希指標代替
了普通的指標,普通鏈表如果內容發生了改變,指標不會發生改變,而區塊鏈一旦內容發生了變化,后面區塊的哈希指標都會
發生變化,類似于多米諾骨牌效應,*/
哈希運算能夠幫助識別區塊資料是否被篡改,區塊鏈的哈希值能夠唯一而精準地標識一個區塊,區塊鏈中任意節點通過簡單的哈希計算都可以獲得這個區塊的哈希值,計算出的哈希值沒有變化也就意味著區塊鏈中的資訊沒有被篡改,另外,哈希運算還能夠幫助把各個區塊串連成區塊鏈,每個區塊都包含上一個區塊的哈希值和下一個區塊的值,就相當于通過上一個區塊的哈希值掛鉤到這一個區塊,通過這一個區塊的哈希值掛鉤到下一個區塊,就自然而然形成一個鏈式結構的區塊鏈,
4. Merkle樹在區塊鏈中發揮著怎樣的作用
哈希運算還能夠加密交易地址,
什么是Merkle樹呢?
/*它使用的是單向哈希,哈希樹的頂部為頂部哈希,亦稱根哈希或主哈希,它是通過并聯兩個子哈希來往樹上爬直到找到,*/
Merkle樹的作用
- 第一,可以快速定位每筆交易,由于交易在存盤上是線性存盤,定位到某筆交易會需要遍歷,效率低時間慢,通過這樣的二叉樹可以快速定位到想要找的交易,
- 第二,在不需要存盤整個資料的情況下,就可以簡明地核實交易是否被篡改,從交易到每個二叉樹的哈希值,有任何一個數字的變化都會導致根哈希的變化,同時,如果有錯誤,可以快速定位到錯誤的地方,
Merkle樹的特點

- merkle tree是一種樹狀結構,它具有樹結構的所有特點;
- merkle tree的葉子節點的值是資料集合的單元資料或者是單元資料的哈希值;
- 非葉子節點的值是根據它下面所有葉子節點的值,按照hash演算法計算而得出的,
七、 共識演算法
什么叫“共識”?
所謂共識,從語文的角度進行理解,可以簡單解釋為,許多不同的人對同一件事情達成一樣的或者至少說方向一致的看法,這個解釋同樣適用于位元幣網路當中,
1. 共識機制
- 達成共識的主體
它是當前這個區塊鏈中的一些節點,到底哪些節點需要達成一致,也是一個需要考慮的問題, - 這些節點需要對什么東西達成一致?
共識機制涉及了區塊該如何生成以及生成之后如何選擇的問題,
在位元幣網路中每個礦工都有權力生成新的區塊,那么我們到底該選擇誰的區塊作為整個網路的新區塊呢?這個新區塊生成之后,在這條鏈上進行的交易能不能通過呢?
在日常生活中,我們可以有一個老大或者一個領導來拍板決定這些問題,但是在區塊鏈當中,每個節點都是平等的,沒有一個中心機構的存在,這時候就需要通過共識機制來達成節點間的一致,
2. 共識演算法
共識演算法是為了達成共識所依據的一種規則,是篩選出具有代表性的節點的方法,為此,區塊鏈設計了一定的底層演算法,通過這個特定的演算法來選出那個可以生成新區塊的節點,同時對于每一筆在這條區塊鏈上進行的交易是否準許完成進行了約束和規定,也就是共識演算法,
共識演算法規定了下一個新區塊由哪個礦工生成,同時在這條區塊鏈上一筆交易要達成,需要被共識演算法選出的部分節點達成一致的觀點:“哦,我們覺得這筆交易可以進行!” 對一筆交易,如果利益不相干的若干個節點能夠達成共識,就可以認為全網對此也能夠達成共識,
共識演算法有很多種,主要有作業量證明、權益證明、委托作業量證明、委托權益證明、實用拜占庭容錯演算法等,他們最終的目的是一致的,但在具體的實作程序中各具特色,
3. 位元幣的共識機制——作業量證明機制
作業量證明,英文全稱叫proof of work,通常我們叫它POW,
作業量證明就是一份證明,用來確認你做過一定量的作業,怎么證明呢?通過作業結果——當用戶做一定難度的作業得出一個結果時,通過展現出這個結果證明你完成了一定的作業量——也就是說POW作為一種共識機制,它是結果導向而非程序導向的,
- 原因
實際應用中,如果我們通過監測作業的整個程序來證明作業量,這是極為低效的,為了保證一定的效率,就設計了通過驗證結果的方式證明作業量的方法, - 關鍵特征:不對稱性
進行實際作業的用戶需要付出很多的作業量才能得到一個符合已定條件的結果,但是作為驗證方卻可以根據用戶提供的材料很容易重算這個結果,同時驗證這個結果是否滿足提前規定好的條件,
在作業量證明中,你作業的時間越長,作業時采用的設備越先進,你的作業量就越高,你識訓的也會越多,
作業量證明機制POW
首先,生成要加入到區塊鏈中的一筆新的交易資訊,也就是新區塊時必須滿足的要求,然后在基于作業量證明機制構建的區塊鏈網路中,所有節點開始不斷嘗試和計算,直到第一個節點找到了那個隨機哈希散列的數值解,于是它就得到了生成新區塊的權力,(挖礦)
作業量證明機制具有完全去中心化的優點,
作業量證明機制的缺點:造成了大量的資源浪費,達成共識所需要的周期較長,
八、挖礦
位元幣與支付寶、微信支付類似,位元幣屬于互聯網支付,但微信和支付寶處理的是人民幣,是政府發行的法定貨幣,代表民眾對權力機構的信任,而位元幣是去中心化的虛擬“貨幣”,背后完全沒有機構或法律背書,完全是參與者的集體管理,
由于搭載在區塊鏈平臺上,運用分布式記賬機制,系統中所有節點都參與記賬程序,那么一筆交易產生后由哪個節點記賬?如果有惡意節點想隨意篡改資料獲取利益該如何發現?這就引入了“作業量證明”,
1. 作業量證明
作業量證明(Proof-of-Work,PoW)是一種對應服務與資源濫用、或是阻斷服務攻擊的經濟對策,一般是要求用戶進行一些耗時適當的復雜運算,并且答案能被服務方快速驗算,以此耗用的時間、設備與能源做為擔保成本,以確保服務與資源是被真正的需求所使用,
簡單理解就是一份證明,用來確認你做過一定量的作業,監測作業的整個程序通常是極為低效的,而通過對作業的結果進行認證來證明完成了相應的作業量,則是一種非常高效的方式,比如現實生活中的畢業證、駕駛證等,就是通過檢驗結果的方式所取得的證明,
區塊鏈任何一個節點,如果想生成一個新的區塊并寫入區塊鏈,必須解出位元幣網路出的作業量證明的迷題,這個程序我們稱之為“挖礦”,這道題關鍵的三個要素是作業量證明函式、區塊、難度值,作業量證明函式是這道題的計算方法,區塊決定了這道題的輸入資料,難度值決定了這道題的所需要的計算量,
(1)作業量證明函式
和我們上節例子中用到的哈希函式一樣,位元幣系統中使用的作業量證明函式正是SHA256,
(2)區塊
區塊頭的大小為80位元組,由版本號、上一個區塊的哈希值、Merkle Root Hash、區塊生成時間、難度值、隨機陣列成,區塊包含的交易串列則附加在區塊頭后面,
區塊頭就是用于位元幣作業量證明的輸入字串,為了使區塊頭能體現區塊所包含的所有交易,在區塊的構造程序中,需要將該區塊要包含的交易串列,通過Merkle Tree演算法生成Merkle Root Hash,并以此作為交易串列的摘要存到區塊頭中,見下圖:

挖礦∶區塊頭中有個引數叫亂數Nonce,尋找這個亂數的程序就叫做“挖礦;
網路上任何一臺機器只要找到合適的數字填到自己的Nonce位置,使得區塊頭這6個欄位(80個位元組)的資料的哈希值符合目標哈希值,
(3)難度值
難度值(difficulty)是礦工們在挖礦時候的重要參考指標,它決定了礦工大約需要經過多少次哈希運算才能產生一個合法的區塊,位元幣的區塊大約每10分鐘生成一個,如果要在不同的全網算力條件下,新區塊的產生保持都基本這個速率,難度值必須根據全網算力的變化進行調整,
位元幣作業量證明的達成就是礦工計算出來的區塊哈希值必須小于目標值,
我們也可以簡單理解成,位元幣作業量證明的程序,就是通過不停的變換區塊頭(即嘗試不同的nouce值)作為輸入進行SHA256哈希運算,找出一個特定格式哈希值的程序(即要求有一定數量的前導0),而要求的前導0的個數越多,代表難度越大,
2. 作業量證明的程序
我們可以把位元幣礦工解這道作業量證明迷題的步驟大致歸納如下:
- 生成Coinbase交易(這是一筆為了讓礦工獲得獎勵及手續費的特殊交易),并與其他所有準備打包進區塊的交易組成交易串列,通過Merkle Tree演算法生成Merkle Root Hash,
- 把Merkle Root Hash及其他相關欄位組裝成區塊頭,將區塊頭的80位元組資料(Block Header)作為作業量證明的輸入,
- 不停的變更區塊頭中的亂數即nonce的數值,并對每次變更后的的區塊頭做雙重SHA256運算(即SHA256(SHA256(Block_Header))),將結果值與當前網路的目標值做對比,如果小于目標值,則解題成功,作業量證明完成,
可以發現盡管挖礦設備是用來幫區塊鏈記賬的,但是它們實際所做的大部分作業是尋找正確的亂數,而與記賬無關,
到現在,大家可能理解了區塊鏈是如何做到去中心化的,沒有中心機構的權威背書,區塊鏈系統一方面提供報酬鼓勵記賬人參與記賬,另一方面通過記賬人之間的資源消耗競賽來提高作假成本、確保賬本真實性,記賬人之間為獲得位元幣報酬而爭奪“記賬權”,
九、 錢包、私鑰、簽名與交易
位元幣的所有權是通過私鑰和地址來確立的,地址類似于一個銀行賬戶的賬號,要想給一個人轉位元幣,只要知道他的位元幣地址就可以了,私鑰的作用主要是給交易來簽名,用來證明這筆交易是由你發起的,別人收到這筆交易,通過驗證簽名就可以確認交易中涉及的資金是合法的,
在位元幣中,公鑰用于接收位元幣,私鑰用于生成其對應地址上支付位元幣所必需的簽名,以唯一確定這些位元幣的所有權,具體到位元幣地址的生成,其實是先產生私鑰,私鑰通過橢圓曲線演算法這種不可逆的函式來產生公鑰,公鑰經過一系列不可逆的運算再來產生地址,
私鑰持有者才是位元幣的擁有者,那么私鑰放在哪呢?
錢包是私鑰的容器,是密鑰的管理工具,它只包含密鑰而不是確切的某一個代幣,一個位元幣錢包中包含一系列的密鑰對,每個密鑰對包括一個私鑰和一個公鑰,(錢包的地址類似于銀行賬戶,私鑰類似于銀行卡密碼)
1. 錢包
- 位元幣錢包有很多種,有PC端的、手機端的,也有專門的硬體錢包,甚至還有用紙寫上私鑰的紙錢包,我們一般使用的都是軟體錢包,私鑰存在一個叫wallet.dat的檔案中,
- wallet.dat檔案其實是用我們自己設定的密碼加密過的,登錄錢包軟體時,需要用戶輸入密碼來對檔案進行解密得到真正的私鑰,這時私鑰存在錢包程式的記憶體中,當我們需要發起一筆交易時,錢包軟體去記憶體中獲取這一私鑰來對交易進行簽名操作,
2. 位元幣交易
從一個位元幣錢包向另一個中轉賬,每筆交易都有數字簽名來保證安全,一個交易一旦發生那么就是對所有人都公開的,每個交易的歷史可以最終追溯到相應的位元幣最初被挖出來的那個點,用戶用錢包中的私鑰來簽名交易,從而證明他們擁有交易的輸出,也就是其中的位元幣,
位元幣是以交易輸出的形式儲存在區塊鏈中的,
位元幣并不存在于任何地方,即使是硬碟上,持有位元幣其實是擁有特定位元幣的地址,但是其實所謂的幣并不是直接就存在于這個地址中的,地址就相當于你的銀行賬戶,世界上沒有一個可以摸得著的實物,或者是一個資料檔案,可以被叫做“位元幣”的,
有的只是各個地址之間的轉賬記錄,余額時增時減,所有的交易都存放在一個非常大的賬本檔案中,這個檔案叫做“區塊鏈”,如果想知道一個位元幣地址中的余額,那么這個不是直接存放在位元幣地址中的,我們需要到區塊鏈中去計算出來,

第一筆礦工挖礦的收入交易通常被稱為Coinbase,它沒有輸入,所以交易輸入的哈希總是被標記為00000000…0000;其他的交易,任何一個交易輸入都會唯一追溯到區塊鏈上在本區塊之前的某個交易哈希,以及索引,
通過交易哈希和索引,即可唯一確定一個未花費的交易輸出——UTXO,這樣,每一個交易輸入都和之前的某個交易輸出關聯了起來,
地址是公鑰的哈希,
當使用一個UTXO時,用戶要提供這個UTXO中描述的地址對應的公鑰、同時用這個公鑰對應的私鑰對這個交易進行簽名,這樣位元幣的接收者才能去驗證這筆交易是否有效,
十、 雙花攻擊和UTXO
什么叫雙花問題?—筆錢被花費了兩次甚至更多次,
1. 數字貨幣中的雙花問題
在數字貨幣系統中,數字資產本質上是以互聯網為基礎的虛擬數字,簡單來說所謂的數字資產其實就是一串字符,因此它很容易被復制或者多次發送使用,在這種情況下,如果沒有中心機構的存在,人們并不能確定一筆資產是否已經被花掉,這就導致系統可能存在同一筆數字資產因不當操作被重復使用的情況,
為了解決雙花問題,我們日常的數字資產使用依賴于第三方信任機構進行,這類機構對資料進行中心化管理,由它保管交易總帳,并通過實時修改賬戶余額的方法來防止雙重支付的出現,第三方機構的最大弊端是驗證費用極高,
在位元幣系統中是如何避免雙花問題的呢?
礦工在生成區塊的時候,會從網路上收集交易資訊,交易資訊中包含了付款人的私鑰簽名,礦工首先會驗證簽名是不是正確的,只有正確的簽名才會被認為是付款人認可的支付,然后礦工會從以前的區塊鏈中追溯,看看付款人這次消費的位元幣是不是以前沒有被消費過,然后記錄下付款人可用的位元幣余額,這個程序也被稱為UTXO機制,
2. UTXO
UTXO是Unspent Transaction Outputs的縮寫,全稱叫做“尚未使用的交易輸出”,
- U代表Unspent,表示未支付的或尚未使用的,“尚未支付”指的是這個交易輸出還沒有出現在其它交易的輸入端,
- TX是transaction的縮寫,交易是從一個位元幣錢包向另一個錢包轉賬,是唯一可以改變位元幣所有權的方式,包含了輸入、數目和輸出這些基本內容,
- O是Output,是輸出的意思,TXO連起來就是指交易輸出,
位元幣是以交易輸出,也就是TXO的形式存在的,我們說自己有多少位元幣實際上是指的我們擁有所有權的那些UTXO中所指明的位元幣的數量,所以可以說并沒有位元幣,只有UTXO,Alice有10個位元幣,本質上是當前區塊鏈賬本中,有若干筆交易的UTXO項收款人寫的是Alice的地址,而這些UTXO項的數額總和是10,
位元幣的分布式區塊鏈賬本
位元幣的分布式區塊鏈賬本,由一筆一筆的交易形成的,每一筆交易都要花費一筆輸入,產生一筆輸出,而其所產生的輸出,就是“未花費過的交易輸出”,也就是UTXO,這些交易構成了一組鏈式結構,所有合法的位元幣交易都可以追溯到前一個或多個交易的輸出,鏈條的源頭就是挖礦獎勵,末尾則是當前未花費的交易輸出,
位元幣交易規則
- 除了coinbase交易之外,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO,
- 任何一筆交易的交易輸入總量必須等于交易輸出總量,等式兩邊必須配平,

當然,UTXO技術也并非100%保證基于區塊鏈的交易中杜絕雙花問題,51%攻擊,又被稱為Majority attack,這種攻擊是通過控制網路算力實作雙花,
十一、 區塊高度,51%攻擊,礦池與算力
1.區塊高度
區塊
區塊是一種被包含在公開賬簿里的聚合了交易資訊的容器資料結構,這個公開賬簿就是區塊鏈,它是構成區塊鏈的基本單元,由包含元資料的區塊頭和包含交易資料的區塊主體構成,
那么這個區塊生成之后要怎么跟原先的區塊鏈接起來呢?
區塊頭主要由三組資料組成,第一組是父區塊的哈希值,父哈希值用來將該區塊與它的前一區塊相連接;第二組資料和礦工競爭挖礦有關,即難度、時間戳和Nonce(亂數);第三組是由剛才我們講到的區塊體中計算出來的根哈希值,即默克爾樹根,

這時區塊頭發揮作用,區塊頭中包含了三組元資料,其中第一組就是上一個區塊的哈希值,也就是說,第二個區塊的父哈希為第一個區塊的哈希,第三個區塊的父哈希為第二個區塊的哈希,通過這種方式,就把一個個區塊鏈接起來了,形成了一個前向的鏈表,
區塊高度是用來標識一個區塊在區塊鏈中位置的一個概念,
2. 礦池與算力
算力也叫哈希率,是用來衡量進行哈希運算的能力的指標,或者說進行一次哈希計算所需要使用的時間,如果說網路達到了10T哈希每秒的哈希率時,就意味著它可以每秒進行10萬億次哈希運算,
區塊鏈網路中每個礦工都有資格生成區塊,因此為了決定下一個區塊由誰生成,需要通過—定的方法來決定,
在PoW機制中,所有節點通過隨機的嘗試和計算,直到有一個節點找到那個隨機哈希散列的數值解,成為有資格生成新區塊的主體,
哈希碰撞:解出隨機哈希值不斷嘗試的程序,
一個挖礦機每秒鐘能做這種碰撞的次數,代表其算力,礦工進行挖礦所使用的機器越先進,算力就會越高,
區塊鏈轉賬的基本原理
整個區塊鏈網路之所以能運行,靠的就是整個網路的“礦工”,因為他們通過算力解答加密難題,從而挖出新的區塊,挖出區塊后,他們就有權力將轉賬資訊放入到區塊中,然后完成這筆轉賬,這就是區塊鏈轉賬的基本原理,
中本聰一開始就定義了位元幣總量為2100萬個,并且加密數學題的難度也越來越大,正所謂眾人拾柴火焰高,越來越多的人把自己的礦機拿出來,組成了“挖礦小分隊”,這類組織就被稱為“礦池”,
3. 51%攻擊
51%攻擊出現的根本原因:在整個網路中,有人的算力超過了全網的50%,那么在他的控制算力的這段時間,可以將區塊逆轉,進行反向交易,實作雙花,
盡管51%的攻擊不會產生新幣或直接導致區塊鏈崩潰,但對參與者對加密貨幣的信心會產生嚴重影響,
什么時候會出現51%攻擊的問題呢?由于某個礦池的算力過大,
例子:Alice一個礦工掌握了全網50%以上算力的可能性微乎其微,但由于現在生產新區塊越來越困難,出現了礦工間合作組成礦池,匯聚數以千計參與者們的算力,一起參與挖礦并分享獎勵的行為,在這種情況下,一旦某個礦池匯集了過多的礦工,其算力超過了全網的50%,這時就出現了51%攻擊的風險,也對礦工的道德提出了要求,
一個典型51%攻擊案例
Alice 和 Bob之間使用位元幣完成了一杯咖啡的交易,因為是小額交易,Bob在收到Alice的轉賬通知(不是交易確認的通知,只是表面發起了交易)就給Alice提供了咖啡,
正常情況下,這筆交易會馬上被放入交易池等待挖礦節點把自己加入一個新的區塊并開始努力”挖礦”,
假設Alice就是那個大boss,擁有網路51%的算力,他真的不愿意為這筆咖啡付錢(有錢人也可能很小氣),于是他開始攻擊了,
網路上很多節點都收到了這筆交易并加入區塊準備運算了,Alice也同樣開始貢獻算力,但是在開始之前他把區塊里的這筆交易改了,本來這是一筆Alice付款給Bob的交易,被改成Alice轉給自己的一筆交易了(更改很容易,只要把接收地址和簽名改掉即可),
Alice開始嘗試用這個偽區塊進行計算(計算正確后這個區塊會被加入主鏈中),因為擁有51%的算力,Alice比別的節點更容易優先計算成功,導致一個偽造的區塊加入了主鏈,現在網路中有兩個區塊鏈:

其中一個是原來的主鏈,另一個是比主鏈高出一個區塊的偽造鏈,
按照最長區塊鏈原則,更高的這個鏈就代替了原有的鏈成為后面的主鏈,這筆偽造的交易就被所有節點認可成為了”真實的交易”,
這是Bob就會一直收不到錢,但是咖啡已經給出去了,
攻擊結果: 由于撤銷了所有對外付款交易,等于識訓來已花掉的位元幣,
51%攻擊悖論
雖然看起來51%攻擊非常恐怖,不過這通常僅存在于理論情況下,因為如果你想做到,首先需要足夠的錢去掌控全網51%的算力,這將是非常大的一筆投資,其次在攻擊后,幣種價格會受到影響,你要賣出非常多的幣才能達到收支平衡,這就是51%攻擊悖論,
十二、 總結(基本概念)
礦工
礦工就是指參與位元幣挖礦的個體,也就是說,每一個致力于生產新區塊的位元幣節點的主人,就是一個礦工,是一切行為的操作者,也就是位元幣網路參與的主體,
礦池
礦池的概念是在礦工的基礎上延伸出來的,隨著參與挖礦的礦工越來越多,一個個體礦工要想挖到礦,得到生成新區塊的權力的可能性越來越低,所以一些礦工集合起來,集合各自的算力,提高挖到礦的可能性,這種礦工的集合體就是礦池,
公鑰、私鑰
公鑰和私鑰是一組配合使用的概念,他們之間有著緊密的聯系,簡單來說,私鑰是系統隨機生成的,公鑰是由私鑰計算得出的;公鑰負責加密,私鑰負責解密;私鑰負責簽名,公鑰負責驗證,在兩者的配合使用之下,礦工才能完成位元幣的交易,
錢包
位元幣錢包,就是用來裝密鑰的容器,它只包含密鑰而不包括具體的多少個位元幣,具體來說,錢包里面存放了一系列的密鑰,每一密鑰對應著一個私鑰和由這個私鑰生成的公鑰,用于完成這個錢包主人可能要進行的位元幣交易,錢包還有一個地址,這個地址就相當于你支付寶的賬號一樣,你要提供自己的賬號,才能向外轉賬或者給自己充值,
交易
這里提到的交易,就是利用礦工掌握的私鑰,把位元幣從—個地址轉到另一個地址的行為,我們所說的位元幣,其實就是一系列交易輸出的集合,我們說自己有多少位元幣實際上是指的我們擁有所有權的那些UTXO中所指明的位元幣的數量,
區塊
區塊是構成區塊鏈的基本單元,在區塊鏈中,每隔一段時間就會形成一個新的區塊,礦工們就是在通過挖礦爭奪生成新區塊的權力,每一個區塊由區塊頭和區塊主體構成,在區塊頭中包含了前一個區塊的哈希資訊,可以幫助新區塊和之前的區塊聯系起來;而區塊主體則包含了這一段時間內所有的交易資訊,

算力
算力,是用來衡量進行哈希運算的能力的指標,它可以用每秒完成哈希碰撞次數來衡量,算力越強,挖到下一個新區塊的可能性也相應的越大,
技術概念
- 哈希演算法
- 共識演算法
- UTXO
參考鏈接:
https://www.icourse163.org/learn/NJU-1449346161?tid=1461482449#/learn/announce
https://www.jianshu.com/p/c616155eae91
http://www.chidaolian.com/article-1574-4
https://www.jianshu.com/p/9ce0dc83efb4
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/139243.html
標籤:其他
