0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hợp đồng trừu tượng trong Solidity: Khám phá sức mạnh

Đăng vào 6 tháng trước

• 6 phút đọc

Hợp đồng trừu tượng trong Solidity: Khám phá sức mạnh

Trong phát triển Solidity, khi đề cập đến việc kế thừa hợp đồng hay các mẫu tái sử dụng, chúng ta thường nghĩ đến hợp đồng trừu tượng.

Nhiều nhà phát triển chỉ coi chúng như là một giao diện hoặc một bản thiết kế chưa hoàn thiện. Trên thực tế, hợp đồng trừu tượng mạnh mẽ hơn nhiều. Bài viết này sẽ tiết lộ bốn sự thật bất ngờ về hợp đồng trừu tượng trong Solidity có thể thay đổi cách bạn thiết kế hợp đồng của mình.

1. Không chỉ là những vỏ rỗng

Hợp đồng trừu tượng không chỉ là tập hợp của các hàm chưa được triển khai. Chúng là một cấu trúc lai—có khả năng chứa cả các hàm đã được triển khai (cụ thể) và các hàm chưa được triển khai (trừu tượng).

Lấy ví dụ về abstractMath dưới đây:

solidity Copy
abstract contract abstractMath {
    // Một hàm cụ thể, đã được triển khai
    function addFive() public view returns (uint) {
        return getValue() + 5; // dựa vào một hàm chưa được triển khai
    }

    // Một hàm trừu tượng, chưa được triển khai
    function getValue() public virtual view returns (uint);
}
  • addFive đã được triển khai đầy đủ.
  • Nhưng nó phụ thuộc vào getValue, hàm chưa được định nghĩa ở đây.

Biên dịch viên Solidity thực thi một quy tắc quan trọng: bất kỳ hàm chưa được triển khai nào trong hợp đồng trừu tượng phải được đánh dấu là virtual, làm rõ rằng hàm đó dự định được ghi đè.

Mô hình này rất mạnh mẽ vì:

  • Hợp đồng cơ bản (abstractMath) định nghĩa hành vi cơ bản có thể tái sử dụng (addFive).
  • Tất cả các hợp đồng con phải triển khai các phần còn thiếu (getValue).

Như vậy, hợp đồng trừu tượng kết hợp giữa khả năng tái sử dụng và các ràng buộc thiết kế bắt buộc.

2. “Thất bại triển khai” là điều cần thiết: Hợp đồng trừu tượng không thể được cài đặt

Một quy tắc cơ bản: bạn không thể triển khai một hợp đồng trừu tượng trực tiếp.

Nếu bạn cố gắng triển khai abstractMath, biên dịch viên sẽ báo lỗi. Đây không phải là một lỗi — đó là theo thiết kế.

Tại sao?

Hợp đồng trừu tượng tồn tại chỉ để đóng vai trò là hợp đồng cha.

Chúng định nghĩa cấu trúc và (tùy chọn) logic một phần, nhưng không thể hoạt động độc lập.

Việc chặn triển khai ngăn cản các hợp đồng chưa hoàn thiện hoặc không hoạt động được công bố trên chuỗi. Điều này đảm bảo chỉ các hợp đồng con đã được triển khai đầy đủ mới đến được giai đoạn triển khai, tránh những trạng thái “nửa hoàn thành” nguy hiểm.

3. Các quy tắc mạnh mẽ thúc đẩy kiến trúc

Khi các nhà phát triển làm việc với hợp đồng trừu tượng, họ cần hiểu rằng chúng không chỉ đơn thuần là những cấu trúc trống rỗng. Thay vào đó, chúng là công cụ mạnh mẽ để đảm bảo mọi hợp đồng con đều tuân thủ một kiến trúc nhất định.

Ví dụ thực tế:

Giả sử bạn đang phát triển một hệ thống giao dịch tiền điện tử. Bạn có thể tạo một hợp đồng trừu tượng để xác định các quy tắc cơ bản cho mọi loại giao dịch mà bạn muốn hỗ trợ, chẳng hạn như gửi và nhận tiền.

solidity Copy
abstract contract Transaction {
    function sendFunds(address recipient, uint amount) public virtual;
    function receiveFunds(uint amount) public virtual;
}

Hợp đồng Transaction xác định các hàm cần thiết, nhưng không thực thi chúng. Điều này đảm bảo rằng bất kỳ hợp đồng nào kế thừa từ Transaction đều cần phải triển khai các hàm này, tạo ra một kiến trúc nhất quán và dễ bảo trì.

4. Hợp đồng trừu tượng có thể không cần hàm trừu tượng

Một điều thú vị là hợp đồng trừu tượng có thể không chứa bất kỳ hàm trừu tượng nào. Điều này có thể đạt được nhờ vào việc sử dụng các hàm khởi tạo nội bộ.

Ví dụ:

solidity Copy
abstract contract Shape {
    function area() public view virtual returns (uint);
    function perimeter() public view virtual returns (uint);
}

contract Circle is Shape {
    uint radius;
    constructor(uint _radius) {
        radius = _radius;
    }
    function area() public view override returns (uint) {
        return 3.14 * radius * radius;
    }
    function perimeter() public view override returns (uint) {
        return 2 * 3.14 * radius;
    }
}

Hợp đồng Shape không chứa bất kỳ hàm nào được triển khai, nhưng nó vẫn là một hợp đồng trừu tượng, cho phép các hợp đồng con như Circle định nghĩa các chi tiết cụ thể của riêng mình.

Thực hành tốt nhất khi làm việc với hợp đồng trừu tượng

  • Xác định rõ ràng các yêu cầu: Đảm bảo rằng các hàm trừu tượng yêu cầu được xác định rõ ràng để các nhà phát triển khác có thể dễ dàng hiểu và triển khai chúng.
  • Sử dụng các hàm khởi tạo: Đảm bảo rằng bạn sử dụng các hàm khởi tạo để thiết lập trạng thái cho các hợp đồng con.
  • Thực hiện kiểm tra và kiểm thử: Đảm bảo rằng các hợp đồng con được kiểm tra đầy đủ để xác minh rằng chúng đáp ứng các yêu cầu đã đặt ra.

Các cạm bẫy thường gặp

  • Bỏ qua tính năng kế thừa: Nhiều nhà phát triển mới không tận dụng được tính năng kế thừa mạnh mẽ từ hợp đồng trừu tượng, dẫn đến việc lặp lại mã.
  • Không sử dụng đúng các từ khóa: Đảm bảo sử dụng từ khóa virtualoverride chính xác để tránh lỗi biên dịch.

Mẹo hiệu suất

  • Tránh các hàm nặng: Tránh thực hiện các phép toán nặng trong các hàm trừu tượng, vì điều này có thể làm tăng chi phí gas khi triển khai.
  • Tối ưu hóa dữ liệu: Sử dụng các kiểu dữ liệu tối ưu hóa để tiết kiệm chi phí lưu trữ và tính toán.

Kết luận: Vượt ra ngoài giao diện, tiến tới thiết kế có thể thực thi

Hợp đồng trừu tượng trong Solidity không chỉ là những mẫu chưa hoàn thiện. Chúng:

  • Có thể kết hợp logic tái sử dụng với các yêu cầu trừu tượng.
  • Không thể được triển khai trực tiếp, theo thiết kế.
  • Được biên dịch viên thực thi nghiêm ngặt để đảm bảo tính đầy đủ.
  • Có thể trừu tượng mà không cần hàm trừu tượng, nhờ vào các hàm khởi tạo nội bộ.

Những quy tắc này kết hợp lại biến hợp đồng trừu tượng thành một mẫu thiết kế mạnh mẽ—không chỉ định nghĩa cấu trúc, mà còn thi hành kiến trúc, đảm bảo tính chính xác và làm cho các hợp đồng thông minh của bạn an toàn hơn và dễ bảo trì hơn.

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

  1. Hợp đồng trừu tượng là gì?
    Hợp đồng trừu tượng là hợp đồng không thể được triển khai trực tiếp và thường chứa các hàm chưa được triển khai.

  2. Tại sao không thể triển khai hợp đồng trừu tượng?
    Điều này nhằm ngăn chặn việc phát hành các hợp đồng chưa hoàn thiện trên chuỗi.

  3. Hàm virtual trong Solidity là gì?
    Từ khóa virtual cho biết rằng hàm có thể bị ghi đè trong hợp đồng con.

  4. Làm thế nào để tạo một hợp đồng con từ hợp đồng trừu tượng?
    Bạn cần kế thừa từ hợp đồng trừu tượng và triển khai tất cả các hàm trừu tượng trong đó.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào