Ethereumで開発を始めるなら知っておきたいこと

 Ethereumで開発を始めるなら知っておきたいこと

Ethereumが話題になっていますが、既存のweb開発やアプリ開発とは勝手が少し異なっています。また、色々な情報がネットには落ちているので混乱してしまいがちです。エンジニアだがEthereumはこれから触っていきたい、という人向けに整理しました。

91d36c66b64ce58f3e749d9d921aae69?s=128

Shuichi Nagao

July 24, 2018
Tweet

Transcript

  1. EthereumͰ։ൃΛ࢝ΊΔͳΒ ஌͓͖͍ͬͯͨ͜ͱ @ngo275 2018.7.24 1

  2. ࣗݾ঺հ ໊લɿӬඌमҰ (@ngo275) ձࣾɿAnyPay ޷͖ͳݴޠɿSwift ࠷ۙΑ͘৮ΕΔݴޠɿJSɾதࠃޠ ωΠςΟϒΞϓϦͷ։ൃ (React Native) ΛϝΠϯʹɺ

    όοΫΤϯυ΍ίϯτϥΫτ΋ॻ͍ͨΓͯ͠·͢ 2
  3. ࠓ೔ͷ໨ඪ Ethereumॳ৺ऀͷΤϯδχΞ͕̍ਓͰ։ൃͰ͖ΔΑ ͏ʹͳΔ͜ͱ جૅతͳ࿩͕த৺ʹͳΓ·͢ͷͰ͝༰͍ࣻͩ͘͞ 3

  4. ಺༰ Ethereumʹ͍ͭͯ ։ൃऀ͕࠷௿ݶ஌͓͖͍ͬͯͨ͜ͱ EthereumͰԿ͕Ͱ͖Δͷ͔ EthereumΛ࢖ͬͨ։ൃʹԿ͕ඞཁ͔ ࠓ·Ͱͷ։ൃͱࢥ૝తʹҟͳͬͯ͘Δ͜ͱ 4

  5. ಺༰ Ethereumʹ͍ͭͯ ։ൃऀ͕࠷௿ݶ஌͓͖͍ͬͯͨ͜ͱ EthereumͰԿ͕Ͱ͖Δͷ͔ EthereumΛ࢖ͬͨ։ൃʹԿ͕ඞཁ͔ ࠓ·Ͱͷ։ൃͱࢥ૝తʹҟͳͬͯ͘Δ͜ͱ 5

  6. Ethereumͱ͸ϫʔϧυίϯϐϡʔλ 6

  7. ϫʔϧυίϯϐϡʔλͬͯ…?? ঢ়ଶΛ࣋ͬͨڊେͳγϯάϧτϯ ΞΧ΢ϯτεςʔτͷू߹ମ Ϣʔβ͕ϒϩʔυΩϟετ͖ͯͨ͠TxΛ࣮ߦ͢Δ͜ ͱͰঢ়ଶ͕࣌ʑࠁʑมԽ͍ͯ͠Δ 7

  8. ϫʔϧυίϯϐϡʔλͬͯ…?? ঢ়ଶΛ࣋ͬͨڊେͳγϯάϧτϯ ΞΧ΢ϯτεςʔτͷू߹ମ Ϣʔβ͕ϒϩʔυΩϟετ͖ͯͨ͠TxΛ࣮ߦ͢Δ͜ ͱͰঢ়ଶ͕࣌ʑࠁʑมԽ͍ͯ͠Δ 8

  9. ΞΧ΢ϯτͷछผ ΞΧ΢ϯτʹ͸2छྨ͋Δ EOA (Externally Owned Account) զʑਓ͕ؒѻ͍ͬͯΔΞΧ΢ϯτ CA (Contract Account)

    εϚʔτίϯτϥΫτ͕֨ೲ͞Ε͍ͯΔΞΧ΢ ϯτ 9
  10. ΞΧ΢ϯτͷ࣮ଶ ΞΧ΢ϯτ͸ΞυϨεʹΑͬͯࣝผ͞ΕΔ ΞΧ΢ϯτ͸ҎԼͷϓϩύςΟΛ࣋ͭ Nonceɿ֤Tx͕ෳ਺ճ࣮ߦ͞Εͳ͍Α͏ʹ؅ཧ͢ΔΧ΢ϯλʔ BalanceɿΞΧ΢ϯτͷETH࢒ߴ CodeɿίϯτϥΫτͷίʔυΛอ͍࣋ͯ͠Δ (CAͷΈ) StorageɿίϯτϥΫτ͕͍࣋ͬͯΔσʔλ (CAͷΈ) 10

  11. ϫʔϧυίϯϐϡʔλͬͯ…?? ঢ়ଶΛ࣋ͬͨڊେͳγϯάϧτϯ ΞΧ΢ϯτεςʔτͷू߹ମ Ϣʔβ͕ϒϩʔυΩϟετ͖ͯͨ͠TxΛ࣮ߦ͢Δ͜ ͱͰঢ়ଶ͕࣌ʑࠁʑมԽ͍ͯ͠Δ 11

  12. Txͷ࢓૊Έ State(n) Tx (Transaction) State(n+1) ͜ͷTxͷҰఆͷू·Γ͕ϒϩοΫΛܗ੒͢Δ 12

  13. Txͷ۩ମྫ https://raw.githubusercontent.com/ethereumbuilders/GitBook/master/en/vitalik-diagrams/ethertransition.png 13

  14. Txͷ۩ମྫ https://raw.githubusercontent.com/ethereumbuilders/GitBook/master/en/vitalik-diagrams/ethertransition.png 14

  15. Ψε୅ʹ͍ͭͯ TxΛ࣮ߦ͢Δʹ͸ϚΠφʔʹରͯ͠ख਺ྉΛ෷͏ඞཁ͕͋Δ ΞΧ΢ϯτεςʔτΛߋ৽͢Δʹ͸͓͕͔͔ۚΔ DBʹॻ͖ࠐΈ͢Δʹ͸౎౓՝͕ۚ૸Δɺͱ͍͏ΠϝʔδɻϢʔβ͕ෛ୲͢Δͷ ͔ɺαʔϏε͕ෛ୲͢Δͷ͔͸࣮૷࣍ୈ͕ͩɺϢʔβ͕ෛ୲͢Δͷ͕Ұൠత ෷͏ֹ = Gas Limit ×

    Gas Price Gas Limitɿফඅͯ͠΋ྑ͍Ψεྔͷ্ݶɻ࣮ࡍʹ࢖ΘΕΔྔ͸ίϯτϥΫτ࣍ୈ ͕ͩɺ௒ա෼͸ฦͬͯ͘Δɻྫ͑͹ɺETHͷૹۚ͸21000ʹͳΔ Gas Priceɿ෷͏࣌ͷ1୯Ґ͋ͨΓͷΨεͷྉۚɻࠓͩͱ3Gwei͘Β͍ɻΨε୅্͕ ͕͍ͬͯΔɺͱ͍͏ͷ͸ίΠπ্͕͕͍ͬͯΔͱ͍͏͜ͱ Gas LimitΛઃ͚Δ͜ͱͰແݶϧʔϓ͢ΔίϯτϥΫτΛ๷͛Δ 15
  16. ಺༰ Ethereumʹ͍ͭͯ ։ൃऀ͕࠷௿ݶ஌͓͖͍ͬͯͨ͜ͱ EthereumͰԿ͕Ͱ͖Δͷ͔ EthereumΛ࢖ͬͨ։ൃʹԿ͕ඞཁ͔ ࠓ·Ͱͷ։ൃͱࢥ૝తʹҟͳͬͯ͘Δ͜ͱ 16

  17. EthereumͰԿ͕Ͱ͖Δͷ͔ τʔΫϯͷൃߦ ERC20ɾERC223ɾERC721ͷΑ͏ʹن͕ܾ֨ΊΒΕ͍ͯͯͦΕ௨ Γʹ࣮૷͢Ε͹τʔΫϯʹͳΔ ੑ࣭ʹΑͬͯϢʔϦςΟτʔΫϯ΍ηΩϡϦςΟτʔΫϯͱݺ͹Ε Δ͜ͱ΋͋Δɻ࠷ۙ͸ηΩϡϦςΟτʔΫϯ͕࿩୊ εϚʔτίϯτϥΫτͷ࣮૷ ैདྷͷόοΫΤϯυͷॲཧΛɺϒϩοΫνΣʔϯʹࡌͤͨΠϝʔδ Ͱɺվ͟ΜͰ͖ͳ͍͔ͭɺԿΛ಺෦Ͱߦ͍ͬͯΔͷ͕ެ։͞Ε͍ͯ Δ

    ίϯτϥΫτΛ࢖ͬͯDApps (Decentralized Applications) Λ࡞ΕΔ 17
  18. ίϯτϥΫτΛ࢖͏ͱԿ͕มΘΔͷ͔ τʔΫϯΛΞϓϦ಺ʹ૊ΈࠐΊΔ τʔΫϯؒͷަ׵΋؆୯ʹͰ͖Δ τʔΫϯͱԿ͔Ձ஋ͷަ׵͕؆୯ʹͰ͖Δ ଞͷਓ͕࣮૷ͨ͠ίϯτϥΫτ΋ୟ͚Δ LambdaΛ֎෦͔Β΋ୟ͚ΔΠϝʔδ 18

  19. ಺༰ Ethereumʹ͍ͭͯ ։ൃऀ͕࠷௿ݶ஌͓͖͍ͬͯͨ͜ͱ EthereumͰԿ͕Ͱ͖Δͷ͔ EthereumΛ࢖ͬͨ։ൃʹԿ͕ඞཁ͔ ࠓ·Ͱͷ։ൃͱࢥ૝తʹҟͳͬͯ͘Δ͜ͱ 19

  20. ։ൃ࣌ʹΑ͘ग़ͯ͘Δొ৔ਓ෺ ݴޠɿSolidity ίϯύΠϥɿsolcɾsolc-js ϑϨʔϜϫʔΫɿTruffle ϥΠϒϥϦɿWeb3ɾOpenZeppelin ΢ΥϨοτɿMetamask ςετωοτɿRopstenɾKovanɾRinkeby ϒϩοΫΤΫεϓϩʔϥʔɿEtherscan EthereumΫϥΠϯτɿgethɾParity EthereumͷϦϞʔτϊʔυɿINFURA

    20
  21. Solidityʹ͍ͭͯ EVM (Ethereum Virtual Machine) ্Ͱಈ͘ίϯτϥΫτΛॻ͘ ͨΊͷߴڃݴޠ ΤσΟλ͸VSCode΍IntelliJ΋ϓϥάΠϯ͕͋Δ͕ɺRemixͱ ͍͏ϒϥ΢βΤσΟλ΋Α͘ར༻͞ΕΔ ΤϯδχΞ͕׳Ε਌͠ΜͰ͍ΔݴޠͰ͸౰ͨΓલͷػೳ͕ͳ

    ͍͜ͱ͕͠͹͠͹͋Δ filter౳ͷ഑ྻॲཧ΋ͳ͘forɾifͰؤுΔ ॲཧ͕૿͑Ε͹૿͑Δ΄Ͳ࣮ߦʹ͔͔ΔΨε୅΋େ͖͘ͳΔ 21
  22. ετϨʔδʹ͍ͭͯ ετϨʔδ͸͔ͳΓߴՁ Gas Price = 2Gweiͱͯ͠
 1GB͋ͨΓ1280ETH(7000ສԁऑ)ඞཁ AWS S3ͱൺ΂ͯ໿2700ສഒߴ͍ (ETH

    = 474USD) Ϋϥεͷϝϯόม਺Έ͍ͨʹɺίϯτϥΫτʹϓϩ ύςΟΛఆٛͯͦ͜͠ʹσʔλΛηοτ͍͚ͯͩ͘͠ 22
  23. Minimum Viable Tokenͷ࣮૷ pragma solidity ^0.4.20; contract MyToken { /*

    This creates an array with all balances */ mapping (address => uint256) public balanceOf; /* Initializes contract with initial supply tokens to the creator of the contract */ function MyToken( uint256 initialSupply ) public { balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens } /* Send coins */ function transfer(address _to, uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient return true; } } 23
  24. Minimum Viable Tokenͷ࣮૷ pragma solidity ^0.4.20; contract MyToken { /*

    This creates an array with all balances */ mapping (address => uint256) public balanceOf; /* Initializes contract with initial supply tokens to the creator of the contract */ function MyToken( uint256 initialSupply ) public { balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens } /* Send coins */ function transfer(address _to, uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient return true; } } ͜Ε͚ͩͰτʔΫϯ͸ग़དྷ্͕Γ 24
  25. Truffleʹ͍ͭͯ ίϯτϥΫτΛ࣮૷͢Δ࣌ʹσϑΝΫτͱͳ͍ͬͯΔϑϨʔϜϫʔ Ϋ ςετ΍ίϯύΠϧɺϩʔΧϧͷtestnetͷѻ͍͕؆୯ ςετ͸JSͰॻ͚Δ ίϯύΠϧ͸solc-jsͰߦΘΕɺsolcͱ͸ඍົʹ݁Ռ͕ҟͳΔ ॻ͍ͨίϯτϥΫτΛαΫοͱϩʔΧϧͷtestnetʹσϓϩΠ͠ ͯಈ࡞֬ೝ͕Ͱ͖Δ `truffle init

    ProjectName` ͰςϯϓϨ͕࡞੒͞ΕΔ 25
  26. OpenZeppelinʹ͍ͭͯ ERC20΍Ϋϥ΢υηʔϧ(ICO)ͳͲසൟʹར༻͞ΕΔ ػೳΛఏڙ͢ΔϥΠϒϥϦ ͜ΕΛར༻͢Δͱ਺ߦͰERC20ͷτʔΫϯΛൃߦ Ͱ͖Δ ςετίʔυ΋ࢀߟʹͳΔ ICOͷςετίʔυ΍ݖݶपΓͷςετ͕๛෋ https://github.com/OpenZeppelin/openzeppelin-solidity 26

  27. Web3ʹ͍ͭͯ ϦϞʔτͰಈ͍͍ͯΔEthereumΫϥΠΞϯτʹରͯ͠JSON-RPC ͰϝιουΛ࣮ߦͰ͖Δ INFURA (ޙड़) ΍ࣗ෼Ͱཱͯͨgeth / Parity͕ಈ͘αʔόʹWeb3 ͸ΞΫηε͢Δඞཁ͕͋Δ Web3͕ͳ͍ͱ֤ΞϓϦ͕શϒϩοΫΛ͍࣋ͬͯͳ͍ͱ͍͚ͳ

    ͍ ૹۚ΍Txͷ࣮ߦ͕Web3ܦ༝Ͱߦ͑Δ JSʹݶΒ༷ͣʑͳݴޠͰ࣮૷͞Ε͍ͯΔ(SwiftɾJavaͱ͔) React΍Vue.jsͱ૊Έ߹Θ࣮ͤͯ૷͢Δέʔε͕ଟ͍ 27
  28. Metamaskʹ͍ͭͯ ConsenSys੡ ChromeͷExtension DAppsΛར༻͢Δ࣌ʹඞਢΞΠςϜʹͳΔ ىಈͯ͠ΞΧ΢ϯτΛ࡞੒ɾ෮ݩ͢ΔͱɺDAppsར༻࣌ʹͦ ͷΞΧ΢ϯτΛ࢖ͬͯETHͷૹ৴΍Txͷ࣮ߦ͕Ͱ͖Δ DAppsଆ͕Web3ͷதͷॺ໊ΛٻΊΔϝιουΛίʔϧ͢Δ ͱMetamask͕൓Ԡ͠ɺॺ໊ͷ֬ೝϙοϓΞοϓ͕ग़ͯ͘Δ 28

  29. Etherscanʹ͍ͭͯ Tx΍ϒϩοΫͷঢ়ଶΛ֬ೝ͢ΔαΠτ ࣮ߦͨ͠Tx͕੒ޭͨ͠ͷ͔ࣦഊͨ͠ͷ͔ɺ·ͩ Pendingͳͷ͔Λ֬ೝͰ͖Δ ERC20τʔΫϯͷ࢒ߴ΋Θ͔Δ ͱΓ͋͑ͣඞ͓ͣੈ࿩ʹͳΔαʔϏε 29

  30. ςετωοτʹ͍ͭͯ EthereumͷϝΠϯωοτͷଞʹ։ൃ໨తͰςετωοτͳΔ΋ ͷ͕͋Δ RopstenɾKovanɾRinkeby͋ͨΓ͕༗໊ faucet (ϦΫΤετ͢ΔͱETH͕΋Β͑ΔαΠτ)͕͋ΔͷͰͦ͜ ͰETHΛ΋Βͬͯ։ൃʹར༻Ͱ͖Δ ίϯτϥΫτͷσϓϩΠΛͯ͠ಈ࡞ͷ֬ೝ͕Ͱ͖Δ ETHͷՁ஋͸ແՁ஋͕ͩجຊతʹಈ࡞͸ϝΠϯωοτͷͦΕʹ ͍ۙ

    30
  31. EthereumΫϥΠΞϯτ EthereumωοτϫʔΫʹΞΫηε͢Δπʔϧ geth΍Parity͕Α͘ར༻͞Ε͍ͯΔ ओͳ༻్͸ҎԼͷ2ͭ Web3ͷϓϩόΠμɿαʔόͰgeth΍ParityΛಈ͔͓ͯ͠ ͍ͯɺΞϓϦ͸ͦͷαʔόʹWeb3ͰΞΫηε͢Δ ίϯτϥΫτͷσϓϩΠɾ࣮ߦɿGUI্ͰίϯτϥΫτ ͷσϓϩΠ΋Ͱ͖Δ 31

  32. INFURAʹ͍ͭͯ ConsenSys੡ ʮࣗ෼Ͱgeth΍ParityͷαʔόΛཱͯͳͯ͘΋͍͍ Αɺ͓Εཱ͕ͯͨ΍ͭΛͱΓ͋͑ͣͨͩͰ࢖ͬͯΈ ͳΑɺςετωοτ΋ରԠͯ͠Δ͔Β͞ʯͬͯαʔ Ϗε Web3ͷϓϩόΠμΛआΓΕΔͱ͍͏͜ͱ 32

  33. ಺༰ Ethereumʹ͍ͭͯ ։ൃऀ͕࠷௿ݶ஌͓͖͍ͬͯͨ͜ͱ EthereumͰԿ͕Ͱ͖Δͷ͔ EthereumΛ࢖ͬͨ։ൃʹԿ͕ඞཁ͔ ࠓ·Ͱͷ։ൃͱࢥ૝తʹҟͳͬͯ͘Δ͜ͱ 33

  34. ΞϓϦσβΠϯʹ͓͍ͯ ࠓ·ͰͱมΘͬͯ͘Δ͜ͱʢࣄۀऀ໨ઢʣ ձһొ࿥ͱ͍͏֓೦͕ͳ͘ͳΔ ͓ۚͷࢧ෷͍͕γʔϜϨεʹͳΔ ΞϓϦ಺௨՟Λ૊ΈࠐΈͨ͘ͳΔ Txͷ׬ྃ·Ͱ10ඵ΄Ͳ଴ͨͤΔUXʹͳΔ 34

  35. ΞϓϦσβΠϯʹ͓͍ͯ ࠓ·ͰͱมΘͬͯ͘Δ͜ͱʢϢʔβ໨ઢʣ ύεϫʔυΛ׬શࣗݾ؅ཧ͢Δ͜ͱʹͳΔ ㅟ ㅟ αʔϏε͝ͱʹձһొ࿥͠ͳͯ͘ࡁΉ ҉߸伴ΛࣦͬͨΒ୭΋෮ݩͰ͖ͳ͍ (ηϧϑGox) Կ͔࣮ߦ͢Δͨͼʹख਺ྉΛ෷Θͳ͍ͱ͍͚ͳ͍ Կ͔࣮ߦ͢Δͨͼʹ݁Ռ͕෼͔Δ·Ͱ10ඵఔ౓଴ͨ

    ͳ͍ͱ͍͚ͳ͍ 35
  36. αʔϏεσβΠϯʹ͓͍ͯ ࠓ·ͰͱมΘͬͯ͘Δ͜ͱ ϒϥοΫϘοΫεͳதԝूݖ͸ݏ͕ΒΕΔ ༷ʑͳϞϊΛ৘ใԽͰ͖ΔΑ͏ʹͳΔ͜ͱͰɺϞϊͷྲྀಈ ੑ্͕͕Δ ྫɿσδλϧূ݊ τϥϯβΫγϣϯͷಁ໌ԽʹΑͬͯ৴༻͕ੜ·ΕΔ ͦͷΞΧ΢ϯτ͕ͲΜͳ͜ͱΛ͍ͯͯ͠ԿΛ͍࣋ͬͯΔ ͷ͔ΛՄࢹԽ͢Δ͜ͱͰɺͲ͏͍ͬͨਓ෺ͳͷ͔෼͔Δ 36

  37. EthereumͰࣗ෼͕ͭ·͍ͮͨͱ͜Ζ NonceΛ૿΍͞ͳ͍ͱTx͕࣮ߦͰ͖ͳ͍ ϒϩοΫʹऔΓࠐ·ΕΔ·ͰͷλΠϜϥά͋Γɺඞͣ͠΋ҙਤ͍ͯ͠ΔॱͰ࣮ ߦ͞Εͳ͍ͨΊɺ࿈ଓͰ࣮ߦ͠Α͏ͱ͢Δͱ͍ͣΕ͔͕ࣦഊ͢ΔՄೳੑ͕͋Δ TxΛ࣮ߦ͔ͯ͠Β൓ө͞ΕΔ·Ͱʹ͕͔͔࣌ؒΔͷͰɺ࣮ߦ׬ྃΛऔಘ͢ΔͨΊ ʹఆظతʹϙʔϦϯάΛͨ͠ํ͕࣮֬ ΢ΥϨοτΞϓϦΛ࡞ͬͨͱͯ͠ɺૹۚͷTxΛ౤͔͛ͯΒ׬ྃ·Ͱ10ඵ΄Ͳ͔ ͔Δ͕ɺ੒ޭ͔ͨ͠Ͳ͏͔ΛͲ͏΍ͬͯϢʔβʹݟͤΔͷ͔ͱ͍͏໰୊ ϒϩοΫ͕ϑΥʔΫ͢Δ͜ͱ͕كʹ͋ΔͷͰͦΕΛߟྀ͠ͳ͍ͱ͍͚ͳ͍ Tx੒ޭ࣌ʹϓογϡ௨஌ΛϦΞϧλΠϜͰૹΓ͍͕ͨɺͦͷTx͸࣮͸ࣦഊͯ͠

    ͍ΔՄೳੑ΋͋Δ 37