crypto_zombie
21827 ワード
1.第一段階ゾンビ工場の製作 pragma solidity ^0.4.19;
//버전을 정해준다.
contract ZombieFactory {
//ZombieFactory라는 기본 컨트랙트를 생성한다.
event NewZombie(uint zombieId, string name, uint dna);//이벤트 추가
uint dnaDigits = 16;//부호 없는 정수형 자료
uint dnaModulus = 10 ** dnaDigits;//10의 제곱승
struct Zombie {
uint dna;
string name;
}//구조체 선언 (Zombie라는 구조체는 dna라는 uint와 name이라는 string변수를 가진다. )
Zombie[] public zombies;
//상태 변수가 블록체인에 영구적으로 저장이 된다. 구조체의 동적 배열을 생성하면 DB처럼 구조화된 데이터를 저장하는데 유용함
//zombies라는 이름의 public 배열임. Zombie 구조체의 배열이다.
//이건 챕터 8내용
// function createZombie (string _name, uint _dna){
// //createZombie라는 이름의 함수를 만든다. 이는 _name과 _dna라는 이름의 지역변수를 사용한다.
// //솔리디티는 함수에 받는 인자값의 타입도 정해준다.
// zombies.push(Zombie(_name, _dna));
// //앞서 선언한 zombies라는 public 배열에 Zombie구조체에 함수에 받은 인자값을 넣어서 구조체를 만든것을 넣는다.
// }
//챕터 9 private 함수 선언-> private 함수는 함수명 앞에 _를 붙인다.
function _createZombie(string _name, uint _dna) private {
// zombies.push(Zombie(_name, _dna)); //zombies 동적 배열에 인자값으로 받은 name과 dna를 넣은 Zombie를 넣어 만든다.
uint id = zombies.push(Zombie(_name, _dna))-1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna (string _str) private view returns (uint) {
//uint 값을 반환함.
//컨트랙트 변수를 보지만 변경하지는 않을 것이기에 view 선언
//private 함수
//return 이 아니라 returns임에 주의!
//챕터 11 형변환
uint rand = uint(keccak256(_str));
//형을 맞추어주어야 한다. keccak256의 형태를 uint형을 맞추어준다.
return rand % dnaModulus;
}
//챕터 12
// 모든 내용을 종합하는 public 함수 만들기
//좀비의 이름을 입력값으로 받아 랜덤 DNA를 가진 좀비를 만드는 함수
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name,randDna);
}
//챕터 13 이벤트
}
https://share.cryptozombies.io/ko/lesson/1/share/わかりません。
2.ゾンビ攻撃犠牲者
2-1. ZombieFactory2.sol
//좀비에게 다른 생명체를 먹여서 좀비 군대의 규모를 늘리는 방법
pragma solidity ^0.4.19;
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;
// 챕터 2 여기서 매핑 선언
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
//mapping(key=>value) 이름
//매핑은 기본적으로 키-값 저장소로 데이터를 저장하고 검색하는데 이용됨.
//기본적으로 구조화된 데이터를 저장하는 방법: 구조체&배열 , 매핑(key-value)
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
//챕터 3 msg.sender
//_createZombie를 호출하는 모든 이에게 좀비 소유권을 부여하는 작업
//함수를 호출한 사람의 주소를 가르킴 msg.sender
//컨트랙트는 항상 누군가가 함수릃 호출할 때까지 아무것도 안하고 있을 것임. 그래서 항상 msg.sender가 필요함
zombieToOwner[id]= msg.sender;
//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;
}
//chapter 9. external internal
//external: 함수가 컨트랙트 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없다.
//internal: 함수가 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하다. 거의 private와 흡사함.
function createRandomZombie(string _name) internal {
/*챕터 4. Require===============
특정 조건이 참이 아닐 때 함수가 에러메세지를 발생하고 멈추게 된다.
*/
require(ownerZombieCount[msg.sender] == 0);
//0이 아닐때 에러값이 출력. 맞아야지만 계속 코드가 진행됨
//==============================*/
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
contract ZombieFeeding is ZombieFactory {
}
2-2. zombieFactory2-1.sol
pragma solidity ^0.4.19;
// 여기에 import 구문을 넣기
import "./zombiefactory2.sol";
//chapter 10. 다른 컨트랙트와 상호작용하기
//인터페이스를 정의해야함.
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 {
//chapter11. 인터페이스 활용하기
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
// `ckAddress`를 이용하여 여기에 kittyContract를 초기화한다
KittyInterface kittyContract = KittyInterface(ckAddress);
//챕터 7. Storage vs Memory
//Storage는 영구적으로 저장되는 변수
//함수 외부에 선언된 변수는 상태변수라고 하는데 storage로 선언이 된다.
//Memory는 임시적으로 저장되는 변수
//험수 내부에 선언된 변수는 memory로 자동 선언이 된다.
//rnwhcpdhk qodufdmf cjflgkf Eo
// function feedAndMultiply(uint _zombieId, uint _targetDna) public {
//CHAPTER13.IF문 >>javascript와 동일함
// 여기에 있는 함수 정의를 변경:
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
require(msg.sender == zombieToOwner[_zombieId]);
//아예 다른 파일에 있는 함수를 그대로 가져올 수 있음.
//import한 파일의 구문을 그대로 가져올 수 있다.
newDna = newDna - newDna % 100 + 99;//챕터 13
//챕터 8
Zombie storage myZombie = zombies[_zombieId];
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) /2;
//챕터 13 if문 추가
if(keccak256(_species) == keccak256("kitty")){
newDna = newDna - newDna % 100 + 99;
}
_createZombie("NoName", newDna);
}
//chapter12. 다수의 반환값 처리하기
//고양이 유전자를 얻어내는 함수 작성하기
function feedOnKitty(uint _zombieId, uint _kittyId) public {
uint kittyDna;
(,,,,,,,,,kittyDna)= kittyContract.getKitty(_kittyId);
//함수에서 return 선언하는 것이 아니라 쓰는데에서 쓰는 함수가 여러개의 인자값을 반환하면
//쓸 때 아예 변수로 지정하고 쓰는 것이다.
//genes를 kittyDna에 담는 것이 (,,,,,,,,,kittyDna)로 표현이 된다.
feedAndMultiply(_zombieId, kittyDna,"kitty");//챕터 13에서 kitty추가
}
}
https://share.cryptozombies.io/ko/lesson/2/share/わかりません。
Reference
この問題について(crypto_zombie), 我々は、より多くの情報をここで見つけました
https://velog.io/@nara7875/cryptozombie
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
pragma solidity ^0.4.19;
//버전을 정해준다.
contract ZombieFactory {
//ZombieFactory라는 기본 컨트랙트를 생성한다.
event NewZombie(uint zombieId, string name, uint dna);//이벤트 추가
uint dnaDigits = 16;//부호 없는 정수형 자료
uint dnaModulus = 10 ** dnaDigits;//10의 제곱승
struct Zombie {
uint dna;
string name;
}//구조체 선언 (Zombie라는 구조체는 dna라는 uint와 name이라는 string변수를 가진다. )
Zombie[] public zombies;
//상태 변수가 블록체인에 영구적으로 저장이 된다. 구조체의 동적 배열을 생성하면 DB처럼 구조화된 데이터를 저장하는데 유용함
//zombies라는 이름의 public 배열임. Zombie 구조체의 배열이다.
//이건 챕터 8내용
// function createZombie (string _name, uint _dna){
// //createZombie라는 이름의 함수를 만든다. 이는 _name과 _dna라는 이름의 지역변수를 사용한다.
// //솔리디티는 함수에 받는 인자값의 타입도 정해준다.
// zombies.push(Zombie(_name, _dna));
// //앞서 선언한 zombies라는 public 배열에 Zombie구조체에 함수에 받은 인자값을 넣어서 구조체를 만든것을 넣는다.
// }
//챕터 9 private 함수 선언-> private 함수는 함수명 앞에 _를 붙인다.
function _createZombie(string _name, uint _dna) private {
// zombies.push(Zombie(_name, _dna)); //zombies 동적 배열에 인자값으로 받은 name과 dna를 넣은 Zombie를 넣어 만든다.
uint id = zombies.push(Zombie(_name, _dna))-1;
NewZombie(id, _name, _dna);
}
function _generateRandomDna (string _str) private view returns (uint) {
//uint 값을 반환함.
//컨트랙트 변수를 보지만 변경하지는 않을 것이기에 view 선언
//private 함수
//return 이 아니라 returns임에 주의!
//챕터 11 형변환
uint rand = uint(keccak256(_str));
//형을 맞추어주어야 한다. keccak256의 형태를 uint형을 맞추어준다.
return rand % dnaModulus;
}
//챕터 12
// 모든 내용을 종합하는 public 함수 만들기
//좀비의 이름을 입력값으로 받아 랜덤 DNA를 가진 좀비를 만드는 함수
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name,randDna);
}
//챕터 13 이벤트
}
2-1. ZombieFactory2.sol
//좀비에게 다른 생명체를 먹여서 좀비 군대의 규모를 늘리는 방법
pragma solidity ^0.4.19;
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;
// 챕터 2 여기서 매핑 선언
mapping (uint => address) public zombieToOwner;
mapping (address => uint) ownerZombieCount;
//mapping(key=>value) 이름
//매핑은 기본적으로 키-값 저장소로 데이터를 저장하고 검색하는데 이용됨.
//기본적으로 구조화된 데이터를 저장하는 방법: 구조체&배열 , 매핑(key-value)
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
//챕터 3 msg.sender
//_createZombie를 호출하는 모든 이에게 좀비 소유권을 부여하는 작업
//함수를 호출한 사람의 주소를 가르킴 msg.sender
//컨트랙트는 항상 누군가가 함수릃 호출할 때까지 아무것도 안하고 있을 것임. 그래서 항상 msg.sender가 필요함
zombieToOwner[id]= msg.sender;
//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;
}
//chapter 9. external internal
//external: 함수가 컨트랙트 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없다.
//internal: 함수가 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하다. 거의 private와 흡사함.
function createRandomZombie(string _name) internal {
/*챕터 4. Require===============
특정 조건이 참이 아닐 때 함수가 에러메세지를 발생하고 멈추게 된다.
*/
require(ownerZombieCount[msg.sender] == 0);
//0이 아닐때 에러값이 출력. 맞아야지만 계속 코드가 진행됨
//==============================*/
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
contract ZombieFeeding is ZombieFactory {
}
2-2. zombieFactory2-1.sol
pragma solidity ^0.4.19;
// 여기에 import 구문을 넣기
import "./zombiefactory2.sol";
//chapter 10. 다른 컨트랙트와 상호작용하기
//인터페이스를 정의해야함.
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 {
//chapter11. 인터페이스 활용하기
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
// `ckAddress`를 이용하여 여기에 kittyContract를 초기화한다
KittyInterface kittyContract = KittyInterface(ckAddress);
//챕터 7. Storage vs Memory
//Storage는 영구적으로 저장되는 변수
//함수 외부에 선언된 변수는 상태변수라고 하는데 storage로 선언이 된다.
//Memory는 임시적으로 저장되는 변수
//험수 내부에 선언된 변수는 memory로 자동 선언이 된다.
//rnwhcpdhk qodufdmf cjflgkf Eo
// function feedAndMultiply(uint _zombieId, uint _targetDna) public {
//CHAPTER13.IF문 >>javascript와 동일함
// 여기에 있는 함수 정의를 변경:
function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) public {
require(msg.sender == zombieToOwner[_zombieId]);
//아예 다른 파일에 있는 함수를 그대로 가져올 수 있음.
//import한 파일의 구문을 그대로 가져올 수 있다.
newDna = newDna - newDna % 100 + 99;//챕터 13
//챕터 8
Zombie storage myZombie = zombies[_zombieId];
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) /2;
//챕터 13 if문 추가
if(keccak256(_species) == keccak256("kitty")){
newDna = newDna - newDna % 100 + 99;
}
_createZombie("NoName", newDna);
}
//chapter12. 다수의 반환값 처리하기
//고양이 유전자를 얻어내는 함수 작성하기
function feedOnKitty(uint _zombieId, uint _kittyId) public {
uint kittyDna;
(,,,,,,,,,kittyDna)= kittyContract.getKitty(_kittyId);
//함수에서 return 선언하는 것이 아니라 쓰는데에서 쓰는 함수가 여러개의 인자값을 반환하면
//쓸 때 아예 변수로 지정하고 쓰는 것이다.
//genes를 kittyDna에 담는 것이 (,,,,,,,,,kittyDna)로 표현이 된다.
feedAndMultiply(_zombieId, kittyDna,"kitty");//챕터 13에서 kitty추가
}
}
https://share.cryptozombies.io/ko/lesson/2/share/わかりません。Reference
この問題について(crypto_zombie), 我々は、より多くの情報をここで見つけました https://velog.io/@nara7875/cryptozombieテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol