public static async Task Run([PerperStreamTrigger] PerperStreamContext context, [Perper("self")] ValidatorKey self, [Perper("privateKey")] ECParameters privateKey, [PerperStream("dataStream")] IAsyncEnumerable <object> dataStream, [PerperStream("outputStream")] IAsyncCollector <ISigned <object> > outputStream) { await dataStream.ForEachAsync(async item => { var bytes = IpfsJsonSettings.ObjectToBytes(item); var signature = ValidatorKey.GenerateSignature(privateKey, bytes); await outputStream.AddAsync(Signed.Create(item, self, signature)); }, CancellationToken.None); }
public static async Task Run([PerperStreamTrigger] PerperStreamContext context, [PerperStream("stepsStream")] IAsyncEnumerable <IHashed <IAgentStep> > stepsStream, [PerperStream("stepValidatorSetSplitterStream")] IAsyncEnumerable <IHashed <ValidatorSet> > stepValidatorSetSplitterStream, [PerperStream("outputStream")] IAsyncCollector <IHashed <IAgentStep> > outputStream, ILogger logger) { await using var stepValidatorSetSplitterEnumerator = stepValidatorSetSplitterStream.GetAsyncEnumerator(); await stepsStream.ForEachAsync(async step => { if (step.Value.Previous == new Hash { Bytes = new byte[] {} }) { return; } await stepValidatorSetSplitterEnumerator.MoveNextAsync(); var validatorSet = stepValidatorSetSplitterEnumerator.Current; try { var commitsSignaturesValid = step.Value.PreviousCommits.All(commit => { if (commit.Value.For != step.Value.Previous) { return(false); } var bytes = IpfsJsonSettings.ObjectToBytes <object>(commit.Value); return(commit.Signer.ValidateSignature(bytes, commit.Signature)); }); if (commitsSignaturesValid) { var signers = step.Value.PreviousCommits.Select(commit => commit.Signer).Distinct(); if (validatorSet.Value.IsMoreThanTwoThirds(signers)) { await outputStream.AddAsync(step); } } } catch (Exception e) { logger.LogError(e.ToString()); } }, CancellationToken.None); }