2022. 5. 27. 00:08ㆍBlockChain/크립토좀비
pragma solidity ^0.4.25;
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;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
emit NewZombie(id, _name, _dna);
}
function _generateRandomDna(string _str) private view returns (uint) {
uint rand = uint(keccak256(abi.encodePacked(_str)));
return rand % dnaModulus;
}
function createRandomZombie(string _name) public {
uint randDna = _generateRandomDna(_name);
_createZombie(_name, randDna);
}
}
알게된 내용
1. 모든 solidity 코드는 버전 선언으로 시작한다.
2. 상태변수 (state Variable) 컨트랙트 저장소에 영구 저장된다 = 블록체인에 기록된다.
uint 부호 없는 정수, int 부호 있는 정수
부호 없다는 말은 값이 음수가 되면 안된다라는 의미이다.
uint는 실제로 uint256을 뜻하며, uint8/uint16/uint32 등과 같이 uint를 더 적은 비트로 선언할 수도 있다.
특별한 경우가 아니라면 uint만 사용 !
3. 복잡한 자료형을 다루기 위해서 struct 구조체를 사용한다. 여러 특성을 가진 자료형들을 struct 안에 한 번에 선언할 수 있다.
4. string은 임의의 길이를 가진 UTF-8 데이터를 위해 활용된다.
5. 함수 인자명 앞에 _(언더바)를 기입하는 것은 전역변수와 구별하기 위하는데, 이것은 관례이다. (의무는 아님)
6. 구조체 배열 생성하고 활용하는 법
struct Person {
uint age;
string name;
}
Person[] public people;
// Person 구조체를 통해 새로운 Person을 생성하고 people 배열에 추가
// 새로운 사람 생성
Person JeongHoon = Person(31,"JeongHoon");
// JeongHoon을 배열에 추가한다.
people.push(JeongHoon);
//위의 두 줄을 조합하여 people.push(Person(31,"JeongHoon"));
* array.push()는 무언가의 배열 끝에서 모든 원소가 순서를 유지하도록 한다.
ex) uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// numbers 배열은 [5,10,15]와 같다.
위의 코드에서는 아래 부분이다.
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string _name, uint _dna) private {
uint id = zombies.push(Zombie(_name, _dna)) - 1;
emit NewZombie(id, _name, _dna);
}
7. view() , pure() 함수
view 속성을 가진 함수는 Storage 레벨에 있는 자료를 읽어서 보여줄 수는 있지만, 수정할 수는 없다.
pure() 함수는 Storage 레벨에 있는 자료를 읽어오지도 못한다. 함수가 앱에서 어떤 데이터도 접근하지 못한다.
> solidity 컴파일러에서 어떤 제어자를 써야하는지 경고 메시지를 통해 알려준다.
8. keccak-256
SHA-1,SHA-2에 내재하는 보안 취약점을 개선하고자 개발된 해시화 알고리즘.
고정 길이의 해시값(메시지 다이제스트)을 출력하고 256비트 16진수로 변환하여 반 랜덤인 반환값 출력. 기본적으로 같은 문자가 입력되면 동일한 결과값이 출력되므로 반 랜덤.
9. solidity 이벤트
solidity의 모든 코드들은 컨트랙트를 통해 클라이언트와 통신한다.
ex) 메타마스크로 누군가에게 1 ETH 전송하며, 이 때 금액을 전송하는 행위는 '전송' 버틈을 누름과 동시에 진행된다.
이 전송 버튼이 눌려졌을 때 컨트랙트의 실행 내용이 일어나는 것이고, 전송 버튼은 항상 클라이언트의 요청에 귀기울이고 있는 이벤트이다.
// 이벤트 선언
event IntegersAdded(uint x,uint y,uint result);
function add(uint _x,uint _y) public {
uint result = _x + _y;
// 이벤트를 실행하여 앱에게 add 함수가 실행되었음을 알린다
IntegersAdded(_x,_y,result);
return result;
}
// 클라이언트 측의 결과
YourContract.IntegersAdded(function(error,result){
// 결과와 관련된 행동
}
'BlockChain > 크립토좀비' 카테고리의 다른 글
크립토좀비 1단계-6) 배열 (0) | 2022.01.31 |
---|---|
크립토좀비 1단계-5) 구조체 (0) | 2022.01.31 |
크립토좀비 1단계-3) 상태변수 & 정수 (0) | 2022.01.31 |