minimize calls to estimated_fee

This commit is contained in:
ThomasV 2015-08-15 12:31:57 +02:00
parent 9893057554
commit e0939348c3
1 changed files with 16 additions and 3 deletions

View File

@ -878,6 +878,7 @@ class Abstract_Wallet(object):
# this method can be overloaded # this method can be overloaded
return tx.get_fee() return tx.get_fee()
@profiler
def estimated_fee(self, tx, fee_per_kb): def estimated_fee(self, tx, fee_per_kb):
estimated_size = len(tx.serialize(-1))/2 estimated_size = len(tx.serialize(-1))/2
fee = int(fee_per_kb * estimated_size / 1000.) fee = int(fee_per_kb * estimated_size / 1000.)
@ -897,7 +898,7 @@ class Abstract_Wallet(object):
inputs = [] inputs = []
tx = Transaction.from_io(inputs, outputs) tx = Transaction.from_io(inputs, outputs)
fee = fixed_fee if fixed_fee is not None else 0 fee = fixed_fee if fixed_fee is not None else 0
# add old inputs first # add inputs, sorted by age
for item in coins: for item in coins:
v = item.get('value') v = item.get('value')
total += v total += v
@ -911,14 +912,26 @@ class Abstract_Wallet(object):
break break
else: else:
raise NotEnoughFunds() raise NotEnoughFunds()
# remove unneeded inputs # remove unneeded inputs.
removed = False
for item in sorted(tx.inputs, key=itemgetter('value')):
v = item.get('value')
if total - v >= amount + fee:
tx.inputs.remove(item)
total -= v
removed = True
continue
else:
break
if removed:
fee = fixed_fee if fixed_fee is not None else self.estimated_fee(tx, fee_per_kb)
for item in sorted(tx.inputs, key=itemgetter('value')): for item in sorted(tx.inputs, key=itemgetter('value')):
v = item.get('value') v = item.get('value')
if total - v >= amount + fee: if total - v >= amount + fee:
tx.inputs.remove(item) tx.inputs.remove(item)
total -= v total -= v
fee = fixed_fee if fixed_fee is not None else self.estimated_fee(tx, fee_per_kb) fee = fixed_fee if fixed_fee is not None else self.estimated_fee(tx, fee_per_kb)
else: continue
break break
print_error("using %d inputs"%len(tx.inputs)) print_error("using %d inputs"%len(tx.inputs))