Save 37% off PRO during our Black Friday Sale! »

DAppsを支えるバックエンド開発の話

55e8251480e61d7f4a7f3f94233c6100?s=47 jkcomment
November 10, 2018

 DAppsを支えるバックエンド開発の話

20181110 hi-con登壇資料

55e8251480e61d7f4a7f3f94233c6100?s=128

jkcomment

November 10, 2018
Tweet

Transcript

  1. DAppsを支えるバックエンド開発の話

  2. 金 志京 ・合同会社DMM.com テクノロジー本部  ブロックチェーン研究室 リードエンジニア ・ブロックチェーンとか、ネットワークとか ・ロードバイク、育児、(スニーカー) @jkcomment

  3. Session01 DApps開発で悩んだこと アジェンダ Session02 DApps開発でハマったこと Session03 まとめ

  4. Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ

  5. すべてのデータをコントラクトに持たせるのは難しいのでは? DApps開発におけるデータの制御

  6. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御

  7. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策

  8. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる

  9. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる

  10. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる

  11. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト

    + Swarm(もしくはIPFS)とか
  12. すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト

    + Swarm(もしくはIPFS)とか <- 決定!
  13. 2種類の処理が必要 ・コントラクト側のデータ処理 ・バックエンド側のデータ処理 DApps開発におけるデータの制御

  14. 考えられるデータ制御フロー DB -> コントラクト順 同時にやる -> 同期 コントラクト -> DB順

  15. 同時にやる -> 同期

  16. 同時にやる -> 同期 片方の処理が失敗するとデータ不整合が発生する!

  17. DB -> コントラクト順

  18. DB -> コントラクト順 秘密鍵の管理が、、

  19. コントラクト -> DB順

  20. コントラクト -> DB順 やってみますか!

  21. Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ

  22. Questの開発環境 開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli

    -> geth
  23. 開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli ->

    geth Questの開発環境 なぜGoなのか ・そこそこ速くて、かつ覚えやすい言語だから ・go-ethereumがGoで実装されている
  24. ganache-cliとGoは相性が悪い!? ・ganache-cliから値(レシートとか)を取得しようとすると、  というエラーが発生。ganache-cli + truffleは問題なく動作する ハマったこと1 原因 ・ganache-cliは長さが0のデータフィールドの場合、0x0を返す  (0xが正しい。go-ethereumは0xに0がつくとエラーとみなす)  まぁ、ganache-cliのバグですねー

  25. 解決策 ・ganache-cliをやめました  ローカルにgethを入れてテストしたらちゃんと動きました!! ハマったこと1

  26. 解決策 ・ganache-cliをやめました  ローカルにgethを入れてテストしたらちゃんと動きました!!  .  .  .  最近対応されたっぽい  https://github.com/trufflesuite/ganache-core/issues/51 ハマったこと1

  27. gethにしたらコントラクトのイベントが検知できない ・イベントがきたらDBを更新する ・ganache-cliはイベントの検知ができたけど、gethだとできない ・geth + web3.jsはイベント検知ができるのに!? ハマったこと2 原因 ・gethのエンドポイントのプロトコルがhttpの場合、  イベントの検知ができない(エラー:

    notifications not supported) ・web3.jsの場合、0.x系はlong pollingでイベント検知(1.0系はws)
  28. 解決策 ・gethの起動コマンドを叩く際にws(ローカル・Remote)か、もしくは ipc(ロー カルのみ)のオプションを追加する  例 ハマったこと2

  29. getTransactionReceiptのstatusが取得できない ・Transactionの確認のため使う  (0: 失敗、1: 成功) ハマったこと3

  30. getTransactionReceiptのstatusが取得できない ・Transactionが成功したかどうかの確認のため使う  (0: 失敗、1: 成功) ハマったこと3 <- そもそもフィールドがない

  31. 原因 ・genesis.jsonのconfigにByzantiumBlockの設定しないとstatusは  取得できない ・configの内容はブロックチェーンのバージョンを意味 ハマったこと3

  32. 解決策 ・genesis.jsonのconfigにByzantiumBlock:0を設定する ハマったこと3 <- これ!

  33. Contractで定義されているeventにindexedがついている フィールドがある場合、その値の取得方法がわからない ハマったこと4 <- これ!

  34. Goで取得したイベント内容 通常の場合、Dataをunpackして内容を取得 ハマったこと4

  35. ・Solidityのイベント ・実行 ハマったこと4

  36. Goで取得したイベント内容 unpackしても_creatorは0x00000000000000000000000... ハマったこと4

  37. Goで取得したイベント内容 indexedの場合、Topicsを確認 ハマったこと4

  38. Goで取得したイベント内容 ①: 定義したイベントをKeccak256で求めたハッシュ値   crypto.Keccak256Hash("RoomCreated(address,address,uint256)") ②: indexedがついているフィールド値をKeccak256で求めたハッシュ値   common.BytesToAddress(event.Topics[1].Bytes()) ->

    _creatorのアドレス   ハマったこと4 ① ②
  39. これ以外にもハマったこと たくさんあったのですが、、、T-T 実は、、、

  40. Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ

  41. Go言語でのDApps開発はあり(最初大変だったけど!) コントラクトですべてのデータを持つ必要はない(と思う!) データベースとの組み合わせも良い選択肢である(はず!) もっともっと良いもの作っていきましょう:D まとめ

  42. ご清聴ありがとうございました