Browse Source

Merge pull request #5039 from SomberNight/tx_version_bump_to_2

transaction: change default version to 2
sqlite_db
ThomasV 6 years ago
committed by GitHub
parent
commit
f846d1d59a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      electrum/tests/test_wallet_vertical.py
  2. 6
      electrum/transaction.py
  3. 8
      electrum/wallet.py

37
electrum/tests/test_wallet_vertical.py

@ -570,7 +570,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 250000)]
tx = wallet1.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet1.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertTrue(tx.is_segwit())
@ -590,7 +590,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1.get_receiving_address(), 100000)]
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@ -643,7 +643,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 370000)]
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertFalse(tx.is_complete())
wallet1b.sign_transaction(tx, password=None)
@ -666,7 +666,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 100000)]
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@ -734,7 +734,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2a.get_receiving_address(), 165000)]
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
txid = tx.txid()
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertEqual(txid, tx.txid())
@ -760,7 +760,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 100000)]
tx = wallet2a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet2a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
txid = tx.txid()
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertEqual(txid, tx.txid())
@ -814,7 +814,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 1000000)]
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@ -834,7 +834,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 300000)]
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertTrue(tx.is_segwit())
@ -874,6 +874,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.make_unsigned_transaction(coins, outputs, config=self.config, fixed_fee=5000)
tx.set_rbf(True)
tx.locktime = 1325501
tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@ -895,6 +896,7 @@ class TestWalletSending(TestCaseForTestnet):
# bump tx
tx = wallet.bump_fee(tx=Transaction(tx.serialize()), delta=5000)
tx.locktime = 1325501
tx.version = 1
self.assertFalse(tx.is_complete())
wallet.sign_transaction(tx, password=None)
@ -925,6 +927,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.cpfp(funding_tx, fee=50000)
tx.set_rbf(True)
tx.locktime = 1325502
tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@ -960,6 +963,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.make_unsigned_transaction(coins, outputs, config=self.config, fixed_fee=5000)
tx.set_rbf(True)
tx.locktime = 1325499
tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@ -981,6 +985,7 @@ class TestWalletSending(TestCaseForTestnet):
# bump tx
tx = wallet.bump_fee(tx=Transaction(tx.serialize()), delta=5000)
tx.locktime = 1325500
tx.version = 1
self.assertFalse(tx.is_complete())
wallet.sign_transaction(tx, password=None)
@ -1011,6 +1016,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.cpfp(funding_tx, fee=50000)
tx.set_rbf(True)
tx.locktime = 1325501
tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@ -1045,7 +1051,7 @@ class TestWalletSending(TestCaseForTestnet):
privkeys = ['93NQ7CFbwTPyKDJLXe97jczw33fiLijam2SCZL3Uinz1NSbHrTu', ]
network = NetworkMock()
dest_addr = 'tb1q3ws2p0qjk5vrravv065xqlnkckvzcpclk79eu2'
tx = sweep(privkeys, network, config=None, recipient=dest_addr, fee=5000, locktime=1325785)
tx = sweep(privkeys, network, config=None, recipient=dest_addr, fee=5000, locktime=1325785, tx_version=1)
tx_copy = Transaction(tx.serialize())
self.assertEqual('010000000129349e5641d79915e9d0282fdbaee8c3df0b6731bab9d70bf626e8588bde24ac010000004847304402206bf0d0a93abae0d5873a62ebf277a5dd2f33837821e8b93e74d04e19d71b578002201a6d729bc159941ef5c4c9e5fe13ece9fc544351ba531b00f68ba549c8b38a9a01fdffffff01b82e0f00000000001600148ba0a0bc12b51831f58c7ea8607e76c5982c071fd93a1400',
@ -1090,6 +1096,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1446655
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertFalse(tx.is_segwit())
@ -1132,6 +1139,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertFalse(tx.is_segwit())
@ -1172,6 +1180,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325341
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertTrue(tx.is_segwit())
@ -1213,6 +1222,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325341
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertTrue(tx.is_segwit())
@ -1249,6 +1259,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1283,6 +1294,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1317,6 +1329,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1354,6 +1367,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1391,6 +1405,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1428,6 +1443,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1477,6 +1493,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325503
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1534,6 +1551,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325504
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@ -1593,6 +1611,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325505
tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))

6
electrum/transaction.py

@ -679,7 +679,7 @@ class Transaction:
self._inputs = None
self._outputs = None # type: List[TxOutput]
self.locktime = 0
self.version = 1
self.version = 2
# by default we assume this is a partial txn;
# this value will get properly set when deserializing
self.is_partial_originally = True
@ -787,11 +787,13 @@ class Transaction:
return d
@classmethod
def from_io(klass, inputs, outputs, locktime=0):
def from_io(klass, inputs, outputs, locktime=0, version=None):
self = klass(None)
self._inputs = inputs
self._outputs = outputs
self.locktime = locktime
if version is not None:
self.version = version
self.BIP69_sort()
return self

8
electrum/wallet.py

@ -126,7 +126,7 @@ def sweep_preparations(privkeys, network: 'Network', imax=100):
def sweep(privkeys, network: 'Network', config: 'SimpleConfig', recipient, fee=None, imax=100,
*, locktime=None):
*, locktime=None, tx_version=None):
inputs, keypairs = sweep_preparations(privkeys, network, imax)
total = sum(i.get('value') for i in inputs)
if fee is None:
@ -142,7 +142,7 @@ def sweep(privkeys, network: 'Network', config: 'SimpleConfig', recipient, fee=N
if locktime is None:
locktime = get_locktime_for_new_transaction(network)
tx = Transaction.from_io(inputs, outputs, locktime=locktime)
tx = Transaction.from_io(inputs, outputs, locktime=locktime, version=tx_version)
tx.set_rbf(True)
tx.sign(keypairs)
return tx
@ -719,10 +719,12 @@ class Abstract_Wallet(AddressSynchronizer):
return tx
def mktx(self, outputs, password, config, fee=None, change_addr=None,
domain=None, rbf=False, nonlocal_only=False):
domain=None, rbf=False, nonlocal_only=False, *, tx_version=None):
coins = self.get_spendable_coins(domain, config, nonlocal_only=nonlocal_only)
tx = self.make_unsigned_transaction(coins, outputs, config, fee, change_addr)
tx.set_rbf(rbf)
if tx_version is not None:
tx.version = tx_version
self.sign_transaction(tx, password)
return tx

Loading…
Cancel
Save