이더리움에서 게임을 만든다? 크립토 좀비(3. 고급 솔리디티 개념)(2)

민식킴·2021년 3월 3일
0

크립토 좀비

목록 보기
5/9
사족

8일차
CH.10부터는 가스비를 절약하는데 초점이 맞춰져 있었다. 돈이 걸린 문제다보니 나도모르게 집중하게되었다.


CH.7 Public 함수 & 보안

public은 이미 배웠지만 보안차원에서 다시 상기시켜주었다.

보안을 점검하는 좋은 방법은 자네의 모든 public과 external 함수를 검사하고, 사용자들이 그 함수들을 남용할 수 있는 방법을 생각해보는 것이네. 이걸 기억하시게 - 이 함수들이 onlyOwner 같은 제어자를 갖지 않는 이상, 어떤 사용자든 이 함수들을 호출하고 자신들이 원하는 모든 데이터를 함수에 전달할 수 있네.

CH.8,9 함수 제어자의 또 다른 특징 & 좀비 제어자

// 사용자의 나이를 저장하기 위한 매핑
mapping (uint => uint) public age;

// 사용자가 특정 나이 이상인지 확인하는 함수제어자
modifier olderThan(uint _age, uint _userId) {
  require (age[_userId] >= _age);
  _;  // <- 함수제어자에 꼭 필요한 구문
}

// 차를 운전하기 위햐서는 16살 이상이어야 하네(적어도 미국에서는).
// `olderThan` 제어자를 인수와 함께 호출하려면 이렇게 하면 되네:
function driveCar(uint _userId) public olderThan(16, _userId) {
  // 필요한 함수 내용들 (16살 이상인 경우)
}

그러니깐 if, require과 같이 함수가 실행하는 조건을 담은 함수라고 생각하면 된다. 그리고 함수 선언하면서 고대로 같이 선언한다.

CH.10 'View' 함수를 사용해 가스 절약하기

'View'함수는 가스비를 전혀 소모하지 않는다!
블록체인상에서 어떤것도 수정하지 않고 데이터를 읽기만 하기 때문이다!

그러니 함수에 view 표시를 하는 것은 web3.js에 이렇게 말하는 것과 같네. "이 함수는 실행할 때 자네 로컬 이더리움 노드에 질의만 날리면 되고, 블록체인에 어떤 트랜잭션도 만들지 않아"(트랜잭션은 모든 개별 노드에서 실행되어야 하고, 가스를 소모하네).

CH.11 Storage는 비싸다

Storage는 아주 비싼 연산이어서 최대한 자제하는 게 좋다.

-그중에서도 쓰기연산,
이건 자네가 데이터의 일부를 쓰거나 바꿀 때마다, 블록체인에 영구적으로 기록되기 때문이네. 영원히! 지구상의 수천 개의 노드들이 그들의 하드 드라이브에 그 데이터를 저장해야 하고, 블록체인이 커져가면서 이 데이터의 양 또한 같이 커져가네. 그러니 이 연산에는 비용이 들지.

'external view'를 쓰자!

정확한 이해는 못했지만 금방 날라가는 memory와는 다르게 storage는 영원히 블록체인에 저장되므로 가스비가 많이 나온다는 것 같다.

  • 배열 선언하기
 // 메모리에 길이 3의 새로운 배열을 생성한다.
  uint[] memory values = new uint[](3);
  // 여기에 특정한 값들을 넣는다.
  values.push(1);
  values.push(2);
  values.push(3);

CH.12 For 반복문

자 우리가 가지고 있는 좀비를 storage로 저장했다고 치자, 코드로는 단순히 mapping을 이용해 uint[]에 하나씩 저장하면 된다. 그러나 좀비가 죽거나 거래를 통해 없어진다면? 해당좀비를 지우고 뒷자리 좀비들을 한칸씩 당겨야 할 것이다. 이는 많은 가스비를 잡아먹는다.
그래서 다른 대안으로 memory에 저장하는 것이다. (비록 함수를 할때마다 실행시켜야 하지만(이또한 external view로 무료) for문을 통해 순서대로 좀비를 저장할 수 있다.)<내생각


ps

솔리디티에 귀뚜라비 놓아드려야겠어요

profile
우리의 꿈, 우리의 희망

1개의 댓글

comment-user-thumbnail
2021년 3월 3일

ㅋㅋㅋㅋㅋㅋ긔뚜라미

답글 달기