SlideShare a Scribd company logo
1 of 109
你全家都區塊鍊
你才區塊鍊
Fred Chien (錢逢祥)
Block Chain
區塊鏈
Fred Chain
錢逢祥
Fred Chain
錢逢祥
Fred Chain
錢逢祥
Chien
你才區塊鏈!
你和照片上
長得不一樣
我知道。
LXDE
cfsghost At Github
cfsghost@gmail.com
你才區塊鍊,你全家都區塊鍊
警告
本場聽到的都是老技術,極無聊
警告
你如果已經懂區塊鏈,其實可以考慮去另一場
區塊鏈?鍊?
Blockchain?
滿滿的 Buzzword 一次滿足
去中心化、加密、匿名化、貨幣、Fintech、IoT ...
到底什麼是區塊鏈?
區塊。鏈
我們如何自幹一條?
Make one by ourself
當然要土炮啊
No Framework
很難?
Is it difficult ?
難的不是區塊鏈本身
而是各種演算法
各種不同的加強方法、手段
滿足不同應用
其實
某種程度來說
前端更難好嗎!
Front-end is more difficult than blockchain
你才區塊鍊,你全家都區塊鍊
區塊鏈?
Chain
程式怎麼記錄一串資料?
陣列
DATA DATA DATA DATA DATA DATA DATA
ALLOCATE MEMORY THE ONCE
let blocks = new Array(7)
放入資料到資料串
你會怎麼做?
blocks.push('New Data')
實際上能這麼簡單做到嗎?
以系統角度來看的話
當然不行
已配置 Memory 空間怎麼能隨意變更大小
高階程式語言使用者常會忘記的事
程式怎麼描述一串資料?
還記得 Linked-list 怎麼做嗎?
慣 C 的基本功
Data Pointer
Data Block
LINKED LIST
Data Block
LINKED LIST
Data Block Data Block
Memory Address
NULL
APPEND TO LINKED LIST
Data Block Data Block Data Block
LINKED LIST
Data Block Data Block
NULL
LINKED LIST
Data Block Data Block
PREPEND TO LINKED LIST
Data Block Data Block Data Block
REPLACE
Data Block Data Block
Data Block
New Address
想像一下有份日誌資料庫
用 Linked List 儲存每一筆事件資訊
資產日誌
慘兮兮的資產
+1000
-1000
-1000
+1000
-1000
-1000
-1000
-1000
+1000
總資產 -6000
刪除負資產
Linked List 如何做?
+1000
-1000
-1000
+1000
-1000
-1000
-1000
-1000
+1000
-6000
+1000
+1000 +1000
+3000
到這裡
你其實已經掌握了 Chain 的基本原理
下一步
Next Step
讓 Linked List 走出一台電腦
讓多台機器共同維護一個鏈
1
2
3
Node B
1
2
3
Node C
1
2
3
Node A
Problems
● 確保不同節點上的資料一樣
● Data Block 的識別
○ 電腦記憶體位置不可靠、無法通用於跨機器環境
● 確保 Data Block 順序不可變
● 如何讓不同機器相互同步資料
● 如何在鏈上新增資料,然後解決衝突問題
如何確保兩地的資料一樣?
還記得什麼是 checksum、hash 嗎?
DATA DATA
DATA DATA
checksum
AB123CDA7D44C...
checksum
AB123CDA7D44C...
DATA DATA
checksum
AB123CDA7D44C...
checksum
AB123CDA7D44C...
推導各種 Hash 演算法
就不多說了,你會用 crypto API 就夠了
你才區塊鍊,你全家都區塊鍊
function calcHash(data) {
return crypto.createHmac('sha256', 'fredchain')
.update(data)
.digest('hex');
}
你才區塊鍊,你全家都區塊鍊
如何識別 Data Block ?
同樣用 Hash 方法
改用 Hash 描述前後關係
Block 紀錄前一個 Block 內容的 Hash
PREPEND TO LINKED LIST
Data Block Data Block Data Block
INVERSE
DataBlockDataBlockDataBlock
STORE PREVIOUS HASH
Data Block Data Block Data Block
Previous Hash Previous Hash
你才區塊鍊,你全家都區塊鍊
確保順序不可變
把前一個 Block 的 Hash 當作自己的一部份
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash:
prev: ABC1D2E3...
data: JSDC--
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 9E2DCB67...
prev: ABC1D2E3...
data: JSDC--
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 9E2DCB67...
prev: ABC1D2E3...
data: JSDC--
block
hash: D8A82BC1...
prev: 9E2DCB67...
data: HA HA HA
block
如果有個 Block 被修改了
或是被替換掉了
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 9E2DCB67...
prev: ABC1D2E3...
data: JSDC--
block
hash: D8A82BC1...
prev: 9E2DCB67...
data: HA HA HA
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 9E2DCB67...
prev: ABC1D2E3...
data: JJDC
block
hash: D8A82BC1...
prev: 9E2DCB67...
data: HA HA HA
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 112233BBA...
prev: ABC1D2E3...
data: JJDC
block
hash: D8A82BC1...
prev: 9E2DCB67...
data: HA HA HA
block
hash: ABC1D2E3...
prev: 0
data: JSDC++
block
hash: 112233BBA...
prev: ABC1D2E3...
data: JJDC
block
hash: D8A82BC1...
prev: 9E2DCB67...
data: HA HA HA
block
註:如果這條鏈越長,想要偽造鏈,就得花更多 CPU 去重算所有 Block
Genesis Block
創世區塊
function generateBlock(prevBlock, data) {
let prevHash = prevBlock ? prevBlock.hash : 0;
return {
hash: calcHash(prevBlock.hash + data),
prev: prevBlock.hash,
data: data
};
}
// Create a chain
let blockChains = [];
// Genesis block
let genesisBlock = generateBlock(NULL, 'XDDDDD');
// Append to chain
blockChains.push(genesisBlock);
More Blocks
更多區塊
// Get last block of chain
let lastBlock = blockChains[blockChains.length - 1];
// Append to chain
blockChains.push(generateBlock(lastBlock, 'Block 1'));
重複著這個步驟
你會得到更多 Blocks
你得到了 Block + Chain
區塊 + 鏈
你才區塊鍊,你全家都區塊鍊
讓不同機器間同步
怎麼做?
應該不用我多講了。
P2P Networking
去中心化的做法
Node A
Node B
Node C Node D
做台訊息交換機也行
協助節點找到對方
EXCHANGE
Node A
Node D
Node B
Node C
你才區塊鍊,你全家都區塊鍊
純中心化做法來驗證也行
如果你真的無法 P2P 直接來
你才區塊鍊,你全家都區塊鍊
最後個問題來了
最困難的部分
如何新增 Block ?
到所有節點
Node
Node
Broadcast
Verify
Verify
Verify
Verify
Verify
Verify
Verify
Verify
當然不會這簡單而已
用 Hash 檢查整條鏈的正確性
function verifyBlock(prevBlock, block) {
// block should have the hash of previous block
if (prevBlock.hash !== block.prev) {
return false;
}
// Check the hash of block
let hash = calcHash(prevBlock.hash + block.data);
if (block.hash !== hash) {
return false;
}
return true;
}
你的 Repo 每天在 Conflict
不同人因為同時增加 Code 而相互間衝突
Chain 也會 Conflict
不同節點因為同時增加 Block 導致鏈相互間衝突
怎麼解決衝突?
Consensus 機制很重要,也是關鍵
Consensus
共識
好的共識機制上天堂
不好的就下地獄
節點投票
簡單來說
Vote
等整個 Network 投票?這效率。。。
如果有惡意節點呢?
造成多個分支競爭
最簡單的做法
比長短
守規矩的節點輕鬆,想鬧事的人要自己 產生所有 Block 的新 Hash
更多共識方法
PoW、PoS、Ripple、xBFT
你才區塊鍊,你全家都區塊鍊
更多玩法
加密、簽章、塞程式碼進去。。。
創造更多應用
貨幣、智慧合約、IoT 驗證機制、帳本。。。
區塊鏈
老技術重新組合
但講真的
真的講真的
有很多現成的 Framework
沒必要自幹所有東西
Just for fun
:-)
Thanks

More Related Content

More from Fred Chien

我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binaryFred Chien
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發Fred Chien
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式Fred Chien
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Fred Chien
 
Enjoy Writing Modern Desktop Application in JavaScript
Enjoy Writing Modern Desktop Application in JavaScriptEnjoy Writing Modern Desktop Application in JavaScript
Enjoy Writing Modern Desktop Application in JavaScriptFred Chien
 
軟體人甘苦談
軟體人甘苦談軟體人甘苦談
軟體人甘苦談Fred Chien
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web FrameworkFred Chien
 
Let s Enjoy Node.js
Let s Enjoy Node.jsLet s Enjoy Node.js
Let s Enjoy Node.jsFred Chien
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js ModuleFred Chien
 

More from Fred Chien (10)

我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary我編譯故我在:誰說 Node.js 程式不能編成 binary
我編譯故我在:誰說 Node.js 程式不能編成 binary
 
Node.js 進攻桌面開發
Node.js 進攻桌面開發Node.js 進攻桌面開發
Node.js 進攻桌面開發
 
App house
App houseApp house
App house
 
用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式用最潮的 Java script 盡情開發 kde qt 程式
用最潮的 Java script 盡情開發 kde qt 程式
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!
 
Enjoy Writing Modern Desktop Application in JavaScript
Enjoy Writing Modern Desktop Application in JavaScriptEnjoy Writing Modern Desktop Application in JavaScript
Enjoy Writing Modern Desktop Application in JavaScript
 
軟體人甘苦談
軟體人甘苦談軟體人甘苦談
軟體人甘苦談
 
Non-MVC Web Framework
Non-MVC Web FrameworkNon-MVC Web Framework
Non-MVC Web Framework
 
Let s Enjoy Node.js
Let s Enjoy Node.jsLet s Enjoy Node.js
Let s Enjoy Node.js
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
 

Recently uploaded

SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxNCU MCL
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLPJamie (Taka) Wang
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_patternJamie (Taka) Wang
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven designJamie (Taka) Wang
 

Recently uploaded (9)

20161027 - edge part2
20161027 - edge part220161027 - edge part2
20161027 - edge part2
 
20200226 - AI Overview
20200226 - AI Overview20200226 - AI Overview
20200226 - AI Overview
 
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP
 
20151111 - IoT Sync Up
20151111 - IoT Sync Up20151111 - IoT Sync Up
20151111 - IoT Sync Up
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_pattern
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven design
 
20200323 - AI Intro
20200323 - AI Intro20200323 - AI Intro
20200323 - AI Intro
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 

你才區塊鍊,你全家都區塊鍊