Solidity cơ bản bài 27: Function Modifier Solidity. Cân bằng quyền kiểm soát dApp và tính phi tập trung của smart contract
Function Modifier
Tự học Solidity bài 27: Cân bằng quyền kiểm soát dApp và tính phi tập trung của smart contract
Summary for English Visiter
modifier onlyOwner() {
require(isOwner());
_;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
//Step code run when call: renounceOwnership
1. require(isOwner());
2. _;
3. emit OwnershipTransferred(_owner, address(0));
4. _owner = address(0);
Thank you!
Summary for English Visiter
modifier onlyOwner() {
require(isOwner());
_;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
//Step code run when call: renounceOwnership
1. require(isOwner());
2. _;
3. emit OwnershipTransferred(_owner, address(0));
4. _owner = address(0);
Thank you!
Tâm sự chút
Giang hồ hiểm ác, lòng người khó lường, sau khi học đến đây xong bài học này, điều quan trọng bạn cần phải nhớ là DApp nằm trên Ethereum không có nghĩa là nó phi tập trung - bạn phải thực sự đọc mã nguồn để đảm bảo rằng nó không bị chủ sở hữu kiểm soát đặc biệt. Với tư cách là nhà phát triển, có một sự cân bằng giữa việc duy trì quyền kiểm soát DApp để bạn có thể sửa các lỗi tiềm ẩn và xây dựng một nền tảng mà người dùng của bạn có thể tin tưởng để bảo mật dữ liệu của họ.Sự kế thừa
Trong phần thực hành bài 26 thì hợp đồng ZombieFactory kế thừa từ Ownable, Vì thế chúng ta có thể sử dụng onlyOwner function modifier trong ZombieFeeding.ZombieFeeding kế thừa ZombieFactory
ZombieFactory kế thừa Ownable
Vì vậy, ZombieFeeding cũng kế thừa từ Ownable, và có thể truy cập các chức năng / sự kiện / Modifier từ hợp đồng Ownable. Điều này cũng đúng cho bất kỳ hợp đồng nào kế thừa từ ZombieFeeding trong tương lai.
Function Modifier
Function Modifier trông giống như một hàm, nhưng sử dụng từ khoá khai báo hàm là Modifier. Và nó không thể được gọi trực tiếp mà thay vào đó chúng ta có thể đính kèm tên của hàm modifier này vào cuối định nghĩa của một hàm khác để thay đổi hành vi của hàm đó.pragma solidity >=0.5.0 <0.6.0;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @return the address of the owner.
*/
function owner() public view returns(address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner());
_;
}
/**
* @return true if `msg.sender` is the owner of the contract.
*/
function isOwner() public view returns(bool) {
return msg.sender == _owner;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0));
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
Khi bạn gọi hàm renounceOwnership mã bên trong onlyOwner thực thi trước!!!
Sau đó, khi nó chạm vào dấu _; trong onlyOwner, nó nhảy quay trở lại và thực thi mã bên trong renounceOwnership :)
Vì vậy, có những cách khác bạn có thể sử dụng Function Modifier, nhưng một trong những trường hợp sử dụng phổ biến nhất là thêm kiểm tra nhanh trước một hàm khác.
Trong trường hợp của onlyOwner, việc thêm Function Modifier vào phần khai báo của một hàm bất kì trong hợp đồng sẽ làm cho hàm đó dành riêng chủ sở hữu của hợp đồng sử dụng.
Thực hành luôn cho nhớ lâu bạn nhé
Nếu bạn chưa biết cách TẠO FILE, COMPILER và DEPLOY thì hãy xem lại trong bài giới thiệu nhé. Có hướng dẫn chi tiết ở đó.BÀI TIẾP THEO: BÀI SỐ 28
HỌC TỪ ĐẦU: BÀI SỐ 1