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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
いっしー
July 19, 2018
Technology
83
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
110
blockchain_scalability
issy
0
120
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
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
210
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
240
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
TypeScript入門 2026
recruitengineers
PRO
3
560
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
200
JavaScript 研修 (2026)
recruitengineers
PRO
2
520
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
1
1.2k
Pavlokで始める電撃駆動開発
sgrsn
0
190
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
0
150
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
700
ハーレムエンジニアリング
kazuma777777
0
130
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
460
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
450
Exploring anti-patterns in Rails
aemeredith
3
460
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
From π to Pie charts
rasagy
0
270
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Believing is Seeing
oripsolob
1
190
Ethics towards AI in product and experience design
skipperchong
2
340
What's in a price? How to price your products and services
michaelherold
247
13k
Darren the Foodie - Storyboard
khoart
PRO
3
3.6k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
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サーバーにしてこそブロックチェーン。 まとめ