View
함수를 사용해 가스 절약하기전에 view
와 pure
키워드를 배웠었다. 나는 솔직히 이걸 왜 쓰는지 이해하지 못했는데, 드디어 그걸 다루는 챕터가 나왔다. 🙂
만약 우리가 만드는 함수가 블록체인에서 데이터를 읽기만한다면?
👉🏻 view
함수로 만들 수 있다.
view
함수는 가스를 소모하지 않네.
그 이유는 view
함수가 블록체인 상에서 어떠한 것도 수정하지 않기 때문이다. 함수에 view
표시를 하는 것은 다음과 같은 의미이다.
이 함수를 실행할 때는 로컬 이더리움 노드에 쿼리만 날리면 되고,
블록체인에 어떤 트랜잭션도 만들지 않을거야 😊
무야호
그만큼 우리는 가능한 모든 곳에 읽기 전용의 external view
함수를 쓰는게 가스 최적화에 좋으시다는 거지 ~ 👨🏻🦳
만약 view 함수가 동일 컨트랙트 내에 있는, view 함수가 아닌 다른 함수에서 내부적으로 호출될 경우, 여전히 가스를 소모할 것이네. 이것은 다른 함수가 이더리움에 트랜잭션을 생성하고, 이는 모든 개별 노드에서 검증되어야 하기 때문이네. 그러니 view 함수는 외부에서 호출됐을 때에만 무료라네.
솔리디티에서 더 비싼 연산 중 하나는 바로 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 끄읏~ 👻