비밀키를 직렬화하는 방법을 알아보자.

비밀키 직렬화

  • 비밀키를 직렬화할 이유는 그닥 없다.
  • 네트워크로 전파할 일이 없기 때문이다. 비밀키 전파는 지갑이 털릴 수 있는 위험이 매우 크다.
  • 그런데도 해당 기능이 있는 이유는, 지갑을 옮기고 싶은 경우가 있을 수 있기 때문이다.
    • 종이지갑 > 소프트웨어 지갑
  • 이런 경우를 위해 WIF 포맷으로 변경할 수 있어야 한다.

 
def encode_base58_checksum(b):
    return encode_base58(b + hash256(b)[:4])
 
def encode_base58(s):
    count = 0
    for c in s:  # <1>
        if c == 0:
            count += 1
        else:
            break
    num = int.from_bytes(s, 'big')
    prefix = '1' * count
    result = ''
    while num > 0:  # <2>
        num, mod = divmod(num, 58)
        result = BASE58_ALPHABET[mod] + result
    return prefix + result  # <3>
 
def hash256(s):
    '''two rounds of sha256'''
    return hashlib.sha256(hashlib.sha256(s).digest()).digest()
 
class PrivateKey:
 
    def __init__(self, secret):
        self.secret = secret
        self.point = secret * G
 
    def wif(self, compressed=True, testnet=False):
        secret_bytes = self.secret.to_bytes(32, 'big')
        if testnet:
            prefix = b'\xef'
        else:
            prefix = b'\x80'
 
        if compressed:
            suffix = b'\x01'
        else:
            suffix = b''
 
        return encode_base58_checksum(prefix + secret_bytes + suffix)
 

Reference