def test_txhash(self): ''' https://github.com/decred/dcrd/blob/master/wire/msgtx_test.go#L139-L140 ''' outpoint = tx.DecredOutpoint(tx_id=b'\x00' * 32, index=b'\xff' * 4, tree=b'\x00') tx_ins = [tx.DecredTxIn(outpoint=outpoint, sequence=b'\xff' * 4)] tx_outs = [ tx.DecredTxOut(value=utils.i2le_padded(5000000000, 8), version=b'\xf0\xf0', output_script=helpers.DCR['ser']['hash_pk']) ] tx_witnesses = [ tx.DecredInputWitness( value=utils.i2le_padded(5000000000, 8), height=b'\x34' * 4, index=b'\x2E' * 4, stack_script=bytes([0x04, 0x31, 0xdc, 0x00, 0x1b, 0x01, 0x62]), redeem_script=b'') ] version = helpers.DCR['ser']['version'] t = tx.DecredTx(version=version, tx_ins=tx_ins, tx_outs=tx_outs, lock_time=b'\x00' * 4, expiry=b'\x00' * 4, tx_witnesses=tx_witnesses) self.assertEqual(t.tx_id, helpers.DCR['ser']['tx']['expected_hash'])
def test_calculate_fee(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertEqual(transaction.calculate_fee(), 33400)
def test_init(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertEqual(transaction, helpers.DCR['ser']['tx']['p2sh_2_p2pkh'])
def make_tx(version, tx_ins, tx_outs, lock_time, expiry=None, value_balance=None, tx_shielded_spends=None, tx_shielded_outputs=None, tx_witnesses=None, tx_joinsplits=None, joinsplit_pubkey=None, joinsplit_sig=None, binding_sig=None): ''' int, list(TxIn), list(TxOut), int, list(InputWitness) -> Tx ''' n = riemann.get_current_network_name() if 'decred' in n: return tx.DecredTx( version=utils.i2le_padded(version, 4), tx_ins=tx_ins, tx_outs=tx_outs, lock_time=utils.i2le_padded(lock_time, 4), expiry=utils.i2le_padded(expiry, 4), tx_witnesses=[tx_witnesses]) if 'sprout' in n and tx_joinsplits is not None: return tx.SproutTx( version=version, tx_ins=tx_ins, tx_outs=tx_outs, lock_time=utils.i2le_padded(lock_time, 4), tx_joinsplits=tx_joinsplits if tx_joinsplits is not None else [], joinsplit_pubkey=joinsplit_pubkey, joinsplit_sig=joinsplit_sig) if 'overwinter' in n: return tx.OverwinterTx( tx_ins=tx_ins, tx_outs=tx_outs, lock_time=utils.i2le_padded(lock_time, 4), expiry_height=utils.i2le_padded(expiry, 4), tx_joinsplits=tx_joinsplits if tx_joinsplits is not None else [], joinsplit_pubkey=joinsplit_pubkey, joinsplit_sig=joinsplit_sig) if 'sapling' in n: return tx.SaplingTx( tx_ins=tx_ins, tx_outs=tx_outs, lock_time=utils.i2le_padded(lock_time, 4), expiry_height=utils.i2le_padded(expiry, 4), value_balance=utils.i2le_padded[value_balance], tx_shielded_spends=(tx_shielded_spends if tx_shielded_spends is not None else []), tx_shielded_outputs=(tx_shielded_outputs if tx_shielded_outputs is not None else []), tx_joinsplits=tx_joinsplits if tx_joinsplits is not None else [], joinsplit_pubkey=joinsplit_pubkey, joinsplit_sig=joinsplit_sig, binding_sig=binding_sig) flag = riemann.network.SEGWIT_TX_FLAG \ if tx_witnesses is not None else None return tx.Tx(version=utils.i2le_padded(version, 4), flag=flag, tx_ins=tx_ins, tx_outs=tx_outs, tx_witnesses=tx_witnesses, lock_time=utils.i2le_padded(lock_time, 4))
def test_witness_hash(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertEqual(transaction.witness_hash(), helpers.DCR['ser']['witnesses'][0]['hash'])
def test_witness(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) tx_wit = b'\x01\x00' + b'\x02\x00' + b'\x01' + \ helpers.DCR['ser']['witnesses'][0]['witness'] self.assertEqual(transaction.witness(), tx_wit)
def test_tx_id(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertEqual(transaction.tx_id, helpers.DCR['ser']['tx']['hash']) self.assertEqual(transaction.tx_id_le, helpers.DCR['ser']['tx']['hash_le'])
def test_copy(self): res = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) copy = res.copy() self.assertEqual(res, copy) self.assertIsNot(res, copy)
def test_sighash_none(self): transaction = tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) with self.assertRaises(NotImplementedError) as context: transaction.sighash_none() self.assertIn('SIGHASH_NONE is a bad idea.', str(context.exception))
def test_sighash(self): tx_in_0 = tx.DecredTxIn.from_bytes(helpers.DCR1['ser']['ins'][0]['in']) tx_in_1 = tx.DecredTxIn.from_bytes(helpers.DCR1['ser']['ins'][1]['in']) tx_in_2 = tx.DecredTxIn.from_bytes(helpers.DCR1['ser']['ins'][2]['in']) tx_ins = [tx_in_0, tx_in_1, tx_in_2] tx_out_0 = tx.DecredTxOut.from_bytes( helpers.DCR1['ser']['outs'][0]['output']) tx_out_1 = tx.DecredTxOut.from_bytes( helpers.DCR1['ser']['outs'][1]['output']) tx_outs = [tx_out_0, tx_out_1] tx_witness_0 = tx.DecredInputWitness( value=helpers.DCR1['ser']['witness'][0]['value'], height=helpers.DCR1['ser']['witness'][0]['height'], index=helpers.DCR1['ser']['witness'][0]['index'], stack_script=helpers.DCR1['ser']['witness'][0]['stack_script'], redeem_script=b'') tx_witness_1 = tx.DecredInputWitness( value=helpers.DCR1['ser']['witness'][1]['value'], height=helpers.DCR1['ser']['witness'][1]['height'], index=helpers.DCR1['ser']['witness'][1]['index'], stack_script=helpers.DCR1['ser']['witness'][1]['stack_script'], redeem_script=b'') tx_witness_2 = tx.DecredInputWitness( value=helpers.DCR1['ser']['witness'][2]['value'], height=helpers.DCR1['ser']['witness'][2]['height'], index=helpers.DCR1['ser']['witness'][2]['index'], stack_script=helpers.DCR1['ser']['witness'][2]['stack_script'], redeem_script=b'') tx_witnesses = [tx_witness_0, tx_witness_1, tx_witness_2] tx.DecredTx(version=helpers.DCR1['ser']['version'], tx_ins=tx_ins, tx_outs=tx_outs, lock_time=helpers.DCR1['ser']['locktime'], expiry=helpers.DCR1['ser']['expiry'], tx_witnesses=tx_witnesses)
def test_init_errors(self): with self.assertRaises(ValueError) as context: tx.DecredTx(version='Hello World', tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertIn('Expected byte-like object', str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=['Hello World'], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertIn('Invalid TxIn.', str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=['Hello World'], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[self.witness]) self.assertIn('Invalid TxOut.', str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time='Hello World', expiry=self.expiry, tx_witnesses=[self.witness]) self.assertIn('Expected byte-like object', str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry='Hello World', tx_witnesses=[self.witness]) self.assertIn('Expected byte-like object', str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[self.tx_in], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=['Hello World']) self.assertIn('Invalid TxWitness', str(context.exception)) # with self.assertRaises(ValueError) as context: # tx.DecredTx( # version=self.version, # tx_ins=[self.tx_in] * 2, # tx_outs=[self.tx_out], # lock_time=self.lock_time, # expiry=self.expiry, # tx_witnesses=[self.witness]) # # self.assertIn('Witness and TxIn lists must be same length. ', # str(context.exception)) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[], tx_outs=[self.tx_out], lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[]) self.assertIn('Too few inputs or outputs. Stop that.', str(context.exception)) long_witness = tx.DecredInputWitness(self.witness_value, self.height, self.witness_index, self.stack_script * 64, self.redeem_script * 64) with self.assertRaises(ValueError) as context: tx.DecredTx(version=self.version, tx_ins=[self.tx_in] * 255, tx_outs=[self.tx_out] * 255, lock_time=self.lock_time, expiry=self.expiry, tx_witnesses=[long_witness] * 255) self.assertIn('Tx is too large. Expect less than 100kB.', str(context.exception))