Skip to content
This repository was archived by the owner on May 16, 2019. It is now read-only.

Commit 05472d0

Browse files
author
Tom Galloway
committed
Merge remote-tracking branch 'upstream/master'
2 parents 5b06ac7 + 922cc80 commit 05472d0

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

market/moderation.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def close_dispute(resolution_json, db, message_listener, notification_listener,
143143
order_id = resolution_json["dispute_resolution"]["resolution"]["order_id"]
144144

145145
if os.path.exists(DATA_FOLDER + "purchases/in progress/" + order_id + ".json"):
146-
file_path = DATA_FOLDER + "purchases/trade receipts/" + order_id + ".json"
146+
file_path = DATA_FOLDER + "purchases/in progress/" + order_id + ".json"
147147
elif os.path.exists(DATA_FOLDER + "store/contracts/in progress/" + order_id + ".json"):
148148
file_path = DATA_FOLDER + "store/contracts/in progress/" + order_id + ".json"
149149

@@ -157,9 +157,11 @@ def close_dispute(resolution_json, db, message_listener, notification_listener,
157157
moderator_pubkey = unhexlify(moderator["pubkeys"]["guid"])
158158
moderator_avatar = unhexlify(moderator["avatar"])
159159

160+
print json.dumps(resolution_json, indent=4)
161+
160162
verify_key = nacl.signing.VerifyKey(moderator_pubkey)
161163
verify_key.verify(json.dumps(resolution_json["dispute_resolution"]["resolution"], indent=4),
162-
resolution_json["dispute_resolution"]["signature"])
164+
base64.b64decode(resolution_json["dispute_resolution"]["signature"]))
163165

164166
contract["dispute_resolution"] = resolution_json["dispute_resolution"]
165167

market/network.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from keys.keychain import KeyChain
2323
from log import Logger
2424
from market.contracts import Contract
25-
from market.moderation import process_dispute
25+
from market.moderation import process_dispute, close_dispute
2626
from market.profile import Profile
2727
from market.protocol import MarketProtocol
2828
from market.transactions import BitcoinTransaction
@@ -559,6 +559,11 @@ def parse_messages(messages):
559559
self.db, self.protocol.get_message_listener(),
560560
self.protocol.get_notification_listener(),
561561
self.protocol.multiplexer.testnet)
562+
elif p.type == objects.PlaintextMessage.Type.Value("DISPUTE_CLOSE"):
563+
close_dispute(json.loads(p.message, object_pairs_hook=OrderedDict),
564+
self.db, self.protocol.get_message_listener(),
565+
self.protocol.get_notification_listener(),
566+
self.protocol.multiplexer.testnet)
562567
else:
563568
listener.notify(p, signature)
564569
except Exception:
@@ -854,7 +859,7 @@ def history_fetched(ec, history):
854859
dispute_json["dispute_resolution"]["resolution"]["decision"] = resolution
855860
dispute_json["dispute_resolution"]["signature"] = \
856861
base64.b64encode(KeyChain(self.db).signing_key.sign(json.dumps(
857-
dispute_json["dispute_resolution"]["resolution"]))[:64])
862+
dispute_json["dispute_resolution"]["resolution"], indent=4))[:64])
858863

859864
def get_node(node_to_ask, recipient_guid, public_key):
860865
def parse_response(response):
@@ -904,48 +909,41 @@ def release_funds(self, order_id):
904909
vendor_address = contract["vendor_order_confirmation"]["invoice"]["payout"]["address"]
905910
buyer_address = contract["buyer_order"]["order"]["refund_address"]
906911

907-
for moderator in contract["vendor_offer"]["listing"]["moderators"]:
908-
if moderator["guid"] == contract["buyer_order"]["order"]["moderator"]:
909-
masterkey_m = moderator["pubkeys"]["bitcoin"]["key"]
910-
911912
outputs = []
912913

913-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["moderator_fee"],
914+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["moderator_fee"]),
914915
'address': contract["dispute_resolution"]["resolution"]["moderator_address"]})
915916

916917
if "buyer_payout" in contract["dispute_resolution"]["resolution"]:
917-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["buyer_payout"],
918+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["buyer_payout"]),
918919
'address': buyer_address})
919920

920921
if "vendor_payout" in contract["dispute_resolution"]["resolution"]:
921-
outputs.append({'value': contract["dispute_resolution"]["resolution"]["vendor_payout"],
922+
outputs.append({'value': int(contract["dispute_resolution"]["resolution"]["vendor_payout"]),
922923
'address': vendor_address})
923924

924-
tx = bitcointools.mktx(outpoints, outputs)
925-
signatures = []
925+
tx = BitcoinTransaction.make_unsigned(outpoints, outputs)
926926
chaincode = contract["buyer_order"]["order"]["payment"]["chaincode"]
927927
redeem_script = str(contract["buyer_order"]["order"]["payment"]["redeem_script"])
928928
masterkey = bitcointools.bip32_extract_key(KeyChain(self.db).bitcoin_master_privkey)
929929
childkey = derive_childkey(masterkey, chaincode, bitcointools.MAINNET_PRIVATE)
930930

931-
mod_key = derive_childkey(masterkey_m, chaincode)
931+
own_sig = tx.create_signature(childkey, redeem_script)
932932

933-
valid_inputs = 0
933+
signatures = []
934934
for index in range(0, len(outpoints)):
935-
sig = bitcointools.multisign(tx, index, redeem_script, childkey)
936-
signatures.append({"input_index": index, "signature": sig})
935+
sig_ob = {"index": index, "signatures": []}
936+
for s in own_sig:
937+
if int(s["index"]) == index:
938+
sig_ob["signatures"].append(s["signature"])
937939
for s in contract["dispute_resolution"]["resolution"]["tx_signatures"]:
938-
if s["input_index"] == index:
939-
if bitcointools.verify_tx_input(tx, index, redeem_script, s["signature"], mod_key):
940-
tx = bitcointools.apply_multisignatures(tx, index, str(redeem_script),
941-
sig, str(s["signature"]))
942-
valid_inputs += 1
943-
944-
if valid_inputs == len(outpoints):
945-
self.log.info("Broadcasting payout tx %s to network" % bitcointools.txhash(tx))
946-
self.protocol.multiplexer.blockchain.broadcast(tx)
947-
else:
948-
raise Exception("Failed to reconstruct transaction with moderator signature.")
940+
if int(s["index"]) == index:
941+
sig_ob["signatures"].append(s["signature"])
942+
signatures.append(sig_ob)
943+
944+
tx.multisign(signatures, redeem_script)
945+
tx.broadcast(self.protocol.multiplexer.blockchain)
946+
self.log.info("Broadcasting payout tx %s to network" % tx.get_hash())
949947

950948
def get_ratings(self, node_to_ask, listing_hash=None):
951949
"""

market/protocol.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,9 @@ def rpc_dispute_open(self, sender, pubkey, encrypted):
317317
def rpc_dispute_close(self, sender, pubkey, encrypted):
318318
try:
319319
box = Box(self.signing_key.to_curve25519_private_key(), PublicKey(pubkey))
320-
order = box.decrypt(encrypted)
321-
contract = json.loads(order, object_pairs_hook=OrderedDict)
322-
close_dispute(contract, self.db, self.get_message_listener(),
320+
res = box.decrypt(encrypted)
321+
resolution_json = json.loads(res, object_pairs_hook=OrderedDict)
322+
close_dispute(resolution_json, self.db, self.get_message_listener(),
323323
self.get_notification_listener(), self.multiplexer.testnet)
324324
self.router.addContact(sender)
325325
self.log.info("Contract dispute closed by %s" % sender)
@@ -411,7 +411,7 @@ def callDisputeOpen(self, nodeToAsk, ephem_pubkey, encrypted_contract):
411411
return d.addCallback(self.handleCallResponse, nodeToAsk)
412412

413413
def callDisputeClose(self, nodeToAsk, ephem_pubkey, encrypted_contract):
414-
d = self.dispute_open(nodeToAsk, ephem_pubkey, encrypted_contract)
414+
d = self.dispute_close(nodeToAsk, ephem_pubkey, encrypted_contract)
415415
return d.addCallback(self.handleCallResponse, nodeToAsk)
416416

417417
def callGetRatings(self, nodeToAsk, listing_hash=None):

0 commit comments

Comments
 (0)