用Java構建自己的區塊鏈
By 區塊網社羣·
眾所周知,區塊鏈是不可變的。在這裡,我們將設計一個簡單的區塊鏈,它將幫助您理解雜湊值如何只用幾行Java程式碼就使區塊鏈變得不可變。注意:這只是一個演示區塊鏈,真正的區塊鏈涉及到很多其他東西,如共識機制、數字簽名、Merkle樹等。這個程式碼示例將有助於實現理想的目的。區塊鏈中的第一個塊是起源塊。起源塊幾乎總是硬編碼到使用其區塊鏈的應用程式的軟體中。對於之後生成的每個新塊,我們將使用前一個塊的雜湊值以及它自己的交易作為輸入來確定它的塊雜湊值。如;Object[] contents ={Arrays.hashCode(transactions),previousHash}; blockHash = Arrays.hashCode(contents);雜湊函式是一種數學函式,它接受任意長度的數值資料的輸入,並將其轉換為固定長度的數值資料。不同的雜湊函式使用不同的演算法來生成雜湊值。此外,對於任何特定的輸入,雜湊函式總是給出相同的輸出。但是,如果你在輸入中做一個很小的改變,所產生的雜湊值將與前一個完全不同。記住,雜湊值不是加密。一旦你加密了資料,你可以透過解密得到它,不像在雜湊值中你不能透過任何方法得到輸入。有時你可能想知道為什麼需要像SHA256(安全雜湊演算法)這樣的雜湊演算法?最重要的原因是,這些演算法幫助我們避免衝突(不同輸入的相似雜湊值)。現在讓我們看一看區塊鏈如何使它不可能改變一個塊的雜湊值,以便一旦一個塊被寫到區塊鏈中,它就不能改變。我們將建立一個塊類。每個塊將有:· 列表的交易(int)· 前一塊雜湊值(String [])· 雜湊值(int)將getter setter方法應用到變數塊類後,如下所示:import java.util.Arrays;public class Block { private int previousHash; private String[] transactions; private int blockHash; public Block(int previousHash, String[] transactions) { this.previousHash = previousHash; this.transactions = transactions; Object[] contents = {Arrays.hashCode(transactions),previousHash}; this.blockHash = Arrays.hashCode(contents); } public int getPreviousHash() { return previousHash; } public String[] getTransactions() { return transactions; } public int getBlockHash() { return blockHash; } public void setPreviousHash(int previousHash) { this.previousHash = previousHash; } public void setTransactions(String[] transactions) { this.transactions = transactions; } public void setBlockHash(int blockHash) { this.blockHash = blockHash; }}現在我們建立一個區塊鏈。我們將從建立一個起源塊開始。由於起源塊是鏈中的第一個塊,我們將硬編碼交易到前面的雜湊值。實際區塊鏈中的交易肯定是一些交易類,將使用不同的資料結構。為了簡單起見,我將它們寫成字串。所以主類是這樣的:import java.util.ArrayList;public class Blockchain { ArrayList<Block> blockchain = new ArrayList<>(); public static void main(String[] args) { String[] genesisTransactions = {"Suraj sent Ruja 1542 Bitcoins","Ruja sent 10 Bitcoins to John"}; Block genesisBlock = new Block(0,genesisTransactions); System.out.println("Genesis Block Hash:"+genesisBlock.getBlockHash()); String[] block2Transactions = {"John sent 10 bitcoins to Suraj","Suraj sent 10 bitcoins to Alex"}; Block block2= new Block(genesisBlock.getBlockHash(), block2Transactions); System.out.println("Block2 Hash:"+block2.getBlockHash()); String[] block3Transactions = {"Alex sent 999 bitcoins to non"}; Block block3 = new Block(block2.getBlockHash(), block3Transactions); System.out.println("Block3 Hash:"+block3.getBlockHash()); } }輸出:起源塊雜湊值:-1106827926Block2雜湊值:957910147Block3雜湊值:-716750945您可以輸出起源塊的雜湊值,然後更改它,您將看到輸出與之前的輸出有很大的不同,即使您更改了交易串中單個字母的大小寫。將起源塊交易中“Suraj”的“S”更改為“s”後輸出:起源塊雜湊值:1528835466Block2雜湊值:-701393757Block3雜湊值:1918912447這就是塊鏈的形成方式,每個新的塊雜湊值指向它之前的塊雜湊值。這個雜湊系統保證歷史上的任何交易都不會被篡改,因為如果交易的任何一個部分發生了變化,那麼它所屬的塊的雜湊值也會發生變化,結果會導致後面的塊的雜湊值也會發生變化。它將相當容易捕獲任何篡改的結果,因為您可以比較之前的雜湊值。#Java#區塊鏈
免責聲明:
- 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
- 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
- 鏈報僅提供相關項目信息,不構成任何投資建議。
推荐阅读