보다 더 생생한 기록

[Solidity] 크립토좀비 Ch1,2 정리 본문

블록체인

[Solidity] 크립토좀비 Ch1,2 정리

viviviviviid 2022. 12. 26. 01:42
BEB가 끝났음에도 정확히 정립되지 않았거나, 까먹었던 내용들 위주로 정리하였습니다.

 

Ch1

함수 인자명 

function eatHamburgers(string _name, uint _amount) {
}

함수 인자명을 " _ " 로 시작해서 전역변수와 구별해야 함.

 

 

private / public 

function _addToArray(uint _number) private {
  numbers.push(_number);
}

코드와 같이 private로 선언된 함수명은 " _ " 로 시작해야함.

 

  • public 키워드를 사용하면 contract의 내부/외부 모두에서 해당 함수를 호출할 수 있다.
  • private 키워드를 사용하면 해당 함수를 해당 contract 의 내부에서만 호출할 수 있다.

 

+a

uint는 uint256과 동일


Ch2

매핑 형식

// 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장한다: 
mapping (address => uint) public accountBalance;
// 혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다 
mapping (uint => string) userIdToName;

 

상속

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}

BabyDoge는 Doge를 상속하게 된다. 추후 BabyDoge 내에서 Doge 내의 퍼블릭 함수인 catchphrase()를 사용할 수 있다. 

 

Storage vs Memory

Storage : 블록체인에 영구저장

Memory : 함수 호출이 종료되면 소멸

 

 

추가적인 함수 접근 제어자 

상속파트를 보면, 상속을 받았을때 그 부모의 public 함수를 사용할 수 있다는 것을 알 수 있다. 하지만 private로 선언된 함수는 상속을 받았다 하더라도 사용을 못한다. 

 

이때 private 대신 internal을 사용하면 된다. 

 

internal은 함수가 정의된 컨트랙트를 상속하는 컨트랙트내에서도 접근이 가능하다는 점을 제외하면 private와 동일하다. 

즉 하위 컨트랙트내에서 부모 컨트랙트의 함수를 사용하고 싶다면 internal로 변경하면 된다.

 

external은 보통 view와 함께 쓰인다. 

이더스캔에서 read 탭에 가면 쉽게 볼 수 있다.

 

다른 컨트랙트와 상호작용하기

contract LuckyNumber {
  mapping(address => uint) numbers;

  function setNum(uint _num) public {
    numbers[msg.sender] = _num;
  }

  function getNum(address _myAddress) public view returns (uint) {
    return numbers[_myAddress];
  }
}

위와 같은 컨트랙트가 배포되었다고 하고, 이제 내 컨트랙트를 작성하려한다. 이미 배포된 컨트랙트의 getNum을 사용하고 싶다면

contract MyContractName {
  function getNum(address _myAddress) public view returns (uint);
}

위 코드와 같이 작성하면된다.

 

다수의 반환값 처리하기

function multipleReturns() internal returns(uint a, uint b, uint c) {
  return (1, 2, 3);
}

function processMultipleReturns() external {
  uint a;
  uint b;
  uint c;
  // 다음과 같이 다수 값을 할당한다:
  (a, b, c) = multipleReturns();
}

// 혹은 단 하나의 값에만 관심이 있을 경우: 
function getLastReturnValue() external {
  uint c;
  // 다른 필드는 빈칸으로 놓기만 하면 된다: 
  (,,c) = multipleReturns();
}

맨 아래 코드는 (,,,,,,,,,,,,,,,,,,c) 와 같이 사용될 수도 있다. (쉼표 개수를 잘 확인하자)