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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
いっしー
July 19, 2018
Technology
85
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
130
暗号
issy
0
130
パブリックチェーンとプライベートチェーン
issy
0
120
blockchain_scalability
issy
0
130
blockchain_kyoto_14
issy
0
120
blockchain_kyoto_13
issy
0
130
blockchain_kyoto_12
issy
0
150
blockchain勉強会_11.pdf
issy
0
190
Blockchain Kyoto #7 〜ブロックチェーン関連で読んだ本紹介〜
issy
0
170
Other Decks in Technology
See All in Technology
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
3
930
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
2
2.1k
振り返りこそエンジニアの本領
negima
0
260
AI活用の現在地、 ちゃんと見えてますか?/XPfest-2026
visional_engineering_and_design
0
130
bet_ai_day_2026_session02
agenticsec
1
910
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
140
はじめてのDatabricks:技術者向けワークショップ / beginner-workshop
databricksjapan
PRO
0
140
作り直せるコードは迅速に 作り直せないDBは慎重に - AI時代のプロダクトエンジニアが「判断の不可逆性」で開発速度を変える話
kinosuke01
0
190
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
1
190
設計の世代交代を乗り越える、14年続くAndroidアプリの開発戦略
sansantech
PRO
1
120
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
340
いかに伝えるか 〜新卒エンジニアの教育のための、ライトノベル活用の一例
ikedon
1
190
Featured
See All Featured
Scaling GitHub
holman
464
140k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
840
Chasing Engaging Ingredients in Design
codingconduct
0
300
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Embracing the Ebb and Flow
colly
88
5.2k
Building AI with AI
inesmontani
PRO
1
1.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Between Models and Reality
mayunak
4
450
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サーバーにしてこそブロックチェーン。 まとめ