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

スマートコントラクトデザイン / Smart Contract Design

スマートコントラクトデザイン / Smart Contract Design

慶應義塾大学大学院メディアデザイン研究科「サービスデザインプロジェクトB」2025秋 第3回にて使用したスライドです。

Avatar for Kenji Saito

Kenji Saito PRO

October 27, 2025
Tweet

More Decks by Kenji Saito

Other Decks in Technology

Transcript

  1. generated by Stable Image Ultra B 2025 4 ( )

    B 2025 — 4 — 2025-10-27 – p.1/30
  2. ( ) 1 10 6 • 2 10 13 •

    3 10 20 • 4 10 27 • 5 11 10 1 6 11 24 2 7 12 1 8 12 8 ( ) ( ) 4 ( 3 ) ↓ B 2025 — 4 — 2025-10-27 – p.3/30
  3. ( ) — (3) : Web3 B 2025 — 4

    — 2025-10-27 – p.4/30
  4. infura.io Brownie https://infura.io SIGN UP PROJECT ID infura Ethereum API

    infura . . . infura.io Amazon infura.io PROJECT ID WEB3_INFURA_PROJECT_ID PROJECT ID (∼/.bash_profile ) $ export WEB3_INFURA_PROJECT_ID= PROJECT ID B 2025 — 4 — 2025-10-27 – p.6/30
  5. Sepolia ETH brownie console Sepolia >>> network.disconnect() >>> network.connect(’sepolia’) >>>

    len(accounts) 0 >>> accounts.add() <LocalAccount object ’ 16 ’> >>> accounts[0].private_key 16 >>> quit() Sepolia Testnet ETH Faucet ETH https://sepoliafaucet.com ( ) ( ) . . . Ethereum 0.001 ETH 0.1 Sepolia ETH B 2025 — 4 — 2025-10-27 – p.7/30
  6. Sepolia ETH brownie console Sepolia ETH >>> network.disconnect() >>> network.connect(’sepolia’)

    >>> len(accounts) 0 >>> accounts.add( 16 ) <LocalAccount object ’ 16 ’> >>> accounts[0].balace() ETH >>> quit() ETH >>> accounts[0].transfer(accounts[1], "0.01 ether") B 2025 — 4 — 2025-10-27 – p.8/30
  7. 1. ( ) 2. ( ) 3. ( ) B

    2025 — 4 — 2025-10-27 – p.11/30
  8. OneTimeEscrow settle() function settle() public returns (bool) { require(_token_.balanceOf(address(this)) >=

    _price_); /* this */ require(_asset_.getOwner() == address(this)); _token_.transfer(_seller_ , _price_); _asset_.transfer(_buyer_); emit Settled(); /* */ return true; } settle() transfer ( / ) $ brownie compile B 2025 — 4 — 2025-10-27 – p.12/30
  9. (1) from brownie import * import pytest seller = accounts[0]

    buyer = accounts[1] def test_deploy_and_settle(Token, IndivisibleAsset, OneTimeEscrow): asset = accounts[0].deploy(IndivisibleAsset, "5322 Endo", "mˆ2", 300) token = accounts[0].deploy(Token, "Test Token", "TEST", 18, "1000 ether") B 2025 — 4 — 2025-10-27 – p.13/30
  10. (2) token.transfer(buyer, 300, {’from’: accounts[0]}) escrow = accounts[0].deploy(OneTimeEscrow, token, buyer,

    asset, seller, 300) accounts[0]/seller accounts[1]/buyer 300 300 TX buyer seller 300 bake Token 300 ETH wei B 2025 — 4 — 2025-10-27 – p.14/30
  11. (3) token.transfer(escrow, 300, {’from’: buyer}) asset.transfer(escrow, {’from’: seller}) assert token.balanceOf(seller)

    == 999999999999999999700 assert token.balanceOf(buyer) == 0 assert token.balanceOf(escrow) == 300 assert asset.getOwner() == escrow buyer ( ) 300 seller ( ) B 2025 — 4 — 2025-10-27 – p.15/30
  12. (4) escrow.settle({’from’: seller}) assert token.balanceOf(seller) == 1000000000000000000000 assert token.balanceOf(buyer) ==

    0 assert token.balanceOf(escrow) == 0 assert asset.getOwner() == buyer settle() seller OK B 2025 — 4 — 2025-10-27 – p.16/30
  13. 1. (1) (2) Ethereum 2025 10 25 ( ) 23:59

    JST B 2025 — 4 — 2025-10-27 – p.19/30
  14. . . . . . . 3 1 ( )

    ( ) ( ) B 2025 — 4 — 2025-10-27 – p.20/30
  15. A — NFT NFT NFT ⇒ ( ) B 2025

    — 4 — 2025-10-27 – p.23/30
  16. ⇒ 20 Discord . . . ( ) B 2025

    — 4 — 2025-10-27 – p.24/30
  17. miro ( ) ( ) B 2025 — 4 —

    2025-10-27 – p.27/30
  18. 2. API (1) ( ) (2) Web API 2025 11

    8 ( ) 23:59 JST B 2025 — 4 — 2025-10-27 – p.29/30