Địa chỉ định danh của một node ở trong Bitcoin network là một chuỗi gồm 25 ký tự, mỗi ký tự là 1 byte và được tạo thành từ khóa công khai của ECC (Elliptic Curve Cryptosystem).
Address Generation
Bước 1: tạo cặp khóa ECC gồm khóa công khai e và khóa cá nhân d. Khóa công khai e là một điểm P(x, y) trên nhóm đường cong Elliptic (E, +). Sử dụng kỹ thuật biểu diễn của SSL, ghép thêm 1 byte vào e để hình thành nên chuỗi 65 byte như sau:
PXY <- sparse(e) = [1 byte P | 32 bytes X | 32 bytes Y]
Trong đó:
- Byte đầu tiên là để chỉ định kiểu lưu: nếu là
0x02
hoặc0x03
thì chỉ lưu hoành độ x, tung độ y sẽ được tính từ x theo phương trình đường cong (E). Nếu là0x04
thì lưu cả hoành độ x và tung độ y. - 32 byte tiếp theo lưu giá trị của hoành độ x.
- 32 byte tiếp theo lưu giá trị của tung độ y.
Bước 2: chuỗi 65 byte trên sẽ được băm thành chuỗi 32 byte bằng thuật toán SHA-256:
Z <- SHA256(PXY) = [32 bytes Z]
Bước 3: chuỗi 32 byte ở bước trên sẽ được băm thành chuỗi 20 byte bằng thuật toán RIPE MD-160:
U <- RIPMD160(Z) = [ 20 byte U]
Bước 4: kết quả băm U được thêm vào 1 byte ở bên trái để chỉ định ý nghĩa của địa chỉ:
V <- [1 byte Q | 20 bytes U]
Các giá trị của byte đầu tiên được quy ước như sau:
0
: địa chỉ khóa công khai.5
: địa chỉ script.111
: địa chỉ khóa công khai trên testnet.196
: địa chỉ script trên testnet.
Bước 5: chuỗi 21 byte ở trên lại được băm 2 lần bằng thuật toán SHA-256 để tạo thành một chuỗi 32 byte. Ta lấy 4 byte đầu của chuỗi này làm checksum
CS <- SHA256(SHA256(V)) = [4 bytes CS]
Bước 6: ghép 4 byte checksum vào bên phải của chuỗi V ở bước 4 ta thu được địa chỉ trung gian là một chuỗi 25 byte (200 bit):
TIA <- [1 byte T | 20 bytes RIPEMD | 4 bytes SHA-2]
Bước 7: chuyển chuỗi nhị phân trên sang dạng base 58 để dễ đọc và ghi chép.
Minh họa cho quá trình trên: