ブロックチェーンのしくみ

完了

ブロックチェーンの基礎を学んだので、次はその背後にあるしくみを見ていきましょう。 この情報に基づいて、ブロックチェーンが実際のシナリオに適しているかどうかを判断できます。

データの分散方法

このシナリオには複数の会社が登場します。 乳製品加工会社で、集中管理されたデータベースを設けようとしていました。 しかし、どの参加者も中央機関になることを希望していません。 ブロックチェーンの分散型台帳を使用する可能性が生じました。 ブロックチェーンを使用すると、中央機関が不要になります。 また、ブロックチェーン ノードを持つ各参加者が台帳のコピーを持つことになるため、それぞれに独自の監査と自社システムとの統合を実施できます。 ただし、各社が独自のノードを持つことは必須ではありません。 ノードはパートナー間で共有できます。

各ノードは、ブロックチェーン ネットワークを使用して他のノードに接続されます。 たとえば、Dalia Pelayo 農場、アイスクリーム工場、アイスクリーム ショップにはそれぞれ、独自に管理しているノードがあります。 Contoso West と Contoso East は、同じ親会社を持つ別個のパートナーです。 Contoso には 1 つのノードがあります。 ノードと会社の関係は、必ずしも 1 対 1 でなくてもかまいません。

Several participant blockchain nodes connected by a network.

状態の変更

ブロックチェーン内のデータは状態を表します。 これが、暗号通貨などのデジタル トークンがブロックチェーンに適している理由です。 有形通貨の所有権について考える場合、コインは一度に 1 人のポケットにしか入ることができません。 コインが自分のポケットにあれば、所有権の状態は自分自身です。 コインを友人に譲ると、状態は、コインを所有しているその友人に変わります。 このシナリオでは、出荷製品がサプライ チェーン内を移動します。 製品の責任は移転されなければなりません。 必要なデータは、責任者、温度、そして製品がコンプライアンスに従っているかどうかです。

ブロックチェーンの場合、トランザクションを使用してデータの状態をある値から別の値に変更します。 たとえば、アイスクリームが凍結温度以下で保管されているかどうかを知っておく必要があります。 アイスクリームの出荷時には、温度センサーによって定期的に温度が報告されます。 報告される温度は、ブロックチェーン トランザクション ノードに送信されるトランザクションです。

Example transaction from an IoT temperature sensor. The transaction sets the temperature to -2° celsius in the ledger.

アイスクリームのシナリオでは、出荷製品がサプライ チェーン介して送られるとき、状態が変更されるたびにトランザクションが送信されます。 たとえば、図は、アイスクリーム工場への一般的な出荷のトランザクションを示しています。 各トランザクションでは、責任者または温度のいずれかが変更されます。 台帳の現在の状態は、順に適用されるトランザクションです。

List of transactions in order that change the responsible party and temperature. The combination of transactions result in a ledger state based on the order of transaction changes.

トランザクションを送信する際は、ブロックチェーン トランザクション ノードに送信します。 たとえば、Dalia Pelayo 農場が、Contoso West Shipping を使って牛乳の出荷製品を発送するとします。 Dalia Pelayo 農場の出荷システムは、ブロックチェーン ノードにトランザクションを送信します。 このトランザクションで、出荷の責任が農家から Contoso West Shipping へと更新されます。

A transaction from the farmer being sent to the farmer's blockchain node.

ブロックチェーンでは、ブロックチェーン ネットワーク全体にトランザクションが送信されます。 各ノードは、トランザクションのコピーを受け取ります。

A transaction being copied to all participant blockchain node peers.

トランザクションは各ノードで処理されますが、その場合もコンセンサス メカニズムによる検証が必要です。 コンセンサスにより、分散型台帳での一貫性と信頼が保たれます。

台帳のデータの一貫性を保つ方法

分散ネットワークではデータの変更がすべてのノードに対して行われる必要があるため、何が真実かを判断するのは困難です。 アイスクリーム工場のノードが出荷トランザクションを受け取らないとどうなるでしょうか。 牛乳が農場から出荷されたかどうかは、どのようにわかるのでしょうか。 運送会社の冷蔵トラックが故障し、牛乳が腐ってしまったらどうなるのでしょうか。 運送会社は、責任を逃れるために台帳を変更できるでしょうか。

ブロックチェーンでは、コンセンサス メカニズムを使用してすべてのブロックチェーン ノードにわたってデータを検証し、そのデータについて合意します。 コンセンサスにより、すべての分散ノードが同じ状態になることができます。 価値または責任が移転する場合は、順序が重要です。 たとえば、自動車の所有権を友人に譲った場合に、仕事仲間にも所有権を譲ることはできません。 この問題は二重支払い問題と呼ばれ、コンセンサスによって解決されます。 コンセンサスにより、トランザクションの正しい順序とブロックチェーンの整合性が保たれます。 コンセンサスの一環として、トランザクションのグループが 1 つのブロックとして検証されます。そのブロックをブロックチェーンに含めるかどうかについて、ネットワークで合意する必要があります。

Consensus mechanism agrees on validated transactions across nodes. Each blockchain node writes the latest validated block to the blockchain.

ブロックチェーン コンセンサス アルゴリズムには、Proof of Work、Proof of Stake、Proof of Authority など、いくつか存在します。 各アルゴリズムでは、一貫性の解決方法が異なります。 簡単に言うと、コンセンサスは、分散型台帳を共通の状態にするための手段です。

ブロックとは

ブロックは、トランザクション情報を格納する、ブロックチェーン内のデータのクラスターです。 通常、ブロック内のトランザクションの数は時間ベースになっています。 たとえば、次の図は、過去 10 分間に発生したトランザクションを含むブロックを示しています。

Example of several transactions representing a block. The order of transactions result in a given state.

コンセンサスにより、検証済みのブロックが各ノードのブロックチェーンに追加されます。 すべてのノードのチェーン内に同じブロックがあるため、ネットワーク全体で台帳は整合しています。 その結果、すべてのノードは、同じ検証済みデータを、合意された順序で持つことになります。

台帳の変更不可性を確保する方法

自身のノード内の台帳を制御できるとすると、自身が所有するコピーのデータを変更できると考えるでしょう。 どうしたらそれを変更不可にできるでしょうか。

ブロックチェーンでは、暗号ハッシュを使用してブロック間のリンクが作成されます。 ブロックをリンクすることで、コンセンサス アルゴリズムを通じてトランザクションの順序に対して合意を形成できます。 暗号ハッシュは、任意のサイズのデータを固定サイズのビット表現にマップするアルゴリズムです。 これはデジタル指紋と考えることができます。 ビットコインでは、SHA-256 ハッシュ アルゴリズムが使用されます。 100 ページのドキュメントで SHA-256 ハッシュ関数を使用した場合、関数の出力は 256 ビットのハッシュ値になります。 ドキュメント内の 1 つの文字だけを変更し、ハッシュを再生成すると、出力は別の 256 ビット ハッシュ値になります。 ここで、ブロックをハッシュ関数への入力として使用する場合について考えてみましょう。 出力は、ブロック内のデータを表す一意のハッシュ値です。

A block is sent through a hash function and a cryptographic hash is generated.

ブロックチェーンでは、ハッシュを使用してブロックに変更が加えられたかどうかを検出します。 次のブロックのハッシュを生成するときに前のブロックのハッシュ値を含めることで、ブロックはハッシュを介して連結されます。

A block includes the previous block's hash when generating it's hash. Including the previous hash links the blocks together.

ブロックチェーンでは、ハッシュを使用してデータ履歴が変更されていないことを証明し、信頼性を保証します。 新しいブロックの作成時に前のブロックのハッシュを含めることで、変更不可のトランザクション チェーンが順序に従って作成されます。

Three blocks linked together by the previous block's hash

チェーン内のいずれかのブロックが変更されると、後のブロックのハッシュが異なるものになります。 その結果、検証で不一致が検出されます。

信頼できるロジック

ブロックチェーンを使用すると、一貫性があり、信頼できるデータを格納できます。 各ノードで同じ処理を実行するロジックを追加するにはどうすればよいでしょうか。

このシナリオでは、ある参加者から別の参加者に製品の責任を移転するロジックが必要です。 また、IoT 温度センサーからのデータを使用して、温度が高すぎる場合にそれを把握することも必要です。

分散型アプリケーション (DApp) は、分散コンピューティング システム上のアプリケーションです。 このモジュールでは、Ethereum ブロックチェーン プロトコルの使用に重点を置いて説明します。 Ethereum の DApp はスマート コントラクトと呼ばれます。 スマート コントラクトには、トランザクションの一環として実行されるロジックが含まれています。 Ethereum では、Solidity というプログラミング言語を使用してそのロジックをプログラミングします。

スマート コントラクトはブロックチェーンに配置され、アドレスによって参照されます。 スマート コントラクトを使用するには、インスタンスを作成します。 スマート コントラクト インスタンスには、状態データとプログラム ロジックが含まれています。 このシナリオでは、スマート コントラクト インスタンスに、責任者である参加者、場所、製品の温度がコンプライアンス違反かどうかなどのデータが含まれます。 関数を実行すると、そのインスタンスに関して、責任を移転したり温度のテレメトリを受け取ったりすることができます。

Components of a smart contract include address, logic, and data.

製品の責任が別の当事者に移転すると、トランザクションが実行されます。 スマート コントラクト ロジックでは、状態データが更新されます。 このアイスクリームのシナリオでは、アイスクリーム工場の出荷システムによって、新しいアイスクリームの出荷用のスマート コントラクト インスタンスが作成されます。 工場の出荷システムにより、出荷の責任を Contoso East shipping に移転するための TransferResponsibility 関数を呼び出すトランザクションが送信されます。 ブロックチェーン ネットワークでは、トランザクションがすべてのノードに送信されます。 各ノードで、スマート コントラクト ロジックが実行されます。

A smart contract transaction is sent to one node and copied to the other peer nodes.

出荷中に冷蔵装置が故障し、アイスクリームの温度が凍結温度を超えた場合はどうなるでしょうか。 IoT 温度センサーではアイスクリームの温度が監視され、トランザクションが定期的に送信されます。 温度が凍結温度を超えている場合、スマート コントラクト ロジックによってその出荷製品に非準拠のマークが付けられます。

A smart contract transaction executes logic to set the shipment to out of compliance due to the temperature. The transaction is copied and executed on other peer nodes.

トランザクションはブロックのチェーンに含まれているので、出荷製品が非準拠になったときの変更不可レコードが存在します。 アイスクリーム ショップは、配送を拒否し、食の安全に関する問題を回避できます。

ブロック チェーンのデータと同じように、スマート コントラクトも変更できません。 いったん配置されたロジックは、変更できません。 そのため、スマート コントラクト ロジックでは常にすべてのノードで同じ処理が実行されると信頼できます。 コードを変更した場合、新しいアドレスに新しいスマート コントラクトを配置する必要があります。