『マスタリング・イーサリアム』 読書メモ

Change Logs

Link

sample code repo

Remix IDE

Ropstenネットワークのビューワー

Env

Solidity compiler: version:0.6.1+commit.e6f7d5a4.Emscripten.clang

§2 コントラクトとのやりとり

一番シンプルなFaucet
100000000000000000wei = 0.1ether

// Version of Solidity compiler this program was written for
pragma solidity ^0.6.0;
 
// Our first contract is a faucet!
contract Faucet {
    // Accept any incoming amount
    receive () external payable {}
    
    // Give out ether to anyone who asks
    function withdraw(uint withdraw_amount) public {
 
        // Limit withdrawal amount
        require(withdraw_amount <= 100000000000000000);
 
        // Send the amount to the address that requested it
        msg.sender.transfer(withdraw_amount);
    }
}

receive () external payable {}
の部分は

フォールバック関数

でコントラクト内の関数を指定しなかった場合に呼ばれる。
フォールバック関数はイーサを受け入れることができる

コントラクトのデプロイ

Run

deploy
で待つとコントラクトが Ropstenネットワークにデプロイされる.
このコントラクト宛てにイーサを送金することでコントラクトの残高が増える

コントラクトの呼び出し

Remix で Run > Deployed Contracts からコントラクトの呼び出しをすることができる
今回の場合は
withdraw(uint256)
。引数に 0.1 ETH = 100000000000000000 wei なので
"100000000000000000"
を指定する。
(JSの制限により文字列で指定しないといけない)
よびだされたトランザクションは EtherScan の Internal Txns から見れる

§3 イーサリアムクライアント

イーサリアムはオープンソースであり、

イエローペーパー

という論文にとって仕様が定まっていて、実装が仕様となっているビットコインとは対照的である。
イーサリアムクライアントはプロトコルに従って実装されており、相互互換性がある。
go
で実装された
Geth
が有名

メインネットワークとテストネットワークとローカルネットワーク

ブロックチェーンの健全性、レジリエンス、検閲耐性はどれだけ独立して地理的に分散したフルノードがどれだけたくさんあるかに依存するが、フルノード立てるのは大変(140GBあるしすごい勢いで増える)のでテストネットワークでいい
テストネットワークではテスト用イーサ(価値なし)が使われガスも無料というところが違う
ローカルネットワークは自身が唯一のクライアント、普段はこれでいい
イーサリアムクライアントは

JSON-RPC API

でやりとり

curl -X POST "Content-Type: application/json" --data \
  '{ \
    "jsonrpc": "2.0", \
    "method": "web3_clientVersion", \
    "params": [], \
    "id": 1 \
   }'
{ "jsonrpc": "2.0", "id": 1, "rsult": "Geth/v1.8.0 ..." }

リモートクライアント(ウォレット)もある。ここでは
MetaMask
を使用

§4 暗号化

暗号はブロックチェーンの基盤技術のうちの一つだが、

イーサリアムプロトコルのどの部分にも暗号化は用いられてない。

ノード間のすべてのやり取りが正しいことを検証し合意形成することができる。
将来的には ゼロ知識証明Homomorphic Encryption を用い、暗号化された状態でコンセンサスができるようになるかもしれないが実装はされていない