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

  • エンジニア歴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ステップ

  1. Ethereum と Smart Contract を理解する
  2. ICO を支える技術
  3. 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

  1. 契約条件をコードで定義
  2. Ethereum 上にデプロイする
  3. ユーザまたはアプリが手数料(Ether)を払ってそのプログラム上の関数を実行
  4. 契約条件に応じて、処理を実行

コードで記述した契約条件を自動執行するプログラム

一度定義した契約条件は変更出来ない =

ブロックチェーンの不可逆性を利用

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

Made with Slides.com