Thuta Learning
ရှာဖွေရန်
ExercisesSecurityadvanced

Blockchain အလေ့အကျင့် — အတွဲ ၂ (Chain Validation & Proof-of-Work)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Blockchain အလေ့အကျင့် — အတွဲ ၂ (Chain Validation & Proof-of-Work) ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ 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 နမူနာ

javascript
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 ကို ကိုယ်တိုင်ပြီးအောင်ရေးပါ
You should see
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 မလုပ်ရာရောက်ပါဘူး။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • isChainValid() ရေးတဲ့အခါ chain[0] (genesis block) ကို i=0 ကနေ loop စလိုက်လို့ previousHash === chain[-1].hash ဆိုတဲ့ error/undefined ဖြစ်တတ်ခြင်း (i=1 ကနေ စသင့်ပါတယ်)
  • sign/verify task မှာ private key နဲ့ sign ထားတဲ့ message string နဲ့ verify အချိန် သုံးတဲ့ message string မတူညီအောင် (whitespace/typo) ရေးမိလို့ verify result false အမှား ထွက်လာခြင်း

အခု ကိုယ်တိုင် စမ်းကြည့်

Task 3 ရဲ့ difficulty ကို 5 အထိ ထပ်တိုးပြီး mining time ဘယ်လောက်ထိ ရုတ်တရက်များလာလဲ 5 မိနစ်အတွင်း စမ်းကြည့်ပြီး exponential growth pattern ကို သတိထားကြည့်ပါ။

You'll know it worked when: Task 1-2 ပြီးရင် tamper မလုပ်ခင် true, tamper လုပ်ပြီးရင် false ဆိုတဲ့ boolean နှစ်ခု၊ Task 3 ပြီးရင် difficulty အလိုက် mining time (ms) နှစ်ခု၊ Task 4 ပြီးရင် signature verify result true ကို terminal ထဲမှာ မြင်ရပါလိမ့်မယ်။

Blockchain အလေ့အကျင့် — အတွဲ ၂ (Chain Validation & Proof-of-Work) | Thuta Learning