본문 바로가기

Language/Solidity

solidity 기본 문법 4. 상속, Import, Storage, Memory with 크립토좀비

챕터 2-5. 상속


**  좀비가 먹이를 먹고 번식하도록 하는 기능을 구현 1 **

상속 개념은 "고양이는 동물이다"의 경우처럼 "부분집합 클래스"가 있을 때 논리적 상속을 위해 활용
또, 동일한 로직을 다수의 클래스로 분할해서 단순히 코드를 정리할 때도 활용



챕터 2-6. Import


** 현재 컨트랙트와 동일한 폴더에 (= ./)
someothercontract.sol이라는 파일이 있을 때, 이 파일을 컴파일러가 불러오게 하기 **

ex)

pragma solidity ^0.4.19;

import "./zombiefactory.sol";

contract ZombieFeeding is ZombieFactory {
...
}

 


챕터 2-7. Storage vs Memory


**  좀비가 먹이를 먹고 번식하도록 하는 기능을 구현 2 
좀비가 어떤 다른 생명체를 잡아 먹을 때, 좀비 DNA가 생명체의 DNA와 혼합되어 새로운 좀비가 생성 **

솔리디티에는 변수를 저장할 수 있는 공간으로 storage와 memory 두 가지가 있다

Storage는

블록체인 상에 영구적으로 저장되는 변수 ( 컴퓨터 하드 디스크 )


Memory
임시적으로 저장되는 변수 ( RAM  )

컨트랙트 함수에 대한 외부 호출들이 일어나는 사이에 지워짐


대부분의 경우에 변수 저장 키워드들을 이용할 필요가 없다

왜냐면 솔리디티가 알아서 처리해 주기 때문

상태 변수(함수 외부에 선언된 변수)는 초기 설정상 storage로 선언되어

블록체인에 영구적으로 저장되는 반면,

함수 내에 선언된 변수는 memory로 자동 선언되어서 함수 호출이 종료되면 사라짐

하지만, 함수 내의 구조체와 _배열_을 처리할 때

명시적으로 storage나 memory를 선언할 필요가 있다

ex)

contract SandwichFactory {
  struct Sandwich {
    string name;
    string status;
  }

  Sandwich[] sandwiches;

  function eatSandwich(uint _index) public {
    // Sandwich mySandwich = sandwiches[_index];

    // ^ 꽤 간단해 보이나, 솔리디티는 여기서 
    // `storage`나 `memory`를 명시적으로 선언해야 한다는 경고 메시지를 발생한다. 
    // 그러므로 `storage` 키워드를 활용하여 다음과 같이 선언해야 한다
    Sandwich storage mySandwich = sandwiches[_index];
    // ...이 경우, `mySandwich`는 저장된 `sandwiches[_index]`를 가리키는 포인터이다.
    // 그리고
    mySandwich.status = "Eaten!";
    // ...이 코드는 블록체인 상에서 `sandwiches[_index]`을 "영구적으로 변경"한다. 

    // "단순히 복사"를 하고자 한다면 `memory`를 이용하면 된다
    Sandwich memory anotherSandwich = sandwiches[_index + 1];
    // ...이 경우, `anotherSandwich`는 단순히 메모리에 데이터를 복사하는 것이 된다
    // 그리고
    anotherSandwich.status = "Eaten!";
    // ...이 코드는 임시 변수인 `anotherSandwich`를 변경하는 것으로 
    // `sandwiches[_index + 1]`에는 아무런 영향을 끼치지 않는다. 그러나 다음과 같이 코드를 작성할 수 있다
    sandwiches[_index + 1] = anotherSandwich;
    // ...이는 임시 변경한 내용을 블록체인 저장소에 저장하고자 하는 경우이다
  }
}



실습 시작

pragma solidity ^0.4.19;

import "./zombiefactory.sol";

contract ZombieFeeding is ZombieFactory {

  function feedAndMultiply(uint _zombieId, uint _targetDna) public {
    require(msg.sender == zombieToOwner[_zombieId]);
// Zombie형의 변수인 myZombie를 선언한 후에,
// 해당 좀비의 주인 id가 key인 좀비를 zombies[_zombieId]를 영구적으로 저장
    Zombie "storage" myZombie = zombies[_zombieId];
  }
}




챕터 2-8. 좀비 DNA


** 새로운 좀비의 DNA를 계산하는 공식 = 먹이를 먹는 좀비의 DNA와 먹이의 DNA의 평균 **



챕터 2-9. 함수 접근 제어자 더 알아보기


public

private

internal
: 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능

이외는 private와 동일

external
: 함수가 컨트랙트 바깥에서만 호출될 수 있고

컨트랙트 내의 다른 함수에 의해 호출될 수 없다

이외는 public과 동일