# 5. Triển khai hợp đồng

1. Nhận testnet KLAY để triển khai hợp đồng
2. Cấu hình Truffle
3. Thiết lập triển khai (chọn hợp đồng bạn muốn triển khai)
4. Triển khai

## 1) Nhận KLAY <a href="#id-1-get-some-klay" id="id-1-get-some-klay"></a>

Để triển khai hợp đồng, ta cần có KLAY trong tài khoản của bạn để trả phí gas. Bạn có thể nhận 150 KLAY qua Ví Klaytn trong testnet. 1. Tạo tài khoản Klaytn của bạn tại [Ví Baobab Klaytnkhóa riêng tư](https://baobab.wallet.klaytn.foundation/create) -> `PRIVATE KEY` sẽ được dùng trong cấu hình Truffle. Sao chép khóa riêng tư vào đâu đó 2. Sau khi tạo tài khoản Klaytn, chạy Faucet để nhận 5 KLAY từ testnet Baobab trong [Vòi Baobab Klaytn](https://baobab.wallet.klaytn.foundation/faucet)

![create-tài khoản & run-klay-faucet](/files/YCLgiXRke43Te2pHo4sS)

## 2) Cấu hình Truffle <a href="#id-2-truffle-configuration" id="id-2-truffle-configuration"></a>

`truffle-config.js` là tập tin cấu hình có chứa cấu hình triển khai. Ta sẽ triển khai hợp đồng bằng cách dùng `Private key` vừa tạo ở bước trước. Dán `Private key` có đủ KLAY của bạn vào truffle-config.js

*CẢNH BÁO: Bạn không nên để lộ khóa riêng tư của mình. Nếu không tài khoản của bạn sẽ bị xâm nhập.*

```javascript
// truffle-config.js

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

/**
 * các biến mạng lưới Truffle
 * để triển khai hợp đồng vào mạng lưới Klaytn.
 */
const NETWORK_ID = '1001'

/**
 * URL: URL cho nút từ xa bạn sẽ dùng
 * PRIVATE_KEY: Khóa riêng tư của tài khoản thanh toán giao dịch (Đổi thành khóa riêng tư của riêng bạn)
 */
const URL = 'https://public-en-baobab.klaytn.net'

// Dán `Private key` có đủ KLAY vào truffle.js
const PRIVATE_KEY = 'your_private_key'

module.exports = {
  networks: {
    klaytn: {
      provider: () => new HDWalletProvider(PRIVATE_KEY, URL),
      network_id: NETWORK_ID,
      gas: '8500000',
      gasPrice: null,
    },
  },

  // Chỉ định phiên bản của trình biên dịch, chúng tôi dùng phiên bản 0.5.6
  compilers: {
    solc: {
      version: '0.5.6',
    },
  },
}
```

### Thuộc tính `networks` <a href="#networks-property" id="networks-property"></a>

Xem thuộc tính `networks` ở trên. Mạng lưới `klaytn` có 4 thuộc tính,\
`provider`, `network_id`, `gas`, `gasPrice`.

* `provider: () => new HDWalletProvider(PRIVATE_KEY, URL)` Như tên gọi, thuộc tính này tích hợp khóa riêng tư và url được định nghĩa ở trên.
* `network_id: NETWORK_ID` Chỉ ra ID của mạng lưới trong Klaytn, bạn nên đặt thành `1001` để sử dụng mạng lưới Baobab Klaytn (testnet).
* `gas: GASLIMIT` Phí gas tối đa bạn sẵn sàng chi trả.
* `gasPrice: null` Đây là mức giá trên mỗi đơn vị gas. Hiện giá gas trong Klaytn được cố định ở mức `'25000000000'`. Bằng cách đặt thành `null`, truffle sẽ tự động đặt giá gas.

### Thuộc tính `compiler` <a href="#compiler-property" id="compiler-property"></a>

Hãy nhớ rằng ta đã dùng phiên bản 0.5.6 cho hợp đồng Solidity, đồng thời chỉ ra phiên bản trình biên dịch ở đây.

## 3) Thiết lập triển khai <a href="#id-3-deployment-setup" id="id-3-deployment-setup"></a>

`migrations/2_deploy_contracts.js`:

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

module.exports = function (deployer) {
  deployer.deploy(Klaystagram)
    .then(() => {
    if (Klaystagram._json) {
      // 1. Ghi lại tập tin abi của hợp đồng đã triển khai gần đây vào 'deployedABI'
      fs.writeFile(
        'deployedABI',
        JSON.stringify(Klaystagram._json.abi, 2),
        (err) => {
          if (err) throw err
          console.log(`ABI của ${Klaystagram._json.contractName} được ghi vào tập tin deployedABI`)
        })
    }

    // 2. Ghi lại địa chỉ của hợp đồng đã triển khai gần đây vào 'deployedAddress'
    fs.writeFile(
      'deployedAddress',
      Klaystagram.address,
      (err) => {
        if (err) throw err
        console.log(`Địa chỉ của hợp đồng đã triển khai * ${Klaystagram.address} * được ghi vào tập tin deployedAddress`)
    })
  })
}
```

Bạn có thể chỉ ra mã hợp đồng bạn sẽ triển khai trong thư mục `contracts/`.

1. Nhập tập tin hợp đồng của bạn (`Klaystagram.sol`) qua

   `const Klaystagram = artifacts.require('./Klaystagram.sol')`
2. Dùng `deployer` để triển khai hợp đồng của bạn, `deployer.deploy(Klaystagram)`.
3. Nếu bạn muốn thêm logic sau khi triển khai hợp đồng, hãy dùng `.then()` (không bắt buộc)
4. Để lưu `deployedABI` và `deployedAddress` của hợp đồng, hãy dùng `fs` mô-đun node.js

   `fs.writeFile(filename, content, callback)` (không bắt buộc)

cf. Để biết thêm thông tin về `artifacts.require()`, hãy tham chiếu tài liệu chính thức của truffle tại [truffle docs](https://trufflesuite.com/docs/truffle/getting-started/running-migrations#artifacts-require-)

## 4) Triển khai <a href="#id-4-deploy" id="id-4-deploy"></a>

![triển khai hợp đồng](/files/sP5IV70uSl2W4x7MOtO8)

Trong cửa sổ lệnh của bạn, hãy gõ `$ truffle deploy --network baobab`.\
Hệ thống sẽ triển khai hợp đồng của bạn theo cấu hình `truffle-config.js` và `migrations/2_deploy_contracts.js`.

Cửa sổ lệnh sẽ hiển thị địa chỉ hợp đồng đã triển khai nếu triển khai thành công.

cf) `--reset` option\
Nếu bạn đưa ra tùy chọn này, Truffle sẽ biên dịch và triển khai lại hợp đồng của bạn ngay cả khi hợp đồng không thay đổi.\ ex) `$ truffle deploy --reset --network baobab`


---

# 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-vn.docs.klaytn.foundation/content/dapp/tutorials/klaystagram/5.-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.
