Exemple #1
0
        private ExecutionReturnSet GetReturnSet(TransactionTrace trace, TransactionResult result)
        {
            var returnSet = new ExecutionReturnSet
            {
                TransactionId = result.TransactionId,
                Status        = result.Status,
                Bloom         = result.Bloom
            };

            if (trace.IsSuccessful())
            {
                foreach (var s in trace.GetFlattenedWrites())
                {
                    returnSet.StateChanges[s.Key] = s.Value;
                }

                returnSet.ReturnValue = trace.ReturnValue;
            }

            foreach (var s in trace.GetFlattenedReads())
            {
                returnSet.StateAccesses[s.Key] = s.Value;
            }

            return(returnSet);
        }
        private ExecutionReturnSet GetReturnSet(TransactionTrace trace, TransactionResult result)
        {
            var returnSet = new ExecutionReturnSet()
            {
                TransactionId = result.TransactionId,
                Status        = result.Status,
                Bloom         = result.Bloom
            };

            foreach (var tx in result.DeferredTransactions)
            {
                returnSet.DeferredTransactions.Add(tx);
            }

            if (trace.IsSuccessful())
            {
                foreach (var s in trace.GetFlattenedWrite())
                {
                    returnSet.StateChanges[s.Key] = s.Value;
                }

                returnSet.ReturnValue = trace.ReturnValue;
            }

            return(returnSet);
        }
Exemple #3
0
        public static async Task <TransactionResourceInfo> GetTransactionResourceInfoAsync(this IExecutive executive,
                                                                                           IChainContext chainContext, Transaction input)
        {
            var generatedTxn = new Transaction
            {
                From       = FromAddress,
                To         = input.To,
                MethodName = nameof(ACS2BaseContainer.ACS2BaseStub.GetResourceInfo),
                Params     = input.ToByteString(),
                Signature  = ByteString.CopyFromUtf8("SignaturePlaceholder")
            };
            var txId = input.GetHash();

            var trace = new TransactionTrace
            {
                TransactionId = generatedTxn.GetHash()
            };

            var transactionContext = new TransactionContext
            {
                PreviousBlockHash = chainContext.BlockHash,
                CurrentBlockTime  = TimestampHelper.GetUtcNow(),
                Transaction       = generatedTxn,
                BlockHeight       = chainContext.BlockHeight + 1,
                Trace             = trace,
                CallDepth         = 0,
                StateCache        = chainContext.StateCache
            };

            await executive.ApplyAsync(transactionContext);

            if (!trace.IsSuccessful())
            {
                return(NotParallelizable(txId, executive.ContractHash));
            }

            try
            {
                var resourceInfo = ResourceInfo.Parser.ParseFrom(trace.ReturnValue);
                return(new TransactionResourceInfo
                {
                    TransactionId = txId,
                    Paths =
                    {
                        resourceInfo.Paths
                    },
                    ParallelType = resourceInfo.NonParallelizable
                        ? ParallelType.NonParallelizable
                        : ParallelType.Parallelizable,
                    ContractHash = executive.ContractHash
                });
            }
            catch (Exception)
            {
                return(NotParallelizable(txId, executive.ContractHash));
            }
        }
        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 #5
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 #6
0
        private ExecutionReturnSet GetReturnSet(TransactionTrace trace, TransactionResult result)
        {
            var returnSet = new ExecutionReturnSet
            {
                TransactionId     = result.TransactionId,
                Status            = result.Status,
                Bloom             = result.Bloom,
                TransactionResult = result
            };

            if (trace.IsSuccessful())
            {
                var transactionExecutingStateSets = trace.GetStateSets();
                returnSet             = GetReturnSet(returnSet, transactionExecutingStateSets);
                returnSet.ReturnValue = trace.ReturnValue;
            }
            else
            {
                var transactionExecutingStateSets = new List <TransactionExecutingStateSet>();
                foreach (var preTrace in trace.PreTraces)
                {
                    if (preTrace.IsSuccessful())
                    {
                        transactionExecutingStateSets.AddRange(preTrace.GetStateSets());
                    }
                }

                foreach (var postTrace in trace.PostTraces)
                {
                    if (postTrace.IsSuccessful())
                    {
                        transactionExecutingStateSets.AddRange(postTrace.GetStateSets());
                    }
                }

                returnSet = GetReturnSet(returnSet, transactionExecutingStateSets);
            }

            var reads = trace.GetFlattenedReads();

            foreach (var read in reads)
            {
                returnSet.StateAccesses[read.Key] = read.Value;
            }

            return(returnSet);
        }
Exemple #7
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);
        }
Exemple #8
0
        private static bool TryUpdateStateCache(TransactionTrace trace, TieredStateCache groupStateCache)
        {
            if (trace == null)
            {
                return(false);
            }

            if (!trace.IsSuccessful())
            {
                var transactionExecutingStateSets = new List <TransactionExecutingStateSet>();

                AddToTransactionStateSets(transactionExecutingStateSets, trace.PreTraces);
                AddToTransactionStateSets(transactionExecutingStateSets, trace.PostTraces);

                groupStateCache.Update(transactionExecutingStateSets);
                trace.SurfaceUpError();
            }
            else
            {
                groupStateCache.Update(trace.GetStateSets());
            }

            return(true);
        }
Exemple #9
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);
            }
        }
        public void IsSuccessful_Test(ExecutionStatus executionStatus, bool isSuccess)
        {
            {
                var transactionTrace = new TransactionTrace
                {
                    ExecutionStatus = executionStatus
                };
                transactionTrace.IsSuccessful().ShouldBe(isSuccess);
            }

            {
                var transactionTrace = new TransactionTrace
                {
                    ExecutionStatus = ExecutionStatus.Executed,
                    PreTraces       =
                    {
                        new TransactionTrace
                        {
                            ExecutionStatus = ExecutionStatus.Executed
                        },
                        new TransactionTrace
                        {
                            ExecutionStatus = executionStatus
                        }
                    }
                };
                transactionTrace.IsSuccessful().ShouldBe(isSuccess);
            }

            {
                var transactionTrace = new TransactionTrace
                {
                    ExecutionStatus = ExecutionStatus.Executed,
                    InlineTraces    =
                    {
                        new TransactionTrace
                        {
                            ExecutionStatus = ExecutionStatus.Executed
                        },
                        new TransactionTrace
                        {
                            ExecutionStatus = executionStatus
                        }
                    }
                };
                transactionTrace.IsSuccessful().ShouldBe(isSuccess);
            }

            {
                var transactionTrace = new TransactionTrace
                {
                    ExecutionStatus = ExecutionStatus.Executed,
                    PostTraces      =
                    {
                        new TransactionTrace
                        {
                            ExecutionStatus = ExecutionStatus.Executed
                        },
                        new TransactionTrace
                        {
                            ExecutionStatus = executionStatus
                        }
                    }
                };
                transactionTrace.IsSuccessful().ShouldBe(isSuccess);
            }
        }