# Ethereumとは

## 分散アプリケーション開発の障壁

前節で、ブロックチェーン技術の革新性と、通貨（ビットコイン）だけに収まらない応用の可能性について述べてきました。

ブロックチェーン技術を用いた新たな応用サービスをローンチするためには、２つの選択肢があります。１つは新たなサービスのために新しいブロックチェーンを構築しそれを使ってサービスを行うこと。２つめは、ビットコインのような既存のブロックチェーンを利用しその上にサービスを構築するというものです。前節に挙げた応用例では、[Storj](http://storj.io/) や [Namecoin](https://namecoin.info/) は前者のタイプであり、[Proof of Existence](http://www.proofofexistence.com/) は後者のタイプになります。

新しいブロックチェーンを構築することは、非常に敷居の高い方法です。実装とテストに相当の工数がかかります。さらに重要なのは、ブロックチェーンを用いた合意形成がサービスのローンチ当初から安定して動作するためには、事前に相当数の参加者が集まっている必要があることです。これは需要の少ないニッチなサービスを展開する際には、非常に致命的な問題になります。

一方で、既存のビットコインのブロックチェーンを利用したサービス提供する場合は、あくまでビットコイン自体の設計上の制限に従う必要があり、非常に不自由なものとなってしまします。

## Ethereumとは

[Ethereum](https://www.ethereum.org/)（イーサリアム）は、上述のようなブロックチェーンを利用した分散アプリケーションを開発しサービス提供を行う際の障壁を取り除くことを目的とした「分散アプリケーションプラットフォーム」です。そのプラットフォームを形作るためのプロトコル定義や実装が[オープンソース・プロジェクト](https://github.com/ethereum)としてグローバルな有志により行われています。

Ethereumは独自のP2Pのブロックチェーンネットワーク（Ethereumネットワーク）を構築し、分散アプリケーションが動作する実行環境の役割を果たします。様々な分散アプリケーションがEthreumのブロックチェーンを共有して利用することで利用者が少ないニッチな分散アプリケーションでも、ブロックチェーンを利用した「合意形成」が安定して動作する環境を提供します。

また、分散アプリケーションのコードは、ブロックチェーンに組み込まれプルーフ・オブ・ワークの仕組みにより、改ざん不可能になります。このコードはEthereumネットワークに参加する各（採掘者の）ノード上で実行され、その結果の状態もブロックチェーンに組み込まれ、やはり改ざんが不可能になります。

ビットコインはブロックチェーンの技術を用いて悪意のある参加者が参加する可能性のあるP2Pネットワーク上で「取引」を正しく動作させる環境でした。一方でEthreumは、取引だけでなく任意のアプリケーション（処理）をこのようなP2Pのネットワーク上で正しくに動作させることを可能にする環境を提供するのです。

ここで、もう少し詳しくEthereumの仕組みを見ていきましょう。（詳細は「Ethereumの内部」の章で解説します。）

## Ethereumの仕組み

### 内部通貨：ether

Ethereumでは、「ether」という独自の内部通貨が規定されています。ビットコインと同様、それ自体が価値を持つ通貨としての利用も可能ですが、より重要な事はetherがEthereum内で分散アプリケーションやスマート・コントラクトを実行するための「燃料」の役割を果たすという事です。Ethereumは上述のように、このプラットフォーム上で動作する分散アプリケーションに対して任意の処理を可能にしており、それぞれの分散アプリケーション間でその動作に必要な計算資源の量は異なってきます。そこで、Ethereumでは、分散アプリケーションを実行するためには、その処理の重さに応じた燃料が必要」とすることによって、Ethereum上で動作する分散アプリケーション間での計算資源の割り当ての平等性を確保しています。

内部通貨etherの単位は通貨名と同じでether（またはETH）ですが、米国の通貨で 1 dollar = 100 cent と規定されているように、etherも利便性のために、より少額のetherに対して下記のように単位名が決められています。

* 1 ether = 1,000 finney
* 1 ether = 1,000,000 szabo
* 1 ether = 1,000,000,000,000,000,000 wei

### アカウント

Ethereumには、「アカウント」と呼ばれるオブジェクトが既定されています。アカウントは 20 Byte のアドレス（例：0x4c84913cc41f2aad9c24d82bfde598c91cdd33d3） により参照されます。アカウントは主に次の４つのフィールドを持ちます。

* nonce：そのアカウントが送信した累積トランザクション数
* ether balance：そのアカウントが所有するether量
* contract code：コントラクト・コード（EOAの場合は空）
* storage：そのアカウントが保持する任意のデータ

この各フィールドのデータ（詳細は「Ethereumの内部」章で解説します）は、アカウント間でトランザクションが発生することにより変化します。つまり、アカウントの「状態」がトランザクションによって変化していきます。

「アカウント」には２つのタイプが存在します。一つは「Externally Owned Account（EOA）」、もう一つは「Contract」です。EOAは、我々ユーザーにより生成されコントロールされるアカウントです。ユーザーの任意のタイミングでトランザクションを生成し、他EOAへのetherの送金、新しい Contract の生成やコントラクト・コードの実行を行います。

一方でContract は、EOAからトランザクションを介して生成されます。Contractは一種の自動エージェントであり、EOAが発信するトランザクションをトリガに、コントラクト・コードを実行します。

### トランザクション

EthereumではEOAから任意のタイミングでトランザクションを送信することで、各アカウントの状態が変化します 。EOAがトランザクションを生成しそれをEthereumネットワーク上に送信します。採掘者は受信したトランザクションの正当性をチェックし問題なければ、そのトランザクションの情報とトランザクションの内容に基づいて変化した最新のアカウントの状態をブロックチェーンに埋め込みます。

トランザクションには主に以下の情報が含まれます。

* ether送金額
* 相手先アドレス
* 送信アカウント署名
* 任意データ
* STARTGAS値
* GASPRICE値

最初の３つはビットコインのような暗号通貨のトランザクションと同じで、それぞれ、Ethereumの内部通貨であるetherの送金額と相手のアドレス、そしてトランザクションの送信者がether送金元アドレスの所有者であることを証明するデジタル署名です。

「任意データ」はトランザクションの相手先が Contract である場合に、そのコントラクト・コードに引き渡すデータ格納します。

例えばIPアドレスとドメイン名の紐づけを管理するドメイン管理の分散アプリケーションを考えてみましょう。その場合にユーザーは、自分が登録したいIPアドレスとドメイン名の情報を分散アプリに対して引き渡し、分散アプリ側でその登録情報を管理することになります。このようなことを実現するために、ユーザーは分散アプリの処理（ここではドメインの登録情報の管理）を担う Contract のアドレスを「相手先アドレス」に、かつ、自分の登録したい情報（ここではIPアドレスとドメイン名）を「任意データ」に格納したトランザクションを発生させます。一方そのトランザクションにより「任意データ」に格納されたデータを入力値としてコントラクト・コードが実行され、今回引き渡されたデータがすでに登録済みのものではない場合、Contract の`storage`フィールドに格納された登録済みドメインリストに今回の登録情報が追加されることになります。

STARTGAS値と、GASPRICE値は、トランザクション手数料として支払うetherの量を規定する情報です。トランザクションに必要な手数料は、トランザクションが実行するコードの処理の数や、トランザクションのデータの大きさに応じて「gas」という単位で計算されます。トランザクションで支払う最大のgas量がSTARTGAS値であり、そしてその「gas」と内部通貨etherとの交換レートがGASPRICE値になります。

#### トランザクションの処理の流れ

ここでトランザクションによりどのようにアカウントの状態が変更されていくのかの処理の流れを見ていきます。大まかに以下のようになります。

1. EOAがトランザクションを生成し、Ethereumネットワーク上に送信する。
2. ネットワーク内の採掘者がトランザクションを受信する。
3. 採掘者は、署名の正当性など、受信したトランザクションのデータに問題がないかをチェック。問題がある場合はエラーとして以降の処理を行わない。
4. 採掘者はトランザクション内のSTARTGAS値とGASPRICE値を参照。「STARTGAS値 × GASPRICE値」の量のetherを、前払い手数料として、トランザクションを送信したアカウントの保有するetherから引く。もしetherの保有量が「STARTGAS値 × GASPRICE値」よりも少なければエラーとして以降の処理を行わない。
5. 残りGAS ＝ STARTGAS値 とする。
6. トランザクション・データの大きさ1バイト当たり5 gasを残りGASから引く。
7. トランザクション内で指定された相手に対して、指定された額のetherを送金。また「トランザクションの相手」が Contract の場合は、Contract の持つコードを実行。
8. 送金額のetherを送金者が保有していない、または、コードを実行中に残りGASがゼロになった場合には、手数料の支払情報のみを残し、元の状態にロールバックさせる。トランザクション実行前の状態から、トランザクション実行のための手数料分だけトランザクションの送信者の保有etherから引き、採掘者の保有額にそれを足した状態を終状態とする。
9. 送金、またはコードの実行が正常に終了し、GASが余っている場合は、その余ったGASをトランザクションの送信者に対して戻す。

### ブロックチェーンと採掘

ビットコインのシステムで、ブロックチェーンはビットコイン・ネットワーク上で発生したすべてのトランザクションを記録した、誰でも参照可能な公開取引元帳の役割を果たしていました。

Ethereumのブロックチェーンも同様に公開元帳の役割を果たします。ただビットコインの場合とは異なり、Ethereumのアカウントのブロックチェーンには、トランザクションだけでなくEthereumネットワークの全アカウントの最新の状態に関する情報も記録されます。

つまり、ブロックチェーンにはトランザクションとアカウントの状態が記録されていき、そのブロックチェーンに書き込まれた状態を「正」とするEtherumネットワーク内の合意が形成されていきます。

Ethereumネットワーク内の採掘者は、etherの報酬を目当てに、ブロックの採掘競争を続けます。Ethereumでは、新しいブロックが平均して12秒に1回採掘されるように動的にプルーフ・オブ・ワークの難易度を調整されるように設計されています。

Ethereum では、採掘が成功すると、

* 1採掘当たり固定で2 ether
* ブロックに含まれる全てのcontractのコードを実行した際に消費したgasに相当するether
* ブロックに含んだ1つのUncleブロック当たり1/32 ether

の報酬が採掘者に与えられます。

## Ethereumを支えるエコシステム

Ethereumはオープンソース・プロジェクトとしてETHDEVチームとグローバルな有志により様々な開発が進められていることは既に述べました。今後Etherumを使って分散アプリケーションを開発していく上で有用なものを中心にいくつか紹介します。

* [**Ethreum White Paper**](https://github.com/ethereum/wiki/wiki/White-Paper)： Ethreumのコアの仕組みについて比較的平易に説明された論文です。本書もかなりの部分でこのホワイトペーパーを参考にしています。
* [**Ethereum Yellow Paper**](http://gavwood.com/paper.pdf)： Gav Woodにより著されたEthreumの公式プロトコル仕様書。現在までに様々な言語でEthereumのノードが開発されていますが、それらはこのYellow paperに従い実装されています。現在も[Github上でメンテナンス](https://github.com/ethereum/yellowpaper)されています。
* [**ethstats**](https://ethstats.net/)：Ethreumネットワークの状況をモニタするダッシュボードが提供されています。ブロックの採掘状況やその難易度等が確認できます。

## 脚注

[This work](http://book.ethereum-jp.net/) is licenced under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.ethereum-jp.net/what_is_ethereum/ethereum_as_dapp_platform.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
