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