3
🔥 zombiefactory.sol
pragma solidity ^0.4.19;
import "./ownable.sol";
contract ZombieFactory is Ownable {
event NewZombie(uint zombieId, string name, uint dna);
uint dnaDigits = 16;
uint dnaModulus = 10 ** dnaDigits;
uint cooldownTime = 1 days;
struct Zombie {
string name;
uint dna;
uint32 level;
uint32 readyTime;
}
Zombie[] public zombies;
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
function _createZombie(string _name, uint _dna) internal {
uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime))) - 1;
zombieToOwner[id] = msg.sender;
ownerZombieCount[msg.sender]++;
NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(_str));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
require(ownerZombieCount[msg.sender] == 0);
uint randDna = _generateRandomDna(_name);
randDna = randDna - randDna % 100;
_createZombie(_name, randDna);
}
}
🔨 その他の内容
まず付加機能の変数を発表した.
level
, readyTime
cooldownTime
という地域変数を発表し、日付を付与した.これらの追加変数はゾンビが攻撃できる時間を意味する.
🔨 新知
基本的に、uint 256またはuint 32またはメモリは同じです.
現在のような場合、1970年1月1日から現在に戻る秒数.
solidity time言語には、秒、分、時間、日、週、年が含まれます.
明かりがあって、すべて秒計算です.
now+cooldownTimeを適用することで、1日で攻撃を実現できます.
🔥 ownable.sol
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function Ownable() public {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
これは授権のための競争です.🔥 zombiefeeding.sol
pragma solidity ^0.4.19;
import "./zombiefactory.sol";
contract KittyInterface {
function getKitty(uint256 _id) external view returns (
bool isGestating,
bool isReady,
uint256 cooldownIndex,
uint256 nextActionAt,
uint256 siringWithId,
uint256 birthTime,
uint256 matronId,
uint256 sireId,
uint256 generation,
uint256 genes
);
}
contract ZombieFeeding is ZombieFactory {
KittyInterface kittyContract;
function setKittyContractAddress(address _address) external onlyOwner {
kittyContract = KittyInterface(_address);
}
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
require(msg.sender == zombieToOwner[_zombieId]);
Zombie storage myZombie = zombies[_zombieId];
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) / 2;
if (keccak256(_species) == keccak256("kitty")) {
newDna = newDna - newDna % 100 + 99;
}
_createZombie("NoName", newDna);
}
function feedOnKitty(uint _zombieId, uint _kittyId) public {
uint kittyDna;
(,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
feedAndMultiply(_zombieId, kittyDna, "kitty");
}
}
🔨 その他の内容
まずゾンビに餌をやるというデータを別途もらって使います.
したがって、まず
setKittyContractAddress
関数により値を取得する.したがって、他の悪意のあるユーザが奇妙なデータを提供する可能性があるため、
onlyOwner
が使用される.external
が追加されました.🔥 zombiehelper.sol
pragma solidity ^0.4.19;
import "./zombiefeeding.sol";
contract ZombieHelper is ZombieFeeding {
modifier aboveLevel(uint _level, uint _zombieId) {
require(zombies[_zombieId].level >= _level);
_;
}
function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) {
require(msg.sender == zombieToOwner[_zombieId]);
zombies[_zombieId].name = _newName;
}
function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) {
require(msg.sender == zombieToOwner[_zombieId]);
zombies[_zombieId].dna = _newDna;
}
function getZombiesByOwner(address _owner) external view returns(uint[]) {
uint[] memory result = new uint[](ownerZombieCount[_owner]);
uint counter = 0;
for(let i=0; i<zombies.length; i++){
if(zombieToOwner[i] == _owner){
result[counter] = i;
counter++
}
}
return result;
}
}
今日はほとんどこの中で仕事をしながら勉強します.ゾンビ能力を記述するコードです.
基本的には、あるレベルに達したときにのみ関数を起動できるので、条件を付けます.
aboveLevel
その後、関数の機能に応じて、新しいDNAの名前を変更したり設定したりすることができます.
getZombiesByOwner
ユーザが持つゾンビ返却関数.グローバルと呼ばれる配列を使用すると、メモリ消費が深刻になります.
これは低効率なプロセスですが、メモリの面では効率的な作業です.
🔨 詳細
storage
演算はメモリ上で非常に高価です.storage
演算はブロックチェーン生態系に永久的に記録されるため、生態系を変更する必要があり、これはコストを増加させる.したがって、非効率であっても、
storage
と比較して、呼び出すたびにmomory
で再作成することが望ましい.🔥 に感銘を与える
この文章は個人的にも集中していないので、専門性がずいぶん下がったようです...
もう一度書き直して復習する
Reference
この問題について(3), 我々は、より多くの情報をここで見つけました https://velog.io/@jjimgo/크립토-좀비-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol