banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

ブロックチェーン、イーサリアムとスマートコントラクト

イーサリアムの主な動作原理は、アカウントから発信されたトランザクションを受け入れ、それらの状態を更新し、その状態を維持することです。別のトランザクションがそれらを更新するまで、イーサリアム上では、トランザクションの受け入れ、実行、台帳への書き込みのプロセスが 2 つの段階に分かれています。イーサリアムはトランザクションの受け入れと実行、台帳への書き込みの間でデカップリングされています。このようなデカップリングは、分散型および分散アーキテクチャにとって、システムが正常に機能するのを効果的に支えることができます。

ブロックチェーンには主に以下の 3 つの用途があります。

・信頼:ブロックチェーンは、分散型アプリケーションを作成するために使用でき、データが複数の人によって共同で制御され、その中の誰もが以前の記録を変更または削除する権限を持たないことを実現します。誰かが実際にそれを行った場合でも、彼が生成したデータは他の参加者によって受け入れられません。

・自治性:ブロックチェーン上のアプリケーションには唯一の所有者が存在しません。唯一の所有者がいないため、誰もそれを単独で制御することはできませんが、誰もがその行動を通じてガバナンスプロセスに参加することができ、操作されにくく腐敗を引き起こしにくい解決策の構築に役立ちます。

・仲介の排除:ブロックチェーンに基づくアプリケーションは、既存のプロセスの中間段階を排除することができます。たとえば、車両登録や運転免許証の発行などのシナリオでは、通常、中間の役割を担う者が存在し、車両登録や運転免許証の発行の責任を負っています。ブロックチェーンに基づいてプロセスを設計すれば、この中間の役割は存在する必要がなくなります。なぜなら、ブロックチェーン上のデータが確認された後、運転免許証は自動的に発行され、車両は自動的に登録されるからです。ブロックチェーンは新しい時代を切り開き、多くのビジネスが中間の権威機関による裏付けを必要としなくなります。

暗号学は、理解しやすく、明確な内容を秘密の、隠された、無意味な内容に変換する科学です。同様に、復号はその逆の操作です。暗号技術はデータの伝送と保存に役立ち、簡単には復号できません。

コンピュータ分野には、対称暗号と非対称暗号の 2 種類の暗号技術があります。

・対称暗号と復号:対称暗号は、暗号化と復号のプロセスで同じ鍵を使用することを指します。この技術を使用して情報を交換する場合、多くの人が同じ鍵を使用することを意味します。

・非対称暗号と復号:暗号化と復号のプロセスで 2 つの鍵を使用します。いずれの鍵も暗号化と復号に使用できます。公開鍵で暗号化された情報は、秘密鍵で復号できます。秘密鍵で暗号化された情報は、公開鍵で復号できます。以下の例で説明します。トムはアリスの公開鍵を使用して情報を暗号化し、アリスに送信します。アリスは彼女の秘密鍵を使用して復号し、元の情報を抽出できます。簡単に言えば、アリスの公開鍵で暗号化された情報は、彼女自身の秘密鍵でしか復号できません。これが非対称暗号の一般的な応用シーンです。非対称暗号には、後で紹介するデジタル署名の用途もあります。

ハッシュは、入力データを固定長のランダムな文字列(ハッシュ値)に変換するプロセスですが、結果から元のデータを逆生成または識別することはできません。したがって、ハッシュはデータの指紋とも呼ばれます。ハッシュ値に基づいて入力データを導出することはほぼ不可能であり、元のデータがわずかに変化しても、全く異なるハッシュ値が生成されます。これにより、誰も元のデータに手を加えることができないことが保証されます。ハッシュにはもう 1 つの特徴があります。入力された文字列データの長さが異なっていても、生成されるハッシュ値の長さは固定されています。たとえば、SHA256 ハッシュアルゴリズムを使用すると、入力データの長さに関係なく、常に 256 バイトのハッシュ値が生成されます。データ量が非常に大きい場合、これは非常に便利です。常に 256 バイトのハッシュ値が生成されるため、証拠として保存できます。イーサリアムは多くの場所でハッシュ技術を使用しており、各トランザクションに対してハッシュを行い、2 つのトランザクションのハッシュ値を再度ハッシュし、最終的に同じブロック内の各トランザクションにルートハッシュ値を生成します。

ハッシュにはもう 1 つの重要な特徴があります。数学的に見て、2 つの異なる入力データが同じハッシュ値を生成することはありません。同様に、計算上および数学上、ハッシュ値から入力値を逆算することは不可能です。

イーサリアムは Keccak256 をハッシュアルゴリズムとして使用しています。

以下のスクリーンショットは、ハッシュの例を示しています。入力のリテッシュ・モディは、以下の図に示すようにハッシュ値を生成しました:

入力データにわずかな変更を加えると [1]、全く異なるハッシュ値が生成されます。以下の図に示します:

[1] ここでは 2 つの単語の間のスペースを削除しました。—— 訳者注

非対称暗号は、デジタル署名の作成と検証時に非対称鍵を使用する重要な応用の 1 つです。デジタル署名は、紙に手書きされた署名に似ています。手書きの署名と同様に、デジタル署名は個人を識別するのに役立ち、情報が伝達中に改ざんされないことを保証します。デジタル署名を理解するために、例を挙げてみましょう。

アリスはトムにメッセージを送信する準備をしています。さて、問題は、トムが受け取ったメッセージがアリスから送信されたものであることをどのように確認できるか、また、メッセージが伝達中に改ざんされていないことをどのように確認できるかです。解決策は、元のメッセージ / トランザクションを送信しないことです。アリスはまず、送信するメッセージのハッシュ値を取得し、次に彼女の秘密鍵でそのハッシュ値を暗号化し、最後に生成されたデジタル署名をハッシュ値に添付してトムに送信します。トムはメッセージを受け取った後、アリスの公開鍵を使用してデジタル署名を抽出し、復号して元のハッシュ値を見つけます。同時に、彼は実際に受け取ったメッセージからハッシュ値を抽出し、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)と呼ばれます。また、他のアルゴリズムもありますが、イーサリアムはこれらのアルゴリズムを使用していないため、本書では詳しく説明しません。ブロックヘッダーとその構成要素は以下の図に示されています:

[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)は、ビットコインのコア開発者の 1 人です。彼はスマートコントラクト(Smart contract)の現状をまとめ、「スマートコントラクトの議論の結論は、誰もスマートコントラクトが何であるかを理解していないということです。スマートコントラクトを実施するには、オラクル(oracles)が必要です」と述べています。

確かに、スマートコントラクトの理念と本質を明確にすることは容易ではありません。

私たちはスマートコントラクトの理念の起源から始めます。「スマートコントラクト」という概念は、コンピュータ科学者で暗号学者のニック・サボ(Nick Szabo)によって 1993 年頃に提唱されました。1994 年に彼は「スマートコントラクト」(Smart contracts)という論文を書き、スマートコントラクトの先駆けとなりました。

ニック・サボは、スマートコントラクトの説明を自動販売機の例から始めます。私たちは、自動販売機がスマートコントラクトの原始的な祖先であると考えることができます。潜在的な損失を評価した後、自動販売機は、破壊者が支払うコストよりもはるかに少ない金額を金庫に持つことができます。自動販売機は表示された商品価格に基づいてコインを受け取り、単純なメカニズムを通じて最初のコンピュータ設計科学を形成し、限られた自動化を行い、投じられた金額に応じて変化する商品を提供します。自動販売機は契約を運ぶ手段です。コインを持っている人は誰でも供給者と取引できます。金庫をロックし、他の安全メカニズムが自動販売機に保存されたコインと商品を保護し、さまざまな地域に自動販売機を展開し、利益を生み出すことを支えます。

自動販売機の概念に基づいて、ニック・サボはスマートコントラクトの定義を次のように示します:

「スマートコントラクトは、自動販売機に埋め込まれたさまざまな価値属性の範囲を超え、契約をデジタル的に制御します。スマートコントラクトは、動的で頻繁に自発的に実行される特性を持つ財産を含み、より良い観察と検証のポイントを提供し、積極的な措置は正確に実行されなければなりません。」

ニック・サボが私たちに伝えたいのは、スマートコントラクトの本質的な抽象概念は、個人、機関、財産の間に関係を形成するための公認のツールであり、関係を形成し、合意に達するための協定のセットであるということです。スマートコントラクトの条項(担保、所有権の分配など)は、ハードウェアとソフトウェアの処理に埋め込むことができ、違約コストを非常に高く(時には恐ろしいほど)する方法で設計されています。たとえば、住宅のために設計されたデジタル保証スマートコントラクトは、スマートコントラクトの設計戦略に基づいて、住宅担保契約を継続的に改善し、契約条項の処理により完全に埋め込むことができます。契約条項に基づいて、これらの契約は暗号鍵を完全に操作属性を持つ人の手に制御させ、その人がその住宅財産を正当に所有することを保証します。最も単純な形で、盗難を防ぐために、使用者は正しい解除プロセスを完了する必要があり、そうでなければ住宅は使用不可の状態に切り替わります。たとえば、ドアのアクセスが無効になったり、設備が無効になったりします。従来の方法では、住宅が担保として使用されている場合、債権者にとって頭痛の種となる問題は、滞納された住宅を回収するのが非常に難しいことです。頻繁なコミュニケーションを通じて住宅の鍵を回収する必要があります。この問題を解決するために、スマート担保権契約を作成することができます。もし所有者が支払いをしなければ、スマートコントラクトは担保権契約を呼び出し、住宅の鍵の制御権を銀行に渡します。この契約は、債権回収人を雇うよりも安価で効果的である可能性があります。

同時に、ニック・サボはスマートコントラクトの 3 つの要素を提案しました:

①所有者が不法な第三者を排除できるロック;

②債権者が秘密裏にアクセスできるバックドア;計算機設計科学であり、限られた自動化を行い、投じられた金額に応じて変化する商品を提供します。自動販売機は契約を運ぶ手段です。コインを持っている人は誰でも供給者と取引できます。金庫をロックし、他の安全メカニズムが自動販売機に保存されたコインと商品を保護し、さまざまな地域に自動販売機を展開し、利益を生み出すことを支えます。

自動販売機の概念に基づいて、ニック・サボはスマートコントラクトの定義を次のように示します:

「スマートコントラクトは、自動販売機に埋め込まれたさまざまな価値属性の範囲を超え、契約をデジタル的に制御します。スマートコントラクトは、動的で頻繁に自発的に実行される特性を持つ財産を含み、より良い観察と検証のポイントを提供し、積極的な措置は正確に実行されなければなりません。」

ニック・サボが私たちに伝えたいのは、スマートコントラクトの本質的な抽象概念は、個人、機関、財産の間に関係を形成するための公認のツールであり、関係を形成し、合意に達するための協定のセットであるということです。スマートコントラクトの条項(担保、所有権の分配など)は、ハードウェアとソフトウェアの処理に埋め込むことができ、違約コストを非常に高く(時には恐ろしいほど)する方法で設計されています。たとえば、住宅のために設計されたデジタル保証スマートコントラクトは、スマートコントラクトの設計戦略に基づいて、住宅担保契約を継続的に改善し、契約条項の処理により完全に埋め込むことができます。契約条項に基づいて、これらの契約は暗号鍵を完全に操作属性を持つ人の手に制御させ、その人がその住宅財産を正当に所有することを保証します。最も単純な形で、盗難を防ぐために、使用者は正しい解除プロセスを完了する必要があり、そうでなければ住宅は使用不可の状態に切り替わります。たとえば、ドアのアクセスが無効になったり、設備が無効になったりします。従来の方法では、住宅が担保として使用されている場合、債権者にとって頭痛の種となる問題は、滞納された住宅を回収するのが非常に難しいことです。頻繁なコミュニケーションを通じて住宅の鍵を回収する必要があります。この問題を解決するために、スマート担保権契約を作成することができます。もし所有者が支払いをしなければ、スマートコントラクトは担保権契約を呼び出し、住宅の鍵の制御権を銀行に渡します。この契約は、債権回収人を雇うよりも安価で効果的である可能性があります。

同時に、ニック・サボはスマートコントラクトの 3 つの要素を提案しました:

①所有者が不法な第三者を排除できるロック;

②債権者が秘密裏にアクセスできるバックドア;

③バックドアは、違約が発生し、支払いが行われない期間にのみ開かれ、最終的な電子支払いが完了した後に永久に閉じられます。

本質的には、これらのスマートコントラクトの動作原理は、コンピュータプログラムの if-then 文に似ています。スマートコントラクトはこのようにして現実世界の財産と相互作用します。事前に定義された条件がトリガーされると、スマートコントラクトは対応する契約条項を実行します。ニック・サボのスマートコントラクトの作業理論が実現しなかったのは、プログラム可能な契約をサポートするデジタルシステムが不足していたからです。金融機関が資産の移転を手動で承認する必要がある場合、スマートコントラクトの目標は達成されません。リップルラボの市場および取引責任者フィル・ラポポート(Phil Rapoport)は、「スマートコントラクトを実現する大きな障害は、現在のコンピュータプログラムが実際に支払いをトリガーできないことです」と述べています。ブロックチェーン技術の出現と広範な使用は、スマートコントラクトの実現を妨げる現状を変え、ニック・サボの理念が実現する機会を提供しています。スマートコントラクト技術は現在、ブロックチェーンの基盤の上に構築されており、ブロックチェーン自体がコンピュータプログラムであるため、スマートコントラクトは他のプログラムと同様に相互作用できます。

スマートコントラクトの理念が提唱されたことを踏まえ、近年のブロックチェーン技術の発展を考慮し、スマートコントラクトについてより具体的かつ詳細な説明を試みます。

スマートコントラクトは、デジタル形式で定義された約束のセットであり、デジタル資産を制御し、契約参加者が合意した権利と義務を含み、コンピュータシステムによって自動的に実行されます。

約束はスマートコントラクトの本質と目的を定義します。販売契約の例を挙げてみましょう:売り手は商品を送信することを約束し、買い手は合理的な代金を支払うことを約束します。デジタル形式は、契約がコンピュータで実行可能なコードに書き込まれる必要があることを意味します。参加者が合意に達すると、スマートコントラクトが確立した権利と義務は、コンピュータまたはコンピュータネットワークによって実行されます。

簡単な例を挙げて、スマートコントラクトを視覚化してみましょう。

もし Event_X_Happened:

Send (アリス,1000$)

Else:

Send (ボブ,1000$)

これは、イベント X が発生した場合、契約がアリスに 1000 ドルを送信し、そうでなければボブに 1000 ドルを送信することを意味します。

これが最も単純な契約です。

以下の図は、スマートコントラクトモデルの概念を示しており、各構成要素の定義は以下の通りです。

①契約参加者:スマートコントラクトを実行する関連参加者。

②契約リソース集合:スマートコントラクトの実行に関与する参加者リソース、たとえば、参加者のアカウントや所有するデジタル資産など。

③自動状態機:スマートコントラクトの次のステップを実行するための重要な要素であり、現在のリソース状態の判断や次の契約トランザクションの実行選択を含みます。

④契約トランザクション集合:スマートコントラクトの次のアクションまたは行動の集合であり、契約資産を制御し、受信した外部情報に応答します。

image

スマートコントラクトを作成するためのツールは多くあります。たとえば、Visual Studio などです。その中で、最も簡単で迅速な開発方法は、ブラウザベースの開発ツールを使用することです。たとえば、Remix を使用します。http://remix.ethereum.org のウェブサイトを開くと、直接使用できます。Remix は新しい名前で、以前は browser-solidity と呼ばれていました。Remix は豊富な Solidity 統合開発環境を提供し、ブラウザ上でスマートコントラクトの作成、開発、デプロイ、デバッグを行うことができます。コントラクトに関連する操作(作成、公開、デバッグなど)は、他のウィンドウやページに切り替えることなく、同じ環境内で完了できます。

Remix のオンラインバージョンを使用することに慣れていない人もいます。Remix はオープンソースツールであり、https//github.com/ethereum/browser-solidy からソフトウェアパッケージをダウンロードし、コンパイルすることでローカルで使用できます。ローカルツールを使用するもう 1 つの利点は、自分で構築したプライベートネットワークに接続できることです。そうでなければ、ウェブ上でコードを記述した後、ファイルをローカルにコピーし、コンパイルしてプライベートネットワークに公開する必要があります。以下では、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 は公開プロセスを簡素化しましたが、システムのバックエンドでは多くのプログラムが実行されています。これらのステップを理解することで、公開プロセスをよりよく把握できます。

image

①自動化の次元。スマートコントラクトはトリガー条件を自動的に判断し、次のトランザクションを選択しますが、従来の契約は手動でトリガー条件を判断する必要があり、条件判断の正確性やタイムリーさなどの面でスマートコントラクトには及びません。

②主観的および客観的次元。スマートコントラクトは客観的な要求のシーンに適しており、従来の契約は主観的な要求のシーンに適しています。スマートコントラクト内の合意、担保、罰則は事前に明確にする必要がありますが、主観的な判断基準は契約自動機に組み込むことが難しく、契約トランザクションの実行を指導することも困難です。

③コストの次元。スマートコントラクトの実行コストは従来の契約よりも低く、契約の権利、義務条件がコンピュータプログラムに書き込まれて自動的に実行されるため、状態判断、報酬と罰則の実行、資産処分などの面で低コストの利点があります。

④実行時間の次元。スマートコントラクトは事前に予約された予防的な実行モデルに属しますが、従来の契約は事後実行を採用し、状態に基づいて報酬と罰則を決定します。

⑤違約罰則の次元。スマートコントラクトは、担保、保証金、デジタル資産などのデジタル属性を持つ担保資産に依存しており、違約が発生した場合、参加者の資産は損失を被ります。一方、従来の契約の違約罰則は主に刑罰に依存しており、違約が発生した場合、法的手段を用いて権利を保護することができます。

⑥適用範囲の次元。スマートコントラクト技術は世界中で採用可能であり、グローバルに適用されますが、従来の契約は特定の管轄区域に制限されており、異なる国際地域の法律や文化などの要因が従来の契約の実行プロセスに影響を与えます。

合約のデプロイ方法#

最初のステップは、Solidity コンパイラを使用して合約をコンパイルすることです(次の章では Solidity コンパイラのダウンロードと使用方法を紹介します)。

コンパイル後、主に 2 つの出力物があります:

・ABI 仕様

・合約バイトコード

ABI(Application Binary Interface)は、引数付きの外部関数と公共関数で構成されるインターフェースです。合約と他のユーザーが合約内の関数を呼び出す準備ができている場合、ABI を使用して実現できます。

バイトコードは合約の表現形式であり、イーサリアム上で実行されます。公開時には、バイトコードが必要であり、ABI は合約内の関数を呼び出すときにのみ使用されます。ABI を使用して新しい合約インスタンスを作成できます。

合約の公開自体がトランザクションです。したがって、合約を公開するには、新しいトランザクションを作成する必要があります。公開時には、バイトコードと ABI を提供する必要があります。トランザクションが実行される際にはガスを消費する必要があり、これらのガスは合約によって提供される必要があります。一度トランザクションがブロックチェーンにパッケージされて書き込まれると、合約アドレスを介して合約を使用できるようになり、呼び出し側も新しいアドレスを介して合約内の関数を呼び出すことができます。

ブロックチェーンとイーサリアムの動作原理を深く理解することは、Solidity を使用してより堅牢で安全かつ効率的なスマートコントラクトを書くのに役立ちます。この章では、ブロックチェーンの基本概念を紹介し、ブロックチェーンとは何か、ブロックチェーンがなぜ重要なのか、分散型および分散アプリケーションを構築する際の価値について説明しました。この章では、ブロックチェーンのアーキテクチャや、トランザクション、ブロック、ガス、イーサ、アカウント、暗号学、マイニングなどの重要な概念についても簡単に紹介しました。この章では、スマートコントラクトに関するいくつかの内容にも触れました。たとえば、Remix を使用してスマートコントラクトを作成し、それを実行する方法について説明しました。この章では比較的簡単に説明しましたが、後でさらに詳細に説明します。その時には、Solidity を使用してスマートコントラクトを開発できるようになります。

この章では、イーサリアムのいくつかのツールについて言及していないことに気付くでしょう。次の章では、イーサリアムと関連ツールのインストールについて紹介します。イーサリアムのエコシステムは非常に豊富で、多くのツールが利用可能です。私たちは、web3.js、TestRPC、Geth、Mist、MetalMask などの重要なツールを選んで紹介します。

スマートコントラクトとブロックチェーン#

ニック・サボのスマートコントラクトの作業理論が実現しなかった重要な理由の 1 つは、プログラム可能な契約をサポートするデジタルシステムと技術が不足していたことです。ブロックチェーン技術の出現はこの問題を解決し、プログラム可能な契約をサポートするだけでなく、分散型、不変性、プロセスの透明性と追跡可能性などの利点を持ち、スマートコントラクトに自然に適しています。したがって、スマートコントラクトはブロックチェーン技術の特性の 1 つとも言えます。

もしブロックチェーン 1.0 がビットコインを代表とし、通貨と支払い手段の分散化問題を解決したとすれば、ブロックチェーン 2.0 は市場全体の分散化をより広範に行い、ブロックチェーン技術を利用してさまざまな異なるデジタル資産を変換し、単にビットコインだけでなく、異なる資産の価値を創造することを目指しています。ブロックチェーン技術の分散型台帳機能は、さまざまなタイプの資産や契約を作成、確認、移転するために使用できます。ほぼすべての種類の金融取引は、ブロックチェーン上で使用されるように変換できます。これには、株式、プライベートエクイティ、クラウドファンディング、債券、先物、オプションなどの他のタイプの金融派生商品が含まれます。

スマートコントラクトは、コンピュータが実行するプログラムの一部のように見えます。正確に自動実行できるのであれば、なぜ従来の技術では実現が難しいのか、なぜブロックチェーン技術などの新しい技術が必要なのでしょうか?従来の技術は、ソフトウェア制限や性能最適化などの方法を通じても、ブロックチェーンの特性を同時に実現することはできません。1 つはデータを削除または変更できず、新しいデータのみを追加できるため、履歴の追跡が保証され、悪意のある行為のコストが非常に高くなります。なぜなら、その悪意のある行為は永遠に記録されるからです。2 つ目は分散型であり、中央集権的な要因の影響を回避します。

ブロックチェーン技術に基づくスマートコントラクトは、スマートコントラクトのコスト効率の利点を発揮できるだけでなく、悪意のある行為が契約の正常な実行を妨げるのを回避できます。スマートコントラクトをデジタル形式でブロックチェーンに書き込むことで、ブロックチェーン技術の特性がストレージ、読み取り、実行の全プロセスを透明かつ追跡可能にし、不変性を保証します。同時に、ブロックチェーンに内蔵されたコンセンサスアルゴリズムによって、スマートコントラクトが効率的に実行できる状態機構システムが構築されます。

スマートコントラクトの動作原理#

ブロックチェーンに基づくスマートコントラクトには、トランザクション処理と保存のメカニズム、およびさまざまなスマートコントラクトを受け入れ、処理するための完全な状態機構が含まれています。トランザクションには、送信するデータが含まれ、イベントはこれらのデータの説明情報です。トランザクションおよびイベント情報がスマートコントラクトに渡されると、コントラクトリソース集合内のリソース状態が更新され、スマートコントラクトが状態機構の判断をトリガーします。自動状態機構内のいくつかのアクションのトリガー条件が満たされると、状態機構は事前に設定された情報に基づいて契約アクションを自動的に実行します。

スマートコントラクトシステムは、イベント説明情報に含まれるトリガー条件に基づいて、トリガー条件が満たされると、スマートコントラクトから事前に設定されたデータリソースを自動的に発信し、トリガー条件を含むイベントを発信します。スマートコントラクトシステムのコアは、スマートコントラクトがトランザクションとイベントの形式で処理され、出力されるのがトランザクションとイベントのセットであることです。スマートコントラクトはトランザクション処理モジュールと状態機構で構成されたシステムであり、スマートコントラクトを生成したり変更したりすることはありません。その存在は、複雑なトリガー条件を持つデジタル化された約束が参加者の意志に従って正しく実行されることを可能にするためだけのものです。

ブロックチェーンに基づくスマートコントラクトの構築と実行は、以下のように分かれています。

①複数のユーザーが共同でスマートコントラクトを策定します。

②契約は P2P ネットワークを介して拡散し、ブロックチェーンに保存されます。

③ブロックチェーンが構築したスマートコントラクトが自動的に実行されます。

ステップ①「複数のユーザーが共同でスマートコントラクトを策定する」プロセスには、以下のステップが含まれます:

A. ユーザーはまずブロックチェーンのユーザーとして登録する必要があり、ブロックチェーンはユーザーに公開鍵と秘密鍵を返します。公開鍵はユーザーのブロックチェーン上

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。