Solidity - การเข้าถึงที่ จำกัด
การเข้าถึงสัญญาที่ จำกัด ถือเป็นแนวทางปฏิบัติทั่วไป โดยค่าเริ่มต้นสถานะสัญญาจะเป็นแบบอ่านอย่างเดียวเว้นแต่จะระบุเป็นสาธารณะ
เราสามารถ จำกัด ผู้ที่สามารถแก้ไขสถานะของสัญญาหรือเรียกฟังก์ชันของสัญญาโดยใช้ตัวปรับเปลี่ยน เราจะสร้างและใช้ตัวดัดแปลงหลายตัวตามที่อธิบายไว้ด้านล่าง -
onlyBy - เมื่อใช้กับฟังก์ชันแล้วมีเพียงผู้โทรที่กล่าวถึงเท่านั้นที่สามารถเรียกใช้ฟังก์ชันนี้ได้
onlyAfter - เมื่อใช้กับฟังก์ชันแล้วสามารถเรียกใช้ฟังก์ชันนั้นได้หลังจากช่วงเวลาหนึ่ง
costs - เมื่อใช้กับฟังก์ชันแล้วผู้โทรจะสามารถเรียกใช้ฟังก์ชันนี้ได้ก็ต่อเมื่อมีการระบุค่าบางอย่าง
ตัวอย่าง
pragma solidity ^0.5.0;
contract Test {
address public owner = msg.sender;
uint public creationTime = now;
modifier onlyBy(address _account) {
require(
msg.sender == _account,
"Sender not authorized."
);
_;
}
function changeOwner(address _newOwner) public onlyBy(owner) {
owner = _newOwner;
}
modifier onlyAfter(uint _time) {
require(
now >= _time,
"Function called too early."
);
_;
}
function disown() public onlyBy(owner) onlyAfter(creationTime + 6 weeks) {
delete owner;
}
modifier costs(uint _amount) {
require(
msg.value >= _amount,
"Not enough Ether provided."
);
_;
if (msg.value > _amount)
msg.sender.transfer(msg.value - _amount);
}
function forceOwnerChange(address _newOwner) public payable costs(200 ether) {
owner = _newOwner;
if (uint(owner) & 0 == 1) return;
}
}