DAppsを支えるバックエンド開発の話
by
jkcomment
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
ご清聴ありがとうございました