Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
スマートコントラクトデザイン / Smart Contract Design
Search
Kenji Saito
PRO
October 27, 2024
Technology
0
97
スマートコントラクトデザイン / Smart Contract Design
慶應義塾大学大学院メディアデザイン研究科「サービスデザインプロジェクトB」2024秋 第4回にて使用したスライドです。
Kenji Saito
PRO
October 27, 2024
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
アカデミーキャンプ2026 冬「ウチらとヤツらのフューチャー・デザイン」DAY3 / Acadmy Camp 2026 Winter - Future Design by Us and Them DAY3
ks91
PRO
0
37
アカデミーキャンプ2026 冬「ウチらとヤツらのフューチャー・デザイン」DAY1 / Acadmy Camp 2026 Winter - Future Design by Us and Them
ks91
PRO
0
69
アカデミーキャンプ2026 冬「ウチらとヤツらのフューチャー・デザイン」DAY2 / Acadmy Camp 2026 Winter - Future Design by Us and Them DAY2
ks91
PRO
0
53
アナログAI からの逃走とメタ・ネイチャーポジティブ / Escape from Analog AI, and Meta-Nature Positive
ks91
PRO
0
32
AI 前提社会におけるトラスト / Trust in an AI-Driven Society
ks91
PRO
0
63
非営利組織の起業/発表と総括 / Starting up a Nonprofit Organization, Presentation and Summary
ks91
PRO
0
64
自己開発 / Self-Development
ks91
PRO
1
30
あなたは何によって憶えられたいですか? / What Do You Want to be Remembered for?
ks91
PRO
0
39
ボランティアと理事会 / Volunteers and Board of Directors
ks91
PRO
0
61
Other Decks in Technology
See All in Technology
EKSで実践する オブザーバビリティの現在地
honmarkhunt
2
310
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
2
460
AIに視覚を与えモバイルアプリケーション開発をより円滑に行う
lycorptech_jp
PRO
1
550
Bill One 開発エンジニア 紹介資料
sansan33
PRO
5
18k
技術キャッチアップ効率化を実現する記事推薦システムの構築
yudai00
2
150
生成AI素人でも玄人でもない私がセイセイAIチョットワカルために勉強したこと
wkm2
2
320
Claude Codeと駆け抜ける 情報収集と実践録
sontixyou
1
1.1k
サンタコンペ2025完全攻略 ~お前らの焼きなましは遅すぎる~
terryu16
1
480
LY Tableauでの Tableau x AIの実践 (at Tableau Now! - 2026-02-26)
yoshitakaarakawa
0
650
「静的解析」だけで終わらせない。 SonarQube の最新機能 × AIで エンジニアの開発生産性を本気で上げる方法
xibuka
2
310
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
社内ワークショップで終わらせない 業務改善AIエージェント開発
lycorptech_jp
PRO
1
380
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
160
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
67
37k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Evolving SEO for Evolving Search Engines
ryanjones
0
140
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
210
Leo the Paperboy
mayatellez
4
1.5k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
79
WCS-LA-2024
lcolladotor
0
470
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Designing Experiences People Love
moore
144
24k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
130
Transcript
Generated by Stable Diffusion XL v1.0 B 2024 4 (
) B 2024 — 4 — 2024-10-28 – p.1/58
https://speakerdeck.com/ks91/collections/service-design-project-b-2024-fall ( ) ( ) Discord Discord ( / /
) Zoom URL ( ) B 2024 — 4 — 2024-10-28 – p.2/58
( ) 1 10 7 • 2 10 14 •
3 10 21 • 4 11 28 • 5 11 4 1 6 11 11 2 7 11 18 8 11 25 ( ) ( ) 4 ( 3 ) ↓ B 2024 — 4 — 2024-10-28 – p.3/58
Ethereum ( ) (1) : ERC20 ( ) (2) :
(3) : Web3 B 2024 — 4 — 2024-10-28 – p.4/58
Ethereum ( ) B 2024 — 4 — 2024-10-28 –
p.5/58
Ethereum Vitalik Buterin, “Ethereum White Paper: A NEXT GENERATION SMART
CONTRACT & DECENTRALIZED APPLICATION PLATFORM” 12 (= ) = ⇒ → Dapps ( / / ) B 2024 — 4 — 2024-10-28 – p.6/58
( ) B 2024 — 4 — 2024-10-28 – p.7/58
. . . B 2024 — 4 — 2024-10-28 –
p.8/58
vs. Ethereum (Ether ) 13 13 B 2024 — 4
— 2024-10-28 – p.9/58
= run B 2024 — 4 — 2024-10-28 – p.10/58
Ether Ethereum EOA : Externally-Owned Account ( ) Ether EVM
EVM B 2024 — 4 — 2024-10-28 – p.11/58
EVM : Ethereum Virtual Machine ঢ়ଶ ֎෦ΞΫλʔ ΞΧϯτ &7. ίʔυ
&UIFSˠ(BT ىಈ ίϯτϥΫτ ϝοηʔδ͔ɺ৽͍ࣗ͠ಈΦϒδΣΫτ ΞΧϯτؒͰΓऔΓ͞ΕΔσʔλ&UIFS ετϨʔδ ঢ়ଶ` τϥϯβΫγϣϯ ηοτ σδλϧॺ໊ &7. ਓؒͱ͔ ࣗಈ ΦϒδΣΫτ Gas ( ( )) . . . B 2024 — 4 — 2024-10-28 – p.12/58
EVM : : ← : Solidity — JavaScript LLL —
Lisp Vyper — Python Fe — Vyper Rust ← NEW! Solidity Vyper Python B 2024 — 4 — 2024-10-28 – p.13/58
Solidity ( ) pragma solidityˆ0.7.0; contract IndivisibleAsset { /* */
string public _name; string public _symbol; uint256 public _quantity; address public _owner; constructor(string memory name, string memory symbol, uint256 quantity) public { _name = name; _symbol = symbol; _quantity = quantity; _owner = msg.sender; } function transfer(address to) public returns (bool) { require (_owner == msg.sender); _owner = to; return true; } } B 2024 — 4 — 2024-10-28 – p.14/58
( , ) (constructor) (deploy) = ( ) ( )
ETH Trusted Actor Model B 2024 — 4 — 2024-10-28 – p.15/58
Ethereum B 2024 — 4 — 2024-10-28 – p.16/58
(1) : ERC20 $ brownie bake token B 2024 —
4 — 2024-10-28 – p.17/58
pragma solidity ˆ0.6.0; /* 0.8.x */ contract Token { (
) : (EVM ) : constructor (...) public { /* */ : } function balanceOf(...) { /* ( ) */ : } : } constructor C (/* */ // ) B 2024 — 4 — 2024-10-28 – p.18/58
ERC-20 ERC (Ethereum Request for Comments) 20 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md (EIP: Ethereum
Improvement Proposal) ← EIP ( ) contract ERC20 { function totalSupply() constant returns (uint totalSupply); function balanceOf(address _owner) constant returns (uint balance); function transfer(address _to, uint _value) returns (bool success); function transferFrom(address _from, address _to, uint _value) returns (bool success); function approve(address _spender, uint _value) returns (bool success); function allowance(address _owner, address _spender) constant returns (uint remaining); event Transfer(address indexed _from, address indexed _to, uint _value); event Approval(address indexed _owner, address indexed _spender, uint _value); } name/ , symbol/ , decimals/ approve allowance ERC-777 ( ) B 2024 — 4 — 2024-10-28 – p.19/58
ERC20 ERC20 ( ) ⇒ ERC20 ( ERC20 ) ERC20
⇒ B 2024 — 4 — 2024-10-28 – p.20/58
(fungible) ERC-20 → ERC-223 (draft) or ERC-777 ( )( )
(non-fungible) ERC-721 ( ) ERC-1155 ( ) ERC-3525 (SLOT ) B 2024 — 4 — 2024-10-28 – p.21/58
Token ( ) string public symbol; string public name; uint256
public decimals; uint256 public totalSupply; mapping(address => uint256) balances; . . . name, symbol decimals : 2 100 1.00 mapping balances B 2024 — 4 — 2024-10-28 – p.22/58
Token ( ) event Transfer(address from, address to, uint256 value);
Token function emit Transfer() ( ) B 2024 — 4 — 2024-10-28 – p.23/58
Token ( ) constructor( string memory _symbol, string memory _name,
uint256 _decimals, uint256 _totalSupply ) public { symbol = _symbol; name = _name; decimals = _decimals; totalSupply = _totalSupply; balances[msg.sender] = _totalSupply; } msg.sender _totalSupply B 2024 — 4 — 2024-10-28 – p.24/58
Token balanceOf() function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner]; } B 2024 — 4 — 2024-10-28 – p.25/58
Token transfer() function transfer(address _to, uint256 _value) public returns (bool)
{ balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } ( ↑ ) OpenZeppelin https://openzeppelin.org B 2024 — 4 — 2024-10-28 – p.26/58
(2) : B 2024 — 4 — 2024-10-28 – p.27/58
GitHub git clone $ git clone https://github.com/ks91/sample-smart-contracts.git sample-smart-contracts contracts, scripts
tests token Token Solidity 0.5 0.6/0.7 (Token ) Solidity B 2024 — 4 — 2024-10-28 – p.28/58
(m2 ) 1 1 B 2024 — 4 — 2024-10-28
– p.29/58
IndivisibleAsset string public _name_; string public _symbol_; uint256 public _quantity_;
address public _owner_; _name_ ( ) _symbol_ _quantity_ (m2 ) _owner_ ‘_’ Solidity . . . B 2024 — 4 — 2024-10-28 – p.30/58
IndivisibleAsset event Transfer(address indexed from, address indexed to); from to
indexed B 2024 — 4 — 2024-10-28 – p.31/58
IndivisibleAsset constructor (string name, string symbol, uint256 quantity) public {
_name_ = name; _symbol_ = symbol; _quantity_ = quantity; _owner_ = msg.sender; } B 2024 — 4 — 2024-10-28 – p.32/58
IndivisibleAsset getOwner() function getOwner() public view returns (address) { return
(_owner_); } B 2024 — 4 — 2024-10-28 – p.33/58
IndivisibleAsset transfer() function transfer(address to) public returns (bool) { require(_owner_
== msg.sender); _owner_ = to; emit Transfer(msg.sender, to); return true; } require (function ) ( ) $ brownie compile B 2024 — 4 — 2024-10-28 – p.34/58
scripts/indivisible asset.py from brownie import * def main(): accounts[0].deploy(IndivisibleAsset, "5322
Endo, Fujisawa", "mˆ2", 300) SFC (300m2 ) ( ) B 2024 — 4 — 2024-10-28 – p.35/58
from brownie import * import pytest def test_owner_and_transfer(IndivisibleAsset): asset =
accounts[0].deploy(IndivisibleAsset, "5322 Endo", "mˆ2", 300) assert asset.getOwner() == accounts[0] asset.transfer(accounts[1], {’from’: accounts[0]}) assert asset.getOwner() == accounts[1] try: asset.transfer(accounts[0], {’from’: accounts[0]}) done = 1 except: done = 0 assert done == 0 accounts[0] accounts[1] B 2024 — 4 — 2024-10-28 – p.36/58
$ pytest tests/test_indivisible_asset.py B 2024 — 4 — 2024-10-28 –
p.37/58
(3) : B 2024 — 4 — 2024-10-28 – p.38/58
transfer settle, retrieve asset, retrieve token 3 B 2024 —
4 — 2024-10-28 – p.39/58
1. ( ) 2. ( ) 3. ( ) B
2024 — 4 — 2024-10-28 – p.40/58
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 2024 — 4 — 2024-10-28 – p.41/58
(1) from brownie import * import pytest 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 2024 — 4 — 2024-10-28 – p.42/58
(2) token.transfer(accounts[1], 300, {’from’: accounts[0]}) escrow = accounts[0].deploy(OneTimeEscrow, token, accounts[1],
asset, accounts[0], 300) accounts[0] accounts[1] 300 300 TX accounts[1] accounts[0] 300 bake Token 300 ETH wei B 2024 — 4 — 2024-10-28 – p.43/58
(3) token.transfer(escrow, 300, {’from’: accounts[1]}) asset.transfer(escrow, {’from’: accounts[0]}) assert token.balanceOf(accounts[0])
== 999999999999999999700 assert token.balanceOf(accounts[1]) == 0 assert token.balanceOf(escrow) == 300 assert asset.getOwner() == escrow accounts[1] ( ) 300 accounts[0] ( ) B 2024 — 4 — 2024-10-28 – p.44/58
(4) escrow.settle({’from’: accounts[0]}) assert token.balanceOf(accounts[0]) == 1000000000000000000000 assert token.balanceOf(accounts[1]) ==
0 assert token.balanceOf(escrow) == 0 assert asset.getOwner() == accounts[1] settle() accounts[0] OK B 2024 — 4 — 2024-10-28 – p.45/58
$ pytest tests/test_one_time_escrow.py : settle() ⇒ Discord B 2024 —
4 — 2024-10-28 – p.46/58
B 2024 — 4 — 2024-10-28 – p.47/58
1. (1) (2) Ethereum 2024 10 26 ( ) 23:59
JST B 2024 — 4 — 2024-10-28 – p.48/58
. . . . . . 3 2 ( )
( ) ( ) B 2024 — 4 — 2024-10-28 – p.49/58
N SFC ⇒ ( ) ( ) B 2024 —
4 — 2024-10-28 – p.50/58
L Ethereum ⇒ B 2024 — 4 — 2024-10-28 –
p.51/58
⇒ 20 Discord . . . B 2024 — 4
— 2024-10-28 – p.52/58
Web3 Web3 HTTPS B 2024 — 4 — 2024-10-28 –
p.53/58
B 2024 — 4 — 2024-10-28 – p.54/58
miro ( ) ( ) B 2024 — 4 —
2024-10-28 – p.55/58
B 2024 — 4 — 2024-10-28 – p.56/58
2. API (1) ( ) (2) Web API 2024 11
2 ( ) 23:59 JST B 2024 — 4 — 2024-10-28 – p.57/58
B 2024 — 4 — 2024-10-28 – p.58/58