Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Inside casper

2,097 views

Published on

Blockchain.tokyo #8
Casper FFG読んでみた話

Published in: Engineering
  • Be the first to comment

Inside casper

  1. 1. Inside Casper 2018 5/24 Blockchain.tokyo #8 zigen
  2. 2. Zigen ● 酒飲みながらコード書きます ● Github @zigen ● Twitter @kei_0811 ● Web Frontend ○ JS, React , ReactNative ● Blockchain初心者 ○ もうすぐ3ヶ月目!!
  3. 3. What’s Casper? 1. Proof of Stake-based Finality 2. Overlays on Proof of Work block proposal mechanism
  4. 4. New Fork Choice Rule
  5. 5. 用語 ● Source ● Target ● Supermajority Link ● Justified ● Finalized ● Validators ● Vote ● Dynasty ● Epoch
  6. 6. block1 block3 block2 block4 block5 block6 時間 t 上にいくほど新しい block n は block n-1 を参照している
  7. 7. 1 3 2 4 5 6 時間 t 4b 5b 6b 6c 3b 4c 5 6d どのブロックからでも分岐できる
  8. 8. 0 1 48 時間 t Checkpoint49 50 Epoch n Length: 50 Epoch n + 1
  9. 9. 1 3 2 4 99 100 時間 t 4b 99b 100b 100d 3b 4c 99c 100c 4つのcheckpointがある
  10. 10. 1 100 時間 t 100b 100d100c 普通のblockを省略 このcheckpointだけの表示を subtreeと呼ぶ
  11. 11. r 100 時間 t 100b 100d Source Targe t
  12. 12. Root 100 100b 100d Validators
  13. 13. Root 100 100b 100d Vote
  14. 14. Root 100 100b 100d Vote Supermajority Link
  15. 15. Root 100 100b 100d Supermajority Link Justified
  16. 16. Root 100 100b 100dJustified 100 100b 100d Vote
  17. 17. Root 100 100b 100dJustified 100 100b 100d Vote Supermajority Link
  18. 18. Root 100 100b 100d Justified 100 100b 100d Supermajority Link
  19. 19. Root 100 100b 100d Justified 100 100b 100d Supermajority Link Finalized
  20. 20. Root 100 100b 100d Justified 100 100b 100d Cannot Revert!!! Finalized
  21. 21. Implementations 1. Casper Contract ethereum/casper.git 6a171e1 2. Pythapp karlfloersch/pyethapp#dev_envd1a5d1f 3. Pyethereum ethereum/pythereum.git 3d5ec14 4. Parity paritytech/parity.git#casper 9c51885
  22. 22. Roles ● Casper Contract simple_casper.v.py ● Miner ● Validator validator_service.py
  23. 23. Implementations 1. Casper Contract ethereum/casper.git 6a171e1 2. Pythapp karlfloersch/pyethapp#dev_envd1a5d1f 3. Pyethereum ethereum/pythereum.git 3d5ec14 4. Parity paritytech/parity.git#casper 9c51885
  24. 24. Step 1. Initial: Deploy simple_casper.v.py 2. Miner: Initialize casper metadata of node 3. Validator: Deposit 4. Validator: Vote/Slash 5. Miner: Accept Block
  25. 25. Implementations 1. Casper Contract ● Written in Vyper ● As Smart Contract
  26. 26. Casper Contract validators Decimal????
  27. 27. Casper Contract parameters
  28. 28. Casper Contractを叩くまでの壁 1. Vyper 2. Serpent 3. Decimal
  29. 29. Vyper (the former Viper) ethereum/vyper.git ● New Experimental Language ● Simple, Secure, Readable ● Alternative to Solidity ● *.v.py
  30. 30. Casper Contractを叩くまでの壁 1. Vyper $pip install vyper すると casperのコンパイルがこける $pip3 install -r requirements.txt しよう 結構な人がハマってた
  31. 31. Casper Contractを叩くまでの壁 2. Serpent MSG_HASHERと PURITY_CHECKERは Serpent製 Casper Contractをinitするときにこの二つの Contract Addressを渡す
  32. 32. Casper Contractを叩くまでの壁 3. Decimal なお, ABIのspecにはdecimalは存在しない
  33. 33. Casper Contractを叩くまでの壁 3. Decimal なお, ABIのspecにはdecimalは存在しない
  34. 34. Casper Contractを叩くまでの壁 3. Decimal でもなぜethereum/casperのテストでは vyperコンパイルが通るのか?
  35. 35. Casper Contractを叩くまでの壁 3. Decimal
  36. 36. Casper Contractを叩くまでの壁 3. Decimal abi.pyをみてみると https://github.com/ethereum/pyethereum/blob/develop/ethereum/abi.py#L315-L318
  37. 37. Casper Contractを叩くまでの壁 3. Decimal 1年前からある... https://github.com/ethereum/pyethereum/commit/b4dcb30fc96ce0b462b6ddfcaa3db4432e2ce200
  38. 38. Casper Contractを叩くまでの壁 3. Decimal pythereumでしか動かないので ethereum/vyperにissueが上がってた https://github.com/ethereum/vyper/issues/566
  39. 39. Casper Contractを叩くまでの壁 3. Decimal https://github.com/ethereum/vyper/issues/566#issuecomment-389851829
  40. 40. Casper Contract validators
  41. 41. Casper Contract checkpoints
  42. 42. Init L126~ ● デプロイ後1回だけ ● パラメータ与えて 初期化していく ● とくに難しいことはない
  43. 43. initialize_epoch L468~ ● デプロイ後1回だけ ● パラメータ与えて 初期化していく ● とくに難しいことはない
  44. 44. initialize_epoch L468~
  45. 45. initialize_epoch L425~ ● 各epochが始まるたびに誰かが叩いて更新する ● Penalty factorなどの調整をするキモの部分
  46. 46. deposit L465~ ● Validatorとして登録される ● Depositが十分かどうか? ● validator_indexをincrement
  47. 47. deposit validation_addrのチェック ● 'xa1x90x3exab' はPURITY_CHECKERのmethod ● keccak256(“submit(address)”) => a1903eab65b303e5 https://ethresear.ch/t/verifying-the-purity-of-the-function-stored-at-the-validation-code-address/430
  48. 48. deposit validation_addrのチェック ● こんな感じで他のコントラクトを結構呼び出している ● 頑張れば読める
  49. 49. Vote L550~ ● Validatorがcheckpointに対してvoteする ● 80行くらいある
  50. 50. Vote L550~ ● MSG_HASHERを呼び出してhashを取得 ● RLPをdecode
  51. 51. Casper Vote Format ● Validator_index ● Target_hash ● Target_epoch ● Source_epoch ● signature https://github.com/ethereum/casper/blob/master/VALIDATOR_GUIDE.md#casper-vote-format b0 b1 b2 b3 r Epoch: n Epoch: n+1 Validators Address index
  52. 52. Casper Vote Format ● Validator_index ● Target_hash ● Target_epoch ● Source_epoch ● signature https://github.com/ethereum/casper/blob/master/VALIDATOR_GUIDE.md#casper-vote-format b0 b1 b2 b3 r source Target epoch, blockhash Validators Address index
  53. 53. Vote L550~ ● RLPでdecodeした値をチェックしていく ● すでにこのepochでvoteしていないかどうか
  54. 54. Vote L550~ ● Target_hashがrecommended_target_hashかどうか? ● target_epochがcurrent_epochかどうか? ● sourceがjustifyされているかどうか?
  55. 55. Vote L550~ ● Voteしたtarget_hashがrecommended_target_hashでなければ, Voteそのものが失敗してしまう???
  56. 56. Recommended_target_hash L365~ ● Target_epochにおけるcheckpointのblockのhashを返す ● どうやら本当にrecommended_target_hashにvoteしないといけない ● そもそもrecommendedとは...
  57. 57. そもそも誰がvoteするのか? ● もちろんvalidatorがdepositしてvoteするのである ● karlfloersch/pyethappにvalidator_service.pyという実装がある ○ ethereum/pythappにもあるけど, これは古いcasperのvalidatorの実装なので注意 ● とりあえず読んでみる https://github.com/ethereum/casper/blob/master/VALIDATOR_GUIDE.md https://github.com/karlfloersch/pyethapp/blob/dev_env/pyethapp/validator_service.py
  58. 58. Pythapp validator_service.py L127 vote
  59. 59. Pythapp validator_service.py L127 vote ● 似たようなmethodが呼び出されている
  60. 60. validator_service.py L264~ recommended_vote_contents ● Target_hash は current_epoch * epoch_length -1 らしい ● 結局のところcasperのrecommended_target_hashと同じ
  61. 61. Validatorの挙動 ● Vote_msgのtarget_hashは, casper contractのrecommended_target_hashと同じ ● つまり, casper contractが指定するtarget_hashにvoteするしかない
  62. 62. ● ValidatorはVote先を選ぶことはできない! ● New Fork Choice Ruleなのに選べない!
  63. 63. ところで もし, Validatorが自由にTargetを選べたら
  64. 64. ContractはどうやってそのTarget Checkpointが 存在することを確認するのか?
  65. 65. そもそもContractを実行するEVMはどこ?
  66. 66. EVMはどこ? b0 b1 b2 b3 r
  67. 67. ClientClient EVMはどこ? b0 b1 b2 b3 r b0 r b0 r Client ● 各Clientにある ● そのEVMの上でrecommended_target_hashを行うと?
  68. 68. ClientClient EVMはどこ? b0 b1 b2 b3 r b0 r b0 r Client ● 各Clientにある ● そのEVMの上でrecommended_target_hashを行うと?
  69. 69. EVMはどこ? ● blockhashはblockNumberからそのblockのhashを取得する
  70. 70. Casper ContractのVote methodで fork先のtargetを選ぶのではない どのnodeに投げるかで選ぶ
  71. 71. Root 100 100b 100d Vote(100b) Casper Contract finalize 間違った理解
  72. 72. ClientClient 実際 b0 b1 b2 b3 r b0 r b0 r Client Contract Contract Contract Vote
  73. 73. Casper Contract再び つまりassertは, 本当にこのNodeに対して行われたvoteかどうかを 確認している
  74. 74. Forkが前提のContractを読み書きするとき ● Nodeが別々であることを意識する ● EVMが何を知っているかを考える
  75. 75. まとめ ● コードを読もう ● 読めばわかる!!!楽しい!!!! ● Minerがどうやってブロックを選ぶか喋りたかった

×