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 }); }
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 }); }
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); } }
/// <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; } } }