ブロックチェーンにおけるCommit-Reveal Schemeとは?

初級編Nov 22, 2023
分散型デジタルトランザクションのプライバシーとセキュリティを向上させるブロックチェーンのイノベーションであるCommit-Revealメソッドについて学びます。
ブロックチェーンにおけるCommit-Reveal Schemeとは?

ブロックチェーン技術は、コンセンサス、セキュリティ、プライバシーを実現するための革新的なアプローチをもたらします。 そのようなイノベーションの1つが、ブロックチェーンユーザーのプライバシーとセキュリティを強化する暗号化プロトコルであるコミットリビールスキームです。 このコースを進むにつれて、Commit-Revealスキームが分散型デジタルドメインにもたらす信頼、透明性、イノベーションの層を明らかにします。 この記事の各モジュールは、Commit-Reveal スキーム、その実装、およびブロックチェーンのランドスケープへの影響を包括的に理解できるように細心の注意を払って作成されています。

ブロックチェーンとは?

ブロックチェーンの核心は、ひねりを加えたデジタル台帳のようなものです。 従来の台帳とは異なり、分散型であるため、単一のエンティティがブロックチェーン全体を制御できず、ネットワークの一部である人なら誰でもアクセスできます。 ブロックチェーンの各「ブロック」には、トランザクションのリストが含まれています。 ブロックがトランザクションでいっぱいになると、新しいブロックが形成され、ブロックの接続された「チェーン」が作成されます。

ブロックチェーンの輝かしい特徴の1つは、信頼性と透明性を重視していることです。 ネットワーク内の誰もがブロックチェーン上のすべてのトランザクションにアクセスし、閲覧することができます。 このオープンさは、不正を阻止し、コミュニティ間の信頼を育みます。 このようなレベルの透明性をどのように実現しているのか、疑問に思われるかもしれません。 その答えは、独自のコンセンサスメカニズムと暗号の原則にあり、このコースを進めながら掘り下げていきます。

Commit-Reveal スキームの概要

ブロックチェーンとは何かを理解したところで、ブロックチェーンに特別なフレーバーであるCommit-Revealスキームを導入しましょう。 これは、マジシャン(ユーザー)が視聴者(ネットワーク)に明かさずに最初に特定の行為にコミットし、後の段階でその行為を披露するマジックショーのようなものです。 ブロックチェーンの用語では、これは「コミットフェーズ」と「公開フェーズ」の2段階のプロセスです。

コミットフェーズでは、ユーザーは自分の情報のハッシュ化されたバージョンをブロックチェーンに送信します。 このハッシュ化されたバージョンは、実際のコンテンツを隠す元の情報のスクランブルバージョンのようなものです。 ハッシュ関数の魔法は、それが一方通行であることです。ハッシュを元の形式に戻すことはできないため、当面の間、情報は秘密にされます。 次に、公開フェーズが始まり、ユーザーが元の情報を公開し、それを再度ハッシュし、一致する場合は最初にコミットされたハッシュと比較することで、ネットワークによって検証されます。 ネットワークが暴露を確認し、手品が完成します。

Commit-Revealスキームを通じて、ブロックチェーンネットワークは、オークションや投票システムなどのアプリケーションにおいて、新しいレベルのエンゲージメントを達成することができますが、これについては今後のモジュールで詳しく説明します。

コミット フェーズ

Commit-Reveal スキームの深みに足を踏み入れるとき、最初に立ち寄るのは「コミット フェーズ」です。 このフェーズでは、ユーザーは特定の値に「コミット」しますが、実際の値を秘密にしておく方法で行われます。 秘密の番号を念頭に置いているのに、それが何であるかを全員に伝える代わりに、鍵のかかった箱に入れて全員に見せると想像してみてください。 彼らはあなたが番号を持っていることを知っていますが、それが何であるかは知りません。 それがブロックチェーンにおけるコミットのすべてです!

では、どのようにして秘密の価値を隠すのでしょうか? ブロックチェーンの世界では、ハッシュ関数と呼ばれるものを使ってこれを行います。 ハッシュ関数は魔法のブレンダーのようなものです。 秘密の値を入力すると、ハッシュと呼ばれるスクランブルされたバージョンが吐き出されます。 このハッシュは一意です。元の値をわずかに変更しただけでも、大きく異なるハッシュが作成されます。 その利点は、それが一方向のプロセスであることです - 値がハッシュ化されると、ハッシュから元の値を見つける簡単な方法はありません。 つまり、ユーザーが自分の価値をコミットするとき、実際に行っていることは、ブロックチェーン上のすべての人と価値のハッシュを共有することです。

公開フェーズ

コミットフェーズで盛り上がったサスペンスが終わったら、いよいよ大公開です! 公開フェーズでは、コミットされた価値が最終的にブロックチェーン上のすべての参加者に公開されます。 鍵のかかった箱の例えに戻ると、これは箱が開けられた瞬間であり、誰もがあなたが隠していた数字を見ることができます。 ブロックチェーンの世界では、公開は単純ですが、さまざまなアプリケーションで透明性と公平性を提供する重要なプロセスです。

ユーザーがコミットされた値を公開すると、ネットワークは公開された値をハッシュ化し、コミットフェーズ中に共有された元のハッシュと比較することで、その信頼性を簡単に検証できます。 ハッシュが一致すると、ユーザーが途中で気が変わっていないことが確認されます。 このシンプルかつ強力な検証プロセスは、誰もがルールに従ってプレイする信頼できる環境を維持するのに役立ちます。 これは、試合に審判がいて、すべてのプレーヤーが合意された条件を順守するようなものです。

スマートコントラクトでのCommit-Revealの実装

Commit-Revealスキームの魔法を解き明かしたところで、スマートコントラクトを通じてブロックチェーンの世界でどのように実現するかを見てみましょう。 スマートコントラクトは従来の契約と似ていますが、デジタルで自己実行型です。 すべての当事者が契約を守ることを自動的に保証する公平なロボットを想像してみてください、そしてあなたはスマートコントラクトのアイデアを思いつきます。 これは、Commit-Reveal の理論的なアイデアをデジタル領域で実用化するツールです。 スマートコントラクトを介してCommit-Revealスキームを実装することは、各ステップが設定されたリズムに従うダンスの振り付けのようなものです。 この振り付けを順を追って見ていきましょう。

契約の作成

まず、イーサリアムのようなブロックチェーンプラットフォームでスマートコントラクトを作成します。 このコントラクトには、コミット/リビールスキームのエンゲージメントルールがエンコードされています。

Commit 関数

スマートコントラクト内でコミット関数を設計します。 この関数により、ユーザーはハッシュ化された値(コミットフェーズ)をコントラクトに送信できます。

コミットされた値の保存

ユーザーが値をコミットすると、スマートコントラクトはこれらのハッシュをブロックチェーンに安全に保存し、公開フェーズを待ちます。

表示機能

次に、スマートコントラクト内で、reveal 関数を作成します。 時が来れば、この機能により、ユーザーは元の値を明らかにすることができます。

検証と妥当性確認

公開すると、スマートコントラクトは、公開された値をハッシュ化し、最初にコミットされたハッシュと比較することで検証します。 すべてが一致すると、公開が検証されます。

終了

すべての公開が収集され、検証されると、スマートコントラクトは、投票の集計、オークションの落札者の決定、またはその他のアプリケーション固有のアクションなど、次のステップを自動的に実行することができます。

監査とテスト

デプロイする前に、スマートコントラクトを徹底的にテストして、意図したとおりに動作し、潜在的なエクスプロイトから保護されていることを確認します。 これらのステップを通じて、スマートコントラクトはCommit-Revealダンスを調整し、公正で透明性の高いプロセスを確保します。

コード例

SPDX-ライセンス識別子: MIT

プラグマの堅実さ^0.8.0;

契約 CommitReveal {

struct コミット {

    bytes32 hash;

    bool revealed;

}

mapping(address => Commit) public commits;

mapping(address => uint256) public revealedValues;

commit 関数を使用すると、ユーザーはハッシュ値を送信できます

function commit(bytes32 _hash) public {

    require(commits[msg.sender].hash == 0, "Already committed");

    commits[msg.sender].hash = _hash;

}

表示機能を使用すると、ユーザーは元の値を公開できます

関数 reveal(uint256 _value, string memory _salt) public {

    require(commits[msg.sender].revealed == false, "Already revealed");

    require(keccak256(abi.encodePacked(_value, _salt)) == commits[msg.sender].hash, "Hashes don't match");

    commits[msg.sender].revealed = true;

    revealedValues[msg.sender] = _value;

}

投票を集計できるファイナライズ関数の例

function tallyVotes() public view returns (uint256) {

uint256合計投票= 0;

for (address addr = address(0); addr < address(-1); addr++) {

if (commits[addr].revealed) {

            totalVotes += revealedValues[addr];

        }

    }

totalVotesを返します。

}

コントラクトの状態を監査する関数 (あくまでも例であり、大規模なデータセットでは実用的ではありません)

function audit() public view returns (mapping(address => uint256) memory) {

    return revealedValues;

}

 }

説明:

  • 契約の作成: CommitReveal コントラクトが作成されます。
  • commit 関数: commit 関数は、ハッシュ値 (_hash) を受け取り、送信者のアドレスに対して格納します。
  • コミットされた値の格納: ハッシュされた値は、コミットと呼ばれるマッピングに格納されます。
  • 表示機能: 表示機能を使用すると、ユーザーは元の値 (_value) とソルト (_salt) を送信できます。 これらのハッシュが最初にコミットされたハッシュと一致するかどうかをチェックします。
  • 検証と妥当性確認: これは、reveal 関数内でハッシュを比較することによって行われます。
  • 終了: tallyVotes 関数は、投票の集計方法の簡略化された例です。 これは、すべての可能なアドレスを反復処理し (大規模なデータセットでは実用的ではありません)、明らかになった値を合計します。
  • 監査とテスト: audit 関数は、コントラクトの状態を確認する方法の非常に単純な例です。

これは非常に単純化された例であり、運用システムに必要な多くの実用的な考慮事項 (オーバーフローの防止、ガス使用量の最適化、大規模なデータセットの管理、適切なアクセス制御の追加など) が欠けています。 特にファイナライズ関数は、すべての可能なアドレスを反復処理するため実用的ではなく、実際のシナリオでは異なる設計が必要になります。 このコードは、運用環境に対応したソリューションではなく、出発点および教育ツールとして意図されています。

ブロックチェーンにおけるCommit-Revealスキームのユースケース

オークションプラットフォームの強化

オンラインオークションは、Commit-Revealスキームの典型的なアプリケーションの1つです。 他の人が入札額をレバレッジとして使用するのを防ぐために、参加者はコミットフェーズ中に秘密裏に入札を送信できます。 入札期間が終了すると、公開フェーズが開始され、参加者は入札を開示できます。 最高入札額が決定され、公正で競争力のあるオークションプロセスが保証されます。

公正な投票システムの構築

投票システムは、特に有権者に匿名性と誠実さを要求するシナリオにおいて、Commit-Reveal スキームから大きな恩恵を受けることができます。 この設定では、選挙や投票イベント中、投票者はコミットフェーズで自分の選択を他人に明かすことなくコミットし、投票の完全性と秘密性を確保します。 投票期間が終了すると、公開フェーズが開始され、投票者は投票を開示できます。 その後、これらを集計して結果を決定し、公正で透明性の高い投票プロセスを促進します。

封印された入札契約

封印された入札契約では、入札者はCommit-Revealスキームを使用して隠された入札を提出します。 このプロセスにより、入札者が他の入札者の意見を知ることがなくなり、公正な競争が促進されます。 入札提出期間が過ぎると、公開フェーズが発生し、最も優れたオファーを提示した適格な入札者に契約が授与されます。

ゲームシナリオ

Commit-Reveal スキームは、じゃんけんのデジタル版など、ゲーム内のシナリオで楽しいアプリケーションを見つけます。 プレイヤーは自分の選択を明かさずにコミットし、公平なゲームを保証します。 両方のプレイヤーがコミットすると、公開フェーズが続き、行われた選択に基づいて勝者が決定されます。

フロントランニングの問題の軽減

ブロックチェーン環境では、フロントランニングが懸念され、悪意のあるアクターが保留中のトランザクションの知識から利益を得る可能性があります。 Commit-Revealスキームは、最初にトランザクションの詳細を隠すことで、このような問題を軽減するのに役立ちます。 公開フェーズが近づく頃には、悪意のあるアクターが情報に基づいて行動するには遅すぎるため、トランザクションの整合性が保たれます。

低レイテンシのコミット&リビールアーキテクチャ

F3B などの新しいアーキテクチャは、従来の Commit-Reveal スキームに関連する オーバーヘッドを削減するために進化 しました。 F3Bは、ブロックチェーンへのデータ書き込みを最小限に抑え、低レイテンシーのCommit-and-Revealアーキテクチャを提供します。 この開発は、Commit-Reveal スキームの継続的な最適化と革新を意味し、実際のアプリケーションに対してより効率的になるという点で注目に値します。

乱数生成

ブロックチェーン環境では、ブロックチェーンプロトコルの決定論的な性質により、乱数の生成が困難な場合があります。 Commit-Revealスキームは、イーサリアムブロックチェーン上で乱数を生成するための分散型の代替手段として機能します。 たとえば、Commit-Reveal RNGの実装であるRandaoは、公開データフィードを利用し、乱数生成への参加を奨励します。

結論

Commit-Revealスキームの興味深い考察が終わりに近づくにつれ、このシンプルだが強力なメカニズムがブロックチェーンアプリケーションの信頼性とオープン性の構築にどのように役立つかを検討することが重要です。 ブロックチェーン技術が、オークションを公正にし、投票システムを誠実にし、ゲームシナリオをよりクリエイティブにすることで、多くの分野をどのように変えることができるかを、Commit-Revealスキームで垣間見ることができました。 旅はここで終わりではありません。ブロックチェーン技術の絶え間なく進化する性質は、探求すべき新しい地平を提示します。 このコースで習得した知識を身に付けることで、ブロックチェーンをより深く掘り下げ、その無限の可能性を探求し、透明で公正で分散型のデジタルの未来の形成に貢献することができます。

Auteur : Piero
Traduction effectuée par : Cedar
Examinateur(s): Matheus、Edward、Ashley He
* Les informations ne sont pas destinées à être et ne constituent pas des conseils financiers ou toute autre recommandation de toute sorte offerte ou approuvée par Gate.io.
* Cet article ne peut être reproduit, transmis ou copié sans faire référence à Gate.io. Toute contravention constitue une violation de la loi sur le droit d'auteur et peut faire l'objet d'une action en justice.
Lancez-vous
Inscrivez-vous et obtenez un bon de
100$
!
Créer un compte