In the realm of software development, Infuy has carved a niche for itself as a ’boutique’ firm providing tailored solutions to its global clientele. Infuy’s service philosophy leans towards customizability, detail orientation, and personalized client engagement, and nowhere does this shine more brightly than in its blockchain solutions.
A boutique software firm like Infuy presents a unique value proposition, especially in the burgeoning field of blockchain technology. The term ’boutique’ symbolizes exclusivity, craftsmanship, and specialization, resonating well with the demands of blockchain projects that require a high degree of technical competence, understanding of the client’s specific needs, and innovation. Hardhat and Truffle are two of the dominant development environments for projects that interact with blockchains based on the Ethereum Virtual Machine (EVM). Thus, it is important to have an overview of how they differ on certain aspects in order to be able to choose the most suitable one for each project of interest.
At first glance, it seems that they offer the same functionalities—editing, compiling, testing and deploying—and that both have clear and organized documentation. However, we can go deeper on how each development environment tackles each functionality.
Smart Contracts interaction
The first point to compare is the interaction with smart contracts.
Truffle defaults to utilizing the web3.js library, which is injected as a global dependency and provides built-in contract abstractions. However, it only supports providers (abstractions which are used to connect to the network) created via web3.js. While there is ongoing work to support ethers.js, the main thing that can be done in this regard is having developers install ethers.js and use it a dependency for Truffle tests.
On the other hand, Hardhat has ethers.js as the default library for interacting with smart contracts, it is available in the global scope, and has the possibility of using web3.js through a plugin.
However, comparing this smart contracts interaction aspect based on which library is leveraged by which environment would end up in comparing ethers.js and web3.js, which is not the aim of this article.
Local Ethereum Networks and Forking
Hardhat comes built-in with a local ethereum network named Hardhat Network and Truffle comes with one named Ganache.
Both can be run as an in-process or as a stand-alone daemon, enabling external clients to connect to it (metamask, dapp front-end, etc). Ganache has the convenience of having, besides the CLI, a graphical user interface (Ganache UI) which can be useful for a more visual experience for beginners. Truffle has the downside that Ganache needs to be installed in order to be run as a stand-alone process, while Hardhat does not require any extra installation to run Hardhat Network as a standalone daemon.
Hardhat and Truffle allow configuration of block mining intervals and support Ethereum network forking and account impersonation.
Nonetheless, Hardhat has an easier way of forking than truffle. Truffle requires the installation of Ganache and only allows forking through Ganache-CLI by executing the appropriate command (taking Alchemy as a node provider in this example):
ganache-cli --fork https://eth-rinkeby.alchemyapi.io/v2/
and then configuring the network on
truffle-config.js like this:
On Hardhat, developers do not need to go through any installation process and can create a blockchain fork by starting a node from the command line with:
npx hardhat node --fork https://eth-mainnet.alchemyapi.io/v2/
Once the hardhat network is booted, it will connect to that fork without the need to change any configuration.
The other way a fork can be achieved is by configuring hardhat network to always fork from mainnet:
In this case, starting the default hardhat network will use the specified fork. Additional parameters can be added, such as starting block number for the fork.
Hardhat enables developers to write their own scripts for deployment, giving them more flexibility in the processes.
Truffle’s fixed way of deploying contracts through what are called migration files compromises developers’ freedom of choice, as they specify how contracts need to be written and named. The process in general can result arguably convoluted, particularly for people unfamiliar with it.
Tools for dealing with errors is an important aspect to focus on when comparing both development environments.
Hardhat Network allows printing messages and contract variables through
console.log from the solidity code and it only requires importing
hardhat/console.sol to use it.
Truffle does not have native
console.log support (currently, it is reportedly in progress), but the
console.log feature can be used by installing Ganache’s console.log library and importing
@ganache/console.log/console.sol on the solidity file of interest.
Whenever a transaction fails, Hardhat will throw an exception containing a Solidity stack trace (which includes a complete Solidity call stack), enabling the developer to know exactly why tests or transactions are failing. Truffle does not display the actual stack trace, and only shows the error message. The development team plans to add the feature of displaying the stack trace in the future.
Hardhat Network also offers logging functionality that facilitates development and debugging of smart contracts. This functionality is enabled by default when running Hardhat networks node (through
npx hardhat node) and is disabled when using hardhat network in-process. Furthermore, Hardhdat Network has the ability of creating automatic error messages for transactions which fails without a reason.
Something to highlight about Truffle is that it includes a debugger with step-in/out, breakpoints, variables inspection, etc which can be used to debug specific transactions (through
truffle debug ) or inside tests files to debug specific operations by capturing the contract operation in question with debug() and running
truffle test --debug.
Hardhat is much more flexible than Truffle due to the existence of plugins, which enable developers to have a more customizable environment.
Hardhat plugins aim to extend Hardhat Runtime environment with more tasks or by modifying existing ones. There is a wide offer of plugins that tackles different needs and each developer can also make their own plugins; more on this can be found here. Theres is quite a bit of movement and activity in this regards.
Truffle plugin support is in early stages, but they have what’s called “Truffle Boxes”. These boxes are boilerplates which contain modules, contracts, libraries (and more) and can also be created by each developer based on their own needs. However, it has an important drawback which is that boxes need to be used as a whole; it is not possible to use part of one box and this makes it considerably more complex than using plugins on hardhat.
Several parameters have been laid out in order for each developer to be able to decide if Hardhat or Truffle is the best-suited environment for them. Nevertheless, besides from researching both options, developers should also try them out in order to find which one they feel more comfortable with and determine the best fit for their needs.
The Infuy Advantage
What sets Infuy apart in the realm of blockchain technology is its ’boutique’ approach to software development. Each project is treated as unique, and solutions are designed with an acute understanding of the client’s specific needs. The team at Infuy is dedicated to maintaining a strong client relationship, ensuring constant communication, and delivering high-quality, custom solutions on time.
As a boutique firm, Infuy leverages agility and flexibility, quickly adapting to new requirements or changes, a crucial advantage in the ever-evolving blockchain space. The company’s size also facilitates a more intimate understanding of the client’s needs, leading to superior end products.