티스토리 뷰
네이티브 세그윗 주소 생성 코드
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.
- [비트코인 구조] 세그윗(Segwit), Bech32 주소
- bitcoinlib 라이브러리 문서
- HD wallet usage
- Native segwit 주소 출금
728x90
반응형
'비트코인 공부' 카테고리의 다른 글
비트코인의 총 발행량은 왜 21백만개가 되었을까 (0) | 2023.03.09 |
---|---|
니모닉 <=> 비밀키(엔트로피) 변환 파이썬 코드 (4) | 2023.02.02 |
23개 니모닉에서 24번째 단어 계산하는 코드 (19) | 2022.12.25 |
파이썬) SegWit 주소 생성하고 출금하기 (28) | 2022.12.16 |
SegWit 주소 사용이 권장되는 이유 (0) | 2022.12.14 |
댓글