Các bước nâng cấp smart contract

Dưới đây là notes của admin Frankie về các bước nâng cấp smart contract



Smart contracts được triển khai thông qua OpenZeppelin Upgrades plugins có thể được nâng cấp để chỉnh sửa nội dung code mà vẫn bảo toàn được địa chỉ, trạng thái và số dư tài khoản.


Cơ chế này cho phép bạn có thể thêm các tính năng mới hoặc sửa các lỗi có thể xuất hiện trong quá trình triển khai sản phẩm.


Nâng cấp smart contract là gì?


Theo mặc định, smart contract là không thay đổi được trên Ethereum. Sau khi bạn khởi tạo thì sẽ không có cách nào thay đổi nữa, điều này giúp smart contract hoạt động hiệu quả như một hợp đồng không thể phá vỡ giữa những người tham gia.


Tuy nhiên, trong một số tình huống, những người tham gia vào hợp đồng đều mong muốn có thể chỉnh sửa smart contract. Hãy tưởng tượng, trong hợp đồng truyền thống giữa hai tổ chức: nếu cả hai đều đồng ý để thay đổi nó, họ hoàn toàn có khả năng để làm việc này. Đối với Ethereum, người dùng có thể mong muốn thay đổi smart contract để sửa những lỗi phát sinh (những lỗi này có thể là lỗ hổng để các hacker tấn công và lấy mất “tiền” của họ) sau khi smart contract đã được triển khai trên mạng ethereum; hoặc để thêm vào các tính năng; hoặc đơn giản là để thay đổi quy tắc đã được quy định bởi smart contract này.


Sau đây, là ví dụ các bước mà bạn phải làm để sửa một lỗi trong smart contract nếu nó không có tính năng nâng cấp (Upgrade):


Bước 1: Deploy một phiên bản mới của smart contract.

Bước 2: Chuyển toàn bộ trang thái từ hợp đồng cũ sang hợp đồng mới theo cách thủ công (có thể rất tốn kém phí gas).

Bước 3: Cập nhật lại tất cả các contract mà đang có tương tác với contract bị lỗi hiện tại.

Bước 4: Liên hệ và thuyết phục tất cả các người dùng để họ sử dụng contract mới được deploy.


Vì vậy để tránh tất cả các phiền phức ở trên, Openzeppline đã phát triển tính năng nâng cấp contract cho các plugin của họ. Cơ chế này cho phép thay đổi code của contract mà vẫn bảo toàn trạng thái, số dư và địa chỉ contract.


Nâng cấp smart contract sử dụng upgrades plugins.

Khi bạn deploy một smart contract sử dụng deployProxy của Openzeppelin Upgrades Plugins thì contract này có khả năng upgrade về sau. Mặc định, chỉ có địa chỉ deploy hợp đồng ban đầu mới có thể upgrade hợp đồng đó.


deployProxy sẽ tạo ra các transaction như sau:

  1. Deploy hợp đồng thông minh (Box contract)
  2. Deploy hợp đồng ProxyAdmin (admin cho proxy).
  3. Deploy hợp đồng proxy và chạy các hàm khởi tạo.


Sau đây là quá trình upgrade smart contract hoạt động thông qua việc deploy contract Box có khả năng upgrade




// contracts/Box.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


contract Box {

    uint256 private _value;


    // Emitted when the stored value changes

    event ValueChanged(uint256 value);


    // Stores a new value in the contract

    function store(uint256 value) public {

        _value = value;

        emit ValueChanged(value);

    }


    // Reads the last stored value

    function retrieve() public view returns (uint256) {

        return _value;

    }

}



Đầu tiên chúng ta cần cài đặt Upgrades Plugin.


npm install --save-dev @openzeppelin/hardhat-upgrades


Sau đó chúng ta cần phải chỉnh lại trong file hardhat.config.js để có thể sử dụng được @openzeppelin/hardhat-upgrades plugin như bên dưới:


// hardhat.config.js

...

require('@nomiclabs/hardhat-ethers');

require('@openzeppelin/hardhat-upgrades');

...

module.exports = {

...

};


để upgrade một contract giống như Box, đầu tiên chúng ta phải deploy contract đó với dạng contract có khả năng upgrade. Chung ta phải khởi tạo Box contract bằng cách gọi store với giá trị 42


Source: https://docs.openzeppelin.com/learn/upgrading-smart-contracts



Client Portal | Internal Tools | Web App Builder | Free Website Builder Made with Softr