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] }); } }
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"); }
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) });
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}"); } }