aucoin/tools/find_best_tx_alg_test.py
Casper V. Kristensen b7053ad014
Publish
2018-07-15 23:30:55 +02:00

173 lines
4.2 KiB
Python

import time
from random import randint, random
import matplotlib.pyplot as plt
import numpy as np
from aucoin.blockchain import Blockchain
from aucoin.mempool import Mempool
from aucoin.miner import find_best_transactions
class Transaction(object):
_fee = 1
_hash = b""
prev_tx_hash = b"sdfasfasdfasdfasdf"
txout_index = 0
signature = b""
public_key = b""
_size = 12
@property
def hash(self):
return self._hash
def __bytes__(self):
return self.prev_tx_hash + \
self.txout_index.to_bytes(4, "big") + \
self.signature + \
self.public_key
@property
def inputs(self):
return [self]
@property
def size(self) -> int:
"""
:return: Size of transaction in bytes.
"""
return self._size
def fee(self, bc=None, mem=None, session=None) -> int:
return self._fee
def __str__(self, *args, **kwargs):
return f"Hash: {self._hash.hex()}"
def generate_transactions(number: int, pct=70):
txs = []
for i in range(number):
tx = Transaction()
tx._hash = i.to_bytes(12, "big")
tx._size = randint(30, 60)
tx._fee = randint(10, 30 ) + tx._size/10
if random() < pct/100 and len(txs) > 0:
tx.prev_tx_hash = txs[randint(0, len(txs)-1)].hash
## tx._fee += randint(0, 100)
pass
else:
tx.prev_tx_hash = b"sdfasfasdfasdfasdf"
txs.append(tx)
return txs
def simple_alg(txs, max_size):
size = 0
total = 0
best = []
sorted_txs = sorted(txs, key=lambda tx: tx._fee / tx.size, reverse=True)
for tx in sorted_txs:
if mempool.transaction(tx.prev_tx_hash) is None:
if size + tx.size < max_size:
size += tx.size
total += tx._fee
best.append(tx)
return best, total
sums_best = [[],[],[],[]]
sums = [[],[],[],[]]
max_size = 2048*2
"""
start = 0
end = 1000
times_best = []
times_simple = []
for j in [0, 1, 2, 3]:
transactions = generate_transactions(end, j*20)
for i in range(start, end):
mempool = Mempool()
blockchain = Blockchain()
txs = transactions[0:i]
for tx in txs:
mempool[tx.hash] = tx
# log time and run alg.
t = time.time()
best, total = find_best_transactions(blockchain, mempool, max_size, None)
times_best.append(time.time() - t)
# log time and run simple alg.
t = time.time()
simple_b, simple_total = simple_alg(txs, max_size)
times_simple.append(time.time() - t)
sums_best[j].append(total)
sums[j].append(simple_total)
print(mean(sums_best[0]), mean(sums[0]))
print(f"Alg: {sum(times_best)}")
print(f"Simple: {sum(times_simple)}")
x = range(start, end)
plt.figure(1)
plt.subplot(141)
plt.plot(x, np.array(sums_best[0]), 'g', x, sums[0], 'r--')
plt.xlabel('transactions in mempool')
plt.ylabel('Total fee')
plt.title('0% dependent')
plt.subplot(142)
plt.plot(x, np.array(sums_best[1]), 'g', x, sums[1], 'r--')
plt.title('20% dependent')
plt.xlabel('transactions in mempool')
plt.subplot(143)
plt.plot(x, np.array(sums_best[2]), 'g', x, sums[2], 'r--')
plt.title('40% dependent')
plt.xlabel('transactions in mempool')
plt.subplot(144)
plt.plot(x, np.array(sums_best[3]), 'g', x, sums[3], 'r--')
plt.title('60% dependent')
plt.xlabel('transactions in mempool')
plt.show()
"""
times = []
times_simple = []
for i in range(0, 100):
mempool = Mempool()
blockchain = Blockchain()
txs = generate_transactions(1000, i)
for tx in txs:
mempool[tx.hash] = tx
t = time.time()
best, total = find_best_transactions(blockchain, mempool, max_size, None)
times.append(time.time() - t)
t = time.time()
simple_b, simple_total = simple_alg(txs, max_size)
times_simple.append(time.time() - t)
print(f"Extended: {sum(times)}")
print(f"Simple: {sum(times_simple)}")
x = range(0, 100)
plt.figure(2)
plt.plot(x, np.array(times)*1000, 'g', x, np.array(times_simple)*1000, 'r--')
plt.title('Runningtime of extended (green) compared to simple (red) algorithm')
plt.xlabel('% of dependent transactions (of 1000 in total)')
plt.ylabel('milliseconds')
plt.show()