0.3 比特幣拷况?看這篇就夠了W骰汀(中):算法即魔法

本篇將介紹比特幣涉及的算法,由于本篇比較高能赚瘦,所以白皮哥先預(yù)告下篇將為各位帶來低耗能彩蛋:《幣圈小白粟誓?來看幣圈快問快答!》起意。

白皮哥知道大多數(shù)朋友看到“算法”就已經(jīng)暈了鹰服,所以只說兩個問題:

  1. 錢包里:

    千萬不要把私鑰告訴別人,因為私鑰=幣揽咕!

  2. 挖礦的過程類似于做因式分解題悲酷,比如:56 = 2 * 2 * 2 * 7。它的特點是只能暴力循環(huán)找答案(效率低)亲善,但是一旦找到解反向驗算(2 * 2 * 2 * 7 = 56)就非常方便设易。

好了,打醬油的各位可以退場了逗爹,以下的內(nèi)容給

的你們亡嫌。

還是這張圖:

這個過程稱為非對稱加密,并不是區(qū)塊鏈獨有掘而,在非常非常多的場合中(比如瀏覽器地址欄里的https協(xié)議)都有應(yīng)用挟冠。具體在區(qū)塊鏈技術(shù)中用到的主要是下圖中出現(xiàn)的橢圓曲線算法、哈希函數(shù)袍睡。

橢圓曲線算法

橢圓曲線算法有什么用呢知染?它可以使得每一筆交易非常容易被驗證真?zhèn)巍?/p>

舉個例子:

交易
  1. somebody是一個礦工,他挖出了1個比特幣(如上期所說斑胜,coinbase交易)控淡,這時就有一個交易0,它產(chǎn)生一個somebody鎖定腳本止潘,只有這個鎖定腳本解鎖了掺炭,這一個比特幣才能被花出去。

  2. 這時somebody想把這一個比特幣轉(zhuǎn)到addr凭戴,他就新建一個交易1涧狮,這個交易1里需要有出入賬的地址,同時產(chǎn)生一個addr鎖定腳本,這都跟前面類似者冤。但最重要的是需要有交易0的解鎖腳本肤视,因為這一個比特幣是來源于交易0的。somebody用他自己的私鑰產(chǎn)生公鑰和簽名涉枫,進而產(chǎn)生交易0的解鎖腳本邢滑,放入交易1。somebody向整個網(wǎng)絡(luò)廣播交易1愿汰。

  3. 任何收到的礦工節(jié)點都會先驗算解鎖腳本困后,需要驗證三件事:

  • 交易1的出賬公鑰和解鎖腳本公鑰一致;

  • 數(shù)字簽名是針對該交易的衬廷;

  • 數(shù)字簽名是由交易1的出賬公鑰的對應(yīng)私鑰簽的操灿,

都通過的話礦工節(jié)點就開始挖礦。挖礦最快的礦工將這筆交易寫入?yún)^(qū)塊鏈泵督,而addr的錢包應(yīng)用會發(fā)現(xiàn)自己的地址入賬了1個比特幣。addr向café花0.005個比特幣買咖啡的過程也類似庶喜。

可以注意到小腊,得益于橢圓曲線算法,這里只有簽名和公鑰在網(wǎng)絡(luò)上傳播久窟,私鑰則被嚴密保護秩冈,但是任何接收方都可以快速驗證交易來源方是否正確,以及它是否有足夠的幣斥扛。

哈希函數(shù)

哈希函數(shù)應(yīng)用更加廣泛入问,它是一種把一個任意長度的數(shù)據(jù)轉(zhuǎn)成一個字符串的算法,只要輸入不同則輸出一定不同稀颁,是一種數(shù)字指紋芬失。您在下載電影的時候匾灶,電腦需要判斷下載的文件是否完整,就可以通過哈希函數(shù)來檢查您機器里的電影的哈希值和完整版的是否一樣阶女。

在區(qū)塊鏈中,它用于公鑰向比特幣地址的計算(SHA256和RIPEMD160兩次哈希)以及挖礦時候的計算秃踩。之前的例子里闡明了錢包衬鱼,下面我們用挖礦過程來講述一下神奇的哈希函數(shù)(SHA256)。

之前說過憔杨,挖礦過程中鸟赫,礦工收到一筆交易后首先驗證交易是否有效,有效則開始挖礦計算,那么挖礦的過程是怎樣的呢惯疙?首先翠勉,礦工會把這筆有效交易放入?yún)^(qū)塊打包。礦工的目標則是用哈希函數(shù)計算這個打包完成的區(qū)塊霉颠,使得輸出的哈希值小于某個值target:

SHA256(block)<target

你可能會問对碌,函數(shù)本身(SHA256,哈希函數(shù)的一種)和區(qū)塊(block)都是確定的蒿偎,如果算出來比target大怎么辦朽们?這里就要說到區(qū)塊中除了上千筆打包的交易,還有一個隨機值nonce诉位,計算機可以不斷地嘗試不同nonce值以獲得不同的哈希骑脱,因為只要修改區(qū)塊中一點點數(shù)據(jù)(好比電影文件中丟了一幀),哈希值就千差萬別苍糠,比如:

I am Satoshi Nakamoto0 =>a80a81401765c8eddee25df36728d732... 
I am Satoshi Nakamoto1 =>f7bc9a6304a4647bb41241a677b5345f...
I am Satoshi Nakamoto2 =>ea758a8134b115298a1583ffb80ae629...
I am Satoshi Nakamoto3 =>bfa9779618ff072c903d773de30c99bd...
……

如果我需要哈希值前6位都是0叁丧,那么礦工的計算機就不斷循環(huán),來尋找這個隨機值岳瞭,終于:

I am Satoshi Nakamoto1759164 => `0000008bb8f0e731f0496b8e530da9`...

則挖礦宣告成功拥娄。

因為比特幣的設(shè)計是10分鐘左右挖出一個區(qū)塊,但全球的算力又是變化的瞳筏,所以比特幣網(wǎng)絡(luò)每隔一段時間就會通過修改前面0的位數(shù)來調(diào)整難度稚瘾,0的位數(shù)越多,則難度越大姚炕。

雖然算法的概念很難懂(這里仍然省略了數(shù)學(xué)原理)摊欠,但是當(dāng)你理解它時,你會感嘆它的精巧與美麗柱宦。正是橢圓曲線些椒,哈希算法及區(qū)塊鏈中的其他算法,共同鑄造了區(qū)塊鏈這個精密的信任魔法掸刊。

如果您不是開發(fā)者摊沉,咱們下期再見了。

下面是附加題痒给!再來介紹一下區(qū)塊鏈中涉及到的另一些算法相關(guān)問題:

  1. 公私玥及地址格式:

公鑰:公鑰是由私鑰通過橢圓曲線乘法得到的说墨,因此實際上是曲線上的一個點,具有xy坐標苍柏。因此格式分兩種:一種是以04開頭尼斧,然后直接將坐標串聯(lián)起來04xy,稱為未壓縮格式(130位)试吁;一種是因為可以從x推知y楼咳,因此只保留x和y的正負號信息母怜,稱為壓縮格式(66位)苹熏。

私鑰:私鑰是隨機產(chǎn)生的币喧,具有二進制杀餐、十六進制格式,但太長了枉长,很少直接顯示琼讽。為了減小長度跨琳,采用Base58Check算法(即去掉0脉让,O功炮,l,I的大小寫字母和10個數(shù)字組成滚澜,26*2+10-4=58)壓縮设捐,壓縮后得到WIF格式塘淑。對應(yīng)未壓縮公鑰的直接稱WIF格式存捺,對應(yīng)壓縮格式公鑰的稱壓縮格式私鑰(實際上WIF私鑰都壓縮,這里的壓縮指的是它和壓縮公鑰對應(yīng)而已)岗钩。

地址:Base58Check(RIPEMD160(SHA256(公鑰))) = 地址

即先通過SHA256哈希計算兼吓,得到結(jié)果再進入RIPEMD160哈希一遍,得到20位的哈希值隨后再Base58Check編碼一遍即可得到比特幣地址趋艘。

注意這里的Base58Check算法不是單向的凶朗,而是可雙向解碼的,類似Base64編碼搓萧,也就是很多小圖片會編碼為一串字符串在網(wǎng)頁里保存瘸洛,再交給瀏覽器來解碼回圖片次和,展示給用戶。

  1. Merkle樹
梅克爾樹

前面橢圓曲線的例子說到addr錢包發(fā)現(xiàn)區(qū)塊鏈上有一筆交易(交易1)是入賬自己地址的石蔗,這是如何做到的呢养距?addr首先告訴比特幣網(wǎng)絡(luò)它只對于它地址的交易感興趣日熬,這稱為bloom過濾器。一旦有符合條件的交易耘纱,其他節(jié)點會將交易信息推給addr(merkleblock消息)揣炕。但是addr是一個SPV錢包(參見上一篇)东跪,它自己并沒有完整的區(qū)塊鏈鹰溜,如何驗證呢曹动?它需要驗證交易1在某個區(qū)塊里墓陈,且這個區(qū)塊在區(qū)塊鏈上。

區(qū)塊在區(qū)塊鏈上好追溯贡必,只需要在merkleblock消息中存在上個區(qū)塊的信息仔拟,addr就可以一路回溯證明這個區(qū)塊確實在鏈上利花。但是每個區(qū)塊有上千筆交易载佳,如果把整個區(qū)塊傳回體積太大,還需要遍歷挠乳。這里SPV錢包采用Merkle樹算法睡扬。

Merkle樹是一種哈希二叉樹:

梅克爾樹

它將區(qū)塊里的每筆交易的哈希不斷地兩兩哈希肋联,最終得到一個Merkle根橄仍,存在區(qū)塊里侮繁。要證明一筆交易(例如HK)在這個區(qū)塊里宪哩,只需要它所經(jīng)過的路徑的哈希值(圖中藍色底框)第晰,通過一層層哈希計算彬祖,如果最終得到的根能和Merkle根對的上储笑,則此交易在區(qū)塊中圆恤。所以merkleblock消息中只需有Merkle根和Merkle路徑盆昙,SPV錢包就能驗算入賬的交易是否在某個區(qū)塊中,再通過回溯驗證區(qū)塊在區(qū)塊鏈上秕磷,即可確認該入賬交易在鏈上拆火,這將SPV錢包從網(wǎng)絡(luò)請求消息的大小從1M降低到了1K。

下篇白皮哥將為大家?guī)恚簬湃π“妆姨荆縼砜磶湃靻柨齑穑?/strong>

歡迎在本文評論區(qū)留言提出你的見解模狭。將本文轉(zhuǎn)發(fā)給志同道合的好友嚼鹉,一起學(xué)習(xí)交流,共同成長匹舞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浑侥,隨后出現(xiàn)的幾起案子寓落,更是在濱河造成了極大的恐慌,老刑警劉巖史飞,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祸憋,死亡現(xiàn)場離奇詭異,居然都是意外死亡掸鹅,警方通過查閱死者的電腦和手機巍沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門句携,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矮嫉,“玉大人牍疏,你說我怎么就攤上這事鳞陨。” “怎么了援岩?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵享怀,是天一觀的道長趟咆。 經(jīng)常有香客問我,道長仰坦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任凿滤,我火速辦了婚禮,結(jié)果婚禮上眷蚓,老公的妹妹穿的比我還像新娘沙热。我一直安慰自己篙贸,他們只是感情好枫疆,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布寝贡。 她就那樣靜靜地躺著圃泡,像睡著了一般洞焙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澡匪,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天唁情,我揣著相機與錄音甸鸟,去河邊找鬼兵迅。 笑死抢韭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恍箭。 我是一名探鬼主播刻恭,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鳍贾?” 一聲冷哼從身側(cè)響起鞍匾,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骑科,沒想到半個月后橡淑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡咆爽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年梁棠,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜笤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪伙。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡翁授,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塞赂,到底是詐尸還是另有隱情叼旋,我是刑警寧澤讹剔,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布衫冻,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧永部,春花似錦凫佛、人聲如沸愧薛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至以蕴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工须肆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓暖呕,卻偏偏與公主長得像瓤逼,于是被迫代替她去往敵國和親贷帮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容