public async Task SmartContractAddress_Set_And_Get_Test()
        {
            var chain = await _smartContractHelper.CreateChainAsync();

            var contractName = Hash.Empty.ToStorageKey();

            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };

            var smartContractAddress =
                await _smartContractAddressProvider.GetSmartContractAddressAsync(chainContext, contractName);

            smartContractAddress.ShouldBeNull();

            await _smartContractAddressProvider.SetSmartContractAddressAsync(chainContext, contractName,
                                                                             SampleAddress.AddressList[0]);

            var blockExecutedDataKey = $"BlockExecutedData/SmartContractAddress/{contractName}";
            var blockStateSet        = await _blockStateSetManger.GetBlockStateSetAsync(chain.BestChainHash);

            blockStateSet.BlockExecutedData.ShouldContainKey(blockExecutedDataKey);

            smartContractAddress =
                await _smartContractAddressProvider.GetSmartContractAddressAsync(chainContext, contractName);

            smartContractAddress.Address.ShouldBe(SampleAddress.AddressList[0]);
            smartContractAddress.BlockHeight = chainContext.BlockHeight;
            smartContractAddress.BlockHash   = chainContext.BlockHash;
        }
        /// <summary>
        /// Get consensus system tx list.
        /// </summary>
        /// <param name="chainContext"></param>
        /// <returns></returns>
        public async Task <List <Transaction> > GenerateConsensusTransactionsAsync(ChainContext chainContext)
        {
            _blockTimeProvider.SetBlockTime(_nextMiningTime);

            Logger.LogDebug(
                $"Set block time to next mining time: {_nextMiningTime.ToDateTime():hh:mm:ss.ffffff}. Txs.");

            var contractReaderContext =
                await _consensusReaderContextService.GetContractReaderContextAsync(chainContext);

            var generatedTransactions =
                (await _contractReaderFactory
                 .Create(contractReaderContext)
                 .GenerateConsensusTransactions
                 .CallAsync(_triggerInformationProvider.GetTriggerInformationForConsensusTransactions(
                                _consensusCommand.ToBytesValue())))
                .Transactions
                .ToList();

            // Complete these transactions.
            foreach (var generatedTransaction in generatedTransactions)
            {
                generatedTransaction.RefBlockNumber = chainContext.BlockHeight;
                generatedTransaction.RefBlockPrefix =
                    BlockHelper.GetRefBlockPrefix(chainContext.BlockHash);
                Logger.LogDebug($"Consensus transaction generated: \n{generatedTransaction.GetHash()}");
            }

            return(generatedTransactions);
        }
Esempio n. 3
0
        public async Task SmartContractAddress_Get_WithFork_Test()
        {
            var chain = await _smartContractHelper.CreateChainAsync();

            var block = await _kernelTestHelper.AttachBlockToBestChain();

            await _blockchainService.SetIrreversibleBlockAsync(chain, block.Height,
                                                               block.GetHash());

            block = _kernelTestHelper.GenerateBlock(block.Header.Height - 1, block.Header.PreviousBlockHash);
            await _blockStateSetManger.SetBlockStateSetAsync(new BlockStateSet
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            });

            var chainContext = new ChainContext
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            };
            var contractName = Hash.Empty.ToStorageKey();
            await _smartContractAddressService.SetSmartContractAddressAsync(chainContext, contractName,
                                                                            SampleAddress.AddressList[0]);

            var smartContractAddressDto = await _smartContractAddressService.GetSmartContractAddressAsync(chainContext, contractName);

            smartContractAddressDto.SmartContractAddress.ShouldBe(new SmartContractAddress
            {
                Address     = SampleAddress.AddressList[0],
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            });
            smartContractAddressDto.Irreversible.ShouldBeFalse();
        }
Esempio n. 4
0
        public async Task SmartContractAddress_Get_WithHeightLargeThanLIB_Test()
        {
            await _smartContractHelper.CreateChainAsync();

            var block = await _kernelTestHelper.AttachBlockToBestChain();

            var chainContext = new ChainContext
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            };
            var contractName = Hash.Empty.ToStorageKey();
            await _smartContractAddressService.SetSmartContractAddressAsync(chainContext, contractName,
                                                                            SampleAddress.AddressList[0]);

            var address = await _smartContractAddressService.GetAddressByContractNameAsync(chainContext, contractName);

            address.ShouldBe(SampleAddress.AddressList[0]);

            var smartContractAddressDto = await _smartContractAddressService.GetSmartContractAddressAsync(chainContext, contractName);

            smartContractAddressDto.SmartContractAddress.ShouldBe(new SmartContractAddress
            {
                Address     = SampleAddress.AddressList[0],
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            });
            smartContractAddressDto.Irreversible.ShouldBeFalse();
        }
        /// <inheritdoc />
        /// <summary>
        /// Mine process.
        /// </summary>
        /// <returns></returns>
        public async Task <BlockExecutedSet> MineAsync(Hash previousBlockHash, long previousBlockHeight,
                                                       Timestamp blockTime,
                                                       Duration blockExecutionTime)
        {
            var txList = new List <Transaction>();

            var chainContext = new ChainContext
            {
                BlockHash   = previousBlockHash,
                BlockHeight = previousBlockHeight
            };

            var limit = await _blockTransactionLimitProvider.GetLimitAsync(chainContext);

            if (_transactionPackingOptionProvider.IsTransactionPackable(chainContext))
            {
                var executableTransactionSet = await _transactionPoolService.GetExecutableTransactionSetAsync(
                    previousBlockHash, limit);

                txList.AddRange(executableTransactionSet.Transactions);
            }


            Logger.LogInformation(
                $"Start mining with previous hash: {previousBlockHash}, previous height: {previousBlockHeight}.");
            return(await _miningService.MineAsync(
                       new RequestMiningDto
            {
                PreviousBlockHash = previousBlockHash,
                PreviousBlockHeight = previousBlockHeight,
                BlockExecutionTime = blockExecutionTime,
                TransactionCountLimit = limit
            }, txList, blockTime));
        }
Esempio n. 6
0
        public async Task HandleEventAsync(ConflictingTransactionsFoundInParallelGroupsEvent eventData)
        {
            var chainContext = new ChainContext
            {
                BlockHash   = eventData.BlockHeader.PreviousBlockHash,
                BlockHeight = eventData.BlockHeader.Height - 1
            };
            var wrongTxWithResources = await _conflictingTransactionIdentificationService.IdentifyConflictingTransactionsAsync(
                chainContext, eventData.ExistingSets, eventData.ConflictingSets);

            var wrongTransactionIds = wrongTxWithResources.Select(t => t.Transaction.GetHash()).ToArray();

            var dic = wrongTxWithResources.GroupBy(t => t.Transaction.To)
                      .ToDictionary(g => g.Key, g => new NonparallelContractCode
            {
                CodeHash = g.First().TransactionResourceInfo.ContractHash
            });

            await _nonparallelContractCodeProvider.SetNonparallelContractCodeAsync(new BlockIndex
            {
                BlockHash   = eventData.BlockHeader.GetHash(),
                BlockHeight = eventData.BlockHeader.Height
            }, dic);

            _resourceExtractionService.ClearConflictingTransactionsResourceCache(wrongTransactionIds);
        }
Esempio n. 7
0
        async ValueTask IConnector <TInput> .ProcessAsync(TInput input, ChainContext context)
        {
            TOutput result;
            var     startTickCount = Environment.TickCount64;

            try
            {
                context.EventBroker.Publish(new ConnectorStartingEvent(context, this));
                context.CancellationToken.ThrowIfCancellationRequested();
                result = await ProcessAsync(input, context);
            }
            catch (Exception exception)
            {
                context.SetResult(ExecutionResult.Faulted, exception);
                return;
            }
            finally
            {
                var duration = TimeSpan.FromMilliseconds(Environment.TickCount64 - startTickCount);
                context.EventBroker.Publish(new ConnectorStoppedEvent(context, this, duration));
            }

            if (context.Result == ExecutionResult.Unknown)
            {
                await _nextConnector.ProcessAsync(result, context);
            }
        }
Esempio n. 8
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var functions = Sql.ExtensionAttribute.GetExtensionAttributes(methodCall, builder.MappingSchema);

            var root = methodCall.SkipMethodChain(builder.MappingSchema);

            // evaluating IQueryableContainer
            while (root.NodeType == ExpressionType.Constant && typeof(Sql.IQueryableContainer).IsSameOrParentOf(root.Type))
            {
                root = ((Sql.IQueryableContainer)root.EvaluateExpression() !).Query.Expression;
                root = root.SkipMethodChain(builder.MappingSchema);
            }

            root = builder.ConvertExpressionTree(root);

            var prevSequence = builder.BuildSequence(new BuildInfo(buildInfo, root)
            {
                CreateSubQuery = true
            });
            var finalFunction = functions.First();
            var sequence      = prevSequence;

            if (finalFunction.IsAggregate)
            {
                // Wrap by subquery to handle aggregate limitations, especially for SQL Server
                //
                sequence = new SubQueryContext(sequence);
            }

            var context = new ChainContext(buildInfo.Parent, sequence, methodCall);

            var sqlExpression = finalFunction.GetExpression((builder, context), builder.DataContext, context.SelectQuery, methodCall,
Esempio n. 9
0
        // Token: 0x06001C2E RID: 7214 RVA: 0x0006FA44 File Offset: 0x0006DC44
        internal string EncodeCertChain(ChainContext chainContext, bool includeRootCert, X509Certificate2 signersCertificate)
        {
            uint count = (uint)chainContext.GetChains().Count;

            List <byte[]>[] array  = new List <byte[]> [count];
            uint[]          array2 = new uint[count];
            uint[]          array3 = new uint[count];
            uint            num    = 16U;
            int             num2   = 0;

            foreach (CertificateChain certificateChain in chainContext.GetChains())
            {
                array3[num2] = 16U;
                array2[num2] = 0U;
                array[num2]  = new List <byte[]>(certificateChain.Elements.Count);
                foreach (ChainElement chainElement in certificateChain.Elements)
                {
                    if (!signersCertificate.Equals(chainElement.Certificate) && (includeRootCert || (chainElement.TrustInformation & TrustInformation.IsSelfSigned) == TrustInformation.None))
                    {
                        array3[num2] += 12U;
                        byte[] rawData = chainElement.Certificate.RawData;
                        array[num2].Add(rawData);
                        array3[num2] += (uint)rawData.Length;
                        array2[num2] += 1U;
                    }
                }
                num += array3[num2];
                num2++;
            }
            byte[] array4 = new byte[num];
            int    num3   = 0;

            num3 += ExBitConverter.Write(num, array4, num3);
            num3 += ExBitConverter.Write((uint)chainContext.Status, array4, num3);
            num3 += ExBitConverter.Write((uint)chainContext.TrustInformation, array4, num3);
            num3 += ExBitConverter.Write(count, array4, num3);
            num2  = 0;
            foreach (CertificateChain certificateChain2 in chainContext.GetChains())
            {
                num3 += ExBitConverter.Write(array3[num2], array4, num3);
                num3 += ExBitConverter.Write((uint)certificateChain2.Status, array4, num3);
                num3 += ExBitConverter.Write((uint)certificateChain2.TrustInformation, array4, num3);
                num3 += ExBitConverter.Write(array2[num2], array4, num3);
                int num4 = 0;
                foreach (ChainElement chainElement2 in certificateChain2.Elements)
                {
                    if (!signersCertificate.Equals(chainElement2.Certificate) && (includeRootCert || (chainElement2.TrustInformation & TrustInformation.IsSelfSigned) == TrustInformation.None))
                    {
                        num3 += ExBitConverter.Write((uint)(array[num2][num4].Length + 12), array4, num3);
                        num3 += ExBitConverter.Write((uint)chainElement2.Status, array4, num3);
                        num3 += ExBitConverter.Write((uint)chainElement2.TrustInformation, array4, num3);
                        Array.Copy(array[num2][num4], 0, array4, num3, array[num2][num4].Length);
                        num3 += array[num2][num4].Length;
                        num4++;
                    }
                }
                num2++;
            }
            return(Convert.ToBase64String(array4));
        }
        public async Task IsViewTransactionAsync_Test()
        {
            var chain = await BlockchainService.GetChainAsync();

            var context = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            var transaction = OsTestHelper.GenerateTransaction(SampleAddress.AddressList[0],
                                                               await SmartContractAddressService.GetAddressByContractNameAsync(context, TokenSmartContractAddressNameProvider.StringName),
                                                               "GetBalance", new GetBalanceInput
            {
                Owner  = SampleAddress.AddressList[0],
                Symbol = "ELF"
            });

            var result = await TransactionReadOnlyExecutionService.IsViewTransactionAsync(context, transaction);

            result.ShouldBeTrue();

            transaction = OsTestHelper.GenerateTransaction(SampleAddress.AddressList[0],
                                                           await SmartContractAddressService.GetAddressByContractNameAsync(context,
                                                                                                                           TokenSmartContractAddressNameProvider.StringName),
                                                           "Transfer", new TransferInput
            {
                To     = SampleAddress.AddressList[1],
                Symbol = "ELF",
                Amount = 10
            });
            result = await TransactionReadOnlyExecutionService.IsViewTransactionAsync(context, transaction);

            result.ShouldBeFalse();
        }
Esempio n. 11
0
        public async Task <List <ExecutionReturnSet> > ExecuteAsync(TransactionExecutingDto transactionExecutingDto,
                                                                    CancellationToken cancellationToken)
        {
            Logger.LogTrace("Entered parallel ExecuteAsync.");
            var transactions = transactionExecutingDto.Transactions.ToList();
            var blockHeader  = transactionExecutingDto.BlockHeader;

            var chainContext = new ChainContext
            {
                BlockHash   = blockHeader.PreviousBlockHash,
                BlockHeight = blockHeader.Height - 1
            };
            var groupedTransactions = await _grouper.GroupAsync(chainContext, transactions);

            var returnSets = new List <ExecutionReturnSet>();
            var nonParallelizableReturnSets = await _planTransactionExecutingService.ExecuteAsync(
                new TransactionExecutingDto
            {
                BlockHeader          = blockHeader,
                Transactions         = groupedTransactions.NonParallelizables,
                PartialBlockStateSet = transactionExecutingDto.PartialBlockStateSet
            },
                cancellationToken);

            Logger.LogTrace("Merged results from non-parallelizables.");
            returnSets.AddRange(nonParallelizableReturnSets);

            var returnSetCollection         = new ReturnSetCollection(returnSets);
            var updatedPartialBlockStateSet = GetUpdatedBlockStateSet(returnSetCollection, transactionExecutingDto);

            var tasks = groupedTransactions.Parallelizables.Select(
                txns => ExecuteAndPreprocessResult(new TransactionExecutingDto
            {
                BlockHeader          = blockHeader,
                Transactions         = txns,
                PartialBlockStateSet = updatedPartialBlockStateSet,
            }, cancellationToken));
            var results = await Task.WhenAll(tasks);

            Logger.LogTrace("Executed parallelizables.");

            returnSets.AddRange(MergeResults(results, out var conflictingSets));
            Logger.LogTrace("Merged results from parallelizables.");

            var transactionWithoutContractReturnSets = await ProcessTransactionsWithoutContract(
                groupedTransactions.TransactionsWithoutContract, blockHeader);

            Logger.LogTrace("Merged results from transactions without contract.");
            returnSets.AddRange(transactionWithoutContractReturnSets);

            if (conflictingSets.Count > 0 &&
                returnSets.Count + conflictingSets.Count == transactionExecutingDto.Transactions.Count())
            {
                await ProcessConflictingSetsAsync(conflictingSets, blockHeader);

                returnSets.AddRange(conflictingSets);
            }

            return(returnSets);
        }
        public async Task <IEnumerable <string> > GetCurrentMinerList(ChainContext chainContext)
        {
            var minersWithRoundNumber =
                await _readerFactory.Create(chainContext).GetCurrentMinerList.CallAsync(new Empty());

            return(minersWithRoundNumber.Pubkeys.Select(k => k.ToHex()));
        }
        private void CheckBlockExecutedData(BlockStateSet blockStateSet, Chain chain,
                                            TransactionResult transactionResult, Dictionary <string, Transaction> transactionDic)
        {
            var chainContext = new ChainContext
            {
                BlockHash   = blockStateSet.BlockHash,
                BlockHeight = blockStateSet.BlockHeight
            };
            var chainFromBlockExecutedData =
                _chainBlockchainExecutedDataService.GetBlockExecutedData(chainContext,
                                                                         GetBlockExecutedDataKey <Chain>());

            chainFromBlockExecutedData.ShouldBe(chain);

            var transactionResultFromBlockExecutedData =
                _transactionResultBlockchainExecutedDataService.GetBlockExecutedData(chainContext,
                                                                                     GetBlockExecutedDataKey <TransactionResult>(transactionResult.TransactionId));

            transactionResultFromBlockExecutedData.ShouldBe(transactionResult);
            foreach (var keyPair in transactionDic)
            {
                var transaction =
                    _transactionBlockchainExecutedDataService.GetBlockExecutedData(chainContext, keyPair.Key);
                transaction.ShouldBe(keyPair.Value);
            }
        }
Esempio n. 14
0
        protected override IBuildContext BuildMethodCall(ExpressionBuilder builder, MethodCallExpression methodCall, BuildInfo buildInfo)
        {
            var functions = Sql.ExtensionAttribute.GetExtensionAttributes(methodCall, builder.MappingSchema);

            var root = methodCall.SkipMethodChain(builder.MappingSchema);

            // evaluating IQueryableContainer
            while (root.NodeType == ExpressionType.Constant && typeof(Sql.IQueryableContainer).IsSameOrParentOf(root.Type))
            {
                root = ((Sql.IQueryableContainer)root.EvaluateExpression() !).Query.Expression;
                root = root.SkipMethodChain(builder.MappingSchema);
            }

            root = builder.ConvertExpressionTree(root);

            var sequence = builder.BuildSequence(new BuildInfo(buildInfo, root)
            {
                CreateSubQuery = true
            });

            var finalFunction = functions.First();

            var sqlExpression = finalFunction.GetExpression(builder.DataContext, buildInfo.SelectQuery, methodCall,
                                                            (e, descriptor) => builder.ConvertToExtensionSql(sequence, e, descriptor));

            var context = new ChainContext(buildInfo.Parent, sequence, methodCall);

            context.Sql        = context.SelectQuery;
            context.FieldIndex = context.SelectQuery.Select.Add(sqlExpression, methodCall.Method.Name);

            return(context);
        }
        public async Task TransactionReadOnlyExecutionServiceExtensions_Test()
        {
            var chain = await BlockchainService.GetChainAsync();

            var context = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            var transaction = OsTestHelper.GenerateTransaction(SampleAddress.AddressList[0],
                                                               SmartContractAddressService.GetAddressByContractName(TokenSmartContractAddressNameProvider.Name),
                                                               "GetBalance", new GetBalanceInput
            {
                Owner  = SampleAddress.AddressList[0],
                Symbol = "ELF"
            });

            var result = await TransactionReadOnlyExecutionService.ExecuteAsync <GetBalanceOutput>(context, transaction,
                                                                                                   TimestampHelper.GetUtcNow(),
                                                                                                   true);

            result.Balance.ShouldBe(0);
            result.Symbol.ShouldBe("ELF");

            //without such method and call
            transaction.MethodName = "NotExist";
            await Should.ThrowAsync <SmartContractExecutingException>(async() =>
            {
                await TransactionReadOnlyExecutionService.ExecuteAsync <GetBalanceOutput>(context, transaction,
                                                                                          TimestampHelper.GetUtcNow(),
                                                                                          true);
            });
        }
Esempio n. 16
0
 public async Task <byte[]> GetInformationToUpdateConsensusAsync(ChainContext chainContext,
                                                                 DateTime nextMiningTime)
 {
     return((await ExecuteContractAsync <DPoSHeaderInformation>(chainContext,
                                                                ConsensusConsts.GetInformationToUpdateConsensus,
                                                                GetTriggerInformation(TriggerType.BlockHeaderExtraData), nextMiningTime)).ToByteArray());
 }
Esempio n. 17
0
        public async Task <IEnumerable <string> > GetCurrentMiners(ChainContext chainContext)
        {
            var minersWithRoundNumber = await _consensusInformationGenerationService.ExecuteContractAsync <MinerListWithRoundNumber>(chainContext,
                                                                                                                                     "GetCurrentMiners", new Empty(), DateTime.UtcNow);

            return(minersWithRoundNumber.MinerList.PublicKeys);
        }
Esempio n. 18
0
        public async Task <List <Transaction> > GenerateConsensusTransactionsAsync(ChainContext chainContext)
        {
            _blockTimeProvider.SetBlockTime(_nextMiningTime);

            Logger.LogTrace(
                $"Set block time to next mining time: {_nextMiningTime.ToDateTime():hh:mm:ss.ffffff}. Txs.");

            var generatedTransactions =
                (await _readerFactory.Create(chainContext).GenerateConsensusTransactions
                 .CallAsync(_triggerInformationProvider.GetTriggerInformationForConsensusTransactions(
                                _consensusCommand.ToBytesValue())))
                .Transactions
                .ToList();

            // Complete these transactions.
            foreach (var generatedTransaction in generatedTransactions)
            {
                generatedTransaction.RefBlockNumber = chainContext.BlockHeight;
                generatedTransaction.RefBlockPrefix =
                    ByteString.CopyFrom(chainContext.BlockHash.Value.Take(4).ToArray());
            }

            Logger.LogInformation("Consensus transaction generated.");

            return(generatedTransactions);
        }
Esempio n. 19
0
        public async Task <bool> ValidateConsensusBeforeExecutionAsync(ChainContext chainContext,
                                                                       byte[] consensusExtraData)
        {
            var now = TimestampHelper.GetUtcNow();

            _blockTimeProvider.SetBlockTime(now);

            Logger.LogTrace($"Set block time to utc now: {now.ToDateTime():hh:mm:ss.ffffff}. Validate Before.");

            var validationResult = await _readerFactory.Create(chainContext).ValidateConsensusBeforeExecution
                                   .CallAsync(new BytesValue {
                Value = ByteString.CopyFrom(consensusExtraData)
            });

            if (validationResult == null)
            {
                Logger.LogWarning("Validation of consensus failed before execution.");
                return(false);
            }

            if (!validationResult.Success)
            {
                Logger.LogWarning($"Consensus validating before execution failed: {validationResult.Message}");
                await LocalEventBus.PublishAsync(new ConsensusValidationFailedEventData
                {
                    ValidationResultMessage = validationResult.Message
                });
            }

            return(validationResult.Success);
        }
Esempio n. 20
0
        public async Task Net_Token_Fee_Calculate_After_Update_Piecewise_Function_Test()
        {
            await InitializeCoefficientAsync();

            var calculateNetCostStrategy = Application.ServiceProvider.GetRequiredService <ICalculateTrafficCostStrategy>();
            var ps = await GetCoefficientByType(FeeTypeEnum.Traffic);

            var apiParam = new CalculateFeeCoefficient
            {
                FeeType        = FeeTypeEnum.Traffic,
                FunctionType   = CalculateFunctionTypeEnum.Liner,
                PieceKey       = 1000000,
                CoefficientDic = { { "numerator", 1 }, { "denominator", 400 } }
            };
            var           blockIndex   = new BlockIndex();
            IChainContext chainContext = new ChainContext
            {
                BlockHash   = blockIndex.BlockHash,
                BlockHeight = blockIndex.BlockHeight
            };
            var theOne = ps.Coefficients.SingleOrDefault(x => x.PieceKey == 1000000);

            ps.Coefficients.Remove(theOne);
            ps.Coefficients.Add(apiParam);
            await HandleTestAsync(ps, blockIndex);

            var size       = 10000;
            var updatedFee = await calculateNetCostStrategy.GetCostAsync(chainContext, size);

            updatedFee.ShouldBe(25_0000_0000);
        }
Esempio n. 21
0
        internal static List <ChainValidityStatus> ValidateCertificates(List <string> trustedCertificateList, List <string> certificateChainList, List <string> certificateList, bool checkCRL, int hashCodeForTracing, MailboxLogger mailboxLogger, bool againstADConfiguration, string organizationId)
        {
            X509Store trustedStore          = CertificateManager.AddChainCertsToStore(trustedCertificateList, hashCodeForTracing);
            X509Store chainBuildStore       = CertificateManager.AddChainCertsToStore(certificateChainList, hashCodeForTracing);
            List <ChainValidityStatus> list = new List <ChainValidityStatus>(certificateList.Count);

            foreach (string text in certificateList)
            {
                ChainContext chainContext = null;
                try
                {
                    X509Certificate2    certificate = new X509Certificate2(Convert.FromBase64String(text));
                    ChainValidityStatus item        = X509CertificateCollection.ValidateCertificate(certificate, null, X509KeyUsageFlags.NonRepudiation | X509KeyUsageFlags.DigitalSignature, checkCRL, trustedStore, chainBuildStore, ref chainContext, againstADConfiguration, organizationId);
                    list.Add(item);
                }
                catch (CryptographicException ex)
                {
                    if (mailboxLogger != null)
                    {
                        mailboxLogger.SetData(MailboxLogDataName.ValidateCertCommand_ProcessCommand_Per_Cert_Exception, ex.ToString());
                    }
                    AirSyncDiagnostics.TraceError <string, CryptographicException>(ExTraceGlobals.RequestTracer, null, "Failed to validate certificate: '{0}', Error: '{1}'", text, ex);
                    list.Add((ChainValidityStatus)2148098052U);
                }
                finally
                {
                    if (chainContext != null)
                    {
                        chainContext.Dispose();
                    }
                }
            }
            return(list);
        }
Esempio n. 22
0
        public async Task TriggerConsensusAsync(ChainContext chainContext)
        {
            var now = TimestampHelper.GetUtcNow();

            _blockTimeProvider.SetBlockTime(now);

            Logger.LogTrace($"Set block time to utc now: {now:hh:mm:ss.ffffff}. Trigger.");

            var triggerInformation = _triggerInformationProvider.GetTriggerInformationForConsensusCommand(new BytesValue());

            // Upload the consensus command.
            _consensusCommand = await _readerFactory.Create(chainContext)
                                .GetConsensusCommand.CallAsync(triggerInformation);

            Logger.LogDebug($"Updated consensus command: {_consensusCommand}");

            // Update next mining time, also block time of both getting consensus extra data and txs.
            _nextMiningTime =
                TimestampHelper.GetUtcNow().AddMilliseconds(_consensusCommand
                                                            .NextBlockMiningLeftMilliseconds);

            // Initial consensus scheduler.
            var blockMiningEventData = new ConsensusRequestMiningEventData(chainContext.BlockHash,
                                                                           chainContext.BlockHeight,
                                                                           _nextMiningTime,
                                                                           TimestampHelper.DurationFromMilliseconds(_consensusCommand.LimitMillisecondsOfMiningBlock));

            _consensusScheduler.CancelCurrentEvent();
            _consensusScheduler.NewEvent(_consensusCommand.NextBlockMiningLeftMilliseconds,
                                         blockMiningEventData);

            Logger.LogTrace($"Set next mining time to: {_nextMiningTime:hh:mm:ss.ffffff}");
        }
Esempio n. 23
0
        public async Task TriggerConsensusAsync(ChainContext chainContext)
        {
            var triggerInformation = _consensusInformationGenerationService.GetTriggerInformation(TriggerType.ConsensusCommand);

            // Upload the consensus command.
            _consensusControlInformation.ConsensusCommand =
                await _consensusInformationGenerationService.ExecuteContractAsync <ConsensusCommand>(chainContext,
                                                                                                     ConsensusConsts.GetConsensusCommand, triggerInformation, DateTime.UtcNow);

            Logger.LogDebug($"Updated consensus command: {_consensusControlInformation.ConsensusCommand}");

            // Initial consensus scheduler.
            var blockMiningEventData = new ConsensusRequestMiningEventData(chainContext.BlockHash,
                                                                           chainContext.BlockHeight,
                                                                           _consensusControlInformation.ConsensusCommand.ExpectedMiningTime.ToDateTime(),
                                                                           TimeSpan.FromMilliseconds(_consensusControlInformation.ConsensusCommand
                                                                                                     .LimitMillisecondsOfMiningBlock));

            _consensusScheduler.CancelCurrentEvent();
            // TODO: Remove NextBlockMiningLeftMilliseconds.
            _consensusScheduler.NewEvent(_consensusControlInformation.ConsensusCommand.NextBlockMiningLeftMilliseconds,
                                         blockMiningEventData);

            // Update next mining time, also block time of both getting consensus extra data and txs.
            _nextMiningTime =
                DateTime.UtcNow.AddMilliseconds(_consensusControlInformation.ConsensusCommand
                                                .NextBlockMiningLeftMilliseconds);
        }
        protected override async Task ProcessLogEventAsync(Block block, LogEvent logEvent)
        {
            var eventData = new ContractDeployed();

            eventData.MergeFrom(logEvent);

            var chainContext = new ChainContext
            {
                BlockHash   = block.GetHash(),
                BlockHeight = block.Height
            };

            var smartContractRegistration =
                await _smartContractRegistrationInStateProvider.GetSmartContractRegistrationAsync(chainContext
                                                                                                  , eventData.Address);

            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext, eventData.Address,
                                                                                       smartContractRegistration);

            if (block.Height > AElfConstants.GenesisBlockHeight)
            {
                _smartContractExecutiveService.CleanExecutive(eventData.Address);
            }

            if (eventData.Name != null)
            {
                await _smartContractAddressService.SetSmartContractAddressAsync(chainContext, eventData.Name.ToStorageKey(),
                                                                                eventData.Address);
            }

            Logger.LogDebug($"Deployed contract {eventData}");
        }
        public async Task Test()
        {
            var preBlockHeader = await _blockchainService.GetBestChainLastBlockHeaderAsync();

            var chainContext = new ChainContext
            {
                BlockHash   = preBlockHeader.GetHash(),
                BlockHeight = preBlockHeader.Height
            };
            var contractMapping = await ContractAddressService.GetSystemContractNameToAddressMappingAsync(chainContext);

            var tokenStub = GetTester <TokenContractContainer.TokenContractStub>(
                contractMapping[TokenSmartContractAddressNameProvider.Name], Accounts[0].KeyPair);
            var balance = await tokenStub.GetBalance.CallAsync(new GetBalanceInput
            {
                Owner  = Accounts[0].Address,
                Symbol = "ELF"
            });

            balance.Balance.ShouldBe(88000000000000000L);

            var electionStub = GetTester <ElectionContractContainer.ElectionContractStub>(
                contractMapping[ElectionSmartContractAddressNameProvider.Name], Accounts[0].KeyPair);
            var minerCount = await electionStub.GetMinersCount.CallAsync(new Empty());

            minerCount.Value.ShouldBe(1);
        }
        public async Task <IEnumerable <Transaction> > GetPostTransactionsAsync(
            IReadOnlyList <ServiceDescriptor> descriptors, ITransactionContext transactionContext)
        {
            if (!IsTargetAcsSymbol(descriptors))
            {
                return(new List <Transaction>());
            }

            var chainContext = new ChainContext
            {
                BlockHash   = transactionContext.PreviousBlockHash,
                BlockHeight = transactionContext.BlockHeight - 1
            };

            // Generate token contract stub.
            var tokenContractAddress =
                await _smartContractAddressService.GetAddressByContractNameAsync(chainContext,
                                                                                 TokenSmartContractAddressNameProvider.StringName);

            if (tokenContractAddress == null)
            {
                return(new List <Transaction>());
            }

            var tokenStub = _contractReaderFactory.Create(new ContractReaderContext
            {
                ContractAddress = tokenContractAddress,
                Sender          = transactionContext.Transaction.To
            });

            if (transactionContext.Transaction.To == tokenContractAddress &&
                transactionContext.Transaction.MethodName == nameof(tokenStub.ChargeResourceToken))
            {
                return(new List <Transaction>());
            }

            if (transactionContext.Transaction.MethodName == nameof(ResourceConsumptionContractContainer
                                                                    .ResourceConsumptionContractStub.BuyResourceToken))
            {
                return(new List <Transaction>());
            }

            var chargeResourceTokenInput = new ChargeResourceTokenInput
            {
                Caller = transactionContext.Transaction.From
            };

            var feeCalculationResult =
                await _resourceTokenFeeService.CalculateFeeAsync(transactionContext, chainContext);

            chargeResourceTokenInput.CostDic.Add(feeCalculationResult);

            var chargeResourceTokenTransaction = tokenStub.ChargeResourceToken.GetTransaction(chargeResourceTokenInput);

            return(new List <Transaction>
            {
                chargeResourceTokenTransaction
            });
        }
Esempio n. 27
0
        // Token: 0x06001C2A RID: 7210 RVA: 0x0006F4BC File Offset: 0x0006D6BC
        public ChainValidityStatus ValidateCertificate(X509Certificate2 certificate, bool isSend)
        {
            this.response.PolicyFlag = 0U;
            this.response.ChainData  = null;
            ChainContext        chainContext = null;
            ChainValidityStatus chainValidityStatus;

            try
            {
                X509KeyUsageFlags expectedUsage = X509KeyUsageFlags.NonRepudiation | X509KeyUsageFlags.DigitalSignature;
                bool checkCRLOnSend             = this.smimeAdminOptions.CheckCRLOnSend;
                bool disableCRLCheck            = this.smimeAdminOptions.DisableCRLCheck;
                uint crlconnectionTimeout       = this.smimeAdminOptions.CRLConnectionTimeout;
                uint crlretrievalTimeout        = this.smimeAdminOptions.CRLRetrievalTimeout;
                bool flag = disableCRLCheck || (isSend && !checkCRLOnSend);
                if (string.IsNullOrEmpty(this.smimeAdminOptions.SMIMECertificateIssuingCAFull))
                {
                    bool enabled = VariantConfiguration.GetSnapshot(MachineSettingsContext.Local, null, null).Global.MultiTenancy.Enabled;
                    if (enabled)
                    {
                        chainValidityStatus      = (ChainValidityStatus)2148204809U;
                        this.response.PolicyFlag = 65536U;
                    }
                    else
                    {
                        chainValidityStatus      = X509CertificateCollection.ValidateCertificate(certificate, null, expectedUsage, !flag, null, null, TimeSpan.FromMilliseconds(crlconnectionTimeout), TimeSpan.FromMilliseconds(crlretrievalTimeout), ref chainContext, false, null);
                        this.response.PolicyFlag = (uint)this.MapChainStatusToChainFlag(chainValidityStatus);
                    }
                }
                else
                {
                    X509Store x509Store = CertificateStore.Open(StoreType.Memory, null, OpenFlags.ReadWrite);
                    X509Certificate2Collection x509Certificate2Collection = new X509Certificate2Collection();
                    x509Certificate2Collection.Import(Convert.FromBase64String(this.smimeAdminOptions.SMIMECertificateIssuingCAFull));
                    x509Store.AddRange(x509Certificate2Collection);
                    chainValidityStatus      = X509CertificateCollection.ValidateCertificate(certificate, null, expectedUsage, !flag, x509Store, null, TimeSpan.FromMilliseconds(crlconnectionTimeout), TimeSpan.FromMilliseconds(crlretrievalTimeout), ref chainContext, true, base.CallContext.AccessingPrincipal.MailboxInfo.OrganizationId.ToString());
                    this.response.PolicyFlag = (uint)this.MapChainStatusToChainFlag(chainValidityStatus);
                }
                if (!isSend)
                {
                    this.response.DisplayedId = this.GetIdFromCertificate(certificate);
                    if (this.response.DisplayedId == null)
                    {
                        chainValidityStatus = ChainValidityStatus.SubjectMismatch;
                    }
                    this.response.DisplayName = X509PartialCertificate.GetDisplayName(certificate);
                    this.response.Issuer      = this.GetIssuerDisplayNameFromCertificate(certificate);
                }
            }
            finally
            {
                if (chainContext != null)
                {
                    chainContext.Dispose();
                }
            }
            this.response.ChainValidityStatus = (uint)chainValidityStatus;
            return(chainValidityStatus);
        }
Esempio n. 28
0
        public async Task GetExecutive_With_SmartContractRegistrationProvider_Test()
        {
            var chain = await _smartContractHelper.CreateChainWithGenesisContractAsync();

            var chainContext = new ChainContext
            {
                BlockHash   = chain.BestChainHash,
                BlockHeight = chain.BestChainHeight
            };
            //Get executive by smartContractRegistration in SmartContractRegistrationProvider
            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext,
                                                                                       _defaultContractZeroCodeProvider.ContractZeroAddress,
                                                                                       _defaultContractZeroCodeProvider.DefaultContractZeroRegistration);

            var executive = await _smartContractExecutiveService
                            .GetExecutiveAsync(chainContext, _defaultContractZeroCodeProvider.ContractZeroAddress);

            executive.ContractHash.ShouldBe(_defaultContractZeroCodeProvider.DefaultContractZeroRegistration.CodeHash);

            await _smartContractExecutiveService.PutExecutiveAsync(chainContext,
                                                                   _defaultContractZeroCodeProvider.ContractZeroAddress, executive);

            //Get executive from executive pool
            executive = await _smartContractExecutiveService
                        .GetExecutiveAsync(chainContext, _defaultContractZeroCodeProvider.ContractZeroAddress);

            executive.ContractHash.ShouldBe(_defaultContractZeroCodeProvider.DefaultContractZeroRegistration.CodeHash);

            var otherExecutive = await _smartContractExecutiveService
                                 .GetExecutiveAsync(chainContext, _defaultContractZeroCodeProvider.ContractZeroAddress);

            await _smartContractExecutiveService.PutExecutiveAsync(chainContext,
                                                                   _defaultContractZeroCodeProvider.ContractZeroAddress, executive);

            await _smartContractExecutiveService.PutExecutiveAsync(chainContext,
                                                                   _defaultContractZeroCodeProvider.ContractZeroAddress, otherExecutive);

            _smartContractExecutiveProvider.GetExecutivePools()[_defaultContractZeroCodeProvider.ContractZeroAddress]
            .Count.ShouldBe(2);

            //Make codeHash different between smartContractRegistration and executive
            var code     = _smartContractHelper.Codes["AElf.Contracts.Configuration"];
            var codeHash = HashHelper.ComputeFrom(code);
            await _smartContractRegistrationProvider.SetSmartContractRegistrationAsync(chainContext,
                                                                                       _defaultContractZeroCodeProvider.ContractZeroAddress, new SmartContractRegistration
            {
                Category = KernelConstants.DefaultRunnerCategory,
                Code     = ByteString.CopyFrom(code),
                CodeHash = HashHelper.ComputeFrom(code)
            });

            executive = await _smartContractExecutiveService
                        .GetExecutiveAsync(chainContext, _defaultContractZeroCodeProvider.ContractZeroAddress);

            executive.ContractHash.ShouldBe(codeHash);
            _smartContractExecutiveProvider.GetExecutivePools()
            .TryGetValue(_defaultContractZeroCodeProvider.ContractZeroAddress, out _).ShouldBeFalse();
        }
        protected override async ValueTask <TInput> ProcessAsync(TInput input, ChainContext context)
        {
            if (_predicate(input))
            {
                await _conditionalConnector.ProcessAsync(input, context);
            }

            return(input);
        }
        private async Task <SmartContractRegistrationCache> GetSmartContractRegistrationCacheFromLibCache(
            IChainContext chainContext, Address address)
        {
            if (_smartContractRegistrationCacheProvider.TryGetLibCache(address,
                                                                       out var smartContractRegistrationCache))
            {
                return(smartContractRegistrationCache);
            }

            if (chainContext.BlockHeight > 0 && _initLibBlockHeight == 0)
            {
                var chain = await _blockchainService.GetChainAsync();

                _initLibBlockHash   = chain.LastIrreversibleBlockHash;
                _initLibBlockHeight = chain.LastIrreversibleBlockHeight;
            }

            //Use lib chain context to set lib cache. Genesis block need to execute with state cache
            var context = new ChainContext
            {
                BlockHash   = _initLibBlockHash,
                BlockHeight = _initLibBlockHeight,
                StateCache  = chainContext.BlockHeight == 0 ? chainContext.StateCache : null
            };

            if (!_deployedContractAddressProvider.CheckContractAddress(context, address))
            {
                return(null);
            }
            SmartContractRegistration smartContractRegistration;

            if (address == _defaultContractZeroCodeProvider.ContractZeroAddress)
            {
                smartContractRegistration = _defaultContractZeroCodeProvider.DefaultContractZeroRegistration;
                if (context.BlockHeight > Constants.GenesisBlockHeight)
                {
                    var executive = await GetExecutiveAsync(smartContractRegistration);

                    smartContractRegistration =
                        await GetSmartContractRegistrationFromZeroAsync(executive, context, address);
                }
            }
            else
            {
                smartContractRegistration = await GetSmartContractRegistrationFromZeroAsync(context, address);
            }

            smartContractRegistrationCache = new SmartContractRegistrationCache
            {
                SmartContractRegistration = smartContractRegistration,
                BlockHash   = context.BlockHash,
                BlockHeight = context.BlockHeight,
                Address     = address
            };
            _smartContractRegistrationCacheProvider.SetLibCache(address, smartContractRegistrationCache);
            return(smartContractRegistrationCache);
        }