Upgrade to Pro — share decks privately, control downloads, hide ads and more …

0318Substrateプレゼン資料.pdf

 0318Substrateプレゼン資料.pdf

Stake Technologies

March 18, 2019
Tweet

More Decks by Stake Technologies

Other Decks in Technology

Transcript

  1. 山下琢巳(@public_sate)  東京大学大学院  未踏クリエーター2018    昔の趣味 競技プログラミング (ACM-ICPC 2016-2017 World Final)

    Splatoon(WiiU) (Splatoon 甲子園関東3位) スマブラ (地元最強) 週刊少年ジャンプ Twitter / 同人誌(C91) 自己紹介 2
  2. 1. ブロックの同期 2. JSON-RPC API エンドポイント 3. 暗号技術に関するライブラリー 4. 安全で普及性の高い

    libp2p 5. ストレージ 6. テレメトリー(リアルタイムの情報を遠隔サーバーに送信するための遠隔通信システム) 7. ライトクライアント 8. チェーンとバージョン管理 9. プラグイン可能なコンセンサス 10. JavaScript utils(JSのクラス) 11. トランザクションとブロック生成のメカニズム 12. WebAssenbly インタープレター 13. Polkadotによおるインターチェーンコネクティビティー 5 Substrate Core
  3. 1. Accounts & Balances(暗号通貨の残高を確認するアカウント) 2. Assets(ファンジブルアセット) 3. Consensus(コンセンサスのアップデート機能) 4. Contracts(スマートコントラクト機能)

    5. Council(プライベート投票機能) 6. Democracy(公開投票機能) 7. Sessions(Authoritiesのローテーション機能) 8. Staking(PoS機能) 9. Timestamp(タイムスタンプ機能) 10. Treasury(DAO機能) 6 Substrate Runtime Module Library
  4. Transaction Life Cycle 7 Substrate Node Transaction Tx Tx Tx

    Tx Transaction 検証 Tx0 Tx1 Tx2 順序付け Block 実行 Substrate Nodes Broad Cast Client
  5. Substrate is a fully extendable and customizable framework, it is

    possible to define your own custom consensus algorithm. 例:GRANDPA: GHOST-based Recursive Ancestor Deriving Prefix Agreement 単一のブロックに投票するのではなく、highest blockに対して投票を行う。2/3を 得ているブロックが確定される。 • ブロックの生成とファイナリティを完全に分岐する。 • 並列に生成されたブロックについて、並列に検証する。 • 過半数の投票を得たブロックの最近祖先が最終確定する。 この図の場合、A,B,Cが確定される。 8 Consensus
  6. 新しいモジュールを作る(demo:賭けゲーム) 10 今回のサンプルチェーンでは SRML で定義されているバランスを扱う Trait を継承する。 balances::Trait は system::Trait

    を継承している。 Trait を定義する。 SRML で既に定義されている Trait をベースとして継承すると楽に書ける。
  7. Rust で標準的に使用可能な型に加え以下の型が Storage の型として利用できるプリミティブな型として用意されている。 • type AccountId = <Signature as

    Verify>::Signer = H256 • type AccountIndex = u32 • type Balance = u128 • type Block = Block<Header, UncheckedExtrinsic> • type BlockId = BlockId<Block> • type BlockNumber = u64 • type Hash = H256 • type Header = Header<BlockNumber, BlakeTwo256, DigestItem<Hash, SessionKey>> • type Index = u64 • type SessionKey = Ed25519AuthorityId • type Signature = Ed25519Signature • type Timestamp = u64 • type UncheckedExtrinsict = OpaqueExtrinsict 13 ストレージを定義する。 ハッシュ関数: BLAKE2
  8. モジュールを定義する 16 ※おまじない ※イベント を呼び出す予約関数を使えるようにする。 自分で定義した 公開メソッド (エントリポイント) 第一引数は `origin`

    で固定 型 Origin を省略して書く。 Origin の実際の中身は Root/SignedAccountId/Inherent のいずれか 返り値 Result は `Result<(), &'static str>` 成功時は Ok(()) を返す。
  9. モジュールを定義する(注意) 17 1. トランザクションは実行中に中断されたとしても変更は永続的である。 a. 問題点 i. つまり、トランザクションが途中で終了してもロールバックが発生しない。 ii. 設計者にトランザクションのアトミック性の保証を委ねている。

    b. 解決策 i. デザインパターンで解決を模索。 ii. コード解析で解決策を模索。 2. DoS 対策をすべきである。 a. 問題点 i. 計算コストが少なからず発生するため、実行者はそこにリスクが無い限り 容易に大量の関数を叩く攻撃が可能である。 ii. invalid な関数を大量に投げることでも DoS 攻撃が可能である。 b. 解決策 i. 利用者の balance から手数料を引くなどの設計をする。 ii. 攻撃者に対するペナルティを設ける。
  10. テストを書く 19 1. Test 環境に Origin を実装 2. Test 環境にTrait

    を実装 Reference: https://github.com/satellitex/example_substrate/blob/master/runtime/src/demo.rs#L91 簡単のためテスト環境では AccountId は u64型