30秒で$35M 集めた Smart Contract
から学ぶ Ethereum 開発入門
CTO of Starbase
Yu Yamanaka
July 18, 2017, at Yahoo! LODGE
この講演を聞くと?
- Ethereum や Smart Contract を使ったビジネスアイディアを思いつくかも?
- 投資家又は起業家として、世界の ICO/Crowdsale に自信を持って参戦出来るようになるかも?
About me
Full-stack Developer / 起業家 / 暗号通貨投資家
Programmer
& DevOps Engineer
2007
2017
CTO
Co-founder & CTO
Full-stack Engineer
& Agile PM
Infrastructure Architect
Twitter: https://twitter.com/yurelx
Blog: http://staycreative.jp/
- エンジニア歴10年。中小〜大企業向けクラウドセキュリティシステム、及び一般消費者向け Web システムの開発/運用等に携わる
- 大規模かつ急速に拡大するクラウドサービスを運用 (800台超のサーバ、月間アクティブユーザ数1500万以上のメディア運営)
- 2016年10月にブロックチェーン業界に参戦
Starbase
"Skyrocket your idea"
暗号通貨の Kickstarter
トークンによる資金調達が当たり前になる社会を目指して
Starbase
Team
Market Cap (市場総額)
= 総発行量 x 1つあたりの価格
米国株式の Market Cap
リーマン・ショック
-42%
(2012~2013) +29%
Bitcoin の Market Cap
1年で 200% 上昇!
市場総額: 3.4兆円
Bitcoin 以外の暗号通貨の Market Cap
1年で 1300% 上昇!!
市場総額: 3.6兆円
(Bitcoin含めると7兆円)
Market Cap Ranking (Top 5)
Market Cap Ranking (~ 50)
5、6月に上場したばかりの暗号通貨
その資金調達劇が業界で話題に
プロダクトがまだ無いにもかかわらず、
Aragon
15分で27億円
ブロックチェーンを使った企業管理
Bancor
総額 約 170 億円 調達
取引量が少ない通貨でもトレードが成立しやすくなる革新的なプロトコル
(参考) Kickstarter の場合
$20M
$13M
$12M
"ICO" の定義
伝統的な IPO = 株式上場
Initial Coin Offering =
私設の暗号通貨取引所への上場
Today's
Main Topic
30秒で$35M 集めた Smart Contract
から学ぶ Ethereum 開発入門
Market Cap Ranking (~ 50)
30秒で $35M
集めて上場!
(39億円)
Basic Attention Token
Basic Attention Token
ブロックチェーンを活用した全く新しい Web 広告技術
オーケーオーケー、で、
(技術的に)どうやってそれだけのお金を調達したの?
Ethereum 上の Smart Contract で集めました
こちらからそのソースコードを見ることが出来ます
その仕組みを理解するための3ステップ
- Ethereum と Smart Contract を理解する
- ICO を支える技術
- BAT の Smart Contract から学ぶ
1. Ethereum と Smart Contract を理解する
これらの暗号通貨はすべて Ethereum 上で新規発行されました!
They were just listed last spring
Ethereum: the World Computer
Ethereum: the World Computer
- Bitcoin と同様、マイナーが動かしています
- 後述の Ether を払えば誰でも利用可能
- 伝統的なアプリケーションと接続可能
- Smart Contracts の実行基盤
世界規模の分散アプリケーションプラットフォーム
Smart Contract
- 契約条件をコードで定義
- Ethereum 上にデプロイする
- ユーザまたはアプリが手数料(Ether)を払ってそのプログラム上の関数を実行
- 契約条件に応じて、処理を実行
コードで記述した契約条件を自動執行するプログラム
一度定義した契約条件は変更出来ない =
ブロックチェーンの不可逆性を利用
Ether
Smart Contracts 上の関数を実行するための
手数料 / Bitcoin のような通貨としても使える
- Ether(ETH) = Fuel of DApps = Fee
- Smart Contract 上の関数を呼ぶのに必要
- Market Price があるので、通貨としても利用できる
2. "ICO" を支える技術
"BIG" IDEA
(起業家)
ICO
市場取引
調達した資金でプロダクトを開発
Crowdsale
Smart Contract, 事業計画書(Whitepaper), Webサイト, プロトタイプ等を作る
チームメンバ、アドバイザー、初期の活動資金集め
ICO のプロセス (1~2years)
Crowdsale
暗号通貨による
クラウドファインディング
- プロジェクトチームが上場前に自身が発行したトークンを公開販売し、世界中から暗号通貨建てで資金を調達するセールイベント
- トークンの上場後に市場で売り買い出来る
- 基本的に販売上限と期間がある (人気のあるセールは一瞬で売り切れ)
(これが ICO と呼ばれることもある)
Token
Token
Crypto-Currency
- トークンは暗号通貨であり、他の通貨と同じようにトレード可能
- プロジェクトによって独自の権利を持つ暗号通貨
(例. 将来の売上の一部を配分)
ERC20: A standard for Ethereum Tokens
1 contract ERC20 {
2 function totalSupply() constant returns (uint totalSupply);
3 function balanceOf(address _owner) constant returns (uint balance);
4 function transfer(address _to, uint _value) returns (bool success);
5 function transferFrom(address _from, address _to, uint _value) returns (bool success);
6 function approve(address _spender, uint _value) returns (bool success);
7 function allowance(address _owner, address _spender) constant returns (uint remaining);
8 event Transfer(address indexed _from, address indexed _to, uint _value);
9 event Approval(address indexed _owner, address indexed _spender, uint _value);
10 }
ERC20 token は Ethereum 上で発行されるトークンのための統一規格であり、外部アプリケーションや暗号通貨取引所などが様々なトークンをより扱いやすくするためのもの
Are you ready?
Let's look at the code!!
3. BAT の Smart Contract から学ぶ
BAT's smart contract
You can see the source code here
たった 175 行!!
(Starbase のはより高機能なので 2~3千行位になりそう?)
Solidity / SafeMath
pragma solidity ^0.4.10;
/* taking ideas from FirstBlood token */
contract SafeMath {
/* function assert(bool assertion) internal { */
/* if (!assertion) { */
/* throw; */
/* } */
/* } // assert no longer needed once solidity is on 0.4.10 */
function safeAdd(uint256 x, uint256 y) internal returns(uint256) {
uint256 z = x + y;
assert((z >= x) && (z >= y));
return z;
}
Smart Contract は Solidity という独自の言語で記述します。
デプロイ後のバグ修正は不可能なため、慎重なコーディングが求められます。
四則演算に関するバグが原因で資金流失した事故も有ります。
出来るだけ実績のあるコードやセキュアなライブラリを利用しましょう。OpenZeppelin がおすすめです。
Abstract Contract / Event / Inheritence
contract Token {
uint256 public totalSupply;
function balanceOf(address _owner) constant returns (uint256 balance);
function transfer(address _to, uint256 _value) returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
function approve(address _spender, uint256 _value) returns (bool success);
function allowance(address _owner, address _spender) constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
/* ERC 20 token */
contract StandardToken is Token {
function transfer(address _to, uint256 _value) returns (bool success) {
...
}
Abstract Contract: 未実装の関数をもつコントラクト
ERC 20 に準拠したトークンを作る場合には、 ERC 20 の規約で定義されている関数を実装する必要が有ります。
Event: ここで定義されている event とはログの一種ですが、イベントドリブンな処理を実行するのにも利用できます。(e.g. token の取引が行われた時にメール通知するなど)
Function
function transfer(address _to, uint256 _value) returns (bool success) {
if (balances[msg.sender] >= _value && _value > 0) {
balances[msg.sender] -= _value;
balances[_to] += _value;
Transfer(msg.sender, _to, _value);
return true;
} else {
return false;
}
}
...
function balanceOf(address _owner) constant returns (uint256 balance) {
return balances[_owner];
}
...
mapping (address => uint256) balances;
`constant` 修飾子がついていない関数はデータを Smart Contract 上に永続化することが出来ます。ただし処理量に応じた Ether が必要です。
`constant` 修飾子がついている関数は、永続化されているデータの読み出しが可能です。こちらは Ether を必要としません。
Make an event
`mapping` は型で、 HashMap の一種ですが、ここではアドレスごとのトークン保有量を永続化しています。
Constant
contract BAToken is StandardToken, SafeMath {
// metadata
string public constant name = "Basic Attention Token";
string public constant symbol = "BAT";
uint256 public constant decimals = 18;
string public version = "1.0";
// contracts
address public ethFundDeposit; // deposit address for ETH for Brave International
address public batFundDeposit; // deposit address for Brave International use and BAT User Fund
// crowdsale parameters
bool public isFinalized; // switched to true in operational state
uint256 public fundingStartBlock;
uint256 public fundingEndBlock;
uint256 public constant batFund = 500 * (10**6) * 10**decimals; // 500m BAT reserved for Brave Intl use
uint256 public constant tokenExchangeRate = 6400; // 6400 BAT tokens per 1 ETH
uint256 public constant tokenCreationCap = 1500 * (10**6) * 10**decimals;
uint256 public constant tokenCreationMin = 675 * (10**6) * 10**decimals;
Metadata は Etherscan のような外部サービスから参照される情報です
お金の流れ
投資家
This smart contract
Brave's fund
Create Tokens
/// @dev Accepts ether and creates new BAT tokens.
function createTokens() payable external {
if (isFinalized) throw;
if (block.number < fundingStartBlock) throw;
if (block.number > fundingEndBlock) throw;
if (msg.value == 0) throw;
// check that we're not over totals
uint256 tokens = safeMult(msg.value, tokenExchangeRate);
uint256 checkedSupply = safeAdd(totalSupply, tokens);
// return money if something goes wrong
if (tokenCreationCap < checkedSupply) throw; // odd fractions won't be found
totalSupply = checkedSupply;
balances[msg.sender] += tokens; // safeAdd not needed; bad semantics to use here
CreateBAT(msg.sender, tokens); // logs token creation
}
`payable`: Ether の入金を伴うことを示します
`external`: 外部プログラム等から実行可能なことを示します
お金の流れ
投資家
This smart contract
Brave's fund
投資額に応じて BAT トークンを新しく生成して、送金者に割り当てています
Finalize
/// @dev Ends the funding period and sends the ETH home
function finalize() external {
if (isFinalized) throw;
if (msg.sender != ethFundDeposit) throw; // locks finalize to the ultimate ETH owner
if(totalSupply < tokenCreationMin) throw; // have to sell minimum to move to operational
if(block.number <= fundingEndBlock && totalSupply != tokenCreationCap) throw;
// move to operational
isFinalized = true;
if(!ethFundDeposit.send(this.balance)) throw; // send the eth to Brave International
}
/// @dev Allows contributors to recover their ether in the case of a failed funding campaign.
function refund() external {
...
}
お金の流れ
投資家
This smart contract
Brave's fund
Ethereum 上に Smart Contract をデプロイする方法
Ethereum Mainnet
Geth (Ethreum Node)
Smart Contract
(あなたの PC 上で実行可能です)
Build & Deploy
他のノードへ同期
Ethereum と既存のアプリケーションの連携
Ethereum Mainnet
Geth (Ethreum Node)
Web アプリ等
write data
read data
sync data
by Web3 lib
まとめ
ICO
私設の暗号通貨取引所への上場
Crowdsale
プロジェクトチームが上場前に自身が発行したトークンを公開販売し、世界中から暗号通貨建てで資金を調達するセールイベント
ICO/Crowdsale を支える技術
Ethereum, Ether, Smart Contract, ERC20 Token Standard
Smart Contract を書いたりデプロイするためのツール
Solidity, OpenZeppelin, Truffle, Web3, Geth
BAT's Smart Contract
"Risk comes from not knowing what you're doing."
- Warren Buffett
リスクはあなたが何をやっているか理解していない時に起こる。
(仕組みを正しく理解してから投資しましょう)
Thank you!
CTO of Starbase
Yu Yamanaka
July 18, 2017, at Yahoo! LODGE
30秒で$35M集めたスマートコントラクトから学ぶ Ethereum 開発入門
By Yu Yamanaka