Tổng quan nghiên cứu

Sự bùng nổ của công nghệ chuỗi khối đã biến Ethereum trở thành nền tảng thực thi hợp đồng thông minh hàng đầu thế giới với hơn 458.939 hợp đồng được triển khai tính đến tháng 1 năm 2022. Tuy nhiên, rào cản tài chính lớn nhất đối với các nhà phát triển và người dùng hiện nay là phí giao dịch (gas fee). Điển hình như giao thức Wyvern Exchange của OpenSea từng ghi nhận mức tiêu thụ 13,43 tỷ gas chỉ trong một ngày 12 tháng 2 năm 2022, tương đương chi phí vận hành hơn 1,5 triệu USD tại thời điểm giao dịch. Thực trạng này đặt ra yêu cầu cấp thiết về việc tối ưu hóa mã nguồn nhằm giảm thiểu chi phí vận hành và bảo vệ tính kinh tế của các ứng dụng phi tập trung.

Mục tiêu cốt lõi của đề tài là nghiên cứu sâu về cơ chế tính phí của Máy ảo Ethereum (EVM), từ đó đề xuất hệ thống 7 quy tắc tối ưu hóa mã nguồn cấp cao Solidity và xây dựng công cụ kiểm tra tự động mang tên GasSaver. Nghiên cứu được thực hiện tại Trường Công nghệ Thông tin và Truyền thông thuộc Đại học Bách Khoa Hà Nội trong thời gian từ ngày 10 tháng 4 năm 2021 đến ngày 10 tháng 4 năm 2022. Ý nghĩa thực tiễn của công trình thể hiện ở việc phát hiện hơn 30.000 điểm lãng phí gas trong các hợp đồng hàng đầu, giúp tiết kiệm từ vài trăm đến hàng chục nghìn đơn vị gas trên mỗi lượt thực thi mà không làm thay đổi logic nghiệp vụ.

Cơ sở lý thuyết và phương pháp nghiên cứu

Khung lý thuyết áp dụng

Nghiên cứu được xây dựng trên nền tảng kiến trúc máy ảo Ethereum (EVM) với mô hình máy tính ngăn xếp 256-bit (Stack-based Machine) và hệ thống lưu trữ phân cấp Merkle Patricia Trie. Cơ chế tiêu thụ gas trong EVM quy định mức phí riêng biệt cho từng mã vận hành (Opcode). Thao tác ghi dữ liệu mới lên bộ lưu trữ trạng thái thông qua mã SSTORE tiêu tốn 20.000 gas, trong khi việc truy xuất bộ nhớ trạng thái chưa khởi tạo thông qua mã Gcoldsload tiêu tốn 2.100 gas, và thao tác đọc bộ nhớ tạm MLOAD chỉ tiêu tốn 3 gas.

Bên cạnh đó, đề tài khai thác sâu lý thuyết biểu diễn dữ liệu trong ngôn ngữ lập trình Solidity và lý thuyết tối ưu hóa luồng điều khiển. Ba khái niệm trọng tâm bao gồm: đóng gói biến trạng thái (Storage Packing) theo khe 32 bytes, định vị dữ liệu phân cấp (calldata so với memory), và luật tương đương logic De Morgan để rút gọn biểu thức boolean.

Phương pháp nghiên cứu

Nghiên cứu sử dụng phương pháp thực nghiệm kết hợp phân tích tĩnh cây cú pháp trừu tượng (Abstract Syntax Tree - AST). Nguồn dữ liệu bao gồm hai tập mẫu quy mô lớn: tập dữ liệu thứ nhất gồm 4.615 hợp đồng thông minh đã xác minh từ nghiên cứu học thuật của Tamara, và tập dữ liệu thứ hai gồm 10.245 hợp đồng đã xác minh được trích xuất từ bảng xếp hạng top 15.000 hợp đồng có lượt tương tác địa chỉ ví cao nhất mạng Ethereum trên Dune Analytics tính đến ngày 4 tháng 2 năm 2022.

Phương pháp chọn mẫu có chủ đích (purposive sampling) được áp dụng để tập trung vào các hợp đồng có tương tác thực tế cao, phản ánh chính xác tác động kinh tế của phí gas. Nhóm tác giả lựa chọn thư viện phân tích cú pháp Solidity Parser dựa trên ngữ pháp ANTLR để xử lý AST, kết hợp thuật toán tối ưu xếp thùng (Bin Packing Problem) và kỹ thuật quy hoạch động (Dynamic Programming). Phương pháp này cho phép nhận diện chính xác các cấu trúc mã lãng phí gas ngay trong quá trình bóc tách mã nguồn với độ trễ xử lý cực thấp.

Kết quả nghiên cứu và thảo luận

Những phát hiện chính

Quá trình quét tự động bằng công cụ GasSaver trên hai tập dữ liệu lớn đã mang lại nhiều kết quả định lượng mang tính đột phá:

  • Trong tập dữ liệu thứ nhất (4.615 hợp đồng), có 2.133 hợp đồng (chiếm tỷ lệ 46,2%) chứa ít nhất một lỗi lãng phí gas, trong đó lỗi không gán từ khóa hằng số (CSV) xuất hiện tại 1.331 hợp đồng và lỗi định vị dữ liệu/tầm nhìn hàm (DLFV) xuất hiện tại 861 hợp đồng.
  • Trong tập dữ liệu thứ hai (10.245 hợp đồng tương tác nhiều nhất), có tới 6.333 hợp đồng (chiếm tỷ lệ 61,8%) tồn tại cấu trúc mã chưa tối ưu, phát hiện tổng cộng hơn 30.000 vị trí vi phạm. Trong đó, vi phạm biến trạng thái bất biến (ISV) chiếm 1.879 hợp đồng, CSV chiếm 3.547 hợp đồng, và DLFV chiếm 2.879 hợp đồng.
  • Về mặt chi phí, việc gộp vòng lặp có cùng bước lặp (Loop Combination) giúp giảm 3.888 gas khi triển khai và 419 gas cho mỗi lượt gọi hàm. Việc đưa phép tính bất biến ra ngoài vòng lặp (Repeated Computation in Loop) giúp giảm 312 gas cho mỗi lượt thực thi. Đặc biệt, việc sắp xếp tối ưu thành viên trong Struct (MAS) giúp giảm bớt các khe lưu trữ 32 bytes, trực tiếp cắt giảm 20.000 gas cho mỗi thao tác SSTORE bị loại bỏ.

Thảo luận kết quả

Nguyên nhân chính dẫn đến sự xuất hiện dày đặc của các lỗi lãng phí gas là do thói quen của các lập trình viên thường chuyển dịch tư duy từ các ngôn ngữ truyền thống như C++, Java sang Solidity mà không chú ý đến chi phí vận hành đặc thù của từng opcode EVM. Nhóm quy tắc biểu diễn dữ liệu (Data Representation) như MAS, CSV, ISV và DLFV có tần suất vi phạm cao hơn nhiều so với nhóm quy tắc quan hệ logic (Logic Relation) vì các quy tắc này phụ thuộc chặt chẽ vào đặc thù quản trị bộ nhớ của Ethereum.

Dữ liệu phân tích thực nghiệm có thể được trực quan hóa thông qua biểu đồ phân bố vi phạm (Distribution of Violations) và bảng so sánh chi phí tiêu thụ gas trước - sau tối ưu. Kết quả kiểm thử hiệu năng cho thấy GasSaver hoàn thành quá trình phân tích trong khoảng từ 0 đến 1.000 ms đối với hơn 90% hợp đồng mẫu, và chỉ mất tối đa khoảng 7.000 ms đối với các cấu trúc phức tạp có trên 10 trường dữ liệu. So với công cụ của nhóm nghiên cứu Tamara, GasSaver thể hiện tính tương thích vượt trội với các phiên bản Solidity mới từ 0.6.5 trở lên và đưa ra các đề xuất chỉnh sửa trực tiếp ở tầng mã nguồn thay vì chỉ dừng lại ở tầng bytecode khó đọc.

Đề xuất và khuyến nghị

Dựa trên kết quả thực nghiệm, nghiên cứu đưa ra 4 giải pháp cụ thể nhằm tối ưu hóa chi phí cho hệ sinh thái hợp đồng thông minh:

  1. Tái cấu trúc thành viên trong cấu trúc dữ liệu Struct (MAS): Lập trình viên cần gom các kiểu dữ liệu có kích thước nhỏ hơn 32 bytes (như uint128, uint64, address, bool) đứng liền kề nhau để trình biên dịch đóng gói vào chung một slot lưu trữ. Giải pháp này giúp cắt giảm ngay 20.000 đến 40.000 gas cho mỗi slot tiết kiệm được trong chu kỳ phát triển quý 1.
  2. Tối ưu hóa thuộc tính hiển thị hàm và vị trí bộ nhớ (DLFV): Đội ngũ phát triển cần chuyển đổi các hàm không được gọi nội bộ sang tầm nhìn external và thay đổi vị trí của các tham số kiểu dữ liệu phức tạp từ memory sang calldata. Thao tác này giúp tiết kiệm từ 1.500 đến 3.000 gas trên mỗi giao dịch gọi hàm của người dùng.
  3. Áp dụng triệt để từ khóa constant và immutable (CSV/ISV): Kỹ sư smart contract bắt buộc phải khai báo từ khóa constant cho biến gán giá trị tĩnh và immutable cho biến chỉ gán một lần trong constructor, loại bỏ hoàn toàn chi phí đọc từ bộ lưu trữ SLOAD tốn 2.100 gas trên mỗi lần truy cập.
  4. Tích hợp công cụ phân tích tự động GasSaver vào pipeline CI/CD: Doanh nghiệp Web3 và các tổ chức kiểm toán nên nhúng công cụ GasSaver vào quy trình rà soát mã nguồn tự động, hướng tới mục tiêu giảm thiểu trên 60% lỗi lãng phí gas trước khi triển khai lên mạng chính thức trong vòng 6 tháng tới.

Đối tượng nên tham khảo luận văn

Công trình nghiên cứu mang lại giá trị thực tiễn và học thuật cho 4 nhóm đối tượng trọng tâm:

  1. Lập trình viên hợp đồng thông minh Solidity: Giúp các kỹ sư nắm vững 7 quy tắc viết mã tiết kiệm gas, hiểu rõ cơ chế vận hành của EVM để giảm thiểu chi phí triển khai và phí giao dịch cho sản phẩm.
  2. Chuyên gia kiểm toán an toàn và tối ưu Smart Contract: Sử dụng khung phân tích của GasSaver như một bộ tiêu chuẩn kiểm toán để đánh giá mức độ tối ưu hóa tài nguyên on-chain của các dự án DeFi, GameFi và NFT.
  3. Nhà nghiên cứu và giảng viên chuyên ngành Công nghệ thông tin: Nguồn tài liệu tham khảo giá trị về phân tích cây cú pháp trừu tượng AST, giải thuật đóng gói thùng và kỹ thuật tối ưu hóa mã nguồn trên nền tảng phi tập trung.
  4. Nhà quản lý dự án và kiến trúc sư hệ sinh thái Web3: Giúp hoạch định ngân sách triển khai hợp đồng thông minh, nâng cao tính cạnh tranh của sản phẩm khi giảm bớt 20% đến 50% gánh nặng phí gas cho người dùng cuối.

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

  1. Tại sao việc tối ưu hóa gas ở tầng mã nguồn Solidity lại ưu việt hơn tầng Bytecode? Tối ưu hóa ở tầng mã nguồn cho phép lập trình viên trực tiếp can thiệp và chỉnh sửa logic nghiệp vụ một cách minh bạch. Trong khi bytecode rất khó đọc và khó đối soát ngược, công cụ GasSaver phân tích trực tiếp cú pháp Solidity giúp chỉ rõ hơn 30.000 vị trí lỗi và gợi ý giải pháp sửa đổi mã cụ thể.

  2. Quy tắc sắp xếp thành phần trong Struct (MAS) giúp tiết kiệm gas theo cơ chế nào? Máy ảo EVM lưu trữ trạng thái theo từng khe 32 bytes (256-bit). Khi các biến kích thước nhỏ được sắp xếp liền kề, trình biên dịch sẽ đóng gói chúng vào cùng một khe lưu trữ, giúp giảm bớt số lượng lệnh SSTORE vốn tiêu tốn tới 20.000 gas cho mỗi thao tác ghi dữ liệu mới.

  3. Khi nào lập trình viên nên sử dụng calldata thay vì memory cho tham số đầu vào? Khi một hàm được khai báo với tầm nhìn external và tham số truyền vào là kiểu dữ liệu phức tạp (mảng, chuỗi ký tự, struct) không bị chỉnh sửa bên trong hàm, việc dùng calldata giúp đọc dữ liệu trực tiếp từ payload giao dịch mà không tốn chi phí sao chép vào bộ nhớ memory.

  4. Sự khác biệt căn bản giữa việc khai báo constant và immutable trong Solidity là gì? Biến constant được gán giá trị cố định ngay tại thời điểm biên dịch, trong khi biến immutable có thể được gán một lần duy nhất trong hàm khởi tạo constructor. Cả hai đều nhúng giá trị trực tiếp vào bytecode, giúp tránh thao tác SLOAD tốn 2.100 gas mỗi lần truy xuất.

  5. Công cụ GasSaver có nguy cơ làm biến đổi logic thực thi của hợp đồng thông minh không? Không, toàn bộ 7 quy tắc do GasSaver áp dụng đều dựa trên các phép biến đổi tương đương về mặt ngữ nghĩa và cấu trúc lưu trữ. Mọi chức năng nghiệp vụ của hợp đồng thông minh đều được bảo toàn nguyên vẹn 100% sau khi tối ưu hóa.

Kết luận

  • Luận văn đã hệ thống hóa toàn diện cơ chế tính phí gas của EVM và đề xuất 7 quy tắc tối ưu hóa mã nguồn cấp cao cho ngôn ngữ Solidity.
  • Xây dựng thành công công cụ mã nguồn mở GasSaver dựa trên bộ phân tích AST và giải thuật tối ưu hóa xếp thùng, đạt tốc độ xử lý dưới 1.000 ms cho phần lớn hợp đồng.
  • Kiểm thử thực nghiệm trên 10.245 hợp đồng hàng đầu Ethereum, phát hiện 61,8% hợp đồng chứa lỗi lãng phí gas với hơn 30.000 điểm vi phạm cụ thể.
  • Lộ trình phát triển trong 12 tháng tới sẽ tiếp tục mở rộng GasSaver để hỗ trợ phân tích luồng dữ liệu phức tạp và tối ưu hóa các lệnh Assembly nội tuyến.
  • Các nhà phát triển và tổ chức Web3 hãy nhanh chóng áp dụng các quy tắc tối ưu hóa của đề tài để giảm thiểu chi phí vận hành và xây dựng các ứng dụng phi tập trung bền vững.