近幾年區塊鏈概念越來越火,特別是區塊鏈技術被納入國家基礎設施建設名單后,各大企業也開始招兵買馬,對區塊鏈技術進行研究,從各大招聘網站的區塊鏈職位來看,薪資待遇都很不錯,月薪30K到80K的都有,這對于我們程序員來說也是一種機遇,說明學習區塊鏈技術刻不容緩。
我個人從2016年就開始在做區塊鏈系統開發的相關工作,最近身邊很多朋友都在找我,想讓我給他們講講區塊鏈技術開發的相關知識,介于此,索性我就手擼了一套簡單的java區塊鏈系統,并寫了一份詳細的開發教程,發布到博客,希望能夠對熱愛區塊鏈技術的小伙伴學習入門有所幫助。
這套區塊鏈系統代碼非常簡潔清晰,對于新手來說非常好理解,旨在告訴大家其實區塊鏈技術并沒有那么高深復雜。系統中除了springboot框架外,其他基本都是純原生開發,就連P2P網絡也是用的java socket來實現的。
文末有本文完整源碼鏈接。
(1)公有鏈
公有區塊鏈(Public Block Chains)是指:世界上任何個體或者團體都可以發送交易,且交易能夠獲得該區塊鏈的有效確認,任何人都可以參與使用和維護該區塊鏈,信息公開透明。公有區塊鏈是最早的區塊鏈,例如BTC、以太坊等虛擬數字貨幣均基于公有區塊鏈。不過目前公有鏈實際應用價值不大,并沒有產生特別合適的應用場景。
(2)聯盟鏈
行業區塊鏈(Consortium Block Chains):由某個群體內部指定多個預選的節點為記賬人,每個塊的生成由所有的預選節點共同決定(預選節點參與共識過程),其他接入節點可以參與交易,但有權限限制,信息受保護,如銀聯組織。目前聯盟鏈是各個區塊鏈技術團隊主要研究的對象,由于聯盟鏈擁有區塊鏈技術的大部分特征,并且在權限管理、數據安全、監管方面更有優勢,是企業優先考慮的區塊鏈技術方案。
市面上也有一些比較主流的聯盟鏈技術框架,讓開發維護聯盟鏈更加便捷。國內一些大的軟件廠商也都有自己的企業區塊鏈技術解決方案,例如螞蟻金服區塊鏈平臺,騰訊的TrustSQL平臺,東軟的SaCa EchoTrust區塊鏈應用平臺以及京東區塊鏈防偽追溯平臺等等。
(3)私有鏈
私有區塊鏈(Private Block Chains):僅僅使用區塊鏈的總賬技術進行記賬,可以是一個公司,也可以是個人,獨享該區塊鏈的寫入權限,利用區塊鏈的不易篡改特性,把區塊鏈作為賬本數據庫來使用。
(1)共識機制
共識機制被稱作為區塊鏈系統的靈魂,是區塊鏈系統信任體系的基礎。區塊鏈系統作為一個多節點的分布式賬本系統,當有新的信息需要記錄時,哪個節點來負責記賬,記賬獎勵發放給哪個節點,哪些節點負責驗證記賬結果,如何讓各個節點達成最終一致,將記賬結果被網絡中所有節點以同樣的順序復制并記錄下來,就是共識機制要做的事情。
而按照百度百科上的說法:
所謂“共識機制”是通過特殊節點的投票,在很短的時間內完成對交易的驗證和確認,對一筆交易,如果利益不相干的若干個節點能夠達成共識,我們就可以認為全網對此也能夠達成共識。再通俗一點來講,如果中國一名微博大V、美國一名虛擬幣玩家、一名非洲留學生和一名歐洲旅行者互不相識,但他們都一致認為你是個好人,那么基本上就可以斷定你這人還不壞。
目前,較為主流的共識算法有PoW、PoS、DPoS、PBFT等,在實際使用時,每種算法都有各自的優點和缺點。在應用于不同場景時,區塊鏈項目將會采用不同的共識機制和算法。
(2)去中心化
去中心化,是互聯網發展過程中形成的社會關系形態和內容產生形態,是相對于“中心化”而言的新型網絡內容生產過程。在一個分布有眾多節點的區塊鏈系統中,每個節點都具有高度自治的特征。任何一個節點都可能成為階段性的中心,但不具備強制性的中心控制功能。節點與節點之間的影響,會通過網絡而形成關聯關系。這種開放式、扁平化、平等性的系統現象或結構,我們稱之為去中心化。
去中心化的系統具有容錯力高、抗攻擊力強的特征。中心化的系統一旦中心出現問題,整個系統都會崩潰,但是區塊鏈系統中的任何一個節點出現問題,并不會對整個區塊鏈網絡產生太大的影響。
另外,去中介化并不代表著不接受監管,“去中心化”去的是中央控制方和中介方,而不是監管方。監管節點可以方便地接入任何一個區塊鏈網絡。并且由于區塊鏈的公開透明特性,監管機構反而可以更加方便地監控整個系統的交易數據。
(3)智能合約
從技術層面講,智能合約是一段部署在在區塊鏈上的程序代碼,當滿足程序設定的條件時,它便會在區塊鏈上運行,并得到相應的結果。這種情況有點類似于微信的小程序,區塊鏈提供虛擬機和腳本語言,用戶根據腳本語言的語法開發帶有一定業務邏輯的程序,部署在區塊鏈上,當滿足執行的條件時,智能合約便會被區塊鏈虛擬機解釋并運行。
典型的應用便是以太坊平臺的智能合約,在這個平臺里可以支持用戶通過簡單的幾行代碼就能實現他們想要的合約,實現無需人為監督的、不可篡改、自動化運行的合約,買賣房子不需要再找中介、借錢不需要再找公證人……人們可以隨時隨地根據自身需求發起合約,它的執行不依賴某個人和組織,所有的信任完全基于以太坊區塊鏈平臺本身。
(4)不可篡改性
大部分人習慣稱它為不可篡改性,但是從技術層面來說,我個人覺得叫做不可逆轉性更貼切,既然是一個計算機系統,增刪改查是基本的功能屬性,只不過區塊鏈系統刪除和修改操作比較特殊一點。
區塊鏈是由每個區塊的哈希值串連起來的鏈式結構,而區塊的哈希值=SHA256(“當前區塊內容+上一個區塊的哈希值”),任何一個區塊的內容發生修改,都會引起哈希值的變化,而哈希值的變化也會引起子區塊哈希值發生變化,進而引起整個區塊鏈的改變。
因此任何人想要修改區塊的數據幾乎是不可能的,除非他把整個區塊鏈中從創世區塊到最新的區塊的所有哈希值全部重新修改一遍,并且修改完之后,還得廣播告訴網絡中的其他所有節點,讓其他所有節點接受修改。
不過按照目前計算機的算力,想要在短時間內從區塊鏈頭部到尾部全部修改一遍,是一件非常困難的事,并且即使修改完了,其他節點也不會接受修改,因為憑一己之力,沒有能夠讓所有節點達成共識的條件。
(1)公有鏈應用:BTC網絡
區塊鏈1.0產品,對于比特幣,中本聰是這樣定義的:是一種完全通過點對點技術實現的電子現金系統,它使得在線支付能夠直接由一方發起并支付給另外一方,中間不需要通過任何的金融機構。
與所有的貨幣不同,比特幣不依靠特定貨幣機構發行,它依據特定算法,通過大量的計算產生,比特幣經濟使用整個P2P網絡中眾多節點構成的分布式數據庫來確認并記錄所有的交易行為,并使用密碼學的設計來確保貨幣流通各個環節安全性。之后人們根據比特幣網絡技術整理出了區塊鏈技術體系,去解決信任的問題,而比特幣網絡原理也成為了區塊鏈技術初學者的經典教材。
(2)公有鏈應用:以太坊網絡
區塊鏈2.0產品的代表,以太坊是一個為去中心化應用(Dapp)而生的開源區塊鏈平臺,擁有著大部分區塊鏈技術的特征,但與其它區塊鏈不同的是,以太坊是可編程的,開發者可以用它來構建不同的應用程序,通過其專用加密貨幣以太幣(簡稱“ETH”)提供去中心化的以太虛擬機(Ethereum Virtual Machine)來處理點對點合約(就是一些腳本程序代碼)。如果把比特幣網絡看作是一套分布式的數據庫,而以太坊則更進一步,它可以看作是一臺分布式的計算機:區塊鏈是計算機的ROM,合約是程序,而以太坊的礦工們則負責計算,擔任CPU的角色。
以太坊的概念首次在2013至2014年間由程序員Vitalik Buterin受比特幣啟發后提出,大意為“下一代加密貨幣與去中心化應用平臺”。雖然以太坊作為平臺可以在其上開發新的應用,但是由于以太坊的運行和BTC網絡一樣,采用的是Token機制,且平臺性能不足,經常出現網絡擁堵的情況,平臺用來學習開發與測試區塊鏈技術還可以,用于實際生產的話不太現實。
(3)聯盟鏈開發框架:Hyperledger Fabric
Hyperledger Fabric 也叫超級賬本,它是 IBM 貢獻給 Linux 基金會的商用分布式賬本,是面向企業應用的全球最大的分布式開源項目。像其他區塊鏈技術一樣,它也有一個賬本,可以使用智能合約。Fabric的智能合約可以有多種架構,它可以用主流語言編程,例如Go、Java和Javascript,此外也可以使用Solidity。
至今,Fabric已獲得了阿里巴巴、AWS、Azure、百度、谷歌、華為、IBM、甲骨文、騰訊等互聯網巨頭的支持。許多企業的區塊鏈平臺都把Fabric作為底層框架來使用,例如甲骨文。不過由于IBM對區塊鏈的定義強調了區塊鏈的分布式和不可變兩個元素,對共識機制進行了削弱,采用了Kafka和zookeeper的“排序服務”實現共識,因此部分業內人士也稱超級賬本是“偽區塊鏈”,但是即便如此,也抵擋不了企業對超級賬本的喜愛,目前Fabric 2.0版本已經正式發布。
(4)小結
目前公有鏈在實際應用中并沒有太多的業務場景落地,大部分都是以挖礦為主題或者線上寵物飼養的游戲為主,并且由于數字貨幣的匿名性,有些不法分子利用這一特點,將數字貨幣用于洗錢、暗網買賣等違法行為,是各個國家的打擊對象,我國政策法規也嚴厲禁止,因此對于技術人員來說,公有鏈可以作為研究學習的對象,其他方面暫時沒有太多實際意義。
目前大部分區塊鏈企業的研究方向主要是針對企業的聯盟鏈和私有鏈,并且國家層面也在大力支持區塊鏈技術的發展,特別是區塊鏈底層核心技術的研發,倡導把區塊鏈作為核心技術自主創新的重要突破口,明確主攻方向,加大投入力度,著力攻克一批關鍵核心技術,加快推動區塊鏈技術和產業創新發展。不過現在市面上主流的區塊鏈平臺大部分還是以國外公司主導的為主,國內區塊鏈底層核心技術的發展,還需要技術人員的加倍努力。
目前主流的區塊鏈技術架構主要分為五層,數據層是最底層的技術,主要實現了數據存儲、賬戶信息、交易信息等模塊,數據存儲主要基于Merkle樹,通過區塊的方式和鏈式結構實現,而賬戶和交易基于數字簽名、哈希函數和非對稱加密技術等多種密碼學算法和技術,來保證區塊鏈中數據的安全性。
網絡層主要實現網絡節點的連接和通訊,又稱點對點技術,各個區塊鏈節點通過網絡進行通信。共識層是通過共識算法,讓網絡中的各個節點對全網所有的區塊數據真實性正確性達成一致,防止出現拜占庭攻擊、51攻擊等區塊鏈共識算法攻擊。
激勵層主要是實現區塊鏈代幣的發行和分配機制,是公有鏈的范疇,我們不做分析。應用層一般把區塊鏈系統作為一個平臺,在平臺之上實現一些去中心化的應用程序或者智能合約,平臺提供運行這些應用的虛擬機。
接下來我們基于Java語言來開發一套小型的區塊鏈系統,來實現數據層、網絡層、共識層的一些功能,用簡單的代碼來直觀抽象的概念,以便加深對以上區塊鏈技術基礎理論的理解。
(1)開發環境
開發工具 | VSCode |
---|---|
開發語言 | Java |
JDK版本 | JDK1.8或者OpenJDK11 |
開發框架 | SpringBoot2.2.1 |
工程管理 | Maven3.6 |
測試工具 | Postman |
(2)區塊鏈基本模型構建
區塊是區塊鏈系統的最小單元,第一步我們先實現最簡單的區塊結構,新建Block.java類,主要包含以下幾個字段:
Block.java
/** * 區塊結構 * * @author Jared Jia * */public class Block implements Serializable { private static final long serialVersionUID = 1L; /** * 區塊索引號(區塊高度) */ private int index; /** * 當前區塊的hash值,區塊唯一標識 */ private String hash; /** * 前一個區塊的hash值 */ private String previousHash; /** * 生成區塊的時間戳 */ private long timestamp; /** * 工作量證明,計算正確hash值的次數 */ private int nonce; /** * 當前區塊存儲的業務數據集合(例如轉賬交易信息、票據信息、合同信息等) */ private List<Transaction> transactions; /*** 省略get set方法****/ }
區塊鏈是由區塊按照區塊哈希前后順序串聯起來的數據結構,哈希值通過散列算法對區塊進行二次哈希計算而得到的數字摘要信息(不了解散列函數的,可以先百度了解一下SHA算法),用于保證區塊的信息安全以及整條區塊鏈的有效性。因此第二步我們新增計算區塊Hash值的方法,采用SHA256算法,通過java實現:
CryptoUtil.java
/** * 密碼學工具類 * * @author Jared Jia * */public class CryptoUtil { /** * SHA256散列函數 * @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(); }}
第三步,創建一個鏈式結構對象,按照先后順序來保存區塊對象,從來形成一個有序的區塊鏈表,考慮到線程安全問題,采用CopyOnWriteArrayList來實現,為了方便測試,暫且把區塊鏈結構保存在本地緩存中,實際的區塊鏈網絡最終會實現持久層的功能,把區塊鏈數據保存至數據庫中,例如BTC核心網絡采用的是K-V數據庫LevelDB:
BlockCache.java
public class BlockCache { /** * 當前節點的區塊鏈結構 */ private List<Block> blockChain = new CopyOnWriteArrayList<Block>(); public List<Block> getBlockChain() { return blockChain; } public void setBlockChain(List<Block> blockChain) { this.blockChain = blockChain; } }
第四步,有了區塊鏈結構后,需要新增向區塊鏈中添加區塊的方法,同時每次添加區塊的時候,我們需要驗證新區塊的有效性,例如Hash值是否正確,新區塊中上一區塊的Hash屬性的值,與上一區塊的Hash值是否相等。
另外,區塊鏈中必須有個創世區塊,我們直接通過硬編碼實現:
BlockService.java
/** * 區塊鏈核心服務 * * @author Jared Jia * */@Servicepublic class BlockService { @Autowired BlockCache blockCache; /** * 創建創世區塊 * @return */ public String createGenesisBlock() { Block genesisBlock = new Block(); //設置創世區塊高度為1 genesisBlock.setIndex(1); genesisBlock.setTimestamp(System.currentTimeMillis()); genesisBlock.setNonce(1); //封裝業務數據 List<Transaction> tsaList = new ArrayList<Transaction>(); Transaction tsa = new Transaction(); tsa.setId("1"); tsa.setBusinessInfo("這是創世區塊"); tsaList.add(tsa); Transaction tsa2 = new Transaction(); tsa2.setId("2"); tsa2.setBusinessInfo("區塊鏈高度為:1"); tsaList.add(tsa2); genesisBlock.setTransactions(tsaList); //設置創世區塊的hash值 genesisBlock.setHash(calculateHash("",tsaList,1)); //添加到已打包保存的業務數據集合中 blockCache.getPackedTransactions().addAll(tsaList); //添加到區塊鏈中 blockCache.getBlockChain().add(genesisBlock); return JSON.toJSONString(genesisBlock); } /** * 創建新區塊 * @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值的次數 block.setNonce(nonce); //上一區塊的哈希 block.setPreviousHash(previousHash); //當前區塊的哈希 block.setHash(hash); if (addBlock(block)) { return block; } return null; } /** * 添加新區塊到當前節點的區塊鏈中 * * @param newBlock */ public boolean addBlock(Block newBlock) { //先對新區塊的合法性進行校驗 if (isValidNewBlock(newBlock, blockCache.getLatestBlock())) { blockCache.getBlockChain().add(newBlock); // 新區塊的業務數據需要加入到已打包的業務數據集合里去 blockCache.getPackedTransactions().addAll(newBlock.getTransactions()); return true; } return false; } /** * 驗證新區塊是否有效 * * @param newBlock * @param previousBlock * @return */ public boolean isValidNewBlock(Block newBlock, Block previousBlock) { if (!previousBlock.getHash().equals(newBlock.getPreviousHash())) { System.out.println("新區塊的前一個區塊hash驗證不通過"); return false; } else { // 驗證新區塊hash值的正確性 String hash = calculateHash(newBlock.getPreviousHash(), newBlock.getTransactions(), newBlock.getNonce()); if (!hash.equals(newBlock.getHash())) { System.out.println("新區塊的hash無效: " + hash + " " + newBlock.getHash()); return false; } if (!isValidHash(newBlock.getHash())) { return false; } } return true; } }
(1)區塊鏈
從技術層面來看,區塊鏈是由包含交易信息的區塊按照時間順序從后向前有序鏈接起來的數據結構。
從應用層面來說,區塊鏈是一個分布式的共享賬本和數據庫,具有去中心化、不可篡改、全程留痕、集體維護、公開透明等特點。基于這些特點,區塊鏈技術可以開發出自帶信任體系特征的系統,實現多個主體之間的協作信任與一致行動。
區塊是區塊鏈中的最小組成單位,主要有包含元數據的區塊頭和存放一條或者多條交易信息的區塊體兩部分組成,每個區塊都記錄著當前區塊的哈希和上一個區塊的哈希,通過兩個哈希值的關聯,讓所有的區塊以鏈式結構串起來,就形成了一個完整的區塊鏈。
區塊鏈中的第一個區塊被稱作為創世區塊,無需關聯上一個區塊。以BTC網絡為例,每個區塊主要包含如下信息字段:
區塊大小:用字節表示的區塊數據大小
區塊頭:組成區塊頭的包括以下幾個字段:
1. 區塊頭hash值
2. 父區塊頭hash值
3. 時間戳:區塊產生的近似時間
4. Merkle根:該區塊中交易的merkle樹根的哈希值
5. 難度目標:該區塊工作量證明算法的難度目標
6. Nonce:用于工作量證明算法的計數器
交易計數器:交易的數量
交易:記錄在區塊里的交易信息
區塊鏈結構的簡易模型,如下圖所示:
區塊中的交易集合記錄的是一些特定的信息,在BTC網絡中主要記錄的是交易信息,在其他區塊鏈網絡中可以按照業務邏輯來保存相應的業務數據,如審計信息、版權信息、票據信息等,這也是區塊鏈經常用來當做共享賬本的原因。
打個比方,可以把區塊鏈當做一個用來記賬的筆記本,一個區塊就相當于一頁紙,上面記錄了某一時間段內所有的賬務信息,從第一頁到最后一頁,按照頁碼順序排列起來就是一個完整的賬本。
(2)區塊鏈網絡
實際的區塊鏈系統由多個區塊鏈節點組成,每個節點都運行著相同一套區塊鏈主干網絡的副本,且各個節點間通過P2P網絡進行交互,并最終形成一個完整的區塊鏈網絡系統。
P2P網絡具有可靠性、去中心化,以及開放性,各個節點之間交互運作、協同處理,每個節點在對外提供服務的同時也使用網絡中其他節點所提供的服務。當某一個區塊鏈節點產生新的區塊時,會通過廣播的方式告訴其他節點,其他節點通過網絡接收到該區塊信息時,會對這個區塊信息進行驗證,當有一定數量的節點都驗證通過后,各個節點會把該區塊更新到各自現有的區塊鏈上,最終使得整個區塊鏈網絡中的各個節點信息保持一致,這也是區塊鏈去中心化、可信任特性的體現。
區塊鏈網絡簡易模型,如下圖所示:
相關閱讀推薦
最新資訊
最新游戲
我要上王者解鎖版
查看體育帝國大亨(Sports Empire)
查看重啟世界國際版
查看骰子獵人無限資源版
查看寶石塔防2游戲
查看奧特曼vs假面騎士手機版
查看原始回歸傳奇
查看喪尸圍城HD
查看戰地英雄
查看熱門文章
熱門游戲
星球重啟 v1.1.11安卓最新版
查看極無雙2 v1.29.60手游版
查看弓箭傳說2手游 v1.1.0
查看重裝上陣網易官方版 v0.100.352
查看出發吧麥芬測試服 v.1.2
查看獸化實驗室(Changed) v1.0
查看狂扁小豆丁去廣告版 v1.1.2
查看王國紀元 v2.167官方正版
查看夢境食旅官方正版 v1.0.5.6
查看射箭沖突 v0.32.0安卓版
查看洛伊的移動要塞手機版 v.1.5.08
查看爆炒江湖 v1.42中文版
查看龍與劍 V1.1.1最新版
查看天道洪荒模擬器 v4.1無限靈氣/本源
查看龍之劍官方版 v0.1.3最新版
查看致命槍殺中文版 v12.0破解版
查看皇帝成長計劃2 v2.2.2手機版
查看開心酷跑安卓版 v4.6.5官方版
查看