Nhật ký phát triển hợp đồng thông minh Rust (10-2)
BlockSec
2022-04-03 04:13
本文约4501字,阅读全文需要约18分钟
Bài viết này mang đến cho bạn cách diễn giải hợp đồng của Sputnik_DAOv2::Factory Contract.

lời mở đầu1. Hợp đồng Nhà máy Sputnik-DAO

Sputnik-DAO áp dụng mẫu thiết kế nhà máy sáng tạo (Factory Pattern) để thực hiện việc tạo và quản lý thống nhất tổ chức tự trị phi tập trung (DAO) của nền tảng.

Bài viết này sẽ giới thiệu chi tiết về thiết kế và triển khai mô hình nhà máy nền tảng Sputnik-DAO (sputnikdao-factory).

Kho mã nguồn của hợp đồng tương ứng được đặt tại: https://github.com/near-daos/sputnik-dao-contract/tree/518ad1d97614fff4b945aba75b6c8bd2483187a2

tiêu đề cấp đầu tiên

2. Giới thiệu chức năng mô-đun DAPP

Mở trang DAPP của nền tảng Sputnik DAO, có thể thấy rằng nhiều tổ chức tự trị phi tập trung đã tạo và tùy chỉnh các đối tượng dụ DAO của riêng họ (hợp đồng Sputnikdaov2) trên nền tảng.

Kể từ tháng 3 năm 2022, DAO hoạt động tích cực nhất được tạo dưới nền tảng này là news.sputnik-dao.near, trong đó 3051 đề xuất (đề xuất) đang được bỏ phiếu công khai hoặc trạng thái đã bị đóng.

📄Để thuận tiện cho độc giả, sơ đồ cấu trúc của hợp đồng được cung cấp ở trên để tham khảo.

Nghĩa là, tất cả các hợp đồng phiên bản DAO được tạo dựa trên nền tảng Sputnik DAO đều được triển khai trong các tài khoản phụ của tài khoản NEAR, ví dụ:

Để biết định nghĩa về tài khoản phụ trong Giao thức NEAR, bạn có thể tham khảo tại https://docs.near.org/docs/concepts/account#subaccounts 🔗.

Như thể hiện trong hình bên dưới, các tổ chức phi tập trung có thể bắt đầu giao dịch một cách công khai trên mạng chính NEAR và tạo các phiên bản DAO mới bằng cách gọi phương thức create() được cung cấp bởi hợp đồng sputnikdao-factory.

3. Giải thích mã hợp đồng sputnikdao-nhà máy

Để giúp các bạn hiểu rõ hơn về cách viết hợp đồng Rust factory mode, bài viết này sẽ đi sâu giải thích mã hợp đồng của sputnikdao-factory.

3.1 Tạo DAO

Tình trạng hợp đồng sputnikdao-nhà máy chủ yếu bao gồm hai phần sau:

Nội dung cụ thể của tham số args sau khi giải mã Base64 là:

Nội dung này chính xác là thông tin cấu hình hợp đồng được yêu cầu khi thực hiện phương thức khởi tạo hợp đồng new() khi triển khai hợp đồng multicall.sputnik-dao.near.

Bài viết dưới đây sẽ phân tích cụ thể việc triển khai factory_manager.create_contract:

Các tham số của chức năng này được quy định như sau:

Thông tin cơ bản về DAO được cung cấp bởi tổ chức tự trị phi tập trung: Config

5. callback_method: Chỉ định chức năng gọi lại sau khi phương thức create_contract() được thực thi, được sử dụng để duy trì và xử lý thông tin của hợp đồng phiên bản DAO mới trong hợp đồng xuất xưởng này.

6. callback_args: Tham số chức năng của hàm gọi lại.

Việc thực hiện chức năng này chủ yếu được chia thành các bước sau:

Sau khi hợp đồng phiên bản DAO cuối cùng được triển khai, hàm on_create() sẽ được gọi lại ở cuối mã thực thi factory_manager.create_contract() dài 32-53 dòng.

Sau đây là cách triển khai mã nội bộ của hàm gọi lại on_create:

Logic xử lý cụ thể của chức năng này là:

chữ

chữ

chữ

Mã được đặt tại: sputnikdao-factory2/src/lib.rs # Line136-149

Chi tiết xử lý của factory_manager.update_contract() như sau: Giao diện này có thể thực hiện lệnh gọi của hàm update() trong hợp đồng phiên bản DAO tương ứng.

Điều đáng nói là:

Trong quá trình phân tích mã Sputnik-DAO, BlockSec đã tìm thấy một vấn đề bảo mật nghiêm trọng trong hợp đồng Nhà máy của mình, điều này sẽ ảnh hưởng đến tất cả các hợp đồng sử dụng Sputnik-DAO. Sau khi liên hệ với bên dự án, Vấn đề cuối cùng đã được xác nhận và khắc phục kịp thời.

💡Lỗ hổng bảo mật được mô tả cụ thể như sau:

Trong phiên bản trước của mã, phương thức cập nhật công khai() được cung cấp bởi hợp đồng nhà máy sputinikdao thiếu kiểm tra xác nhận khóa sau. Điều này dẫn đến việc bất kỳ ai cũng có thể gọi phương thức này.

Thật trùng hợp, hợp đồng phiên bản DAO (hợp đồng Sputnikdaov2) cho phép Nhà máy Sputnik-DAO nâng cấp hợp đồng này thông qua các cuộc gọi hợp đồng chéo theo mặc định.

Phương thức update() được triển khai trong hợp đồng phiên bản DAO như sau, mã nằm trong sputnikdao2/src/upgrade.rs # Dòng 62

Trong dòng 9 của đoạn mã trên, giá trị của factory_info.auto_update được đặt thành True theo mặc định khi hợp đồng phiên bản DAO triển khai và gọi phương thức new() để khởi tạo.

Phương thức new() của hợp đồng phiên bản DAO được triển khai như sau: mã nằm trong sputnikdao2/src/lib.rs # Dòng 83-104

Tóm lại, một người dùng thông thường (không phải hợp đồng Factory và chính hợp đồng DAO) có thể nâng cấp (giả mạo) mã của bất kỳ hợp đồng DAO nào thông qua phương thức pub fn update() do hợp đồng Factory cung cấp, sẽ cung cấp cho nền tảng Sputnik-DAO và Tất cả các dự án hợp đồng dựa trên nền tảng Sputnik-DAO đều mang lại rủi ro bảo mật lớn.

🪴 May mắn thay, khi sự cố này được phát hiện, mã của phiên bản này vẫn chưa được tung ra trên NEAR mainnet nên không có tổn thất nào.

Do phản ứng nhanh chóng của bên dự án, lỗ hổng đã được khắc phục chính xác bằng cách thêm cơ chế xác minh danh sách trắng hợp lý😊

tiêu đề cấp đầu tiên

chữ

Ngoài các lỗ hổng được phát hiện và khắc phục ở trên, tính bảo mật của hợp đồng Nhà máy Sputnik-DAO chủ yếu được đảm bảo từ các khía cạnh sau:

Không có chức năng nào sau đây sửa đổi các biến trạng thái:

Do phản ứng nhanh chóng của bên dự án, lỗ hổng đã được khắc phục chính xác bằng cách thêm cơ chế xác minh danh sách trắng hợp lý😊

Xem Cam kết sửa lỗi này: 518ad1d97614fff4b945aba75b6c8bd2483187a2🔗

BlockSec
作者文库