Esempio n. 1
0
        private static async Task <(CngKey[] keys, Node[] nodes)> InitNodes(int n, int cacheSize, int syncLimit, string storeType, string dbPath, ILogger logger)
        {
            var(keys, peers, pmap) = InitPeers(n);

            var nodes = new List <Node>();

            var proxies = new List <InMemAppProxy>();

            var router = new InMemRouter();

            for (var i = 0; i < peers.Length; i++)
            {
                var conf = new Config(TimeSpan.FromMilliseconds(5), TimeSpan.FromSeconds(1), cacheSize, syncLimit, storeType, $"{dbPath}/db_{i}");

                var trans = await router.Register(peers[i].NetAddr);

                IStore    store = null;
                Exception err;
                switch (storeType)
                {
                case "badger":
                    (store, err) = await LocalDbStore.New(pmap, conf.CacheSize, conf.StorePath, logger);

                    Assert.Null(err);
                    break;

                case "inmem":
                    store = new InmemStore(pmap, conf.CacheSize, logger);
                    break;

                default:
                    throw new NotImplementedException();
                }

                var id    = pmap[peers[i].PubKeyHex];
                var proxy = new InMemAppProxy(id, logger);
                var node  = new Node(conf, id, keys[i], peers,
                                     store,
                                     trans,
                                     proxy, logger);

                err = await node.Init(false);

                Assert.Null(err);

                nodes.Add(node);
                proxies.Add(proxy);
            }

            return(keys.ToArray(), nodes.ToArray());
        }
Esempio n. 2
0
        public async Task TestProcessSync()
        {
            var(keys, peers, pmap) = InitPeers(2);

            var config = Config.TestConfig();

            //Start two nodes

            var router = new InMemRouter();

            var id0        = pmap[peers[0].PubKeyHex];
            var peer0Trans = await router.Register(peers[0].NetAddr);


            var node0 = new Node(config, id0, keys[0], peers, new InmemStore(pmap, config.CacheSize, logger), peer0Trans, new InMemAppProxy(id0, logger), logger);
            await node0.Init(false);

            await node0.StartAsync(false);

            var id1        = pmap[peers[1].PubKeyHex];
            var peer1Trans = await router.Register(peers[1].NetAddr);

            var node1 = new Node(config, id1, keys[1], peers, new InmemStore(pmap, config.CacheSize, logger), peer1Trans, new InMemAppProxy(id1, logger), logger);
            await node1.Init(false);

            await node1.StartAsync(false);

            //Manually prepare SyncRequest and expected SyncResponse

            var node0Known = await node0.Controller.KnownEvents();

            var node1Known = await node1.Controller.KnownEvents();

            Exception err;

            Event[] unknown;
            (unknown, err) = await node1.Controller.EventDiff(node0Known);

            Assert.Null(err);

            WireEvent[] unknownWire;
            (unknownWire, err) = node1.Controller.ToWire(unknown);
            Assert.Null(err);

            var args = new SyncRequest
            {
                FromId = node0.Id,
                Known  = node0Known
            };

            var expectedResp = new SyncResponse
            {
                FromId = node1.Id,
                Events = unknownWire,
                Known  = node1Known
            };

            //Make actual SyncRequest and check SyncResponse

            SyncResponse resp;

            (resp, err) = await peer0Trans.Sync(peers[1].NetAddr, args);

            Assert.Null(err);

            // Verify the response

            resp.ShouldCompareTo(expectedResp);

            Assert.Equal(expectedResp.Events.Length, resp.Events.Length);

            int i = 0;

            foreach (var e in expectedResp.Events)

            {
                var ex = resp.Events[i];
                e.Body.ShouldCompareTo(ex.Body);
                i++;
            }

            resp.Known.ShouldCompareTo(expectedResp.Known);

            // shutdown nodes

            node0.Shutdown();
            node1.Shutdown();
        }
Esempio n. 3
0
        public async Task TestAddTransaction()
        {
            var(keys, peers, pmap) = InitPeers(2);

            var config = Config.TestConfig();

            //Start two nodes

            var router = new InMemRouter();

            var id0        = pmap[peers[0].PubKeyHex];
            var peer0Trans = await router.Register(peers[0].NetAddr);

            var peer0Proxy = new InMemAppProxy(id0, logger);
            var node0      = new Node(config, id0, keys[0], peers, new InmemStore(pmap, config.CacheSize, logger), peer0Trans, peer0Proxy, logger);
            await node0.Init(false);

            await node0.StartAsync(false);

            var id1        = pmap[peers[1].PubKeyHex];
            var peer1Trans = await router.Register(peers[1].NetAddr);

            var peer1Proxy = new InMemAppProxy(id1, logger);
            var node1      = new Node(config, id1, keys[1], peers, new InmemStore(pmap, config.CacheSize, logger), peer1Trans, peer1Proxy, logger);
            await node1.Init(false);

            await node1.StartAsync(false);

            //Submit a Tx to node0

            var message = "Hello World!";
            await peer0Proxy.SubmitTx(message.StringToBytes());

            await node0.AddingTransactionsCompleted();

            //simulate a SyncRequest from node0 to node1

            var node0Known = await node0.Controller.KnownEvents();

            var args = new SyncRequest
            {
                FromId = node0.Id,
                Known  = node0Known
            };

            Exception    err;
            SyncResponse resp;

            (resp, err) = await peer0Trans.Sync(peers[1].NetAddr, args);

            Assert.Null(err);

            err = await node0.Sync(resp.Events);

            Assert.Null(err);

            ////check the Tx was removed from the transactionPool and added to the new Head
            Assert.Empty(node0.Controller.TransactionPool);

            var(node0Head, _) = await node0.Controller.GetHead();

            Assert.Single(node0Head.Transactions());

            Assert.Equal(message, node0Head.Transactions()[0].BytesToString());

            node0.Shutdown();
            node1.Shutdown();
        }
Esempio n. 4
0
        public async Task TestProcessEagerSync()
        {
            var(keys, peers, pmap) = InitPeers(2);

            var config = Config.TestConfig();

            //Start two nodes

            var router = new InMemRouter();

            var id0        = pmap[peers[0].PubKeyHex];
            var peer0Trans = await router.Register(peers[0].NetAddr);

            var node0 = new Node(config, id0, keys[0], peers, new InmemStore(pmap, config.CacheSize, logger), peer0Trans, new InMemAppProxy(id0, logger), logger);
            await node0.Init(false);

            await node0.StartAsync(false);

            var peer1Trans = await router.Register(peers[1].NetAddr);

            var id1   = pmap[peers[1].PubKeyHex];
            var node1 = new Node(config, id1, keys[1], peers, new InmemStore(pmap, config.CacheSize, logger), peer1Trans, new InMemAppProxy(id1, logger), logger);
            await node1.Init(false);

            await node1.StartAsync(false);

            //Manually prepare EagerSyncRequest and expected EagerSyncResponse

            var node1Known = await node1.Controller.KnownEvents();

            Event[]   unknown;
            Exception err;

            (unknown, err) = await node0.Controller.EventDiff(node1Known);

            Assert.Null(err);

            WireEvent[] unknownWire;
            (unknownWire, err) = node0.Controller.ToWire(unknown);
            Assert.Null(err);

            var args = new EagerSyncRequest
            {
                FromId = node0.Id,
                Events = unknownWire
            };

            var expectedResp = new EagerSyncResponse
            {
                FromId  = node1.Id,
                Success = true
            };

            //Make actual EagerSyncRequest and check EagerSyncResponse

            EagerSyncResponse resp;

            (resp, err) = await peer0Trans.EagerSync(peers[1].NetAddr, args);

            Assert.Null(err);

            // Verify the response
            Assert.Equal(expectedResp.Success, resp.Success);

            // shutdown nodes
            node0.Shutdown();
            node1.Shutdown();
        }