UUPS proxy trên Blockchain: Contract có thể nâng cấp

1. Proxy là gì?

Proxy là một mẫu thiết kế cho phép bạn cung cấp một vật thay thế hoặc phần giữ chỗ cho một đối tượng khác. Proxy kiểm soát quyền truy cập vào đối tượng ban đầu, cho phép bạn thực hiện điều gì đó trước hoặc sau khi yêu cầu được chuyển đến đối tượng ban đầu.

Trong thế giới blockchain, bất kỳ thứ gì được viết trên blockchain đều không thể chỉnh sửa. Nếu các nhà phát triển mắc bất kỳ sai lầm nào trong quá trình phát triển hợp đồng thông minh thì các khoản tiền có giá trị sẽ dễ bị tấn công. Để ngăn chặn những sai lầm này khi sử dụng hợp đồng ủy quyền, nếu phát hiện thấy bất kỳ vấn đề nào trong hợp đồng thực hiện thì hợp đồng thực hiện mới sẽ được triển khai.

2. Các loại Proxy

Click Digital xin phép nêu ra 3 loại mẫu Proxy đang có:

  1. Transparent Proxy
  2. Universal Upgradeable Proxy Standard (UUPS) Proxy
  3. Beacon pattern

Trong đó, UUPS Proxy sẽ được đề cập bên dưới.

3. Khái niệm: UUPS proxy là gì?

UUPS (Universal Upgradeable Proxy System) Proxy là một mô hình proxy contract trong lập trình hợp đồng thông minh trên blockchain Ethereum. UUPS Proxy được giới thiệu trong EIP-1967 (Ethereum Improvement Proposal) nhằm cung cấp một phương pháp nâng cấp thông minh cho các hợp đồng.

Trong mô hình UUPS Proxy, logic (implementation contract) và dữ liệu (storage contract) được lưu trữ trong cùng một hợp đồng. Khi cần nâng cấp hợp đồng, chỉ cần triển khai lại phần logic của hợp đồng mà không cần triển khai lại toàn bộ hợp đồng. Việc này giúp tiết kiệm gas và giảm sự phụ thuộc vào việc triển khai lại toàn bộ hợp đồng.

Đặc điểm chính của UUPS Proxy bao gồm:

  1. Phân tách giữa logic và dữ liệu: Hợp đồng UUPS Proxy chứa mã logic của ứng dụng, trong khi dữ liệu được lưu trữ trong một hợp đồng riêng gọi là storage contract. Sự phân tách này giúp giữ nguyên dữ liệu đã được lưu trữ khi nâng cấp logic.
  2. Logic Contract: Logic contract chứa các phương thức và hàm logic của ứng dụng. Khi triển khai lại logic contract, chỉ có phần logic bị thay đổi và dữ liệu được giữ nguyên.
  3. Storage Contract: Storage contract chứa các biến trạng thái và dữ liệu của ứng dụng. Khi triển khai lại logic contract, storage contract không bị ảnh hưởng và dữ liệu vẫn được duy trì.
  4. Cơ chế delegatecall: Cuộc gọi hàm từ UUPS Proxy sử dụng delegatecall để chuyển tiếp cuộc gọi đến logic contract. Delegatecall cho phép thực thi mã logic của logic contract trong ngữ cảnh của UUPS Proxy, bao gồm cả truy cập vào storage contract.

Mô hình UUPS Proxy giúp cải thiện quá trình nâng cấp và bảo trì hợp đồng thông minh. Nó cho phép thay đổi logic mà không làm thay đổi dữ liệu đã được lưu trữ, giảm thiểu nguy cơ mất dữ liệu và tối ưu hóa việc sử dụng gas trong quá trình triển khai.

4. Ưu nhược điểm của UUPS Proxy

Điểm mạnh của mô hình UUPS Proxy:

  1. Nâng cấp thông minh: Mô hình UUPS Proxy cho phép nâng cấp logic của hợp đồng một cách thông minh và tiết kiệm gas. Chỉ cần triển khai lại phần logic của hợp đồng mà không cần triển khai lại toàn bộ hợp đồng, giúp tăng tính linh hoạt và giảm thời gian cần thiết cho quá trình nâng cấp.
  2. Bảo toàn dữ liệu: Với UUPS Proxy, dữ liệu được lưu trữ trong một hợp đồng riêng (storage contract) và không bị ảnh hưởng bởi việc nâng cấp logic. Điều này đảm bảo rằng dữ liệu đã được lưu trữ không bị mất đi khi triển khai lại phần logic của hợp đồng.
  3. Giảm sự phụ thuộc: UUPS Proxy giảm sự phụ thuộc vào việc triển khai lại toàn bộ hợp đồng. Thay vì triển khai lại cả hợp đồng khi có thay đổi logic, chỉ cần triển khai lại phần logic để tiết kiệm gas và tối ưu quá trình nâng cấp. (bài viết của Click Digital)

Điểm yếu của mô hình UUPS Proxy:

  1. Phức tạp hơn trong triển khai: Triển khai UUPS Proxy đòi hỏi kiến thức và kỹ năng kỹ thuật cao hơn so với triển khai hợp đồng thông thường. Quá trình triển khai và xác nhận tính đúng đắn của UUPS Proxy yêu cầu sự cẩn thận và kiểm tra kỹ lưỡng.
  2. Dữ liệu không đồng nhất: Mô hình UUPS Proxy có thể gặp phải vấn đề về dữ liệu không đồng nhất (non-uniform storage) nếu không quản lý cẩn thận. Điều này có thể dẫn đến lỗi và gây khó khăn trong việc bảo trì và phát triển.
  3. Chi phí gas: Mặc dù UUPS Proxy có thể giảm thiểu chi phí gas so với việc triển khai lại toàn bộ hợp đồng, việc sử dụng proxy vẫn gây ra một khoản chi phí gas nhất định cho mỗi cuộc gọi hàm. Do đó, việc tính toán chi phí gas cần được xem xét khi sử dụng UUPS Proxy.

5. Đoạn code ví dụ

Dưới đây là một ví dụ về đoạn code Solidity minh họa việc triển khai UUPS Proxy:

// Hợp đồng Thực Thi, Hợp đồng nguồn (Implementation Contract)
contract MyContract {
    uint256 public value;

    function setValue(uint256 _value) public {
        value = _value;
    }

    function getValue() public view returns (uint256) {
        return value;
    }
}

// Hợp đồng UUPS Proxy
contract MyContractProxy {
    address private immutable implementationAddress;

    constructor(address _implementationAddress) {
        implementationAddress = _implementationAddress;
    }

    fallback() external {
        address implementation = implementationAddress;
        assembly {
            calldatacopy(0, 0, calldatasize())
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
            returndatacopy(0, 0, returndatasize())
            switch result
                case 0 {
                    revert(0, returndatasize())
                }
                default {
                    return(0, returndatasize())
                }
        }
    }
}

Trong ví dụ này, chúng ta có một hợp đồng nguồn (MyContract) chứa mã logic thực sự và một hợp đồng UUPS Proxy (MyContractProxy) để tương tác với người dùng.

Trong hợp đồng proxy, chúng ta sử dụng hàm fallback() để chuyển tiếp cuộc gọi hàm từ người dùng đến hợp đồng nguồn. Hàm fallback sử dụng delegatecall để chuyển tiếp cuộc gọi đến địa chỉ hợp đồng nguồn và trả về kết quả.

Khi triển khai hợp đồng Proxy, chúng ta cần cung cấp địa chỉ của hợp đồng nguồn (MyContract) trong constructor. Cuộc gọi fallback sẽ chuyển tiếp cuộc gọi hàm đến địa chỉ hợp đồng nguồn và trả về kết quả.

Lưu ý rằng đây chỉ là một ví dụ đơn giản để minh họa cách triển khai UUPS Proxy. Trong thực tế, việc triển khai UUPS Proxy có thể phức tạp hơn và đòi hỏi xem xét kỹ lưỡng về mô hình thiết kế và bảo mật.

Vietnam Pham – Click Digital

Rate this post

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *