솔리디티
: 스마트 컨트랙을 만들기 위한 언어
- C++, 파이썬, 자바 스크립트의 영향을 받은 고수준 언어
- EVM (이더리움 버츄얼 머신)을 타겟으로 다자인 됨
- 정적 타입
- 여러 기능 중 상속, 라이브러리, 유저 정의 타입을 지원
- 수정할 수 없고 누구나 확인할 수 있기 때문에 신뢰성이 있음
✅ EVM (Ethereum Virtual Machine)
- 이더리움 네트워크의 노드들이 공유하는 하나의 거대한 가상 머신
▶ 솔리디티로 스마트 컨트랙 작성하는 방법: remix.ethereum.org 즉, 리믹스라는 웹 기반의 솔리디티 에디터를 활용
솔리디티 특징
1. 튜링 완전
- 반복문과 제어문을 사용할 수 있음
2. msg.sender / msg.value
- message.sender와 message.value라는 특수한 변수 존재
- message.sender : 메시지를 보낸 주소
- message.value : 메시지를 보낸 값을 이야기 함
스마트 컨트랙트
📌 스마트 컨트랙트 기본 구조 코드
pragma solidity 0.4.23; // 1. 컨트랙트 선언 contract Sample { // 2. 상태 변수 선언 uint256 data; address owner; // 3. 이벤트 정의 event logData(uint 256 dataToLog); // 4. 함수 변경자 정의 modifier onlyOwner() { require(msg.sender == owner); -; } // 5. 생성자 constructor (uint256 initData, address initOwner) public { data = initData; owner = initOwner; } // 6. 함수 (메소드) 정의 function getData() public view returns (uint256 returned) { return data; } function setData(uint 256 newData) public onlyOwner { emit logData(newData); data = newData; } }
✅ 컨트랙트
- 클래스와 비슷하여 상태 변수, 함수, 함수 변경자, 이벤트, 구조체, 열거형 등을 포함
- 상속과 다양성 또한 지원함
솔리디티 데이터 타입
1. 문자열 표현 : string, byte 타입
→ 스트링은 UTF-8로 인코딩되어 우리가 알아보기 쉽도록 표현됨.
2. 맵핑 : key와 value의 쌍
→ 아래 예제에서는 address 값을 key로 string value를 맵핑함.
3. 배열 : 동적 배열과 정적 배열 모두 사용 가능
- 동적 배열의 경우 블록체인 상에 마치 데이터베이스처럼 값을 계속 추가하며 사용 가능
- 인터페이스를 사용하여 추상계층을 작성할 수 있음
4. Modifier 한정자 : 함수 선언에 같이 선언하면 함수를 실행시키는 조건으로 자리할 수 있음
→ 다른 언어의 데코레이터와 비슷한 역할
📌 데이터 타입에 따른 코드 구상
// 1. string, byte 타입 contract Sample { string public myString = "wow"; bytes12 public myRawString = "wowowo"; } // 2. 맵핑 contract Sample { mapping (address => string) myMap; constructor(string value) public { myMap[msg.sender] = value; } } // 3. 배열 contract Sample { uint[] myDynamicArray = [0, 0]; uint[3] myStaticArray = [1, 1, 0]; } interface Token { function transfer(address recipient, uint amount) external; } // 4. Modifier 한정자 contract Sample { address owner; modifier onlyOnwer { require(msg.sender == owner); -; } function ownerCanDoIt(string something) public onlyOnwer view returns (string) { return something; } }
데이터위치와 문법
✅ 데이터 위치 관련 중요 키워드
- storage : 상태변수, 로컬변수 ▶ 블록체인 내에 저장됨
- memory : 로컬변수 ▶ 사용 후 휘발됨
✅ 솔리디티 기본 문법
▶ if, else, while, for, break, continue, return, 삼항연산자(? :)
→ 사용 문법 등은 다른 언어들과 동일
가시성
: 누가 접근할 수 있는지를 정의
- external : 다른 컨트랙트나 트랜잭션을 통해서만 호출될 수 있음
- Ex) function f를 그냥 부르면 동작하지 않지만 this.f를 통해 호출하면 동작함
- public : 모든 방법으로 접근할 수 있으며, Getter 함수가 자동 생성되어 값을 가져올 수 있음
- internal : 내부적으로만 접근할 수 있으며, 접근을 위해 this를 사용할 수 없다는 것이 특징
- private : internal과 비슷하지만 상속된 컨트랙트에서는 접근할 수 없음
가스
: EVM에서 무언가 실행될 때 발생하는 것으로 쉽게 수수료라고 할 수 있음
✅ 가스 리밋
- 수수료의 한계치
- 낮게 설정하면 일을 마치기 전에 수수료를 다 써버림
- 이 경우 이더리움에서는 지금까지 한 일들을 취소시키고 지금까지 사용한 수수료는 돌려주지 않음 ▶ 채굴자들이 일을 했기 때문
✅ 가스 프라이스
- 가스당 가격을 의미
- 가격이 비싸지면 채굴자들은 수수료를 많이 받을 수 있기 때문에 비싼 가스 프라이스가 먼저 채굴되는 경향이 있음
▶ 수수료 = 가스 프라이스 x 가스 사용량
→ 솔리디티에서 기능을 사용할 때마다 가스를 사용하게 되므로 신중하게 스마트 컨트랙트를 짜야함.
참고자료 : 블록체인과 솔리디티(https://inf.run/rr8q)
'Study > Blockchain & Solidity' 카테고리의 다른 글
[Solidity 깨부수기] Instance - constructor (0) | 2024.05.22 |
---|---|
[Solidity 깨부수기] Instance 정의 (0) | 2024.05.15 |
[Solidity 깨부수기] Function (0) | 2024.04.29 |
[Solidity 깨부수기] 기본 (1) | 2024.04.15 |
Blockchain (0) | 2024.04.03 |