def generateTransaction(self) -> None: pid = os.getpid() print(pid, ": Trying to generate a new random transaction..") print(pid, ": prevTxnHashes = ", self.blockchain.currentPrevTxnHashes) sendList = [] (status, prevTxnHash, prevIndex, prevPubKeyScript, prevAmount) = self.getSendList() if status == False: # can't generated new transaction at the moment return #print(pid, ": prevTxnHash: ", prevTxnHash, "prevIndex: ", prevIndex, "prevPubKeyScript: ", prevPubKeyScript, "prevAmount: ", prevAmount) sendList.append((prevTxnHash, prevIndex, prevPubKeyScript)) # can be full amount also if prevAmount == 0: return recvAmount = random.randint(1, prevAmount) #print(pid, ": recvAmount = ", recvAmount) # can send to self also recvPubKey = self.nodesKeys[random.randint(0, len(self.nodesKeys) - 1)][0] recvList = [] recvList.append((recvPubKey, recvAmount)) txnOutputs: List[TransactionOutput] = [] amountSpent = 0 for (recvPubKey, recvAmount) in recvList: amountSpent += recvAmount txnOut = TransactionOutput(recvAmount) txnOut.createScriptPubKey(recvPubKey) txnOutputs.append(txnOut) if prevAmount - amountSpent > 0: txnOut = TransactionOutput(prevAmount - amountSpent) txnOut.createScriptPubKey(self.pubKeys[0]) txnOutputs.append(txnOut) txnInputs: List[TransactionInput] = [] for (prevTxnHash, prevIndex, prevPubKeyScript) in sendList: txnIn = TransactionInput(prevTxnHash, prevIndex) txnIn.createScriptSig(prevPubKeyScript, self.pubKeys[0], self.privateKeys[0], txnOutputs) txnInputs.append(txnIn) newTxn = Transaction(txnInputs, txnOutputs, lockTime) newTxn.calculateHash() print(pid, ": New Txn => ", newTxn.getHash(), "(prevAmount: ", prevAmount, ")", "(recvAmount: ", recvAmount, ") generated successfully!") # addition to currentPrevTxnHashes if prevAmount - amountSpent > 0: #print(pid, ": added") print(pid, ": Txn ", newTxn.getHash(), "utilized partial txnInputs!") self.blockchain.currentPrevTxnHashes[newTxn.getHash()] = [] self.blockchain.currentPrevTxnHashes[newTxn.getHash()].append( len(txnOutputs) - 1) print(pid, ": prevTxnHash: ", self.blockchain.currentPrevTxnHashes) else: print(pid, ": Txn ", newTxn.getHash(), "utilized full txnInputs!") self.generatedTxns.append(newTxn) self.blockchain.mempool[newTxn.getHash()] = newTxn
def generateTransaction(sendList: List[Tuple[str, int, str, str, str]], recvList: List[Tuple[str, int]]) -> Transaction: txnOutputs: List[TransactionOutput] = [] for (recvPubKey, amount) in recvList: txnOut = TransactionOutput(amount) txnOut.createScriptPubKey(recvPubKey) txnOutputs.append(txnOut) txnInputs: List[TransactionInput] = [] for (prevTxnHash, prevIndex, prevPubKeyScript, myPublicKey, myPrivateKey) in sendList: txnIn = TransactionInput(prevTxnHash, prevIndex) txnIn.createScriptSig(prevPubKeyScript, myPublicKey, myPrivateKey, txnOutputs) txnInputs.append(txnIn) newTxn = Transaction(txnInputs, txnOutputs, constants.lockTime) newTxn.calculateHash() return newTxn
def generateTransaction(self, sendList: List[Tuple[str, int, str, str, str]], recvList: List[Tuple[str, int]]) -> Transaction: pid = os.getpid() prevAmount = 0 for (prevTxnHash, prevIndex, prevPubKeyScript, myPublicKey, myPrivateKey) in sendList: if prevTxnHash in self.nodeObject.blockchain.mempool: prevAmount = self.blockchain.mempool[prevTxnHash].txnOutputs[ prevIndex].amount elif prevTxnHash in self.nodeObject.blockchain.unspntTxOut: if prevIndex in self.nodeObject.blockchain.unspntTxOut[ prevTxnHash]: prevAmount = self.nodeObject.blockchain.unspntTxOut[ prevTxnHash][prevIndex].amount print(pid, ": prevAmount = ", prevAmount) selfAmount = 0 txnOutputs: List[TransactionOutput] = [] for (recvPubKey, amount) in recvList: txnOut = TransactionOutput(amount) txnOut.createScriptPubKey(recvPubKey) txnOutputs.append(txnOut) if prevAmount - amount > 0: selfAmount = prevAmount - amount if selfAmount > 0: txnOut = TransactionOutput(selfAmount) txnOut.createScriptPubKey(self.publicKey) txnOutputs.append(txnOut) txnInputs: List[TransactionInput] = [] for (prevTxnHash, prevIndex, prevPubKeyScript, myPublicKey, myPrivateKey) in sendList: txnIn = TransactionInput(prevTxnHash, prevIndex) txnIn.createScriptSig(prevPubKeyScript, myPublicKey, myPrivateKey, txnOutputs) txnInputs.append(txnIn) newTxn = Transaction(txnInputs, txnOutputs, constants.lockTime) newTxn.calculateHash() return newTxn