---
title: "ブロックチェーンのデータストレージ戦略"
description: "ブロックチェーンを使用してデータを保存する方法はいくつかあります。この記事では、さまざまな戦略、そのコストとトレードオフ、および安全に使用するための要件を比較します。"
lang: ja
---

情報をブロックチェーンに直接保存する方法、またはブロックチェーンによって保護される方法で保存する方法は複数あります。

- EIP-4844のblob
- コールデータ
- L1メカニズムを備えたオフチェーン
- コントラクトの「コード」
- イベント
- EVMストレージ

どの方法を使用するかの選択は、いくつかの基準に基づいています。

- 情報のソース。コールデータ内の情報は、ブロックチェーン自体から直接取得することはできません。
- 情報の宛先。コールデータは、それを含むトランザクションでのみ利用可能です。イベントはオンチェーンではまったくアクセスできません。
- どの程度の手間が許容されるか。本格的なノードを実行するコンピューターは、ブラウザで実行されるアプリケーションのライト・クライアントよりも多くの処理を実行できます。
- すべてのノードから情報への簡単なアクセスを容易にする必要がありますか？
- セキュリティ要件。

## セキュリティ要件 {#security-requirements}

一般的に、情報セキュリティは3つの属性で構成されます。

- _機密性_。許可されていないエンティティは情報を読み取ることができません。これは多くの場合重要ですが、ここでは当てはまりません。_ブロックチェーン上に秘密はありません_。ブロックチェーンは誰でも状態遷移を検証できるため機能しており、秘密を直接保存するために使用することは不可能です。機密情報をブロックチェーンに保存する方法はありますが、それらはすべて、少なくとも鍵を保存するために何らかのオフチェーンコンポーネントに依存しています。

- _完全性_。情報が正確であり、許可されていないエンティティによって、または許可されていない方法で変更されることはありません（たとえば、`Transfer`イベントなしで[ERC-20トークン](https://eips.ethereum.org/EIPS/eip-20#events)を転送するなど）。ブロックチェーン上では、すべてのノードがすべての状態変更を検証するため、完全性が保証されます。

- _可用性_。情報は、許可されたすべてのエンティティが利用できます。ブロックチェーン上では、これは通常、すべての[フル・ノード](https://ethereum.org/developers/docs/nodes-and-clients/#full-node)で情報を利用できるようにすることで実現されます。

ここでのさまざまなソリューションはすべて、ハッシュがレイヤー1 (L1)に投稿されるため、優れた完全性を備えています。ただし、可用性の保証は異なります。

## 前提条件 {#prerequisites}

[ブロックチェーンの基礎](/developers/docs/intro-to-ethereum/)について十分に理解している必要があります。また、このページは読者が[ブロック](/developers/docs/blocks/)、[トランザクション](/developers/docs/transactions/)、およびその他の関連トピックに精通していることを前提としています。

## EIP-4844のblob {#eip-4844-blobs}

[デンクンのハードフォーク](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/beacon-chain.md)以降、イーサリアムのブロックチェーンには[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844)が含まれており、これによりイーサリアムに有効期限が限られた（最初は約[18日間](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration)）データblobが追加されます。これらのblobは、同様のメカニズムを使用していますが、[実行ガス](/developers/docs/gas)とは別に価格設定されています。これらは一時的なデータを投稿するための安価な方法です。

EIP-4844のblobの主なユースケースは、ロールアップがトランザクションを公開するためです。[オプティミスティック・ロールアップ](/developers/docs/scaling/optimistic-rollups)は、ブロックチェーン上でトランザクションを公開する必要があります。ロールアップの[シーケンサー](https://docs.optimism.io/connect/resources/glossary#sequencer)が誤った状態ルートを投稿した場合に、[検証者](https://docs.optimism.io/connect/resources/glossary#validator)が間違いを修正できるように、これらのトランザクションは[チャレンジ期間](https://docs.optimism.io/connect/resources/glossary#challenge-period)中に誰でも利用可能である必要があります。

ただし、チャレンジ期間が過ぎて状態ルートがファイナライズ済みになると、これらのトランザクションを知る残りの目的は、チェーンの現在の状態を複製することになります。この状態はチェーンのノードからも利用でき、必要な処理ははるかに少なくなります。そのため、トランザクション情報は[ブロックエクスプローラー](/developers/docs/data-and-analytics/block-explorers)などのいくつかの場所に保存しておく必要がありますが、イーサリアムが提供するレベルの検閲耐性に対して料金を支払う必要はありません。

[ゼロ知識ロールアップ](/developers/docs/scaling/zk-rollups/#data-availability)も、他のノードが既存の状態を複製し、有効性証明を検証できるようにトランザクションデータを投稿しますが、これも短期的な要件です。

執筆時点では、EIP-4844への投稿には1バイトあたり1 Wei（10<sup>-18</sup> ETH）かかりますが、これは[blobを投稿するトランザクションを含む、あらゆるトランザクションにかかる21,000の実行ガス](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index)と比較するとごくわずかです。現在のEIP-4844の価格は[blobscan.com](https://blobscan.com/blocks)で確認できます。

いくつかの有名なロールアップによって投稿されたblobを確認するためのアドレスは次のとおりです。

| ロールアップ                               | メールボックスアドレス                                                                                                         |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| [オプティミズム](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) |
| [アービトラム](https://arbitrum.io/)     | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) |
| [Base](https://base.org/)            | [`0xFF00000000000000000000000000000000008453`](https://blobscan.com/address/0xFF00000000000000000000000000000000008453) |

## コールデータ {#calldata}

コールデータとは、トランザクションの一部として送信されるバイトを指します。これは、そのトランザクションを含むブロック内のブロックチェーンの永続的な記録の一部として保存されます。

これは、データをブロックチェーンに永続的に配置するための最も安価な方法です。1バイトあたりのコストは、4実行ガス（バイトがゼロの場合）または16ガス（その他の値）のいずれかです。データが圧縮されている場合（これは標準的な方法です）、すべてのバイト値が等しい確率で出現するため、平均コストは1バイトあたり約15.95ガスになります。

執筆時点では、価格は12 Gwei/ガスおよび2300ドル/ETHであり、これはコストが1キロバイトあたり約45セントであることを意味します。これはEIP-4844以前は最も安価な方法であったため、ロールアップがトランザクション情報を保存するために使用した方法です。この情報は[フォールトチャレンジ](https://docs.optimism.io/stack/protocol/overview#fault-proofs)に利用できる必要がありますが、オンチェーンで直接アクセスできる必要はありません。

いくつかの有名なロールアップによって投稿されたトランザクションを確認するためのアドレスは次のとおりです。

| ロールアップ                               | メールボックスアドレス                                                                                                               |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |
| [オプティミズム](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) |
| [アービトラム](https://arbitrum.io/)     | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) |
| [Base](https://base.org/)            | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) |

## L1メカニズムを備えたオフチェーン {#offchain-with-l1-mechs}

セキュリティのトレードオフによっては、情報を別の場所に置き、必要なときにデータを利用できるようにするメカニズムを使用することが許容される場合があります。これが機能するには、2つの要件があります。

1. <em>入力コミットメント</em>と呼ばれるデータの[ハッシュ](https://en.wikipedia.org/wiki/Cryptographic_hash_function)をブロックチェーンに投稿します。これは単一の32バイトのワードにすることができるため、高価ではありません。入力コミットメントが利用可能である限り、同じ値にハッシュされる他のデータを見つけることは現実的ではないため、完全性が保証されます。したがって、誤ったデータが提供された場合は、それを検出できます。

2. 可用性を保証するメカニズムを用意します。たとえば、[Redstone](https://redstone.xyz/docs/what-is-redstone)では、任意のノードが可用性チャレンジを送信できます。シーケンサーが期限までにオンチェーンで応答しない場合、入力コミットメントは破棄されるため、情報は投稿されなかったと見なされます。

状態ルートに対して少なくとも1人の誠実な検証者がいることにすでに依存しているため、これはオプティミスティック・ロールアップで許容されます。このような誠実な検証者は、ブロックを処理するためのデータがあることも確認し、情報がオフチェーンで利用できない場合は可用性チャレンジを発行します。このタイプのオプティミスティック・ロールアップは[プラズマ](/developers/docs/scaling/plasma/)と呼ばれます。

## コントラクトコード {#contract-code}

一度だけ書き込む必要があり、上書きされることがなく、オンチェーンで利用できる必要がある情報は、コントラクトコードとして保存できます。これは、データを含む「スマート・コントラクト」を作成し、[`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai)を使用して情報を読み取ることを意味します。利点は、コードのコピーが比較的安価であることです。

メモリ拡張のコストを除けば、`EXTCODECOPY`はコントラクトへの最初のアクセス（「コールド」な場合）に2600ガスかかり、同じコントラクトからの後続のコピーには100ガスに加えて32バイトのワードごとに3ガスかかります。1バイトあたり15.95かかるコールデータと比較すると、これは約200バイトから安くなります。[メモリ拡張コストの計算式](https://www.evm.codes/about#memoryexpansion)に基づくと、4MBを超えるメモリを必要としない限り、メモリ拡張コストはコールデータを追加するコストよりも小さくなります。

もちろん、これはデータを_読み取る_ためのコストにすぎません。コントラクトを作成するには、約32,000ガス + 200ガス/バイトかかります。この方法は、同じ情報を異なるトランザクションで何度も読み取る必要がある場合にのみ経済的です。

コントラクトコードは、`0xEF`で始まらない限り、無意味なものであってもかまいません。`0xEF`で始まるコントラクトは、はるかに厳しい要件を持つ[イーサリアム・オブジェクト・フォーマット](https://notes.ethereum.org/@ipsilon/evm-object-format-overview)として解釈されます。

## イベント {#events}

[イベント](https://docs.alchemy.com/docs/solidity-events)はスマート・コントラクトによって発行され、オフチェーンのソフトウェアによって読み取られます。
その利点は、オフチェーンのコードがイベントをリッスンできることです。コストは[ガス](https://www.evm.codes/#a0?fork=cancun)であり、375に加えてデータの1バイトあたり8ガスです。12 Gwei/ガスおよび2300ドル/ETHの場合、これは1セントに加えて1キロバイトあたり22セントに相当します。

## ストレージ {#storage}

スマート・コントラクトは[永続ストレージ](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory)にアクセスできます。ただし、これは非常に高価です。以前は空だったストレージスロットに32バイトのワードを書き込むと、[22,100ガスかかる](https://www.evm.codes/#55?fork=cancun)可能性があります。12 Gwei/ガスおよび2300ドル/ETHの場合、これは書き込み操作1回あたり約61セント、または1キロバイトあたり19.5ドルになります。

これは、イーサリアムで最も高価な形式のストレージです。

## まとめ {#summary}

この表は、さまざまなオプション、その長所と短所をまとめたものです。

| ストレージタイプ                | データのソース      | 可用性の保証                                                                                                             | オンチェーンの可用性                                             | 追加の制限事項                                                  |
| --------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------- |
| EIP-4844のblob              | オフチェーン            | [約18日間](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration)のイーサリアムによる保証 | ハッシュのみ利用可能                                           |                                                                         |
| コールデータ                    | オフチェーン            | イーサリアムによる永久保証（ブロックチェーンの一部）                                                                                | コントラクトに書き込まれた場合、およびそのトランザクションでのみ利用可能 |
| L1メカニズムを備えたオフチェーン | オフチェーン            | チャレンジ期間中の「1人の誠実な検証者」による保証                                                                        | ハッシュのみ                                                        | チャレンジメカニズムによって保証され、チャレンジ期間中のみ |
| コントラクトコード               | オンチェーンまたはオフチェーン | イーサリアムによる永久保証（ブロックチェーンの一部）                                                                                | はい                                                              | 「ランダム」なアドレスに書き込まれ、`0xEF`で開始することはできない                 |
| イベント                      | オンチェーン             | イーサリアムによる永久保証（ブロックチェーンの一部）                                                                                | いいえ                                                               |
| ストレージ                     | オンチェーン             | イーサリアムによる永久保証（ブロックチェーンの一部、および上書きされるまでの現在の状態）                                        | はい                                                              |