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

Change Logs
- 2020-02-03: 買った
- 2020-03-07: 1-3章読了
- 2020-05-28: 4章読了
Link
sample code repo
Remix IDE
Ropstenネットワークのビューワー
- Solidity も学べる
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 を用い、暗号化された状態でコンセンサスができるようになるかもしれないが実装はされていない