欧美日韩免费一区二区三区视频_在线精品视频在线观看高清_一区在线影院_国产一区二区区别

首頁 > 金融理財(cái) > 正文

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)

來源:淺藍(lán)攻略網(wǎng)     時(shí)間:2024-11-26 08:57    作者:小藍(lán)整合

前言

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

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

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

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

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)

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

2、區(qū)塊鏈分類

(1)公有鏈

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

(2)聯(lián)盟鏈

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

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

(3)私有鏈

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

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

(1)共識機(jī)制

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

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

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

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

(2)去中心化

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

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

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

(3)智能合約

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

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

(4)不可篡改性

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

區(qū)塊鏈?zhǔn)怯擅總€(gè)區(qū)塊的哈希值串連起來的鏈?zhǔn)浇Y(jié)構(gòu),而區(qū)塊的哈希值=SHA256(“當(dāng)前區(qū)塊內(nèi)容+上一個(gè)區(qū)塊的哈希值”),任何一個(gè)區(qū)塊的內(nèi)容發(fā)生修改,都會引起哈希值的變化,而哈希值的變化也會引起子區(qū)塊哈希值發(fā)生變化,進(jìn)而引起整個(gè)區(qū)塊鏈的改變。

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

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

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

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

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

與所有的貨幣不同,比特幣不依靠特定貨幣機(jī)構(gòu)發(fā)行,它依據(jù)特定算法,通過大量的計(jì)算產(chǎn)生,比特幣經(jīng)濟(jì)使用整個(gè)P2P網(wǎng)絡(luò)中眾多節(jié)點(diǎn)構(gòu)成的分布式數(shù)據(jù)庫來確認(rèn)并記錄所有的交易行為,并使用密碼學(xué)的設(shè)計(jì)來確保貨幣流通各個(gè)環(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)品的代表,以太坊是一個(gè)為去中心化應(yīng)用(Dapp)而生的開源區(qū)塊鏈平臺,擁有著大部分區(qū)塊鏈技術(shù)的特征,但與其它區(qū)塊鏈不同的是,以太坊是可編程的,開發(fā)者可以用它來構(gòu)建不同的應(yīng)用程序,通過其專用加密貨幣以太幣(簡稱“ETH”)提供去中心化的以太虛擬機(jī)(Ethereum Virtual Machine)來處理點(diǎn)對點(diǎn)合約(就是一些腳本程序代碼)。如果把比特幣網(wǎng)絡(luò)看作是一套分布式的數(shù)據(jù)庫,而以太坊則更進(jìn)一步,它可以看作是一臺分布式的計(jì)算機(jī):區(qū)塊鏈?zhǔn)怯?jì)算機(jī)的ROM,合約是程序,而以太坊的礦工們則負(fù)責(zé)計(jì)算,擔(dān)任CPU的角色。

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)

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

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

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

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

(4)小結(jié)

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

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

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

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

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)

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

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

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

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

2、基于java的區(qū)塊鏈開發(fā)實(shí)戰(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)的最小單元,第一步我們先實(shí)現(xiàn)最簡單的區(qū)塊結(jié)構(gòu),新建Block.java類,主要包含以下幾個(gè)字段:
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;	/**	 * 當(dāng)前區(qū)塊的hash值,區(qū)塊唯一標(biāo)識	 */	private String hash;	/**	 * 前一個(gè)區(qū)塊的hash值	 */	private String previousHash;	/**	 * 生成區(qū)塊的時(shí)間戳	 */	private long timestamp;	/**	 * 工作量證明,計(jì)算正確hash值的次數(shù)	 */	private int nonce;	/**	 * 當(dāng)前區(qū)塊存儲的業(yè)務(wù)數(shù)據(jù)集合(例如轉(zhuǎn)賬交易信息、票據(jù)信息、合同信息等)	 */	private List<Transaction> transactions; /*** 省略get set方法****/  }

區(qū)塊鏈?zhǔn)怯蓞^(qū)塊按照區(qū)塊哈希前后順序串聯(lián)起來的數(shù)據(jù)結(jié)構(gòu),哈希值通過散列算法對區(qū)塊進(jìn)行二次哈希計(jì)算而得到的數(shù)字摘要信息(不了解散列函數(shù)的,可以先百度了解一下SHA算法),用于保證區(qū)塊的信息安全以及整條區(qū)塊鏈的有效性。因此第二步我們新增計(jì)算區(qū)塊Hash值的方法,采用SHA256算法,通過java實(shí)現(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)建一個(gè)鏈?zhǔn)浇Y(jié)構(gòu)對象,按照先后順序來保存區(qū)塊對象,從來形成一個(gè)有序的區(qū)塊鏈表,考慮到線程安全問題,采用CopyOnWriteArrayList來實(shí)現(xiàn),為了方便測試,暫且把區(qū)塊鏈結(jié)構(gòu)保存在本地緩存中,實(shí)際的區(qū)塊鏈網(wǎng)絡(luò)最終會實(shí)現(xiàn)持久層的功能,把區(qū)塊鏈數(shù)據(jù)保存至數(shù)據(jù)庫中,例如BTC核心網(wǎng)絡(luò)采用的是K-V數(shù)據(jù)庫LevelDB:
BlockCache.java

public class BlockCache {	/**	 * 當(dāng)前節(jié)點(diǎn)的區(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ū)塊的方法,同時(shí)每次添加區(qū)塊的時(shí)候,我們需要驗(yàn)證新區(qū)塊的有效性,例如Hash值是否正確,新區(qū)塊中上一區(qū)塊的Hash屬性的值,與上一區(qū)塊的Hash值是否相等。

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

/** * 區(qū)塊鏈核心服務(wù) *  * @author Jared Jia * */@Servicepublic class BlockService {	@Autowired	BlockCache blockCache;  	/**	 * 創(chuàng)建創(chuàng)世區(qū)塊	 * @return	 */	public String createGenesisBlock() {		Block genesisBlock = new Block();		//設(shè)置創(chuàng)世區(qū)塊高度為1		genesisBlock.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);		//時(shí)間戳		block.setTimestamp(System.currentTimeMillis());		block.setTransactions(blockTxs);		//工作量證明,計(jì)算正確hash值的次數(shù)		block.setNonce(nonce);		//上一區(qū)塊的哈希		block.setPreviousHash(previousHash);		//當(dāng)前區(qū)塊的哈希		block.setHash(hash);		if (addBlock(block)) {			return block;		}		return null;	}	/**	 * 添加新區(qū)塊到當(dāng)前節(jié)點(diǎn)的區(qū)塊鏈中	 * 	 * @param newBlock	 */	public boolean addBlock(Block newBlock) {		//先對新區(qū)塊的合法性進(jìn)行校驗(yàn)		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;	}		/**	 * 驗(yàn)證新區(qū)塊是否有效	 * 	 * @param newBlock	 * @param previousBlock	 * @return	 */	public boolean isValidNewBlock(Block newBlock, Block previousBlock) {		if (!previousBlock.getHash().equals(newBlock.getPreviousHash())) {			System.out.println("新區(qū)塊的前一個(gè)區(qū)塊hash驗(yàn)證不通過");			return false;		} else {			// 驗(yàn)證新區(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;	} }

1、基本概念

(1)區(qū)塊鏈

從技術(shù)層面來看,區(qū)塊鏈?zhǔn)怯砂灰仔畔⒌膮^(qū)塊按照時(shí)間順序從后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。

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

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

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

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

區(qū)塊頭:組成區(qū)塊頭的包括以下幾個(gè)字段:

1. 區(qū)塊頭hash值

2. 父區(qū)塊頭hash值

3. 時(shí)間戳:區(qū)塊產(chǎn)生的近似時(shí)間

4. Merkle根:該區(qū)塊中交易的merkle樹根的哈希值

5. 難度目標(biāo):該區(qū)塊工作量證明算法的難度目標(biāo)

6. Nonce:用于工作量證明算法的計(jì)數(shù)器

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

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

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

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)

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

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

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

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

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

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

基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)


本站提醒:投資有風(fēng)險(xiǎn),入市須謹(jǐn)慎,本文部分內(nèi)容來自幣圈網(wǎng),本內(nèi)容不可作為投資理財(cái)建議。
上面是基于java開發(fā)一套完整的區(qū)塊鏈系統(tǒng)詳細(xì)教程(附源碼)的全部內(nèi)容了,文章的版權(quán)歸原作者所有,如有侵犯您的權(quán)利,請聯(lián)系刪除,想了解更多p2p cache相關(guān)信息,請關(guān)注收藏淺藍(lán)網(wǎng)。

相關(guān)閱讀推薦

熱門文章

主站蜘蛛池模板: 舟曲县| 阳朔县| 鞍山市| 宜兴市| 舟山市| 日照市| 梓潼县| 永靖县| 广宗县| 庆阳市| 文成县| 调兵山市| 博湖县| 黄梅县| 蒙自县| 余干县| 太原市| 南投市| 五家渠市| 内黄县| 泉州市| 宝坻区| 德令哈市| 珲春市| 大冶市| 泸溪县| 海安县| 吕梁市| 平果县| 弥渡县| 玉林市| 永新县| 桐梓县| 香港| 中山市| 汝南县| 秦皇岛市| 承德县| 关岭| 女性| 阿克陶县|