Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

Shuichi Nagao

July 24, 2018
Tweet

More Decks by Shuichi Nagao

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. ετϨʔδʹ͍ͭͯ
    ετϨʔδ͸͔ͳΓߴՁ
    Gas Price = 2Gweiͱͯ͠

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide