Javaでのシンプルなブロックチェーンの実装
1. 概要
このチュートリアルでは、ブロックチェーンテクノロジーの基本的な概念を学習します。 また、Javaには、概念に焦点を当てた基本的なアプリケーションを実装します。
さらに、このテクノロジーのいくつかの高度な概念と実際のアプリケーションについて説明します。
2. ブロックチェーンとは何ですか?
それで、最初にブロックチェーンが正確に何であるかを理解しましょう…
さて、それはその起源を、2008年にビットコインで中本聡が発行したホワイトペーパーにまでさかのぼります。
ブロックチェーンは情報の分散型元帳です。 これは、暗号化を使用して接続されたデータのブロックで構成されています。 これは、パブリックネットワークを介して接続されたノードのネットワークに属しています。 後で基本的なチュートリアルを作成しようとすると、これをよりよく理解できます。
理解しなければならない重要な属性がいくつかあるので、それらを見ていきましょう。
- 改ざん防止:何よりもまず、ブロックの一部としてのデータは改ざん防止です。 すべてのブロックは、一般にハッシュと呼ばれる暗号ダイジェストによって参照されるため、ブロックが改ざんされないようになっています。
- 分散型:ブロックチェーン全体がネットワーク全体で完全に分散化されています。 これは、マスターノードがなく、ネットワーク内のすべてのノードが同じコピーを持っていることを意味します。
- 透過的:ネットワークに参加しているすべてのノードは、他のノードとのコンセンサスを介して、新しいブロックを検証し、チェーンに追加します。 したがって、すべてのノードがデータを完全に可視化できます。
3. ブロックチェーンはどのように機能しますか?
それでは、ブロックチェーンがどのように機能するかを理解しましょう。
ブロックチェーンの基本単位はブロックです。 1つのブロックで、複数のトランザクションやその他の貴重なデータをカプセル化できます。
3.1. ブロックのマイニング
ブロックをハッシュ値で表します。 ブロックのハッシュ値の生成は、ブロックの「マイニング」と呼ばれます。 ブロックのマイニングは、「作業の証明」として機能するため、通常、計算コストがかかります。
ブロックのハッシュは通常、次のデータで構成されます。
- 主に、ブロックのハッシュは、ブロックがカプセル化するトランザクションで構成されます
- ハッシュには、ブロックの作成のタイムスタンプも含まれます
- また、暗号化で使用される任意の数であるナンスも含まれます
- 最後に、現在のブロックのハッシュには、前のブロックのハッシュも含まれます
ネットワーク内の複数のノードは、同時にブロックをマイニングするために競合する可能性があります。 ハッシュの生成とは別に、ノードはブロックに追加されているトランザクションが正当であることも確認する必要があります。 ブロックを最初に採掘した人がレースに勝ちます!
3.2. ブロックチェーンへのブロックの追加
ブロックのマイニングは計算コストが高くなりますが、ブロックが正当であることを確認するのは比較的簡単です。 ネットワーク内のすべてのノードは、新しくマイニングされたブロックの検証に参加します。
したがって、新しくマイニングされたブロックは、ノードのコンセンサスのブロックチェーンに追加されます。
現在、検証に使用できるいくつかのコンセンサスプロトコルが利用可能です。 ネットワーク内のノードは、同じプロトコルを使用してチェーンの悪意のあるブランチを検出します。 したがって、悪意のあるブランチが導入されたとしても、すぐに大多数のノードによって拒否されます。
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();
}
ここで起こっていることはかなりたくさんあります。それらを詳しく理解しましょう。
- まず、ブロックのさまざまな部分を連結して、からハッシュを生成します。
- 次に、MessageDigestからSHA-256ハッシュ関数のインスタンスを取得します。
- 次に、入力データのハッシュ値を生成します。これはバイト配列です。
- 最後に、バイト配列を16進文字列に変換します。ハッシュは通常、32桁の16進数として表されます。
4.3. 私たちはもうブロックを採掘しましたか?
ブロックをまだマイニングしていないという事実を除いて、これまでのところすべてがシンプルでエレガントに聞こえます。 それで、ブロックをマイニングすることを正確に伴うものは、しばらくの間開発者の空想を捕らえてきました!
さて、ブロックのマイニングは、ブロックの計算が複雑なタスクを解決することを意味します。 ブロックのハッシュを計算することはやや簡単ですが、5つのゼロで始まるハッシュを見つけることは簡単ではありません。 さらに複雑なのは、10個のゼロで始まるハッシュを見つけることであり、一般的な考え方が得られます。
では、これをどのように正確に行うことができますか? 正直なところ、解決策はそれほど派手ではありません! 私たちがこの目標を達成しようとするのは、総当たり攻撃です。 ここではナンスを利用します:
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. トランザクション検証
ブロックのハッシュを計算し、目的のハッシュを見つけることは、マイニングのほんの一部です。 ブロックはデータで構成され、多くの場合、複数のトランザクションの形式になっています。 これらをブロックの一部にしてマイニングする前に、これらを検証する必要があります。
ブロックチェーンの一般的な実装では、ブロックに含めることができるデータの量に制限が設定されています。 また、トランザクションの検証方法に関するルールを設定します。 ネットワーク内の複数のノードが検証プロセスに参加します。
5.2. 代替コンセンサスプロトコル
「プルーフオブワーク」のようなコンセンサスアルゴリズムが、ブロックのマイニングと検証に使用されていることを確認しました。 ただし、使用できるコンセンサスアルゴリズムはこれだけではありません。
プルーフオブステーク、プルーフオブオーソリティ、プルーフオブウェイトなど、から選択できる他のいくつかのコンセンサスアルゴリズムがあります。 これらすべてに長所と短所があります。 どちらを使用するかは、設計するアプリケーションのタイプによって異なります。
5.3. マイニング報酬
ブロックチェーンネットワークは通常、任意のノードで構成されます。 さて、なぜ誰かがこの複雑なプロセスに貢献し、それを合法で成長させ続けたいのでしょうか?
これは、ノードがトランザクションの検証とブロックのマイニングに対して報酬を受け取るためです。 これらの報酬は通常、アプリケーションに関連付けられたコインの形で提供されます。 しかし、アプリケーションは報酬を価値のあるものに決定することができます。
5.4. ノードタイプ
ブロックチェーンは、そのネットワークに完全に依存して動作します。 理論的には、ネットワークは完全に分散化されており、すべてのノードは同等です。 ただし、実際には、ネットワークは複数のタイプのノードで構成されています。
完全なノードにはトランザクションの完全なリストがありますが、軽いノードには部分的なリストしかありません。 さらに、すべてのノードが検証と妥当性確認に参加するわけではありません。
5.5. 安全な通信
ブロックチェーンテクノロジーの特徴の1つは、そのオープン性と匿名性です。 しかし、それはどのようにして内部で実行されるトランザクションにセキュリティを提供するのでしょうか? これは、暗号化と公開鍵インフラストラクチャに基づくです。
トランザクションの開始者は、秘密鍵を使用してそれを保護し、受信者の公開鍵に添付します。 ノードは、参加者の公開鍵を使用してトランザクションを検証できます。
6. ブロックチェーンの実用化
したがって、ブロックチェーンはエキサイティングなテクノロジーのようですが、それも有用であることが証明されなければなりません。 このテクノロジーはしばらく前から存在しており、言うまでもなく、多くのドメインで破壊的であることが証明されています。
他の多くの分野でのその応用は積極的に追求されています。 最も人気のあるアプリケーションを理解しましょう:
- 通貨:これは、ビットコインの成功のおかげで、ブロックチェーンの最も古く、最も広く知られている使用法です。 彼らは、中央当局や政府の介入なしに、世界中の人々に安全で摩擦のないお金を提供します。
- Identity :デジタルIDは、現在の世界で急速に標準になりつつあります。 ただし、これはセキュリティの問題と改ざんによって損なわれます。 ブロックチェーンは、完全に安全で改ざんされないIDでこの領域に革命を起こすために避けられません。
- ヘルスケア:ヘルスケア業界にはデータが満載されており、ほとんどが中央当局によって処理されています。 これにより、そのようなデータを処理する際の透明性、セキュリティ、および効率が低下します。 ブロックチェーン技術は、非常に必要とされている信頼を提供するために、第三者なしでシステムを提供することができます。
- 政府:これはおそらく、ブロックチェーン技術による混乱に対して十分に開かれた領域です。 政府は通常、非効率性と汚職を抱えていることが多いいくつかの市民サービスの中心にあります。 ブロックチェーンは、はるかに優れた政府と市民の関係を確立するのに役立ちます。
7. 貿易の道具
ここでの基本的な実装は概念を引き出すのに役立ちますが、ブロックチェーン上で製品を最初から開発することは実用的ではありません。 ありがたいことに、このスペースは現在成熟しており、開始するのに非常に便利なツールがいくつかあります。
このスペース内で機能する人気のあるツールのいくつかを見てみましょう。
- Solidity :Solidityは、スマートコントラクトを作成するために設計された静的に型付けされたオブジェクト指向プログラミング言語です。 Ethereumなどのさまざまなブロックチェーンプラットフォームでスマートコントラクトを作成するために使用できます。
- Remix IDE :Remixは、Solidityでスマートコントラクトを作成するための強力なオープンソースツールです。 これにより、ユーザーはブラウザーから直接スマートコントラクトを作成できます。
- Truffle Suite :Truffleは、開発者を立ち上げ、分散アプリの開発を開始するための一連のツールを提供します。 これには、トリュフ、ガナッシュ、ドリズルが含まれます。
- Ethlint / Solium :Soliumを使用すると、開発者はSolidityで記述されたスマートコントラクトにスタイルやセキュリティの問題がないことを確認できます。 Soliumは、これらの問題の修正にも役立ちます。
- パリティ:パリティは、イーサリアムでのスマートコントラクトの開発環境のセットアップに役立ちます。 これは、ブロックチェーンと対話するための高速で安全な方法を提供します。
8. 結論
要約すると、このチュートリアルでは、ブロックチェーンテクノロジの基本的な概念について説明しました。 ネットワークがどのようにマイニングし、ブロックチェーンに新しいブロックを追加するかを理解しました。 さらに、Javaで基本的な概念を実装しました。 また、このテクノロジーに関連するいくつかの高度な概念についても説明しました。
最後に、ブロックチェーンのいくつかの実用的なアプリケーションと利用可能なツールで締めくくりました。
いつものように、コードはGitHubのにあります。