Require Solidity
Ngôn ngữ lập trình Solidity. Tự học Solidity căn bản. Trong khoá học online miễn phí Tự học lập trình web3 - Tự học ngôn ngữ lập trình Solidity
Summary for English Visiter
function sayHiToVitalik(string memory _name) public returns (string memory) { // Compares if _name equals "Vitalik". Throws an error and exits if no require(keccak256(abi.encodePacked(_name)) == keccak256(abi.encodePacked("Vitalik"))); // If it's true, proceed with the function: return "Hi!"; }
Trong ví dụ Hợp đồng Zombie trước, chúng ta đã thực hiện một hàm cho phép người dùng tạo zombie mới bằng cách gọi createRandomZombie và nhập tên. Tuy nhiên, nếu người dùng có thể tiếp tục gọi chức năng này để tạo ra số lượng zombie không giới hạn trong đội quân của họ, thì trò chơi sẽ không vui lắm vì đất chật người đông.
Giờ phải làm sao để mỗi người chơi chỉ có thể gọi chức năng này một lần. Theo cách đó người chơi mới sẽ gọi nó khi họ lần đầu tiên bắt đầu trò chơi để tạo ra zombie ban đầu trong quân đội của họ.
Làm thế nào chúng ta có thể làm cho hàm này chỉ có thể được gọi một lần cho mỗi người chơi?
Đối với điều đó chúng tôi sử dụng Require. Require làm cho hàm một yêu câu và tạo ra một lỗi ngừng thực thi nếu một số điều kiện không thoả mãn:
function sayHiToVitalik(string memory _name) public returns (string memory) {
// Compares if _name equals "Vitalik". Throws an error and exits if no
require(keccak256(abi.encodePacked(_name)) == keccak256(abi.encodePacked("Vitalik")));
// If it's true, proceed with the function:
return "Hi!";
}
Lưu ý: Solidity không có so sánh chuỗi, vì vậy chúng ta so sánh các kết quả băm Keccak256 của chúng để xem các chuỗi sau khi băm có bằng nhau không.
Nếu bạn đã quên Kecak256 là gì thì xin mời xem lại BÀI SỐ 10 nhé :)
Nếu bạn gọi hàm này bằng sayHiToVitalik ("Vitalik"), nó sẽ trả về "Hi!". Nếu bạn gọi nó với bất kỳ đầu vào nào khác, nó sẽ báo lỗi và không thực thi.
Do đó, request khá hữu ích để xác minh các điều kiện nhất định phải đúng trước khi chạy một hàm.
Thực hành luôn cho nhớ lâu bạn nhé
Code của hợp đồng zombie hiện tại như sau, bạn đọc hiểu nội dung nhé
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
function _createZombie(string memory _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string memory _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string memory _name) public {
// start here
require(ownerZombieCount[msg.sender] == 0);
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
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Ố 17
HỌC TỪ ĐẦU: BÀI SỐ 1