public bool TryRemoveTransaction(UInt256 txHash)
{
CheckWriteTransaction();
UnconfirmedTx unconfirmedTx;
if (unconfirmedTxes.Value.TryGetValue(txHash, out unconfirmedTx)
&& unconfirmedTxes.TryModify(x => x.Remove(txHash)))
{
// update index of txes spending each input's prev tx
for (var inputIndex = 0; inputIndex < unconfirmedTx.Transaction.Inputs.Length; inputIndex++)
{
var input = unconfirmedTx.Transaction.Inputs[inputIndex];
unconfirmedTxesByPrevTxOutputKey.Modify(_ => { });
ImmutableDictionary<UInt256, UnconfirmedTx>.Builder unconfirmedTxes;
if (unconfirmedTxesByPrevTxOutputKey.Value.TryGetValue(input.PrevTxOutputKey, out unconfirmedTxes))
// ensure a copy of the builder is modified or underlying storage will see uncomitted state
unconfirmedTxes = unconfirmedTxes.ToImmutable().ToBuilder();
else
unconfirmedTxes = ImmutableDictionary.CreateBuilder<UInt256, UnconfirmedTx>();
unconfirmedTxes.Remove(unconfirmedTx.Hash);
if (unconfirmedTxes.Count > 0)
unconfirmedTxesByPrevTxOutputKey.Value[input.PrevTxOutputKey] = unconfirmedTxes;
else
unconfirmedTxesByPrevTxOutputKey.Value.Remove(input.PrevTxOutputKey);
}
return true;
}
else
return false;
}