示例#1
0
        public async Task CanMineVotingRequestTransactionAsync()
        {
            var network = new TestPoACollateralNetwork(true, Guid.NewGuid().ToString());

            using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this))
            {
                string walletName     = "mywallet";
                string walletPassword = "******";
                string walletAccount  = "account 0";

                Money transferAmount = Money.Coins(0.01m);
                Money feeAmount      = Money.Coins(0.0001m);

                var counterchainNetwork = new StraxTest();

                CoreNode nodeA = builder.CreatePoANodeWithCounterchain(network, counterchainNetwork, network.FederationKey1).WithWallet(walletPassword, walletName).Start();
                CoreNode nodeB = builder.CreatePoANodeWithCounterchain(network, counterchainNetwork, network.FederationKey2).WithWallet(walletPassword, walletName).Start();

                TestHelper.Connect(nodeA, nodeB);

                long toMineCount = network.Consensus.PremineHeight + network.Consensus.CoinbaseMaturity + 1 - nodeA.GetTip().Height;

                // Get coins on nodeA via the premine.
                await nodeA.MineBlocksAsync((int)toMineCount).ConfigureAwait(false);

                CoreNodePoAExtensions.WaitTillSynced(nodeA, nodeB);

                // Create voting-request transaction.
                var minerKey      = new Key();
                var collateralKey = new Key();
                var request       = new JoinFederationRequest(minerKey.PubKey, new Money(CollateralFederationMember.MinerCollateralAmount, MoneyUnit.BTC), collateralKey.PubKey.Hash);

                // In practice this signature will come from calling the counter-chain "signmessage" API.
                request.AddSignature(collateralKey.SignMessage(request.SignatureMessage));

                var         encoder = new JoinFederationRequestEncoder(nodeA.FullNode.NodeService <Microsoft.Extensions.Logging.ILoggerFactory>());
                Transaction trx     = JoinFederationRequestBuilder.BuildTransaction(nodeA.FullNode.WalletTransactionHandler(), this.network, request, encoder, walletName, walletAccount, walletPassword);

                await nodeA.FullNode.NodeController <WalletController>().SendTransaction(new SendTransactionRequest(trx.ToHex()));

                TestBase.WaitLoop(() => nodeA.CreateRPCClient().GetRawMempool().Length == 1 && nodeB.CreateRPCClient().GetRawMempool().Length == 1);

                await nodeB.MineBlocksAsync((int)toMineCount).ConfigureAwait(false);

                TestBase.WaitLoop(() => nodeA.CreateRPCClient().GetRawMempool().Length == 0 && nodeB.CreateRPCClient().GetRawMempool().Length == 0);

                IWalletManager walletManager = nodeB.FullNode.NodeService <IWalletManager>();

                TestBase.WaitLoop(() =>
                {
                    long balance = walletManager.GetBalances(walletName, walletAccount).Sum(x => x.AmountConfirmed);

                    return(balance == feeAmount);
                });

                Assert.Single(nodeA.FullNode.NodeService <VotingManager>().GetPendingPolls());
                Assert.Single(nodeB.FullNode.NodeService <VotingManager>().GetPendingPolls());
            }
        }
示例#2
0
        static async Task Main(string[] args)
        {
            int     stratisNetworkApiPort;
            int     startBlock = 0;
            Network straxNetwork;
            string  blockExplorerBaseUrl;

            if (args.Contains("-testnet"))
            {
                startBlock = 1528858;

                stratisNetworkApiPort = 38221;
                straxNetwork          = new StraxTest();
                blockExplorerBaseUrl  = "https://stratistestindexer1.azurewebsites.net/api/v1/";
            }
            else
            {
                startBlock = 1975500;

                stratisNetworkApiPort = 37221;
                straxNetwork          = new StraxMain();
                blockExplorerBaseUrl  = "https://stratismainindexer1.azurewebsites.net/api/v1/";
            }

            var arg = args.FirstOrDefault(a => a.StartsWith("-startfrom"));

            if (arg != null)
            {
                int.TryParse(arg.Split('=')[1], out startBlock);
            }

            if (args.Contains("-swap"))
            {
                var service = new SwapExtractionService(stratisNetworkApiPort, straxNetwork);
                await service.RunAsync(startBlock, true, false);
            }

            if (args.Contains("-swapvote") || args.Contains("-collateralvote"))
            {
                var blockExplorerClient = new BlockExplorerClient(blockExplorerBaseUrl);
                var service             = new VoteExtractionService(stratisNetworkApiPort, straxNetwork, blockExplorerClient);

                if (args.Contains("-collateralvote"))
                {
                    await service.RunAsync(VoteType.CollateralVote, startBlock);
                }

                if (args.Contains("-swapvote"))
                {
                    await service.RunAsync(VoteType.SwapVote, startBlock);
                }
            }
        }
示例#3
0
        public void StraxConsensusRulesRegistrationTest()
        {
            Network network = new StraxTest();
            //new FullNodeBuilderConsensusExtension.PosConsensusRulesRegistration().RegisterRules(network.Consensus);

            List <Type> headerValidationRules = network.Consensus.ConsensusRules.HeaderValidationRules;

            headerValidationRules.Count.Should().Be(7);
            headerValidationRules[0].FullName.Should().Be(typeof(HeaderTimeChecksRule).FullName);
            headerValidationRules[1].FullName.Should().Be(typeof(HeaderTimeChecksPosRule).FullName);
            headerValidationRules[2].FullName.Should().Be(typeof(PosFutureDriftRule).FullName);
            headerValidationRules[3].FullName.Should().Be(typeof(CheckDifficultyPosRule).FullName);
            headerValidationRules[4].FullName.Should().Be(typeof(StratisHeaderVersionRule).FullName);
            headerValidationRules[5].FullName.Should().Be(typeof(ProvenHeaderSizeRule).FullName);
            headerValidationRules[6].FullName.Should().Be(typeof(ProvenHeaderCoinstakeRule).FullName);

            List <Type> integrityValidationRules = network.Consensus.ConsensusRules.IntegrityValidationRules;

            integrityValidationRules.Count.Should().Be(3);
            integrityValidationRules[0].FullName.Should().Be(typeof(BlockMerkleRootRule).FullName);
            integrityValidationRules[1].FullName.Should().Be(typeof(PosBlockSignatureRepresentationRule).FullName);
            integrityValidationRules[2].FullName.Should().Be(typeof(PosBlockSignatureRule).FullName);

            List <Type> partialValidationRules = network.Consensus.ConsensusRules.PartialValidationRules;

            partialValidationRules.Count.Should().Be(11);

            partialValidationRules[0].FullName.Should().Be(typeof(SetActivationDeploymentsPartialValidationRule).FullName);
            partialValidationRules[1].FullName.Should().Be(typeof(PosTimeMaskRule).FullName);
            partialValidationRules[2].FullName.Should().Be(typeof(TransactionLocktimeActivationRule).FullName);
            partialValidationRules[3].FullName.Should().Be(typeof(CoinbaseHeightActivationRule).FullName);
            partialValidationRules[4].FullName.Should().Be(typeof(WitnessCommitmentsRule).FullName);
            partialValidationRules[5].FullName.Should().Be(typeof(BlockSizeRule).FullName);
            partialValidationRules[6].FullName.Should().Be(typeof(EnsureCoinbaseRule).FullName);
            partialValidationRules[7].FullName.Should().Be(typeof(CheckPowTransactionRule).FullName);
            partialValidationRules[8].FullName.Should().Be(typeof(CheckPosTransactionRule).FullName);
            partialValidationRules[9].FullName.Should().Be(typeof(CheckSigOpsRule).FullName);
            partialValidationRules[10].FullName.Should().Be(typeof(StraxCoinstakeRule).FullName);

            List <Type> fullValidationRules = network.Consensus.ConsensusRules.FullValidationRules;

            fullValidationRules.Count.Should().Be(7);

            fullValidationRules[0].FullName.Should().Be(typeof(SetActivationDeploymentsFullValidationRule).FullName);
            fullValidationRules[1].FullName.Should().Be(typeof(CheckDifficultyHybridRule).FullName);
            fullValidationRules[2].FullName.Should().Be(typeof(LoadCoinviewRule).FullName);
            fullValidationRules[3].FullName.Should().Be(typeof(TransactionDuplicationActivationRule).FullName);
            fullValidationRules[4].FullName.Should().Be(typeof(StraxCoinviewRule).FullName);
            fullValidationRules[5].FullName.Should().Be(typeof(StraxColdStakingRule).FullName);
            fullValidationRules[6].FullName.Should().Be(typeof(SaveCoinviewRule).FullName);
        }
        public MaturedBlocksSyncManagerTests()
        {
            this.network = new StraxTest();

            this.asyncProvider           = Substitute.For <IAsyncProvider>();
            this.chainIndexer            = new ChainIndexer(this.network);
            this.crossChainTransferStore = Substitute.For <ICrossChainTransferStore>();
            this.federationGatewayClient = Substitute.For <IFederationGatewayClient>();

            this.federationWalletManager = Substitute.For <IFederationWalletManager>();
            this.federationWalletManager.WalletTipHeight.Returns(0);

            this.initialBlockDownloadState = Substitute.For <IInitialBlockDownloadState>();
            this.initialBlockDownloadState.IsInitialBlockDownload().Returns(false);

            this.syncManager = new TestOnlyMaturedBlocksSyncManager(this.asyncProvider, this.chainIndexer, this.crossChainTransferStore, this.federationGatewayClient, this.federationWalletManager, this.initialBlockDownloadState, new NodeLifetime());
        }
示例#5
0
        static async Task Main(string[] args)
        {
            int     stratisNetworkApiPort;
            int     startBlock = 0;
            Network straxNetwork;

            if (args.Contains("-testnet"))
            {
                startBlock = 1_450_000;

                stratisNetworkApiPort = 38221;
                straxNetwork          = new StraxTest();
            }
            else
            {
                startBlock = 1_949_800;

                stratisNetworkApiPort = 37221;
                straxNetwork          = new StraxMain();
            }

            var service = new SwapExtractionService(stratisNetworkApiPort, straxNetwork);

            var arg = args.FirstOrDefault(a => a.StartsWith("-startfrom"));

            if (arg != null)
            {
                int.TryParse(arg.Split('=')[1], out startBlock);
            }

            if (args.Contains("-swap"))
            {
                await service.RunAsync(ExtractionType.Swap, startBlock);
            }

            if (args.Contains("-vote"))
            {
                await service.RunAsync(ExtractionType.Vote, startBlock);
            }
        }