Right Tech EP.5
Right Tech EP.5: วิวัฒนาการของ Bitcoin Address | จาก IP Address ถึง Bech32m
History of Address
1. IP address {P2PK (pay to public key)}
การที่เราจะส่ง Bitcoin ให้กันได้ เราต้องรู้ public key ของคนที่เราต้องการจะส่งให้ คล้ายกับการโอนเงินผ่านบัญชีธนาคารที่เราต้องรู้หมายเลขบัญชีธนาคาร แต่ปัญหาคือ public key มีความยาวมาก ทำให้ไม่สะดวกต่อการส่งต่อผ่านการพูดหรือสื่อสารด้วยเสียง
จึงมีการแก้ปัญหาอยู่ 2 วิธี
ส่งด้วย IP address (Bitcoin Full node version 0.1)
ในยุคเริ่มต้นของ Bitcoin หากเราต้องการส่ง Bitcoin ให้ใคร สิ่งที่ต้องทำคือการรัน Node ขึ้นมาก่อน เพราะในช่วงแรก Node จะทำหน้าที่หลายอย่างในเวลาเดียวกัน ทั้งการขุดเหรียญ การทำหน้าที่เป็นกระเป๋าเงิน (wallet) และอื่น ๆ
เมื่อรัน Node เรียบร้อยแล้ว เราต้องให้ Node ของเราทำการเชื่อมต่อ (peer) เพื่อค้นหา Node ของผู้รับ Bitcoin จากนั้นให้นำ IP Address ของผู้รับ มาใส่ไว้ในระบบของ Node ผู้ส่ง Node ของเราจะใช้ IP Address นี้เพื่อสอบถามไปยัง Node ของผู้รับว่า public key ของผู้รับคืออะไร
การทำงาน: Sender:
<Receiver Pubkey> OP_HECKSIG(output) Receiver:<Receiver Signature>+output Senderมาวางเป็น (input)Execution Stack:
<Receiver Signature> <Receiver Pubkey> OP_HECKSIG
ปัญหาของการส่งด้วย Ip address
ปิด computer ในเวลากลางคืน
computer ของผู้รับอยู่ใน mode sleep
อยู่หลัง file wall
ใข้การแปลงที่อยู่เครือข่าย (NAT)
ความปลอดภัยและความเป็นส่วนตัว
Hash เพื่อให้สั้นลง (Legacy addresses) เนื่องจาการ SHA-256 จะทำให้ ผลลัพธ์ของการ Hash เป็น 256 bit เสมอ (256 bit) ใน public key hash ใช้ SHA-256 และ ตามด้วย RIPEMD-160 (ผลลัพธ์ 160 bit -> 20 byte -> 40 ตัวอักษร)
การทำงาน: Sender:
OP_DUP OP_HASH160 <Receiver commitment> OP_EQUALVERIFY OP_CHECKSIGReceiver:<Receiver Signature> <Receiver PublicKey>[!NOTE] > คือ public key ที่ผ่าน Hahs-160 (SHA-256 + RIPEMD-160)
Execution Stack:
<Signature> <PublicKey> OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
2. Base58check Encoding
base58 check: ถูกดัดแปลงมาจาก base64 (เลขฐาน 64: 0-9, A-Z, a-z, +, /) โดยตัดสัญลักษณ์ที่อาจทำให้เกิดความสับสน เช่น +, /, 0 (เลขศูนย์), O (ตัวอักษร O), I (ตัวอักษร ไอใหญ่) และ l (ตัวอักษร เอลเล็ก) ออกไป และ เติม prefix และ checksum เข้าไป
prefix: เพื่อบอกว่า address นี้เป็นประเภทไหน
checksum: เพื่อ check ว่า ที่เรา coppy address มาถูกต้องหรือไม่
การทำงานของ base58 check encoding:
เตรียม payload : Script Sender (
OP_DUP OP_HASH160 <Receiver commitment> OP_EQUALVERIFY OP_CHECKSIG)<payload>เติม prefix (version):
<version> <payload>Hash (prefix + payload) และนำ 4 byte แรกมาต่อท้ายเป็น checksum:
<version> <payload> <checksum>encode in base58
address ประเภท P2PKH
0x00
1
address ประเภท P2SH
0x05
3
testnet address ประเภท P2PKH
0x6F
m หรือ n
testnet address ประเภท P2SH
0xc4
2
Private key WIF
0x80
5, K หรือ L
BIP32 Extended public key
0x0488B21E
xpub
summary Public key to Bitcoin Address:

4. Legacy:Pay to Script Hash (P2SH)
update in BIP 16 : อนุญาตให้ commitment ใส่ redeem script ลงไปแทนได้
ตัวอย่างการทำงานของ P2SH: (multi-signature ใช้ 2 key ในการไข)
redeem script: <public key 1> OP_CHECKSIGVERIFY <public key 2> OP_CHECKSIG
[!NOTE] OP_CHECKSIGVERIFY ถ้าตรวจสอบแล้วถูกต้องจะ return 1 และ stack จะทำงานต่อ OP_CHECKSIG ถ้าตรวจสอบแล้วถูกต้องจะ return true และ valid เลย
เราสามารถ ใส่ redeem script ลงไปใน commitment
Sender: OP_HASH160 <commitment> OP_EQUAL
Receiver: <signature 2> <signature 1> + output Sender ( redeem script)
Execution Stack:
<signature 2> <signature 1> <public key 1> OP_CHECKSIGVERIFY <public key 2> OP_CHECKSIG
collision attack on P2SH:
first preimage attack:
second preimage attack:
colision attack:
หากผู้โจมตีเป็นคนที่ มี signature 1 ใน 2 ความปลอดภัย จาก $2^{160}$ จะเหลือ $2^{80}$ เท่านั้น ด้วน ตัเลข และทรัพยากรที่มีอยู่ในปัจจุบัน หากมีคนลงทุกสามารถทำได้
5. Bech32 Addresses
5.1 ปัญหาของ BASE58CHECK
อักษรที่มีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กทำให้ไม่สะดวกในการอ่านออกเสียง
ตรวจจับข้อผิดพลาดได้ แต่ไม่สามารถช่วยผู้ใช้แก้ไขข้อผิดพลาดได้
การใช้ตัวอักษรที่มีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กยังต้องใช้พื้นที่เพิ่มเติมในการเข้ารหัสใน QR code
5.2 ปัญหาของ Bech 32
ค่าคงที่ตัวหนึ่งในอัลกอริทึม bech32 บังเอิญทำให้การเพิ่มหรือลบตัวอักษร "q" ในตำแหน่งที่สองจากท้ายของ address ที่ลงท้ายด้วยตัวอักษร "p" ในกรณีนี้ ทำให้สามารถเพิ่มหรือลบตัวอักษร "q" ได้โดยที่ checksum ยังคงถูกต้อง
6. Bech32m Addresses
Bech32m address:
เริ่มต้นด้วย ส่วนที่มนุษย์อ่านได้ (HRP: Human-Readable Part)
ตามด้วย ตัวคั่นคือเลข "1"
ส่วนข้อมูลหลังตัวคั่นแบ่งเป็น 3 ส่วน:
witness version,witness program, และchecksum
Witness version:
ไบต์ถัดจากตัวคั่น (1) ใช้ระบุเวอร์ชันของ SegWit
ตัวอักษร
"q"แทนค่า0→ ใช้กับ SegWit v0 (เวอร์ชันแรกของ bech32)ตัวอักษร
"p"แทนค่า1→ ใช้กับ SegWit v1 (Taproot)รองรับเวอร์ชันตั้งแต่ 0 ถึง 16 (รวมทั้งหมด 17 เวอร์ชัน)
Witness program:
เริ่มจาก Byte 2 to 40 (หลัง witness version)
สำหรับ SegWit v0 → ความยาวต้องเป็น 20 หรือ 32 ไบต์ เท่านั้น
สำหรับ SegWit v1 → ความยาวต้องเป็น 32 ไบต์ (ณ ปัจจุบัน)
ความยาวอื่นสำหรับ v1 อาจถูกกำหนดในอนาคต
Checksum:
มีความยาว 6 ตัวอักษร
ใช้ BCH (Bech32 Checksum) ซึ่งเป็นรหัสตรวจจับข้อผิดพลาด (Error Detection Code)
P2WPKH
OP_0 2b626ed108ad00a944bb2922a309844611d25468
bc1q9d3xa5gg45q2j39m9y32xzvygcgay4rgc6aaee
P2WSH
OP_0 648a32e50b6fb7c5233b228f60a6a2ca4158400268844c4bc295ed5e8c3d626f
bc1qvj9r9egtd7mu2gemy28kpf4zefq4ssqzdzzycj7zjhk4arpavfhsct5a3p
P2TR
OP_1 2ceefa5fa770ff24f87c5475d76eab519eda6176b11dbe1618fcf755bfac5311
bc1p9nh05ha8wrljf7ru236awm4t2x0d5ctkkywmu9sclnm4t0av2vgs4k3au7
Future Example
OP_16 0000
bc1sqqqqkfw08p
Last updated