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); } }
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(); }
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); } }
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); } }
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)); } }
public TestChain() { this.chain = new PoAMockChain(2, SharedWalletMnemonic); this.paramSerializer = new MethodParameterStringSerializer(new SmartContractsPoARegTest()); // TODO: Inject }