Đơn vị 2 / 11

Hỗ trợ viết hợp đồng thông minh: Solidity/Vyper Draft và tạo mã an toàn

Lợi nhuận:

  • Khả năng sử dụng trí tuệ nhân tạo để tạo khuôn khổ, kiểm tra và đánh giá bản nháp dựa trên các thư viện đã được chứng minh (ví dụ: OpenZeppelin) và hiểu rằng con người đảm bảo an ninh sản xuất
  • Khả năng xác minh phiên bản mã, mẫu và kiểm soát truy cập do trí tuệ nhân tạo tạo ra thông qua biên dịch, thử nghiệm và testnet
  • Có thể phân biệt quá trình biên dịch đó không có nghĩa là an toàn và testnet và kiểm tra là điều cần thiết.

Viết hợp đồng thông minh khác với phần mềm thông thường: mã bạn viết là công khai, không thay đổi và là chương trình chuyển tiền trực tiếp. Trong phần này, bạn sẽ học cách sử dụng AI làm trợ lý phát triển hợp đồng thông minh; Chúng ta sẽ học từ quá trình sản xuất bản nháp đến viết thử nghiệm, từ việc thu hồi mẫu đến tối ưu hóa gas (phí giao dịch). Nhưng hãy làm rõ ngay từ đầu: AI tạo ra các bản thiết kế; Con người đảm bảo mã an toàn được đưa vào sản xuất.

Nền tảng đầu tiên: ngôn ngữ và môi trường

Ngôn ngữ hợp đồng thông minh phổ biến nhất là Solidity (ngôn ngữ của Ethereum và EVM - Máy ảo Ethereum, máy ảo chạy hợp đồng - chuỗi tương thích). Lựa chọn thay thế là Vyper (một ngôn ngữ giống Python nhằm mục đích hạn chế và dễ đọc hơn). Mã của bạn tiêu thụ gas (chi phí của mỗi giao dịch đối với blockchain); Mã không hiệu quả là tốn kém. Giữ các thuật ngữ này rõ ràng trong bối cảnh bạn đưa ra cho AI là chìa khóa để có được kết quả đầu ra chính xác.

AI có giá trị nhất không phải ở việc "viết từ đầu" mà ở việc tạo ra khuôn khổ + khuôn mẫu tốt: một khởi đầu tuân thủ các tiêu chuẩn, một kế hoạch chi tiết để bổ sung kiến ​​thức chuyên môn của bạn.

Các lớp sử dụng AI trong mã hóa

1. Tạo bộ xương. AI nhanh chóng khai thác bộ khung của mã thông báo tiêu chuẩn (ERC-20) hoặc NFT (ERC-721 — một tiêu chuẩn tài sản kỹ thuật số duy nhất). Nhưng hãy đảm bảo AI sử dụng thư viện đã được chứng minh: ví dụ: OpenZeppelin (thư viện hợp đồng tiêu chuẩn đã được kiểm toán, đáng tin cậy của cộng đồng). Quy tắc là sử dụng khối đã được kiểm tra thay vì viết bảo mật từ đầu.

2. Mô tả và đánh giá chức năng. Việc giải thích một chức năng hiện có cho AI cho phép bạn phát hiện sớm các lỗi logic.

3. Tạo thử nghiệm. AI rất giỏi trong việc tạo ra các trường hợp thử nghiệm cho các trường hợp đặc biệt: đầu vào bằng 0, số lượng rất lớn, người gọi trái phép, cuộc gọi lặp lại. Điều này nhắc nhở một trong những kịch bản mà người ta bỏ qua.

4. Gas và khả năng đọc. AI gắn cờ các mẫu đắt tiền như ghi vào bộ nhớ không cần thiết và đề xuất các lựa chọn thay thế.

Gợi ý: Hướng dẫn AI "Xây dựng dựa trên các hợp đồng đã được kiểm toán của OpenZeppelin, viết lại bảo mật từ đầu." Việc AI viết mã bảo mật gốc sẽ rủi ro hơn nhiều so với việc sử dụng thư viện đã được thử nghiệm.

Dấu nhắc yếu / Dấu nhắc mạnh

Dấu nhắc yếu:

Viết cho tôi một hợp đồng mã thông báo.

Lời nhắc này rất nguy hiểm: không rõ tiêu chuẩn nào, chuỗi nào, thư viện nào, yêu cầu bảo mật nào. AI tạo mã ngẫu nhiên, có thể lỗi thời hoặc không an toàn.

Lời nhắc mạnh mẽ:

Vai trò của bạn: nhà phát triển Solidity cấp cao. Tạo bản nháp mã thông báo ERC-20 cho chuỗi tương thích EVM. Quy tắc:- Dựa trên các hợp đồng ERC20 và Ownable đã được kiểm toán của OpenZeppelin.- Viết dòng phiên bản và giấy phép Solidity (SPDX) một cách rõ ràng.- Chỉ chủ sở hữu mới có quyền đúc tiền; thêm một nắp chống ép vô hạn. - Thêm chú thích NatSpec vào từng chức năng. - Viết bảo mật từ đầu; Sử dụng khối tiêu chuẩn. - Thêm cảnh báo ở cuối: “Đây là bản nháp, cần phải kiểm tra và thử nghiệm”. Đánh dấu những phần bạn không chắc chắn bằng // TODO.

Sự khác biệt: lời nhắc mạnh mẽ đưa ra các kỳ vọng rõ ràng về vai trò, tiêu chuẩn, thư viện, ranh giới bảo mật, tài liệu và xác thực.

Bốn mẫu có thể sao chép

1) Bộ xương dựa trên tiêu chuẩn:

Vai trò của bạn: Nhà phát triển Solidity. Tạo khung hợp đồng [ERC-20 / ERC-721 / đặt cược] dựa trên thư viện đã được kiểm toán OpenZeppelin. Viết giấy phép SPDX và phiên bản pragma. Thêm kiểm soát truy cập (ai có thể gọi) cho từng chức năng bên ngoài. Tái tạo lại an ninh; Sử dụng các khối tiêu chuẩn. Đây là một bản dự thảo.

2) Đánh giá chức năng:

Kiểm tra chức năng sau đây như một nhà phát triển cấp cao: nó làm gì, nó thay đổi trạng thái gì, ai có thể gọi nó? Đánh dấu các lỗi logic có thể xảy ra và rủi ro bảo mật là GIẢ THUYẾT, liên kết từng lỗi với một dòng trong mã. Đừng nói "an toàn" thẳng thừng; chỉ cần liệt kê những điểm cần chú ý.

3) Dự thảo kịch bản thử nghiệm:

Đề xuất các trường hợp thử nghiệm cho hợp đồng này (có thể là bản nháp cho Foundry/Hardhat). Cụ thể bao gồm các trường hợp giới hạn: đầu vào bằng 0, số lượng rất lớn, cuộc gọi trái phép, cuộc gọi đăng ký lại, không đủ tiền. Viết NHỮNG GÌ mỗi bài kiểm tra xác nhận.

4) Đánh giá khí và khả năng đọc:

Trong hợp đồng này, hãy đánh dấu các mẫu có thể giảm chi phí gas: ghi lưu trữ không cần thiết, gọi vòng lặp bên ngoài, tính toán lặp đi lặp lại. Giải thích sự khác biệt trước/sau trong mỗi gợi ý. Đề xuất tối ưu hóa vi phạm bảo mật; Nếu không rõ, hãy nói "Hỏi kiểm toán viên".

Ba trường hợp nhỏ (theo số lượng)

Trường hợp 1 - Skeleton cứu được 4 giờ. Một nhóm đã khai thác bộ khung của hợp đồng trao quyền dựa trên thư viện đã được kiểm toán với AI trong 30 phút; Phải mất ~ 4 giờ theo cách thủ công. Nhóm đã dành thời gian cho việc bảo mật và thử nghiệm. Lợi ích không đến từ việc chuyển giao bảo mật mà đến từ việc tăng tốc khuôn khổ tẻ nhạt.

Trường hợp 2 - Bẫy phiên bản lỗi thời. AI đã tạo ra một mẫu gửi Ether thô bằng cách chuyển. Điều này không còn được khuyến khích vì dữ liệu đào tạo đã lỗi thời. Nhà phát triển đã nhận thấy điều này và đã thay đổi nó thành mẫu được bảo vệ dựa trên cuộc gọi và quyền truy cập lại hiện tại. Bài học: Thư viện/mẫu của AI luôn được xác nhận là cập nhật; AI không biết ngoài ngày giới hạn đào tạo.

Trường hợp 3 - Bản nháp thử nghiệm xuất hiện lỗi ẩn. Bài kiểm tra "người gọi trái phép" mà AI đưa ra cho thấy nhà phát triển đã quên kiểm soát quyền truy cập trong một chức năng. onlyOwner thiếu 1 dòng, bị phát hiện sau 5 phút trên testnet; Có thể đã xảy ra tình trạng mất tiền trên mạng chính. Bài học: AI che đi điểm mù của con người trong thử nghiệm.

Ghi nhớ các mô hình bảo mật với AI

AI rất giỏi trong việc nhắc nhở bạn về các kiểu lỗ hổng đã biết như danh sách kiểm tra. Các mẫu phổ biến nhất:

  • Reentrancy: Thực hiện cuộc gọi ra bên ngoài mà không cập nhật trạng thái. Giải pháp: thứ tự kiểm tra-hiệu ứng-tương tác, bảo vệ reentrancy.
  • Thiếu kiểm soát truy cập: Bất kỳ ai cũng có thể gọi chức năng quan trọng.
  • Tràn/giảm số nguyên: Modern Solidity nắm bắt được hầu hết chúng, nhưng vẫn có rủi ro ở mã cấp thấp.
  • Xác thực đầu vào không đầy đủ: Địa chỉ bằng 0, kiểm soát số lượng bằng 0.
  • Sự phụ thuộc của Oracle: Tin tưởng mù quáng vào dữ liệu bên ngoài (chẳng hạn như giá cả).
Lưu ý: AI có thể gọi lại danh sách này nhưng không thể đảm bảo liệu một mục trong danh sách có nằm trong mã cụ thể của bạn hay không. Danh sách kiểm tra là một sự khởi đầu; Nó không phải là sự thay thế cho việc kiểm soát container.

Hiểu đúng ngữ cảnh: Bí quyết để viết mã tốt từ AI

Chất lượng mã mà AI tạo ra phụ thuộc trực tiếp vào chất lượng ngữ cảnh mà bạn đưa ra. Trong Web3, điều này đặc biệt quan trọng vì một chi tiết nhỏ (chuỗi nào, phiên bản Solidity nào, tiêu chuẩn mã thông báo nào) sẽ thay đổi toàn bộ đầu ra. Một bối cảnh tốt bao gồm:

  • Chuỗi mục tiêu và môi trường: Mạng chính Ethereum hay Lớp 2 (chuỗi bên rẻ hơn chạy trên chuỗi chính)? Chi phí gas và một số tính năng khác nhau tùy theo chuỗi.
  • Phiên bản và thư viện: Phiên bản Solidity nào, phiên bản OpenZeppelin nào? Nếu không có phiên bản nào được chỉ định, AI có thể tạo ra các mẫu lỗi thời, không được dùng nữa.
  • Yêu cầu về bảo mật: Có giới hạn không, có thể tạm dừng, có thể tăng lên không? Những điều này nên được nói ngay từ đầu.
  • Ràng buộc: Xóa các giới hạn như "không sử dụng lắp ráp", "tránh cuộc gọi bên ngoài", "tối ưu hóa gas nhưng vẫn duy trì khả năng đọc".

Một kỹ thuật mạnh mẽ khác là yêu cầu AI cung cấp kế hoạch trước, sau đó là mã: "Đầu tiên hãy liệt kê các chức năng của hợp đồng này và từng chức năng sẽ làm gì; hãy viết mã sau khi tôi phê duyệt." Điều này sẽ sớm phát hiện AI đi sai hướng và cho phép bạn giữ lại quyết định về kiến ​​trúc.

Gợi ý: Hãy hỏi AI "tại sao bạn lại viết mã này như thế này?" hỏi. Việc giải thích cơ sở lý luận sẽ vừa giúp bạn tăng tốc quá trình học tập vừa làm lộ rõ ​​bất kỳ lỗi logic nào (ví dụ: giả định bảo mật sai). Đừng tin tưởng vào kết quả đầu ra của AI không thể bảo vệ mã của chính nó.

Những lỗi thường gặp

  • Đưa bảo mật vào AI ngay từ đầu. Sử dụng thư viện đã được thử nghiệm.
  • Không xác nhận phiên bản/mẫu do AI tạo ra. Dữ liệu đào tạo có thể cũ.
  • Vượt qua testnet. Mọi bản nháp phải chạy trên mạng thử nghiệm trước khi đi vào hoạt động.
  • Không thêm NatSpec/tài liệu. Việc kiểm tra và bảo trì trở nên khó khăn.
  • Quan niệm sai lầm “được biên dịch nên an toàn”. Được biên dịch không có nghĩa là an toàn.
  • Quên kiểm soát truy cập. Đó là một trong những sai lầm phổ biến và tốn kém nhất.

Tóm lại

  • Trong việc viết hợp đồng thông minh, AI tạo ra các khuôn khổ, kiểm tra và đánh giá các bản nháp; Con người đảm bảo an toàn sản xuất.
  • Xây dựng bảo mật không phải từ đầu mà dựa trên các thư viện đã được chứng minh (ví dụ: OpenZeppelin).
  • Tính cập nhật của các phiên bản và mẫu mã do YZ sản xuất luôn được xác nhận.
  • Các cuống thử nghiệm có giá trị trong việc nắm bắt các điểm mù của con người (trường hợp giới hạn, kiểm soát truy cập).
  • Được biên dịch không có nghĩa là an toàn; testnet và kiểm toán là điều bắt buộc.

Nhiệm vụ ứng dụng

Đối với mã thông báo ERC-20 đơn giản, hãy tạo bản nháp bằng cách sử dụng lời nhắc "bộ khung dựa trên tiêu chuẩn" ở trên. Sau đó: (1) kiểm tra xem nó có sử dụng thư viện đã kiểm tra hay không, (2) kiểm tra các điều khiển truy cập, (3) tạo các thử nghiệm với lời nhắc "bản nháp trường hợp thử nghiệm" và thực sự chạy ít nhất một thử nghiệm người gọi giả mạo. Hãy tìm và ghi chú ít nhất một điểm bảo mật mà AI đã bỏ sót.

danh sách kiểm tra

  • [ ] Tôi đã nêu rõ tiêu chuẩn và quy trình trong phần nhắc.
  • [ ] Tôi muốn sản phẩm dựa trên thư viện đã được chứng minh.
  • [ ] Giấy phép SPDX và phiên bản pragma có sẵn.
  • [ ] Có kiểm soát truy cập ở mọi chức năng quan trọng.
  • [ ] Tôi đã tạo và chạy thử nghiệm các trường hợp giới hạn.
  • [ ] Tôi xác nhận rằng thư viện/mẫu đã được cập nhật.
  • [ ] Tôi đã đánh dấu mã để kiểm tra và thử nghiệm; Tôi đã không nhận được nó mà không được giám sát trên mạng chính.