Skip to content
Snippets Groups Projects
Commit 392d410d authored by inso's avatar inso
Browse files

Transactions wrappers adapted to new format

parent f3340a71
No related branches found
No related tags found
No related merge requests found
......@@ -24,29 +24,36 @@ logger = logging.getLogger("transactions")
class Transaction(Wrapper):
def __init__(self, type, pgp_fingerprint, message='', keyid=None, peering=None, server=None, port=None):
def __init__(self, pgp_fingerprint, message='', keyid=None, peering=None, server=None, port=None):
super().__init__(server, port)
self.keyid = keyid
self.pgp_fingerprint = pgp_fingerprint
self.message = message
self.type = type
self.error = None
self.peering = peering
def __call__(self):
try:
last_tx = hdc.transactions.sender.Last(self.pgp_fingerprint, server=self.server, port=self.port).get()
last_tx = hdc.transactions.sender.Last(count=1, pgp_fingerprint=self.pgp_fingerprint,
server=self.server, port=self.port).get()
last_tx = last_tx['transactions'][0]
last_tx = hdc.transactions.sender.View(self.pgp_fingerprint, tx_number=last_tx['number'],
server=self.server, port=self.port).get()
except ValueError:
last_tx = None
if last_tx:
previous_hash = hashlib.sha1(("%s%s" % (last_tx['raw'], last_tx['transaction']['signature'])).encode('ascii')).hexdigest().upper()
else:
previous_hash = None
context_data = {}
context_data.update(settings)
context_data.update(self.peering if self.peering else network.Peering().get())
context_data.update(self.peering if self.peering else network.Peering(server=self.server, port=self.port).get())
context_data['version'] = 1
context_data['number'] = 0 if not last_tx else last_tx['transaction']['number']+1
context_data['previousHash'] = hashlib.sha1(("%(raw)s%(signature)s" % last_tx).encode('ascii')).hexdigest().upper() if last_tx else None
context_data['previousHash'] = previous_hash
context_data['message'] = self.message
context_data['type'] = self.type
context_data['fingerprint'] = self.pgp_fingerprint
context_data.update(self.get_context_data())
......@@ -67,12 +74,14 @@ Number: %(number)d
tx += """\
Comment:
%(message)s
""" % context_data
%(message)s""" % context_data
tx = tx.replace("\n", "\r\n")
print(self.keyid)
print(tx)
txs = settings['gpg'].sign(tx, keyid=self.keyid, detach=True)
print(txs)
print(tx)
return self.process(tx, txs)
def get_context_data(self):
......@@ -94,104 +103,32 @@ Comment:
return False
def parse_coins(self, coins_message):
coins = []
for coin in coins_message.split(','):
data = coin.split(':')
issuer, numbers = data[0], data[1:]
for number in numbers:
view = hdc.coins.view.Owner(issuer, int(number), self.server, self.port).get()
if view['owner'] != self.pgp_fingerprint:
raise ValueError('Trying to divide a coin you do not own (%s)' % view['id'])
coins.append(view)
return coins
def get_coins_sum(self, coins):
__sum = 0
for coin in coins:
base, power = coin['id'].split('-')[2:4]
__sum += int(base) * 10**int(power)
return __sum
def check_coins_sum(self, __sum):
m = re.match(r'^(\d)(0*)$', str(__sum))
if not m: raise ValueError('bad sum value %d' % __sum)
class Transfer(Transaction):
def __init__(self, pgp_fingerprint, recipient, coins, message='', keyid=None, server=None, port=None):
super().__init__('TRANSFER', pgp_fingerprint, message, keyid=keyid, server=server, port=port)
self.recipient = recipient
self.coins = coins
def get_message(self, context_data, tx=''):
context_data['recipient'] = self.recipient
tx += """\
Recipient: %(recipient)s
Type: %(type)s
Coins:
""" % context_data
for coin in self.coins.split(','):
data = coin.split(':')
issuer = data[0]
for number in data[1:]:
context_data.update(hdc.coins.view.Owner(issuer, int(number), self.server, self.port).get())
tx += '%(id)s, %(transaction)s\n' % context_data
return tx
class RawTransfer(Transaction):
def __init__(self, pgp_fingerprint, recipient, coins, message='', keyid=None, server=None, port=None):
super().__init__('TRANSFER', pgp_fingerprint, message, keyid=keyid, server=server, port=port)
def __init__(self, pgp_fingerprint, recipient, coins, message='',
keyid=None, server=None, port=None):
super().__init__(pgp_fingerprint, message,
keyid=keyid, server=server, port=port)
self.recipient = recipient
self.coins = coins
self.coins.sort()
def get_message(self, context_data, tx=''):
context_data['recipient'] = self.recipient
tx += """\
Recipient: %(recipient)s
Type: %(type)s
Coins:
""" % context_data
for coin in self.coins:
data = coin.split('-')
context_data.update(hdc.coins.view.Owner(data[0], int(data[1]), self.server, self.port).get())
tx += '%(id)s, %(transaction)s\n' % context_data
tx += '%s' % coin
context_data.update(hdc.coins.view.Owner(coin, self.server, self.port).get())
if 'transaction' in context_data:
tx += ':%(transaction)s\n' % context_data
else:
tx += "\n"
return tx
class MonoTransaction(Transaction):
def get_next_coin_number(self, coins):
number = 0
for c in coins:
candidate = int(c['id'].split('-')[1])
if candidate > number: number = candidate
return number+1
def get_message(self, context_data, tx=''):
tx += """\
Recipient: %(fingerprint)s
Type: %(type)s
Coins:
""" % context_data
try:
last_issuance = hdc.transactions.sender.Last(self.pgp_fingerprint, self.server, self.port).get()
except ValueError:
last_issuance = None
context_data['previous_idx'] = 0 if not last_issuance else self.get_next_coin_number(last_issuance['transaction']['coins'])
tx += self.get_mono_message(context_data)
return tx
def get_mono_message(self, context_data, tx=''):
return tx
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment