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

スマートコントラクトプログラミング (4) イーサリアム実習 II / Ethereum Practice II

スマートコントラクトプログラミング (4) イーサリアム実習 II / Ethereum Practice II

ブロックチェーンハブ主催で開催している (第2期) スマートコントラクトプログラミング講義 (4) 「イーサリアム実習 II」のスライドです。2017年5月31日(水) に使用しました。

Kenji Saito

May 31, 2017
Tweet

More Decks by Kenji Saito

Other Decks in Technology

Transcript

  1. 1. : 2. : 3. / II – (4) –

    2017-05-31 – p.3/45
  2. IndivisibleAsset string public _name; string public _symbol; uint256 public _quantity;

    address public _owner; _name ( ) _symbol _quantity (m2 ) _owner _ Solidity . . . II – (4) – 2017-05-31 – p.6/45
  3. IndivisibleAsset function IndivisibleAsset(string name, string symbol, uint256 quantity) { _name

    = name; _symbol = symbol; _quantity = quantity; _owner = msg.sender; } II – (4) – 2017-05-31 – p.8/45
  4. IndivisibleAsset transfer() function transfer(address to) { if (_owner != msg.sender)

    { throw; } _owner = to; Transfer(msg.sender, to); } ( / ) $ populus compile II – (4) – 2017-05-31 – p.10/45
  5. (1) import pytest @pytest.fixture() def asset_contract(chain): AssetFactory = chain.get_contract_factory(’IndivisibleAsset’) deploy_txid

    = AssetFactory.deploy(args=[ "5322 Endo, Fujisawa", "mˆ2", 300, ]) contract_address = chain.wait.for_contract_address(deploy_txid) return AssetFactory(address=contract_address) SFC (300m2 ) II – (4) – 2017-05-31 – p.11/45
  6. (2) def test_indivisible_assset(asset_contract, chain): account0 = chain.web3.eth.accounts[0] account1 = chain.web3.eth.accounts[1]

    assert asset_contract.call().getOwner() == account0 txid = asset_contract.transact().transfer(account1) chain.wait.for_receipt(txid) assert asset_contract.call().getOwner() == account1 account0 account1 II – (4) – 2017-05-31 – p.12/45
  7. 1. ( ) 2. ( ) 3. ( ) II

    – (4) – 2017-05-31 – p.16/45
  8. OneTimeEscrow settle() function settle() { address addr = this; /*

    this */ if (_token.getBalanceOf(this) < _price || _asset.getOwner() != addr) { throw; } _token.transfer(_seller , _price); _asset.transfer(_buyer); Settled(); /* */ } settle() transfer ( / ) $ populus compile II – (4) – 2017-05-31 – p.17/45
  9. (1) import pytest @pytest.fixture() def token_contract(chain): . . . @pytest.fixture()

    def asset_contract(chain): . . . II – (4) – 2017-05-31 – p.18/45
  10. (2) def test_one_time_escrow(token_contract, asset_contract, chain): account0 = chain.web3.eth.accounts[0] account1 =

    chain.web3.eth.accounts[1] txid = chain.web3.eth.sendTransaction({ ’from’: account0, ’to’: account1, ’value’: chain.web3.toWei(1, "ether") }) chain.wait.for_receipt(txid) txid = token_contract.transact().transfer(account1, 300) chain.wait.for_receipt(txid) account0 account1 1Ether 300BcH 300BcH TX II – (4) – 2017-05-31 – p.19/45
  11. (3) EscrowFactory = chain.get_contract_factory(’OneTimeEscrow’) txid = EscrowFactory.deploy(args=[ token_contract.address, account1, asset_contract.address,

    account0, 300, ]) contract_address = chain.wait.for_contract_address(txid) EscrowFactory.address = contract_address; account1 account0 300BcH II – (4) – 2017-05-31 – p.20/45
  12. (4) txid = token_contract.transact({ ’from’: account1 }).transfer(contract_address, 300) chain.wait.for_receipt(txid) txid

    = asset_contract.transact().transfer(contract_address) chain.wait.for_receipt(txid) assert token_contract.call().getBalanceOf(account0) == 999700 assert token_contract.call().getBalanceOf(account1) == 0 assert token_contract.call().getBalanceOf(contract_address) == 300 assert asset_contract.call().getOwner() == contract_address account1 300BcH account0 II – (4) – 2017-05-31 – p.21/45
  13. (5) txid = EscrowFactory.transact().settle(); chain.wait.for_receipt(txid) assert token_contract.call().getBalanceOf(account0) == 1000000 assert

    token_contract.call().getBalanceOf(account1) == 0 assert token_contract.call().getBalanceOf(contract_address) == 0 assert asset_contract.call().getOwner() == account1 settle() II – (4) – 2017-05-31 – p.22/45
  14. 3. / Hyperledger (Fabric, Sawtooth, Iroha, Burrow) R3 Corda Enterprise

    Ethereum Alliance II – (4) – 2017-05-31 – p.24/45
  15. (Hyperledger ) ( ) ( ) ( ) IoT /

    / II – (4) – 2017-05-31 – p.25/45
  16. / : Proposal → Incubation → Active → Deprecated →

    End of Life II – (4) – 2017-05-31 – p.28/45
  17. (Docker) (chaincode) PBFT (Practical BFT) RocksDB CA PKI v1.0 DB

    CA II – (4) – 2017-05-31 – p.33/45
  18. ( ) (permissioned) (permissionless) Proof of Elapsed Time (PoET) Proof

    of Work ( ) (Intel ) Transaction Families II – (4) – 2017-05-31 – p.35/45
  19. R3 R3CEV 77 (2017 2 ) 3 SBI , R3Net(

    ) Corda II – (4) – 2017-05-31 – p.41/45
  20. JVM ( ) (Uniqueness Services) UTXO X.509 PKI ( )

    II – (4) – 2017-05-31 – p.44/45