Ethereumの基本構造(トランザクション/スマートコントラクト/ブロックチェーン/マイニング)
暗号資産(仮想通貨)のBitcoin(ビットコイン)については、トランザクション(取引)やブロックチェーンの構造、マイニングなどの要素について技術的な解説が書籍や日本語のサイトにもあります。
しかしEthereum(イーサリアム)についてはスマートコントラクトの解説が主になっており、トランザクション/ブロックチェーン/マイニングの技術的な解説はあまり見かけません。Bitcoinとどのように違うのか、あるいは同じなのか、解説していきます。
ターゲット:Ethereumの構造の概要を技術的に理解したい人向け
トランザクション ー ETHを送る
EthereumのネイティブトークンはETH(イーサ)です。
AliceからBobへ 1 ETH を送る場合を示しますが、裏ではsendTransactionメソッドを使いトランザクションを送ります。
1. 次のトランザクションを作ります。
from: Aliceのwalletアドレス
to: Bobのwalletアドレス
value: 1 ETH (送りたいETH量)
署名:Aliceのwalletアドレスの秘密鍵でトランザクションに署名します
GAS代:手数料 (詳細は省略)
2. EthereumのP2P機能を使用してトランザクションを送り(sendTransaction)ます。
3. トランザクションはP2Pを巡り巡ってマイナーまでたどり着きます。
4. マイナーはマイニングの過程でトランザクションのチェックを行います。チェックが通らなかったものはエラーを返し、排除されます(ブロックに入れない)。
チェック項目は、トランザクションの形式が正しいか、fromがさすwalletアドレスはvalue (+GAS代) を払える分だけあるか等です。
5. ETHの残高を保管するデータ構造(World state)があり、それを更新します。
Ethereumは walletアドレスをキーに、対応するETH残高をバリューにもつ、Key-Value Store データ構造(mapと読んだりもします)で残高を管理します。
このKey-Value StoreデータをWorld stateと呼んでいます。
すなわち、今回の場合は World stateのインスタンスを”map”として、
map[‘Alice’] -= 1; // Aliceのwalletアドレスの残高から1 ETHを引き、
map[‘Bob’] += 1; // Bobのwalletアドレスの残高へ1 ETHを足す。
となるわけです。World stateの実体のルートハッシュはブロックチェーン上に保存されます。
このWorld stateのデータ構造がBitcoinと最も異なる点です。BitcoinはUTXOで残高を管理します。
スマートコントラクト
スマートコントラクト、要するにEthereumは任意のプログラムを書ける、実行できるプラットフォームとなっています。結局このプログラムや実行プラットフォームのことをスマートコントラクトと呼んでいるわけです。
Ethereumは仮想通貨ですから、作るプログラムもお金に関係するものが多いだろうからコントラクト(契約)って名前にしているのだろうと思います。
Ethereumのこのプログラム実行プラットフォームですが、ワールドコンピュータと呼ばれる概念となっています。詳しくは「マスタリング・イーサリアム」などの書籍に譲るとして、現実的なところでは、
1) マイナーのPC上で実行される
2) 誰のPCで実行しても全く同じ結果となる必要がある。
3) シングルスレッド実行となっている(マルチプロセス、マルチスレッドはありません。これは2)を実現するためです)
くらいを知っていれば良いと思います。
プログラムを実行するにはプログラム本体とデータが必要になります。データは上述したworld stateや関数呼び出し時の引数です。
プログラミング言語としてはいろいろありますが、代表的なものは「Solidity」です。Java Script に似た構文をもつ言語です。
トランザクション ー スマートコントラクトをデプロイする
プログラムを書いて、コンパイル/ビルドしたバイトコードをマイナーが実行できるようにデプロイする必要があります。
デプロイはバイトコードを含んだトランザクションを作成し、TOアドレス=0 にしてsendTransactionします。
EthereumはsendTransactionを発行したウォレットアドレス(EOA)とナンス値を元にコントラクトアドレスを払い出します。
(EOAやコントラクトアドレスについては「マスタリング・イーサリアム」を読むと良いです。)
トランザクション ー スマートコントラクトを呼び出す
toアドレスを払い出されたコントラクトアドレスにして、
・呼び出したい関数
・関数の引数
をセットしたトランザクションを作り、sendTransactionします。
これで使いたいプログラムの関数が実行されます。
このスマートコントラクトでお金を預かる、預かったお金を貸し出したり、交換したりするなどのレンディングアプリや交換所アプリを作れます。これらがDeFi(ディファイ)と呼ばれるものとなります。
トランザクション ー ERC20トークンを送る
Ethereumのプログラミング機能や汎用的なデータ保持機能を利用し、ETH以外のコイン(token)を簡単に作り出すことができます。
新しいコインを生み出すときのインターフェースを規定したものがERC20(イーアールシー トゥエンティ)です。
ERC20にしたがって作り出したコイン、トークンをERC20トークンと呼びます。例えばENJやBATなどがあります。
ERC20トークンはERC20で決められたインターフェースを実装したプログラムを作り、スマートコントラクトとしてデプロイします。
このスマートコントラクトに対してトランザクションを作成し、sendTransactionするのですが、
例えばBATをAliceからBobに1BAT送る際のトランザクションは以下のようになります。
from: Aliceのウォレットアドレス(EOA)
to: BATのコントラクトアドレス
value: 0 ETH
data: transfer関数セレクタ、引数(Bobのウォレットアドレス(EOA)、1 BAT)
トランザクションを送るところはEthereumの世界ですが、コントラクトに渡った後の処理は各トークンの実装次第というわけですね。
ERC20トークンは自分でウォレットアドレスとトークン残高を管理するKey-Value Store型のデータ構造を持ち、残高管理しています。
ブロックチェーン
ではEthereumのブロックチェーンの話に移ります。Bitcoinと違い、トランザクションのみ記録するのではなく、プログラムが実行するのに必要なデータ(World state)も記録する必要があります。
実際のブロックを見ると以下のようになっています。
> eth.getBlock(100)
{
difficulty: '137447',
extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32',
gasLimit: 3141592,
gasUsed: 0,
hash: '0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620',
logsBloom: '0x0000000000 ... 00000',
miner: '0x24afe6c0c64821349bc1bfa73110512b33fa18e1',
nonce: '0x28fda83cb19ed497',
number: 100,
parentHash: '0x5885cdec1d1410580eaaf1 ... e816c73d926b7c9872f15',
sha3Uncles: '0x1dcc4de8dec75d7aab85b567b ... 413f0a142fd40d49347',
size: 536,
stateRoot: '0xacf2c3dfc512373ae6d96932 ... 994c2eecd8fdd3333699',
timestamp: 1439451765,
totalDifficulty: '13551548',
transactions: [ ],
transactionsRoot: '0x56e81f171bcc55a6ff8345e6 ... cadc001622fb5e363b421',
uncles: [ ]
}
必要なところだけ抜き出すと下図になります。
ParentHashが前のブロックのハッシュ値となり、ブロックチェーンとなるわけです。
StateRootはWorld stateのデータを辿るためのルートとなっています。
TransactionsRootはこのブロックに含まれるトランザクションを管理するためのものとなります。BitcoinでいうとMerkle Root(マークル・ルート)です。
ReceiptsRootは割愛。
これで「前のブロック」、「トランザクション」、「データ」とEthereumのプログラム実行プラットフォームの状態が丸ごとブロックチェーンに含まれることが理解できますね。
World stateやTransactionのデータがそのままブロックチェーンに入るわけではないのはBitcoinと同じです。P2P経由で流れてきたトランザクションを貯めるTxPoolなど、別に管理されています。
マイニング
Ethash はイーサリアムの PoW アルゴリズムです。Ethash は Dagger-Hashimoto(ダガー -ハシモ ト)アルゴリズムをベースにしており、Dagger-Hashimoto アルゴリズムはヴィタリック・ブテリンの Dagger アルゴリズムとタデウス・ドライジャの Hashimoto アルゴリズムの組み合わせだそうです。
Ethash は、 有向非巡回グラフ(Directed Acyclic Graph:DAG)と呼ばれる大きなデータセットの生成と分析に 依 存 し て い ま す 。 D A G の 初 期 サ イ ズ は 約 1 G B で 、ゆ っ くり と 線 形 に サ イ ズ が 拡 大 し 、エ ポ ッ ク( 3 0 , 0 0 0 ブロック、約 125 時間)ごとに 1 回更新されます。
DAGの目的は、頻繁にアクセスされる大規模なデータ構造を維持することに、Ethash PoWアルゴ リズムを依存させることです。これは、Ethash に「ASIC 耐性」を持たせることを目的としています。
Bitcoinと同じく、nonce(ノンス)を調整して条件に合うものを探すのがマイニングとなります。
結論
送金に特化したBitcoinとプログラム実行プラットフォームとしてのEthereumの違いをまとめました。Bitcoinを参考にしつつもアグレッシブに新たな思想を加えたなぁという印象です。
参考
Ethereum Whitepaper
ホワイトペーパーは基本設計図です。がんばって読みましょう。ただし読み解くことは基本、難しいです。英語なので手間もかかります。
名著マスタリング・ビットコインの著者、アントノプロスの書いた本です。
Ethereumの技術的なことを知りたい場合にはまず一番に読んでおきたい本です。
マスタリング・イーサリアムのPDF版が欲しい方oreillyのサイトで購入できます。
https://www.oreilly.co.jp/books/9784873118963/
原著(英語)は無料で公開されています。
https://github.com/ethereumbook/ethereumbook#mastering-ethereum
マスタリング・イーサリアムを読んだ後にお勧めです。より技術者向けの内容がコンパクトにまとめられています。
さらにこのPDFがEthereumの全体像を理解するのに役に立ちます。
CoinMarketCap
暗号資産の現在値や基本情報など、有用な情報が整理されています。
暗号資産投資を始めるとここを頻繁に訪れるようになります。
マイニングアルゴリズムEtashのコード解説です。