public async Task <ByteString> PrepareExtraDataForNextMiningAsync(Hash blockHash, long blockHeight)
        {
            if (!_transactionPackingOptions.IsTransactionPackable)
            {
                return(ByteString.Empty);
            }

            var utcNow          = TimestampHelper.GetUtcNow();
            var pendingProposal = await GetPendingCrossChainIndexingProposalAsync(blockHash, blockHeight, utcNow);

            if (pendingProposal == null || pendingProposal.ExpiredTime.AddMilliseconds(500) <= utcNow)
            {
                // propose new cross chain indexing data if pending proposal is null or expired
                var crossChainBlockData = await GetCrossChainBlockDataForNextMining(blockHash, blockHeight);

                if (!crossChainBlockData.IsNullOrEmpty())
                {
                    _transactionInputForBlockMiningDataProvider.AddTransactionInputForBlockMining(blockHash,
                                                                                                  new CrossChainTransactionInput
                    {
                        PreviousBlockHeight = blockHeight,
                        MethodName          =
                            nameof(CrossChainContractContainer.CrossChainContractStub.ProposeCrossChainIndexing),
                        Value = crossChainBlockData.ToByteString()
                    });
                }
                return(ByteString.Empty);
            }

            if (!pendingProposal.ToBeReleased)
            {
                return(ByteString.Empty); // do nothing if pending proposal is not ready to be released
            }
            // release pending proposal and unable to propose anything if it is ready
            _transactionInputForBlockMiningDataProvider.AddTransactionInputForBlockMining(blockHash,
                                                                                          new CrossChainTransactionInput
            {
                PreviousBlockHeight = blockHeight,
                MethodName          =
                    nameof(CrossChainContractContainer.CrossChainContractStub.ReleaseCrossChainIndexing),
                Value = pendingProposal.ProposalId.ToByteString()
            });
            return(ExtractCrossChainExtraDataFromCrossChainBlockData(pendingProposal.ProposedCrossChainBlockData));
        }
示例#2
0
        public async Task AttachBlockAsync_Test()
        {
            var chain = await _smartContractExecutionHelper.CreateChainAsync();

            await _blockAttachService.AttachBlockAsync(_kernelTestHelper.GenerateBlock(0, Hash.Empty));

            var blockHeader = new BlockHeader
            {
                Height            = chain.BestChainHeight + 1,
                PreviousBlockHash = chain.BestChainHash,
                Time         = TimestampHelper.GetUtcNow(),
                SignerPubkey = ByteString.CopyFrom(CryptoHelper.GenerateKeyPair().PublicKey)
            };

            var transactions = new List <Transaction>
            {
                new Transaction
                {
                    From       = _smartContractAddressService.GetZeroSmartContractAddress(),
                    To         = _smartContractAddressService.GetZeroSmartContractAddress(),
                    MethodName = nameof(ACS0Container.ACS0Stub.DeploySmartContract),
                    Params     = new ContractDeploymentInput
                    {
                        Category = KernelConstants.DefaultRunnerCategory,
                        Code     = ByteString.CopyFrom(
                            _smartContractExecutionHelper.ContractCodes["AElf.Contracts.MultiToken"])
                    }.ToByteString()
                }
            };

            var blockExecutedSet = await _blockExecutingService.ExecuteBlockAsync(blockHeader, transactions);

            await _blockchainService.AddBlockAsync(blockExecutedSet.Block);

            _blockAttachService.AttachBlockAsync(blockExecutedSet.Block).ShouldThrow <Exception>();

            await _blockchainService.AddTransactionsAsync(transactions);

            await _blockAttachService.AttachBlockAsync(blockExecutedSet.Block);

            var newChain = await _blockchainService.GetChainAsync();

            newChain.BestChainHeight.ShouldBe(chain.BestChainHeight + 1);
        }
        public async Task Disposal_SideChain_NotAuthorized()
        {
            long lockedTokenAmount = 10;

            await InitializeCrossChainContractAsync();
            await ApproveBalanceAsync(lockedTokenAmount);

            var chainId = await InitAndCreateSideChainAsync();

            var disposalInput = new SInt32Value
            {
                Value = chainId
            };

            var ecKeyPair           = CryptoHelper.GenerateKeyPair();
            var other               = Tester.CreateNewContractTester(ecKeyPair);
            var organizationAddress = Address.Parser.ParseFrom((await Tester.ExecuteContractWithMiningAsync(
                                                                    ParliamentAddress,
                                                                    nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.GetGenesisOwnerAddress),
                                                                    new Empty()))
                                                               .ReturnValue);
            var proposal = await other.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                      nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.CreateProposal),
                                                                      new CreateProposalInput
            {
                ContractMethodName  = "DisposeSideChain",
                ExpiredTime         = TimestampHelper.GetUtcNow().AddDays(1),
                Params              = disposalInput.ToByteString(),
                ToAddress           = CrossChainContractAddress,
                OrganizationAddress = organizationAddress
            });

            var proposalId = Hash.Parser.ParseFrom(proposal.ReturnValue);

            await ApproveWithMinersAsync(proposalId);

            var transactionResult = await other.ExecuteContractWithMiningAsync(ParliamentAddress,
                                                                               nameof(ParliamentAuthContractContainer.ParliamentAuthContractStub.Release), proposalId);

            var status = transactionResult.Status;

            Assert.True(status == TransactionResultStatus.Failed);
            Assert.Contains("Not authorized to dispose.", transactionResult.Error);
        }
示例#4
0
        private async Task DeployContractsAsync()
        {
            var category = KernelConstants.CodeCoverageRunnerCategory;
            var code     = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("Configuration")).Value;

            OptionalLogEventListeningService <IBlockAcceptedLogEventHandler> .Enabled = true;
            ConfigurationContractAddress = await DeploySystemSmartContract(category, code,
                                                                           ConfigurationSmartContractAddressNameProvider.Name, DefaultSenderKeyPair);

            _configurationStub =
                GetTester <ConfigurationContainer.ConfigurationStub>(ConfigurationContractAddress,
                                                                     DefaultSenderKeyPair);

            var consensusContractCode    = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("Consensus.AEDPoS")).Value;
            var consensusContractAddress = await DeploySystemSmartContract(category, consensusContractCode,
                                                                           ConsensusSmartContractAddressNameProvider.Name, DefaultSenderKeyPair);

            var consensusStub = GetTester <AEDPoSContractImplContainer.AEDPoSContractImplStub>(consensusContractAddress,
                                                                                               DefaultSenderKeyPair);

            await consensusStub.FirstRound.SendAsync(
                new MinerList
            {
                Pubkeys = { ByteString.CopyFrom(DefaultSenderKeyPair.PublicKey) }
            }.GenerateFirstRoundOfNewTerm(4000, TimestampHelper.GetUtcNow())
                );

            var parliamentContractCode    = Codes.Single(kv => kv.Key.Split(",").First().EndsWith("Parliament")).Value;
            var parliamentContractAddress = await DeploySystemSmartContract(category, parliamentContractCode,
                                                                            ParliamentSmartContractAddressNameProvider.Name, DefaultSenderKeyPair);

            _parliamentContractStub = GetTester <ParliamentContractContainer.ParliamentContractStub>(parliamentContractAddress,
                                                                                                     DefaultSenderKeyPair);

            await _parliamentContractStub.Initialize.SendAsync(new InitializeInput
            {
                ProposerAuthorityRequired = true,
                PrivilegedProposer        = Address.FromPublicKey(DefaultSenderKeyPair.PublicKey)
            });

            var chain = await _blockchainService.GetChainAsync();

            await _blockchainService.SetIrreversibleBlockAsync(chain, chain.BestChainHeight, chain.BestChainHash);
        }
示例#5
0
        public async Task RequestMining_Test()
        {
            var chain = await _blockchainService.GetChainAsync();

            var request = new ConsensusRequestMiningDto
            {
                BlockTime           = TimestampHelper.GetUtcNow(),
                BlockExecutionTime  = TimestampHelper.DurationFromMilliseconds(500),
                MiningDueTime       = TimestampHelper.GetUtcNow().AddMilliseconds(499),
                PreviousBlockHash   = chain.BestChainHash,
                PreviousBlockHeight = chain.BestChainHeight
            };

            var block = await _miningRequestService.RequestMiningAsync(request);

            block.ShouldBeNull();

            request = new ConsensusRequestMiningDto
            {
                BlockTime           = TimestampHelper.GetUtcNow().AddMilliseconds(-501),
                BlockExecutionTime  = TimestampHelper.DurationFromMilliseconds(500),
                MiningDueTime       = TimestampHelper.GetUtcNow().AddMilliseconds(350),
                PreviousBlockHash   = chain.BestChainHash,
                PreviousBlockHeight = chain.BestChainHeight
            };
            block = await _miningRequestService.RequestMiningAsync(request);

            block.ShouldBeNull();

            request = new ConsensusRequestMiningDto
            {
                BlockTime           = TimestampHelper.GetUtcNow().AddMilliseconds(-400),
                BlockExecutionTime  = TimestampHelper.DurationFromMilliseconds(500),
                MiningDueTime       = TimestampHelper.GetUtcNow().AddMilliseconds(350),
                PreviousBlockHash   = chain.BestChainHash,
                PreviousBlockHeight = chain.BestChainHeight
            };
            block = await _miningRequestService.RequestMiningAsync(request);

            block.ShouldNotBeNull();
            block.Header.PreviousBlockHash.ShouldBe(chain.BestChainHash);
            block.Header.Height.ShouldBe(chain.BestChainHeight + 1);
            block.Header.Time.ShouldBe(request.BlockTime);
        }
        public async Task DAOManagementTest_Join()
        {
            await InitialDAOContract();

            // Alice want to join DAO.
            // First approve.
            var balanceBefore = (await AliceTokenContractStub.GetBalance.CallAsync(new GetBalanceInput
            {
                Owner = AliceAddress,
                Symbol = "ELF"
            })).Balance;
            await AliceTokenContractStub.Approve.SendAsync(new ApproveInput
            {
                Spender = DAOContractAddress,
                Symbol  = "ELF",
                Amount  = DepositAmount
            });

            var proposalId = (await AliceParliamentStub.CreateProposal.SendAsync(new CreateProposalInput
            {
                OrganizationAddress = ParliamentDefaultOrganizationAddress,
                ContractMethodName = nameof(DAOContractStub.ProposeJoin),
                ExpiredTime = TimestampHelper.GetUtcNow().AddHours(1),
                Params = AliceAddress.ToByteString(),
                ToAddress = DAOContractAddress
            })).Output;

            await ParliamentApproveAsync(proposalId);

            await AliceParliamentStub.Release.SendAsync(proposalId);

            // Check DAO member list.
            var memberList = (await DAOContractStub.GetDAOMemberList.CallAsync(new Empty())).Value;

            memberList.ShouldContain(AliceAddress);

            var balanceAfter = (await AliceTokenContractStub.GetBalance.CallAsync(new GetBalanceInput
            {
                Owner = AliceAddress,
                Symbol = "ELF"
            })).Balance;

            (balanceBefore - balanceAfter).ShouldBe(DepositAmount);
        }
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            var services = context.Services;

            services.AddTransient <IBlockValidationService>(p =>
            {
                var mockProvider = new Mock <IBlockValidationService>();

                mockProvider.Setup(m => m.ValidateBlockAfterExecuteAsync(It.IsAny <IBlock>()))
                .ReturnsAsync(true);

                return(mockProvider.Object);
            });

            services.AddTransient <IBlockExecutingService>(p =>
            {
                var mockService = new Mock <IBlockExecutingService>();
                mockService.Setup(m =>
                                  m.ExecuteBlockAsync(It.IsAny <BlockHeader>(), It.IsAny <IEnumerable <Transaction> >()))
                .Returns <BlockHeader, IEnumerable <Transaction> >((blockHeader, transactions) =>
                {
                    Block result;
                    if (blockHeader.Height == Constants.GenesisBlockHeight)
                    {
                        result = new Block {
                            Header = blockHeader
                        };
                    }
                    else
                    {
                        result = new Block
                        {
                            Header = new BlockHeader {
                                Time = TimestampHelper.GetUtcNow()
                            }
                        };
                    }

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

                return(mockService.Object);
            });
        }
示例#8
0
        private GrpcPeer CreateNewPeer()
        {
            var pubkey    = "048f5ced21f8d687cb9ade1c22dc0e183b05f87124c82073f5d82a09b139cc466efbfb6f28494d0a9d7366fcb769fe5436cfb7b5d322a2b0f69c4bcb1c33ac24ad";
            var ipAddress = "127.0.0.1:888";

            AElfPeerEndpointHelper.TryParse(ipAddress, out var remoteEndpoint);
            var channel = new Channel(ipAddress, ChannelCredentials.Insecure);
            var client  = new PeerService.PeerServiceClient(channel);

            var connectionInfo = new PeerConnectionInfo
            {
                Pubkey          = pubkey,
                ProtocolVersion = KernelConstants.ProtocolVersion,
                ConnectionTime  = TimestampHelper.GetUtcNow(),
                IsInbound       = true
            };

            return(new GrpcPeer(new GrpcClient(channel, client), remoteEndpoint, connectionInfo));
        }
示例#9
0
        public async Task <GrpcPeer> DialBackPeerAsync(DnsEndPoint remoteEndpoint, Handshake handshake)
        {
            var client = CreateClient(remoteEndpoint);

            await PingNodeAsync(client, remoteEndpoint);

            var peer = new GrpcPeer(client, remoteEndpoint, new PeerConnectionInfo
            {
                Pubkey          = handshake.HandshakeData.Pubkey.ToHex(),
                ConnectionTime  = TimestampHelper.GetUtcNow(),
                SessionId       = handshake.SessionId.ToByteArray(),
                ProtocolVersion = handshake.HandshakeData.Version,
                IsInbound       = true
            });

            peer.UpdateLastReceivedHandshake(handshake);

            return(peer);
        }
示例#10
0
        private bool ValidateBlockMiningTime(Timestamp blockTime, Timestamp miningDueTime,
                                             Duration blockExecutionDuration)
        {
            if (miningDueTime - Duration.FromTimeSpan(TimeSpan.FromMilliseconds(250)) <
                blockTime + blockExecutionDuration)
            {
                Logger.LogDebug(
                    $"Mining canceled because mining time slot expired. MiningDueTime: {miningDueTime}, BlockTime: {blockTime}, Duration: {blockExecutionDuration}");
                return(false);
            }

            if (blockTime + blockExecutionDuration >= TimestampHelper.GetUtcNow())
            {
                return(true);
            }
            Logger.LogDebug($"Will cancel mining due to timeout: Actual mining time: {blockTime}, " +
                            $"execution limit: {blockExecutionDuration.Milliseconds()} ms.");
            return(false);
        }
        public async Task PrepareExtraDataForNextMiningAsync_AlmostExpired_NotApproved_Test()
        {
            var sideChainId             = 123;
            var sideChainBlockInfoCache = new List <SideChainBlockData>();
            var cachingCount            = 5;

            for (int i = 0; i < cachingCount + CrossChainConstants.DefaultBlockCacheEntityCount; i++)
            {
                sideChainBlockInfoCache.Add(new SideChainBlockData()
                {
                    ChainId = sideChainId,
                    Height  = (i + 1),
                    TransactionStatusMerkleTreeRoot = Hash.FromString((sideChainId + 1).ToString())
                });
            }

            _crossChainTestHelper.AddFakeSideChainIdHeight(sideChainId, 1);
            var fakeCache = new Dictionary <int, List <IBlockCacheEntity> >
            {
                { sideChainId, sideChainBlockInfoCache.ToList <IBlockCacheEntity>() }
            };

            AddFakeCacheData(fakeCache);

            var crossChainBlockData = new CrossChainBlockData
            {
                SideChainBlockDataList = { sideChainBlockInfoCache }
            };

            _crossChainTestHelper.AddFakePendingCrossChainIndexingProposal(
                new GetPendingCrossChainIndexingProposalOutput
            {
                Proposer   = SampleAddress.AddressList[0],
                ProposalId = Hash.FromString("ProposalId"),
                ProposedCrossChainBlockData = crossChainBlockData,
                ToBeReleased = false,
                ExpiredTime  = TimestampHelper.GetUtcNow().AddMilliseconds(500)
            });

            var res = await _crossChainIndexingDataService.PrepareExtraDataForNextMiningAsync(Hash.Empty, 1);

            Assert.Empty(res);
        }
示例#12
0
        /// <summary>
        /// Given an IP address, will create a handshake to the distant node for
        /// further communications.
        /// </summary>
        /// <returns>The created peer</returns>
        public async Task <GrpcPeer> DialPeerAsync(DnsEndPoint remoteEndpoint)
        {
            var client = await CreateClientAsync(remoteEndpoint);

            var handshake = await _handshakeProvider.GetHandshakeAsync();

            var handshakeReply = await CallDoHandshakeAsync(client, remoteEndpoint, handshake);

            // verify handshake
            if (handshakeReply.Error != HandshakeError.HandshakeOk)
            {
                Logger.LogWarning($"Handshake error: {remoteEndpoint} {handshakeReply.Error}.");
                await client.Channel.ShutdownAsync();

                return(null);
            }

            if (await _handshakeProvider.ValidateHandshakeAsync(handshakeReply.Handshake) !=
                HandshakeValidationResult.Ok)
            {
                Logger.LogWarning($"Connect error: {remoteEndpoint} {handshakeReply}.");
                await client.Channel.ShutdownAsync();

                return(null);
            }

            var peer = new GrpcPeer(client, remoteEndpoint, new PeerConnectionInfo
            {
                Pubkey          = handshakeReply.Handshake.HandshakeData.Pubkey.ToHex(),
                ConnectionTime  = TimestampHelper.GetUtcNow(),
                ProtocolVersion = handshakeReply.Handshake.HandshakeData.Version,
                SessionId       = handshakeReply.Handshake.SessionId.ToByteArray(),
                IsInbound       = false,
                IsSecure        = client.IsSecure
            });

            peer.UpdateLastReceivedHandshake(handshakeReply.Handshake);

            peer.InboundSessionId = handshake.SessionId.ToByteArray();
            peer.UpdateLastSentHandshake(handshake);

            return(peer);
        }
示例#13
0
        public void Enqueue(Func <Task> task, string queueName)
        {
            var enqueueTime = TimestampHelper.GetUtcNow();

            _taskQueueManager.Enqueue(async() =>
            {
                try
                {
                    Logger.LogTrace($"Execute block sync job: {queueName}, enqueue time: {enqueueTime}");

                    _blockSyncStateProvider.SetEnqueueTime(queueName, enqueueTime);
                    await task();
                }
                finally
                {
                    _blockSyncStateProvider.SetEnqueueTime(queueName, null);
                }
            }, queueName);
        }
示例#14
0
        public async Task <Block> MinedOneBlock(Hash previousBlockHash = null, long previousBlockHeight = 0)
        {
            if (previousBlockHash == null || previousBlockHeight == 0)
            {
                var chain = await _blockchainService.GetChainAsync();

                previousBlockHash   = chain.BestChainHash;
                previousBlockHeight = chain.BestChainHeight;
            }

            var block = await _minerService.MineAsync(previousBlockHash, previousBlockHeight,
                                                      TimestampHelper.GetUtcNow(), TimestampHelper.DurationFromMilliseconds(4000));

            await _blockchainService.AddBlockAsync(block);

            await _blockAttachService.AttachBlockAsync(block);

            return(block);
        }
示例#15
0
        GenerateConsensusInitializationCallList()
        {
            var consensusContractCallList = new SystemContractDeploymentInput.Types.SystemTransactionMethodCallList();

            consensusContractCallList.Add(nameof(AEDPoSContractStub.InitialAElfConsensusContract),
                                          new InitialAElfConsensusContractInput
            {
                PeriodSeconds         = 604800L,
                MinerIncreaseInterval = 31536000,
                IsSideChain           = true
            });

            consensusContractCallList.Add(nameof(AEDPoSContractStub.FirstRound), new MinerList
            {
                Pubkeys = { InitialCoreDataCenterKeyPairs.Select(p => ByteString.CopyFrom(p.PublicKey)) }
            }.GenerateFirstRoundOfNewTerm(4000, TimestampHelper.GetUtcNow()));

            return(consensusContractCallList);
        }
        private async Task <SmartContractRegistration> GetSmartContractRegistrationFromZeroAsync(
            IExecutive executiveZero, IChainContext chainContext, Hash codeHash)
        {
            var transaction = new Transaction()
            {
                From       = FromAddress,
                To         = _defaultContractZeroCodeProvider.ContractZeroAddress,
                MethodName = "GetSmartContractRegistration",
                Params     = codeHash.ToByteString()
            };

            var trace = new TransactionTrace
            {
                TransactionId = transaction.GetHash()
            };

            var txCtxt = new TransactionContext
            {
                PreviousBlockHash = chainContext.BlockHash,
                CurrentBlockTime  = TimestampHelper.GetUtcNow(),
                Transaction       = transaction,
                BlockHeight       = chainContext.BlockHeight + 1,
                Trace             = trace,
                CallDepth         = 0,
                StateCache        = chainContext.StateCache
            };

            await executiveZero.ApplyAsync(txCtxt);

            var returnBytes = txCtxt.Trace?.ReturnValue;

            if (returnBytes != null && returnBytes != ByteString.Empty)
            {
                return(SmartContractRegistration.Parser.ParseFrom(returnBytes));
            }

            if (!txCtxt.Trace.IsSuccessful())
            {
                throw new SmartContractFindRegistrationException(
                          $"failed to find registration from zero contract {txCtxt.Trace.Error}");
            }
            return(null);
        }
        public void CleanIdleExecutive()
        {
            var executivePools = _smartContractExecutiveProvider.GetExecutivePools();

            foreach (var executivePool in executivePools)
            {
                foreach (var executiveBag in executivePool.Value.Values)
                {
                    if (executiveBag.Count > ExecutiveClearLimit && executiveBag.Min(o => o.LastUsedTime) <
                        TimestampHelper.GetUtcNow() - TimestampHelper.DurationFromSeconds(ExecutiveExpirationTime))
                    {
                        if (executiveBag.TryTake(out _))
                        {
                            Logger.LogDebug($"Cleaned an idle executive for address {executivePool.Key}.");
                        }
                    }
                }
            }
        }
        private async Task <Hash> CreateFeeProposalAsync(Address contractAddress, Address organizationAddress,
                                                         string methodName, IMessage input)
        {
            var parliamentContractStub = GetParliamentContractTester(InitialMinersKeyPairs[0]);
            var proposal = new CreateProposalInput
            {
                OrganizationAddress = organizationAddress,
                ContractMethodName  = methodName,
                ExpiredTime         = TimestampHelper.GetUtcNow().AddHours(1),
                Params    = input.ToByteString(),
                ToAddress = contractAddress
            };

            var createResult = await parliamentContractStub.CreateProposal.SendAsync(proposal);

            var proposalId = createResult.Output;

            return(proposalId);
        }
示例#19
0
        private async Task UpdateSmartContractAddressesAsync(BlockHeader blockHeader,
                                                             ISmartContractAddressNameProvider smartContractAddressNameProvider)
        {
            var transaction = new Transaction()
            {
                From       = _smartContractAddressService.GetZeroSmartContractAddress(),
                To         = _smartContractAddressService.GetZeroSmartContractAddress(),
                MethodName = nameof(Acs0.ACS0Container.ACS0Stub.GetContractAddressByName),
                Params     = smartContractAddressNameProvider.ContractName.ToByteString()
            };
            var address = await _transactionExecutingService.ExecuteAsync <Address>(
                new ChainContext { BlockHash = blockHeader.GetHash(), BlockHeight = blockHeader.Height }, transaction,
                TimestampHelper.GetUtcNow(), true);

            if (!address.Value.IsEmpty)
            {
                _smartContractAddressService.SetAddress(smartContractAddressNameProvider.ContractName, address);
            }
        }
示例#20
0
        private async Task <TResp> RequestAsync <TResp>(Func <AsyncUnaryCall <TResp> > func, GrpcRequest requestParams)
        {
            var metricsName      = requestParams.MetricName;
            var timeRequest      = !string.IsNullOrEmpty(metricsName);
            var requestStartTime = TimestampHelper.GetUtcNow();

            Stopwatch requestTimer = null;

            if (timeRequest)
            {
                requestTimer = Stopwatch.StartNew();
            }

            try
            {
                var response = await func();

                if (timeRequest)
                {
                    requestTimer.Stop();
                    RecordMetric(requestParams, requestStartTime, requestTimer.ElapsedMilliseconds);
                }

                return(response);
            }
            catch (ObjectDisposedException ex)
            {
                throw new NetworkException("Peer is closed", ex, NetworkExceptionType.Unrecoverable);
            }
            catch (AggregateException ex)
            {
                throw HandleRpcException(ex.InnerException as RpcException, requestParams.ErrorMessage);
            }
            finally
            {
                if (timeRequest)
                {
                    requestTimer.Stop();
                    RecordMetric(requestParams, requestStartTime, requestTimer.ElapsedMilliseconds);
                }
            }
        }
示例#21
0
        public async Task SetControllerForManageConnector_Test()
        {
            var createOrganizationResult = await ParliamentContractStub.CreateOrganization.SendAsync(
                new CreateOrganizationInput
            {
                ProposalReleaseThreshold = new ProposalReleaseThreshold
                {
                    MinimalApprovalThreshold = 1000,
                    MinimalVoteThreshold     = 1000
                }
            });

            var organizationAddress = createOrganizationResult.Output;
            var defaultController   =
                await TokenConverterContractStub.GetControllerForManageConnector.CallAsync(new Empty());

            var defaultOrganization = await ParliamentContractStub.GetDefaultOrganizationAddress.CallAsync(new Empty());

            var proposal = await ParliamentContractStub.CreateProposal.SendAsync(new CreateProposalInput
            {
                ToAddress          = TokenConverterContractAddress,
                ContractMethodName = nameof(TokenConverterContractStub.ChangeConnectorController),
                ExpiredTime        = TimestampHelper.GetUtcNow().AddHours(1),
                Params             = new AuthorityInfo
                {
                    ContractAddress = defaultController.ContractAddress,
                    OwnerAddress    = organizationAddress
                }.ToByteString(),
                OrganizationAddress = defaultOrganization
            });

            var proposalId = proposal.Output;

            await ApproveWithAllMinersAsync(proposalId);

            var releaseResult = await ParliamentContractStub.Release.SendAsync(proposalId);

            releaseResult.TransactionResult.Status.ShouldBe(TransactionResultStatus.Mined);
            var newController = await TokenConverterContractStub.GetControllerForManageConnector.CallAsync(new Empty());

            newController.OwnerAddress.ShouldBe(organizationAddress);
        }
示例#22
0
        public async Task Basic_Mapped1Type_Test()
        {
            var from  = SampleAddress.AddressList[0].GetFormatted();
            var pairA = "ELF";
            var to    = SampleAddress.AddressList[1].GetFormatted();
            var pairB = "USDT";

            await TestBasicSecurityContractStub.TestMapped2State.SendAsync(new Complex3Input
            {
                From         = from,
                PairA        = pairA,
                To           = to,
                PairB        = pairB,
                TradeDetails = new TradeMessage
                {
                    FromAmount = 1830,
                    ToAmount   = 1000,
                    Timestamp  = TimestampHelper.GetUtcNow()
                }
            });

            var queryResult = (await TestBasicSecurityContractStub.QueryMappedState2.CallAsync(new Complex3Input
            {
                From = from,
                PairA = pairA,
                To = to,
                PairB = pairB
            }));

            queryResult.FromAmount.ShouldBe(1830);
            queryResult.ToAmount.ShouldBe(1000);

            queryResult = (await TestBasicSecurityContractStub.QueryMappedState2.CallAsync(new Complex3Input
            {
                From = from,
                PairA = pairA,
                To = to,
                PairB = "ETH"
            }));
            queryResult.FromAmount.ShouldBe(0);
            queryResult.ToAmount.ShouldBe(0);
        }
示例#23
0
        public async Task <bool> ValidateBeforeAttachAsync(IBlock block)
        {
            if (block?.Header == null || block.Body == null)
            {
                Logger.LogWarning($"Block header or body is null.");
                return(false);
            }

            if (block.Body.TransactionsCount == 0)
            {
                Logger.LogWarning($"Block transactions is empty");
                return(false);
            }

            if (_blockchainService.GetChainId() != block.Header.ChainId)
            {
                Logger.LogWarning($"Block chain id mismatch {block.Header.ChainId}");
                return(false);
            }

            if (block.Header.Height != Constants.GenesisBlockHeight && !block.VerifySignature())
            {
                Logger.LogWarning($"Block verify signature failed.");
                return(false);
            }

            if (block.Body.CalculateMerkleTreeRoot() != block.Header.MerkleTreeRootOfTransactions)
            {
                Logger.LogWarning($"Block merkle tree root mismatch.");
                return(false);
            }

            if (block.Header.Height != Constants.GenesisBlockHeight &&
                block.Header.Time.ToDateTime() - TimestampHelper.GetUtcNow().ToDateTime() >
                KernelConstants.AllowedFutureBlockTimeSpan.ToTimeSpan())
            {
                Logger.LogWarning($"Future block received {block}, {block.Header.Time.ToDateTime()}");
                return(false);
            }

            return(true);
        }
        public bool SchedulePeerForReconnection(string endpoint)
        {
            var nextTry = TimestampHelper.GetUtcNow().AddMilliseconds(NetworkOptions.PeerReconnectionPeriod);

            Logger.LogDebug($"Scheduling {endpoint} for reconnection at {nextTry}.");

            var reconnectingPeer = new ReconnectingPeer {
                Endpoint          = endpoint,
                NextAttempt       = nextTry,
                DisconnectionTime = TimestampHelper.GetUtcNow()
            };

            if (!_reconnectionStateProvider.AddReconnectingPeer(endpoint, reconnectingPeer))
            {
                Logger.LogWarning($"Reconnection scheduling failed to {endpoint}.");
                return(false);
            }

            return(true);
        }
 private async Task InitializeAElfConsensus()
 {
     {
         await AEDPoSContractStub.InitialAElfConsensusContract.SendAsync(
             new InitialAElfConsensusContractInput
         {
             PeriodSeconds         = 604800L,
             MinerIncreaseInterval = 31536000
         });
     }
     {
         await AEDPoSContractStub.FirstRound.SendAsync(
             GenerateFirstRoundOfNewTerm(
                 new MinerList
         {
             Pubkeys = { InitialCoreDataCenterKeyPairs.Select(p => ByteString.CopyFrom(p.PublicKey)) }
         },
                 4000, TimestampHelper.GetUtcNow()));
     }
 }
示例#26
0
        private static IPeer CreatePeer(string ipEndpoint = NetworkTestConstants.FakeIpEndpoint, string pubKey = null)
        {
            var peerMock = new Mock <IPeer>();
            var pubkey   = pubKey ?? CryptoHelper.GenerateKeyPair().PublicKey.ToHex();

            var peerInfo = new PeerConnectionInfo
            {
                Pubkey          = pubkey,
                ProtocolVersion = KernelConstants.ProtocolVersion,
                ConnectionTime  = TimestampHelper.GetUtcNow(),
                IsInbound       = true
            };

            var endpoint = ParseEndPoint(ipEndpoint);

            peerMock.Setup(p => p.RemoteEndpoint).Returns(endpoint);
            peerMock.Setup(p => p.Info).Returns(peerInfo);

            return(peerMock.Object);
        }
示例#27
0
        public async Task VoteContract_Register_CurrencyNotSupportVoting_Test()
        {
            var startTime = TimestampHelper.GetUtcNow();
            var input     = new VotingRegisterInput
            {
                TotalSnapshotNumber = 5,
                EndTimestamp        = startTime.AddDays(100),
                StartTimestamp      = startTime,
                Options             =
                {
                    GenerateOptions(3)
                },
                AcceptedCurrency = "USDT",
                IsLockToken      = true
            };
            var transactionResult = (await VoteContractStub.Register.SendAsync(input)).TransactionResult;

            transactionResult.Status.ShouldBe(TransactionResultStatus.Failed);
            transactionResult.Error.Contains("Claimed accepted token is not available for voting").ShouldBeTrue();
        }
        public async Task MineWithTxHubAsync()
        {
            var txCount        = 0;
            var preBlockHash   = _chain.BestChainHash;
            var preBlockHeight = _chain.BestChainHeight;

            while (txCount < TransactionCount)
            {
                var blockExecutedSet = await _minerService.MineAsync(preBlockHash, preBlockHeight,
                                                                     TimestampHelper.GetUtcNow(), TimestampHelper.DurationFromMilliseconds(4000));

                txCount += blockExecutedSet.TransactionIds.Count();
                _transactionIdList.AddRange(blockExecutedSet.TransactionIds.ToList());
                await BlockchainService.SetBestChainAsync(_chain, preBlockHeight, preBlockHash);

                await TransactionPoolService.CleanByTransactionIdsAsync(blockExecutedSet.TransactionIds);

                await TransactionPoolService.UpdateTransactionPoolByBestChainAsync(preBlockHash, preBlockHeight);
            }
        }
示例#29
0
        public override void OnApplicationInitialization(ApplicationInitializationContext context)
        {
            var pool    = context.ServiceProvider.GetRequiredService <IPeerPool>();
            var channel = new Channel(NetworkTestConstants.FakeIpEndpoint, ChannelCredentials.Insecure);

            var connectionInfo = new PeerConnectionInfo
            {
                Pubkey          = NetworkTestConstants.FakePubkey2,
                ProtocolVersion = KernelConstants.ProtocolVersion,
                ConnectionTime  = TimestampHelper.GetUtcNow(),
                IsInbound       = true
            };

            if (!IpEndPointHelper.TryParse(NetworkTestConstants.FakeIpEndpoint, out var peerEndpoint))
            {
                throw new Exception($"Ip {NetworkTestConstants.FakeIpEndpoint} is invalid.");
            }

            pool.TryAddPeer(new GrpcPeer(new GrpcClient(channel, new PeerService.PeerServiceClient(channel)), peerEndpoint, connectionInfo));
        }
        public async Task PutExecutiveAsync(Address address, IExecutive executive)
        {
            if (_smartContractExecutiveProvider.TryGetExecutiveDictionary(address, out var dictionary))
            {
                if (dictionary.TryGetValue(executive.ContractHash, out var pool))
                {
                    executive.LastUsedTime = TimestampHelper.GetUtcNow();
                    pool.Add(executive);
                    return;
                }

                Logger.LogDebug($"Lost an executive (no registration {address})");
            }
            else
            {
                Logger.LogDebug($"Lost an executive (no pool {address})");
            }

            await Task.CompletedTask;
        }