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
サービスデザインプロジェクトB 第3回「スマートコントラクトプログラミング」 / Smart ...
Search
Kenji Saito
PRO
October 26, 2020
Technology
1
99
サービスデザインプロジェクトB 第3回「スマートコントラクトプログラミング」 / Smart Contract Programming
2020年10月26日、慶應義塾大学大学院メディアデザイン研究科の「サービスデザインプロジェクトB (2020 秋)」第3回にて使用したスライドです。
Kenji Saito
PRO
October 26, 2020
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
22
自然言語の扱いと翻訳のためのプロンプト / Natural Language Handling and Prompts for Translation
ks91
PRO
0
11
研究って何だっけ / What is Research?
ks91
PRO
0
22
ブロックチェーンと分散ファイナンス概論 / Introduction to Blockchain and Decentralized Finance
ks91
PRO
0
12
大規模言語モデルの原理と使いこなしの原則 / Principles of Large Language Models and Their Use
ks91
PRO
0
16
講師研究紹介 / Research Introduction of the Lecturer
ks91
PRO
0
34
本授業におけるチャットボットの使い方 / How to Use Chatbots in This Class
ks91
PRO
0
42
LLM とプロンプトエンジニアリング/チューターをビルドする / LLM, Prompt Engineering and Building Tutors
ks91
PRO
1
210
講師自己紹介 / Self-Introduction of the Lecturer
ks91
PRO
0
43
Other Decks in Technology
See All in Technology
SREが実現する開発者体験の革新
sansantech
PRO
0
200
ElixirがHW化され、最新CPU/GPU/NWを過去のものとする数万倍、高速+超省電力化されたWeb/動画配信/AIが動く日
piacerex
0
110
AWSのマルチアカウント管理 ベストプラクティス最新版 2025 / Multi-Account management on AWS best practice 2025
ohmura
4
210
Cursor AgentによるパーソナルAIアシスタント育成入門―業務のプロンプト化・MCPの活用
os1ma
9
3.2k
Ops-JAWS_Organizations小ネタ3選.pdf
chunkof
2
120
Classmethod AI Talks(CATs) #20 司会進行スライド(2025.04.10) / classmethod-ai-talks-aka-cats_moderator-slides_vol20_2025-04-10
shinyaa31
0
130
食べログが挑む!飲食店ネット予約システムで自動テスト無双して手動テストゼロを実現する戦略
hagevvashi
1
160
アジャイル脅威モデリング#1(脅威モデリングナイト#8)
masakane55
3
160
開発視点でAWS Signerを考えてみよう!! ~コード署名のその先へ~
masakiokuda
3
140
いつも初心者向けの記事に助けられているので得意分野では初心者向けの記事を書きます
toru_kubota
2
270
Webアプリを Lambdaで動かすまでに考えること / How to implement monolithic Lambda Web Application
_kensh
7
1.2k
【2025年度新卒技術研修】100分で学ぶ サイバーエージェントのデータベース 活用事例とMySQLパフォーマンス調査
cyberagentdevelopers
PRO
4
6.5k
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.4k
GraphQLの誤解/rethinking-graphql
sonatard
71
10k
Scaling GitHub
holman
459
140k
What's in a price? How to price your products and services
michaelherold
245
12k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
The Cult of Friendly URLs
andyhume
78
6.3k
GitHub's CSS Performance
jonrohan
1030
460k
Typedesign – Prime Four
hannesfritz
41
2.6k
BBQ
matthewcrist
88
9.6k
How to Think Like a Performance Engineer
csswizardry
23
1.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
Designing for humans not robots
tammielis
252
25k
Transcript
B 2020 3 ( ) B 2020 — 3 —
2020-10-26 – p.1/62
https://speakerdeck.com/ks91 Discord Discord ( / / ) Zoom URL (
) B 2020 — 3 — 2020-10-26 – p.2/62
( ) 1 10 12 • 2 10 19 •
3 10 26 • 4 11 2 5 11 9 1 6 11 16 2 7 11 30 8 12 7 B 2020 — 3 — 2020-10-26 – p.3/62
– : Ethereum – ( ) Ethereum (1) : ERC20
(2) : (3) : B 2020 — 3 — 2020-10-26 – p.4/62
– : Ethereum macOS (Catalina 10.15.7) + Homebrew Homebrew Linux
(Ubuntu 18.04) Windows 10 + Windows Subsystem for Linux (Ubuntu 18.04 ) WSL Ethereum solidity brownie B 2020 — 3 — 2020-10-26 – p.5/62
Solidity Ethereum http://solidity.readthedocs.io/en/latest/installing-solidity.html Linux (on Windows) “sudo apt”, macOS “brew”
solc 0.7.3 (10/10 ) $ solc --version brownie py-solc-x solc (dependencies) ( solc py-solc-x ) B 2020 — 3 — 2020-10-26 – p.6/62
Python3 macOS $ brew install python3 Linux $ sudo add-apt-repository
ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python3.8 python3.8-dev python3.8-venv python3.8-tk 16.10 python3(.8) apt B 2020 — 3 — 2020-10-26 – p.7/62
macOS : . . . macOS wget brew dyld: Library
not loaded: /usr/local/opt/gettext/lib/libintl.8.dylib $ brew uninstall --force gettext $ brew install gettext B 2020 — 3 — 2020-10-26 – p.8/62
Python (venv) macOS ‘python3.8’ ‘python3’ $ python3.8 -m venv bbc1env
$ source bbc1env/bin/activate (bbc1env) $ pip install -U pip (bbc1env) $ pip install wheel bbc1env ( BBc-1 ) ( ) (bbc1env) $ deactivate B 2020 — 3 — 2020-10-26 – p.9/62
Ganache CLI Ethereum RPC CLI : Command Line Interface npm
( ) macOS https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09 Linux https://qiita.com/seibe/items/36cef7df85fe2cefa3ea npm Ganache CLI $ sudo npm install -g ganache-cli B 2020 — 3 — 2020-10-26 – p.10/62
Brownie Python Ethereum https://eth-brownie.readthedocs.io Brownie $ pip install eth-brownie version
1.11.8 (10/10 ) B 2020 — 3 — 2020-10-26 – p.11/62
$ brownie init ( ERC-20 ) $ brownie bake token
$ cd token ( ) $ brownie compile ( ) $ pytest tests B 2020 — 3 — 2020-10-26 – p.12/62
Brownie $ brownie console Python >>> len(accounts) 10 >>> accounts[0].balance()
100000000000000000000 >>> quit() B 2020 — 3 — 2020-10-26 – p.13/62
– ( ) Ethereum ropsten B 2020 — 3 —
2020-10-26 – p.14/62
infura.io Brownie https://infura.io SIGN UP PROJECT ID infura Ethereum API
infura . . . infura.io PROJECT ID WEB3_INFURA_PROJECT_ID PROJECT ID (∼/.bash_profile ) $ export WEB3_INFURA_PROJECT_ID= PROJECT ID B 2020 — 3 — 2020-10-26 – p.15/62
ropsten ETH brownie console ropsten >>> network.disconnect() >>> network.connect(’ropsten’) >>>
len(accounts) 0 >>> accounts.add() <LocalAccount object ’ 16 ’> >>> accounts[0].private_key 16 >>> quit() Ropsten Testnet ETH Faucet 5.0ETH https://faucet.dimensions.network/ ( ) https://metamask.io/ B 2020 — 3 — 2020-10-26 – p.16/62
ropsten ETH brownie console ropsten ETH >>> network.disconnect() >>> network.connect(’ropsten’)
>>> len(accounts) 0 >>> accounts.add( 16 ) <LocalAccount object ’ 16 ’> >>> accounts[0].balace() ETH >>> quit() ETH >>> accounts[0].transfer(accounts[1], "1 ether") B 2020 — 3 — 2020-10-26 – p.17/62
Ethereum B 2020 — 3 — 2020-10-26 – p.18/62
Ethereum Vitalik Buterin, “Ethereum White Paper: A NEXT GENERATION SMART
CONTRACT & DECENTRALIZED APPLICATION PLATFORM” 15 (= ) = ⇒ → Dapps ( / / ) B 2020 — 3 — 2020-10-26 – p.19/62
B 2020 — 3 — 2020-10-26 – p.20/62
. . . B 2020 — 3 — 2020-10-26 –
p.21/62
vs. B 2020 — 3 — 2020-10-26 – p.22/62
= run B 2020 — 3 — 2020-10-26 – p.23/62
Ether Ethereum EOA : Externally-Owned Account ( ) Ether EVM
EVM B 2020 — 3 — 2020-10-26 – p.24/62
EVM : Ethereum Virtual Machine (validator) ⇒ Gas B 2020
— 3 — 2020-10-26 – p.25/62
EVM : : ← : Solidity — JavaScript LLL —
Lisp Vyper — Python Fe — Vyper Rust ← NEW! Solidity Vyper Python B 2020 — 3 — 2020-10-26 – p.26/62
Solidity ( ) pragma solidityˆ0.5.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 2020 — 3 — 2020-10-26 – p.27/62
Ethereum B 2020 — 3 — 2020-10-26 – p.28/62
(1) : ERC20 $ brownie bake token B 2020 —
3 — 2020-10-26 – p.29/62
Solidity JavaScript ( , ) (constructor) ( ) ( )
Ether Ethereum B 2020 — 3 — 2020-10-26 – p.30/62
pragma solidity ˆ0.5.0; contract Token { ( ) : (EVM
) : constructor (...) public { /* */ : } function balanceOf(...) { /* ( ) */ : } : } constructor C (/* */ // ) B 2020 — 3 — 2020-10-26 – p.31/62
ERC20 ERC (Ethereum Request for Comment) 20 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md 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 ERC223 ( ), ERC721 (Non-Fungible) B 2020 — 3 — 2020-10-26 – p.32/62
ERC20 ERC20 ( ) ⇒ ERC20 ( ERC20 ) ERC20
⇒ B 2020 — 3 — 2020-10-26 – p.33/62
(fungible) ERC20 → ERC223 (draft) or ERC777 (non-fungible) ERC721 (
) (partially fungible) ERC1410 (draft) (ERC1400 ) B 2020 — 3 — 2020-10-26 – p.34/62
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 2020 — 3 — 2020-10-26 – p.35/62
Token ( ) event Transfer(address from, address to, uint256 value);
Token function emit Transfer() ( ) B 2020 — 3 — 2020-10-26 – p.36/62
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 2020 — 3 — 2020-10-26 – p.37/62
Token balanceOf() function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner]; } B 2020 — 3 — 2020-10-26 – p.38/62
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 2020 — 3 — 2020-10-26 – p.39/62
(2) : B 2020 — 3 — 2020-10-26 – p.40/62
GitHub git clone $ git clone https://github.com/ks91/sample-smart-contracts.git sample-smart-contracts contracts, scripts
tests token Token B 2020 — 3 — 2020-10-26 – p.41/62
(m2 ) 1 1 B 2020 — 3 — 2020-10-26
– p.42/62
IndivisibleAsset string public _name_; string public _symbol_; uint256 public _quantity_;
address public _owner_; _name_ ( ) _symbol_ _quantity_ (m2 ) _owner_ ‘_’ Solidity . . . B 2020 — 3 — 2020-10-26 – p.43/62
IndivisibleAsset event Transfer(address indexed from, address indexed to); from to
indexed B 2020 — 3 — 2020-10-26 – p.44/62
IndivisibleAsset constructor (string name, string symbol, uint256 quantity) public {
_name_ = name; _symbol_ = symbol; _quantity_ = quantity; _owner_ = msg.sender; } B 2020 — 3 — 2020-10-26 – p.45/62
IndivisibleAsset getOwner() function getOwner() public view returns (address) { return
(_owner_); } B 2020 — 3 — 2020-10-26 – p.46/62
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 token Solidity 0.6.0 0.5.0 token B 2020 — 3 — 2020-10-26 – p.47/62
scripts/indivisible asset.py from brownie import * def main(): accounts[0].deploy(IndivisibleAsset, "5322
Endo, Fujisawa", "mˆ2", 300) SFC (300m2 ) ( ) B 2020 — 3 — 2020-10-26 – p.48/62
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 2020 — 3 — 2020-10-26 – p.49/62
$ pytest tests/test_indivisible_asset.py B 2020 — 3 — 2020-10-26 –
p.50/62
(3) : B 2020 — 3 — 2020-10-26 – p.51/62
transfer settle, retrieve asset, retrieve token 3 B 2020 —
3 — 2020-10-26 – p.52/62
1. ( ) 2. ( ) 3. ( ) B
2020 — 3 — 2020-10-26 – p.53/62
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 2020 — 3 — 2020-10-26 – p.54/62
(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 2020 — 3 — 2020-10-26 – p.55/62
(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 2020 — 3 — 2020-10-26 – p.56/62
(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 2020 — 3 — 2020-10-26 – p.57/62
(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 2020 — 3 — 2020-10-26 – p.58/62
$ pytest tests/test_one_time_escrow.py : settle() ⇒ Discord B 2020 —
3 — 2020-10-26 – p.59/62
B 2020 — 3 — 2020-10-26 – p.60/62
1. (1) (2) Ethereum 1 2 2020 10 31 (
) 23:59 JST B 2020 — 3 — 2020-10-26 – p.61/62
B 2020 — 3 — 2020-10-26 – p.62/62