Address เป็นสิ่งที่คุณจำเป็นจะต้องให้กับคนที่ต้องการจะ “ส่ง” Bitcoin ให้คุณ
เมื่อมีคนได้รับมัน พวกเขาสามารถสร้างสคริปต์สำหรับล็อกข้อมูล (Locking script) เฉพาะขึ้นมาตามประเภทของ address ที่คุณได้มอบให้เขา
เราจะสร้างที่อยู่ (address) ได้อย่างไร?
เอาล่ะ มันขึ้นอยู่กับว่าคุณอยากจะล็อก Bitcoin ของคุณไว้แบบไหน
แต่โดยรวมแล้ว address จะประกอบด้วย
- ข้อมูลเฉพาะที่คุณต้องการที่จะรวมเข้าไปในล็อก ยกตัวอย่างเช่น เลข Hash public key (public key)
- Prefix (คำนำหน้า) เพื่อที่จะชี้ให้เห็นว่าจะสร้างล็อกแบบไหนขึ้นมา
- และ Checksum เพื่อที่จะช่วยติดตามข้อมูลแต่ละรูปแบบ
และท้ายที่สุด ทั้งหมดนั้นจะถูกแปลงค่าเป็น Base58 ซึ่งจะทำให้ผู้ใช้งานสามารถทำงานง่ายยิ่งขึ้น
Pay To PubKey Hash (P2PKH)
ตามที่ได้ระบุไป เราผนวกข้อมูล Prefix และเพิ่ม checksum นำหน้าเลข Hash public key ของเรา จากนั้นก็เข้ารหัสทั้งหมดใน base58
ตอนนี้เรามีที่อยู่สำหรับมอบให้คนอื่นแล้ว
เมื่อมีใครสักคนสร้างสคริปต์สำหรับล็อก (Locking Script) จากที่อยู่ (address) นี้ พวกเขาแค่ถอดรหัส base58 เพื่อที่จะกู้คืน Hash160 ที่อยู่ข้างใน จากนั้นก็สร้างล็อก P2PKH รอบๆ ตามนี้
เพราะฉะนั้น Prefix จะระบุให้เห็นว่าจะสร้างล็อกแบบไหนและ hash160 จะบอกพวกมันว่าข้อมูลใดที่ใส่เข้าไปในนั้น
Pay To Script Hash (P2SH)
เช่นเดียวกันกับก่อนหน้านี้ ยกเว้นว่าครั้งนี้เราจะรวมเลข Hash ของสคริปต์และใช้ Prefix (คำนำหน้า) 05 เพื่อระบุ P2SH
และนี่ก็คือหน้าตาของ P2SH
Prefix (คำนำหน้า)
ตามที่ได้กล่าวไปข้างต้น Prefix (คำนำหน้า) ที่คุณใช้จะระบุชนิดของสคริปต์สำหรับล็อก (Locking Script) ที่จะทำการสร้าง
นี้คือรายการของ Prefix (คำนำหน้า) address
ใน Bitcoin Prefix (คำนำหน้า) ที่แตกต่างกันจะถูกเพิ่มเข้าไปในข้อมูลก่อนที่จะแปลงข้อมูลเป็น base58 เพื่อที่จะกำหนดตัวอักษรนำหน้าของผลลัพธ์ ตัวอักษรนำหน้านี้จะช่วยเราในการบ่งชี้ว่าเส้นข้อมูล base58 แต่ละเส้นแทนที่ข้อมูลใด
นี้คือ Prefix (คำนำหน้า) ที่มักจะถูกใช้ใน Bitcoin
Mainnet
Prefix (hex) | Base58 Leading Character | Represents | Example |
00 | 1 | P2PKH Address | 1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP |
05 | 3 | P2SH Address | 34nSkinWC9rDDJiUY438qQN1JHmGqBHGW7 |
80 | K / L | WIF Private Key | L4mee2GrpBSckB9SgC9WhHxvtEgKUvgvTiyYcGu38mr9CGKBGp93 |
80 | 5 | WIF Private Key | 5KXWNXeaVMwjzMsrKPv8dmdEZuVPmPay4nm5SfVZCjLHoy1B56w |
0488ADE4 | xprv | Extended Private Key | xprv9tuogRdb5YTgcL3P8Waj7REqDuQx4sXcodQaWTtEVFEp6yRKh1CjrWfXChnhgHeLDuXxo2auDZegMiVMGGxwxcrb2PmiGyCngLxvLeGsZRq |
0488B21E | xpub | Extended Public Key | xpub67uA5wAUuv1ypp7rEY7jUZBZmwFSULFUArLBJrHr3amnymkUEYWzQJz13zLacZv33sSuxKVmerpZeFExapBNt8HpAqtTtWqDQRAgyqSKUHu |
Testnet
Prefix (hex) | Base58 Leading Character | Represents | Example |
6F | m / n | P2PKH Address | ms2qxPw1Q2nTkm4eMHqe6mM7JAFqAwDhpB |
C4 | 2 | P2SH Address | 2MwSNRexxm3uhAKF696xq3ztdiqgMj36rJo |
EF | C | WIF Private Key | cV8e6wGiFF8succi4bxe4cTzWTyj9NncXm81ihMYdtW9T1QXV5gS |
EF | 9 | WIF Private Key | 93J8xGU85b1sxRP8wjp3WNBCDZr6vZ8AQjd2XHr4YU5Lb21jS1L |
04358394 | tprv | Extended Private Key | tprv9tuogRdb5YTgcL3P8Waj7REqDuQx4sXcodQaWTtEVFEp6yRKh1CjrWfXChnhgHeLDuXxo2auDZegMiVMGGxwxcrb2PmiGyCngLxvLeGsZRq |
043587CF | tpub | Extended Public Key | tpub67uA5wAUuv1ypp7rEY7jUZBZmwFSULFUArLBJrHr3amnymkUEYWzQJz13zLacZv33sSuxKVmerpZeFExapBNt8HpAqtTtWqDQRAgyqSKUHu |
ทำไมเราต้องใช้ address?
“address คือวิธีการที่ไม่ซับซ้อนที่จะเขียนสคริปต์สำหรับล็อก (Locking script) ในแบบที่มนุษย์สามารถอ่านได้ – echeveria (บน IRC)”
ถ้าเราไม่ได้ใช้ address เราจะต้องส่งสคริปต์สำหรับล็อก (Locking script) ที่สมบูรณ์ให้กับคนอื่น แบบนี้
76a914662ad25db00e7bb38bc04831ae48b4b446d1269888ac # P2PKH script
โดยการใช้ address เราสามารถส่งข้อมูลแบบนี้ให้แทนได้
1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP
ข้อมูลทั้งคู่จะได้ผลลัพธ์เช่นเดียวกัน แต่ address จะเป็นรูปแบบที่เป็นมิตรกับผู้ใช้งาน ให้สามารถส่งต่อได้สะดวกมากกว่า ยิ่งไปกว่านั้นยังประกอบด้วย checksum ซึ่งหมายความว่าจะมีการแจ้งเตือนทันทีหากมีใครเขียน address ผิด
Code
Note: Code นี้จะต้องใช้ checksum.rb และ base58_encode.rb.
Ruby
def hash160_to_address(hash160, type=:p2pkh)
prefixes = {
p2pkh: '00', # 1address - For standard bitcoin addresses
p2sh: '05', # 3address - For sending to an address that requires multiple signatures (multisig)
p2pkh_testnet: '6F', # (m/n)address
p2sh_testnet: 'C4' # 2address
}
prefix = prefixes[type]
checksum = checksum(prefix + hash160)
address = base58_encode(prefix + hash160 + checksum)
return address
end
hash160 = '662ad25db00e7bb38bc04831ae48b4b446d12698'
puts hash160_to_address(hash160) # 1AKDDsfTh8uY4X3ppy1m7jw1fVMBSMkzjP