Ethereum [基礎知識]

# こちらも合わせてお読みください

[ブロックチェーン・スマートコントラクトとは[知識編]](https://qiita.com/kagami-r0927/items/09588760b94954dcc2fe)

# Ethereumとは
<img width="623" alt="Ethereum" src="https://qiita-image-store.s3.amazonaws.com/0/285122/475de6b4-16f2-62b6-2464-1a6ab2d345f9.png">

>https://www.ethereum.org/

ヴィタリック・ブテリンというロシア人によって開発され、「**スマートコントラクト**」という技術を備えており、スマートコントラクトを利用した分散型アプリケーション(**Dapp**)のプラットフォームとして作られた仮想通貨です。
2018/09月時点では、仮想通貨の時価総額ランク**2位**で時価総額が約2兆5,000億円です。[CoinGecko(イーサリアム)](https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%AA%E3%82%A2%E3%83%A0/jpy)

特徴としては、送金までの時間が早い、仮想通貨の半減期がないことが挙げられます。
送金時間は、Ethereumが15秒でBit Coinが10分となっており、Bitcoinよりも手数料が安いです。
Bit Coinは4年に一度マイニング報酬が半分になる時期があるのですが、Ethereumにはその半減期がありません。

Ethereumは独自のP2Pのブロックチェーンネットワーク（Ethereumネットワーク）を構築し、分散アプリケーションが動作する実行環境の役割を果たします。


[必読:Ethereum入門](https://book.ethereum-jp.net/)

# スマートコントラクトとは
「**スマートな契約（contract）**」という意味です。
ブロックチェーン分野においては「**決められたある条件を満たすと自動的に契約を実行する**」ということが記述されたコードのことを指します。
スマートコントラクトを実装する場合は、**Solidity**というプログラミング言語で実装します。Solidityは`JavaScript`の文法に似たプログラミング言語で、コンパイル後、Ethereum（イーサリアム）上で実行可能です。
`Bitcoin`と`Ethereum`の違う点は、ブロックチェーン上に「**取引と一緒に契約も残せる**」ことです。

# 分散型アプリケーション(Decetralized Application：Dapp)とは

アプリケーションを管理する組織や企業がありますが、Dappの場合はそれらを必要としないため、組織が作成しているアプリケーションが抱えているリスク(ハッキング・システムダウン等)を回避できます。
ユーザーが開発にも参加し、より利便性の高いサービスをユーザー全員で作成し、利益もコミュニティに対して支払われるため、報酬制度も整っています。

# Gas(ガス)とは

イーサリアムのGasは、実際にトークンとして存在しているわけではなく、スマートコントラクトの実行や、トランザクションを送信するために必要で、プログラムの中の作業量をカウントする単位として使用されます。燃料費は、Ether（イーサ）から差し引かれます。

[詳しくはこちらを参照](https://cripcy.jp/cryptocurrency/eth/gas)

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

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`：そのアカウントが保持する任意のデータ

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

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

・**Contract**
EOAからトランザクションを介して生成されます。Contractは一種の**自動エージェント**であり、EOAが発信するトランザクションをトリガーに、コントラクト・コードを実行します。EOAによりContractのメソッドが呼ばれ、そのメソッドが実行されるとContractの持つクラス変数が書き換えられるというイメージです。

#トランザクション
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バイト当たり5gasを残りGASから引く。
7. トランザクション内で指定された相手に対して、指定された額のetherを送金。また「トランザクションの相手」が Contract の場合は、Contract の持つコードを実行。
8. 送金額のetherを送金者が保有していない、または、コードを実行中に残りGASがゼロになった場合には、手数料の支払情報のみを残し、元の状態にロールバックさせる。トランザクション実行前の状態から、トランザクション実行のための手数料分だけトランザクションの送信者の保有etherから引き、採掘者の保有額にそれを足した状態を**終状態**とする。
9. 送金、またはコードの実行が正常に終了し、GASが余っている場合は、その余ったGASをトランザクションの送信者に対して戻す。

#Ethereumを支えるエコシステム
Etherumを使って分散アプリケーションを開発していく上で有用なものを紹介します。

・**Ethreum White Paper**： Ethreumのコアの仕組みについて比較的平易に説明された論文です。

・**Ethereum Yellow Paper**： Gav Woodにより著されたEthreumの公式プロトコル仕様書。現在までに様々な言語でEthereumのノードが開発されていますが、それらはこのYellow paperに従い実装されています。現在もGithub上でメンテナンスされています。

・**ethstats**：Ethreumネットワークの状況をモニタするダッシュボードが提供されています。ブロックの採掘状況やその難易度等が確認できます。

# 次回
[Ethereum [Solidity 開発環境準備]](https://qiita.com/kagami-r0927/items/1c24a8b461ac4a6396a8)