trezor multisig: build xpub from pubkey

This commit is contained in:
ThomasV 2015-07-05 23:29:36 +02:00
parent ad9f7411d7
commit 15f592f022
2 changed files with 17 additions and 5 deletions

View File

@ -714,6 +714,14 @@ def bip32_root(seed, testnet=False):
return EncodeBase58Check(xprv), EncodeBase58Check(xpub)
def xpub_from_pubkey(cK, testnet=False):
header_pub, header_priv = _get_headers(testnet)
assert cK[0] in ['\x02','\x03']
master_c = chr(0)*32
xpub = (header_pub + "00" + "00000000" + "00000000").decode("hex") + master_c + cK
return EncodeBase58Check(xpub)
def bip32_private_derivation(xprv, branch, sequence, testnet=False):
assert sequence.startswith(branch)
if branch == sequence:

View File

@ -11,8 +11,10 @@ from PyQt4.Qt import QMessageBox, QDialog, QVBoxLayout, QLabel, QThread, SIGNAL,
import PyQt4.QtCore as QtCore
import electrum
from electrum import bitcoin
from electrum.account import BIP32_Account
from electrum.bitcoin import EncodeBase58Check, public_key_to_bc_address, bc_address_to_hash_160
from electrum.bitcoin import EncodeBase58Check, public_key_to_bc_address, bc_address_to_hash_160, xpub_from_pubkey
from electrum.i18n import _
from electrum.plugins import BasePlugin, hook, always_hook, run_hook
from electrum.transaction import Transaction, deserialize, is_extended_pubkey, x_to_xpub
@ -245,8 +247,6 @@ class Plugin(BasePlugin):
def tx_inputs(self, tx, for_sig=False):
inputs = []
for txin in tx.inputs:
print txin
txinputtype = types.TxInputType()
if txin.get('is_coinbase'):
prev_hash = "\0"*32
@ -261,13 +261,17 @@ class Plugin(BasePlugin):
txinputtype.address_n.extend(xpub_n + s)
else:
def f(x_pubkey):
xpub, s = BIP32_Account.parse_xpubkey(x_pubkey)
if is_extended_pubkey(x_pubkey):
xpub, s = BIP32_Account.parse_xpubkey(x_pubkey)
else:
xpub = xpub_from_pubkey(x_pubkey.decode('hex'))
s = []
node = ckd_public.deserialize(xpub)
return types.HDNodePathType(node=node, address_n=s)
pubkeys = map(f, x_pubkeys)
multisig = types.MultisigRedeemScriptType(
pubkeys=pubkeys,
signatures=map(lambda x: x if x else '', txin.get('signatures')),
signatures=map(lambda x: x.decode('hex') if x else '', txin.get('signatures')),
m=txin.get('num_sig'),
)
txinputtype = types.TxInputType(