Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
raise TransactionError("Can not sign coinbase transactions")
pub_key_list = [k.public_byte for k in self.inputs[tid].keys]
n_total_sigs = len(self.inputs[tid].keys)
sig_domain = [''] * n_total_sigs
tx_hash = self.signature_hash(tid, witness_type=self.inputs[tid].witness_type)
for key in tid_keys:
# Check if signature signs known key and is not already in list
if key.public_byte not in pub_key_list:
raise TransactionError("This key does not sign any known key: %s" % key.public_hex)
if key in [x.public_key for x in self.inputs[tid].signatures]:
_logger.info("Key %s already signed" % key.public_hex)
break
if not key.private_byte:
raise TransactionError("Please provide a valid private key to sign the transaction")
sig = sign(tx_hash, key)
newsig_pos = pub_key_list.index(key.public_byte)
sig_domain[newsig_pos] = sig
n_signs += 1
if not n_signs:
break
# Add already known signatures on correct position
n_sigs_to_insert = len(self.inputs[tid].signatures)
for sig in self.inputs[tid].signatures:
if not sig.public_key:
break
newsig_pos = pub_key_list.index(sig.public_key.public_byte)
if sig_domain[newsig_pos] == '':
sig_domain[newsig_pos] = sig
hash_outputs = double_sha256(outputs_serialized)
elif (hash_type & 0x1f) != SIGHASH_SINGLE and sign_id < len(self.outputs):
outputs_serialized += struct.pack('
Contains the number of signatures, followed by the list of public keys and the OP-code for the number of signatures required.
:param key_list: List of public keys
:type key_list: Key, list
:param n_required: Number of required signatures
:type n_required: int
:param compressed: Use compressed public keys?
:type compressed: bool
:return bytes: A multisig redeemscript
"""
if not key_list:
return b''
if not isinstance(key_list, list):
raise TransactionError("Argument public_key_list must be of type list")
if len(key_list) > 15:
raise TransactionError("Redeemscripts with more then 15 keys are non-standard and could result in "
"locked up funds")
public_key_list = []
for k in key_list:
if isinstance(k, Key):
if compressed:
public_key_list.append(k.public_byte)
else:
public_key_list.append(k.public_uncompressed_byte)
elif len(k) == 65 and k[0:1] == b'\x04' or len(k) == 33 and k[0:1] in [b'\x02', b'\x03']:
public_key_list.append(k)
elif len(k) == 132 and k[0:2] == '04' or len(k) == 66 and k[0:2] in ['02', '03']:
public_key_list.append(to_bytes(k))
else:
kobj = Key(k)
def _serialize_multisig_redeemscript(public_key_list, n_required=None):
# Serialize m-to-n multisig script. Needs a list of public keys
for key in public_key_list:
if not isinstance(key, (str, bytes)):
raise TransactionError("Item %s in public_key_list is not of type string or bytes")
if n_required is None:
n_required = len(public_key_list)
script = int_to_varbyteint(opcodes['OP_1'] + n_required - 1)
for key in public_key_list:
script += varstr(key)
script += int_to_varbyteint(opcodes['OP_1'] + len(public_key_list) - 1)
script += b'\xae' # 'OP_CHECKMULTISIG'
return script
witness_type = 'legacy'
cursor = 4
if rawtx[4:5] == b'\0':
flag = rawtx[5:6]
if flag == b'\1':
witness_type = 'segwit'
cursor += 2
n_inputs, size = varbyteint_to_int(rawtx[cursor:cursor+9])
cursor += size
inputs = []
if not isinstance(network, Network):
network = Network(network)
for n in range(0, n_inputs):
inp_hash = rawtx[cursor:cursor + 32][::-1]
if not len(inp_hash):
raise TransactionError("Input transaction hash not found. Probably malformed raw transaction")
if inp_hash == 32 * b'\0':
coinbase = True
output_n = rawtx[cursor + 32:cursor + 36][::-1]
cursor += 36
unlocking_script_size, size = varbyteint_to_int(rawtx[cursor:cursor + 9])
cursor += size
unlocking_script = rawtx[cursor:cursor + unlocking_script_size]
inp_type = 'legacy'
if witness_type == 'segwit' and not unlocking_script_size:
inp_type = 'segwit'
cursor += unlocking_script_size
sequence_number = rawtx[cursor:cursor + 4]
cursor += 4
inputs.append(Input(prev_hash=inp_hash, output_n=output_n, unlocking_script=unlocking_script,
witness_type=inp_type, sequence=sequence_number, index_n=n, network=network))
if len(inputs) != n_inputs:
def calculate_fee(self):
"""
Get fee for this transaction in smallest denominator (i.e. Satoshi) based on its size and the
transaction.fee_per_kb value
:return int: Estimated transaction fee
"""
if not self.fee_per_kb:
raise TransactionError("Cannot calculate transaction fees: transaction.fee_per_kb is not set")
return int(self.estimate_size()/1024.0 * self.fee_per_kb)
outputs = []
n_outputs, size = varbyteint_to_int(rawtx[cursor:cursor + 9])
cursor += size
output_total = 0
for n in range(0, n_outputs):
value = change_base(rawtx[cursor:cursor + 8][::-1], 256, 10)
cursor += 8
lock_script_size, size = varbyteint_to_int(rawtx[cursor:cursor + 9])
cursor += size
lock_script = rawtx[cursor:cursor + lock_script_size]
cursor += lock_script_size
outputs.append(Output(value=value, lock_script=lock_script, network=network, output_n=n))
output_total += value
if not outputs:
raise TransactionError("Error no outputs found in this transaction")
if witness_type == 'segwit':
for n in range(0, len(inputs)):
n_items, size = varbyteint_to_int(rawtx[cursor:cursor + 9])
cursor += size
witnesses = []
for m in range(0, n_items):
witness = b'\0'
item_size, size = varbyteint_to_int(rawtx[cursor:cursor + 9])
if item_size:
witness = rawtx[cursor:cursor + item_size + size]
cursor += item_size + size
witnesses.append(witness)
if witnesses and not coinbase:
script_type = inputs[n].script_type
witness_script_type = 'sig_pubkey'
signatures = []
if not hash_type & SIGHASH_ANYONECANPAY:
hash_prevouts = double_sha256(prevouts_serialized)
if (hash_type & 0x1f) != SIGHASH_SINGLE and (hash_type & 0x1f) != SIGHASH_NONE:
hash_sequence = double_sha256(sequence_serialized)
if (hash_type & 0x1f) != SIGHASH_SINGLE and (hash_type & 0x1f) != SIGHASH_NONE:
for o in self.outputs:
outputs_serialized += struct.pack('