---
# System prepended metadata

title: 특징

---

특징
===

Smart Contract 란?
---
- 이더리움 블록체인에서 ```특정 주소```에 있는
- 이더리움 블록체인 위에서 구동되는 ```프로그램```: 코드와 함수 그리고 데이터 (상태)의 모음

*by Ethereum Foundation*


Solidity의 일반적인 특징
---

- Solidity 의 언어적인 특징: C++ 과 Python 의 특징을 많이 닮았다.
- C++ 적인 특징
    - 변수 선언, 반복문, 오버로딩, 명시적/암묵적 타입 변환
- Python 적인 특징
    - decorator (modifier 이름으로 사용), 다중 상속, super, 값과 참조 타입의 copy 시맨틱
- Smart contract 를 짤 때, 가장 중요하게 여겨지는 요소
    1. 보안성
    2. 최적화

이 두 가지를 위해서 복잡하게 한 것이 아니라 오히려 간단하게 했기 때문에 배우기 쉽다. 

Solidity의 언어적인 특징
---
- 정적 타입 언어: 변수의 타입이 컴파일을 할 때 결정됨.
- 상속: 다른 컨트랙트로의/에서의 확장이 용이함.
    - ERC-20 을 그대로 상속받아서 토큰을 만들 수 있음. 
    - ERC-721 을 그대로 상속받아서 NFT를 발행할 수 있음. 
- 라이브러리: 재사용 가능한 코드들이 많음
- 복잡한 사용자 정의 타입 지원

장점
---
1. 개발 커뮤니티가 크다 
2. 오픈소스가 많다
3. 적당한 기능성과 인라인 어셈블리를 지원하여 완벽한 기능성을 제공


Smart Contract 용 다른 언어는 없을까?
---
1. Vyper
    - python 이랑 비슷
    - solidity 보다 기능이 떨어짐. (modifier, 재귀 호출, 상속, 유한 길이의 반복문, 인라인 어셈블리, 바이너리 고정 소수점, 함수/연산자 오버로딩 기능을 지원하지 않음.) → 최근에는 업데이트 되어있을 수 있음
2. Yul
    - 스마트 컨트랙트 고수들의 언어
    - 최적화와 보안에 용이한 언어 (solidity 보다 더 low level 임)
    - Yul + 는 optimistic roll up 구현을 위해 디자인된 언어
    - EVM 와 EWASM 을 둘 다 지원
```* EWASM 은 무엇이고 언제 사용할까```
3. FE
    - 이더리움 생태계에 첫 발을 들인 초보자를 위한 언어
    - Python 과 Rust 에 영감을 받은 언어
    - 개발 단계 (2021.01 알파버전 릴리즈)



Solidity 는 왜 튜링 완전성이라고 불리나?
---

- 튜링 완전성: 이더리움을 가능하게 만든 핵심 개념인 튜링 완전은 튜링 테스트를 통과한 경우에만 확보된다.
- 튜링 완전은 무한한 저장 공간을 바탕으로 현존하는 모든 문제를 풀 수 있는 기계인 튜링 머신을 만든다. 이러한 튜링 머신은 튜링 완전 언어 (turing complete language) 을 바탕으로 알고리즘이 구현된다. [3] 
- 튜링 테스트란, 기계의 인공지능에 대한 테스트라고 볼 수 있음. 예를 들어, 실험자가 컴퓨터와 대화를 하는데 인간인지 컴퓨터인지 구분할 수 없다면 이 컴퓨터는 인공지능을 갖췄다고 볼 수 있음. 
- 튜링완전언어는 프로세스를 충분히 분할 할 수 있을만큼 작은 단위를 사용할 수 있어야하며, 조건 설정과 반복 명령어가 있어야 한다. 어셈블리 언어의 경우 충분히 작은 단위로 나뉘어 있지만,  실용성이 낮다. 예를 들어, general purpose language (c, java, 등 은 분할정도나 실용성 측면에서 충분하지 못하기 때문에 느슨한 튜링 완전 (loose turing completeness) 라고 한다. [3]
- 비트코인에서는 smart contract 를 위해 script 라는 언어를 제공하는데, 이 언어는 for 문과 while 문을 의도적으로 지원하지 않는다. 따라서, 튜링 완전성이 요구하는 '아주 작은 단위로 이뤄진 명령문의 반복적인 실행' 이 불가능하기 때문에 비트코인은 튜링 완전하지 않다고 볼 수 있다.  결국, script 로 짜여진 비트코인은 복잡성이 제한될 수 밖에 없고, 무한히 반복되는 명령문이 존재할 수 없기 때문에 실행시간의 예측이 가능한 구조다. 또한, 이러한 의도적인 설계에 의해서 logic bomb (논리 폭탄)의 구현이나, 무한 루프의 구현을 방지함으로써 DOS 공격을 방어하는 효과를 갖는다. 또한 거래 과정에서 의도적으로 송금 명령문을 반복시켜 타인의 지갑에서 비트코인이 계속 빠져나가는 악용사례를 방지한다. 
- 이더리움은 script 언어의 튜링 불완전성에 '가스' 라는 개념을 도입했다. Solidity 라는 언어는 튜링 완전성을 충족하여 다양한 DAPP을 개발할 수 있는 환경을 제공함과 동시에, DoS 공격에 방어하기 위해서 gas 라는 개념을 도입했다. 이더리움은 각 연산마다 gas 를 소모하도록 설계되어있다. 따라서, 코드를 작성하면 소모되는 가스양을 예상할 수 있다. 여기서 무한한 반복문이 생기면 무한한 gas 를 소모해야하기 때문에 이를 통해 DoS 로부터 자유로워질 수 있다. 


참고자료
---
[1] https://www.redhat.com/ko/topics/virtualization/what-is-a-virtual-machine
[2] https://velog.io/@secho/2%ED%83%84%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EC%9D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%94%EC%A7%84%EC%9D%80-js%EB%A5%BC-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%B4%EC%84%9D%ED%95%98%EA%B3%A0-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%EA%B0%80
[3] http://wiki.hash.kr/index.php/%ED%8A%9C%EB%A7%81%EC%99%84%EC%A0%84 
[4] https://decenter.kr/NewsView/1VE1PVFSZQ/GZ05 

