丸の内で働くブロックチェーンエンジニアのブログ

丸の内やその他でフリーのブロックチェーンエンジニアとして働いています。勉強している技術情報やニュースを紹介します。

Ethereumをざっくり解説してみる

本日、EthereumのハードフォークByzantiumが行われました。今のところ、大きなトラブルなども聞かず無事に終わったようです。これによってパフォーマンス向上やZcashの技術zk-Snarksが取り込まれるなど、大きな意義を持つアップデートになったと思われます。Ethereumは、自由度が非常に高く私も大好きなブロックチェーンで、ICOブームが続いている現状、これからもまだまだ拡大していくと思っています。

今回、話題になったEthereumについて、White Paperに基づいてまとめてみます。(マニアックなところは置いてざっくり解説します)

Ethereumは契約をプログラムにして実行するブロックチェーン

Ethereumは2014年にリリースされたブロックチェーンです。White Paper(日本語訳)にはこう書いてあります。

Ethereum が提供しようとしているものは、チューリング完全プログラミング言語の完成品を blockchain に埋め込み提供することにあります。 この言語は、"contract" を生成するために使用され、 "contract" とはあらゆる 関数 をプログラムしたものです。 これにより、ユーザーは上記の全てのシステムを実装することが可能で、 われわれがまだ想像すらしていない多くの可能性が、 論理を秘めし数行のコードを書き上げるだけで実現できるようになります。

Ethereumで重要な目的は、「プログラミング言語の完成品をblockchainに埋め込み提供すること」になります。簡潔に言えば、プログラミング言語を実行できるブロックチェーンを提供することがEthereumの目的と言えます。

プログラミングをしたことがある方なら分かると思いますが、現実世界の単純な「契約」であれば、非常に簡単にプログラムにできます。所有権の移転、税金の計算など…それらは単純な契約で、Ethereum上にスマートコントラクトのプログラムとして実装できます。

EthereumのWikiにおいて、通貨や評価システムは20行以下のプログラムコードで構築可能だとしています。プログラムをブロックチェーン上で実行し、結果が正しいかを参加者達で検証しあいます。Bitcoinはコインの流通をさせることが目的のブロックチェーンです。一方でEthereumは自由度が高く、あらゆる契約をのせる事ができるプラットフォームとする目的のブロックチェーンと言えます。

ブロックチェーン参加者全員の間で「契約」をプログラムとして実行すること。それが「スマートコントラクト」の本質です。

プログラムを実行するためのアカウントが用意されている事がEthereumの特徴といえる

EthereumのWhite Paper(日本語訳)では、以下のようにスマートコントラクトが定義されています。

「(役人や銀行員に取って代わり、)コーディングであらゆるルールを実装し、個々の電子資産を管理するもの」(smart contracts)

では、スマートコントラクトがどのように実行されるかですが、Ethereumのアカウントにスマートコントラクトのコードを持たせることができます。

Ethereum アカウントは4つのフィールドを含みます。

・nonce 、各トランザクションの処理が一度きりであることを確約するためのカウンター

・アカウントの現在の ether balance

・アカウントの contract code (もし存在すれば)

・アカウントの storage (デフォルトは空)

Ethereumでは、通常のアカウントをEOA (externally owned accounts)、コントラクトコード(プログラムコード)を持っているアドレスのことを「コントラクトアカウント」(またはコントラクトアドレス)といいます。

EOAは私たちが仮想通貨取引所で発行したりするものは資産管理用のアドレスになります。コントラクトアカウントはICOなどでトークンを発行するためのアドレスになります。コントラクトアカウントに、EOAからトランザクションを送ることでスマートコントラクトを実行する事になります。

例えば、ICOで1Etherに対してあるコイン(Token)を1000Tokenを発行するとします。その際の手順は単純化すると以下の通りになります。

  1. 通常アカウント(EOA)から、コントラクトアカウント(contract account)に送金トランザクションを発行します。その際、3Ethを乗せてトランザクションを送るとします
  2. コントラクトアカウント(contract account)は3Ethをインプットとして伝えられます
  3. 3Ethのインプットに対して3000Tokenをコントラクトアカウントが発行します
  4. 受信したアドレスに対して、3000Tokenを発行します

コントラクトアドレスは、1~4の処理が記載されたスマートコントラクトコードを実行する形になります。通常の預金アカウントと、処理を実行するコントラクトアカウントとで大きく二分されるのがEthereumアカウントの特徴と考えられます。

例えば、以下はEtherscanで見たEnjinCoinクラウドセールのコントラクトアドレスです。(たまたまEnjinCoinがクラウドセールをやっていただけなのでコインの選択に他意はありません)画面下部のトランザクションを見ると、トークンの送金元からToの部分にEnjinCoinCrowdSaleコントラクトが記録されています。

f:id:naomasabit:20171016012115p:plain

InternalTransactionは、スマートコントラクトによって生み出されたトランザクションです。

ParentTxHashは、スマートコントラクトのトリガーになったトランザクションです。

f:id:naomasabit:20171016012209p:plain

Etherは通貨でもあり、処理を実行するため内部燃料(gas)としても使われる

EtherはEthereum上の内部通貨としての性質があり、燃料(gas)としても考えられています。gasとしては、主に送金手数料、スマートコントラクトコードを実行するための手数料として考えられています。

Ethereumで送金を行う際には、gaslimitという項目が設けられています。これはEthereumが送金処理を行う際に消費するgasの制限量になります。Ethereumでは処理のワンステップごとにgasが消費されます。

f:id:naomasabit:20171016012941p:plain

例えば、アドレスに送金を行う際に

  1. 宛先アドレスが存在するかどうかを確認する

  2. 現在の預金に対して送金金額が十分にあるかを確認する

  3. 送金をする

という処理を行うとすると、(実際の送金処理を確認せずに書いています。他にもステップがある可能性があります)各ステップごとにgasが消費されます。(1000weiごとなど)消費するgaslimitを事前に設定しておき、処理後に消費されなかったgasは送金者の元に返却されます。もし途中の処理でgasが足りなくなった場合、gas欠となって実行が途中で終了し、処理は取り消されます。消費されたEtherは返ってきません。

スマートコントラクトでも同様で、先ほどのICOの例ですと以下の各ステップごとにgasが消費されていきます。こちらも、途中でgasがなくなった場合、処理が途中で落ちてしまいます。

  1. 通常アカウント(EOA)から、コントラクトアカウント(contract account)に送金トランザクションを発行します。その際、3Ethを乗せてトランザクションを送るとします

  2. コントラクトアカウント(contract account)は3Ethをインプットとして伝えられます

  3. 3Ethのインプットに対して3000Tokenをコントラクトアカウントが発行します

  4. 受信したアドレスに対して、3000Tokenを発行します

Ethereumはプログラムコードを実行するプラットフォームとして考えられており、プログラムを実行するために内部燃料(gas)であるEtherを消費すると考えらます。もう少し正確に言えば、バイトコードの実行ステップ毎にgasが消費されます。(gethのtraceTransactionなどでスマートコントラクトの実行ステップと消費gasの動きが確認できます)

そしてgaslimitを設定する主な理由は、無限ループの回避のためです。もし、無限ループを組み込んだ悪意のあるスマートコントラクトが存在したとすると、1ステップずつgasが消費されるので、無限にgasが消費されて実行者のアドレス残高は0になってしまいます。そのようなトラブルを避けるために、gaslimitを安全装置として設定しておき、途中でgasが切れたら処理を打ち切るという事になるようにしています。

Ethereumはトークン発行をするプラットフォームとしても活用できる

Ethereum上では独自のトークンを設計、発行することができます。Augur,OmiseGO,日本ではALISなどがEthereum上で発行された独自トークンです。EthereumではERC20という標準規格を定めています。ERC20ではトークンの仕様として設計する関数などを定めており、その規格に則って作成されたトークンはEthereum上で汎用的な手続きによって送受信することができます。MyEtherWalletなどERC20対応ウォレットでも、Ethereum同様にトークン残高、送受信が実施できます。

ただし、Ethereum上で発行された独自トークンでも、送受信やコントラクト実行にはEtherがgasとして消費されます。独自トークンを持っているだけでは送受信ができません。EtherscanのトークンページではERC20トークンを見る事ができます。2017年10月16日時点で9363個のERC20トークンが確認できます。

当ブログでも、プライベートネットワークで簡単なトークンを発行しています。

naomasa.hatenablog.com

naomasa.hatenablog.com

Ethereumの今後

これまで見てきたように、Ethereumはプログラミング言語をblockchainに埋め込み提供することが目的で、コミュニティは拡大していっています。また、次のハードフォークConstantinople、Serenityもまだ控えており、まだしばらく勢いは続くと思われます。

今後、マイニングの仕組みやスマートコントラクトの詳細などについても記事にしていければと思います。

参考にしたサイト: