CTO of Starbase
Yu Yamanaka
July 18, 2017, at Yahoo! LODGE
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/
暗号通貨の Kickstarter
トークンによる資金調達が当たり前になる社会を目指して
= 総発行量 x 1つあたりの価格
リーマン・ショック
-42%
(2012~2013) +29%
1年で 200% 上昇!
市場総額: 3.4兆円
1年で 1300% 上昇!!
市場総額: 3.6兆円
(Bitcoin含めると7兆円)
5、6月に上場したばかりの暗号通貨
その資金調達劇が業界で話題に
15分で27億円
ブロックチェーンを使った企業管理
総額 約 170 億円 調達
取引量が少ない通貨でもトレードが成立しやすくなる革新的なプロトコル
$20M
$13M
$12M
伝統的な IPO = 株式上場
Initial Coin Offering =
私設の暗号通貨取引所への上場
(39億円)
ブロックチェーンを活用した全く新しい Web 広告技術
オーケーオーケー、で、
(技術的に)どうやってそれだけのお金を調達したの?
こちらからそのソースコードを見ることが出来ます
They were just listed last spring
世界規模の分散アプリケーションプラットフォーム
コードで記述した契約条件を自動執行するプログラム
一度定義した契約条件は変更出来ない =
ブロックチェーンの不可逆性を利用
Smart Contracts 上の関数を実行するための
手数料 / Bitcoin のような通貨としても使える
"BIG" IDEA
(起業家)
ICO
市場取引
調達した資金でプロダクトを開発
Crowdsale
Smart Contract, 事業計画書(Whitepaper), Webサイト, プロトタイプ等を作る
チームメンバ、アドバイザー、初期の活動資金集め
暗号通貨による
クラウドファインディング
(これが ICO と呼ばれることもある)
Token
Crypto-Currency
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!!
You can see the source code here
(Starbase のはより高機能なので 2~3千行位になりそう?)
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 がおすすめです。
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 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 の一種ですが、ここではアドレスごとのトークン保有量を永続化しています。
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
/// @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 トークンを新しく生成して、送金者に割り当てています
/// @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 Mainnet
Geth (Ethreum Node)
Smart Contract
(あなたの PC 上で実行可能です)
Build & Deploy
他のノードへ同期
Ethereum Mainnet
Geth (Ethreum Node)
Web アプリ等
write data
read data
sync data
by Web3 lib
ICO
私設の暗号通貨取引所への上場
プロジェクトチームが上場前に自身が発行したトークンを公開販売し、世界中から暗号通貨建てで資金を調達するセールイベント
ICO/Crowdsale を支える技術
Ethereum, Ether, Smart Contract, ERC20 Token Standard
Smart Contract を書いたりデプロイするためのツール
Solidity, OpenZeppelin, Truffle, Web3, Geth
BAT's Smart Contract
リスクはあなたが何をやっているか理解していない時に起こる。
(仕組みを正しく理解してから投資しましょう)
CTO of Starbase
Yu Yamanaka
July 18, 2017, at Yahoo! LODGE