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
スマートコントラクトを理解する 〜解説と実演〜 / Understanding Smart C...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kenji Saito
PRO
June 07, 2017
Technology
0
840
スマートコントラクトを理解する 〜解説と実演〜 / Understanding Smart Contracts
2017年6月7日(水)、Interop Tokyo 2017 の同名のセッションにて私用したスライドです。
Kenji Saito
PRO
June 07, 2017
Tweet
Share
More Decks by Kenji Saito
See All by Kenji Saito
AI 前提社会におけるトラスト / Trust in an AI-Driven Society
ks91
PRO
0
11
非営利組織の起業/発表と総括 / Starting up a Nonprofit Organization, Presentation and Summary
ks91
PRO
0
56
自己開発 / Self-Development
ks91
PRO
1
19
あなたは何によって憶えられたいですか? / What Do You Want to be Remembered for?
ks91
PRO
0
24
ボランティアと理事会 / Volunteers and Board of Directors
ks91
PRO
0
42
メタ・ネイチャーポジティブへの道 / The Path to Meta Nature Positive
ks91
PRO
0
34
アカデミーキャンプ2026 初春「ミライ、ゲーミファイ」DAY 3 / Academy Camp 2026 Early Spring "GAMIFY THE FUTURE!!" DAY 3
ks91
PRO
0
50
アカデミーキャンプ2026 初春「ミライ、ゲーミファイ」DAY 2 / Academy Camp 2026 Early Spring "GAMIFY THE FUTURE!!" DAY 2
ks91
PRO
0
86
アカデミーキャンプ2026 初春「ミライ、ゲーミファイ」DAY 1 / Academy Camp 2026 Early Spring "GAMIFY THE FUTURE!!" DAY 1
ks91
PRO
0
83
Other Decks in Technology
See All in Technology
Greatest Disaster Hits in Web Performance
guaca
0
200
仕様書駆動AI開発の実践: Issue→Skill→PRテンプレで 再現性を作る
knishioka
2
630
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
68k
AI駆動PjMの理想像 と現在地 -実践例を添えて-
masahiro_okamura
1
110
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
180
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
130
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.3k
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
590
プロポーザルに込める段取り八分
shoheimitani
1
200
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
We Built for Predictability; The Workloads Didn’t Care
stahnma
0
140
Azure Durable Functions で作った NL2SQL Agent の精度向上に取り組んだ話/jat08
thara0402
0
170
Featured
See All Featured
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
440
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Context Engineering - Making Every Token Count
addyosmani
9
650
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
200
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
250
Believing is Seeing
oripsolob
1
54
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
320
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
430
Transcript
∼ ( 2 ) ∼ SFC
[email protected]
— — 2017-06-07
– p.1/70
( ) SFC ( ) CSO (Chief Science Officer) 1993
M.Eng ( ) 2006 ( ) SFC 16 P2P 2011 → ( ) — — 2017-06-07 – p.2/70
1. 2. 3. 4. 5. : 6. — — 2017-06-07
– p.3/70
1. — — 2017-06-07 – p.4/70
Vitalik Buterin, “Ethereum White Paper: A NEXT GENERATION SMART CONTRACT
& DECENTRALIZED APPLICATION PLATFORM” 15 — — 2017-06-07 – p.5/70
— — 2017-06-07 – p.6/70
. . . — — 2017-06-07 – p.7/70
vs. — — 2017-06-07 – p.8/70
= run — — 2017-06-07 – p.9/70
Ether Ethereum EOA : Externally-Owned Account Ether EVM EVM —
— 2017-06-07 – p.10/70
EVM : Ethereum Virtual Machine Gas — — 2017-06-07 –
p.11/70
EVM : : Solidity — JavaScript LLL — Lisp —
— 2017-06-07 – p.12/70
Solidity contract metaCoin { mapping (address => uint) balances; function
metaCoin() { balances[msg.sender] = 10000; } function sendCoin(address receiver, uint amount) returns(bool sufficient) { if (balances[msg.sender] < amount) return false; balances[msg.sender] -= amount; balances[receiver] += amount; return true; } } by hshimo — — 2017-06-07 – p.13/70
— — 2017-06-07 – p.14/70
2. — — 2017-06-07 – p.15/70
ADEPT ADEPT : IBM IoT — — 2017-06-07 – p.16/70
— — 2017-06-07 – p.17/70
⇒ — — 2017-06-07 – p.18/70
The DAO ( ) The DAO Split ( ) 360
ETH (50∼60 ) (2016/6/17) ( ) ( ; ) (2016/7/20 ) — — 2017-06-07 – p.19/70
3. — — 2017-06-07 – p.20/70
3-1. Hyperledger Fabric (IBM) IBM Digital Asset Holdings http://hyperledger-fabric.readthedocs.io/en/latest/ —
— 2017-06-07 – p.21/70
(Docker) (chaincode) PBFT (Practical BFT) RocksDB CA PKI v1.0 DB
CA — — 2017-06-07 – p.22/70
3-2. Hyperledger Iroha ( ) https://github.com/hyperledger/iroha — — 2017-06-07 –
p.23/70
JVM (chaincode) Sumeragi (BFT) — — 2017-06-07 – p.24/70
3-3. Corda (R3) R3 https://github.com/corda/corda — — 2017-06-07 – p.25/70
JVM ( ) (Uniqueness Services) UTXO X.509 PKI ( )
Corda — — 2017-06-07 – p.26/70
4. Mac OS X (Yosemite 10.10.5) + Homebrew Linux (Ubuntu
16.04) Windows 10 + Bash on Ubuntu on Windows geth, solidity populus — — 2017-06-07 – p.27/70
geth GO https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum #installation-instructions geth 1.6.1-stable (5/16 ) $ geth
-help — — 2017-06-07 – p.28/70
Solidity http://solidity.readthedocs.io/en/latest/installing-solidity.html solc 0.4.11 (5/16 ) $ solc --version —
— 2017-06-07 – p.29/70
Python pip macOS http://qiita.com/oct_itmt/items/2d066801a7464a676994 (pyenv ) Ubuntu 16.04 — —
2017-06-07 – p.30/70
Populus Python http://populus.readthedocs.io/en/latest/quickstart.html Open SSL Populus $ pip install populus
version 1.6.9 (5/16 ) — — 2017-06-07 – p.31/70
$ populus init contracts/Greeter.sol tests/test_greeter.py $ populus compile $ py.test
tests/ — — 2017-06-07 – p.32/70
5. ( ) — — 2017-06-07 – p.33/70
— — 2017-06-07 – p.34/70
( ) / / — — 2017-06-07 – p.35/70
BcH-smart-contract-programming.zip contracts tests — — 2017-06-07 – p.36/70
Solidity JavaScript ( , ) (constructor) ( ) ( )
Ether — — 2017-06-07 – p.37/70
pragma solidity ˆ0.4.8; contract MyToken { ( ) : (EVM
) : function MyToken(...) { /* */ : } : } function C (/* */ // ) — — 2017-06-07 – p.38/70
MyToken string public name; string public symbol; uint8 public decimals;
mapping (address => uint256) public balanceOf; name, symbol decimals : 2 100 1.00 mapping balanceOf — — 2017-06-07 – p.39/70
MyToken event Transfer(address indexed from, address indexed to, uint256 value);
indexed (3 ) MyToken function Transfer() Ethereum-Wallet — — 2017-06-07 – p.40/70
MyToken function MyToken(uint256 _supply, string _name, string _symbol, uint8 _decimals)
{ if (_supply == 0) { _supply = 1000000; /* _supply 1,000,000 */ } balanceOf[msg.sender] = _supply; name = _name; symbol = _symbol; decimals = _decimals; } msg.sender _supply C++ _ — — 2017-06-07 – p.41/70
MyToken getBalanceOf() function getBalanceOf(address _addr) returns (uint256 balance) { return
(balanceOf[_addr]); } — — 2017-06-07 – p.42/70
MyToken transfer() function transfer(address _to, uint256 _value) { if (balanceOf[msg.sender]
< _value) { /* */ throw; } if (balanceOf[_to] + _value < balanceOf[_to]) { /* */ throw; } balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; Transfer(msg.sender, _to, _value); } throw (function ) catch — — 2017-06-07 – p.43/70
(1) import pytest @pytest.fixture() def token_contract(chain): TokenFactory = chain.get_contract_factory(’MyToken’) deploy_txid
= TokenFactory.deploy(args=[ 0, "BcH Coin", "BcH", 0, ]) contract_address = chain.wait.for_contract_address(deploy_txid) return TokenFactory(address=contract_address) populus — — 2017-06-07 – p.44/70
(2) def test_my_token(token_contract, chain): account0 = chain.web3.eth.accounts[0] account1 = chain.web3.eth.accounts[1]
assert token_contract.call().getBalanceOf(account0) == 1000000 assert token_contract.call().getBalanceOf(account1) == 0 txid = token_contract.transact().transfer(account1, 10) chain.wait.for_receipt(txid) assert token_contract.call().getBalanceOf(account0) == 999990 assert token_contract.call().getBalanceOf(account1) == 10 account0 coinbase account1 account0 account1 10BcH — — 2017-06-07 – p.45/70
$ py.test tests/test_my_token.py — — 2017-06-07 – p.46/70
— — 2017-06-07 – p.47/70
(m2 ) 1 1 — — 2017-06-07 – p.48/70
IndivisibleAsset string public _name; string public _symbol; uint256 public _quantity;
address public _owner; _name ( ) _symbol _quantity (m2 ) _owner _ Solidity . . . — — 2017-06-07 – p.49/70
IndivisibleAsset event Transfer(address indexed from, address indexed to); from to
— — 2017-06-07 – p.50/70
IndivisibleAsset function IndivisibleAsset(string name, string symbol, uint256 quantity) { _name
= name; _symbol = symbol; _quantity = quantity; _owner = msg.sender; } — — 2017-06-07 – p.51/70
IndivisibleAsset getOwner() function getOwner() returns (address owner) { return (_owner);
} — — 2017-06-07 – p.52/70
IndivisibleAsset transfer() function transfer(address to) { if (_owner != msg.sender)
{ throw; } _owner = to; Transfer(msg.sender, to); } — — 2017-06-07 – p.53/70
(1) import pytest @pytest.fixture() def asset_contract(chain): AssetFactory = chain.get_contract_factory(’IndivisibleAsset’) deploy_txid
= AssetFactory.deploy(args=[ "5322 Endo, Fujisawa", "mˆ2", 300, ]) contract_address = chain.wait.for_contract_address(deploy_txid) return AssetFactory(address=contract_address) SFC (300m2 ) — — 2017-06-07 – p.54/70
(2) def test_indivisible_assset(asset_contract, chain): account0 = chain.web3.eth.accounts[0] account1 = chain.web3.eth.accounts[1]
assert asset_contract.call().getOwner() == account0 txid = asset_contract.transact().transfer(account1) chain.wait.for_receipt(txid) assert asset_contract.call().getOwner() == account1 account0 account1 — — 2017-06-07 – p.55/70
$ py.test tests/test_indivisible_asset.py — — 2017-06-07 – p.56/70
— — 2017-06-07 – p.57/70
transfer settle, retrieve asset, retrieve token 3 — — 2017-06-07
– p.58/70
1. ( ) 2. ( ) 3. ( ) —
— 2017-06-07 – p.59/70
OneTimeEscrow settle() function settle() { address addr = this; /*
this */ if (_token.getBalanceOf(this) < _price || _asset.getOwner() != addr) { throw; } _token.transfer(_seller , _price); _asset.transfer(_buyer); Settled(); /* */ } settle() transfer — — 2017-06-07 – p.60/70
(1) import pytest @pytest.fixture() def token_contract(chain): . . . @pytest.fixture()
def asset_contract(chain): . . . — — 2017-06-07 – p.61/70
(2) def test_one_time_escrow(token_contract, asset_contract, chain): account0 = chain.web3.eth.accounts[0] account1 =
chain.web3.eth.accounts[1] txid = chain.web3.eth.sendTransaction({ ’from’: account0, ’to’: account1, ’value’: chain.web3.toWei(1, "ether") }) chain.wait.for_receipt(txid) txid = token_contract.transact().transfer(account1, 300) chain.wait.for_receipt(txid) account0 account1 1Ether 300BcH 300BcH TX — — 2017-06-07 – p.62/70
(3) EscrowFactory = chain.get_contract_factory(’OneTimeEscrow’) txid = EscrowFactory.deploy(args=[ token_contract.address, account1, asset_contract.address,
account0, 300, ]) contract_address = chain.wait.for_contract_address(txid) EscrowFactory.address = contract_address; account1 account0 300BcH — — 2017-06-07 – p.63/70
(4) txid = token_contract.transact({ ’from’: account1 }).transfer(contract_address, 300) chain.wait.for_receipt(txid) txid
= asset_contract.transact().transfer(contract_address) chain.wait.for_receipt(txid) assert token_contract.call().getBalanceOf(account0) == 999700 assert token_contract.call().getBalanceOf(account1) == 0 assert token_contract.call().getBalanceOf(contract_address) == 300 assert asset_contract.call().getOwner() == contract_address account1 300BcH account0 — — 2017-06-07 – p.64/70
(5) txid = EscrowFactory.transact().settle(); chain.wait.for_receipt(txid) assert token_contract.call().getBalanceOf(account0) == 1000000 assert
token_contract.call().getBalanceOf(account1) == 0 assert token_contract.call().getBalanceOf(contract_address) == 0 assert asset_contract.call().getOwner() == account1 settle() — — 2017-06-07 – p.65/70
$ py.test tests/test_one_time_escrow.py : settle() — — 2017-06-07 – p.66/70
6. — — 2017-06-07 – p.67/70
( ) (by ) (since 1984) ( ) ( )
. . . ( ) — — 2017-06-07 – p.68/70
( ) ( ) ( ) ( ) (by )
— — 2017-06-07 – p.69/70
— — 2017-06-07 – p.70/70