Example #1
0
        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);
        }