Bitcoin Address คืออะไร? มันถูกสร้างมาจาก Private Key ได้อย่างไร?
ครั้นนึกถึงตอนผมเป็นมือใหม่แล้วเพิ่งเริ่มได้สัมผัสกับ Bitcoin ซึ่งในช่วงเวลานั้นผมเข้าใจเรื่อง Address ง่ายมากครับ
1.เปิด Wallet
2.กด Receive
Application ของ Exchange มันก็โยนตัวหนังสือยาว ๆ มาให้ชุดหนึ่ง
ซึ่งจะมีหน้าตาประมาณนี้
bc1q...
พร้อม QR Code ยึก ๆ ยือ ๆ อันนึง
จากนั้นผมก็ทำการ Copy แล้วส่งให้คนที่จะโอน Bitcoin มาให้
จบข่าวในพระราชสำนัก…
Bitcoin Address ก็คงเหมือนเลขบัญชีธนาคารนั่นแหละ
ง่ายชิบหาย 😂
จนวันหนึ่งผมเริ่มสังเกตว่า…
ทำไม Address ของบางคนขึ้นต้นด้วย 1
บางอันขึ้นต้นด้วย 3
แต่ของผมแม่งเสือกเป็น bc1q
แล้วหลัง ๆ ดันมี bc1p โผล่มาอีก
อ้าว…อี่ยังวะ ? แบบใด๋ ?
ตกลงแล้ว Bitcoin Address มันคืออะไรกันแน่?
ถ้ามันเป็นแค่เลขบัญชี ทำไม Bitcoin ถึงมีเลขบัญชีมากหน้าหลายตา?
แล้ว Address พวกนี้ใครเป็นคนออกให้?
Satoshi แจกมาให้ตั้งแต่ปี 2009 เลยรึเปล่า?
หรือว่า Bitcoin Node เป็นคนสร้างให้?
เอ๊ะ…หรือว่า Miner เป็นคนสร้างให้?
หรือ Wallet มันเสือกมั่วตัวเลขขึ้นมาเอง?
ยิ่งผมไปดูข้างในระบบลึกๆก็ยิ่งเจออะไรแปลก ๆ
Private Key
Public Key
SHA-256
RIPEMD-160
Script
Base58Check
Bech32
Witness Program
แม่งเริ่มไม่เหมือนเลขบัญชีธนาคารละ 😅
Bitcoin Address คืออะไร?
ถ้าจะอธิบายแบบไม่ลงหลุมก่อน เอาแบบไม่ Deep ไม่ Nerd นะ
Bitcoin Address คือ รูปแบบของ Wallet ที่ใช้แสดงเงื่อนไขในการรับ Bitcoin ให้อยู่ในรูปที่มนุษย์และ Software เอาไปใช้งานได้สะดวก
เวลามีคนโอน Bitcoin ยิงมาใส่ใน Address ของเรา สิ่งที่เกิดขึ้นจริง ๆ ไม่ใช่ Bitcoin วิ่งเข้าไปอยู่ “ใน Address” นั้นนะ
แต่มันเป็นสิ่งที่ Bitcoin Transaction กำลังสร้าง Output ขึ้นมาใหม่
และ Output นั้นก็จะมีเงื่อนไขว่า
ถ้าจะเอา Bitcoin ก้อนนี้ไป Spend ต่อ มึงต้องทำตามเงื่อนไขนี้
นี่เป็นจุดที่ผมเคยเข้าใจผิดอยู่พักใหญ่
ผมเคยคิดว่า Blockchain น่าจะมีอะไรประมาณนี้อยู่ข้างใน
Address A = 0.1 BTC
Address B = 2.5 BTC
Address C = 0.003 BTC
เหมือน Database ของพวกธนาคารพาณิชย์
แต่ถ้าคุณอ่านบทความที่มีชื่อว่า UTXO คืออะไร ของเรามาแล้ว จะรู้ว่า Bitcoin ไม่ได้เก็บ Balance ในรูปแบบของ Account Model อย่างนั้น
แต่สิ่งที่ระบบของ Bitcoin มีก็คือ Transaction Outputs ที่ยังไม่ได้ถูก Spend
หรือเรียกอีกชื่อนึงว่า UTXO
เพราะงั้น Bitcoin Address จึงไม่ได้เป็น “กล่อง” ที่มี Bitcoin นอนแน่นิ่งอยู่ข้างใน
มันเกี่ยวข้องกับวิธีที่ Wallet แสดงข้อมูลที่เป็น Condition ในการเคลื่อนย้าย Output นั้นๆมากกว่า
เพียงเท่านี้ ภาพของเลขบัญชีธนาคารในหัวผมก็เริ่มพังแล้ว 😂
Bitcoin Address คืออะไร และถูกสร้างมาจากไหน?
ถ้าเป็น Address Bitcoin แบบดั้งเดิม ที่คนส่วนใหญ่มักเอามาสอนกัน เราก็จะสามารถวาดภาพง่าย ๆ ได้ว่า
Private Key
↓
Public Key
↓
Hash
↓
Bitcoin Address
นี่เป็น Model ที่ดีมากสำหรับผู้เริ่มต้นศึกษา
และผมเองก็เคยเข้าใจ Bitcoin แบบนี้
แต่มีคำเตือนไว้ก่อนนะครับว่า…
ไอ่กระบวนการด้านบนเนี่ย มันไม่ได้อธิบาย Bitcoin Address ทุกประเภท นะครับ
เดี๋ยวเราจะกลับมาทำลาย Model นี้กันทีหลัง 😂
ตอนนี้เอาแบบพื้นฐานนี้ไปก่อน
จุดเริ่มต้นคือ Private Key
Private Key ก็คือตัวเลขขนาดใหญ่มากตัวหนึ่งภายในช่วงที่กำหนดโดยระบบ Cryptography ที่ Bitcoin ใช้
จาก Private Key เราสามารถคำนวณ Public Key ได้ด้วย Elliptic Curve Cryptography บน curve ที่ชื่อว่า secp256k1
มันก็จะตีความประมาณว่า
Private Key → Public Key
แต่ในทางปฏิบัติ ด้วยเทคโนโลยีด้านการคำนวณปัจจุบัน เราไม่สามารถเอา Public Key มาแล้วคำนวณย้อนกลับหา Private Key ได้ง่าย ๆ นะจ๊ะ เนื่องจากมันเป็น One Way Function ซึ่งในทางปฏิบัติ ด้วยเทคโนโลยีการคำนวณปัจจุบัน เราไม่สามารถเอา Public Key มาคำนวณย้อนกลับหา Private Key ได้ง่าย ๆ เนื่องจากความยากของ Elliptic Curve Discrete Logarithm Problem
เรื่องนี้เราเคยลงหลุมกันไปแล้วในบท Private Key คืออะไร
วันนี้เราจะเอา Public Key ตัวนั้นไปทำอะไรต่อ
Bitcoin Address คืออะไรในมุมของ Public Key และ P2PKH?
ตรงนี้เราจะเริ่มจาก Address รุ่นดึกดำบรรพ์ก่อน เราไปดูกันที่
P2PKH — นั่นก็คือ Address ที่ขึ้นต้นด้วย 1
P2PKH ย่อมาจาก
Pay-to-Public-Key-Hash
ชื่อมันบอกใบ้เราอยู่แล้ว
เราไม่ได้เอา Public Key ดิบ ๆ ไปใช้เป็น Address ตรง ๆ
ในภาพแบบง่าย เราจะเอา Public Key ไปผ่าน Hash Function แล้วมันถึงจะกลายเป็น Address ทีหลัง
มันก็จะมีขั้นตอนประมาณนี้
Public Key
↓
SHA-256
↓
RIPEMD-160
↓
Public Key Hash
ซึ่งผลลัพธ์ที่ได้นั้นเรามักเรียกว่า HASH160
จากนั้นยังมีขั้นตอนการ Encoding อีก เพื่อทำการตัดตัวอักษรที่ดูคล้ายๆกันออกไป สาเหตุที่ต้องทำแบบนั้นก็เป็นเพราะว่าพวกตัวอักษรคล้ายๆกันมันจะทำให้เกิด Human Error ตอนอ่าน ยกตัวอย่างเช่น li เนี่ย หรือ 0oO เนี่ยเห็นมะ ?
แต่การ Encode สามารถแปลงไปแปลงกลับได้นะเพราะมันเป็นเพียงแค่การแปลอักษรภาษาอังกฤษเฉยๆ แน่นอนว่าข้อมูล Address นั้นสามารถ Encode ไปข้างหน้าได้ มันก็จะสามารถ Decode กลับมาข้างหลังได้คือกัน (มีแต่ Hash Function เท่านั้นแหละที่เป็น One Way Function)
สำหรับ Bitcoin Mainnet นั้น ในส่วนของของ Address ประเภท P2PKH จะมี Version Byte เพิ่มเข้ามา แล้วก็มี Checksum ตามดากมาด้วย ก่อนที่จะถูก Encode ด้วย Base58
สุดท้ายเราจึงได้อะไรหน้าตาประมาณ
1BoatSLRHtKNngkdXEeobR76b53LETtpyT
Address ที่ขึ้นต้นด้วย 1
อันนี้แหละที่หลายคนเรียกว่า Legacy Address
ตรงนี้ถ้าผมวาดแผนผังแบบชาว Engineer ผมคงจะต้องเขียนว่า
Public Key → HASH160 → Version + Checksum → Base58Check → Address
เริ่มดูเหมือน Protocol มากกว่าเลขบัญชีธนาคารซะล้าวววววววววววว 😂
แล้วทำไมต้อง Hash Public Key อีกที?
คำถามนี้ดีมากๆเลยนะสาว
และคำตอบก็คือ ใน Address ประเภท P2PKH นั้นจะมีสิ่งที่เป็น Output Commit ไว้นั่นก็คือ Hash ของ Public Key
ในสมัยดึกดำบรรพ์นั้น เขาจะใช้ Public Key เป็นชุดตัวเลขแทน Address เพื่อเอาไว้ส่ง Bitcoin ให้กันและกัน
ซึ่งกระเป๋าของ Satoshi Nakamoto ทั้งหมดก็ใช้รูปแบบการโอนแบบนี้ นั่นก็คือ Pay To Public Key
หากเราสังเกตุดีๆมันจะเป็นคนละอย่างกันนะ ระหว่าง Pay To Public Key และ Pay To Public Key Hash ซึ่งมันแค่เป็นขั้นกว่าของกันและกัน
เมื่อเจ้าของเงินนั้นต้องการจะ Spend เขาจึงนำ Public Key และ Signature ที่เกี่ยวข้องออกมาเพื่อให้ Script ตรวจสอบตามเงื่อนไข
Bitcoin Node ก็จะสามารถตรวจสอบได้ว่า Public Key ที่ถูกนำมาเปิดเผยนั้น Hash แล้วตรงกับค่าที่ Output เดิมกำหนดไว้หรือไม่ และ Signature ผ่านการตรวจสอบหรือไม่ ?
ถ้า Bitcoin Node ตรวจสอบแล้วผ่านเงื่อนไขทั้งหมด
Transaction ก็สามารถผ่านฉลุย
ตรงนี้เราจะเห็นความสัมพันธ์ของ Blog ก่อน ๆ เริ่มต่อกันแล้ว
Private Key
→ มีไว้เพื่อสร้าง Public Key
Public Key Hash / Script
→ เกี่ยวข้องกับเงื่อนไขของ Output Lock ที่ไว้
→ ใช้เป็นส่วนหนึ่งของหลักฐานตอน Spend เงินออก
Bitcoin Node
→ ตรวจว่าการ Spend ทำตาม Consensus Rules หรือไม่ ?
ของที่เราเขียนมาหลาย Blog เริ่มมาต่อกันเป็นเครื่องจักรตัวเดียวแล้ว
Address ที่ขึ้นต้นด้วย 3 คืออะไร?
ทีนี้ Model ง่าย ๆ ของเราเริ่มมีปัญหาแล้วล่ะ
เพราะ Address ที่ขึ้นต้นด้วย 3 ไม่จำเป็นต้องเป็น Public Key Hash
Address ลักษณะนี้บน Mainnet โดยทั่วไปมันคือ P2SH
หรือ
Pay-to-Script-Hash
สังเกตคำว่า
Script Hash
ไม่ใช่ Public Key Hash
แนวคิดก็คือ Output Commit ไปยัง Hash ของ Script
ตอนจะ Spend จึงต้องเปิดเผยข้อมูลที่เกี่ยวข้องและทำให้เงื่อนไขของ Script นั้นสำเร็จตามกฎ
และยิ่งไปกว่านั้นก็คือไอ่เจ้า P2SH เนี่ยมันสามารถสร้างเงื่อนไขให้ซับซ้อนขึ้นได้ และสามารถเอาไปสร้างเป็น Address เพื่อให้คนอื่นโอนเงินมาให้เราได้
เช่น Multisig หรือ Script ที่เป็น Non Standard บางรูปแบบ
และในช่วงหนึ่ง Address ที่ขึ้นต้นด้วย 3 ก็ถูกใช้แพร่หลายกับ P2SH-wrapped SegWit
แต่ตรงนี้ต้องระวังมาก
เมื่อคุณเห็นมันขึ้นต้นด้วย 3... ไม่ได้แปลว่ามันเป็น wrapped SegWit เสมอไป
เพราะ 3... บอกเราว่าเป็น P2SH Address
ซึ่ง Script ที่อยู่เบื้องหลังจะเป็นอะไรก็อีกเรื่องหนึ่ง
นี่เป็นเหตุผลว่าทำไมการจำว่า
1 = Address แบบเก่า
3 = Address แบบwrapped SegWit (ซึ่ง Address แบบนี้ เราจะเรียกว่าเป็น Segwit ห่อไข่ ก็ได้)
bc1 = ที่เป็น Address Segwit แบบใหม่ (ซึ่ง Address แบบนี้ เราจะเรียกว่าเป็น Segwit แท้ ก็ได้)
มันพอใช้ดูคร่าว ๆ ได้ แต่ถ้าจะเข้าใจ Protocol เอาเข้าจริง ๆ แล้วข้อมูลมันไม่พอ
มาถึงตรงนี้ ถ้าถามว่า Bitcoin Address คืออะไร เราอาจจะเริ่มตอบได้แล้วว่ามันไม่ใช่แค่ Public Key ที่เอาไป Hash แล้วจบ เพราะพอ Script เริ่มซับซ้อนขึ้น Address ก็เริ่มเปลี่ยนรูปแบบตามไปด้วย
Bitcoin Address คืออะไรในยุค SegWit?
ปี 2017 Bitcoin มีการใช้งาน Segregated Witness หรือ SegWit ซึ่งใน SegWit v0 เราจะเจอ Output หลัก ๆ อย่าง P2WPKH (Pay-to-Witness-Public-Key-Hash) และ P2WSH (Pay-to-Witness-Script-Hash) จะให้พูดง่ายๆก็คือมันคล้ายๆกับ P2PKH กับ P2SH แหละ เพียงแต่อันนี้มันเอา Signature โยกไปวางไว้ที่ Witness Block แค่นั้นเอง
แล้วเราก็เริ่มเห็น Address แบบ
bc1q...
นี่คือสิ่งที่คนมักเรียกว่า Native SegWit Address
Encoding ที่ใช้คือ Bech32 สำหรับ SegWit v0
ข้อสังเกตง่าย ๆ คือมันอ่านหน้าตาต่างจาก Base58 Address ชัดเจน
bc1q...
สำหรับ Mainnet คำว่า bc เป็น Human-Readable Part ที่บอก Network
หลังจากนั้นข้อมูลจะ Encode Witness Version และ Witness Program ตามรูปแบบของ SegWit Address
ตรงนี้แหละที่ Model ที่เราท่องมาในตอนต้นนั้น :
Public Key → Hash → Base58Check → Address
จะไม่ได้เป็นสูตรสากลอีกต่อไปแล้ว
เพราะ Address มันเป็นรูปแบบใหม่และใช้ Encoding แถมมีโครงสร้างคนละแบบอีกด้วย
เดี๋ยวค่อยมาลงรายละเอียดละกันเพราะแม่งยาวแน่นอน
แล้ว bc1p... คืออะไรอีกวะ?
😂
นี่คือ Taproot Address
อีเจ้า Taproot เนี่ยมันถูกใช้งานบน Bitcoin ตั้งแต่ปี 2021 และใช้ SegWit Version 1
ซึ่งมันก็เป็น Address บน Mainnet มักขึ้นต้นด้วย
bc1p...
และตรงนี้มีรายละเอียดสำคัญอีกอย่าง
Taproot ใช้ Bech32m ในการ Encode ซึ่งไม่ใช่ Bech32 แบบที่ใช้กับ SegWit v0
ดังนั้น หากผมเล่าแบบย่อ ๆ ก็คือ :
bc1q...
→ SegWit v0
→ Bech32
bc1p...
→ SegWit v1 / Taproot
→ Bech32m
และอี Taproot เองก็ทำให้เรื่องราวของ
“Bitcoin Address = Hash ของ Public Key”
ยิ่งใช้เป็นคำอธิบายแบบเหมารวมไม่ได้เลย
เพราะ P2TR Output เกี่ยวข้องกับ Taproot output key และสามารถรองรับทั้ง Key Path และ Script Path spending
เดี๋ยวถ้าลงตรงนี้ต่อ Blog นี้จะกลายเป็นหลุม Taproot แล้วเราจะไม่ได้กลับบ้านกัน 😂
เอาไว้ลงอีก Blog ดีกว่า (อีกแล้วหรอ ???)
สรุป Address 4 แบบที่เราเห็นบ่อย
เอาไว้เปิดดูเวลาเจอ Address แปลก ๆ :
| ขึ้นต้น | รูปแบบทั่วไป | Encoding / แนวคิด |
|---|---|---|
1... | P2PKH / Legacy | Base58 |
3... | P2SH | Base58 |
bc1q... | SegWit v0 เช่น P2WPKH/P2WSH | Bech32 |
bc1p... | Taproot / SegWit v1 | Bech32m |
แต่ผมอยากให้จำไว้ว่า
Prefix ช่วยให้เรารู้ Format บางอย่าง แต่มันไม่ได้เล่า Spending Condition ทั้งหมดให้เราฟังเสมอไป
โดยเฉพาะ 3...
เห็น 3 อย่าเพิ่งตะโกน
Legacy SEGWIT!!!
เดี๋ยวหน้าจะแตกเอา 😂
เพราะบางทีอ่ะ ไอ่ที่ขึ้นต้นด้วย 3 มันสามารถเป็น Multisig ได้ด้วยเช่นกัน นี่คือความสวยงามของ Address ประเภทนี้ที่มันซุกซ่อน Privacy ให้เราได้ เพราะมันดูไม่ออกเลยว่าเป็น Single Sig หรือว่า Multisig และหากเป็น Multisig มันจะใช้ Key กี่อัน มันดูไม่ออก (จนกว่าคุณจะโอนออกครั้งนึงแล้วมันจะถูกเฉลยทันทีว่าเป็น Script แบบใด)
Bitcoin Address คืออะไร แล้วทำไมมันต้องมี Checksum?
หากพูดถึงตรงจุดนี้ พวก Engineer น่าจะเริ่มคุ้นเคยละ
เวลาเราส่งข้อมูลผ่าน Communication Protocol เรามักมีวิธีตรวจจับว่าข้อมูลเกิดความผิดพลาดระหว่างทางหรือเปล่า ?
Address Encoding ของ Bitcoin ก็มีระบบตรวจจับข้อผิดพลาดเช่นกัน
Base58Check มี Checksum ของมัน
Bech32 / Bech32m ก็มี checksum scheme ของมันเอง
ดังนั้นเวลาคุณ Copy Address แล้วข้อมูลผิด Format หรือ Copy ตกหล่นไปตัวนึง หรือ Copy มาไม่ครบ หรือ Checksum ไม่ถูกต้อง ซึ่ง Wallet ที่ดีต้องสามารถตรวจพบและปฏิเสธการโอนเงินสำหรับ Address นั้นได้
แต่นี่ไม่ได้แปลว่า Checksum จะช่วยคุณทุกกรณีนะ
ถ้าคุณตั้งใจ Copy Address ที่ถูกต้องแล้ว แต่เสือกเป็นของโจร
ถึงจะมี Checksum ก็แหกได้เหมือนกันนะครับ 😂
เพราะงั้นก่อนส่ง Bitcoin จำนวนเยอะๆ…
ขอความกรุณาช่วย ดู Address บนอุปกรณ์ที่เชื่อถือได้หน่อยเถอะ และ Verify ให้ดี
โดยเฉพาะถ้าใช้อุปกรณ์อย่างพวก Hardware Wallet อ่ะ
อย่าเชื่อสิ่งที่ Computer Screen แสดงเพียงอย่างเดียว ถ้า Device ของคุณสามารถแสดง Destination Address ให้ตรวจสอบได้ ก็ดูที่จอของ Device นิดนึงเนอะ
นี่คือจุดที่ต้องดูให้ดีด้วยสายตาของตัวคุณเอง เพราะในวันที่คุณหันมาเก็บ Bitcoin ด้วยตัวของคุณเองแล้วนั้น สติคือสิ่งที่สำคัญที่สุดเป็นอันดับต้นๆเลยก็ว่าได้
ตรงนี้ทำให้คำถามว่า Bitcoin Address คืออะไร ชัดขึ้นอีกนิด เพราะ Address ไม่ใช่ Wallet และ Address ก็ไม่ใช่ Balance มันเป็นเพียงส่วนหนึ่งของโครงสร้างที่ Wallet ใช้ในการรับและจัดการ Bitcoin ของเรา
Address เดิมใช้ซ้ำได้ไหม?
ในทาง Protocol อาจมีสถานการณ์ที่ Address เดิมรับ Bitcoin ได้มากกว่าหนึ่งครั้ง ซึ่งก็สามารถทำได้
แต่ในแง่ Privacy โดยทั่วไป Wallet สมัยใหม่จะสร้าง Receive Address ใหม่ให้เราสำหรับการรับแต่ละครั้ง
แม้กระทั่ง Address เงินทอนก็จะไม่ซ้ำเลย มันจะวนไปเรื่อยๆ แต่ยังคงเป็น Address ที่อยู่ในชุด Seed ของคุณ
มันทำอย่างนั้นไปทำไม?
เพราะ Blockchain เป็น Public Ledger ที่ใครๆก็เข้ามาส่องได้ ทั้งคนดี ทั้ง Hacker ระดับโลก
ถ้าคุณเอา Address เดิมไปแปะไว้ทุกที่
ลูกค้าโอนมาก็เข้า Address นี้
เพื่อนโอนมาก็เข้า Address นี้
เงินเดือนก็เข้า Address นี้
ขายของก็เอามาเข้า Address นี้
คนที่ดู Blockchain ก็เริ่มเห็นความสัมพันธ์ของ Transaction ที่เกี่ยวข้องกับ Address นั้นได้ง่ายขึ้น ยิ่งถ้าคุณเคยโอน Bitcoin ออกจาก Address ซ้ำๆนั่นแล้วล่ะก็ มันแปลว่า Public Key ของ Address นี้มันได้ถูกเปิดเผยต่อสาธารณะชนไปเป็นที่เรียบร้อยแล้ว
ยังจำที่ผมเคยบอกได้มั้ย ? ว่าการที่คุณจะโอน Bitcoin ออกได้ คุณจะต้องเปิดเผย Public Key ทุกครั้ง เพราะมันเป็นตัวแทนของ Private Key ที่ฝั่ง Verify จะต้องใช้ Public Key นี่แหละ เอาไปตรวจเทียบกับ Locking Script แต่ถ้ามึงจะโอนออกแล้วมึงเสือกไม่เปิดเผย Public Key แล้ว Node มันจะตรวจสอบความเป็นเจ้าของ UTXO จากอะไร ????
นี่คือเหตุผลที่ HD Wallet สามารถสร้าง Address จำนวนมากจากโครงสร้าง Key Derivation ของ Wallet ที่ขึ้นกับ Seed นั้นๆ
คุณไม่จำเป็นต้องมี “เลขบัญชี Bitcoin เลขเดียวตลอดชีวิต”
ตรงกันข้ามเลย
Wallet สร้าง Address ใหม่ให้คุณได้เรื่อย ๆ
แล้วถ้า Address เปลี่ยนทุกครั้ง Bitcoin ยังเป็นของผมได้อย่างไร?
อันนี้ตอนแรกก็งงครับ 😂
ธนาคารสอนเรามาทั้งชีวิตว่า
หนึ่งบัญชี = หนึ่งหมายเลขบัญชี
แต่ Bitcoin Wallet จะแสดง Address ใหม่ทุกครั้งที่กด Receive
แล้วกูจะจำได้ยังไงว่าอันไหนของกู?
คำตอบคือ Wallet ไม่ได้ทำงานโดยการจดจำ Address แบบที่มนุษย์ทำ
ซึ่งอีเจ้า Wallet แบบ HD เนี่ยมันสามารถ Derive ชุด Keys และ Addresses จำนวนมากจากโครงสร้าง Wallet ของมัน ซึ่งมันเอาต้นตอมาจาก Seed เพียงชุดเดียวนั่นแหละ
มันจึงสามารถติดตาม UTXO ที่เกี่ยวข้องกับ Keys/Scripts ที่อยู่ภายใต้ Wallet นั้นๆได้
นี่ก็เป็นเหตุผลที่ว่า
Wallet Balance ของคุณนั้น ไม่ใช่ Bitcoin ที่นอนแน่นิ่งอยู่ใน Address เดียว
มันอาจจะเป็น UTXO หลายก้อนหลายๆอันมานับรวมกัน
ซึ่งมันอยู่ภายใต้ Addresses หรือ Scripts หลายชุด
เพียงแต่ Wallet มันได้ทำการรวบรวมข้อมูลเหล่านั้นแล้วแสดงเป็น Balance ให้คุณเห็น ก็เท่านั้นเอง
เรื่องนี้นะ ถ้าหากว่าคุณยัง งง…
ให้กลับไปอ่านบทความที่มีชื่อว่า UTXO คืออะไร
แล้วคุณจะเริ่มเห็นภาพว่าทำไม Bitcoin Wallet กับบัญชีธนาคารนั้นมันคนละรูปแบบกันเลย
Bitcoin Address มี Private Key หนึ่งตัวต่อหนึ่ง Address ไหม?
ถ้าตอบสั้น ๆ ว่า ใช่ครับ
หนึ่ง Address = หนึ่ง Private Key
มันก็ง่ายๆอย่างนี้ล่ะครับ
แต่ผมไม่อยากให้จำแบบนั้น
เพราะ Bitcoin มีหลาย Script Types และ Spending Conditions
P2PKH แบบพื้นฐานทำให้ความสัมพันธ์ระหว่าง Key Pair กับ Address ดูตรงไปตรงมา
แต่พอเราไปเจอ :
P2SH
P2WSH
Multisig
Taproot
Script Path
คำอธิบายแบบหนึ่ง Address ต่อหนึ่ง Private Key ก็เริ่มพังลงละ
เพราะ Bitcoin ไม่ได้ถามว่า
“Private Key ของ Address นี้คืออะไร?”
แต่สิ่งที่มันสนใจจริง ๆ คือ
Transaction ที่กำลังพยายาม Spend Output นี้ คุณสามารถทำให้ Spending Condition ของ Output นั้นสำเร็จตามกฎได้หรือเปล่าน้าาาาาา ?
ตรงนี้แหละครับที่ผมรู้สึกว่า Bitcoin เริ่มสวยงามขึ้น
เพราะ Address เป็นสิ่งที่มนุษย์เห็น
แต่ข้างใต้ Address… นั้น
มันคือเงื่อนไข
ส่ง Bitcoin ผิด Address เอาคืนได้ไหม?
นี่คือส่วนที่ไม่สนุกเอาเสียเลย
Bitcoin Transaction ไม่มีปุ่ม Undo นะครับ มันเหมือนเครื่องบินอ่ะที่เดินหน้าได้อย่างเดียว ไม่มีการใส่เกียร์ถอยหลัง (ถ้าเครื่องบินมีเกียร์ถอยนี่ชิบหายหมดแน่นอน เพราะมันไม่มีตาหลัง 555)
ถ้าคุณโอน Bitcoin ไปยัง Address ที่ถูกต้องตาม Format แต่เป็น Address ของคนอื่น และ Transaction Confirm ไปแล้ว… หึ หึ หึ
ผมบอกได้เลยว่า Bitcoin Network ไม่มีทางรู้ว่าคุณ “พิมพ์ผิด”
สำหรับ Node มันเห็นเพียงแค่ Transaction นั้นถูกต้องตามกฎ
มันไม่มีช่อง :
User made a stupid mistake = TRUE
😂
และไม่มี Call Center กลางที่สามารถ Reverse Transaction ให้คุณได้
เพราะงั้นถ้าจะโอน Bitcoin จำนวนมากๆ วิธีที่ผมชอบคือ
ลองโอนก้อนเล็กๆเพื่อทดสอบก่อนดิ๊
Confirm ว่าถึง Wallet ปลายทางจริงๆรึเปล่า
แล้วค่อยส่งก้อนใหญ่ตามไปทีหลังก็ยังได้
ยอมเสีย Fee เพิ่มนิดหน่อยบางครั้งอาจถูกกว่านั่งมอง Bitcoin ก้อนขนาดมหึมาที่คุณอุตส่าห์เก็บมาทั้งชีวิตหายไปต่อหน้าต่อตา
Bitcoin Address คืออะไร ถ้ามันไม่ใช่เลขบัญชี?
หลังจากลงมาถึงตรงนี้ ผมว่าเราตอบได้ดีกว่าตอนเริ่มละนะ
นั่นก็คือ Bitcoin Address ทำหน้าที่คล้ายเลขบัญชีในแง่ User Experience
คือเอาไว้บอกอีกฝ่ายว่า
“ส่ง Bitcoin มาทางนี้สิโว้ย”
แต่ในระดับ Protocol มันไม่ใช่ Account Number ที่ชี้ไปยังแถวหนึ่งใน Database แล้วเขียนว่า
พิริยะ = 1 BTC
เพียงแต่ Address เป็น Representation ที่เกี่ยวข้องกับข้อมูลบางอย่าง ซึ่งตัว Wallet Application ใช้สร้าง Transaction Output และ Spending Condition ตาม Address/Script Type นั้น ๆ
และ Bitcoin ที่ได้รับก็ไม่ได้ถูกเก็บไว้ “อยู่ใน Address”
สิ่งที่เกิดขึ้นคือมันจะมี UTXO ที่ถูกสร้างขึ้นพร้อมเงื่อนไขในการ Spend
ตอนจะใช้มันต่อ…
คุณก็ต้องมีข้อมูลและหลักฐานที่ทำให้เงื่อนไขนั้นมันผ่าน
ตรงนั้นแหละ จะเป็นส่วนที่ Private Key, Public Key, Digital Signature และ Script ถึงกลับเข้ามาในเรื่องอีกครั้ง
ตอนนี้เครื่องจักรทั้งตัวเริ่มทำงานต่อกันแล้ว
FAQ — Bitcoin Address คืออะไร? คำถามที่คนใช้ Bitcoin มักสงสัย
Bitcoin Address คืออะไร?
Bitcoin Address คือรูปแบบที่ Wallet ใช้เป็นข้อมูลในการรับ Bitcoin ในรูปที่ Software และ User สามารถนำไปใช้งานได้สะดวก โดย Address Type ที่แตกต่างกันนั้นมาจาก Script หรือ Witness Program ที่แตกต่างกัน
มันจึงไม่ควรถูกมองว่าเป็น “บัญชี” ที่มี Bitcoin ถูกเก็บอยู่ข้างในนั้น
Bitcoin Address ถูกสร้างจาก Private Key หรือไม่?
ในกรณีพื้นฐานอย่าง P2PKH เราสามารถอธิบายได้ง่ายๆแบบนี้ Private Key → Public Key → Public Key Hash → Address
แต่เราไม่ควรใช้สูตรนี้ในการอธิบาย Address ชนิดอื่นๆ เนื่องจากว่า P2SH, SegWit และ Taproot มีโครงสร้างและ Encoding ที่แตกต่างกัน
Bitcoin Address ที่ขึ้นต้นด้วย 1, 3, bc1q และ bc1p ต่างกันอย่างไร?
โดยทั่วไปบน Bitcoin Mainnet:
1... คือ P2PKH หรือ Legacy
3... คือ P2SH
bc1q... ใช้กับ SegWit v0
bc1p... ใช้กับ SegWit v1 ซึ่งปัจจุบันสัมพันธ์กับ Taproot
แต่ Prefix เพียงอย่างเดียวไม่ได้บอก Spending Condition ทุกอย่างที่อยู่เบื้องหลัง Address นั้นๆเสมอไป
Bitcoin Address ใช้ซ้ำได้ไหม?
เราสามารถโอน Bitcoin มายัง Address ซ้ำๆเดิมได้ แต่โดยทั่วไปไม่แนะนำให้ทำแบบนั้น เพราะว่าการใช้ Address Reuse มันจะเป็นผลทำให้ข้อมูลบน Public Blockchain เชื่อมโยงกับตัวเราได้ง่ายขึ้นและสุดท้ายมันกระทบ Privacy ของตัวเราเอง
ซึ่ง Wallet สมัยใหม่นั้นมักจะสร้าง Receive Address ใหม่เรื่อยๆวนๆไป ไม่มีซ้ำเลย
Bitcoin Address หมดอายุไหม?
โดยทั่วไป Bitcoin Address ไม่ได้มีวันหมดอายุแบบรหัส OTP
แต่แนวทางที่ดีคือใช้ Address ใหม่สำหรับการรับ Bitcoin ครั้งถัดไป ซึ่ง Wallet ทั้งหลายนั้นรองรับวิธีการนี้ เพื่อช่วยเรื่องของ Privacy
ถ้าส่ง Bitcoin ไปผิด Address จะเอาคืนได้ไหม?
Bitcoin ไม่มีระบบกลางสำหรับการ Reverse Transaction
หาก Transaction นั้น Sign ถูกต้องและ Confirm แล้ว การที่จะนำเงินกลับมานั้นต้องไปกราบอ้อนวอนผู้ที่สามารถ Spend Output ปลายทาง ให้ส่งคืนมาให้
ดังนั้นคุณควรตรวจสอบ Address และจำนวนเงินให้ดีก่อนที่จะ Sign/Broadcast ทุกครั้ง
คนรู้ Bitcoin Address ของผม ขโมย Bitcoin ได้ไหม?
การรู้ Address เพียงอย่างเดียวไม่ได้ทำให้คนอื่นสามารถ Spend Bitcoin ที่ถูก Lock ด้วยเงื่อนไขของคุณได้
แต่ Address เป็นข้อมูล Public และสามารถนำไปดู Transaction Activity ที่เกี่ยวข้องบน Blockchain ได้
ดังนั้น Security กับ Privacy เป็นคนละเรื่องกัน
โจรไม่อาจขโมย Bitcoin ของคุณได้ จากการรู้ Address เพียงอย่างเดียว…
แล้วทำไมเราถึงเรียกมันว่า Address?
หลังจากเขียนมาถึงตรงนี้ ผมกลับไปมองคำว่า
Bitcoin Address
แล้วรู้สึกว่าชื่อมันก็ตั้งมาดีเหมือนกันนะ
จริงๆแล้วคำว่า Address
มันแปลว่า ที่อยู่
ซึ่งลองนึกภาพว่าเวลาผมส่งพัสดุ ผมเขียน Address ปลายทางบนกล่อง
แต่ถ้าบ้านของผมไม่ได้สร้างอยู่บน Address ที่ถูกจ่าหน้าซองนั้น
พัสดุที่ส่งมา มันก็จะไปลงผิดที่ผิดทาง ถูกมะ ?
ซึ่ง Address เป็นแค่ข้อมูลที่ช่วยบอกว่า
ของควรไปที่ไหน
Bitcoin Address ก็มีความรู้สึกคล้ายกัน แต่มันจะแตกต่างกันตรงที่ ปกติแล้วเวลาที่เราส่งพัสดุ เราจะ Pack ของไว้ข้างในกล่อง จากนั้นทำการปิดกล่องแล้วแปะใบปะหน้า
ถ้าเรา Reverse Engineer กล่องพัสดุนั้น เราจะต้องเริ่มจากแกะใบปะหน้าออก จากนั้นทำการกรีดกล่องออกมา แล้วเราจะเห็นสิ่งของอยู่ข้างใน ซึ่งตรงนี้แหละมันจะแตกต่างจาก Bitcoin นิดหน่อย
เพราะถ้าหากเราลงลึกเข้าไปข้างในของ Bitcoin Address…
มันไม่มีพัสดุสิ่งของ
มันไม่มีบ้านเลขที่
ไม่มีชื่อเจ้าของบัญชี
ไม่มีชื่อผม
ไม่มีชื่อคุณ
ไม่มีธนาคาร
มีแต่ Key
ละก็ Hash
ละก็ Script
ละก็ Signature
แล้วก็ Node ที่นั่งตรวจตามกฎของมันไปเรื่อย ๆ
ผมเคยคิดว่า Bitcoin Address คือเลขบัญชีแบบหนึ่ง
ตอนนี้ผมเริ่มรู้สึกว่า…
มันอาจไม่ใช่ “ที่อยู่ของ Bitcoin” ด้วยซ้ำ
มันเป็นเหมือนภาษาที่เราใช้บอก Network ว่า
Bitcoin ก้อนต่อไปนี้…
ใครจะเอาไปใช้ต่อ ต้องพิสูจน์อะไรบ้างวะ?
แล้วพอคิดแบบนี้
Address ที่ขึ้นต้นด้วย 1, 3, bc1q หรือ bc1p
ก็ไม่ได้ดูเหมือนเลขมั่ว ๆ อีกต่อไปแล้ว
มันเริ่มดูเหมือน…
ร่องรอยของวิวัฒนาการ Bitcoin ที่เขียนอยู่ตรงหน้าเรานี่เอง