public async Task RollbackStateForTransactions(IEnumerable <Hash> txIds, Hash disambiguationHash) { var origValues = new Dictionary <StatePath, byte[]>(); foreach (var txId in txIds.Reverse()) { var trace = await _transactionTraceManager.GetTransactionTraceAsync(txId, disambiguationHash); foreach (var kv in trace.StateChanges) { origValues[kv.StatePath] = kv.StateValue.OriginalValue.ToByteArray(); } } await _stateStore.PipelineSetDataAsync(origValues); }
public static async Task CommitChangesAsync(this TransactionTrace trace, IStateStore stateStore) { if (trace.ExecutionStatus != ExecutionStatus.ExecutedButNotCommitted) { throw new InvalidOperationException( $"Attempting to commit a trace with a wrong status {trace.ExecutionStatus}."); } if (trace.StateChanges.Count > 0) { await stateStore.PipelineSetDataAsync(trace.StateChanges.ToDictionary(x => x.StatePath, x => x.StateValue.CurrentValue.ToByteArray())); } trace.StateHash = Hash.FromRawBytes(ByteArrayHelpers.Combine(trace.StateChanges.Select(x => x.StatePath.GetHash()).OrderBy(x => x).Select(x => x.Value.ToByteArray()).ToArray())); trace.ExecutionStatus = ExecutionStatus.ExecutedAndCommitted; foreach (var trc in trace.InlineTraces) { await trc.CommitChangesAsync(stateStore); } }