Menu
CoddyTech

Trình biên dịch và playground Solidity online

Viết, chạy và chia sẻ đoạn code. Không cần thiết lập.

Contract.sol
Nhấn Chạy để xem đầu ra ở đây.
Đối sốCác giá trị truyền vào hàm main(...) của hợp đồng. Trình chạy mã hóa ABI cho chúng dựa trên kiểu của tham số.
Chưa có đối số. Nhấn "Thêm đối số" để truyền một đối số.

Thử Solidity ngay trên trình duyệt

Solidity là ngôn ngữ của smart contract trên Ethereum. Nó chạy trên EVM, chính máy ảo đang bảo vệ hàng trăm tỷ đô la trên mainnet và vận hành phần lớn các mạng L2. Playground này cho bạn một trình soạn thảo Monaco nối với solc + EVM của geth trong môi trường cách ly, để bạn viết contract, nhấn Chạy và thấy chính xác điều gì sẽ xảy ra on-chain: đầu ra console.log, các event được phát ra và trạng thái cuối cùng của các biến storage, mà không phải triển khai gì, trả phí gas hay đụng đến ví.

Solidity có vài điểm khác thường đáng để ý khi bạn mới bắt đầu. Storage mặc định là vĩnh viễn: mọi thứ gán cho một biến trạng thái đều được giữ lại, còn mọi thứ bên trong hàm sẽ mất khi lời gọi kết thúc. Event là cách contract giao tiếp với bên ngoài (frontend, indexer, The Graph): chúng tốn gas, được ghi vào log giao dịch và lọc được theo các tham số indexed. Và mọi hàm external đều nhận đầu vào qua ABI encoding, không phải stdin, nên playground có một bảng Đối số có kiểu, nối thẳng vào các tham số của main(...).

Playground Solidity này làm tốt những gì

  • Thực thi solc + EVM thật, không phải mô phỏng bằng transpiler. console.log dùng forge-std, còn emit và storage đi qua đúng ngữ nghĩa EVM: opcode, gas, đủ cả.
  • Tab Sự kiện hiển thị mọi emit trong lần chạy, các tham số indexed được đánh dấu riêng, để bạn thấy chính xác frontend hay subgraph sẽ nhận được gì.
  • Tab Storage hiển thị giá trị cuối cùng của mọi biến trạng thái mà contract đã ghi, kể cả các mục trong mapping (ví dụ balances[0xabc...]). Biến bạn không ghi sẽ không xuất hiện.
  • Bảng Đối số có kiểu truyền giá trị vào một main(uint256 n, string memory name, ...) có tham số. Trình chạy ABI-encode chúng theo chữ ký hàm của bạn, nên 42 thành uint256 và "hello" thành string.

Bạn có thể làm gì trong playground Solidity

  • Contract bộ đếm tăng giảm để học cách biến trạng thái được giữ lại giữa các lời gọi: ghi vào count, chạy, rồi xem nó xuất hiện trong tab Storage.
  • Các mẫu chuyển token: phát Transfer(from indexed, to indexed, value) và xem trường indexed và không indexed hiển thị khác nhau trong tab Sự kiện, giống như cách chúng xuất hiện trong log topic của EVM thật.
  • Các trường hợp lỗi require / revert: viết một điều kiện chặn đầu vào sai và xem thông báo revert hiện ra trong stdout, thay vì đốt gas cho một giao dịch thất bại trên mainnet.

Câu hỏi thường gặp về Solidity

Solidity là gì?

Solidity là ngôn ngữ smart contract phổ biến nhất cho Ethereum và các chain tương thích EVM (Polygon, Arbitrum, Optimism, Base...). Nó được biên dịch thành bytecode EVM, một tập lệnh máy ngăn xếp mà mọi node trong mạng đều thực thi. Về cú pháp, Solidity vay mượn từ JavaScript và C++, nhưng ngữ nghĩa rất khác: storage đắt và vĩnh viễn, mọi lời gọi đều bị tính gas, và không có async. Playground cho bạn một EVM cách ly để luyện ngôn ngữ mà không đụng đến chain thật.

Tôi có cần ví hay ETH testnet để dùng không?
Không. Playground chạy contract của bạn trong một EVM phía máy chủ (cùng engine đi kèm geth), trong một container riêng cho mỗi yêu cầu. Không có giao dịch on-chain, không trả gas bằng ETH thật, không cần chữ ký ví. Khi bạn nhấn Chạy, trình chạy triển khai contract lên một chain mới trong bộ nhớ, gọi hàm main(...) với các đối số bạn đã nhập, rồi cho bạn xem stdout, event và storage của lời gọi đó. Mọi thứ bị xóa sau lần chạy.
Làm sao để truyền đầu vào cho contract?
Cho contract một hàm tên main(...) với các tham số có kiểu tùy ý: function main(uint256 n) external hoặc function main(string memory name, uint256 age, bool active) external view. Sau đó nhập giá trị trong bảng Đối số bên dưới trình soạn thảo. Trình chạy đọc chữ ký hàm và ABI-encode các chuỗi bạn nhập thành đúng kiểu, giống như cast call trên dòng lệnh. Với đối số address, gõ 0x...; với bool, gõ true hoặc false; với uint, gõ giá trị thập phân.
Các tab Đầu ra, Sự kiện và Storage khác nhau thế nào?
Đầu ra hiển thị những gì bạn ghi ra stdout qua console.log(...) từ forge-std/console.sol, cùng mọi thông báo lỗi revert / require. Sự kiện hiển thị mọi event mà contract phát ra trong lần chạy, theo thứ tự, kèm giá trị của từng tham số (và một nhãn nhỏ "indexed" cho tham số indexed: đây là những tham số đi vào log topic của EVM và lọc được bằng công cụ như The Graph). Storage hiển thị giá trị sau khi chạy của mọi biến trạng thái đã được ghi, kể cả từng mục trong mapping; biến bạn không đụng đến sẽ không có trong danh sách.
Sao một số hướng dẫn Solidity tôi từng đọc lại không có main()?
Trên chain thật, contract Solidity không có một điểm vào duy nhất: máy khách gọi bất kỳ hàm public nào họ muốn, được xác định bằng selector 4 byte. Playground dùng main() như một quy ước để có sẵn một thứ rõ ràng để chạy và một chỗ để nhập đối số. Bên ngoài playground, contract của bạn thường có nhiều hàm (mint, transfer, withdraw...), và frontend hoặc một công cụ như cast / ethers / viem sẽ chọn gọi hàm nào.

Công cụ hữu ích cho Solidity

Các công cụ miễn phí chạy trên trình duyệt, dùng tốt cùng Playground Solidity, tất cả đều thuộc Coddy.