[TIL] 2023-05-08

Melon Coder·2023년 5월 8일
0

TIL

목록 보기
29/50
post-thumbnail

Today I Learned


[Solidity]

오늘은 array 복습, struct에서 특정 요소를 변경 또는 반환하는 방법, view/pure 함수와 일반함수 간에 가스비 소비 유무, 그리고 mappingaddress타입, 머클트리머클 패트리시아 트리에 대해 배웠다.


Array 복습

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.18;


// 먼저 D라는 구조체 안에 숫자형 변수a, 문자열 변수b, bytes2형 변수c를 선언한다.
contract note1 {
    struct D {
        uint a;
        string b;
        bytes2 c;
    }
    
	// D형 변수 dd 선언.
    D dd;
    
	// 변수 dd에 값 부여.
    // string은 동적이기 때문에 memory위치에 데이터를 넣고 bytes2는 정적으로 크기가 고정되어 있기 때문에 데이터 위치를 지정해줄 필요가 없다.
    // 변수 dd에 D구조체 안의 변수값들을 넣어준다.
    function setDD(uint _a, string memory _b, bytes2 _c) public {
        dd = D(_a, _b, _c);
    }
    
	// dd의 값을 반환하는 함수로 타입은 D이기 때문에 출력값은 D타입 이다.
    function getDD() public view returns(D memory){
        return dd;
    }
	
    // D형 변수들이 들어가는 array Ds를 선언.
    D[] Ds;

	// array Ds에 새로운 D형 변수값들을 넣는 함수 생성.
    function pushD(uint _a, string memory _b, bytes2 _c) public {
        Ds.push(D(_a, _b, _c));
    }
	
    // Ds의 n번째 요소를 반환하는 함수 생성.
    // 출력값은 D 타입이다.
    function getN(uint _n) public view returns(D memory) {
        return Ds[_n-1];
    }
}

address

contract note2 {

	// address형 변수a 선언.
    address a;
	
    // address(this)는 해당 컨트랙트(note2)의 주소를 반환한다.
    function getAddress() public view returns(address) {
        return address(this);
    }
	
    // address(msg.sender)는 현재 스마트컨트랙트를 호출한 사용자의 지갑 주소를 반환한다.
    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 = address(_a);
    }

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

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

mapping

contract note3 {
    mapping(uint => uint) a;
    mapping(uint => string) b; // mapping(type => type) mapping name
    mapping(string => address) c;

    // height라는 string 타입의 key와 uint 타입의 value를 가지는 매핑 변수를 선언.
    mapping (string => uint) height;
    
    // height에서 _name에 해당하는 key의 값을 _height로 설정.
    function setHeight(string memory _name, uint _height) public {
        height[_name] = _height;
    }

    // _name이라는 key 값을 입력하면 대응하는 value값을 반환.
    function getHeight(string memory _name) public view returns(uint) {
        return height[_name];
    }
}

머클 패트리샤 트라이

머클 패트리샤 트라이는 저장, 수정, 삭제, 검색을 효율적으로 할 수 있게 해준다.
머클 패트리샤 트라이에는 4가지 노드가 있다.(blank, leaf, branch, extension)

0개의 댓글