[TIL] Part2 - DAY34 Solidity 코딩

박동우·2023년 5월 4일

블록체인 스쿨 3기

목록 보기
32/72

[TIL] 2023-05-04 DAY34


Solidity 코딩


오늘 배운것들

  1. Solidity 코딩
    1) 변수의 크기
    2) array
    3) string과 bytes 형변환
    4) struct

각종 팁

  1. 컴공 수업 중 강사님 추천 강의

회고

  1. 임베디드에서 작은 메모리 용량을 최대한 활용하기 위해 변수의 할당량을 줄이듯, 솔리디티에서 가스비를 절약하기위해 변수의 크기를 고려하는 것이 좋다. -> 가스비때문에 자원관리 필요
  2. 초보들이 가장 많이 하는 실수는 에러메세지를 무시하는 것 -> 에러 메세지를 잘 읽어서 수정하는 것이 가장 빠르고 좋은 방법이다.



Solidity 코딩

변수 크기

✔ 1byte = 8bit
✔ 16진수 = 2진수(bit) 4자리 = 4bit
✔ 16진수 2자리 = 8bit
✔ => uint는 byte 단위


✔ uint -> uint256
✔ bytes32 -> bytes 무제한
✔ => 만약 트랜잭션 자리수를 넣을 경우 가스비까지 고려하면 bytes말고 bytes32가 더 효율적임.

✅ 자리수 비교

🟥 코드

// 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 밖에 안됨 -> 준비한 값의 일부 날라감
    }
    */
}

✅ Array

array: 같은 자료형들이 들어있는 집합 -> 한개의 자료형만 들어갈 수 있음
형태: 자료형[] array이름

🟥 코드

// uint array
contract Array {
    // array = 같은 자료형들이 들어있는 집합
    uint[] numbers;
    string[] letters;

    // 1. 넣기
    function push(uint _a) public {
        numbers.push(_a);
    }

    // 2. 빼기
    function pop() public {
        numbers.pop();
    }

    // 3. 보기
    function getNumber(uint _a) public view returns(uint) {
        return numbers[_a-1]; // 배열이름(n번째)
    }


    // 4. 길이
    function getLength() public view returns(uint) {
        return numbers.length;
    }
    

    // 5. 바꾸기
    function changeNum(uint _k, uint _z) public {
        numbers[_k-1] = _z;
    }

    // 6. 삭제
    function deleteNum(uint _n) public {
       delete numbers[_n]; // 삭제된 숫자는 사라지는 것이 아니라 0으로 변경됨 -> 길이는 유지됨
    }

    // 7. 전체 array 반환
    function returnArray() public view returns(uint[] memory) {
        return numbers;
    }
}

✅ Struct

struct: 여러 타입의 자료들을 모음
형태: 구조체 선언 struct 구조체명 {.../.../...}

🟥 코드

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

    Student s;
    Student[] students; // Student형 변수들의 array students

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

    function getStudent() public view returns(Student memory) {
        return s;
    }

    function pushStudent(string memory _name, string memory _gender, uint _number, uint _birth) public {
        students.push(Student(_name, _gender, _number, _birth));        // 배열명.push(구조체명(구조체 정보들))
    }

    function popStudent() public {
        students.pop();
    }

    function getLength() public view returns(uint) {
        return students.length;
    }

    function getStudent(uint _n) public view returns(Student memory) {
        return students[_n-1];
    }

    function getStudents() public view returns(Student[] memory) {
        return students;
    }

}

✅ Error

어떤 경우에 에러가 나는지 확인
-> 함수의 이름이 같아도 허용이 되는 경우는 input의 갯수가 다를때 뿐이다.

🟥 코드

글이 너무 길어지므로 github에서 확인

profile
HELLO!

0개의 댓글