Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ

552 views

Published on

blockchain.tokyo #12 にて発表した資料です。
https://blockchain-tokyo.connpass.com/event/100707/

Published in: Technology
  • Be the first to comment

  • Be the first to like this

LoveChainのスマートコントラクトを見てみよう & 非中央集権なトークンのカタチ

  1. 1. Copyright Drecom Co., Ltd. All Rights Reserved. 1 のスマートコントラクトを 見てみよう 非中央集権的な トークンのカタチ &
  2. 2. Copyright Drecom Co., Ltd. All Rights Reserved. 2 前半
  3. 3. Copyright Drecom Co., Ltd. All Rights Reserved. 3 のスマートコントラクトを 見てみよう blockchain.tokyo #12 2018/09/25
  4. 4. Copyright Drecom Co., Ltd. All Rights Reserved. 4 自己紹介 株式会社ドリコム DRIP部 エンジニア 小川光典 @ogwmtnr
  5. 5. Copyright Drecom Co., Ltd. All Rights Reserved. 5 DRIP
  6. 6. Copyright Drecom Co., Ltd. All Rights Reserved. 6 DRIP
  7. 7. Copyright Drecom Co., Ltd. All Rights Reserved. 7 DRIP
  8. 8. Copyright Drecom Co., Ltd. All Rights Reserved. 8 LoveChain 2018年7月5日リリース https://lovechain.ooo
  9. 9. Copyright Drecom Co., Ltd. All Rights Reserved. 9 LoveChainの仕組み タロウ ハナコ LoveChain スマートコントラクトハナコ に プロポーズ タロウ に プロポーズPartner タロウ & ハナコ
  10. 10. Copyright Drecom Co., Ltd. All Rights Reserved. 10 LoveChainの仕組み タロウ ハナコ LoveChain スマートコントラクトメッセージ 追加 メッセージ 追加 Partner タロウ & ハナコ タロウ & ハナコ メッセージ url view
  11. 11. Copyright Drecom Co., Ltd. All Rights Reserved. 11 LoveChainの仕組み タロウ ハナコ LoveChain スマートコントラクト お別れ Partner タロウ & ハナコ タロウ & ハナコ メッセージ url view
  12. 12. Copyright Drecom Co., Ltd. All Rights Reserved. 12 LoveChainコントラクト mapping (address => address) private propose; 誰が誰に対してプロポーズ中なのか、を保持。 mapping (address => address) private partner; 誰と誰がパートナーなのか、を保持。 例えばタロウ(address: 0xA)とハナコ(address: 0xB)がパートナーだったら、 partner[0xA] = 0xB; partner[0xB] = 0xA; という状態になっている。 mapping (uint256 => string[]) private partnerMessages; パートナーのメッセージが格納されている。
  13. 13. Copyright Drecom Co., Ltd. All Rights Reserved. 13 LoveChainコントラクト function proposeTo(address to) public msg.sender から to に対してプロポーズ。 ▼既に to から msg.sender に対してプロポーズ済だった場合、 partner[msg.sender] = to; partner[to] = msg.sender; ▼まだ to からプロポーズされてない場合、 propose[msg.sender] = to;
  14. 14. Copyright Drecom Co., Ltd. All Rights Reserved. 14 LoveChainコントラクト function addMessage(string message) public パートナーとの `partnerMessages` にメッセージを追加。 `partnerMessages` のキーは uint256 になっていて、ここには 「パートナー2人の `address` 」 を元にして作られたハッシュが入る。
  15. 15. Copyright Drecom Co., Ltd. All Rights Reserved. 15 LoveChainコントラクト function craetePartnerBytes(address a, address b) private pure returns(bytes) { bytes memory arr = new bytes(64); bytes32 first; bytes32 second; if (uint160(a)< uint160(b)){ // 小さい方が先頭にくるように調整している first = keccak256(a); second = keccak256(b); } else { first = keccak256(b); second = keccak256(a); } for (uint i = 0; i < 32; i++){ arr[i]= first[i]; arr[i+ 32] = second[i]; } return arr; }
  16. 16. Copyright Drecom Co., Ltd. All Rights Reserved. 16 LoveChainコントラクト function addMessage(string message) public { address target = partner[msg.sender]; require(isPartner(msg.sender, target) == true); uint index = partnerMessages[uint256(keccak256(craetePartnerBytes(msg.sender, target)))].push(message) - 1; Message(msg.sender, target, message, index); }
  17. 17. Copyright Drecom Co., Ltd. All Rights Reserved. 17 LoveChainコントラクト function getPartnerMessage(address a, address b, uint index) public view returns (string) パートナーのメッセージを取得する。 address さえ知っていれば誰でも叩ける。 パートナーでない address を指定した場合は revert となる。
  18. 18. Copyright Drecom Co., Ltd. All Rights Reserved. 18 LoveChainコントラクト function getPartnerMessage(address a, address b, uint index) public view returns (string) { require(isPartner(a,b) == true); uint256 key = uint256(keccak256(craetePartnerBytes(a,b))); if (isHiddenMessages[key] == true) { require((msg.sender == a) || (msg.sender == b)); } uint count = partnerMessages[key].length; require(index < count); return partnerMessages[key][index]; }
  19. 19. Copyright Drecom Co., Ltd. All Rights Reserved. 19 LoveChainコントラクト function farewellTo(address to) public パートナーとお別れする。 別れると先ほど紹介した `partnerMessageCount` や `getPartnerMessage` が revert となるため、 メッセージが見れなくなる。
  20. 20. Copyright Drecom Co., Ltd. All Rights Reserved. 20 LoveChain まとめ • コントラクトは主に次の状態を持っている – propose : 誰から誰にプロポーズ中か – partner : 誰と誰がパートナーか – partnerMessage : パートナーのメッセージ • コントラクトは主に次のメソッドを使用している – proposeTo – addMessage – partnerMessageCount / getPartnerMessage – farawellTo • パートナーのメッセージは2人の address を元に生成された ハッシュをキーとする mapping object に保管される
  21. 21. Copyright Drecom Co., Ltd. All Rights Reserved. 21 LoveChainまとめ 公式ページフッターからコントラクトの ethscan ページへ行けます。 ソースコードも公開してます。 ココ!
  22. 22. Copyright Drecom Co., Ltd. All Rights Reserved. 22 LoveChainまとめ 公式ページフッターからコントラクトの ethscan ページへ行けます。 ソースコードも公開してます。
  23. 23. Copyright Drecom Co., Ltd. All Rights Reserved. 23 後半
  24. 24. Copyright Drecom Co., Ltd. All Rights Reserved. 24 blockchain.tokyo #12 2018/09/25 非中央集権的な トークンのカタチ
  25. 25. Copyright Drecom Co., Ltd. All Rights Reserved. 25 自己紹介 株式会社ドリコム DRIP部 エンジニア 小川光典 @ogwmtnr
  26. 26. Copyright Drecom Co., Ltd. All Rights Reserved. 26 ところで みなさん
  27. 27. Copyright Drecom Co., Ltd. All Rights Reserved. 27 ERC721 トークン 持ってますか?
  28. 28. Copyright Drecom Co., Ltd. All Rights Reserved. 28 代替不可能 な トークン
  29. 29. Copyright Drecom Co., Ltd. All Rights Reserved. 29 ERC721 と言えば CryptoKitties
  30. 30. Copyright Drecom Co., Ltd. All Rights Reserved. 30 ERC721 と言えば EtherTulips
  31. 31. Copyright Drecom Co., Ltd. All Rights Reserved. 31 ERC721 と言えば CryptoCelebrities
  32. 32. Copyright Drecom Co., Ltd. All Rights Reserved. 32 ERC721 トークンのトレード OpenSea
  33. 33. Copyright Drecom Co., Ltd. All Rights Reserved. 33 ERC721 トークンのトレード RareBits
  34. 34. Copyright Drecom Co., Ltd. All Rights Reserved. 34 ERC721 トークンの価値 ERC721 トークンは、ユーザーの資産としてブロックチェー ン上に半永久的に保持される。 ERC721 トークンの価値 ≒ サービス内での価値に紐づく
  35. 35. Copyright Drecom Co., Ltd. All Rights Reserved. 35 疑問 • (1) : サービスが終了したら全てのトークンは価値が無く なってしまう? • (2) : ユーザーが価値を手にする瞬間は売った瞬間、つま りトークンを失う瞬間なので、ユーザーは「トークンが 資産価値を持つ」についてポジティブなイメージしずら いのでは? – 特に、高値のトークンはサービス内で価値があるので、サービ ス利用を続行したいユーザーにとっては手放したくないので は?
  36. 36. Copyright Drecom Co., Ltd. All Rights Reserved. 36 観測した取り組み1 HL-Report : Rekiconne Archive
  37. 37. Copyright Drecom Co., Ltd. All Rights Reserved. 37 観測した取り組み1 レキシトコネクト内のキャラクターやアイテムの一部を トークン化してユーザーに配布。
  38. 38. Copyright Drecom Co., Ltd. All Rights Reserved. 38 観測した取り組み2 キティバース
  39. 39. Copyright Drecom Co., Ltd. All Rights Reserved. 39 観測した取り組み2 仮想猫のデータを使って別の DApps が作れる
  40. 40. Copyright Drecom Co., Ltd. All Rights Reserved. 40 どちらも、トークンの参照は解放されているが、発行権は 各サービスが握っている。 任意のデータを持ったトークンを勝手に発行されないよう に、すなわちトークンの品質を担保するためである。
  41. 41. Copyright Drecom Co., Ltd. All Rights Reserved. 41 どちらも、トークンの参照は解放されているが、発行権は 各サービスが握っている。 任意のデータを持ったトークンを勝手に発行されないよう に、すなわちトークンの品質を担保するためである。 ↓ もしトークンの発行権も解放したら…
  42. 42. Copyright Drecom Co., Ltd. All Rights Reserved. 42 どちらも、トークンの参照は解放されているが、発行権は 各サービスが握っている。 任意のデータを持ったトークンを勝手に発行されないよう に、すなわちトークンの品質を担保するためである。 ↓ もしトークンの発行権も解放したら… どんな DApps でも発行でき、DApps 間で使いまわせるような トークンが生まれて、ユーザーにとってトークンを作った り所持したりするモチベーションが高まるのでは…?
  43. 43. Copyright Drecom Co., Ltd. All Rights Reserved. 43 作ろう!
  44. 44. Copyright Drecom Co., Ltd. All Rights Reserved. 44 まず ERC721 について // イベント event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(addressindexed _owner, address indexed _operator, bool _approved); // トークン所有権の移動 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; // owner 以外でトークン transfer 可能なアドレスの設定 function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address_operator, bool _approved) external; // オーナー情報 function balanceOf(address _owner) external view returns (uint256); function isApprovedForAll(address_owner, address _operator) external view returns (bool); // トークン情報 function ownerOf(uint256 _tokenId) external view returns (address); function getApproved(uint256 _tokenId) external view returns (address);
  45. 45. Copyright Drecom Co., Ltd. All Rights Reserved. 45 まず ERC721 について // イベント event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(addressindexed _owner, address indexed _operator, bool _approved); // トークン所有権の移動 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; // owner 以外でトークン transfer 可能なアドレスの設定 function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address_operator, bool _approved) external; // オーナー情報 function balanceOf(address _owner) external view returns (uint256); function isApprovedForAll(address_owner, address _operator) external view returns (bool); // トークン情報 function ownerOf(uint256 _tokenId) external view returns (address); function getApproved(uint256 _tokenId) external view returns (address);
  46. 46. Copyright Drecom Co., Ltd. All Rights Reserved. 46 まず ERC721 について トークンの持つ固有な情報として定義されているのは • owner • approved のみ。 それだけだと CryptoKitties における遺伝子のようなデータを持 たせられないので、DApps が定義可能な固有情報をトークン に定義する。 「遺伝子」だと生物に寄りすぎているので、異なる名称を 考える。
  47. 47. Copyright Drecom Co., Ltd. All Rights Reserved. 47 ERC721 拡張 uint256 inscription : 銘刻 これを発行時に渡すと、不変なデータとしてトークンに刻 まれる。 function mint(address _to, uint256 _inscription) external
  48. 48. Copyright Drecom Co., Ltd. All Rights Reserved. 48 ERC721 拡張 しかし発行権を解放すると、任意の DApps で有利な inscription を持つトークンが生成できてしまうので、トークンの品質 を担保できなくなるのでは?
  49. 49. Copyright Drecom Co., Ltd. All Rights Reserved. 49 ERC721 拡張 しかし発行権を解放すると、任意の DApps で有利な inscription を持つトークンが生成できてしまうので、トークンの品質 を担保できなくなるのでは? ↓ ………
  50. 50. Copyright Drecom Co., Ltd. All Rights Reserved. 50 ERC721 拡張
  51. 51. Copyright Drecom Co., Ltd. All Rights Reserved. 51 ERC721 拡張
  52. 52. Copyright Drecom Co., Ltd. All Rights Reserved. 52 ERC721 拡張
  53. 53. Copyright Drecom Co., Ltd. All Rights Reserved. 53 ERC721 拡張
  54. 54. Copyright Drecom Co., Ltd. All Rights Reserved. 54 ERC721 拡張
  55. 55. Copyright Drecom Co., Ltd. All Rights Reserved. 55 ERC721 拡張 !
  56. 56. Copyright Drecom Co., Ltd. All Rights Reserved. 56 ERC721 拡張 しかし発行権を解放すると、任意の DApps で有利な inscription を持つトークンが生成できてしまうので、トークンの品質 を担保できなくなるのでは? ↓ トークンに発行元を記載する事で、そのトークンの品質に 対する信頼性を担保できるのでは?
  57. 57. Copyright Drecom Co., Ltd. All Rights Reserved. 57 ERC721 拡張 address creator トークン発行時に msg.sender をトークン自身の creator として保 持させる。
  58. 58. Copyright Drecom Co., Ltd. All Rights Reserved. 58 ERC721 拡張 使い方イメージ DApps 独自 コントラクト ERC721 拡張 コントラクト 発行を call ERC721 拡張コントラクトの上に独自コ ントラクトを乗せて使えば、独自コ ントラクトのアドレスがトークンの creator に刻まれる。 Inscription に入れるデータのロジックを 独自コントラクト等に記述すれば、 その発行元におけるトークンの品質 は担保されるはず。
  59. 59. Copyright Drecom Co., Ltd. All Rights Reserved. 59 ERC721 拡張 ERC721 トークンが • DApps が定義可能な不変データ • 自身の発行元 を持つ。 各 DApps は発行元と不変データを参照し、そのトークンの 振る舞いを決定できる。 例) ある Dapps では猫で、ある Dapps では有名人で、ある Dapps では武器になって、ある Dapps では投票権になる。 トークンの発行/管理において、より非中央集権的な世界を 創り出せそうな可能性を感じる。
  60. 60. Copyright Drecom Co., Ltd. All Rights Reserved. 60 作りました
  61. 61. Copyright Drecom Co., Ltd. All Rights Reserved. 61 本日リリース! https://6-pillars.ooo
  62. 62. Copyright Drecom Co., Ltd. All Rights Reserved. 62 DApps をまたいで利用可能なトークンを誰でも生成できる、 Ethereum 上で動作するスマートコントラクトです。 生成されたトークンには不変なデータが明記され、開発者 がそれを使いトークンの振る舞いを決定する事で、ある DApps 上では価値がなかったものが、他の DApps 上では価値 が高いものとして扱われるなど、トークンの価値が絶対価 値から相対価値になります。
  63. 63. Copyright Drecom Co., Ltd. All Rights Reserved. 63 詳細はサイトにて。 https://6-pillars.ooo github にてコードを公開してます。 npm ライブラリとして利用可能な状態になっています。 https://github.com/drip-oss/llllll
  64. 64. Copyright Drecom Co., Ltd. All Rights Reserved. 64 まとめ • ERC721 トークンを使った既存サービスに思う疑問。 – 価値がサービスそのものに強く依存? – トークンが価値になるタイミングがポジティブではない? • 既にこの疑問に対する取り組みをしているサービスは存在するが、 トークンの品質を担保するため全てが解放されているわけではない。 • トークンに「銘文」と「発行元」を刻む事によりDApps で使いやす い、かつ誰でも発行可能でどんな DApps も乗り越えて使える ERC721 拡 張トークンを定義し「||||||」としてリリースした。
  65. 65. Copyright Drecom Co., Ltd. All Rights Reserved. 65 drip drecom 🔍 フィードバックお待ちしてます
  66. 66. Copyright Drecom Co., Ltd. All Rights Reserved. 66 ご静聴 ありがとうございました!

×