본문 바로가기

web3 공부 (24.7. 15 ~ )/3주차

3주차 - 솔리디티 시작, 변수선언, 자료형(mapping, array, 구조체등)

 https://velog.io/@vamprodo47/Remix%EB%A1%9C-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0

 

Remix로 개발하기

이더리움 스마트 컨트랙 개발을 위해 IDE(통합 개발 환경)인 Remix를 사용해보겠습니다. VScode를 사용하지 않는 이유는, 자체적으로 솔리디티 코드를 디버깅하거나 컴파일 하는 기능이 없기 때문입

velog.io

먼저 솔리디티를 직접 사용해보고 싶어서 IDE(통합 개발 환경)인 Remix를 사용해볼려합니다.

 VScode를 사용하지 않는 이유는, 자체적으로 솔리디티 코드를 디버깅하거나 컴파일하는 기능이 없대요...

 

Remix를 사용하면 컴파일,배포,테스트,디버깅의 기능을 사용할 수 있다니까 일단 한번 해보겠습니다!

Web IDE : http://remix.ethereum.org

 

Remix - Ethereum IDE

 

remix.ethereum.org

이더리움에서 스마트 컨트랙트를 실행하기 위해서는 솔리디티 코드를 작성하고 solc이라는 솔리디티 컴파일러로 컴파일하여 이더리움 블록체인에 배포해야 한대요.. 그래서 우분투에 컴파일러 설치한 모습임다..! (버전확인)

 

하단에 초록체크 표시로 컨트랙트가 정상적으로 배포된걸 볼 수 있다.

가장 기본적인 컨트랙트 코드로 작성하고, 컴파일 후 배포한 모습이다.

왼쪽 Balance와 gass 로 확인할 수 있다.

 


💡변수 선언 방법

자 그럼 이제 설치랑 시작하는 방법을 알았으니, 제일 기초적인 변수와 자료형에 대해 알아보겠습니다.

 

먼저 솔리디티는 3가지 변수 타입이 있죠, 바로 지역변수(local), 상태변수(state), 전역변수(global) 입니다.

 

지역 변수 : 함수 내에서 선언된 변수로, 메모리에 저장됩니다. (블록체인 저장 X)

상태 변수 : 컨트랙트 내에서 선언된 변수로, 블록체인 스토리지에 저장됩니다. 함수 내부에서 자유롭게 사용가능.

전역 변수 : 이더리움 블록체인의 특정 정보를 제공하는 변수 (block.timestamp 등)

 

변수를 선언하는 방식은 아래와 같습니다. 기본적으로 변수 선언에는 자료형과 변수명을 사용합니다.

[ 자료형 / 변수 / 대입연산자 / 값]

💡다양한 자료형

솔리디티 자료형은 크게 값 타입(value type) 참조 타입(Reference type)으로 나뉩니다.

 

값 타입 : 값이 할당되거나 함수의 인자로 활용이 되면 해당 값 자체가 복사 

참조 타입 :  현재 해당하는 값의 주소만 복사

 

즉, 참조형 타입의 특징은 데이터를 어디에 저장할지 명시해야 한다는 것입니다.

기본적으로 참조형은 배열(array), 구조체(Struct)등이 있습니다.

➡️값 타입(value type)

  • 정수형 (Integers) : `uint` , `int`
  •   uint : 부호 없는 정수형, 8비트에서 256비트까지 8비트 단위로 크기 지정 가능 (ex : uint8, uint16 ... uint256까지)
  •   int : 부호 있는 정수형, 예시는 위와 똑같음.
  •  주로 산술연산자와 비교 연산자와 쓰이며 가격, 토큰의 아이디와 같이 숫자로 된 정보를 표현하기 위함.


  • 불리언 (Boolean) : `bool`
  •  bool : 참/거짓 값을 저장.특정한 조건에 발생하는 행동을 통제할 때 쓰이며 주로 비교 연산자,논리 연산자와 함께사용


  • 문자열 (String) 및 바이트 (Bytes) : `string`, `bytes`
  • string : 가변 길이 문자열. 즉 동적 크기 UTF-8(Unicode Transformation Format-8)로 인코딩된 배열이다.
  • bytes : 가변 길이 바이트 배열. 사용할 바이트를 미리 지정한다.참조 타입의 동적 크기 바이트토 있지만 값타입이 아님


  • 주소 (Address) : `address`, `address payable`
  • address : 계정의 주소를 나타내며, 20바이트 길이로 지정되어 있다. 유저의 고유 아이디 또는 배포된 스마트 컨트랙트의 아이디로 볼 수 있다. 이 주소를 통해 암호화폐를 주고 받는 것.
  • address patable : 송금할 수 있는 주소


 

➡️ 참조 타입(Reference type) 

  • 매핑(Mapping) : 매핑은 자바스크립트의 오브젝트와 같이 키-값 쌍을 형태로 저장하는 자료형이다.
  • 다시 말해 키와 대응하는 값을 저장하므로 원하는 값을 얻기 위해서는 그 값의 올바른 키를 입력해야 함.
  • 주로 주소와 같은 고유 키에 값을 매핑하는 데 사용된다.
  • ex) mapping (key type ⇒ value type) 가시성 지정자 매핑명

토큰 잔액 나타내는 예시코드
매핑에 키와 값을 추가한 코드
Account 주소를 복사한 뒤 Deploy를 눌러 배포
addM  함수의 인자로 복사해 두었던 주소와 정수값 (ex. 100)을 넣어 주고, transact 버튼을 클릭하면  myAddr  매핑에 해당하는 키와 값이 저장된다.


복사했던 Account 주소를  getM 의 매개변수로 입력한 후,  getM  함수의 call을 클릭해 결괏값을 확인


0: uint256: 100이라 뜬걸 알 수 있다.

 

결괏값은 100이 나왔다아. 매핑은 각 주소에 따른 토큰 잔액을 의미하기 때문에 복사한 Account 주소에 해당하는 유저가 토큰 100개를 가지고 있다는 걸 의미한다! myAddr 역시 복사한 Account를 매개변수로 넣으면 같은 결괏값이 나올것이다.

물론! 매핑에서 키와 값을 삭제할 수도 있지만..! 체력고갈로 다음기회에...☆

 


  • 배열(Array): 동일한 타입의 데이터를 순차적으로 저장하는 자료형으로, 동적 배열과 정적 배열로 나뉜다.
  • 동적 배열 : 선언 시 크기를 결정한다. 미리 사용할 배열의 크기를 지정할 수 있다. 
  • 정적 배열 : 실행 시간에 크기가 결정된다. 즉, 고정된 크기가 없어 계속 커질 수 있다. 
  • 배열은 참조 타입이며, 한 개의 배열에 여러 개의 값을 순차적으로 저장하기 때문에 배열의 길이를 지원합니다.

기본적인 배열 코드
getarrleng ,  getarr2leng  함수를 통해 각각의 길이 3과 10을 얻을 수 있다.

*** 추가 코드실행과정 설명 예정 ***


  • 구조체(Struct): 복합 데이터 타입을 정의한다. 다시 말해 사용자 정의 자료형이라 할 수 있다. (우리만의타입)
  • 원하는 자료형을 만들어 변수, 배열, 매핑 등과 같이 자료형을 명시해야 하는곳에 적용.
  • 구조체는 한 개 이상의 변수가 집단으로 구성되어 있어, 컨트랙트 밖에서 선언될 수 있다.

addPerson 함수를 호출할 때마다 people 배열에 새로운 Person 구조체가 추가되는 과정