public static async Task <IMerkleTree <T> > CreateRootFromValues <T>(IHashResolver resolver, IEnumerable <T> values, int maxChildren)
        {
            var result = await CreateFromValues(resolver, values, maxChildren);

            var root = result.FirstOrDefault()?.GetRoot() ?? new MerkleTreeNode <T>(new Hash <IMerkleTree <T> >[] { });

            return(root);
        }
        public static FakeAgent GetSnowballAgent(IHashResolver hashResolver, IPeerConnector peerConnector)
        {
            var agent    = new FakeAgent();
            var snowball = new SnowballConsensus(new FakeContext(agent), new FakeState());

            agent.RegisterFunction("Apocryph-SnowballConsensus", ((IAsyncEnumerable <Message>, string, Chain, IAsyncEnumerable <(Hash <Chain>, Slot?[])>, IAgent)input) => snowball.Start(input, hashResolver));
            agent.RegisterFunction("SnowballStream", ((Hash <Chain>, IAgent)input) => snowball.SnowballStream(input, hashResolver, peerConnector, null).Select(x => x));
            agent.RegisterFunction("MessagePool", ((IAsyncEnumerable <Message>, Hash <Chain>)input) => snowball.MessagePool(input));
            agent.RegisterFunction("KothProcessor", ((Hash <Chain>, IAsyncEnumerable <(Hash <Chain>, Slot?[])>)input) => snowball.KothProcessor(input));

            return(agent);
        }
        public async IAsyncEnumerable <T> EnumerateItems(IHashResolver resolver)
        {
            foreach (var child in Children)
            {
                var subtree = await resolver.RetrieveAsync(child);

                await foreach (var item in subtree.EnumerateItems(resolver))
                {
                    yield return(item);
                }
            }
        }
Exemple #4
0
 public static async Task <IAsyncEnumerable <(Hash <Chain>, Slot?[])> > KoTHProcessor(
     [PerperTrigger] object?input,
     IState state,
     IHashResolver hashResolver,
     IPeerConnector peerConnector,
     ILogger?logger,
     CancellationToken cancellationToken)
 {
     var output    = Channel.CreateUnbounded <(Hash <Chain>, Slot?[])>();
     var semaphore = new SemaphoreSlim(1, 1); // NOTE: Should use Perper for locking instead
     await peerConnector.ListenPubSub <(Hash <Chain> chain, Slot slot)>(PubSubPath, async (_, message) =>
     {
         await semaphore.WaitAsync();
         var chainState = await state.GetValue <KoTHState?>(message.chain.ToString(), () => default !);
        public static async Task <MerkleTreeLeafBuilder <T>[]> CreateFromValues <T>(IHashResolver resolver, IEnumerable <T> values, int maxChildren)
        {
            var result = new List <MerkleTreeLeafBuilder <T> >();

            foreach (var value in values)
            {
                var leaf = new MerkleTreeLeaf <T>(value);
                var hash = await resolver.StoreAsync <IMerkleTree <T> >(leaf);

                var builder = new MerkleTreeLeafBuilder <T>(leaf, hash);
                result.Add(builder);
            }

            var currentLayer = new Queue <IMerkleTreeBuilder <T> >(result);

            while (currentLayer.Count > 1)
            {
                var previousLayer = currentLayer;
                currentLayer = new Queue <IMerkleTreeBuilder <T> >((previousLayer.Count - 1) / maxChildren + 1);

                while (previousLayer.Count > 0)
                {
                    if (previousLayer.Count == 1)
                    {
                        currentLayer.Enqueue(previousLayer.Dequeue()); // Optimization; we never want single-element nodes
                        break;
                    }

                    var children = new IMerkleTreeBuilder <T> [Math.Min(previousLayer.Count, maxChildren)];
                    var hashes   = new Hash <IMerkleTree <T> > [children.Length];
                    for (var i = 0; i < children.Length; i++)
                    {
                        children[i] = previousLayer.Dequeue();
                        hashes[i]   = children[i].Hash;
                    }
                    var node = new MerkleTreeNode <T>(hashes);
                    var hash = await resolver.StoreAsync <IMerkleTree <T> >(node);

                    var builder = new MerkleTreeNodeBuilder <T>(node, hash);
                    for (var i = 0; i < children.Length; i++)
                    {
                        children[i].Parent        = builder;
                        children[i].IndexInParent = i;
                    }
                    currentLayer.Enqueue(builder);
                }
            }

            return(result.ToArray());
        }
Exemple #6
0
 public IAsyncEnumerable <T> EnumerateItems(IHashResolver resolver)
 {
     return(new[] { Value }.ToAsyncEnumerable());
 }
Exemple #7
0
        public static async Task Start([PerperTrigger] object?input, IContext context, IHashResolver hashResolver, IPeerConnector peerConnector)
        {
            var(executorAgent, _) = await context.StartAgentAsync <object?>("Apocryph-Executor", null);

            await executorAgent.CallActionAsync("Register", (Hash.From("AgentOne"), context.Agent, "AgentOne"));

            await executorAgent.CallActionAsync("Register", (Hash.From("AgentTwo"), context.Agent, "AgentTwo"));

            var agentStates = new[] {
                new AgentState(0, ReferenceData.From(new AgentOne.AgentOneState()), Hash.From("AgentOne")),
                new AgentState(1, ReferenceData.From(new AgentTwo.AgentTwoState()), Hash.From("AgentTwo"))
            };

            var agentStatesTree = await MerkleTreeBuilder.CreateRootFromValues(hashResolver, agentStates, 2);

            Chain chain;

            if (Environment.GetEnvironmentVariable("SAMPLE_AGENTS_CONSENSUS") == "Dummy")
            {
                chain = new Chain(new ChainState(agentStatesTree, agentStates.Length), "Apocryph-DummyConsensus", null, 1);
            }
            else
            {
                var snowballParameters = await hashResolver.StoreAsync <object>(new SnowballParameters(15, 0.8, 25));

                chain = new Chain(new ChainState(agentStatesTree, agentStates.Length), "Apocryph-SnowballConsensus", snowballParameters, 60);
            }

            var chainId = await hashResolver.StoreAsync(chain);

            var(_, kothStates) = await context.StartAgentAsync <IAsyncEnumerable <(Hash <Chain>, Slot?[])> >("Apocryph-KoTH", null);

            var minerAgentTask = context.StartAgentAsync <object?>("Apocryph-KoTH-SimpleMiner", (kothStates, new Hash <Chain>[] { chainId }));
 public static async Task <FakeAgent> GetRoutingAgent(IHashResolver hashResolver, IAsyncEnumerable <(Hash <Chain>, Slot?[])>?kothStates = null, IAgent?executor = null)