以前の記事に書いた通り、Smart Contractとは国や登記所、銀行などの中央機関の執行なしで、事前に取り決めたプログラム(Contract)を執行する仕組みです。今回は、Smart Contractの実行基盤として注目されているEthereumの基礎的な仕組みをまとめたいと思います。
Smart Contractに関してはこちらもどうぞ
そもそも中央機関がないと何がいいの?
中央機関なく執行できることのメリットは以下の2点に集約されます。
- 中央機関維持のためのコスト削減
- 取引信頼性の向上(中央機関による恣意的な運用の排除、ダウンタイムの削減)
中央機関維持のためのコスト削減
中央機関を置いて取引の安全性を担保するためには、当然中央機関を担う人件費やシステム投資費用がかかってきます。それに対して、Ethereumを使用すると、取引のたびに取引手数料(gasと呼んでいます)がかかりますが、固定費としてかかる費用は発生しなくなります。
さらに、中央機関を置く場合は取引種類ごとにそれぞれを担当する中央機関を置く必要があります(例えば、お金の決済には銀行、不動産登記には登記所)が、Ethereumは様々な取引(プログラム)を管理するプラットフォームとしての役割を持っているため、取引種類が増えたとしても新たなプラットフォームを構築する必要はありません。
以上の理由から、Ethereumを採用することで、取引コストが削減されると期待されています。
取引信頼性の向上
信頼性の向上はビジネス的な観点と、システム的な観点の両面から説明できます。
まず、ビジネス的な観点では中央機関が恣意的に契約条件を変更するなどの運用ができなくなるため、取引の透明性が向上します。
システム的な観点では、分散的な仕組みを採用しているため、あるノードが壊れたとしても、他のノードが生きている限り取引を継続することができるため、耐障害性が中央的な機関に依存する方式よりもすぐれています。もちろん、中央的な機関内でシステムの耐障害性を高めることも可能ですが、中央的な手法をとっている以上耐障害性の向上には限界があり、またコストもより多くかかってしまうのが現状です。
Ethereumの仕組み -Bitcointとの違いをベースに-
それでは次に、Ethereumの特徴を確認していきたいと思います。
Ethereumは上で述べた通り、分散型アプリケーションのプラットフォームとして設計されています。コンピュータに例えると、EthereumはOSにあたるもので、その上に様々なアプリケーションを搭載できるように設計されています。これにより、アプリケーション間の連携を促進できたり、アプリケーション作成の高速化が期待されています。
EthereumをBitcoinとの比較で考えると、大きく異なるのは以下の点です。
- アカウントの構造
- トランザクションとメッセージの構造
はじめに概略を書くと、各アカウントはトランザクションを生成することで、メッセージをContractに送信し、メッセージに応じてContractで定義された条件が執行されます。
アカウントの構造
アカウントはEOAと呼ばれる通常のアカウントと、Contractと呼ばれる契約執行のためのアカウント(=プログラム)に分けられます。EOAはBitcoinにおけるアドレスとほぼ同義で、それぞれのEOAの残Ether (Ethereum上のCoin)がいくらであるかを管理します。
一方、Contractは契約条件を記載したプログラム(正確に言うと、データとファンクション、JavaでいうClassのイメージ)のことであり、各EOAはこのプログラム内のファンクションをメッセージを通して呼び出すことで、契約を執行することができます。ちなみに、Contract自体もEthereumを管理するアドレスを持っているので、Contract独自にEthereumを保持することが可能です。
なお、大きなBitcoinとの違いとして、Ethereumの場合はブロックチェーン上にアカウントの最新の状態が記録されます。Bitcoinの場合はUTXO(未使用の過去のトランザクション)の合計値がそのアカウントの保持するBitcoin額となるわけですが、Etherumの場合は単純にブロックチェーン上の当該アカウントの残etherを見れば残高が分かる仕組みになっています。
トランザクションとメッセージの構造
Bitcoinでいうところのトランザクションは、Ethereum上も同様にトランザクションという名前で扱われます。ただ、Ethereumを理解するためには、トランザクションに加えて”メッセージ”というコンポーネントを理解する必要があります。
Bitcoinのトランザクションには、「送信者の署名」、「送信するBitcoin量」、「受信者のアドレス情報」が記載されています。そして、そのトランザクションを束ねたものを、ブロックとしてブロックチェーンに接続することで取引を永続化していました (=Bitcoinの二重譲渡が起こらない)。
詳しくはこちら
EthereumではBitcoinで管理している情報に加えて、Contractに受け渡す引数(Message)を保持する形で、トランザクションがブロックチェーンに記録されて永続化されます。つまり、Bitcoinがトランザクションを通してBitcoinを送信先に送っているのに対して、EthereumではEtherとMessageの2つのコンポーネントを送信先に送っているわけです。
例えば、ある引数を渡すと、それを2倍にして返すContractを想定してみます。
この場合、トランザクションの中で5というValueをMessageに指定してこのContractに送信すると、Contractが実行されて、10という戻り値を返してくれることになります。このとき、Contractに対して必ずしもEtherを送る必要はありません。ちなみに、Contractをはじめて作成する際も、トランザクションを通してContractが作成されます (ブロックチェーン上にContractを永続化する必要があるため)。
ちなみに、Ethereum上でContractを実行するには、トランザクションを経由する方法以外に、Callと呼ばれる方法もあります。Callの場合は、Contractが保持している情報を変更せずに読み取るだけなので、変更された情報を全ノードにブロードキャストするというステップがなくなり、Etherを消費しないという特徴があります(=マイニングが行われない)。
Transaction = プログラムの作成、変更、状態変化を伴う実行
Call = 状態変化を伴わない実行
上の例でいうと、本来であればトランザクションを作成する必要はなく、Callするだけで戻り値を取得できます。
参考
Ethereumに関する基本情報(Whitepaper)。ただ、メッセージやトランザクションなどは、この記事だけだとイメージしにくい。
Whitepaperの次にこの記事を読むと、メッセージやトランザクションなど内部的な話の理解につながるかと思います。