Exemple #1
0
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            var txResult = new TransactionResult
            {
                TransactionId = trace.TransactionId,
                BlockNumber   = blockHeight,
            };

            if (!trace.IsSuccessful())
            {
                // Is failed.
                txResult.Status = TransactionResultStatus.Failed;
                if (trace.ExecutionStatus == ExecutionStatus.Undefined)
                {
                    // Cannot find specific contract method.
                    txResult.Error = ExecutionStatus.Undefined.ToString();
                }
                else
                {
                    txResult.Error = trace.Error;
                    if (trace.ExecutionStatus != ExecutionStatus.Prefailed || IsExecutionStoppedByPrePlugin(trace))
                    {
                        txResult.Logs.AddRange(trace.GetPluginLogs());
                        txResult.UpdateBloom();
                    }
                }
            }
            else
            {
                // Is successful.
                txResult.Status      = TransactionResultStatus.Mined;
                txResult.ReturnValue = trace.ReturnValue;
                txResult.Logs.AddRange(trace.FlattenedLogs);

                txResult.UpdateBloom();
            }

            return(txResult);
        }
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            if (trace.ExecutionStatus == ExecutionStatus.Undefined)
            {
                return(null);
            }

            if (trace.ExecutionStatus == ExecutionStatus.Prefailed)
            {
                return(new TransactionResult()
                {
                    TransactionId = trace.TransactionId,
                    Status = TransactionResultStatus.Unexecutable,
                    Error = trace.StdErr
                });
            }

            if (trace.IsSuccessful())
            {
                var txRes = new TransactionResult()
                {
                    TransactionId       = trace.TransactionId,
                    Status              = TransactionResultStatus.Mined,
                    ReturnValue         = trace.ReturnValue,
                    ReadableReturnValue = trace.ReadableReturnValue,
                    BlockNumber         = blockHeight,
                    //StateHash = trace.GetSummarizedStateHash(),
                    Logs = { trace.FlattenedLogs }
                };
                txRes.UpdateBloom();

                // insert deferred txn to transaction pool and wait for execution
                if (trace.DeferredTransaction.Length != 0)
                {
                    var deferredTxn = Transaction.Parser.ParseFrom(trace.DeferredTransaction);
                    txRes.DeferredTransactions.Add(deferredTxn);
                    txRes.DeferredTxnId = deferredTxn.GetHash();
                }

                return(txRes);
            }

            return(new TransactionResult()
            {
                TransactionId = trace.TransactionId,
                Status = TransactionResultStatus.Failed,
                Error = trace.StdErr
            });
        }
Exemple #3
0
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            if (trace.ExecutionStatus == ExecutionStatus.Undefined)
            {
                return(new TransactionResult
                {
                    TransactionId = trace.TransactionId,
                    Status = TransactionResultStatus.Unexecutable,
                    Error = ExecutionStatus.Undefined.ToString()
                });
            }

            if (trace.ExecutionStatus == ExecutionStatus.Prefailed)
            {
                return(new TransactionResult
                {
                    TransactionId = trace.TransactionId,
                    Status = TransactionResultStatus.Unexecutable,
                    Error = trace.Error
                });
            }

            if (trace.IsSuccessful())
            {
                var txRes = new TransactionResult
                {
                    TransactionId       = trace.TransactionId,
                    Status              = TransactionResultStatus.Mined,
                    ReturnValue         = trace.ReturnValue,
                    ReadableReturnValue = trace.ReadableReturnValue,
                    BlockNumber         = blockHeight,
                    //StateHash = trace.GetSummarizedStateHash(),
                    Logs = { trace.FlattenedLogs }
                };

                txRes.UpdateBloom();

                return(txRes);
            }

            return(new TransactionResult
            {
                TransactionId = trace.TransactionId,
                Status = TransactionResultStatus.Failed,
                Error = trace.Error
            });
        }
Exemple #4
0
        private TransactionResult GetTransactionResult(TransactionTrace trace, long blockHeight)
        {
            if (!trace.IsSuccessful())
            {
                if (trace.ExecutionStatus == ExecutionStatus.Undefined)
                {
                    // Cannot find specific contract method.
                    return(new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status = TransactionResultStatus.Unexecutable,
                        BlockNumber = blockHeight,
                        Error = ExecutionStatus.Undefined.ToString()
                    });
                }

                // Show log events if pre-txs executed successfully.
                var isContainLogEvents = trace.PreTraces.All(pt => pt.ExecutionStatus == ExecutionStatus.Executed);

                if (trace.ExecutionStatus == ExecutionStatus.Prefailed)
                {
                    if (isContainLogEvents)
                    {
                        // All pre-txs succeeded, but one plugin stopped tx execution.
                        // Need to add log events to tx result, as well as show the error message in this situation.
                        var txResult = new TransactionResult
                        {
                            TransactionId = trace.TransactionId,
                            Status        = TransactionResultStatus.Failed,
                            ReturnValue   = trace.ReturnValue,
                            BlockNumber   = blockHeight,
                            Logs          = { trace.GetPluginLogs() },
                            Error         = ExecutionStatus.ExecutionStoppedByPrePlugin.ToString()
                        };
                        txResult.UpdateBloom();
                        return(txResult);
                    }

                    return(new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status = TransactionResultStatus.Unexecutable,
                        BlockNumber = blockHeight,
                        Error = trace.Error
                    });
                }

                // Just failed.
                {
                    var txResult = new TransactionResult
                    {
                        TransactionId = trace.TransactionId,
                        Status        = TransactionResultStatus.Failed,
                        BlockNumber   = blockHeight,
                        Error         = trace.Error,
                        Logs          = { trace.GetPluginLogs() }
                    };
                    txResult.UpdateBloom();
                    return(txResult);
                }
            }

            {
                // Is successful.
                var txResult = new TransactionResult
                {
                    TransactionId = trace.TransactionId,
                    Status        = TransactionResultStatus.Mined,
                    ReturnValue   = trace.ReturnValue,
                    BlockNumber   = blockHeight,
                    Logs          = { trace.FlattenedLogs }
                };
                txResult.UpdateBloom();
                return(txResult);
            }
        }
Exemple #5
0
        /// <summary>
        /// Extract tx results from traces
        /// </summary>
        /// <param name="traces"></param>
        /// <param name="results"></param>
        private void ExtractTransactionResults(IEnumerable <TransactionTrace> traces, out HashSet <TransactionResult> results)
        {
            results = new HashSet <TransactionResult>();
            int index = 0;

            foreach (var trace in traces)
            {
                switch (trace.ExecutionStatus)
                {
                case ExecutionStatus.Canceled:
                    // Put back transaction
                    break;

                case ExecutionStatus.ExecutedAndCommitted:
                    // Successful
                    var txRes = new TransactionResult()
                    {
                        TransactionId = trace.TransactionId,
                        Status        = Status.Mined,
                        RetVal        = ByteString.CopyFrom(trace.RetVal.ToFriendlyBytes()),
                        StateHash     = trace.GetSummarizedStateHash(),
                        Index         = index++
                    };
                    txRes.UpdateBloom();
                    results.Add(txRes);
                    break;

                case ExecutionStatus.ContractError:
                    var txResF = new TransactionResult()
                    {
                        TransactionId = trace.TransactionId,
                        RetVal        = ByteString.CopyFromUtf8(trace.StdErr), // Is this needed?
                        Status        = Status.Failed,
                        StateHash     = trace.GetSummarizedStateHash(),
                        Index         = index++
                    };
                    results.Add(txResF);
                    break;

                case ExecutionStatus.Undefined:
                    _logger?.Fatal(
                        $@"Transaction Id ""{
                                    trace.TransactionId
                                } is executed with status Undefined. Transaction trace: {trace}""");
                    break;

                case ExecutionStatus.SystemError:
                    // SystemError shouldn't happen, and need to fix
                    _logger?.Fatal(
                        $@"Transaction Id ""{
                                    trace.TransactionId
                                } is executed with status SystemError. Transaction trace: {trace}""");
                    break;

                case ExecutionStatus.ExecutedButNotCommitted:
                    // If this happens, there's problem with the code
                    _logger?.Fatal(
                        $@"Transaction Id ""{
                                    trace.TransactionId
                                } is executed with status ExecutedButNotCommitted. Transaction trace: {
                                    trace
                                }""");
                    break;
                }
            }
        }