Nhảy đến nội dung chính
Change page

Ngôn ngữ hợp đồng thông minh

Lần cập nhật trang lần cuối: 26 tháng 2, 2026

Một khía cạnh tuyệt vời của Ethereum đó chính là những hợp đồng thông minh có thể được viết nên bởi các ngôn ngữ lập trình tương đối thân thiện. Nếu bạn đã có kinh nghiệm với Python hoặc bất kỳ ngôn ngữ dấu ngoặc nhọn nàoopens in a new tab, bạn có thể tìm thấy một ngôn ngữ có cú pháp quen thuộc.

Hai ngôn ngữ hoạt động và được duy trì phổ biến nhất là:

  • Solidity
  • Vyper

Remix IDE cung cấp một môi trường phát triển toàn diện cho việc tạo và kiểm tra hợp đồng bằng cả Solidity và Vyper. Hãy thử Remix IDE trong trình duyệtopens in a new tab để bắt đầu lập trình.

Các nhà phát triển có kinh nghiệm hơn cũng có thể muốn sử dụng Yul, một ngôn ngữ trung gian cho Máy ảo Ethereum, hoặc Yul+, một phần mở rộng của Yul.

Nếu bạn muốn tìm hiểu thêm và thử nghiệm các ngôn ngữ mới vẫn đang được phát triển mạnh mẽ, bạn có thể thử Fe, một ngôn ngữ hợp đồng thông minh mới nổi hiện nay còn trong giai đoạn sơ khai.

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

Những kiến thức trước đây về các ngôn ngữ lập trình, đặc biệt là JavaScript hoặc Python, có thể giúp bạn hiểu được sự khác biệt trong những ngôn ngữ hợp đồng thông minh. Chúng tôi cũng khuyến nghị bạn nắm rõ hợp đồng thông minh như một khái niệm trước khi đi sâu vào sự so sánh giữa các ngôn ngữ. Giới thiệu về hợp đồng thông minh.

Solidity

  • Là ngôn ngữ bậc cao và hướng đối tượng để triển khai các hợp đồng thông minh.
  • Ngôn ngữ ngoặc nhọn, chịu sự ảnh hưởng mạnh mẽ bởi C++.
  • Nhập tĩnh (kiểu dữ liệu của biến sẽ được xác định ở thời điểm biên dịch).
  • Hỗ Trợ:
    • Kế thừa (để bạn có thể mở rộng các hợp đồng khác).
    • Các thư viện (bạn có thể tạo ra những đoạn mã có thể tái sử dụng để gọi chúng vào các hợp đồng khác - tương tựng như hàm tĩnh trong một lớp tĩnh ở các ngôn ngữ lập trình hướng đối tượng khác).
    • Các kiểu dữ liệu phức tạp do người dùng tự định nghĩa.

Hợp đồng mẫu

1// SPDX-License-Identifier: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // Từ khóa "public" giúp các biến
6 // có thể truy cập được từ các hợp đồng khác
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Các sự kiện cho phép các ứng dụng
11 // phản ứng với các thay đổi hợp đồng cụ thể mà bạn khai báo
12 event Sent(address from, address to, uint amount);
13
14 // Mã hàm khởi tạo chỉ được chạy khi hợp đồng
15 // được tạo
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Gửi một lượng coin mới được tạo tới một địa chỉ
21 // Chỉ có thể được gọi bởi người tạo hợp đồng
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Gửi một lượng coin hiện có
29 // từ bất kỳ người gọi nào đến một địa chỉ
30 function send(address receiver, uint amount) public {
31 require(amount <= balances[msg.sender], "Số dư không đủ.");
32 balances[msg.sender] -= amount;
33 balances[receiver] += amount;
34 emit Sent(msg.sender, receiver, amount);
35 }
36}
Hiện tất cả

Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được viết bằng Solidity là như thế nào. Để có mô tả chi tiết hơn về các hàm và biến, xem tài liệuopens in a new tab.

Vyper

  • Ngôn ngữ lập trình Python
  • Strong typing (kiểu dữ liệu của một đối tượng không thay đổi đột ngột, không tường minh)
  • Mã biên dịch gọn và dễ hiểu
  • Tạo mã bytecode hiệu quả
  • Được tạo ra với mục đích là it tính năng hơn Solidity để tăng sự an toàn của hợp đồng và dễ kiểm tra hơn. Vyper không hỗ trợ:
    • Modifiers
    • Tính kế thừa
    • Mã assembly nội dòng
    • Nạp chồng hàm
    • Nạp chồng toán tử
    • Đệ quy
    • Vòng lặp vô hạn
    • Các fixed points nhị phân

Để biết thêm thông tin, đọc cơ sở lý luận của Vyperopens in a new tab.

Ví dụ

1# Đấu giá mở
2
3# Tham số đấu giá
4
5# Người thụ hưởng nhận tiền từ người trả giá cao nhất
6
7beneficiary: public(address)
8auctionStart: public(uint256)
9auctionEnd: public(uint256)
10
11# Trạng thái hiện tại của phiên đấu giá
12
13highestBidder: public(address)
14highestBid: public(uint256)
15
16# Đặt thành true ở cuối, không cho phép bất kỳ thay đổi nào
17
18ended: public(bool)
19
20# Theo dõi các giá thầu được hoàn lại để chúng ta có thể tuân theo mẫu rút tiền
21
22pendingReturns: public(HashMap[address, uint256])
23
24# Tạo một phiên đấu giá đơn giản với `_bidding_time`
25
26# giây thời gian đấu giá thay mặt cho
27
28# địa chỉ người thụ hưởng `_beneficiary`.
29
30@external
31def __init__(_beneficiary: address, _bidding_time: uint256):
32 self.beneficiary = _beneficiary
33 self.auctionStart = block.timestamp
34 self.auctionEnd = self.auctionStart + _bidding_time
35
36# Đặt giá cho phiên đấu giá với giá trị được gửi
37
38# cùng với giao dịch này.
39
40# Giá trị sẽ chỉ được hoàn lại nếu
41
42# không thắng phiên đấu giá.
43
44@external
45@payable
46def bid():
47 # Kiểm tra xem thời gian đặt giá đã kết thúc chưa.
48 assert block.timestamp < self.auctionEnd
49 # Kiểm tra xem giá thầu có đủ cao không
50 assert msg.value > self.highestBid
51 # Theo dõi khoản tiền hoàn lại cho người trả giá cao trước đó
52 self.pendingReturns[self.highestBidder] += self.highestBid
53 # Theo dõi giá thầu cao mới
54 self.highestBidder = msg.sender
55 self.highestBid = msg.value
56
57# Rút lại một giá thầu đã được hoàn lại trước đó. Mẫu rút tiền được
58
59# sử dụng ở đây để tránh một vấn đề bảo mật. Nếu các khoản hoàn trả được gửi trực tiếp
60
61# như một phần của bid(), một hợp đồng đặt giá độc hại có thể chặn
62
63# các khoản hoàn trả đó và do đó chặn các giá thầu cao hơn mới được đưa vào.
64
65@external
66def withdraw():
67 pending_amount: uint256 = self.pendingReturns[msg.sender]
68 self.pendingReturns[msg.sender] = 0
69 send(msg.sender, pending_amount)
70
71# Kết thúc phiên đấu giá và gửi giá thầu cao nhất
72
73# cho người thụ hưởng.
74
75@external
76def endAuction():
77 # Một nguyên tắc hay là cấu trúc các hàm tương tác
78 # với các hợp đồng khác (tức là chúng gọi các hàm hoặc gửi ether)
79 # thành ba giai đoạn:
80 # 1. kiểm tra các điều kiện
81 # 2. thực hiện các hành động (có khả năng thay đổi các điều kiện)
82 # 3. tương tác với các hợp đồng khác
83 # Nếu các giai đoạn này bị trộn lẫn, hợp đồng khác có thể gọi
84 # lại vào hợp đồng hiện tại và sửa đổi trạng thái hoặc gây ra
85 # các hiệu ứng (thanh toán ether) được thực hiện nhiều lần.
86 # Nếu các hàm được gọi trong nội bộ bao gồm tương tác với các hợp đồng
87 # bên ngoài, chúng cũng phải được coi là tương tác với
88 # các hợp đồng bên ngoài.
89
90 # 1. Điều kiện
91 # Kiểm tra xem thời gian kết thúc đấu giá đã đến chưa
92 assert block.timestamp >= self.auctionEnd
93 # Kiểm tra xem hàm này đã được gọi chưa
94 assert not self.ended
95
96 # 2. Tác động
97 self.ended = True
98
99 # 3. Tương tác
100 send(self.beneficiary, self.highestBid)
Hiện tất cả

Ví dụ trên sẽ cho bạn biết cú phát của hợp đồng được viết bằng Vyper là như thế nào. Để có mô tả chi tiết hơn về các hàm và biến, xem tài liệuopens in a new tab.

Yul và Yul+

Nếu bạn mới tiếp cận Ethereum và chưa thực hiện bất kỳ đoạn mã nào với các ngôn ngữ lập trình hợp đồng thông minh, chúng tôi khuyên bạn nên bắt đầu với Solidity hoặc Vyper. Bạn chỉ nên tìm hiểu Yul hoặc Yu+ khi bạn đã quen thuộc với các kĩ thuật tốt nhất về bảo mật hợp đồng thông minh và các chi tiết công việc với Máy ảo Ethereum.

Yul

  • Là ngôn ngữ trung gian cho Ethereum.
  • Hỗ trợ Máy ảo Ethereum (EVM)Ewasmopens in a new tab, một WebAssembly đặc trưng của Ethereum, và được thiết kế để trở thành một mẫu số chung có thể sử dụng được của cả hai nền tảng.
  • Mục tiêu tốt cho các giai đoạn tối ưu hóa cấp cao, có thể mang lại lợi ích ngang nhau cho cả hai nền tảng Máy ảo Ethereum và Ewasm.

Yul+

  • Ngôn ngữ bậc thấp, có các tiện ích mở rộng hiệu quả hơn Yul.
  • Ban đầu được thiết kế cho một hợp đồng gộp giao dịch lạc quan.
  • Yul+ có thể được xem là một đề xuất nâng cấp thử nghiệm cho Yul với việc bổ sung các tính năng mới.

Hợp đồng mẫu

Ví dụ đơn giản sau đây thực hiện một hàm lũy thừa. Nó có thể được biên dịch bằng solc --strict-assembly --bin input.yul. Ví dụ này nên được đặt trong thư mục input.yul.

1{
2 function power(base, exponent) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
9 result := power(mul(base, base), div(exponent, 2))
10 if mod(exponent, 2) { result := mul(base, result) }
11 }
12 }
13 let res := power(calldataload(0), calldataload(32))
14 mstore(0, res)
15 return(0, 32)
16}
Hiện tất cả

Nếu bạn đã có nhiều kinh nghiệm với các hợp đồng thông minh, bạn có thể tìm thấy một bản triển khai ERC20 đầy đủ bằng Yul tại đâyopens in a new tab.

Fe

  • Là ngôn ngữ nhập tĩnh cho Máy ảo Ethereum (EVM).
  • Được lấy cảm hứng từ Python và Rust.
  • Dễ học - kể cả với những lập trình viên mới tiếp cận hệ sinh thái Ethereum.
  • Quá trình phát triển Fe vẫn đang ở giai đoạn đầu với bản phát hành alpha được công bố vào 01/2021.

Hợp đồng mẫu

Dưới đây là một hợp đồng đơn giản được triển khai bằng Fe.

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 pub def get_msg(addr: address) -> BookMsg:
15 return self.guest_book[addr].to_mem()
16
Hiện tất cả

Cách lựa chọn

Như những ngôn ngữ lập trình khác, điều này tùy thuộc vào sở thích cá nhân cũng như việc chọn đúng ngôn ngữ để phù hợp với nhu cầu công việc đó.

Dưới đây là một vài gợi ý mà bạn có thể cân nhắc nếu bạn chưa từng thử lập trình một ngôn ngữ nào trước đây:

Thế mạnh của Solidity?

  • Có nhiều tài liệu hướng dẫn và các bộ công cụ học tập dành cho người mới bắt đầu. Xem thêm về điều đó trong phần Học bằng cách viết mã.
  • Có sẵn các công cụ phát triển ổn định.
  • Solidity có một cộng đồng các nhà phát triển lớp mạnh, điều đó có nghĩa là bạn sẽ luôn tìm được hầu hết các câu trả lời về những vấn đề của bạn một cách nhanh chóng.

Thế mạnh của Vyper?

  • Một cách tuyệt vời để bắt đầu cho những lập trình viên Python muốn xây dựng hợp đồng thông minh.
  • Vyper có ít tính năng hơn vì thế phù hợp cho việc phác thảo nhanh các mẫu ý tưởng.
  • Vyper nhắm đến việc đơn giản hóa việc kiểm định và giúp con người có thể hiểu được ở mức tối đa.

Thế mạnh của Yul và Yul+?

  • Ngôn ngữ cấp thấp đơn giản.
  • Cho phép tiếp cận gần hơn đến phần gốc máy ảo Ethereum, giúp tối ưu hóa việc sử dụng gas trong các hợp động của bạn.

So sánh các ngôn ngữ

Để so sánh cú pháp cơ bản, vòng đời hợp đồng, giao diện, toán tử, cấu trúc dữ liệu, hàm, luồng điều khiển và hơn thế nữa, hãy xem bảng tính nhanh của Auditlessopens in a new tab.

Đọc thêm

Bài viết này hữu ích không?