Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
スマートコントラクトを理解する 〜解説と実演〜 / Understanding Smart C...
Search
Kenji Saito
PRO
June 07, 2017
Technology
860
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
スマートコントラクトを理解する 〜解説と実演〜 / Understanding Smart Contracts
2017年6月7日(水)、Interop Tokyo 2017 の同名のセッションにて私用したスライドです。
Kenji Saito
PRO
June 07, 2017
More Decks by Kenji Saito
See All by Kenji Saito
Fall 2026: A Guide & Workshop on Using AI for Academic Paper Writing
ks91
PRO
0
35
FinTech 5-6 : The World of Apps
ks91
PRO
0
54
終わらない幼年期とそのための下部構造・社会資本 / The Never-Ending Childhood and the Infrastructure and Social Capital Needed to Support It
ks91
PRO
0
29
FinTech 3-4 : Internet Technology and Governance
ks91
PRO
0
72
2026 秋 生成AI を活用した論文執筆ガイド/ワークショップ / Fall 2026: Guide and Workshop on Writing Papers Using Generative AI
ks91
PRO
0
140
AIとビジネス・メガトレンド 〜 サイバネティクス的経営観 / AI and Business Megatrends: A Cybernetic Perspective on Management
ks91
PRO
0
43
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
160
アカデミーキャンプ 2026秋「位置ゲーに秀でよ!ウチらとヤツらのゲーム・デザイン」DAY 4 / Academy Camp 2026 Fall - Excel at Location-Based Games! Our and Their Game Design DAY 4
ks91
PRO
0
65
アカデミーキャンプ 2026秋「位置ゲーに秀でよ!ウチらとヤツらのゲーム・デザイン」DAY 3 / Academy Camp 2026 Fall - Excel at Location-Based Games! Our and Their Game Design DAY 3
ks91
PRO
0
75
Other Decks in Technology
See All in Technology
re:Invent初参加で変わったこと、2回目にやってみたいこと(JAWS-UG彩の国埼玉 #12)
mhrtech
2
230
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
6
4.9k
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
190
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
120
実践!Cloud Run ハンズオン!! / Cloud Run handson
y0hgi
2
280
20261017福岡devIO 「AIは"良いダッシュボード"を作れるか?
jtakeda
0
150
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
480
DevelopersIO 2026 知識の地図を描く ─ オントロジーとは何か?
ishikawa_satoru
1
1.7k
しろおびから始める!ログ活用の第一歩
shumei_ito
0
950
go-sqletch
moznion
0
140
Featured
See All Featured
Are puppies a ranking factor?
jonoalderson
2
4.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
560
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Building AI with AI
inesmontani
PRO
1
1.3k
The Invisible Side of Design
smashingmag
301
52k
New Earth Scene 8
popppiees
4
2.7k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
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