def generate_payment_request_message(self): """Create a payment request object, store it for later, increase ID, and create the message associated with it @returns: str (message for payment request)""" #REFACTOR cost = self.torApp.get_relay().get_cost() interval = self.bank.currentACoinInterval #generate ACoin request request = BankMessages.make_acoin_request(self.bank, interval, cost) request.id = self.currentRequestId self.requests[request.id] = request self.currentRequestId += 1 return Basic.write_long(request.id) + request.msg + Globals.PRIVATE_KEY.sign(request.msg)
def generate_payment_request_message(self): """Create a payment request object, store it for later, increase ID, and create the message associated with it @returns: str (message for payment request)""" #REFACTOR cost = self.torApp.get_relay().get_cost() interval = self.bank.currentACoinInterval #generate ACoin request request = BankMessages.make_acoin_request(self.bank, interval, cost) request.id = self.currentRequestId self.requests[request.id] = request self.currentRequestId += 1 return Basic.write_long( request.id) + request.msg + Globals.PRIVATE_KEY.sign(request.msg)
def send_receipt_message(self, theirId, numTokens): """Send a new payment request after a successful payment @param theirId: the id that the origin has associated with this payment @type theirId: int @param numTokens: how many payment requests to send back to the origin @type numTokens: int @returns: deferred (triggered when message is done sending)""" msg = self.get_prefix() msg += Basic.write_long(theirId) msg += Basic.write_byte(numTokens) for i in range(0, numTokens): msg += self.generate_payment_request_message() return self.send_direct_tor_message(msg, "receipt", False, 3)
def start_bank_process(self, readTokens, writeTokens, paymentId): """Create the bank message, and send it to the payment proxy for relaying to the bank. @param readTokens: how many read tokens to pay the merchant for @type readTokens: int @param writeTokens: how many write tokens to pay the merchant for @type writeTokens: int @param paymentId: the id for this payment, for tracking when it is completed @type paymentId: int """ #generate the response message: msg = Basic.write_byte(PAR_VERSION) msg += Basic.write_int(readTokens) msg += Basic.write_int(writeTokens) msg += Basic.write_long(paymentId) #figure out how many payments must be made: totalTokens = readTokens + writeTokens numPayments = totalTokens / Globals.CELLS_PER_PAYMENT msg += Basic.write_byte(numPayments) bankMsg = Basic.write_byte(numPayments) for i in range(0, numPayments): #get a token to use for this payment: requestId, token = self.paymentTokens.popitem() #send it to the bank for signing coin = self.parClient.bank.get_acoins(1) if not coin: paymentDeferred = self.paymentDeferreds[paymentId] del self.paymentDeferreds[paymentId] paymentDeferred.errback(InsufficientACoins("No ACoins left.")) return coin = coin[0] self.parClient.circ.app.coinsSpent += 1 # log_msg("Srsly, wtf is going on? %s" % (coin.interval), 4) bankMsg += coin.write_binary() + token msg += Basic.write_byte(COIN_TYPES['A']) + Basic.write_long(requestId) key = EncryptedDatagram.ClientSymKey(self.parClient.bank.PUBLIC_KEY) bankMsg = Basic.write_byte(1) + key.encrypt(Basic.write_byte(3) + bankMsg) msg = Basic.write_byte(PAR_VERSION) + Basic.write_byte(self.hop-1) + Basic.write_lenstr(bankMsg) + Basic.write_lenstr(msg) self.parClient.send_direct_tor_message(msg, "bank_relay", True, self.paymentProxyHop)