日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于Java开发一套完整的区块链系统(附源码)

發(fā)布時間:2023/12/8 windows 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Java开发一套完整的区块链系统(附源码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源:https://blog.csdn.net/victory_long



前言

近幾年區(qū)塊鏈概念越來越火,特別是區(qū)塊鏈技術(shù)被納入國家基礎(chǔ)設(shè)施建設(shè)名單后,各大企業(yè)也開始招兵買馬,對區(qū)塊鏈技術(shù)進行研究,從各大招聘網(wǎng)站的區(qū)塊鏈職位來看,薪資待遇都很不錯,月薪30K到80K的都有,這對于我們程序員來說也是一種機遇,說明學(xué)習(xí)區(qū)塊鏈技術(shù)刻不容緩。

我個人從2016年就開始在做區(qū)塊鏈系統(tǒng)開發(fā)的相關(guān)工作,最近身邊很多朋友都在找我,想讓我給他們講講區(qū)塊鏈技術(shù)開發(fā)的相關(guān)知識,介于此,索性我就手擼了一套簡單的java區(qū)塊鏈系統(tǒng),并寫了一份詳細的開發(fā)教程,發(fā)布到博客,希望能夠?qū)釔蹍^(qū)塊鏈技術(shù)的小伙伴學(xué)習(xí)入門有所幫助。

這套區(qū)塊鏈系統(tǒng)代碼非常簡潔清晰,對于新手來說非常好理解,旨在告訴大家其實區(qū)塊鏈技術(shù)并沒有那么高深復(fù)雜。系統(tǒng)中除了springboot框架外,其他基本都是純原生開發(fā),就連P2P網(wǎng)絡(luò)也是用的java socket來實現(xiàn)的。

文末有本文完整源碼鏈接。

一、區(qū)塊鏈技術(shù)理論基礎(chǔ)

1、基本概念

(1)區(qū)塊鏈

從技術(shù)層面來看,區(qū)塊鏈是由包含交易信息的區(qū)塊按照時間順序從后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。

從應(yīng)用層面來說,區(qū)塊鏈是一個分布式的共享賬本和數(shù)據(jù)庫,具有去中心化、不可篡改、全程留痕、集體維護、公開透明等特點?;谶@些特點,區(qū)塊鏈技術(shù)可以開發(fā)出自帶信任體系特征的系統(tǒng),實現(xiàn)多個主體之間的協(xié)作信任與一致行動。

區(qū)塊是區(qū)塊鏈中的最小組成單位,主要有包含元數(shù)據(jù)的區(qū)塊頭和存放一條或者多條交易信息的區(qū)塊體兩部分組成,每個區(qū)塊都記錄著當前區(qū)塊的哈希和上一個區(qū)塊的哈希,通過兩個哈希值的關(guān)聯(lián),讓所有的區(qū)塊以鏈式結(jié)構(gòu)串起來,就形成了一個完整的區(qū)塊鏈。

區(qū)塊鏈中的第一個區(qū)塊被稱作為創(chuàng)世區(qū)塊,無需關(guān)聯(lián)上一個區(qū)塊。以BTC網(wǎng)絡(luò)為例,每個區(qū)塊主要包含如下信息字段:

  • 區(qū)塊大小:用字節(jié)表示的區(qū)塊數(shù)據(jù)大小

  • 區(qū)塊頭:組成區(qū)塊頭的包括以下幾個字段:
    1. 區(qū)塊頭hash值
    2. 父區(qū)塊頭hash值
    3. 時間戳:區(qū)塊產(chǎn)生的近似時間
    4. Merkle根:該區(qū)塊中交易的merkle樹根的哈希值
    5. 難度目標:該區(qū)塊工作量證明算法的難度目標
    6. Nonce:用于工作量證明算法的計數(shù)器

  • 交易計數(shù)器:交易的數(shù)量

  • 交易:記錄在區(qū)塊里的交易信息

區(qū)塊鏈結(jié)構(gòu)的簡易模型,如下圖所示:

區(qū)塊中的交易集合記錄的是一些特定的信息,在BTC網(wǎng)絡(luò)中主要記錄的是交易信息,在其他區(qū)塊鏈網(wǎng)絡(luò)中可以按照業(yè)務(wù)邏輯來保存相應(yīng)的業(yè)務(wù)數(shù)據(jù),如審計信息、版權(quán)信息、票據(jù)信息等,這也是區(qū)塊鏈經(jīng)常用來當做共享賬本的原因。

打個比方,可以把區(qū)塊鏈當做一個用來記賬的筆記本,一個區(qū)塊就相當于一頁紙,上面記錄了某一時間段內(nèi)所有的賬務(wù)信息,從第一頁到最后一頁,按照頁碼順序排列起來就是一個完整的賬本。

(2)區(qū)塊鏈網(wǎng)絡(luò)

實際的區(qū)塊鏈系統(tǒng)由多個區(qū)塊鏈節(jié)點組成,每個節(jié)點都運行著相同一套區(qū)塊鏈主干網(wǎng)絡(luò)的副本,且各個節(jié)點間通過P2P網(wǎng)絡(luò)進行交互,并最終形成一個完整的區(qū)塊鏈網(wǎng)絡(luò)系統(tǒng)。

P2P網(wǎng)絡(luò)具有可靠性、去中心化,以及開放性,各個節(jié)點之間交互運作、協(xié)同處理,每個節(jié)點在對外提供服務(wù)的同時也使用網(wǎng)絡(luò)中其他節(jié)點所提供的服務(wù)。當某一個區(qū)塊鏈節(jié)點產(chǎn)生新的區(qū)塊時,會通過廣播的方式告訴其他節(jié)點,其他節(jié)點通過網(wǎng)絡(luò)接收到該區(qū)塊信息時,會對這個區(qū)塊信息進行驗證,當有一定數(shù)量的節(jié)點都驗證通過后,各個節(jié)點會把該區(qū)塊更新到各自現(xiàn)有的區(qū)塊鏈上,最終使得整個區(qū)塊鏈網(wǎng)絡(luò)中的各個節(jié)點信息保持一致,這也是區(qū)塊鏈去中心化、可信任特性的體現(xiàn)。

區(qū)塊鏈網(wǎng)絡(luò)簡易模型,如下圖所示:

2、區(qū)塊鏈分類

(1)公有鏈

公有區(qū)塊鏈(Public Block Chains)是指:世界上任何個體或者團體都可以發(fā)送交易,且交易能夠獲得該區(qū)塊鏈的有效確認,任何人都可以參與使用和維護該區(qū)塊鏈,信息公開透明。公有區(qū)塊鏈是最早的區(qū)塊鏈,例如BTC、以太坊等虛擬數(shù)字貨幣均基于公有區(qū)塊鏈。不過目前公有鏈實際應(yīng)用價值不大,并沒有產(chǎn)生特別合適的應(yīng)用場景。

(2)聯(lián)盟鏈

行業(yè)區(qū)塊鏈(Consortium Block Chains):由某個群體內(nèi)部指定多個預(yù)選的節(jié)點為記賬人,每個塊的生成由所有的預(yù)選節(jié)點共同決定(預(yù)選節(jié)點參與共識過程),其他接入節(jié)點可以參與交易,但有權(quán)限限制,信息受保護,如銀聯(lián)組織。目前聯(lián)盟鏈是各個區(qū)塊鏈技術(shù)團隊主要研究的對象,由于聯(lián)盟鏈擁有區(qū)塊鏈技術(shù)的大部分特征,并且在權(quán)限管理、數(shù)據(jù)安全、監(jiān)管方面更有優(yōu)勢,是企業(yè)優(yōu)先考慮的區(qū)塊鏈技術(shù)方案。

市面上也有一些比較主流的聯(lián)盟鏈技術(shù)框架,讓開發(fā)維護聯(lián)盟鏈更加便捷。國內(nèi)一些大的軟件廠商也都有自己的企業(yè)區(qū)塊鏈技術(shù)解決方案,例如螞蟻金服區(qū)塊鏈平臺,騰訊的TrustSQL平臺,東軟的SaCa EchoTrust區(qū)塊鏈應(yīng)用平臺以及京東區(qū)塊鏈防偽追溯平臺等等。

(3)私有鏈

私有區(qū)塊鏈(Private Block Chains):僅僅使用區(qū)塊鏈的總賬技術(shù)進行記賬,可以是一個公司,也可以是個人,獨享該區(qū)塊鏈的寫入權(quán)限,利用區(qū)塊鏈的不易篡改特性,把區(qū)塊鏈作為賬本數(shù)據(jù)庫來使用。

3、關(guān)鍵技術(shù)與特性

(1)共識機制

共識機制被稱作為區(qū)塊鏈系統(tǒng)的靈魂,是區(qū)塊鏈系統(tǒng)信任體系的基礎(chǔ)。區(qū)塊鏈系統(tǒng)作為一個多節(jié)點的分布式賬本系統(tǒng),當有新的信息需要記錄時,哪個節(jié)點來負責(zé)記賬,記賬獎勵發(fā)放給哪個節(jié)點,哪些節(jié)點負責(zé)驗證記賬結(jié)果,如何讓各個節(jié)點達成最終一致,將記賬結(jié)果被網(wǎng)絡(luò)中所有節(jié)點以同樣的順序復(fù)制并記錄下來,就是共識機制要做的事情。

而按照百度百科上的說法:

所謂“共識機制”是通過特殊節(jié)點的投票,在很短的時間內(nèi)完成對交易的驗證和確認,對一筆交易,如果利益不相干的若干個節(jié)點能夠達成共識,我們就可以認為全網(wǎng)對此也能夠達成共識。再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學(xué)生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那么基本上就可以斷定你這人還不壞。

目前,較為主流的共識算法有PoW、PoS、DPoS、PBFT等,在實際使用時,每種算法都有各自的優(yōu)點和缺點。在應(yīng)用于不同場景時,區(qū)塊鏈項目將會采用不同的共識機制和算法。

(2)去中心化

去中心化,是互聯(lián)網(wǎng)發(fā)展過程中形成的社會關(guān)系形態(tài)和內(nèi)容產(chǎn)生形態(tài),是相對于“中心化”而言的新型網(wǎng)絡(luò)內(nèi)容生產(chǎn)過程。在一個分布有眾多節(jié)點的區(qū)塊鏈系統(tǒng)中,每個節(jié)點都具有高度自治的特征。任何一個節(jié)點都可能成為階段性的中心,但不具備強制性的中心控制功能。節(jié)點與節(jié)點之間的影響,會通過網(wǎng)絡(luò)而形成關(guān)聯(lián)關(guān)系。這種開放式、扁平化、平等性的系統(tǒng)現(xiàn)象或結(jié)構(gòu),我們稱之為去中心化。

去中心化的系統(tǒng)具有容錯力高、抗攻擊力強的特征。中心化的系統(tǒng)一旦中心出現(xiàn)問題,整個系統(tǒng)都會崩潰,但是區(qū)塊鏈系統(tǒng)中的任何一個節(jié)點出現(xiàn)問題,并不會對整個區(qū)塊鏈網(wǎng)絡(luò)產(chǎn)生太大的影響。

另外,去中介化并不代表著不接受監(jiān)管,“去中心化”去的是中央控制方和中介方,而不是監(jiān)管方。監(jiān)管節(jié)點可以方便地接入任何一個區(qū)塊鏈網(wǎng)絡(luò)。并且由于區(qū)塊鏈的公開透明特性,監(jiān)管機構(gòu)反而可以更加方便地監(jiān)控整個系統(tǒng)的交易數(shù)據(jù)。

(3)智能合約

從技術(shù)層面講,智能合約是一段部署在在區(qū)塊鏈上的程序代碼,當滿足程序設(shè)定的條件時,它便會在區(qū)塊鏈上運行,并得到相應(yīng)的結(jié)果。這種情況有點類似于微信的小程序,區(qū)塊鏈提供虛擬機和腳本語言,用戶根據(jù)腳本語言的語法開發(fā)帶有一定業(yè)務(wù)邏輯的程序,部署在區(qū)塊鏈上,當滿足執(zhí)行的條件時,智能合約便會被區(qū)塊鏈虛擬機解釋并運行。

典型的應(yīng)用便是以太坊平臺的智能合約,在這個平臺里可以支持用戶通過簡單的幾行代碼就能實現(xiàn)他們想要的合約,實現(xiàn)無需人為監(jiān)督的、不可篡改、自動化運行的合約,買賣房子不需要再找中介、借錢不需要再找公證人……人們可以隨時隨地根據(jù)自身需求發(fā)起合約,它的執(zhí)行不依賴某個人和組織,所有的信任完全基于以太坊區(qū)塊鏈平臺本身。

(4)不可篡改性

大部分人習(xí)慣稱它為不可篡改性,但是從技術(shù)層面來說,我個人覺得叫做不可逆轉(zhuǎn)性更貼切,既然是一個計算機系統(tǒng),增刪改查是基本的功能屬性,只不過區(qū)塊鏈系統(tǒng)刪除和修改操作比較特殊一點。

區(qū)塊鏈是由每個區(qū)塊的哈希值串連起來的鏈式結(jié)構(gòu),而區(qū)塊的哈希值=SHA256(“當前區(qū)塊內(nèi)容+上一個區(qū)塊的哈希值”),任何一個區(qū)塊的內(nèi)容發(fā)生修改,都會引起哈希值的變化,而哈希值的變化也會引起子區(qū)塊哈希值發(fā)生變化,進而引起整個區(qū)塊鏈的改變。

因此任何人想要修改區(qū)塊的數(shù)據(jù)幾乎是不可能的,除非他把整個區(qū)塊鏈中從創(chuàng)世區(qū)塊到最新的區(qū)塊的所有哈希值全部重新修改一遍,并且修改完之后,還得廣播告訴網(wǎng)絡(luò)中的其他所有節(jié)點,讓其他所有節(jié)點接受修改。

不過按照目前計算機的算力,想要在短時間內(nèi)從區(qū)塊鏈頭部到尾部全部修改一遍,是一件非常困難的事,并且即使修改完了,其他節(jié)點也不會接受修改,因為憑一己之力,沒有能夠讓所有節(jié)點達成共識的條件。

4、流行的區(qū)塊鏈框架與應(yīng)用

(1)公有鏈應(yīng)用:BTC網(wǎng)絡(luò)

區(qū)塊鏈1.0產(chǎn)品,對于比特幣,中本聰是這樣定義的:是一種完全通過點對點技術(shù)實現(xiàn)的電子現(xiàn)金系統(tǒng),它使得在線支付能夠直接由一方發(fā)起并支付給另外一方,中間不需要通過任何的金融機構(gòu)。

與所有的貨幣不同,比特幣不依靠特定貨幣機構(gòu)發(fā)行,它依據(jù)特定算法,通過大量的計算產(chǎn)生,比特幣經(jīng)濟使用整個P2P網(wǎng)絡(luò)中眾多節(jié)點構(gòu)成的分布式數(shù)據(jù)庫來確認并記錄所有的交易行為,并使用密碼學(xué)的設(shè)計來確保貨幣流通各個環(huán)節(jié)安全性。之后人們根據(jù)比特幣網(wǎng)絡(luò)技術(shù)整理出了區(qū)塊鏈技術(shù)體系,去解決信任的問題,而比特幣網(wǎng)絡(luò)原理也成為了區(qū)塊鏈技術(shù)初學(xué)者的經(jīng)典教材。

(2)公有鏈應(yīng)用:以太坊網(wǎng)絡(luò)

區(qū)塊鏈2.0產(chǎn)品的代表,以太坊是一個為去中心化應(yīng)用(Dapp)而生的開源區(qū)塊鏈平臺,擁有著大部分區(qū)塊鏈技術(shù)的特征,但與其它區(qū)塊鏈不同的是,以太坊是可編程的,開發(fā)者可以用它來構(gòu)建不同的應(yīng)用程序,通過其專用加密貨幣以太幣(簡稱“ETH”)提供去中心化的以太虛擬機(Ethereum Virtual Machine)來處理點對點合約(就是一些腳本程序代碼)。如果把比特幣網(wǎng)絡(luò)看作是一套分布式的數(shù)據(jù)庫,而以太坊則更進一步,它可以看作是一臺分布式的計算機:區(qū)塊鏈是計算機的ROM,合約是程序,而以太坊的礦工們則負責(zé)計算,擔任CPU的角色。


以太坊的概念首次在2013至2014年間由程序員Vitalik Buterin受比特幣啟發(fā)后提出,大意為“下一代加密貨幣與去中心化應(yīng)用平臺”。雖然以太坊作為平臺可以在其上開發(fā)新的應(yīng)用,但是由于以太坊的運行和BTC網(wǎng)絡(luò)一樣,采用的是Token機制,且平臺性能不足,經(jīng)常出現(xiàn)網(wǎng)絡(luò)擁堵的情況,平臺用來學(xué)習(xí)開發(fā)與測試區(qū)塊鏈技術(shù)還可以,用于實際生產(chǎn)的話不太現(xiàn)實。

(3)聯(lián)盟鏈開發(fā)框架:Hyperledger Fabric

Hyperledger Fabric 也叫超級賬本,它是 IBM 貢獻給 Linux 基金會的商用分布式賬本,是面向企業(yè)應(yīng)用的全球最大的分布式開源項目。像其他區(qū)塊鏈技術(shù)一樣,它也有一個賬本,可以使用智能合約。Fabric的智能合約可以有多種架構(gòu),它可以用主流語言編程,例如Go、Java和Javascript,此外也可以使用Solidity。

至今,Fabric已獲得了阿里巴巴、AWS、Azure、百度、谷歌、華為、IBM、甲骨文、騰訊等互聯(lián)網(wǎng)巨頭的支持。許多企業(yè)的區(qū)塊鏈平臺都把Fabric作為底層框架來使用,例如甲骨文。不過由于IBM對區(qū)塊鏈的定義強調(diào)了區(qū)塊鏈的分布式和不可變兩個元素,對共識機制進行了削弱,采用了Kafka和zookeeper的“排序服務(wù)”實現(xiàn)共識,因此部分業(yè)內(nèi)人士也稱超級賬本是“偽區(qū)塊鏈”,但是即便如此,也抵擋不了企業(yè)對超級賬本的喜愛,目前Fabric 2.0版本已經(jīng)正式發(fā)布。

(4)小結(jié)

目前公有鏈在實際應(yīng)用中并沒有太多的業(yè)務(wù)場景落地,大部分都是以挖礦為主題或者線上寵物飼養(yǎng)的游戲為主,并且由于數(shù)字貨幣的匿名性,有些不法分子利用這一特點,將數(shù)字貨幣用于洗錢、暗網(wǎng)買賣等違法行為,是各個國家的打擊對象,我國政策法規(guī)也嚴厲禁止,因此對于技術(shù)人員來說,公有鏈可以作為研究學(xué)習(xí)的對象,其他方面暫時沒有太多實際意義。

目前大部分區(qū)塊鏈企業(yè)的研究方向主要是針對企業(yè)的聯(lián)盟鏈和私有鏈,并且國家層面也在大力支持區(qū)塊鏈技術(shù)的發(fā)展,特別是區(qū)塊鏈底層核心技術(shù)的研發(fā),倡導(dǎo)把區(qū)塊鏈作為核心技術(shù)自主創(chuàng)新的重要突破口,明確主攻方向,加大投入力度,著力攻克一批關(guān)鍵核心技術(shù),加快推動區(qū)塊鏈技術(shù)和產(chǎn)業(yè)創(chuàng)新發(fā)展。不過現(xiàn)在市面上主流的區(qū)塊鏈平臺大部分還是以國外公司主導(dǎo)的為主,國內(nèi)區(qū)塊鏈底層核心技術(shù)的發(fā)展,還需要技術(shù)人員的加倍努力。

二、區(qū)塊鏈技術(shù)Java實現(xiàn)

1、區(qū)塊鏈技術(shù)架構(gòu)


目前主流的區(qū)塊鏈技術(shù)架構(gòu)主要分為五層,數(shù)據(jù)層是最底層的技術(shù),主要實現(xiàn)了數(shù)據(jù)存儲、賬戶信息、交易信息等模塊,數(shù)據(jù)存儲主要基于Merkle樹,通過區(qū)塊的方式和鏈式結(jié)構(gòu)實現(xiàn),而賬戶和交易基于數(shù)字簽名、哈希函數(shù)和非對稱加密技術(shù)等多種密碼學(xué)算法和技術(shù),來保證區(qū)塊鏈中數(shù)據(jù)的安全性。

網(wǎng)絡(luò)層主要實現(xiàn)網(wǎng)絡(luò)節(jié)點的連接和通訊,又稱點對點技術(shù),各個區(qū)塊鏈節(jié)點通過網(wǎng)絡(luò)進行通信。共識層是通過共識算法,讓網(wǎng)絡(luò)中的各個節(jié)點對全網(wǎng)所有的區(qū)塊數(shù)據(jù)真實性正確性達成一致,防止出現(xiàn)拜占庭攻擊、51攻擊等區(qū)塊鏈共識算法攻擊。

激勵層主要是實現(xiàn)區(qū)塊鏈代幣的發(fā)行和分配機制,是公有鏈的范疇,我們不做分析。應(yīng)用層一般把區(qū)塊鏈系統(tǒng)作為一個平臺,在平臺之上實現(xiàn)一些去中心化的應(yīng)用程序或者智能合約,平臺提供運行這些應(yīng)用的虛擬機。

接下來我們基于Java語言來開發(fā)一套小型的區(qū)塊鏈系統(tǒng),來實現(xiàn)數(shù)據(jù)層、網(wǎng)絡(luò)層、共識層的一些功能,用簡單的代碼來直觀抽象的概念,以便加深對以上區(qū)塊鏈技術(shù)基礎(chǔ)理論的理解。

2、基于java的區(qū)塊鏈開發(fā)實戰(zhàn)

(1)開發(fā)環(huán)境

開發(fā)工具VSCode
開發(fā)語言Java
JDK版本JDK1.8或者OpenJDK11
開發(fā)框架SpringBoot2.2.1
工程管理Maven3.6
測試工具Postman

(2)區(qū)塊鏈基本模型構(gòu)建

區(qū)塊是區(qū)塊鏈系統(tǒng)的最小單元,第一步我們先實現(xiàn)最簡單的區(qū)塊結(jié)構(gòu),新建Block.java類,主要包含以下幾個字段:
Block.java

/*** 區(qū)塊結(jié)構(gòu)* * @author Jared Jia**/ public class Block implements Serializable {private static final long serialVersionUID = 1L;/*** 區(qū)塊索引號(區(qū)塊高度)*/private int index;/*** 當前區(qū)塊的hash值,區(qū)塊唯一標識*/private String hash;/*** 前一個區(qū)塊的hash值*/private String previousHash;/*** 生成區(qū)塊的時間戳*/private long timestamp;/*** 工作量證明,計算正確hash值的次數(shù)*/private int nonce;/*** 當前區(qū)塊存儲的業(yè)務(wù)數(shù)據(jù)集合(例如轉(zhuǎn)賬交易信息、票據(jù)信息、合同信息等)*/private List<Transaction> transactions;/*** 省略get set方法****/}

區(qū)塊鏈是由區(qū)塊按照區(qū)塊哈希前后順序串聯(lián)起來的數(shù)據(jù)結(jié)構(gòu),哈希值通過散列算法對區(qū)塊進行二次哈希計算而得到的數(shù)字摘要信息(不了解散列函數(shù)的,可以先百度了解一下SHA算法),用于保證區(qū)塊的信息安全以及整條區(qū)塊鏈的有效性。因此第二步我們新增計算區(qū)塊Hash值的方法,采用SHA256算法,通過java實現(xiàn):
CryptoUtil.java

/*** 密碼學(xué)工具類* * @author Jared Jia**/ public class CryptoUtil {/*** SHA256散列函數(shù)* @param str* @return*/public static String SHA256(String str) {MessageDigest messageDigest;String encodeStr = "";try {messageDigest = MessageDigest.getInstance("SHA-256");messageDigest.update(str.getBytes("UTF-8"));encodeStr = byte2Hex(messageDigest.digest());} catch (Exception e) {System.out.println("getSHA256 is error" + e.getMessage());}return encodeStr;}private static String byte2Hex(byte[] bytes) {StringBuilder builder = new StringBuilder();String temp;for (int i = 0; i < bytes.length; i++) {temp = Integer.toHexString(bytes[i] & 0xFF);if (temp.length() == 1) {builder.append("0");}builder.append(temp);}return builder.toString();} }

第三步,創(chuàng)建一個鏈式結(jié)構(gòu)對象,按照先后順序來保存區(qū)塊對象,從來形成一個有序的區(qū)塊鏈表,考慮到線程安全問題,采用CopyOnWriteArrayList來實現(xiàn),為了方便測試,暫且把區(qū)塊鏈結(jié)構(gòu)保存在本地緩存中,實際的區(qū)塊鏈網(wǎng)絡(luò)最終會實現(xiàn)持久層的功能,把區(qū)塊鏈數(shù)據(jù)保存至數(shù)據(jù)庫中,例如BTC核心網(wǎng)絡(luò)采用的是K-V數(shù)據(jù)庫LevelDB:
BlockCache.java

public class BlockCache {/*** 當前節(jié)點的區(qū)塊鏈結(jié)構(gòu)*/private List<Block> blockChain = new CopyOnWriteArrayList<Block>();public List<Block> getBlockChain() {return blockChain;}public void setBlockChain(List<Block> blockChain) {this.blockChain = blockChain;}}

第四步,有了區(qū)塊鏈結(jié)構(gòu)后,需要新增向區(qū)塊鏈中添加區(qū)塊的方法,同時每次添加區(qū)塊的時候,我們需要驗證新區(qū)塊的有效性,例如Hash值是否正確,新區(qū)塊中上一區(qū)塊的Hash屬性的值,與上一區(qū)塊的Hash值是否相等。

另外,區(qū)塊鏈中必須有個創(chuàng)世區(qū)塊,我們直接通過硬編碼實現(xiàn):
BlockService.java

/*** 區(qū)塊鏈核心服務(wù)* * @author Jared Jia**/ @Service public class BlockService {@AutowiredBlockCache blockCache;/*** 創(chuàng)建創(chuàng)世區(qū)塊* @return*/public String createGenesisBlock() {Block genesisBlock = new Block();//設(shè)置創(chuàng)世區(qū)塊高度為1genesisBlock.setIndex(1);genesisBlock.setTimestamp(System.currentTimeMillis());genesisBlock.setNonce(1);//封裝業(yè)務(wù)數(shù)據(jù)List<Transaction> tsaList = new ArrayList<Transaction>();Transaction tsa = new Transaction();tsa.setId("1");tsa.setBusinessInfo("這是創(chuàng)世區(qū)塊");tsaList.add(tsa);Transaction tsa2 = new Transaction();tsa2.setId("2");tsa2.setBusinessInfo("區(qū)塊鏈高度為:1");tsaList.add(tsa2); genesisBlock.setTransactions(tsaList);//設(shè)置創(chuàng)世區(qū)塊的hash值genesisBlock.setHash(calculateHash("",tsaList,1));//添加到已打包保存的業(yè)務(wù)數(shù)據(jù)集合中blockCache.getPackedTransactions().addAll(tsaList);//添加到區(qū)塊鏈中blockCache.getBlockChain().add(genesisBlock);return JSON.toJSONString(genesisBlock);}/*** 創(chuàng)建新區(qū)塊* @param nonce* @param previousHash* @param hash* @param blockTxs* @return*/public Block createNewBlock(int nonce, String previousHash, String hash, List<Transaction> blockTxs) {Block block = new Block();block.setIndex(blockCache.getBlockChain().size() + 1);//時間戳block.setTimestamp(System.currentTimeMillis());block.setTransactions(blockTxs);//工作量證明,計算正確hash值的次數(shù)block.setNonce(nonce);//上一區(qū)塊的哈希block.setPreviousHash(previousHash);//當前區(qū)塊的哈希block.setHash(hash);if (addBlock(block)) {return block;}return null;}/*** 添加新區(qū)塊到當前節(jié)點的區(qū)塊鏈中* * @param newBlock*/public boolean addBlock(Block newBlock) {//先對新區(qū)塊的合法性進行校驗if (isValidNewBlock(newBlock, blockCache.getLatestBlock())) {blockCache.getBlockChain().add(newBlock);// 新區(qū)塊的業(yè)務(wù)數(shù)據(jù)需要加入到已打包的業(yè)務(wù)數(shù)據(jù)集合里去blockCache.getPackedTransactions().addAll(newBlock.getTransactions());return true;}return false;}/*** 驗證新區(qū)塊是否有效* * @param newBlock* @param previousBlock* @return*/public boolean isValidNewBlock(Block newBlock, Block previousBlock) {if (!previousBlock.getHash().equals(newBlock.getPreviousHash())) {System.out.println("新區(qū)塊的前一個區(qū)塊hash驗證不通過");return false;} else {// 驗證新區(qū)塊hash值的正確性String hash = calculateHash(newBlock.getPreviousHash(), newBlock.getTransactions(), newBlock.getNonce());if (!hash.equals(newBlock.getHash())) {System.out.println("新區(qū)塊的hash無效: " + hash + " " + newBlock.getHash());return false;}if (!isValidHash(newBlock.getHash())) {return false;}}return true;}}

以上關(guān)鍵代碼實現(xiàn)之后,我們就構(gòu)建了一個非常簡單的區(qū)塊鏈模型,包含一個基本的區(qū)塊模型和一個區(qū)塊鏈模型,并且能夠生成新的區(qū)塊并添加到區(qū)塊鏈中,接下來我們進行測試。

第五步,我們編寫一個Controller類進行調(diào)用:
BlockController.java

@Controller public class BlockController {@ResourceBlockService blockService;@AutowiredBlockCache blockCache;/*** 查看當前節(jié)點區(qū)塊鏈數(shù)據(jù)* @return*/@GetMapping("/scan")@ResponseBodypublic String scanBlock() {return JSON.toJSONString(blockCache.getBlockChain());}/*** 創(chuàng)建創(chuàng)世區(qū)塊* @return*/@GetMapping("/create")@ResponseBodypublic String createFirstBlock() {blockService.createGenesisBlock();return JSON.toJSONString(blockCache.getBlockChain());}}

第六步,系統(tǒng)測試
首先系統(tǒng)啟動后,先查看區(qū)塊鏈中的數(shù)據(jù),可以看到當前系統(tǒng)中的區(qū)塊鏈為空:

然后我們調(diào)用創(chuàng)建創(chuàng)世區(qū)塊的方法,查看返回結(jié)果:

我們把生成的創(chuàng)世區(qū)塊添加到本地區(qū)塊鏈中后,轉(zhuǎn)換成JSON字符串返回,可以看到當前區(qū)塊鏈中存儲的有一個區(qū)塊對象,至此我們已經(jīng)實現(xiàn)了一個簡單的區(qū)塊鏈。實際的區(qū)塊鏈系統(tǒng)模型要復(fù)雜的多,需要根據(jù)不同的業(yè)務(wù)場景擴展相應(yīng)的字段,但是基本特征都是一樣的。

(3)共識機制實現(xiàn)

在上章節(jié)中,我們實現(xiàn)了一個簡單的區(qū)塊鏈結(jié)構(gòu),并且能夠生成并添加新的區(qū)塊,但是問題來了,實際的區(qū)塊鏈系統(tǒng)是一個多節(jié)點、分布式、去中心化的網(wǎng)絡(luò),每個節(jié)點通過網(wǎng)絡(luò)交互,實時同步保存著同樣的整條區(qū)塊鏈數(shù)據(jù),那么我們生成的區(qū)塊,如何才能被其他節(jié)點認可,并同步添加到其他所有節(jié)點上呢,這個時候我們就需要一套規(guī)則,讓所有網(wǎng)絡(luò)節(jié)點的參與者達成能夠達成共識,接納并保存新的區(qū)塊,也就是所謂的“共識機制”。

理論基礎(chǔ)部分已經(jīng)提到了,共識機制有很多種,各有各的優(yōu)勢與缺點,接下來我們就用java代碼來模擬實現(xiàn)我們最為熟知的一種機制:工作量證明(Proof of Work),顧名思義就是對工作量的證明,在基于POW機制構(gòu)建的區(qū)塊鏈網(wǎng)絡(luò)中,節(jié)點通過計算隨機哈希散列的數(shù)值爭奪記賬權(quán),求得正確的數(shù)值并生成區(qū)塊的能力是節(jié)點算力的具體表現(xiàn),計算的過程一般被形象地稱為“挖礦”。

簡單來說就是,區(qū)塊鏈系統(tǒng)設(shè)定一套計算規(guī)則或者說是一套計算題,在新區(qū)塊生成前,各個節(jié)點都投入到這道題的求解計算中,哪個節(jié)點先計算出結(jié)果,并得到其它節(jié)點的驗證和認可,這個節(jié)點就會獲得新區(qū)塊的記賬權(quán),并獲得系統(tǒng)相應(yīng)的獎勵,共識結(jié)束。

典型的PoW共識機制應(yīng)用就是BTC網(wǎng)絡(luò),在BTC網(wǎng)絡(luò)中,共識計算的目標是找到滿足某個特定要求的區(qū)塊Hash(哈希值)。這個區(qū)塊哈希值就是工作結(jié)果的一個證明,計算工作的目的就是為了尋找到這個證明值,上一章節(jié)中,測試時我們已經(jīng)見過這個Hash值:

[{"hash": "25931395e736653212f0258824df4222ae739ec2d5897310258b0857d4d3870c","index": 1,"nonce": 1,"timestamp": 1580970554734,"transactions": [{"businessInfo": "這是創(chuàng)世區(qū)塊","id": "1"}]} ]

BTC網(wǎng)絡(luò)PoW使用的Hashcash算法,大致邏輯如下:

  • 獲取某種公開可知的數(shù)據(jù)data(BTC網(wǎng)絡(luò)中,指的是區(qū)塊頭);

  • 添加一個計數(shù)器nonce,初始值設(shè)置為0;

  • 計算data與nonce拼接字符串的哈希值;

  • 檢查上一步的哈希值是否滿足某個條件,滿足則停止計算,不滿足則nonce加1,然后重復(fù)第3步和第4步,直到滿足這個特定的條件為止。

  • 接下來我們用Java代碼實現(xiàn)這個算法,設(shè)定滿足的特定條件為,Hash值前4位都是0,則計算成功(實際區(qū)塊鏈網(wǎng)絡(luò)中的特定條件要求更高,對計算的運算能力要求也高,并且系統(tǒng)隨著計算難度動態(tài)調(diào)整滿足的特定條件,來保證區(qū)塊生成的速度)。

    第一步,我們新建一個共識機制服務(wù)類,添加一個“挖礦”方法,計算成功后,獲取記賬權(quán),調(diào)用添加區(qū)塊的方法,把區(qū)塊添加到區(qū)塊鏈中:
    PowService.java

    /*** 共識機制* 采用POW即工作量證明實現(xiàn)共識* @author Administrator**/ @Service public class PowService {@AutowiredBlockCache blockCache;@AutowiredBlockService blockService;/*** 通過“挖礦”進行工作量證明,實現(xiàn)節(jié)點間的共識* * @return*/public Block mine(){// 封裝業(yè)務(wù)數(shù)據(jù)集合,記錄區(qū)塊產(chǎn)生的節(jié)點信息,臨時硬編碼實現(xiàn)List<Transaction> tsaList = new ArrayList<Transaction>();Transaction tsa1 = new Transaction();tsa1.setId("1");tsa1.setBusinessInfo("這是IP為:"+CommonUtil.getLocalIp()+",端口號為:"+blockCache.getP2pport()+"的節(jié)點挖礦生成的區(qū)塊");tsaList.add(tsa1);Transaction tsa2 = new Transaction();tsa2.setId("2");tsa2.setBusinessInfo("區(qū)塊鏈高度為:"+(blockCache.getLatestBlock().getIndex()+1));tsaList.add(tsa2);// 定義每次哈希函數(shù)的結(jié)果 String newBlockHash = "";int nonce = 0;long start = System.currentTimeMillis();System.out.println("開始挖礦");while (true) {// 計算新區(qū)塊hash值newBlockHash = blockService.calculateHash(blockCache.getLatestBlock().getHash(), tsaList, nonce);// 校驗hash值if (blockService.isValidHash(newBlockHash)) {System.out.println("挖礦完成,正確的hash值:" + newBlockHash);System.out.println("挖礦耗費時間:" + (System.currentTimeMillis() - start) + "ms");break;}System.out.println("第"+(nonce+1)+"次嘗試計算的hash值:" + newBlockHash);nonce++;}// 創(chuàng)建新的區(qū)塊Block block = blockService.createNewBlock(nonce, blockCache.getLatestBlock().getHash(), newBlockHash, tsaList);return block;}/*** 驗證hash值是否滿足系統(tǒng)條件* 暫定前4位是0則滿足條件* @param hash* @return*/public boolean isValidHash(String hash) {//System.out.println("難度系數(shù):"+blockCache.getDifficulty());return hash.startsWith("0000");} }

    第二步,編寫測試共識機制服務(wù)的Controller類方法:
    BlockController.java

    /*** 工作量證明PoW* 挖礦生成新的區(qū)塊 */@GetMapping("/mine")@ResponseBodypublic String createNewBlock() {powService.mine();return JSON.toJSONString(blockCache.getBlockChain());}

    第三步,啟動系統(tǒng),進行測試。
    首先執(zhí)行http://localhost:8080/create方法,生成創(chuàng)世區(qū)塊。
    其次調(diào)用http://localhost:8080/mine方法進行工作量計算證明,生成新的區(qū)塊,并添加到本地區(qū)塊鏈中:

    我們來看一下,系統(tǒng)后臺計算的過程,此次計算共花費1048ms計算出滿足條件的Hash值,共計算4850次:

    至此,我們實現(xiàn)了一個簡單的工作量證明機制,并在當前區(qū)塊鏈系統(tǒng)節(jié)點上運行,完成了正確結(jié)果的計算,生成了一個新的區(qū)塊。

    接下來我們將會開發(fā)一個P2P網(wǎng)絡(luò),實現(xiàn)多個節(jié)點的同時運行,當一個節(jié)點挖礦完成后,通過P2P網(wǎng)絡(luò)廣播給其他節(jié)點,其他節(jié)點驗證通過后,會把新產(chǎn)生的區(qū)塊添加到自己的區(qū)塊鏈上,進而保證整個區(qū)塊鏈網(wǎng)絡(luò)所有節(jié)點的數(shù)據(jù)一致性。

    (4)P2P網(wǎng)絡(luò)開發(fā)

    前面我們已經(jīng)實現(xiàn)了一個基本的區(qū)塊鏈系統(tǒng),并且實現(xiàn)了PoW工作量證明共識機制,通過挖礦計算出正確的結(jié)果同時生成一個新的區(qū)塊添加到區(qū)塊鏈中,但是這些都是基于單節(jié)點的運行,實際的區(qū)塊鏈是有多個節(jié)點同時運行的分布式網(wǎng)絡(luò)系統(tǒng),所有節(jié)點同時計算搶奪記賬權(quán),共同維護一條完整的區(qū)塊鏈。

    接下來我們基于Java的WebSocket實現(xiàn)一個Peer-to-Peer網(wǎng)絡(luò),實現(xiàn)多個節(jié)點間的相互通信,通過本章節(jié),我們將要實現(xiàn)以下功能:

    - 創(chuàng)建一個基于java的p2p網(wǎng)絡(luò)- 運行多個節(jié)點,且多個節(jié)點通過p2p網(wǎng)絡(luò)自動同步區(qū)塊信息- 一個節(jié)點挖礦生成新的區(qū)塊后,自動廣播給其他所有節(jié)點- 每個節(jié)點在接收到其他節(jié)點發(fā)送的區(qū)塊內(nèi)容后,進行驗證,驗證通過添加到本地區(qū)塊鏈上-?在自我節(jié)點查看整個區(qū)塊鏈內(nèi)容

    開發(fā)測試本章節(jié)的功能,我們最好準備兩臺電腦或者虛擬機,再或者Docker集群環(huán)境也可以,便于多節(jié)點的運行測試。如果只有一臺電腦也可以,各個節(jié)點運行的端口號設(shè)置為不相同即可。

    第一步,開發(fā)思路整理
    目前我們已經(jīng)實現(xiàn)了單節(jié)點的區(qū)塊生成,那么我們接下來只需要實現(xiàn)各個節(jié)點的消息同步即可。

    • 首先,通過java代碼實現(xiàn)p2p網(wǎng)絡(luò)的server端和client端,每個節(jié)點既是服務(wù)端也是客戶端。

    • 然后,一個節(jié)點啟動時,會尋找區(qū)塊鏈網(wǎng)絡(luò)上的有效節(jié)點,并建立socket連接(BTC網(wǎng)絡(luò)可以通過使用“DNS”種子方式獲取BTC有效節(jié)點,DNS種子提供比特幣節(jié)點的IP地址列表),我們直接把節(jié)點列表配置到application.yml文件中。

    • 接著,從連接上的節(jié)點獲取最新的區(qū)塊信息,如果當前節(jié)點首次運行,則獲取整個區(qū)塊鏈信息,并替換到本地。

    • 之后,各個節(jié)點同時挖礦計算,哪個節(jié)點先計算完成,就把生成的新區(qū)塊全網(wǎng)廣播給其他所有節(jié)點(實際的區(qū)塊鏈網(wǎng)絡(luò)一直在計算,我們?yōu)榱吮阌跍y試,手動觸發(fā)一個節(jié)點挖礦產(chǎn)生區(qū)塊,然后全網(wǎng)廣播給其他所有節(jié)點)。

    • 最后,當一個節(jié)點收到廣播內(nèi)容后,對接收到的新區(qū)塊進行驗證,驗證通過后添加到本地區(qū)塊鏈上,驗證的首要條件是新區(qū)塊的高度必須比本地的區(qū)塊鏈高度要高。

    第二步,先實現(xiàn)P2P網(wǎng)絡(luò)server端
    新建一個P2PServer類,并添加一個初始化server端的方法:
    P2PServer.java

    /*** p2p服務(wù)端* * @author Jared Jia**/ @Component public class P2PServer {@AutowiredP2PService p2pService;public void initP2PServer(int port) {WebSocketServer socketServer = new WebSocketServer(new InetSocketAddress(port)) {/*** 連接建立后觸發(fā)*/@Overridepublic void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {p2pService.getSockets().add(webSocket);}/*** 連接關(guān)閉后觸發(fā)*/@Overridepublic void onClose(WebSocket webSocket, int i, String s, boolean b) {p2pService.getSockets().remove(webSocket);System.out.println("connection closed to address:" + webSocket.getRemoteSocketAddress());}/*** 接收到客戶端消息時觸發(fā)*/@Overridepublic void onMessage(WebSocket webSocket, String msg) {//作為服務(wù)端,業(yè)務(wù)邏輯處理p2pService.handleMessage(webSocket, msg, p2pService.getSockets());}/*** 發(fā)生錯誤時觸發(fā)*/@Overridepublic void onError(WebSocket webSocket, Exception e) {p2pService.getSockets().remove(webSocket);System.out.println("connection failed to address:" + webSocket.getRemoteSocketAddress());}@Overridepublic void onStart() {}};socketServer.start();System.out.println("listening websocket p2p port on: " + port);} }

    第三步,實現(xiàn)P2P網(wǎng)絡(luò)client端
    P2PClient.java

    /*** p2p客戶端* * @author Jared Jia**/ @Component public class P2PClient {@AutowiredP2PService p2pService;public void connectToPeer(String addr) {try {final WebSocketClient socketClient = new WebSocketClient(new URI(addr)) {@Overridepublic void onOpen(ServerHandshake serverHandshake) {//客戶端發(fā)送請求,查詢最新區(qū)塊p2pService.write(this, p2pService.queryLatestBlockMsg());p2pService.getSockets().add(this);}/*** 接收到消息時觸發(fā)* @param msg*/@Overridepublic void onMessage(String msg) {p2pService.handleMessage(this, msg, p2pService.getSockets());}@Overridepublic void onClose(int i, String msg, boolean b) {p2pService.getSockets().remove(this);System.out.println("connection closed");}@Overridepublic void onError(Exception e) {p2pService.getSockets().remove(this);System.out.println("connection failed");}};socketClient.connect();} catch (URISyntaxException e) {System.out.println("p2p connect is error:" + e.getMessage());}} }

    第四步,定義P2P網(wǎng)絡(luò)同步的消息模型
    同步的消息模型,我們定義為四類,分別是:
    BlockConstant.java

    // 查詢最新的區(qū)塊public final static int QUERY_LATEST_BLOCK = 1;// 返回最新的區(qū)塊public final static int RESPONSE_LATEST_BLOCK = 2;// 查詢整個區(qū)塊鏈public final static int QUERY_BLOCKCHAIN = 3;// 返回整個區(qū)塊鏈public?final?static?int?RESPONSE_BLOCKCHAIN?=?4;

    定義一個各個節(jié)點間傳遞的消息模型:
    Message.java

    /*** p2p通訊消息** @author Jared Jia* */ public class Message implements Serializable {private static final long serialVersionUID = 1L;/*** 消息類型*/private int type;/*** 消息內(nèi)容*/private String data;/****set get方法省略****/}

    第五步,實現(xiàn)向其他節(jié)點廣播的方法

    新建一個p2p網(wǎng)絡(luò)服務(wù)類,向外發(fā)送消息,或者處理當前節(jié)點收到其他節(jié)點發(fā)送的請求。
    P2PService.java

    /*** 全網(wǎng)廣播消息* @param message*/public void broatcast(String message) {List<WebSocket> socketsList = this.getSockets();if (CollectionUtils.isEmpty(socketsList)) {return;}System.out.println("======全網(wǎng)廣播消息開始:");for (WebSocket socket : socketsList) {this.write(socket, message);}System.out.println("======全網(wǎng)廣播消息結(jié)束");}

    第六步,開發(fā)消息處理路由

    第五步中已經(jīng)實現(xiàn)了向外發(fā)送消息,本步驟實現(xiàn)接收消息。
    首先設(shè)計一個服務(wù)端和客戶端共用的消息路由,來分發(fā)消息給對應(yīng)的處理單元。
    P2PService.java

    /*** 客戶端和服務(wù)端共用的消息處理方法* @param webSocket* @param msg* @param sockets*/public void handleMessage(WebSocket webSocket, String msg, List<WebSocket> sockets) {try {Message message = JSON.parseObject(msg, Message.class);System.out.println("接收到IP地址為:" +webSocket.getRemoteSocketAddress().getAddress().toString()+",端口號為:"+ webSocket.getRemoteSocketAddress().getPort() + "的p2p消息:"+ JSON.toJSONString(message));switch (message.getType()) {//客戶端請求查詢最新的區(qū)塊:1case BlockConstant.QUERY_LATEST_BLOCK:write(webSocket, responseLatestBlockMsg());//服務(wù)端調(diào)用方法返回最新區(qū)塊:2break;//接收到服務(wù)端返回的最新區(qū)塊:2case BlockConstant.RESPONSE_LATEST_BLOCK:handleBlockResponse(message.getData(), sockets);break;//客戶端請求查詢整個區(qū)塊鏈:3case BlockConstant.QUERY_BLOCKCHAIN:write(webSocket, responseBlockChainMsg());//服務(wù)端調(diào)用方法返回最新區(qū)塊:4break;//直接接收到其他節(jié)點發(fā)送的整條區(qū)塊鏈信息:4case BlockConstant.RESPONSE_BLOCKCHAIN:handleBlockChainResponse(message.getData(), sockets);break;}} catch (Exception e) {System.out.println("處理IP地址為:" +webSocket.getRemoteSocketAddress().getAddress().toString()+",端口號為:"+ webSocket.getRemoteSocketAddress().getPort() + "的p2p消息錯誤:" + e.getMessage());}}

    第七步,開發(fā)消息處理單元

    有了消息路由之后,接著編寫不同的處理單元,處理其他節(jié)點發(fā)送來的區(qū)塊或者區(qū)塊鏈信息,總體原則是:先校驗其他節(jié)點發(fā)送來的區(qū)塊或者區(qū)塊鏈的有效性,然后判斷它們的高度比當前節(jié)點的區(qū)塊鏈高度要高,如果高則替換本地的區(qū)塊鏈,或者把新區(qū)塊添加到本地區(qū)塊鏈上。
    P2PService.java

    /*** 處理其它節(jié)點發(fā)送過來的區(qū)塊信息* @param blockData* @param sockets*/public synchronized void handleBlockResponse(String blockData, List<WebSocket> sockets) {//反序列化得到其它節(jié)點的最新區(qū)塊信息Block latestBlockReceived = JSON.parseObject(blockData, Block.class);//當前節(jié)點的最新區(qū)塊Block latestBlock = blockCache.getLatestBlock();if (latestBlockReceived != null) {if(latestBlock != null) {//如果接收到的區(qū)塊高度比本地區(qū)塊高度大的多if(latestBlockReceived.getIndex() > latestBlock.getIndex() + 1) {broatcast(queryBlockChainMsg());System.out.println("重新查詢所有節(jié)點上的整條區(qū)塊鏈");}else if (latestBlockReceived.getIndex() > latestBlock.getIndex() && latestBlock.getHash().equals(latestBlockReceived.getPreviousHash())) {if (blockService.addBlock(latestBlockReceived)) {broatcast(responseLatestBlockMsg());}System.out.println("將新接收到的區(qū)塊加入到本地的區(qū)塊鏈");}}else if(latestBlock == null) {broatcast(queryBlockChainMsg());System.out.println("重新查詢所有節(jié)點上的整條區(qū)塊鏈");}}}/*** 處理其它節(jié)點發(fā)送過來的區(qū)塊鏈信息* @param blockData* @param sockets*/public synchronized void handleBlockChainResponse(String blockData, List<WebSocket> sockets) {//反序列化得到其它節(jié)點的整條區(qū)塊鏈信息List<Block> receiveBlockchain = JSON.parseArray(blockData, Block.class);if(!CollectionUtils.isEmpty(receiveBlockchain) && blockService.isValidChain(receiveBlockchain)) {//根據(jù)區(qū)塊索引先對區(qū)塊進行排序Collections.sort(receiveBlockchain, new Comparator<Block>() {public int compare(Block block1, Block block2) {return block1.getIndex() - block2.getIndex();}});//其它節(jié)點的最新區(qū)塊Block latestBlockReceived = receiveBlockchain.get(receiveBlockchain.size() - 1);//當前節(jié)點的最新區(qū)塊Block latestBlock = blockCache.getLatestBlock();if(latestBlock == null) {//替換本地的區(qū)塊鏈blockService.replaceChain(receiveBlockchain);}else {//其它節(jié)點區(qū)塊鏈如果比當前節(jié)點的長,則處理當前節(jié)點的區(qū)塊鏈if (latestBlockReceived.getIndex() > latestBlock.getIndex()) {if (latestBlock.getHash().equals(latestBlockReceived.getPreviousHash())) {if (blockService.addBlock(latestBlockReceived)) {broatcast(responseLatestBlockMsg());}System.out.println("將新接收到的區(qū)塊加入到本地的區(qū)塊鏈");} else {// 用長鏈替換本地的短鏈blockService.replaceChain(receiveBlockchain);}}}}}

    3、完整系統(tǒng)運行與測試

    第一步,打包生成測試用的可執(zhí)行jar包
    準備兩臺機器(虛擬機或者Docker集群都行),同時運行兩個節(jié)點,節(jié)點信息如下:

    通過mvn package -Dmaven.test.skip=true命令對工程進行打包,生成可直接運行的jar包,打包前對工程進行配置,配置信息如下圖:

    節(jié)點Node1打包:

    節(jié)點Node2打包:

    分別打包之后,生成兩個節(jié)點的可執(zhí)行jar包,如下:

    把兩個jar包分別放在對應(yīng)IP的windows機器上,打開命令行模式,進入jar所在文件夾,分別執(zhí)行以下命令運行兩個節(jié)點:
    java -jar dce-blockchain-node1.jar
    java -jar dce-blockchain-node2.jar

    啟動節(jié)點2的時候,可以看到后臺日志,已經(jīng)連接上節(jié)點1,如下圖所示:

    第二步,對兩個節(jié)點進行測試

    首先,兩個節(jié)點啟動后,用postman分別執(zhí)行http://192.168.0.104:8080/scan和http://192.168.0.112:8090/scan請求,可以看到兩個節(jié)點的區(qū)塊鏈內(nèi)容都為空。

    然后,在節(jié)點1上分別執(zhí)行http://192.168.0.104:8080/create和http://192.168.0.104:8080/mine請求,來生成創(chuàng)世區(qū)塊,以及通過挖礦產(chǎn)生第二個區(qū)塊,執(zhí)行后查看節(jié)點1的區(qū)塊鏈信息如下:
    執(zhí)行http://192.168.0.104:8080/scan結(jié)果:

    [{"hash": "5303d2990c139992bdb5a22aa1dac4f2719755304e45bac03ca4a1f1688c909e","index": 1,"nonce": 1,"timestamp": 1581064647736,"transactions": [{"businessInfo": "這是創(chuàng)世區(qū)塊","id": "1"},{"businessInfo": "區(qū)塊鏈高度為:1","id": "2"}]},{"hash": "0000de5eea0c20c2e7d06220bc023886e88dd8784eaa2fd2d1d6c5e581061d85","index": 2,"nonce": 4850,"previousHash": "5303d2990c139992bdb5a22aa1dac4f2719755304e45bac03ca4a1f1688c909e","timestamp": 1581064655139,"transactions": [{"businessInfo": "這是IP為:192.168.0.104,端口號為:7001的節(jié)點挖礦生成的區(qū)塊","id": "1"},{"businessInfo": "區(qū)塊鏈高度為:2","id": "2"}]} ]

    最后,我們來驗證節(jié)點2是否已經(jīng)完成了節(jié)點1生成的區(qū)塊鏈信息的網(wǎng)絡(luò)同步,Postman執(zhí)行http://192.168.0.112:8090/scan請求,查看返回結(jié)果:
    ?從結(jié)果可以看到,區(qū)塊鏈網(wǎng)絡(luò)節(jié)點2已經(jīng)接收到節(jié)點1發(fā)送的區(qū)塊鏈信息,系統(tǒng)日志如下:

    反過來,我們在節(jié)點2上再執(zhí)行一次挖礦操作,可以看到節(jié)點1上,已經(jīng)接收到節(jié)點2挖礦新產(chǎn)生的區(qū)塊信息,并添加到節(jié)點1的區(qū)塊鏈上:

    至此,我們已經(jīng)實現(xiàn)了一個完整的小型區(qū)塊鏈網(wǎng)絡(luò),并實現(xiàn)各個節(jié)點間的通信,多個節(jié)點共同維護同一個區(qū)塊鏈信息。

    結(jié)語:
    區(qū)塊鏈系統(tǒng)非常龐大,涉及方方面面的技術(shù),本人所演示的代碼主要對區(qū)塊鏈基礎(chǔ)的一些概念進行了詮釋,感興趣的同學(xué),還可以在此基礎(chǔ)上繼續(xù)開發(fā),來實現(xiàn)例如持久層、消息的加密解密、系統(tǒng)賬戶模型、預(yù)言機、側(cè)鏈技術(shù)以及智能合約等區(qū)塊鏈系統(tǒng)功能。


    寫給每個區(qū)塊鏈技術(shù)人員:
    目前市面上流行的企業(yè)級區(qū)塊鏈框架,例如超級賬本Fabric都是國外人員在主導(dǎo),而我們國內(nèi)除了幾家大廠外,其他很多區(qū)塊鏈公司基本都是把人家的東西拿過來進行二次封裝,然后對外聲稱自己公司已經(jīng)掌握了區(qū)塊鏈核心技術(shù),并對企業(yè)提供服務(wù),這是一種不好的現(xiàn)象。大家可以想想我們現(xiàn)在用的開發(fā)語言、框架有幾個真正是國產(chǎn)的,我們再聯(lián)想一下前段時間中興、華為被人家核心技術(shù)卡脖子事件,就知道我們要做的事情有很多,我們需要去除浮躁,靜下心來好好研究底層核心技術(shù),這樣才能實現(xiàn)真正的“彎道超車”!

    三、源代碼

    本文完整源代碼地址:掃碼回復(fù)“開源004“獲取

    PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。

    推薦閱讀:

    華為15年招聘經(jīng)驗總結(jié):可用之才,必備5個特質(zhì)

    最全C資料,不會C語言,別說懂架構(gòu)!

    GO語言版《算法進階指南》火了,完整版PDF下載!

    后端,你再不懂vue就out了

    如何成為一個騷氣的架構(gòu)師,看這一篇就夠了

    億級(無限級)并發(fā),沒那么難

    世界的真實格局分析,地球人類社會底層運行原理

    不是你需要中臺,而是一名合格的架構(gòu)師(附各大廠中臺建設(shè)PPT)

    總結(jié)

    以上是生活随笔為你收集整理的基于Java开发一套完整的区块链系统(附源码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日本精品一区二区三区在线播放视频 | 五月情婷婷 | a黄色| 国产精品自产拍在线观看中文 | 99视频在线免费看 | 午夜av在线 | 国产免费高清视频 | 99热国产精品 | 狠狠色狠狠色综合日日92 | 最近中文字幕高清字幕在线视频 | 天天干天天做 | 国产久草在线 | 黄色的视频网站 | 欧美美女激情18p | 五月天婷婷在线视频 | 国产精品视频免费观看 | 成人免费影院 | 午夜精品导航 | 国产日韩精品一区二区在线观看播放 | 开心色插| 在线一区二区三区 | 少妇av片 | 91中文字幕在线播放 | 91在线公开视频 | 国内三级在线观看 | 中字幕视频在线永久在线观看免费 | 超碰97在线资源站 | 成人免费看片98欧美 | 五月天激情综合 | 色婷婷www| 欧美一级网站 | 天堂av免费看 | 亚洲免费在线看 | 日韩免费一区二区在线观看 | 国产在线看一区 | 91麻豆免费看 | 午夜av一区二区三区 | 人人爽人人 | 狠狠激情中文字幕 | 精品久久久久国产免费第一页 | 午夜av影院| 国产三级视频在线 | 9ⅰ精品久久久久久久久中文字幕 | 香蕉视频网站在线观看 | 天天干人人干 | 婷婷久久五月 | 国产成人av电影 | 日韩91av | 天天曰 | 中文字幕在线国产 | 综合五月 | 日韩18p| 国产精品一级在线 | 久久免费视频在线观看30 | 日韩毛片一区 | 国产主播大尺度精品福利免费 | 大片网站久久 | 色视频在线观看 | 国产在线播放一区二区 | 麻豆视频免费在线 | 毛片视频电影 | 亚洲国产精品视频在线观看 | 在线电影日韩 | 91av综合| 中文在线中文资源 | 久久成人国产精品 | 玖玖在线播放 | 天天干干 | 国产午夜免费视频 | 国产美女主播精品一区二区三区 | 亚洲视频久久 | 四虎成人精品永久免费av | 久草精品在线 | 欧美日韩久久久 | 麻豆国产露脸在线观看 | 久久久三级视频 | 98精品国产自产在线观看 | 精品嫩模福利一区二区蜜臀 | www.日日日.com| 婷婷日 | 中文字幕精品三区 | www黄色com | 国产精品黄色影片导航在线观看 | 久久综合精品国产一区二区三区 | 国产最新在线观看 | 最近最新中文字幕视频 | 日韩理论影院 | 日韩动漫免费观看高清完整版在线观看 | 丁香六月av | 国产精品一区二区三区99 | 91av视频| 91精品免费在线 | 一区二区不卡视频在线观看 | 亚洲区色| 99精品乱码国产在线观看 | 天天爱天天色 | 在线一级片| 国产亚洲视频在线 | 国产精品99久久久久久久久久久久 | 久久人人爽av | 日韩资源在线观看 | 国产中文欧美日韩在线 | 午夜精品久久久久久久99无限制 | 特级aaa毛片 | 国产色婷婷| 久久久久久久久久久免费视频 | 4438全国亚洲精品在线观看视频 | 免费看黄20分钟 | 欧美日韩精品国产 | 久久久午夜精品福利内容 | 精品欧美一区二区在线观看 | 96久久久| 麻豆视频国产精品 | 四虎永久网站 | 狠狠狠色丁香综合久久天下网 | 91成人破解版 | 在线电影a | 91视频在线自拍 | 日韩手机在线观看 | 欧美一区二区三区在线看 | 成人国产网站 | 国产一区二区在线免费播放 | 日韩特黄av | 国产成人精品一区二区在线观看 | 精品在线亚洲视频 | 免费网站在线观看人 | 亚洲禁18久人片 | 亚洲视频 中文字幕 | 17婷婷久久www| 五月天中文字幕mv在线 | 午夜999| 国产资源av| 亚洲1区 在线 | 五月婷婷婷婷婷 | 久久久精品福利视频 | 在线观看网站av | 久久影院亚洲 | 日韩成人免费观看 | 亚洲最新精品 | bbbbb女女女女女bbbbb国产 | 精品久久视频 | 亚洲国产字幕 | 天天色播 | 国产美女免费看 | 午夜视频免费 | 天天插天天干天天操 | 午夜手机电影 | 成人影片免费 | 九九亚洲视频 | 国产精品永久 | 日韩av资源在线观看 | 亚洲 欧美 91 | 久久99久久精品国产 | 天天干.com | 麻豆免费精品视频 | 丁香网五月天 | 在线视频日韩欧美 | av在线免费观看不卡 | 992tv在线观看网站 | 色婷久久 | 久久露脸国产精品 | 91正在播放 | 精品成人国产 | 亚洲永久av | av在线免费在线观看 | 美女免费av | 国产黑丝一区二区三区 | 久久精品99久久久久久2456 | 91传媒激情理伦片 | 国产日韩欧美在线观看 | www.com久久久 | 81精品国产乱码久久久久久 | 亚洲精品在线观看av | 99久久精品日本一区二区免费 | 狠狠色丁香 | 国产精美视频 | 超碰国产在线播放 | av先锋中文字幕 | 亚洲国产精品成人综合 | 国产你懂的在线 | 日韩a级免费视频 | 国产成人在线精品 | 91丨九色丨国产女 | 国产黄在线看 | 国产在线国偷精品产拍免费yy | 国产一级片免费视频 | 国产精品av免费在线观看 | 婷婷丁香花五月天 | 欧美午夜a | 五月天婷婷丁香花 | 午夜免费久久看 | 欧美日韩一二三四区 | 二区三区在线视频 | 伊人五月天 | 日本中文字幕网 | 久久久久国产一区二区三区 | 超碰97免费 | 国产精品久久久久久久久久直播 | 欧美日韩中文在线视频 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 伊人干综合 | 99999精品| 99久久99视频只有精品 | 久久一区精品 | 就要色综合 | adc在线观看 | 久久的色 | 成人综合婷婷国产精品久久免费 | 天天操天天射天天爱 | 三级av黄色| 久久国产精品一区二区 | 国产123区在线观看 国产精品麻豆91 | 91久草视频 | 久久夜色精品国产欧美乱 | 国产精品九九久久99视频 | 国产综合福利在线 | 又紧又大又爽精品一区二区 | 中文字幕av日韩 | 91自拍视频在线 | 黄色三级在线 | 免费黄在线看 | 久草成人在线 | 99精品国自产在线 | 又黄又爽又色无遮挡免费 | 国产成人精品亚洲 | 日日操天天射 | 日韩三级视频在线观看 | 国产精品一区二区在线观看 | 精品在线观看一区二区 | 亚洲精欧美一区二区精品 | 国产精品欧美一区二区三区不卡 | 国产原创av片| 天天天在线综合网 | 99视屏| 日本精品久久 | 国产精品精品久久久久久 | 深爱婷婷激情 | 国产一级一片免费播放放 | 96视频在线 | 91秒拍国产福利一区 | 日韩av资源在线观看 | 91中文字幕视频 | 久久精品国产成人 | 国产成人资源 | 91精品国自产拍天天拍 | 免费看成年人 | 激情xxxx| 男女啪啪免费网站 | 一区二区三区免费在线观看视频 | 91精品国产欧美一区二区 | 狠狠狠干| 久草手机视频 | 五月天电影免费在线观看一区 | 丁香在线观看完整电影视频 | 国产超碰在线 | 成人一区在线观看 | 欧美久久久久久久久久久久久 | 日韩在线播放视频 | 国产亚洲一级高清 | 久久99在线视频 | 精品99在线视频 | 国产精品99久久久久的智能播放 | 亚洲精品毛片一级91精品 | 日日夜夜精品免费 | 亚洲va男人天堂 | 毛片美女网站 | 91看片淫黄大片一级在线观看 | 超碰97人人干 | 精品欧美一区二区在线观看 | av韩国在线 | 国产女教师精品久久av | 91中文在线| 97超碰人人澡| 国产一区电影在线观看 | 黄在线免费观看 | 97香蕉超级碰碰久久免费软件 | 久久香蕉国产精品麻豆粉嫩av | 97超碰影视 | 中文字幕一区二区三区在线视频 | 国产在线播放一区二区三区 | 久久综合加勒比 | 久久1区 | 午夜影院先 | 午夜精品99久久免费 | 最新国产精品拍自在线播放 | 日产乱码一二三区别在线 | 国产日韩欧美在线播放 | 日本xxxx.com | 婷婷国产一区二区三区 | 欧美日韩亚洲一 | 成人在线观看免费 | 一区二区三区四区免费视频 | 国产精品18久久久久久久 | 日韩xxxbbb| 成人h电影在线观看 | 国产精品12 | 久久激情视频 久久 | 午夜视频在线观看欧美 | 中文av在线免费观看 | 91成年人在线观看 | 九色福利视频 | 国产精品久久久久永久免费 | 中文字幕在线一区二区三区 | 国产高清综合 | 国产精品一区二区在线观看 | 99精彩视频在线观看免费 | www.五月天婷婷.com | 91精品国产91热久久久做人人 | 69中文字幕 | 69久久99精品久久久久婷婷 | 91精品在线观看入口 | 超碰在线98 | 亚洲国产精品成人精品 | 国产 一区二区三区 在线 | 国产精品人人做人人爽人人添 | 天天干天天干天天干 | 国产美女视频免费观看的网站 | 91高清免费观看 | 国产视频18 | 在线影视 一区 二区 三区 | 99re6热在线精品视频 | 精品在线观看一区二区 | 成人午夜电影在线播放 | 6080yy精品一区二区三区 | 五月婷婷综合在线视频 | 久久国产精品系列 | 狠狠色综合欧美激情 | 日本高清中文字幕有码在线 | 中文字幕日韩在线播放 | 天堂在线视频免费观看 | 国产黄大片在线观看 | 欧美91精品久久久久国产性生爱 | 黄色大全在线观看 | 国产精品一区二区久久精品爱涩 | 成人网在线免费视频 | 国产精品美女久久久久久久久 | 俺要去色综合狠狠 | 久久视频 | 欧美一区二区三区激情视频 | 丁香婷婷在线观看 | 日韩av区 | 国产精品免费在线播放 | 欧美精品久久久久久久 | 国产在线精品一区 | 久久激情视频网 | 婷婷中文字幕综合 | 中国一级片免费看 | 夜色资源网| 久久午夜精品视频 | 成人av在线看 | 在线观看视频日韩 | 久草在线视频免赞 | 久久av不卡| 国产精品女人网站 | 国产专区在线看 | 久久综合精品国产一区二区三区 | 免费一级特黄录像 | 91av成人 | 日韩二区在线观看 | 欧美日韩网站 | 免费观看一区二区 | 日日夜夜人人精品 | 午夜国产一区二区 | 欧美在线观看视频一区二区 | 91看片淫黄大片在线播放 | 永久免费在线 | 国内精品久久久久影院优 | 日韩综合精品 | 欧美国产大片 | 国产精品免费看久久久8精臀av | 国产原创在线视频 | 免费在线播放黄色 | 在线观看国产福利片 | 久草在线中文888 | 久久五月网 | 欧美日韩国产一区二区三区 | 在线观看av网 | av高清一区二区三区 | 日韩欧美国产精品 | 国产一区二区三区免费视频 | 99视频| 日韩黄色中文字幕 | 国产精品自产拍在线观看网站 | 国产精品高清在线观看 | 欧美日韩在线观看一区二区 | 在线观看成人一级片 | 欧美另类激情 | 波多野结衣久久资源 | 在线观看黄色国产 | 亚洲综合色播 | 久久久久福利视频 | 久久免费视频4 | 午夜黄色| 日韩系列 | 日韩av看片| 黄网av在线 | 中文字幕精 | 在线观看一 | 亚洲三级国产 | 91福利专区 | 欧美极品xxxxx| 一区二区三区日韩视频在线观看 | 成人欧美一区二区三区黑人麻豆 | 91桃花视频 | 丰满少妇在线观看网站 | 久久午夜电影网 | 国产色婷婷精品综合在线手机播放 | 日韩激情第一页 | 涩涩伊人 | 亚洲 欧洲 国产 精品 | 天天躁天天操 | 国产黄色精品视频 | 久久av网 | 中文字幕亚洲综合久久五月天色无吗'' | 免费看一级特黄a大片 | 久久不卡电影 | 亚洲精品美女久久17c | 日韩免费在线视频 | 婷婷深爱网| 久久精品超碰 | 久久综合一本 | 欧美一区二区三区在线观看 | 91精品国产一区二区三区 | 国产一区免费在线观看 | 久久福利小视频 | 高清视频一区 | 一级成人免费 | 久久国产精品免费一区 | 欧美性生交大片免网 | 久久久精品欧美一区二区免费 | 日韩免费在线网站 | 成人亚洲免费 | 九九久久成人 | 日韩视频在线观看视频 | 国产在线看一区 | 亚洲一区精品二人人爽久久 | 国产在线观看 | 91亚洲精品国偷拍自产在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 亚洲国产网站 | 国产精品久久久久一区二区 | 欧美日韩高清在线观看 | 91最新视频在线观看 | 久久99久久久久久 | 99久久精品免费看国产麻豆 | 精品美女久久 | 精品欧美乱码久久久久久 | 99国产在线观看 | 国产打女人屁股调教97 | 久久婷婷精品视频 | 美女黄久久 | 日本视频网 | 日韩午夜小视频 | 大荫蒂欧美视频另类xxxx | av在线网站大全 | 亚洲 欧美日韩 国产 中文 | 欧美日韩一区二区三区视频 | 国产精品免费视频网站 | 日日操天天操夜夜操 | 在线看欧美| 蜜桃麻豆www久久囤产精品 | 国产欧美精品一区二区三区四区 | 久久免费视频网 | 国产视频久久 | 久久久久成人免费 | 久久爽久久爽久久av东京爽 | 97色在线观看 | 美女网站色在线观看 | 国产精品午夜免费福利视频 | av午夜电影 | 日日干干| 色吊丝在线永久观看最新版本 | av三级av | 日本中文字幕在线观看 | 日韩一级精品 | 亚洲永久精品一区 | 欧美久久99 | 色偷偷88888欧美精品久久 | 天天操天天射天天 | 香蕉91视频 | 成人免费网站视频 | 精品高清视频 | 蜜臀av免费一区二区三区 | 夜夜视频 | 日本久久免费电影 | 婷婷激情5月天 | 99久e精品热线免费 99国产精品久久久久久久久久 | 成人午夜影视 | 久久99热久久99精品 | 精品亚洲国产视频 | 成年人视频在线免费观看 | 精品天堂av | 欧美伦理一区 | 成人免费看片98欧美 | 国产黄大片 | 手机成人在线 | 成人免费电影 | 亚洲成年片 | 一区二区不卡高清 | 色婷婷久久久综合中文字幕 | 激情视频久久 | 国产日产精品一区二区三区四区的观看方式 | 婷婷网五月天 | 成人资源在线播放 | 国产成人在线看 | 激情欧美xxxx | 成人高清在线 | 91喷水| 西西4444www大胆视频 | 99精品免费久久久久久久久日本 | 欧美日韩中文国产一区发布 | 久久久影院一区二区三区 | 极品美女被弄高潮视频网站 | 色综合夜色一区 | 日韩高清dvd| 日韩精品免费在线观看 | 日日爱999| 国产日韩欧美在线播放 | wwwwww色| 热热热热热色 | 97超碰人人在线 | 成人9ⅰ免费影视网站 | 视频一区二区精品 | 久久久网页 | 激情综合国产 | 日韩视频欧美视频 | 免费成人av电影 | 超碰97国产在线 | 国产欧美在线一区 | 亚洲精品色视频 | av网站免费在线 | 成全免费观看视频 | www久久| 亚洲乱码精品久久久 | 日韩精品视频在线观看免费 | 亚洲1区在线 | 成人在线免费视频观看 | 欧美性久久久久久 | 免费毛片aaaaaa | 丁香综合五月 | 国产大陆亚洲精品国产 | 三级在线视频播放 | 久久久久免费观看 | 国产精品久久久久永久免费观看 | 91手机电视 | 91精品日韩 | 日韩网站中文字幕 | 狠狠狠干狠狠 | 久久在线看 | 特级黄录像视频 | 欧美天天射 | 亚洲97在线 | 久久精品国产免费 | 国产特级毛片aaaaaaa高清 | www.国产在线 | 亚洲日本一区二区在线 | 超碰99人人| 亚洲精品美女在线观看播放 | 欧洲亚洲国产视频 | 精品在线视频播放 | 久久久精品免费观看 | 91精品视频在线播放 | 久久精品亚洲一区二区三区观看模式 | 欧美久久久久久久久中文字幕 | 亚洲成av人片在线观看www | 99视频国产在线 | 国产在线观看免 | 五月婷婷丁香在线观看 | 久久理论视频 | 999久久a精品合区久久久 | 欧美成人理伦片 | 精品在线小视频 | 国产免费xvideos视频入口 | 国产黄a三级三级 | 天天摸夜夜添 | 久久精品这里都是精品 | 精品国产电影一区 | 最近在线中文字幕 | 日韩av片无码一区二区不卡电影 | 27xxoo无遮挡动态视频 | 久久久久成| 天天插一插 | 免费激情在线电影 | 久久影视中文字幕 | 四虎国产永久在线精品 | 九九在线免费视频 | 久久a v电影| 一区二区高清在线 | 91精品视频播放 | 91精品国产福利 | 999国内精品永久免费视频 | 97在线免费观看视频 | 亚洲免费国产 | 天堂网av在线 | 精品一区 在线 | 干干操操| 成人精品久久久 | 91九色在线观看 | 久久在线一区 | av播放在线 | 91福利区一区二区三区 | 在线观看一区二区精品 | 精品久久精品 | 手机av电影在线 | 成年人在线电影 | 国产黄色特级片 | 日日草av | 久久视频在线观看免费 | 亚洲精品视频在线看 | 狠狠色伊人亚洲综合网站色 | 久草在线视频看看 | 久草精品视频在线观看 | 中文字幕免费看 | 三级黄色在线观看 | 免费在线黄 | 欧美伦理一区 | 99久久99久久精品国产片 | 麻豆一精品传二传媒短视频 | 在线观看免费av片 | 四虎在线免费观看 | 日韩精品不卡在线观看 | 国产精品白浆 | 日韩美女av在线 | 日韩中文在线视频 | 欧美色888 | 国产丝袜 | 中文一二区 | 国产99免费 | 丝袜少妇在线 | 91中文字幕网 | 久久a级片 | 夜夜躁日日躁 | 黄色成人小视频 | 狠狠操.com| 成人av网站在线 | 久久久久国产精品免费免费搜索 | 婷婷六月色 | 国产xxxxx在线观看 | 免费看的黄色的网站 | 九九色综合 | 亚洲免费在线观看视频 | 国产一区二区高清 | 男女视频久久久 | 久久男人免费视频 | 九九视频网站 | 日韩一区二区三免费高清在线观看 | 天天干天天干天天干天天干天天干天天干 | av手机版| 久久99久久99精品中文字幕 | 91久久久久久久一区二区 | 91av播放 | 人人爱爱 | www.eeuss影院av撸 | 亚洲色图美腿丝袜 | 热久久影视 | 四虎影视精品永久在线观看 | 久久超碰99| 狠狠色丁香婷婷综合久小说久 | 日韩中文字幕免费电影 | 久色婷婷 | 中文字幕在线播放av | 天堂av在线网址 | 国产91精品在线播放 | 97国产大学生情侣酒店的特点 | 国产成人福利在线观看 | 最近日本中文字幕a | 日韩三级.com | 黄色一二级片 | 成人免费视频观看 | 色婷婷狠狠五月综合天色拍 | 精品久久久亚洲 | 97超碰免费在线观看 | 欧美另类sm图片 | 成人免费在线播放 | 四川妇女搡bbbb搡bbbb搡 | 成人黄色免费观看 | 精品麻豆 | 天天操天天干天天爱 | av电影在线观看 | 激情五月伊人 | 亚洲一区精品二人人爽久久 | 国产精品99爱 | 中文字幕在线一二 | 五月天色站 | 99久久久免费视频 | 18做爰免费视频网站 | 久久精品二区 | 色视频网址 | 欧美一区二区在线免费观看 | 福利视频网址 | 91色蜜桃| 91看片淫黄大片在线播放 | 久久精品国亚洲 | 久久福利国产 | 国产在线999 | 久久综合狠狠综合久久狠狠色综合 | 99免费看片| 欧美日韩免费在线视频 | 男女日麻批| 国产精品一区二区电影 | 果冻av在线 | 91精彩在线视频 | 国产系列在线观看 | 国产亚洲成人网 | 国产一区在线视频观看 | 麻豆视频免费版 | 久久久精品国产一区二区三区 | 五月天六月色 | 国产成人精品网站 | 黄色亚洲免费 | 在线观看免费一区 | 免费进去里的视频 | 日韩成人看片 | 婷婷福利影院 | 天天躁日日躁狠狠躁av中文 | 激情在线网站 | 中文字幕在线看视频国产中文版 | 综合色在线 | 久久视频6 | 免费观看久久 | 99久久日韩精品视频免费在线观看 | 99爱在线| 99色免费视频 | 国产在线一区观看 | 国产精品成人免费精品自在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 玖玖精品在线 | 久久久久久欧美二区电影网 | 日韩av中文字幕在线 | 五月婷婷激情六月 | 五月婷婷色综合 | 97在线视 | bbbb操bbbb| 国产精品一区二区你懂的 | 亚洲自拍偷拍色图 | 日韩在线短视频 | 国产一二三区在线观看 | 麻豆精品视频在线观看免费 | 青青网视频 | 久久特级毛片 | 婷婷色av | 9草在线 | 欧美成人亚洲成人 | www.伊人色.com | 丁香六月网 | 欧美天天综合网 | 成人午夜电影网站 | 亚洲成人av在线 | 91看片成人 | 午夜av不卡| 久久伊人国产精品 | 国产精品嫩草55av | 亚洲精品99久久久久久 | 日韩91精品 | 五月天网站在线 | 国产亚洲成人网 | 国产精品一区二区中文字幕 | 91人网站| 天天躁日日躁狠狠躁av中文 | 九九综合在线 | 欧美日韩在线视频观看 | 在线观看日本高清mv视频 | 免费a级黄色毛片 | www.五月天色 | 精品欧美一区二区三区久久久 | 天天操操操操操操 | 狠狠狠狠狠狠干 | 日韩精品中文字幕在线 | 久久免费在线观看 | 亚洲aⅴ乱码精品成人区 | 欧美一区二区三区四区夜夜大片 | 美女免费视频观看网站 | 91精品视屏 | 成年人视频免费在线 | 国产精品免费观看久久 | 国产高清在线免费视频 | 欧美日韩在线视频一区二区 | 97精品视频在线 | 欧美精品在线观看免费 | 91视频这里只有精品 | 日韩高清不卡一区二区三区 | 天天摸天天干天天操天天射 | 激情伊人 | 欧美一区二区在线免费观看 | 91色亚洲 | 在线免费观看不卡av | 色a在线观看 | www.香蕉视频在线观看 | 99r国产精品 | 久久国产精品99久久久久 | 日韩免费b | 久草在线视频中文 | 91欧美视频网站 | 久久中文字幕在线视频 | 久久久18 | 午夜免费福利视频 | 在线观看爱爱视频 | 午夜婷婷在线播放 | 国产精品一区二区62 | 热久久免费视频精品 | 91av欧美| 黄色av成人在线观看 | 97av精品| 天天做天天干 | 激情av一区二区 | 免费看片网页 | 久草网站在线观看 | 成人午夜精品 | 国产午夜麻豆影院在线观看 | 色香网| av电影中文字幕 | 成人在线免费视频观看 | 国产精品一区二区三区四区在线观看 | 久久免费精品视频 | 欧美资源在线观看 | 国产免费二区 | 国产美腿白丝袜足在线av | 欧美小视频在线 | 久久免费看 | 精品视频 | 五月天综合激情网 | 91久草视频 | 日韩精品免费在线观看视频 | 精品免费视频123区 午夜久久成人 | 国产99久久久欧美黑人 | 丝袜少妇在线 | 欧美黑吊大战白妞欧美 | 成人动漫视频在线 | 在线观看完整版免费 | 国产精品精 | ,午夜性刺激免费看视频 | 六月色| 国产亚洲va综合人人澡精品 | www.色午夜,com | 亚洲精品乱码久久久久久按摩 | 麻豆视频免费观看 | 国产在线一线 | 日日夜夜精品免费 | 成人资源在线播放 | 久久综合婷婷国产二区高清 | 免费一级片在线观看 | 五月婷婷影院 | 亚洲情婷婷| 国产一区二区视频在线 | 国产福利精品视频 | 97国产情侣爱久久免费观看 | 国产精品一区二区久久久 | 高清国产一区 | 久久怡红院 | 欧美在线视频日韩 | 精品国产乱码 | 日韩精品一区二区三区在线视频 | 干亚洲少妇 | 亚洲精品国产第一综合99久久 | 亚洲精品麻豆视频 | 五月婷婷中文网 | 亚洲精品黄 | 99久久99久久免费精品蜜臀 | 日韩高清精品免费观看 | 免费av视屏| 久久 一区| 日日夜日日干 | 91精品国产91p65 | 波多野结衣在线视频一区 | 国产精品系列在线 | 国产日产精品一区二区三区四区 | 狠狠狠操 | 中文字幕欲求不满 | 国产高清视频在线观看 | 黄网在线免费观看 | 成人av电影免费观看 | 黄色在线视频网址 | www黄免费 | 亚洲精品网站在线 | 国产成人av在线影院 | 中文字幕有码在线观看 | 国产成人精品一区二区三区免费 | 一级免费观看 | 国产精品第2页 | 日韩精品一区二区三区水蜜桃 | 久草视频在线免费 | 国产精品第一页在线观看 | 天堂久色| 免费av大片| 欧美日韩色婷婷 | 色播五月激情综合网 | 综合网天天色 | 亚洲精品国偷拍自产在线观看蜜桃 | 天天干天天射天天插 | 日韩精品专区 | 国产精品99久久久精品免费观看 | 91av社区 | 国产精品国产三级国产不产一地 | 丁香五月亚洲综合在线 | 啪啪动态视频 | 在线观看中文字幕第一页 | 国产一级免费电影 | 国产一线在线 | 四月婷婷在线观看 | 欧美精品一级视频 | 男女激情片在线观看 | 偷拍久久久 | 日韩欧美高清一区二区 | 国产中文字幕在线观看 | 国产人在线成免费视频 | 91av免费观看 | 天天干天天插 | 国产精品亚洲a | 91大神精品视频在线观看 | 亚洲免费av一区二区 | 成人蜜桃网 | 91中文字幕在线视频 | 91亚洲精品国偷拍自产在线观看 | 天天天天天操 | 国产精品免费看久久久8精臀av | 香蕉视频91 | 亚洲精品美女在线观看 | 狠狠婷婷 | 久久精品一区二区三区中文字幕 | 深爱婷婷网 | av大全在线免费观看 | 色偷偷888欧美精品久久久 | av片一区二区 | 国产精品久久在线 | 最新真实国产在线视频 | 自拍超碰在线 | 黄色片免费在线 | 国产精品美女久久久免费 | av日韩在线网站 | 日本婷婷色 | 久久99精品久久只有精品 | 激情喷水| 人人澡人人爱 | 日韩av电影国产 | 91九色视频国产 | 亚洲精品美女久久久 | 一区二区网| 中文av影院| 欧美一二三区播放 | 深夜精品福利 | 久草视频在线免费看 | 天天色天天干天天 | 国产一级免费片 | 日韩高清黄色 | 国产一二三区在线观看 | 91麻豆看国产在线紧急地址 | 国产高清福利在线 | 国内亚洲精品 | 色香网 | 麻豆免费视频网站 | 综合久久一本 | 精品视频999 | 在线观看视频在线观看 | 亚洲狠狠婷婷 | 国产69久久精品成人看 | 亚洲高清av在线 | 91精彩视频在线观看 | 91视频免费看网站 | 国产成人精品日本亚洲999 | 亚洲成av片人久久久 | 97超碰在线久草超碰在线观看 | 五月婷久久| 天天干夜夜 | 精品国产乱码久久久久久久 | 久草视频国产 | 亚洲国产影院av久久久久 | 亚洲三级视频 | 91综合久久一区二区 | 西西大胆免费视频 | 日韩激情小视频 | 一区二区三区韩国免费中文网站 | 日韩欧美视频一区二区三区 | 精品在线观看国产 | 在线色网站 | 黄色在线观看www | 亚洲天堂在线观看完整版 | www色 | 成年人免费电影 | www.色五月| 国产福利免费在线观看 | 国产精品亚洲片在线播放 | 摸阴视频 | 四虎成人在线 | 久久久久久黄色 | 亚洲另类人人澡 | 天天综合网久久 | 日韩三级视频 | 日本最大色倩网站www | 久久福利 | 日本mv大片欧洲mv大片 | 五月天激情视频在线观看 | 99热最新在线 | 美女视频黄网站 | 97精品视频在线播放 | 97国产情侣爱久久免费观看 | 九九免费视频 | 天天激情天天干 | 国产视频在线看 |