Lesson 13 of 21
In Progress

Migrations and Deployment Management

As a blockchain developer, you’ll often need to deploy and manage multiple contracts on the Ethereum blockchain. This can be a time-consuming and error-prone process, especially if you need to deploy contracts in a specific order or if you need to update existing contracts.

To streamline the deployment process, you can use migrations and deployment management tools, such as Hardhat’s @hardhat/migrations module. In this article, we’ll provide a guide for using migrations and deployment management to deploy and update contracts on the Ethereum blockchain.

Prerequisites

Before you begin, you’ll need to install and set up Hardhat. To install Hardhat, you’ll need Node.js and npm. To set up Hardhat, you’ll need to create a hardhat.config.js file in the root directory of your project.

Migrations

A migration is a script that deploys or updates contracts on the Ethereum blockchain. Migrations are typically used to deploy contracts in a specific order or to update existing contracts.

To use migrations, you’ll need to install the @hardhat/migrations module and create a migrations directory in the root directory of your project. You’ll also need to create a 2_deploy_contracts.js file in the migrations directory.

The 2_deploy_contracts.js file should export a migrate function that takes a deployer object as an argument. The deployer object provides methods for deploying and updating contracts.

To deploy a contract, you can use the deploy method of the deployer object. For example, to deploy a contract called MyContract, you can use the following code:

const MyContract = artifacts.require("MyContract");

async function migrate(deployer) {
  await deployer.deploy(MyContract);
}

module.exports = migrate;

To update an existing contract, you can use the link method of the deployer object. For example, to update a contract called MyLibrary with a new version, you can use the following code:

const MyLibrary = artifacts.require("MyLibrary");

async function migrate(deployer) {
  await deployer.link(MyLibrary, "0x123");
}

module.exports = migrate;

To deploy or update contracts in a specific order, you can use the then method of the deployer object. For example, to deploy a contract called MyContract after a contract called MyLibrary, you can use the following code:

const MyContract = artifacts.require("MyContract");
const MyLibrary = artifacts.require("MyLibrary");

async function migrate(deployer) {
  await deployer.deploy(MyLibrary).then(() => {
    return deployer.deploy(MyContract, MyLibrary.address);
  });
}

module.exports = migrate;

Deployment Management

To deploy or update contracts using migrations, you can use the `hardhat run` command. For example, to deploy or update all contracts in the `migrations` directory, you can use the following command:

hardhat run migrate

To deploy or update a specific contract, you can use the --migration option of the hardhat run command. For example, to deploy or update the MyContract contract, you can use the following command:

hardhat run migrate --migration 2_deploy_contracts.js

Deployment Strategies

To deploy or update contracts on the Ethereum blockchain, you’ll need to choose a deployment strategy. A deployment strategy is a set of rules that determine how contracts are deployed or updated.

Hardhat supports several deployment strategies, including the following:

  • deployIfDifferent: Deploys a contract if it is different from the existing contract.
  • reupload: Deploys a contract regardless of whether it is different from the existing contract.
  • link: Links a contract to an existing contract.

To specify a deployment strategy, you can use the strategy option of the deployer object. For example, to use the link deployment strategy, you can use the following code:

const MyContract = artifacts.require("MyContract");

async function migrate(deployer) {
  await deployer.deploy(MyContract, { strategy: "link" });
}

module.exports = migrate;

Conclusion

In this article, we provided a guide for using migrations and deployment management to deploy and update contracts on the Ethereum blockchain. By following these steps and using deployment strategies, you can streamline the deployment process and ensure that your contracts are deployed and updated correctly.

Migrations and deployment management are essential tools for any blockchain developer, and they can save you time and reduce the risk of errors when deploying and updating contracts. With the right tools and strategies in place, you can focus on building great blockchain applications, rather than worrying about deployment issues.

Exercises

To review these concepts, we will go through a series of exercises designed to test your understanding and apply what you have learned.

Create a migration that deploys a contract called MyContract and a contract called MyLibrary. The MyContract contract should depend on the MyLibrary contract, and it should be deployed after the MyLibrary contract.

const MyContract = artifacts.require("MyContract");
const MyLibrary = artifacts.require("MyLibrary");

async function migrate(deployer) {
  await deployer.deploy(MyLibrary).then(() => {
    return deployer.deploy(MyContract, MyLibrary.address);
  });
}

module.exports = migrate;

Create a migration that updates the MyLibrary contract with a new version.

const MyLibrary = artifacts.require("MyLibrary");

async function migrate(deployer) {
  await deployer.link(MyLibrary, "0x123");
}

module.exports = migrate;

Use the hardhat run command to deploy or update all contracts in the migrations directory.

hardhat run migrate

Use the hardhat run command to deploy or update the MyContract contract.

hardhat run migrate --migration 2_deploy_contracts.js

Create a migration that deploys a contract called MyContract using the link deployment strategy.

const MyContract = artifacts.require("MyContract");

async function migrate(deployer) {
  await deployer.deploy(MyContract, { strategy: "link" });
}

module.exports = migrate;