比特幣是一種電子貨幣,是一種基于密碼學的貨幣,在2008年11月1日由中本聰發表比特幣白皮書,文中提出了一種去中心化的電子記賬系統,我們平時的電子現金是銀行來記賬,因為銀行的背后是國家信用。去中心化電子記賬系統是參與者共同記賬。比特幣可以防止主權危機、信用風險。其好處不多做贅述,這一層面介紹的文章很多,本文主要從更深層的技術原理角度進行介紹。
因為記賬有獎勵,記賬有手續費的收益,而且打包區塊的人有系統獎勵,獎勵方案是,每十分鐘生成一個區塊,每生成一個區塊會獎勵一定數量的比特幣,最開始是50個BTC,過4年會獎勵25個BTC,再過4年再減少一半,以此類推。這樣比特幣的產生會越來越少,越來越趨近于一個最大值,計算公式是:50×6×24×365×4×(1+1/2+1/4+1/8+…)≈2100萬,其中最初獎勵50個比特幣,每小時有6個區塊,每天24小時,每年365天,前四年是如此,之后每四年減半。
此外,記賬獎勵還有每筆交易的小額手續費,每個交易發起都會附帶一定的手續費,這些手續費是給記賬的礦工的。
各個節點通過工作量證明機制來爭奪記賬權,他們計算一個很復雜的數學題,第一個計算出來的節點就是下一個區塊的產生者。這個數學題很難,難到沒有一個人能同過腦子算出來,它是基于概率的方法,礦工必須通過遍歷、猜測和嘗試的方法才能解開這個未知數。那么這個數學難題到底是什么呢?下面詳細介紹。
4.1哈希函數
哈希函數又稱為數字摘要或散列函數,它的特點是輸入一個字符串,可以生成另外一個字符串,但是如果輸入不同,輸出的字符串就一定不同,而且通過輸出的字符串,不能反推出輸入。舉個簡單的例子,對1-100內的數模10,可以認為是一種哈希方法,比如98%10=8,66%10=6,98和66是輸入,模10是哈希函數,8和6是輸出,在這個模型中,通過6和8無法推斷輸入是66和98,因為還可能是56和88等,當然因為這個例子比較簡單,所以會出現哈希碰撞,即66和56的結果都是6,輸出的結果相同。一個優秀的哈希函數,可以做到輸出一定不同,哈希碰撞的概率幾乎為0。常見的哈希函數有很多,比如MD系列和SHA系列等,比特幣采用的SHA256算法,即輸入一個字符串,輸出一個256位的二進制數。下面是程序運行的結果。
通過程序結果可以看出,輸入的源信息不同,得到的結果也不同(為了方便,結果用64位16進制表示),即使是orange多了一個句號,也會產生截然不同的結果。同時,通過輸出的十六進制字符串,也無法倒推出輸入。對于比特幣,只要了解SHA256的功能即可,如果感興趣可以深入了解SHA256的具體算法。需要SHA256的C++源碼留言郵箱或私信。
4.2挖礦原理
首先介紹一下比特幣每個區塊的數據結構,每個區塊由區塊頭和區塊體兩部分組成。
區塊體中包含了礦工搜集的若干交易信息,圖中假設有8個交易被收錄在區塊中,所有的交易生成一顆默克爾樹,默克爾樹是一種數據結構,它將葉子節點兩兩哈希,生成上一層節點,上層節點再哈希,生成上一層,直到最后生成一個樹根,稱之為默克爾樹根,只有樹根保留在區塊頭中,這樣可以節省區塊頭的空間,也便于交易的驗證。
區塊頭中包含父區塊的哈希,版本號,當前時間戳,難度值,隨機數和上面提到的默克爾樹根。
假設區塊鏈已經鏈接到了某個塊,有ABCD四個節點已經搜集了前十分鐘內全網中的一些交易信息,他們選出其中約4k條交易,打包好,生成默克爾樹根,將區塊頭中的信息,即發區塊哈希+版本號+時間戳+難度值+隨機數+默克爾樹根組成一個字符串str,通過兩次哈希函數得出一個256的二進制數,即SHA256(SHA256(str)) = 10010011……共256位,比特幣要求,生成的結果,前n位必須是0,n就是難度值,如果現在生成的二進制數不符合要求,就必須改變隨機數的值,重新計算,只到算出滿足條件的結果為止。假設現在n是5,則生成的二進制數必須是00000……(共256位)。一旦挖礦成功,礦工就可以廣播這個消息到全網,其他的礦工就會基于該區塊繼續挖礦。下一個區塊頭中的父區塊哈希值就是上一個區塊生成的00000……這個數。
解決這個數學難題要靠運氣,理論上,運氣最好的礦工可能1次哈希就能算出結果,運氣差的可能永遠都算不出來。但是總體來看,如果一個礦工的算力越大,單位時間內進行的哈希次數就越多,就越可能在短時間內挖礦成功。
那么n是如何確定的呢?比特幣設計者希望,總體上平均每十分鐘產生一個區塊,總體上來看,挖礦成功的概率為1/2^n。現假設世界上有1W臺礦機,每臺礦機的算力是14T次/s = 1.4×10^13次/s,單位次/s稱之為哈希率,10分鐘是600s,所以10分鐘可以做8×10^19次哈希運算,從概率角度看,想要挖礦成功需要做2^n次運算,可以列出等式2^n = 8×10^19,可以解出n約為66。所以對于這種方法,我們沒有方法使得自己的運氣變的更好,只能提高自己的算力,盡快的算出結果。
另外,需要模擬挖礦過程的C++代碼可以回復郵箱,代碼可以通過調整難度值,模擬比特幣的挖礦算法,控制區塊產生的速度。
這部分是理解比特幣很重要的部分。
5.1電子簽名技術
身份認證技術在生活中很常見,可以是人臉識別、簽字、指紋等,但是這些方法在數字貨幣領域并不安全,因為它們一旦數字化,都可以通過復制的方法偽造。所以比特幣采用了電子簽名的方法。
注冊成為比特幣用戶時,系統會根據隨機數生成一個私鑰,私鑰會生成一個公鑰,公鑰又會生成一個地址,其中私鑰必須保密,可以保存到硬盤里或者記到腦子里,因為這個私鑰是使用相應地址上的比特幣的唯一標識,一旦丟失,所有的比特幣將無法使用。下面介紹具體的轉換過程,不感興趣可以不看,只要知道隨機數->私鑰->公鑰->錢包地址這個過程,其中私鑰可以對一串字符進行加密,而公鑰可以對其進行解密,這就是非對稱加密,這類算法總體上的功能都是一樣的,只是具體算法有區別,由于這些算法比較復雜,與SHA265算法一樣不多做介紹,感興趣可以深入了解具體算法,但是對于比特幣系統,只要了解其功能即可。典型的算法是RSA,比特幣采用橢圓曲線加密算法。
轉換過程(選讀,不影響理解)
1、首先使用隨機數發生器生成一個私鑰,它是一個256位的二進制數。私鑰是不能公開的,相當于銀行卡的密碼。
2、私鑰經過SECP256K1算法生成公鑰,SECP256K1是一種橢圓曲線加密算法,功能和RSA算法類似,通過一個已知的私鑰,生成一個公鑰,但是通過公鑰不能反推出私鑰。
3、同SHA256算法一樣,RIPEMD160也是一種HASH算法,由公鑰可以得到公鑰的哈希值,而通過哈希值無法推出公鑰。
4、將一個字節的版本號連接到公鑰哈希頭部,然后對其進行兩次SHA256運算,將結果的前4字節作為公鑰哈希的校驗值,連接在其尾部。
5、將上一步的結果使用BASE58進行編碼,就得到了錢包地址(相當于銀行賬戶)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
所以,通過以上的過程我們可以總結出私鑰、公鑰、錢包之間的關系如下圖。可以看到通過私鑰可以推出所有的值,公鑰哈希和錢包地址之間可以通過BASE58和BASE58解碼算法相互轉化。
了解了公鑰、私鑰、地址的概念后,防偽驗證的過程就很容易理解,當A發起一筆交易后,對消息進行哈希,生成數字摘要,對數字摘要,通過私鑰加密,生成一個密碼。之后A會廣播這個條交易消息、公鑰以及密碼。收到消息的人首先對交易信息進行哈希生成摘要1,再通過公鑰對密碼進行解密,生成摘要2,這樣,如果兩個摘要相同,說明這個消息確實是A發出的。所謂的簽名,就是密文。
5.2余額檢查
余額的概念應該說根深蒂固,余額是伴隨著稱之為借貸記賬法而產生的,也是目前銀行普遍采用的方法,將一個人的交易記錄統計好后算出一個余額,但是在比特幣中沒有余額這個概念,因為其采用的是UXTO模型的記賬方法。比如A->B10個比特幣,B->C5個比特幣,對于第二筆交易來說,B在發起這筆交易時要注明第一筆交易的信息,這樣就可以知道B曾經從A那里收到過10個比特幣,說明滿足第二筆交易發起的條件。所以比特幣中余額的檢查是通過追溯的方法。
上圖描述了兩筆交易,交易10001中,B向C轉了10個比特幣,驗證這筆交易的過程是:首先將B的簽名通過B的公鑰解密,然后再和交易的具體內容(B簽名左側)對比,如果相同,說明消息是B發出的,然后再檢查10000這個交易是否真的存在以及它的內容的真實性。這兩點都滿足了,就說明交易10001是可以被接受的,否則拒絕接受。
實際上,真實的交易比這個復雜的多,因為有可能是多筆交易構成了輸入,比如B->C20個比特幣,是由多筆交易A->B10,D->B10構成的,則前一筆交易ID就是兩個ID,甚至可能更多。這里為了簡單描述,只列舉一筆交易。
5.3雙重支付
A同時發了兩條消息,同時給B和C轉了10個比特幣,實際上他只有10個會怎么樣?假設D節點先收到了轉給B10個BTC,然后收到了轉給C10個比特幣,通過上面的驗證方法,自然會拒絕后面的一個,與此同時,E節點可能先收到了轉給C10個BTC,然后收到了轉給B10個比特幣,他自然會拒絕后者。至于哪一筆交易最終會上鏈,就要看D和E哪個先解決難題,成功挖礦。
5.4防止篡改
假設A轉給B10個比特幣,但是他想把這個信息從區塊鏈上刪除,這樣大家就都不知道這個事情存在,就可以賴賬。
首先說一下最長鏈原則,假設某一個區塊后面有兩個礦工同時挖到了礦,或者由于網絡延遲等原因產生了分歧,這時,各個節點先隨意根據自己認為對的區塊挖礦,只到下一個區塊產生,這時會有兩條鏈,但是有一條是長的,比特幣規定,以最長的鏈為準。如果某個節點仍然的固執的以較短的鏈為準,他就是在和大多數算力作對,這樣做的結果是,他挖的塊不被大家認可,會浪費時間和算力。
回到上面的場景,A想賴賬,就只能從記錄了A->B10個比特幣這個消息的區塊的前一個區塊開始重新挖礦,造出一個支鏈來,但是實際上的區塊已經前進了很多,他只能不停的追趕,而且在追趕的同時,主鏈也在前進,他必須以比主鏈快的速度前進,如果他的算力足夠大,理論上通過較長的時間確實可以追趕成功,就實現了對交易信息的篡改。然而其實這幾乎是不可能的,因為就算算力再大,平均出塊速度也是10分鐘,從非技術的角度講,一個人如果掌握了全網一半以上的算力,他為什么不在主鏈上繼續挖礦呢?一個富可敵國的人應該不會甘愿去做一個小偷吧。
區塊鏈并不等同于比特幣,比特幣也不是區塊鏈,區塊鏈只是比特幣應用的一種技術,這個技術能給我們帶來啟發,比特幣的偉大之處在于應用了前所未有的區塊鏈技術。區塊鏈技術還能在哪些方面應用還需繼續探索。
比特幣是區塊鏈技術最成功的應用,但是比特幣本身也有很多問題,它想通過發行貨幣來挑戰主權貨幣,這個動機有待商榷。此外,由于比特幣的匿名性,只需要一個公鑰或地址就能進行交易,為黑色產業提供了很好的平臺。另外,比特幣并不是一個成熟的支付系統,它具有吞吐率低,可拓展性差等缺點。
相關推薦:
如何挖比特幣(家用windows電腦挖)圖文教程
比特幣算力是怎么影響BTC走勢的?
比特幣和以太坊及其他虛擬貨幣的區別是什么?
在幣安交易所買比特幣安全嗎?幣安APP安全嗎?
比特幣算力難度增加對礦工是好是壞?算力會對價格造成什么影響?
假設現有4個人分別稱之為ABCD,他們之間發起了3個交易,A轉給B10個比特幣,B轉給C5個比特幣,C轉給D2個比特幣。如果是傳統的記賬方式,這些交易會記錄在銀行的系統中,這些信息由銀行來記錄,我們相信銀行不會隨意添加、刪除或修改一條交易記錄,我們也不會關注到底有哪些交易,我們只關注自己的賬戶余額。而比特幣的記賬方式為ABCD每個人保存了這樣一份賬本,賬本上記錄了上述交易內容,如果每個人賬本實時的一致,ABCD就不再需要銀行。
比特幣是這樣做的,每當有人發起一筆交易,他就要將一筆交易廣播至全網,由全網中的某一個人,把一段時間內的交易打包好記錄到一個區塊上,再按照順序把這些區塊,一個一個的鏈接在一起,進而形成了一個鏈條,這就是所謂的區塊鏈。
那么問題來了
1、我憑什么要參與這個系統,我為什么要動用自己的計算機資源來存儲這些信息呢?
2、以誰的記錄為準呢?比如上面的賬單順序,A用戶可能是這個順序,但是B可能順序不一樣,甚至可能B根本就沒有接收到C給D轉賬的這個消息。
3、比特幣如果做到支付功能,保證該是誰的錢就是誰的錢,而且只有其所有者才能花。
4、如何防偽、防篡改以及雙重支付,防偽是驗證每條交易的真的是某人發出的,比如B可能杜撰一條消息,說某某給我轉了一筆錢,這就是一個假消息,或者B說我給某人轉了多少錢,但是實際上他并沒有這么多錢,又怎么辦。防篡改指的是B可能想從區塊鏈上把自己曾經轉給某人錢的記錄刪掉,這樣他的余額就會增加。雙重支付是指,B只有10比特幣,他同時向C和D轉10個比特幣,造成雙重花費。
上一篇:LATOKEN
相關閱讀推薦
最新資訊
最新游戲
逆轉裁判復蘇的逆轉手機版
查看第一棵樹手機版
查看單挑王
查看名將無雙PVP對戰版
查看明星制作人
查看繪真妙筆千山手機版
查看口袋怪物大戰
查看開心釣魚王
查看急速行進
查看熱門文章
熱門游戲
星球探險家 v65.94
查看團戰經理手機版 v3.0
查看迷你戰機官方版 v1.0.1
查看光明旅者安卓版 v1.1.97
查看南瓜先生大冒險官方版解謎游戲 v1.1.8官方版
查看我要如何說再見官方版 v1.00.28
查看新3D坦克 v1.0.0.20安卓版
查看僵尸小鎮聯機版 v4.2最新版
查看混亂大槍戰 v1.0.7中文版
查看神將世界 v1.5.11搶先版
查看瘋狂小人戰斗 v3.23.00官方單機版
查看水滸宋江傳2025最新版 v100.18.5
查看星艦實驗室最新版 v1.10.07
查看瘋狂派對go v0.100031安卓版
查看軍棋游戲 v1.82安卓版
查看微光正版 v1.2.1最新版
查看會說話的狗狗本
查看雷霆傳說
查看