Пример #1
0
        /// <summary>
        /// Get the current status of a transaction
        /// </summary>
        /// <param name="transactionId">transaction id</param>
        /// <returns></returns>
        public async Task <TransactionResultDto> GetTransactionResultAsync(string transactionId)
        {
            Hash transactionIdHash;

            try
            {
                transactionIdHash = HashHelper.HexStringToHash(transactionId);
            }
            catch
            {
                throw new UserFriendlyException(Error.Message[Error.InvalidTransactionId],
                                                Error.InvalidTransactionId.ToString());
            }

            var transactionResult = await GetTransactionResultAsync(transactionIdHash);

            var transaction = await _transactionManager.GetTransactionAsync(transactionResult.TransactionId);

            var output = JsonConvert.DeserializeObject <TransactionResultDto>(transactionResult.ToString());

            if (transactionResult.Status == TransactionResultStatus.Mined)
            {
                var block = await _blockchainService.GetBlockAtHeightAsync(transactionResult.BlockNumber);

                output.BlockHash   = block.GetHash().ToHex();
                output.ReturnValue = transactionResult.ReturnValue.ToHex();
            }

            if (transactionResult.Status == TransactionResultStatus.Failed)
            {
                output.Error = transactionResult.Error;
            }

            if (transactionResult.Status == TransactionResultStatus.NotExisted)
            {
                output.Status = transactionResult.Status.ToString();
                return(output);
            }

            output.Transaction = JsonConvert.DeserializeObject <TransactionDto>(transaction.ToString());
            var methodDescriptor = await ContractMethodDescriptorHelper.GetContractMethodDescriptorAsync(
                _blockchainService, _transactionReadOnlyExecutionService, transaction.To, transaction.MethodName);

            if (methodDescriptor != null)
            {
                output.Transaction.Params = JsonFormatter.ToDiagnosticString(
                    methodDescriptor.InputType.Parser.ParseFrom(transaction.Params));
            }
            return(output);
        }
        private async Task <TransactionResultDto> GetTransactionResultDto(Hash transactionId, Hash realBlockHash, Hash blockHash)
        {
            var transactionResult = await GetTransactionResultAsync(transactionId, realBlockHash);

            var transactionResultDto =
                JsonConvert.DeserializeObject <TransactionResultDto>(transactionResult.ToString());
            var transaction = await _transactionManager.GetTransactionAsync(transactionResult.TransactionId);

            transactionResultDto.BlockHash   = blockHash.ToHex();
            transactionResultDto.ReturnValue = transactionResult.ReturnValue.ToHex();

            if (transactionResult.Status == TransactionResultStatus.Failed)
            {
                transactionResultDto.Error = transactionResult.Error;
            }

            transactionResultDto.Transaction =
                JsonConvert.DeserializeObject <TransactionDto>(transaction.ToString());

            var methodDescriptor =
                await ContractMethodDescriptorHelper.GetContractMethodDescriptorAsync(_blockchainService,
                                                                                      _transactionReadOnlyExecutionService, transaction.To, transaction.MethodName,
                                                                                      new ChainContext
                                                                                      { BlockHash = blockHash, BlockHeight = transactionResult.BlockNumber }, false);

            if (methodDescriptor != null)
            {
                var parameters = methodDescriptor.InputType.Parser.ParseFrom(transaction.Params);
                if (!IsValidMessage(parameters))
                {
                    throw new UserFriendlyException(Error.Message[Error.InvalidParams], Error.InvalidParams.ToString());
                }

                transactionResultDto.Transaction.Params = JsonFormatter.ToDiagnosticString(parameters);
            }

            transactionResultDto.Status = transactionResult.Status.ToString();

            transactionResultDto.TransactionFee = transactionResult.TransactionFee == null
                ? new TransactionFeeDto()
                : JsonConvert.DeserializeObject <TransactionFeeDto>(transactionResult.TransactionFee.ToString());

            return(transactionResultDto);
        }
Пример #3
0
 private async Task <MethodDescriptor> GetContractMethodDescriptorAsync(Address contractAddress,
                                                                        string methodName)
 {
     return(await ContractMethodDescriptorHelper.GetContractMethodDescriptorAsync(_blockchainService,
                                                                                  _transactionReadOnlyExecutionService, contractAddress, methodName));
 }
        /// <summary>
        /// Get multiple transaction results.
        /// </summary>
        /// <param name="blockHash">block hash</param>
        /// <param name="offset">offset</param>
        /// <param name="limit">limit</param>
        /// <returns></returns>
        /// <exception cref="UserFriendlyException"></exception>
        public async Task <List <TransactionResultDto> > GetTransactionResultsAsync(string blockHash, int offset = 0,
                                                                                    int limit = 10)
        {
            if (offset < 0)
            {
                throw new UserFriendlyException(Error.Message[Error.InvalidOffset], Error.InvalidOffset.ToString());
            }

            if (limit <= 0 || limit > 100)
            {
                throw new UserFriendlyException(Error.Message[Error.InvalidLimit], Error.InvalidLimit.ToString());
            }

            Hash realBlockHash;

            try
            {
                realBlockHash = HashHelper.HexStringToHash(blockHash);
            }
            catch
            {
                throw new UserFriendlyException(Error.Message[Error.InvalidBlockHash],
                                                Error.InvalidBlockHash.ToString());
            }

            var block = await _blockchainService.GetBlockAsync(realBlockHash);

            if (block == null)
            {
                throw new UserFriendlyException(Error.Message[Error.NotFound], Error.NotFound.ToString());
            }

            var output = new List <TransactionResultDto>();

            if (offset <= block.Body.TransactionIds.Count - 1)
            {
                limit = Math.Min(limit, block.Body.TransactionIds.Count - offset);
                var transactionIds = block.Body.TransactionIds.ToList().GetRange(offset, limit);
                foreach (var hash in transactionIds)
                {
                    var transactionResult = await GetTransactionResultAsync(hash);

                    var transactionResultDto =
                        JsonConvert.DeserializeObject <TransactionResultDto>(transactionResult.ToString());
                    var transaction = await _transactionManager.GetTransaction(transactionResult.TransactionId);

                    transactionResultDto.BlockHash = block.GetHash().ToHex();

                    if (transactionResult.Status == TransactionResultStatus.Failed)
                    {
                        transactionResultDto.Error = transactionResult.Error;
                    }

                    transactionResultDto.Transaction =
                        JsonConvert.DeserializeObject <TransactionDto>(transaction.ToString());

                    var methodDescriptor =
                        await ContractMethodDescriptorHelper.GetContractMethodDescriptorAsync(_blockchainService,
                                                                                              _transactionReadOnlyExecutionService, transaction.To, transaction.MethodName);

                    transactionResultDto.Transaction.Params = JsonFormatter.ToDiagnosticString(
                        methodDescriptor.InputType.Parser.ParseFrom(transaction.Params));

                    transactionResultDto.Status = transactionResult.Status.ToString();
                    output.Add(transactionResultDto);
                }
            }

            return(output);
        }
        /// <summary>
        /// Get the current status of a transaction
        /// </summary>
        /// <param name="transactionId">transaction id</param>
        /// <returns></returns>
        public async Task <TransactionResultDto> GetTransactionResultAsync(string transactionId)
        {
            Hash transactionIdHash;

            try
            {
                transactionIdHash = HashHelper.HexStringToHash(transactionId);
            }
            catch
            {
                throw new UserFriendlyException(Error.Message[Error.InvalidTransactionId],
                                                Error.InvalidTransactionId.ToString());
            }

            var transactionResult = await GetTransactionResultAsync(transactionIdHash);

            var transaction = await _transactionManager.GetTransactionAsync(transactionResult.TransactionId);

            var output = JsonConvert.DeserializeObject <TransactionResultDto>(transactionResult.ToString());

            if (transactionResult.Status == TransactionResultStatus.NotExisted)
            {
                output.Status = transactionResult.Status.ToString();
                return(output);
            }

            ChainContext chainContext = null;

            if (transactionResult.BlockNumber > 0)
            {
                var block = await _blockchainService.GetBlockAtHeightAsync(transactionResult.BlockNumber);

                output.BlockHash = block.GetHash().ToHex();
                chainContext     = new ChainContext
                {
                    BlockHash   = block.GetHash(),
                    BlockHeight = block.Height
                };
            }
            output.Transaction = JsonConvert.DeserializeObject <TransactionDto>(transaction.ToString());
            var methodDescriptor = await ContractMethodDescriptorHelper.GetContractMethodDescriptorAsync(
                _blockchainService, _transactionReadOnlyExecutionService, transaction.To, transaction.MethodName,
                chainContext, false);

            if (methodDescriptor != null)
            {
                var parameters = methodDescriptor.InputType.Parser.ParseFrom(transaction.Params);
                if (!IsValidMessage(parameters))
                {
                    throw new UserFriendlyException(Error.Message[Error.InvalidParams], Error.InvalidParams.ToString());
                }

                output.Transaction.Params = JsonFormatter.ToDiagnosticString(parameters);
            }

            if (transactionResult.Status == TransactionResultStatus.Pending)
            {
                return(output);
            }

            if (transactionResult.Status == TransactionResultStatus.Mined)
            {
                output.ReturnValue = transactionResult.ReturnValue.ToHex();
                var bloom = transactionResult.Bloom;
                output.Bloom = bloom.Length == 0 ? ByteString.CopyFrom(new byte[256]).ToBase64() : bloom.ToBase64();
            }

            if (transactionResult.Status == TransactionResultStatus.Failed)
            {
                output.Error = transactionResult.Error;
            }

            output.TransactionFee = transactionResult.TransactionFee == null
                ? new TransactionFeeDto()
                : JsonConvert.DeserializeObject <TransactionFeeDto>(transactionResult.TransactionFee.ToString());

            return(output);
        }