Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

ࣗݾ঺հ ໊લɿӬඌमҰ (@ngo275) ձࣾɿAnyPay ޷͖ͳݴޠɿSwift ࠷ۙΑ͘৮ΕΔݴޠɿJSɾதࠃޠ ωΠςΟϒΞϓϦͷ։ൃ (React Native) ΛϝΠϯʹɺ όοΫΤϯυ΍ίϯτϥΫτ΋ॻ͍ͨΓͯ͠·͢ 2

Slide 3

Slide 3 text

ࠓ೔ͷ໨ඪ Ethereumॳ৺ऀͷΤϯδχΞ͕̍ਓͰ։ൃͰ͖ΔΑ ͏ʹͳΔ͜ͱ جૅతͳ࿩͕த৺ʹͳΓ·͢ͷͰ͝༰͍ࣻͩ͘͞ 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

ΞΧ΢ϯτͷछผ ΞΧ΢ϯτʹ͸2छྨ͋Δ EOA (Externally Owned Account) զʑਓ͕ؒѻ͍ͬͯΔΞΧ΢ϯτ CA (Contract Account) εϚʔτίϯτϥΫτ͕֨ೲ͞Ε͍ͯΔΞΧ΢ ϯτ 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Ψε୅ʹ͍ͭͯ TxΛ࣮ߦ͢Δʹ͸ϚΠφʔʹରͯ͠ख਺ྉΛ෷͏ඞཁ͕͋Δ ΞΧ΢ϯτεςʔτΛߋ৽͢Δʹ͸͓͕͔͔ۚΔ DBʹॻ͖ࠐΈ͢Δʹ͸౎౓՝͕ۚ૸Δɺͱ͍͏ΠϝʔδɻϢʔβ͕ෛ୲͢Δͷ ͔ɺαʔϏε͕ෛ୲͢Δͷ͔͸࣮૷࣍ୈ͕ͩɺϢʔβ͕ෛ୲͢Δͷ͕Ұൠత ෷͏ֹ = Gas Limit × Gas Price Gas Limitɿফඅͯ͠΋ྑ͍Ψεྔͷ্ݶɻ࣮ࡍʹ࢖ΘΕΔྔ͸ίϯτϥΫτ࣍ୈ ͕ͩɺ௒ա෼͸ฦͬͯ͘Δɻྫ͑͹ɺETHͷૹۚ͸21000ʹͳΔ Gas Priceɿ෷͏࣌ͷ1୯Ґ͋ͨΓͷΨεͷྉۚɻࠓͩͱ3Gwei͘Β͍ɻΨε୅্͕ ͕͍ͬͯΔɺͱ͍͏ͷ͸ίΠπ্͕͕͍ͬͯΔͱ͍͏͜ͱ Gas LimitΛઃ͚Δ͜ͱͰແݶϧʔϓ͢ΔίϯτϥΫτΛ๷͛Δ 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Solidityʹ͍ͭͯ EVM (Ethereum Virtual Machine) ্Ͱಈ͘ίϯτϥΫτΛॻ͘ ͨΊͷߴڃݴޠ ΤσΟλ͸VSCode΍IntelliJ΋ϓϥάΠϯ͕͋Δ͕ɺRemixͱ ͍͏ϒϥ΢βΤσΟλ΋Α͘ར༻͞ΕΔ ΤϯδχΞ͕׳Ε਌͠ΜͰ͍ΔݴޠͰ͸౰ͨΓલͷػೳ͕ͳ ͍͜ͱ͕͠͹͠͹͋Δ filter౳ͷ഑ྻॲཧ΋ͳ͘forɾifͰؤுΔ ॲཧ͕૿͑Ε͹૿͑Δ΄Ͳ࣮ߦʹ͔͔ΔΨε୅΋େ͖͘ͳΔ 21

Slide 22

Slide 22 text

ετϨʔδʹ͍ͭͯ ετϨʔδ͸͔ͳΓߴՁ Gas Price = 2Gweiͱͯ͠
 1GB͋ͨΓ1280ETH(7000ສԁऑ)ඞཁ AWS S3ͱൺ΂ͯ໿2700ສഒߴ͍ (ETH = 474USD) Ϋϥεͷϝϯόม਺Έ͍ͨʹɺίϯτϥΫτʹϓϩ ύςΟΛఆٛͯͦ͜͠ʹσʔλΛηοτ͍͚ͯͩ͘͠ 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Truffleʹ͍ͭͯ ίϯτϥΫτΛ࣮૷͢Δ࣌ʹσϑΝΫτͱͳ͍ͬͯΔϑϨʔϜϫʔ Ϋ ςετ΍ίϯύΠϧɺϩʔΧϧͷtestnetͷѻ͍͕؆୯ ςετ͸JSͰॻ͚Δ ίϯύΠϧ͸solc-jsͰߦΘΕɺsolcͱ͸ඍົʹ݁Ռ͕ҟͳΔ ॻ͍ͨίϯτϥΫτΛαΫοͱϩʔΧϧͷtestnetʹσϓϩΠ͠ ͯಈ࡞֬ೝ͕Ͱ͖Δ `truffle init ProjectName` ͰςϯϓϨ͕࡞੒͞ΕΔ 25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Web3ʹ͍ͭͯ ϦϞʔτͰಈ͍͍ͯΔEthereumΫϥΠΞϯτʹରͯ͠JSON-RPC ͰϝιουΛ࣮ߦͰ͖Δ INFURA (ޙड़) ΍ࣗ෼Ͱཱͯͨgeth / Parity͕ಈ͘αʔόʹWeb3 ͸ΞΫηε͢Δඞཁ͕͋Δ Web3͕ͳ͍ͱ֤ΞϓϦ͕શϒϩοΫΛ͍࣋ͬͯͳ͍ͱ͍͚ͳ ͍ ૹۚ΍Txͷ࣮ߦ͕Web3ܦ༝Ͱߦ͑Δ JSʹݶΒ༷ͣʑͳݴޠͰ࣮૷͞Ε͍ͯΔ(SwiftɾJavaͱ͔) React΍Vue.jsͱ૊Έ߹Θ࣮ͤͯ૷͢Δέʔε͕ଟ͍ 27

Slide 28

Slide 28 text

Metamaskʹ͍ͭͯ ConsenSys੡ ChromeͷExtension DAppsΛར༻͢Δ࣌ʹඞਢΞΠςϜʹͳΔ ىಈͯ͠ΞΧ΢ϯτΛ࡞੒ɾ෮ݩ͢ΔͱɺDAppsར༻࣌ʹͦ ͷΞΧ΢ϯτΛ࢖ͬͯETHͷૹ৴΍Txͷ࣮ߦ͕Ͱ͖Δ DAppsଆ͕Web3ͷதͷॺ໊ΛٻΊΔϝιουΛίʔϧ͢Δ ͱMetamask͕൓Ԡ͠ɺॺ໊ͷ֬ೝϙοϓΞοϓ͕ग़ͯ͘Δ 28

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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