This repository has been archived by the owner on Aug 25, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaddress.py
71 lines (62 loc) · 2.56 KB
/
address.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# CKB Address test code
# cipher@nervos.org
from . import segwit_addr as sa
from hashlib import blake2b
import unittest
def ckbhash(msg):
hasher = blake2b(digest_size=32, person=b'ckb-default-hash')
hasher.update(msg)
return hasher.hexdigest()
FORMAT_TYPE_SHORT = 0x01
FORMAT_TYPE_FULL_DATA = 0x02
FORMAT_TYPE_FULL_TYPE = 0x04
CODE_INDEX_SECP256K1_SINGLE = 0x00
CODE_INDEX_SECP256K1_MULTI = 0x01
def generateShortAddress(code_index, args, network = "mainnet"):
""" generate a short ckb address """
hrp = {"mainnet": "ckb", "testnet": "ckt"}[network]
hrpexp = sa.bech32_hrp_expand(hrp)
format_type = FORMAT_TYPE_SHORT
payload = bytes([format_type, code_index]) + bytes.fromhex(args)
data_part = sa.convertbits(payload, 8, 5)
values = hrpexp + data_part
polymod = sa.bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ 1
checksum = [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
combined = data_part + checksum
addr = hrp + '1' + ''.join([sa.CHARSET[d] for d in combined])
return addr
def generateFullAddress(hash_type, code_hash, args, network = "mainnet"):
format_type = {"Data" : bytes([FORMAT_TYPE_FULL_DATA]),
"Type" : bytes([FORMAT_TYPE_FULL_TYPE])}[hash_type]
hrp = {"mainnet": "ckb", "testnet": "ckt"}[network]
hrpexp = sa.bech32_hrp_expand(hrp)
payload = bytes(format_type) + bytes.fromhex(code_hash)
payload += bytes.fromhex(args)
data_part = sa.convertbits(payload, 8, 5)
values = hrpexp + data_part
polymod = sa.bech32_polymod(values + [0, 0, 0, 0, 0, 0]) ^ 1
checksum = [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]
combined = data_part + checksum
addr = hrp + '1' + ''.join([sa.CHARSET[d] for d in combined])
return addr
def decodeAddress(addr, network = "mainnet"):
hrp = {"mainnet": "ckb", "testnet": "ckt"}[network]
hrpgot, data = sa.bech32_decode(addr)
if hrpgot != hrp or data == None:
return False
decoded = sa.convertbits(data, 5, 8, False)
if decoded == None:
return False
payload = bytes(decoded)
format_type = payload[0]
if format_type == FORMAT_TYPE_SHORT:
code_index = payload[1]
pk = payload[2:].hex()
return ("short", code_index, pk)
elif format_type == FORMAT_TYPE_FULL_DATA or format_type == FORMAT_TYPE_FULL_TYPE:
full_type = {FORMAT_TYPE_FULL_DATA:"Data", FORMAT_TYPE_FULL_TYPE:"Type"}[format_type]
ptr = 1
code_hash = payload[ptr : ptr+32].hex()
ptr += 32
args = payload[ptr :].hex()
return ("full", full_type, code_hash, args)