# 크립토 좀비 요약 (Basic 1~6) # Lesson 1 ~ 3 Storage 와 Memory --- - Storage 는 블록체인에 영구적으로 저장되는 공간임. 상태 변수는 default 로 storage 로 선언됨. - Memory 는 임시적으로 저장되는 변수로, scope 를 벗어나면 자동으로 메모리 해제가 됨. 함수 안에 정의된 변수들은 default 로 memory 로 선언됨. - 함수 안에서의 memory 사용은 동적 할당은 안되고 정적 할당만 되기 때문에 배열 크기를 줘야 한다. uint[] memory arr = new uint[](); → 에러 Contract: Solidity 의 가장 기초적인 단위 --- - 상태 변수 - Contract 의 상태 변수를 가짐. contract 내부, 함수 외부에서 설정. - 상태 변수는 EVM 의 Storage 공간에 저장이 됨. - Contract 외부에서 볼 수 있도록 설정할 수 있거나, 보지 못하도록 설정할 수 있음. - public: 아무것도 안쓰면 기본적으로 주어지는 상태 - private: Contract 외부에서 볼 수 없도록 만든 상태 - uint private a; // 선언하는 방법 [심화: 상태 변수의 레이아웃]( https://docs.soliditylang.org/en/v0.8.11/internals/layout_in_storage.html) 함수 --- - Contract 의 동작을 정의함. 외부에서 호출하도록 허용할 수 있고, 호출하지 못하도록 제어할 수 있음. - Visibility에 따른 함수 제어자 (function modifier) 라고 하는데 public, private, internal, external 이 있음. - public: Contract 내외부 모두 접근 가능 - private: Contract 외부에서는 접근 불가능. (상속한 Contract 도 접근 불가능) - internal: Contract 내부에서만 가능 / 외부에서는 접근 불가능 (상속한 Contract 에서는 접근 가능) - external: Contract 외부에서만 가능 / 내부에서는 접근 불가능 - 목적에 따른 함수 제어자도 있는데, pure 와 view 가 있음. - view: 상태 변수에 write 을 하지 않고 read only 만 함. - pure: 상태 변수를 read only 도 하지 않고, 주어진 인자로만 처리함. - 반환값이 있다면 미리 함수 정의에서 반환 타입을 정해줘야 함 - 함수의 제일 마지막에 returns (타입) 을 적어주면 됨. 이벤트 --- - web.js 와 같은 app level 로 이벤트가 발생했음을 알려주는 역할. Contract 내에서 로그를 찍어볼 방법은 없기 때문에 외부로 이벤트를 emit 하는 역할을 함. 자료구조 --- - 배열 - uint[크기] a; // 정적 배열 선언하는 방법 - uint[] a = new uint [] (크기); // 동적 배열 선언하는 방법 - 구조체 - 변수 타입이 같은 것끼리 모아서 선언해야지 스토리지 공간을 적게 쓸 수 있다. (이는 메모리 할당 방식과 관련있다 - C++ 에서도 구조체를 선언할 때 이 점을 유의해서 선언한다) - 맵핑 - mapping (key type => value type) // mapping 선언하는 방법 특별한 전역 변수 --- - msg.sender: Contract 를 호출한 주소를 가져옴. 상속 --- - 코드의 간결성과 모듈화를 위해서 상속을 사용 - is // 상속하는 방법 인터페이스 --- - 외부의 Contract 와 상호작용을 하기 위해서 사용 - 외부의 Contract 의 함수를 정의하는데, 이 때 구현은 하지 않고 반환값까지만 선언해줌. - 인터페이스를 변수로 선언하고 객체를 생성하게 되면, 이 변수는 외부 Contract 를 가리키는 포인터 변수와 같은 역할을 하게 됨. Contract 의 불변성 --- - 특정 address 로 배포된 Contract 는 다시는 수정될 수 없음. 만약에 수정하고 싶다면 새로운 Contract 를 배포하고 address 도 변경될 것임. - 이러한 점은 내 Contract 가 외부 Contract 를 사용할 때, 만약 외부 Contract 가 수정되었다고 하면 나의 Contract 도 수정이 되어야 하는 문제를 야기시킴. - 이러한 문제를 해결하기 위해서 외부 Contract 주소를 hard coding 하는 것이 아니라 외부에서 수정할 수 있도록 할 수 있음. - 이렇게 외부에서 수정할 수 있도록 하면 external 로 설정해야되는데, 이러한 경우 owner 만 수정할 수 있도록 설정할 수 있음. - 이러한 기능은 Open Zeppelin 에서 Ownable 이라는 Contract 를 제공하고, 이 Contract 를 상속하고 특정 기능에 대해서 onlyOwner 라는 제어자를 붙이면 owner 만 호출할 수 있도록 제어할 수 있음. - 함수 제어자는 인자도 별도로 받을 수 있음. Solidity 의 시간 키워드 --- - seconds, minutes, hours, days, weeks, years, now 를 제공. now 는 uint256 을 반환하고, uint32 연산이랑 맞추기 위해서는 type casting 을 해야함. 인자를 포인터로 전달 (Call by Reference) --- - storage 라는 키워드를 쓰면 구조체 등을 포인터를 통해 인자로 넘길 수 있음. View 제어자 --- - 가스를 소모하지 않는다 - 가능한 대부분의 함수에서 external view 를 쓰면 가스 소모를 절약할 수 있음. # Lesson 4 ~ 6 - Payable - Solidity 함수를 사용하기 위해서 지불해야하는 수수료를 정의할 수 있음. - 이렇게 지불된 수수료는 Smart Contract 안에 갇혀있기 때문에 이 금액을 특정 요청에 의해서 withdraw 하는 로직도 만들 수 있음. 주의할 것은 이 withdraw 함수는 Smart contract 의 owner에 의해서만 수행되어야 함. - ERC-721 - NFT를 발행하는 표준으로, 이 Smart Contract를 상속하여 함수를 overriding 을 하면 됨 - 자세한 것은 NFT 관련 스마트 컨트랜트를 개발하면서 자세히 다뤄보자 - SafeMath - 수의 오버플로우 또는 언더플로우를 막기위해서 SafeMath 라는 라이브러리를 사용해야 함.