Candidate Block / Chain Tip / Merkle Root / GBT & Stratum Protocol / SPV Client 🎰⛓️🤿🫚📱
อธิบายโดย : ChatGPT
👤 : อธิบายลำดับขั้นตอนในการเกิด Candidate Block
💬 : สรุปภาพรวม
การสร้าง Candidate Block ในระบบ Bitcoin เกิดขึ้นบนโหนด (node) ของ Miner โดยอาศัยข้อมูลจาก mempool และ chain tip ปัจจุบัน ผ่าน RPC เช่น getblocktemplate เพื่อให้ Miner สามารถคัดเลือกธุรกรรม สร้าง coinbase transaction คำนวณ Merkle root และประกอบ Block Header ก่อนส่งให้ฮาร์ดแวร์ (ASIC/GPU/CPU) ขุดหาค่า nonce ที่ทำให้ SHA256(SHA256(header)) ต่ำกว่า target .
## 1. ตรวจสอบ Chain Tip ปัจจุบัน
โหนดเชื่อมต่อกับเครือข่าย P2P และติดตามบล็อกล่าสุด (chain tip)
เมื่อมีบล็อกใหม่ถูกยืนยัน โหนดจะอัปเดต chain tip และ “ยกเลิก” candidate block เก่าที่กำลังสร้างอยู่ เพื่อสร้างใหม่บน chain tip ใหม่ทันที .
## 2. เรียก RPC
getblocktemplate
Miner หรือซอฟต์แวร์ขุดจะส่งคำสั่ง RPC getblocktemplate ไปยัง bitcoind เพื่อดึง Block Template หรือ Candidate Block กลับมา .
getblocktemplate ปฏิบัติตามมาตรฐาน BIP-22/BIP-23 ซึ่งระบุรูปแบบ JSON request และ response ให้ Miner ควบคุมกฎ (rules) เช่น “segwit” ได้ .
ผลลัพธ์ที่ได้จะประกอบด้วย
previousblockhash
transactions[] รายการธุรกรรมจาก mempool พร้อมข้อมูล UTXO, scriptPubKey, fee ฯลฯ
coinbaseaux, coinbasevalue (subsidy + fees)
longpollid สำหรับ Long Polling เมื่อมีบล็อกใหม่
target, bits, height, curtime ฯลฯ .
## 3. คัดเลือกธุรกรรมจาก Mempool
Bitcoin Core จะจัดเรียงธุรกรรมตาม Ancestor Feerate (fee per virtual byte รวมการพึ่งพา) เพื่อเพิ่มรายได้สูงสุดให้ Miner .
Miner สามารถปรับแต่งการเลือกเองได้ เช่น กรองเฉพาะ transactions ที่มี fee ≥ X sats/vB .
บาง Miner อาจเริ่มขุดด้วย Empty Block (มีเฉพาะ coinbase) ขณะรอคำนวณชุดธุรกรรมที่เหมาะสม .
## 4. สร้าง Coinbase Transaction
Coinbase TX เป็นธุรกรรมแรกสุดในบล็อก จ่ายรางวัลให้ Miner:
Block subsidy (e.g., 3.125 BTC ณ ปัจจุบัน)
Transaction fees จาก transactions อื่น ๆ
Miner ระบุ output script ให้จ่ายเหรียญไปยัง address ของตนเอง (หรือไปยัง pool) .
ข้อมูลนี้ถูกส่งมาใน coinbaseaux และ coinbasevalue ของ response จาก getblocktemplate .
## 5. คำนวณ Merkle Root
แปลงรายการ TX (coinbase + transactions[]) เป็น hash 32-ไบต์แต่ละรายการ
สร้างต้นไม้ Merkle:
จับคู่อินพุตสองรายการแล้ว hash ซ้ำ จนเหลือ root เดียว
ค่า Merkle root นี้จะถูกใส่ใน Block Header .
## 6. ประกอบ Block Header
Block Header 80 ไบต์ ประกอบด้วย :
4 bytes version
32 bytes previous_block_hash
32 bytes merkle_root
4 bytes timestamp (curtime)
4 bytes bits (target difficulty compact)
4 bytes nonce (เริ่มต้นที่ 0 หรือค่า extra nonce จาก coinbase)
Miner อาจปรับฟิลด์ timestamp เล็กน้อย และใช้ extra nonce ใน coinbase เพื่อขยายช่วงการทดลอง .
## 7. ส่ง Candidate Block ให้ฮาร์ดแวร์ขุด
ซอฟต์แวร์ขุด (เช่น BFGMiner, CGMiner) รับ template และ header จาก getblocktemplate
ส่ง header + target threshold ไปยังฮาร์ดแวร์ ASIC/GPU/CPU ผ่าน Stratum หรือ GBT protocol .
ฮาร์ดแวร์ทำการ brute-force ค่า nonce (และ extra nonce) เพื่อหา hash < target .
## 8. อัปเดต Candidate Block เมื่อ Chain เปลี่ยน
ทุกครั้งที่โหนดในเครือข่ายยอมรับบล็อกใหม่ โหนดขุดจะรับ longpollid แจ้งเตือน ทำให้ Miner เรียก getblocktemplate ใหม่ทันที เพื่อสร้าง Candidate Block บน Chain Tip ล่าสุด .
## บทสรุป
ตรวจสอบ Chain Tip → 2. RPC getblocktemplate → 3. คัดเลือก TX จาก mempool → 4. สร้าง Coinbase TX → 5. คำนวณ Merkle Root → 6. ประกอบ Block Header → 7. ส่งให้ฮาร์ดแวร์ขุด → 8. อัปเดตเมื่อ Chain เปลี่ยน
เครื่องมือหลักคือ bitcoind + RPC getblocktemplate ตาม BIP-22/BIP-23 .
Miner สามารถปรับแต่ง selection logic, timestamp, extra nonce และใช้ Stratum เพื่อเชื่อมต่อกับ ASIC ได้ .
👤 : - ขยายความ chain tip ประวัติ จุดประสงค์
- Merkle root มีไว้ทำไม ต่างจาก hash ของ block อย่างไร
- ขยายความ stratum และ gbt protocol ประวัติ เหตุผล ที่มา ที่ไป ความสำคัญ
💬 : ก่อนลงรายละเอียด ขอสรุปสาระสำคัญให้เข้าใจภาพรวมก่อน:
สรุป:
Chain tip คือบล็อกล่าสุด (tip) ของ “สายหลัก” ที่มี cumulative Proof-of-Work สูงสุด ใช้เป็นจุดอ้างอิงเพื่อสร้างบล็อกถัดไปและยืนยันสถานะเครือข่าย
Merkle root คือค่าแฮชรากของ Merkle tree ที่จัดการธุรกรรมในบล็อก ช่วยตรวจสอบความถูกต้องของรายการธุรกรรมอย่างมีประสิทธิภาพ ต่างจาก block hash ที่คำนวณจาก header ทั้งหมด (รวม Merkle root, prev_hash, timestamp, nonce ฯลฯ)
โพรโทคอล getblocktemplate (GBT) ตาม BIP-22/BIP-23 ถูกออกแบบให้โหนดสร้าง block template ให้ miners ดึงข้อมูลไปขุด จัดการค่า longpolling และ block proposal
Stratum (พัฒนาโดย Slush Pool) เป็นโปรโตคอลขุดแบบ pooled-mining ที่ปรับปรุงจาก getwork/GBT ด้วยการลด overhead, push-based updates และรองรับการขยายตัวของเครือข่ายได้ดีขึ้น
Chain Tip: ประวัติและจุดประสงค์
คำนิยาม
Chain tip คือบล็อกที่อยู่ปลายสุดของสายหลัก (main chain) ซึ่งมี cumulative Proof-of-Work สูงสุด ถูกเรียกว่า “best (tip) block”
คำสั่ง RPC getchaintips จะแสดงข้อมูลทุกกิ่ง (forks) ที่โหนดรู้จัก โดยสถานะ “active” คือ chain tip หลัก
ประวัติและเหตุผล
แนวคิด “longest chain wins” มาจาก Whitepaper ของ Satoshi ซึ่งกำหนดให้เครือข่ายใช้ cumulative PoW ในการเลือกสายหลัก เพื่อป้องกันการโจมตี 51%
Chain tip จึงเป็นตัวชี้วัดสถานะล่าสุดของเครือข่าย ใช้เป็น previous_block_hash เมื่อสร้าง block ต่อไป ลดโอกาสเกิด chain splits และรักษาความปลอดภัยของ consensus
Merkle Root: ทำไมถึงต้องมี และต่างจาก Block Hash อย่างไร
ทำไมต้องมี Merkle Root
การรวมธุรกรรม: Merkle tree ช่วยจัดโครงสร้างธุรกรรมในบล็อกให้สร้างเป็น tree ของแฮช
ประสิทธิภาพการพิสูจน์: SPV clients สามารถดาวน์โหลดเฉพาะ header + Merkle branch เพื่อยืนยันว่า TX อยู่ในบล็อก โดยไม่ต้องโหลดเต็มบล็อก
ลดขนาดข้อมูล: แทนที่จะบันทึกรายการ TX ทั้งหมดใน header แค่ใส่ Merkle root 32 ไบต์ก็เพียงพอ
แตกต่างจาก Block Hash
Merkle root คำนวณจากรายการธุรกรรมทั้งหมดในบล็อก
Block hash (SHA256(SHA256(header))) คำนวณจาก header ทั้งหมด ซึ่งประกอบด้วย version, prev_block_hash, merkle_root, timestamp, bits, nonce
หากเปลี่ยนแปลงรายการธุรกรรมใดๆ จะกระทบ Merkle root และสุดท้ายกระทบ Block hash ด้วย จึงรับประกันความสมบูรณ์ของข้อมูลทั้งบล็อก
GBT (getblocktemplate) Protocol
ประวัติ (BIP-22 / BIP-23)
BIP-22 กำหนดเมธอด RPC getblocktemplate สำหรับดึง JSON block template จาก node
BIP-23 (2012-02-28) ขยายความสามารถ GBT ให้รองรับ longpoll, block proposals และ mutations ต่างๆ
Bitcoin Core เริ่มรองรับ GBT ตั้งแต่ v0.7.0 และเพิ่ม BIP-23 extensions ใน v0.10.0rc1
เหตุผลและความสำคัญ
ทำให้ miner/ซอฟต์แวร์ขุด (เช่น CGMiner, Stratum servers) เลือกธุรกรรม, ตั้งค่า coinbase, longpoll และ propose block ได้ผ่าน RPC เดียว
เปลี่ยนจาก getwork (HTTP, inefficient) มาใช้ JSON-RPC แบบ standardized ลดการนำเข้า full blocks ซ้ำ ๆ และเพิ่มความยืดหยุ่น
Stratum Protocol
ประวัติและที่มา
Getwork ไม่ scalable: เมื่อ network hashrate โตขึ้น getwork เริ่มกิน bandwidth มากเกินไปทั้งฝั่ง miner และ pool
Slush Pool (2010) โดย Marek “Slush” Palatinus จึงพัฒนา Stratum V1 (2012) เพื่อแก้ไขจุดอ่อนของ getwork ด้วยการลด overhead และใช้ push-based updates
Stratum V1 ไม่มี BIP อย่างเป็นทางการ แต่กลายเป็น de facto standard ของ pooled mining
ทำงานอย่างไรและความสำคัญ
Push updates: Pool ส่ง block template / work update ให้ miner ทันที ไม่ต้อง poll ซ้ำบ่อย
Shares: Miner ส่ง shares ไปยัง pool ตาม target ที่ pool กำหนด ลดขนาดข้อมูลที่แลกเปลี่ยน
รองรับ scale: ผ่านการพิสูจน์มาแล้วจาก network ที่เติบโตจาก TH/s → EH/s โดยใช้ Stratum V1 เป็นหลัก
Stratum V2
ออกแบบใหม่ให้ decentralized, secure, efficient กว่าเดิม
แทนที่ GBT/BIP-22 ด้วย Template Distribution Protocol ที่รองรับ push-based, two-step mining (block-after-next) และ metadata เพิ่มเติม
อ้างอิง
getbestblockhash — RPC: Returns hash of the best (tip) block
getchaintips — RPC: Information about known chain tips
Glossary: Block chain, best chain definition
Bitcoin Whitepaper: Proof-of-Work and chain selection
Merkle tree – Wikipedia
Block Chain – Bitcoin Developer Guide: Merkle root & header chaining
Glossary: Merkle root definition
Blockchain – Wikipedia: Block vs. Merkle root
BIP-22: getblocktemplate specification
BIP-23: getblocktemplate pooled mining extensions
GitHub doc: BIP-22 implemented since v0.7.0, BIP-23 since v0.10.0
Slush Pool: History of Stratum V1 development
Stratum V2 spec: Template Distribution Protocol
👤 : - SPV Client คืออะไร ย่อมาจากอะไร มี Client อย่างอื่นอีกไหม
💬 : สรุปภาพรวม
SPV (Simplified Payment Verification) คือโหมดการทำงานของ lightweight client ที่ไม่ดาวน์โหลดบล็อกเต็มหรือรักษา UTXO set แต่ดึงเฉพาะ “บล็อกเฮดเดอร์” ทั้งหมดและขอ Merkle proof จาก full node เพื่อยืนยันว่าธุรกรรมของตนอยู่ในบล็อกจริงตามสายหลัก โดยอาศัยสมมติฐานว่าผู้ขุดจะไม่สร้างบล็อกที่มีธุรกรรมไม่ถูกต้อง SPV client จึงตรวจสอบการมีอยู่ของธุรกรรมในบล็อกได้อย่างปลอดภัยและใช้ข้อมูลเพียงเล็กน้อย เหมาะกับอุปกรณ์ประสิทธิภาพต่ำหรือมีแบนด์วิดท์จำกัด
SPV Client คืออะไร และย่อมาจากอะไร
คำนิย่อมาจากอะไร
SPV ย่อมาจาก Simplified Payment Verification .
แนวคิดนี้ถูกระบุใน Whitepaper ของ Satoshi ว่า “It is possible to verify payments without running a full network node…” .
หลักการทำงานเบื้องต้น
ดาวน์โหลดบล็อกเฮดเดอร์: SPV client เก็บเฉพาะ header (80 ไบต์ต่อบล็อก) ของสายหลักทั้งหมด ตั้งแต่ genesis จนถึง chain tip ปัจจุบัน .
สมัคร Bloom Filter (BIP37): ลูกค้าส่ง filterload ไปยัง full node เพื่อกำหนดว่าต้องการธุรกรรมแบบใด (e.g. ที่อยู่ของผู้ใช้) .
รับ Merkle Block: full node จะส่ง Merkle block—ประกอบด้วย header + Merkle branches ที่พิสูจน์ inclusion ของ transaction ในบล็อกนั้น ๆ .
ตรวจสอบ inclusion proof: SPV client คำนวณ Merkle root จาก branch และเปรียบเทียบกับค่าใน header เพื่อยืนยันว่า TX นั้นถูกบันทึกจริง .
ข้อดี–ข้อจำกัด
ข้อดี: ประหยัดแบนด์วิดท์และพื้นที่จัดเก็บ แพลตฟอร์มต่ำแรมก็รันได้ รวดเร็วกว่า full node .
ข้อจำกัด: ต้อง ไว้วางใจ full node ว่าจะส่งข้อมูลไม่ผิดปกติ และ SPV ไม่ตรวจสอบ validity ของบล็อกเอง (เช่น UTXO หรือ double spend) .
ตัวอย่าง SPV Clients
Electrum: เบอร์ต้น ๆ ของ SPV wallet บนเดสก์ท็อปและมือถือ ริเริ่มปี 2011 ใช้ Python + Qt .
BitcoinJ: Java library สำหรับ Android และ desktop ที่รองรับ BIP37 Bloom filters .
Bitcoin Wallet (Android), Breadwallet, Edge ฯลฯ—หลายมือถือใช้ SPV model เพื่อตั้งค่ารวดเร็วและปลอดภัยบนฮาร์ดแวร์จำกัด .
Client ประเภทอื่นในระบบ Bitcoin
Full Node
ดาวน์โหลดและตรวจสอบ เต็มรูปแบบ ทุกบล็อกและธุรกรรม รักษา UTXO set ด้วยตนเอง ไม่ต้องไว้วางใจใคร .
Pruned Node
รักษาเฮดเดอร์ทั้งหมดและบล็อกล่าสุดเพียงบางส่วน (เช่น 550 MB สุดท้าย) ใช้พื้นที่น้อยกว่า full node แต่ยังตรวจสอบ consensus rules เต็มรูป .
Archive Node
เก็บข้อมูลบล็อกทั้งหมด (มากกว่า 400 GB) ใช้สำหรับสืบค้นย้อนหลังหรือบริการ API ให้ third parties .
Light Clients อื่น ๆ
BIP158 Compact Block Filters: รุ่นใหม่กว่า Bloom filter ลด false positive และเพิ่ม privacy .
ElectrumX, Neutrino (สำหรับ Lightning Network) อาศัยแนวทาง SPV แต่ปรับปรุง privacy และ efficiency .
สรุป:
SPV client คือวิธี ยืนยันการมีอยู่ ของธุรกรรมโดยไม่ต้องประมวลผลบล็อกเต็ม ตอบโจทย์อุปกรณ์จำกัดทรัพยากร ใช้แค่บล็อกเฮดเดอร์และ Merkle proof แต่ต้องไว้วางใจ full node มีตัวอย่างหลักคือ Electrum, BitcoinJ เป็นต้น นอกจาก SPV ยังมี full node, pruned node, archive node และ light client รูปแบบอื่น ๆ ให้เลือกตามความต้องการใช้งาน
Last updated