Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DAppsを支えるバックエンド開発の話
Search
jkcomment
November 10, 2018
Technology
2
920
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
MLflowダイエット大作戦
lycorptech_jp
PRO
1
130
大企業でもできる!ボトムアップで拡大させるプラットフォームの作り方
findy_eventslides
1
790
RAG/Agent開発のアップデートまとめ
taka0709
0
180
30分であなたをOmniのファンにしてみせます~分析画面のクリック操作をそのままコード化できるAI-ReadyなBIツール~
sagara
0
150
Fashion×AI「似合う」を届けるためのWEARのAI戦略
zozotech
PRO
2
650
【AWS re:Invent 2025速報】AIビルダー向けアップデートをまとめて解説!
minorun365
4
520
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
140
ChatGPTで論⽂は読めるのか
spatial_ai_network
9
28k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
LLM-Readyなデータ基盤を高速に構築するためのアジャイルデータモデリングの実例
kashira
0
250
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
720
因果AIへの招待
sshimizu2006
0
980
Featured
See All Featured
KATA
mclloyd
PRO
33
15k
Side Projects
sachag
455
43k
Typedesign – Prime Four
hannesfritz
42
2.9k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Six Lessons from altMBA
skipperchong
29
4.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.3k
[SF Ruby Conf 2025] Rails X
palkan
0
520
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
For a Future-Friendly Web
brad_frost
180
10k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.5k
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 まとめ
ご清聴ありがとうございました