Table of Contents
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ó:
- Transparent Proxy
- Universal Upgradeable Proxy Standard (UUPS) Proxy
- Beacon pattern
Trong đó, Transparent Proxy sẽ được đề cập bên dưới.
3. Khái niệm: Transparent Proxy là gì?
Trong lĩnh vực lập trình hợp đồng thông minh trên blockchain Ethereum, Transparent Proxy (Proxy trong suốt) là một mô hình proxy contract được sử dụng để tạo ra một lớp trung gian giữa người dùng và hợp đồng nguồn (implementation contract).
Mô hình Transparent Proxy bao gồm hai thành phần chính:
- Hợp đồng Proxy: Đây là hợp đồng được triển khai trên blockchain và được người dùng tương tác trực tiếp. Hợp đồng Proxy chỉ chịu trách nhiệm chuyển tiếp các cuộc gọi hàm từ người dùng đến hợp đồng nguồn.
- Hợp đồng Thực thi / Hợp đồng Nguồn (Implementation Contract): Đây là hợp đồng chứa mã logic và dữ liệu thực sự của ứng dụng. Hợp đồng nguồn không được người dùng tương tác trực tiếp, mà chỉ thông qua hợp đồng Proxy.
- Hợp đồng quản lý proxy (proxyAdmin): Hợp đồng liên kết 2 hợp đồng trên: Hợp đồng Proxy và Hợp đồng Thực thi
Khi người dùng gọi một hàm trên hợp đồng Proxy, hợp đồng Proxy sẽ chuyển tiếp cuộc gọi đến hợp đồng nguồn. Điều này đảm bảo rằng người dùng không tương tác trực tiếp với hợp đồng nguồn và logic của ứng dụng được giữ trong một địa chỉ tĩnh, không thay đổi.
4. Ưu nhược điểm
Theo Click Digital, mô hình Transparent Proxy có một số ưu điểm:
- Tách biệt địa chỉ và logic: Mô hình Proxy giúp tách biệt địa chỉ hợp đồng và mã logic, cho phép thay đổi hợp đồng nguồn mà không ảnh hưởng đến địa chỉ của hợp đồng Proxy.
- Tiết kiệm gas: Thay vì triển khai lại toàn bộ hợp đồng khi cần thay đổi logic, chỉ cần triển khai lại hợp đồng nguồn và liên kết nó với hợp đồng Proxy.
- Dễ dàng quản lý nâng cấp: Thay đổi hợp đồng nguồn chỉ yêu cầu chỉnh sửa trong hợp đồng Proxy, giúp quản lý nâng cấp dễ dàng hơn.
Tuy nhiên, Transparent Proxy cũng có nhược điểm là khả năng truyền tải dữ liệu không đồng nhất (non-uniform storage), có thể gây ra lỗi nếu không được quản lý cẩn thận. Điều này yêu cầu sự thận trọng trong việc triển khai và kiểm tra mô hình Transparent 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 Transparent Proxy:
// Hợp đồng nguồn (Implementation Contract)
contract MyContractImplementation {
uint256 public value;
function setValue(uint256 _value) public {
value = _value;
}
function getValue() public view returns (uint256) {
return value;
}
}
// Hợp đồng Proxy
contract MyContractProxy {
address private immutable implementationAddress;
constructor(address _implementationAddress) {
implementationAddress = _implementationAddress;
}
fallback() external payable {
// Chuyển tiếp cuộc gọi hàm đến hợp đồng nguồn
address implementation = implementationAddress;
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(gas(), implementation, ptr, calldatasize(), 0, 0)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 {
revert(ptr, size)
}
default {
return(ptr, size)
}
}
}
}
Trong ví dụ này, chúng ta có một hợp đồng nguồn (MyContractImplementation) chứa mã logic thực sự và một hợp đồng 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 được gọi khi không có hàm nào khớp với cuộc gọi từ người dùng. Trong hàm fallback, chúng ta sử dụng assembly code để chuyển tiếp cuộc gọi đến hợp đồng nguồn thông qua delegatecall.
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 (MyContractImplementation) 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 Transparent Proxy. Trong thực tế, việc triển khai Transparent 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
- Đầu tư vào các công ty quảng cáo blockchain hàng đầu bằng cách MUA token Saigon (SGN) trên Pancakeswap: https://t.co/KJbk71cFe8 (đừng lo lắng về tính thanh khoản, hãy trở thành nhà đầu tư sớm)
- Được hỗ trợ bởi Công ty Click Digital
- Nâng cao kiến thức về blockchain và crypto
- Lợi nhuận sẽ dùng để mua lại SGN hoặc đốt bớt nguồn cung SGN để đẩy giá SGN tăng.
- Địa chỉ token trên mạng BSC: 0xa29c5da6673fd66e96065f44da94e351a3e2af65
- Twitter: https://twitter.com/SaigonSGN135
- Staking SGN: http://135web.net
- If you’d like to invest in top blockchain advertising companies, just BUY Saigon token (SGN) on Pancakeswap: https://t.co/KJbk71cFe8 (do not worry about low liquidity, be the early investor)
- Backed by Click Digital Company
- Enhancing blockchain and crypto knowledge
- The profits will be used to repurchase SGN or burn a portion of the SGN supply to drive up the SGN price.
- BSC address: 0xa29c5da6673fd66e96065f44da94e351a3e2af65
- Twitter: https://twitter.com/SaigonSGN135
- Staking SGN: http://135web.net
Digital Marketing Specialist