Esempio n. 1
0
    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'])
Esempio n. 2
0
    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)
Esempio n. 3
0
    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'])
Esempio n. 4
0
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))
Esempio n. 5
0
    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'])
Esempio n. 6
0
 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)
Esempio n. 7
0
    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'])
Esempio n. 8
0
    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)
Esempio n. 9
0
    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))
Esempio n. 10
0
    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)
Esempio n. 11
0
    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))