# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://archive-ko.docs.klaytn.foundation/content/dapp/tutorials/count-dapp/6.-deploy-contract.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
