ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
ဒီ lesson က Intermediate/Advanced chapter တွေမှာ သင်ခဲ့တဲ့ consensus, pow-pos, wallets, keys concept တွေကို ပေါင်းစပ်ပြီး self-test လုပ်တဲ့ practice set ဖြစ်ပါတယ်။ Exercise 1 ထက် တစ်ဆင့်တက်ပြီး function ရေးခြင်း၊ security property စစ်ဆေးခြင်းလို task တွေ ပါလာပါတယ်။ New teaching မရှိပါဘူး — Mini Blockchain Project မှာ တည်ဆောက်ခဲ့တဲ့ code base ကို reference ယူပြီး ကိုယ်တိုင်ထပ်ရေးကြည့်ရမှာ ဖြစ်ပါတယ်။
လေ့ကျင့်ခန်းများ
Task 1 — block သုံးခုပါတဲ့ chain array (mock data) ကို ပေးထားမယ်ဆိုပါစို့၊ isChainValid(chain) function ကို scratch ကနေ ကိုယ်တိုင်ရေးပြီး hash + previousHash link နှစ်ခုလုံးကို စစ်ပါ။ Task 2 — chain[1] ရဲ့ data ကိုပဲ tamper လုပ်ပြီး (hash field ကို မထိဘဲ) isChainValid() က false ပြန်ပေးမလား စမ်းကြည့်ပါ။ Task 3 — mineBlock(difficulty) function ကို parameter အနေနဲ့ difficulty လက်ခံအောင် ပြင်ပြီး difficulty 2 နဲ့ 4 ကြား mining time ကွာခြားချက်ကို console.time() နဲ့ တိုင်းကြည့်ပါ။ Task 4 — crypto.generateKeyPairSync() နဲ့ key pair တစ်စုံ ထုတ်ပြီး message string တစ်ခုကို private key နဲ့ sign လုပ်ကာ public key နဲ့ ပြန် verify လုပ်ကြည့်ပါ။
Code နမူနာ
const crypto = require('crypto');
// Mock chain (Task 1-2 အတွက်)
const chain = [
{ index: 0, data: 'Genesis Block', previousHash: '0', hash: 'abc0...' },
{ index: 1, data: 'Tx: A->B 10', previousHash: 'abc0...', hash: 'abc1...' },
{ index: 2, data: 'Tx: B->C 5', previousHash: 'abc1...', hash: 'abc2...' },
];
function calculateHash(block) {
return crypto
.createHash('sha256')
.update(block.index + block.previousHash + block.data)
.digest('hex');
}
// Task 1: isChainValid() ကို scratch ကနေ ကိုယ်တိုင်ရေးပါ
function isChainValid(chain) {
// TODO: for loop နဲ့ hash + previousHash link နှစ်ခုလုံး စစ်ပါ
}
// Task 2: chain[1].data ကို tamper လုပ်ပြီး isChainValid() ပြန်ခေါ်ကြည့်ပါ
// Task 3: mineBlock(block, difficulty) function ကို difficulty parameter ပါအောင် ရေးပြီး
// console.time('mine-2') / console.timeEnd('mine-2') နဲ့ difficulty 2 vs 4 timing ယှဉ်ပါ
// Task 4: key pair generate လုပ်ပြီး message sign & verify practice
const { generateKeyPairSync, sign, verify } = crypto;
// TODO: generateKeyPairSync('ec', { namedCurve: 'secp256k1', ... }) နဲ့ sign/verify ကို ကိုယ်တိုင်ပြီးအောင်ရေးပါ
Task 1-2 ပြီးရင် tamper မလုပ်ခင် true, tamper လုပ်ပြီးရင် false ဆိုတဲ့ boolean နှစ်ခု၊ Task 3 ပြီးရင် difficulty အလိုက် mining time (ms) နှစ်ခု၊ Task 4 ပြီးရင် signature verify result true ကို terminal ထဲမှာ မြင်ရပါလိမ့်မယ်။၅ မိနစ် စမ်းကြည့်
Task 3 ရဲ့ difficulty ကို 5 အထိ ထပ်တိုးပြီး mining time ဘယ်လောက်ထိ ရုတ်တရက်များလာလဲ 5 မိနစ်အတွင်း စမ်းကြည့်ပြီး exponential growth pattern ကို သတိထားကြည့်ပါ။
သတိလေးတစ်ချက်
Task 2 ကို လုပ်တဲ့အခါ data field ကိုပဲ ပြောင်းပြီး hash field ကို လက်ဖြင့် ပြန်မပြင်ဖို့ သတိထားပါ — hash field ကိုပါ ပြင်လိုက်ရင် tamper detection logic ကို အမှန်တကယ် test မလုပ်ရာရောက်ပါဘူး။