[블체스 Part.3] 230504

이현진·2023년 5월 4일
0

BlockChain School

목록 보기
10/20

오늘은 스몰토크가 없이 수업 시작했어요.......
방금 밥먹어서 그런가 아주 졸리고 졸리네요ㅎㅎ

오늘부터 아침에 호수공원 산책하기로 마음먹었거든요.
날씨가 아주 좋더라구요!! 다음주 월요일부터 오운완도 올릴꺼에요
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ


UINT

uint 256bit
(1byte=8bit) >> 32byte

표현할 수 있는 최댓값이 다르다!
uint8 >> uint 중 가장 작은 단위
uint256 >> 가장 큰 단위 >> 255까지 표현 가능함!!
ㄴ 두자리까지 가능 , FF(16)=255(10)

이부분 하시면서 진수 관련해서 10분정도 설명해주셨는데
나는 사실 너무 재밌었다. 진수 바꾸는거 재밌지 않나...?ㅋ..ㅋ.... 옛날에 장교수님 디논 듣는 기분이었어요ㅎㅎ


전공애들은 수업을 듣긴 하지만 실제로는 못하는 경우도 많다. 이거는 꼭 익혀야함!!

  • operating system
  • data structure
  • algorithm

.
.
.


위에서 밑으로 내려오는 건 상관없음!

contract UINTBYTES {
    uint a;
    uint8 b;
    uint16 c;
    uint256 d;
    function setABCD(uint _a, uint8 _b, uint16 _c, uint256 _d) public {
        a=_a;
        b=_b;
        c=_c;
        d=_d;
    }
  • function에서 uint8을 uint16으로 바꾸게 된다면
    상단에서 b는 uint8로 선언했기 때문에 오류.

  • function에서 uint16을 uint256으로 바꾸게 된다면
    상단에서 c는 uint16으로 선언했기 때문에 오류.

  • uint256과 uint는 같다.

  • function에서 uint256을 uint8로 바꾸게 된다면
    상단에서 uint256으로 선언했으니 d는 256bit까지 사용할 수 있고, function에서 d는 8bit까지만 표현하라고 했으니 오류 없이 가능한 것이다!

  • input할때는 원래 선언했던 것보다 짧은 건 상관없음! 선언한 애가 감당이 가능하면 되는 것이다!!

설명을 잘 못하겠네...
암튼 민서강사님의 찰떡같은 설명을 듣고 이것밖에 못쓰는게 상당히 아쉽긴한데,,
그래도 이거읽고..느낌정도는...오겠지.....

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;

/*
실습가이드
1. 10 넣어보기, 0x10 넣어보기 -> 각각 차이 보기
2. setABCD에서 b에 256 넣어보기 -> b는 uint8 -> 2자리까지 -> 256은 100 -> 자리수 넘어감
3. setABCD에서 0x1234 모두 넣어보기 -> b는 uint8 -> 2자리까지 -> 256은 100 -> 자리수 넘어감
*/

contract UINT {
    uint a;
    uint8 b; // 8bits = 1 byte = 16진수 2자리 = 0 ~ ff(16진수) = 0 ~ 255(10진수)
    uint16 c;
    uint256 d;

    function setABCD(uint _a, uint8 _b, uint16 _c, uint256 _d) public {
        a = _a;
        b = _b;
        c = _c;
        d = _d;
    }

    function setABCD2(uint8 _a, uint8 _b, uint8 _c, uint8 _d) public {
        a = _a; // 준비한 것은 64자리, 들어온 것은 2자리 -> 문제없음
        b = _b; // 준비한 것과 들어온 것 일치
        c = _c; // 준비한 것은 4자리, 들어온 것은 2자리 -> 문제없음
        d = _d; // 준비한 것은 64자리, 들어온 것은 2자리 -> 문제없음
    }

    /*
    function setABCD3(uint256 _a, uint256 _b, uint256 _c, uint256 _d) public {
        a = _a;
        b = _b; // uint8로 선언되었는데 들어오는 값은 더 큰 uint256
        c = _c; // uint16로 선언되었는데 들어오는 값은 더 큰 uint256
        d = _d;
    }
    */

    function getABCD() public view returns(uint, uint8, uint16, uint256) {
        return (a,b,c,d);
    }

    function getABCD2() public view returns(uint, uint, uint, uint) {
        return (a,b,c,d);
    }

    /*
    function getABCD2() public view returns(uint8, uint8, uint8, uint8) {
        return (a,b,c,d);
        a, d // 준비한 것은 uint256인데, 내보내는 값은 uint8 밖에 안됨 -> 준비한 값의 일부 날라감
    }
    */
}

BYTES

아까 uint에서 공부했듯이
1Bytes = 8bits = 두자리 이다.

bytes의 default값!!

아래와 같이 set을 하면 c에서 오류가 발생한다.

c에는 4자리값을 받으라고 했는데 두자리만 입력해서 오류가 발생하는 것이다.

c에 4자리를 주면 잘 동작한다.

bytes32

bytes32를 사용하게 된다면, 입력값은 무조건 64자리가 되어야 오류가 발생하지 않는다.
그러니까 bytes는 입력값의 자릿수가 명확할 때 사용하는 것이 좋겠다!!

bytes32는 딱 64자리만 들어갈 수 있는데,
bytes는 거의 무한대로 들어갈 수 있다고 보면 된다!!

String-Bytes

StringToBytes

BytesToString

string은 동적, bytes1는 정적이기 때문에 매칭이 안된다.
그렇기 때문에 Bytes->String으로 변환하려면 bytes memory로 해야한다!!


위 사진에서 보여주고 싶은 것!!

  1. 하나의 솔리디티 파일에 두 개의 contract를 넣을 수 있다.
  2. function 안에서도 variable 변수를 만들 수 있다.

Array

Array : 같은 자료형들이 들어있는 집합
Array 정의 : 타입[] 배열이름
ex) uint[] number

uint

넣기

빼기

pop 은 가장 늦게 들어온 값이 가장 먼저 빠져나가는 LIFO이다.

  • 특정한 값을 빼려면?

    직관적으로보면 이렇다.
    값을 전달한 후 pop을 하면 된다.
    일단은 이 정도로만 알라고 하셨다.

보기

길이확인

바꾸기

삭제하기

  • delete는 값만 0으로 바뀌고, 배열은 그대로 남아있다.
  • 그래서 delete 후 배열길이를 보면 바뀌지 않고 그대로이다.

전체 Array 반환하기

string

넣기, 빼기, 보기, 길이확인, 바꾸기, 삭제하기


동적 정적

이거 반복하시는거 보니까 시험에 나올거같아여
동적은 자릿수 안정해져있는거
정적은 자릿구 정해져있는거

bytes1 이런거는 자릿수가 정해져있ㅇ으니까 정적!
bytes 자체는 동적이지만, bytes(1) 이런식으로 만들어줄 수 있다.


배열의 첫글자를 뽑아내는 것이 오늘의 목표

성공!

사실 이 부분 할 때 너무 졸려서 제대로 못들어가지구...
이따 저녁에 복습해봐야겠다.


구조체

구조체 선언

** Student형 변수 선언.

    Student s;

** Student형 Array 선언.

    Student[] students;

문제 1.

  • 이름, 성별, 번호, 생년월일을 가진 학생 구조체를 만들고 학생형 s라는 변수를 선언하시오.
  • 그 후에, s에 값을 넣는 함수와 s의 값을 반환하는 함수를 만드세요.
contract Struct2 {
    
    struct Student2 {
        string name;
        string gender;
        uint number;
        uint birth;
    }
    Student2 s;

    function setStudent2(string memory _name, string memory _gender, uint _number, uint _birth) public {
        s = Student2(_name, _gender, _number, _birth);
    }

    function getStudent2() public view returns(Student2 memory){
        return s;
    }
}

오늘은 뭔가 내용이 엄청 길어진 것 같다..
내일 어린이날이니까 열심히 쉬고 다음주 수업 열심히 들어야겠다!!
(어린이날 알바가는사람.... 저요....... 쉬고싶습니다ㅠ)

profile
https://github.com/lhjbg0821

0개의 댓글