블록체인 TIL-8Week-52Day

디오·2023년 5월 3일
0

어제 배운 Solidity에 대한 추가적인 내용을 복습하고 오후에는 새로운 내용도 배웠다. 오늘도 역시 복습하는 부분과 새롭게 배운 내용에 대해서 정리를 해보도록 하겠다.



😊SmallTalk 및 추가정보.

  • 해커톤 해보면 좋다.

  • 발상의전환 - 프로젝트 진행시 껍때기를 만들게 된다면 피할생각 하지 마라
    강사님들은 다 알고 있고, 어차피 껍때기 만들거라면 껍때기라도 제대로 만들어보자(이건내생각)

  • 개인실력이 좋아도 팀플로 이끌어 가는건 다르다.
    내 개인작업만 신경쓰지 말고 팀장님을 도와서 함께 해나가야한다. 또는 내가 팀장이라면 팀원들이 잘 뭉칠 수 있도록 하는것이 중요하다.

  • 현진님 벨로그에 solidity github에 올리는 방법 작성되어있다.
    (해봤는데 너무 좋은데 파일별로만 올라가는게 아쉽다ㅜㅜ)

현진하다현진해 현진사마 벨로그🤓



☑️ 이전 Solidity 복습.

추가 된 내용.

// 상태변수도 변경하고 리턴으로 답을 받는것도 가능.(세명님 질문)

    function changeandAdd (uint _aa) public returns(uint) {
        a = _aa;
        return (a+b);
    }
//write -> public (사용)
//read -> view (읽는것만)
//(X) -> pure (다안돼)
  • 다행히 어제 복습을하고 정리한 내용을 몇번 봐서인지 크게 어려운 부분은 없었다.

  • 다만, 어제 내가 잘못생각하고 있던 부분이 강사님이 문제를 내실때 가져온다, 받아온다 라는 표현을 쓰셔서 가져오는것과 받아오는것이 구분되어져 있고, 받아오는것이 상태변수에서 받아오는것이고, 가져오는것이 input값을 가져오는것이라고 생각했었는데 아니였다.

    • 받아오다, 가져오다는 큰 의미가 없고, 문제의 맥락을 파악하고 input값을 쓸것인지 상태변수를 가져올 것인지를 고민해야하는 것이었다.

    • 사실 아직도 강사님이 문제를 내시면 문제를 이해하는것만으로도 시간을 꽤 소비하는데 이건 내가 문제를 많이 풀어보던 문제를 계속 머릿속에 넣던 내가 해결을 해야 할 문제인것 같다.

  • 이전 복습내용은 전날 벨로그 내용에 있다.



✅ 새롭게 배운부분 (문자형).

1.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;

contract UintandString {
    uint a; //숫자형 변수 a 선언
    string b; // 문자형 변수 b 선언


// view 나 pure를 못쓴다. 상태변수를 바꿔야하기 때문에..
    function setA(uint _a) public {
        a = _a;
    }
// 아무것도 선언을 안하면 값이 0이 나온다.
    function getA() public view returns(uint) {
        return a;
    }
// string을 사용하기 위해서는 memory 나 calldata로 불러온다.
// b의 값을 바꾼다.
    function setB(string memory _b) public {
        b = _b;
    }
// 상태변수에 있는 b를 불러온다.
// b 값을 반환했다?
// string 형태는 값이 비어서 나온다.
    function getB() public view returns (string memory){
        return b;
    }
// Deploy 에서 setBasC를 누르고 getB를 누르면 getB에 값이 C가 나온다.
    function setBasC() public {
        b = "c";
    }
// 아스키코드로 인해서 대소문자를 구분할 수 있음.
    function setBasC2() public {
        b = "C";
    }

    function setBasABC() public {
        b = "abc";
    }
//a와 b에 내가 원하는 값을 넣을 수 있는 함수
    function setAB(uint _a, string memory _b) public {
        a = _a; b = _b;
    }
//a와 b의 값을 반환하는 함수를 만드세요.
    function getAB() public view returns (uint, string memory){
        return (a, b);
    }
}
  • 숫자형은 uint, 문자형은 string으로 받아온다.
  • 기본적으로 숫자형처럼 문자형을 사용하면 오류가 생긴다.
    • 이 문제를 해결하기 위해선 string 옆에 memory를 붙이면 해결된다.
  • 상태변수로 지정한 아이들은 storage에 저장된다.

  • storage는 무겁다. 한번 저장이 되면 끝까지 저장이 된다.(체인에도 저장이 된다.)

    • 반면, calldata와 memory는 휘발성을 가진 데이터다. 금방 사라진다.
  • calldata는 어딘가에 있는걸 가져와서 쓰겠다이고, memory는 calldata에 있는걸 가져오겠다는것이다.

  • 메모리가 저장되어있는 장소 (storage, calldata)

  • 추가적인 내용은 상단에 주석 확인.



2.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;

/*
실습 가이드
1. 0x16을 넣고 setA 실행하기
2. getA -> 0x16 결과 확인
3. setA2 
4. getA -> 0x3136 결과 확인 
5. abc를 넣고 setA3 실행하기
6. getA -> 0x616263 결과 확인
*/


contract BYTES {
     bytes a;

     function setA(bytes memory _a) public {
            a = _a;
     }

     function setA2() public {
         a = "16";
     }
// bytes형에서 문자형으로 변경이 가능.
     function setA3(string memory _a) public {
         a = bytes(_a);

     }

     function getA() public view returns(bytes memory) {
           return a;
     }

    
}
  • Bytes - 선언.
  • string과 bytes는 현재로서는 뒤에 memory 붙여준다고 생각하라고 강사님이 말씀하심.
  • BYTES는 16진수로 표현된다.
  • string 과 마찬가지로 bytes도 스페셜하다 (무겁다).
  • BYTES는 Deploy에 0x가 나오는데 0x는 16진수 형태로 저장이 되어있는것을 말해준다.

  • Deploy에서 setA에 그냥 숫자를 넣으면 오류가 나는데 앞에 0x를 붙이면 문제가 해결된다.
    • 16(x) -> 0x16(o)

  • 위 이미지를 통해 Deploy를 작동시켜보면 문제없이 원하는 값을 얻어낼 수 있다.
    그리고 최종 결과값이 0x3136이 나오는 이유는 "아스키코드" 때문이다.
  • 아스키코드를 보면 문자열 "1"은 31, "6"은 36이기 때문에 0x3136이 Deploy에 값이 나오는것임.(문자열로 값을 call했기 때문)
    • a = "16";
  • bytes형에서 문자형으로 변경이 가능.
    • a = bytes(_a);



3.sol

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;

contract BYTES {
     // 입력한 수의 제곱을 반환해주는 함수를 구현하세요.
     function square(uint a) public pure returns(uint) {
        return a**2;
    }

    // 입력한 수의 세제곱을 반환해주는 함수를 구현하세요.
    function cubic(uint a) public pure returns(uint) {
        return a**3;
    }

    // 입력한 수의 a의 b승을 반환해주는 함수를 구현하세요.
    function power(uint a, uint b) public pure returns(uint) {
        return a**b;
    }
}
  • 위 코드는 강사님께서 문제를 내신것에 코드를 만들어 본 부분인데 첫번째 줄은 내가 짠 코드이고, 두번째와 세번째는 강사님께서 예시로 작성하신 코드다.

    • 입력한 수 (input값) , 제곱을 (return에 들어갈 식) , 반환해주는 (returns) 이라고 생각을 하고 문제를 풀었다.

    • 상태변수가 없는 상태에 지역변수로 input값을 사용해서 pure를 적었고, output값을 가져오기 위해 uint를 작성했다.

    • 결과값은 return을 작성하고, a의 제곱을 표현하기 위해 **2를 붙였다.

    • 마찬가지고 세제곱은 제곱에 숫자만 변경하면 되고, a의 b승을 표현하는 경우 input값을 2개를 만들어주고, a**b로 작성을 하면 된다.



💡메모.

  • view - 참조가 가능하지만 값을 변경할 순 없음.

  • pure - 참조도 않되고 값도 변경 못함.

  • payable - 정보를 받아와서 값을 바꿔줄 수 있음(가스비가 듬)

  • bytes - 바이트

  • uint - 숫자형

  • string - 문자형

  • 바이트형에서 문자형으로 변경 가능.

  • 코딩테스트 문제 예시 : 2개의 Input값을 가지고 1개의 output값을 가지는 4개의 함수를 만드시오. 각각의 함수는 더하기, 빼기, 곱하기, 나누기(몫과 나머지 반환)를 실행합니다.
    • 계산기를 만드는 문제를 이런식으로 표현하심. 문제에 익숙해질 필요가 있음.
  • storage - 상태변수와 관련있음.
    • memory, calldata 보다 무겁다.
    • 한번 저장이 되면 끝까지 저장이 된다.(체인에도 저장이 된다.)
  • memory, calldata - 지역변수와 관련있음.
    • storage 보다 가볍다.
    • 상대적으로 휘발성이다.
    • calldata는 calldata에 포함된 내용을 사용하겠다는것.
    • memory는 calldata로부터 가져온 후에 카피본을 만들어서 사용하겠다는 것.
    • calldata의 경우 원본이기 때문에 수정이 어렵다.
      • 원본을 가져와서 사용.
    • memory같은 경우 상대적으로 수정이 쉽다.(카피본이여서)
      • 원본을 카피해서 카피본을 사용.
    • memory가 붙어줘야 하는 애들 (array, struct, mapping)
      • specialArray라고 해서 string과 bytes가 특별한 형태의 array로 있음.



💻참고 링크 및 이미지.

https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf

  • 아스키 코드



🌜하루를 마치며..

오늘 4시에 수업을 마치고 6시까지 프로젝트 팀빌딩 시간이 있었다. 팀빌딩이라고는 하지만 다른 많은 분들과 대화를 나눠보지 못해서 아쉬움이 많이 남았다. 사실 내가 코딩경험이 전무하고 NFT관련해서도 아는부분이 많이 없어서 팀에 들어간다고 했을때 팀의 일원으로서 잘 해낼 수 있을지 모르겠다는 생각이 크다. 아직 시간이 있으니 고민을 많이 해봐야겠지만 일단은 주어진 강의시간을 집중해서 듣는게 가장 중요하다는 생각이 든다. 오늘도 현진했다!!!

profile
개발자가 되어가는 개린이"

0개의 댓글