《Python工程應用-網絡信息安全》課件-chap4_第1頁
《Python工程應用-網絡信息安全》課件-chap4_第2頁
《Python工程應用-網絡信息安全》課件-chap4_第3頁
《Python工程應用-網絡信息安全》課件-chap4_第4頁
《Python工程應用-網絡信息安全》課件-chap4_第5頁
已閱讀5頁,還剩61頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

chap.4區塊鏈編程網絡信息安全區塊鏈是近些年興起的去中心信任基礎平臺,為網絡金融活動奠定了堅實的信任基礎,并為互聯網創造了新的、可靠的合作機制,具有廣闊的應用前景。區塊鏈技術對于未來信息安全,乃至各類電子通信系統,甚至人類社會活動都有深遠的影響。本章將詳細介紹區塊鏈的編程方法。區塊鏈簡介區塊鏈技術是構建比特幣區塊鏈網絡與交易信息加密傳輸的基礎技術。它基于密碼學原理而不基于信用,使得任何達成一致的雙方直接支付,從而不需要第三方中介的參與。互聯網上的貿易,幾乎都需要借助可資信賴的第三方信用機構來處理電子支付信息。這類系統仍然內生性地受制于“基于信用的模式”。背景1.區塊鏈簡介區塊鏈是一個分布式賬本,一種通過去中心化、去信任的方式集體維護一個可靠數據庫的技術方案。定義從數據的角度來看區塊鏈是一種幾乎不可能被更改的分布式數據庫。這里的“分布式”不僅體現為數據的分布式存儲,也體現為數據的分布式記錄(即由系統參與者共同維護)。從技術的角度來看區塊鏈并不是一種單一的技術,而是多種技術整合的結果。這些技術以新的結構組合在一起,形成了一種新的數據記錄、存儲和表達的方式。1.區塊鏈簡介國際權威雜志《經濟學人》、《哈佛商業周刊》、《福布斯雜志》等相繼報道區塊鏈技術將影響世界。創業公司R3聯合全球42家頂級銀行成立區塊鏈聯盟,包括摩根大通、美國銀行、匯豐銀行、花旗銀行、富國銀行、三菱UFJ金融集團、巴克萊銀行、高盛、德意志銀行等。動態4.1概述4.1.1區塊鏈的概念1.區塊鏈定義區塊鏈就是一個分布式賬本,是一種通過去中心化、去信任的方式集體維護一個可靠數據庫的技術方案。從本質上講,它是一個共享數據庫,存儲于其中的數據或信息,具有不可偽造、全程留痕、可以追溯、公開透明、集體維護等特征。區塊鏈的實現涉及數學、密碼學、互聯網和計算機編程等很多科學技術。區塊鏈可以從不同的角度理解。從數據的角度來看,區塊鏈是一種幾乎不可能被更改的分布式數據庫。這里的“分布式”不僅體現為數據的分布式存儲,也體現為數據的分布式記錄(即由系統參與者共同維護)。從技術的角度來看,區塊鏈并不是一種單一的技術,而是多種技術整合的結果。這些技術以新的結構組合在一起,形成了區塊鏈這種新的數據記錄、存儲和表達的方式。2.區塊鏈應用區塊鏈具有廣泛的應用,甚至被認為對人類未來社會的影響也是非凡的,自不同的視角觀察,區塊鏈對各種網絡應用的變革作用都是前所未有的。從需求端來看,金融、醫療、公證、通信、供應鏈、域名、投票等領域都開始意識到區塊鏈的重要性并開始嘗試將這種技術與現實社會對接。從投資端來看,區塊鏈的投資資金供給逐步上升,風投的投資熱情也不斷高漲,投資密度越來越大,供給端的資金供給有望推動其進一步發展。從市場應用來看,區塊鏈能成為一種市場工具,幫助社會削減平臺成本,讓中間機構成為過去。并且區塊鏈還將促使公司現有業務模式重心的轉移,有望加速公司的發展。從底層技術來看,區塊鏈有望促進數據記錄、數據傳播及數據存儲管理方式的轉型。區塊鏈本身更像一種互聯網底層的開源式協議,在不遠的將來會觸動甚至最后徹底取代現有互聯網的底層基礎協議。從社會結構來看,區塊鏈技術有望將法律與經濟融為一體,徹底顛覆原有社會的監管模式。組織形態會因其而發生改變,區塊鏈也許最終會帶領人們走向分布式自治的社會。4.1.2區塊鏈的分類區塊鏈可以分為私有、共有、聯合三種。

(1)私有區塊鏈私有區塊鏈(PrivateBlockChains):是指僅僅使用區塊鏈的總賬技術進行記賬,可以是一個公司,也可以是個人,獨享該區塊鏈的寫入權限,這種區塊鏈與其他的分布式存儲方案沒有太大區別。

(2)公有區塊鏈公有區塊鏈(PublicBlockChains):是指世界上任何個體或者團體都可以發送交易,且交易能夠獲得該區塊鏈的有效確認,任何人都可以參與其共識過程。公有區塊鏈是最早,也是應用最廣泛的區塊鏈。

(3)聯合(行業)區塊鏈行業區塊鏈(ConsortiumBlockChains):是指由某個群體內部指定多個預選的節點為記賬人,每個塊的生成由所有的預選節點共同決定(預選節點參與共識過程),其他接入節點可以參與交易,但不過問記賬過68程(本質上還是托管記賬,只是變成分布式記賬,預選節點的多少,如何決定每個塊的記賬者成為該區塊鏈的主要風險點),其他任何人可以通過該區塊鏈開放的API進行限定查詢。4.1.3區塊鏈的發展區塊鏈技術的發展與密碼學具有密切聯系,是基于密碼技術逐步發展起來,發展過程可以概括為以下。

1976年,BaileyW.Diffie、MartinE.Hellman兩位密碼學的大師發表了論文《密碼學的新方向》,論文覆蓋了未來幾十年密碼學所有的新的進展領域,包括非對稱加密、橢圓曲線算法、哈希等一些手段,奠定了迄今為止整個密碼學的發展方向,也對區塊鏈的技術和比特幣的誕生起到決定性作用。同年,哈耶克出版了經濟學專著:《貨幣的非國家化》,提出了非主權貨幣、競爭發行貨幣等理念,成為去中心化貨幣的精神指南。

1980年,MerkleRalf提出了Merkle-Tree這種數據結構和相應的算法,后來其主要用途之一就是分布式網絡中數據同步正確性的校驗,這也是后來比特幣中引入的,用來做區塊同步校驗的重要手段之一。

1982年,Lamport提出拜占廷將軍問題,標志著分布式計算的可靠性理論和實踐進入到了實質性階段。同年,大衛·喬姆提出了密碼學支付系統ECash。人們開始嘗試將密碼學運用到貨幣、支付相關的領域。ECash可以說是密碼學貨幣最早的先驅之一。

1985年,Koblitz和Miller各自獨立提出了著名的橢圓曲線加密(ECC)算法。由于此前發明的RSA的算法計算量過大很難實用,ECC的提出才真正使得非對稱加密體系產生了實用的可能。公鑰密碼自此開始被應用到數字貨幣中。

1997年,第一代基于POW(ProofofWork)算法HashCash出現(當時發明出來主要用于做反垃圾郵件)。在隨后發表的各種論文中,具體的算法設計和實現已經完全覆蓋了后來比特幣所使用的POW機制。

1998年,密碼學貨幣的完整思想成熟,戴偉(WeiDai)、尼克·薩博同時提出密碼學貨幣的概念。其中戴偉的B-Money被稱為比特幣的精神先驅,而尼克·薩博的Bitgold提綱和后續中本聰提出的比特幣已經非常接近。

2001年,NSA發布了SHA-2系列算法,其中就包括目前應用最廣的SHA-256算法,這也是比特幣最終采用的哈希算法。至此,比特幣或者區塊鏈技術誕生的所有的技術基礎在理論上、實踐都被解決了。

2008年11月1日,一位自稱中本聰(SatoshiNakamoto)的人發表了《比特幣:一種點對點的電子現金系統》一文,闡述了基于P2P網絡技術、加密技術、時間戳技術、區塊鏈技術等的電子現金系統的構架理念,這標志著比特幣的誕生。兩個月后理論步入實踐,2009年1月3日第一個序號為0的創世區塊誕生。幾天后2009年1月9日出現序號為1的區塊,并與序號為0的創世區塊相連接形成了鏈,標志著區塊鏈的正式誕生。在隨后的發展過程中,又出現了許多標志性事件,具體如圖4-1所示。

從2008年的比特幣誕生開始,區塊鏈經歷了可編程貨幣、可編程金融與可編程社會三大應用時代,其69應用范圍現在已經逐步擴展到社會生活的方方面面了。4.2區塊鏈原理4.2.1區塊鏈結構組成

一般說來,從邏輯上區塊鏈系統基礎架構模型由數據層、網絡層、共識層、激勵層、合約層和應用層組成,如圖4-2所示。

其中,數據層封裝了底層數據區塊以及相關的數據加密和時間戳等基礎數據和基本算法;網絡層則包括分布式組網機制(P2P網絡)、數據傳播機制和數據驗證機制等;共識層主要封裝網絡節點的各類共識算法(包括:PoW、PoS、DPoS等);激勵層將經濟因素集成到區塊鏈技術體系中來,主要包括經濟激勵的發行機制和分配機制等;合約層主要封裝各類腳本代碼、算法機制和智能合約,是區塊鏈可編程特性的基礎;應用層則封裝了區塊鏈的各種應用場景和案例。從模型中不難看出,基于時間戳的鏈式區塊結構、分布式節點的共識機制、基于共識算力的經濟激勵和靈活可編程的智能合約是區塊鏈技術最具代表性的創新點,這是以前任何系統都所不具有的特點。

在具體實現上,區塊鏈網絡由區塊鏈節點組網構成,區塊鏈網絡如圖4-3所示。整個網絡由若干區塊鏈節點互聯而成,任何計算機都可以通過安裝區塊鏈軟件成為一個比特幣節點,一個完整的比特幣節點包括如下功能:

(1)錢包,允許用戶在區塊鏈網絡上進行交易。

(2)完整區塊鏈,記錄了所有交易歷史,通過特殊的結構保證歷史交易的安全性,并且用來驗證新交易的合法性。(3)礦工,通過記錄交易及解密數學題來生成新區塊,如果成功可以賺取獎勵。

(4)路由功能,把其它節點傳送過來的交易數據等信息再傳送給更多的節點。對于節點,除了路由功能以外,其它的功能都不是必須的。4.2.2區塊鏈關鍵技術如前所述,區塊鏈是多種技術的綜合體,這些技術很多都與密碼學有千絲萬縷的聯系,具體包括以下。

1.區塊區塊鏈以區塊為單位組織數據。全網所有的交易記錄都以交易單的形式存儲在全網唯一的區塊鏈中。區塊是一種記錄交易的數據結構。每個區塊由區塊頭和區塊主體組成,區塊主體只負責記錄前一段時間內的所有交易信息。區塊結構如圖4-4所示。

區塊鏈的大部分功能都由區塊頭實現,區塊頭的結構包括如下部分。

(1)版本號:標示軟件及協議的相關版本信息。

(2)父區塊哈希值:引用的區塊鏈中父區塊頭的哈希值,通過這個值每個區塊才首尾相連組成了區塊鏈,并且這個值對區塊鏈的安全性起到了至關重要的作用。

(3)Merkle根:這個值是由區塊主體中所有交易的哈希值再逐級兩兩哈希計算出來的一個數值,主要用于檢驗一筆交易是否存在于這個區塊中存在。

(4)時間戳,記錄該區塊產生的時間,精確到秒。

(5)難度值,獲取該區塊數據記錄時,解算的相關數學題的難度目標。(6)隨機數(Nonce),記錄解密該區塊相關數學題的答案的值。2.數字簽名區塊鏈中的操作需要進行數據簽名,保障合法性。發送報文時,發送方用一個哈希函數從報文文本中生成報文摘要,然后用自己的私鑰對摘要進行加密,加密后的摘要將作為報文的數字簽名和報文一起發送給接收方,接收方首先用與發送方一樣的哈希函數從接收到的原始報文中計算出報文摘要,接著再用發送方的公鑰來對報文附加的數字簽名進行解密,如果這兩個摘要相同、那么接收方就能確認該數字簽名是發送方的。3.Merkle樹當經過多重操作后,為了檢測所有數據的完整性,需要采用一個統一、全局的記錄手段,通常采用的就是Merkle樹。

Merkle樹是一種哈希二叉樹,使用它可以快速校驗大規模數據的完整性。在比特幣網絡中,Merkle樹被用來歸納一個區塊中的所有交易信息,最終生成這個區塊所有交易信息的一個統一的哈希值,區塊中任何一筆交易信息的細微改變都會使得Merkle樹改變(與3.5.3節介紹的RSA認證模式機理類似)。非葉子節點value的計算方法是將該節點的所有子節點進行組合,然后對組合結果進行hash計算所得出的哈希值,如圖4-5所示。圖中交易1、交易2、交易3、交易4各自通過hash計算得到摘要hash1、hash2、hash3、hash4,然后hash1與hash2、hash3與hash4組合經hash計算得到hash12、hash34,然后hash12、hash3471組合經hash計算得到hash1234…,最終得到Merkle根值。通過這樣方法形成一個樹狀結構,樹葉上的任何一個交易發生變化,都會影響Merkle根值得變化,從而監測所有交易。4.時間戳服務器區塊鏈的一致性評判依據是基于時間,大多比對以及驗證處理是通過時間先后來決斷的。

提供時間的時間戳服務器,它是一款基于PKI(公鑰密碼基礎設施)技術的時間戳權威系統,對外提供精確可信的時間戳服務。它采用精確的時間源、高強度高標準的安全機制,以確認系統處理數據在某一時間的存在性和相關操作的相對時間順序,為信息系統中的時間防抵賴提供基礎服務。5.挖礦區塊鏈組織者為了鼓勵大家的記錄積極性,會提供獎勵。由于區塊節點都有記賬的權利,但是由誰來記錄需要經過競爭,這種競爭在區塊鏈中叫做:“挖礦”。區塊鏈中實現挖礦的具體方法就是,獲得能夠讓隨機散列值出現了指定個數0的輸入(例如:要求找出能夠生成前二十位都是0的散列輸入)。如前面3.6.1節介紹,由于散列函數的單向性,不可能從輸出推知輸入。因此,唯一的辦法就是利用不同的輸入去蠻力測試,俗稱“挖礦”。一方面,挖礦對于競爭者而言,是相對公平的解決方案;另一方面,為了提高成功幾率,挖礦需要投入大量的硬件,來增加算力,甚至出現專門用于挖礦的機器,這就是比特幣挖礦機,就是用于賺取比特幣的電腦。這類電腦一般有專業的挖礦芯片,多采用“燒”顯卡的方式工作,耗電量較大。

上述技術構成區塊鏈的基礎。4.2.3區塊鏈工作過程實際的區塊鏈工作過程可以概括為如下五步,具體如圖4-6所示。

第1步:新交易創建。當用戶A與B發生一筆交易,A向B支付貨幣,貨幣所有者A利用自己的私鑰72對前一次交易(比特貨來源)和下一位所有者B的身份信息簽署一個數字簽名,并將這個簽名附加在這枚貨幣的末尾,制作成交易單。第2步:交易通過P2P網絡傳播。A將交易單廣播至全網后,比特幣就發送給了B,每個節點都將收到的交易信息納入一個區塊中。對B而言,該枚比特幣會即時顯示在比特幣錢包中,但直到區塊確認成功后才可用(目前的規定是,一筆比特幣從支付到最終確認成功,必須得到最少6個區塊確認之后才能真正確認到帳)。第3步:交易驗證。每個節點可以通過解一道數學難題,從而去獲得創建新區塊權利(記錄新的交易),并爭取得到比特幣的獎勵(新比特幣,會在此過程中產生)。第4步:驗證結果通過P2P網絡傳播。當一個節點找到解時,它就向全網廣播該蓋有時間戳的記錄交易區塊,并由全網其他節點核對。時間戳用來證實特定區塊是的確存在的。比特幣網絡采取從5個以上節點獲取時間,然后取中間值的方式作為時間戳,最后確定。第5步:交易寫入賬本。全網其他節點核對該區塊記賬的正確性,沒有錯誤后準許挖礦成功的節點記錄上述A與B的交易形成區塊并記錄到區塊鏈中,則A與B的交易全部完成。之后,諸節點將在該合法區塊之后競爭下一個區塊,依此方法形成了一個合法記賬的區塊鏈。區塊的生成速度是可以調節的。一般每個區塊的創建時間大約在10分鐘。隨著全網算力的不斷變化,每個區塊的產生時間會隨算力增強而縮短、隨算力減弱而延長。為了平衡區塊生成速度,可以通過參數調整對其進行調節,其原理是根據最近產生的2016年區塊的時間差(約兩周時間),自動調整每個區塊的生成難度(比如減少或增加目標值中0的個數),使得每個區塊的生成時間保持在10分鐘。4.2.4區塊鏈共識達成區塊鏈運行過程中可能會產生糾紛,為了消除糾紛需要提出達成共識的方案。

1.工作量證明如前面4.2.2節所述,區塊頭包含一個隨機數,使得區塊的隨機散列值出現了指定個0。為了獲取該隨機數,節點需通過以時間為代價反復嘗試來搜索,這樣就構建了一個工作量證明機制。工作量證明機制的本質是CPU一票,“大多數”的決定表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數的CPU為誠實的節點控制,那么誠實的鏈條將以最快的速度延長,并超越其他的競爭鏈條。如果想要修改已出現的區塊,攻擊者必須重新完成該區塊的工作量外加該區塊之后所有區塊的工作量,并最終趕上和超越誠實節點的工作量。工作量證明機制是比特幣交易實現去中心化的技術基礎,其目的是在區塊鏈的交易驗證中進行工作量的認證,從而達到阻止服務器攻擊和其他服務器濫用的經濟對策。通過對工作的結果進行認證來證明完成了相應的工作量,相較于對整個工作過程進行監測,極大的提高了工作效率。在區塊鏈網絡中,如果想獲取創造新的區塊的機會就必須進行挖礦,也就是必須解出基于工作量證明機制的數學難題。該數學難題具體如下式4-1所示。

SHA256(SHA256(version+pre_hash+merkle_root+mime+nbits+x))<difficulty(4-1)在上式中,difficulty所代表的是計算的難度值,難度值決定了礦工挖礦的難度即運算次數,難度值也是挖礦過程的主要考量指標。計算出最優解之后,挖礦成功節點會向整個比特幣網絡廣播該數據,發布驗證成功后,最后由該節點將新的區塊將會銜接在原區塊鏈的尾部。2.分叉同一時間段內,全網不止一個節點能計算出滿足挖礦條件的隨機數,即會有多個節點在網絡中廣播它們各自打包好的臨時區塊(都是合法的),如圖4-7所示。也就是說,某一節點若收到多個針對同一前續區塊的后續臨時區塊,則該節點會在本地區塊鏈上產生分叉。對于該問題,解決方案就是,等到下一個工作量證明被發現,而其中的一條鏈條被證實為是較長的一條,那么在另一條分支鏈條上工作的節點將轉換陣營,開始在較長的鏈條上工作。其他分叉的分支將會被網絡徹底拋棄。3.雙花

雙花,即二重支付,指攻擊者幾乎同時將同一筆錢用作不同交易,企圖利用記賬的時間差實現重復消費。對于這個問題,區塊鏈在每當節點在把新收到的交易單加入區塊之前,會順著交易的發起方的公鑰向前遍歷檢查,檢查當前交易所用的幣是否確實屬于當前交易發起方,此檢查可遍歷到該幣的最初誕生點(即產生它的那塊區塊源)。雖然多份交易單可以任意序的廣播,但是它們最終被加入區塊時必定呈現一定的時間順序。區塊之間以Hash值作為時間戳完全可以信賴,因此任意一筆交易資金來源都可以被確定的回溯到準確的時間點。發生雙花時,只要比較兩筆交易的時間先后,就能進行裁決。基于上述方案,區塊鏈所面臨的主要問題都得到了解決。4.3區塊鏈編程4.3.1區塊鏈類編程

1.區塊結構定義首先介紹區塊鏈程序的關鍵數據定義。

(1)區塊數據典型的區塊(含區塊頭和區塊體)包括:索引號、時間戳、工作量證明值、前一個塊的哈希值、交易信息(發送者,接收者,數量等),還有版本號、附加信息等等。下面代碼就是以字典方式定義的一個簡化的區塊結構,但僅包括索引號?、時間戳?、交易信息?、工作量證明值?和前一個塊的哈希值?。

(2)交易記錄數據對于每筆交易需要記錄并記入區塊。交易的數據主要包括:發送者、接收者、交易數和簽名。對于每筆交易,還需要使用公鑰檢驗其簽名。所使用的公鑰是進行驗證的關鍵,其結構需要滿足標準化要求,下面是一個公鑰的數據實例。

上公鑰采用的是.pem格式,在導入時,標記開始符“-----BEGINRSAPUBLICKEY-----”及結束符“-----ENDRSAPUBLICKEY-----”中間不要換行,否則在裝入時無法識別。

區塊中的'transactions'即為交易數據,其結構定義如下:

交易數包含三項,即:發送者?、接收者?、交易數?,簽名是在填寫完交易信息后,然后通過依次哈希和私鑰簽署后追加上去的。為了確保簽名的一致性,需要對交易數據先使用OrderedDic進行排序。(3)表數據區塊鏈程序記錄了節點、區塊、交易三類表數據。

transactions列表記錄了每筆交易,chain列表記錄了諸區塊,nodes記錄了區塊鏈節點(這里采用的是集合格式數據,消除重復記錄,見2.2.1節集合的定義)。

(4)其它數據區塊鏈程序還使用到了挖礦難度值MINING_DIFFICULTY,即:挖礦得到的聲明值能夠滿足與交易的聯合輸入經hash計算所得到的輸出值,后位有MINING_DIFFICULTY個0。另外,還要求輸入的節點地址應形如:':5000的格式,以方便網絡訪問。2.區塊鏈類為了完成區塊鏈功能,定義區塊鏈類Blockchain,本區塊鏈類包含以下成員函數。

(1)構造函數Blockchain的構造函數代碼如下。

該成員函數進行類創建的準備工作,分別建立交易?、區塊鏈?、節點記錄?數據,并利用隨機數命名創建的節點?,然后創建創世紀區塊?。

(2)節點注冊成員函數區塊鏈節點需要完成注冊,由節點注冊成員函數實現,代碼如下。區塊鏈節點工作前需要將自身注冊為區塊鏈節點,將自身的工作地址與端口號記錄到node集合中。(3)區塊創建相關的成員函數區塊創建相關的成員函數有三個,分別是create_Genesis_Block、next_block和hash。

在區塊鏈的所有區塊中,創建的第一個區塊,叫做創世紀區塊(GenesisBlock)。區塊鏈將在創世紀區塊基礎上,不斷地記錄、生長,就形成了區塊鏈。

create_Genesis_Block完成創世紀區塊建立,代碼如下。

上述代碼創建了第一個名為“GenesisBlock”、索引值為1的區塊,為了便于網絡傳輸,將時間轉換為字符串以支持json格式?。對于后續生成區塊,采用next_block成員函數進行記錄,代碼如下。該函數的返回值即為新的區塊。在create_Genesis_Block和next_block中,都需要對區塊進行哈希,這可以通過hash成員函數完成。

通過排序,保障hash的一致性?。為了簡便起見,此處并沒有實現Merkle樹的哈希。為了支持后續網絡訪問,區塊均需采用支持Json的格式。這里的Json(JavaScriptObjectNotation,即:JS對象簡譜)是一種輕量級的數據交換格式。它基于ECMAScript(歐洲計算機協會制定的JS規范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得Json成為理想的數據交換語言。易于人閱讀和編寫,同時也易于機器解析和生成,并能有效地提升網絡傳輸效率。(4)區塊有效性檢查成員

為了檢查區塊鏈的有效性,需要遍歷所有區塊,主要是看記錄的前塊區塊的哈希值是否與實際一致。檢查工作由成員函數valid_chain完成,代碼如下。該函數從區塊鏈中取出當前塊?,對該塊計算hash,并與本塊的記錄的前塊(previous_hash)哈希值比較?,看是否一致,如果不一致返回false。該檢查由創世紀區塊一直檢查到區塊鏈的末尾。(5)沖突解決成員

由于區塊鏈網絡的并發性,就有可能同時存在合理的區塊,因此就會產生如4.2.4節介紹的分叉,也就形成了沖突。針對該沖突,就需要有專門的解決方案,由成員函數resolve_conflicts來進行仲裁,代碼如下。

該函數先以自身的鏈為最長?,然后向所有記錄的節點請求其區塊鏈?,然后依次與自身區塊鏈比較?,最終用最長的區塊鏈進行現有區塊鏈的更新?,最后解決沖突問題。

(6)交易成員函數交易成員函數包含submit_transaction和verify_transaction_signature,分別用來發起交易和檢驗交易的合法性。

submit_transaction函數發起一個交易,代碼如下。該函數為了保障簽名哈希的一致性,首先對一條交易信息進行排序,然后驗證其合法性?,通過后將交易計入交易列表?(注意,交易被加入區塊還需由礦工完成)。

交易的合法性由verify_transaction_signature成員函數完成,主要是檢查交易的簽名是否與公鑰匹配,代碼如下。

上述檢驗主要利用了rsa的verify方法(詳見3.5.2節)。此處使用到Python3中的bytes和str的對應方法進行互相轉換,str.encode('utf-8')將字符串轉字節?,bytes.decode('utf-8')將字節轉字符串?。

(7)工作量證明成員工作量證明成員包括工作量證明(即:挖礦)proof_of_work和valid_proof成員函數。

proof_of_work代碼如下。通過累加試湊,得到滿足條件的聲明值(nonce)。valid_proof代碼如下。

valid_proof成員采用蠻力的方法試算滿足要求的聲明(nonce)值。通過上述代碼可知,計算是由交易信息、前塊哈希值、聲明值得混合作為哈希的輸入?,使之滿足輸出值的后difficulty位均為0?。由于提前計算根本無法預知交易的信息,因此是完全不可能預先準備的。4.3.2Web框架編程為了實現區塊鏈網絡節點之間的交互,還需實現基于Web的編程。此處采用PythonFlask框架這一輕量Web應用框架,需將將網絡請求映射到4.3.1中的Blockchain類的成員函數。

1.Flask框架Flask是一個微型的Python開發的Web框架,也被稱為“microframework”。Flask提供一個簡單的內核,并可以用extension增加其他功能,因此,雖然Flask沒有默認使用的數據庫、窗體驗證工具,但可以用Flask-extension加入這些功能,例如:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。

Flask的socket是基于Werkzeug實現的,模板語言依賴jinja2模板,在使用Flask之前需要安裝一下,即執行:pipinstallflask。(1)Flask對象編程簡要介紹Flask對象的編程。在安裝完成Flask后,可以利用下面代碼生成Flask對象。

參數template_folder:指定存放模板的文件夾的名稱(默認為templates);static_folder:指定存放靜態文件資源的文件夾的名稱(默認為static,注意:如果沒有指定static_url_path的話,則訪問路徑和static_folder的名稱是一致的;static_url_path:指定靜態文件的訪問路徑。Flask對象通過“@app.route”將域名映射到相關的函數,例如下面代碼。

其作用就是,當用戶在瀏覽器中輸入:“A.B.C.D(IP地址):端口號/register”時,將調用register函數進行處理。

Flask對象通過run方法,將Flask服務運行在指定的地址(這里以“A.B.C.D”為例)、端口上,開啟網絡服務。2.區塊鏈類成員函數映射如上面Flask編程的框架,可以將網絡訪問轉化為區塊鏈類成員函數調用,這樣基于Flask就可以實現79區塊鏈的網絡操作了,具體實現如下面代碼。歡迎界面當用戶在瀏覽器中輸入“A.B.C.D:端口號”時,回顯“歡迎加入區塊鏈的世界!”。(2)注冊節點操作注冊區塊鏈節點操作,當用戶發送節點“POST”類型注冊請求時,調用register_nodes函數。register_nodes函數將POST請求中包含的nodes內容作為區塊鏈類對象“(b”?)的成員函數register_node的輸入,執行節點注冊,并通過jsonify返回響應?。(3)注冊節點列表獲取

當用戶發送“./nodes/get”(A.B.C.D/nodes/get的略寫,下同)的“GET”類型請求時,調用get_nodes函數,將本節點的注冊節點列表作為響應返回。(4)新的交易發起

用戶發送“./transactions/new”的“POST”類型請求時,調用new_transaction函數,向區塊鏈對象的交易列表中加入一條新的記錄(需要通過合法性驗證),將添加情況作為響應返回。new_transaction函數采用request.args.get函數依次將'sender_address'、'recipient_address'、'amount'、'signature'對應的值從用戶的POST請求中讀出?;產生新交易?;成功后應答201?。

注意,新的交易發起操作應當向全網廣播,此處為了簡便起見沒有實現。(5)交易查詢操作

有時需要查詢交易信息,用戶發送“./transactions/get”的“POST”類型請求,調用get_transactions函數,將區塊鏈對象的transactions列表作為響應返回。(6)挖礦操作用戶輸入“.'/mine”時,執行挖礦操作,即mine函數。

通過調用proof_of_work解算進行挖礦?;只有在挖礦成功后,才可以將最新的一條交易制成區塊,加入到區塊鏈中?。

注意,如前所述,新的區塊加入區塊鏈需要若干相鄰節點的確認,此處為了簡便起見沒有實現。

(7)沖突仲裁操作

當出現區塊鏈“分叉”時,需要進行沖突仲裁,這時發送“./nodes/resolve”的“GET”類型請求,將調用consensus函數。該函數實際上調用了區塊鏈對象的resolve_conflicts方法,將所有節點中最長的鏈作為解決方案。

(8)鏈獲取操作

當節點發出“.'/chain”操作時,將觸發full_chain函數,該函數將自己的區塊鏈作為響應返回?。4.3.3工作過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論