[크립토좀비] 레슨 3. 고급 솔리디티 - 가스 절약

가영·2021년 4월 9일
0

솔리디티

목록 보기
6/7
post-thumbnail

View 함수를 사용해 가스 절약하기

전에 viewpure 키워드를 배웠었다. 나는 솔직히 이걸 왜 쓰는지 이해하지 못했는데, 드디어 그걸 다루는 챕터가 나왔다. 🙂

만약 우리가 만드는 함수가 블록체인에서 데이터를 읽기만한다면?

👉🏻 view 함수로 만들 수 있다.

왜?

view 함수는 가스를 소모하지 않네.

그 이유는 view 함수가 블록체인 상에서 어떠한 것도 수정하지 않기 때문이다. 함수에 view 표시를 하는 것은 다음과 같은 의미이다.

이 함수를 실행할 때는 로컬 이더리움 노드에 쿼리만 날리면 되고,
블록체인에 어떤 트랜잭션도 만들지 않을거야 😊

무야호

그만큼 우리는 가능한 모든 곳에 읽기 전용의 external view 함수를 쓰는게 가스 최적화에 좋으시다는 거지 ~ 👨🏻‍🦳

만약 view 함수가 동일 컨트랙트 내에 있는, view 함수가 아닌 다른 함수에서 내부적으로 호출될 경우, 여전히 가스를 소모할 것이네. 이것은 다른 함수가 이더리움에 트랜잭션을 생성하고, 이는 모든 개별 노드에서 검증되어야 하기 때문이네. 그러니 view 함수는 외부에서 호출됐을 때에만 무료라네.


Storage는 비싸다

솔리디티에서 더 비싼 연산 중 하나는 바로 storage를 쓰는 것이다. (특히 쓰기 연산)

왜냐! storage 변수를 쓰거나 변경할 때마다, 블록체인에 영구적으로 기록이 되고, 그 말은 지구 상의 수천 개의 노드들이 그들의 하드드라이브에 그 데이터를 저장해야한다는 것이다. 큰 비용이 들 수 밖에 없겠다👻

비용을 최소화하기 위해서는

storage 데이터를 최소한으로 사용해야 한다.

이를 위해 때때로, 겉보기에는 비효율적으로 보이는 코드를 작성해야 할 때가 있다.

ex) 어떤 배열에서 내용을 빠르게 찾기 위해 단순히 변수에 저장하는 것 대신, 함수가 호출될 때마다 배열을 memory에 다시 만드는 것과 비슷과 비슷

메모리에 배열 선언하기

Storage에 아무것도 안쓰고 함수 안에 새로운 배열을 만들기 위해선 memory키워드를 써야한다.
그리고. memory로 선언하면 정적배열만 사용 가능..🥺

function getArray() external pure returns(uint[]) {
  // 메모리에 길이 3의 새로운 배열을 생성한다.
  uint[] memory values = new uint[](3);
  // 여기에 특정한 값들을 넣는다.
  values.push(1);
  values.push(2);
  values.push(3);
  // 해당 배열을 반환한다.
  return values;
}

레슨3 끄읏~ 👻

0개의 댓글