究竟是什么讓一枚虛擬貨幣的匯率在3年間翻了25000倍,是什么力量讓央行副行長(zhǎng)“感興趣”但“不承認(rèn)”,拋開(kāi)投機(jī)與商業(yè)欺詐比特幣作為一種工具究竟有沒(méi)有價(jià)值?又是什么讓馬云爸爸痛斥200億比特幣?讓我們一起走近比特幣,了解這個(gè)讓人瘋狂的魔鬼。
一、什么是比特幣
比特幣是一種電子貨幣,是一種基于密碼學(xué)的貨幣,在2008年11月1日由中本聰發(fā)表比特幣白皮書(shū),文中提出了一種去中心化的電子記賬系統(tǒng),我們平時(shí)的電子現(xiàn)金是銀行來(lái)記賬,因?yàn)殂y行的背后是國(guó)家信用。去中心化電子記賬系統(tǒng)是參與者共同記賬。比特幣可以防止主權(quán)危機(jī)、信用風(fēng)險(xiǎn)。其好處不多做贅述,這一層面介紹的文章很多,本文主要從更深層的技術(shù)原理角度進(jìn)行介紹。
二、問(wèn)題引入
假設(shè)現(xiàn)有4個(gè)人分別稱(chēng)之為ABCD,他們之間發(fā)起了3個(gè)交易,A轉(zhuǎn)給B10個(gè)比特幣,B轉(zhuǎn)給C5個(gè)比特幣,C轉(zhuǎn)給D2個(gè)比特幣。如果是傳統(tǒng)的記賬方式,這些交易會(huì)記錄在銀行的系統(tǒng)中,這些信息由銀行來(lái)記錄,我們相信銀行不會(huì)隨意添加、刪除或修改一條交易記錄,我們也不會(huì)關(guān)注到底有哪些交易,我們只關(guān)注自己的賬戶余額。而比特幣的記賬方式為ABCD每個(gè)人保存了這樣一份賬本,賬本上記錄了上述交易內(nèi)容,如果每個(gè)人賬本實(shí)時(shí)的一致,ABCD就不再需要銀行。
比特幣是這樣做的,每當(dāng)有人發(fā)起一筆交易,他就要將一筆交易廣播至全網(wǎng),由全網(wǎng)中的某一個(gè)人,把一段時(shí)間內(nèi)的交易打包好記錄到一個(gè)區(qū)塊上,再按照順序把這些區(qū)塊,一個(gè)一個(gè)的鏈接在一起,進(jìn)而形成了一個(gè)鏈條,這就是所謂的區(qū)塊鏈。
那么問(wèn)題來(lái)了
1、我憑什么要參與這個(gè)系統(tǒng),我為什么要?jiǎng)佑米约旱挠?jì)算機(jī)資源來(lái)存儲(chǔ)這些信息呢?
2、以誰(shuí)的記錄為準(zhǔn)呢?比如上面的賬單順序,A用戶可能是這個(gè)順序,但是B可能順序不一樣,甚至可能B根本就沒(méi)有接收到C給D轉(zhuǎn)賬的這個(gè)消息。
3、比特幣如果做到支付功能,保證該是誰(shuí)的錢(qián)就是誰(shuí)的錢(qián),而且只有其所有者才能花。
4、如何防偽、防篡改以及雙重支付,防偽是驗(yàn)證每條交易的真的是某人發(fā)出的,比如B可能杜撰一條消息,說(shuō)某某給我轉(zhuǎn)了一筆錢(qián),這就是一個(gè)假消息,或者B說(shuō)我給某人轉(zhuǎn)了多少錢(qián),但是實(shí)際上他并沒(méi)有這么多錢(qián),又怎么辦。防篡改指的是B可能想從區(qū)塊鏈上把自己曾經(jīng)轉(zhuǎn)給某人錢(qián)的記錄刪掉,這樣他的余額就會(huì)增加。雙重支付是指,B只有10比特幣,他同時(shí)向C和D轉(zhuǎn)10個(gè)比特幣,造成雙重花費(fèi)。
三、為什么要記賬?
因?yàn)橛涃~有獎(jiǎng)勵(lì),記賬有手續(xù)費(fèi)的收益,而且打包區(qū)塊的人有系統(tǒng)獎(jiǎng)勵(lì),獎(jiǎng)勵(lì)方案是,每十分鐘生成一個(gè)區(qū)塊,每生成一個(gè)區(qū)塊會(huì)獎(jiǎng)勵(lì)一定數(shù)量的比特幣,最開(kāi)始是50個(gè)BTC,過(guò)4年會(huì)獎(jiǎng)勵(lì)25個(gè)BTC,再過(guò)4年再減少一半,以此類(lèi)推。這樣比特幣的產(chǎn)生會(huì)越來(lái)越少,越來(lái)越趨近于一個(gè)最大值,計(jì)算公式是:50×6×24×365×4×(1+1/2+1/4+1/8+…)≈2100萬(wàn),其中最初獎(jiǎng)勵(lì)50個(gè)比特幣,每小時(shí)有6個(gè)區(qū)塊,每天24小時(shí),每年365天,前四年是如此,之后每四年減半。
此外,記賬獎(jiǎng)勵(lì)還有每筆交易的小額手續(xù)費(fèi),每個(gè)交易發(fā)起都會(huì)附帶一定的手續(xù)費(fèi),這些手續(xù)費(fèi)是給記賬的礦工的。
四、以誰(shuí)為準(zhǔn)?
各個(gè)節(jié)點(diǎn)通過(guò)工作量證明機(jī)制來(lái)爭(zhēng)奪記賬權(quán),他們計(jì)算一個(gè)很復(fù)雜的數(shù)學(xué)題,第一個(gè)計(jì)算出來(lái)的節(jié)點(diǎn)就是下一個(gè)區(qū)塊的產(chǎn)生者。這個(gè)數(shù)學(xué)題很難,難到?jīng)]有一個(gè)人能同過(guò)腦子算出來(lái),它是基于概率的方法,礦工必須通過(guò)遍歷、猜測(cè)和嘗試的辦法才能解開(kāi)這個(gè)未知數(shù)。那么這個(gè)數(shù)學(xué)難題到底是什么呢?下面詳細(xì)介紹。
4.1哈希函數(shù)
哈希函數(shù)又稱(chēng)為數(shù)字摘要或散列函數(shù),它的特點(diǎn)是輸入一個(gè)字符串,可以生成另外一個(gè)字符串,但是如果輸入不同,輸出的字符串就一定不同,而且通過(guò)輸出的字符串,不能反推出輸入。舉個(gè)簡(jiǎn)單的例子,對(duì)1-100內(nèi)的數(shù)模10,可以認(rèn)為是一種哈希方法,比如98%10=8,66%10=6,98和66是輸入,模10是哈希函數(shù),8和6是輸出,在這個(gè)模型中,通過(guò)6和8無(wú)法推斷輸入是66和98,因?yàn)檫€可能是56和88等,當(dāng)然因?yàn)檫@個(gè)例子比較簡(jiǎn)單,所以會(huì)出現(xiàn)哈希碰撞,即66和56的結(jié)果都是6,輸出的結(jié)果相同。一個(gè)優(yōu)秀的哈希函數(shù),可以做到輸出一定不同,哈希碰撞的概率幾乎為0。常見(jiàn)的哈希函數(shù)有很多,比如MD系列和SHA系列等,比特幣采用的SHA256算法,即輸入一個(gè)字符串,輸出一個(gè)256位的二進(jìn)制數(shù)。下面是程序運(yùn)行的結(jié)果。
通過(guò)程序結(jié)果可以看出,輸入的源信息不同,得到的結(jié)果也不同(為了方便,結(jié)果用64位16進(jìn)制表示),即使是orange多了一個(gè)句號(hào),也會(huì)產(chǎn)生截然不同的結(jié)果。同時(shí),通過(guò)輸出的十六進(jìn)制字符串,也無(wú)法倒推出輸入。對(duì)于比特幣,只要了解SHA256的功能即可,如果感興趣可以深入了解SHA256的具體算法。需要SHA256的C++源碼留言郵箱或私信。
4.2挖礦原理
首先介紹一下比特幣每個(gè)區(qū)塊的數(shù)據(jù)結(jié)構(gòu),每個(gè)區(qū)塊由區(qū)塊頭和區(qū)塊體兩部分組成。
區(qū)塊體中包含了礦工搜集的若干交易信息,圖中假設(shè)有8個(gè)交易被收錄在區(qū)塊中,所有的交易生成一顆默克爾樹(shù),默克爾樹(shù)是一種數(shù)據(jù)結(jié)構(gòu),它將葉子節(jié)點(diǎn)兩兩哈希,生成上一層節(jié)點(diǎn),上層節(jié)點(diǎn)再哈希,生成上一層,直到最后生成一個(gè)樹(shù)根,稱(chēng)之為默克爾樹(shù)根,只有樹(shù)根保留在區(qū)塊頭中,這樣可以節(jié)省區(qū)塊頭的空間,也便于交易的驗(yàn)證。
區(qū)塊頭中包含父區(qū)塊的哈希,版本號(hào),當(dāng)前時(shí)間戳,難度值,隨機(jī)數(shù)和上面提到的默克爾樹(shù)根。
假設(shè)區(qū)塊鏈已經(jīng)鏈接到了某個(gè)塊,有ABCD四個(gè)節(jié)點(diǎn)已經(jīng)搜集了前十分鐘內(nèi)全網(wǎng)中的一些交易信息,他們選出其中約4k條交易,打包好,生成默克爾樹(shù)根,將區(qū)塊頭中的信息,即發(fā)區(qū)塊哈希+版本號(hào)+時(shí)間戳+難度值+隨機(jī)數(shù)+默克爾樹(shù)根組成一個(gè)字符串str,通過(guò)兩次哈希函數(shù)得出一個(gè)256的二進(jìn)制數(shù),即SHA256(SHA256(str)) = 10010011……共256位,比特幣要求,生成的結(jié)果,前n位必須是0,n就是難度值,如果現(xiàn)在生成的二進(jìn)制數(shù)不符合要求,就必須改變隨機(jī)數(shù)的值,重新計(jì)算,只到算出滿足條件的結(jié)果為止。假設(shè)現(xiàn)在n是5,則生成的二進(jìn)制數(shù)必須是00000……(共256位)。一旦挖礦成功,礦工就可以廣播這個(gè)消息到全網(wǎng),其他的礦工就會(huì)基于該區(qū)塊繼續(xù)挖礦。下一個(gè)區(qū)塊頭中的父區(qū)塊哈希值就是上一個(gè)區(qū)塊生成的00000……這個(gè)數(shù)。
解決這個(gè)數(shù)學(xué)難題要靠運(yùn)氣,理論上,運(yùn)氣最好的礦工可能1次哈希就能算出結(jié)果,運(yùn)氣差的可能永遠(yuǎn)都算不出來(lái)。但是總體來(lái)看,如果一個(gè)礦工的算力越大,單位時(shí)間內(nèi)進(jìn)行的哈希次數(shù)就越多,就越可能在短時(shí)間內(nèi)挖礦成功。
那么n是如何確定的呢?比特幣設(shè)計(jì)者希望,總體上平均每十分鐘產(chǎn)生一個(gè)區(qū)塊,總體上來(lái)看,挖礦成功的概率為1/2^n?,F(xiàn)假設(shè)世界上有1W臺(tái)礦機(jī),每臺(tái)礦機(jī)的算力是14T次/s = 1.4×10^13次/s,單位次/s稱(chēng)之為哈希率,10分鐘是600s,所以10分鐘可以做8×10^19次哈希運(yùn)算,從概率角度看,想要挖礦成功需要做2^n次運(yùn)算,可以列出等式2^n = 8×10^19,可以解出n約為66。所以對(duì)于這種方法,我們沒(méi)有辦法使得自己的運(yùn)氣變的更好,只能提高自己的算力,盡快的算出結(jié)果。
另外,需要模擬挖礦過(guò)程的C++代碼可以回復(fù)郵箱,代碼可以通過(guò)調(diào)整難度值,模擬比特幣的挖礦算法,控制區(qū)塊產(chǎn)生的速度。
五、如何防偽、防篡改、防雙重支付等問(wèn)題
這部分是理解比特幣很重要的部分。
5.1電子簽名技術(shù)
身份認(rèn)證技術(shù)在生活中很常見(jiàn),可以是人臉識(shí)別、簽字、指紋等,但是這些方法在數(shù)字貨幣領(lǐng)域并不安全,因?yàn)樗鼈円坏?shù)字化,都可以通過(guò)復(fù)制的方法偽造。所以比特幣采用了電子簽名的方法。
注冊(cè)成為比特幣用戶時(shí),系統(tǒng)會(huì)根據(jù)隨機(jī)數(shù)生成一個(gè)私鑰,私鑰會(huì)生成一個(gè)公鑰,公鑰又會(huì)生成一個(gè)地址,其中私鑰必須保密,可以保存到硬盤(pán)里或者記到腦子里,因?yàn)檫@個(gè)私鑰是使用相應(yīng)地址上的比特幣的唯一標(biāo)識(shí),一旦丟失,所有的比特幣將無(wú)法使用。下面介紹具體的轉(zhuǎn)換過(guò)程,不感興趣可以不看,只要知道隨機(jī)數(shù)->私鑰->公鑰->錢(qián)包地址這個(gè)過(guò)程,其中私鑰可以對(duì)一串字符進(jìn)行加密,而公鑰可以對(duì)其進(jìn)行解密,這就是非對(duì)稱(chēng)加密,這類(lèi)算法總體上的功能都是一樣的,只是具體算法有區(qū)別,由于這些算法比較復(fù)雜,與SHA265算法一樣不多做介紹,感興趣可以深入了解具體算法,但是對(duì)于比特幣系統(tǒng),只要了解其功能即可。典型的算法是RSA,比特幣采用橢圓曲線加密算法。
轉(zhuǎn)換過(guò)程(選讀,不影響理解)
1、首先使用隨機(jī)數(shù)發(fā)生器生成一個(gè)私鑰,它是一個(gè)256位的二進(jìn)制數(shù)。私鑰是不能公開(kāi)的,相當(dāng)于銀行卡的密碼。
2、私鑰經(jīng)過(guò)SECP256K1算法生成公鑰,SECP256K1是一種橢圓曲線加密算法,功能和RSA算法類(lèi)似,通過(guò)一個(gè)已知的私鑰,生成一個(gè)公鑰,但是通過(guò)公鑰不能反推出私鑰。
3、同SHA256算法一樣,RIPEMD160也是一種HASH算法,由公鑰可以得到公鑰的哈希值,而通過(guò)哈希值無(wú)法推出公鑰。
4、將一個(gè)字節(jié)的版本號(hào)連接到公鑰哈希頭部,然后對(duì)其進(jìn)行兩次SHA256運(yùn)算,將結(jié)果的前4字節(jié)作為公鑰哈希的校驗(yàn)值,連接在其尾部。
5、將上一步的結(jié)果使用BASE58進(jìn)行編碼,就得到了錢(qián)包地址(相當(dāng)于銀行賬戶)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa
所以,通過(guò)以上的過(guò)程我們可以總結(jié)出私鑰、公鑰、錢(qián)包之間的關(guān)系如下圖??梢钥吹酵ㄟ^(guò)私鑰可以推出所有的值,公鑰哈希和錢(qián)包地址之間可以通過(guò)BASE58和BASE58解碼算法相互轉(zhuǎn)化。
了解了公鑰、私鑰、地址的概念后,防偽驗(yàn)證的過(guò)程就很容易理解,當(dāng)A發(fā)起一筆交易后,對(duì)消息進(jìn)行哈希,生成數(shù)字摘要,對(duì)數(shù)字摘要,通過(guò)私鑰加密,生成一個(gè)密碼。之后A會(huì)廣播這個(gè)條交易消息、公鑰以及密碼。收到消息的人首先對(duì)交易信息進(jìn)行哈希生成摘要1,再通過(guò)公鑰對(duì)密碼進(jìn)行解密,生成摘要2,這樣,如果兩個(gè)摘要相同,說(shuō)明這個(gè)消息確實(shí)是A發(fā)出的。所謂的簽名,就是密文。
5.2余額檢查
余額的概念應(yīng)該說(shuō)根深蒂固,余額是伴隨著稱(chēng)之為借貸記賬法而產(chǎn)生的,也是目前銀行普遍采用的方法,將一個(gè)人的交易記錄統(tǒng)計(jì)好后算出一個(gè)余額,但是在比特幣中沒(méi)有余額這個(gè)概念,因?yàn)槠洳捎玫氖荱XTO模型的記賬方法。比如A->B10個(gè)比特幣,B->C5個(gè)比特幣,對(duì)于第二筆交易來(lái)說(shuō),B在發(fā)起這筆交易時(shí)要注明第一筆交易的信息,這樣就可以知道B曾經(jīng)從A那里收到過(guò)10個(gè)比特幣,說(shuō)明滿足第二筆交易發(fā)起的條件。所以比特幣中余額的檢查是通過(guò)追溯的方法。
上圖描述了兩筆交易,交易10001中,B向C轉(zhuǎn)了10個(gè)比特幣,驗(yàn)證這筆交易的過(guò)程是:首先將B的簽名通過(guò)B的公鑰解密,然后再和交易的具體內(nèi)容(B簽名左側(cè))對(duì)比,如果相同,說(shuō)明消息是B發(fā)出的,然后再檢查10000這個(gè)交易是否真的存在以及它的內(nèi)容的真實(shí)性。這兩點(diǎn)都滿足了,就說(shuō)明交易10001是可以被接受的,否則拒絕接受。
實(shí)際上,真實(shí)的交易比這個(gè)復(fù)雜的多,因?yàn)橛锌赡苁嵌喙P交易構(gòu)成了輸入,比如B->C20個(gè)比特幣,是由多筆交易A->B10,D->B10構(gòu)成的,則前一筆交易ID就是兩個(gè)ID,甚至可能更多。這里為了簡(jiǎn)單描述,只列舉一筆交易。
5.3雙重支付
A同時(shí)發(fā)了兩條消息,同時(shí)給B和C轉(zhuǎn)了10個(gè)比特幣,實(shí)際上他只有10個(gè)會(huì)怎么樣?假設(shè)D節(jié)點(diǎn)先收到了轉(zhuǎn)給B10個(gè)BTC,然后收到了轉(zhuǎn)給C10個(gè)比特幣,通過(guò)上面的驗(yàn)證方法,自然會(huì)拒絕后面的一個(gè),與此同時(shí),E節(jié)點(diǎn)可能先收到了轉(zhuǎn)給C10個(gè)BTC,然后收到了轉(zhuǎn)給B10個(gè)比特幣,他自然會(huì)拒絕后者。至于哪一筆交易最終會(huì)上鏈,就要看D和E哪個(gè)先解決難題,成功挖礦。
5.4防止篡改
假設(shè)A轉(zhuǎn)給B10個(gè)比特幣,但是他想把這個(gè)信息從區(qū)塊鏈上刪除,這樣大家就都不知道這個(gè)事情存在,就可以賴賬。
首先說(shuō)一下最長(zhǎng)鏈原則,假設(shè)某一個(gè)區(qū)塊后面有兩個(gè)礦工同時(shí)挖到了礦,或者由于網(wǎng)絡(luò)延遲等原因產(chǎn)生了分歧,這時(shí),各個(gè)節(jié)點(diǎn)先隨意根據(jù)自己認(rèn)為對(duì)的區(qū)塊挖礦,只到下一個(gè)區(qū)塊產(chǎn)生,這時(shí)會(huì)有兩條鏈,但是有一條是長(zhǎng)的,比特幣規(guī)定,以最長(zhǎng)的鏈為準(zhǔn)。如果某個(gè)節(jié)點(diǎn)仍然的固執(zhí)的以較短的鏈為準(zhǔn),他就是在和大多數(shù)算力作對(duì),這樣做的結(jié)果是,他挖的塊不被大家認(rèn)可,會(huì)浪費(fèi)時(shí)間和算力。
回到上面的場(chǎng)景,A想賴賬,就只能從記錄了A->B10個(gè)比特幣這個(gè)消息的區(qū)塊的前一個(gè)區(qū)塊開(kāi)始重新挖礦,造出一個(gè)支鏈來(lái),但是實(shí)際上的區(qū)塊已經(jīng)前進(jìn)了很多,他只能不停的追趕,而且在追趕的同時(shí),主鏈也在前進(jìn),他必須以比主鏈快的速度前進(jìn),如果他的算力足夠大,理論上通過(guò)較長(zhǎng)的時(shí)間確實(shí)可以追趕成功,就實(shí)現(xiàn)了對(duì)交易信息的篡改。然而其實(shí)這幾乎是不可能的,因?yàn)榫退闼懔υ俅?,平均出塊速度也是10分鐘,從非技術(shù)的角度講,一個(gè)人如果掌握了全網(wǎng)一半以上的算力,他為什么不在主鏈上繼續(xù)挖礦呢?一個(gè)富可敵國(guó)的人應(yīng)該不會(huì)甘愿去做一個(gè)小偷吧。
六、總結(jié)
區(qū)塊鏈并不等同于比特幣,比特幣也不是區(qū)塊鏈,區(qū)塊鏈只是比特幣應(yīng)用的一種技術(shù),這個(gè)技術(shù)能給我們帶來(lái)啟發(fā),比特幣的偉大之處在于應(yīng)用了前所未有的區(qū)塊鏈技術(shù)。區(qū)塊鏈技術(shù)還能在哪些方面應(yīng)用還需繼續(xù)探索。
比特幣是區(qū)塊鏈技術(shù)最成功的應(yīng)用,但是比特幣本身也有很多問(wèn)題,它想通過(guò)發(fā)行貨幣來(lái)挑戰(zhàn)主權(quán)貨幣,這個(gè)動(dòng)機(jī)有待商榷。此外,由于比特幣的匿名性,只需要一個(gè)公鑰或地址就能進(jìn)行交易,為黑色產(chǎn)業(yè)提供了很好的平臺(tái)。另外,比特幣并不是一個(gè)成熟的支付系統(tǒng),它具有吞吐率低,可拓展性差等缺點(diǎn)。
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
786瀏覽量
41564 -
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453 -
比特幣
+關(guān)注
關(guān)注
57文章
7002瀏覽量
140128
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論