카테고리 없음

[1010] 크립토 좀비 (cryptozombies1 - 좀비 공장 만들기)

문앵 2021. 10. 11. 00:25

❗ chapter2: pragma 와 contract

pragma 
버전정보를 처음에 명시하도록 되어있음.
버전 업데이트가 자주 되기 때문에! 불과 한달전에 친 코드라도 지금 유효하지 않을수 있으므로 
실행하기 전에 미리 버전정보를 확인 함.

contract
솔리디티의 기본 단위. 구조

pragma solidity ^0.4.19;

contract ZombieFactory {
}

 

 

❗ chapter3: uint

uint == int or number 
//uint : dataType이 숫자만 들어가는 변수를 선언 

//예를들어
contract ZombieFactory {
  uint a = "hello world!" //-> 바로 오류 뜸. 숫자만 들어가야 함. 
}

솔리디티는 세미콜론을 무적권 써줘야 함.

 

 

❗ chapter4: 연산

//더하기(+)/ 빼기(-)/ 곱하기(*)/ 나누기(/)/ 나머지 구하기(%) -> 똑같음

//n제곱 연산(**)도 가능. 예를 들면
uint x = 5**2 // x 값은 5^2 = 25임

 

❗ chapter5: struct & string

strunct 
정보를 담을 수 있는 *자료형 구조체 (객체형 정보를 담을 틀을 미리 만들어줌)

*자료형 = string 
dataType이 string 임
-----------------------------------

struct Person {
  uint age;
  string name;
}

 

 

❗ chapter6: 배열 - 동적/ 정적/ Public 배열

배열 - 동적배열 / 정적배열

배열의 선언 형식은 
// 데이터타입[] 변수명;

정적배열은 배열안에 담을 수 있는 길이를 정해주고
동적배열은 길이가 고정되어있지 않고 크기가 계속 커질 수 있음

ex) 
uint[3] fixedArray;
-> 3개의 원소를 담을 수 있는 정적배열이고 이름은 fixedArray.
정적배열의 경우 최적화를 할 수 있다는 장점 존재

uint[] dynamicArray;
-> 동적배열

🤍

구조체 배열 형성하기 
- 구조체의 동적배열을 형성하면, contract에 구조화된 데이터를 저장할수있음.
=> DB를 이용하는것같은 효과!

// 선언 형식 : 구조체명[] 배열명
Person[] people

🤍

Public 배열
- 다른 contract들이 이 배열을 읽을 수 있음 (쓸수는 없음)
- 선언형식 : 구조체명[] public 배열명

Person[] public people

 

 

❗ chapter7: 함수의 선언

선언형식
// function 함수명(인자){

   }
   
인자로는 dataType을 함께 표시해줘야 함 (-> string / uint)
ex) (string _name , uint _amount)
-> string 과 uint 2개의 인자를 전달받음.

cf) 함수 인자명을 (_)로 시작해서 전역변수와 구별하는것이 관례.

해당 함수는 호출할때는
eatHamburgers("vitalik",100); 
이런식으로 쓸 수 있음

 

 

❗ chapter8: 구조체 & 배열 섞어 활용

- 새로운 구조체를 배열에 추가하기

//Person 구조체가 있다고 치자.
strunct Person {
uint age;
    string name;
}

// Person 구조체를 퍼블릭 배열(people)에 담기
Person[] public people


이 상태에서 Person에 새로운 값을 생성하고 이것을 배열 people에 추가해보자.

Person Munyeong = Person(165,"Munyeong"); //새로운 사람을 생성
people.push(Munyeong); // 이 사람을 배열에 추가. JS매서드랑 똑같이 쓰임. 굿굿

위의 두 코드를 합칠 수 있음
people.push(Person(165,"Munyeong"))

 

 

❗ chapter9: Private / Public 함수

선언할때 디폴트값은 public.

private 함수
- 해당 contract 내의 다른 함수들만이 private 함수를 호출할 수 있음.
- 함수명 뒤에 private 적으면 됨.
- private 함수는 함수명 앞에 _ 붙이는것이 관례라고 함. 

ex)
uint[] numbers;
function _addToArray(uint _number) private{
	numbers.push(_number);
}

 

 

❗ chapter10: 반환값- returns(반환값 종류)/ return(반환값) & 함수 제어자- view & pure

반환값
- 함수에서 사용
- 반환값 종류를 표시해줌
- ex) function ~~ returns(string){ //반환값 종류 = string
		return ~~~
	}

🤍

함수 제어자 

🔹 1. view 함수
- 상태 변화를 시키지 않을때, 즉 어떤 값을 변경하거나 무언가를 쓰지 않을 때
- 데이터 읽기 only! 변경x
function sayHello() public view returns (string){
	~;
}

🔹 2. pure 함수
- 어떤 데이터도 접근하지 않는 함수라는 의미
- 앱에서 읽지도 않음
function _multipley(uint a, uint b) private pure returns(uint){
	return a*b;
}

 

 

❗ chapter11: Keccak256과 형 변환

keccak256
- 이더리움은 내장 해시 함수로 keccak256가지고 있음.
- 랜덤 256비트 16진수로 매핑해줌.
- 뭐 랜덤한 값으로 만들 때 많이 사용한대요.
- 보안 문제가 있음. 안전하지 않음. 목적에 따라 사용

🤍

형변환 하기

uint8 a = 5;
uint b = 6;
uint8 c = a*b; // 요기서 에러가 뜰것임. 왜냐? a*b는 uint 형이니까. uint8형인 c로 반환할수가 없지.

// 그럼 해결법은 b를 형변환 해야함. (c는 uint8형이니까)
// uint형인 b를 다른 형식으로 (uint8로) 바꾸려면?

   uint8(b);

=> uint8 c = a * uint8(b); //로 바꿔주면 오류 해결

 

 

❗ chapter12: 이벤트 event

이벤트 선언
// event 이벤트명(인자);
ex) event IntegersAdded(uint x, uint y, uint result);

이벤트 실행
// 이벤트명(인자명);
ex) IntegersAdded(_x, _y, result); // 요기 들어가는 인자명은 함수의 인자명이랑 일치시켜야되나봉가


🔹 활용 
- contract & 앱 사용자의 의사소통.
- contract가 계속 귀기울임 -> 앱의 사용자단에서 무언가 액션이 발생-> 이벤트가 일어남-> 행동 취함
- ex)

//일단 이벤트를 선언해놓고
event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
 
  IntegersAdded(_x, _y, result);  // 이벤트가 실행될거야! 이벤트는 이 함수안에 있는거니까
  								  // 앱에게 add 함수가 실행되었음을 알린다
  return result;
}
반응형