示例#1
0
        public DeltaHashProvider(IDeltaCache deltaCache,
                                 IDeltaIndexService deltaIndexService,
                                 ILogger logger,
                                 int capacity = 10_000)
        {
            _deltaCache = deltaCache;
            _logger     = logger;
            _deltaHashUpdatesSubject = new ReplaySubject <Cid>(0);
            var comparer = ComparerBuilder.For <Timestamp>().OrderBy(u => u, descending: true);

            _capacity = capacity;
            _hashesByTimeDescending = new SortedList <Timestamp, Cid>(comparer)
            {
                Capacity = _capacity
            };

            var latestDeltaIndex = deltaIndexService.LatestDeltaIndex();

            if (deltaIndexService.LatestDeltaIndex() != null)
            {
                var foundDelta = _deltaCache.TryGetOrAddConfirmedDelta(latestDeltaIndex.Cid, out var delta);
                _hashesByTimeDescending.Add(delta.TimeStamp, latestDeltaIndex.Cid);
                return;
            }

            _hashesByTimeDescending.Add(Timestamp.FromDateTime(DateTime.UnixEpoch), _deltaCache.GenesisHash);
        }
        public ConsensusTests()
        {
            var hashingAlgorithm = HashingAlgorithm.GetAlgorithmMetadata("blake2b-256");

            _hashProvider       = new HashProvider(hashingAlgorithm);
            _cycleEventProvider = new TestCycleEventProvider();
            _deltaBuilder       = Substitute.For <IDeltaBuilder>();
            _deltaVoter         = Substitute.For <IDeltaVoter>();
            _deltaElector       = Substitute.For <IDeltaElector>();
            _deltaCache         = Substitute.For <IDeltaCache>();
            _deltaHub           = Substitute.For <IDeltaHub>();
            var deltaHashProvider = Substitute.For <IDeltaHashProvider>();
            var logger            = Substitute.For <ILogger>();

            _consensus = new Consensus(
                _deltaBuilder,
                _deltaVoter,
                _deltaElector,
                _deltaCache,
                _deltaHub,
                _cycleEventProvider,
                deltaHashProvider,
                _hashProvider,
                logger);

            _consensus.StartProducing();
        }
示例#3
0
        public Synchroniser(SyncState syncState,
                            IPeerSyncManager peerSyncManager,
                            IDeltaCache deltaCache,
                            IDeltaHeightWatcher deltaHeightWatcher,
                            IDeltaHashProvider deltaHashProvider,
                            IDeltaDfsReader deltaDfsReader,
                            IDeltaIndexService deltaIndexService,
                            IMapperProvider mapperProvider,
                            IUserOutput userOutput,
                            ILogger logger,
                            int rangeSize        = 20, //cannot go over 20 until udp network fragmentation is fixed
                            IScheduler scheduler = null)
        {
            State               = syncState;
            _peerSyncManager    = peerSyncManager;
            _deltaHeightWatcher = deltaHeightWatcher;
            DeltaCache          = deltaCache;
            _rangeSize          = rangeSize;
            _deltaIndexService  = deltaIndexService;
            _mapperProvider     = mapperProvider;
            _userOutput         = userOutput;

            _deltaHashProvider = deltaHashProvider;

            _logger = logger;

            _syncCompletedReplaySubject = new ReplaySubject <ulong>(1, scheduler ?? Scheduler.Default);
            SyncCompleted = _syncCompletedReplaySubject.AsObservable();
        }
示例#4
0
        public DeltaBuilderTests()
        {
            _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("blake2b-256"));

            _random = new Random();

            _randomFactory = Substitute.For <IDeterministicRandomFactory>();
            _randomFactory.GetDeterministicRandomFromSeed(Arg.Any <byte[]>())
            .Returns(ci => new IsaacRandom(((byte[])ci[0]).ToHex()));

            _producerId   = PeerIdHelper.GetPeerId("producer");
            _peerSettings = _producerId.ToSubstitutedPeerSettings();

            _previousDeltaHash = _hashProvider.ComputeUtf8MultiHash("previousDelta").CreateCid();
            _zeroCoinbaseEntry = new CoinbaseEntry
            {
                Amount            = UInt256.Zero.ToUint256ByteString(),
                ReceiverPublicKey = _producerId.PublicKey.ToByteString()
            };

            _logger = Substitute.For <ILogger>();

            _cache = Substitute.For <IDeltaCache>();

            _dateTimeProvider = new DateTimeProvider();
        }
示例#5
0
        public void Init()
        {
            _hashProvider       = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));
            _cycleEventProvider = new TestCycleEventProvider();
            _deltaBuilder       = Substitute.For <IDeltaBuilder>();
            _deltaVoter         = Substitute.For <IDeltaVoter>();
            _deltaElector       = Substitute.For <IDeltaElector>();
            _deltaCache         = Substitute.For <IDeltaCache>();
            _deltaHub           = Substitute.For <IDeltaHub>();
            var deltaHashProvider = Substitute.For <IDeltaHashProvider>();
            var logger            = Substitute.For <ILogger>();

            _syncState = new SyncState {
                IsSynchronized = true, IsRunning = true
            };
            _ledger    = Substitute.For <ILedger>();
            _consensus = new Consensus(
                _deltaBuilder,
                _deltaVoter,
                _deltaElector,
                _deltaCache,
                _deltaHub,
                _cycleEventProvider,
                deltaHashProvider,
                logger);

            _consensus.StartProducing();
        }
示例#6
0
        public Web3EthApi(IStateReader stateReader,
                          IDeltaResolver deltaResolver,
                          IDeltaCache deltaCache,
                          IDeltaExecutor executor,
                          IStorageProvider storageProvider,
                          IStateProvider stateProvider,
                          ITransactionRepository receipts,
                          ITransactionReceivedEvent transactionReceived,
                          IPeerRepository peerRepository,
                          IMempool <PublicEntryDao> mempoolRepository,
                          IDfsService dfsService,
                          IHashProvider hashProvider,
                          SyncState syncState,
                          IMapperProvider mapperProvider,
                          IPeerSettings peerSettings)
        {
            _receipts            = receipts;
            _transactionReceived = transactionReceived ?? throw new ArgumentNullException(nameof(transactionReceived));
            HashProvider         = hashProvider;
            _peerId            = peerSettings.PeerId;
            _mempoolRepository = mempoolRepository;
            PeerRepository     = peerRepository;
            _mapperProvider    = mapperProvider;

            StateReader     = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
            DeltaResolver   = deltaResolver ?? throw new ArgumentNullException(nameof(deltaResolver));
            DeltaCache      = deltaCache ?? throw new ArgumentNullException(nameof(deltaCache));
            Executor        = executor ?? throw new ArgumentNullException(nameof(executor));
            StorageProvider = storageProvider ?? throw new ArgumentNullException(nameof(storageProvider));
            StateProvider   = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
            DfsService      = dfsService;
            SyncState       = syncState;
        }
示例#7
0
 public GetDeltaRequestObserver(IHashProvider hashProvider,
                                IDeltaCache deltaCache,
                                IPeerSettings peerSettings,
                                ILogger logger) : base(logger, peerSettings)
 {
     _hashProvider = hashProvider;
     _deltaCache   = deltaCache;
 }
示例#8
0
        public void Init()
        {
            _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));

            _random = new Random(1);

            _randomFactory = Substitute.For <IDeterministicRandomFactory>();
            _randomFactory.GetDeterministicRandomFromSeed(Arg.Any <byte[]>())
            .Returns(ci => new IsaacRandom(((byte[])ci[0]).ToHex()));

            _producerId   = PeerIdHelper.GetPeerId("producer");
            _peerSettings = _producerId.ToSubstitutedPeerSettings();

            _previousDeltaHash = _hashProvider.ComputeUtf8MultiHash("previousDelta").ToCid();
            _zeroCoinbaseEntry = new CoinbaseEntry
            {
                Amount            = UInt256.Zero.ToUint256ByteString(),
                ReceiverPublicKey = _producerId.PublicKey.ToByteString()
            };

            _logger = Substitute.For <ILogger>();

            _cache = Substitute.For <IDeltaCache>();

            Delta previousDelta = new Delta();

            previousDelta.StateRoot = ByteString.CopyFrom(Keccak.EmptyTreeHash.Bytes);
            _cache.TryGetOrAddConfirmedDelta(Arg.Any <Cid>(), out Arg.Any <Delta>()).Returns(x =>
            {
                x[1] = previousDelta;
                return(true);
            });

            _dateTimeProvider = new DateTimeProvider();

            IDb             codeDb       = new MemDb();
            ISnapshotableDb stateDb      = new StateDb();
            ISpecProvider   specProvider = new CatalystSpecProvider();

            _cryptoContext = new FfiWrapper();
            _stateProvider = new StateProvider(stateDb, codeDb, LimboLogs.Instance);
            IStorageProvider  storageProvider = new StorageProvider(stateDb, _stateProvider, LimboLogs.Instance);
            KatVirtualMachine virtualMachine  = new KatVirtualMachine(_stateProvider,
                                                                      storageProvider,
                                                                      new StateUpdateHashProvider(),
                                                                      specProvider,
                                                                      new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256")),
                                                                      new FfiWrapper(),
                                                                      LimboLogs.Instance);

            _deltaExecutor = new DeltaExecutor(specProvider,
                                               _stateProvider,
                                               storageProvider,
                                               virtualMachine,
                                               _cryptoContext,
                                               _logger);
        }
 public TransactionRepository(IRepository <TransactionReceipts, string> repository,
                              IRepository <TransactionToDelta, string> transactionToDeltaRepository,
                              IHashProvider hashProvider,
                              IDeltaCache deltaCache)
 {
     _repository = repository;
     _transactionToDeltaRepository = transactionToDeltaRepository;
     _hashProvider = hashProvider;
     _deltaCache   = deltaCache;
 }
示例#10
0
        public LedgerSynchroniserTests(ITestOutputHelper output)
        {
            _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("blake2b-256"));

            _output     = output;
            _deltaCache = Substitute.For <IDeltaCache>();
            var logger = Substitute.For <ILogger>();

            _cancellationToken = new CancellationToken();

            _synchroniser = new LedgerSynchroniser(_deltaCache, logger);
        }
示例#11
0
        public DeltaHashProviderTests(ITestOutputHelper output) : base(output)
        {
            _deltaCache = Substitute.For <IDeltaCache>();
            _logger     = new LoggerConfiguration()
                          .MinimumLevel.Verbose()
                          .WriteTo.TestOutput(output)
                          .CreateLogger()
                          .ForContext(MethodBase.GetCurrentMethod().DeclaringType);

            _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("blake2b-256"));

            _deltaCache.GenesisHash.Returns(
                _hashProvider.ComputeMultiHash(new Delta().ToByteArray()).CreateCid());
        }
示例#12
0
        public void Init()
        {
            this.Setup(TestContext.CurrentContext);

            _deltaCache = Substitute.For <IDeltaCache>();
            _logger     = new LoggerConfiguration()
                          .MinimumLevel.Verbose()
                          .WriteTo.NUnitOutput()
                          .CreateLogger()
                          .ForContext(MethodBase.GetCurrentMethod().DeclaringType);

            _hashProvider = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));

            _deltaCache.GenesisHash.Returns(
                _hashProvider.ComputeMultiHash(new Delta().ToByteArray()).ToCid());
        }
 public DeltaBuilder(IDeltaTransactionRetriever transactionRetriever,
                     IDeterministicRandomFactory randomFactory,
                     IHashProvider hashProvider,
                     IPeerSettings peerSettings,
                     IDeltaCache deltaCache,
                     IDateTimeProvider dateTimeProvider,
                     ILogger logger)
 {
     _transactionRetriever = transactionRetriever;
     _randomFactory        = randomFactory;
     _hashProvider         = hashProvider;
     _producerUniqueId     = peerSettings.PeerId;
     _deltaCache           = deltaCache;
     _dateTimeProvider     = dateTimeProvider;
     _logger = logger;
 }
示例#14
0
        public DeltaHashProvider(IDeltaCache deltaCache,
                                 ILogger logger,
                                 int capacity = 10_000)
        {
            _deltaCache = deltaCache;
            _logger     = logger;
            _deltaHashUpdatesSubject = new ReplaySubject <MultiHash>(0);
            var comparer = ComparerBuilder.For <Timestamp>().OrderBy(u => u, descending: true);

            _capacity = capacity;
            _hashesByTimeDescending = new SortedList <Timestamp, MultiHash>(comparer)
            {
                Capacity = _capacity
            };

            _hashesByTimeDescending.Add(Timestamp.FromDateTime(DateTime.MinValue.ToUniversalTime()),
                                        _deltaCache.GenesisHash);
        }
示例#15
0
 public Consensus(IDeltaBuilder deltaBuilder,
     IDeltaVoter deltaVoter,
     IDeltaElector deltaElector,
     IDeltaCache deltaCache,
     IDeltaHub deltaHub,
     ICycleEventsProvider cycleEventsProvider,
     IDeltaHashProvider deltaHashProvider,
     ILogger logger)
 {
     _deltaVoter = deltaVoter;
     _deltaElector = deltaElector;
     _cycleEventsProvider = cycleEventsProvider;
     _deltaHashProvider = deltaHashProvider;
     _deltaBuilder = deltaBuilder;
     _deltaHub = deltaHub;
     _deltaCache = deltaCache;
     _logger = logger;
     logger.Information("Consensus repository initialised.");
 }
        protected override BlockForRpc Handle(BlockParameter block, IWeb3EthApi api)
        {
            Cid  deltaHash;
            long blockNumber;

            IDeltaCache    deltaCache    = api.DeltaCache;
            IDeltaResolver deltaResolver = api.DeltaResolver;

            switch (block.Type)
            {
            case BlockParameterType.Earliest:
                deltaHash   = deltaCache.GenesisHash;
                blockNumber = 0;
                break;

            case BlockParameterType.Latest:
                deltaHash   = deltaResolver.LatestDelta;
                blockNumber = deltaResolver.LatestDeltaNumber;
                break;

            case BlockParameterType.Pending:
                deltaHash   = deltaResolver.LatestDelta;
                blockNumber = deltaResolver.LatestDeltaNumber;
                break;

            case BlockParameterType.BlockNumber:
                blockNumber = block.BlockNumber.Value;
                if (!deltaResolver.TryResolve(blockNumber, out deltaHash))
                {
                    return(null);
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            DeltaWithCid deltaWithCid = api.GetDeltaWithCid(deltaHash);

            return(BuildBlock(deltaWithCid, blockNumber, api.HashProvider));
        }
        public GetDeltaRequestObserverTests()
        {
            var builder = new ContainerBuilder();

            builder.RegisterModule <HashingModule>();
            var container = builder.Build();

            container.BeginLifetimeScope();

            _hashProvider = container.Resolve <IHashProvider>();

            _testScheduler = new TestScheduler();
            var logger         = Substitute.For <ILogger>();
            var peerIdentifier = PeerIdHelper.GetPeerId("responder");
            var peerSettings   = peerIdentifier.ToSubstitutedPeerSettings();

            _deltaCache  = Substitute.For <IDeltaCache>();
            _observer    = new GetDeltaRequestObserver(_hashProvider, _deltaCache, peerSettings, logger);
            _fakeContext = Substitute.For <IChannelHandlerContext>();
        }
示例#18
0
 public PreviousDeltaResolverStep(IDeltaCache deltaCache, ILogger logger)
 {
     _deltaCache = deltaCache ?? throw new ArgumentNullException(nameof(deltaCache));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
示例#19
0
 public DeltaRegistrationStep(IDeltaCache deltaCache, ILogger logger)
 {
     _deltaCache = deltaCache ?? throw new ArgumentNullException(nameof(deltaCache));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
示例#20
0
 public GetDeltaRequestObserver(IDeltaCache deltaCache,
                                IPeerSettings peerSettings,
                                ILogger logger) : base(logger, peerSettings)
 {
     _deltaCache = deltaCache;
 }
示例#21
0
 public LedgerSynchroniser(IDeltaCache deltaCache, IHashProvider hashProvider, ILogger logger)
 {
     DeltaCache    = deltaCache;
     _hashProvider = hashProvider;
     _logger       = logger;
 }
示例#22
0
 public LedgerSynchroniser(IDeltaCache deltaCache, ILogger logger)
 {
     DeltaCache = deltaCache;
     _logger    = logger;
 }
示例#23
0
        public void Init()
        {
            _cancellationToken = new CancellationToken();

            _manualResetEventSlim = new ManualResetEventSlim(false);

            _testScheduler = new TestScheduler();
            _hashProvider  = new HashProvider(HashingAlgorithm.GetAlgorithmMetadata("keccak-256"));

            _peerSettings = Substitute.For <IPeerSettings>();
            _peerSettings.PeerId.Returns(PeerIdHelper.GetPeerId());

            _deltaDfsReader = Substitute.For <IDeltaDfsReader>();
            _deltaDfsReader.TryReadDeltaFromDfs(Arg.Any <Cid>(), out Arg.Any <Delta>()).Returns(x => true);

            _deltaCache = Substitute.For <IDeltaCache>();
            _deltaCache.GenesisHash.Returns("bafk2bzacecji5gcdd6lxsoazgnbg46c3vttjwwkptiw27enachziizhhkir2w".ToCid());

            _ledger = Substitute.For <ILedger>();

            _peerService = Substitute.For <IPeerService>();

            _deltaHashProvider = new DeltaHashProvider(_deltaCache, Substitute.For <IDeltaIndexService>(), Substitute.For <ILogger>());

            _deltaIndexService = new DeltaIndexService(new InMemoryRepository <DeltaIndexDao, string>());
            _deltaIndexService.Add(new DeltaIndexDao {
                Cid = _hashProvider.ComputeUtf8MultiHash("0").ToCid(), Height = 0
            });

            _peerClient = Substitute.For <IPeerClient>();
            ModifyPeerClient <LatestDeltaHashRequest>((request, senderPeerIdentifier) =>
            {
                var deltaHeightResponse = new LatestDeltaHashResponse
                {
                    DeltaIndex = new DeltaIndex
                    {
                        Cid = _hashProvider.ComputeUtf8MultiHash(_syncTestHeight.ToString()).ToCid().ToArray()
                              .ToByteString(),
                        Height = (uint)_syncTestHeight
                    }
                };

                _deltaHeightReplaySubject.OnNext(new ObserverDto(Substitute.For <IChannelHandlerContext>(),
                                                                 deltaHeightResponse.ToProtocolMessage(senderPeerIdentifier, CorrelationId.GenerateCorrelationId())));
            });

            ModifyPeerClient <DeltaHistoryRequest>((request, senderPeerIdentifier) =>
            {
                var data = GenerateSampleData((int)request.Height, (int)request.Range, (int)_syncTestHeight);
                _deltaIndexService.Add(data.DeltaIndex.Select(x => DeltaIndexDao.ToDao <DeltaIndex>(x, _mapperProvider)));

                _deltaHistoryReplaySubject.OnNext(new ObserverDto(Substitute.For <IChannelHandlerContext>(),
                                                                  data
                                                                  .ToProtocolMessage(senderPeerIdentifier, CorrelationId.GenerateCorrelationId())));
            });

            _peerRepository = new PeerRepository(new InMemoryRepository <Peer, string>());
            Enumerable.Repeat(new Peer {
                PeerId = PeerIdHelper.GetPeerId()
            }, 5).ToList().ForEach(_peerRepository.Add);

            _deltaHeightReplaySubject  = new ReplaySubject <IObserverDto <ProtocolMessage> >(1);
            _deltaHistoryReplaySubject = new ReplaySubject <IObserverDto <ProtocolMessage> >(1);

            var mergeMessageStreams = _deltaHeightReplaySubject.AsObservable()
                                      .Merge(_deltaHistoryReplaySubject.AsObservable());

            _peerService.MessageStream.Returns(mergeMessageStreams);

            _deltaHashProvider = Substitute.For <IDeltaHashProvider>();
            _deltaHashProvider.TryUpdateLatestHash(Arg.Any <Cid>(), Arg.Any <Cid>()).Returns(true);

            _mapperProvider = new TestMapperProvider();

            _userOutput = Substitute.For <IUserOutput>();

            _deltaHeightWatcher = new DeltaHeightWatcher(_peerClient, _peerRepository, _peerService, minimumPeers: 0);

            var dfsService = Substitute.For <IDfsService>();

            _peerSyncManager = new PeerSyncManager(_peerClient, _peerRepository,
                                                   _peerService, _userOutput, _deltaHeightWatcher, Substitute.For <IDfsService>(), 0.7, 0);
        }