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
BBc-1 と Ethereum 演習 II / BBc-1 and Ethereum Exe...
Search
Kenji Saito
PRO
September 28, 2022
Technology
0
110
BBc-1 と Ethereum 演習 II / BBc-1 and Ethereum Exercise II
2022年9月28日(水)、ブロックチェーンハブ主催のブロックチェーンアカデミーにて使用したスライドです。
Kenji Saito
PRO
September 28, 2022
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
スマートコントラクトデザイン / Smart Contract Design
ks91
PRO
0
6
FinTech 7-8 : Blockchain
ks91
PRO
0
70
スマートコントラクトプログラミング / Smart Contract Programming
ks91
PRO
0
19
AI が研究する時代に、人はどう育つのか? — GAMER PAT にみる "シリアスゲームとしての知的訓練" / In an era where AI conducts research, how will humans develop? — "Intellectual Training as a Serious Game" Seen in GAMER PAT
ks91
PRO
0
58
FinTech 5-6 : The World of Apps
ks91
PRO
0
110
生成AI による論文執筆サポート・ワークショップ ─ サーベイ/リサーチクエスチョン編 / Workshop on AI-Assisted Paper Writing Support: Survey/Research Question Edition
ks91
PRO
0
82
ブロックチェーン概論とインストール大会 / Introduction to Blockchain and Installation Workshop
ks91
PRO
0
11
FinTech 3-4 : Internet Technology and Governance
ks91
PRO
0
83
民主主義と博愛(Humanitarianism) / Democracy and Humanitarianism
ks91
PRO
0
19
Other Decks in Technology
See All in Technology
AWS DMS で SQL Server を移行してみた/aws-dms-sql-server-migration
emiki
0
260
戦えるAIエージェントの作り方
iwiwi
7
2.8k
東京大学「Agile-X」のFPGA AIデザインハッカソンを制したソニーのAI最適化
sony
0
160
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
160
QA業務を変える(!?)AIを併用した不具合分析の実践
ma2ri
0
160
猫でもわかるAmazon Q Developer CLI 解体新書
kentapapa
1
150
ざっくり学ぶ 『エンジニアリングリーダー 技術組織を育てるリーダーシップと セルフマネジメント』 / 50 minute Engineering Leader
iwashi86
6
3.4k
OPENLOGI Company Profile for engineer
hr01
1
46k
ストレージエンジニアの仕事と、近年の計算機について / 第58回 情報科学若手の会
pfn
PRO
4
900
AI時代、“平均値”ではいられない
uhyo
8
2.7k
JSConf JPのwebsiteをGatsbyからNext.jsに移行した話 - Next.jsの多言語静的サイトと課題
leko
2
190
Amazon Athena で JSON・Parquet・Iceberg のデータを検索し、性能を比較してみた
shigeruoda
1
230
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Designing Experiences People Love
moore
142
24k
Context Engineering - Making Every Token Count
addyosmani
8
310
Building an army of robots
kneath
306
46k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
620
Measuring & Analyzing Core Web Vitals
bluesmoon
9
640
Six Lessons from altMBA
skipperchong
29
4k
Unsuck your backbone
ammeep
671
58k
Visualization
eitanlees
150
16k
Into the Great Unknown - MozCon
thekraken
40
2.1k
Bash Introduction
62gerente
615
210k
Transcript
3 BBc-1 Ethereum II CSO /
[email protected]
— 3 BBc-1
Ethereum II — 2022-09-28 – p.1/37
https://speakerdeck.com/ks91 — 3 BBc-1 Ethereum II — 2022-09-28 – p.2/37
( ) SFC ( ) CSO (Chief Science Officer) 1993
( ) 2006 ( ) SFC 22 P2P (Peer-to-Peer) 2011 ( ) 2018 2019 VR 2021.7 VR 2021.8 “ALL THESE WORLDS ARE YOURS” VR 2021.9 & VR 2021.12 VR 2022.3 VR 2022.8 → ( ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.3/37
BBc-1 Ethereum 3 Ethereum — 3 BBc-1 Ethereum II —
2022-09-28 – p.4/37
1. : ERC-20 2. : 3. : — 3 BBc-1
Ethereum II — 2022-09-28 – p.5/37
1. : ERC-20 $ brownie bake token — 3 BBc-1
Ethereum II — 2022-09-28 – p.6/37
Solidity JavaScript ( , ) (constructor) ( ) ( )
Ether Ethereum — 3 BBc-1 Ethereum II — 2022-09-28 – p.7/37
pragma solidity ˆ0.6.0; /* 0.8.x */ contract Token { (
) : (EVM ) : constructor (...) public { /* */ : } function balanceOf(...) { /* ( ) */ : } : } constructor C (/* */ // ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.8/37
ERC-20 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 ERC-777 ( ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.9/37
ERC-20 ERC-20 ( ) ⇒ ERC-20 ( ERC-20 ) ERC-20
⇒ — 3 BBc-1 Ethereum II — 2022-09-28 – p.10/37
(fungible) ERC-20 → ERC-223 (draft) or ERC-777 ( )( )
(non-fungible) ERC-721 ( ) ERC-1155 ( ) ERC-3525 (SLOT ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.11/37
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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.12/37
Token ( ) event Transfer(address from, address to, uint256 value);
Token function emit Transfer() ( ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.13/37
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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.14/37
Token balanceOf() function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner]; } — 3 BBc-1 Ethereum II — 2022-09-28 – p.15/37
Token transfer() function transfer(address _to, uint256 _value) public returns (bool)
{ require(balances[msg.sender] >= _value, "Insufficient balance"); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } require (function ) ( ↑ ) OpenZeppelin https://openzeppelin.org — 3 BBc-1 Ethereum II — 2022-09-28 – p.16/37
2. — 3 BBc-1 Ethereum II — 2022-09-28 – p.17/37
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 ) Token Solidity 0.5 0.6 Solidity — 3 BBc-1 Ethereum II — 2022-09-28 – p.18/37
(m2 ) 1 1 — 3 BBc-1 Ethereum II —
2022-09-28 – p.19/37
IndivisibleAsset string public _name_; string public _symbol_; uint256 public _quantity_;
address public _owner_; _name_ ( ) _symbol_ _quantity_ (m2 ) _owner_ ‘_’ Solidity . . . — 3 BBc-1 Ethereum II — 2022-09-28 – p.20/37
IndivisibleAsset event Transfer(address indexed from, address indexed to); from to
indexed — 3 BBc-1 Ethereum II — 2022-09-28 – p.21/37
IndivisibleAsset constructor (string name, string symbol, uint256 quantity) public {
_name_ = name; _symbol_ = symbol; _quantity_ = quantity; _owner_ = msg.sender; } — 3 BBc-1 Ethereum II — 2022-09-28 – p.22/37
IndivisibleAsset getOwner() function getOwner() public view returns (address) { return
(_owner_); } — 3 BBc-1 Ethereum II — 2022-09-28 – p.23/37
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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.24/37
scripts/indivisible asset.py from brownie import * def main(): accounts[0].deploy(IndivisibleAsset, "5322
Endo, Fujisawa", "mˆ2", 300) SFC (300m2 ) ( ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.25/37
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] — 3 BBc-1 Ethereum II — 2022-09-28 – p.26/37
$ pytest tests/test_indivisible_asset.py — 3 BBc-1 Ethereum II — 2022-09-28
– p.27/37
3. — 3 BBc-1 Ethereum II — 2022-09-28 – p.28/37
transfer settle, retrieve asset, retrieve token 3 — 3 BBc-1
Ethereum II — 2022-09-28 – p.29/37
1. ( ) 2. ( ) 3. ( ) —
3 BBc-1 Ethereum II — 2022-09-28 – p.30/37
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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.31/37
(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") — 3 BBc-1 Ethereum II — 2022-09-28 – p.32/37
(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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.33/37
(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] ( ) — 3 BBc-1 Ethereum II — 2022-09-28 – p.34/37
(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 — 3 BBc-1 Ethereum II — 2022-09-28 – p.35/37
$ pytest tests/test_one_time_escrow.py : settle() — 3 BBc-1 Ethereum II
— 2022-09-28 – p.36/37
4 BBc-1 Ethereum III (1): NFT (2): DAO — 3
BBc-1 Ethereum II — 2022-09-28 – p.37/37