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
Blockchain Kyoto #5 〜web上でブロックチェーン実装した〜
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
いっしー
July 19, 2018
Technology
82
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Blockchain Kyoto #5 〜web上でブロックチェーン実装した〜
いっしー
July 19, 2018
More Decks by いっしー
See All by いっしー
準同型暗号
issy
0
120
暗号
issy
0
120
パブリックチェーンとプライベートチェーン
issy
0
110
blockchain_scalability
issy
0
110
blockchain_kyoto_14
issy
0
110
blockchain_kyoto_13
issy
0
130
blockchain_kyoto_12
issy
0
140
blockchain勉強会_11.pdf
issy
0
180
Blockchain Kyoto #7 〜ブロックチェーン関連で読んだ本紹介〜
issy
0
160
Other Decks in Technology
See All in Technology
そのPoC、何を検証したつもりでしたか? AIプロダクトの価値検証で陥った落とし穴
techtekt
PRO
0
150
JJUG CCC 2026 Spring AI時代の開発こそ標準化を武器に! ― 方式・プロセス・プラットフォームの標準化
s27watanabe
2
720
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
50k
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/3 - 2026/5
oracle4engineer
PRO
1
190
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development
yoshidashingo
1
370
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
380
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
110
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
550
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
Unlocking the Apps
pimterry
0
230
Featured
See All Featured
Leo the Paperboy
mayatellez
7
1.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
160
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
We Have a Design System, Now What?
morganepeng
55
8.2k
Bash Introduction
62gerente
615
210k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Design in an AI World
tapps
1
220
Transcript
Blockchain勉強会 in Kyoto #5 「jsでブロックチェーンを実装した話」 2018/07/19 石野隼伍
作りながら理解を深める ɾブロックの生成 ɾブロックの受け渡し ɾブロックチェーンの管理 ↓参考にしました。 200行のコードへのブロックチェーンの実装 | POSTD IUUQTQPTUEDDBCMPDLDIBJOJOMJOFTPGDPEF ブロックチェーンの一通りを実感できるものを作る。
ϑΟʔϧυ໊ આ໌ Version ιϑτΣΞʗϓϩτίϧόʔδϣϯ൪߸ Previous Block Hash ϒϩοΫͷϋογϡ Merkle Root
ϒϩοΫͷશτϥϯβΫγϣϯʹର͢ΔϚʔΫϧπϦʔͷϧʔτϋογϡ Timestamp ϒϩοΫͷੜ࣌ࠁʢUnix࣌ؒʣ Difficulty Target ϒϩοΫͷੜ࣌ͷproof of workͷdiffuculty Nonce proof of workͰ༻͍ΔΧϯλ ビットコインのブロック構造 ϑΟʔϧυ໊ આ໌ Block Size ͜ͷ࣍ͷϑΟʔϧυ͔ΒϒϩοΫͷ࠷ޙ·ͰͷσʔλαΠζʢόΠτ୯Ґʣ Block Header Լͷද Transaction Counter ϒϩοΫʹؚ·ΕΔτϥϯβΫγϣϯ Transactions ϒϩοΫʹه͞ΕΔτϥϯβΫγϣϯͷϦετ ◦ブロックの構造 ◦ブロックヘッダの構造
実装したブロックの構造 hashは上記4つを文字連結させてsha256に入れる。 hashの先頭1文字が0になるようにnonceを調整する。 previous hash timestamp data nonce
ジェネシスブロック hashは 0fcf0642caa46c65b68363111e0f088cfdf942a22d2cb66b92ef1a562f1cd395
ブロックチェーン
ブロックの受け渡し ɾ他のノードと接ଓする。 ɾsocket.ioを使いました(疑似P2P)。
ブロックをもらう Node1 Node2 hashは◦◦です。 hashは△△です。 △△ ☓☓ □□ 〇〇 ▪▪
ɾ ɾ ɾ 〇〇 ▪▪ ɾ ɾ ɾ 一番上のブロック のハッシュ
ブロックをもらう Node1 Node2 hashは◦◦です。 hashは△△です。 ʓʓ࣋ͬͯΔ ˚˚࣋ͬͯ ͳ͍ △△ ☓☓
□□ 〇〇 ▪▪ ɾ ɾ ɾ 〇〇 ▪▪ ɾ ɾ ɾ
ブロックをもらう Node1 Node2 hashは◦◦です。 hashは△△です。 ʓʓ࣋ͬͯΔ ˚˚࣋ͬͯ ͳ͍ △△ ☓☓
□□ 〇〇 ▪▪ ɾ ɾ ɾ 〇〇 ▪▪ ɾ ɾ ɾ □□、☓☓、△△が足りてないよ
ブロックをもらう Node1 Node2 hashは◦◦です。 hashは△△です。 △△ ☓☓ □□ 〇〇 ▪▪
ɾ ɾ ɾ それください! □□ ☓☓ △△ △△ ☓☓ □□ 〇〇 ▪▪ ɾ ɾ ɾ □□、☓☓、△△が足りてないよ
ブロックチェーンの管理 これでチェーンも更新できるし万事OK?
ブロックチェーンの管理 分岐した時どうするんやろ?
ブロック構造変更 blocks[newBlock.hash] = { block: { previousHash: newBlock.previousHash, timestamp: newBlock.timestamp,
data: newBlock.data, nonce: newBlock.nonce }, index: previousBlock.index + 1 } blockchain = [] blockchain.push(newBlock.hash)
orphans[newBlock.hash] = { previousHash: newBlock.previousHash, timestamp: newBlock.timestamp, data: newBlock.data, nonce:
newBlock.nonce } ブロック構造変更
ブロックの更新 if (timestampが数値じゃない) { return } else if (hashの先頭1文字が「0」じゃない) {
return } if (previousHashのブロックが存在する) { blocks配列に入れる。 } else { orphans配列に入れる。 }
ブロックの更新 if (previousHashのブロックが存在する) { blocks配列に入れる。 if (indexがチェーンの長さより大きい) { 新しいブロックからhashを辿ってチェーン配列に格納されている ブロックまでを特定して入れ替える。
} } new これらはblocks配列にある→
ブロックの更新 ブロックを追加するたびにオーファンブロックを確認して、 previousHashのブロックが手元にདྷたら オーファンから移動させる。
分岐にも対応できた。 ここでちょっとデモ。 分岐にも対応できた。
ɾtimestampが役に立ってない。 ɾdifficultyの調整がブロックチェーンをtimestampサーバにする。 ɾtimestampサーバーにしてこそブロックチェーン。 まとめ