Skip to content
Snippets Groups Projects
Commit 87e49b70 authored by inso's avatar inso
Browse files

Bug fixing and better transaction management thanks to cgeek

parent 3271f1a8
Branches
Tags
No related merge requests found
......@@ -24,15 +24,26 @@ logger = logging.getLogger("transactions")
class Transaction(Wrapper):
def __init__(self, pgp_fingerprint, message='', keyid=None, peering=None, server=None, port=None):
def __init__(self, pgp_fingerprint, recipient, coins, 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.error = None
self.peering = peering
self.recipient = recipient
self.coins = coins
self.coins.sort()
def __call__(self):
tx = self.get_message()
txs = settings['gpg'].sign(tx, keyid=self.keyid, detach=True)
return {'transaction':tx, 'signature':txs}
def get_context_data(self):
return {}
def get_message(self):
try:
last_tx = hdc.transactions.sender.Last(count=1, pgp_fingerprint=self.pgp_fingerprint,
server=self.server, port=self.port).get()
......@@ -55,6 +66,7 @@ class Transaction(Wrapper):
context_data['previousHash'] = previous_hash
context_data['message'] = self.message
context_data['fingerprint'] = self.pgp_fingerprint
context_data['recipient'] = self.recipient
context_data.update(self.get_context_data())
tx = """\
......@@ -66,56 +78,6 @@ Number: %(number)d
if last_tx: tx += "PreviousHash: %(previousHash)s\n" % context_data
try:
tx += self.get_message(context_data)
except ValueError as e:
self.error = e
return False
tx += """\
Comment:
%(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):
return {}
def get_message(self, context_data, tx=''):
return tx
def get_error(self):
return self.error
def process(self, tx, txs):
try:
hdc.transactions.Process(self.server, self.port).post(transaction=tx, signature=txs)
except ValueError as e:
self.error = str(e)
else:
return True
return False
class RawTransfer(Transaction):
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
......@@ -130,5 +92,9 @@ Coins:
else:
tx += "\n"
return tx
tx += """\
Comment:
%(message)s""" % context_data
tx = tx.replace("\n", "\r\n")
return tx
......@@ -69,87 +69,43 @@
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Transfer using node</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QRadioButton" name="radio_trusted_node">
<widget class="QPushButton" name="button_get_trusts">
<property name="text">
<string>Trusted node</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_trusted_node">
<property name="enabled">
<bool>true</bool>
<string>Get trusts nodes</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QRadioButton" name="radio_node_address">
<property name="text">
<string>Node</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</layout>
</widget>
</item>
<item>
<widget class="QLineEdit" name="edit_node_address">
<property name="enabled">
<bool>false</bool>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="inputMask">
<string/>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<property name="placeholderText">
<string>Node address</string>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="topMargin">
<number>5</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="label_2">
<property name="text">
<string>:</string>
<string>Wallet :</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinbox_port">
<property name="enabled">
<bool>false</bool>
</property>
<property name="maximum">
<number>99999</number>
</property>
<property name="value">
<number>8081</number>
</property>
</widget>
</item>
</layout>
<widget class="QComboBox" name="combo_wallets"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
......@@ -167,9 +123,6 @@
<property name="leftMargin">
<number>6</number>
</property>
<item>
<widget class="QComboBox" name="combo_wallets"/>
</item>
<item>
<widget class="QListView" name="list_wallet"/>
</item>
......@@ -255,6 +208,9 @@
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="button_box">
<property name="orientation">
......@@ -365,22 +321,6 @@
</hint>
</hints>
</connection>
<connection>
<sender>radio_node_address</sender>
<signal>toggled(bool)</signal>
<receiver>TransferMoneyDialog</receiver>
<slot>transfer_mode_changed(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>70</x>
<y>155</y>
</hint>
<hint type="destinationlabel">
<x>199</x>
<y>244</y>
</hint>
</hints>
</connection>
</connections>
<slots>
<slot>add_coins_to_transfer()</slot>
......
......@@ -6,6 +6,7 @@ Created on 2 févr. 2014
from PyQt5.QtWidgets import QDialog, QErrorMessage
import ucoin
from cutecoin.models.person import Person
from cutecoin.models.node import Node
from cutecoin.models.coin.listModel import CoinsListModel
......@@ -26,13 +27,11 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
super(TransferMoneyDialog, self).__init__()
self.setupUi(self)
self.sender = sender
self.recipient_trusts = []
self.wallet = sender.wallets[0]
for wallet in sender.wallets:
self.combo_wallets.addItem(wallet.get_text())
for trust in wallet.trusts():
self.combo_trusted_node.addItem(trust.get_text())
for contact in sender.contacts:
self.combo_contact.addItem(contact.name)
......@@ -64,17 +63,9 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog):
recipient = self.sender.contacts[
self.combo_contact.currentIndex()]
if self.radio_node_address.isChecked():
node = Node.create(
self.edit_node_address.text(), int(
self.spinbox_port.text()))
else:
# TODO: Manage trusted nodes
node = self.wallet.trusts()[self.combo_trusted_node.currentIndex()]
message = self.edit_message.text()
# TODO: Transfer money, and validate the window if no error happened
error = self.wallet.transfer_coins(node, recipient, sent_coins, message)
# TODO: All nodes trusted by recipient
error = self.wallet.transfer_coins(recipient, sent_coins, message)
if error:
QErrorMessage(self).showMessage("Cannot transfer coins " + error)
else:
......
......@@ -46,7 +46,9 @@ class Node(object):
return cls(server, port, trust, hoster)
def __eq__(self, other):
return (self.server == other.server and self.port == other.port)
hash = ucoin.network.Peering(self.server, self.port).get()['fingerprint']
other_hash = ucoin.network.Peering(other.server, other.port).get()['fingerprint']
return (self.hash == other.hash)
def get_text(self):
return self.server + ":" + str(self.port)
......
......@@ -74,19 +74,25 @@ class Wallet(object):
coin = Coin.from_id(self, coin_data)
self.coins.append(coin)
def transfer_coins(self, node, recipient, coins, message):
transfer = ucoin.wrappers.transactions.RawTransfer(
def transfer_coins(self, recipient, coins, message):
#TODO: Do my own wrapper
transfer = ucoin.wrappers.transactions.Transaction(
self.fingerprint(),
recipient.fingerprint,
coins,
message,
keyid=self.keyid,
server=node.server,
port=node.port)
result = transfer()
if result is False:
return transfer.error
server=self.trusts()[0].server,
port=self.trusts()[0].port)
wht_request = ucoin.network.Wallet(recipient.fingerprint)
recipient_wht = self.request(wht_request)
nodes = self.get_nodes_in_peering(recipient_wht['entry']['trusts'])
nodes += [h for h in self.hosters() if h not in nodes]
result = self.broadcast(nodes,
ucoin.hdc.transactions.Process(), transfer())
if result:
return result
def transactions_received(self):
received = []
......@@ -160,6 +166,7 @@ Hosters:
# TODO: Check if its working
def _search_node_by_fingerprint(self, node_fg, next_node, traversed_nodes=[]):
next_fg = next_node.peering()['fingerprint']
print(traversed_nodes)
if next_fg not in traversed_nodes:
traversed_nodes.append(next_fg)
if node_fg == next_fg:
......@@ -180,35 +187,53 @@ Hosters:
for node_fg in fingerprints:
node = self._search_node_by_fingerprint(
node_fg,
self.trusts()[0])
self.trusts()[0],
[])
if node is not None:
nodes.append(node)
#TODO: Check that one trust exists
return nodes
def request(self, request, get_args={}):
data = None
error = None
for node in self.trusts():
logging.debug("Trying to connect to : " + node.get_text())
node.use(request)
try:
data = request.get(**get_args)
return data
except ValueError as e:
error = str(e)
except:
continue
return data
return None
return error
def post(self, request, get_args={}):
data = None
error = None
for node in self.hosters():
logging.debug("Trying to connect to : " + node.get_text())
node.use(request)
try:
data = request.post(**get_args)
except ValueError as e:
error = str(e)
except:
continue
return data
return None
return error
def broadcast(self, nodes, request, get_args={}):
error = None
for node in nodes:
logging.debug("Trying to connect to : " + node.get_text())
node.use(request)
try:
request.post(**get_args)
except ValueError as e:
error = str(e)
except:
continue
return error
def trusts(self):
return [node for node in self.nodes if node.trust]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment