Ethereum イーサリアム の特徴・関連用語

## Ethereum 概要

* 分散アプリケーションを書いてデプロイできる分散プラットフォームである。
* デプロイされる分散アプリケーションは、1つ以上のスマートコントラクトを使って作られる。
* スマートコントラクトは Solidity, LLL, Serpent を用いて記述できる。
    * Solidity がとっても有名。
* スマートコントラクトのデプロイ、スマートコントラクトの実行には Ethereum の内部通貨 Ether が必要

## アカウント

Ethereum には 2種類のアカウントがある。 いずれもイーサの残高を管理している。

* ウォレット / Externally owned account (EOA)
    * トランザクション送信可能 (トランザクションは後述)
    * 秘密鍵で管理される。
    * コードは付属しない
* コントラクトアカウント / Contracts Account
    * コードが付属する
    * コードはトランザクションまたは他のトランザクションからのメッセージ受信によって実行される。
    * コードが実行されると、状態を変更するなど、保存されるデータの変更を行うことができる。
    * 他のコントラクトを呼び出すことができる。

### Externally Owned Account

* 非対称キーを利用して作成する。
    * 非対称キー作成には ECC (Elliptic Curve Cryptography: 楕円曲線暗号) を利用する。
    * 楕円曲線暗号 に secp256k1 というパラメータを利用する。 (参考: https://en.bitcoin.it/wiki/Secp256k1)
    * 256-bit の暗号化を利用しており、 秘密鍵・公開鍵は 256-bit の数値となる。
        * 16進数64桁で表される。
* 公開鍵からアカウントを割り出す手順
    1. keccak-256 のハッシュ値を公開鍵から作成する。 256-bit の数値が得られる。 (参考: [Keccak](https://keccak.team/2013/yes_this_is_keccak.html))
    2. 頭の 96 bit (12 byte) を削除する。 160 bit (20 byte) が残る。
    3. 16進数文字列に変換する。 得られる40文字がアカウントのアドレス。

暗号処理は MyEtherWallet などでアカウントを作成する際に自動的に行われる処理で、 利用者が意識する必要はない。

## 送金手数料 と Gas Limit

* Ethereum を送金する場合の送金手数料: 送金手数料(ETH) = Gas Price * Gas Amount
* Gas Limit は Gas Amount の上限。
* Gas Amount は送金先のプログラム処理量によって変わる。

MyEtherWallet などで一度でも送金をやっていれば理解しやすい。

### マイニング - マイナーはなにをやっているのか。

PoW の説明なので、 流れは BitCoin と同じ。

#### 手順

1. 掘り起こされていない、マイニング前の、トランザクションを見つける。
    * 無効なトランザクションは除外する。
    * 秘密鍵で正しく署名されたものが正規のトランザクション。
    * そのアカウントはトランザクション生成のための十分な残高を持っている必要がある。
2. 新しいブロックを作る。
    * ブロックが保持するコンテンツは、トランザクションのリスト。
    * ヘッダ
        * 前のブロックの情報, ブロック番号、ノンス、タイムスタンプ、マイナーのアドレス、難易度のハッシュが格納されている。
        * タイムスタンプはブロックが生成された時刻。
        * ノンスはそれ自体意味のない値で、マイニングで解を見つける際に調整される。

#### 計算

* マイニングとは適合するノンスの値を計算して見つけること。
* ノンスの候補を加えて計算したハッシュ値が、ある目標値以下であればノンスとしてOKになる。
    * 目標値は 256 bit
    * 目標値が大きければ難易度は下がり、小さければ難易度が上がる。
* 計算において、イーサリアムでは ethash というハッシュアルゴリズムを利用している。
* ノンスの値を見つけるには、可能性のある値をひとつずつ試していくしかない。

### ノンス

* 64 bit の非負整数(unsigned integer)。
* マイナーによってノンスが異なるため、それぞれのマイナーごとに異なる値となります。 そのため、全マイナーが同一の値を求めるわけではない。
    * 上に書いたように、マイナーがマイニングを行うブロックのハッシュ値は、タイムスタンプ、マイナーアドレス等によって左右されるため。

### タイムスタンプ

ヘッダにはタイムスタンプ含むデータのハッシュ値が付加される。

過去のタイムスタンプについて計算を繰り返せば、何回も計算していくわけだから早く計算できるよねと思いがちであるが、マイナーはそういうことはしない（らしい）。 その理由は次の通り。

* 前のブロックより後のタイムスタンプでなければ承認されない。
* 古いタイムスタンプは難易度が下がるので、難易度の高いノンス計算が別のところで行われた場合に、自分のノンスが無効になってしまう。

<!--
The difficulty value in the header is a different
representation of the target to make it easier to deal with. 
-->

## トランザクション

署名されたデータのパッケージで、EOAから他のアカウントに送信するメッセージを保持している。 署名には、 ECDSA (楕円曲線電子署名アルゴリズム) が用いられる。 

トランザクションに似たものにメッセージがあるが、あまり区別なく使われることもあるので、将来的にどちらかの言葉に統一されるかもしれない。

### トランザクションに含まれるもの

* メッセージの受信者情報
* 送信者を識別するための署名 と Intention (Intention とは内部ロジックのこと、後述)
* VALUE field
    * 送信する ETH の量
* Gas Limit
    * 許容する計算量の最大値。
* Gas Price
    * 各計算のステップで許容するコスト。

Gas はトランザクションにかかる費用のこと。 例えば MyEtherWallet では Ethereum を あるEOAから別のEOAに送金するときに、 Gas Price, Gas Limit の入力を求められる。

#### Intention

たとえば次のようなもの。

* コントラクトのメソッド実行
* 入力データ
* コントラクトのデプロイ
    * 初期化コードが含まれることがある

## メッセージ

メッセージはイーサリアムの環境内にある仮想的なオブジェクトで、関数実行と言い換えることができる。 メッセージはコントラクトから他のコントラクトに送信される。

### メッセージの中身

* 送信者
* 受信者
* VALUE field
    * メッセージと一緒に他のコントラクトアドレスに送信される ETH の量
* 補足的データフィールド
    * コントラクトへの入力データ
* Gas Limit
    * メッセージによって発生するコードの実行で消費可能な Gas の量、上限。

メッセージはトランザクションに似ているため、**内部トランザクション**と呼ばれることもある。 トランザクションとは異なり、コントラクトをデプロイすることはなく、また外部の誰かによって引き起こされるものでもない。 

## Ether 単位

Gas の説明で出てくるので、ここで単位を掲載しておく。

* 1 Ether = 1000000000000000000 Wei
* 1 Ether = 1000000000000000 Kwei
* 1 Ether = 1000000000000 Mwei
* 1 Ether = 1000000000 Gwei
* 1 Ether = 1000000 Szabo
* 1 Ether = 1000 Finney
* 1 Ether = 0.001 Kether
* 1 Ether = 0.000001 Mether
* 1 Ether = 0.000000001 Gether
* 1 Ether = 0.000000000001 Tether

## Gas

* 計算量の単位。 Wei での金額。 処理量の意味で使われることもある。
* Gas Amount は トランザクション料金 ともいえる。
* ひとつのトランザクションで必要になる Gas Amount は、 そのトランザクションによって実行される他のメッセージ処理に必要な Gas Amount を含む。
* トランザクションには Gas Limit と Gas Price が定められている。
    * 取引によって使用される Gas Amount が Gas Limit を下回る場合、トランザクションは処理される。
    * マイナーはマイニングの際に Gas Price の下限を定めることができ、 トランザクションの Gas Price がそれより低い場合はマイニングをしない。
        * Gas Price を下げたトランザクションはなかなか処理されないので、 ETH を送金する際も、 Gas Price には標準的な値を入れておくのがよい。
    * トランザクションの Gas が Gas Limit を超えた場合
        * トランザクションによって行われた変更は元に戻る。
        * 計算に必要となった Gas 料金 は変換されない。
        * マイナーには必要となった Gas 料金 が支払われる。
        * トランザクションは有効。
    * トランザクションの Gas Amount が Gas Limit を下回る場合。
        * 余剰の Gas は トランザクション送信者に戻される。
* Gas の支払いのために ETH が必要であるため、 あるアカウントに 1 ETH あったとしても、 1 ETH すべてを他のアカウントにトランザクションとして送ることはできず、 1 ETH から 計算処理に必要な Gas Amount を引いて残る Ether を送ることができる。
* ひとつのトランザクションの Gas Amount は次のように計算される。
    * (Gas Amount) = (使用されたGas) x (Gas価格)

## ジェネシスブロック / Genesis block

* ブロックチェーンの最初のブロックのこと。
    * 通常、ブロックは前のブロックを参照しているが、ジェネシスブロックは前のブロックを参照していない。 というか前のブロックがない。
* トランザクションもない。
    * ETHが生まれていないので、トランザクションコストであるGasが支払えない。
    * トランザクションは送信先アカウントが指定されている必要があるが、相手のアカウントがまだ存在していなかった。
* ブロックナンバーはゼロ。

<!--
## フォーク

フォークには3種類ある。

### レギュラーフォーク

一次的な衝突。 複数のマイナーがほぼ同時に次のブロックを掘り当てた場合のこと。 イーサリアムでは、難易度を考慮して片方を捨てるようになっている。

### ソフトフォーク

### ハードフォーク
-->

## EVM : Ethereum Virtual Machine

* イーサリアムのスマートコントラクト実行環境。
* ネットワーク上のすべてのノードはEVMを実行している。
* EVM には バイトコードVM と JIT-VM がある。

## ノードとノードのつながり

ネットワークに参加するには、そのノードがネットワーク上の他のノードを見つける必要がある。 ネットーワーク参加ノードは、すべてのノードと直接つながっている必要はなく、ネットワーク上のいくつかのノードとつながっていればよい。

Ethereum には、 あるノードが他のノードを見つけるための専用プロトコルがある。

### ノード発見のプロトコル

Kadelima プロトコル をベースにしている。

1. Bootstrap ノード に接続する。
    * Bootstrap ノード は、 一定期間つながっていたノードのリストを管理している。
    * Bootstrap ノード は、 それ自身ではブロックチェーンを保持していない。
2. Bootstrap ノード は Peer のリストを提供する。
3. 新規参加ノードは取得した Peer のリスト にある Peer に接続して、 同期を行う。

## Whisper

* 分散通信プロトコル。
* ブロードキャスト通信、ユーザー間通信、暗号化通信をサポートしている。
* 大量のデータを送るのは無理。

参考: [Whisper GitHub](https://github.com/ethereum/wiki/wiki/Whisper), [Whisper Overview](https://github.com/ethereum/wiki/wiki/Whisper-Overview)

## Swarm

* 分散ファイルシステム。
* IPFS に似ている。

参考: [IPFS と Swarm の違い](https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM), [スマートコントラクトコード](https://github.com/ethersphere/go-ethereum/blob/bzz-config/bzz/bzzcontract/swarm.sol)

## Geth

* go-ethereum のこと。
    * Go で書かれている。
* Ethereum, Whisper, Swarm の実装。
    * いずれかひとつの機能を使うこともできるし、すべてを使うこともできるよう考えられている。
* CLIアプリケーション

<!--
A transaction is a signed data package to transfer ether from an account to another account or to a contract, invoke methods of a contract, or deploy a new contract.
A transaction contains the recipient of the message, a signature identifying the sender and proving their intention, the amount of ether to transfer,

To send ether or to execute a contract method, you need to broadcast a transaction to the network. The sender needs to sign the transaction with its private key.
A transaction is said to be confirmed if we are sure that it will always
appear in the blockchain.
-->