📙
Learning Bitcoin Core
bitcoincore reviewsEdit
  • 📙 [TH] การมีส่วนร่วมใน Bitcoin Core ( Github )
    • [EN] Contributing to Bitcoin Core ( Github )
  • คำนำอย่างละเอียดถึงการพัฒนา Bitcoin Core ( Jimmy Song )
  • การมีส่วนร่วมใน Bitcoin Core ประสบการณ์ส่วนตัว ( John Newbery )
  • การเข้าร่วมพัฒนา Bitcoin Core ( Amiti Uttarwar )
  • How to Review Pull Requests in Bitcoin Core ( Jon Atack )
  • ความเข้าใจด้านเทคนิคของ Bitcoin ( Pierre Rochard )
  • ภาษาพื้นฐานใน Bitcoin Core 👾💬🤖
  • RPC หรือ Remote Procedure Call 🏦🌐⚙️
  • PSBT / Mining & Nonce / SHA-256 📦🎲#️⃣
  • Candidate Block / Chain Tip / Merkle Root / GBT & Stratum Protocol / SPV Client 🎰⛓️🤿🫚📱
  • OP_ ต่างๆ / Bitcoin Script / Hash Preimage / BOLT / Taproot / Eltoo / STARK / ZKP 📜⚡️🐺🌳
  • ลักษณะของ VAULT เมื่อเป็นผลิตภัณฑ์ 🏦🔏🗝️⏳
  • การแก้แค้นของ Junior Developer❤️‍🔥🐦‍⬛💻
Powered by GitBook
On this page
  • Chain Tip: ประวัติและจุดประสงค์
  • ทำไมต้องมี Merkle Root
  • GBT (getblocktemplate) Protocol
  • Stratum Protocol
  • SPV Client คืออะไร และย่อมาจากอะไร

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 ปัจจุบัน

  1. โหนดเชื่อมต่อกับเครือข่าย P2P และติดตามบล็อกล่าสุด (chain tip)

  2. เมื่อมีบล็อกใหม่ถูกยืนยัน โหนดจะอัปเดต 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

  1. แปลงรายการ TX (coinbase + transactions[]) เป็น hash 32-ไบต์แต่ละรายการ

  2. สร้างต้นไม้ Merkle:

  • จับคู่อินพุตสองรายการแล้ว hash ซ้ำ จนเหลือ root เดียว

  1. ค่า 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 ให้ฮาร์ดแวร์ขุด

  1. ซอฟต์แวร์ขุด (เช่น BFGMiner, CGMiner) รับ template และ header จาก getblocktemplate

  2. ส่ง header + target threshold ไปยังฮาร์ดแวร์ ASIC/GPU/CPU ผ่าน Stratum หรือ GBT protocol .

  3. ฮาร์ดแวร์ทำการ brute-force ค่า nonce (และ extra nonce) เพื่อหา hash < target .

## 8. อัปเดต Candidate Block เมื่อ Chain เปลี่ยน

  • ทุกครั้งที่โหนดในเครือข่ายยอมรับบล็อกใหม่ โหนดขุดจะรับ longpollid แจ้งเตือน ทำให้ Miner เรียก getblocktemplate ใหม่ทันที เพื่อสร้าง Candidate Block บน Chain Tip ล่าสุด .

## บทสรุป

  1. ตรวจสอบ Chain Tip → 2. RPC getblocktemplate → 3. คัดเลือก TX จาก mempool → 4. สร้าง Coinbase TX → 5. คำนวณ Merkle Root → 6. ประกอบ Block Header → 7. ส่งให้ฮาร์ดแวร์ขุด → 8. อัปเดตเมื่อ Chain เปลี่ยน

  2. เครื่องมือหลักคือ bitcoind + RPC getblocktemplate ตาม BIP-22/BIP-23 .

  3. 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: ประวัติและจุดประสงค์

คำนิยาม

  1. Chain tip คือบล็อกที่อยู่ปลายสุดของสายหลัก (main chain) ซึ่งมี cumulative Proof-of-Work สูงสุด ถูกเรียกว่า “best (tip) block”

  2. คำสั่ง 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

  1. การรวมธุรกรรม: Merkle tree ช่วยจัดโครงสร้างธุรกรรมในบล็อกให้สร้างเป็น tree ของแฮช

  2. ประสิทธิภาพการพิสูจน์: SPV clients สามารถดาวน์โหลดเฉพาะ header + Merkle branch เพื่อยืนยันว่า TX อยู่ในบล็อก โดยไม่ต้องโหลดเต็มบล็อก

  3. ลดขนาดข้อมูล: แทนที่จะบันทึกรายการ 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)

  1. BIP-22 กำหนดเมธอด RPC getblocktemplate สำหรับดึง JSON block template จาก node

  2. BIP-23 (2012-02-28) ขยายความสามารถ GBT ให้รองรับ longpoll, block proposals และ mutations ต่างๆ

  3. 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

ประวัติและที่มา

  1. Getwork ไม่ scalable: เมื่อ network hashrate โตขึ้น getwork เริ่มกิน bandwidth มากเกินไปทั้งฝั่ง miner และ pool

  2. Slush Pool (2010) โดย Marek “Slush” Palatinus จึงพัฒนา Stratum V1 (2012) เพื่อแก้ไขจุดอ่อนของ getwork ด้วยการลด overhead และใช้ push-based updates

  3. 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 เพิ่มเติม

อ้างอิง

  1. getbestblockhash — RPC: Returns hash of the best (tip) block

  2. getchaintips — RPC: Information about known chain tips

  3. Glossary: Block chain, best chain definition

  4. Bitcoin Whitepaper: Proof-of-Work and chain selection

  5. Merkle tree – Wikipedia

  6. Block Chain – Bitcoin Developer Guide: Merkle root & header chaining

  7. Glossary: Merkle root definition

  8. Blockchain – Wikipedia: Block vs. Merkle root

  9. BIP-22: getblocktemplate specification

  10. BIP-23: getblocktemplate pooled mining extensions

  11. GitHub doc: BIP-22 implemented since v0.7.0, BIP-23 since v0.10.0

  12. Slush Pool: History of Stratum V1 development

  13. 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…” .

หลักการทำงานเบื้องต้น

  1. ดาวน์โหลดบล็อกเฮดเดอร์: SPV client เก็บเฉพาะ header (80 ไบต์ต่อบล็อก) ของสายหลักทั้งหมด ตั้งแต่ genesis จนถึง chain tip ปัจจุบัน .

  2. สมัคร Bloom Filter (BIP37): ลูกค้าส่ง filterload ไปยัง full node เพื่อกำหนดว่าต้องการธุรกรรมแบบใด (e.g. ที่อยู่ของผู้ใช้) .

  3. รับ Merkle Block: full node จะส่ง Merkle block—ประกอบด้วย header + Merkle branches ที่พิสูจน์ inclusion ของ transaction ในบล็อกนั้น ๆ .

  4. ตรวจสอบ 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 รูปแบบอื่น ๆ ให้เลือกตามความต้องการใช้งาน

PreviousPSBT / Mining & Nonce / SHA-256 📦🎲#️⃣NextOP_ ต่างๆ / Bitcoin Script / Hash Preimage / BOLT / Taproot / Eltoo / STARK / ZKP 📜⚡️🐺🌳

Last updated 27 days ago