コード例 #1
0
        private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null)
        {
            bool fromReceipts = receipts != null;

            if (fromReceipts || !isConsecutiveBlock)
            {
                bool incrementalChanges          = _dataContract.IncrementalChanges;
                bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !incrementalChanges) && !blockHeader.IsGenesis;

                try
                {
                    IEnumerable <T> items = canGetFullStateFromReceipts
                        ? _dataContract.GetItemsChangedFromBlock(blockHeader, receipts)
                        : _dataContract.GetAllItemsFromBlock(blockHeader);

                    if (!fromReceipts || !isConsecutiveBlock || !incrementalChanges)
                    {
                        RemoveOldContractItemsFromCollection();
                    }

                    Collection.Insert(items);

                    _lastHash = blockHeader.Hash;
                }
                catch (AbiException e)
                {
                    if (_logger.IsError)
                    {
                        _logger.Error("Failed to update data from contract.", e);
                    }
                }
            }
        }
コード例 #2
0
        private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null)
        {
            Items ??= CreateItems();
            bool fromReceipts = receipts != null;

            if (fromReceipts || !isConsecutiveBlock)
            {
                if (!fromReceipts || !isConsecutiveBlock || !_dataContract.IncrementalChanges)
                {
                    ClearItems(Items);
                }

                bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !_dataContract.IncrementalChanges) && !blockHeader.IsGenesis;

                IEnumerable <T> items = canGetFullStateFromReceipts
                    ? _dataContract.GetItemsChangedFromBlock(blockHeader, receipts)
                    : _dataContract.GetAllItemsFromBlock(blockHeader);

                InsertItems(Items, items);

                _lastHash = blockHeader.Hash;
            }
        }
コード例 #3
0
        private void GetItemsFromContractAtBlock(BlockHeader blockHeader, bool isConsecutiveBlock, TxReceipt[] receipts = null)
        {
            bool fromReceipts = receipts != null;

            if (fromReceipts || !isConsecutiveBlock)
            {
                bool incrementalChanges          = _dataContract.IncrementalChanges;
                bool canGetFullStateFromReceipts = fromReceipts && (isConsecutiveBlock || !incrementalChanges);

                try
                {
                    bool            dataChanged = true;
                    IEnumerable <T> items;

                    lock (_lock)
                    {
                        if (canGetFullStateFromReceipts)
                        {
                            dataChanged = _dataContract.TryGetItemsChangedFromBlock(blockHeader, receipts, out items);

                            if (!dataChanged && !isConsecutiveBlock)
                            {
                                items       = _dataContract.GetAllItemsFromBlock(blockHeader);
                                dataChanged = true;
                            }
                        }
                        else
                        {
                            items = _dataContract.GetAllItemsFromBlock(blockHeader);
                        }
                    }

                    if (dataChanged)
                    {
                        if (!fromReceipts || !isConsecutiveBlock || !incrementalChanges)
                        {
                            RemoveOldContractItemsFromCollection();
                        }

                        Collection.Insert(items);
                        TraceDataChanged("contract");
                    }

                    _lastHash = blockHeader.Hash;

                    if (_logger.IsTrace)
                    {
                        _logger.Trace($"{GetType()} trying to {nameof(GetItemsFromContractAtBlock)} with params " +
                                      $"{nameof(canGetFullStateFromReceipts)}:{canGetFullStateFromReceipts}, " +
                                      $"{nameof(fromReceipts)}:{fromReceipts}, " +
                                      $"{nameof(isConsecutiveBlock)}:{isConsecutiveBlock}, " +
                                      $"{nameof(incrementalChanges)}:{incrementalChanges}, " +
                                      $"{nameof(dataChanged)}:{dataChanged}. " +
                                      $"Results in {string.Join(", ", Collection.GetSnapshot())}. " +
                                      $"On {blockHeader.ToString(BlockHeader.Format.FullHashAndNumber)}. " +
                                      $"From {new StackTrace()}");
                    }
                }
                catch (AbiException e)
                {
                    if (_logger.IsError)
                    {
                        _logger.Error($"Failed to update data from contract on block {blockHeader.ToString(BlockHeader.Format.FullHashAndNumber)} {new StackTrace()}.", e);
                    }
                }
            }
        }