溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java實現(xiàn)簡單的區(qū)塊鏈程序的代碼怎么寫

發(fā)布時間:2022-02-24 10:56:31 來源:億速云 閱讀:161 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Java實現(xiàn)簡單的區(qū)塊鏈程序的代碼怎么寫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java實現(xiàn)簡單的區(qū)塊鏈程序的代碼怎么寫”吧!

什么是區(qū)塊鏈?

那么,讓我們先來了解一下區(qū)塊鏈到底是什么…

好吧,它的起源可以追溯到Satoshi Nakamoto在2008年發(fā)表的關(guān)于比特幣的白皮書。

區(qū)塊鏈?zhǔn)且粋€分散的信息分類帳。它由通過使用密碼學(xué)連接的數(shù)據(jù)塊組成。它屬于通過公共網(wǎng)絡(luò)連接的節(jié)點網(wǎng)絡(luò)。當(dāng)我們稍后嘗試構(gòu)建一個基本教程時,我們將更好地理解這一點。

我們必須了解一些重要的屬性,讓我們來了解一下:

  • 防篡改 :首先,數(shù)據(jù)作為塊的一部分是防篡改的。每個塊都由一個加密摘要(通常稱為散列)引用,使得塊能夠防篡改。

  • 去中心化 :整個區(qū)塊鏈在網(wǎng)絡(luò)上完全去中心化。這意味著沒有主節(jié)點,網(wǎng)絡(luò)中的每個節(jié)點都有相同的副本。

  • 透明 :每個參與網(wǎng)絡(luò)的節(jié)點通過與其他節(jié)點協(xié)商一致,對其鏈進(jìn)行驗證并添加新的塊。因此,每個節(jié)點都具有數(shù)據(jù)的完全可見性。

區(qū)塊鏈?zhǔn)侨绾喂ぷ鞯模?br/>

現(xiàn)在,讓我們來了解區(qū)塊鏈?zhǔn)侨绾喂ぷ鞯摹?/p>

區(qū)塊鏈的基本單位是區(qū)塊。單個塊可以封裝多個事務(wù)或其他有價值的數(shù)據(jù):

開采區(qū)塊

我們用散列值表示一個塊。生成塊的哈希值稱為“挖掘”塊。開采一個區(qū)塊通常計算成本很高,因為它是“工作證明”。

塊的散列通常由以下數(shù)據(jù)組成:

  • 首先,塊的散列由它封裝的事務(wù)組成

  • 散列還包括塊創(chuàng)建的時間戳

  • 它還包括一個nonce,一個用于密碼學(xué)的任意數(shù)字

  • 最后,當(dāng)前塊的散列還包括前一塊的散列

  • 網(wǎng)絡(luò)中的多個節(jié)點可以同時競爭挖掘塊。除了生成散列,節(jié)點還必須驗證添加到塊中的事務(wù)是否合法。第一個挖方塊的人贏得比賽!

向區(qū)塊鏈中添加區(qū)塊

雖然挖掘塊的計算成本很高,但驗證塊是否合法相對容易得多。網(wǎng)絡(luò)中的所有節(jié)點都參與驗證新開采的區(qū)塊。

因此, 在節(jié)點一致的情況下,一個新挖掘的區(qū)塊被添加到區(qū)塊鏈中。

現(xiàn)在,有幾種共識協(xié)議可供我們用于驗證。網(wǎng)絡(luò)中的節(jié)點使用相同的協(xié)議來檢測鏈的惡意分支。因此,即使引入惡意分支,也會很快被大多數(shù)節(jié)點拒絕。

Java中的基本區(qū)塊鏈
現(xiàn)在我們已經(jīng)有足夠的上下文開始用Java構(gòu)建一個基本的應(yīng)用程序。

我們這里的簡單示例將說明我們剛才看到的基本概念。生產(chǎn)級應(yīng)用程序需要考慮很多問題,這些問題超出了本教程的范圍。不過,我們稍后將討論一些高級主題。

實現(xiàn)塊

首先,我們需要定義一個簡單的POJO來保存塊的數(shù)據(jù):

public class Block {
    private String hash;
    private String previousHash;
    private String data;
    private long timeStamp;
    private int nonce;
 
    public Block(String data, String previousHash, long timeStamp) {
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = timeStamp;
        this.hash = calculateBlockHash();
    }
    // standard getters and setters
}

讓我們了解一下我們在這里打包的東西:

nonce

計算散列

現(xiàn)在,我們?nèi)绾斡嬎銐K的散列呢?我們已經(jīng)使用了 calculateBlockHash 方法,但還沒有看到實現(xiàn)。在我們實現(xiàn)這個方法之前,花點時間來理解什么是散列是值得的。

散列是散列函數(shù)的輸出。 哈希函數(shù)將任意大小的輸入數(shù)據(jù)映射為固定大小的輸出數(shù)據(jù)。 哈希對輸入數(shù)據(jù)中的任何更改都非常敏感,無論更改多么小。

此外,僅僅從散列中獲取輸入數(shù)據(jù)是不可能的。這些屬性使得哈希函數(shù)在密碼學(xué)中非常有用。

那么,讓我們看看如何在Java中生成塊的哈希:

public String calculateBlockHash() {
    String dataToHash = previousHash 
      + Long.toString(timeStamp) 
      + Integer.toString(nonce) 
      + data;
    MessageDigest digest = null;
    byte[] bytes = null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
        bytes = digest.digest(dataToHash.getBytes(UTF_8));
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
        logger.log(Level.SEVERE, ex.getMessage());
    }
    StringBuffer buffer = new StringBuffer();
    for (byte b : bytes) {
        buffer.append(String.format("%02x", b));
    }
    return buffer.toString();
}
public String calculateBlockHash() {
    String dataToHash = previousHash 
      + Long.toString(timeStamp) 
      + Integer.toString(nonce) 
      + data;
    MessageDigest digest = null;
    byte[] bytes = null;
    try {
        digest = MessageDigest.getInstance("SHA-256");
        bytes = digest.digest(dataToHash.getBytes(UTF_8));
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
        logger.log(Level.SEVERE, ex.getMessage());
    }
    StringBuffer buffer = new StringBuffer();
    for (byte b : bytes) {
        buffer.append(String.format("%02x", b));
    }
    return buffer.toString();
}

這里發(fā)生了很多事情,讓我們詳細(xì)了解一下:

MessageDigest

我們在那塊地上挖礦了嗎?

到目前為止,一切聽起來都簡單而優(yōu)雅,只是我們還沒有開采這個區(qū)塊。那么,究竟需要挖掘一個區(qū)塊,這已經(jīng)吸引了開發(fā)人員一段時間的想象力!

嗯,挖掘一個區(qū)塊意味著為這個區(qū)塊解決一個計算復(fù)雜的任務(wù)。雖然計算一個塊的散列有點瑣碎,但找到以五個零開始的散列卻不是。更復(fù)雜的是找到一個以十個零開始的散列,我們就得到了一個大概的想法。

那么,我們到底該怎么做呢?老實說,這個解決方案沒有那么花哨!我們是用蠻力來達(dá)到這個目標(biāo)的。我們在這里使用 nonce :

public String mineBlock(int prefix) {
    String prefixString = new String(new char[prefix]).replace('', '0');
    while (!hash.substring(0, prefix).equals(prefixString)) {
        nonce++;
        hash = calculateBlockHash();
    }
    return hash;
}

讓我們看看我們要做的是:

nonce

我們從默認(rèn)值 nonce 開始,并將其遞增1。但是,在現(xiàn)實世界的應(yīng)用程序中,有更復(fù)雜的策略來啟動和增加一個瞬間。另外,我們這里沒有驗證我們的數(shù)據(jù),這通常是一個重要的部分。

讓我們運行這個示例

現(xiàn)在我們已經(jīng)定義了塊及其函數(shù),我們可以用它來創(chuàng)建一個簡單的區(qū)塊鏈。我們將此存儲在 ArrayList 中:

List<Block> blockchain = new ArrayList<>();
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('', '0');

此外,我們還定義了一個前綴4,這實際上意味著我們希望哈希以4個零開始。

讓我們看看如何在這里添加塊:

@Test
public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
    Block newBlock = new Block(
      "The is a New Block.", 
      blockchain.get(blockchain.size() - 1).getHash(),
      new Date().getTime());
    newBlock.mineBlock(prefix);
    assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
    blockchain.add(newBlock);
}

區(qū)塊鏈驗證

節(jié)點如何驗證區(qū)塊鏈的有效性?雖然這可能相當(dāng)復(fù)雜,但讓我們考慮一個簡單的版本:

@Test
public void givenBlockchain_whenValidated_thenSuccess() {
    boolean flag = true;
    for (int i = 0; i < blockchain.size(); i++) {
        String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();
        flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
          && previousHash.equals(blockchain.get(i).getPreviousHash())
          && blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
            if (!flag) break;
    }
    assertTrue(flag);
}

因此,我們對每個街區(qū)進(jìn)行三次具體檢查:

  • 當(dāng)前塊存儲的哈希值實際上是它計算的值

  • 當(dāng)前塊中存儲的前一塊的哈希就是前一塊的哈希

  • 當(dāng)前區(qū)塊已被開采

一些先進(jìn)的概念

雖然我們的基本示例介紹了區(qū)塊鏈的基本概念,但它肯定不完整。要將這項技術(shù)投入實際應(yīng)用,還需要考慮其他幾個因素。

雖然不可能詳細(xì)說明所有這些問題,但我們還是來看看其中一些重要的問題:

交易驗證

計算塊的散列并找到所需的散列只是挖掘的一部分。數(shù)據(jù)塊由數(shù)據(jù)組成,通常以多個事務(wù)的形式出現(xiàn)。在將其作為區(qū)塊的一部分并開采之前,必須對其進(jìn)行驗證。

區(qū)塊鏈的典型實現(xiàn) 對一個區(qū)塊可以包含多少數(shù)據(jù)設(shè)置了限制。它還設(shè)置了如何驗證事務(wù)的規(guī)則。網(wǎng)絡(luò)中的多個節(jié)點參與驗證過程。

替代協(xié)商一致議定書

我們看到像“工作證明”這樣的共識算法被用來挖掘和驗證一個塊。然而,這并不是唯一可用的一致性算法。

還有其他幾種共識算法可供選擇,如利害關(guān)系證明、權(quán)威性證明和權(quán)重證明。所有這些都有其利弊。使用哪一種取決于我們打算設(shè)計的應(yīng)用程序的類型。

采礦獎勵

區(qū)塊鏈網(wǎng)絡(luò)通常由自愿節(jié)點組成?,F(xiàn)在,為什么會有人想為這個復(fù)雜的過程做出貢獻(xiàn),并保持它的合法性和增長?

這是因為 節(jié)點因驗證事務(wù)和挖掘塊而獲得獎勵 。這些獎勵通常是與申請相關(guān)聯(lián)的硬幣形式。但是一個應(yīng)用程序可以決定獎勵是任何有價值的東西。

節(jié)點類型

區(qū)塊鏈完全依賴其網(wǎng)絡(luò)來運作。理論上,網(wǎng)絡(luò)是完全分散的,每個節(jié)點都是平等的。然而,在實踐中,一個網(wǎng)絡(luò)由多種類型的節(jié)點組成。

完整節(jié)點有完整的事務(wù)列表,而輕型節(jié)點只有部分列表。此外,并非所有節(jié)點都參與驗證和確認(rèn)。

保密通信

區(qū)塊鏈技術(shù)的一個特點是它的開放性和匿名性。但它如何為內(nèi)部進(jìn)行的交易提供安全性呢?這是基于密碼學(xué)和公鑰基礎(chǔ)設(shè)施。

事務(wù)的發(fā)起方使用他們的私鑰來保護(hù)它,并將它附加到接收方的公鑰上。節(jié)點可以使用參與者的公鑰來驗證事務(wù)。

區(qū)塊鏈的實際應(yīng)用

因此,區(qū)塊鏈似乎是一項令人興奮的技術(shù),但它也必須證明是有用的。這項技術(shù)已經(jīng)存在了一段時間,而且——不用說——它已被證明在許多領(lǐng)域具有破壞性。

它在許多其他領(lǐng)域的應(yīng)用正在積極進(jìn)行。讓我們了解一下最流行的應(yīng)用程序:

  • 貨幣 :由于比特幣的成功,這是迄今為止最古老和最廣為人知的區(qū)塊鏈應(yīng)用。它們?yōu)槿蛉嗣裉峁┌踩珶o摩擦的資金,而無需任何中央當(dāng)局或政府干預(yù)。

  • 身份 :數(shù)字身份正在迅速成為當(dāng)今世界的常態(tài)。然而,這是深陷安全問題和篡改。區(qū)塊鏈以完全安全和防篡改的身份徹底改變這一領(lǐng)域是不可避免的。

  • 醫(yī)療保健 :醫(yī)療保健行業(yè)充滿了數(shù)據(jù),主要由中央當(dāng)局處理。這會降低處理此類數(shù)據(jù)的透明度、安全性和效率。區(qū)塊鏈技術(shù)可以提供一個沒有任何第三方提供急需信任的系統(tǒng)。

  • 政府 :這也許是一個很容易被區(qū)塊鏈技術(shù)破壞的領(lǐng)域。政府通常是一些公民服務(wù)的中心,這些服務(wù)往往充斥著低效和腐敗。區(qū)塊鏈可以幫助建立更好的政府與公民關(guān)系。

行業(yè)工具

雖然我們在這里的基本實現(xiàn)有助于引出概念,但從頭開始在區(qū)塊鏈上開發(fā)產(chǎn)品是不實際的。謝天謝地,這個領(lǐng)域現(xiàn)在已經(jīng)成熟了,我們確實有一些非常有用的工具可以開始。

讓我們來看看一些流行的工具,以便在這個空間中工作:

  • Solidity :Solidity是一種靜態(tài)類型的面向?qū)ο缶幊陶Z言,用于編寫智能合約。它可以用于在以太坊等各種區(qū)塊鏈平臺上編寫智能合約。

  • RemixIDE :Remix是一個強(qiáng)大的開源工具,可以穩(wěn)定地編寫智能合約。這樣用戶就可以直接從瀏覽器中編寫智能合約。

  • Truffle套件 :Truffle提供了一系列工具來幫助開發(fā)人員開始開發(fā)分布式應(yīng)用程序。這包括松露、甘納切和細(xì)雨。

  • Ethlint/Solium :Solium允許開發(fā)人員確保他們在Solidity上編寫的智能合約沒有樣式和安全問題。Solium也有助于解決這些問題。

  • Parity :Parity有助于建立以太智能合約的開發(fā)環(huán)境。它提供了一種與區(qū)塊鏈交互的快速和安全的方式。

到此,相信大家對“Java實現(xiàn)簡單的區(qū)塊鏈程序的代碼怎么寫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI