void ConsumeTransaction(DirtyData dirtyData, CommitItems commitItems, TransactionItem <MaintainTransaction> dataItem) { var transaction = dataItem.Transaction; var transactionId = transaction.TransactionId; if (transactionId <= LastProcessedTransactionId) { return; } if (transaction.TargetChainId == ChainId) { var type = transaction.TransactionType; if (type == MainTainTransactionTypes.Revenue) { var rev = transaction as RevenueMaintainTransaction; var revenueInfo = rev.RevenueInfo; var tick = rev.Tick; lock (_revenueLock) { var revenues = GetRevenueReceivers(tick); if (revenues == null) { revenues = new RevenueReceivers(tick, rev.PreviousTick, revenueInfo); _revenueReceivers[tick] = revenues; _revenueReceiversStroage.AddEntry(tick, revenues.ToByteArray()); } if (revenueInfo.Index > revenues.RevenueInfo.Index) { revenues.RevenueInfo = revenueInfo; } foreach (var aId in rev.Accounts) { revenues.Accounts.Add(aId); } } dirtyData.DirtyRevenueTicks.Add(tick); } ConsumeTransactionFeatures(0, transaction, null, commitItems); } }
RevenueReceivers GetRevenueReceivers(int tick) { lock (_revenueLock) { if (!_revenueReceivers.TryGetValue(tick, out var proposal)) { if (_revenueReceiversStroage.ContainsIndex(tick)) { var data = _revenueReceiversStroage.GetBlockData(tick); using (var unpacker = new Unpacker(data)) { proposal = new RevenueReceivers(unpacker); _revenueReceivers[tick] = proposal; } } } return(proposal); } }