Javaでの単純なブロックチェーンの実装

1. 概要

このチュートリアルでは、ブロックチェーン技術の基本的な概念を学びます。 また、概念に焦点を当てた基本的なアプリケーションをJavaで実装します。
さらに、この技術のいくつかの高度な概念と実用的なアプリケーションについて説明します。

2. ブロックチェーンとは何ですか?

それでは、まずブロックチェーンとは何かを理解しましょう…
さて、それはhttps://bitcoin.org/bitcoin.pdf [ビットコインで中本motoが発行したホワイトペーパー]に遡り、2008年に遡ります。
*ブロックチェーンは、情報の分散型台帳*です。 暗号化を使用して接続されたデータブロックで構成されます。 パブリックネットワークで接続されたノードのネットワークに属します。 後で基本的なチュートリアルを作成しようとすると、このことをよりよく理解できます。
理解しなければならない重要な属性がいくつかあるので、それらを見ていきましょう。
  • 改ざん防止:何よりもまず、ブロックの一部としてのデータは
    改ざん防止
    。 すべてのブロックは、一般にハッシュと呼ばれる暗号ダイジェストによって参照され、ブロックを改ざん防止します。

  • 分散化:ブロックチェーン全体が完全に分散化されています*
    ネットワーク経由で。 これは、マスターノードがなく、ネットワーク内のすべてのノードに同じコピーがあることを意味します。

  • 透過的:ネットワークに参加するすべてのノード*検証および
    他のノードとのコンセンサス*を介してチェーンに新しいブロックを追加します。 したがって、すべてのノードでデータを完全に可視化できます。

3. ブロックチェーンの仕組み

それでは、ブロックチェーンの仕組みを理解しましょう。
ブロックチェーンの*基本単位は_blocks_ *です。 1つのブロックで、複数のトランザクションまたはその他の貴重なデータをカプセル化できます。
link:/uploads/Blockchain-100x37.jpg%20100w []

3.1. ブロックのマイニング

ハッシュ値でブロックを表します。 *ブロックのハッシュ値の生成は、ブロックの「マイニング」と呼ばれます*。 ブロックのマイニングは、「作業の証明」として機能するため、通常は計算コストがかかります。
通常、ブロックのハッシュは次のデータで構成されます。
  • 主に、ブロックのハッシュはトランザクションで構成されます
    カプセル化する

  • ハッシュはまた、ブロックの作成のタイムスタンプで構成されます

  • また、ナンス、暗号化で使用される任意の番号が含まれます

  • 最後に、現在のブロックのハッシュには、
    前のブロック

    ネットワーク内の複数の*ノードは、ブロックを同時にマイニング*するために競合できます。 ハッシュの生成とは別に、ノードはブロックに追加されるトランザクションが正当であることを確認する必要もあります。 ブロックを最初に採掘した人がレースに勝ちます!

3.2. ブロックチェーンにブロックを追加する

ブロックのマイニングには計算コストがかかりますが、*ブロックが正当であることの確認は比較的簡単です*。 ネットワーク内のすべてのノードは、新しくマイニングされたブロックの検証に参加します。
link:/uploads/Blockchain-Network-1-100x43.jpg%20100w []
したがって、新しくコンセンサスされた*ブロックがノードのコンセンサス*のブロックチェーンに追加されます。
現在、検証に使用できるコンセンサスプロトコルがいくつかあります。 ネットワーク内のノードは、同じプロトコルを使用してチェーンの悪意のあるブランチを検出します。 したがって、悪意のあるブランチが導入されたとしても、大多数のノードによってすぐに拒否されます。

4. Javaの基本ブロックチェーン

これで、Javaで基本的なアプリケーションの構築を開始するのに十分なコンテキストが得られました。
ここでの簡単な*例は、先ほど見た基本的な概念*を示しています。 実稼働グレードのアプリケーションには、このチュートリアルの範囲を超える多くの考慮事項が伴います。 ただし、いくつかの高度なトピックについては後で触れます。

4.1. ブロックの実装

まず、ブロックのデータを保持する単純なPOJOを定義する必要があります。
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
}
ここに何を詰め込んだのかを理解しましょう:
  • 前のブロックのハッシュ、チェーンを構築するための重要な部分

  • 実際のデータ、契約のような価値のある情報

  • このブロックの作成のタイムスタンプ

  • ナンス(暗号化で使用される任意の番号)

  • 最後に、他のデータに基づいて計算されたこのブロックのハッシュ

4.2. ハッシュの計算

さて、ブロックのハッシュをどのように計算しますか? メソッド_calculateBlockHash_を使用しましたが、まだ実装を確認していません。 このメソッドを実装する前に、正確にハッシュとは何かを理解するのに時間をかける価値があります。
ハッシュは、ハッシュ関数と呼ばれるものの出力です。 *ハッシュ関数は、任意のサイズの入力データを固定サイズの出力データにマッピングします*。 ハッシュは入力データの変化に非常に敏感ですが、どんなに小さな変化であってもかまいません。
さらに、入力データをハッシュだけから戻すことは不可能です。 これらのプロパティにより、ハッシュ関数は暗号化で非常に役立ちます。
それでは、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();
}
ここでは非常に多くのことが行われています。詳細を理解しましょう。
  • まず、ブロックのさまざまな部分を連結してハッシュを生成します
    from

  • 次に、SHA-256ハッシュ関数のインスタンスを取得します
    メッセージダイジェスト

  • 次に、入力データのハッシュ値(バイト)を生成します
    アレイ

  • 最後に、バイト配列を16進文字列に変換します。ハッシュは
    通常、32桁の16進数で表されます

4.3. 私たちはまだブロックを採掘しましたか?

まだブロックをマイニングしていないという事実を除いて、これまでのところすべてがシンプルでエレガントに聞こえます。 それで、ブロックのマイニングを正確に必要とするものは、しばらくの間開発者の空想を捕らえました!
さて、*ブロックのマイニングとは、ブロックの計算が複雑なタスク*を解くことを意味します。 ブロックのハッシュを計算するのは簡単ですが、5つのゼロで始まるハッシュを見つけるのは簡単ではありません。 さらに複雑なのは、10個のゼロで始まるハッシュを見つけることであり、一般的な考え方が得られます。
それでは、どのようにこれを行うことができますか? 正直なところ、解決策ははるかに空想的です! この目標を達成しようとするのは総当たりです。 ここではnonceを使用します。
public String mineBlock(int prefix) {
    String prefixString = new String(new char[prefix]).replace('\0', '0');
    while (!hash.substring(0, prefix).equals(prefixString)) {
        nonce++;
        hash = calculateBlockHash();
    }
    return hash;
}
ここでやろうとしていることを見てみましょう:
  • 探したいプレフィックスを定義することから始めます

  • 次に、解決策が見つかったかどうかを確認します

  • そうでない場合は、ノンスをインクリメントし、ループでハッシュを計算します

  • 大当たりするまでループが続きます

    ここでは、デフォルト値のnonceから始めて、1ずつ増やしています。 しかし、実際のアプリケーションでは、ノンスを開始およびインクリメントする*洗練された戦略があります。 また、ここではデータを検証していません。これは通常、重要な部分です。

4.4. 例を実行しましょう

ブロックとその関数が定義されたので、これを使用して簡単なブロックチェーンを作成できます。 これを_ArrayList_に保存します:
List<Block> blockchain = new ArrayList<>();
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('\0', '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);
}

4.5. ブロックチェーン検証

ノードはブロックチェーンが有効であることをどのように検証できますか? これは非常に複雑になる可能性がありますが、単純なバージョンについて考えてみましょう。
@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);
}
そのため、ここではすべてのブロックに対して3つの特定のチェックを行っています。
  • 現在のブロックの保存されたハッシュは、実際に計算するものです

  • 現在のブロックに保存されている前のブロックのハッシュはハッシュです
    前のブロックの

  • 現在のブロックがマイニングされました

5. いくつかの高度な概念

基本的な例はブロックチェーンの基本概念を引き出しますが、完全ではありません。 この技術を実用化するには、他のいくつかの考慮事項を考慮する必要があります。
すべてを詳しく説明することはできませんが、重要なものをいくつか見ていきましょう。

5.1. トランザクション検証

ブロックのハッシュを計算して目的のハッシュを見つけることは、マイニングの一部にすぎません。 ブロックは、多くの場合複数のトランザクションの形式のデータで構成されます。 これらは、ブロックの一部にしてマイニングする前に検証する必要があります。
  • blockchainの典型的な実装は、ブロックに含めることができるデータの量に制限を設定します*。 また、トランザクションの検証方法に関するルールを設定します。 ネットワーク内の複数のノードが検証プロセスに参加します。

5.2. 代替合意プロトコル

「Proof of Work」などのコンセンサスアルゴリズムがブロックのマイニングと検証に使用されることがわかりました。 ただし、これは使用可能な唯一の合意アルゴリズムではありません。
プルーフオブステーク、プルーフオブオーソリティ、プルーフオブウェイトなど、選択できる*他のいくつかのコンセンサスアルゴリズムがあります。 これらにはすべて長所と短所があります。 どちらを使用するかは、設計するアプリケーションのタイプによって異なります。

5.3. マイニング報酬

通常、ブロックチェーンネットワークは任意のノードで構成されます。 さて、なぜこの複雑なプロセスに貢献し、合法で成長を続けたいのでしょうか?
これは、*ノードがトランザクションの検証とブロックのマイニング*に対して報酬を受け取るためです。 これらの報酬は通常、アプリケーションに関連付けられたコインの形です。 しかし、アプリケーションは価値のあるものに報酬を決定できます。

5.4. ノードタイプ

ブロックチェーンは、そのネットワークに完全に依存して動作します。 理論的には、ネットワークは完全に分散化されており、すべてのノードは同等です。 ただし、実際には、ネットワークは複数のタイプのノードで構成されます。
*フルノードにはトランザクションの完全なリストがありますが、ライトノードには部分的なリストのみがあります*。 さらに、すべてのノードが検証と検証に参加するわけではありません。

5.5. 安全な通信

ブロックチェーンテクノロジーの特徴の1つは、そのオープン性と匿名性です。 しかし、内部で実行されるトランザクションにどのようにセキュリティを提供しますか? これは、*暗号化と公開鍵インフラストラクチャ*に基づいています。
トランザクションの開始者は、プライベートキーを使用してそれを保護し、受信者の公開キーに添付します。 ノードは、参加者の公開鍵を使用してトランザクションを検証できます。

6. ブロックチェーンの実用化

したがって、ブロックチェーンはエキサイティングなテクノロジーのようですが、有用であることが証明されなければなりません。 この技術は、しばらく前から存在しており、言うまでもなく、多くの分野で破壊的であることが証明されています。
他の多くの分野でのその応用は積極的に追求されています。 最も人気のあるアプリケーションを理解しましょう:
  • 通貨:これは、最も古く、最も広く知られている用途です。
    ブロックチェーン、ビットコインの成功のおかげ。 中央当局や政府の介入なしに、世界中の人々に安全で摩擦のないお金を提供します。

  • アイデンティティ:デジタルアイデンティティは現在の標準になりつつあります
    世界。 ただし、これはセキュリティの問題と改ざんによって損なわれます。 ブロックチェーンは、完全に安全で改ざん防止のアイデンティティでこの分野に革命を起こすことは避けられません。

  • * Healthcare *:ヘルスケア業界には、ほとんどが処理されるデータがロードされています
    中央当局によって。 これにより、そのようなデータの処理における透明性、セキュリティ、および効率が低下します。 ブロックチェーン技術は、非常に必要な信頼を提供するために、サードパーティなしでシステムを提供できます。

  • 政府:これはおそらく混乱を招く可能性の高い分野です
    ブロックチェーン技術によって。 政府は通常、多くの場合、非効率性と汚職を抱えるいくつかの市民サービスの中心にあります。 ブロックチェーンは、政府と市民の関係をより良く確立するのに役立ちます。

7. 貿易のツール

ここでの基本的な実装は概念を引き出すのに役立ちますが、ブロックチェーン上の製品をゼロから開発することは実用的ではありません。 ありがたいことに、このスペースは現在成熟しており、最初から非常に便利なツールがいくつかあります。
このスペース内で機能する一般的なツールをいくつか見てみましょう。
  • Solidity:Solidity is * a
    スマートコントラクトを作成するために設計された、静的に型付けされたオブジェクト指向プログラミング言語*。 Ethereumのようなさまざまなブロックチェーンプラットフォームでスマートコントラクトを作成するために使用できます。

  • Remix IDE:Remixは
    Solidityでスマートコントラクト*を作成するための強力な*オープンソースツール。 これにより、ユーザーはブラウザからスマートコントラクトを作成できます。

  • Truffle Suite:Truffleは* aを提供します
    開発者を育て、分散アプリの開発を開始*するツールの束。 これには、トリュフ、ガナッシュ、ドリズルが含まれます。

  • Ethlint/Solium:Soliumは許可します
    Solidityで作成された*スマートコントラクトにスタイルやセキュリティの問題がないことを確認する開発者*。 Soliumは、これらの問題の修正にも役立ちます。

  • Parity:パリティは、
    Ethereumのスマートコントラクト*の開発環境。 ブロックチェーンと対話するための高速で安全な方法を提供します。

8. 結論

要約すると、このチュートリアルでは、ブロックチェーンテクノロジーの基本概念について説明しました。 ネットワークがマイニングし、ブロックチェーンに新しいブロックを追加する方法を理解しました。 さらに、基本概念をJavaで実装しました。 また、この技術に関連するいくつかの高度な概念についても説明しました。
最後に、ブロックチェーンの実用的なアプリケーションと利用可能なツールをまとめました。
いつものように、コードはhttps://github.com/eugenp/tutorials/tree/master/java-blockchain[GitHub上]にあります。