diff --git a/ucoin/wrappers/transactions.py b/ucoin/wrappers/transactions.py index 28d4585565e2b3f046ec3b4c4bb5c2075b66154e..ff19ee7f6d2d5d3f6d907eb35b349c80bd44015e 100644 --- a/ucoin/wrappers/transactions.py +++ b/ucoin/wrappers/transactions.py @@ -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