Nhằm mục đích hỗ trợ việc tự học công nghệ blockchain, trong series bài viết về blockchain Ethereum với thư viện OpenZeppelin, Humichau.com chia sẻ với 4 nội dung được trình bày trong 4 phần khác nhau như bên dưới. Tất cả những nội dung hướng dẫn này được thực hiện lại theo hướng dẫn của OpenZeppelin
Phần 1: Install OpenZeppelin and Ganache, Compile và Deploy Smart Contract, Interact với Web3
Phần 2: Write an Unit Test for Smart Contract
Phần 3: Connect to Public Blockchain ( testnet) with Infura API
Phần 4: Upgradeabe Smart Contract
Trong phần 4 – upgradeable smart contract chúng ta thực hiện các bước như sau:
- Cài đặt môi trường cần thiết và cài đặt OpenZeppelin
- Viết và deploy smart contract Simple.sol
- Kiểm tra send and call function
- Thêm 1 function vào contract
- Upgarade smart contract
- Kiểm tra hàm vừa mới thêm vào
Let’s start with Part 4
Tại sao chúng ta cần upgrade smart contract?
Smart contract trong Ethereum Blockchain có tính chất bất biến (immutable), một khi đã tạo ra thì không thể thay đổi được. Tuy nhiên, trong yêu cầu thực tế chúng ta cần điều chỉnh Smart Contract cho phù hợp với yêu cầu thực tế hiện tại. Giống như trong hợp đồng thực tế khi 2 bên đồng ý sửa đổi hoặc bổ sung 1 số điều khoản thì hợp đồng phải cho phép thực hiện việc này. Việc sử dụng thư viện OppenZeppelin giúp chúng ta điều chỉnh Smart Contract nhưng vẫn giữ nguyên địa chỉ (address), số dư tài khoản (Balance), State.
Cài đặt môi trường cần thiết và cài đặt OppenZepplin tham khảo nội dung này trong phần 1: Install OpenZeppelin and Ganache, Compile và Deploy Smart Contract, Interact với Web3
Viết contract đơn giàn Simple.sol cho phép thêm vào 1 Person với nội dung như sau:
// contracts/Simple.sol
pragma solidity ^0.5.0;
contract Simple {
struct Person{
uint id;
string name;
bool _is;
}
mapping(uint => Person) public mapPerson;
uint public Personlength;
event LogaddPerson(string pname);
event LoggetPersonById(uint pid);
address public admin;
function initialize() public {
Personlength = 0;
admin = msg.sender;
}
function addPerson( string memory pname) public {
mapPerson[Personlength] = Person(Personlength, pname,true);
Personlength += 1;
}
Deploy contract với lệnh “create”. Trong bài viết này chúng ta quan tâm đến việc hiệu chỉnh smart contract, để contract đơn giản cho việc thực hành chúng ta bỏ qua khía cạnh tối ưu smart contract.
$ npx openzeppelin create
Kiểm tra send transaction bằng cách gọi hàm addPerson với câu lệnh
$ npx oz send-tx
Kiểm tra dữ liệu thêm vào bằng lệnh
$ npx oz call
Thêm 1 hàm mới getPersonById vào Simple contract
contract Simple {
…………………..
function getPersonById(uint pid) public view returns (string memory){
require(mapPerson[pid]._is==true, “Person doesn’t exist”);
Person memory person=mapPerson[pid];
return person.name;
}
}
Upgrade smart contract bằng lệnh
$ npx openzeppelin upgrade
Upgrade smart contract thành công, bây giờ chúng ta kiểm tra kết quả hàm
getPersonById mới thêm vào
$ npx oz call
Done !!! Chúng ta đã upgrade smart contract thành công !!!!
Link to refer
Blockchain Ethereum – Ví dụ về hàm Delegatecall trong solidity
Blockchain Ethereum (P4) – Kết Nối Các Node Sử Dụng Bootnode
Blockchain Ethereum (P3) – Cài Đặt Private Blockchain trên nền tảng Ethereum
Install web3 and nodejs
Sử dụng Virtual Box
Đọc sách 2021