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
27
スマートコントラクトデザイン / Smart Contract Design
慶應義塾大学大学院メディアデザイン研究科「サービスデザインプロジェクトB」2024秋 第4回にて使用したスライドです。
Kenji Saito
PRO
October 27, 2024
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
グリーンマイニングが Bitcoin プロトコルに及ぼす影響 / Impact of Green Mining on the Bitcoin Protocol
ks91
PRO
0
17
FinTech 13-14 : Ideathon, Presentations and Conclusions
ks91
PRO
0
22
デザイン相談会 / Design Consultation
ks91
PRO
0
13
FinTech 11-12 : Cyber-Physical Society and Future of Finance
ks91
PRO
0
49
メタ自然選択と製品トレーサビリティー / Meta-Natural Selection and Product Traceability
ks91
PRO
0
8
伝統的金融に呑まれる分散型金融 / Decentralised Finance Engulfed by Traditional Finance
ks91
PRO
0
15
ウェブサービスデザイン 2 / Web Service Design 2
ks91
PRO
0
24
生成AI による論文執筆サポートの手引き(ワークショップ) / A guide to supporting dissertation writing with generative AI (workshop)
ks91
PRO
0
250
FinTech 9-10: Smart Contracts and Decentralized Finance
ks91
PRO
0
62
Other Decks in Technology
See All in Technology
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
EventHub Startup CTO of the year 2024 ピッチ資料
eventhub
0
110
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
OCI Security サービス 概要
oracle4engineer
PRO
0
6.5k
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
370
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
120
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
190
信頼性に挑む中で拡張できる・得られる1人のスキルセットとは?
ken5scal
2
530
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
100
マルチプロダクトな開発組織で 「開発生産性」に向き合うために試みたこと / Improving Multi-Product Dev Productivity
sugamasao
1
300
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Done Done
chrislema
181
16k
Code Reviewing Like a Champion
maltzj
520
39k
Faster Mobile Websites
deanohume
305
30k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
Speed Design
sergeychernyshev
24
610
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Designing Experiences People Love
moore
138
23k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Embracing the Ebb and Flow
colly
84
4.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
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