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

イーサリアム実習 I / Practicing Ethereum I

Kenji Saito
November 01, 2017

イーサリアム実習 I / Practicing Ethereum I

2017年11月1日(水)、ブロックチェーンアカデミー「スマートコントラクトプログラミング講座(3)」にて使用のスライドです。

Kenji Saito

November 01, 2017
Tweet

More Decks by Kenji Saito

Other Decks in Technology

Transcript

  1. I
    (3)
    CSO / SFC
    [email protected]
    I – (3) – 2017-11-01 – p.1/37

    View full-size slide

  2. 1.
    2.
    3.
    4.
    5.
    Populus
    “Bash on Ubuntu on Windows” geth
    (Go segmentation fault )
    I – (3) – 2017-11-01 – p.2/37

    View full-size slide

  3. 1. :
    2. ∼ ∼
    I – (3) – 2017-11-01 – p.3/37

    View full-size slide

  4. 1. :
    I – (3) – 2017-11-01 – p.4/37

    View full-size slide

  5. BcH-smart-contract-programming.zip
    init.py Populus 1.11.0
    init10.py Populus 1.10.1
    contracts tests
    I – (3) – 2017-11-01 – p.5/37

    View full-size slide

  6. Solidity
    JavaScript
    ( , )
    (constructor)
    ( )
    ( )
    Ether
    I – (3) – 2017-11-01 – p.6/37

    View full-size slide

  7. pragma solidity ˆ0.4.8;
    contract MyToken {
    ( )
    :
    (EVM )
    :
    function MyToken(...) { /* */
    :
    }
    :
    }
    function
    C (/* */ // )
    I – (3) – 2017-11-01 – p.7/37

    View full-size slide

  8. MyToken
    string public name;
    string public symbol;
    uint8 public decimals;
    mapping (address => uint256) public balanceOf;
    name, symbol
    decimals
    : 2 100 1.00
    mapping balanceOf
    I – (3) – 2017-11-01 – p.8/37

    View full-size slide

  9. MyToken
    event Transfer(address indexed from, address indexed to, uint256 value);
    indexed (3 )
    MyToken function Transfer()
    Ethereum-Wallet
    I – (3) – 2017-11-01 – p.9/37

    View full-size slide

  10. MyToken
    function MyToken(uint256 _supply, string _name, string _symbol,
    uint8 _decimals) {
    if (_supply == 0) {
    _supply = 1000000; /* _supply 1,000,000 */
    }
    balanceOf[msg.sender] = _supply;
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
    }
    msg.sender
    _supply
    C++ _
    I – (3) – 2017-11-01 – p.10/37

    View full-size slide

  11. MyToken getBalanceOf()
    function getBalanceOf(address _addr) returns (uint256 balance) {
    return (balanceOf[_addr]);
    }
    I – (3) – 2017-11-01 – p.11/37

    View full-size slide

  12. MyToken transfer()
    function transfer(address _to, uint256 _value) {
    if (balanceOf[msg.sender] < _value) { /* */
    throw;
    }
    if (balanceOf[_to] + _value < balanceOf[_to]) { /* */
    throw;
    }
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;
    Transfer(msg.sender, _to, _value);
    }
    throw (function )
    catch
    I – (3) – 2017-11-01 – p.12/37

    View full-size slide

  13. (1)
    import pytest
    @pytest.fixture()
    def token_contract(chain):
    TokenFactory = chain.provider.get_contract_factory(’MyToken’)
    deploy_txid = TokenFactory.deploy(args=[
    0,
    "BcH Coin",
    "BcH",
    0,
    ])
    contract_address = chain.wait.for_contract_address(deploy_txid)
    return TokenFactory(address=contract_address)
    populus
    I – (3) – 2017-11-01 – p.13/37

    View full-size slide

  14. (2)
    def test_my_token(token_contract, chain):
    account0 = chain.web3.eth.accounts[0]
    account1 = chain.web3.eth.accounts[1]
    assert token_contract.call().getBalanceOf(account0) == 1000000
    assert token_contract.call().getBalanceOf(account1) == 0
    txid = token_contract.transact().transfer(account1, 10)
    chain.wait.for_receipt(txid)
    assert token_contract.call().getBalanceOf(account0) == 999990
    assert token_contract.call().getBalanceOf(account1) == 10
    account0 coinbase
    account1
    account0 account1 10BcH
    I – (3) – 2017-11-01 – p.14/37

    View full-size slide

  15. $ py.test -k test_my_token.py
    I – (3) – 2017-11-01 – p.15/37

    View full-size slide

  16. 2.
    ∼ ∼
    I – (3) – 2017-11-01 – p.16/37

    View full-size slide

  17. A, B
    A-B m
    A B A
    B A B
    . . .
    I – (3) – 2017-11-01 – p.17/37

    View full-size slide

  18. 1. X
    2. X C
    3. C
    1.
    2.
    3.
    reliable multicast
    I – (3) – 2017-11-01 – p.18/37

    View full-size slide

  19. :
    I – (3) – 2017-11-01 – p.19/37

    View full-size slide

  20. (safety)
    (liveness)
    ( )
    ( = )
    I – (3) – 2017-11-01 – p.20/37

    View full-size slide

  21. → / (benign)
    → (Byzantine)
    (malicious)
    I – (3) – 2017-11-01 – p.21/37

    View full-size slide

  22. FLP
    Fischer, Lynch, Paterson
    I – (3) – 2017-11-01 – p.22/37

    View full-size slide

  23. CAP
    Consistency ( )
    Availability ( )
    Partition tolerance ( )
    ⇒ 3
    C
    Eventual consistency ( ) . . .
    I – (3) – 2017-11-01 – p.23/37

    View full-size slide

  24. Consistency ( )
    Strong consistency ( )
    (safety)
    Eventual consistency ( )
    (liveness)

    Weak consistency ( )
    ↑ ( )
    I – (3) – 2017-11-01 – p.24/37

    View full-size slide

  25. n
    =
    f
    ( )

    I – (3) – 2017-11-01 – p.25/37

    View full-size slide

  26. (1)
    1 1, 2
    n ≤ 3f
    I – (3) – 2017-11-01 – p.26/37

    View full-size slide

  27. (2)
    I – (3) – 2017-11-01 – p.27/37

    View full-size slide

  28. CS1 :
    CS2 :
    CS3 :
    CL1 :
    CL2 :
    :
    :
    (e.g. )
    I – (3) – 2017-11-01 – p.28/37

    View full-size slide

  29. (B)FT-CUP (Consensus with Unknown Participants)
    ( / )
    : FT (Fault-Tolerant)
    : BFT (Byzantine Fault-Tolerant)
    P2P
    n FT/BFT
    I – (3) – 2017-11-01 – p.29/37

    View full-size slide

  30. State Machine Replication ( )
    (by ) (since 1984) ( )
    ( )
    . . . ( )
    I – (3) – 2017-11-01 – p.30/37

    View full-size slide

  31. ( )
    ( ) ( ) ( )
    (by )
    ⇒ ( )
    I – (3) – 2017-11-01 – p.31/37

    View full-size slide

  32. P2P
    : P2P
    3
    3
    ( )
    strategyproof
    group strategyproof
    I – (3) – 2017-11-01 – p.32/37

    View full-size slide

  33. (Sybil)
    16
    I – (3) – 2017-11-01 – p.33/37

    View full-size slide

  34. again
    n > 3f
    R F
    R > 2F

    I – (3) – 2017-11-01 – p.34/37

    View full-size slide

  35. ( )
    f = 1 ⇒ R
    I – (3) – 2017-11-01 – p.35/37

    View full-size slide

  36. (centralized) (decentralized) (distributed)
    Paul Baran, “On Distributed Communications Networks”, 1964
    (C) (A)
    I – (3) – 2017-11-01 – p.36/37

    View full-size slide

  37. II
    Hyperledger
    I – (3) – 2017-11-01 – p.37/37

    View full-size slide