본문 바로가기
Develop/Solidity

[Solidity] 4. mapping

by Tarra 2023. 2. 14.

 

 


개인 공부 후 자료를 남겨놓기 위한 목적이므로,
생략되거나 오류가 있을 수 있음을 알립니다.

 

[Solidity] 1. 변수

[Solidity] 2. 간단한 송금 시스템 만들어보기 + 계정에 대한 이론

[Solidity] 3. 스마트 컨트랙트 시작, 중단, 정지하기

[Solidity] 4. mapping

[Solidity] 5. 예외처리 (require와 assert)

[Solidity] 6. 생성자, 대비책 함수 (view / pure / getter)

[Solidity] 7. 제어자, 상속, file import

[Solidity] 8. 이벤트 및 반환 변수

 

 


- 참고했던 document

▶ Become Ethereum Blockchain Developer

https://ethereum-blockchain-developer.com/000-learn-ethereum/

 

Overview and Pricing - Become Ethereum Blockchain Developer

Learn Blockchain Development - Become Web3 Expert Ethereum-blockchain-developer.com is offering web developers, enterprise developers and software development professionals self-paced video courses with interactive labs to become successful Ethereum Blockc

ethereum-blockchain-developer.com

 

▶ Solidity_doc

https://docs.soliditylang.org/en/v0.8.16/

 

Solidity — Solidity 0.8.16 documentation

1. Understand the Smart Contract Basics If you are new to the concept of smart contracts we recommend you to get started by digging into the “Introduction to Smart Contracts” section, which covers: 2. Get to Know Solidity Once you are accustomed to the

docs.soliditylang.org

 

▶ 솔리디티_doc

https://solidity-kr.readthedocs.io/ko/latest/

 

Solidity — Solidity 0.5.10 documentation

Solidity는 스마트 컨트랙트를 구현하기 위한 컨트랙트 기반의 고급 프로그래밍 언어입니다. Solidity는 C++, Python, 그리고 JavaScript의 영향을 받아 만들어졌습니다. 그리고 Ethereum Virtual Machine(EVM)에서

solidity-kr.readthedocs.io

 


매핑은 키워드 mapping 으로부터 시작하며,

일반적으로 키 유형과 값 유형을 입력받는다. ( 파이썬에서는 딕셔너리 생각 )

 

그 다음으로는 변수 이름을 입력해주며, 키 유형은 다른 매핑이나 스마트 컨트랙트 등

거의 모든 유형이 키가 될 수 있다.

 

가장 기본인 mapping의 선언

 

 

 

 


 

1. mapping의 기본

다음과 같이 코드를 작성했을 경우,

uint 256에 bool 값들이 false로 초기화 되어 있고.

 

 

getter를 통해 해당 값들에 대해 접근해 보면 0~256까지 모두 false로 초기화 되어 있는 것을 확인할 수 있다.

 

매핑은 배열과 달리 길이가 없다는 것이 핵심이다.

 

 

그렇다면 이 값들은 어떻게 설정해야 할까? 값 설정을 위한 함수를 만들어보자.

여태까지의 다른 함수와 같이 다음과 같이 설정할 수 있다.

 

 

이 처럼 매핑을 사용하면, 유연하게 특정한 무언가를 주소에 저장할 수 있다는 장점이 있다.

 

 

 


 

2. 예제를 통해 이해하기

기본적인 3가지 함수를 미리 구현해놓았다.

 

 

이 코드에 mapping 을 추가해보도록 하자.

 

+ mapping 은 키 유형을 값 유형으로 매핑이 가능.

 

 

위와 같은 변수를 추가했을 경우, 사용 가능한 모든 키가 이미 기본값으로 초기화 되어 있기 때문에,

아무것도 초기화할 필요 없이 바로 작업을 시작할 수 있다. (0으로 초기화)

 

초기화한 mapping을 바로 활용해주는 모습.

 

 

 

  • 해당 사람이 매핑에 가지고 있는 금액을 알려주고,
  • 해당 금액을 0으로 설정한 뒤,
  • _to 주소에 그 금액을 전송한다.

이는 Check Effects interactions 라는 것을 따른다.

 

 

💡Check Effects interactions 란?

예기치 않는 실행을 막기 위한 가장 기본적인 코딩 패턴을 의미한다.

function 내에서 원하는 기능을 실행하기 전에,

사전에 필수적으로 체크되어야 할 전제조건을 모두 확인한 후 실행이 되도록하는 프로그래밍 패턴

 

 

이제는 계좌에서 부분 인출을 할 수 있도록 바꿔보자.

인자를 두개 받고, 자금이 충분 않으면 오류를 뿜도록 한 코드.

 

 

 

 


 

3. 솔리디티 구조체

 

 

 

💡구조체의 구조 값 접근 방법.

위의 Payment 의 경우에는 Payment.amount , Payment.timestamps 와 같이 
접근이 가능하다.

 

 

위와 같이 선언한 구조체를 기존의 매핑에 넣어보자.

 

 

mapping의 구조가 바뀌었으므로 업데이트가 필요해지며,

구조체의 값은 . 을 통해 접근이 가능하다.

 

 

 

구조체 적용 후 완성된 코드 모습.

 

 

 

 


 

4. 배열

솔리디티에도 배열은 존재한다.

배열은 java나 C++ 처럼 고정길이나 동적 배열을 가지는데,

이더리움은 저자원 연산 엔진이므로, 요소를 배열에 넣었다가 제거하는 등의 연산을 하게 되면

금세 가스문제를 맞닥뜨리게 되므로, 추천하지 않는다.

 

 

 

 


 

5. Enum (이넘)

이넘 또한 솔리디티에서 사용자 정의 유형을 만드는 방법 중의 하나이다.

 

 

위와 같이 사용하며,. 행동 선택 유형으로 변수 선택을 정의한다는 특성이 있다.

이러한 행동 선택은 정수로 매핑하여 구현할 수도 있으므로 크게 사용되지는 않는 편.