[마스터링 이더리움] chapter 8. 스마트 컨트랙트와 바이퍼

이희제·2021년 1월 15일
4

Mastering Ethereum

목록 보기
5/6
post-thumbnail

안녕하세요 스크립토 6기 이희제입니다.

이번 시간에는 바이퍼라는 컨트랙트용 프로그래밍 언어에 대해서 알아보겠습니다.

솔리디티와 비교하면서 진행하도록 하겠습니다.


취약점과 바이퍼

✅ 이더리움 스마트 컨트랙트는 취약점을 가지고 있는데 3가지 유형으로 나눌 수 있습니다.

1. 자기 파괴 컨트랙트

  • 아무 주소를 이용해서 삭제시킬 수 있는 스마트 컨트랙트

2. 탐욕 컨트랙트

  • 이더를 빼올 수 없도록 막아버리는 상태에 도달할 수 있는 컨트랙트

3. 방탕한 컨트랙트

  • 이더를 아무런 주소로 보낼 수 있게 만든 스마트 컨트랙트

💡 바이퍼는 안전한 코드를 작성하기 쉽게 해줍니다. 즉, 오독을 하기 쉽거나 취약점이 있는 코들르 작성하기 어렵게 합니다.


솔리디티와 비교

✅ 바이퍼가 안전하지 않은 코드 작성을 방지하는 방법 중 하나는 의도적으로 솔리디티의 기능 중 일부를 생략하는 것입니다.

지금부터 어떤 기능들이 생략되었는지 살펴보겠습니다.

1. 변경자

  • 함수 a()를 호출하게 되면 변경자인 stageTimeConfirmation 변경자가 적용이 된다.
  • 이 변경자 내부에는 nextStage() 라는 다른 함수를 호출해 SafeStage에서 DangerStagestage 변수가 변경되었다.

바이퍼는 변경자를 모두 없애버렸습니다. 바이퍼의 권장사항은 만일 변경자를 검증만을 위해 사용했던 것이라면, 대신에 간단히 인라인(inline) 체크를 사용해서 함수의 일부부으로 포함해 검증하는 것입니다.


2. 클래스 상속

솔리디티는 객체 지향 프로그래밍의 핵심 기능인 다중 상속과 다형성(polymorphism)을 지원하지만, 바이퍼는 이를 지원하지 않습니다.
바이퍼는 다중 상속이 코드를 이해하기 어렵도록 너무 복잡하게 만든다는 견해를 가지고 있습니다.


3. 인라인 어셈블리

인라인 어셈블리를 통해 솔리디티 프로그램이 EVM 명령어에 직접 접근하여 작업을 수행할 수 있습니다.

메모리 위치 0x80에 3을 더하는 예시 : 3 0x80 mload add 0x80 mstore

바이퍼는 가독성 손실이 아주 큰 문제라고 생각하므로 인라인 어셈블리를 지원하지 않습니다.


4. 함수 오버로딩

함수 오버로딩을 통해 개발자는 여러 함수를 같은 이름으로 작성할 수 있습니다.

어떤 함수가 사용될지는 제공되는 인수의 유형에 따라 다릅니다.

바이퍼는 함수 오버로딩을 지원하지 않습니다.


5. 변수 형변환

  • 형변환에는 암시적 형변환과 명시적 형변환의 두 가지 종류가 있습니다.
  • 암시적 형변환은 종종 컴파일 타임에 수행됩니다.
  • 바이퍼는 암시적 형변환을 허용하지 않습니다.

솔리디티에서는 명시적으로 형변환을 할 수 있습니다.

➡️ 상위 비트가 제거된 것을 확인할 수 있습니다.

바이퍼에는 명시적 형변환을 수행하는 convert 함수가 있습니다.


6. 전제 조건과 사후 조건

바이퍼는 전제 조건, 사후 조건, 상태 변경을 명시적으로 처리합니다.

바이퍼를 가지고 스마트 컨트랙트를 작성할 때 개발자는 다음의 세 가지 사항을 검토해야 합니다.

  • 조건(condition)

이더리움 상태 변수의 현재 상태/조건은 무엇인가?

  • 효과(effect)
    • 이 스마트 컨트랙트 코드가 실행 시 상태 변수의 조건에 어떤 영향을 미칠 것인가?
    • 어떤 영향을 받고, 어떤 영향을 받지 않을 것인가?
    • 이런 효과들이 스마트 컨트랙트의 의도와 일치하는가?
  • 상호작용(interaction)

배포하기 전 코드를 논리적으로 단계별로 실행하고 다른 컨트랙트와의 상호작용을 포함하여 코드를 실행할 때 발생할 수 있는 모든 영구적인 결과, 그에 따른 효과, 시나리오를 고려.


장식자

✅ 바이퍼에서는 다음과 같은 장식자를 함수의 시작 부분에서 사용할 수 있습니다.

@private

  • 컨트랙트 외부에서 함수에 접근할 수 없게 합니다.

@public

  • 함수를 공개적으로 볼 수 있고 실행할 수 있게 합니다.

@constant

  • 상태 변수를 변경할 수 없게 합니다.

@payable

  • 값(value)을 전솔할 수 있게 합니다.

함수와 변수 순서

✅ 모든 함수, 변수 등을 포함하여 모든 바이퍼 스마트 컨트랙트 코드는 한곳에 존재합니다.

먼저 선언이 돼 있어야 호출을 할 수 있습니다.


마무리

지금까지 바이퍼에 대해서 간략히 알아보았습니다.

감사합니다.

profile
오늘만 열심히 살고 모든 걸 남기되 후회는 남기지 말자

0개의 댓글