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

Mặc dù về mặt kỹ thuật giống hệt tiêu chuẩn ERC-20 về mã nguồn, token CAP-20 có cấu hình đặc biệt về số thập phân. Tóm lại: nó sử dụng 0 số thập phân, trong khi token ERC-20 thông thường sử dụng 18 số thập phân.

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

Do đó, nếu bạn triển khai một Fan Token với 18 số thập phân, nó có thể không hiển thị đúng trong các ví của hệ sinh thái hoặc không tương thích với các tích hợp Socios.com trong tương lai.

## 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), bạn phải xử lý 0 số thập phân.

Điều này có nghĩa là:

* Đừng giả định `1 Token = 10^18 đơn vị`. Đối với Fan Tokens, `1 Token = 1 đơn vị`.
* Tránh hardcode `1e18` trong các phép tính nếu hợp đồng của bạn được thiết kế chung chung. Hãy sử dụng hàm `token.decimals()` một cách động.

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