예제 #1
0
    def test_contains_transaction(self):
        storage = MemPoolStorage(self.storage_filepath)
        storage.delete_all_transactions_from_mempool()
        tx1 = Transaction([], [], 10)
        tx2 = Transaction([], [], 20)
        storage.add_transaction_to_mempool(tx1)

        self.assertTrue(storage.contains_transaction(tx1))
        self.assertFalse(storage.contains_transaction(tx2))
예제 #2
0
    def test_get_three_last_tx_two_items_list(self):
        storage = MemPoolStorage(self.storage_filepath)
        storage.delete_all_transactions_from_mempool()
        tx1 = Transaction([], [], 10)
        tx2 = Transaction([], [], 20)
        storage.add_transaction_to_mempool(tx1)
        storage.add_transaction_to_mempool(tx2)

        last_tx_list = storage.get_three_first_transactions()
        self.assertEqual(2, len(last_tx_list))
        self.assertTrue(tx1 in last_tx_list)
        self.assertTrue(tx2 in last_tx_list)
예제 #3
0
    def test_delete_transaction_if_exists(self):
        storage = MemPoolStorage(self.storage_filepath)
        storage.delete_all_transactions_from_mempool()
        tx1 = Transaction([], [], 10)
        tx2 = Transaction([], [], 20)
        tx3 = Transaction([], [], 30)

        storage.add_transaction_to_mempool(tx1)
        storage.add_transaction_to_mempool(tx2)

        self.assertEqual(2, len(storage.get_all_transactions()))
        self.assertFalse(storage.delete_transaction_if_exists(tx3))
        self.assertEqual(2, len(storage.get_all_transactions()))

        self.assertTrue(storage.delete_transaction_if_exists(tx2))
        self.assertEqual(1, len(storage.get_all_transactions()))
예제 #4
0
def construct_transaction(sender_privkey, sender, recipient, amount,
                          utxo_list):
    # collect all outputs necessary to pay that amount of money
    outputs_to_spend = []
    value_to_spend = 0
    for outp in utxo_list:
        outputs_to_spend.append(outp)
        value_to_spend += outp.value
        if value_to_spend >= amount:
            break

    # convert all outputs we are going to use in the ouputs
    # create outputs: to the recipient and change for the sender(if needed)
    outputs = [Output(amount, construct_transaction_locking_script(recipient))]
    if value_to_spend > amount:
        outputs.append(
            Output(value_to_spend - amount,
                   construct_transaction_locking_script(sender)))

    inputs_with_no_script = [
        Input(outp.txid, outp.vout, "") for outp in outputs_to_spend
    ]
    inputs = []
    for inp in inputs_with_no_script:
        inputs.append(
            Input(
                inp.txid, inp.vout,
                construct_transaction_unlocking_script(sender_privkey,
                                                       inputs_with_no_script,
                                                       outputs, 0, utxo_list)))
    return Transaction(inputs, outputs, locktime=0)
예제 #5
0
    def test_deleting_last_transaction(self):
        storage = MemPoolStorage(self.storage_filepath)
        storage.delete_all_transactions_from_mempool()
        tx1 = Transaction([], [], 10)
        tx2 = Transaction([], [], 20)
        tx3 = Transaction([], [], 30)
        storage.add_transaction_to_mempool(tx1)
        storage.add_transaction_to_mempool(tx2)
        storage.add_transaction_to_mempool(tx3)

        self.assertEqual(3, storage.get_transactions_count())

        storage.delete_last_transaction_from_mempool()
        self.assertEqual(2, storage.get_transactions_count())

        tx_list = storage.get_all_transactions()
        self.assertFalse(tx3 in tx_list)
예제 #6
0
    def test_adding_to_mempool(self):
        storage = MemPoolStorage(self.storage_filepath)
        storage.delete_all_transactions_from_mempool()
        tx = Transaction([], [], 10)
        storage.add_transaction_to_mempool(tx)

        tx_list = storage.get_all_transactions()
        self.assertTrue(tx in tx_list)
예제 #7
0
    def test_raw_transaction_creation(self):
        inputs = [Input(
            "fc9e4f9c334d55c1dc535bd691a1c159b0f7314c54745522257a905e18a56779",
            1,
            ""
        )]
        outputs = [Output(
            2207563,
            "0014db4d1141d0048b1ed15839d0b7a4c488cd368b0e"
        )]
        witness = ["47304402206a2eb16b7b92051d0fa38c133e67684ed064effada1d7f925c842da401d4f22702201f196b10e6e4b4a9fff948e5c5d71ec5da53e90529c8dbd122bff2b1d21dc8a90121039b7bcd0824b9a9164f7ba098408e63e5b7e3cf90835cceb19868f54f8961a825"]
        tx = Transaction(inputs, outputs, locktime=0, witness=witness, version=2)

        raw_tx = "020000000001017967a5185e907a25225574544c31f7b059c1a191d65b53dcc1554d339c4f9efc0100000000ffffffff014baf210000000000160014db4d1141d0048b1ed15839d0b7a4c488cd368b0e016a47304402206a2eb16b7b92051d0fa38c133e67684ed064effada1d7f925c842da401d4f22702201f196b10e6e4b4a9fff948e5c5d71ec5da53e90529c8dbd122bff2b1d21dc8a90121039b7bcd0824b9a9164f7ba098408e63e5b7e3cf90835cceb19868f54f8961a82500000000"
        self.assertEqual(raw_tx, Serializer.serialize_transaction(tx))
예제 #8
0
    def test_updating_utxo_pool_with_tx(self):
        storage = UTXOStorage(self.storage_filepath)
        storage.delete_all_otputs()

        outp0 = Output("", 10, txid="07c0efe33946c5f81b5a86d79eda89e47979d4796d5ec675a9fccde7c31c4f50", vout=1)
        storage.add_new_output(outp0)

        outp1 = Output(
                    900,
                    "76a914cabf271134a5f9228132598c8b4e6ad4586532f888ac",
                    txid="1423215db125380dd21051c0d22f31fd4be2a25794b8789796343f4015c1baff",
                    vout=1
                )
        outp2 = Output(
                    4999999100,
                    "76a914e8e4b375038b0a1a1dc70543eab7ea6ce279df4388ac",
                    txid="1423215db125380dd21051c0d22f31fd4be2a25794b8789796343f4015c1baff",
                    vout=2
                )

        tx = Transaction(
            [
                Input(
                    "07c0efe33946c5f81b5a86d79eda89e47979d4796d5ec675a9fccde7c31c4f50",
                    1,
                    "404bb493aa8509356c1295c65acd3a44c339729d865422a47cb15631cda545ee3fc2eb86b418a5bb90202040430b723fdbf8429ff232bfa521c25da09539644093410450e829ca678c60031a11b990fea865e03ba35d0579aa62750b918b98c4b935d803ecc57a4bb2fc2ab1193a87fca5386d71516aca89df267fc907bcb3b84d396a"
                )
            ],
            [outp1, outp2],
            0
        )

        storage.update_with_new_transaction(tx)

        outp_list = storage.get_all_outputs()
        self.assertFalse(outp0 in outp_list)
        self.assertTrue(outp1 in outp_list)
        self.assertTrue(outp2 in outp_list)