예제 #1
0
        private void SetUp(int n, int f)
        {
            _deliveryService    = new DeliveryService();
            _broadcasts         = new IConsensusProtocol[n];
            _broadcasters       = new IConsensusBroadcaster[n];
            _resultInterceptors = new ProtocolInvoker <ReliableBroadcastId, EncryptedShare> [n];
            _wallets            = new IPrivateConsensusKeySet[n];
            _publicKeys         = new PublicConsensusKeySet(
                n, f, null !, null !,
                Enumerable.Range(0, n)
                .Select(i => new ECDSAPublicKey {
                Buffer = ByteString.CopyFrom(i.ToBytes().ToArray())
            })
                );
            for (var i = 0; i < n; ++i)
            {
                _wallets[i]            = TestUtils.EmptyWallet(n, f);
                _broadcasters[i]       = new BroadcastSimulator(i, _publicKeys, _wallets[i], _deliveryService, false);
                _resultInterceptors[i] = new ProtocolInvoker <ReliableBroadcastId, EncryptedShare>();
            }

            var bytes = Enumerable.Range(0, 32)
                        .Select(x => (byte)(x * x * 0))
                        .ToArray();

            _testShare = new EncryptedShare(G1.Generator, bytes, G2.Generator, Sender);
        }
예제 #2
0
        private void CheckResult()
        {
            if (_requested != ResultStatus.Requested)
            {
                return;
            }
            var(bestRootCnt, bestRoot) = _readyMessages
                                         .Where(x => x != null)
                                         .GroupBy(x => x !.MerkleTreeRoot)
                                         .Select(m => (cnt: m.Count(), key: m.Key))
                                         .OrderByDescending(x => x.cnt)
                                         .FirstOrDefault();
            if (bestRootCnt < 2 * F + 1)
            {
                return;
            }
            var matchingEchos = _echoMessages
                                .WithIndex()
                                .Where(t => bestRoot.Equals(t.item?.MerkleTreeRoot))
                                .Select(t => (echo: t.item !, t.index))
                                .Take(N - 2 * F)
                                .ToArray();

            if (matchingEchos.Length < N - 2 * F)
            {
                return;
            }

            var restored = DecodeFromEchos(matchingEchos);
            var len      = restored.AsReadOnlySpan().Slice(0, 4).ToInt32();
            var result   = EncryptedShare.FromBytes(restored.AsMemory().Slice(4, len));

            _requested = ResultStatus.Sent;
            Broadcaster.InternalResponse(new ProtocolResult <ReliableBroadcastId, EncryptedShare>(_broadcastId, result));
        }
예제 #3
0
        public void TestToByte()
        {
            var encryptedShare1          = new EncryptedShare(G1.Generator, new byte[] { 1, 2, 3, 4, 5, 6, 6 }, G2.Generator, 0);
            var serializedEncryptedShare = encryptedShare1.ToByte();
            var encryptedShare2          = EncryptedShare.FromByte(serializedEncryptedShare);

            Console.WriteLine(encryptedShare1.Equals(encryptedShare2) ? "Test pass" : "Test NOT pass");
        }
예제 #4
0
        private void TestAllCommonSubset(int n, int f, DeliveryServiceMode mode = DeliveryServiceMode.TAKE_FIRST)
        {
            SetUpAllHonest(n, f);
            _deliveryService.Mode = mode;
            var inputs = new List <EncryptedShare>();
            var rnd    = new byte[32];

            _rnd.NextBytes(rnd);
            for (var i = 0; i < n; ++i)
            {
                var testShare = new EncryptedShare(G1.Generator, rnd, G2.Generator, i);
                inputs.Add(testShare);
                _broadcasters[i].InternalRequest(new ProtocolRequest <CommonSubsetId, EncryptedShare>(
                                                     _resultInterceptors[i].Id, (_acs[i].Id as CommonSubsetId) !, testShare
                                                     ));
            }

            for (var i = 0; i < n; ++i)
            {
                if (_deliveryService.MutedPlayers.Contains(i))
                {
                    continue;
                }
                _acs[i].WaitResult();
            }

            _deliveryService.WaitFinish();
            for (var i = 0; i < n; ++i)
            {
                _broadcasters[i].Terminate();
                foreach (var id in _broadcasters[i].Registry.Keys)
                {
                    Assert.NotNull(id);
                    var protocol = _broadcasters[i].GetProtocolById(id);
                    if (protocol == null)
                    {
                        continue;
                    }
                    protocol.Terminate();
                    protocol.WaitFinish();
                }
            }

            var outputs = new List <ISet <EncryptedShare> >();

            for (var i = 0; i < n; ++i)
            {
                Assert.IsTrue(_acs[i].Terminated, $"protocol {i} did not terminated");
                Assert.AreEqual(_resultInterceptors[i].ResultSet, 1,
                                $"protocol {i} has emitted result not once but {_resultInterceptors[i].ResultSet}");
                Assert.AreEqual(n, _resultInterceptors[i].Result.Count);

                outputs.Add(_resultInterceptors[i].Result);
            }

            CheckOutput(n, f, inputs.ToArray(), outputs.ToArray());
        }