public void Execute(DeltaBuilderContext context) { if (_logger.IsEnabled(LogEventLevel.Debug)) { _logger.Debug("Registering new delta with parent ({previousHash})", context.PreviousDeltaHash); } _deltaCache.AddLocalDelta(context.Candidate, context.ProducedDelta); // for easier delta tracking when testing truffle // if ((context.ProducedDelta.PublicEntries?.Count ?? 0) > 0) // { // _deltaCache.AddLocalDelta(context.Candidate, context.ProducedDelta); // } }
///<inheritdoc /> public CandidateDeltaBroadcast BuildCandidateDelta(MultiHash previousDeltaHash) { _logger.Debug("Building candidate delta locally"); var allTransactions = _transactionRetriever.GetMempoolTransactionsByPriority(); Guard.Argument(allTransactions, nameof(allTransactions)) .NotNull("Mempool content returned null, check the mempool is actively running"); var includedTransactions = GetValidTransactionsForDelta(allTransactions); var salt = GetSaltFromPreviousDelta(previousDeltaHash); var rawAndSaltedEntriesBySignature = includedTransactions.SelectMany( t => t.PublicEntries.Select(e => new RawEntryWithSaltedAndHashedEntry(e, salt, _hashProvider))); // (Eα;Oα) var shuffledEntriesBytes = rawAndSaltedEntriesBySignature .OrderBy(v => v.SaltedAndHashedEntry, ByteUtil.ByteListComparer.Default) .SelectMany(v => v.RawEntry.ToByteArray()) .ToArray(); // dn var signaturesInOrder = includedTransactions .Select(p => p.Signature.ToByteArray()) .OrderBy(s => s, ByteUtil.ByteListComparer.Default) .SelectMany(b => b) .ToArray(); // xf var summedFees = includedTransactions.Sum(t => t.SummedEntryFees()); //∆Ln,j = L(f/E) + dn + E(xf, j) var coinbaseEntry = new CoinbaseEntry { Amount = summedFees.ToUint256ByteString(), ReceiverPublicKey = _producerUniqueId.PublicKey.ToByteString() }; var globalLedgerStateUpdate = shuffledEntriesBytes .Concat(signaturesInOrder) .Concat(coinbaseEntry.ToByteArray()) .ToArray(); //hj var candidate = new CandidateDeltaBroadcast { // h∆j Hash = _hashProvider.ComputeMultiHash(globalLedgerStateUpdate).ToArray().ToByteString(), // Idj ProducerId = _producerUniqueId, PreviousDeltaDfsHash = previousDeltaHash.ToArray().ToByteString() }; _logger.Debug("Building full delta locally"); var producedDelta = new Delta { PreviousDeltaDfsHash = previousDeltaHash.ToArray().ToByteString(), MerkleRoot = candidate.Hash, CoinbaseEntries = { coinbaseEntry }, PublicEntries = { includedTransactions.SelectMany(t => t.PublicEntries) }, TimeStamp = Timestamp.FromDateTime(_dateTimeProvider.UtcNow) }; _logger.Debug("Adding local candidate delta"); _deltaCache.AddLocalDelta(candidate, producedDelta); return(candidate); }