イーサリアムとは何ですか? イーサリアムは新しいオープンなブロックチェーンプラットフォームであり、誰でもこのプラットフォーム上でブロックチェーン技術を利用した分散型アプリケーションを構築し、使用することができます。ビットコインと同様に、イーサリアムは誰にも管理されず、誰の所有でもありません —— それはオープンソースプロジェクトであり、世界中の多くの人々によって共同で作成されています。ビットコインプロトコルとは異なり、イーサリアムの設計は非常に柔軟で、適応性に富んでいます。イーサリアムプラットフォーム上で新しいアプリケーションを立ち上げるのは非常に簡単で、Homestead のリリースに伴い、誰でも安全にこのプラットフォーム上のアプリケーションを使用できるようになりました。
イーサリアム DApp 実践開発コースでは、分散型投票アプリケーション(Voting DApp)をコースプロジェクトとして、3 回の反復開発プロセスの詳細な説明を通じてオンライン実践を行います。また、ブロックチェーンの理念と分散型思想をコースの実践プロセス全体に貫通させ、ブロックチェーン開発に迅速に入門したい開発者に効率的な学習と価値向上の道を提供します。『イーサリアム DApp 開発実践入門』は後で書かれます。
チュートリアルには開発環境がプリセットされています。チュートリアルに入ると、各知識ポイントで即座に実践を行うことができ、開発環境の構築に時間を浪費する必要はありません:
イーサリアムホワイトペーパー中国語版 中本聡が 2009 年 1 月にビットコインブロックチェーンを開始したとき、彼は同時に世界に 2 つの未検証の革命的な新概念を導入しました。1 つ目はビットコイン(bitcoin)であり、資産担保、内在的価値、または中央発行者なしで価値を維持する分散型のピアツーピアのオンライン通貨です。これまでのところ、ビットコインは多くの公衆の注目を集めており、政治的な観点からは中央銀行のない通貨であり、激しい価格変動を伴っています。しかし、中本聡の偉大な実験にはビットコインと同等に重要な部分があります:作業証明に基づくブロックチェーンの概念は、人々が取引の順序について合意に達することを可能にします。アプリケーションとしてのビットコインは、先に申請した者(first-to-file)システムとして説明できます:もし誰かが 50BTC を持っていて、同時に A と B にこの 50BTC を送信した場合、最初に確認された取引のみが有効になります。どの取引が先に到着するかを決定する固有の方法はなく、この問題は分散型デジタル通貨の発展を何年も妨げてきました。中本聡のブロックチェーンは、最初の信頼できる分散型の解決策でした。現在、開発者たちの注目は、ビットコイン技術の第 2 の部分、ブロックチェーンが通貨以外の分野にどのように適用されるかに急速に移っています。よく言及されるアプリケーションには、チェーン上のデジタル資産を使用してカスタム通貨や金融ツール(カラードコイン)、特定の物理デバイスの所有権(スマートアセット)、ドメイン名のような代替不可能な資産(ドメインコイン)、分散型取引所、金融派生商品、ピアツーピアギャンブル、チェーン上のアイデンティティと信用システムなど、より高度なアプリケーションが含まれます。もう 1 つのよく尋ねられる重要な分野は「スマートコントラクト」であり、事前に任意に定められたルールに基づいてデジタル資産を自動的に移転するシステムです。たとえば、ある人が「A は毎日最大 X コインを引き出すことができ、B は毎日最大 Y コインを引き出すことができ、A と B は自由に引き出すことができ、A は B の引き出し権を停止できる」というストレージ契約を持っているかもしれません。この契約の論理的な拡張は、分散型自律組織(DAOs)です —— 長期的に組織の資産を含み、組織のルールをコーディングしたスマートコントラクトです。イーサリアムの目標は、内蔵された成熟したチューリング完全な言語を持つブロックチェーンを提供することであり、この言語を使用して任意の状態変換機能をコーディングする契約を作成できるようにします。ユーザーは数行のコードでロジックを実現するだけで、上記に言及したすべてのシステムや、私たちがまだ想像できない多くの他のシステムを作成できるようになります。
歴史的背景 分散型デジタル通貨の概念は、財産登録のような代替アプリケーションと同様に、数十年前から提案されていました。
1980 年代と 1990 年代の匿名電子現金プロトコルの大部分は、チャウム盲署名技術(Chaumian blinding)に基づいていました。これらの電子現金プロトコルは高いプライバシーを持つ通貨を提供しましたが、すべてのプロトコルは中央集権的な仲介機関に依存していたため、普及しませんでした。1998 年、ウェイ・ダイ(Wei Dai)の b-money は、計算上の難題を解決し、分散型合意を通じて通貨を創造するという考えを初めて導入しましたが、この提案は分散型合意を実現する具体的な方法を示しませんでした。
2005 年、ハル・フィンニー(Hal Finney)は「再利用可能な作業証明メカニズム」(reusable proofs of work)の概念を導入し、b-money の考えとアダム・バック(Adam Back)が提案した計算困難なハッシュキャッシュ(Hashcash)問題を使用して暗号通貨を創造しました。しかし、この概念は再び理想化に迷い込み、信頼できる計算をバックエンドとして依存していました。通貨は先に申請した者のアプリケーションであり、取引の順序が重要であるため、分散型通貨は分散型合意を実現する方法を見つける必要があります。ビットコイン以前のすべての電子通貨プロトコルが直面した主な障害は、セキュアなバイザンティン問題耐障害(Byzantine-fault-tolerant)マルチパーティ合意システムを作成する方法についての研究が数年にわたって行われたにもかかわらず、上記のプロトコルは問題の半分しか解決しなかったことです。これらのプロトコルは、システムのすべての参加者が知られていると仮定し、「N 人がシステムに参加する場合、システムは N/4 の悪意のある参加者に耐えられる」といった形式のセキュリティ境界を生成しました。しかし、この仮定の問題は、匿名の状況下では、システムが設定したセキュリティ境界がウィッチ攻撃にさらされやすいことです。攻撃者は 1 台のサーバーまたはボットネット上で数千のノードを作成し、単独で過半数のシェアを確保することができます。中本聡の革新は、非常にシンプルなノードベースの分散型合意プロトコルを作業証明メカニズムと組み合わせるというアイデアを導入したことです。ノードは作業証明メカニズムを通じてシステムに参加する権利を得て、10 分ごとに取引を「ブロック」にパッケージ化し、成長し続けるブロックチェーンを作成します。大量の計算能力を持つノードはより大きな影響力を持ちますが、ネットワーク全体よりも多くの計算能力を得ることは、100 万のノードを作成するよりもはるかに困難です。ビットコインのブロックチェーンモデルは非常に簡素ですが、実践的には十分に機能しており、今後 5 年間で、世界中の 200 以上の通貨とプロトコルの基盤となるでしょう。
状態変換システムとしてのビットコイン
技術的な観点から、ビットコインの台帳は状態変換システムと見なすことができ、このシステムにはすべての既存のビットコイン所有権の状態と「状態変換関数」が含まれています。状態変換関数は現在の状態と取引を入力として、新しい状態を出力します。たとえば、標準的な銀行システムでは、状態はバランスシートであり、A アカウントから B アカウントに X ドルを送金するリクエストは取引であり、状態変換関数は A アカウントから X ドルを減算し、B アカウントに X ドルを加算します。もし A アカウントの残高が X ドル未満であれば、状態変換関数はエラーメッセージを返します。したがって、状態変換関数を次のように定義できます:
APPLY(S,TX) > S’ or ERROR
上記の銀行システムにおける状態変換関数は次のようになります:
APPLY({ Alice: $50, Bob: $50 },”send $20 from Alice to Bob”) = { Alice: $30,Bob: $70 }
しかし:
APPLY({ Alice: $50, Bob: $50 },”send $70 from Alice to Bob”) = ERROR
ビットコインシステムの「状態」は、すでに採掘された未使用のビットコイン(技術的には「未使用の取引出力、unspent transaction outputs または UTXO」と呼ばれます)の集合です。各 UTXO には額面と所有者(20 バイトの本質的に暗号学的な公開鍵のアドレスによって定義されます [1])があります。取引は 1 つ以上の入力と 1 つ以上の出力を含みます。各入力には既存の UTXO への参照と、所有者アドレスに対応する秘密鍵によって作成された暗号学的署名が含まれます。各出力には新しい UTXO が状態に追加されます。
ビットコインシステムにおける状態変換関数 APPLY (S,TX)->S’は大まかに次のように定義できます:
- 取引の各入力:
-
参照されている UTXO が現在の状態(S)に存在しない場合、エラーメッセージを返します。
-
署名が UTXO の所有者の署名と一致しない場合、エラーメッセージを返します。
-
すべての UTXO 入力の額面の合計がすべての UTXO 出力の額面の合計よりも少ない場合、エラーメッセージを返します。
-
新しい状態 S’を返します。新しい状態 S’では、すべての入力 UTXO が削除され、すべての出力 UTXO が追加されます。最初のステップの最初の部分は、取引の送信者が存在しないビットコインを費やすのを防ぎ、2 番目の部分は取引の送信者が他人のビットコインを費やすのを防ぎます。2 番目のステップは価値の保存を確保します。ビットコインの支払いプロトコルは次のようになります。アリスがボブに 11.7BTC を送信したいと仮定します。実際、アリスは正確に 11.7BTC を持っているわけではありません。彼女が得られる最小のビットコインの額は:6+4+2=12 です。したがって、彼女は 3 つの入力と 2 つの出力を持つ取引を作成できます。最初の出力の額面は 11.7BTC で、所有者はボブ(ボブのビットコインアドレス)であり、2 番目の出力の額面は 0.3BTC で、所有者はアリス自身、つまりお釣りです。
マイニング#
信頼できる中央集権的なサービス機関があれば、状態変換システムは非常に簡単に実現できます。上記の機能を正確にコーディングするだけです。しかし、私たちはビットコインシステムを分散型の通貨システムとして構築したいと考えています。すべての人が取引の順序に同意することを確保するために、状態変換システムと合意システムを組み合わせる必要があります。ビットコインの分散型合意プロセスは、ネットワーク内のノードが取引を「ブロック」にパッケージ化しようとし続けることを要求します。ネットワークは約 10 分ごとに 1 つのブロックを生成するように設計されており、各ブロックにはタイムスタンプ、ランダム数、前のブロックへの参照(つまりハッシュ)、および前のブロックが生成されて以来に発生したすべての取引のリストが含まれています。こうして時間が経つにつれて、持続的に成長するブロックチェーンが作成され、常に更新され、ビットコイン台帳の最新の状態を表すことができます。
このパラダイムに従って、ブロックが有効かどうかを確認するアルゴリズムは次のとおりです:
-
ブロックが参照する前のブロックが存在し、有効であることを確認します。
-
ブロックのタイムスタンプが以前のブロックのタイムスタンプよりも遅く、かつ未来の 2 時間よりも早いことを確認します [2]。
-
ブロックの作業証明が有効であることを確認します。
-
前のブロックの最終状態を S [0] に割り当てます。
-
TX がブロックの取引リストであり、n 件の取引を含むと仮定します。0……n-1 に属するすべての i について、状態変換 S [i+1] = APPLY (S [i],TX [i]) を実行します。取引 i のいずれかが状態変換中にエラーが発生した場合、プログラムを終了し、エラーを返します。
-
正常に戻り、状態 S [n] はこのブロックの最終状態です。
本質的に、ブロック内の各取引は正しい状態変換を提供する必要があります。注意すべき点は、「状態」はブロックにコーディングされていないことです。それは純粋に検証ノードが記憶している抽象的な概念であり、任意のブロックについて、創世状態から始めて、順番に各ブロックの各取引を追加することで、現在の状態を(確実に)計算できます。また、マイナーが取引をブロックに含める順序にも注意が必要です。あるブロックに A、B の 2 つの取引があり、B が A によって作成された UTXO を使用している場合、A が B の前にある場合、このブロックは有効ですが、そうでない場合、このブロックは無効です。
ブロック検証アルゴリズムの興味深い部分は「作業証明」の概念です:各ブロックに SHA256 ハッシュ処理を行い、得られたハッシュを 256 ビットの数値として扱います。この数値は、絶えず動的に調整される目標数値よりも小さくなければなりません。本書執筆時の目標数値は約 2^190 です。作業証明の目的は、ブロックの生成を困難にし、ウィッチ攻撃者が悪意を持ってブロックチェーンを再生成するのを防ぐことです。SHA256 は完全に予測不可能な擬似ランダム関数であるため、有効なブロックを作成する唯一の方法は、単純に試行錯誤を繰り返し、ランダム数の値を増加させて、新しいハッシュ数値が目標数値よりも小さいかどうかを確認することです。現在の目標数値が 2^192 である場合、平均して 2^64 回の試行が必要になります。一般的に、ビットコインネットワークは 2016 ブロックごとに目標数値を再設定し、平均して 10 分ごとに 1 つのブロックを生成します。マイナーの計算作業に報酬を与えるために、成功裏に生成された各ブロックのマイナーは、ブロック内に自分自身に 25BTC を発行する取引を含める権利があります。また、取引の入力が出力を上回る場合、差額部分は「取引手数料」としてマイナーに支払われます。ちなみに、マイナーへの報酬はビットコインの発行の唯一のメカニズムであり、創世状態にはビットコインは存在しません。
マイニングの目的をより良く理解するために、ビットコインネットワークに悪意のある攻撃者が現れた場合に何が起こるかを分析してみましょう。ビットコインの暗号学的基盤は非常に安全であるため、攻撃者は暗号学的に直接保護されていない部分、つまり取引の順序を攻撃することを選択します。攻撃者の戦略は非常にシンプルです:
-
売り手に 100BTC を送信して商品を購入します(特に郵送を必要としない電子商品)。
-
商品が発送されるまで待ちます。
-
同じ 100BTC を自分のアカウントに送信する別の取引を作成します。
-
ビットコインネットワークを信じ込ませて、自分のアカウントに送信された取引が最初に発信されたものであるとします。
ステップ(1)が発生すると、数分後にマイナーはこの取引をブロックにパッケージ化します。仮にそれが第 270000 ブロックだとします。約 1 時間後、このブロックの後に 5 つのブロックが続き、それぞれのブロックがこの取引を間接的に指し示し、この取引を確認します。この時、売り手は代金を受け取り、買い手に商品を発送します。デジタル商品であると仮定すると、攻撃者は即座に商品を受け取ることができます。攻撃者は、同じ 100BTC を自分のアカウントに送信する別の取引を作成します。攻撃者がこのメッセージをネットワーク全体にブロードキャストするだけでは、この取引は処理されません。マイナーは状態変換関数 APPLY (S,TX) を実行し、この取引が現在の状態に存在しない UTXO を費やすことを発見します。したがって、攻撃者はブロックチェーンを分岐させ、第 269999 ブロックを親ブロックとして再生成し、第 270000 ブロックを新しい取引で置き換えます。ブロックデータが異なるため、作業証明を再度行う必要があります。また、攻撃者が生成した新しい第 270000 ブロックは異なるハッシュを持つため、元の第 270001 から第 270005 のブロックはそれを指し示さず、元のブロックチェーンと攻撃者の新しいブロックは完全に分離されます。ブロックチェーンが分岐する際、長い分岐が誠実なブロックチェーンと見なされ、合法的なマイナーは元の第 270005 ブロックの後でマイニングを続け、攻撃者は新しい第 270000 ブロックの後でのみマイニングを行います。攻撃者が自分のブロックチェーンを最長にするためには、彼以外の全ネットワークよりも多くの計算能力を持つ必要があります(つまり 51% 攻撃)。
マークルツリー
左:マークルツリー(Merkle tree)上の少数のノードを提供するだけで、分岐の正当性を示すのに十分です。右:マークルツリーの任意の部分を変更しようとする試みは、最終的にチェーン上のどこかに不一致を引き起こします。ビットコインシステムの重要なスケーラビリティ特性は、ブロックが多層のデータ構造に保存されることです。ブロックのハッシュは実際にはブロックヘッダーのハッシュであり、ブロックヘッダーはタイムスタンプ、ランダム数、前のブロックのハッシュ、およびすべてのブロック取引を格納したマークルツリーのルートハッシュを含む約 200 バイトのデータです。
マークルツリーは、葉ノードのセット、中間ノードのセット、およびルートノードから構成される二分木です。最下部の多数の葉ノードは基礎データを含み、各中間ノードはその 2 つの子ノードのハッシュであり、ルートノードもその 2 つの子ノードのハッシュから構成され、マークルツリーの頂点を表します。
マークルツリーの目的は、ブロックのデータを断片的に送信できるようにすることです:ノードは 1 つのソースからブロックヘッダーをダウンロードし、別のソースから関連するツリーの他の部分をダウンロードし、すべてのデータが正しいことを確認できます。これはハッシュの上方への拡散によるものです:悪意のあるユーザーがツリーの下部に偽造取引を追加しようとすると、引き起こされる変更はツリーの上層ノードの変更を引き起こし、さらに上層ノードの変更を引き起こし、最終的にルートノードの変更とブロックハッシュの変更を引き起こします。このように、プロトコルはそれをまったく異なるブロックとして記録します(ほぼ確実に不正な作業証明を伴う)。マークルツリーのプロトコルは、ビットコインの長期的な持続可能性にとって重要です。
2014 年 4 月、ビットコインネットワーク内のフルノード —— すべてのブロックのすべてのデータを保存し処理するノード —— は 15GB のメモリ空間を必要とし、さらに毎月 1GB 以上の速度で増加しています。現在、このストレージ空間はデスクトップコンピュータにとっては受け入れられますが、スマートフォンはこのような巨大なデータを処理できません。将来的には、商業機関や愛好者のみがフルノードとして機能するでしょう。簡素化された支払い確認(SPV)プロトコルは、別の種類のノードの存在を許可します。このようなノードは「ライトノード」と呼ばれ、ブロックヘッダーをダウンロードし、ブロックヘッダーを使用して作業証明を確認し、取引に関連するマークルツリーの「分岐」のみをダウンロードします。これにより、ライトノードは全体のブロックチェーンの一部をダウンロードするだけで、任意のビットコイン取引の状態とアカウントの現在の残高を安全に確認できます。他のブロックチェーンアプリケーションは、ブロックチェーンの思想を他の分野に適用するアイデアがすでに登場しています。
2005 年、ニック・サボ(Nick Szabo)は「所有権を財産に冠する」という概念を提案し、複製データベース技術の発展がどのようにブロックチェーンベースのシステムを土地所有権の登録に適用できるか、詳細なフレームワークを作成することを説明しました。しかし、残念ながら、その時点では実用的な複製データベースシステムが存在しなかったため、このプロトコルは実施されませんでした。しかし、2009 年にビットコインシステムの分散型合意が成功裏に開発されて以来、多くの他のブロックチェーンアプリケーションが急速に登場し始めました。
- ドメインコイン(namecoin)- 2010 年に作成され、分散型の名前登録データベースと呼ばれています。
Tor、Bitcoin、BitMessage のような分散型プロトコルは、他の人がユーザーと相互作用できるようにするためのアカウント確認方法を必要とします。しかし、すべての既存の解決策の中で唯一利用可能なアイデンティティ識別子は、1LW79wp5ZBqaHW1jL5TciBCrhQYtHagUWy のような擬似ランダムハッシュです。理想的には、人々は「george」のような名前を持つアカウントを持ちたいと考えています。しかし、問題は、誰かが「george」アカウントを作成できる場合、他の人も同様に「george」アカウントを作成して偽装できることです。唯一の解決策は先に申請した者の原則(first-to-file)であり、最初の登録者のみが成功裏に登録でき、2 番目の者は同じアカウントを再登録できません。この問題はビットコインの合意プロトコルを利用して解決できます。
ドメインコインは、ブロックチェーンを利用して名前登録システムを実現する最も早く、最も成功したシステムです。 - カラードコイン(Colored coins)- カラードコインの目的は、人々がビットコインブロックチェーン上で独自のデジタル通貨を作成すること、または、より重要な一般的な意味での通貨 —— デジタルトークンを提供することです。カラードコインプロトコルに従って、人々は特定のビットコイン UTXO に色を指定することで新しい通貨を発行できます。このプロトコルは、他の UTXO を取引入力 UTXO と同じ色として再帰的に定義します。これにより、ユーザーは特定の色の UTXO のみを保持し、これらの UTXO を送信することは通常のビットコインを送信するのと同じように、すべてのブロックチェーンを遡って受け取った UTXO の色を判断します。
- メタコイン(Metacoins)- メタコインの理念は、ビットコインブロックチェーン上で新しいプロトコルを作成し、ビットコインの取引を使用してメタコインの取引を保存しますが、異なる状態変換関数 APPLY’を使用します。メタコインプロトコルは、ビットコインブロックチェーン上の無効なメタコイン取引を防ぐことができないため、APPLY’(S,TX) がエラーを返す場合、このプロトコルはデフォルトで APPLY’(S,TX) = S とします。これにより、ビットコインシステムでは実現できない任意の高度な暗号通貨プロトコルを作成するための簡単な解決策が提供され、開発コストも非常に低くなります。なぜなら、マイニングとネットワークの問題はビットコインプロトコルによって処理されているからです。
したがって、一般的に、合意プロトコルを確立する方法は 2 つあります:独立したネットワークを構築するか、ビットコインネットワーク上にプロトコルを構築するかです。ドメインコインのようなアプリケーションは最初の方法を使用して成功を収めましたが、この方法の実施は非常に困難です。なぜなら、各アプリケーションは独立したブロックチェーンを作成し、すべての状態変換とネットワークコードを構築、テストする必要があるからです。また、分散型合意技術の適用はべき乗則分布に従うと予測されており、大多数のアプリケーションは自由なブロックチェーンのセキュリティを保証するには小さすぎることに注意しています。また、多くの分散型アプリケーション、特に分散型自律組織は、アプリケーション間の相互作用を必要とします。一方、ビットコインに基づくアプローチには欠点があります。それは、ビットコインが簡素化された支払い確認(SPV)の特性を継承していないことです。ビットコインは簡素化された支払い確認を実現できます。なぜなら、ビットコインはブロックチェーンの深さを有効性確認の代理として使用できるからです。ある時点で、取引の先祖が現在から十分に遠くなると、それらは合法的な状態の一部と見なされます。それに対して、ビットコインブロックチェーンに基づくメタコインプロトコルは、ブロックチェーンがメタコインプロトコルに準拠しない取引を含まないことを強制できません。したがって、安全なメタコインプロトコルの簡素化された支払い確認には、ブロックチェーンの初期点までさかのぼってすべてのブロックをスキャンして、特定の取引が有効であるかどうかを確認する必要があります。現在、すべてのビットコインベースのメタコインプロトコルの「ライト」実装は、信頼できるサーバーからデータを提供することに依存しており、これは主な目的の 1 つである信頼を排除するための暗号通貨にとっては、かなり劣った結果です。
スクリプト#
ビットコインプロトコルを拡張しなくても、ある程度の「スマートコントラクト」を実現できます。ビットコインの UTXO は、1 つ以上の公開鍵が所有でき、スタックベースのプログラミング言語で書かれたより複雑なスクリプトによって所有されることもあります。このモデルでは、このような UTXO を費やすには、スクリプトを満たすデータを提供する必要があります。実際、基本的な公開鍵所有権メカニズムもスクリプトを通じて実現されています:スクリプトは楕円曲線署名を入力として受け取り、取引とこの UTXO のアドレスを検証し、検証が成功すれば 1 を返し、そうでなければ 0 を返します。より複雑なスクリプトは、他の異なるアプリケーションシナリオに使用されます。たとえば、人々は 3 つの秘密鍵のうち 2 つを集めることを要求するスクリプト(マルチシグネチャ)を作成できます。これは企業アカウント、貯蓄アカウント、および特定の商業代理にとって非常に便利です。スクリプトは、計算問題を解決したユーザーに報酬を送るためにも使用できます。人々は「あなたが私に一定額のドージコインを送信したことを示す簡素化された確認支払い証明を提供できれば、このビットコイン UTXO はあなたのものです」というスクリプトを作成することさえできます。
本質的に、ビットコインシステムは異なる暗号通貨の分散型交換を許可します。しかし、ビットコインシステムのスクリプト言語にはいくつかの深刻な制限があります:
- チューリング完全性の欠如 – これは、ビットコインスクリプト言語がさまざまな計算をサポートできる一方で、すべての計算をサポートできないことを意味します。主な欠落はループ文です。
ループ文をサポートしない目的は、取引確認時に無限ループが発生するのを避けることです。理論的には、スクリプトプログラマーにとってこれは克服可能な障害ですが、任意のループは if 文を繰り返す方法でシミュレートできますが、これによりスクリプトの空間利用が非効率的になります。たとえば、代替の楕円曲線署名アルゴリズムを実装するには、256 回の繰り返し乗算が必要であり、各回ごとに個別にコーディングする必要があります。
- 価値盲(Value-blindness)。
UTXO スクリプトはアカウントの引き出し限度を細かく制御することができません。
たとえば、オラクル契約(oracle contract)の強力なアプリケーションの 1 つはヘッジ契約であり、A と B がそれぞれ 1000 ドルの価値を持つビットコインをヘッジ契約に送信し、30 日後にスクリプトが A に 1000 ドルの価値を持つビットコインを送信し、B に残りのビットコインを送信します。ヘッジ契約を実現するには、オラクル(oracle)がビットコインの価値を決定する必要がありますが、現在の完全に中央集権的な解決策と比較して、このメカニズムは信頼とインフラストラクチャの面で大きな進歩を遂げています。しかし、UTXO は分割不可能であるため、この契約を実現する唯一の方法は、非常に非効率的に異なる額面の UTXO を多数使用することです(たとえば、最大 30 に対応する各 k に対して、2^k の UTXO があります)。 - 状態の欠如 – UTXO は支出済みまたは未支出の状態のみであり、これにより、マルチステージ契約やスクリプトに必要な他の内部状態の生存空間がありません。これにより、マルチステージオプション契約、分散型交換オファー、または二段階暗号コミットメントプロトコル(計算報酬を確保するために非常に必要)を実現することが非常に困難になります。これはまた、UTXO が単純な一回限りの契約を構築するためにのみ使用できることを意味し、分散型組織のようなより複雑な状態を持つ契約を実現することが難しくなります。二元状態と価値盲の組み合わせは、別の重要なアプリケーションである引き出し限度が実現不可能であることを意味します。 - ブロックチェーン盲(Blockchain-blindness)- UTXO はブロックチェーンのデータ(たとえば、ランダム数や前のブロックのハッシュ)を見ることができません。この欠陥は、スクリプト言語が持つランダム性に基づく潜在的な価値を奪い、ギャンブルなどの他の分野のアプリケーションを深刻に制限します。私たちは、暗号通貨上に高度なアプリケーションを構築する 3 つの方法を考察しました:新しいブロックチェーンを構築する、ビットコインブロックチェーン上でスクリプトを使用する、ビットコインブロックチェーン上でメタコインプロトコルを構築する。新しいブロックチェーンを構築する方法は、任意の機能を自由に実現できますが、コストは開発時間と育成努力です。スクリプトを使用する方法は非常に簡単に実現でき、標準化されていますが、その能力には限界があります。メタコインプロトコルは非常に簡単に実現できますが、スケーラビリティの欠点があります。イーサリアムシステムでは、私たちの目的は、これら 3 つのモデルのすべての利点を持つ汎用フレームワークを構築することです。
イーサリアム#
イーサリアムの目的は、スクリプト、競争通貨、チェーン上のメタプロトコル(on-chain meta-protocol)の概念を統合し、開発者が任意の合意に基づく、スケーラブルで、標準化された、機能完全で、開発が容易で、協調的なアプリケーションを作成できるようにすることです。イーサリアムは、究極の抽象的な基盤層 —— チューリング完全なプログラミング言語を内蔵したブロックチェーンを構築することにより、誰でも契約や分散型アプリケーションを作成し、自由に定義したすべての所有権ルール、取引方法、状態変換関数を設定できるようにします。
ドメインコインの主体フレームワークは、わずか 2 行のコードで実現できます。通貨や信用システムなどの他のプロトコルは、20 行未満のコードで実現できます。スマートコントラクト —— 価値を含み、特定の条件を満たすまで開けられない暗号箱 —— も私たちのプラットフォーム上で作成でき、チューリング完全性、価値認識(value-awareness)、ブロックチェーン認識(blockchain-awareness)、および多状態によって強化され、ビットコインスクリプトが提供できるスマートコントラクトよりもはるかに強力です。
イーサリアムアカウント#
イーサリアムシステムでは、状態は「アカウント」(各アカウントは 20 バイトのアドレスによって定義される)と、2 つのアカウント間で価値と情報を移転する状態変換から構成されます。イーサリアムのアカウントは 4 つの部分を含みます:
- ランダム数、各取引が 1 回だけ処理されるカウンター
- アカウントの現在のイーサ残高
- アカウントの契約コード(ある場合)
- アカウントのストレージ(デフォルトは空)
イーサ(Ether)はイーサリアム内部の主要な暗号燃料であり、取引手数料の支払いに使用されます。一般的に、イーサリアムには 2 種類のアカウントがあります:
外部所有アカウント(秘密鍵によって制御される)と契約アカウント(契約コードによって制御される)。外部所有アカウントにはコードがなく、人々は取引を作成し署名することで外部アカウントからメッセージを送信できます。契約アカウントがメッセージを受け取ると、契約内部のコードがアクティブになり、内部ストレージに対して読み取りと書き込みを行い、他のメッセージを送信したり契約を作成したりできます。
メッセージと取引 イーサリアムのメッセージは、ある程度ビットコインの取引に似ていますが、両者には 3 つの重要な違いがあります。
第一に、イーサリアムのメッセージは外部エンティティまたは契約によって作成されることができますが、ビットコインの取引は外部からのみ作成できます。第二に、イーサリアムのメッセージはデータを含めることを選択できます。第三に、イーサリアムメッセージの受信者が契約アカウントである場合、応答を選択できるため、イーサリアムメッセージには関数の概念も含まれます。
イーサリアムにおける「取引」は、外部アカウントから発信されたメッセージの署名データパッケージを指します。取引にはメッセージの受信者、送信者を確認するための署名、イーサアカウントの残高、送信するデータ、および STARTGAS と GASPRICE と呼ばれる 2 つの数値が含まれます。
コードの指数的爆発と無限ループを防ぐために、各取引は実行コードによって引き起こされる計算ステップの制限を必要とします —— 初期メッセージとすべての実行中に引き起こされるメッセージを含む。STARTGAS は制限であり、GASPRICE は各計算ステップに対してマイナーに支払う費用です。取引の実行中に「燃料が尽きた」場合、すべての状態変更は元の状態に戻りますが、すでに支払われた取引手数料は返金されません。取引の実行が中止された場合、残りの燃料は送信者に返還されます。契約の作成には別の取引タイプと対応するメッセージタイプがあります。契約のアドレスはアカウントのランダム数と取引データのハッシュに基づいて計算されます。
メッセージメカニズムの重要な結果は、イーサリアムの「ファーストクラス」財産 —— 契約と外部アカウントが同じ権利を持ち、メッセージを送信したり他の契約を作成したりする権利を持つことです。これにより、契約は同時に異なる役割を果たすことができます。たとえば、ユーザーは分散型組織(契約)のメンバーを仲介アカウント(別の契約)にし、偏執的な使用者のためにカスタマイズされた量子証明のランボート署名(第 3 の契約)を持つ個人と、5 つの秘密鍵で保護されたアカウント(第 4 の契約)の共同署名エンティティに仲介サービスを提供できます。イーサリアムプラットフォームの強力な点は、分散型組織と代理契約が契約のすべての参加者がどのタイプのアカウントであるかを気にする必要がないことです。 イーサリアム状態変換関数
イーサリアムの状態変換関数:APPLY (S,TX) -> S’は次のように定義できます:
-
取引の形式が正しいか(つまり正しい数値があるか)、署名が有効か、ランダム数が送信者アカウントのランダム数と一致するかを確認します。そうでない場合、エラーを返します。
-
取引手数料を計算します:fee=STARTGAS * GASPRICE を計算し、署名から送信者のアドレスを特定します。送信者のアカウントから取引手数料を減算し、送信者のランダム数を増加させます。アカウント残高が不足している場合、エラーを返します。
-
初期値 GAS = STARTGAS を設定し、取引内のバイト数に基づいて一定量の燃料値を減算します。
-
送信者のアカウントから受信者アカウントに価値を移転します。受信アカウントが存在しない場合は、このアカウントを作成します。受信アカウントが契約である場合、契約のコードを実行し、コードの実行が終了するか燃料が尽きるまで実行します。
-
送信者アカウントに十分な資金がない場合やコードの実行が燃料を使い果たして価値移転が失敗した場合、元の状態に戻りますが、取引手数料は支払われる必要があります。取引手数料はマイナーアカウントに加算されます。
-
そうでない場合、すべての残りの燃料を送信者に返還し、消費された燃料を取引手数料としてマイナーに送信します。たとえば、契約のコードが次のようであると仮定します:
注意すべき点は、実際には契約コードは基盤となるイーサリアム仮想マシン(EVM)コードで書かれています。上記の契約は、私たちの高級言語である Serpent 言語で書かれており、EVM コードにコンパイルできます。契約のストレージが最初は空であり、値が 10 イーサ、燃料が 2000、燃料価格が 0.001 イーサであり、2 つのデータフィールドの値が [2, „CHARLIE‟] [3] の取引が送信された場合、状態変換関数の処理プロセスは次のようになります:
-
取引が有効かどうか、形式が正しいかどうかを確認します。
-
取引送信者が少なくとも 2000*0.001=2 イーサを持っているかどうかを確認します。もしそうであれば、送信者アカウントから 2 イーサを減算します。
-
初期設定 gas=2000、取引が 170 バイトであると仮定し、各バイトの費用が 5 であるため、850 を減算し、残りは 1150 です。
-
送信者アカウントから 10 イーサを減算し、契約アカウントに 10 イーサを追加します。
-
コードを実行します。この契約では、コードの実行は非常に簡単です:契約ストレージのインデックス 2 が使用されているかどうかを確認し、使用されていないことに気づき、その値を CHARLIE に設定します。これにより、187 単位の燃料が消費され、残りの燃料は 1150 – 187 = 963 です。
-
送信者のアカウントに 963*0.001=0.963 イーサを追加し、最終状態を返します。契約が取引を受け取らない場合、すべての取引手数料は GASPRICE と取引のバイト長の積に等しくなり、取引データは取引手数料とは無関係になります。また、契約が発信したメッセージは、それらが生成した計算に燃料制限を設定できます。子計算の燃料が尽きた場合、メッセージが発信されたときの状態に戻ります。したがって、取引と同様に、契約も生成した子計算に対して厳格な制限を設定し、計算リソースを保護できます。
コード実行#
イーサリアム契約のコードは、低レベルのスタックベースのバイトコード言語で書かれており、「イーサリアム仮想マシンコード」または「EVM コード」と呼ばれています。
コードは一連のバイトで構成され、各バイトは 1 つの操作を表します。一般的に、コードの実行は無限ループであり、プログラムカウンターが 1 増加するたびに(初期値はゼロ)、1 回の操作が実行され、コードが完了するか、エラー、STOP、または RETURN 命令に遭遇するまで続きます。操作は 3 つのデータストレージスペースにアクセスできます:
- スタック、後入れ先出しのデータストレージで、32 バイトの数値をスタックに入れたり、スタックから出したりできます。
- メモリ、無限に拡張可能なバイトキュー。
- 契約の長期ストレージ、キー / 値のストレージで、キーと値は 32 バイトのサイズであり、計算が終了するとリセットされるスタックとメモリとは異なり、ストレージ内容は長期間保持されます。コードは、ブロックヘッダーのデータ、送信者と受信者のメッセージ内のデータにアクセスすることができます。コードは、出力としてデータのバイトキューを返すこともできます。EVM コードの正式な実行モデルは驚くほどシンプルです。
イーサリアム仮想マシンが実行されると、その完全な計算状態はタプル(block_state, transaction, message, code, memory, stack, pc, gas)によって定義されます。ここで、block_state はすべてのアカウントの残高とストレージを含むグローバル状態です。各ラウンドの実行時に、コードの pc(プログラムカウンター)バイトを呼び出すことで、現在の命令が見つかります。各命令は、タプルにどのように影響を与えるかを定義しています。
たとえば、ADD は 2 つの要素をスタックから出し、それらの合計をスタックに入れ、ガス(燃料)を 1 減らし、pc を 1 増やします。SSTORE は、上部の 2 つの要素をスタックから出し、最初の要素によって定義された契約ストレージ位置に 2 番目の要素を挿入し、最大 200 のガス値を減らし、pc を 1 増やします。イーサリアムを最適化するための多くの方法がありますが、イーサリアムの基本的な実装は数百行のコードで実現できます。
ブロックチェーンとマイニング#
いくつかの違いはありますが、イーサリアムのブロックチェーンは多くの点でビットコインのブロックチェーンに似ています。彼らのブロックチェーンアーキテクチャの違いは、イーサリアムのブロックが取引記録と最近の状態だけでなく、ブロック番号と難易度値も含むことです。イーサリアムのブロック確認アルゴリズムは次のとおりです:
-
ブロックが参照する前のブロックが存在し、有効であることを確認します。
-
ブロックのタイムスタンプが参照された前のブロックよりも大きく、15 分未満であることを確認します。
-
ブロック番号、難易度値、取引ルート、叔ルート、燃料制限(多くのイーサリアム特有の基盤概念)が有効であることを確認します。
-
ブロックの作業証明が有効であることを確認します。
-
S [0] に前のブロックの STATE_ROOT を割り当てます。
-
TX をブロックの取引リストに割り当て、合計 n 件の取引があります。0……n-1 に属するすべての i について、状態変換 S [i+1] = APPLY (S [i],TX [i]) を実行します。いずれかの変換でエラーが発生した場合、エラーを返します。
-
S-FINAL に S [n] を割り当て、マイナーにブロック報酬を支払います。
-
S-FINAL が STATE_ROOT と同じであることを確認します。同じであれば、ブロックは有効です。そうでなければ、ブロックは無効です。
この確認方法は、一見すると効率が非常に低いように見えます。なぜなら、各ブロックのすべての状態を保存する必要があるからです。しかし、実際にはイーサリアムの確認効率はビットコインと同等です。その理由は、状態がツリー構造(tree structure)に保存されているため、各ブロックを追加するたびにツリー構造の一部だけを変更する必要があるからです。したがって、一般的に、隣接する 2 つのブロックのツリー構造の大部分は同じであるべきであり、データを 1 回保存することで、ポインタ(つまりサブツリーのハッシュ)を使用して 2 回参照できます。「パトリシアツリー(Patricia Tree)」と呼ばれるツリー構造は、これを実現でき、マークルツリーの概念に対する修正を含んでいます。これにより、ノードを変更するだけでなく、ノードを挿入および削除することも可能になります。また、すべての状態情報は最後のブロックの一部であるため、すべてのブロック履歴を保存する必要はありません。この方法がビットコインシステムに適用できれば、計算によりストレージスペースを 10〜20 倍節約できる可能性があります。
アプリケーション
一般的に、イーサリアム上には 3 種類のアプリケーションがあります。第一のカテゴリは金融アプリケーションであり、ユーザーにより強力な方法で彼らの資金を管理し、契約に参加することを提供します。これにはサブ通貨、金融派生商品、ヘッジ契約、貯蓄口座、遺言、さらにはいくつかの種類の包括的な雇用契約が含まれます。第二のカテゴリは半金融アプリケーションであり、ここにはお金が存在しますが、非金銭的な側面も非常に重視されます。完璧な例は、計算問題を解決するために設定された自己強制報酬です。最後に、オンライン投票や分散型ガバナンスのような完全な非金融アプリケーションがあります。
トークンシステム
チェーン上のトークンシステムには多くのアプリケーションがあり、ドルや金などの資産を表すサブ通貨から、企業の株式、独自のトークン、セキュリティの偽造防止クーポン、さらには従来の価値とは完全に無関係なポイント報酬のためのトークンシステムまで含まれます。イーサリアムでトークンシステムを実装するのは驚くほど簡単です。
重要な点は、すべての通貨またはトークンシステムは、根本的に次の操作を持つデータベースであることを理解することです:A から X 単位を減算し、B に X 単位を加算します。前提条件は(1)取引の前に A が少なくとも X 単位を持っていること、(2)取引が A によって承認されていることです。
トークンシステムを実装することは、このようなロジックを契約に実装することです。Serpent 言語でトークンシステムの基本コードを実装すると、次のようになります:
これは本質的に、この記事でさらに説明する「銀行システム」状態変換機能の最小限の実装です。初期およびその他の周辺状況で通貨を分配する機能を提供するために、いくつかの追加コードを追加する必要があります。理想的には、他の契約がアドレスの残高を照会できるようにする関数を追加することが十分です。
理論的には、イーサリアムに基づくサブ通貨としてのトークンシステムは、ビットコインベースのチェーン上のメタコインが欠いている重要な機能を含む可能性があります:この通貨を使用して取引手数料を直接支払う能力。この能力を実現する方法は、契約内にイーサアカウントを維持して送信者の取引手数料を支払うために使用し、取引手数料として使用される内部通貨を収集し、それらを継続的に実行されるオークションで販売することです。契約はこのイーサアカウントに資金を注入し続けます。したがって、ユーザーはイーサアカウントを「アクティブ」にするためにイーサを使用する必要がありますが、一度アカウントにイーサがあると、それは繰り返し使用されます。金融派生商品と価値安定通貨金融派生商品は「スマートコントラクト」の最も一般的なアプリケーションであり、コードで実装するのが最も簡単なものの 1 つです。金融契約を実現する主な課題は、それらのほとんどが外部の価格発表者を参照する必要があることです。たとえば、非常に需要の高いアプリケーションは、イーサ(または他の暗号通貨)のドル価格の変動をヘッジするためのスマートコントラクトですが、その契約はイーサのドルに対する価格を知る必要があります。最も簡単な方法は、特定の機関(たとえば NASDAQ)が維持する「データ提供」契約を通じて行うことです。この契約は、その機関が必要に応じて契約を更新し、他の契約がその契約にメッセージを送信して価格情報を含む応答を取得できるインターフェースを提供します。これらの重要な要素がすべて揃った場合、ヘッジ契約は次のようになります:
A が 1000 イーサを入力するのを待ちます。B が 1000 イーサを入力するのを待ちます。
データ提供契約を照会して、1000 イーサのドル価値、たとえば x ドルをストレージに記録します。30 日後、A または B が契約を「再アクティブ化」して、価値 x ドルのイーサを A に送信し、残りのイーサを B に送信できるようにします。このような契約は、暗号商取引において異常な潜在能力を持っています。暗号通貨はその価格の変動性についてしばしば批判されます。多くのユーザーや商人が暗号資産がもたらす安全性と便利さを必要としているかもしれませんが、彼らは 1 日のうちに資産が 23% の価値を失う状況に直面することを好まないでしょう。これまでのところ、最も一般的な推奨策は、発行者が資産を裏付けることです。発想は、発行者がサブ通貨を作成し、そのサブ通貨を発行および償還する権利を持ち、(オフラインで)特定の関連資産(たとえば金、ドル)を提供する人に 1 単位のサブ通貨を提供することです。
発行者は、誰かが暗号資産の 1 単位を返還するときに、関連資産の 1 単位を返還することを約束します。このメカニズムは、発行者が信頼できる場合、任意の非暗号資産を「アップグレード」して暗号資産にすることができます。しかし、実際には、発行者が常に信頼できるわけではなく、銀行システムが脆弱すぎたり、誠実さが不十分であったりするため、このようなサービスが存在できない場合があります。
金融派生商品は代替策を提供します。ここでは、資産を支えるための単独の発行者は存在せず、代わりに、ある暗号資産の価格が上昇することを賭ける投機者で構成される分散型市場が存在します。発行者とは異なり、投機者側は交渉の権利を持たず、ヘッジ契約が彼らの準備金を契約に凍結します。この方法は完全に分散型ではありませんが、依然として価格情報のデータソースを信頼できる必要があります。とはいえ、発行者とは異なり、価格発表者はライセンスを必要とせず、自由な言論の一部として分類されるように思われます。これは、インフラストラクチャの需要を減少させ、潜在的な詐欺リスクを低減する上で大きな進歩です。
アイデンティティと信用システム#
最初の代替通貨であるドメインコインは、ビットコインブロックチェーンを使用して名前登録システムを提供し、ユーザーが彼らの名前と他のデータを公共データベースに登録できるようにしました。最も一般的なアプリケーションケースは、「bitcoin.org」(またはドメインコイン内の「bitcoin.bit」)のようなドメイン名を IP アドレスに対応させることです。他のアプリケーションケースには、電子メール検証システムや潜在的により高度な信用システムが含まれます。ここに、イーサリアム内でドメインコインに似た名前登録システムを提供する基本契約があります:
契約は非常にシンプルです;これはイーサリアムネットワーク内で追加できるが変更または削除できないデータベースです。誰でも名前を値として登録し、永遠に不変にすることができます。より複雑な名前登録契約には、他の契約が照会できる「機能条項」を含め、名前の「所有者」(つまり「最初の登録者」)がデータを変更したり所有権を移転したりできるメカニズムが含まれます。さらに、信用と信頼ネットワーク機能を追加することもできます。
分散型ストレージ
過去数年間にいくつかの人気のあるオンラインファイルストレージスタートアップが登場しましたが、最も目立つのは Dropbox であり、ユーザーがハードドライブのバックアップをアップロードし、バックアップストレージサービスを提供し、ユーザーがアクセスできるようにして、月額料金を請求します。
しかし、この時点でファイルストレージ市場は時折相対的に非効率的です。既存のサービスの粗い観察によれば、特に「ミステリー・バレー」の 20-200GB のレベルでは、無料スペースも企業向けユーザーディスカウントもないため、主流のファイルストレージコストは月額料金がハードドライブ全体のコストを支払うことを意味します。イーサリアム契約は、ユーザーが自分のハードドライブや未使用のネットワークスペースを貸し出して少額の収益を得ることで、ファイルストレージコストを削減できるようにする分散型ストレージエコシステムの開発を許可します。このような施設の基本的な構成要素は、私たちが「分散型 Dropbox 契約」と呼ぶものです。
この契約は次のように機能します。
まず、誰かがアップロードする必要があるデータをブロックに分割し、各ブロックのデータを暗号化してプライバシーを保護し、これを使用してマークルツリーを構築します。次に、次のルールを含む契約を作成します。N 個のブロックごとに、契約はマークルツリーからランダムインデックスを抽出します(契約コードがアクセスできる前のブロックのハッシュを使用してランダム性を提供します)。次に、最初のエンティティ X にイーサを支払って、ツリー内の特定のインデックスにあるブロックの所有権証明を支えることができます。ユーザーがファイルを再ダウンロードしたい場合、彼はマイクロペイメントチャネルプロトコル(たとえば、32k バイトごとに 1 サボを支払う)を使用してファイルを復元します。費用の観点から、最も効率的な方法は、支払者が最後まで取引を公開せず、各 32k バイトの後に同じランダム数を持つ少しお得な取引で元の取引を置き換えることです。このプロトコルの重要な特徴は、ファ