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

Plasma NFT Deposit Range

Plasma NFT Deposit Range

Stake Technologies

July 29, 2019
Tweet

More Decks by Stake Technologies

Other Decks in Technology

Transcript

  1. 概要 PlasmaCash 派生ではすべての資産を NFT として扱う。 子チェーンに資産を移すことを Deposit 子チェーンから親チェーンに資産を戻すことを Exit と呼ぶ。

    親チェーンでは不正な Exit を防ぐために 子チェーンに存在する資産を把握している必要がある。 DepositedRanges は子チェーンに移した NFT を把握し 子チェーンに存在しない資産を不正に Exit できないようにするためのデータ構造。
  2. データ構造 区間を表す構造体、 Range を定義する。 struct Range { start: u128, end:

    u128 } Plasma 上の NFT は index が連番で割り振られており Range を使って どの NFT を指しているかを特定する。 DepositedRanges を定義する。 DepositedRanges: storage::HashMap<u128, Range>; DepositedRanges は現在 Deposit されている NFT の ID を管理する。
  3. 要件 DepositedRanges は以下のことがそれぞれ O(1) でできる。 • 区間の拡張。 ◦ Input ▪

    amount : u128 ◦ 現在の Deposit されている総量から新たに amount だけ区間を拡張する。 • 区間の削除。 ◦ Input ▪ range: Range ▪ deposited_range_id: u128 ◦ 任意の区間を指定して削除する。 ◦ この際、削除する部分区間とする区間の左端の index が入力で与えられる。 (deposited_range_id)
  4. Deposit アルゴリズム 初期状態 : total_deposit = 0; depositedRanges = {

    } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  5. Deposit( amount = 4 ); total_deposit = 0; depositedRanges =

    { 4: Range { 0, 4 }, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  6. Deposit( amount = 4 ); total_deposit = 4; depositedRanges =

    { 4: Range { 0, 4 }, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  7. Deposit ( amount = 6 ); total_deposit = 4; depositedRanges

    = { 4: Range { 0, 4 }, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  8. Deposit ( amount = 6 ); total_deposit = 10; depositedRanges

    = { 10: Range { 0, 10 }, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  9. Deposit ( amount = 2 ); total_deposit = 10; depositedRanges

    = { 10: Range { 0, 10 }, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  10. Deposit ( amount = 2 ); total_deposit = 12; depositedRanges

    = { 12: Range { 0,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  11. Exit ( range = Range { 2, 8 } );

    total_deposit = 12; depositedRanges = { 12: Range { 0,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  12. Exit ( range = Range { 2, 8 } );

    total_deposit = 12; depositedRanges = { 12: Range { 0,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12 ※ deposited_range_id は   作用したい区間を含むような   区間を depositedRanges から   取得するためのキー。   左端の index と等しい。
  13. Exit ( range = Range { 2, 8 } );

    total_deposit = 12; depositedRanges = { 2: Range { 0, 2 }, 12: Range { 8,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12 ※ deposited_range_id は   作用したい区間を含むような   区間を depositedRanges から   取得するためのキー。   左端の index と等しい。
  14. Exit ( range = Range { 6, 10 } );

    total_deposit = 12; depositedRanges = { 2: Range { 0, 2 }, 12: Range { 8,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12
  15. Exit ( range = Range { 6, 10 } );

    total_deposit = 12; depositedRanges = { 2: Range { 0, 2 }, 12: Range { 8,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12
  16. Exit ( range = Range { 10, 12 } );

    total_deposit = 12; depositedRanges = { 2: Range { 0, 2 }, 12: Range { 8,12}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12
  17. Exit ( range = Range { 10, 12 } );

    total_deposit = 12; depositedRanges = { 2: Range { 0, 2 }, 10: Range { 8,10}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 deposited_range_id = 12
  18. Deposit ( acmount = 5 ); total_deposit = 12; depositedRanges

    = { 2: Range { 0, 2 }, 10: Range { 8,10}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  19. Deposit ( acmount = 5 ); total_deposit = 17; depositedRanges

    = { 2: Range { 0, 2 }, 10: Range { 8,10}, 17: Range {12,17}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  20. Exit ( Range { 12, 14 } ); total_deposit =

    17; depositedRanges = { 2: Range { 0, 2 }, 10: Range { 8,10}, 17: Range {12,17}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  21. Exit ( Range { 12, 14 } ); total_deposit =

    17; depositedRanges = { 2: Range { 0, 2 }, 10: Range { 8,10}, 17: Range {14,17}, } 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19