IT/블록체인

[Solidity] mapping

KimCookieYa 2023. 9. 2. 03:51

mapping

mapping은 Solidity에서 키(key)-값(value) 쌍을 저장하는 자료 구조이다. 이는 JavaScript의 객체(Object)/해시 테이블과 유사하며, 특정 키를 사용하여 값을 빠르게 검색할 수 있다.

기본 문법

mapping(keyType => valueType) public/external/internal/private mapName;

  • keyType: 키의 데이터 유형을 지정한다. 이는 uint, int, address 등과 같은 Solidity의 기본 타입일 수 있습니다. mappingdynamic arrays는 키로 사용될 수 없다.
  • valueType: 저장할 값의 데이터 유형을 지정한다. 모든 데이터 타입이 가능하며, 다른 mappingdynamic arrays도 포함될 수 있다.
  • public/external/internal/private: 가시성을 지정한다.

예제

pragma solidity ^0.8.0;

contract Example {
    mapping(address => uint) public balances;

    function setBalance(address _address, uint _balance) public {
        balances[_address] = _balance;
    }

    function getBalance(address _address) public view returns (uint) {
        return balances[_address];
    }
}

특징 및 주의사항

  1. 기본 값: 모든 키는 기본적으로 0 또는 해당 타입의 "zero state"를 가진다. 따라서 초기화되지 않은 키를 조회하면 0을 반환한다.
  2. 삭제: delete 키워드를 사용하여 특정 키의 값을 제거할 수 있다. 제거 후 해당 키는 다시 기본값으로 초기화된다.
  3. 열거 불가능: mapping은 기본적으로 열거할 수 없다. 즉, 저장된 모든 키-값 쌍을 순회할 수 있는 방법은 없다.
  4. 저장 공간: mapping은 Ethereum의 저장 공간(Storage)에 데이터를 저장한다. 따라서 가스 비용이 발생할 수 있다.
  5. 외부 사용 불가: 다른 스마트 컨트랙트에서 mapping에 직접 접근할 수 없으므로, Getter 함수를 통해 접근해야 한다.

 

JavaScript의 객체와의 차이점

SoliditymappingJavaScriptobject는 표면적으로는 유사한 기능(키-값 쌍 저장)을 제공한다. 그러나 몇 가지 중요한 차이점이 있다. 이 차이점들은 각 언어와 환경의 본질적인 특성에서 기인한다.

주요 차이점

  1. 데이터 저장 위치
    • Soliditymapping은 블록체인의 저장 공간(Storage)에 저장되므로 변경될 때마다 가스 비용이 발생한다.
    • JavaScriptobject는 메모리에 저장되며, 별도의 비용이 없다.
  2. 가시성 및 접근성
    • Soliditymapping은 외부에서 직접 접근할 수 없어, Getter 함수를 제공해야 한다.
    • JavaScriptobject는 외부에서도 직접 접근 및 수정이 가능하다.
  3. 열거 가능성
    • Soliditymapping은 열거할 수 없어, 저장된 모든 키-값을 알 수 없다.
    • JavaScriptobjectfor...in 루프나 Object.keys() 등을 사용하여 열거할 수 있다.
  4. 타입 제한
    • Soliditymapping은 키와 값의 타입을 명시적으로 지정해야 한다.
    • JavaScriptobject는 동적 타이핑을 지원해 키와 값의 타입을 미리 지정할 필요가 없다.
  5. 기본 값 설정
    • Soliditymapping은 사용되지 않은 모든 키가 기본적으로 0 또는 해당 타입의 "zero state"를 가진다.
    • JavaScriptobject에서 존재하지 않는 키를 조회하면 undefined를 반환한다.

장단점

  • Solidity의 mapping
    • 장점: 블록체인의 분산 저장 환경에서 안정적이고 빠른 데이터 접근을 제공한다.
    • 단점: 가스 비용, 열거 불가능, 외부 접근 제한 등이 있다.
  • JavaScript의 object
    • 장점: 유연하고 다양한 데이터 타입을 쉽게 다룰 수 있다.
    • 단점: 메모리에 저장되므로 휘발성이며, 블록체인과 같은 분산 환경에는 적합하지 않을 수 있다.

주 사용처

  • Soliditymapping은 주로 스마트 컨트랙트에서 사용되며, 블록체인에서 안정적인 데이터 관리가 필요할 때 사용된다.
  • JavaScriptobject는 웹 개발을 비롯한 여러 애플리케이션에서 널리 사용된다.

이러한 차이점과 장단점을 고려하면, 두 구조가 유사해 보이지만 실제로는 다른 목적과 환경에 적합하다는 것을 알 수 있다.