# Hardhat을 이용한 컨트랙트 배포

하드햇 (Hardhat)은 이더리움 소프트웨어를 위한 개발 프레임워크입니다. 컨트랙트 디앱 개발, 컴파일, 디버깅, 배포 등 이더리움을 개발하기 위한 다양한 기능이 구성되어 있습니다.&#x20;

디카르고는 이더리움의 EVM과 상호 작용을 할 수 있기에, 디카르고 네트워크에 컨트랙트를 배포할 수 있습니다.

하드햇과 디카르고 웨어하우스를 사용하여 지갑 디앱 (Wallet dApp)을 구축하는 방법을 살펴보겠습니다.

{% hint style="info" %}
모든 블록체인에 컨트랙트를 배포할 때는 해당 체인의 네이티브 토큰을 사용하여 배포 가스 수수료를 지불해야 하며, 이는 디카르고도 마찬가지입니다. 디카르고 웨어하우스에 배포하기 전에 [포우셋 (faucet)](https://docs.dkargo.io/undefined-4/undefined)을 통해 $DKA 테스트넷 토큰을 획득할 수 있습니다.
{% endhint %}

## 개발 환경

사전 준비 사항 (Prerequisites)

* **Node.js & npm/yarn**:
  * Installed from [Node.js](https://nodejs.org/).
* **Hardhat**: Development environment for Ethereum.

  * Install with:

  ```bash
  npm install --save-dev hardhat
  ```

## Step 1 - 하드햇 프로젝트 설정

1. 하드햇 프로젝트를 새로 초기화합니다.

```solidity
mkdir helloDka
cd helloDka
npx hardhat init
```

2. 추가로 개발에 필요한 [dotenv](https://github.com/motdotla/dotenv) 를 설치합니다.

```bash
npm i dotenv
touch .env
```

3. 다음은 하드햇 프로젝트의 폴더 구조에 대한 예시입니다.

```bash
/helloDka
├── README.md
├── contracts
|  └── Lock.sol
├── hardhat.config.js
├── ignition
|  └── modules
|     └── Lock.js
├── package-lock.json
├── package.json
└── test
   └── Lock.js
```

## Step 2 - Counter.sol 컨트랙트 작성

contracts 폴더 안에 <mark style="color:blue;">`Counter.sol`</mark> 파일을 생성한 다음 아래 코드를 복사하여 붙여 넣습니다.&#x20;

해당 코드는 변수 Number를 설정할 수 있는 간단한 기능이 구현되어 있습니다.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
contract Counter {
    uint256 public number;
 
    function setNumber(uint256 newNumber) public {
        number = newNumber;
    }
 
    function increment() public {
        number++;
    }
}
```

## Step 3 - 이그니션 파일 업데이트

<mark style="color:blue;">`./ignition/modules`</mark> 폴더 안에 <mark style="color:blue;">`Counter.js`</mark> 파일을 생성한 다음 아래 코드를 복사하여 붙혀 넣습니다.&#x20;

해당 코드는[ 하드햇 이그니션(hardhat ignition) ](https://hardhat.org/ignition/docs/getting-started#overview)표준 코드이며, 컨트랙트 배포를 수행합니다.

```jsx
const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");
 
module.exports = buildModule("Counter", (m) => {
  const lock = m.contract("Counter");
 
  return { lock };
});
```

## Step 4 - 하드햇 설정

1. 필요한 플러그인 및 구성을 <mark style="color:blue;">`hardhat.config.js`</mark>에 작성합니다.
   * <mark style="color:blue;">`require('dotenv').config()`</mark> :  <mark style="color:blue;">`.env`</mark>를 불러옵니다.
   * accounts: \[process.env.PRIVATE\_KEY] : <mark style="color:blue;">`.env`</mark> 에 작성된 개인키를 전달합니다.

```jsx
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.24",
  networks: {
    warehouse: {
      url: "<https://it-full.dknote.net>",
      accounts: [process.env.PRIVATE_KEY],
    },
  },
  ignition: {
    requiredConfirmations: 1
  }
};

```

2. <mark style="color:blue;">`.env`</mark> 파일 안에 다음을 추가합니다. <mark style="color:blue;">`gitignore`</mark> 파일에 <mark style="color:blue;">`.env`</mark>가 추가되었는지 확인합니다.

```bash
PRIVATE_KEY=YOUR KEY HERE WITH NO QUOTES
```

## Step 5 - 컴파일과 배포

1. <mark style="color:blue;">`counter.sol`</mark> 을 컴파일합니다.

```bash
npx hardhat compile
```

2. <mark style="color:blue;">`counter.sol`</mark> 코드를 디카르고 웨어하우스에 배포합니다.

```bash
npx hardhat ignition deploy ./ignition/modules/Counter.js --network warehouse
```

## Step 6 - 배포 트랜잭션 확인

1. 배포된 컨트랙트의 트랜잭션 정보를 조회합니다.

```jsx
npx hardhat ignition transactions chain-2465001
```

2. [dScanner](https://warehouse.dscanner.io/)에서 트랜잭션 정보 검색할 수 있습니다.

## 컨트랙트 검증

이더리움이나 EVM 기반 블록체인에서 스마트 컨트랙트를 개발해 보셨다면, 아마 하드햇의 검증 (verify) 기능을 사용해 보셨을 겁니다.

하지만 저희 디카르고 체인은 물류 서비스에 최적화된 블록 익스플로러 (Explorer)인 [dScanner](https://warehouse.dscanner.io/)를 자체적으로 개발했기 때문에, 하드햇의 검증 기능과는 호환되지 않습니다.

대신, 여러분이 개발한 컨트랙트의 투명성을 보장하기 위해 [dScanner](https://warehouse.dscanner.io/)에서 제공하는 [Verify Contract](https://warehouse.dscanner.io/verify-contract)를 활용할 수 있습니다.
