イーサリアム はどのように動作するのか?

レポート「ビットコインキャッシュの取り出し方&送金方法」を配信。画面付きで丁寧に解説ビットコイン研究所

レポート「アルトコイン図鑑」では30種類以上のコインの概要と見通しを解説レポート内容へ

Ethereum(エセリウム、エセリアム、イーサリアム)の動作について、踏み込んで、動作についての、解説を行う。

Etherum自体は、ブロックチェーン型の仮想マシンだとか、分散型アプリケーションの基盤だとか、スマートコントラクトプラットフォームだとか、いろいろな見方があるが、実際何ができるのか概要を解説したい。

すこしコンピュータがわかるひと向けに書く。

簡単にいうと、

・コントラクト(オブジェクト)が作れて

・メッセージを送れて

・値が保持できる

といった感じだ。まあ、要するにコンピュータなわけである。

試しに、こういうコードを作ってみよう。アルトコインのOhCoinだ。これは、ビットコインなどと同じく、アドレスごとにコイン残高が保持されていて、残高の送金が可能だ。

このコントラクトには、

・アドレスごとのOh Coinの値を保持する領域があり
・コイン残高をアドレスAからBに移動するというメソッドがある
・アドレスごとに残高を返すメソッドがある

ab

コントラクトは、オブジェクトと読み替えていただいて問題ない。オブジェクトと一緒で、メソッドがあり、メソッド毎のデータがある。

なおコントラクトには、それを識別する固有のアドレス(コントラクトアドレス)が付与される。

このコントラクトは、ネットワークに手数料を払うことで、Ethereumブロックチェーン上に登録される。基本的に、コントラクトはブロックエクスプローラーなどで参照でき、メソッドも公開される。

さて、このoh coin コントラクトは、アルトコインを模したものであった。Aさんが、Bさんにこれをつかってコインを送金することを考えてみよう。

Etherumでは、ユーザーはそれぞれ、Etherum addressという固有のアドレスを取得できる。これが唯一の識別子となる。Etherum上のお金である、Etherの残高もこれに紐づく。

ab

ユーザーAさんが、BさんのEthereumアドレスを指定し、oh Coinをおくりたいと考える。

(※ユーザーAさんは予めohコインをいくらか持っていると考える)

この場合は、oh coin のコントラクトのアドレスを指定し、そのコントラクトの「送金」メソッドを叩く。引数は、送り先のアドレスと、送りたいコインの量の2つだ。

Ethereumにおけるトランザクションとは、メソッドへのメッセージ送信と捉えていただいてOKだ。

・ネットワーク上にトランザクションを流す=メソッドへのメッセージの送信

このとき、ユーザーAさんは、コントラクトを実行するための手数料として少額のEtherを支払わなければならない。Etherはコントラクト実行のために必要で、コードの複雑さや長さによって、必要量が異なる。これにより乱用が防げる。

ab

メッセージをうけとったコントラクトは、それを実行する。このとき、コントラクト内の状態は、次のように変化する。

・ブロック100の時点で、ユーザーAの残高は30
・コインの移動メソッド(Bへ10)が実行される
・この結果、ブロック101では、ユーザーAの残高がへり、ユーザーBの残高が増える

ab

Ethereumでは、コントラクトとその変数の値を常に保持し、それらはすべての分散ノード上で合意された値でなくてはならない。そこで合意のための、マイニングが発生する。

このとき、Ethereumのマイナーは何をしているのだろうか。概念はビットコインほかのブロックチェーンと一緒だ。ビットコインではハッシュと署名を検証していたが、Ethereumでは、ハッシュと、コントラクトの実行結果を検証する。

1) マイナーは、最初に、トランザクション(メッセージ)を受ける。

2) 実際にコントラクトのコードにそって、メソッドを実行してみる。実行結果の状態を記録する。

3) いわゆるマイニングを行う。これは競争であり、最初にnonceをみつけたマイナーが、ブロックを生成できる。このとき、ブロックには、メソッドの実行結果の状態を書き込む

4) ブロックをブロードキャストする。

これを受け取ったその他のノードは、ブロックを検証する

1) ブロックのハッシュが正しいかどうかを検証する

2) コントラクトにしたがい、メソッドを実行してみて、実行結果が、正しいかどうか、送られてきたブロックで正しいとされている結果と同じかを検証する

3) 問題なければ、ブロックチェーンの末尾にブロックを追加。すべてのコントラクトとデータの状態を最新にする。

ということである。ブロックチェーンを保持するフルノードは、すべて同じコントラクトを実行して、結果の正しさを検証することになる。

Ethereumでは、ブロックの生成間隔は仕様上12.7秒だ。

12.7秒の間に発せられたメソッドを実行し、正しい結果をマイニングして記録する。12.7秒ごとに、コントラクトと、その保持するデータ(変数)の値が、実行結果にあわせて書き換えられる。

こういうことが、ずっと続くという、一連の処理マシンだと捉えていただくと理解できよう。

・ブロックチェーン方式なので、メソッドの実行結果については、不正はできない。取消も、逆戻りもできない。

・コントラクトはチューリング完全な言語仕様であり、いかなる処理も記述可能

・コントラクトのコードは、ブロックチェーン上に格納されて、検証でき、改ざんができない。

・コントラクトが保持するデータの値も、ブロックチェーン上に格納され、保持される。

・コントラクトが保持出来るデータには上限はないようだ。いかなるデータも記録できるが、大きさに応じてEtherを支払う必要がある

・コントラクト自体が、他のコントラクトにたいしてメッセージを送りメソッドを実行することができる

これ以上の解説は、追って理解が進み次第書こうと思う。

詳細日本語マニュアル付きTrezorの購入はコインギフトから

初心者向け「使って勉強!ビットコイン」DMMオンラインサロン