Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
            }
        }