don't pass addresses to tx.sign(), pass keypairs instead
This commit is contained in:
parent
0424d5eb85
commit
4869d05841
|
@ -593,27 +593,16 @@ class Transaction:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def sign(self, private_keys):
|
def sign(self, keypairs):
|
||||||
import deserialize
|
import deserialize
|
||||||
is_complete = True
|
is_complete = True
|
||||||
|
print_error("tx.sign(), keypairs:", keypairs)
|
||||||
|
|
||||||
for i, txin in enumerate(self.inputs):
|
for i, txin in enumerate(self.inputs):
|
||||||
|
|
||||||
# build list of public/private keys
|
# if the input is multisig, parse redeem script
|
||||||
keypairs = {}
|
|
||||||
for sec in private_keys.get( txin.get('address') ):
|
|
||||||
compressed = is_compressed(sec)
|
|
||||||
pkey = regenerate_key(sec)
|
|
||||||
pubkey = GetPubKey(pkey.pubkey, compressed)
|
|
||||||
keypairs[ pubkey.encode('hex') ] = sec
|
|
||||||
|
|
||||||
redeem_script = txin.get('redeemScript')
|
redeem_script = txin.get('redeemScript')
|
||||||
if redeem_script:
|
num, redeem_pubkeys = deserialize.parse_redeemScript(redeem_script) if redeem_script else (1, [txin.get('redeemPubkey')])
|
||||||
# parse the redeem script
|
|
||||||
num, redeem_pubkeys = deserialize.parse_redeemScript(redeem_script)
|
|
||||||
else:
|
|
||||||
num = 1
|
|
||||||
redeem_pubkeys = keypairs.keys()
|
|
||||||
|
|
||||||
# get list of already existing signatures
|
# get list of already existing signatures
|
||||||
signatures = txin.get("signatures",[])
|
signatures = txin.get("signatures",[])
|
||||||
|
|
|
@ -353,16 +353,6 @@ class Wallet:
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def get_private_keys(self, addresses, password):
|
|
||||||
if not self.seed: return {}
|
|
||||||
# decode seed in any case, in order to test the password
|
|
||||||
seed = self.decode_seed(password)
|
|
||||||
out = {}
|
|
||||||
for address in addresses:
|
|
||||||
pk = self.get_private_key(address, password)
|
|
||||||
if pk: out[address] = pk
|
|
||||||
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
def signrawtransaction(self, tx, input_info, private_keys, password):
|
def signrawtransaction(self, tx, input_info, private_keys, password):
|
||||||
|
@ -378,8 +368,6 @@ class Wallet:
|
||||||
pubkey = GetPubKey(pkey.pubkey, compressed)
|
pubkey = GetPubKey(pkey.pubkey, compressed)
|
||||||
keypairs[ pubkey.encode('hex') ] = sec
|
keypairs[ pubkey.encode('hex') ] = sec
|
||||||
|
|
||||||
# will be filled for each input
|
|
||||||
private_keys = {}
|
|
||||||
|
|
||||||
for txin in tx.inputs:
|
for txin in tx.inputs:
|
||||||
# convert to own format
|
# convert to own format
|
||||||
|
@ -406,30 +394,25 @@ class Wallet:
|
||||||
account, name, sequence = txin.get('KeyID')
|
account, name, sequence = txin.get('KeyID')
|
||||||
if name != 'BIP32': continue
|
if name != 'BIP32': continue
|
||||||
sec = self.accounts[account].get_private_key(sequence, seed)
|
sec = self.accounts[account].get_private_key(sequence, seed)
|
||||||
addr = self.accounts[account].get_address(sequence)
|
pubkey = self.accounts[account].get_pubkey(sequence)
|
||||||
txin['address'] = addr
|
txin['address'] = addr
|
||||||
private_keys[addr] = [sec]
|
keypairs[pubkey] = [sec]
|
||||||
|
|
||||||
redeem_script = txin.get("redeemScript")
|
redeem_script = txin.get("redeemScript")
|
||||||
if redeem_script:
|
if redeem_script:
|
||||||
num, redeem_pubkeys = deserialize.parse_redeemScript(redeem_script)
|
num, redeem_pubkeys = deserialize.parse_redeemScript(redeem_script)
|
||||||
addr = hash_160_to_bc_address(hash_160(redeem_script.decode('hex')), 5)
|
addr = hash_160_to_bc_address(hash_160(redeem_script.decode('hex')), 5)
|
||||||
txin['address'] = addr
|
txin['address'] = addr
|
||||||
private_keys[addr] = []
|
|
||||||
for pubkey in redeem_pubkeys:
|
|
||||||
if pubkey in keypairs:
|
|
||||||
private_keys[addr].append( keypairs[pubkey] )
|
|
||||||
|
|
||||||
elif txin.get("raw_output_script"):
|
elif txin.get("raw_output_script"):
|
||||||
addr = deserialize.get_address_from_output_script(txin.get("raw_output_script").decode('hex'))
|
addr = deserialize.get_address_from_output_script(txin.get("raw_output_script").decode('hex'))
|
||||||
sec = self.get_private_key(addr, password)
|
sec = self.get_private_key(addr, password)
|
||||||
if sec:
|
if sec:
|
||||||
private_keys[addr] = [sec]
|
keypairs[pubkey] = [sec]
|
||||||
txin['address'] = addr
|
txin['address'] = addr
|
||||||
|
|
||||||
print txin
|
tx.sign( keypairs )
|
||||||
|
|
||||||
tx.sign( private_keys )
|
|
||||||
|
|
||||||
def sign_message(self, address, message, password):
|
def sign_message(self, address, message, password):
|
||||||
sec = self.get_private_key(address, password)
|
sec = self.get_private_key(address, password)
|
||||||
|
@ -934,9 +917,9 @@ class Wallet:
|
||||||
|
|
||||||
tx = Transaction.from_io(inputs, outputs)
|
tx = Transaction.from_io(inputs, outputs)
|
||||||
|
|
||||||
private_keys = {}
|
|
||||||
for i in range(len(tx.inputs)):
|
keypairs = {}
|
||||||
txin = tx.inputs[i]
|
for i, txin in enumerate(tx.inputs):
|
||||||
address = txin['address']
|
address = txin['address']
|
||||||
if address in self.imported_keys.keys():
|
if address in self.imported_keys.keys():
|
||||||
pk_addresses.append(address)
|
pk_addresses.append(address)
|
||||||
|
@ -948,11 +931,17 @@ class Wallet:
|
||||||
if redeemScript:
|
if redeemScript:
|
||||||
txin['redeemScript'] = redeemScript
|
txin['redeemScript'] = redeemScript
|
||||||
assert address == self.accounts[account].get_address(*sequence)
|
assert address == self.accounts[account].get_address(*sequence)
|
||||||
|
else:
|
||||||
|
txin['redeemPubkey'] = self.accounts[account].get_pubkey(*sequence)
|
||||||
|
|
||||||
private_keys[address] = self.get_private_key(address, password)
|
private_keys = self.get_private_key(address, password)
|
||||||
|
for sec in private_keys:
|
||||||
|
compressed = is_compressed(sec)
|
||||||
|
pkey = regenerate_key(sec)
|
||||||
|
pubkey = GetPubKey(pkey.pubkey, compressed)
|
||||||
|
keypairs[ pubkey.encode('hex') ] = sec
|
||||||
|
|
||||||
print_error( "private keys", private_keys )
|
tx.sign(keypairs)
|
||||||
tx.sign(private_keys)
|
|
||||||
|
|
||||||
for address, x in outputs:
|
for address, x in outputs:
|
||||||
if address not in self.addressbook and not self.is_mine(address):
|
if address not in self.addressbook and not self.is_mine(address):
|
||||||
|
|
Loading…
Reference in New Issue