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
FinTech 7-8 : Blockchain
ks91
PRO
0
64
スマートコントラクトプログラミング / Smart Contract Programming
ks91
PRO
0
12
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
38
FinTech 5-6 : The World of Apps
ks91
PRO
0
100
生成AI による論文執筆サポート・ワークショップ ─ サーベイ/リサーチクエスチョン編 / Workshop on AI-Assisted Paper Writing Support: Survey/Research Question Edition
ks91
PRO
0
71
ブロックチェーン概論とインストール大会 / Introduction to Blockchain and Installation Workshop
ks91
PRO
0
4
FinTech 3-4 : Internet Technology and Governance
ks91
PRO
0
81
民主主義と博愛(Humanitarianism) / Democracy and Humanitarianism
ks91
PRO
0
8
ブロックチェーン概論 / Introduction to Blockchain
ks91
PRO
0
12
Other Decks in Technology
See All in Technology
QA業務を変える(!?)AIを併用した不具合分析の実践
ma2ri
0
140
20251027_findyさん_音声エージェントLT
almondo_event
0
310
AWS UG Grantでグローバル20名に選出されてre:Inventに行く話と、マルチクラウドセキュリティの教科書を執筆した話 / The Story of Being Selected for the AWS UG Grant to Attending re:Invent, and Writing a Multi-Cloud Security Textbook
yuj1osm
1
130
Observability — Extending Into Incident Response
nari_ex
1
230
現場の壁を乗り越えて、 「計装注入」が拓く オブザーバビリティ / Beyond the Field Barriers: Instrumentation Injection and the Future of Observability
aoto
PRO
1
350
クラウドとリアルの融合により、製造業はどう変わるのか?〜クラスメソッドの製造業への取組と共に〜
hamadakoji
0
410
AIエージェント入門 〜基礎からMCP・A2Aまで〜
shukob
1
170
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
200
NLPコロキウム20251022_超効率化への挑戦: LLM 1bit量子化のロードマップ
yumaichikawa
2
430
もう外には出ない。より快適なフルリモート環境を目指して
mottyzzz
13
10k
SRE × マネジメントレイヤーが挑戦した組織・会社のオブザーバビリティ改革 ― ビジネス価値と信頼性を両立するリアルな挑戦
coconala_engineer
0
160
Dylib Hijacking on macOS: Dead or Alive?
patrickwardle
0
460
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
Typedesign – Prime Four
hannesfritz
42
2.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Optimizing for Happiness
mojombo
379
70k
Done Done
chrislema
185
16k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
Git: the NoSQL Database
bkeepers
PRO
431
66k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
The Language of Interfaces
destraynor
162
25k
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