Smart contract development, more so than most web2 development, requires thorough testing and careful deployment.
Because smart contracts are immutable and often involve large sums of money, it’s very important to do all you can to be sure they are secure, reliable, and as free from bugs as possible.
Two important tools for achieving these goals are the same tools most web3 devs use for their day-to-day work—Truffle and Infura.
These tools give you what you need to write, test, debug, and deploy your smart contracts.
In this article, we’ll walk you through a step-by-step guide on how Truffle and Infura can be utilized to debug and deploy smart contracts on Ethereum.
We’ll begin by establishing a development environment and creating a basic smart contract using Solidity.
Next, we’ll conduct debugging of the contract, followed by deployment using Infura, and ultimately debugging on the blockchain.
Finally, we will provide some recommendations for writing resilient and secure smart contracts. Let's get started!
Our first step is to establish a basic smart contract development setup using Truffle and Infura.
However, it is important to note that this is not a comprehensive guide for setting up the environment, as there are already numerous tutorials available for this purpose.
If you need a little background on smart contracts, blockchain, Ethereum, etc., then check out my previous article: Learn To Become a Web3 Developer by Exploring the Web3 Stack.
Prerequisites
Node.js: Make sure you have Node.js installed on your system. You can download and install the latest version from the official website.
Truffle: Truffle is a suite of development tools for smart contract development. It gives you the tools you need to manage your workflow, test, deploy, run local blockchains, and more.
You can install it globally using npm, the Node.js package manager. Run the following command in your terminal:
Infura: Infura is a set of blockchain APIs that provides a simple and reliable way to connect to the Ethereum (and others) network without running a full node. It’s the industry standard way to access blockchains etc.
You'll need to create an account on the Infura website and obtain an API key to use their services.
Once you've installed Node.js and Truffle, you're ready to create a new Truffle project. Simply run the following command in your terminal to create a new project:
This command will create a basic Truffle project with everything you need to get started on a new project.
The contracts/ folder is where we'll write our smart contract, while the migrations/ folder is where we'll write migration scripts to deploy our contract to the blockchain.
Next, we need to configure Truffle to use our local blockchain simulator. Open the truffle-config.js file, and modify the development network to point to Ganache.
Ganache allows you to fire up a personal instance of Ethereum for local development and testing. Here's an example configuration:
mod
ule.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
}
}
};
Now that we have set up the development environment, let's start by writing a simple Ethereum smart contract using Solidity. Smart contract development is a big topic!
For an intro, check out this 10-minute orientation. For the purpose of this tutorial, we’ll keep it super simple and create a contract that simply allows users to store and retrieve a string value.
// SimpleStorage.sol
pragma solidity ^0.8.0;
contract SimpleStorage {
string private value;
function setValue(string memory _value) public {
value = _value;
}
function getValue() public view returns (string memory) {
return value;
}
}
Save the source code above into a file named SimpleStorage.sol.
The Truffle Debugger offers two ways to work with this code in your local environment. These are in-test debugging and read-only debugging calls.
In-test debugging works within tests and is quite simple. You just wrap the line of interest in a debug statement like this.
it("should get latest result", async function() {
const result = await debug( SimpleStorage.getValue() );
});
When you run your tests, add a debug flag, and see the magic happen.
This will pause the tests at the designated debug line, and then launch the debugger's CLI interface, which allows you to step through code, inspect variables, and set breakpoints.
Another way to access the Truffle Debugger is through read-only debugging calls. This method is preferred by many developers because it uses a transaction hash to access the debugger.
With read-only debugging, developers can debug a transaction that has already been executed on the blockchain, making it a more practical method for debugging.
This will open the Truffle Debugger in the terminal, and then allow you to step. For an exhaustive list of options available in debug mode, check out the documentation.
Once you've written and tested your smart contract locally, it's time to deploy it. While it’s possible to deploy a contract using your own node, this can be time-consuming and resource-intensive.
An alternative approach is to use a remote node like Infura.
Infura is a node provider that gives you a simple and reliable way to deploy smart contracts to various layer 1 blockchain networks. To use Infura for contract deployment, you'll need to sign up for an account and create a new project (which you probably did above).
Once you've done that, you'll be able to access your project's API endpoint, which you'll need to use to interact with the blockchain network. This tutorial offers a step-by-step guide if you need help with this.
To deploy our smart contract to the Ethereum network, we'll need to connect to Infura using our API key.
Open the truffle-config.js file again, and add the following configuration for the Sepolia network. (Replace <PROJECT_ID> with your Infura project ID.):
const HDWalletProvider = require("@truffle/hdwallet-provider");
const infuraProjectId = "<PROJECT_ID>";
const mnemonic = "your mnemonic goes here";
module.exports = {
networks: {
development: {
// ...
},
sepolia: {
provider: () => new HDWalletProvider(mnemonic, `https://sepolia.infura.io/v3/${infuraProjectId}`),
network_id: 11155111,
gas: 4000000
}
}
};
Note that we're using the @truffle/hdwallet-provider package to connect to Infura with our mnemonic. You can replace Sepolia with the name of the Ethereum network you want to deploy to.
truffle migrate --network sepolia
We’re using a test Ethereum network here because there is a cost (gas fee) associated with deploying smart contracts. To pay this fee, you need ETH.
On the Ethereum mainnet, you have to buy ETH—and the expenses can add up quickly. But on the test networks, there are faucets where you can get test ETH for free.
While debugging smart contracts locally will be the most common task, there may be occasions when you need to debug a contract that has already been deployed for some reason.
Fortunately, the Truffle Debugger can accommodate this scenario as well. The added benefit is that it doesn't necessarily have to be your own contract as long as it has been verified on the blockchain.
To debug a smart contract on a deployed chain, you can use the Truffle Debugger and Infura just as you did for local debugging. The only difference is that you'll need to specify the network to connect to.
Here's an example of how to do it:
In this example, we're connecting to the Sepolia testnet using the --network flag and specifying the transaction hash of the contract we want to debug.
Once connected, you can use the same debugging techniques as you did for local debugging, such as stepping through code, inspecting variables, and setting breakpoints.
Just keep in mind that network conditions may be different than your local machine, so be sure to thoroughly test your smart contract before deploying to an online chain.
If you are still not feeling confident enough, you can take a look at this nice video tutorial.
As you continue to develop and deploy smart contracts, here are some basic best practices to ensure your code is reliable and secure.
Most of these are best practices for any type of coding—so be sure to keep them in mind:
To dive in further, check out these best practices more specific to smart contracts
We explored the benefits of using the Truffle Debugger and Infura in tandem to enhance the security and reliability of smart contracts.
We have also seen how to deploy smart contracts on an EVM-based network using Infura, and then how to debug them on a deployed chain.
This is just the beginning! Once you are familiar with these tools, you’re ready to start exploring smart contracts and blockchain development. Have fun!
First published here
Photo by Fotis Fotopoulos on Unsplash