티스토리 뷰

네이티브 세그윗 주소 생성 코드

from bitcoin import *

# byte 값을 bit로 변환
def bits(bytes):
    result = ''
    for b in bytes:
        temp = ''
        for i in range(8):
            temp += str((b >> i) & 1)
        result += (temp[::-1])
    return result


# 5 bit씩 불러오기
def read_by_5bit(bytes_p) :
    count = 1
    bits_5 = ''
    result = ''
    for b in bits(bytes_p):
        bits_5 += b
        
        if count==5:
            result += f'{int(bits_5, 2):02x}'
            count = 1
            bits_5 = ''
        else:
            count += 1
    return result



def bech32_polymod(values):
  GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
  chk = 1
  for v in values:
    b = (chk >> 25)
    chk = (chk & 0x1ffffff) << 5 ^ v
    for i in range(5):
      chk ^= GEN[i] if ((b >> i) & 1) else 0
  return chk



def bech32_hrp_expand(s):
  return [ord(x) >> 5 for x in s] + [0] + [ord(x) & 31 for x in s]



def bech32_create_checksum(hrp, data):
  values = bech32_hrp_expand(hrp) + data
  polymod = bech32_polymod(values + [0,0,0,0,0,0]) ^ 1
  return [(polymod >> 5 * (5 - i)) & 31 for i in range(6)]




def get_checksum(hex_data):
    hrp = 'bc'
    data = []
    temp = ''
    for i in hex_data:
      temp += i
      if len(temp) == 2:
        data.append(int(temp, base=16))
        temp = ''
    result = bech32_create_checksum(hrp, data)
    checksum = ''
    for i in result:
      checksum += f'{i:02x}'
    return checksum



def bech32_addr(hex_data) :
    CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
    temp = ''
    address = ''
    for i in hex_data:
      temp += i
      if len(temp) == 2:
        address += CHARSET[int(temp, base=16)]
        temp = ''
    return 'bc1' + address 



def privtop2wpkh(priv):
    pub = privtopub(priv)
    prefix = '02' if int(pub[-1], 16) % 2 == 0 else '03'
    pub_c = prefix + pub[2:66]
    p = ripemd160(bytes.fromhex(sha256(bytes.fromhex(pub_c))))
    bytes_p = bytes.fromhex(p)
    hex_data = '00' + read_by_5bit(bytes_p)
    checksum = get_checksum(hex_data)
    return bech32_addr(hex_data + checksum)


priv = random_key()

privtop2wpkh(priv)

 

 

 

주의사항

  • 네이티브 세그윗 주소를 지원하지 않는 지갑이 있을 수 있음
    • 파이썬 cryptos 라이브러리의 mktx 함수에서 네이티브 세그윗 주소를 사용하면 오류 발생

 

23년 6월 21일 업데이트

cryptos 최신 버젼의 라이브러리를 이용하면 네이티브세그윗 주소에 대해서도 mktx 함수 사용 가능

 

 

Ref.

728x90
반응형
댓글
250x250
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함