コード例 #1
0
ファイル: BitCoinNode.py プロジェクト: vaibspider/bitcoin
    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
コード例 #2
0
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
コード例 #3
0
    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