Esempio n. 1
0
        public async Task Create_NoWhitelist_Mempool_Rejects()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Create a valid transaction.
                byte[] toSend      = ContractCompiler.CompileFile("SmartContracts/StorageDemo.cs").Compilation;
                var    buildResult = node1.BuildCreateContractTransaction(toSend, 0);

                Transaction tx = node1.CoreNode.FullNode.Network.CreateTransaction(buildResult.Hex);

                var broadcasterManager = node1.CoreNode.FullNode.NodeService <IBroadcasterManager>();

                await broadcasterManager.BroadcastTransactionAsync(tx);

                // Give it enough time to reach if it was valid.
                Thread.Sleep(3000);

                // Nothing arrives.
                Assert.Empty(node1.CoreNode.CreateRPCClient().GetRawMempool());

                // If we were to whitelist it later, the mempool increases.
                chain.WhitelistCode(toSend);

                await broadcasterManager.BroadcastTransactionAsync(tx);

                node1.WaitMempoolCount(1);
            }
        }
Esempio n. 2
0
 public ContractExecutionFailureTests(PoAMockChainFixture fixture)
 {
     this.mockChain        = fixture.Chain;
     this.node1            = this.mockChain.Nodes[0];
     this.node2            = this.mockChain.Nodes[1];
     this.addressGenerator = new AddressGenerator();
     this.senderRetriever  = new SenderRetriever();
 }
        public ContractInternalTransferTests(PoAMockChainFixture fixture)
        {
            this.mockChain = fixture.Chain;
            this.node1     = this.mockChain.Nodes[0];
            this.node2     = this.mockChain.Nodes[1];

            this.addressGenerator = new AddressGenerator();
            this.senderRetriever  = new SenderRetriever();
        }
Esempio n. 4
0
        public TestChain()
        {
            var network = new SmartContractsPoARegTest();

            this.network         = network;
            this.builder         = SmartContractNodeBuilder.Create(this);
            this.nodeFactory     = (nodeIndex) => this.builder.CreateSmartContractPoANode(network, nodeIndex).Start();
            this.chain           = new PoAMockChain(2, nodeFactory, SharedWalletMnemonic);
            this.paramSerializer = new MethodParameterStringSerializer(network); // TODO: Inject
        }
        public void Create_InvalidSignature_Fails()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Sign file with incorrect key.
                byte[] toSend = new CSharpContractSigner(new ContractSigner()).PackageSignedCSharpFile(new Key(), "SmartContracts/StorageDemo.cs");

                // Try to send create but ensure it fails because code is signed by different key.
                BuildCreateContractTransactionResponse sendResponse = node1.SendCreateContractTransaction(toSend, 30);
                Assert.False(sendResponse.Success);
            }
        }
        public void Create_NoSignature_Fails()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Compile file
                byte[] contractBytes = ContractCompiler.CompileFile("SmartContracts/Auction.cs").Compilation;

                // Try to send create but ensure it fails because code is in incorrect format.
                BuildCreateContractTransactionResponse sendResponse = node1.SendCreateContractTransaction(contractBytes, 30);
                Assert.False(sendResponse.Success);
            }
        }
Esempio n. 7
0
        public async Task RPC_GetReceipt_Returns_ValueAsync()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];

                // Get premine
                this.SetupNodes(chain, node1, node2);

                // Create a valid transaction.
                byte[] toSend = ContractCompiler.CompileFile("SmartContracts/StandardToken.cs").Compilation;

                var createParams = new[] { this.methodParameterStringSerializer.Serialize(10000uL) };
                BuildCreateContractTransactionResponse createResponse = node1.SendCreateContractTransaction(toSend, 0, createParams);
                node2.WaitMempoolCount(1);

                chain.MineBlocks(1);

                // Check for the receipt.
                RPCClient rpc    = node2.CoreNode.CreateRPCClient();
                var       result = await rpc.SendCommandAsync("getreceipt", createResponse.TransactionId.ToString());

                Assert.True(result.Result.Value <bool>("success"));

                // Send a token.
                var parameters = new string[]
                {
                    this.methodParameterStringSerializer.Serialize(node1.MinerAddress.Address.ToAddress(node1.CoreNode.FullNode.Network)),
                    this.methodParameterStringSerializer.Serialize(1uL)
                };

                BuildCallContractTransactionResponse callResponse = node1.SendCallContractTransaction("TransferTo", createResponse.NewContractAddress, 0, parameters);

                node2.WaitMempoolCount(1);

                chain.MineBlocks(1);

                result = await rpc.SendCommandAsync("searchreceipts", createResponse.NewContractAddress, "TransferLog");

                Assert.True(result.Result.First.Value <bool>("success"));

                var logs = (JArray)result.Result.First["logs"];
                Assert.NotEmpty(logs);
            }
        }
        public void Create_Signed_Contract()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Compile file
                byte[] toSend = new CSharpContractSigner(new ContractSigner()).PackageSignedCSharpFile(this.network.SigningContractPrivKey, "SmartContracts/StorageDemo.cs");

                // Send create with value, and ensure balance is stored.
                BuildCreateContractTransactionResponse sendResponse = node1.SendCreateContractTransaction(toSend, 30);
                node1.WaitMempoolCount(1);
                chain.MineBlocks(1);

                // Check the balance exists at contract location.
                Assert.Equal((ulong)30 * 100_000_000, node1.GetContractBalance(sendResponse.NewContractAddress));
            }
        }
        public async Task Create_InvalidSignature_Mempool_Rejects()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Create a valid transaction.
                byte[] toSend      = new CSharpContractSigner(new ContractSigner()).PackageSignedCSharpFile(this.network.SigningContractPrivKey, "SmartContracts/StorageDemo.cs");
                var    buildResult = node1.BuildCreateContractTransaction(toSend, 0);

                // Replace the SC output ScriptPubKey with an invalid one.
                Transaction tx    = node1.CoreNode.FullNode.Network.CreateTransaction(buildResult.Hex);
                TxOut       txOut = tx.TryGetSmartContractTxOut();
                byte[]      incorrectlySignedBytes = new CSharpContractSigner(new ContractSigner()).PackageSignedCSharpFile(new Key(), "SmartContracts/StorageDemo.cs");
                var         serializer             = new CallDataSerializer(new ContractPrimitiveSerializer(this.network));
                byte[]      newScript = serializer.Serialize(new ContractTxData(1, SmartContractFormatLogic.GasLimitMaximum, (Gas)SmartContractMempoolValidator.MinGasPrice, incorrectlySignedBytes));
                txOut.ScriptPubKey = new Script(newScript);

                var broadcasterManager = node1.CoreNode.FullNode.NodeService <IBroadcasterManager>();
                // Try and broadcast invalid tx.
                await broadcasterManager.BroadcastTransactionAsync(tx);

                // Give it enough time to reach if it was valid.
                Thread.Sleep(3000);

                // Nothing arrives.
                Assert.Empty(node1.CoreNode.CreateRPCClient().GetRawMempool());

                // If we were to send a valid one the mempool increases.
                buildResult = node1.BuildCreateContractTransaction(toSend, 0);
                tx          = node1.CoreNode.FullNode.Network.CreateTransaction(buildResult.Hex);
                await broadcasterManager.BroadcastTransactionAsync(tx);

                node1.WaitMempoolCount(1);
            }
        }
Esempio n. 10
0
        public void Create_Whitelisted_Contract()
        {
            using (var chain = new PoAMockChain(2, this.nodeFactory).Build())
            {
                MockChainNode node1 = chain.Nodes[0];
                MockChainNode node2 = chain.Nodes[1];
                this.SetupNodes(chain, node1, node2);

                // Compile file
                byte[] toSend = ContractCompiler.CompileFile("SmartContracts/StorageDemo.cs").Compilation;

                // Add the hash to all the nodes on the chain.
                chain.WhitelistCode(toSend);

                // Send create with value, and ensure balance is stored.
                BuildCreateContractTransactionResponse sendResponse = node1.SendCreateContractTransaction(toSend, 30);
                node1.WaitMempoolCount(1);
                chain.MineBlocks(1);

                // Check the balance exists at contract location.
                Assert.Equal((ulong)30 * 100_000_000, node1.GetContractBalance(sendResponse.NewContractAddress));
            }
        }
Esempio n. 11
0
 public TestChain()
 {
     this.chain           = new PoAMockChain(2, SharedWalletMnemonic);
     this.paramSerializer = new MethodParameterStringSerializer(new SmartContractsPoARegTest()); // TODO: Inject
 }