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
80
スマートコントラクトデザイン / Smart Contract Design
慶應義塾大学大学院メディアデザイン研究科「サービスデザインプロジェクトB」2024秋 第4回にて使用したスライドです。
Kenji Saito
PRO
October 27, 2024
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
We Never Took the Kobayashi Maru Test Until Now. What Do You Think of Our Solutions? — Journeys of the Mind Through a No-Win Game
ks91
PRO
0
12
思いつきが武器になる:研究というゲームを始めよう / Ideas Are Your Equipments : Let the Game of Research Begin!
ks91
PRO
0
65
ロボットを雰囲気(ヴァイブ)でプログラミングするこどもたち / Children Vibe-Programming Robots
ks91
PRO
0
21
アカデミーキャンプ 2025 SuuuuuuMMeR「燃えろ!!ロボコン」 / Academy Camp 2025 SuuuuuuMMeR "Burn the Spirit, Robocon!!" DAY 3
ks91
PRO
0
30
アカデミーキャンプ 2025 SuuuuuuMMeR「燃えろ!!ロボコン」 / Academy Camp 2025 SuuuuuuMMeR "Burn the Spirit, Robocon!!" DAY 2
ks91
PRO
0
32
アカデミーキャンプ 2025 SuuuuuuMMeR「燃えろ!!ロボコン」 / Academy Camp 2025 SuuuuuuMMeR "Burn the Spirit, Robocon!!" DAY 1
ks91
PRO
0
160
未来へのフォワードキャスト / Forward Cast to the Future
ks91
PRO
0
86
発表と総括 / Presentations and Summary
ks91
PRO
0
61
サイバーフィジカル社会、金融の未来とアイデアソン / Cyber Physical Society, Future of Finance, and Ideathon
ks91
PRO
0
78
Other Decks in Technology
See All in Technology
衝突して強くなる! BLUE GIANTと アジャイルチームの共通点とは ― いきいきと活気に満ちたグルーヴあるチームを作るコツ ― / BLUE GIANT and Agile Teams
naitosatoshi
0
280
なぜSaaSがMCPサーバーをサービス提供するのか?
sansantech
PRO
2
310
「魔法少女まどか☆マギカ Magia Exedra」での負荷試験の実践と学び
gree_tech
PRO
0
420
オブザーバビリティが広げる AIOps の世界 / The World of AIOps Expanded by Observability
aoto
PRO
0
190
攻撃と防御で実践するプロダクトセキュリティ演習~導入パート~
recruitengineers
PRO
3
1.7k
AWS環境のリソース調査を Claude Code で効率化 / aws investigate with cc devio2025
masahirokawahara
2
960
努力家なスクラムマスターが陥る「傍観者」という罠と乗り越えた先に信頼があった話 / 20250830 Takahiro Sasaki
shift_evolve
PRO
2
130
mruby(PicoRuby)で ファミコン音楽を奏でる
kishima
2
490
PRDの正しい使い方 ~AI時代にも効く思考・対話・成長ツールとして~
techtekt
PRO
0
220
シークレット管理だけじゃない!HashiCorp Vault でデータ暗号化をしよう / Beyond Secret Management! Let's Encrypt Data with HashiCorp Vault
nnstt1
2
130
ヒューリスティック評価を用いたゲームQA実践事例
gree_tech
PRO
0
410
AWSで推進するデータマネジメント
kawanago
0
720
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
830
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
A Modern Web Designer's Workflow
chriscoyier
696
190k
Balancing Empowerment & Direction
lara
3
600
Into the Great Unknown - MozCon
thekraken
40
2k
Designing Experiences People Love
moore
142
24k
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