def handle_sendtx(self, payload):
        new_tx = payload
        with self.server.node_manager.lock:
            blockchain = self.server.node_manager.blockchain

            # 判断区块中是否存在
            if blockchain.find_transaction(new_tx.txid):
                return
            # 判断交易池中是否存在
            for k in range(len(blockchain.current_transactions)):
                uncomfirmed_tx = blockchain.current_transactions[-1 - k]
                if uncomfirmed_tx.txid == new_tx.txid:
                    return

            blockchain.current_transactions.append(new_tx)
            db.write_unconfirmed_tx_to_db(blockchain.wallet.address, new_tx)
Exemple #2
0
    def new_utxo_transaction(self, from_addr, to_addr, amount):
        """
        from_addr向to_addr发送amount量的货币,步骤:
        Step1:首先从区块中获取from_addr下未使用过的TxOutput输出(未使用的UTXO)
        Step2:获取上一步TxOutput列表中value之和sum,并与amount相比
        Step3:如果sum<amount,则标识from_addr余额不够,无法交易;如果sum>=amount,则from_addr足够余额用于交易,多出的部分用于找零
        Step4:构造Transaction对象,并传入此次交易的输入和输出
        Step5:输入检查交易的有效性,输出设置锁定脚本
        Step6:广播

        :param from_addr: <str>,发送方钱包地址
        :param to_addr: <str>,接收方钱包地址
        :param amount: <int>,金额
        :return:
        """
        inputs = list()
        outputs = list()
        balance, unspent_txout_list = self.find_spendalbe_outputs(from_addr)
        if balance < amount:
            print 'not enough money!'
            return None

        # 构造Tx的输入
        for txid, out_idx, txout in unspent_txout_list:
            txin = TxInput(txid, out_idx, None, self.wallet.pubkey)
            inputs.append(txin)

        # 构造Tx的输出
        txout = TxOutput(amount,
                         hexlify(Wallet.b58decode(to_addr)).decode('utf8'))
        outputs.append(txout)
        if balance > amount:
            # 找零
            outputs.append(
                TxOutput(balance - amount,
                         Script.sha160(str(self.wallet.pubkey))))

        tx = Transaction(inputs, outputs, int(time()))
        self.sign_transaction(tx, self.wallet.privkey)  # 签名Tx

        self.current_transactions.append(tx)
        db.write_unconfirmed_tx_to_db(self.wallet.address, tx)
        return tx