比特幣挖礦技術(shù):分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法...
1. 說明
區(qū)塊鏈具有數(shù)據(jù)運行公開、不可篡改、可溯源、跨國際、去中心化的特點。因此越來越多地被應(yīng)用在各個領(lǐng)域。區(qū)塊鏈主要技術(shù)包括:分布式數(shù)據(jù)存儲、點對點傳輸、共識機制、加密算法,將在下面一一介紹。
2. 點對點傳輸
點對點技術(shù)(peer-to-peer, 簡稱P2P)又稱對等互聯(lián)網(wǎng)絡(luò)技術(shù),它依賴網(wǎng)絡(luò)中參與者的計算能力和帶寬,而不是把依賴都聚集在較少的幾臺服務(wù)器上。最典型的應(yīng)用就是電驢。在這里它提供了***層的去中心化支持。
3. 分布式數(shù)據(jù)存儲
先看看對區(qū)塊鏈最直觀的感覺:當***次運行比特幣錢包時,會下載很多數(shù)據(jù),2017年10月有150G左右,且還在不斷增加。數(shù)據(jù)存儲在data/blocks目錄下,blk*.dat這就是區(qū)塊block。
***個問題是:為什么建礦池需要下載這么多數(shù)據(jù)?區(qū)塊鏈本質(zhì)上是一個去中心化的數(shù)據(jù)庫,我們下載的是比特幣所有數(shù)據(jù)所組成的數(shù)據(jù)庫,因此很大。去中心化的數(shù)據(jù)庫,數(shù)據(jù)并不是保存在某一個服務(wù)器上,而且在P2P的每個節(jié)點上都需要保存一份。對于中心化的數(shù)據(jù)庫,數(shù)據(jù)庫可能被宿主或者黑客篡改,因而可靠性變差。而去中心化數(shù)據(jù)庫就像一個公共帳本,所有人都能查看,但沒人能私自修改以往數(shù)據(jù),因為它不可能修改分散在其他人機器上的數(shù)據(jù)庫。在某個數(shù)據(jù)與其它數(shù)據(jù)庫不一致時,則以大多數(shù)一致的為準,這就是所謂的“共識機制”。
隨著交易增加,錢包還會不斷變大。太大之后,會用到硬分叉技術(shù)。也就是啟用一個全新的網(wǎng)絡(luò)并讓所有的用戶大規(guī)模遷移。
4. 區(qū)塊鏈(blockchain)
區(qū)塊鏈是一串使用密碼學(xué)方法相關(guān)聯(lián)產(chǎn)生的數(shù)據(jù)塊,每一個數(shù)據(jù)塊(block)中包含了一次比特幣網(wǎng)絡(luò)交易的信息,用于驗證其信息的有效性和生成下一個區(qū)塊(根據(jù)一個生成下一生,構(gòu)成鏈chain)。
所謂挖礦就是計算出一個滿足規(guī)則的隨機數(shù),從而獲得本次記帳權(quán),發(fā)出本輪需要記錄的數(shù)據(jù),然后向全網(wǎng)廣播,每個節(jié)點都會將收到交易信息,并記錄到一個區(qū)塊中,然后鏈接到現(xiàn)有的區(qū)塊鏈上。
5. 算法
哈希算法是一個字符串到一個(有限位數(shù)的)數(shù)的映射。
Block的算法是根據(jù)上一個block的hash值,尋找滿足某些hash結(jié)果的字符串,簡單的說就是不停地拼湊字符串,計算SHA256哈希值(碰撞哈希值),直到找到產(chǎn)生合適的哈希的字符串,這個字符串就是解。具體公式如下:
- SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET
挖礦就是求解上述方程中的x。
其中,version是block的版本,prev_hash是上一個block的hash值,merkle_root是需要寫入的交易記錄的merkle樹的值(merkle樹被應(yīng)用在了交易的存儲上,其基本原理就是將葉子節(jié)點(每筆交易的hash)兩兩配對做哈希運算生成父節(jié)點,不斷迭代這一過程最終生成唯一的根節(jié)點merkle root),ntime是更新時間,nbits是當前難度,TARGET根據(jù)當前難度求出。x的范圍是0~2^32,這就是個求解x的問題,一旦你找到了x,你就可以廣播一個新的block。
TARGET越小,解出x的難度就越大,每產(chǎn)生2016個block(約14天),網(wǎng)絡(luò)會根據(jù)這段時間產(chǎn)生新block的平均間隔調(diào)整之后的TARGET,以保證每10分鐘產(chǎn)生一次的速度。因此,隨著網(wǎng)上算力的不斷增加,計算難度會越來越大,礦也越來越難挖了。
如果兩人同時挖到,block chain會出現(xiàn)分叉,客戶端在眾多分支中找到符合當前難度且最長的。
6. 安全機制
1) 私鑰
私鑰是形式如下的一段字符串:
5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss。只要是正確支持比特幣協(xié)議的應(yīng)用都可以把這段字符串識別為私鑰,轉(zhuǎn)換成公鑰,再轉(zhuǎn)換為地址,如果對應(yīng)的地址上面有比特幣,就可以使用這個私鑰花費上面的比特幣。一般被盜指的都是私鑰被盜。
2) 公私
公鑰是由私鑰生成的,一個私鑰經(jīng)過橢圓曲線變換之后會生成一個65個byte的數(shù)組,一般我們會看到這樣形式的一個公鑰:04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235
操作是用私鑰簽名的,只有對應(yīng)的公鑰才能解開,地址也是從公鑰生成的,這樣就可以驗證操作是不是屬于這個地址的。
3) 地址
地址是由公鑰產(chǎn)生的,生成的過程是,先對公鑰做一次SHA256,對得到的結(jié)果做一次RIPEMD160,再從結(jié)果中取20個byte的數(shù)組,這個得到的數(shù)組就是得到的hash160,形如:9a1c78a507689f6f54b847ad1cef1e614ee23f1e
4) 流程
從你這里發(fā)出的數(shù)據(jù)都是由私鑰加密的(包括挖到礦的廣播,轉(zhuǎn)帳等等),傳數(shù)據(jù)的時候也會傳一個公鑰,通過這個公鑰解密。如果公/私鑰能對上,就可以證明你的身份。公鑰是大家可見的,而私鑰被盜,那么別人就可以用你的身份交易了。具體加解密和密鑰導(dǎo)入導(dǎo)出方法請見后續(xù)“錢包”篇。
7. 挖礦與深度學(xué)習(xí)
1) 組織算力
挖礦和深度學(xué)習(xí)都需要組織算力。在運算量大時都需要構(gòu)建集群,拆分計算,集成結(jié)果等等。
2) 硬件基礎(chǔ)
挖礦和深度學(xué)習(xí)都是數(shù)學(xué)模型計算,它們對于大規(guī)模學(xué)習(xí)的解決方案都是:顯卡,F(xiàn)PGA,ASIC。當然功能并不完全相同,深度學(xué)習(xí)需要矩陣乘法,卷積等基本運算,而挖礦主要是hash碰撞。都需要并行性、多線程和高內(nèi)存帶寬等特性,雖然功能相近,但硬件還是有不少的差別。硬件說明詳見后續(xù)“控制器與礦機”篇。