public static void processPendingTransactions() { // TODO TODO improve to include failed transactions ulong last_block_height = IxianHandler.getLastBlockHeight(); lock (PendingTransactions.pendingTransactions) { long cur_time = Clock.getTimestamp(); List <PendingTransaction> tmp_pending_transactions = new List <PendingTransaction>(PendingTransactions.pendingTransactions); int idx = 0; foreach (var entry in tmp_pending_transactions) { Transaction t = entry.transaction; long tx_time = entry.addedTimestamp; if (t.applied != 0) { PendingTransactions.pendingTransactions.RemoveAll(x => x.transaction.id.SequenceEqual(t.id)); continue; } // if transaction expired, remove it from pending transactions if (last_block_height > ConsensusConfig.getRedactedWindowSize() && t.blockHeight < last_block_height - ConsensusConfig.getRedactedWindowSize()) { ActivityStorage.updateStatus(t.id, ActivityStatus.Error, 0); PendingTransactions.pendingTransactions.RemoveAll(x => x.transaction.id.SequenceEqual(t.id)); continue; } if (cur_time - tx_time > 40) // if the transaction is pending for over 40 seconds, resend { CoreProtocolMessage.broadcastProtocolMessage(new char[] { 'M', 'H' }, ProtocolMessageCode.transactionData, t.getBytes(), null); entry.addedTimestamp = cur_time; entry.confirmedNodeList.Clear(); } if (entry.confirmedNodeList.Count() >= 3) // if we get transaction from 3 nodes, we can consider it as confirmed { if (entry.messageId != null) { StreamProcessor.confirmMessage(entry.messageId); } continue; } if (cur_time - tx_time > 20) // if the transaction is pending for over 20 seconds, send inquiry { CoreProtocolMessage.broadcastGetTransaction(t.id, 0, null, false); } idx++; } } }
public override void receivedTransactionInclusionVerificationResponse(byte[] txid, bool verified) { // TODO implement error // TODO implement blocknum ActivityStatus status = ActivityStatus.Pending; if (verified) { status = ActivityStatus.Final; PendingTransactions.remove(txid); } ActivityStorage.updateStatus(txid, status, 0); }
public override void receivedTransactionInclusionVerificationResponse(byte[] txid, bool verified) { // TODO implement error // TODO implement blocknum ActivityStatus status = ActivityStatus.Pending; if (verified) { status = ActivityStatus.Final; PendingTransaction p_tx = PendingTransactions.getPendingTransaction(txid); if (p_tx != null) { if (p_tx.messageId != null) { StreamProcessor.confirmMessage(p_tx.messageId); } PendingTransactions.remove(txid); } } ActivityStorage.updateStatus(txid, status, 0); }