private (ExecutionReturnSet, Transaction) GetFakePairs(Address destination, int[] expectedKeys,
                                                               int[] actualKeys = null)
        {
            var tri = new TransactionResourceInfo
            {
                Paths =
                {
                    expectedKeys.Select(GetPath)
                }
            };
            var txn = new Transaction
            {
                From       = SampleAddress.AddressList[7],
                To         = destination,
                MethodName = "Dummy",
                Params     = tri.ToByteString(),
                Signature  = ByteString.CopyFromUtf8("SignaturePlaceholder")
            };
            var rs = new ExecutionReturnSet {
                TransactionId = txn.GetHash()
            };

            actualKeys = actualKeys ?? expectedKeys;
            foreach (var key in actualKeys.Select(GetPath).Select(p => p.ToStateKey()))
            {
                rs.StateAccesses[key] = true;
            }

            return(rs, txn);
        }
        private async Task <List <ExecutionReturnSet> > ProcessTransactionsWithoutContract(List <Transaction> transactions,
                                                                                           BlockHeader blockHeader)
        {
            var transactionResults = new List <TransactionResult>();
            var returnSets         = new List <ExecutionReturnSet>();

            foreach (var transaction in transactions)
            {
                var result = new TransactionResult
                {
                    TransactionId = transaction.GetHash(),
                    Status        = TransactionResultStatus.Failed,
                    Error         = "Invalid contract address."
                };
                Logger.LogError(result.Error);
                transactionResults.Add(result);

                var returnSet = new ExecutionReturnSet
                {
                    TransactionId = result.TransactionId,
                    Status        = result.Status,
                    Bloom         = result.Bloom
                };
                returnSets.Add(returnSet);
            }
            await _transactionResultService.AddTransactionResultsAsync(transactionResults, blockHeader);


            return(returnSets);
        }
예제 #3
0
        private List <ExecutionReturnSet> ProcessTransactionsWithoutContract(List <Transaction> transactions)
        {
            var returnSets = new List <ExecutionReturnSet>();

            foreach (var transaction in transactions)
            {
                var result = new TransactionResult
                {
                    TransactionId = transaction.GetHash(),
                    Status        = TransactionResultStatus.Failed,
                    Error         = "Invalid contract address."
                };
                Logger.LogDebug(result.Error);

                var returnSet = new ExecutionReturnSet
                {
                    TransactionId     = result.TransactionId,
                    Status            = result.Status,
                    Bloom             = result.Bloom,
                    TransactionResult = result
                };
                returnSets.Add(returnSet);
            }

            return(returnSets);
        }
예제 #4
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);
        }
예제 #6
0
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var services = context.Services;

            services.AddTransient(p =>
            {
                var mockService = new Mock <ITransactionExecutingService>();
                mockService.Setup(m => m.ExecuteAsync(It.IsAny <TransactionExecutingDto>(),
                                                      It.IsAny <CancellationToken>()))
                .Returns <TransactionExecutingDto, CancellationToken>(
                    (transactionExecutingDto, cancellationToken) =>
                {
                    var returnSets = new List <ExecutionReturnSet>();

                    var count = 0;
                    foreach (var tx in transactionExecutingDto.Transactions)
                    {
                        if (cancellationToken.IsCancellationRequested && count >= 3)
                        {
                            break;
                        }

                        var returnSet = new ExecutionReturnSet
                        {
                            TransactionId = tx.GetHash()
                        };
                        returnSet.StateChanges.Add(tx.GetHash().ToHex(), tx.ToByteString());
                        returnSets.Add(returnSet);
                        count++;
                    }

                    return(Task.FromResult(returnSets));
                });

                return(mockService.Object);
            });
            services.AddTransient(p =>
            {
                var mockService = new Mock <IBlockExecutingService>();
                mockService.Setup(m =>
                                  m.ExecuteBlockAsync(It.IsAny <BlockHeader>(), It.IsAny <List <Transaction> >()))
                .Returns <BlockHeader, IEnumerable <Transaction> >((blockHeader, transactions) =>
                {
                    var block = new Block
                    {
                        Header = blockHeader,
                        Body   = new BlockBody()
                    };
                    block.Body.AddTransactions(transactions.Select(x => x.GetHash()));
                    return(Task.FromResult(new BlockExecutedSet()
                    {
                        Block = block
                    }));
                });
                return(mockService.Object);
            });
        }
예제 #7
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);
        }
예제 #8
0
        private ExecutionReturnSet GetReturnSet(ExecutionReturnSet returnSet,
                                                IEnumerable <TransactionExecutingStateSet> transactionExecutingStateSets)
        {
            foreach (var transactionExecutingStateSet in transactionExecutingStateSets)
            {
                foreach (var write in transactionExecutingStateSet.Writes)
                {
                    returnSet.StateChanges[write.Key] = write.Value;
                    returnSet.StateDeletes.Remove(write.Key);
                }
                foreach (var delete in transactionExecutingStateSet.Deletes)
                {
                    returnSet.StateDeletes[delete.Key] = delete.Value;
                    returnSet.StateChanges.Remove(delete.Key);
                }
            }

            return(returnSet);
        }
예제 #9
0
        private (ExecutionReturnSet, Transaction) GetFakePairs(Address destination, int[] expectedKeys,
                                                               int[] actualKeys = null, int[] readExpectedKeys = null, int[] readOnlyActualKeys = null)
        {
            var tri = new TransactionResourceInfo
            {
                WritePaths =
                {
                    expectedKeys.Select(GetPath)
                }
            };

            if (readExpectedKeys != null)
            {
                tri.ReadPaths.AddRange(readExpectedKeys.Select(GetPath));
            }
            var txn = new Transaction
            {
                From       = SampleAddress.AddressList[7],
                To         = destination,
                MethodName = "Dummy",
                Params     = tri.ToByteString(),
                Signature  = ByteString.CopyFromUtf8(KernelConstants.SignaturePlaceholder)
            };
            var rs = new ExecutionReturnSet {
                TransactionId = txn.GetHash()
            };

            actualKeys ??= expectedKeys;
            var readOnlyStateKeys = readOnlyActualKeys?.Select(GetPath).Select(p => p.ToStateKey()).ToList();

            foreach (var key in actualKeys.Select(GetPath).Select(p => p.ToStateKey()))
            {
                rs.StateAccesses[key] = true;
                if (readOnlyActualKeys != null && readOnlyStateKeys.Contains(key))
                {
                    continue;
                }
                rs.StateChanges[key] = ByteString.Empty;
            }

            return(rs, txn);
        }
        private List <ExecutionReturnSet> GetExecutionReturnSets()
        {
            var firstKey                = "firstKey";
            var secondKey               = "secondKey";
            var executionReturnSets     = new List <ExecutionReturnSet>();
            var minedTransactionId      = HashHelper.ComputeFrom("minedTxId");
            var minedExecutionReturnSet = new ExecutionReturnSet
            {
                TransactionId = minedTransactionId,
                Status        = TransactionResultStatus.Mined,
                StateChanges  = { { "firstKey", ByteString.Empty } },
                StateDeletes  = { { "secondKey", true } }
            };

            executionReturnSets.Add(minedExecutionReturnSet);

            var failedTransactionId      = HashHelper.ComputeFrom("failedTxId");
            var failedExecutionReturnSet = new ExecutionReturnSet
            {
                TransactionId = failedTransactionId,
                Status        = TransactionResultStatus.Failed,
                StateChanges  = { { "secondKey", ByteString.Empty } },
                StateDeletes  = { { "firstKey", true } }
            };

            executionReturnSets.Add(failedExecutionReturnSet);

            var conflictTransactionId      = HashHelper.ComputeFrom("conflictTxId");
            var conflictExecutionReturnSet = new ExecutionReturnSet
            {
                TransactionId = conflictTransactionId,
                Status        = TransactionResultStatus.Conflict
            };

            executionReturnSets.Add(conflictExecutionReturnSet);
            return(executionReturnSets);
        }
 private HashSet <string> GetKeys(ExecutionReturnSet returnSet)
 {
     return(new HashSet <string>(returnSet.StateAccesses.Keys));
 }