版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
chap.4區(qū)塊鏈編程網(wǎng)絡(luò)信息安全區(qū)塊鏈是近些年興起的去中心信任基礎(chǔ)平臺,為網(wǎng)絡(luò)金融活動奠定了堅實的信任基礎(chǔ),并為互聯(lián)網(wǎng)創(chuàng)造了新的、可靠的合作機制,具有廣闊的應(yīng)用前景。區(qū)塊鏈技術(shù)對于未來信息安全,乃至各類電子通信系統(tǒng),甚至人類社會活動都有深遠的影響。本章將詳細介紹區(qū)塊鏈的編程方法。區(qū)塊鏈簡介區(qū)塊鏈技術(shù)是構(gòu)建比特幣區(qū)塊鏈網(wǎng)絡(luò)與交易信息加密傳輸?shù)幕A(chǔ)技術(shù)。它基于密碼學(xué)原理而不基于信用,使得任何達成一致的雙方直接支付,從而不需要第三方中介的參與?;ヂ?lián)網(wǎng)上的貿(mào)易,幾乎都需要借助可資信賴的第三方信用機構(gòu)來處理電子支付信息。這類系統(tǒng)仍然內(nèi)生性地受制于“基于信用的模式”。背景1.區(qū)塊鏈簡介區(qū)塊鏈是一個分布式賬本,一種通過去中心化、去信任的方式集體維護一個可靠數(shù)據(jù)庫的技術(shù)方案。定義從數(shù)據(jù)的角度來看區(qū)塊鏈是一種幾乎不可能被更改的分布式數(shù)據(jù)庫。這里的“分布式”不僅體現(xiàn)為數(shù)據(jù)的分布式存儲,也體現(xiàn)為數(shù)據(jù)的分布式記錄(即由系統(tǒng)參與者共同維護)。從技術(shù)的角度來看區(qū)塊鏈并不是一種單一的技術(shù),而是多種技術(shù)整合的結(jié)果。這些技術(shù)以新的結(jié)構(gòu)組合在一起,形成了一種新的數(shù)據(jù)記錄、存儲和表達的方式。1.區(qū)塊鏈簡介國際權(quán)威雜志《經(jīng)濟學(xué)人》、《哈佛商業(yè)周刊》、《福布斯雜志》等相繼報道區(qū)塊鏈技術(shù)將影響世界。創(chuàng)業(yè)公司R3聯(lián)合全球42家頂級銀行成立區(qū)塊鏈聯(lián)盟,包括摩根大通、美國銀行、匯豐銀行、花旗銀行、富國銀行、三菱UFJ金融集團、巴克萊銀行、高盛、德意志銀行等。動態(tài)4.1概述4.1.1區(qū)塊鏈的概念1.區(qū)塊鏈定義區(qū)塊鏈就是一個分布式賬本,是一種通過去中心化、去信任的方式集體維護一個可靠數(shù)據(jù)庫的技術(shù)方案。從本質(zhì)上講,它是一個共享數(shù)據(jù)庫,存儲于其中的數(shù)據(jù)或信息,具有不可偽造、全程留痕、可以追溯、公開透明、集體維護等特征。區(qū)塊鏈的實現(xiàn)涉及數(shù)學(xué)、密碼學(xué)、互聯(lián)網(wǎng)和計算機編程等很多科學(xué)技術(shù)。區(qū)塊鏈可以從不同的角度理解。從數(shù)據(jù)的角度來看,區(qū)塊鏈是一種幾乎不可能被更改的分布式數(shù)據(jù)庫。這里的“分布式”不僅體現(xiàn)為數(shù)據(jù)的分布式存儲,也體現(xiàn)為數(shù)據(jù)的分布式記錄(即由系統(tǒng)參與者共同維護)。從技術(shù)的角度來看,區(qū)塊鏈并不是一種單一的技術(shù),而是多種技術(shù)整合的結(jié)果。這些技術(shù)以新的結(jié)構(gòu)組合在一起,形成了區(qū)塊鏈這種新的數(shù)據(jù)記錄、存儲和表達的方式。2.區(qū)塊鏈應(yīng)用區(qū)塊鏈具有廣泛的應(yīng)用,甚至被認為對人類未來社會的影響也是非凡的,自不同的視角觀察,區(qū)塊鏈對各種網(wǎng)絡(luò)應(yīng)用的變革作用都是前所未有的。從需求端來看,金融、醫(yī)療、公證、通信、供應(yīng)鏈、域名、投票等領(lǐng)域都開始意識到區(qū)塊鏈的重要性并開始嘗試將這種技術(shù)與現(xiàn)實社會對接。從投資端來看,區(qū)塊鏈的投資資金供給逐步上升,風(fēng)投的投資熱情也不斷高漲,投資密度越來越大,供給端的資金供給有望推動其進一步發(fā)展。從市場應(yīng)用來看,區(qū)塊鏈能成為一種市場工具,幫助社會削減平臺成本,讓中間機構(gòu)成為過去。并且區(qū)塊鏈還將促使公司現(xiàn)有業(yè)務(wù)模式重心的轉(zhuǎn)移,有望加速公司的發(fā)展。從底層技術(shù)來看,區(qū)塊鏈有望促進數(shù)據(jù)記錄、數(shù)據(jù)傳播及數(shù)據(jù)存儲管理方式的轉(zhuǎn)型。區(qū)塊鏈本身更像一種互聯(lián)網(wǎng)底層的開源式協(xié)議,在不遠的將來會觸動甚至最后徹底取代現(xiàn)有互聯(lián)網(wǎng)的底層基礎(chǔ)協(xié)議。從社會結(jié)構(gòu)來看,區(qū)塊鏈技術(shù)有望將法律與經(jīng)濟融為一體,徹底顛覆原有社會的監(jiān)管模式。組織形態(tài)會因其而發(fā)生改變,區(qū)塊鏈也許最終會帶領(lǐng)人們走向分布式自治的社會。4.1.2區(qū)塊鏈的分類區(qū)塊鏈可以分為私有、共有、聯(lián)合三種。
(1)私有區(qū)塊鏈私有區(qū)塊鏈(PrivateBlockChains):是指僅僅使用區(qū)塊鏈的總賬技術(shù)進行記賬,可以是一個公司,也可以是個人,獨享該區(qū)塊鏈的寫入權(quán)限,這種區(qū)塊鏈與其他的分布式存儲方案沒有太大區(qū)別。
(2)公有區(qū)塊鏈公有區(qū)塊鏈(PublicBlockChains):是指世界上任何個體或者團體都可以發(fā)送交易,且交易能夠獲得該區(qū)塊鏈的有效確認,任何人都可以參與其共識過程。公有區(qū)塊鏈是最早,也是應(yīng)用最廣泛的區(qū)塊鏈。
(3)聯(lián)合(行業(yè))區(qū)塊鏈行業(yè)區(qū)塊鏈(ConsortiumBlockChains):是指由某個群體內(nèi)部指定多個預(yù)選的節(jié)點為記賬人,每個塊的生成由所有的預(yù)選節(jié)點共同決定(預(yù)選節(jié)點參與共識過程),其他接入節(jié)點可以參與交易,但不過問記賬過68程(本質(zhì)上還是托管記賬,只是變成分布式記賬,預(yù)選節(jié)點的多少,如何決定每個塊的記賬者成為該區(qū)塊鏈的主要風(fēng)險點),其他任何人可以通過該區(qū)塊鏈開放的API進行限定查詢。4.1.3區(qū)塊鏈的發(fā)展區(qū)塊鏈技術(shù)的發(fā)展與密碼學(xué)具有密切聯(lián)系,是基于密碼技術(shù)逐步發(fā)展起來,發(fā)展過程可以概括為以下。
1976年,BaileyW.Diffie、MartinE.Hellman兩位密碼學(xué)的大師發(fā)表了論文《密碼學(xué)的新方向》,論文覆蓋了未來幾十年密碼學(xué)所有的新的進展領(lǐng)域,包括非對稱加密、橢圓曲線算法、哈希等一些手段,奠定了迄今為止整個密碼學(xué)的發(fā)展方向,也對區(qū)塊鏈的技術(shù)和比特幣的誕生起到?jīng)Q定性作用。同年,哈耶克出版了經(jīng)濟學(xué)專著:《貨幣的非國家化》,提出了非主權(quán)貨幣、競爭發(fā)行貨幣等理念,成為去中心化貨幣的精神指南。
1980年,MerkleRalf提出了Merkle-Tree這種數(shù)據(jù)結(jié)構(gòu)和相應(yīng)的算法,后來其主要用途之一就是分布式網(wǎng)絡(luò)中數(shù)據(jù)同步正確性的校驗,這也是后來比特幣中引入的,用來做區(qū)塊同步校驗的重要手段之一。
1982年,Lamport提出拜占廷將軍問題,標(biāo)志著分布式計算的可靠性理論和實踐進入到了實質(zhì)性階段。同年,大衛(wèi)·喬姆提出了密碼學(xué)支付系統(tǒng)ECash。人們開始嘗試將密碼學(xué)運用到貨幣、支付相關(guān)的領(lǐng)域。ECash可以說是密碼學(xué)貨幣最早的先驅(qū)之一。
1985年,Koblitz和Miller各自獨立提出了著名的橢圓曲線加密(ECC)算法。由于此前發(fā)明的RSA的算法計算量過大很難實用,ECC的提出才真正使得非對稱加密體系產(chǎn)生了實用的可能。公鑰密碼自此開始被應(yīng)用到數(shù)字貨幣中。
1997年,第一代基于POW(ProofofWork)算法HashCash出現(xiàn)(當(dāng)時發(fā)明出來主要用于做反垃圾郵件)。在隨后發(fā)表的各種論文中,具體的算法設(shè)計和實現(xiàn)已經(jīng)完全覆蓋了后來比特幣所使用的POW機制。
1998年,密碼學(xué)貨幣的完整思想成熟,戴偉(WeiDai)、尼克·薩博同時提出密碼學(xué)貨幣的概念。其中戴偉的B-Money被稱為比特幣的精神先驅(qū),而尼克·薩博的Bitgold提綱和后續(xù)中本聰提出的比特幣已經(jīng)非常接近。
2001年,NSA發(fā)布了SHA-2系列算法,其中就包括目前應(yīng)用最廣的SHA-256算法,這也是比特幣最終采用的哈希算法。至此,比特幣或者區(qū)塊鏈技術(shù)誕生的所有的技術(shù)基礎(chǔ)在理論上、實踐都被解決了。
2008年11月1日,一位自稱中本聰(SatoshiNakamoto)的人發(fā)表了《比特幣:一種點對點的電子現(xiàn)金系統(tǒng)》一文,闡述了基于P2P網(wǎng)絡(luò)技術(shù)、加密技術(shù)、時間戳技術(shù)、區(qū)塊鏈技術(shù)等的電子現(xiàn)金系統(tǒng)的構(gòu)架理念,這標(biāo)志著比特幣的誕生。兩個月后理論步入實踐,2009年1月3日第一個序號為0的創(chuàng)世區(qū)塊誕生。幾天后2009年1月9日出現(xiàn)序號為1的區(qū)塊,并與序號為0的創(chuàng)世區(qū)塊相連接形成了鏈,標(biāo)志著區(qū)塊鏈的正式誕生。在隨后的發(fā)展過程中,又出現(xiàn)了許多標(biāo)志性事件,具體如圖4-1所示。
從2008年的比特幣誕生開始,區(qū)塊鏈經(jīng)歷了可編程貨幣、可編程金融與可編程社會三大應(yīng)用時代,其69應(yīng)用范圍現(xiàn)在已經(jīng)逐步擴展到社會生活的方方面面了。4.2區(qū)塊鏈原理4.2.1區(qū)塊鏈結(jié)構(gòu)組成
一般說來,從邏輯上區(qū)塊鏈系統(tǒng)基礎(chǔ)架構(gòu)模型由數(shù)據(jù)層、網(wǎng)絡(luò)層、共識層、激勵層、合約層和應(yīng)用層組成,如圖4-2所示。
其中,數(shù)據(jù)層封裝了底層數(shù)據(jù)區(qū)塊以及相關(guān)的數(shù)據(jù)加密和時間戳等基礎(chǔ)數(shù)據(jù)和基本算法;網(wǎng)絡(luò)層則包括分布式組網(wǎng)機制(P2P網(wǎng)絡(luò))、數(shù)據(jù)傳播機制和數(shù)據(jù)驗證機制等;共識層主要封裝網(wǎng)絡(luò)節(jié)點的各類共識算法(包括:PoW、PoS、DPoS等);激勵層將經(jīng)濟因素集成到區(qū)塊鏈技術(shù)體系中來,主要包括經(jīng)濟激勵的發(fā)行機制和分配機制等;合約層主要封裝各類腳本代碼、算法機制和智能合約,是區(qū)塊鏈可編程特性的基礎(chǔ);應(yīng)用層則封裝了區(qū)塊鏈的各種應(yīng)用場景和案例。從模型中不難看出,基于時間戳的鏈式區(qū)塊結(jié)構(gòu)、分布式節(jié)點的共識機制、基于共識算力的經(jīng)濟激勵和靈活可編程的智能合約是區(qū)塊鏈技術(shù)最具代表性的創(chuàng)新點,這是以前任何系統(tǒng)都所不具有的特點。
在具體實現(xiàn)上,區(qū)塊鏈網(wǎng)絡(luò)由區(qū)塊鏈節(jié)點組網(wǎng)構(gòu)成,區(qū)塊鏈網(wǎng)絡(luò)如圖4-3所示。整個網(wǎng)絡(luò)由若干區(qū)塊鏈節(jié)點互聯(lián)而成,任何計算機都可以通過安裝區(qū)塊鏈軟件成為一個比特幣節(jié)點,一個完整的比特幣節(jié)點包括如下功能:
(1)錢包,允許用戶在區(qū)塊鏈網(wǎng)絡(luò)上進行交易。
(2)完整區(qū)塊鏈,記錄了所有交易歷史,通過特殊的結(jié)構(gòu)保證歷史交易的安全性,并且用來驗證新交易的合法性。(3)礦工,通過記錄交易及解密數(shù)學(xué)題來生成新區(qū)塊,如果成功可以賺取獎勵。
(4)路由功能,把其它節(jié)點傳送過來的交易數(shù)據(jù)等信息再傳送給更多的節(jié)點。對于節(jié)點,除了路由功能以外,其它的功能都不是必須的。4.2.2區(qū)塊鏈關(guān)鍵技術(shù)如前所述,區(qū)塊鏈是多種技術(shù)的綜合體,這些技術(shù)很多都與密碼學(xué)有千絲萬縷的聯(lián)系,具體包括以下。
1.區(qū)塊區(qū)塊鏈以區(qū)塊為單位組織數(shù)據(jù)。全網(wǎng)所有的交易記錄都以交易單的形式存儲在全網(wǎng)唯一的區(qū)塊鏈中。區(qū)塊是一種記錄交易的數(shù)據(jù)結(jié)構(gòu)。每個區(qū)塊由區(qū)塊頭和區(qū)塊主體組成,區(qū)塊主體只負責(zé)記錄前一段時間內(nèi)的所有交易信息。區(qū)塊結(jié)構(gòu)如圖4-4所示。
區(qū)塊鏈的大部分功能都由區(qū)塊頭實現(xiàn),區(qū)塊頭的結(jié)構(gòu)包括如下部分。
(1)版本號:標(biāo)示軟件及協(xié)議的相關(guān)版本信息。
(2)父區(qū)塊哈希值:引用的區(qū)塊鏈中父區(qū)塊頭的哈希值,通過這個值每個區(qū)塊才首尾相連組成了區(qū)塊鏈,并且這個值對區(qū)塊鏈的安全性起到了至關(guān)重要的作用。
(3)Merkle根:這個值是由區(qū)塊主體中所有交易的哈希值再逐級兩兩哈希計算出來的一個數(shù)值,主要用于檢驗一筆交易是否存在于這個區(qū)塊中存在。
(4)時間戳,記錄該區(qū)塊產(chǎn)生的時間,精確到秒。
(5)難度值,獲取該區(qū)塊數(shù)據(jù)記錄時,解算的相關(guān)數(shù)學(xué)題的難度目標(biāo)。(6)隨機數(shù)(Nonce),記錄解密該區(qū)塊相關(guān)數(shù)學(xué)題的答案的值。2.數(shù)字簽名區(qū)塊鏈中的操作需要進行數(shù)據(jù)簽名,保障合法性。發(fā)送報文時,發(fā)送方用一個哈希函數(shù)從報文文本中生成報文摘要,然后用自己的私鑰對摘要進行加密,加密后的摘要將作為報文的數(shù)字簽名和報文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報文中計算出報文摘要,接著再用發(fā)送方的公鑰來對報文附加的數(shù)字簽名進行解密,如果這兩個摘要相同、那么接收方就能確認該數(shù)字簽名是發(fā)送方的。3.Merkle樹當(dāng)經(jīng)過多重操作后,為了檢測所有數(shù)據(jù)的完整性,需要采用一個統(tǒng)一、全局的記錄手段,通常采用的就是Merkle樹。
Merkle樹是一種哈希二叉樹,使用它可以快速校驗大規(guī)模數(shù)據(jù)的完整性。在比特幣網(wǎng)絡(luò)中,Merkle樹被用來歸納一個區(qū)塊中的所有交易信息,最終生成這個區(qū)塊所有交易信息的一個統(tǒng)一的哈希值,區(qū)塊中任何一筆交易信息的細微改變都會使得Merkle樹改變(與3.5.3節(jié)介紹的RSA認證模式機理類似)。非葉子節(jié)點value的計算方法是將該節(jié)點的所有子節(jié)點進行組合,然后對組合結(jié)果進行hash計算所得出的哈希值,如圖4-5所示。圖中交易1、交易2、交易3、交易4各自通過hash計算得到摘要hash1、hash2、hash3、hash4,然后hash1與hash2、hash3與hash4組合經(jīng)hash計算得到hash12、hash34,然后hash12、hash3471組合經(jīng)hash計算得到hash1234…,最終得到Merkle根值。通過這樣方法形成一個樹狀結(jié)構(gòu),樹葉上的任何一個交易發(fā)生變化,都會影響Merkle根值得變化,從而監(jiān)測所有交易。4.時間戳服務(wù)器區(qū)塊鏈的一致性評判依據(jù)是基于時間,大多比對以及驗證處理是通過時間先后來決斷的。
提供時間的時間戳服務(wù)器,它是一款基于PKI(公鑰密碼基礎(chǔ)設(shè)施)技術(shù)的時間戳權(quán)威系統(tǒng),對外提供精確可信的時間戳服務(wù)。它采用精確的時間源、高強度高標(biāo)準的安全機制,以確認系統(tǒng)處理數(shù)據(jù)在某一時間的存在性和相關(guān)操作的相對時間順序,為信息系統(tǒng)中的時間防抵賴提供基礎(chǔ)服務(wù)。5.挖礦區(qū)塊鏈組織者為了鼓勵大家的記錄積極性,會提供獎勵。由于區(qū)塊節(jié)點都有記賬的權(quán)利,但是由誰來記錄需要經(jīng)過競爭,這種競爭在區(qū)塊鏈中叫做:“挖礦”。區(qū)塊鏈中實現(xiàn)挖礦的具體方法就是,獲得能夠讓隨機散列值出現(xiàn)了指定個數(shù)0的輸入(例如:要求找出能夠生成前二十位都是0的散列輸入)。如前面3.6.1節(jié)介紹,由于散列函數(shù)的單向性,不可能從輸出推知輸入。因此,唯一的辦法就是利用不同的輸入去蠻力測試,俗稱“挖礦”。一方面,挖礦對于競爭者而言,是相對公平的解決方案;另一方面,為了提高成功幾率,挖礦需要投入大量的硬件,來增加算力,甚至出現(xiàn)專門用于挖礦的機器,這就是比特幣挖礦機,就是用于賺取比特幣的電腦。這類電腦一般有專業(yè)的挖礦芯片,多采用“燒”顯卡的方式工作,耗電量較大。
上述技術(shù)構(gòu)成區(qū)塊鏈的基礎(chǔ)。4.2.3區(qū)塊鏈工作過程實際的區(qū)塊鏈工作過程可以概括為如下五步,具體如圖4-6所示。
第1步:新交易創(chuàng)建。當(dāng)用戶A與B發(fā)生一筆交易,A向B支付貨幣,貨幣所有者A利用自己的私鑰72對前一次交易(比特貨來源)和下一位所有者B的身份信息簽署一個數(shù)字簽名,并將這個簽名附加在這枚貨幣的末尾,制作成交易單。第2步:交易通過P2P網(wǎng)絡(luò)傳播。A將交易單廣播至全網(wǎng)后,比特幣就發(fā)送給了B,每個節(jié)點都將收到的交易信息納入一個區(qū)塊中。對B而言,該枚比特幣會即時顯示在比特幣錢包中,但直到區(qū)塊確認成功后才可用(目前的規(guī)定是,一筆比特幣從支付到最終確認成功,必須得到最少6個區(qū)塊確認之后才能真正確認到帳)。第3步:交易驗證。每個節(jié)點可以通過解一道數(shù)學(xué)難題,從而去獲得創(chuàng)建新區(qū)塊權(quán)利(記錄新的交易),并爭取得到比特幣的獎勵(新比特幣,會在此過程中產(chǎn)生)。第4步:驗證結(jié)果通過P2P網(wǎng)絡(luò)傳播。當(dāng)一個節(jié)點找到解時,它就向全網(wǎng)廣播該蓋有時間戳的記錄交易區(qū)塊,并由全網(wǎng)其他節(jié)點核對。時間戳用來證實特定區(qū)塊是的確存在的。比特幣網(wǎng)絡(luò)采取從5個以上節(jié)點獲取時間,然后取中間值的方式作為時間戳,最后確定。第5步:交易寫入賬本。全網(wǎng)其他節(jié)點核對該區(qū)塊記賬的正確性,沒有錯誤后準許挖礦成功的節(jié)點記錄上述A與B的交易形成區(qū)塊并記錄到區(qū)塊鏈中,則A與B的交易全部完成。之后,諸節(jié)點將在該合法區(qū)塊之后競爭下一個區(qū)塊,依此方法形成了一個合法記賬的區(qū)塊鏈。區(qū)塊的生成速度是可以調(diào)節(jié)的。一般每個區(qū)塊的創(chuàng)建時間大約在10分鐘。隨著全網(wǎng)算力的不斷變化,每個區(qū)塊的產(chǎn)生時間會隨算力增強而縮短、隨算力減弱而延長。為了平衡區(qū)塊生成速度,可以通過參數(shù)調(diào)整對其進行調(diào)節(jié),其原理是根據(jù)最近產(chǎn)生的2016年區(qū)塊的時間差(約兩周時間),自動調(diào)整每個區(qū)塊的生成難度(比如減少或增加目標(biāo)值中0的個數(shù)),使得每個區(qū)塊的生成時間保持在10分鐘。4.2.4區(qū)塊鏈共識達成區(qū)塊鏈運行過程中可能會產(chǎn)生糾紛,為了消除糾紛需要提出達成共識的方案。
1.工作量證明如前面4.2.2節(jié)所述,區(qū)塊頭包含一個隨機數(shù),使得區(qū)塊的隨機散列值出現(xiàn)了指定個0。為了獲取該隨機數(shù),節(jié)點需通過以時間為代價反復(fù)嘗試來搜索,這樣就構(gòu)建了一個工作量證明機制。工作量證明機制的本質(zhì)是CPU一票,“大多數(shù)”的決定表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數(shù)的CPU為誠實的節(jié)點控制,那么誠實的鏈條將以最快的速度延長,并超越其他的競爭鏈條。如果想要修改已出現(xiàn)的區(qū)塊,攻擊者必須重新完成該區(qū)塊的工作量外加該區(qū)塊之后所有區(qū)塊的工作量,并最終趕上和超越誠實節(jié)點的工作量。工作量證明機制是比特幣交易實現(xiàn)去中心化的技術(shù)基礎(chǔ),其目的是在區(qū)塊鏈的交易驗證中進行工作量的認證,從而達到阻止服務(wù)器攻擊和其他服務(wù)器濫用的經(jīng)濟對策。通過對工作的結(jié)果進行認證來證明完成了相應(yīng)的工作量,相較于對整個工作過程進行監(jiān)測,極大的提高了工作效率。在區(qū)塊鏈網(wǎng)絡(luò)中,如果想獲取創(chuàng)造新的區(qū)塊的機會就必須進行挖礦,也就是必須解出基于工作量證明機制的數(shù)學(xué)難題。該數(shù)學(xué)難題具體如下式4-1所示。
SHA256(SHA256(version+pre_hash+merkle_root+mime+nbits+x))<difficulty(4-1)在上式中,difficulty所代表的是計算的難度值,難度值決定了礦工挖礦的難度即運算次數(shù),難度值也是挖礦過程的主要考量指標(biāo)。計算出最優(yōu)解之后,挖礦成功節(jié)點會向整個比特幣網(wǎng)絡(luò)廣播該數(shù)據(jù),發(fā)布驗證成功后,最后由該節(jié)點將新的區(qū)塊將會銜接在原區(qū)塊鏈的尾部。2.分叉同一時間段內(nèi),全網(wǎng)不止一個節(jié)點能計算出滿足挖礦條件的隨機數(shù),即會有多個節(jié)點在網(wǎng)絡(luò)中廣播它們各自打包好的臨時區(qū)塊(都是合法的),如圖4-7所示。也就是說,某一節(jié)點若收到多個針對同一前續(xù)區(qū)塊的后續(xù)臨時區(qū)塊,則該節(jié)點會在本地區(qū)塊鏈上產(chǎn)生分叉。對于該問題,解決方案就是,等到下一個工作量證明被發(fā)現(xiàn),而其中的一條鏈條被證實為是較長的一條,那么在另一條分支鏈條上工作的節(jié)點將轉(zhuǎn)換陣營,開始在較長的鏈條上工作。其他分叉的分支將會被網(wǎng)絡(luò)徹底拋棄。3.雙花
雙花,即二重支付,指攻擊者幾乎同時將同一筆錢用作不同交易,企圖利用記賬的時間差實現(xiàn)重復(fù)消費。對于這個問題,區(qū)塊鏈在每當(dāng)節(jié)點在把新收到的交易單加入?yún)^(qū)塊之前,會順著交易的發(fā)起方的公鑰向前遍歷檢查,檢查當(dāng)前交易所用的幣是否確實屬于當(dāng)前交易發(fā)起方,此檢查可遍歷到該幣的最初誕生點(即產(chǎn)生它的那塊區(qū)塊源)。雖然多份交易單可以任意序的廣播,但是它們最終被加入?yún)^(qū)塊時必定呈現(xiàn)一定的時間順序。區(qū)塊之間以Hash值作為時間戳完全可以信賴,因此任意一筆交易資金來源都可以被確定的回溯到準確的時間點。發(fā)生雙花時,只要比較兩筆交易的時間先后,就能進行裁決。基于上述方案,區(qū)塊鏈所面臨的主要問題都得到了解決。4.3區(qū)塊鏈編程4.3.1區(qū)塊鏈類編程
1.區(qū)塊結(jié)構(gòu)定義首先介紹區(qū)塊鏈程序的關(guān)鍵數(shù)據(jù)定義。
(1)區(qū)塊數(shù)據(jù)典型的區(qū)塊(含區(qū)塊頭和區(qū)塊體)包括:索引號、時間戳、工作量證明值、前一個塊的哈希值、交易信息(發(fā)送者,接收者,數(shù)量等),還有版本號、附加信息等等。下面代碼就是以字典方式定義的一個簡化的區(qū)塊結(jié)構(gòu),但僅包括索引號?、時間戳?、交易信息?、工作量證明值?和前一個塊的哈希值?。
(2)交易記錄數(shù)據(jù)對于每筆交易需要記錄并記入?yún)^(qū)塊。交易的數(shù)據(jù)主要包括:發(fā)送者、接收者、交易數(shù)和簽名。對于每筆交易,還需要使用公鑰檢驗其簽名。所使用的公鑰是進行驗證的關(guān)鍵,其結(jié)構(gòu)需要滿足標(biāo)準化要求,下面是一個公鑰的數(shù)據(jù)實例。
上公鑰采用的是.pem格式,在導(dǎo)入時,標(biāo)記開始符“-----BEGINRSAPUBLICKEY-----”及結(jié)束符“-----ENDRSAPUBLICKEY-----”中間不要換行,否則在裝入時無法識別。
區(qū)塊中的'transactions'即為交易數(shù)據(jù),其結(jié)構(gòu)定義如下:
交易數(shù)包含三項,即:發(fā)送者?、接收者?、交易數(shù)?,簽名是在填寫完交易信息后,然后通過依次哈希和私鑰簽署后追加上去的。為了確保簽名的一致性,需要對交易數(shù)據(jù)先使用OrderedDic進行排序。(3)表數(shù)據(jù)區(qū)塊鏈程序記錄了節(jié)點、區(qū)塊、交易三類表數(shù)據(jù)。
transactions列表記錄了每筆交易,chain列表記錄了諸區(qū)塊,nodes記錄了區(qū)塊鏈節(jié)點(這里采用的是集合格式數(shù)據(jù),消除重復(fù)記錄,見2.2.1節(jié)集合的定義)。
(4)其它數(shù)據(jù)區(qū)塊鏈程序還使用到了挖礦難度值MINING_DIFFICULTY,即:挖礦得到的聲明值能夠滿足與交易的聯(lián)合輸入經(jīng)hash計算所得到的輸出值,后位有MINING_DIFFICULTY個0。另外,還要求輸入的節(jié)點地址應(yīng)形如:':5000的格式,以方便網(wǎng)絡(luò)訪問。2.區(qū)塊鏈類為了完成區(qū)塊鏈功能,定義區(qū)塊鏈類Blockchain,本區(qū)塊鏈類包含以下成員函數(shù)。
(1)構(gòu)造函數(shù)Blockchain的構(gòu)造函數(shù)代碼如下。
該成員函數(shù)進行類創(chuàng)建的準備工作,分別建立交易?、區(qū)塊鏈?、節(jié)點記錄?數(shù)據(jù),并利用隨機數(shù)命名創(chuàng)建的節(jié)點?,然后創(chuàng)建創(chuàng)世紀區(qū)塊?。
(2)節(jié)點注冊成員函數(shù)區(qū)塊鏈節(jié)點需要完成注冊,由節(jié)點注冊成員函數(shù)實現(xiàn),代碼如下。區(qū)塊鏈節(jié)點工作前需要將自身注冊為區(qū)塊鏈節(jié)點,將自身的工作地址與端口號記錄到node集合中。(3)區(qū)塊創(chuàng)建相關(guān)的成員函數(shù)區(qū)塊創(chuàng)建相關(guān)的成員函數(shù)有三個,分別是create_Genesis_Block、next_block和hash。
在區(qū)塊鏈的所有區(qū)塊中,創(chuàng)建的第一個區(qū)塊,叫做創(chuàng)世紀區(qū)塊(GenesisBlock)。區(qū)塊鏈將在創(chuàng)世紀區(qū)塊基礎(chǔ)上,不斷地記錄、生長,就形成了區(qū)塊鏈。
create_Genesis_Block完成創(chuàng)世紀區(qū)塊建立,代碼如下。
上述代碼創(chuàng)建了第一個名為“GenesisBlock”、索引值為1的區(qū)塊,為了便于網(wǎng)絡(luò)傳輸,將時間轉(zhuǎn)換為字符串以支持json格式?。對于后續(xù)生成區(qū)塊,采用next_block成員函數(shù)進行記錄,代碼如下。該函數(shù)的返回值即為新的區(qū)塊。在create_Genesis_Block和next_block中,都需要對區(qū)塊進行哈希,這可以通過hash成員函數(shù)完成。
通過排序,保障hash的一致性?。為了簡便起見,此處并沒有實現(xiàn)Merkle樹的哈希。為了支持后續(xù)網(wǎng)絡(luò)訪問,區(qū)塊均需采用支持Json的格式。這里的Json(JavaScriptObjectNotation,即:JS對象簡譜)是一種輕量級的數(shù)據(jù)交換格式。它基于ECMAScript(歐洲計算機協(xié)會制定的JS規(guī)范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得Json成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時也易于機器解析和生成,并能有效地提升網(wǎng)絡(luò)傳輸效率。(4)區(qū)塊有效性檢查成員
為了檢查區(qū)塊鏈的有效性,需要遍歷所有區(qū)塊,主要是看記錄的前塊區(qū)塊的哈希值是否與實際一致。檢查工作由成員函數(shù)valid_chain完成,代碼如下。該函數(shù)從區(qū)塊鏈中取出當(dāng)前塊?,對該塊計算hash,并與本塊的記錄的前塊(previous_hash)哈希值比較?,看是否一致,如果不一致返回false。該檢查由創(chuàng)世紀區(qū)塊一直檢查到區(qū)塊鏈的末尾。(5)沖突解決成員
由于區(qū)塊鏈網(wǎng)絡(luò)的并發(fā)性,就有可能同時存在合理的區(qū)塊,因此就會產(chǎn)生如4.2.4節(jié)介紹的分叉,也就形成了沖突。針對該沖突,就需要有專門的解決方案,由成員函數(shù)resolve_conflicts來進行仲裁,代碼如下。
該函數(shù)先以自身的鏈為最長?,然后向所有記錄的節(jié)點請求其區(qū)塊鏈?,然后依次與自身區(qū)塊鏈比較?,最終用最長的區(qū)塊鏈進行現(xiàn)有區(qū)塊鏈的更新?,最后解決沖突問題。
(6)交易成員函數(shù)交易成員函數(shù)包含submit_transaction和verify_transaction_signature,分別用來發(fā)起交易和檢驗交易的合法性。
submit_transaction函數(shù)發(fā)起一個交易,代碼如下。該函數(shù)為了保障簽名哈希的一致性,首先對一條交易信息進行排序,然后驗證其合法性?,通過后將交易計入交易列表?(注意,交易被加入?yún)^(qū)塊還需由礦工完成)。
交易的合法性由verify_transaction_signature成員函數(shù)完成,主要是檢查交易的簽名是否與公鑰匹配,代碼如下。
上述檢驗主要利用了rsa的verify方法(詳見3.5.2節(jié))。此處使用到Python3中的bytes和str的對應(yīng)方法進行互相轉(zhuǎn)換,str.encode('utf-8')將字符串轉(zhuǎn)字節(jié)?,bytes.decode('utf-8')將字節(jié)轉(zhuǎn)字符串?。
(7)工作量證明成員工作量證明成員包括工作量證明(即:挖礦)proof_of_work和valid_proof成員函數(shù)。
proof_of_work代碼如下。通過累加試湊,得到滿足條件的聲明值(nonce)。valid_proof代碼如下。
valid_proof成員采用蠻力的方法試算滿足要求的聲明(nonce)值。通過上述代碼可知,計算是由交易信息、前塊哈希值、聲明值得混合作為哈希的輸入?,使之滿足輸出值的后difficulty位均為0?。由于提前計算根本無法預(yù)知交易的信息,因此是完全不可能預(yù)先準備的。4.3.2Web框架編程為了實現(xiàn)區(qū)塊鏈網(wǎng)絡(luò)節(jié)點之間的交互,還需實現(xiàn)基于Web的編程。此處采用PythonFlask框架這一輕量Web應(yīng)用框架,需將將網(wǎng)絡(luò)請求映射到4.3.1中的Blockchain類的成員函數(shù)。
1.Flask框架Flask是一個微型的Python開發(fā)的Web框架,也被稱為“microframework”。Flask提供一個簡單的內(nèi)核,并可以用extension增加其他功能,因此,雖然Flask沒有默認使用的數(shù)據(jù)庫、窗體驗證工具,但可以用Flask-extension加入這些功能,例如:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術(shù)。
Flask的socket是基于Werkzeug實現(xiàn)的,模板語言依賴jinja2模板,在使用Flask之前需要安裝一下,即執(zhí)行:pipinstallflask。(1)Flask對象編程簡要介紹Flask對象的編程。在安裝完成Flask后,可以利用下面代碼生成Flask對象。
參數(shù)template_folder:指定存放模板的文件夾的名稱(默認為templates);static_folder:指定存放靜態(tài)文件資源的文件夾的名稱(默認為static,注意:如果沒有指定static_url_path的話,則訪問路徑和static_folder的名稱是一致的;static_url_path:指定靜態(tài)文件的訪問路徑。Flask對象通過“@app.route”將域名映射到相關(guān)的函數(shù),例如下面代碼。
其作用就是,當(dāng)用戶在瀏覽器中輸入:“A.B.C.D(IP地址):端口號/register”時,將調(diào)用register函數(shù)進行處理。
Flask對象通過run方法,將Flask服務(wù)運行在指定的地址(這里以“A.B.C.D”為例)、端口上,開啟網(wǎng)絡(luò)服務(wù)。2.區(qū)塊鏈類成員函數(shù)映射如上面Flask編程的框架,可以將網(wǎng)絡(luò)訪問轉(zhuǎn)化為區(qū)塊鏈類成員函數(shù)調(diào)用,這樣基于Flask就可以實現(xiàn)79區(qū)塊鏈的網(wǎng)絡(luò)操作了,具體實現(xiàn)如下面代碼。歡迎界面當(dāng)用戶在瀏覽器中輸入“A.B.C.D:端口號”時,回顯“歡迎加入?yún)^(qū)塊鏈的世界!”。(2)注冊節(jié)點操作注冊區(qū)塊鏈節(jié)點操作,當(dāng)用戶發(fā)送節(jié)點“POST”類型注冊請求時,調(diào)用register_nodes函數(shù)。register_nodes函數(shù)將POST請求中包含的nodes內(nèi)容作為區(qū)塊鏈類對象“(b”?)的成員函數(shù)register_node的輸入,執(zhí)行節(jié)點注冊,并通過jsonify返回響應(yīng)?。(3)注冊節(jié)點列表獲取
當(dāng)用戶發(fā)送“./nodes/get”(A.B.C.D/nodes/get的略寫,下同)的“GET”類型請求時,調(diào)用get_nodes函數(shù),將本節(jié)點的注冊節(jié)點列表作為響應(yīng)返回。(4)新的交易發(fā)起
用戶發(fā)送“./transactions/new”的“POST”類型請求時,調(diào)用new_transaction函數(shù),向區(qū)塊鏈對象的交易列表中加入一條新的記錄(需要通過合法性驗證),將添加情況作為響應(yīng)返回。new_transaction函數(shù)采用request.args.get函數(shù)依次將'sender_address'、'recipient_address'、'amount'、'signature'對應(yīng)的值從用戶的POST請求中讀出?;產(chǎn)生新交易?;成功后應(yīng)答201?。
注意,新的交易發(fā)起操作應(yīng)當(dāng)向全網(wǎng)廣播,此處為了簡便起見沒有實現(xiàn)。(5)交易查詢操作
有時需要查詢交易信息,用戶發(fā)送“./transactions/get”的“POST”類型請求,調(diào)用get_transactions函數(shù),將區(qū)塊鏈對象的transactions列表作為響應(yīng)返回。(6)挖礦操作用戶輸入“.'/mine”時,執(zhí)行挖礦操作,即mine函數(shù)。
通過調(diào)用proof_of_work解算進行挖礦?;只有在挖礦成功后,才可以將最新的一條交易制成區(qū)塊,加入到區(qū)塊鏈中?。
注意,如前所述,新的區(qū)塊加入?yún)^(qū)塊鏈需要若干相鄰節(jié)點的確認,此處為了簡便起見沒有實現(xiàn)。
(7)沖突仲裁操作
當(dāng)出現(xiàn)區(qū)塊鏈“分叉”時,需要進行沖突仲裁,這時發(fā)送“./nodes/resolve”的“GET”類型請求,將調(diào)用consensus函數(shù)。該函數(shù)實際上調(diào)用了區(qū)塊鏈對象的resolve_conflicts方法,將所有節(jié)點中最長的鏈作為解決方案。
(8)鏈獲取操作
當(dāng)節(jié)點發(fā)出“.'/chain”操作時,將觸發(fā)full_chain函數(shù),該函數(shù)將自己的區(qū)塊鏈作為響應(yīng)返回?。4.3.3工作過
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 吸脂瘦臀部病因介紹
- 商業(yè)辦公樓項目合同范例
- 合作開發(fā)礦業(yè)合同范例
- 過戶房子定金合同范例
- 檳榔合同范例簡易
- 邀請合作協(xié)議合同范例
- 合肥奔馳銷售合同范例
- 飯?zhí)脪炜繀f(xié)議合同范例
- 中鐵電料合同范例
- 租房續(xù)租 合同范例
- 2024年高考政治選必二《法律與生活》重要知識問題梳理總結(jié)
- 孕早期nt檢查課件
- 期末復(fù)習(xí)(試題)-2024-2025學(xué)年三年級上冊數(shù)學(xué)蘇教版
- 檢驗科新進人員崗前培訓(xùn)
- 小紅書種草營銷師模擬題及答案(單選+多選+判斷)
- 2024年家裝家居行業(yè)解決方案-淘天集團
- 2022年新高考I卷讀后續(xù)寫David's run公開課課件-高三英語一輪復(fù)習(xí)
- 《論語》導(dǎo)讀(復(fù)旦版)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 民生銀行社招在線測評題
- 杰士德在線測評題
- 糧油食材配送投標(biāo)方案(大米食用油食材配送服務(wù)投標(biāo)方案)(技術(shù)方案)
評論
0/150
提交評論