DAppsを支えるバックエンド開発の話
by
jkcomment
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
DAppsを支えるバックエンド開発の話
Slide 2
Slide 2 text
金 志京 ・合同会社DMM.com テクノロジー本部 ブロックチェーン研究室 リードエンジニア ・ブロックチェーンとか、ネットワークとか ・ロードバイク、育児、(スニーカー) @jkcomment
Slide 3
Slide 3 text
Session01 DApps開発で悩んだこと アジェンダ Session02 DApps開発でハマったこと Session03 まとめ
Slide 4
Slide 4 text
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
Slide 5
Slide 5 text
すべてのデータをコントラクトに持たせるのは難しいのでは? DApps開発におけるデータの制御
Slide 6
Slide 6 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御
Slide 7
Slide 7 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策
Slide 8
Slide 8 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
Slide 9
Slide 9 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
Slide 10
Slide 10 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
Slide 11
Slide 11 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト + Swarm(もしくはIPFS)とか
Slide 12
Slide 12 text
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト + Swarm(もしくはIPFS)とか <- 決定!
Slide 13
Slide 13 text
2種類の処理が必要 ・コントラクト側のデータ処理 ・バックエンド側のデータ処理 DApps開発におけるデータの制御
Slide 14
Slide 14 text
考えられるデータ制御フロー DB -> コントラクト順 同時にやる -> 同期 コントラクト -> DB順
Slide 15
Slide 15 text
同時にやる -> 同期
Slide 16
Slide 16 text
同時にやる -> 同期 片方の処理が失敗するとデータ不整合が発生する!
Slide 17
Slide 17 text
DB -> コントラクト順
Slide 18
Slide 18 text
DB -> コントラクト順 秘密鍵の管理が、、
Slide 19
Slide 19 text
コントラクト -> DB順
Slide 20
Slide 20 text
コントラクト -> DB順 やってみますか!
Slide 21
Slide 21 text
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
Slide 22
Slide 22 text
Questの開発環境 開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli -> geth
Slide 23
Slide 23 text
開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli -> geth Questの開発環境 なぜGoなのか ・そこそこ速くて、かつ覚えやすい言語だから ・go-ethereumがGoで実装されている
Slide 24
Slide 24 text
ganache-cliとGoは相性が悪い!? ・ganache-cliから値(レシートとか)を取得しようとすると、 というエラーが発生。ganache-cli + truffleは問題なく動作する ハマったこと1 原因 ・ganache-cliは長さが0のデータフィールドの場合、0x0を返す (0xが正しい。go-ethereumは0xに0がつくとエラーとみなす) まぁ、ganache-cliのバグですねー
Slide 25
Slide 25 text
解決策 ・ganache-cliをやめました ローカルにgethを入れてテストしたらちゃんと動きました!! ハマったこと1
Slide 26
Slide 26 text
解決策 ・ganache-cliをやめました ローカルにgethを入れてテストしたらちゃんと動きました!! . . . 最近対応されたっぽい https://github.com/trufflesuite/ganache-core/issues/51 ハマったこと1
Slide 27
Slide 27 text
gethにしたらコントラクトのイベントが検知できない ・イベントがきたらDBを更新する ・ganache-cliはイベントの検知ができたけど、gethだとできない ・geth + web3.jsはイベント検知ができるのに!? ハマったこと2 原因 ・gethのエンドポイントのプロトコルがhttpの場合、 イベントの検知ができない(エラー: notifications not supported) ・web3.jsの場合、0.x系はlong pollingでイベント検知(1.0系はws)
Slide 28
Slide 28 text
解決策 ・gethの起動コマンドを叩く際にws(ローカル・Remote)か、もしくは ipc(ロー カルのみ)のオプションを追加する 例 ハマったこと2
Slide 29
Slide 29 text
getTransactionReceiptのstatusが取得できない ・Transactionの確認のため使う (0: 失敗、1: 成功) ハマったこと3
Slide 30
Slide 30 text
getTransactionReceiptのstatusが取得できない ・Transactionが成功したかどうかの確認のため使う (0: 失敗、1: 成功) ハマったこと3 <- そもそもフィールドがない
Slide 31
Slide 31 text
原因 ・genesis.jsonのconfigにByzantiumBlockの設定しないとstatusは 取得できない ・configの内容はブロックチェーンのバージョンを意味 ハマったこと3
Slide 32
Slide 32 text
解決策 ・genesis.jsonのconfigにByzantiumBlock:0を設定する ハマったこと3 <- これ!
Slide 33
Slide 33 text
Contractで定義されているeventにindexedがついている フィールドがある場合、その値の取得方法がわからない ハマったこと4 <- これ!
Slide 34
Slide 34 text
Goで取得したイベント内容 通常の場合、Dataをunpackして内容を取得 ハマったこと4
Slide 35
Slide 35 text
・Solidityのイベント ・実行 ハマったこと4
Slide 36
Slide 36 text
Goで取得したイベント内容 unpackしても_creatorは0x00000000000000000000000... ハマったこと4
Slide 37
Slide 37 text
Goで取得したイベント内容 indexedの場合、Topicsを確認 ハマったこと4
Slide 38
Slide 38 text
Goで取得したイベント内容 ①: 定義したイベントをKeccak256で求めたハッシュ値 crypto.Keccak256Hash("RoomCreated(address,address,uint256)") ②: indexedがついているフィールド値をKeccak256で求めたハッシュ値 common.BytesToAddress(event.Topics[1].Bytes()) -> _creatorのアドレス ハマったこと4 ① ②
Slide 39
Slide 39 text
これ以外にもハマったこと たくさんあったのですが、、、T-T 実は、、、
Slide 40
Slide 40 text
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
Slide 41
Slide 41 text
Go言語でのDApps開発はあり(最初大変だったけど!) コントラクトですべてのデータを持つ必要はない(と思う!) データベースとの組み合わせも良い選択肢である(はず!) もっともっと良いもの作っていきましょう:D まとめ
Slide 42
Slide 42 text
ご清聴ありがとうございました