support sending to segwit native addresses (bip173)
This commit is contained in:
@@ -29,47 +29,49 @@ import re
|
||||
import hmac
|
||||
import os
|
||||
|
||||
import ecdsa
|
||||
import pyaes
|
||||
|
||||
from .util import bfh, bh2u, to_string
|
||||
from . import version
|
||||
from .util import print_error, InvalidPassword, assert_bytes, to_bytes
|
||||
from . import segwit_addr
|
||||
|
||||
import ecdsa
|
||||
import pyaes
|
||||
|
||||
# Bitcoin network constants
|
||||
TESTNET = False
|
||||
NOLNET = False
|
||||
ADDRTYPE_P2PKH = 0
|
||||
ADDRTYPE_P2SH = 5
|
||||
ADDRTYPE_P2WPKH = 6
|
||||
SEGWIT_HRP = "bc"
|
||||
XPRV_HEADER = 0x0488ade4
|
||||
XPUB_HEADER = 0x0488b21e
|
||||
HEADERS_URL = "https://headers.electrum.org/blockchain_headers"
|
||||
GENESIS = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"
|
||||
|
||||
def set_testnet():
|
||||
global ADDRTYPE_P2PKH, ADDRTYPE_P2SH, ADDRTYPE_P2WPKH
|
||||
global ADDRTYPE_P2PKH, ADDRTYPE_P2SH
|
||||
global XPRV_HEADER, XPUB_HEADER
|
||||
global TESTNET, HEADERS_URL
|
||||
global GENESIS
|
||||
global SEGWIT_HRP
|
||||
TESTNET = True
|
||||
ADDRTYPE_P2PKH = 111
|
||||
ADDRTYPE_P2SH = 196
|
||||
ADDRTYPE_P2WPKH = 3
|
||||
SEGWIT_HRP = "tb"
|
||||
XPRV_HEADER = 0x04358394
|
||||
XPUB_HEADER = 0x043587cf
|
||||
HEADERS_URL = "https://headers.electrum.org/testnet_headers"
|
||||
GENESIS = "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"
|
||||
|
||||
def set_nolnet():
|
||||
global ADDRTYPE_P2PKH, ADDRTYPE_P2SH, ADDRTYPE_P2WPKH
|
||||
global ADDRTYPE_P2PKH, ADDRTYPE_P2SH
|
||||
global XPRV_HEADER, XPUB_HEADER
|
||||
global NOLNET, HEADERS_URL
|
||||
global GENESIS
|
||||
TESTNET = True
|
||||
ADDRTYPE_P2PKH = 0
|
||||
ADDRTYPE_P2SH = 5
|
||||
ADDRTYPE_P2WPKH = 6
|
||||
XPRV_HEADER = 0x0488ade4
|
||||
XPUB_HEADER = 0x0488b21e
|
||||
HEADERS_URL = "https://headers.electrum.org/nolnet_headers"
|
||||
@@ -290,8 +292,6 @@ def hash_160(public_key):
|
||||
|
||||
def hash160_to_b58_address(h160, addrtype, witness_program_version=1):
|
||||
s = bytes([addrtype])
|
||||
if addrtype == ADDRTYPE_P2WPKH:
|
||||
s += bytes([witness_program_version]) + b'\x00'
|
||||
s += h160
|
||||
return base_encode(s+Hash(s)[0:4], base=58)
|
||||
|
||||
@@ -313,11 +313,14 @@ def hash160_to_p2sh(h160):
|
||||
def public_key_to_p2pkh(public_key):
|
||||
return hash160_to_p2pkh(hash_160(public_key))
|
||||
|
||||
|
||||
def public_key_to_p2wpkh(public_key):
|
||||
return hash160_to_b58_address(hash_160(public_key), ADDRTYPE_P2WPKH)
|
||||
def hash160_to_segwit_addr(h160):
|
||||
return segwit_addr.encode(SEGWIT_HRP, 0, h160)
|
||||
|
||||
def address_to_script(addr):
|
||||
if is_segwit_address(addr):
|
||||
witver, witprog = segwit_addr.decode(SEGWIT_HRP, addr)
|
||||
script = bytes([witver]).hex() + push_script(bytes(witprog).hex())
|
||||
return script
|
||||
addrtype, hash_160 = b58_address_to_hash160(addr)
|
||||
if addrtype == ADDRTYPE_P2PKH:
|
||||
script = '76a9' # op_dup, op_hash_160
|
||||
@@ -476,7 +479,11 @@ def address_from_private_key(sec):
|
||||
address = public_key_to_p2pkh(bfh(public_key))
|
||||
return address
|
||||
|
||||
def is_address(addr):
|
||||
def is_segwit_address(addr):
|
||||
witver, witprog = segwit_addr.decode(SEGWIT_HRP, addr)
|
||||
return witprog is not None
|
||||
|
||||
def is_b58_address(addr):
|
||||
try:
|
||||
addrtype, h = b58_address_to_hash160(addr)
|
||||
except Exception as e:
|
||||
@@ -485,6 +492,10 @@ def is_address(addr):
|
||||
return False
|
||||
return addr == hash160_to_b58_address(h, addrtype)
|
||||
|
||||
def is_address(addr):
|
||||
return is_segwit_address(addr) or is_b58_address(addr)
|
||||
|
||||
|
||||
def is_p2pkh(addr):
|
||||
if is_address(addr):
|
||||
addrtype, h = b58_address_to_hash160(addr)
|
||||
|
||||
Reference in New Issue
Block a user