public async Task ValidateBeforeAttach_WithExtraData_False_Test() { var block = new Block { Header = new BlockHeader() }; _systemTransactionExtraDataProvider.SetSystemTransactionCount(0, block.Header); var validateResult = await _systemTransactionValidationProvider.ValidateBeforeAttachAsync(block); validateResult.ShouldBeFalse(); }
public async Task ValidateBlockBeforeAttachAsync_Test() { var block = _kernelTestHelper.GenerateBlock(9, HashHelper.ComputeFrom("PreviousBlockHash")); var validateResult = await _blockValidationService.ValidateBlockBeforeAttachAsync(block); validateResult.ShouldBeFalse(); block.Body.TransactionIds.Add(Hash.Empty); block.Header.MerkleTreeRootOfTransactions = block.Body.CalculateMerkleTreeRoot(); block.Header.ChainId = 0; block.Header.Signature = ByteString.CopyFrom(CryptoHelper.SignWithPrivateKey(_kernelTestHelper.KeyPair.PrivateKey, block.GetHash().ToByteArray())); validateResult = await _blockValidationService.ValidateBlockBeforeAttachAsync(block); validateResult.ShouldBeFalse(); _systemTransactionExtraDataProvider.SetSystemTransactionCount(1, block.Header); block.Header.Signature = ByteString.CopyFrom(CryptoHelper.SignWithPrivateKey(_kernelTestHelper.KeyPair.PrivateKey, block.GetHash().ToByteArray())); validateResult = await _blockValidationService.ValidateBlockBeforeAttachAsync(block); validateResult.ShouldBeTrue(); }
public async Task <BlockExecutedSet> MineAsync(RequestMiningDto requestMiningDto, List <Transaction> transactions, Timestamp blockTime) { try { using (var cts = new CancellationTokenSource()) { var expirationTime = blockTime + requestMiningDto.BlockExecutionTime; if (expirationTime < TimestampHelper.GetUtcNow()) { cts.Cancel(); } else { var ts = (expirationTime - TimestampHelper.GetUtcNow()).ToTimeSpan(); if (ts.TotalMilliseconds > int.MaxValue) { ts = TimeSpan.FromMilliseconds(int.MaxValue); } cts.CancelAfter(ts); } var block = await GenerateBlock(requestMiningDto.PreviousBlockHash, requestMiningDto.PreviousBlockHeight, blockTime); var systemTransactions = await GenerateSystemTransactions(requestMiningDto.PreviousBlockHash, requestMiningDto.PreviousBlockHeight); _systemTransactionExtraDataProvider.SetSystemTransactionCount(systemTransactions.Count, block.Header); var txTotalCount = transactions.Count + systemTransactions.Count; var pending = txTotalCount > requestMiningDto.TransactionCountLimit ? transactions .Take(requestMiningDto.TransactionCountLimit - systemTransactions.Count) .ToList() : transactions; var blockExecutedSet = await _blockExecutingService.ExecuteBlockAsync(block.Header, systemTransactions, pending, cts.Token); block = blockExecutedSet.Block; await SignBlockAsync(block); Logger.LogInformation($"Generated block: {block.ToDiagnosticString()}, " + $"previous: {block.Header.PreviousBlockHash}, " + $"executed transactions: {block.Body.TransactionsCount}, " + $"not executed transactions {pending.Count + systemTransactions.Count - block.Body.TransactionsCount} "); return(blockExecutedSet); } } catch (Exception e) { Logger.LogError(e, "Failed while mining block."); throw; } }
public async Task Execute_Block_NonCancellable_With_SystemTransactionCount() { var chain = await _smartContractExecutionHelper.CreateChainAsync(); var blockHeader = _kernelTestHelper.GenerateBlock(chain.BestChainHeight, chain.BestChainHash).Header; _systemTransactionExtraDataProvider.SetSystemTransactionCount(1, blockHeader); var transactions = GetTransactions(); var blockExecutedSet = await _blockExecutingService.ExecuteBlockAsync(blockHeader, transactions); await CheckBlockExecutedSetAsync(blockExecutedSet, 2); }
public async Task ExecuteAsync_Test() { var chain = await BlockchainService.GetChainAsync(); (PrepareTransactions, KeyPairs) = await OsTestHelper.PrepareTokenForParallel(10); Block = OsTestHelper.GenerateBlock(chain.BestChainHash, chain.BestChainHeight, PrepareTransactions); PrepareTransactions[0].To = SampleAccount.Accounts[0].Address; await OsTestHelper.BroadcastTransactions(PrepareTransactions); var executionReturnSets = await _transactionExecutingService.ExecuteAsync(new TransactionExecutingDto { Transactions = PrepareTransactions, BlockHeader = Block.Header }, CancellationToken.None); executionReturnSets.Count.ShouldBe(PrepareTransactions.Count); executionReturnSets.Count(set => set.TransactionResult.Status == TransactionResultStatus.Failed) .ShouldBe(1); executionReturnSets.First(set => set.TransactionResult.Status == TransactionResultStatus.Failed).TransactionResult.Error.ShouldBe("Invalid contract address."); executionReturnSets.Count(set => set.TransactionResult.Status == TransactionResultStatus.Mined).ShouldBe(9); (PrepareTransactions, KeyPairs) = await OsTestHelper.PrepareTokenForParallel(10); Block = OsTestHelper.GenerateBlock(Block.GetHash(), Block.Height, PrepareTransactions); await OsTestHelper.BroadcastTransactions(PrepareTransactions); var cancelTokenSource = new CancellationTokenSource(); cancelTokenSource.Cancel(); executionReturnSets = await _transactionExecutingService.ExecuteAsync(new TransactionExecutingDto { Transactions = PrepareTransactions, BlockHeader = Block.Header }, cancelTokenSource.Token); executionReturnSets.Count.ShouldBe(0); (PrepareTransactions, KeyPairs) = await OsTestHelper.PrepareTokenForParallel(10); Block = OsTestHelper.GenerateBlock(Block.GetHash(), Block.Height, PrepareTransactions); _systemTransactionExtraDataProvider.SetSystemTransactionCount(1, Block.Header); executionReturnSets = await _transactionExecutingService.ExecuteAsync(new TransactionExecutingDto { Transactions = PrepareTransactions, BlockHeader = Block.Header }, CancellationToken.None); executionReturnSets.Count.ShouldBe(PrepareTransactions.Count); executionReturnSets.ShouldAllBe(set => set.TransactionResult.Status == TransactionResultStatus.Mined); }
public void SetAndGetSystemTransactionCountTest() { var blockHeader = new BlockHeader(); _systemTransactionExtraDataProvider.TryGetSystemTransactionCount(blockHeader, out var systemTransactionCount).ShouldBeFalse(); systemTransactionCount.ShouldBe(0); var count = 10; _systemTransactionExtraDataProvider.SetSystemTransactionCount(count, blockHeader); _systemTransactionExtraDataProvider.TryGetSystemTransactionCount(blockHeader, out systemTransactionCount).ShouldBeTrue(); systemTransactionCount.ShouldBe(count); }