|
|
@@ -13,10 +13,11 @@ Zcash protocol
|
|
|
"""
|
|
|
|
|
|
from .btc import mainnet
|
|
|
+from ..protocol import decoded_addr
|
|
|
|
|
|
class mainnet(mainnet):
|
|
|
base_coin = 'ZEC'
|
|
|
- addr_ver_bytes = { '1cb8': 'p2pkh', '1cbd': 'p2sh', '169a': 'zcash_z', 'a8abd3': 'viewkey' }
|
|
|
+ addr_ver_info = { '1cb8': 'p2pkh', '1cbd': 'p2sh', '169a': 'zcash_z', 'a8abd3': 'viewkey' }
|
|
|
wif_ver_num = { 'std': '80', 'zcash_z': 'ab36' }
|
|
|
pubkey_types = ('std','zcash_z')
|
|
|
mmtypes = ('L','C','Z')
|
|
|
@@ -32,6 +33,18 @@ class mainnet(mainnet):
|
|
|
def get_addr_len(self,addr_fmt):
|
|
|
return (20,64)[addr_fmt in ('zcash_z','viewkey')]
|
|
|
|
|
|
+ def decode_addr_bytes(self,addr_bytes):
|
|
|
+ """
|
|
|
+ vlen must be set dynamically since Zcash has variable length ver_bytes
|
|
|
+ """
|
|
|
+ for ver_bytes,addr_fmt in self.addr_ver_bytes.items():
|
|
|
+ vlen = len(ver_bytes)
|
|
|
+ if addr_bytes[:vlen] == ver_bytes:
|
|
|
+ if len(addr_bytes[vlen:]) == self.get_addr_len(addr_fmt):
|
|
|
+ return decoded_addr( addr_bytes[vlen:], ver_bytes, addr_fmt )
|
|
|
+
|
|
|
+ return False
|
|
|
+
|
|
|
def preprocess_key(self,sec,pubkey_type):
|
|
|
if pubkey_type == 'zcash_z': # zero the first four bits
|
|
|
return bytes([sec[0] & 0x0f]) + sec[1:]
|
|
|
@@ -49,4 +62,4 @@ class mainnet(mainnet):
|
|
|
|
|
|
class testnet(mainnet):
|
|
|
wif_ver_num = { 'std': 'ef', 'zcash_z': 'ac08' }
|
|
|
- addr_ver_bytes = { '1d25': 'p2pkh', '1cba': 'p2sh', '16b6': 'zcash_z', 'a8ac0c': 'viewkey' }
|
|
|
+ addr_ver_info = { '1d25': 'p2pkh', '1cba': 'p2sh', '16b6': 'zcash_z', 'a8ac0c': 'viewkey' }
|