比特幣讓你登錄騙局(讓你徹底搞懂比特幣相關知識)
1.基本知識
1.1 區塊
區塊是一種容器數據結構,這種數據結構被包含在公開賬簿里,聚合了交易信息;而這個公開賬簿是區塊鏈;區塊是構成區塊鏈的基本單元,由區塊頭和區塊體構成。
1.2 區塊高度
區塊高度是用來標識一個區塊在區塊鏈中位置的一個概念。
為什么區塊高度不能唯一標識一個區塊?
因為在同一時間,有可能存在兩個或兩個以上的區塊,他們相對于整條區塊鏈來說,處于平等的位置,所以他們有著相同的區塊高度。
2.貨幣的發展階段
2.1 以物易物
以物易物的方式需要滿足雙重偶然性,舉個例子來說就是我這恰好有一袋蘋果,對方那剛好也有一袋面粉,同時我們彼此需要對方的東西,這時候才可以進行交換。
2.2 實物貨幣
此時我們通過貝殼或者一些金銀來作為等價物作為中介來交換,此時就不需要像之前的以物換物那樣滿足雙重偶然性了;但是由于實物容易磨損、不易攜帶、數量有限等缺點進而發展出了紙幣
2.3 紙幣
現在我們生活中的一張紅色的毛爺爺制作成本其實很低,但是卻可以用它購買價值100元的商品,這是因為國家的信用在背書,讓人們相信一文不值的貨幣具有100元的購買力
“信用背書”意思是信用擔保。比如用公司的信譽作為你的“信用背書”,意思就是我公司擔保你為可信之人,可以與他建立業務。
2.4 中心化記賬貨幣
移動電子支付的實質為記賬貨幣,是通過銀行、第三方支付機構、央行負責記賬的,而央行具有整個國家大賬本的記賬權,本質上就是一種中心化的記賬方式。無論是使用微信或者支付寶,我們都不得不完全信任第三方,因為我們的錢存儲在他們這僅顯示為數字,假如第三方數據遭受到篡改,我們的財產就會遭受到損失。
2.5 比特幣誕生
?
為解決此問題,則必須要有一套獨立的電子貨幣體系:于是乎比特幣誕生了!
中本聰在《一種點對點的電子現金支付系統》中提到:
為了滿足比特幣的要求,區塊鏈技術應運而生了,或者說比特幣是區塊鏈興起的源頭,是區塊鏈最早、最成功的應用。
3.比特幣的錢包、私鑰和簽名
3.1 比特幣的所有權確立
比特幣的所有權是通過私鑰和地址來確立的。
·地址類似于一個銀行賬戶的賬號,要想給一個人轉比特幣,只要知道他的比特幣地址就可以了。
·私鑰的作用主要是給交易來簽名,用來證明這筆交易是由你發起的,別人收到這筆交易,通過驗證簽名就可以確認交易中涉及的資金是合法的。
3.2 公鑰與私鑰
比特幣采用的就是非對稱密碼體制 。
公鑰加密發明于20世紀70年代,自從公鑰加密被發明之后,一些不可逆的數學函數被提出,就是說只能向一個方向計算,但不可以向相反方向倒推。
在比特幣中,公鑰用于接收比特幣,私鑰用于生成其對應地址上支付比特幣所必需的簽名,以唯一確定這些比特幣的所有權。具體到比特幣地址的生成,其實是先產生私鑰,私鑰通過橢圓曲線算法這種不可逆的函數來產生公鑰,公鑰經過一系列不可逆的運算再來產生地址。
3.3 錢包
從上述內容我們可以知道,私鑰持有者才是比特幣的擁有者,那么私鑰放在哪里呢?
錢包是私鑰的容器,是密鑰的管理工具,它只包含密鑰而不是確切的某一個代幣。一個比特幣錢包中包含一系列的密鑰對,每個密鑰對包括一個私鑰和一個公鑰。
錢包定義
?wallet.dat文件其實是用我們自己設置的密碼加密過的,登錄錢包軟件時,需要用戶輸入密碼來對文件進行解密得到真正的私鑰,這時私鑰存在錢包程序的內存中,當我們需要發起一筆交易時,錢包軟件去內存中獲取這一私鑰來對交易進行簽名操作。
冷錢包
熱錢包
3.4 交易
比特幣交易就是:從一個比特幣錢包向另一個中轉賬,每筆交易都有數字簽名來保證安全。一個交易一旦發生那么就是對所有人都公開的,每個交易的歷史可以最終追溯到相應的比特幣最初被挖出來的那個點。用戶用錢包中的私鑰來簽名交易,從而證明他們擁有交易的輸出,也就是其中的比特幣。
·比特幣是以交易輸出的形式儲存在區塊鏈中的。
比特幣并不存在于任何地方,即使是硬盤上。持有比特幣其實是擁有特定比特幣的地址,但是其實所謂的幣并不是直接就存在于這個地址中的,地址就相當于你的銀行賬戶。世界上沒有一個可以摸得著的實物,或者是一個數據文件,可以被叫做 “比特幣” 的。有的只是各個地址之間的轉賬記錄,余額時增時減。所有的交易都存放在一個非常大的賬本文件中,這個文件叫做“區塊鏈”。如果想知道一個比特幣地址中的余額,那么這個不是直接存放在比特幣地址中的,我們需要到區塊鏈中去計算出來。
UTXO
第一筆礦工挖礦的收入交易通常被稱為Coinbase,它沒有輸入,所以交易輸入的哈希總是被標記為0000...0000;其他任何一個交易輸入都會唯一追溯到區塊鏈上在本區塊之前的某個交易哈希以及索引。通過交易哈希和索引,即可唯一確定一個未花費的交易輸出——UTXO。這樣,每一個交易輸入都和之前的某個交易輸出關聯了起來。
對于Bob來說,他有來自Alice的30個BTC輸入,但是有0輸出,則可以計算出Bob的UTXO=20+10=30
例1
Q1:請寫出Alice和Bob交易時產生的“輸入”中的信息,及Bob的UTXO值
Q2:請寫出Bob與Tom和Jimmy交易時產生的“輸入”中的信息,及Bob的UTXO值
A1:其中記錄了最初Alice擁有這些幣是從哪個地址轉給她的;此時Bob的UTXO=10+20=30
A2:由上述交易過程中的信息可知,在Bob與Tom、Jimmy的交易過程中一共輸出了25BTC,由于Bob與Alice的單筆交易中:10BTC與20BTC無法單獨滿足,因此在與Tom和Jimmy的交易信息的輸入:應當包含Alice向Bob的兩筆交易所包含的所有信息;此時Bob的UTXO=30-20-5=5
公鑰腳本
從上述的例子中我們不難發現,輸入是對之前輸出的引用,那么其他人是否也可以引用Alice的交易數據作為自己的輸入,也就是把這筆錢搞到自己的賬戶里去呢?
那當然是不行啦!因為Alice在給Bob轉賬的時候,加了一個條件,這個條件在比特幣交易中叫做公鑰腳本。而在上述例子中的公鑰腳本里的內容,就是使用交易輸出的賬戶地址必須是Bob,那么其他人可不可以冒充Bob來花費這筆輸出呢?因為其他人也有可能知道Bob地址和公鑰其他人也可能知道。這就引出了簽名與驗簽:
多方簽名
比特幣中還支持多方簽名。如果Bob要使用Alice轉給Bob的這兩筆交易,那么不僅需要Bob簽名,還需要Alice簽名,這樣萬一其中一個人的私鑰被盜,也不會丟失比特幣的!
4.非對稱加密算法
4.1 為什么要使用非對稱加密?
為此我們可以對快遞包中的內容加密,但是如何把加密信息的密碼安全地發送給Bob呢?
4.2 什么是非對稱加密?
簡單概括為16字方針:公鑰加密、私鑰解密、私鑰簽名、公鑰驗簽
4.3 非對稱加密的工作原理
4.4 非對稱加密的應用
比特幣的所有權
我們平時所說的某人對一個比特幣擁有所有權,事實指的是他擁有這個比特幣地址所對應的私鑰
交易驗證
當使用一個UTXO時,用戶要提供這個UTXO中描述的地址對應的公鑰、同時用這個公鑰對應的私鑰對這個交易進行簽名,這樣比特幣的接收者才能去驗證這筆交易是否有效。
其中比特幣中的公私鑰生成以及簽名算法ECDSA都是基于橢圓曲線算法的
4.5 橢圓曲線算法
5.如何避免記假賬?
在比特幣交易中有三個保障來避免記假賬:
1.用私有密鑰對交易信息簽名,必須用配對的公共密鑰驗證簽名,私用密鑰的使用者必須是付款人(采用非對稱加密算法)
2.被簽名的交易信息在網絡上進行廣播,所有參與到比特幣網絡的人都可以接收到這筆交易信息,并且可以對交易信息進行驗簽,確保交易是合法的(采用非對稱加密算法)
3.接收到交易信息后,大家會按照約定的規則生成區塊,就是一個數據塊,這個數據塊中包括所有的交易明細信息,按照merkle樹的方式組裝起來(所有的交易數據是按照merkle樹的方式組裝起來,merkle樹的數據結構可以很好的保證數據安全)
6.哈希運算與難以篡改
6.1 哈希算法
相同的數據輸入將得到相同的結果。輸入數據只要稍有變化(比如數據中一個1變成了0)則將得到一個于差萬別的結果,且結果無法事先預知。具體來說就是哈希算法將數據打亂、混合、壓縮成一個摘要,使得數據量變小,重新創建一個叫做哈希值的指紋。
6.2 哈希算法的特征
1.單向性
哈希算法必須具備單向性:只能由輸入的數據或者消息計算出一個定長的哈希值,而不能通過這個哈希值反向推算出輸入的數據或者消息。
2.可以根據任意長度的消息計算出固定長度的散列
哈希算法生成的哈希值的長度必須是固定的,而且是針對任意長度的輸入數據。這一性質保證了哈希算法的易用性。
因為哈希算法的一個使用目的就是用最后的哈希值來代表輸入數據,那么最后的哈希值很長、不固定或跟原始數據一樣長,那么通過哈希值的對比來確定原始數據就跟直接校驗原始數據一樣費力沒有區別了。最后的長度要控制在一個固定的、合適的值,才能體現出哈希值作為原數據指紋或者說摘要的特征。
3.不同的輸入就有不同的輸出
哈希算法被發明的目的之一就是根據此需求來的:可以實現對數據完整性和一致性的判定,只有一模一樣的數據經過同一個哈希運算得到的哈希值才是一樣的。
無論輸入數據的長度大小,都會產生定長的哈希值,這樣比對結果就比較快速方便,對于數據的防篡改、防缺失都是很好的校驗方式。
4.四是算法效率高
計算哈希值的時間短,保證不管數據有多長,都能在可接受的范圍內得到哈希結果。
6.3 典型的哈希算法
Hash算法中比較著名的是MD系列和SHA系列。
·MD系列算法是在上個世紀o年代初由Mit laboratory for computer science和RSA data security inc的Rivest設計的,MD代表消息摘要(MessageDigest),MD2(1989)、MD4(1990)和MD5(1991)都產生一個128位的信息摘要。
·SHA系列算法是NIST根據Rivest設計的MD4和MD5開發的算法,國家安全局發布SHA作為美國政府標準,SHA(Secure Hash Algorithm)表示安全散列算法。
6.4 哈希函數的特性
1.可以用于“任意”長度的消息
2.產生的Hash值是固定長度的
3.對于任意給定的消息M,容易計算 H(M) 值
4.單向性(抗原像性):對于給定的Hash值h,要找到M使得 H(M)=h 在計算上是不可行的。
6.5 哈希指針
普通指針只是保存結構體在內存中的位置,而哈希指針是不僅要保存結構體在內存中的位置,還要保存結構體的哈希值;這樣的好處是,通過哈希指針,不僅能夠找到結構體的位置,還能知道結構體是否被篡改。
區塊鏈和普通鏈表的區別
比特幣背后的技術主要是區塊鏈,而區塊鏈是由一個個區塊連接而成,區塊鏈和普通鏈表的主要區別就在于用哈希指針代替了普通的指針。普通鏈表如果內容發生了改變,指針不會發生改變,而區塊鏈一旦內容發生了變化,后面區塊的哈希指針都會發生變化,類似于多米諾骨牌效應。
哈希指針與區塊鏈的關系
可見哈希運算能夠幫助識別區塊鏈是否被篡改,區塊鏈的哈希指針能夠唯一而精準地識別一個區塊,區塊鏈中任意結點通過簡單的哈希運算,都可以獲得這個區塊的哈希指針,計算出的哈希值沒有變化就意味著區塊鏈中的信息沒有被篡改。另外,哈希運算還能夠幫助把各個區塊串連成區塊鏈。每個區塊都包含上一個區塊的哈希值和下一個區塊的值,就相當于通過上一個區塊的哈希值掛鉤到這一個區塊,通過這一個區塊的哈希值掛鉤到下一個區塊,然后自然而然形成一個鏈式結構的區塊鏈
6.6 Merkle樹
什么是Merkle樹呢?
它使用單向哈希:哈希樹的頂部為頂部哈希(根哈希/主哈希),它是通過并聯兩個子哈希來往樹上爬直到找到根哈希。
Merkle樹的作用
1.可以快速定位每筆交易,由于交易在存儲上是線性存儲,定位到某筆交易會需要遍歷,效率低時間慢,通過這樣的二叉樹可以快速定位到想要找的交易。
2.在不需要存儲整個數據的情況下,就可以簡明地核實交易是否被篡改,從交易到每個二叉樹的哈希值,有任何一個數字的變化都會導致根哈希的變化。同時,如果有錯誤,可以快速定位到錯誤的地方。
Merkle樹的特點
·Merkle tree是一種樹狀結構,它具有樹結構的所有特點
·Merkle tree的葉子結點的值是數據集合的單元數據,或者是單元數據的哈希值
·非葉子結點的值是根據它下面所有葉子結點的值,按照哈希算法計算而得出的
7.雙花問題與UTXO
7.1 雙花問題
7.2 如何避免雙花問題?
傳統電子支付
·依賴于第三方信任機構
·對數據進行中心化管理,并通過實時修改賬戶余額來防止“雙花”的 出現
·弊端:人類需要為交易中第三方驗證支付巨額費用。
7.3 UTXO機制
UTXO的概念
UTXO是Unspent Transaction Outputs的縮寫,全稱叫做“尚未使用的交易輸出”。
U代表Unspent,表示未支付的或尚未使用的,“尚未支付”指的是這個交易輸出還沒有出現在其它交易的輸入端。
TX是transaction的縮寫,交易是從一個比特幣錢包向另一個錢包轉賬,是唯一可以改變比特幣所有權的方式,包含了輸入、數目和輸出這些基本內容。
O是Output,是輸出的意思,TXO連起來就是指交易輸出。
比特幣與UTXO的關系
比特幣里并沒有用戶帳戶的概念。 我們說自己有多少比特幣實際上是指的我們擁有所有權的那些UTXO中所指明的比特幣的數量。Alice有10個比特幣,本質上來說其實是當前區塊鏈賬本中,有若干筆交易的UTXO項收款人寫的是Alice的地址,而這些UTXO項的數額總和是10。
比特幣交易的規則
1.除了 coinbase交易之外,所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO。
2.任何一筆交易的交易輸入總量必須等于交易輸出總量,等式兩邊必須配平;即每一次交易的輸入值都必須全部花掉,不能只花掉部分。
比如,我要轉出比特幣給你的錢包地址中只有 8 個比特幣,那么很簡單,我發起一個交易,把這 8 個比特幣轉到你的錢包地址中,我簽名確認這個交易。但假如我的錢包地址中有 25 個比特幣,那我發起的交易就不是轉給你 8 個比特幣,然后自己的錢包地址中還剩下 17 個比特幣。這時,我發起的交易是:從我的錢包地址中轉 8 個比特幣給你,同時轉 17 個比特幣給我的同一地址。
我們這里通過一個比特幣交易的例子加深對于UTXO的理解:
1. 假設Alice之前通過挖礦獲得了 12個比特幣,在她的地址中,這些比特幣是某個幣基交易的 UTXO?
2.Alice 發起兩個交易,第一個交易的輸入是自己的上一個交易,輸出是 Bob 的地址,數量是 2個比特幣;第二個交易的輸出是Alice自己的地址,數量是10個比特幣。Alice 用自己的私鑰對交易進行簽名。
8.共識機制
8.1 什么是共識?
共識,從語文的角度進行理解,即許多不同的人對同一件事情達成一樣的或者至少說方向一致的看法。這個解釋同樣適用于比特幣網絡。
達成共識的主體
當前這個區塊鏈中的一些節點,到底哪些節點需要達成一致,這是一個需要考慮的問題。
對什么達成一致
共識機制涉及了區塊該如何生成以及生成之后如何選擇的問題。 ——區塊和交易
在區塊鏈當中,由于每個節點都是平等的,沒有一個中心機構的存在,因此這時候就需要通過共識機制來達成節點間的一致。
8.2 什么是共識算法?
共識算法是為了達成共識所依據的一種規則,是篩選出具有代表性的節點的方法。 為此,區塊鏈設計了一定的底層算法,通過這個特定的算法來選出那個可以生成新區塊的節點,同時對于每一筆在這條區塊鏈上進行的交易是否準許完成進行了約束和規定,也就是共識算法。共識算法規定了,下一個新區塊由哪個礦工生成,同時,在這條區塊鏈上一筆交易要達成,需要被共識算法選出的部分節點達成一致的觀點,也就是說對于一筆交易,如果利益不相干的若干個結點能夠達成共識,就可以認為全網對此也能夠達成共識。
8.3 比特幣的共識算法——PoW
比特幣采用工作量證明(PoW, Proof of Work)算法,用來確認你做過一定量的工作。
區塊鏈中的每個礦工都有資格生成區塊,因此為了決定下一個區塊由誰生成,需要通過一定的方法來決定。在Pow機制中,所有結點通過隨機的嘗試和計算,直到有一個結點找到了那個隨機哈希散列的數值解,成為有資格生成新區塊的主體。
·優點:完全去中心化
·缺點:1. 挖礦行為造成了大量的資源浪費 2. 達成共識所需要的周期較長
PoW如何證明你的工作量呢?
通過工作結果——>當用戶做一定難度的工作得出一個結果時,通過展現出這個結果證明你完成了一定的工作量——>也就是說PoW作為一種共識機制, 它是結果導向而非過程導向的。
為什么不采用過程導向的共識機制?
因為在實際應用中,如果我們通過監測工作的整個過程來證明工作量,這是極為低效的,為了保證一定的效率,就設計了通過驗證結果的方式證明工作量的方法。
PoW的特征:不對稱性
進行實際工作的用戶需要付出很多的工作量才能得到一個符合已定條件的結果,但是作為驗證方卻可以根據用戶提供的材料很容易重算這個結果,同時驗證這個結果是否滿足提前規定好的條件。
所以,在工作量證明中,你工作的時間越長,工作時采用的設備越先進,你的工作量就越高,你收獲的也會越多。雖然短期看可能有運氣因素,但是宏觀長期來看是公平的,誰工作付出的多,誰得到的就多。
9. (51%攻擊)
9.1 算力
算力,也叫哈希率,是用來衡量進行哈希運算的能力的指標,或者說進行一次哈希計算所需要使用的時間。如果說網絡達到了10T hash/s(10T哈希每秒)的哈希率時,就意味著它可以每秒進行10萬億次計算。
哈希碰撞:解出隨機哈希值不斷嘗試的過程。
一個挖礦機每秒鐘能做這種碰撞的次數,代表其算力。
礦工進行挖礦所使用的機器越先進,算力就會越高。
9.2 區塊鏈轉賬的基本原理
整個區塊鏈網絡之所以能運行,靠的就是整個網絡的“礦工“,因為他們通過算力解答加密難題,從而挖出新的區塊。挖出區塊后,他們就有權力將轉賬信息放入區塊中,然后完成這筆轉賬,這就是區塊鏈轉賬的基本原理。
9.3 51%攻擊
51%攻擊(Majority Attack),就是說在整個網絡中有人的算力超過了全網的50%。那么他就可以嘗試對區塊鏈的狀態進行修改,進行反向交易,實現雙花。
典型案例
我們設想,Alice現在控制了比特幣網絡上51%以上的算力,在控制算力的期間,她把一定數量的比特幣發給自己在交易所的錢包,這條分支我們命名為分支A。同時,她又把這些比特幣發給另一個自己控制的錢包,這條分支我們命名為分支B。分支A上的交易被確認后,她立馬賣掉這些比特幣,成功套現。這時候,分支A成為主鏈。然后,Alice在分支B上進行挖礦,因為她控制了全網50%以上的算力,所以有很大的幾率獲得記賬權,于是很快,分支B的長度就超過了分支A的長度,那么分支B就會成為主鏈,分支A上的交易就會被回滾。所謂回滾,指的是程序或數據處理錯誤,將程序或數據恢復到上一次正確狀態的行為。
這時候,由于交易回滾,分支A恢復到Alice發起第一筆交易之前的狀態,所以她之前換成現金的那些比特幣又回到了自己手里。于是這些比特幣就成為了交易所的損失。最后,Alice把這些比特幣發到自己的另一個錢包。就這樣,她憑借51%以上的算力控制,實現了同一筆token的“雙花”。
9.4 什么時候才會發生51%攻擊呢?
某個礦池的算力過大
ps:礦池(Mining Pool),為了將少量算力合并聯合運作所建立的網站。
由于現在生產新區塊越來越難,出現了礦工間合作組成礦池,匯聚數以千計參與者們的算力,一起參與挖礦并分享獎勵的行為。在這種情況下,一旦某個礦池匯集了過多的礦工,其算力超過了全網的50%,這時就出現了51%攻擊的風險
有無限的資本
擁有無限的資本,購買無限多的設備,就可以發起51%的攻擊
9.5 51%攻擊悖論
雖然看起來51%攻擊非常恐怖,不過這通常僅存在于理論情況下。因為如果你想做到,首先需要足夠的錢去掌控全網51%的算力,這將是非常大的一筆投資。其次在攻擊后,幣種價格會受到影響,你要賣出非常多的幣才能達到收支平衡。這就是51%攻擊悖論。