본문 바로가기
솔리디티/크립토좀비

레슨 3 챕터 10, 11, 12 - view 함수의 가스 절약/storage와 memory의 가스 소모/반복문(for)

by 멸치김밥 2022. 2. 17.

이전에 view함수는 함수 외부것들에 접근은 할 수 있으나 그 값들을 수정할 수는 없다고 배웠다.

그러한 점에 의해 view함수는 외부에서 호출되면 가스를 소모하지 않는다.

이말은 같은 컨트랙트 내에서 사용할 경우에는 가스가 소모된다는 뜻.

여하튼 그래서 view함수는 external과 함께 쓰여 내부에선 사용하지 않게 하여 외부에서만 사용하고,

다른 값들도 수정하지 않는 읽기 전용 함수로 쓰인다.

 


storage는 블록체인에 기록되는만큼 가스 소모가 크다.

그래서 코드 자체가 비효율적이더라도 블록체인에 기록될 필요가 없는것들은 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;
}

크립토 좀비가 작성될 시점엔 memory 배열은 동적배열이 안되서 위처럼 임의로 길이를 지정했어야 한다고 한다.


  • for

반복문이 storage에 영향을 주게 되면 가스 소모가 굉장히 커지게 된다.

그래서 외부호출에 가스소모가 없는 view함수에서 반복문을 이용하는게 좋다.


챕터 10 답

  // 외부에서만 사용할 수 있으며(external) 접근하는 어떤 값들도 수정하지 않는 함수
  // uint[] 형태의 동적배열을 반환
  function getZombiesByOwner(address _owner) external view returns (uint[]) {
    
  }

챕터 11 답

    // 메모리변수(배열) result를 만들고 그 길이는 해당 주인이 가진 좀비 수 만큼으로 한다.
    uint[] memory result = new uint[](ownerZombieCount[_owner]);
    return result;

챕터 12 답

    // 좀비 숫자에 맞게 id를 순서대로 부여하기 위한 변수 counter
    uint counter = 0;
    // 좀비배열의 길이만큼(총 좀비 수 만큼) 반복
    for(uint i = 0; i < zombies.length; i++) {
      // 좀비배열의 i번째 좀비의 주인과 매개변수로 넣은 _owner가 같다면
      if(zombieToOwner[i] == _owner) {
        // 해당 배열(result) 첫번째에 i 넣고
        result[counter] = i;
        // counter는 1 증가
        counter++;
      }
    }

이건 뭔가 의미를 잘 모르겠다.

반복문도 i가 0부터 시작해서 배열이 끝날때까지 돌것이고

counter도 0부터 시작해서 배열이 끝날때까지 1씩 증가할것인데

그럼 i대신 counter를 쓰던가 counter를 굳이 쓰지 않고 i를 이용하면 되지 않는가 하는 의문이 든다.

이 의문은 좀비배열(zombies)이 본인 뿐 아니라 다른이도 만들 수 있기 때문에 한 개인의 배열이 아니라

크립토좀비 내의 전체 좀비에 대한 배열이라고 생각하는게 맞을 것 같다.

그렇다면 zombies에는 A가 만든 좀비 a1, a2, a3... 와 B, C가 만든 b1, b2, b3..., c1,c2... 들이 뒤섞여 있을것이고

[ a1, b1, b2, c1, a2, c2, a3, b3, c3 ... ] 이런 형태의 배열이 될것이고,

그 배열을 for문으로 모두 순회하며 A가 만든 좀비인지 if문을 통해 걸러내고

걸러진 A의 좀비 a1을 result배열에 첫번째 요소로 넣기 위해 result[counter], result[0]에 좀비 id값에 해당하는 i를 넣는것이라 예상한다. 그럼

A의 result에는 [ 0, 4, 6 ]

B의 result에는 [ 1, 2, 7 ]

C의 result에는 [ 3, 5, 8 ] 이와같이 될것이다.

해당 숫자들은 전체 좀비에서 특정 좀비를 가려낼 id값으로 쓰일것이라 예상함.

댓글