> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/vi/phat-trien/co-ban/viet-smart-contract.md).

# Viết Smart Contract

Ngay từ khi bạn quyết định tạo một dApp trên Chiliz Chain, bạn cần tính đến những đặc điểm riêng của blockchain này.

Mặc dù Chiliz Chain tương thích với EVM, nhưng nếu xem nó giống hệt Ethereum có thể dẫn đến các vấn đề về khả năng sử dụng, đặc biệt liên quan đến số thập phân token và cơ chế gas.

Hãy cùng khám phá!

## Điều kiện tiên quyết

### Môi trường

Trước khi bắt đầu viết hợp đồng, hãy đảm bảo môi trường của bạn đã sẵn sàng.

Đầu tiên, bạn cần có một ví được cấu hình cho Spicy Testnet (để phát triển) hoặc Chiliz Chain Mainnet (để triển khai thực tế).

[Kết nối với Chiliz Chain](/vi/phat-trien/co-ban/ket-noi-voi-chiliz-chain.md)

Thứ hai, bạn sẽ cần $CHZ để trả gas triển khai trên cả Testnet lẫn Mainnet. Trong khi bạn có thể mua $CHZ Mainnet trên bất kỳ sàn giao dịch tiền điện tử nào, bạn có thể dùng faucet để lấy token Testnet miễn phí.

[Nhận Token Testnet Miễn Phí](/vi/phat-trien/co-ban/nhan-token-testnet.md)

Về công cụ, bạn có thể sử dụng Hardhat hoặc Remix. Xem ví dụ:

[Triển khai với Remix](/vi/phat-trien/co-ban/trien-khai-smart-contract/trien-khai-voi-remix.md)

Cuối cùng, các hợp đồng trên Chiliz Chain được viết bằng ngôn ngữ Solidity:

{% embed url="<https://www.soliditylang.org/>" %}

{% embed url="<https://solidity-by-example.org/>" %}

Hãy sử dụng các phiên bản Solidity và EVM được khuyến nghị:

{% hint style="info" %}
**Phiên bản Solidity và EVM được khuyến nghị cho Chiliz Chain:**

* **Phiên bản trình biên dịch Solidity:** `0.8.30` (hoặc thấp hơn)
* **Phiên bản EVM mục tiêu:** `prague`
  {% endhint %}

### Fan Tokens / CAP-20

Điểm đặc trưng nhất của Chiliz Chain là tiêu chuẩn CAP-20, được sử dụng cho Fan Tokens.

CAP-20 về mặt kỹ thuật tương đương với tiêu chuẩn ERC-20. Kể từ đợt Di Cư Fan Tokens Thập Phân 2026, các token CAP-20 sử dụng độ chính xác 18 số thập phân, giống như các token ERC-20 tiêu chuẩn, do đó số dư, giao dịch chuyển và tổng nguồn cung của Fan Token được tính theo đơn vị nhỏ nhất của token và hỗ trợ các phần nhỏ.

{% hint style="info" %}
Fan Tokens từng sử dụng 0 số thập phân (chỉ các đơn vị nguyên) cho đến [Di Cư Fan Tokens Thập Phân 2026](/vi/hoc-tap/ve-fan-tokens/di-cu-fan-tokens-2026.md), đợt nâng cấp đã đưa chúng lên độ chính xác 18 số thập phân. Các hợp đồng được viết dựa trên giả định đơn vị nguyên cũ có thể cần được cập nhật.
{% endhint %}

[Về Fan Tokens](/vi/hoc-tap/ve-fan-tokens.md)

## Các thực hành tốt nhất khi viết smart contract

### Sử dụng các thư viện đã được kiểm chứng (OpenZeppelin)

Đừng bắt đầu tạo hợp đồng từ đầu.\
Biện pháp bảo mật hiệu quả nhất là dựa trên các tiêu chuẩn đã được cộng đồng kiểm tra, để giảm thiểu rủi ro lỗ hổng bảo mật.

Để phát triển trên Chiliz Chain, chúng tôi khuyến nghị mạnh mẽ sử dụng [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts). Chúng cung cấp các triển khai an toàn và đã được cộng đồng xem xét cho các hợp đồng token.

Bằng cách sử dụng các hợp đồng tiêu chuẩn, bạn đảm bảo rằng token của mình tương thích với các ví phổ biến (như MetaMask) và hệ sinh thái Chiliz (Socios.com).

### Các thực hành tốt nhất cho EVM nói chung

Bất kể blockchain nào, ba mô hình sau đây là không thể thiếu để phát triển Solidity an toàn.

#### Mô hình "Checks-Effects-Interactions"

Đây là lớp phòng thủ chính của bạn chống lại [Reentrancy Attacks](https://solidity-by-example.org/hacks/re-entrancy/). Luôn cấu trúc các hàm của bạn theo đúng thứ tự này:

1. Checks (Kiểm tra): Xác thực đầu vào và điều kiện (ví dụ: các câu lệnh `require`).
2. Effects (Hiệu ứng): Cập nhật trạng thái hợp đồng (ví dụ: giảm số dư).
3. Interactions (Tương tác): Tương tác với các hợp đồng khác hoặc gửi tiền (ví dụ: `transfer`).

#### Kiểm soát truy cập chặt chẽ

Không bao giờ để các hàm nhạy cảm không được bảo vệ. Nếu một hàm đúc token, thay đổi phí hoặc nâng cấp logic, nó phải được hạn chế quyền truy cập.

* Đơn giản: Sử dụng `Ownable` cho các hợp đồng có một quản trị viên duy nhất.
* Phức tạp: Sử dụng `AccessControl` cho các hợp đồng yêu cầu nhiều vai trò (ví dụ: `MINTER_ROLE`, `ADMIN_ROLE`).

#### Xác thực đầu vào

Hãy giả định rằng tất cả đầu vào đều có hại. Sử dụng các câu lệnh `require()` ngay đầu hàm của bạn để xác thực các tham số.

Ví dụ:

* Kiểm tra địa chỉ zero (`address(0)`).
* Kiểm tra số lượng bằng không khi chuyển nhượng.
* Xác minh độ dài mảng khớp nhau nếu truyền nhiều mảng.
* v.v.

### Chi tiết triển khai đặc thù của Chiliz

Mặc dù Chiliz Chain tương thích với EVM, một số "quy tắc riêng" được áp dụng, đặc biệt liên quan đến số thập phân token.

#### Tuân thủ CAP-20 (Fan Tokens)

Nếu bạn đang viết một hợp đồng tương tác với Fan Tokens (ví dụ: một Staking Pool cho $PSG hoặc $BAR), hãy tính đến số thập phân của chúng thay vì giả định một giá trị cố định.

Kể từ đợt Di Cư Fan Tokens Thập Phân 2026, Fan Tokens sử dụng 18 số thập phân, do đó `1 Token = 10^18 units`, giống như hầu hết các token ERC-20. Các hợp đồng Fan Token cũ sử dụng 0 số thập phân (`1 Token = 1 unit`), và một số vẫn có thể còn gặp trên chain.

* Đừng hardcode số thập phân của một token. Hãy đọc `token.decimals()` một cách động để hợp đồng của bạn hoạt động dù token sử dụng 18 số thập phân hay cấu hình 0 số thập phân cũ.
* Hãy scale các số lượng bằng giá trị mà `decimals()` trả về thay vì giả định `1e18`.

### Tối ưu hóa gas trên Chiliz

Các giao dịch trên Chiliz Chain rẻ hơn đáng kể so với Ethereum, nhưng mã không được tối ưu vẫn có thể gây ra tắc nghẽn hoặc giao dịch thất bại trong các sự kiện có lưu lượng cao (ví dụ: trong một trận đấu trực tiếp).

Dưới đây là ba cách để tiết kiệm gas:

* Sử dụng Custom Errors: Thay vì chuỗi thông báo dài trong `require`, hãy sử dụng định nghĩa `error` để tiết kiệm gas.
* Sắp xếp các biến trạng thái của bạn sao cho vừa vặn trong các slot 32 byte. Đặt `uint128`, `address` và `bool` cạnh nhau khi có thể.
* Ưu tiên `external` cho các hàm không bao giờ được gọi nội bộ bởi chính hợp đồng.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.chiliz.com/vi/phat-trien/co-ban/viet-smart-contract.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
