イーサリアムの主要な動作原理は、アカウントから発信されたトランザクションを受け入れ、それらの状態を更新し、その状態を維持することです。別のトランザクションがそれらを更新するまで、その状態は維持されます。イーサリアムでは、トランザクションの受け入れ、実行、記録のプロセスは 2 つの段階に分かれています。イーサリアムはトランザクションの受け入れと実行、そして帳簿への記録の間でデカップリングされています。このようなデカップリングは、分散型および分散アーキテクチャにおいて、システムが正常に機能するのを効果的に支えることができます。
ブロックチェーンには主に以下の 3 つの用途があります。
・信頼:ブロックチェーンは、分散型アプリケーションを作成するために使用でき、データが複数の人によって共同で制御され、その中の誰も以前の記録を変更または削除する権限を持たないことを実現します。たとえ誰かが実際にそれを行ったとしても、彼が生成したデータは他の参加者によって受け入れられません。
・自治性:ブロックチェーン上のアプリケーションには、唯一の所有者が存在しません。唯一の所有者がいないため、誰もそれを単独で制御することはできませんが、誰もがその行動を通じてガバナンスプロセスに参加することができ、これは操作されにくく、腐敗を引き起こしにくい解決策を構築するのに役立ちます。
・仲介の排除:ブロックチェーンに基づくアプリケーションは、既存のプロセスの中間段階を排除することができます。たとえば、車両登録や運転免許証の発行などのシナリオでは、通常、中間の役割が存在し、車両登録や運転免許証の発行の責任を負っています。ブロックチェーンに基づいてプロセスを設計する場合、この中間の役割は存在する必要がなくなります。なぜなら、ブロックチェーン上のデータが確認されると、運転免許証は自動的に発行され、車両は自動的に登録されるからです。ブロックチェーンは新しい時代を切り開き、多くのビジネスが中間の権威機関の裏付けを必要としなくなります。
暗号学は、理解しやすく、明白な内容を秘密の、隠された、無意味な内容に変換する科学です。同様に、復号はその逆の操作です。暗号化技術はデータの送信と保存を助け、簡単には復号できません。
コンピュータ分野には、対称暗号と非対称暗号の 2 種類の暗号技術があります。
・対称暗号と復号:対称暗号は、暗号化と復号の過程で同じ鍵を使用することを指します。この技術を使用して情報を交換する場合、多くの人が同じ鍵を使用することを意味します。
・非対称暗号と復号:暗号化と復号の過程で 2 つの鍵を使用します。どちらの鍵も暗号化と復号に使用できます。公開鍵で暗号化された情報は、秘密鍵で復号できます。秘密鍵で暗号化された情報は、公開鍵で復号できます。以下の例で説明します。トムはアリスの公開鍵を使用して情報を暗号化し、それをアリスに送信します。アリスは彼女の秘密鍵を使用して復号し、元の情報を抽出できます。簡単に言えば、アリスの公開鍵で暗号化された情報は、彼女自身の秘密鍵でしか復号できません。これが非対称暗号の一般的な使用シーンです。非対称暗号のもう一つの用途は、後で紹介するデジタル署名です。
ハッシュは、入力データを固定長のランダムな文字列(ハッシュ値)に変換するプロセスですが、結果から元のデータを逆生成または識別することはできません。したがって、ハッシュはデータの指紋とも呼ばれます。ハッシュ値に基づいて入力データを導出することはほぼ不可能であり、元のデータがわずかに変更されただけでも、まったく異なるハッシュ値が生成されます。これにより、誰も元のデータに手を加えることができないことが保証されます。ハッシュにはもう一つの特徴があります。入力の文字列データは長さが異なる場合がありますが、生成されるハッシュ値の長さは固定です。たとえば、SHA256 ハッシュアルゴリズムを使用すると、入力データの長さに関係なく、常に 256 バイトのハッシュ値が生成されます。データ量が非常に大きい場合、これは非常に便利です。常に 256 バイトのハッシュ値が生成されるため、証拠として保存できます。イーサリアムは多くの場所でハッシュ技術を使用しており、各トランザクションに対してハッシュを行い、2 つのトランザクションのハッシュ値を再度ハッシュし、最終的に同じブロック内の各トランザクションにルートハッシュ値を生成します。
ハッシュにはもう一つ重要な特徴があります。数学的に見て、2 つの異なる入力データは同じハッシュ値を生成しません。同様に、計算上および数学上、ハッシュ値から入力値を逆算することは不可能です。
イーサリアムは Keccak256 をハッシュアルゴリズムとして使用しています。
以下のスクリーンショットは、ハッシュの例を示しています。入力の Ritesh Modi は、以下のようにハッシュ値を生成しました:
入力データにわずかな変更を加えると [1]、まったく異なるハッシュ値が生成されます。以下のように:
[1] ここでは 2 つの単語の間のスペースが削除されています。—— 訳者注
非対称暗号は、デジタル署名の作成と検証に非対称鍵を使用する重要な用途の一つです。デジタル署名は、紙に手書きされた署名に似ています。手書きの署名と同様に、デジタル署名は個人を識別するのに役立ち、情報が伝達中に改ざんされないことを保証します。デジタル署名を理解するために、例を挙げてみましょう。
アリスはトムにメッセージを送信する準備をしています。さて、問題は、トムが受け取ったメッセージがアリスから送信されたものであることをどのように確認できるか、また、メッセージが伝達中に改ざんされていないことをどのように確認できるかです。解決策は、元のメッセージ / トランザクションを送信しないことです。アリスはまず、送信するメッセージのハッシュ値を取得し、その後、彼女の秘密鍵でハッシュ値を暗号化し、最後に生成されたデジタル署名をハッシュ値に添付してトムに送信します。トムはメッセージを受け取った後、アリスの公開鍵を使用してデジタル署名を抽出し、復号して元のハッシュ値を見つけます。同時に、彼は実際に受け取ったメッセージからハッシュ値を抽出し、2 つのハッシュ値を比較します。もし 2 つのハッシュ値が一致すれば、メッセージが伝達中に改ざんされていないことが示されます。
デジタル署名は、資産や暗号通貨(例えば、イーサリアム)の所有者がトランザクションに署名して確認するために一般的に使用されます。
イーサリアムはイーサリアム上の通貨です。イーサリアムの各アクティビティは、手数料としてイーサリアムを消費する必要があり、成功裏にブロックを生成したマイナーは報酬としてイーサリアムを得ます。イーサリアムは取引所で法定通貨に簡単に交換できます。
イーサリアムは 10 進法の計量体系を採用しており、その最小単位は wei です。以下にいくつかの計量単位を示します。詳細については、ウェブサイトhttps://github.com/ethereum/web3.js/blob/0.15.0/lib/utils/utils.js#L40 を参照できます。
イーサリアム上でタスクを実行するには、イーサリアムを消費する必要があります。イーサリアムは取引所で公開取引されているため、その価格は上下に変動します。手数料を支払う際に、直接イーサリアムを使用すると、その価格が不安定なため、同じサービスにかかるコストが高くなったり低くなったりする可能性があります。この場合、人々はイーサリアムの価格が低いときに取引を実行することを選択します。このような状況は、プラットフォームにとって理想的ではありません [1]。ガス(燃料)の役割はこの問題を緩和することです。ガスはイーサリアムの現在の内部通貨です。ガスを使用して価格を設定することで、ユーザーはトランザクションの実行コストを事前に決定できます。これがガスコストです。この方法を採用すると、イーサリアムの価格が急騰した場合、ガスの価格を適切に引き下げることができ、イーサリアムの価格が急落した場合、ガスの価格を適切に引き上げることができます。たとえば、スマートコントラクト内の関数を使用して文字を変更する場合、このトランザクションは一定のガスを消費します。ガスの使用コストは事前に決定されているため、ユーザーは規則的にスマートコントラクトを実行できます。
[1] ピークと谷の効果が生じ、価格が低いときに実行量が過剰になり、プラットフォームが過負荷になることがあります。—— 訳者注
ブロックチェーンは、複数のコンポーネントを含むアーキテクチャです。ブロックチェーンの独自の点は、これらのコンポーネントの機能と相互作用です。重要なコンポーネントには、EVM(Ethereum Virtual Machine イーサリアム仮想マシン)、マイナー、ブロック、トランザクション、コンセンサスアルゴリズム、アカウント、スマートコントラクト、マイニング、イーサリアム、ガスが含まれます。この章では、これらのコンポーネントを紹介します。
ブロックチェーンネットワークは、多数のノードで構成されており、その一部はマイナーのマイニングノードであり、他のノードはマイニングを行わず、スマートコントラクトやトランザクションの実行を支援します。これらのノードは総称して EVM と呼ばれます。ネットワーク上の各ノードは相互に接続されており、ノード間は P2P プロトコルを介して通信し、デフォルトでは 30303 ポートを使用します。
各ノードは、チェーン上のすべてのブロックを含む帳簿のインスタンス(コピー)を維持しています。ネットワーク上には多数のマイニングノードが存在するため、ノード間のブロックデータに差異が生じないように、これらのノードはブロックを継続的に同期し、帳簿データの整合性を確保します。
今後の章では、帳簿、ブロック、トランザクションについてさらに詳しく説明します。
スマートコントラクトも EVM 上で実行されます。スマートコントラクトは、個別のビジネス機能を記述することによってイーサリアムの能力を拡張します。スマートコントラクトが実行されるとき、それはトランザクションの一部として前述のマイニングプロセスに従って行われます。
ネットワーク上にアカウントを持つユーザーは、メッセージを送信してアカウント間でイーサリアムのトランザクションを完了させたり、メッセージを送信してコントラクト内の関数を呼び出したりできます。イーサリアムにとって、これらの 2 つの方法は本質的にトランザクションです。トランザクションが確認され、アカウント残高が変更される際、アカウントの所有者はトランザクションにデジタル署名を行う必要があり、これにより送信者の身元が確認されます。イーサリアムの構造は以下の図のようになります。
ブロックチェーンとイーサリアムでは、各ブロックは別のブロックに接続されています。2 つのブロックの間には親子関係があり、一対一の関係であり、こうして首尾一貫してチェーンが形成されています。この章の後半ではブロックについて説明します。次の図では、3 つのブロック(ブロック 1、ブロック 2、ブロック 3)を示します。ブロック 1 はブロック 2 の親ブロックであり、ブロック 2 はブロック 3 の親ブロックです。各ブロックのヘッダーには親ブロックのハッシュ値が保存されており、これにより親子関係が確立されます。
ブロック 2 はヘッダーにブロック 1 のハッシュ値を保存し、ブロック 3 はヘッダーにブロック 2 のハッシュ値を保存します。さて、最初のブロックの親ブロックは誰でしょうか?イーサリアムには創世ブロックの概念があり、それが最初のブロックです。このブロックはチェーンが初めて開始されたときに自動的に作成されました。全体のチェーンは、創世ブロック(genesis.json ファイルを通じて生成される)を最初のブロックとして起動したと考えることもできます。
ブロックが互いに接続されていることを知ったあなたは、トランザクションがどのようにブロックに結びついているのかを知りたいと思うかもしれません。イーサリアムでは、トランザクションはブロック内に保存され、トランザクションの実行には一定のガスが消費される必要があります。各ブロックにはガスの上限があるため、実行待ちのトランザクションが消費するガスの合計は上限を超えることができません。これにより、すべてのトランザクションが 1 つのブロックに保存されるのを防ぎます。ガスの上限に達すると、他のトランザクションはこのブロックに書き込むことができなくなり、その時点でノードはマイニングを開始します。
トランザクションがハッシュ値を生成した後、それはブロックに保存され、次にマイニングプログラムが 2 つのトランザクションのハッシュ値を選択して再度ハッシュを行い、新しいハッシュ値を生成します。明らかに、ブロック内のすべてのトランザクションは最終的に一意のハッシュ値を生成し、それがメルクル根ハッシュ値であり、ブロックヘッダーに保存されます。ブロック内のいずれかのトランザクションが変更されると、そのトランザクションのハッシュ値も変化し、最終的に根トランザクションハッシュ値が変化します。ブロックのハッシュ値が変化すると、子ブロックは親ブロックのハッシュ値を保存しているため、その子ブロックのハッシュ値も変化する必要があります。これにより連鎖反応が引き起こされ、ブロックチェーン全体が変化する必要があるため、ブロックチェーンの改ざん不可能性が実現されます。
ノードはコンピュータであり、ノード同士は p2p プロトコルを介して接続され、イーサリアムネットワークを構成しています。
イーサリアムには 2 種類のノードがあります:
·EVM
・マイニングノード
この分類は概念を細分化するためのものであり、ほとんどのシナリオでは専用の EVM は存在しません。逆に、すべてのマイナーのノードが EVM の機能を担っています。
マイナーの日常業務は財務会計に非常に似ています。会計の主な仕事は財務帳簿にデータを記録することです。同様に、マイナーの主な責任はイーサリアムにトランザクションデータを書き込むことです。彼がこのように働く理由は報酬を得ることができるからです。マイナーの報酬には 2 種類あります。1 つはブロックチェーンにブロックを書き込む報酬であり、もう 1 つはブロック内のトランザクションで支払われるガス料金を得ることができることです。一般的に、ブロックチェーン上には多くのマイナーが存在し、彼らは互いに競争しますが、最終的には 1 人のマイナーだけが勝利し、帳簿にブロックを書き込むことができ、他のマイナーは書き込む権限を持ちません。マイナーが勝利するかどうかは、難題を解くことによって判断されます。マイニング中、各マイナーが解決しなければならない難題は同じです。マイナーは自分のマシンの計算能力を使って解決することしかできません。この難題を最初に解決したマイナーは、トランザクションを含むブロックを自分のローカル帳簿に書き込み、その後、他のマイナーに確認のためにブロックと Nonce 値 [1] を送信します。他のマイナーはブロックを受け取り、その答えが正しいかどうかを検証します。正しければ、ブロックはマイナーによって自分の帳簿に書き込まれます。このプロセスで、挑戦に勝ったマイナーは 5 イーサリアムの報酬を得ます。各ノードはイーサリアム帳簿のコピーを維持しており、マイナーの責任はデータの同期を通じてローカル帳簿を最新の状態に保つことです。最終的に、各マイナーの間で帳簿の整合性が実現されます。
マイナーまたはマイニングノードには 3 つの重要な機能があります:
・マイニングまたはトランザクションをパッケージ化して新しいブロックを生成し、イーサリアム帳簿に書き込む
・他のマイナーに最新のブロックを送信し、受信を通知する
・他のマイナーのブロックを受信し、ローカル帳簿を更新する
マイニングノードは、マイナーに属するノードを指し、EVM ノードとともにネットワーク全体の一部です。ある時点で、マイナーは新しいブロックを生成し、トランザクションプールからトランザクションを収集し、新しく作成されたブロックにパッケージ化します。最終的に、このブロックはブロックチェーンに追加されます。
以下では、コンセンサスや難題の解決などの他の概念について説明します。
[1] 解決された答え。—— 訳者注
ネットワーク上のすべてのマイナーにとって、マイニングプログラムは同じであり、彼らがやるべきことは、プログラムのルールに従ってマイニングタスクを継続的に実行することです。マイナーは一方で新しいブロックを掘り出すためにプログラムを必死に計算し、もう一方でトランザクションプール内の新しいトランザクションを常に監視し、他のマイナーのブロックを受信、検証、転送します。前述のように、まずマイナーはブロックを作成し、次にトランザクションプールからトランザクションを収集してブロックに追加します。追加する前に、トランザクションが他のマイナーによってすでにブロックに書き込まれているかどうかを確認し、すでに書き込まれている場合はそれを削除します。
マイニング報酬を得るために、マイナーは自分のコインベース(coinbase)トランザクションを追加する必要があります(訳者注:ブロック内の最初のトランザクションはマイニングの報酬トランザクションです)。次に、ブロックヘッダーを生成し、以下の手順を実行します:
1. マイナーは 2 つのトランザクションのハッシュ値を取得し、再度ハッシュを行い、新しいハッシュ値を生成します。すべてのトランザクションのハッシュが完了すると、唯一のハッシュ値が得られます。これが根トランザクションハッシュ値またはメルクル根トランザクションハッシュ値であり、ブロックヘッダーに追加されます。
2. マイナーは前のブロックのハッシュ値も確認する必要があります。これは現在のブロックの親ブロックであり、親ブロックのハッシュ値は現在のブロックヘッダーに保存されます。
3. マイナーはトランザクションの状態とレシートのルートハッシュ値 [1] を計算し、ブロックヘッダーに書き込みます。
4. Nonce とタイムスタンプがブロックヘッダーに記録されます。
5. ブロック全体(ブロックヘッダーとブロック本体)のハッシュ値が生成されます。
6. マイニングプロセスが開始され、マイナーは Nonce 値を継続的に変更し、ハッシュ値が難題を解決できるまで続けます。ネットワーク上のマイナーにとって、実行プロセスは同じです。
7. 明らかに、あるマイナーが最終的にこの難題の答えを見つけると、それをネットワーク上の他のマイナーに送信します。他のマイナーは最初にその答えが正しいかどうかを確認し、正しければ各トランザクションを検証し、受け入れ、そのブロックを自分のローカル帳簿に追加します。
上記の全体のマイニングプロセスは、マイナーが継続的な計算によって解決策の証明を提供したため、作業証明(PoW)と呼ばれます。さらに、他のアルゴリズムもあります。たとえば、プルーフ・オブ・ステーク(PoS)やプルーフ・オブ・オーソリティ(PoA)などです。イーサリアムはこれらのアルゴリズムを使用していないため、本書では詳しく説明しません。ブロックヘッダーとその構成要素は以下の図のようになります。
[1] ここでの状態とレシートは、他の 2 つのメルクルツリーを指します。イーサリアムには 3 つのメルクルツリーがあります。すなわち、トランザクションメルクルツリー、状態メルクルツリー、レシートメルクルツリーです。
アカウントはイーサリアムシステムの主要な構成要素です。イーサリアムがトランザクションを帳簿に保存するプロセスは、実際にはアカウント間の相互作用のプロセスです。イーサリアムには 2 種類のアカウントがあります:外部アカウントとコントラクトアカウントです。各アカウントにはデフォルトで残高属性があり、そのアカウントのイーサリアムの現在の残高を確認できます。
イーサリアム上のユーザーが所有するアカウントです。イーサリアムでは、アカウントを名前で呼び出すことはできません。イーサリアム上で外部アカウントを作成すると、公開鍵と秘密鍵のペアが生成されます。秘密鍵は安全な場所に保管する必要があり、公開鍵はアカウントの所有権を証明するものです。公開鍵は通常 256 文字ですが、イーサリアムは最初の 160 文字のみを使用して識別します。
たとえば、ボブがイーサリアムネットワーク上(公開ネットワークまたはプライベートネットワークのいずれか)に新しいアカウントを作成し、秘密鍵を自分で使用し、公開鍵の最初の 160 文字がそのアカウントの識別子となります。他のアカウントはこのアカウントにイーサリアムや他のイーサリアムベースの暗号通貨を送信できます。
外部アカウントはイーサリアムを保持できますが、コードを実行することはできません。他の外部アカウントとのトランザクションを実行することができ、スマートコントラクト内の関数を使用してトランザクションを実行することもできます。
トランザクションは、買い手と売り手、供給者と消費者、提供者と消費者の間で、通貨、暗号通貨、または他の資産を使用して相手の資産、製品、またはサービスを交換するための合意です。イーサリアムはトランザクションが円滑に実行されることを保証します。以下は、イーサリアム上でサポートされている 3 種類のトランザクションです:
1. あるアカウントから別のアカウントにイーサリアムを送信する:このアカウントは外部アカウントまたはコントラクトアカウントである可能性があります。以下のシナリオが発生する可能性があります:
・トランザクション内で、外部アカウントが別の外部アカウントにイーサリアムを送信する
・トランザクション内で、外部アカウントがコントラクトアカウントにイーサリアムを送信する
・トランザクション内で、コントラクトアカウントが別のコントラクトアカウントにイーサリアムを送信する
・トランザクション内で、コントラクトアカウントが外部アカウントにイーサリアムを送信する
2. スマートコントラクトのデプロイ:外部アカウントが EVM 上でコントラクトをデプロイするのは、トランザクションを通じて実現されます。
コントラクト内の関数を使用または借用する:状態を変更するためにコントラクト内の関数を実行する必要がある場合、トランザクションが必要です。関数が状態を変更しない場合、トランザクションは必要ありません。
以下は、トランザクションに関連するいくつかの重要な属性を紹介します:
From アカウント属性は、このアカウントがトランザクションの発起者であり、ガスまたはイーサリアムを送信することを示します。前の章でイーサリアムとガスの概念について説明しました。From アカウントは外部アカウントまたはコントラクトアカウントである可能性があります。
To アカウント属性は、イーサリアムまたは他の利益を受け取るアカウントを指し、外部アカウントまたはコントラクトアカウントである可能性があります。コントラクトをデプロイするトランザクションの場合、To フィールドは空になります。
Value アカウント属性は、アカウント間で移転されるイーサリアムの数量を指します。Input アカウント属性は、コントラクトがコンパイルされた後に EVM 上にデプロイされるバイトコードを指します。input は、スマートコントラクト関数の引数付き呼び出しに関する情報を保存するためにも使用されます。以下の図は、典型的なイーサリアムトランザクション内でスマートコントラクト関数が使用される場所を示しています。このスクリーンショットから、Input フィールドに引数付きの関数呼び出しが含まれていることに注意してください。
BlockHash アカウント属性は、そのトランザクションが属するブロックのハッシュ値を指します。
BlockNumber アカウント属性は、トランザクションが属するブロックのシーケンス番号を指します。
Gas アカウント属性は、トランザクションの送信者が支払うガスの数量を指します。
GasPrice アカウント属性は、送信者が支払うガスの価格を指し、wei 単位で表されます(この章の前半でイーサリアムの場所で wei の概念について言及しました)。総ガス消費量 = ガス数量 * ガス価格。
Hash アカウント属性は、トランザクションのハッシュ値を指します。
Nonce アカウント属性は、トランザクションの番号を指し、送信者が現在のトランザクションの前に生成したものです。
TransactionIndex アカウント属性は、ブロック内の現在のトランザクションのシリアル番号を指します。
Value アカウント属性は、wei で計算された送信されるイーサの数量を指します。
V、r、s 属性は、デジタル署名とトランザクションの署名を指します。
以下は、イーサリアム上の一般的なトランザクションで、外部アカウントが別の外部アカウントにイーサリアムを送信するものです(ここでは input フィールドは使用されていません)。スクリーンショットのトランザクションでは、2 イーサリアムが移転されており、その value フィールドは wei で計測されています。
外部アカウント間でイーサリアムを移転することも、以下のコードを使用して実現できます。これは web3 JavaScript フレームワークに基づいており、本書の後半で紹介します。
以下の図は、スマートコントラクトがデプロイされたトランザクションを示しています。input フィールドには、コントラクトがコンパイルされた後のバイトコードが含まれています。
ブロックはイーサリアムの重要な概念です。ブロックはトランザクションのコンテナであり、複数のトランザクションで構成されています。ブロックのガス上限(後で説明します)やブロックサイズの制限により、各ブロックに含まれるトランザクションの数は異なります。ブロックは互いに接続されてブロックチェーンを形成し、最初のブロック(創世ブロックとも呼ばれる)には親ブロックがありませんが、他のブロックには親ブロックがあります。親ブロックのハッシュ値はブロックヘッダーに保存されます。
以下の図は、ブロックの構造を示しています:
ブロックには多くの属性がありますが、重要な部分だけを以下に示します:
Difficulty 属性は、マイナーがこのブロックを掘るために直面する計算の難易度を指します。
GasLimit 属性は、ブロックで許可されるガスの総量の上限を指します。これにより、ブロックに含まれるトランザクションの数が決まります。
GasUsed 属性は、ブロック内のトランザクションが実際に消費したガスの数量を指します。
Hash 属性は、このブロックのハッシュ値を指します。
Nonce 属性は、難題の解決策である数字を指します。
Miner 属性は、マイナーのアカウントを指し、coinbase または etherbase のアドレスを使用できます。
Number 属性は、そのブロックのブロックチェーン上のシーケンス番号を指します。
ParentHash 属性は、親ブロックのハッシュ値を指します。
ReceiptsRoot、stateRoot、TransactionsRoot 属性は、前述のマイニングプロセスで言及されたメルクルツリーを指します。
Transactions 属性は、ブロック内のトランザクションで構成される配列を指します。
TotalDifficulty 属性は、ブロックチェーン全体の難易度を指します。
エンドツーエンドのトランザクション#
サムはマークにデジタル資産(例:米ドル)を送信するつもりです。まず、サムは from、to、value などのフィールドデータを含むトランザクションを新たに作成し、イーサネットワークに送信します。このトランザクションはすぐに帳簿に書き込まれるわけではなく、トランザクションプールに一時的に保存されます。
マイニングノードは新しいブロックを作成し、ガス上限基準に従ってトランザクションプールからトランザクションを抽出し(サムのトランザクションも抽出されます)、ブロックに追加します。ネットワーク上のすべてのマイナーが同じタスクを実行しています。
次に、マイナーたちは難題を解決するために競争を開始します。しばらく(数秒)の後、勝者(最初に難題を解決した人)は通知を発信し、彼が答えを見つけたと主張し、競争に勝ったことを宣言します。ブロックチェーンにブロックを書き込む必要があります。同時に、勝者はその答えをブロックに追加し、他のマイナーに送信します。他のマイナーは通知を受け取った後、まずその答えが正しいかどうかを検証します。一度その答えが有効であると認定されると、彼らは自分の計算を直ちに停止し、サムのトランザクションを含むブロックを受け取り、それを自分のローカル帳簿に追加します。こうして、チェーン上に新しいブロックが生成され、それは時間と空間を超えて永遠に存在し続けます。この間、両者のアカウント残高が更新され、最終的にブロックがネットワーク上のすべてのノードに配布され、複製されます。
合約とは#
合約は、双方または複数の当事者が合意し、即時または将来においてトランザクションを実行することを約束する法的文書です。合約は法的文書であるため、強制力と実行可能性があります。合約の適用シーンは多岐にわたります。たとえば、ある人が保険会社と契約を結んで健康保険を購入する場合、ある人が別の人から土地を購入する場合、ある会社が別の会社に株式を販売する場合などです。
スマートコントラクトとは#
スマートコントラクトは、ユーザーのニーズに応じて記述されたコードであり、イーサリアム仮想マシン上にデプロイされ、実行されます。スマートコントラクトはデジタル化されており、コード内にアカウント間のトランザクションのルールを固定化しています。スマートコントラクトは、原子化トランザクションを通じてデジタル資産の移転を実現するのに役立ち、重要なデータを保存するためにも使用できます。これらのデータは、情報、イベント、関係、残高、現実世界の契約で合意される必要がある情報を記録するために使用されます。スマートコントラクトは、オブジェクト指向のクラスに似ており、1 つのコントラクトが別のコントラクトを呼び出すことができます。私たちは、スマートコントラクトを関数で構成された小さなプログラムと考えることもできます。新しいコントラクトを作成し、コントラクト内の関数を使用してブロックチェーン上のデータを確認し、いくつかのルールに従ってデータを更新することができます。
スマートコントラクトの作成方法#
ピーター・トッド(Peter Todd)はビットコインのコア開発者の一人です。彼はスマートコントラクト(Smart contract)の現状をまとめ、「スマートコントラクトの議論の結論は、誰もスマートコントラクトが何であるかを理解していないということです。スマートコントラクトを実施するには、オラクルが必要です」と述べています。
確かに、スマートコントラクトの理念と本質を明確にすることは容易ではありません。
私たちはスマートコントラクトの理念の起源から始めます。「スマートコントラクト」という概念は、コンピュータ科学者で暗号学者のニック・サボ(Nick Szabo)によって 1993 年頃に提唱されました。1994 年、彼は「スマートコントラクト」(Smart contracts)という論文を書き、スマートコントラクトの草分けとなりました。
ニック・サボは、スマートコントラクトの説明を自動販売機の例から始めます。私たちは、スマートコントラクトの原始的な祖先は目立たない自動販売機であると考えることができます。潜在的な損失の評価の後、自動販売機は、破壊者が支払うコストよりもはるかに少ないお金を金庫に持つことができます。自動販売機は表示された商品価格に基づいてコインを受け取り、単純なメカニズムを通じて最初の計算機設計科学を形成し、限られた自動化を実現し、コインの金額に応じて変化した商品を提供します。自動販売機は契約を運ぶ手段です。コインを持っている人は誰でも供給者と取引できます。金庫をロックし、他の安全メカニズムは、自動販売機に保存されたコインと商品が破壊されないように保護し、さまざまな地域に自動販売機を展開し、利益を生み出すことを支えます。
自動販売機の概念に基づいて、ニック・サボはスマートコントラクトの定義を次のように示します:
「スマートコントラクトは、自動販売機に埋め込まれたさまざまな価値属性の範疇を超え、デジタル方式で契約を制御します。スマートコントラクトは、動的で頻繁に自発的に実行される属性を持つ財産に関与し、より良い観察と検証のポイントを提供します。その中で自発的な積極的措置は、微細な差異もなく実行されなければなりません。」
ニック・サボが私たちに伝えたいのは、スマートコントラクトの本質的な抽象概念は、個人、機関、財産の間に関係を形成するための公認のツールであり、関係を形成し合意に達するための一連の協定です。スマートコントラクトの条項(担保、所有権の分配など)は、ハードウェアとソフトウェアの処理に埋め込むことができ、違反コストを非常に高く(場合によっては手を出しにくい)する方法で実現されます。たとえば、住宅のために設計されたデジタル担保スマートコントラクトは、スマートコントラクトの設計戦略に基づいて、住宅担保契約を継続的に改善し、契約条項の処理により十分に埋め込むことができます。契約条項に基づいて、これらの協定は暗号鍵を完全に操作属性を持つ人の手に制御させ、その人がその住宅財産を正当に所有することを保証します。最も単純な形で、盗難を防ぐために、使用者は正しい解除プロセスを完了する必要があります。そうでなければ、住宅は使用不可の状態に切り替わります。たとえば、ドアのアクセスが無効になったり、設備が無効になったりします。従来の方法では、住宅が担保として使用されている場合、債権者にとって頭痛の種は、滞納された住宅を回収するのが非常に難しいことです。頻繁なコミュニケーションを通じて住宅の鍵を回収する必要があります。この問題を解決するために、スマート担保権契約を作成できます。所有者が支払いを行わない場合、スマートコントラクトは担保権契約を呼び出し、住宅の鍵の制御権を銀行に移します。この契約は、債権回収人を雇うよりも安価で効果的である可能性があります。
同時に、ニック・サボはスマートコントラクトの 3 つの要素を提案しました:
①所有者が違法な第三者を排除できるロック;
②債権者が秘密裏にアクセスできるバックドア;計算機設計科学であり、限られた自動化を実現し、コインの金額に応じて変化した商品を提供します。自動販売機は契約を運ぶ手段です。コインを持っている人は誰でも供給者と取引できます。金庫をロックし、他の安全メカニズムは、自動販売機に保存されたコインと商品が破壊されないように保護し、さまざまな地域に自動販売機を展開し、利益を生み出すことを支えます。
自動販売機の概念に基づいて、ニック・サボはスマートコントラクトの定義を次のように示します:
「スマートコントラクトは、自動販売機に埋め込まれたさまざまな価値属性の範疇を超え、デジタル方式で契約を制御します。スマートコントラクトは、動的で頻繁に自発的に実行される属性を持つ財産に関与し、より良い観察と検証のポイントを提供します。その中で自発的な積極的措置は、微細な差異もなく実行されなければなりません。」
ニック・サボが私たちに伝えたいのは、スマートコントラクトの本質的な抽象概念は、個人、機関、財産の間に関係を形成するための公認のツールであり、関係を形成し合意に達するための一連の協定です。スマートコントラクトの条項(担保、所有権の分配など)は、ハードウェアとソフトウェアの処理に埋め込むことができ、違反コストを非常に高く(場合によっては手を出しにくい)する方法で実現されます。たとえば、住宅のために設計されたデジタル担保スマートコントラクトは、スマートコントラクトの設計戦略に基づいて、住宅担保契約を継続的に改善し、契約条項の処理により十分に埋め込むことができます。契約条項に基づいて、これらの協定は暗号鍵を完全に操作属性を持つ人の手に制御させ、その人がその住宅財産を正当に所有することを保証します。最も単純な形で、盗難を防ぐために、使用者は正しい解除プロセスを完了する必要があります。そうでなければ、住宅は使用不可の状態に切り替わります。たとえば、ドアのアクセスが無効になったり、設備が無効になったりします。従来の方法では、住宅が担保として使用されている場合、債権者にとって頭痛の種は、滞納された住宅を回収するのが非常に難しいことです。頻繁なコミュニケーションを通じて住宅の鍵を回収する必要があります。この問題を解決するために、スマート担保権契約を作成できます。所有者が支払いを行わない場合、スマートコントラクトは担保権契約を呼び出し、住宅の鍵の制御権を銀行に移します。この契約は、債権回収人を雇うよりも安価で効果的である可能性があります。
同時に、ニック・サボはスマートコントラクトの 3 つの要素を提案しました:
①所有者が違法な第三者を排除できるロック;
②債権者が秘密裏にアクセスできるバックドア;
③バックドアは、違反が発生し、支払いが行われない期間のみ開かれ、最終的な電子支払いが完了した後に永久に閉じられます。
本質的に、これらのスマートコントラクトの動作原理は、コンピュータプログラムの if-then 文に似ています。スマートコントラクトはこのようにして現実世界の財産と相互作用します。事前に定義された条件がトリガーされると、スマートコントラクトは対応する契約条項を実行します。ニック・サボのスマートコントラクトの作業理論が実現されなかったのは、プログラム可能な契約をサポートするデジタルシステムが不足していたためです。金融機関が資産の移転を手動で承認する必要がある場合、スマートコントラクトの目標は達成されません。リップルラボの市場および取引責任者フィル・ラポポート(Phil Rapoport)は、「スマートコントラクトを実現する大きな障害は、現在のコンピュータプログラムが本当に支払いをトリガーできないことです」と述べています。ブロックチェーン技術の出現と広範な使用は、スマートコントラクトの実現を妨げる現状を変え、ニック・サボの理念が実現する機会を提供しています。スマートコントラクト技術は現在、ブロックチェーンの基盤の上に構築されており、ブロックチェーン自体がコンピュータプログラムであるため、スマートコントラクトは他のプログラムと同様に相互作用できます。
スマートコントラクトの理念が提唱されたことを踏まえ、近年のブロックチェーン技術の発展を組み合わせて、スマートコントラクトについてより具体的かつ詳細な説明を試みます。
スマートコントラクトは、デジタル形式で定義された約束のセットであり、デジタル資産を制御し、契約参加者が合意した権利と義務を含んでおり、コンピュータシステムによって自動的に実行されます。
約束はスマートコントラクトの本質と目的を定義します。販売契約の例を挙げてみましょう:売り手は商品を送信することを約束し、買い手は合理的な代金を支払うことを約束します。デジタル形式は、契約がコンピュータが実行可能なコードに書き込まれる必要があることを意味します。参加者が合意に達する限り、スマートコントラクトが確立した権利と義務は、コンピュータまたはコンピュータネットワークによって実行されます。
簡単な例を挙げて、スマートコントラクトを視覚化してみましょう。
If Event_X_Happened:
Send (アリス,1000$)
Else:
Send (ボブ,1000$)
これは、イベント X が発生した場合、契約がアリスに 1000 ドルを送信し、そうでなければボブに 1000 ドルを送信することを意味します。
これが最も単純な契約です。
以下の図は、スマートコントラクトモデルの概念を示しており、各構成要素の定義は次のとおりです。
①契約参加者:スマートコントラクトを実行する関連参加者。
②契約リソース集合:スマートコントラクトの実行に関与する参加者リソース、たとえば参加者のアカウント、所有するデジタル資産など。
③自動状態機:スマートコントラクトの次のステップの実行に関する重要な要素であり、現在のリソース状態の判断、次の契約トランザクションの実行選択などを含みます。
④契約トランザクション集合:スマートコントラクトの次のアクションまたは行動の集合であり、契約資産を制御し、受信した外部情報に応答します。
スマートコントラクトを作成するためのツールは多くあります。たとえば、Visual Studio などです。その中で、最も簡単で迅速な開発方法は、ブラウザベースの開発ツールを使用することです。たとえば、Remix です。http://remix.ethereum.org のウェブサイトを開くと、直接使用できます。Remix は新しい名前で、以前は browser-solidity と呼ばれていました。Remix は、豊富な Solidity 統合開発環境を提供し、ブラウザ上でスマートコントラクトの作成、開発、デプロイ、デバッグを行うことができます。コントラクトに関連する操作(作成、公開、デバッグなど)は、すべて同じ環境内で完了でき、他のウィンドウやページに切り替える必要はありません。
Remix のオンラインバージョンを使用することに慣れていない人もいます。Remix はオープンソースツールであり、https//github.com/ethereum/browser-solidy からソフトウェアパッケージをダウンロードできます。コンパイル後、Remix はローカルで使用できます。ローカルツールを使用するもう一つの利点は、自分で構築したプライベートネットワークに接続できることです。そうでなければ、ウェブ上でコードを記述した後、ファイルをローカルにコピーし、コンパイルしてプライベートネットワークに公開する必要があります。以下に Remix の使い方を段階的に説明します。
1. remix.ethereum.org の URL を開くと、ブラウザにデフォルトでスマートコントラクトが開かれます。
必要ない場合は削除できます。
2. 左側のメニューから + を選択して新しいコントラクトを作成します。
3. この Solidity ファイルに名前を付け、.sol を拡張子として使用します。コントラクト名を HelloWorld と入力し、「OK」をクリックすると、空白のコントラクトが作成されます。以下の図のようになります:
4. 制作バー内の空白に、以下のコードを入力すると、最初のコントラクトを作成できます。
コントラクトの詳細は第 3 章で説明します。今は簡単に理解してください。キーワード contract を使用してコントラクトを作成し、グローバル状態変数と関数を宣言し、拡張子が.sol のファイルとしてコントラクトを保存できます。以下のソースコードスニペットでは、GetHelloWorld 関数が HelloWorld コントラクトを呼び出すと、「Hello World」という文字列が返されます。
Remix の右側には操作ウィンドウがあり、多くのタブページがあります:コンパイル、実行、設定、デバッグ、分析、サポートなど。これらの操作は、コントラクトのコンパイル、公開、デバッグ、呼び出しに使用されます。デバッグタブでは、コントラクトがバイトコード(イーサリアムが理解できるコード)にコンパイルされ、デバッグ中に発生した警告やエラーメッセージが表示されます。これらの情報は重要であり、解決することでコントラクトの堅牢性が向上します。実行ページは、コントラクトページと比較して、より多くの時間を費やす必要があります。「環境」オプションでは、Remix がブラウザ内でイーサリアムの実行環境をバインドしているため、JavaScript 仮想マシンを使用してコントラクトを公開できます。Injected Web3 オプションは、Mist や MetaMask ツール(次の章で紹介します)を使用するためのものです。Web3 Provider オプションは、ローカルで Remix を使用してプライベートチェーンに接続する際に使用されます。この章の例では、デフォルトで JavaScript 仮想マシンオプションを使用します。第 3 章で Solidity について説明する際に、残りのオプションについても議論します。
5. ただし、コントラクトを公開する最も重要な操作は、新規作成ボタンを使用することです。以下の図のようになります:
6. 新規作成ボタンをクリックすると、ブラウザでイーサリアムが実行され、新規作成ボタンの下にコントラクト内の関数が表示されます。例では唯一の関数 GetHelloWorld しかないため、ここにはこの 1 つのオプションしかありません。以下の図のようになります:
7. GetHelloWorld ボタンをクリックすると、この関数を呼び出して実行できます。実行結果は Remix の下の領域に表示されます。以下の図のようになります:
おめでとうございます!あなたの最初のコントラクトが作成、公開、実行に成功しました。直接コードを入力するのが好きでない場合は、この章の HelloWorld コントラクトコードを Remix にコピーして直接使用できます。
Remix は公開プロセスを簡素化しましたが、システムのバックエンドでは多くのプログラムが実行されています。これらのステップを理解することで、公開プロセスをよりよく制御できるようになります。
①自動化の次元。スマートコントラクトはトリガー条件を自動的に判断し、次のトランザクションを選択します。一方、従来の契約はトリガー条件を手動で判断する必要があり、条件判断の正確性やタイムリーさなどの面でスマートコントラクトには及びません。
②主観と客観の次元。スマートコントラクトは客観的な要求のシーンに適しており、従来の契約は主観的な要求のシーンに適しています。スマートコントラクト内の約束、担保、罰則は事前に明確にする必要がありますが、主観的な判断基準は契約自動機に組み込むことが難しく、契約トランザクションの実行を指導することが難しくなります。
③コストの次元。スマートコントラクトの実行コストは従来の契約よりも低く、契約の権利、義務条件がコンピュータプログラムに書き込まれて自動的に実行されるため、状態判断、報酬と罰則の実行、資産処分などの面で低コストの利点があります。
④実行時間の次元。スマートコントラクトは事前に予約された予防的な実行モデルです。一方、従来の契約は事後実行であり、状態に基づいて報酬と罰則を決定するモデルです。
⑤違反罰則の次元。スマートコントラクトは担保、保証金、デジタル資産などのデジタル属性を持つ担保資産に依存しており、違反が発生した場合、参加者の資産は損失を被ります。一方、従来の契約の違反罰則は主に刑罰に依存しており、違反が発生した場合、法的手段を用いて権利を保護できます。
⑥適用範囲の次元。スマートコントラクト技術は世界中で採用可能であり、グローバルに適用されます。一方、従来の契約は特定の管轄区域に制限されており、異なる国際地域の法律や文化などの要因が従来の契約の実行プロセスに影響を与えます。
合約のデプロイ方法#
最初のステップは、Solidity コンパイラを使用して合約をコンパイルすることです(次の章では Solidity コンパイラのダウンロードと使用方法について説明します)。
コンパイル後、主に 2 つの出力物があります:
・ABI 仕様
・合約バイトコード
ABI(Application Binary Interface)は、引数付きの外部関数と公開関数で構成されるインターフェースです。合約と他のユーザーが合約内の関数を呼び出す準備ができている場合、ABI を使用して実現できます。
バイトコードは合約の表現形式であり、イーサリアム上で実行されます。公開時にはバイトコードが必要であり、ABI は合約内の関数を呼び出すときにのみ使用されます。ABI を使用して新しい合約インスタンスを作成できます。
合約の公開自体がトランザクションです。したがって、合約を公開するには、新しいトランザクションを作成する必要があります。公開時には、バイトコードと ABI を提供する必要があります。トランザクションが実行される際にはガスが消費されるため、これらのガスは合約によって提供される必要があります。一度トランザクションがパッケージ化されてブロックチェーンに書き込まれると、合約アドレスを通じて合約を使用できるようになり、呼び出し側も新しいアドレスを通じて合約内の関数を呼び出すことができます。
ブロックチェーンとイーサリアムの動作原理を深く理解することは、Solidity を使用してより堅牢で安全かつ効率的なスマートコントラクトを書くのに役立ちます。この章では、ブロックチェーンの基本概念を紹介し、ブロックチェーンとは何か、なぜそれが重要なのか、分散型および分散アプリケーションを構築する上での価値について説明しました。この章では、ブロックチェーンのアーキテクチャと、トランザクション、ブロック、ガス、イーサリアム、アカウント、暗号学、マイニングなどの重要な概念についても簡単に紹介しました。この章では、スマートコントラクトのいくつかの内容にも初めて触れ、Remix を使用してスマートコントラクトを作成し、それを実行する方法についても説明しました。この章では比較的簡単に説明しましたが、後の章でさらに詳細に説明します。その時には、Solidity を使用してスマートコントラクトを開発できるようになります。
この章では、イーサリアムのいくつかのツールについては言及していないことに気付くでしょう。次の章では、イーサリアムと関連ツールのインストールについて説明します。イーサリアムのエコシステムは非常に豊富で、多くのツールが利用可能です。私たちは、web3.js、TestRPC、Geth、Mist、MetalMask などのいくつかの重要なものを選んで紹介します。
スマートコントラクトとブロックチェーン#
ニック・サボのスマートコントラクトの作業理論が実現されなかった重要な理由の一つは、プログラム可能な契約をサポートするデジタルシステムと技術が不足していたためです。ブロックチェーン技術の出現はこの問題を解決し、プログラム可能な契約をサポートするだけでなく、分散型、不変性、プロセスの透明性と追跡可能性などの利点を持ち、スマートコントラクトに自然に適しています。したがって、スマートコントラクトはブロックチェーン技術の特性の一つとも言えます。
ブロックチェーン 1.0 がビットコインを代表し、通貨と支払い手段の分散化の問題を解決したとすれば、ブロックチェーン 2.0 は市場全体の分散化をより広範に行い、ブロックチェーン技術を利用してビットコインだけでなく、さまざまなデジタル資産を変換し、異なる資産の価値を創造することを目指しています。ブロックチェーン技術の分散型台帳機能は、さまざまなタイプの資産や契約を作成、確認、移転するために使用できます。ほぼすべてのタイプの金融取引は、株式、プライベートエクイティ、クラウドファンディング、債券、先物、オプションなどの他のタイプの金融派生商品を含め、ブロックチェーン上で使用するために改造できます。
スマートコントラクトは、コンピュータが実行するプログラムの一部のように見え、正確に自動的に実行されることを満たす必要がありますが、なぜ従来の技術では実現が難しく、ブロックチェーン技術などの新しい技術が必要なのでしょうか?従来の技術は、ソフトウェア制限や性能最適化などの方法を通じて、ブロックチェーンの特性を同時に実現することはできません。第一に、データは削除や変更ができず、新たに追加することしかできず、歴史の追跡可能性が保証され、悪意のコストが非常に高くなります。なぜなら、その悪意の行為は永遠に記録されるからです。第二に、分散型であり、中央集権的な要因の影響を避けます。
ブロックチェーン技術に基づくスマートコントラクトは、スマートコントラクトのコスト効率の利点を発揮できるだけでなく、悪意のある行為が契約の正常な実行を妨げることを回避できます。スマートコントラクトをデジタル形式でブロックチェーンに書き込むことで、ブロックチェーン技術の特性がストレージ、読み取り、実行の全プロセスを透明かつ追跡可能で不変に保証します。同時に、ブロックチェーンに内蔵されたコンセンサスアルゴリズムによって、スマートコントラクトが効率的に実行できる状態機構システムが構築されます。
スマートコントラクトの動作原理#
ブロックチェーンに基づくスマートコントラクトは、トランザクション処理と保存のメカニズム、およびさまざまなスマートコントラクトを受け入れ、処理するための完備された状態機構を含んでおり、トランザクションの保存と状態処理はすべてブロックチェーン上で行われます。トランザクションは、送信するデータを含み、イベントはこれらのデータの説明情報です。トランザクションとイベント情報がスマートコントラクトに渡されると、コントラクトリソース集合内のリソース状態が更新され、スマートコントラクトが状態機構の判断をトリガーします。自動状態機構内の特定のアクションのトリガー条件が満たされると、状態機構は事前に設定された情報に基づいてコントラクトアクションを自動的に実行します。
スマートコントラクトシステムは、イベントの説明情報に含まれるトリガー条件に基づいて、トリガー条件が満たされると、スマートコントラクトから事前に設定されたデータリソースやトリガー条件を含むイベントを自動的に発信します。スマートコントラクトシステムの核心は、スマートコントラクトがトランザクションとイベントの形でスマートコントラクトモジュールによって処理され、出力されるのがトランザクションとイベントのセットであることです。スマートコントラクトはトランザクション処理モジュールと状態機構で構成されたシステムであり、スマートコントラクトを生成したり、変更したりすることはありません。その存在は、複雑なトリガー条件を持つ