
Lý tưởng quốc Web3 của Gavin: Lịch sử tiến hóa hợp đồng thông minh và máy ảo Polkadot
Tuyển chọn TechFlowTuyển chọn TechFlow

Lý tưởng quốc Web3 của Gavin: Lịch sử tiến hóa hợp đồng thông minh và máy ảo Polkadot
Tầm nhìn của Gavin là xây dựng một thế giới internet phi tập trung hoàn toàn mới.
Tác giả: Quốc Tử
Polkadot, một dự án blockchain lâu đời, ngay cả những người làm trong ngành Web3 nếu chưa từng dùng sản phẩm của họ thì ít nhất cũng biết đến dự án này.

Gần đây Polkadot liên tục có tin tức mới, kiến trúc JAM mới khiến người ta chú ý, người sáng lập biểu diễn trò chơi DOOM cho thấy một diện mạo mới của Polkadot, khiến tôi vô cùng hứng thú nghiên cứu. Dự án Polkadot khá đồ sộ, lớn như chuỗi Polkadot, khung phát triển Substrate, chuỗi nối tiếp/chuỗi song song v.v., do giới hạn độ dài và sự tập trung nên lần này tôi chọn tuyến máy ảo - tầng thực thi mà tôi quan tâm nhất để trình bày lịch sử phát triển, tình hình hiện tại và các thông tin liên quan.
Tiền truyện
Khi Ethereum vừa được thành lập, Gavin Wood do hứng thú với Ethereum nên đã tham gia vào dự án phát triển. Lúc đó Ethereum chỉ là một khung sơ bộ, sau khi Gavin tham gia, Ethereum mới được hiện thực hóa về mặt kỹ thuật. Hãy xem xét đóng góp của ông tại Ethereum:
(1) Hoàn thiện PoC-1 (Proof of Concept-1) của Ethereum; (2) Gần như một mình hoàn thành phiên bản client đầu tiên bằng C++; (3) Viết sách trắng kỹ thuật Ethereum (Yellow Book); (4) Phát minh ra ngôn ngữ cấp cao Solidity dành cho phát triển hợp đồng thông minh.
Về lịch sử này, ai quan tâm có thể đọc "Vạn vật kết nối: Ethereum và tài chính số tương lai", còn câu chuyện huyền thoại của Gavin Wood dễ dàng tìm thấy trên mạng, ở đây không nhắc lại.
Hãy tập trung vào Solidity và EVM. Trước tiên xem đoạn mã ví dụ đơn giản của Solidity:
pragma solidity ^0.8.3; contract Counter { uint public count; function get() public view returns (uint) { return count; } function inc() public { count += 1; } function dec() public { count -= 1; } }
Ví dụ này khai báo một biến trạng thái count, bạn có thể coi nó như một khe cắm đơn trong cơ sở dữ liệu, có thể truy vấn và thay đổi qua mã quản lý cơ sở dữ liệu. Trong ví dụ này, hợp đồng định nghĩa các hàm inc, dec và get để sửa đổi hoặc truy xuất giá trị biến.
Sau khi biên dịch bằng trình biên dịch solc, sẽ nhận được một đoạn bytecode (xem bên dưới), sau khi triển khai lên nút qua JSON-RPC, tầng thực thi sẽ đạt đồng thuận trước, xác nhận rồi chuyển cho EVM thực thi.
6080604052348015600e575f80fd5b506101d98061001c5f395ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c806306661abd1461004e578063371303c01461006c5780636d4ce63c14610076578063b3bcfa8214610094575b5f80fd5b61005661009e565b60405161006391906100f7565b60405180910390f35b6100746100a3565b005b61007e6100bd565b60405161008b91906100f7565b60405180910390f35b61009c6100c5565b005b5f5481565b60015f808282546100b4919061013d565b92505081905550565b5f8054905090565b60015f808282546100d69190610170565b92505081905550565b5f819050919050565b6100f1816100df565b82525050565b5f60208201905061010a5f8301846100e8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610147826100df565b9150610152836100df565b925082820190508082111561016a57610169610110565b5b92915050565b5f61017a826100df565b9150610185836100df565b925082820390508181111561019d5761019c610110565b5b9291505056fea26469706673582212207b7edaa91dc37b9d0c1ea9627c0d65eb34996a5e3791fb8c6a42ddf0571ca98164736f6c634300081a0033
Chúng ta hãy xem nó dưới dạng lệnh assembly:
PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xE JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH2 0x1D9 DUP1 PUSH2 0x1C PUSH0 CODECOPY PUSH0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0xF JUMPI PUSH0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4A JUMPI PUSH0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6661ABD EQ PUSH2 0x4E JUMPI DUP1 PUSH4 0x371303C0 EQ PUSH2 0x6C JUMPI DUP1 PUSH4 0x6D4CE63C EQ PUSH2 0x76 JUMPI DUP1 PUSH4 0xB3BCFA82 EQ PUSH2 0x94 JUMPI JUMPDEST PUSH0 DUP1 REVERT JUMPDEST PUSH2 0x56 PUSH2 0x9E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x63 SWAP2 SWAP1 PUSH2 0xF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x74 PUSH2 0xA3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x7E PUSH2 0xBD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x8B SWAP2 SWAP1 PUSH2 0xF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x9C PUSH2 0xC5 JUMP JUMPDEST STOP JUMPDEST PUSH0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH0 DUP1 DUP3 DUP3 SLOAD PUSH2 0xB4 SWAP2 SWAP1 PUSH2 0x13D JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMP JUMPDEST PUSH0 DUP1 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH0 DUP1 DUP3 DUP3 SLOAD PUSH2 0xD6 SWAP2 SWAP1 PUSH2 0x170 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMP JUMPDEST PUSH0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xF1 DUP2 PUSH2 0xDF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x10A PUSH0 DUP4 ADD DUP5 PUSH2 0xE8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH0 REVERT JUMPDEST PUSH0 PUSH2 0x147 DUP3 PUSH2 0xDF JUMP JUMPDEST SWAP2 POP PUSH2 0x152 DUP4 PUSH2 0xDF JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x16A JUMPI PUSH2 0x169 PUSH2 0x110 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH0 PUSH2 0x17A DUP3 PUSH2 0xDF JUMP JUMPDEST SWAP2 POP PUSH2 0x185 DUP4 PUSH2 0xDF JUMP JUMPDEST SWAP3 POP DUP3 DUP3 SUB SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x19D JUMPI PUSH2 0x19C PUSH2 0x110 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH28 0x7EDAA91DC37B9D0C1EA9627C0D65EB34996A5E3791FB8C6A42DDF057 SHR 0xA9 DUP2 PUSH5 0x736F6C6343 STOP ADDMOD BYTE STOP CALLER
Xét quy trình thực thi từ góc nhìn nguyên lý biên dịch: Mã nguồn Solidity -> Phân tích cú pháp -> Phân tích cú pháp -> Biên dịch -> Bytecode -> Máy ảo -> Thực thi giải thích
Đúng vậy, trong ngành công nghệ nó chỉ là một ngôn ngữ lập trình mới, nhưng thời điểm đó thực sự là một điều rất tuyệt. Hai năm sau khi tham gia dự án phát triển Ethereum, Ethereum ra mắt đúng như kế hoạch. Nếu nói V Thần tạo hình thể cho Ethereum thì Gavin chính là người ban linh hồn cho Ethereum. Bitcoin là một hệ thống thanh toán điện tử, còn Ethereum khiến blockchain trở nên có thể lập trình được, Ethereum hô vang khẩu hiệu "Máy tính thế giới", mọi thứ đều thay đổi.
Web 3.0
Khi vẫn đang đảm nhiệm vai trò đồng sáng lập và CTO của Ethereum, ngày 17 tháng 4 năm 2014, Gavin đã đăng một bài viết trên blog "Insights into a Modern World": DApps: What Web 3.0 Looks Like[1], giải thích toàn diện hình ảnh Web3.0 mà ông mong muốn và bốn thành phần cấu thành Web3.0. Khái niệm Web3.0 nổi tiếng và ảnh hưởng lớn như thế nào thì ai cũng thấy rõ, còn Gavin không chỉ giỏi kỹ thuật mà còn có tầm nhìn chiến lược. Về lịch sử và tranh luận xung quanh Web 3.0, có thể tham khảo mục Web3 trên Wikipedia[2]. Nhà doanh nghiệp kiêm nhà đầu tư mạo hiểm Mỹ Nova Spivack[3] đề xuất mở rộng định nghĩa Web3.0 thành hiện thân cụ thể của các xu hướng công nghệ lớn hiện nay tiến tới giai đoạn trưởng thành mới, trích dẫn như sau:
• Mạng lưới khắp nơi: Sự phổ biến và phát triển của mạng băng thông rộng, kết nối internet của thiết bị di động. (Ví dụ: máy tính bảng)
• Tính toán mạng: Mô hình kinh doanh "dịch vụ SaaS", khả năng tương tác giữa các dịch vụ web, tính toán phân tán, tính toán lưới và tính toán tiện ích (còn gọi là "điện toán đám mây").
• Công nghệ mở: API và giao thức mở, định dạng dữ liệu mở, nền tảng phần mềm mã nguồn mở và dữ liệu mở (như giấy phép Creative Commons, giấy phép dữ liệu mở).
• Danh tính mở: OpenID, danh tiếng mở, danh tính xuyên miền và hồ sơ cá nhân.
• Mạng thông minh: Công nghệ web ngữ nghĩa như Khung mô tả tài nguyên (RDF), Ngôn ngữ bản thể web (OWL), SWRL, nền tảng ứng dụng ngữ nghĩa SPARQL và lưu trữ dữ liệu dựa trên tuyên bố.
• Cơ sở dữ liệu phân tán: Cơ sở dữ liệu toàn cầu ("World Wide Database", được hiện thực bởi công nghệ web ngữ nghĩa).
• Ứng dụng thông minh: Xử lý ngôn ngữ tự nhiên, học máy, suy luận máy, đại lý tự chủ.

Cuối năm 2015, Gavin rời khỏi Ethereum.
Sau đó ông sáng lập Parity Technologies, và phát triển một client Ethereum viết bằng ngôn ngữ Rust, từng thống trị thị trường ví hệ Ethereum. Lý do Gavin rời Ethereum chúng ta không rõ, điều chúng ta biết là tầm nhìn của Gavin là xây dựng một thế giới internet phi tập trung hoàn toàn mới.
"Đối với tôi Ethereum là một thí nghiệm, một mẫu thử nghiệm để kiểm chứng tính khả thi của công nghệ. Ethereum cũng là ngôi trường của tôi, giờ tôi đã tốt nghiệp, tôi muốn thử làm nhiều việc hơn."
"Thực ra điều tôi học được nhiều nhất từ Ethereum không phải là kỹ thuật (lúc đó Ethereum có một nhóm nghiên cứu chuyên trách chi tiết kỹ thuật), mà là kinh nghiệm xã hội. Quản trị là một trong số đó. Tôi cho rằng nâng cao năng lực hệ thống thông qua quản trị trong hệ thống blockchain là rất quan trọng, đây sẽ là đặc điểm cách mạng mới, điều mà Ethereum chưa làm được."
Trong thời gian ở Ethereum, Gavin luôn là người thực hành, nhưng không phải người thiết kế, và ông luôn ấp ủ những đổi mới mới.
Sự ra đời của Polkadot
Một năm sau, Gavin giải quyết được vấn đề khó khăn luôn ám ảnh ông và công bố sách trắng Polkadot vào năm 2016. Nhiều người biết rằng ngoài giải quyết vấn đề mở rộng, Polkadot còn muốn các blockchain độc lập có thể giao tiếp với nhau, tức là vấn đề liên chuỗi. Nhưng khi nhắc đến Polkadot, điều bạn cần biết nhất là: phân mảnh, vì phân mảnh đến mức cực đoan, thực chất chính là Polkadot.
Lời nguyên văn của Gavin, người sáng lập Polkadot, càng làm rõ điểm này:
"Logic thiết kế của Polkadot (Polkadot) không trực tiếp liên tưởng đến khả năng tương tác. Chúng tôi đang chờ đợi công nghệ phân mảnh của Ethereum ra mắt. Nhưng phân mảnh mãi không thực hiện được, đến nay vẫn chưa ra mắt. Vì vậy tôi muốn tự làm một 'Ethereum' có khả năng mở rộng mạnh hơn, đẩy khái niệm phân mảnh đến mức cực đoan trong quá trình thiết kế,干脆 không cần phân mảnh nữa, chỉ cần thiết kế các chuỗi độc lập. Với thiết kế này, các chuỗi khác nhau có thể truyền thông tin lẫn nhau, kết quả cuối cùng là thực hiện giao tiếp thông qua một lớp đồng thuận chia sẻ."
Vậy làm sao hiểu được phân mảnh? Trước tiên hãy nói về khó khăn của Ethereum, từ lâu nay vấn đề hiệu suất là điểm yếu cố hữu của Ethereum, năm 2018 vì cơn sốt CryptoKitties đã gây tắc nghẽn nghiêm trọng, không chỉ làm tăng thời gian chuyển khoản mà còn khiến phí chuyển khoản cao ngất. Giống như ngân hàng làm thủ tục, ngân hàng chỉ có một cửa sổ và tốc độ xử lý chậm, khi lượng người làm thủ tục tăng lên sẽ xếp hàng dài, chờ đợi.
Nhưng nếu ngân hàng có vài cửa sổ, cùng lúc làm thủ tục, có lẽ sẽ không cần xếp hàng. Đây là logic cơ bản của phân mảnh, chia các nút trong toàn bộ mạng thành các khu vực khác nhau gọi là phân mảnh, giao lượng lớn giao dịch cho các phân mảnh khác nhau xử lý, cực đại nâng cao hiệu suất.
Vì vậy trong Polkadot, mỗi phân mảnh đều mang theo logic cốt lõi, cho phép chúng thực hiện giao dịch song song, trao đổi dữ liệu, cuối cùng kết nối nhiều blockchain thành một mạng.
Sự xuất hiện của Polkadot, không chỉ sánh ngang hay thậm chí vượt xa viễn cảnh Ethereum 2.0, mà còn sáng tạo hơn ở chỗ: trong Polkadot, có thể có rất nhiều Ethereum. Nó không còn là một blockchain đơn thuần, "Polkadot muốn cung cấp một nền tảng thực sự mở và tự do cho các đổi mới xã hội khác nhau".
Đây là lý tưởng của Web3, là lý tưởng của Polkadot, cũng là lý tưởng của Gavin.
Polkadot 1.0
Chuỗi nối tiếp (relay chain) của Polkadot bản thân không hỗ trợ hợp đồng thông minh, nhưng các chuỗi song song [4] kết nối có thể tự do định nghĩa quy tắc chuyển đổi trạng thái, do đó có thể cung cấp chức năng hợp đồng thông minh. Điểm khác biệt so với các hệ sinh thái khác là trong bối cảnh Polkadot, chuỗi song song và hợp đồng thông minh nằm ở các tầng khác nhau của chồng xếp: hợp đồng thông minh nằm trên chuỗi song song. Chuỗi song song thường được mô tả là blockchain lớp 1 — điểm khác biệt là chúng không cần xây dựng bảo mật riêng và có thể nâng cấp, tương tác.
Polkadot mang lại tính linh hoạt cho nhà phát triển khi xây dựng hợp đồng thông minh, hỗ trợ cả hợp đồng Solidity chạy bởi EVM (Máy ảo Ethereum) và hợp đồng dựa trên Wasm dùng ink!:
Hợp đồng tương thích với EVM
Hệ sinh thái Polkadot hỗ trợ Máy ảo Ethereum (EVM), nhờ vào bộ công cụ Frontier[5]. Frontier cho phép các blockchain dựa trên Substrate chạy gốc bản các hợp đồng thông minh Ethereum và thông qua giao diện API/RPC tương thích với Ethereum, đạt được tương tác liền mạch với hệ sinh thái Ethereum. Hợp đồng được viết bằng các ngôn ngữ như Solidity hoặc Vyper, EVM được chuẩn hóa rộng rãi trong blockchain, bao gồm các chuỗi song song Polkadot như Astar, Moonbeam và Acala. Tính tương thích này cho phép triển khai hợp đồng trên nhiều mạng với ít sửa đổi nhất, từ đó hưởng lợi từ hệ sinh thái phát triển hoàn chỉnh và rộng lớn.
Ví dụ: Astar[6] là nền tảng hợp đồng thông minh then chốt trên Polkadot, phương pháp đa máy ảo độc đáo của nó đồng thời hỗ trợ hợp đồng EVM và WebAssembly (Wasm). Hỗ trợ hai VM này cho phép nhà phát triển lựa chọn môi trường lập trình yêu thích, đồng thời duy trì tính tương thích hoàn toàn với Ethereum. Runtime[7] của nền tảng được xây dựng trên Substrate bằng FRAME, kết hợp các thành phần chính từ Polkadot-SDK và các module tùy chỉnh để xử lý các tính năng độc đáo của nó.

Các chuỗi này thường sử dụng module hợp đồng có sẵn và thêm một số đổi mới. Ví dụ: Phala[8]: Sử dụng module hợp đồng trong môi trường thực thi đáng tin cậy, thực hiện thực thi hợp đồng thông minh bí mật và khả năng tương tác. Aleph Zero[9]: Sử dụng pallet hợp đồng trong môi trường kiến thức không. t3rn[10]: Sử dụng module hợp đồng như khối xây dựng, thực hiện thực thi đa chuỗi cho hợp đồng thông minh. Xem thêm các chuỗi song song tương thích EVM như Aster, Moonbeam, Acala v.v. trong tài liệu chính thức: Hợp đồng chuỗi song song[11]
Hợp đồng Wasm (ink!):
Polkadot cung cấp module Contracts[12] thông qua khung FRAME, module này sử dụng WebAssembly làm môi trường chạy cho hợp đồng. Về lý thuyết, bất kỳ ngôn ngữ nào có thể biên dịch sang Wasm đều có thể dùng để phát triển hợp đồng thông minh, nhưng vì tối ưu và thuận tiện Parity đã phát triển riêng ink![13].
Trước khi thảo luận ink!, trước tiên cần làm rõ Substrate[14] là gì và module hợp đồng (pallet-contracts) của nó. Substrate là một khung để xây dựng blockchain, có thể là blockchain độc lập hoặc blockchain kết nối với Kusama[15] hoặc Polkadot[16], tức là chuỗi song song.
Substrate bao gồm nhiều module, trong thuật ngữ Substrate gọi là pallet. Substrate đi kèm một bộ module, đáp ứng nhiều yêu cầu thường thấy của blockchain hiện đại — — đặt cược, token đồng nhất, token không đồng nhất, quản trị v.v..
Substrate cũng đi kèm một module dành cho hợp đồng thông minh, gọi là pallet Contracts. Nếu phát triển chuỗi song song trên Substrate, có thể dễ dàng thêm chức năng hợp đồng thông minh bằng cách bao gồm pallet này. Module này chỉ là môi trường thực thi, nó lấy file WebAssembly làm đầu vào. Hợp đồng thông minh của module phải được biên dịch thành kiến trúc đích WebAssembly (Wasm).
Ink! phát huy tác dụng ở đây như thế nào? Ink! là một ngôn ngữ lập trình, cụ thể hơn, nó là một ngôn ngữ chuyên biệt nhúng (eDSL) của ngôn ngữ lập trình Rust phổ biến. Điều này có nghĩa bạn có thể sử dụng tất cả cú pháp Rust thông thường cùng một số chi tiết mới được thêm vào, khiến ngôn ngữ phù hợp với thế giới hợp đồng thông minh. Module hợp đồng nhận các hợp đồng ink! này và thực thi chúng một cách an toàn. Nói ngắn gọn:
Sử dụng ink!, bạn có thể viết hợp đồng thông minh bằng Rust cho blockchain được xây dựng bằng Substrate có chứa pallet Contracts.
Ink! không tạo ra một ngôn ngữ mới, nó chỉ là Rust tiêu chuẩn với "định dạng hợp đồng" rõ ràng, kèm theo macro thuộc tính chuyên biệt #[ink(...)]. Các macro thuộc tính này nói với ink! các phần khác nhau của hợp đồng thông minh Rust đại diện cho cái gì, và cuối cùng cho phép ink! thực hiện mọi phép màu cần thiết để tạo bytecode Wasm tương thích với Polkadot SDK. Vì hợp đồng thông minh ink! được biên dịch thành Wasm, chúng cung cấp tốc độ thực thi cao, độc lập nền tảng và bảo mật nâng cao thông qua thực thi sandbox.
Hãy xem một hợp đồng ink! đơn giản. Hợp đồng ở đây lưu trữ một giá trị boolean trong bộ nhớ. Sau khi tạo hợp đồng, nó đặt giá trị boolean thành true. Hợp đồng công bố hai hàm: một hàm để đọc giá trị hiện tại của boolean (fn get()), và một hàm để chuyển giá trị thành giá trị boolean ngược lại (fn flip()).
#[ink::contract] mod flipper { #[ink(storage)] pub struct Flipper { value: bool, } impl Flipper { #[ink(constructor)] pub fn new(init_value: bool) -> Self { Self { value: init_value } } #[ink(message)] pub fn flip(&mut self) { self.value = !self.value; } #[ink(message)] pub fn get(&self) -> bool { self.value } }}
Nhìn có vẻ tương tự khả năng mà Solidity cung cấp, Storage lưu trữ, Message tin nhắn, Errors lỗi, Event sự kiện v.v.. Đối với nhà phát triển hợp đồng, điều này có nghĩa họ có thể sử dụng ink! để viết hợp đồng thông minh, nhưng cũng có thể quyết định dùng ngôn ngữ khác: Trình biên dịch Solang cho Solidity[17] và ask! cho AssemblyScript[18] (như bên dưới)
import { env, Pack } from "ask-lang";import { FlipEvent, Flipper } from "./storage";@contractexport class Contract { _data: Pack<Flipper>; constructor() { this._data = instantiate<Pack<Flipper>>(new Flipper(false)); } get data(): Flipper { return this._data.unwrap(); } set data(data: Flipper) { this._data = new Pack(data); } @constructor() default(flag: bool): void { this.data.flag = flag; } @message({ mutates: true }) flip(): void { this.data.flag = !this.data.flag; let event = new FlipEvent(this.data.flag); // @ts-ignore env().emitEvent(event); } @message() get(): bool { return this.data.flag; }}
Việc thêm ngôn ngữ mới không khó. Chỉ cần có trình biên dịch ngôn ngữ phù hợp với WebAssembly, sau đó có thể triển khai API pallet Contracts.
Hiện tại, API này bao gồm khoảng 15-20 hàm, có thể dùng cho mọi chức năng mà hợp đồng thông minh có thể cần: truy cập lưu trữ, chức năng mã hóa, thông tin môi trường (như số khối), truy cập hàm để lấy số ngẫu nhiên hoặc tự chấm dứt hợp đồng v.v.. Không phải tất cả đều phải triển khai bằng ngôn ngữ đó— ink! "Hello,World!" chỉ cần sáu hàm API. Mô hình sau mô tả mối quan hệ này:

So với EVM, việc chọn ink! và pallet Contracts có nhiều lợi thế. Tổng kết một số lợi thế được trình bày chi tiết trong bài viết:
• ink! chỉ là Rust — bạn có thể sử dụng tất cả công cụ Rust thông thường: clippy, crates.io[19], IDE v.v..
• Rust là một ngôn ngữ kết hợp nhiều năm nghiên cứu ngôn ngữ, an toàn và nhanh. Ngoài ra, rút kinh nghiệm chính từ các ngôn ngữ hợp đồng thông minh cũ hơn (như Solidity) và đưa vào thiết kế ngôn ngữ ink!. Chọn hành vi mặc định hợp lý hơn, ví dụ tắt nhập mặc định hoặc đặt hàm là riêng tư mặc định.
• Rust là một ngôn ngữ tuyệt vời, được đánh giá là ngôn ngữ lập trình được yêu thích nhất trong bảy năm liên tiếp trên StackOverflow (nguồn[20]).
• Nếu bạn là một công ty và muốn thuê nhà phát triển hợp đồng thông minh, bạn có thể tuyển từ hệ sinh thái Rust, lớn hơn nhiều so với thị trường ngách nhà phát triển Solidity.
• ink! là bản địa của Substrate, sử dụng các nguyên thủy tương tự, như hệ thống kiểu giống nhau.
• Đường chuyển đổi từ hợp đồng sang chuỗi song song rất rõ ràng. Vì ink! và Substrate đều là Rust, nhà phát triển có thể dùng phần lớn mã, kiểm thử cũng như mã frontend và client.
• WebAssembly là một tiêu chuẩn ngành, không chỉ dùng trong thế giới blockchain. Nó được cải tiến liên tục bởi các công ty lớn như Google, Apple, Microsoft, Mozilla và Facebook.
• WebAssembly mở rộng loạt ngôn ngữ có sẵn cho nhà phát triển hợp đồng thông minh, bao gồm Rust, C/C++, C#, Typescript, Haxe, Kotlin v.v.. Điều này có nghĩa bạn có thể dùng bất kỳ ngôn ngữ quen thuộc nào để viết hợp đồng thông minh. Thiết kế này có tầm nhìn xa hơn so với sự ghép nối chặt chẽ giữa ngôn ngữ và kiến trúc thực thi.
Về nội dung mục này, có thể đọc What is Parity's ink!?[21] để biết thêm thông tin.
Polkadot 2.0 / JAM
Ngày 28 tháng 2, Gavin Wood lần đầu tiên công khai biểu diễn trò chơi DOOM chạy trên JAM tại chuyến lưu diễn JAM ở Thượng Hải! Đây là khoảnh khắc lịch sử trong ngành blockchain, JAM khiến blockchain không chỉ là một mạng lưới mà còn là một nền tảng siêu máy tính mạnh mẽ, hỗ trợ chạy các phần mềm thông thường như DOOM, đồng thời cung cấp năng lực tính toán mạnh mẽ và độ trễ thấp.

Bỏ qua các yếu tố khác, chúng ta vẫn chỉ xem máy ảo, dựa trên việc tôi đọc mã nguồn liên quan đến PolkaVM mấy ngày nay, điều này thực sự xảy ra, điểm mấu chốt là PolkaVM có Host chạy VM, cung cấp giao diện xuất phía trên, sau đó chạy mã phiên bản RISC-V của Doom phiên bản guest trên VM.
Mã nguồn tại đây:
https://github.com/paritytech/polkavm/tree/master/examples/doom
Hãy xem một số thành phần chính của giải pháp hợp đồng thông minh mới nhất này:
Pallet Revive
Pallet Revive[22] cung cấp chức năng triển khai và thực thi hợp đồng thông minh PolkaVM cho runtime. Đây là một nhánh pallet_contracts được sửa đổi nhiều. Các hợp đồng này có thể được viết bằng bất kỳ ngôn ngữ nào biên dịch sang RISC-V. Hiện tại, ngôn ngữ được hỗ trợ chính thức duy nhất là Solidity (thông qua revive[23]) và Rust (xem ví dụ Rust trong thư mục fixtures).
Tương thích với Ethereum ở tầng ngôn ngữ hợp đồng: có thể viết hợp đồng bằng Solidity và tương tác với nút qua JSON RPC Ethereum và ví Ethereum như MetaMask. Ở tầng dưới, hợp đồng được biên dịch lại từ YUL sang RISC-V để sử dụng PolkaVM thay vì EVM chạy chúng. Để đơn giản hóa thao tác, có thể dùng phiên bản REMIX[24] tùy chỉnh để biên dịch hợp đồng thành RISC-V và triển khai lên Westend Asset Hub Parachain[25].
Revive
Revive[26] là tên chung cho dự án trình biên dịch "Solidity to PolkaVM", bao gồm nhiều thành phần (ví dụ frontend YUL và bản thực thi resolc). resolc là tên tệp nhị phân frontend điểm vào đơn, dùng tất cả các thành phần revive một cách minh bạch để tạo ra bản artefact hợp đồng đã biên dịch. Có thể biên dịch hợp đồng Solidity thành mã RISC-V có thể thực thi bởi PolkaVM, từ đó thực hiện chạy hợp đồng Solidity trên Polkadot.
Để làm điều này cần một trình biên dịch. Nguyên lý hoạt động là dùng trình biên dịch solc gốc, sau đó biên dịch lại đầu ra biểu diễn trung gian (YUL) của nó thành RISC-V. LLVM[27] là một khuôn khổ trình biên dịch phổ biến và mạnh mẽ, được dùng làm backend trình biên dịch, đảm nhận công việc nặng nề trong tối ưu và tạo mã RISC-V. revive chủ yếu chịu trách nhiệm hạ biểu diễn trung gian YUL (IR) do solc tạo thành IR của LLVM.

Phương pháp này cung cấp sự cân bằng tốt giữa mức độ tương thích Ethereum cao, hiệu suất hợp đồng tốt và nỗ lực kỹ thuật khả thi. So với việc thực hiện trình biên dịch Solidity đầy đủ, lợi thế là nhiệm vụ nhỏ hơn nhiều. Bằng cách chọn phương pháp này, có thể hỗ trợ tất cả các thói quen và điểm kỳ lạ của Solidity và mọi phiên bản khác nhau.
PolkaVM
PolkaVM[28] là một máy ảo cấp người dùng chung dựa trên RISC-V. Đây là thay đổi rõ rệt nhất so với các công nghệ cạnh tranh. Sử dụng máy ảo tùy chỉnh mới thay vì EVM để thực thi hợp đồng. Hiện tại, một trình thông dịch PolkaVM được bao gồm trong runtime. Bản cập nhật sau sẽ cung cấp JIT PolkaVM đầy đủ chạy trong client.

• An toàn mặc định và ở trong sandbox. Mã chạy trong máy ảo nên chạy trong tiến trình riêng biệt và không thể truy cập hệ thống host, ngay cả khi có kẻ tấn công có quyền thực thi mã từ xa hoàn toàn bên trong máy ảo.
• Tốc độ thực thi nhanh. Hiệu suất runtime của mã chạy trong VM nên sánh ngang với VM WebAssembly tiên tiến nhất, ít nhất ở cùng bậc độ lớn.
• Biên dịch nhanh, đảm bảo biên dịch đơn O(n). Việc tải mã mới vào máy ảo nên gần như tức thì.
• Sử dụng bộ nhớ thấp. Chi phí bộ nhớ cơ bản cho mỗi phiên bản đồng thời của máy ảo không nên vượt quá 128KB.
• Tệp nhị phân nhỏ. Chương trình biên dịch cho VM này nên chiếm ít không gian nhất có thể.
• Không lãng phí không gian địa chỉ ảo. VM không nên cấp phát trước không gian địa chỉ ảo cấp GB cho mục đích sandbox.
• Hoàn toàn xác định. Với cùng đầu vào và cùng mã, việc thực thi nên luôn trả về đầu ra hoàn toàn giống nhau.
• Hỗ trợ đo gas không đồng bộ hiệu suất cao. Đo gas nên rẻ, xác định và khá chính xác.
• Đơn giản. Một lập trình viên có thể viết trình thông dịch hoàn toàn tương thích với máy ảo này trong chưa đầy một tuần.
• Ngữ nghĩa hoạt động được phiên bản hóa. Mọi thay đổi trong tương lai đối với ngữ nghĩa quan sát được bởi chương trình khách sẽ được phiên bản hóa và rõ ràng là phải tham gia.
• Được chuẩn hóa. Nên có một đặc tả hoàn chỉnh mô tả ngữ nghĩa hoạt động quan sát được bởi khách hàng của máy ảo này.
• Đa nền tảng. Trên hệ điều hành và nền tảng không được hỗ trợ, VM sẽ chạy ở chế độ thông dịch.
• Phụ thuộc bên ngoài tối thiểu. Máy ảo nên cơ bản độc lập, biên dịch nhanh và có khả năng chống lại các cuộc tấn công chuỗi cung ứng.
• Công cụ tích hợp để gỡ lỗi và phân tích hiệu suất.
Hai khác biệt căn bản với EVM là:
• Máy thanh ghi - EVM là máy ngăn xếp. Điều này có nghĩa tham số hàm được truyền qua ngăn xếp vô hạn. PolkaVM dựa trên RISC-V, là một máy thanh ghi. Điều này có nghĩa nó truyền tham số qua một tập hợp thanh ghi hữu hạn. Lợi ích chính là, vì đều là máy thanh ghi, nên bước chuyển đổi cho phần cứng nền tảng hiệu quả hơn. Số lượng thanh ghi được chọn cẩn thận, nhỏ hơn tập lệnh x86-64 nổi tiếng thiếu thanh ghi. Cho phép đơn giản hóa vấn đề phân bổ thanh ghi NP-hard thành ánh xạ 1-1 đơn giản là bí mật đằng sau thời gian biên dịch nhanh của PolkaVM.
• Giảm kích thước từ - EVM sử dụng kích thước từ 256 bit. Điều này có nghĩa mọi phép toán số học đều phải thực hiện trên các con số lớn này. Điều này khiến mọi phép toán số học có ý nghĩa đều rất chậm, vì phải chuyển thành nhiều lệnh bản địa. PolkaVM sử dụng kích thước từ 64 bit, được phần cứng nền tảng hỗ trợ bản địa. Nghĩa là khi chuyển đổi hợp đồng Solidity qua YUL (#Revive), vẫn sẽ dùng số học 256 bit vì YUL quá thấp cấp không thể tự động chuyển đổi kiểu số nguyên. Nhưng hoàn toàn có thể viết hợp đồng bằng ngôn ngữ khác và gọi nó một cách liền mạch từ Solidity. Hình dung một hệ thống, trong đó logic kinh doanh được viết bằng Solidity, nhưng kiến trúc nền tảng được viết bằng ngôn ngữ nhanh hơn, tương tự Python, nơi phần lớn công việc nặng do module C đảm nhiệm.
Tổng kết
Ngôn ngữ lập trình hợp đồng thông minh
Số lượng ngôn ngữ hợp đồng thông minh tăng theo từng năm. Việc chọn ngôn ngữ đầu tiên có thể là thách thức, đặc biệt với người mới bắt đầu. Việc chọn lựa chủ yếu phụ thuộc vào hệ sinh thái bạn quan tâm, mặc dù một số ngôn ngữ phù hợp với nhiều nền tảng. Mỗi ngôn ngữ đều có ưu và nhược điểm riêng, bài viết này không định liệt kê từng cái.
Có người hỏi tại sao lại có nhiều ngôn ngữ hợp đồng đến vậy? Tôi tổng kết có vài khả năng: 1) Ngôn ngữ hiện tại không đáp ứng được đặc tính riêng của chuỗi; 2) Hiệu suất, an toàn, chi phí tốt hơn; 3) Sở thích :)
Bản thân tôi không thiên vị ngôn ngữ hợp đồng nào, dưới đây trích dẫn vài tiếng nói khác nhau, từ đó cũng có thể thu được những bài học khác nhau, dù là từ góc nhìn người dùng hay thiết kế ngôn ngữ hay VM.
• Tại sao không dùng Solidity? Solidity là người tiên phong được tôn vinh, nhưng bị ràng buộc bởi nhiều điểm kỳ quặc lịch sử của EVM. Nó thiếu các tính năng phổ biến mà lập trình viên mong đợi, hệ thống kiểu tương đối nghèo nàn biểu cảm, và thiếu hệ sinh thái công cụ thống nhất. Trong Sway, chúng tôi cho phép bạn thiết kế hợp đồng thông minh bằng một bộ công cụ hiện đại đầy đủ. Bạn sẽ nhận được một ngôn ngữ đầy đủ chức năng, bao gồm generic, kiểu đại số và đa hình dựa trên đặc điểm. Bạn cũng nhận được một chuỗi công cụ tích hợp, thống nhất và dễ sử dụng, bao gồm máy chủ LSP hoàn thành mã, định dạng, tạo tài liệu và mọi thứ cần thiết để chạy và triển khai hợp đồng, giúp bạn dễ dàng đạt được điều cần. Hệ thống kiểu biểu cảm của chúng tôi cho phép bạn phát hiện lỗi ngữ nghĩa, chúng tôi cung cấp giá trị mặc định tốt và thực hiện kiểm tra phân tích tĩnh rộng rãi (ví dụ buộc kiểm tra, hiệu ứng, tương tác bạn có thể dùng java.lang.Integer.pattern để đảm bảo viết mã an toàn, chính xác tại thời điểm biên dịch.
via https://docs.fuel.network/docs/sway/
• Tại sao không dùng Rust? Mặc dù Rust là một ngôn ngữ lập trình hệ thống tuyệt vời (chính Sway cũng được viết bằng Rust), nhưng nó không phù hợp với phát triển hợp đồng thông minh. Rust tuyệt vời vì nó có thể dùng trừu tượng chi phí bằng không và mô hình bộ nhớ kiểm tra mượn phức tạp, đạt hiệu suất runtime ấn tượng cho chương trình phức tạp không có bộ dọn rác. Trên blockchain, chi phí thực thi và triển khai là tài nguyên khan hiếm. Sử dụng bộ nhớ thấp, thời gian thực thi ngắn. Điều này khiến quản lý bộ nhớ phức tạp thường quá đắt và không đáng, còn trình kiểm tra mượn của Rust trở thành gánh nặng mà không có lợi ích gì. Ngôn ngữ lập trình chung thường không phù hợp với môi trường này, vì thiết kế của chúng phải giả định thực thi trong môi trường tính toán chung. Sway cố gắng mang lại mọi lợi thế khác của Rust cho nhà phát triển hợp đồng thông minh bằng cách cung cấp cú pháp quen thuộc và các chức năng phù hợp nhu cầu cụ thể của môi trường blockchain, bao gồm hệ thống kiểu hiện đại, phương pháp an toàn và giá trị mặc định tốt.
via https://docs.fuel.network/docs/sway/
• Mã Clarity được giải thích và thực thi hoàn toàn theo cách viết. Solidity và các ngôn ngữ khác được biên dịch thành bytecode trước khi gửi lên chuỗi. Nguy hiểm của việc biên dịch ngôn ngữ hợp đồng thông minh có hai mặt: thứ nhất, trình biên dịch thêm một lớp phức tạp. Lỗi trong trình biên dịch có thể khiến bytecode khác với mong đợi, từ đó mang rủi ro tạo lỗ hổng. Thứ hai, bytecode không thể đọc được bởi con người, khiến việc xác minh thực tế hợp đồng thông minh đang làm gì trở nên khó khăn. Hãy tự hỏi, bạn có ký một hợp đồng mà bạn không thể đọc không? Nếu câu trả lời là không, vậy hợp đồng thông minh khác gì? Với Clarity, những gì bạn thấy là những gì bạn nhận được.
via https://docs.stacks.co/concepts/clarity#clarity-is-interpreted-not-compiled
Máy ảo và tập lệnh
Từ JVM quen thuộc đến EVM nổi lên mang tính gợi ý trong lĩnh vực blockchain, theo tôi biết có hàng chục máy ảo, cách hiện thực máy ảo khác nhau, trong đó trình thông dịch (Interpreter) cốt lõi thường là một trong những cách thực thi cơ bản nhất, đặc biệt là ngoài biên dịch Just-In-Time (JIT) hoặc biên dịch Ahead-Of-Time (AOT), Interpreter vẫn được dùng rộng rãi để thực thi mã, chịu trách nhiệm phân tích và thực thi bytecode.
Ví dụ trình thông dịch
Dùng một ví dụ nhỏ minh họa trình thông dịch cơ bản cốt lõi nhất, tạm bỏ qua các cơ chế tối ưu.
use std::collections::VecDeque; #[derive(Debug, Clone, Copy)] enum OpCode {Push(i32), Add, Sub, Mul, Div, Print} struct Interpreter { stack: Vec<i32>, } impl Interpreter { fn new() -> Self { Interpreter { stack: Vec::new() } } fn run(&mut self, bytecode: VecDeque<OpCode>) { for op in bytecode { match op { OpCode::Push(value) => self.stack.push(value), OpCode::Add => self.binary_op(|a, b| a + b), OpCode::Sub => self.binary_op(|a, b| a - b), OpCode::Mul => self.binary\_op(|a, b| a * b), OpCode::Div => self.binary\_op(|a, b| a / b), OpCode::Print => { if let Some(value) = self.stack.last() { println!("{}", value); } } } } }fn binary_op(&mut self, op: fn(i32, i32) -> i32) { if self.stack.len() < 2 { panic!("Stack underflow!"); } let b = self.stack.pop().unwrap(); let a = self.stack.pop().unwrap(); self.stack.push(op(a, b)); }} fn main() { let bytecode = VecDeque::from(vec!\[ OpCode::Push(10), OpCode::Push(20), OpCode::Add, OpCode::Push(5), OpCode::Mul, OpCode::Print, ]); let mut interpreter = Interpreter::new(); interpreter.run(bytecode); }
Mỗi lệnh gồm một opcode (mã thao tác), có thể có tham số, trình thông dịch dùng ngăn xếp (stack) lưu trữ dữ liệu tính toán, chỉ có 6 lệnh.
Phân loại tập lệnh
Từ ví dụ trình thông dịch trên, số lượng và khả năng mở rộng của lệnh quyết định hướng lớn của một máy ảo, theo phân tích của tôi, máy ảo có thể được phân loại theo tập lệnh, đại khái chia thành 4 loại sau:
1. Tập lệnh tự chế đại diện bởi EVM, dẫn đến phải làm rất nhiều công việc lặp lại như trình biên dịch, thiết kế lệnh... Trước EIP-3855[29] đã có 141 lệnh, và vẫn đang tiếp tục thêm lệnh mới.
2. WASM, dùng ngay, hỗ trợ nhiều ngôn ngữ, nhưng nặng, tài liệu Polkadot cũng nêu điểm này của WASM. Tôi nghĩ ưu điểm của WASM là hỗ trợ đa ngôn ngữ tự nhiên, nếu một chuỗi chỉ muốn chạy một đoạn logic, thô bạo ghi trạng thái vào slot storage tài khoản, thì khá phù hợp. Phát triển nhanh, tiếp cận nhanh, nhưng nhược điểm là lệnh không được thiết kế riêng cho blockchain, muốn hỗ trợ khả năng đặc biệt, muốn cắt xén thì rất khó (hơn 150 lệnh[30]).
Ở đây cũng cần nhắc đến SVM của Solana, nó thực thi lệnh BPF, có thể biên dịch thư viện liên kết động từ bất kỳ ngôn ngữ lập trình nào thành lệnh BPF, chỉ là ít phổ biến hơn WASM.
3. Dựa trên tập lệnh RISC-V, ví dụ PolkaVM và nhiều hệ zkVM hiện nay: ceno, eigen zkvm, jolt, mozak vm, nexus, o1vm, openvm, powdrVM, risc0, sp1, sphinx v.v.. Những cái khác tôi chưa kịp nghiên cứu, chỉ nói những gì tôi biết về PolkaVM và Nexus zkVM, nó thực hiện thông dịch lệnh RISC-V chung, hiện nay đa số ngôn ngữ sau khi biên dịch bằng GCC hoặc LLVM đều có thể xuất thành lệnh RISC-V, điều này mở rộng góc nhìn ở tầng ngôn ngữ, đặt nền móng cho hỗ trợ đa ngôn ngữ trong tương lai. Lệnh cơ bản RV32I là 47 lệnh, mở rộng tùy chọn, so với x86 hơn 3000 lệnh, thật sự là gọn nhẹ.
4. Thông dịch, ví dụ Clarity (Lisp) của Stacks, Lua của AO, Typescript của Mina v.v.. Vì vậy, tóm lại, nếu tay trái là EVM đại diện cho lệnh riêng tư, tay phải là WASM mở thì RISC-V là lựa chọn tốt để phát triển lại cân bằng, trước tiên các trình biên dịch đã hỗ trợ tập lệnh này, có thể tham khảo nhiều hiện thực. Thứ hai, dễ dàng thiết kế lệnh tùy chỉnh dựa trên nó.
Phụ lục: Khám phá tương lai hợp đồng thông minh đa chuỗi
Cùng với sự phát triển đa dạng của hệ sinh thái blockchain, ngày càng nhiều dự án ra mắt ngôn ngữ hợp đồng thông minh riêng để hỗ trợ chức năng độc đáo. Sáng tạo này tuy làm phong phú stack kỹ thuật nhưng cũng mang lại chi phí học tập và thách thức tương thích mới. Một vấn đề cốt lõi dần nổi bật: Có thể triển khai liền mạch hợp đồng Solidity trưởng thành lên các blockchain mới nổi không?
Vì vậy, chúng tôi cùng vài nhà nghiên cứu đam mê công nghệ biên dịch, cùng khởi xướng dự án trình biên dịch Hummanta. Dự án nhằm phá vỡ rào cản giữa các chuỗi, thực hiện biên dịch chéo ngôn ngữ hợp đồng thông minh, hỗ trợ biên dịch các ngôn ngữ Solidity, Move, Cairo, Sway sang nhiều môi trường máy ảo, bao gồm: EVM và các VM mới nổi: PolkaVM, SolanaVM, MoveVM, FuelVM v.v..

Tiến độ hiện tại của dự án
Chúng tôi đang thúc đẩy tầm nhìn này theo ba hướng:
1. Chuẩn hóa cú pháp và tập lệnh Tổng hợp hệ thống định nghĩa cú pháp các ngôn ngữ và tập lệnh máy ảo, đặt nền móng cho biên dịch chéo chuỗi.
2. Phát triển chuỗi công cụ biên dịch Xây dựng parser dựa trên LALRPOP[31], dùng Cranelift[32]/LLVM thực hiện tạo mã, hỗ trợ chuyển đổi từ đa ngôn ngữ sang bytecode mục tiêu đa dạng.
3. Trải nghiệm phát triển tích hợp Phát triển công cụ CLI Hummanta[33] (tương tự Cargo), cung cấp hỗ trợ toàn quy trình từ biên dịch đến triển khai.
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News












