Structs arguments
Tự học Solidity bài 30: Structs arguments. Truyền dữ liệu cấu trúc làm đối số trong Solidity.
Trong bài học này chúng ta tiếp tục thực hành về sử dụng các biến về thời gian và tìm hiểu thêm về cách truyền con trỏ biến structs. Ta sẽ đi cụ thể vào ví dụ để hiểu rõ cách sử dụng biến thời gian làm tác vụ đếm thời gian hồi chiêu của zombie.
Time Cooldowns
Nhiệm vụ bài học: Làm cho Zombies không thể ăn cho đến khi thời gian hồi chiêu của chúng trôi qua
Điều này sẽ làm cho zombie không thể ăn và các chức năng khác của zombie xây dựng sau này cũng sẽ có thời gian hồi chiêu
Đầu tiên, chúng ta sẽ xây dựng xác định một số hàm trợ giúp cho phép chúng ta thiết lập và kiểm tra thời gian sẵn sàng của zombie.
function _triggerCooldown(Zombie storage _zombie) internal {
_zombie.readyTime = uint32(now + cooldownTime);
}
function _isReady(Zombie storage _zombie) internal view returns (bool) {
return (_zombie.readyTime <= now);
}
Truyền cấu trúc làm đối số
Bạn có thể truyền một con trỏ một cấu trúc như một đối số cho một hàm riêng tư hoặc nội bộ. Điều này rất hữu ích, chẳng hạn, để chuyển các cấu trúc Zombie của chúng ta giữa các hàm.
Cú pháp có dạng như sau:
function _doStuff(Zombie storage _zombie) internal {
// do stuff with _zombie
}
Bằng cách này, chúng ta có thể chuyển một tham chiếu đến zombie của chúng ta vào một hàm thay vì chuyển vào một ID zombie và tra cứu nó.
Tổng hợp lại
Bây giờ chúng ta sử dụng các kiến thức này vào một hàm nhé
function feedAndMultiply(uint _zombieId, uint _targetDna, string memory _species) internal {
require(msg.sender == zombieToOwner[_zombieId]);
Zombie storage myZombie = zombies[_zombieId];
// Add a check for `_isReady` here
require(_isReady(myZombie));
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) / 2;
if (keccak256(abi.encodePacked(_species)) == keccak256(abi.encodePacked("kitty"))) {
newDna = newDna - newDna % 100 + 99;
}
_createZombie("NoName", newDna);
// Call `_triggerCooldown`
_triggerCooldown(myZombie);
}
Giải thích
Lúc đầu hàm feedAndMultiply sẽ kiểm tra thời gian cooldownTime. Ta dùng một câu lệnh request để kiểm tra _isReady() và truyền myZombie cho nó check. Bằng cách kiểm tra này, người dùng chỉ có thể thực hiện tiếp chức năng feedAndMultiply nếu thời gian hồi chiêu của zombie đã xong.
Ở cuối hàm, ta sẽ gọi hàm _triggerCooldown (myZombie) bộ đếm thời gian bắt đầu lại từ đầu.
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 ở đó.