Skip to content

Commit

Permalink
Better proof period reporting. Default proofSubmitted events to OFF.
Browse files Browse the repository at this point in the history
  • Loading branch information
benbierens committed Mar 5, 2025
1 parent 96510df commit 25a7a30
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 17 deletions.
44 changes: 42 additions & 2 deletions ProjectPlugins/CodexContractsPlugin/ChainMonitor/PeriodMonitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ public void Update(ulong blockNumber, DateTime eventUtc, IChainStateRequest[] re
currentPeriod = period;
}

public PeriodReport[] GetAndClearReports()
public PeriodMonitorResult GetAndClearReports()
{
var result = reports.ToArray();
reports.Clear();
return result;
return new PeriodMonitorResult(result);
}

private void CreateReportForPeriod(ulong lastBlockInPeriod, ulong periodNumber, IChainStateRequest[] requests)
Expand Down Expand Up @@ -67,6 +67,46 @@ private void CreateReportForPeriod(ulong lastBlockInPeriod, ulong periodNumber,
}
}

public class PeriodMonitorResult
{
public PeriodMonitorResult(PeriodReport[] reports)
{
Reports = reports;

CalcStats();
}

public PeriodReport[] Reports { get; }

public bool IsEmpty { get; private set; }
public ulong PeriodLow { get; private set; }
public ulong PeriodHigh { get; private set; }
public float AverageNumSlots { get; private set; }
public float AverageNumProofsRequired { get; private set; }

private void CalcStats()
{
IsEmpty = true;
PeriodLow = ulong.MaxValue;
PeriodHigh = ulong.MinValue;
AverageNumSlots = 0.0f;
AverageNumProofsRequired = 0.0f;
float count = Reports.Length;

foreach (var report in Reports)
{
if (report.TotalProofsRequired > 0) IsEmpty = false;
PeriodLow = Math.Min(PeriodLow, report.PeriodNumber);
PeriodHigh = Math.Min(PeriodHigh, report.PeriodNumber);
AverageNumSlots += Convert.ToSingle(report.TotalNumSlots);
AverageNumProofsRequired += Convert.ToSingle(report.TotalProofsRequired);
}

AverageNumSlots = AverageNumSlots / count;
AverageNumProofsRequired = AverageNumProofsRequired / count;
}
}

public class PeriodReport
{
public PeriodReport(ulong periodNumber, ulong totalNumSlots, ulong totalProofsRequired, PeriodProofMissed[] missedProofs)
Expand Down
2 changes: 1 addition & 1 deletion Tools/TestNetRewarder/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class Configuration
public int ShowProofPeriodReports { get; set; } = 1;

[Uniform("proof-submitted-events", "pse", "PROOFSUBMITTEDEVENTS", false, "When greater than zero, chain event summary will include proof-submitted events.")]
public int ShowProofSubmittedEvents { get; set; } = 1;
public int ShowProofSubmittedEvents { get; set; } = 0; // Defaulted to zero, aprox 7 to 10 such events every 2 minutes in testnet (from autoclient alone!)

public string LogPath
{
Expand Down
2 changes: 2 additions & 0 deletions Tools/TestNetRewarder/EmojiMaps.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ public class EmojiMaps
public string Failed => "❌";
public string ProofSubmitted => "🎵";
public string ProofReport => "🔎";
public string NoProofsMissed => "🏛";
public string ManyProofsMissed => "😱";

public string StringToEmojis(string input, int outLength)
{
Expand Down
72 changes: 58 additions & 14 deletions Tools/TestNetRewarder/EventsFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,26 +118,60 @@ public void OnError(string msg)
errors.Add(msg);
}

public void ProcessPeriodReports(PeriodReport[] periodReports)
public void ProcessPeriodReports(PeriodMonitorResult reports)
{
var lines = periodReports.Select(FormatPeriodReport).ToList();
lines.Insert(0, FormatPeriodReportLine("period", "totalSlots", "required", "missed"));
if (reports.IsEmpty) return;

var lines = new List<string> {
$"Periods: [{reports.PeriodLow} ... {reports.PeriodHigh}]",
$"Average number of slots: {reports.AverageNumSlots.ToString("F2")}",
$"Average number of proofs required: {reports.AverageNumProofsRequired.ToString("F2")}"
};

AddMissedProofDetails(lines, reports.Reports);

AddBlock(0, $"{emojiMaps.ProofReport} **Proof system report**", lines.ToArray());
}

private string FormatPeriodReport(PeriodReport report)
private void AddMissedProofDetails(List<string> lines, PeriodReport[] reports)
{
return FormatPeriodReportLine(
periodNumber: report.PeriodNumber.ToString(),
totalSlots: report.TotalNumSlots.ToString(),
totalRequired: report.TotalProofsRequired.ToString(),
totalMissed: report.MissedProofs.Length.ToString()
);
var reportsWithMissedProofs = reports.Where(r => r.MissedProofs.Length > 0).ToArray();
if (reportsWithMissedProofs.Length < 1)
{
lines.Add($"No proofs were missed {emojiMaps.NoProofsMissed}");
return;
}

var totalMissed = reportsWithMissedProofs.Sum(r => r.MissedProofs.Length);
if (totalMissed > 10)
{
lines.Add($"[{totalMissed}] proofs were missed {emojiMaps.ManyProofsMissed}");
return;
}

foreach (var report in reportsWithMissedProofs)
{
DescribeMissedProof(lines, report);
}
}

private string FormatPeriodReportLine(string periodNumber, string totalSlots, string totalRequired, string totalMissed)
private void DescribeMissedProof(List<string> lines, PeriodReport report)
{
return $"{periodNumber.PadLeft(10)} {totalSlots.PadLeft(10)} {totalRequired.PadLeft(10)} {totalMissed.PadLeft(10)}";
foreach (var missedProof in report.MissedProofs)
{
DescribeMissedProof(lines, missedProof);
}
}

private void DescribeMissedProof(List<string> lines, PeriodProofMissed missedProof)
{
lines.Add($"[{FormatHost(missedProof.Host)}] missed proof for {FormatRequestId(missedProof.Request)} (slotIndex: {missedProof.SlotIndex})");
}

private string FormatHost(EthAddress? host)
{
if (host == null) return "Unknown host";
return host.Address;
}

private void AddRequestBlock(RequestEvent requestEvent, string eventName, params string[] content)
Expand Down Expand Up @@ -189,10 +223,20 @@ private string FormatDateTime(DateTime utc)
}

private string FormatRequestId(RequestEvent requestEvent)
{
return FormatRequestId(requestEvent.Request);
}

private string FormatRequestId(IChainStateRequest request)
{
return FormatRequestId(request.Request.Id);
}

private string FormatRequestId(string id)
{
return
$"({emojiMaps.StringToEmojis(requestEvent.Request.Request.Id, 3)})" +
$"`{requestEvent.Request.Request.Id}`";
$"({emojiMaps.StringToEmojis(id, 3)})" +
$"`{id}`";
}

private string BytesToHexString(byte[] bytes)
Expand Down

0 comments on commit 25a7a30

Please sign in to comment.