Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Blockchain Kyoto #5 〜web上でブロックチェーン実装した〜
Search
いっしー
July 19, 2018
Technology
86
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
140
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
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
260
GitHub Agentic Workflows を触ってみる
htkym
2
890
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
180
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
200
20260930_Gemma4_Hands-on
tsho
0
180
Making AI Agents Safe and Fast- Jev, Obsidian, and the Meta-Harness
x5gtrn
PRO
0
170
猫でもわかるKiro Web
kentapapa
1
160
TiDBファミリーにDWHが新登場!! TiDB最新情報 / TiDB update 202609
yoshiakiyamasaki
0
160
Terraformを用いたJamf Pro構成のIaC, GitOps化への挑戦
yukun
0
120
The seven pitfalls of AI (revised version)
ufried
0
150
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
790
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
leveragestech
PRO
0
120
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Optimising Largest Contentful Paint
csswizardry
37
4k
The SEO identity crisis: Don't let AI make you average
varn
0
560
We Are The Robots
honzajavorek
0
380
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
The Pragmatic Product Professional
lauravandoore
37
7.5k
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サーバーにしてこそブロックチェーン。 まとめ