> For the complete documentation index, see [llms.txt](https://archive-ko.docs.klaytn.foundation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://archive-ko.docs.klaytn.foundation/content/dapp/tutorials/count-dapp/6.-deploy-contract.md).

# 6. Deploy Contract

1. Truffle 환경 설정
2. Deploy setup
3. Deploy

## 1) Truffle 환경 설정 <a href="#id-1-truffle-configuration" id="id-1-truffle-configuration"></a>

`truffle-config.js`는 컨트랙트 코드를 배포하는 것에 대한 파일입니다. truffle-config.js에서 다음 항목들을 설정할 수 있습니다.

**1) 컨트랙트 배포 주체 (컨트랙트 배포 Klaytn 계정)** \*\*2) 컨트랙트 배포할 네트워크 \*\* \*\*3) 컨트랙트 배포를 위해 지불할 가스의 양 \*\*

컨트랙트를 배포하는 데에는 `개인키`를 이용하는 방법과 `잠금 해제된 계정`을 이용하는 방법 두 가지가 있습니다.

### 배포 방법 1: 개인키 <a href="#deploy-method-1-by-private-key" id="deploy-method-1-by-private-key"></a>

*경고: 개인키를 노출하면 안 됩니다. 만약 노출할 경우 계정이 해킹될 수도 있습니다.*

개인키를 사용하여 컨트랙트를 배포하려면 `provider` 옵션이 필요합니다.

1\) 개인키를 `new HDWalletProvider()의 첫 번째 인자로 전달하세요.<code> 2\) Klaytn 노드의 URL을` new HDWalletProvider()의 두 번째 인자로 전달하세요.

예시)

```javascript
{
 ...,
 provider: new HDWalletProvider(
   'YOUR PRIVATE KEY',
   'https://public-en-baobab.klaytn.net', // If you're running full node you can set your node's rpc url.
  ),
 ...
}
```

```javascript
const HDWalletProvider = require("truffle-hdwallet-provider-klaytn");

const NETWORK_ID = '1001'
const GASLIMIT = '8500000'

/**
 * `URL`, `PRIVATE_KEY`을 상수로 설정하여 쉽게 값을 설정하도록 해줍니다.
 * 여기에 개인키와 Klaytn 노드의 URL을 설정하세요.
 */
const URL = `https://public-en-baobab.klaytn.net`
const PRIVATE_KEY = '0x48f5a77dbf13b436ae0325ae91efd084430d2da1123a8c273d7df5009248f90c'

module.exports = {
  networks: {
    /**
     * DEPLOY METHOD 1: By private key.
     * 개인키를 노출하지 마세요. 노출할 경우 계정이 해킹될 수도 있어요!!
     */
    baobab: {
      provider: () => new HDWalletProvider(PRIVATE_KEY, URL),
      network_id: NETWORK_ID,
      gas: GASLIMIT,
      gasPrice: null,
    },
  },
}
```

위의 코드에서 `networks` 속성을 봐주세요. 이 속성에는 `baobab` 키가 있는데, 이 키에는 또 다시 `provider`, `network_id`, `gas`, `gasPrice` 등 4개의 속성이 있습니다.

`provider: new HDWalletProvider(PRIVATE_KEY, URL)` 행은 컨트랙트를 배포하는 계정과 배포 대상 네트워크의 노드 URL을 받아옵니다.

`network_id: NETWORK_ID` 행은 Klaytn에서의 네트워크 ID를 지정합니다. Baobab 네트워크(testnet)는 `1001`입니다.

`gas: GASLIMIT` 행은 컨트랙트를 배포하는 데에 얼마까지 가스를 지불할 것인지 한도를 지정합니다.

`gasPrice: null` 행은 1 가스당 지불할 금액을 트러플에 전달합니다. 현재 Klaytn에서는 가격이 `25000000000`으로 고정되어 있습니다. 이 부분을 `null`로 설정하면 트러플에서 자동적으로 고정 가스 가격으로 설정합니다.

### DEPLOY METHOD 2: By unlocked account (difficult) <a href="#deploy-method-2-by-unlocked-account-difficult" id="deploy-method-2-by-unlocked-account-difficult"></a>

To deploy a contract by unlocked account, you should have your Klaytn full node.\
Access your Klaytn node console by typing `$ klay attach http://localhost:8551` If you don't have a Klaytn account in the node, generate it by typing `personal.newAccount()` on the console.\
If you already have one, unlock your account through `personal.unlockAccount()`.

After ensuring account is unlocked,\
you should set the properties, `host`, `port`, `network_id`, and `from`. 1) Which network to deploy (`host`, `port`, `network_id`)\
2\) Who will deploy (`from`) 3) How much gas will you endure to deploy your contract (`gas`)

Put your unlocked account address on `from`. If you're running your own Klaytn full node, set the node's host to `host` and node's port to `port`.

example)

```javascript
{
  host: 'localhost',
  port: 8551,
  from: '0xd0122fc8df283027b6285cc889f5aa624eac1d23',
  network_id: NETWORK_ID,
  gas: GASLIMIT,
  gasPrice: null,
}
```

## 2) Deploy setup (Which contract do you want to deploy?) <a href="#id-2-deploy-setup-which-contract-do-you-want-to-deploy" id="id-2-deploy-setup-which-contract-do-you-want-to-deploy"></a>

`migrations/2_deploy_contracts.js`:

```javascript
const Count = artifacts.require('./Count.sol')
const fs = require('fs')

module.exports = function (deployer) {
  deployer.deploy(Count)
    .then(() => {
    // 'deployedAddress' 파일에 최근에 배포된 컨트랙트의 주소를 기록합니다.
    if (Count._json) {
      // deployedABI에 abi 파일을 저장합니다.
      fs.writeFile(
        'deployedABI',
        JSON.stringify(Count._json.abi, 2),
        (err) => {
          if (err) throw err
          console.log(`The abi of ${Count._json.contractName} is recorded on deployedABI file`)
        })
    }

    fs.writeFile(
      'deployedAddress',
      Count.address,
      (err) => {
        if (err) throw err
        console.log(`The deployed contract address * ${Count.address} * is recorded on deployedAddress file`)
    })
  })
}
```

You can specify which contract code will you deploy in your `contracts/` directory.\
First, you should import your contract file (`Count.sol`) in this file through `const Count = artifacts.require('./Count.sol')`\
And use `deployer` to deploy your contract, through `deployer.deploy(Count)`.\
If you want to run some logic after deploying your contract, use `.then()`.\
We want to store the contract ABI and the deployed address in files. `fs` node.js module is used to do it. (`fs.writeFile(filename, content, callback)`)\
Through this post-process, we save our contract address and ABI as `deployedABI` and `deployedAddress` in the directory.\
For further information about `artifacts.`, visit truffle document site, <https://trufflesuite.com/docs/truffle/getting-started/running-migrations#artifacts-require->

## 3) Deploy <a href="#id-3-deploy" id="id-3-deploy"></a>

You need KLAY to deploy a contract. You can receive testnet KLAY on faucet.

* On Klaytn wallet <https://baobab.wallet.klaytn.foundation/faucet>, there is a faucet providing 150 KLAY per 86400 blocks in Klaytn Baobab testnet. After creating your Klaytn account, run faucet to receive 150 KLAY.

![deploy](https://github.com/klaytn/klaytn-docs-ko/blob/main/docs/bapp/tutorials/count-bapp/images/tutorial-3deploy.gif)

Type `$ truffle deploy --network baobab`.\
It will deploy your contract according to the configurations defined in `truffle-config.js` and `migrations/2_deploy_contracts.js`.

cf) `--reset` option\
After deploying your contract, if you type `$ truffle deploy --network baobab` again, nothing will happen.\
Because truffle deploys a contract only when there are changes in the contract, otherwise truffle will not do anything.\ If you want to re-deploy your contract anyway, there is an option `--reset`.\
If you provide this option, truffle will deploy your contract even the content of contract hasn't changed.\ ex) `$ truffle deploy --reset --network baobab`

To recap, `truffle-config.js` configures the `target network`, `deployer account`, and the `gas limit`. `migrations/2_deploy_contracts.js` configures the `contract` to deploy.\
`target network`: We deploy our contract to the node `https://public-en-baobab.klaytn.net`.\
`deployer account`: '0xd0122fc8df283027b6285cc889f5aa624eac1d23' will deploy this contract.\
`gas limit`: We can endure up to '20000000' gas for deploying our contract.\
`contract`: We will deploy the Count contract.

From the terminal output, you can see if the deployment has been succeeded and find the deployed address.
