ここ数年の傾向を見ると、ブロックチェーンについてはよく耳にしますが、具体的な内容についてはあまり知られていません。
ビットコイン、イーサリアム、ドージコイン、マティックなどの暗号通貨がブロックチェーン技術に依存していることは誰もが知っています。 ブロックチェーンは、2021 年に多くの業界に革命をもたらし、新たな成果への道を切り開く重要なイベントを主導しました。
ブロックチェーンは、編集、ハッキング、詐欺が困難または不可能な方法でデータを保存する手段です。 これは、ブロックチェーンのコンピューター システムのネットワーク全体に複製され、分散されるトランザクションのデジタル台帳です。
これは、事実上すべての暗号通貨を強化する画期的なデータベース テクノロジーです。 ブロックチェーンにより、データベースの同一のコピーがネットワーク全体に分散されるため、システムのハッキングや不正行為が非常に困難になります。
現在、ビットコインはブロックチェーンの最も顕著な用途ですが、このテクノロジーは非常に幅広い用途に使用できます。
暗号通貨とブロックチェーンは近年ますます人気が高まっており、この傾向は今後も続くと予想されます。
このチュートリアルでは、JavaScript を使用して簡単なブロックチェーンを作成します。 ブロックチェーンがどのように機能するかについての基本的な理解を提供します。
それを MelodyCoin と名付けて、すぐにアクションを始めましょう!
ブロックの作成
まず、すべてのコードを配置する新しい JavaScript ファイルを作成します。
これを main.js と呼び、ブロックチェーンとブロックがどのように見えるべきかの説明から始めましょう。
Block クラスを作成し、まず関数 Object() { [ネイティブ コード] } を与えます。
新しいブロックを作成するときは、日付と前のブロックのハッシュを指定する必要があります。
各プロパティの定義は次のとおりです。
- タイムスタンプは、ブロックがいつ作成されたかを示します。 選択した形式 (この場合は UNIX タイムスタンプ) を使用できます。
- このブロックに接続したい任意の形式のデータを data パラメーターに含めることができます。 暗号通貨を作成したい場合は、送信者/受信者や移動した金額などの取引データをここに保管できます。
- previousHash は、前のブロックのハッシュを保持する文字列です。 これはブロックのチェーンを生成するものであり、これは後でブロックチェーンの整合性を提供する上で重要になります。
ハッシュの作成
各ブロックは前のブロックにリンクします (したがって、previousHash プロパティ)。 つまり、各ブロックにはハッシュが必要です。 ハッシュは指紋に似ています。 ブロックごとに異なります。
ブロックのハッシュは、そのすべての内容をハッシュ関数に渡すことによって計算できます。
そこで、現在のブロックのハッシュを計算する関数を実装することから始めましょう。
したがって、Block クラスの下で、calculateHash 関数を定義します。
ただし、SHA256 ハッシュは JavaScript ではサポートされていないため、外部ライブラリから取得する必要があります。
Crypto-js は、いくつかのハッシュ アルゴリズムの安全な実装が含まれる素晴らしいパッケージです。
次に、それを main.js コードにインポートできます。
これで、calculateHash() 関数ができたので、それをブロックの関数で使用してみましょう。
ブロックがどのようなものかを説明した後、ブロックチェーンがどのようなものであるべきかを定義できます。 それでは、新しいクラスを作成しましょう。
このシナリオでは、ブロックチェーンはプロパティ チェーンを持つ非常に単純なオブジェクトです。 これは、チェーン上のすべてのブロックを保持する配列です。
ブロックを追加する前に、まず「ジェネシス ブロック」と呼ばれるものを作成する必要があります。 これはチェーンの最初のブロックであり、前のブロック (最初のブロックです) を指すことができないという点で独特です。
そこで、ジェネシス ブロックを構築するために、createGenesisBlock () という名前の関数をクラスに追加します。 Blockchain クラスの関数 Object() { [ネイティブ コード] } に戻ります。
新しいブロックチェーン インスタンスを構築するときはいつでもジェネシス ブロックを含めることができるようになりました。
ブロックチェーンの手法
次に、新しいブロックの追加や最新のブロックのフェッチなどを実行できるメソッドを Blockchain クラスに追加しましょう。
getlatestBlock 関数は最も基本的な関数です。 単純にチェーン配列の最後のメンバーを返します。
addBlock テクニックはもう少し複雑です。
新しいブロックをチェーンに追加する前に、まずそのブロックのpreviousHashフィールドを適切に設定する必要があります。
これは、チェーンに最後に追加されたブロックのハッシュに設定する必要があります。 新しいブロックのハッシュを計算する必要もあります。
テスト
MelodyCoin がどのように出てきたかを見てみましょう。
これを実現するには、ブロックチェーン インスタンスを作成します。 さらにいくつかのブロックを追加しましょう。
そこに XNUMX つの新しいブロックを作成しました。 私たちのブロックチェーンが現在どのようになっているのかを覗いてみましょう。
MelodyCoin は文字列化され、XNUMX つのスペースでフォーマットされます。
ブロックチェーンの整合性を検証する
ブロックチェーンが優れているのは、ブロックが追加されると、チェーンの残りの部分を無効にしない限り変更できないためです。
ただし、この実装ではブロックチェーンの整合性をチェックする方法がありません。
isChainValid 関数をブロックチェーンに導入しましょう。 チェーンが正当な場合は true を返します。 それ以外の場合は false を返します。
完全性のテスト
ブロックチェーンの完全性をテストできるようになりました。 今すぐ実行すると、チェーンが本物であることが確認されます。
次に、ブロックチェーンを改ざんしてみましょう。 ブロック 2 を変更して、その内容を上書きしましょう (100 枚ではなく XNUMX 枚のコインを転送したとします)。
これを実行すると、ソフトウェアがチェーンを改ざんしようとしたことを認識していることがわかります。
しかし、私がこれに干渉する別の方法があると信じていただいて構いません。 ブロック内の内容を変更しましたが、ハッシュを再計算しませんでした。 したがって、賢明になって同じブロックのハッシュを再計算してみてください。
私たちの小さなブロックチェーンのセットアップはこれですべてです。 これにより、新しいブロックを追加し、チェーン内のデータの改ざんを検出できるようになります。
私たちの小さなブロックチェーンには、対処しなければならない問題が XNUMX つあります。
- 現代のコンピューターは非常に高速で、数秒で数千のブロックをチェーンに追加できます。 私たちは明らかに、誰かが私たちのブロックチェーンにスパムを送信することを望んでいません。
- 私たちのブロックチェーンは依然として改ざんに対して脆弱です。 ブロックの内容を更新してから、後続のすべてのブロックのハッシュ (および以前のハッシュ) を再計算するだけです。 いじっても、最終的には正当なチェーンができてしまいます。
これらの懸念に対処するために、ブロックチェーンは「プルーフ・オブ・ワーク」として知られる技術を使用します。 このアプローチを使用してブロックを作成するには、大量の計算リソースを使用したことを証明する必要があります。 これはとも呼ばれます 鉱業.
Proof-of-Work では、ブロックのハッシュが特定の量のゼロで始まる必要があります。 しかし、ハッシュがこのルールに適合するかどうかをどうやって知ることができるでしょうか?
ブロックの内容によってそのハッシュが決まります。 したがって、内容を変更しない限り、常に同じハッシュを取得します。
解決策として、各ブロックに nonce 値を追加する必要があります。 これは基本的に、ブロックのハッシュが十分なゼロで始まるまで更新できるランダム データです。 ハッシュ関数の出力を変更することはできないため、さまざまな組み合わせを数多くテストし、最善の結果を期待する必要があります。
ブロックチェーンにマイニングを導入する
Block クラスに nonce を含めることから始めましょう。 nonce は、ブロックのハッシュに影響を与えるために変更できるブロック内の単一の値です。
タイムスタンプやデータを変更することはできません。
次に、ブロックの実際のマイニングを行う MineBlock() 関数を作成しましょう。 この関数は必要な難易度をパラメータとして送信し、ブロックのハッシュが十分なゼロで始まるまで実行を続けます。
ハッシュが十分なゼロで始まるまで実行される基本的な while ループを作成しました。 難易度を使用して、必要なゼロの数を決定します。 難易度が 5 の場合、ハッシュは 5 つのゼロで始まる必要があります。
ハッシュに十分なゼロが含まれていない場合は、ノンスを XNUMX つ増やしてハッシュを再計算します。 そして、難易度に対応するハッシュが見つかった場合は、それをコンソールに記録します。
もう一つやらなければならないことがあります。 CalculateHash メソッドでは nonce 変数を実際には考慮していないため、次のようになります。
ブロックチェーンクラス
この新しいアプローチをブロックチェーン クラスにテストして、どうなるかを見てみましょう。
まず、関数 Object() でブロックチェーンの難易度を定義します。 後でどこかで使用できるため、ここで定義します。
次に、ブロックをチェーンに追加する前にブロックをマイニングするように addBlock 関数を変更する必要があります。
ブロックチェーンを使用する
それでは、新しいブロックチェーンをproof-of-workアルゴリズムで使用してみましょう。 ここで、いくつかの console.log ステートメントを追加します。
このコードを実行すると、マイニング プロセスがそれほど高速ではなくなっていることがわかります。
アルゴリズムが XNUMX つのゼロで始まるハッシュを含むブロックを生成するまでには時間がかかります (難易度によって構成されます)。
これで基本的なブロックチェーンのセットアップは終わりました。
プルーフ・オブ・ワーク・メカニズムのおかげで、新しいブロックがブロックチェーンに追加される速度を調整できます。
これはブロックチェーンにおける最も重要なセキュリティ機能です。 これがどのように機能するかを理解したので、独自のものを作成してみましょう。
コメントを残す