Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DAppsを支えるバックエンド開発の話
Search
jkcomment
November 10, 2018
Technology
2
930
DAppsを支えるバックエンド開発の話
20181110 hi-con登壇資料
jkcomment
November 10, 2018
Tweet
Share
More Decks by jkcomment
See All by jkcomment
なぜBlockchainはRustを選ぶのか #roppongirs / why-blockchain-chooses-rust
jkcomment
2
2.2k
Ethereumを支えるネットワークの話
jkcomment
11
5.2k
Other Decks in Technology
See All in Technology
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
360
22nd ACRi Webinar - NTT Kawahara-san's slide
nao_sumikawa
0
100
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
480
usermode linux without MMU - fosdem2026 kernel devroom
thehajime
0
240
Red Hat OpenStack Services on OpenShift
tamemiya
0
130
Amazon S3 Vectorsを使って資格勉強用AIエージェントを構築してみた
usanchuu
4
460
量子クラウドサービスの裏側 〜Deep Dive into OQTOPUS〜
oqtopus
0
140
Agile Leadership Summit Keynote 2026
m_seki
1
670
SchooでVue.js/Nuxtを技術選定している理由
yamanoku
3
190
データの整合性を保ちたいだけなんだ
shoheimitani
8
3.2k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
Ruby版 JSXのRuxが気になる
sansantech
PRO
0
170
Featured
See All Featured
Leo the Paperboy
mayatellez
4
1.4k
Become a Pro
speakerdeck
PRO
31
5.8k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
[SF Ruby Conf 2025] Rails X
palkan
1
760
Evolving SEO for Evolving Search Engines
ryanjones
0
130
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
Deep Space Network (abreviated)
tonyrice
0
64
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Navigating Team Friction
lara
192
16k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
200
Transcript
DAppsを支えるバックエンド開発の話
金 志京 ・合同会社DMM.com テクノロジー本部 ブロックチェーン研究室 リードエンジニア ・ブロックチェーンとか、ネットワークとか ・ロードバイク、育児、(スニーカー) @jkcomment
Session01 DApps開発で悩んだこと アジェンダ Session02 DApps開発でハマったこと Session03 まとめ
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
すべてのデータをコントラクトに持たせるのは難しいのでは? DApps開発におけるデータの制御
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト
+ Swarm(もしくはIPFS)とか
すべてのデータをコントラクトに持たせるのは難しいのでは? ・ガスコスト ・言語仕様による難しさ DApps開発におけるデータの制御 解決策 ・コントラクトやめる ・コントラクト + データベース(RDB) ・コントラクト
+ Swarm(もしくはIPFS)とか <- 決定!
2種類の処理が必要 ・コントラクト側のデータ処理 ・バックエンド側のデータ処理 DApps開発におけるデータの制御
考えられるデータ制御フロー DB -> コントラクト順 同時にやる -> 同期 コントラクト -> DB順
同時にやる -> 同期
同時にやる -> 同期 片方の処理が失敗するとデータ不整合が発生する!
DB -> コントラクト順
DB -> コントラクト順 秘密鍵の管理が、、
コントラクト -> DB順
コントラクト -> DB順 やってみますか!
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
Questの開発環境 開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli
-> geth
開発環境 ・環境構築: Docker ・言語: Go(パッケージ管理はdep) ・ライブラリ(?): go-ethereum ・privatenet: ganache-cli ->
geth Questの開発環境 なぜGoなのか ・そこそこ速くて、かつ覚えやすい言語だから ・go-ethereumがGoで実装されている
ganache-cliとGoは相性が悪い!? ・ganache-cliから値(レシートとか)を取得しようとすると、 というエラーが発生。ganache-cli + truffleは問題なく動作する ハマったこと1 原因 ・ganache-cliは長さが0のデータフィールドの場合、0x0を返す (0xが正しい。go-ethereumは0xに0がつくとエラーとみなす) まぁ、ganache-cliのバグですねー
解決策 ・ganache-cliをやめました ローカルにgethを入れてテストしたらちゃんと動きました!! ハマったこと1
解決策 ・ganache-cliをやめました ローカルにgethを入れてテストしたらちゃんと動きました!! . . . 最近対応されたっぽい https://github.com/trufflesuite/ganache-core/issues/51 ハマったこと1
gethにしたらコントラクトのイベントが検知できない ・イベントがきたらDBを更新する ・ganache-cliはイベントの検知ができたけど、gethだとできない ・geth + web3.jsはイベント検知ができるのに!? ハマったこと2 原因 ・gethのエンドポイントのプロトコルがhttpの場合、 イベントの検知ができない(エラー:
notifications not supported) ・web3.jsの場合、0.x系はlong pollingでイベント検知(1.0系はws)
解決策 ・gethの起動コマンドを叩く際にws(ローカル・Remote)か、もしくは ipc(ロー カルのみ)のオプションを追加する 例 ハマったこと2
getTransactionReceiptのstatusが取得できない ・Transactionの確認のため使う (0: 失敗、1: 成功) ハマったこと3
getTransactionReceiptのstatusが取得できない ・Transactionが成功したかどうかの確認のため使う (0: 失敗、1: 成功) ハマったこと3 <- そもそもフィールドがない
原因 ・genesis.jsonのconfigにByzantiumBlockの設定しないとstatusは 取得できない ・configの内容はブロックチェーンのバージョンを意味 ハマったこと3
解決策 ・genesis.jsonのconfigにByzantiumBlock:0を設定する ハマったこと3 <- これ!
Contractで定義されているeventにindexedがついている フィールドがある場合、その値の取得方法がわからない ハマったこと4 <- これ!
Goで取得したイベント内容 通常の場合、Dataをunpackして内容を取得 ハマったこと4
・Solidityのイベント ・実行 ハマったこと4
Goで取得したイベント内容 unpackしても_creatorは0x00000000000000000000000... ハマったこと4
Goで取得したイベント内容 indexedの場合、Topicsを確認 ハマったこと4
Goで取得したイベント内容 ①: 定義したイベントをKeccak256で求めたハッシュ値 crypto.Keccak256Hash("RoomCreated(address,address,uint256)") ②: indexedがついているフィールド値をKeccak256で求めたハッシュ値 common.BytesToAddress(event.Topics[1].Bytes()) ->
_creatorのアドレス ハマったこと4 ① ②
これ以外にもハマったこと たくさんあったのですが、、、T-T 実は、、、
Session01 DApps開発で悩んだこと Session02 DApps開発でハマったこと Session03 まとめ
Go言語でのDApps開発はあり(最初大変だったけど!) コントラクトですべてのデータを持つ必要はない(と思う!) データベースとの組み合わせも良い選択肢である(はず!) もっともっと良いもの作っていきましょう:D まとめ
ご清聴ありがとうございました