public async Task TransactionSentFeesReceivedByMinerAsync() { TestPoANetwork network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { string walletName = "mywallet"; string walletPassword = "******"; string walletAccount = "account 0"; Money transferAmount = Money.Coins(1m); Money feeAmount = Money.Coins(0.0001m); CoreNode nodeA = builder.CreatePoANode(network, network.FederationKey1).WithWallet(walletPassword, walletName).Start(); CoreNode nodeB = builder.CreatePoANode(network, 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); // Will send funds to one of nodeB's addresses. Script destination = nodeB.FullNode.WalletManager().GetUnusedAddress().ScriptPubKey; var context = new TransactionBuildContext(network) { AccountReference = new WalletAccountReference(walletName, walletAccount), MinConfirmations = 0, FeeType = FeeType.High, WalletPassword = walletPassword, Recipients = new[] { new Recipient { Amount = transferAmount, ScriptPubKey = destination } }.ToList() }; Transaction trx = nodeA.FullNode.WalletTransactionHandler().BuildTransaction(context); 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>(); long balance = walletManager.GetBalances(walletName, walletAccount).Sum(x => x.AmountConfirmed); Assert.True(balance == transferAmount + feeAmount); } }
public async Task PremineIsReceivedAsync() { TestPoANetwork network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { string walletName = "mywallet"; CoreNode node = builder.CreatePoANode(network, network.FederationKey1).WithWallet("pass", walletName).Start(); IWalletManager walletManager = node.FullNode.NodeService <IWalletManager>(); long balanceOnStart = walletManager.GetBalances(walletName, "account 0").Sum(x => x.AmountConfirmed); Assert.Equal(0, balanceOnStart); long toMineCount = network.Consensus.PremineHeight + network.Consensus.CoinbaseMaturity + 1 - node.GetTip().Height; await node.MineBlocksAsync((int)toMineCount).ConfigureAwait(false); TestBase.WaitLoop(() => { long balanceAfterPremine = walletManager.GetBalances(walletName, "account 0").Sum(x => x.AmountConfirmed); return(network.Consensus.PremineReward.Satoshi == balanceAfterPremine); }); } }
public async Task HeaderInFutureIsntAcceptedButNoBan() { // Create 2 nodes from 2 different builders, so they have different internal times. var network = new TestPoANetwork(); PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this); PoANodeBuilder builder2 = PoANodeBuilder.CreatePoANodeBuilder(this); CoreNode node1 = builder.CreatePoANode(network, network.FederationKey1).Start(); CoreNode node2 = builder2.CreatePoANode(network, network.FederationKey2).Start(); // They can connect, they agree on genesis. TestHelper.Connect(node1, node2); // When one mines a block, his time will be pushed forwards by multiple TargetSpacings. await node1.MineBlocksAsync(1); long dateTime1 = node1.FullNode.NodeService <IDateTimeProvider>().GetAdjustedTimeAsUnixTimestamp(); long dateTime2 = node2.FullNode.NodeService <IDateTimeProvider>().GetAdjustedTimeAsUnixTimestamp(); Assert.True(dateTime1 > dateTime2 + network.ConsensusOptions.TargetSpacingSeconds); // Give the other node plenty of time such that he should have also synced if he thought the block was valid. Thread.Sleep(3000); // But he didn't sync - header was too far ahead. Assert.Equal(0, node2.FullNode.ChainIndexer.Height); // However the other node isn't disconnected or banned. Assert.True(node2.FullNode.ConnectionManager.ConnectedPeers.Any()); }
public void NodeCanLoadFederationKey() { var network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { // Create first node as fed member. Key key = network.FederationKey1; CoreNode node = builder.CreatePoANode(network, key).Start(); Assert.True(node.FullNode.NodeService <IFederationManager>().IsFederationMember); Assert.Equal(node.FullNode.NodeService <IFederationManager>().CurrentFederationKey, key); // Create second node as normal node. CoreNode node2 = builder.CreatePoANode(network).Start(); Assert.False(node2.FullNode.NodeService <IFederationManager>().IsFederationMember); Assert.Equal(node2.FullNode.NodeService <IFederationManager>().CurrentFederationKey, null); } }
public void NodeCanMine() { var network = (CirrusRegTest)CirrusNetwork.NetworksSelector.Regtest(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { CoreNode node0 = builder.CreatePoANode(network, network.FederationKeys[0]).Start(); CoreNode node1 = builder.CreatePoANode(network, network.FederationKeys[1]).Start(); // node0.EnableFastMining(); Old method // node1.EnableFastMining(); Old method int tipBefore = node0.GetTip().Height; TestBase.WaitLoop( () => { return(node0.GetTip().Height >= tipBefore + 5); } ); } }
public void NodeCanMine() { var network = (FederatedPegRegTest)FederatedPegNetwork.NetworksSelector.Regtest(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { CoreNode node0 = builder.CreatePoANode(network, network.FederationKeys[0]).Start(); CoreNode node1 = builder.CreatePoANode(network, network.FederationKeys[1]).Start(); node0.EnableFastMining(); node1.EnableFastMining(); var tipBefore = node0.GetTip().Height; TestHelper.WaitLoop( () => { return(node0.GetTip().Height >= tipBefore + 5); } ); } }
public void NodeCanMine() { var network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { CoreNode node = builder.CreatePoANode(network, network.FederationKey1).Start(); node.EnableFastMining(); var tipBefore = node.GetTip().Height; TestHelper.WaitLoop(() => node.GetTip().Height >= tipBefore + 5); } }
public void NodeCanLoadFederationKey() { var network = (CirrusRegTest)CirrusNetwork.NetworksSelector.Regtest(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { // Create first node as fed member. Key key = network.FederationKeys[0]; CoreNode node = builder.CreatePoANode(network, key).Start(); Assert.True(node.FullNode.NodeService <IFederationManager>().IsFederationMember); Assert.Equal(node.FullNode.NodeService <IFederationManager>().CurrentFederationKey, key); // Assert.True(node.FullNode.NodeService<IPoAMiner>().IsMining()); Old method // Create second node as normal node. CoreNode node2 = builder.CreatePoANode(network).Start(); Assert.False(node2.FullNode.NodeService <IFederationManager>().IsFederationMember); Assert.Equal(node2.FullNode.NodeService <IFederationManager>().CurrentFederationKey, null); // Assert.False(node2.FullNode.NodeService<IPoAMiner>().IsMining()); Old method } }
public async Task NodeCanMineAsync() { var network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { CoreNode node = builder.CreatePoANode(network, network.FederationKey1).Start(); int tipBefore = node.GetTip().Height; await node.MineBlocksAsync(5).ConfigureAwait(false); Assert.True(node.GetTip().Height >= tipBefore + 5); } }
public void PremineIsReceived() { TestPoANetwork network = new TestPoANetwork(); using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { string walletName = "mywallet"; CoreNode node = builder.CreatePoANode(network, network.FederationKey1).WithWallet("pass", walletName).Start(); node.EnableFastMining(); IWalletManager walletManager = node.FullNode.NodeService <IWalletManager>(); long balanceOnStart = walletManager.GetBalances(walletName, "account 0").Sum(x => x.AmountConfirmed); Assert.Equal(0, balanceOnStart); TestHelper.WaitLoop(() => node.GetTip().Height >= network.Consensus.PremineHeight + network.Consensus.CoinbaseMaturity + 1); long balanceAfterPremine = walletManager.GetBalances(walletName, "account 0").Sum(x => x.AmountConfirmed); Assert.Equal(network.Consensus.PremineReward.Satoshi, balanceAfterPremine); } }
public async Task EnableAutoKick() { using (PoANodeBuilder builder = PoANodeBuilder.CreatePoANodeBuilder(this)) { const int idleTimeSeconds = 5 * 60; // Have a network that mimics Cirrus where voting is on and kicking is off. var votingNetwork = new TestPoANetwork(); var oldOptions = (PoAConsensusOptions)votingNetwork.Consensus.Options; votingNetwork.Consensus.Options = new PoAConsensusOptions(maxBlockBaseSize: oldOptions.MaxBlockBaseSize, maxStandardVersion: oldOptions.MaxStandardVersion, maxStandardTxWeight: oldOptions.MaxStandardTxWeight, maxBlockSigopsCost: oldOptions.MaxBlockSigopsCost, maxStandardTxSigopsCost: oldOptions.MaxStandardTxSigopsCost, genesisFederationMembers: oldOptions.GenesisFederationMembers, targetSpacingSeconds: 60, votingEnabled: true, autoKickIdleMembers: false, federationMemberMaxIdleTimeSeconds: oldOptions.FederationMemberMaxIdleTimeSeconds); CoreNode node1 = builder.CreatePoANode(votingNetwork, votingNetwork.FederationKey1).Start(); CoreNode node2 = builder.CreatePoANode(votingNetwork, votingNetwork.FederationKey2).Start(); TestHelper.Connect(node1, node2); // Mine a block on this network from each node. Confirm it's alive. await node1.MineBlocksAsync(1); CoreNodePoAExtensions.WaitTillSynced(node1, node2); await node2.MineBlocksAsync(1); CoreNodePoAExtensions.WaitTillSynced(node1, node2); // Edit the consensus options so that kicking is turned on. votingNetwork.Consensus.Options = new PoAConsensusOptions(maxBlockBaseSize: oldOptions.MaxBlockBaseSize, maxStandardVersion: oldOptions.MaxStandardVersion, maxStandardTxWeight: oldOptions.MaxStandardTxWeight, maxBlockSigopsCost: oldOptions.MaxBlockSigopsCost, maxStandardTxSigopsCost: oldOptions.MaxStandardTxSigopsCost, genesisFederationMembers: oldOptions.GenesisFederationMembers, targetSpacingSeconds: 60, votingEnabled: true, autoKickIdleMembers: true, federationMemberMaxIdleTimeSeconds: idleTimeSeconds); node1.Restart(); // Lets get our 2 nodes to actively mine some blocks. // In doing so, their test datetimeprovider will increment by minutes at a time. for (int i = 0; i < 5; i++) { await node1.MineBlocksAsync(1); CoreNodePoAExtensions.WaitTillSynced(node1, node2); await node2.MineBlocksAsync(1); CoreNodePoAExtensions.WaitTillSynced(node1, node2); } // Enough time has passed - Check that our new node wants to vote the third fed member out, who has not mined at all. // Check that we have a single active poll to vote him out. var activePolls = node1.FullNode.NodeService <VotingManager>().GetPendingPolls(); Assert.Single(activePolls); Assert.Equal(VoteKey.KickFederationMember, activePolls[0].VotingData.Key); byte[] lastMemberBytes = (votingNetwork.Consensus.ConsensusFactory as PoAConsensusFactory).SerializeFederationMember(votingNetwork.ConsensusOptions.GenesisFederationMembers[2]); Assert.Equal(lastMemberBytes, activePolls[0].VotingData.Data); } }