electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 00af3b394b10128ff1ca83102669cf28711ddf0f
parent ec9cdfaf48781356ad51db836c2336681d7c2caa
Author: ThomasV <electrumdev@gmail.com>
Date:   Sun, 14 Jun 2015 08:08:55 +0200

Merge pull request #1280 from kyuupichan/BIP-LI01

Implement BIP-LI01.
Diffstat:
Mlib/transaction.py | 4++++
Mlib/wallet.py | 15+++++++--------
2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/lib/transaction.py b/lib/transaction.py @@ -627,6 +627,10 @@ class Transaction: return script + def BIP_LI01_sort(self): + # See https://github.com/kristovatlas/rfc/blob/master/bips/bip-li01.mediawiki + self.inputs.sort(key = lambda i: (i['prevout_hash'], i['prevout_n'])) + self.outputs.sort(key = lambda o: (o[2], self.pay_script(o[0], o[1]))) def serialize(self, for_sig=None): inputs = self.inputs diff --git a/lib/wallet.py b/lib/wallet.py @@ -898,27 +898,26 @@ class Abstract_Wallet(object): # if change is above dust threshold, add a change output. change_amount = total - ( amount + fee ) if fixed_fee is not None and change_amount > 0: - # Insert the change output at a random position in the outputs - posn = random.randint(0, len(tx.outputs)) - tx.outputs[posn:posn] = [( 'address', change_addr, change_amount)] + tx.outputs.append(('address', change_addr, change_amount)) elif change_amount > DUST_THRESHOLD: - # Insert the change output at a random position in the outputs - posn = random.randint(0, len(tx.outputs)) - tx.outputs[posn:posn] = [( 'address', change_addr, change_amount)] + tx.outputs.append(('address', change_addr, change_amount)) # recompute fee including change output fee = self.estimated_fee(tx) # remove change output - tx.outputs.pop(posn) + tx.outputs.pop() # if change is still above dust threshold, re-add change output. change_amount = total - ( amount + fee ) if change_amount > DUST_THRESHOLD: - tx.outputs[posn:posn] = [( 'address', change_addr, change_amount)] + tx.outputs.append(('address', change_addr, change_amount)) print_error('change', change_amount) else: print_error('not keeping dust', change_amount) else: print_error('not keeping dust', change_amount) + # Sort the inputs and outputs deterministically + tx.BIP_LI01_sort() + run_hook('make_unsigned_transaction', tx) return tx