RPC หรือ Remote Procedure Call 🏦🌐⚙️
อธิบายโดย : Claude 3.7 Sonnet / source : https://bitcoincore.org/en/doc/29.0.0/
RPC หรือ Remote Procedure Call เป็นโพรโทคอลที่ใช้ในการเรียกฟังก์ชันหรือกระบวนการทำงานระหว่างคอมพิวเตอร์ที่แตกต่างกันผ่านเครือข่าย ในบริบทของ Bitcoin Core นี้ RPC เป็นวิธีหลักในการโต้ตอบกับ Bitcoin node
ในกรณีของ Bitcoin Core 29.0.0:
RPC ช่วยให้คุณสามารถควบคุมและสื่อสารกับ Bitcoin node ได้โดยการส่งคำสั่งผ่านอินเตอร์เฟซ
คุณสามารถใช้คำสั่ง RPC เพื่อ:
ดูข้อมูลบล็อกเชน (เช่น ตรวจสอบข้อมูลบล็อก, ธุรกรรม)
ควบคุมการทำงานของโหนด
สร้างและจัดการกระเป๋าเงิน (wallets)
ทำเหมืองขุด (mining)
จัดการการเชื่อมต่อเครือข่าย
และอื่นๆ ตามหมวดหมู่ที่แสดงในเมนูทางขวา
หากคุณสนใจเป็น contributor ให้กับ Bitcoin Core คุณสามารถ:
เริ่มต้นด้วยการทำความเข้าใจ codebase:
ศึกษาเอกสารในเว็บไซต์ Bitcoin Core
ดูโค้ดที่ GitHub repository: https://github.com/bitcoin/bitcoin
ทดลองใช้งาน RPC commands เพื่อให้เข้าใจการทำงาน
มีส่วนร่วมในชุมชน:
ติดตามการพัฒนาผ่าน Mailing lists
เข้าร่วม IRC channels
ดู issues และ pull requests ที่เปิดอยู่
เริ่มงานจากประเด็นพื้นฐานก่อน เช่น การปรับปรุงเอกสาร การรายงานบั๊ก หรือการทดสอบ
เมื่อคุณเข้าใจระบบมากขึ้น คุณสามารถเริ่มทำงานบน pull requests ที่มีความซับซ้อนมากขึ้น
การทำความเข้าใจระบบ RPC ของ Bitcoin Core เป็นก้าวสำคัญสำหรับทุกคนที่ต้องการมีส่วนร่วมในการพัฒนา เพราะเป็นส่วนสำคัญในการโต้ตอบกับโหนด Bitcoin
คำสั่งเหล่านี้เป็นคำสั่ง RPC ใน
กลุ่ม BLOCKCHAIN
ของ Bitcoin Core ซึ่งใช้สำหรับโต้ตอบกับบล็อกเชนของ Bitcoin โดยแต่ละคำสั่งมีหน้าที่ดังนี้:
dumptxoutset - สร้างไฟล์ดัมพ์ของสถานะ UTXO (Unspent Transaction Output) ปัจจุบัน
getbestblockhash - แสดงแฮชของบล็อกที่ดีที่สุดในเชนปัจจุบัน (บล็อกล่าสุดบนเชนหลัก)
getblock - รับข้อมูลของบล็อกที่ระบุด้วยแฮชบล็อก
getblockchaininfo - แสดงข้อมูลเกี่ยวกับสถานะปัจจุบันของบล็อกเชน
getblockcount - แสดงจำนวนบล็อกในเชนหลัก
getblockfilter - รับ BIP157 Content Filter สำหรับบล็อกที่ระบุ
getblockfrompeer - ร้องขอบล็อกจาก peer ที่ระบุ
getblockhash - รับแฮชของบล็อกที่ความสูงที่ระบุในเชนหลัก
getblockheader - รับ header ของบล็อกที่ระบุด้วยแฮชบล็อก
getblockstats - รับสถิติเกี่ยวกับบล็อกที่ระบุด้วยแฮชหรือความสูง
getchaintips - แสดงข้อมูลเกี่ยวกับปลายเชนทั้งหมดที่รู้จัก
getchainstates - แสดงข้อมูลเกี่ยวกับสถานะเชนทั้งหมดที่รู้จัก
getchaintxstats - รับสถิติเกี่ยวกับธุรกรรมในบล็อกเชน
getdeploymentinfo - แสดงสถานะของ deployment softfork
getdescriptoractivity - แสดงข้อมูลการใช้งาน descriptor
getdifficulty - แสดงความยากในการขุดปัจจุบัน
getmempoolancestors - รับธุรกรรมทั้งหมดที่เป็นต้นตระกูล (ancestors) ของธุรกรรมในเมมพูล
getmempooldescendants - รับธุรกรรมทั้งหมดที่เป็นลูกหลาน (descendants) ของธุรกรรมในเมมพูล
getmempoolentry - รับข้อมูลของธุรกรรมที่ระบุในเมมพูล
getmempoolinfo - แสดงข้อมูลเกี่ยวกับสถานะปัจจุบันของเมมพูล
getrawmempool - แสดงธุรกรรมทั้งหมดในเมมพูล
gettxout - รับข้อมูลของ UTXO ที่ระบุ
gettxoutproof - รับหลักฐานว่าธุรกรรมมีอยู่ในบล็อก
gettxoutsetinfo - แสดงสถิติเกี่ยวกับชุด UTXO ทั้งหมด
gettxspendingprevout - รับสถานะการใช้จ่ายของ outpoints
importmempool - นำเข้าข้อมูลเมมพูลจากไฟล์
loadtxoutset - โหลดข้อมูล UTXO จากไฟล์ดัมพ์
preciousblock - กำหนดให้บล็อกมีความสำคัญสูงกว่าในการคำนวณเชนหลัก
pruneblockchain - ตัดบล็อกเก่าจนถึงเวลาที่ระบุ
savemempool - บันทึกข้อมูลเมมพูลไปยังดิสก์
scanblocks - สแกนบล็อกเพื่อหาธุรกรรมที่เกี่ยวข้องกับ descriptors ที่ระบุ
scantxoutset - สแกนชุด UTXO ทั้งหมดเพื่อหาเอาต์พุตที่เกี่ยวข้องกับ descriptors ที่ระบุ
verifychain - ตรวจสอบความถูกต้องของบล็อกเชน
verifytxoutproof - ตรวจสอบหลักฐานธุรกรรมและคืนค่า txid
คำสั่งเหล่านี้ไม่มีลำดับตายตัวในการใช้งาน เนื่องจากคุณสามารถเรียกใช้แต่ละคำสั่งได้อย่างอิสระตามความต้องการ แต่ในการทำงานจริง อาจมีการใช้งานร่วมกันตามลำดับขั้นตอนเพื่อการวิเคราะห์หรือจัดการบล็อกเชน เช่น:
ใช้
getblockcount
เพื่อดูความสูงปัจจุบัน แล้วใช้getblockhash
เพื่อรับแฮชของบล็อก จากนั้นใช้getblock
เพื่อดูรายละเอียดของบล็อกนั้นใช้
getmempoolinfo
ก่อนใช้getrawmempool
เพื่อดูธุรกรรมทั้งหมดในเมมพูล
คำสั่งเหล่านี้สำคัญสำหรับผู้ที่ต้องการติดตาม วิเคราะห์ หรือดูแลโหนด Bitcoin Core
ต่อไปนี้คือหน้าที่ของแต่ละคำสั่ง RPC แยกตามกลุ่ม:
กลุ่ม CONTROL
คำสั่งสำหรับควบคุมการทำงานของโหนด Bitcoin Core:
getmemoryinfo - แสดงข้อมูลการใช้หน่วยความจำของโหนด
getrpcinfo - แสดงข้อมูลเกี่ยวกับการเชื่อมต่อ RPC ที่ใช้งานอยู่
help - แสดงข้อความช่วยเหลือสำหรับคำสั่ง RPC
logging - จัดการระดับการบันทึกข้อมูล (logging) สำหรับรายการต่างๆ
stop - หยุดการทำงานของ Bitcoin Core
uptime - แสดงเวลาที่โหนดทำงานอย่างต่อเนื่อง
กลุ่ม MINING
คำสั่งสำหรับการทำเหมืองขุด Bitcoin:
getblocktemplate - รับข้อมูลที่จำเป็นสำหรับการสร้างบล็อกใหม่
getmininginfo - แสดงข้อมูลทั่วไปเกี่ยวกับการขุด
getnetworkhashps - แสดงอัตราการแฮชของเครือข่าย (hashrate)
getprioritisedtransactions - แสดงธุรกรรมที่ได้รับการจัดลำดับความสำคัญสูง
prioritisetransaction - เพิ่มลำดับความสำคัญให้กับธุรกรรมสำหรับการขุด
submitblock - ส่งบล็อกที่ขุดได้ไปยังเครือข่าย
submitheader - ส่งส่วนหัวบล็อกไปยังเครือข่าย
กลุ่ม NETWORK
คำสั่งสำหรับจัดการเครือข่ายของ Bitcoin:
addnode - เพิ่มโหนดเพื่อเชื่อมต่อ
clearbanned - ล้างรายการโหนดที่ถูกแบน
disconnectnode - ตัดการเชื่อมต่อกับโหนดที่ระบุ
getaddednodeinfo - แสดงข้อมูลเกี่ยวกับโหนดที่เพิ่มด้วยคำสั่ง addnode
getaddrmaininfo - แสดงข้อมูลที่อยู่ในเครือข่าย
getconnectioncount - แสดงจำนวนการเชื่อมต่อกับโหนดอื่น
getnettotals - แสดงสถิติเครือข่ายทั้งหมด
getnetworkinfo - แสดงข้อมูลเกี่ยวกับสถานะเครือข่าย
getnodeaddresses - แสดงที่อยู่ที่รู้จักในเครือข่าย
getpeerinfo - แสดงข้อมูลเกี่ยวกับโหนดที่เชื่อมต่ออยู่
listbanned - แสดงรายการโหนดที่ถูกแบน
ping - ส่งคำสั่ง ping ไปยังโหนดอื่นทั้งหมดที่เชื่อมต่ออยู่
setban - แบนหรือยกเลิกการแบนโหนด
setnetworkactive - เปิดหรือปิดการทำงานของเครือข่าย
คำสั่งเหล่านี้แบ่งตามหมวดหมู่การใช้งาน โดยแต่ละกลุ่มมีวัตถุประสงค์เฉพาะ:
กลุ่ม CONTROL ใช้สำหรับจัดการโหนด Bitcoin Core โดยตรง
กลุ่ม MINING ใช้สำหรับการทำเหมืองขุดและจัดการธุรกรรมที่จะรวมในบล็อก
กลุ่ม NETWORK ใช้สำหรับจัดการการเชื่อมต่อเครือข่าย P2P ของ Bitcoin
เช่นเดียวกับกลุ่ม BLOCKCHAIN ก่อนหน้านี้ คำสั่งเหล่านี้ไม่มีลำดับตายตัวในการใช้งาน แต่จะใช้ตามความต้องการและสถานการณ์
กลุ่ม RAWTRANSACTIONS
คำสั่งสำหรับจัดการกับธุรกรรมดิบ (raw transactions) ซึ่งเป็นการทำงานในระดับต่ำกับธุรกรรม Bitcoin:
analyzepsbt - วิเคราะห์และให้ข้อมูลเกี่ยวกับ PSBT (Partially Signed Bitcoin Transaction)
combinepsbt - รวม PSBT หลายรายการเข้าด้วยกัน
combinerawtransaction - รวม raw transactions ที่ลงนามแล้วหลายรายการเข้าด้วยกัน
converttopsbt - แปลง raw transaction เป็นรูปแบบ PSBT
createpsbt - สร้าง PSBT ใหม่ (ไม่ลงนาม)
createrawtransaction - สร้าง raw transaction ใหม่ (ไม่ลงนาม)
decodepsbt - แปลงข้อมูล PSBT เป็นรูปแบบที่อ่านได้
decoderawtransaction - แปลงข้อมูล raw transaction เป็นรูปแบบที่อ่านได้
decodescript - แปลง Bitcoin script เป็นรูปแบบที่อ่านได้
descriptorprocesspsbt - ประมวลผล PSBT ด้วย descriptors
finalizepsbt - ตรวจสอบว่า PSBT พร้อมที่จะลงนามหรือพร้อมส่งหรือไม่
fundrawtransaction - เพิ่มอินพุตให้กับ raw transaction เพื่อให้ครอบคลุมค่าใช้จ่าย
getrawtransaction - รับธุรกรรมดิบตาม txid
joinpsbts - รวม PSBT ที่ไม่เกี่ยวข้องกันเข้าด้วยกันเป็นธุรกรรมเดียว
sendrawtransaction - ส่ง raw transaction ที่ลงนามแล้วไปยังเครือข่าย
signrawtransactionwithkey - ลงนาม raw transaction ด้วยคีย์ส่วนตัว
submitpackage - ส่งกลุ่มธุรกรรมที่เกี่ยวข้องกันไปยังเครือข่าย
testmempoolaccept - ตรวจสอบว่าธุรกรรมสามารถยอมรับในเมมพูลได้หรือไม่
utxoupdatepsbt - อัปเดตข้อมูล UTXO ใน PSBT
กลุ่ม SIGNER
คำสั่งสำหรับจัดการกับการลงนาม:
enumeratesigners - แสดงรายการอุปกรณ์ลงนามที่สามารถใช้ได้
กลุ่ม UTIL
คำสั่งอรรถประโยชน์ทั่วไป:
createmultisig - สร้างที่อยู่ multisignature
deriveaddresses - สร้างที่อยู่จาก output descriptor
estimatesmartfee - ประมาณค่าธรรมเนียมที่ต้องการสำหรับการยืนยันภายในจำนวนบล็อกที่กำหนด
getdescriptorinfo - วิเคราะห์ descriptor และแสดงข้อมูลเกี่ยวกับมัน
getindexinfo - แสดงข้อมูลเกี่ยวกับดัชนี
signmessagewithprivkey - ลงนามข้อความด้วยคีย์ส่วนตัว
validateaddress - ตรวจสอบความถูกต้องของที่อยู่ Bitcoin
verifymessage - ตรวจสอบข้อความที่ลงนามแล้ว
คำสั่งเหล่านี้มีความซับซ้อนทางเทคนิคสูงขึ้น โดยเฉพาะในกลุ่ม RAWTRANSACTIONS ซึ่งใช้สำหรับการจัดการธุรกรรมในระดับต่ำ:
กลุ่ม RAWTRANSACTIONS มักใช้โดยนักพัฒนาหรือผู้ใช้ที่ต้องการสร้าง ตรวจสอบ หรือลงนามธุรกรรมแบบแมนนวล
กลุ่ม SIGNER มีเพียงคำสั่งเดียวสำหรับการทำงานกับอุปกรณ์ลงนามภายนอก
กลุ่ม UTIL ประกอบด้วยเครื่องมือที่มีประโยชน์สำหรับการทำงานกับที่อยู่ ค่าธรรมเนียม และการตรวจสอบความถูกต้อง
ในโลกแห่งการพัฒนา Bitcoin Core และแอปพลิเคชันที่เกี่ยวข้อง คำสั่งเหล่านี้มีความสำคัญสำหรับการทำงานกับธุรกรรมในระดับต่ำและการพัฒนาเครื่องมือที่สามารถเชื่อมต่อกับ Bitcoin Core ได้อย่างมีประสิทธิภาพ
คำสั่ง RPC ในส่วน WALLET ของ Bitcoin Core ทำหน้าที่จัดการกับกระเป๋าเงิน (wallet) โดยแต่ละคำสั่งมีหน้าที่เฉพาะดังนี้:
abandontransaction - ยกเลิกธุรกรรมที่ยังไม่ถูกยืนยัน เพื่อให้สามารถใช้เหรียญเหล่านั้นในธุรกรรมอื่นได้
abortrescan - หยุดกระบวนการสแกนกระเป๋าเงินที่กำลังดำเนินอยู่
addmultisigaddress - สร้างที่อยู่แบบ multi-signature ซึ่งต้องการลายเซ็นหลายคนในการอนุมัติธุรกรรม
backupwallet - สำรองข้อมูลกระเป๋าเงินไปยังไฟล์ที่ระบุ
bumpfee - เพิ่มค่าธรรมเนียมให้กับธุรกรรมที่ยังไม่ถูกยืนยัน เพื่อเร่งการทำธุรกรรม
createwallet - สร้างกระเป๋าเงินใหม่
createwalletdescriptor - สร้างกระเป๋าเงินแบบ descriptor-based
dumpprivkey - แสดงคีย์ส่วนตัวของที่อยู่ที่ระบุ
dumpwallet - บันทึกข้อมูลคีย์ทั้งหมดในกระเป๋าเงินไปยังไฟล์
encryptwallet - เข้ารหัสกระเป๋าเงินด้วยรหัสผ่าน
getaddressesbylabel - แสดงที่อยู่ทั้งหมดที่มี label ตามที่ระบุ
getaddressinfo - แสดงข้อมูลของที่อยู่ที่ระบุโดยละเอียด
getbalance - แสดงยอดคงเหลือในกระเป๋าเงิน
getbalances - แสดงยอดคงเหลือแยกตามประเภท
gethdkeys - แสดงข้อมูล HD keychain
getnewaddress - สร้างที่อยู่ใหม่สำหรับรับเงิน
getrawchangeaddress - สร้างที่อยู่ใหม่สำหรับเงินทอน
getreceivedbyaddress - แสดงจำนวนเงินที่ได้รับที่ที่อยู่ที่ระบุ
getreceivedbylabel - แสดงจำนวนเงินที่ได้รับโดย label ที่ระบุ
gettransaction - แสดงข้อมูลธุรกรรมโดยละเอียด
getunconfirmedbalance - แสดงยอดคงเหลือที่ยังไม่ได้รับการยืนยัน
getwalletinfo - แสดงข้อมูลทั่วไปของกระเป๋าเงิน
importaddress - นำเข้าที่อยู่หรือ script เพื่อติดตาม
importdescriptors - นำเข้า descriptor
importmulti - นำเข้าข้อมูลหลายรายการพร้อมกัน
importprivkey - นำเข้าคีย์ส่วนตัว
importprunedfunds - นำเข้าธุรกรรมที่ถูกตัดทอน
importpubkey - นำเข้าคีย์สาธารณะ
importwallet - นำเข้าข้อมูลกระเป๋าเงินจากไฟล์
keypoolrefill - เติม keypool ใหม่
listaddressgroupings - แสดงรายการกลุ่มที่อยู่
listdescriptors - แสดงรายการ descriptors ทั้งหมด
listlabels - แสดงรายการ labels ทั้งหมด
listlockunspent - แสดงรายการเงินที่ถูกล็อคไว้
listreceivedbyaddress - แสดงรายการเงินที่ได้รับแยกตามที่อยู่
listreceivedbylabel - แสดงรายการเงินที่ได้รับแยกตาม label
listsinceblock - แสดงธุรกรรมทั้งหมดที่เกิดขึ้นตั้งแต่บล็อกที่ระบุ
listtransactions - แสดงรายการธุรกรรมล่าสุดในกระเป๋าเงิน
listunspent - แสดงรายการเหรียญที่ยังไม่ถูกใช้ (UTXO) ในกระเป๋าเงิน
listwalletdir - แสดงรายการกระเป๋าเงินที่อยู่ในไดเร็กทอรี wallet
listwallets - แสดงรายการกระเป๋าเงินที่โหลดอยู่ในขณะนี้
loadwallet - โหลดกระเป๋าเงินที่มีอยู่
lockunspent - ล็อคหรือปลดล็อคเหรียญที่ระบุไม่ให้ถูกใช้ในธุรกรรม
migratewallet - อัพเกรดรูปแบบกระเป๋าเงินเก่าเป็นรูปแบบใหม่
newkeypool - สร้าง keypool ใหม่
psbtbumpfee - เพิ่มค่าธรรมเนียมให้กับธุรกรรมที่ใช้ PSBT (Partially Signed Bitcoin Transaction)
removeprunedfunds - ลบธุรกรรมที่ถูกตัดทอนออกจากกระเป๋าเงิน
rescanblockchain - สแกนบล็อกเชนใหม่เพื่อหาธุรกรรมที่เกี่ยวข้องกับกระเป๋าเงิน
restorewallet - กู้คืนกระเป๋าเงินจากไฟล์สำรอง
send - ส่ง Bitcoin ไปยังที่อยู่ปลายทาง (รูปแบบใหม่)
sendall - ส่งทั้งหมดหรือกลุ่มของเหรียญไปยังที่อยู่
sendmany - ส่ง Bitcoin ไปยังหลายที่อยู่พร้อมกัน
sendtoaddress - ส่ง Bitcoin ไปยังที่อยู่เดียว
sethdseed - ตั้งค่า HD seed สำหรับกระเป๋าเงิน
setlabel - ตั้งค่า label ให้กับที่อยู่
settxfee - ตั้งค่าธรรมเนียมธุรกรรมเริ่มต้น
setwalletflag - เปิด/ปิดธงสถานะของกระเป๋าเงิน
signmessage - เซ็นข้อความด้วยคีย์ส่วนตัวของที่อยู่
signrawtransactionwithwallet - เซ็นธุรกรรมดิบด้วยคีย์จากกระเป๋าเงิน
simulaterawtransaction - จำลองผลลัพธ์ของการดำเนินการธุรกรรมดิบ
unloadwallet - เอากระเป๋าเงินออกจากหน่วยความจำ
upgradewallet - อัพเกรดกระเป๋าเงินเป็นเวอร์ชันล่าสุด
walletcreatefundedpsbt - สร้าง PSBT พร้อมเงินทุน
walletdisplayaddress - แสดงข้อมูลที่อยู่ในรูปแบบที่อ่านง่าย
walletlock - ล็อคกระเป๋าเงินที่เข้ารหัสไว้
walletpassphrase - ปลดล็อคกระเป๋าเงินที่เข้ารหัสเพื่อใช้งาน
walletpassphrasechange - เปลี่ยนรหัสผ่านของกระเป๋าเงิน
walletprocesspsbt - ประมวลผล PSBT
คำสั่งเหล่านี้ไม่มีลำดับการใช้งานที่ตายตัว แต่มีความสัมพันธ์กันตามการใช้งาน โดยทั่วไปจะเริ่มจาก:
การสร้างและตั้งค่ากระเป๋าเงิน (createwallet, encryptwallet)
การจัดการที่อยู่ (getnewaddress, addmultisigaddress)
การตรวจสอบสถานะ (getbalance, getwalletinfo)
การทำธุรกรรม (gettransaction, abandontransaction)
การสำรองและความปลอดภัย (backupwallet, dumpprivkey)
การจัดการกระเป๋าเงิน: createwallet, loadwallet, unloadwallet, upgradewallet, backupwallet, restorewallet
การรักษาความปลอดภัย: encryptwallet, walletlock, walletpassphrase, walletpassphrasechange
การจัดการที่อยู่: getnewaddress, getaddressinfo, setlabel, walletdisplayaddress
การทำธุรกรรม: send, sendall, sendmany, sendtoaddress, settxfee, bumpfee
การสืบค้นและตรวจสอบ: listunspent, listtransactions, listsinceblock, gettransaction
การลงนาม: signmessage, signrawtransactionwithwallet
PSBT (Partially Signed Bitcoin Transaction): walletcreatefundedpsbt, walletprocesspsbt, psbtbumpfee
คำสั่งเหล่านี้จะถูกใช้ตามความต้องการเฉพาะในแต่ละสถานการณ์ ผู้ใช้สามารถเรียกใช้โดยตรงผ่าน bitcoin-cli หรือผ่าน API ในแอปพลิเคชันที่พัฒนา
ส่วน ZMQ (ZeroMQ):
getzmqnotifications - แสดงข้อมูลการแจ้งเตือน ZeroMQ ที่กำลังฟัง
เพิ่มเติม :
RPC getzmqnotifications ใน Bitcoin Core เป็นเครื่องมือสำหรับ ตรวจสอบและดึงข้อมูลการตั้งค่า ZeroMQ notifications ที่กำลังทำงานอยู่ (เช่น pubhashtx, pubrawblock เป็นต้น) ซึ่งช่วยให้ผู้ดูแลระบบหรือโปรแกรมภายนอกสามารถ “ค้นพบ” ว่ามี publisher ใดบ้างที่ node ของตนกำลังส่งข้อความผ่าน ZMQ รวมถึงพารามิเตอร์สำคัญอย่าง high-water mark เพื่อป้องกันการสูญหายของข้อความ . RPC ตัวนี้ถูกเพิ่มเข้ามาใน Bitcoin Core ตั้งแต่เวอร์ชัน 0.17.0 เพื่อรองรับการ introspection และ dynamic integration ของระบบ event-driven ที่ใช้ ZMQ . นับตั้งแต่นั้นมามันก็กลายเป็นมาตรฐานสำคัญสำหรับการพัฒนาไลบรารีหรือเครื่องมือที่ต้องการเชื่อมต่อรับข้อมูลเรียลไทม์จาก bitcoind .
พื้นฐานของ ZeroMQ ใน Bitcoin Core
การใช้งาน ZMQ Notifications
Bitcoin Core รองรับการส่ง notification แบบ publish/subscribe ผ่าน ZeroMQ เพื่อแจ้งเหตุการณ์ต่างๆ เช่น
pubhashtx – เมื่อมีการสร้าง transaction ใหม่
pubrawblock – เมื่อมีการสร้าง block ใหม่
pubhashblock, pubrawtx ฯลฯ . การเปิดใช้งานทำได้ผ่าน startup flags เช่น -zmqpubrawblock=tcp://127.0.0.1:28332 ก่อนสตาร์ท bitcoind .
ปัญหาที่เกิดขึ้นหากไม่มี RPC นี้
หากไม่มี RPC สำหรับดึงสถานะการตั้งค่า ZMQ ก็จะต้องคอยอ่านไฟล์คอนฟิกหรือจับค่า flags ตอนสตาร์ทอย่างเดียว ทำให้:
ไม่สามารถตรวจสอบภายหลังเวลารันไทม์ได้
ไม่รองรับการ integrate แบบไดนามิกในโปรแกรมที่ต้องการตรวจสอบ endpoint ใหม่ๆ โดยอัตโนมัติ
บทบาทและการทำงานของ getzmqnotifications RPC
คำอธิบาย RPC
คำสั่ง: bitcoin-cli getzmqnotifications
ผลลัพธ์: คืนค่าเป็น JSON Array แต่ละรายการเป็น Object ที่มีฟิลด์
type – ประเภทของ notification (เช่น "pubhashtx")
address – URI ของ ZMQ publisher (เช่น "tcp://127.0.0.1:28332")
hwm – (ตั้งแต่ v0.19.0) high-water mark ของ outbound message queue เพื่อควบคุมไม่ให้ล้น buffer .
เวอร์ชันที่รองรับ
RPC นี้มีอยู่ในเอกสารเวอร์ชัน Bitcoin Core ตั้งแต่ 0.17.0 และยังคงใช้งานได้ในเวอร์ชันปัจจุบัน (29.0.0) .
เหตุผลที่ Bitcoin Core ต้องมี RPC นี้
1. Introspection และการ Debug
ช่วยให้ผู้ดูแลระบบหรือสคริปต์สามารถตรวจสอบได้ทันทีว่ามี endpoint ใดบ้างที่ node ของตนกำลังเผยแพร่ข้อความผ่าน ZMQ .
ลดความจำเป็นในการอ่านไฟล์คอนฟิกหรือดู log ตอน startup เพียงแค่เรียก RPC ก็ทราบสถานะปัจจุบันได้เลย .
2. รองรับ Dynamic Integration
ไลบรารีอย่าง bitcoincore-zmq (Rust crate) ใช้ RPC ตัวนี้เพื่อ “addEventListener” แบบไดนามิก โดยไม่ต้อง hard-code endpoint .
โปรแกรมภายนอก (เช่น C/C++ listener) สามารถดึงรายการ notification แล้วเชื่อมต่อ subscriber ตามนั้นโดยอัตโนมัติ .
3. Monitoring และ Performance Tuning
ฟิลด์ hwm ช่วยให้สามารถตรวจสอบและปรับค่า high-water mark ได้ เพื่อหลีกเลี่ยงการสูญหายของข้อความเมื่อ consumer ไม่ทันประมวลผล .
เหมาะกับระบบ high-throughput ที่ต้องการควบคุม buffer usage อย่างใกล้ชิด .
4. ความสอดคล้องระหว่างเวอร์ชัน
ตั้งแต่ Bitcoin Core v0.17.0 เป็นต้นมา RPC นี้ได้รับการดูแลให้ API มีความเสถียรแม้มีการปรับปรุง core library ภายใน .
การเรียก RPC นี้ไม่ต้องส่งพารามิเตอร์ใดๆ และจะคืนค่าทุก notification ที่ถูกตั้งค่าไว้ตอนสตาร์ท bitcoind .
สรุป
RPC getzmqnotifications คือกุญแจสำคัญสำหรับการ introspection, dynamic integration, และ monitoring ของระบบ ZeroMQ notifications ใน Bitcoin Core มันช่วยให้การพัฒนาเครื่องมือภายนอกและการบำรุงรักษา node มีประสิทธิภาพและยืดหยุ่นมากขึ้น โดยไม่ต้องพึ่งการอ่านคอนฟิกหรือการดู log แบบดั้งเดิม .
ZeroMQ (หรือ ØMQ) เป็นไลบรารีสำหรับ asynchronous messaging ที่มีประสิทธิภาพสูง ถูกออกแบบมาเพื่อการใช้งานในระบบกระจายตัว (distributed) และระบบพร้อมกัน (concurrent) . มันให้ API เหมือน Berkeley sockets พร้อมรูปแบบการเชื่อมต่อ (message patterns) ต่างๆ เช่น request-reply, publish-subscribe, push-pull, และ exclusive pair . ZeroMQ ทำงานแบบไร้ตัวกลาง (zero broker) จึงไม่ต้องใช้ message broker แยกต่างหาก . ไลบรารีนี้เริ่มต้นขึ้นในปี 2007 โดย Pieter Hintjens และ Martin Sustrik ภายใต้โครงการ iMatix . ภายหลังโครงการได้มีการพัฒนาต่อยอดด้วยการ Fork เป็น Crossroads I/O, Nanomsg และสร้างพอร์ตภาษาอื่นๆ เช่น JeroMQ สำหรับ Java .
ZeroMQ คืออะไร
คำจำกัดความ
ZeroMQ เป็นไลบรารี asynchronous messaging ที่ออกแบบมาเพื่อ distributed และ concurrent systems .
ให้การสื่อสารผ่าน socket abstraction ที่คล้าย Berkeley sockets และรองรับ transports หลายแบบ เช่น in-process (inproc), inter-process (IPC), TCP, และ multicast .
รองรับรูปแบบการสื่อสาร (messaging patterns) หลัก ได้แก่ request-reply, publish-subscribe, push-pull, และ exclusive pair .
คุณสมบัติหลัก
Brokerless: ด้วยแนวคิด “zero broker” จึงไม่ต้องใช้ message broker ภายนอก ทำให้โครงสร้างเรียบง่ายและลด latency .
ประสิทธิภาพสูง: ปรับแต่งมาเพื่อความเร็วสูงจนสามารถใช้เป็นโครงสร้างพื้นฐานของระบบแบบ clustered products ได้ .
รองรับหลายภาษา: มี third-party bindings สำหรับภาษาโปรแกรมยอดนิยมหลายภาษา เช่น Java ผ่าน JeroMQ, C# ผ่าน NetMQ, Rust ผ่าน zmq.rs ฯลฯ .
ประวัติ
จุดเริ่มต้นและผู้ก่อตั้ง
โดเมน zeromq.org ถูกจดทะเบียนในเดือนพฤษภาคม 2007 โดย Pieter Hintjens ซึ่งเป็น CEO ของ iMatix และร่วมก่อตั้งโครงการกับ Martin Sustrik ในฐานะสถาปนิกและหัวหน้าผู้พัฒนา .
ในวันที่ 30 มีนาคม 2010 Pieter Hintjens ประกาศว่า iMatix จะถอนตัวจากกลุ่ม AMQP และไม่สนับสนุน AMQP 1.0 เพื่อมุ่งเน้นที่ความเรียบง่ายและความเร็วของ ZeroMQ .
ในปี 2011 CERN ทำการศึกษาหา middleware ที่เหมาะสมสำหรับการควบคุม accelerator พบว่า ZeroMQ ได้คะแนนสูงสุดในด้านความยืดหยุ่นและความง่ายในการปรับแต่ง .
การพัฒนาและเวอร์ชันต่างๆ
ช่วงต้นปี 2012 สองผู้พัฒนาหลักได้ Fork โครงการ ZeroMQ ไปเป็น Crossroads I/O ขณะที่ Martin Sustrik เริ่มพัฒนา nanomsg ซึ่งเป็นการเขียนต้นฉบับใหม่ของ core library .
ในเดือนสิงหาคม 2012 Dongmin Yu เปิดตัว JeroMQ ซึ่งเป็นการพอร์ต ZeroMQ ให้เป็น Java แบบ pure Java .
ปี 2013 Pieter Hintjens ร่างโปรโตคอล ZMTP v3.0 เพื่อเพิ่มกลไกการยืนยันตัวตนและเข้ารหัสใน ZeroMQ และ Martin Hurton นำ CurveZMQ มาใช้งานใน core library .
ในปี 2016 Garrett D’Amore ฟอร์กโครงการ nanomsg ไปพัฒนาเป็น NNG (Nanomsg Next Generation) .
จุดประสงค์
เป้าหมายหลัก
ให้เครื่องมือสำหรับการส่งข้อความแบบ ยืดหยุ่น และ ปรับขยายได้สูง เพื่อรองรับแอปพลิเคชันที่ต้องการ throughput สูงและ latency ต่ำ .
มอบ API ที่ ใช้งานง่าย สำหรับนักพัฒนา ให้สามารถสร้างระบบกระจายตัวหรือ concurrent ได้โดยไม่ต้องเรียนรู้ middleware ขนาดใหญ่ .
ลดความซับซ้อนของสถาปัตยกรรมโดยไม่ต้องมี broker กลาง จึงเหมาะกับการสร้าง microservices หรือ task distribution frameworks .
การใช้งานที่เหมาะสม
ระบบที่ต้องการ low-latency และ high-throughput เช่น ระบบซื้อขายหุ้นหรือการประมวลผลข้อมูลเรียลไทม์ .
สถาปัตยกรรม microservices และ cluster computing ที่ต้องสื่อสารกันเป็นจำนวนมาก ด้วยรูปแบบ messaging patterns หลากหลาย .
งาน distributed หรือ concurrent ทั่วไป ไม่ว่าจะเป็นงานคำนวณหนัก (parallel computing) หรือการกระจายงาน (task distribution) .
Last updated