コード例 #1
0
        private void PrepareBloom()
        {
            if (_bloom != null)
            {
                // already prepared
                return;
            }

            _contractAddress =
                _smartContractAddressService.GetZeroSmartContractAddress();
            _interestedEvent = new ChainPrimaryTokenSymbolSet();
            _logEvent        = _interestedEvent.ToLogEvent(_contractAddress);
            _bloom           = _logEvent.GetBloom();
        }
コード例 #2
0
        public async Task <string> GetPrimaryTokenSymbol()
        {
            PrepareBloom();

            var blockHeader = await _blockchainService.GetBestChainLastBlockHeaderAsync();

            if (blockHeader.Height != Constants.GenesisBlockHeight)
            {
                return(null);
            }

            var block = await _blockchainService.GetBlockByHashAsync(blockHeader.GetHash());

            if (!_bloom.IsIn(new Bloom(block.Header.Bloom.ToByteArray())))
            {
                // No interested event in the block
                return(null);
            }

            Logger.LogTrace("ChainPrimaryTokenSymbolSet event received.");

            foreach (var transactionId in block.Body.TransactionIds)
            {
                var result = await _transactionResultQueryService.GetTransactionResultAsync(transactionId);

                if (result == null)
                {
                    Logger.LogTrace($"Transaction result is null, transactionId: {transactionId}");
                    continue;
                }

                if (result.Status == TransactionResultStatus.Failed)
                {
                    Logger.LogTrace(
                        $"Transaction failed, transactionId: {transactionId}, error: {result.Error}");
                    continue;
                }

                if (result.Bloom.Length == 0 || !_bloom.IsIn(new Bloom(result.Bloom.ToByteArray())))
                {
                    continue;
                }

                foreach (var log in result.Logs)
                {
                    if (log.Address != _contractAddress || log.Name != _logEvent.Name)
                    {
                        continue;
                    }

                    var message = new ChainPrimaryTokenSymbolSet();
                    message.MergeFrom(log);

                    Logger.LogTrace($"Chain primary token symbol: {message.TokenSymbol}");

                    return(message.TokenSymbol);
                }
            }

            return(null);
        }