public async Task MergeBlockStateAsync(ChainStateInfo chainStateInfo, Hash blockStateHash)
        {
            var blockState = await _blockStateSets.GetAsync(blockStateHash.ToStorageKey());

            if (blockState == null)
            {
                if (chainStateInfo.Status == ChainStateMergingStatus.Merged &&
                    chainStateInfo.MergingBlockHash == blockStateHash)
                {
                    chainStateInfo.Status           = ChainStateMergingStatus.Common;
                    chainStateInfo.MergingBlockHash = null;

                    await _chainStateInfoCollection.SetAsync(chainStateInfo.ChainId.ToStorageKey(), chainStateInfo);

                    return;
                }

                throw new InvalidOperationException($"cannot get block state of {blockStateHash}");
            }

            if (chainStateInfo.BlockHash == null || chainStateInfo.BlockHash == blockState.PreviousHash ||
                (chainStateInfo.Status == ChainStateMergingStatus.Merged &&
                 chainStateInfo.MergingBlockHash == blockState.BlockHash))
            {
                chainStateInfo.Status           = ChainStateMergingStatus.Merging;
                chainStateInfo.MergingBlockHash = blockStateHash;

                await _chainStateInfoCollection.SetAsync(chainStateInfo.ChainId.ToStorageKey(), chainStateInfo);

                var dic = blockState.Changes.Select(change => new VersionedState()
                {
                    Key         = change.Key,
                    Value       = change.Value,
                    BlockHash   = blockState.BlockHash,
                    BlockHeight = blockState.BlockHeight,
                    //OriginBlockHash = origin.BlockHash
                }).ToDictionary(p => p.Key, p => p);

                await _versionedStates.SetAllAsync(dic);

                await _versionedStates.RemoveAllAsync(blockState.Deletes.ToList());

                chainStateInfo.Status      = ChainStateMergingStatus.Merged;
                chainStateInfo.BlockHash   = blockState.BlockHash;
                chainStateInfo.BlockHeight = blockState.BlockHeight;
                await _chainStateInfoCollection.SetAsync(chainStateInfo.ChainId.ToStorageKey(), chainStateInfo);

                await _blockStateSets.RemoveAsync(blockStateHash.ToStorageKey());

                chainStateInfo.Status           = ChainStateMergingStatus.Common;
                chainStateInfo.MergingBlockHash = null;

                await _chainStateInfoCollection.SetAsync(chainStateInfo.ChainId.ToStorageKey(), chainStateInfo);
            }
            else
            {
                throw new InvalidOperationException(
                          "cannot merge block not linked, check new block's previous block hash ");
            }
        }
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            var transactionIds = _systemTransactions.Concat(_cancellableTransactions).Select(t => t.GetHash()).ToList();

            await RemoveTransactionResultsAsync(transactionIds, _block.GetHash());
        }
Example #3
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            var transactionIds = _transactions.Select(t => t.GetHash()).ToList();
            await _transactionResultManager.RemoveTransactionResultsAsync(transactionIds, _block.GetHash());

            await _transactionResultManager.RemoveTransactionResultsAsync(transactionIds,
                                                                          _block.Header.GetPreMiningHash());
        }
Example #4
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            foreach (var transaction in _transactions)
            {
                _transactionResultManager.RemoveTransactionResultAsync(transaction.GetHash(), _block.GetHash());
                _transactionResultManager.RemoveTransactionResultAsync(transaction.GetHash(),
                                                                       _block.Header.GetPreMiningHash());
            }
        }
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            var transactionIds = _transactions.Select(t => t.GetHash()).ToList();
            await _transactionManager.RemoveTransactionsAsync(transactionIds);

            await RemoveTransactionResultsAsync(transactionIds, _block.GetHash());

            await _transactionPoolService.CleanByTransactionIdsAsync(_transactions.Select(t => t.GetHash()).ToList());

            await _transactionPoolService.UpdateTransactionPoolByBestChainAsync(_chain.BestChainHash,
                                                                                _chain.BestChainHeight);
        }
Example #6
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            await _transactionManager.RemoveTransactionsAsync(_block.Body.TransactionIds);

            await RemoveTransactionResultsAsync(_block.Body.TransactionIds, _block.GetHash());

            await _chainManager.RemoveChainBlockLinkAsync(_block.GetHash());

            await _blockManager.RemoveBlockAsync(_block.GetHash());

            await _chains.SetAsync(_chain.Id.ToStorageKey(), _chain);
        }
Example #7
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            foreach (var tx in _block.Body.Transactions)
            {
                _transactionManager.RemoveTransaction(tx);
                _transactionResultManager.RemoveTransactionResultAsync(tx, _block.GetHash());
                _transactionResultManager.RemoveTransactionResultAsync(tx, _block.Header.GetPreMiningHash());
            }
            await _chainManager.RemoveChainBlockLinkAsync(_block.GetHash());

            await _blockManager.RemoveBlockAsync(_block.GetHash());

            await _chains.SetAsync(_chain.Id.ToStorageKey(), _chain);
        }
Example #8
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            var transactionIds = _transactions.Select(t => t.GetHash()).ToList();
            await _transactionManager.RemoveTransactionsAsync(transactionIds);

            await _transactionResultManager.RemoveTransactionResultsAsync(transactionIds, _block.GetHash());

            await _transactionResultManager.RemoveTransactionResultsAsync(transactionIds,
                                                                          _block.Header.GetPreMiningHash());

            await _txHub.CleanTransactionsAsync(_transactions.Select(t => t.GetHash()).ToList());

            await _txHub.HandleBestChainFoundAsync(new BestChainFoundEventData
            {
                BlockHash   = _chain.BestChainHash,
                BlockHeight = _chain.BestChainHeight
            });
        }
Example #9
0
        public async Task IterationCleanup()
        {
            await _blockStateSets.RemoveAsync(_block.GetHash().ToStorageKey());

            foreach (var transaction in _transactions)
            {
                _transactionManager.RemoveTransaction(transaction.GetHash());
                _transactionResultManager.RemoveTransactionResultAsync(transaction.GetHash(), _block.GetHash());
                _transactionResultManager.RemoveTransactionResultAsync(transaction.GetHash(),
                                                                       _block.Header.GetPreMiningHash());
            }

            await _txHub.HandleUnexecutableTransactionsFoundAsync(new UnexecutableTransactionsFoundEvent
                                                                  (null, _transactions.Select(t => t.GetHash()).ToList()));

            await _txHub.HandleBestChainFoundAsync(new BestChainFoundEventData
            {
                BlockHash   = _chain.BestChainHash,
                BlockHeight = _chain.BestChainHeight
            });
        }