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
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
130
パブリックチェーンとプライベートチェーン
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
きのこカンファレンス2026_肩書きを外したとき私は誰か
yamasatimi
1
100
CVE-2026-20833_脆弱性対応とAES 化について
jukishiya
0
290
WebGIS AI Agentの紹介
_shimizu
0
600
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.3k
LiDAR SLAMの実装とセンサ融合 ~Lie群からContinuous-Time LIOまで~
naokiakai
1
160
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
610
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
290
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
620
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
1
460
從開發到部署全都交給 AI:實作 AI 驅動的自動化流程
appleboy
0
190
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8.2k
Featured
See All Featured
Done Done
chrislema
186
16k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Being A Developer After 40
akosma
91
590k
Facilitating Awesome Meetings
lara
57
7k
Documentation Writing (for coders)
carmenintech
77
5.4k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
Everyday Curiosity
cassininazir
0
240
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Building Applications with DynamoDB
mza
96
7.1k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
260
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
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サーバーにしてこそブロックチェーン。 まとめ