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
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
発表と総括 / Presentations and Summary
ks91
PRO
0
6
サイバーフィジカル社会、金融の未来とアイデアソン / Cyber Physical Society, Future of Finance, and Ideathon
ks91
PRO
0
53
マニフェスト: 人類の知のフロンティアに向けた拡張的足場へ / Manifesto: Toward Expansive Scaffolding for Humanity's Knowledge Frontier
ks91
PRO
0
11
続・スマートコントラクトと分散ファイナンス / Smart Contracts and Decentralized Finance, Continued
ks91
PRO
0
50
スマートコントラクトと分散ファイナンス / Smart Contracts and Decentralized Finance
ks91
PRO
0
64
シン・ブロックチェーン / Truth of Blockchain
ks91
PRO
0
98
パスワード/パスフレーズと認証 / Password, Passphrase and Authentication
ks91
PRO
0
37
git と GitHub / git and GitHub
ks91
PRO
0
36
ソフトウェアの開発と保守 / Software Development and Maintenance
ks91
PRO
0
51
Other Decks in Technology
See All in Technology
shake-upを科学する
rsakata
7
1k
microCMSではじめるAIライティング
himaratsu
0
150
無理しない AI 活用サービス / #jazug
koudaiii
0
100
Delegating the chores of authenticating users to Keycloak
ahus1
0
190
全部AI、全員Cursor、ドキュメント駆動開発 〜DevinやGeminiも添えて〜
rinchsan
10
5.1k
LLM拡張解体新書/llm-extension-deep-dive
oracle4engineer
PRO
23
6.2k
対話型音声AIアプリケーションの信頼性向上の取り組み
ivry_presentationmaterials
3
1k
ビジネス職が分析も担う事業部制組織でのデータ活用の仕組みづくり / Enabling Data Analytics in Business-Led Divisional Organizations
zaimy
1
390
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.7k
CDK Vibe Coding Fes
tomoki10
1
630
大量配信システムにおけるSLOの実践:「見えない」信頼性をSLOで可視化
plaidtech
PRO
0
390
“日本一のM&A企業”を支える、少人数SREの効率化戦略 / SRE NEXT 2025
genda
1
270
Featured
See All Featured
Optimizing for Happiness
mojombo
379
70k
Docker and Python
trallard
45
3.5k
For a Future-Friendly Web
brad_frost
179
9.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
Six Lessons from altMBA
skipperchong
28
3.9k
Building Adaptive Systems
keathley
43
2.7k
The Language of Interfaces
destraynor
158
25k
Become a Pro
speakerdeck
PRO
29
5.4k
Designing Experiences People Love
moore
142
24k
Code Reviewing Like a Champion
maltzj
524
40k
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