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.
Các liên kết quan trọng
- Tài liệu tham khảoopens in a new tab
- Cổng thông tin ngôn ngữ Solidityopens in a new tab
- Solidity qua ví dụopens in a new tab
- GitHubopens in a new tab
- Phòng trò chuyện Solidity Gitteropens in a new tab được bắc cầu đến Phòng trò chuyện Solidity Matrixopens in a new tab
- Bảng tính nhanhopens in a new tab
- Blog Solidityopens in a new tab
- Twitter của Solidityopens in a new tab
Hợp đồng mẫu
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Từ khóa "public" giúp các biến6 // có thể truy cập được từ các hợp đồng khác7 address public minter;8 mapping (address => uint) public balances;910 // Các sự kiện cho phép các ứng dụng11 // phản ứng với các thay đổi hợp đồng cụ thể mà bạn khai báo12 event Sent(address from, address to, uint amount);1314 // Mã hàm khởi tạo chỉ được chạy khi hợp đồng15 // được tạo16 constructor() {17 minter = msg.sender;18 }1920 // 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 đồng22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // 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.
Các liên kết quan trọng
- Tài liệu tham khảoopens in a new tab
- Vyper qua ví dụopens in a new tab
- Thêm ví dụ về Vyperopens in a new tab
- GitHubopens in a new tab
- Trò chuyện cộng đồng Vyper trên Discordopens in a new tab
- Bảng tính nhanhopens in a new tab
- Các bộ khung và công cụ phát triển hợp đồng thông minh cho Vyper
- VyperPunk - học cách bảo mật và hack các hợp đồng thông minh Vyperopens in a new tab
- Vyper Hub để phát triểnopens in a new tab
- Các ví dụ hợp đồng thông minh Vyper hay nhấtopens in a new tab
- Các tài nguyên chọn lọc tuyệt vời về Vyperopens in a new tab
Ví dụ
1# Đấu giá mở23# Tham số đấu giá45# Người thụ hưởng nhận tiền từ người trả giá cao nhất67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# Trạng thái hiện tại của phiên đấu giá1213highestBidder: public(address)14highestBid: public(uint256)1516# Đặt thành true ở cuối, không cho phép bất kỳ thay đổi nào1718ended: public(bool)1920# 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ền2122pendingReturns: public(HashMap[address, uint256])2324# Tạo một phiên đấu giá đơn giản với `_bidding_time`2526# giây thời gian đấu giá thay mặt cho2728# địa chỉ người thụ hưởng `_beneficiary`.2930@external31def __init__(_beneficiary: address, _bidding_time: uint256):32 self.beneficiary = _beneficiary33 self.auctionStart = block.timestamp34 self.auctionEnd = self.auctionStart + _bidding_time3536# Đặt giá cho phiên đấu giá với giá trị được gửi3738# cùng với giao dịch này.3940# Giá trị sẽ chỉ được hoàn lại nếu4142# không thắng phiên đấu giá.4344@external45@payable46def bid():47 # Kiểm tra xem thời gian đặt giá đã kết thúc chưa.48 assert block.timestamp < self.auctionEnd49 # Kiểm tra xem giá thầu có đủ cao không50 assert msg.value > self.highestBid51 # 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.highestBid53 # Theo dõi giá thầu cao mới54 self.highestBidder = msg.sender55 self.highestBid = msg.value5657# Rút lại một giá thầu đã được hoàn lại trước đó. Mẫu rút tiền được5859# 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ếp6061# như một phần của bid(), một hợp đồng đặt giá độc hại có thể chặn6263# 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.6465@external66def withdraw():67 pending_amount: uint256 = self.pendingReturns[msg.sender]68 self.pendingReturns[msg.sender] = 069 send(msg.sender, pending_amount)7071# Kết thúc phiên đấu giá và gửi giá thầu cao nhất7273# cho người thụ hưởng.7475@external76def endAuction():77 # Một nguyên tắc hay là cấu trúc các hàm tương tác78 # 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ện81 # 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ác83 # Nếu các giai đoạn này bị trộn lẫn, hợp đồng khác có thể gọi84 # lại vào hợp đồng hiện tại và sửa đổi trạng thái hoặc gây ra85 # 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 đồng87 # bên ngoài, chúng cũng phải được coi là tương tác với88 # các hợp đồng bên ngoài.8990 # 1. Điều kiện91 # Kiểm tra xem thời gian kết thúc đấu giá đã đến chưa92 assert block.timestamp >= self.auctionEnd93 # Kiểm tra xem hàm này đã được gọi chưa94 assert not self.ended9596 # 2. Tác động97 self.ended = True9899 # 3. Tương tác100 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) và 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.
Các liên kết quan trọng
- Tài liệu Yulopens in a new tab
- Tài liệu Yul+opens in a new tab
- Bài viết giới thiệu Yul+opens in a new tab
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) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {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.
Các liên kết quan trọng
- GitHubopens in a new tab
- Thông báo về Feopens in a new tab
- Lộ trình Fe 2021opens in a new tab
- Trò chuyện Fe trên Discordopens in a new tab
- Twitter của Feopens in a new tab
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]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Hiệ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.