[TIL] Part2 - DAY35 Solidity 및 블록체인 이론

박동우·2023년 5월 8일

블록체인 스쿨 3기

목록 보기
33/72

[TIL] 2023-05-08 DAY35


Solidity 및 블록체인 이론


오늘 배운것들

  1. 저번시간 복습
    1) bytes와 string 변환 확인
    2) array 복습
  2. address와 mapping
  3. 블록체인 기초 이론

각종 팁

회고

  1. 이론수업 때 집중하려고 노력하기



💻 Solidity 코딩

✅ 복습

  1. bytes와 string은 서로 자료형 변경이 가능하다.
  2. 상태변수는 체인에 올라간다.(가스비를 쓴다) ->
    일반함수(public만 쓰는 함수)는 상태변수를 쓰기 때문에 가스비를 사용한다.
  3. view나 pure는 함수 안에서 지역변수만을 사용하며 상태변수를 참조만 할 때 사용한다.
  4. 배열안에 값을 넣고 싶을 때는 -> push
  5. array에는 같은 자료형만 들어간다.

✅ GasAndFee

🟥 코드

contract GasAndFee {

    uint b; // 상태변수

    // 상태변수 변화 -> gas비 소비, 잔액 변화
    function changeB() public {
        b = b+5;
    }

    // pure 함수 -> 잔액 변화 x
    function add(uint _a, uint _b) public pure returns(uint) {
        return _a+_b;
    }

    // pure와 같은 역할이지만 일반 함수 -> gas비 소비, 잔액 변화
    function add2(uint _a, uint _b) public returns(uint) {
        return _a+_b;
    }
}

✅ Address

address라는 20 bytes 변수가 있음.
주소 및 잔액조회

🟥 코드

contract Address {
    // address는 20byte짜리 정적변수
    // address라는 형의 변수가 따로 존재
    address a;      

    function getAddress() public view returns(address) {    
        return address(this);       // 컨트랙트 주소
    }


    function getMyAddress() public view returns(address) {
        return address(msg.sender);     // 내 지갑 주소
    }

    function getMyBalance() public view returns(uint) {
        return address(msg.sender).balance;     // 실제 잔고와 약간 차이가 존재함
    }

    function getContractBalance() public view returns(uint) {
        return address(this).balance;
    }


    function setA(address _a) public {
        a = _a;
    }

    // 길이만 같을 뿐 형이 다르기 때문에 오류 발생
    // function setA2(bytes20 _a) public {
    //     a = _a;
    // }

    function getA2() public view returns(bytes20) {
        return bytes20(a);
    }

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

✅ Mapping

형태: mapping이름[key 값] = value값
key값을 바로 저장하는게 아니라 KECCAK256형태로 저장함
배열에 비하여 mapping을 하면 검색을 하는데 더 유리함

🟥 코드

contract Mapping {
    mapping(uint => uint) a;    // key-value 쌍이 숫자-숫자로 연결되어 있는 mapping a
    mapping(uint => string) b;  // string이 알고 싶음
    mapping(string => address) c;   // address가 알고 싶음


    // 이중 mapping(ex) 3반에 있는 alice의 점수)
    mapping(uint => mapping(string => uint)) score;


    // 이름을 검색하면 그 아이의 키를 반환받는 contract를 구현
    mapping(string => uint) height;


    // mapping에 정보 넣기(이름과 키 입력)
    function setHeight(string memory _name, uint _h) public {
        height[_name] = _h; // mapping이름[key 값] = value값
    }

    // mapping에 정보 빼기(이름을 입력하면 키 불러오기)
    function getHeight(string memory _name) public view returns(uint) {
        return height[_name];   // mapping이름[key값]
    }

    // 정보 삭제
    function deleteHeight(string memory _name) public {
        delete height[_name];
    }
}


📕 Basic Education 9

✅ 머클 트리

  • 블록체인에서 머클 루트를 생성할 때 사용한다.
  • SPV 노드가 풀 노드에게 부탁할 때에도 사용된다.
  • 순수한 형태의 이진트리

✅ 머클 패트리시아 트리

  • 트리를 사용하는 근본적인 이유는 저장, 수정, 삭제, 검색의 효율성을 높이기 위함이다.
  • 총 4가지 종류의 머클 패트리시아 트리가 사용된다. state, storage, transactions, receipts
  • 머클 트리의 응용형태


-> 복잡한 지갑주소를 쉽게 관리(key의 효과적인 저장방법)


-> key 값을 넣으면 거기에 맞는 value 찾기 가능


-> 실제 키 값에 따른 value저장 예시(Extension, Branch, Leaf node)

profile
HELLO!

0개의 댓글