Testing Locally with TestChain¶
When developing smart contracts locally you will likely want to test execution on-chain via transactions, emulating how a contract will behave in practice.
For this purpose we have built an easy to use tool,
TestChain, which spawns a local development blockchain with near-identical parameters to the production Stratis smart contract blockchain, though you won’t have to wait for the lengthy block times.
The fastest way to get started is to jump into TestChainExample.cs in the Stratis.SmartContracts.IntegrationTests.TestChain namespace in the FullNode repository. This document will walk you through how this test works so you can get started on your own. You can run the test in Visual Studio by right clicking on
[Fact] and selecting “Run Test(s)”.
We expect TestChain will eventually become a standalone tool, but for now it is encapsulated as part of the core Stratis Full Node solution.
The first thing that we do inside the
TestChain_Auction method is to compile the contract we’re looking to test with the TestChain. This compiles the contract using Roslyn and if successful will return the contract’s bytecode in
// Compile the contract we want to deploy ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/Auction.cs"); Assert.True(compilationResult.Success);
When compiling your own smart contract file in a TestChain test, ensure that it is set to be copied to the output directory. You can do this in Visual Studio by right-clicking the file and selecting “Properties”, then setting “Copy to Output Directory” to “Copy if newer”.
The local blockchain can be started by calling
Initialize on a new instance of
TestChain. This will set up a new chain with very similar properties to the live Stratis smart contract chain. It also sets up 5 addresses with 100,000 test coins each. The following line inside the scope of the TestChain demonstrates how you can access these funded addresses:
- // Get an address we can use for deploying Base58Address deployerAddress = chain.PreloadedAddresses;