Пример #1
0
 private void SetUpAllHonestNSenders(int n, int f)
 {
     SetUp(n, f);
     for (var i = 0; i < n; ++i)
     {
         _broadcasts[i] =
             new ReliableBroadcast(new ReliableBroadcastId(i, 0), _publicKeys, _broadcasters[i]);
         _broadcasters[i].RegisterProtocols(new[] { _broadcasts[i], _resultInterceptors[i] });
     }
 }
Пример #2
0
        public void TestCorrectInput()
        {
            var N   = 22;
            var rnd = new Random();
            var randomLengthInput = rnd.Next(1000, 5000);
            var randomInput       = ReliableBroadcast.GetInput(randomLengthInput);
            var correctInput      = RBTools.GetCorrectInput(randomInput, N);

            Console.WriteLine(correctInput.Count % N == 0
                ? $"Test pass Length: {randomLengthInput} remainder: {randomLengthInput % N} correctInputLength: {correctInput.Count}"
                : "Test NOT pass");

            Console.WriteLine(randomInput.SequenceEqual(RBTools.GetOriginalInput(correctInput.ToArray()))
                ? "EQUAL"
                : "NOT EQUAL");
        }
Пример #3
0
 public void TestErasureCoding()
 {
     const int nShards = 4, nErasures = 2;
     var       rbc = new ReliableBroadcast(
         new ReliableBroadcastId(0, 0),
         new PublicConsensusKeySet(4, 1, null !, null !, Enumerable.Empty <ECDSAPublicKey>()),
         null !
         );
     var data = Enumerable.Range(0, 100)
                .Select(x => (byte)x)
                .ToArray();
     var shards = ReliableBroadcast.ErasureCodingShards(data, nShards, nErasures);
     var echo1  = new ECHOMessage {
         Data = ByteString.CopyFrom(shards[1])
     };
     var echo2 = new ECHOMessage {
         Data = ByteString.CopyFrom(shards[2])
     };
     var decoded = rbc.DecodeFromEchos(new (ECHOMessage echo, int @from)[] { (echo1, 1), (echo2, 2) });
Пример #4
0
        private IConsensusProtocol?EnsureProtocol(IProtocolIdentifier id)
        {
            ValidateId(id);
            if (_registry.TryGetValue(id, out var existingProtocol))
            {
                return(existingProtocol);
            }
            Logger.LogTrace($"Creating protocol {id} on demand");
            if (_terminated)
            {
                Logger.LogTrace($"Protocol {id} not created since broadcaster is terminated");
                return(null);
            }

            switch (id)
            {
            case BinaryBroadcastId bbId:
                var bb = new BinaryBroadcast(bbId, _validators, this);
                RegisterProtocols(new[] { bb });
                return(bb);

            case CoinId coinId:
                var coin = new CommonCoin(
                    coinId, _validators,
                    _wallet.GetThresholdSignatureKeyForBlock((ulong)_era - 1) ??
                    throw new InvalidOperationException($"No TS keys present for era {_era}"),
                    this
                    );
                RegisterProtocols(new[] { coin });
                return(coin);

            case ReliableBroadcastId rbcId:
                var rbc = new ReliableBroadcast(rbcId, _validators, this);
                RegisterProtocols(new[] { rbc });
                return(rbc);

            case BinaryAgreementId baId:
                var ba = new BinaryAgreement(baId, _validators, this);
                RegisterProtocols(new[] { ba });
                return(ba);

            case CommonSubsetId acsId:
                var acs = new CommonSubset(acsId, _validators, this);
                RegisterProtocols(new[] { acs });
                return(acs);

            case HoneyBadgerId hbId:
                var hb = new HoneyBadger(
                    hbId, _validators,
                    _wallet.GetTpkePrivateKeyForBlock((ulong)_era - 1)
                    ?? throw new InvalidOperationException($"No TPKE keys present for era {_era}"),
                    this
                    );
                RegisterProtocols(new[] { hb });
                return(hb);

            case RootProtocolId rootId:
                var root = new RootProtocol(rootId, _validators, _wallet.EcdsaKeyPair.PrivateKey,
                                            this, _validatorAttendanceRepository, StakingContract.CycleDuration,
                                            HardforkHeights.IsHardfork_9Active((ulong)_era));
                RegisterProtocols(new[] { root });
                return(root);

            default:
                throw new Exception($"Unknown protocol type {id}");
            }
        }