contract를 배포하는 방법으로 remix를 사용하기도 하고 truffle을 사용하기도 합니다. 다양한 방법이 있지만 개발 환경 설정, 테스트 지원, 배포 및 자동화, 개발자 경험 등 다양한 측면에서 hardhat이 강력한 이더리움 개발 도구로 꼽히고 있습니다. 안정적이고 효율적인 contract를 배포하기 위한 hardhat에 대하여 알아보도록 하겠습니다.
목차
hardhat이란?
hardhat 설치
개발 환경 설정
hardhat 실행
hardhat이란?
hardhat은 이더리움 및 스마트 컨트랙트 개발을 위한 개발 도구와 환경입니다. 스마트 컨트랙트를 개발, 배포, 테스트하기 위한 기능을 제공합니다. 주요 기능으로 스마트 컨트랙트 컴파일, 로컬 개발 네트워크, 스마트 컨트랙트 테스트, 배포 및 인증 등이 있습니다.
hardhat 설치
hardhat을 설치하기 위하여 npm 혹은 yarn을 사용합니다.
npm
npm install --save-dev hardhat
yarn
yarn add --dev hardhat
설치가 완료되면 hardhat을 사용하여 프로젝트를 생성합니다.
npx hardhat init
init을 하게 되면 위와 같이 terminal창에 뜹니다. js를 이용할 것인지 ts를 이용할 것인지 선택하여 진행하면 됩니다.
init이 완료된다면 아래와 같은 파일들을 받게 됩니다.
저는 ts로 init을 하여 ts로 설명드리겠습니다.
my-hardhat-project/
├── contracts/
│ └── SampleContract.sol
├── scripts/
│ └── sample-script.ts
├── test/
│ └── sample-test.ts
├── hardhat.config.ts
├── tsconfig.json
├── .gitignore
└── package.json
위의 파일들 중 몇 가지에 대하여 설명드리겠습니다.
contracts/ : 스마트 컨트랙트 파일을 포함하는 디렉토리입니다. 예시로 SampleContract.sol이 포한되어 있습니다.
scripts/ : 실행 가능한 스크립트 파일을 포함하는 디렉토리입니다. 예시로 sample-script.ts가 포함되어 있습니다. script에는 배포를 위한 내용이 들어갑니다.
test/ : 테스트 파일을 포함하는 디렉토리입니다. 예시로 sample-test.ts이 포함되어 있습니다. contract에 대한 test 코드가 작성됩니다.
hardhat.config.ts : Hardhat의 설정 파일입니다. hardhat.config.ts의 내용에 대해서는 개발 환경 설정 목차에서 다루도록 하겠습니다.
개발 환경 설정
개발 환경 설정은 hardhat.config.ts에서 진행합니다. 네트워크 구성, 컴파일러 설정, 플러그인 등 다양한 옵션을 지정할 수 있습니다. 주요 속성을 설명드린 후 예시를 보여드리겠습니다.
주요 속성 및 설정
defaultNetwork : 기본으로 사용할 네트워크를 설정합니다. network에 작성한 네트워크 이름과 같은 설정의 네트워크를 사용합니다.
networks : hardhat에서 사용할 네트워크에 대한 구성을 정의합니다.
solidity : solidity 컴파일러에 대한 구성을 제공합니다. 컴파일러 버전, 최적화 설정 등을 지정할 수 있습니다.
paths : 프로젝트 내 파일 및 디렉토리의 경로를 지정하는 데 사용합니다.
mocha : hardhat 테스트에 대한 Mocha 테스트 프레임 워크의 구성을 지정합니다.
plugin : hardhat의 플러그인을 구성하는 데 사용합니다. 이를 통하여 hardhat의 기능을 확장할 수 있습니다.
hardhat.config.ts 예시
import { HardhatUserConfig } from "hardhat/config";
const config: HardhatUserConfig = {
defaultNetwork: "hardhat"
networks: {
hardhat:{
}
localhost: {
url: "http://localhost:8545",
chainId: 1337,
accounts: ['0xYOUR_PRIVATE_KEY'],
},
polygonMumbai: {
url: "https://rpc-mumbai.maticvigil.com",
chainId: 80001,
accounts: ['0xYOUR_PRIVATE_KEY'],
},
},
solidity: {
version: "0.8.8",
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
paths: {
artifacts: "./build/contracts",
tests: "./test",
},
mocha: {
timeout: 5000,
},
plugins: [
// ...
"hardhat-ganache",
],
};
export default config;
상세하게 설정한다면 위와 같이 설정할 수 있습니다. 다양한 기능을 사용하지 않는다면 아래와 같이 간소화할 수 있습니다.
import { HardhatUserConfig } from "hardhat/config";
const config: HardhatUserConfig = {
defaultNetwork: "hardhat",
solidity: "0.8.8",
networks: {
hardhat: {},
localhost: {
url : "127.0.0.1:8545",
chainId: 31337,
},
},
};
export default config;
hardhat 실행
hardhat의 명령어를 통하여 compile, test, deploy 하는 방법에 대하여 알아보겠습니다.
complie
컴파일을 하려면 아래와 같은 명령어를 사용하면 됩니다. solidity 파일을 컴파일하여 ABI 및 바이너리 코드를 생성하고 artifacts/ 디렉토리에 저장합니다.
npx hardhat compile
위의 명령어를 사용한다면 contracts 폴더 안의 solidity 파일을 전부 compile 합니다.
특정 파일만 컴파일하고 싶다면 아래의 명령어를 실행하면 됩니다.
//하나의 파일
npx hardhat compile --files contracts/MyContract.sol
//특정 몇 가지 파일
npx hardhat compile --files contracts/MyContract.sol,contracts/AnotherContract.sol
test
test의 경우 hardhat은 jest가 아닌 기본적으로 Mocha 테스트 프레임 워크를 사용합니다. 상당히 유사하지만 구문적으로 다를 수 있습니다.
test를 실행하는 명령어는 아래와 같습니다.
npx hardhat test --network <network_name>
compile과 마찬가지로 위의 경우 test 폴더의 모든 test 파일을 실행합니다. 특정 test 파일을 실행하기 위하여 아래와 같은 명령어를 사용합니다.
npx hardhat test --testfiles test/MyContract.test.ts
test code에 대한 예시는 아래와 같습니다.
test/MyContract.test.ts
import { ethers } from "hardhat"
import chai, { expect } from "chai"
import chaiAsPromised from "chai-as-promised"
import { Contract, ContractFactory } from "ethers"
chai.use(chaiAsPromised)
describe("MyContract", function () {
it("should return the correct value", async function () {
const MyContract = await ethers.getContractFactory("MyContract");
const myContract = await MyContract.deploy();
await myContract.deployed();
expect(await myContract.getValue()).to.equal(42);
});
});
deploy
배포를 하는 명령어는 아래와 같습니다. --network의 값으로 network이름을 입력하면 hardhat.config.ts의 networks에 설정된 이름 중 입력한 이름과 같은 네트워크에 배포가 됩니다. 입력하지 않는다면 defaultNetwork로 배포됩니다.
npx hardhat run scripts/deploy.js --network <network_name>
deploy를 하기 위한 코드는 아래와 같습니다.
deploy.ts
async function main() {
const MyContract = await ethers.getContractFactory("MyContract");
const myContract = await MyContract.deploy();
await myContract.deployed();
console.log("MyContract deployed to:", myContract.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
getContractFactory : 스마트 컨트랙트의 이름을 매개변수로 받고 이를 통하여 컴파일된 스마트 컨트랙트의 ABI와 바이너리 코드를 가져옵니다.
deploy : 스마트 컨트랙트를 네트워크에 배포합니다.
deployed : 컨트랙트가 배포된 후 사용할 수 있는 메서드로 성공적으로 배포되었음을 나타내는 Promise를 반환합니다.
'BlockChain > BlockChain' 카테고리의 다른 글
[BlockChain] Openzeppelin의 defender 이해하기 (0) | 2023.07.04 |
---|---|
[BlockChain] hardhat으로 scan 사이트 verify하는 법 (mumbai) (0) | 2023.06.29 |
[BlockChain] GSN이란? (Gas Station Network) (0) | 2023.05.31 |
[BlockChain] DEX란? (0) | 2023.05.23 |
[BlockChain] 니모닉이란? (0) | 2023.05.22 |