챕터8:스마트 컨트랙트와 바이퍼
바이퍼(vyper)는 이더리움 가상 머신을 위한 실험적인 컨트랙트용 프로그래밍 언어인데, 개발자들이 이해하기 쉬운 코드를 작성할 수 있도록 함으로써 뛰어난 감사 용이성(auditability)을 제공하고자 만들어졌다. 사실, 바이퍼의 주요 원칙 중 하나는 개발자들이 오독하기 쉬운 코드(misleading code)를 작성할 수 없게 하자는 것이다.
취약점과 바이퍼
이 책에서는 최근이라고 나와 있지만, 이젠 예전이 되어버린 한 연구에서
https://arxiv.org/pdf/1802.06038.pdf
배포된 약 백만개의 이더리움 스마트 컨트랙트를 분석한 결과 심각한 취약점을 가진 스마트 컨트랙트가 아주 많다는 사실을 확인했다고 한다.
취약점의 유형은 다음과 같다.
자기파괴 컨트랙트(suicidal contract) : 아무 주소를 이용해서 삭제시킬 수 있는 스마트 컨트랙트
탐역 컨트랙트(greedy contract) : 이더를 빼올 수 없도록 막아버리는 상태에 도달할 수 있는 컨트랙트
방탕한 컨트랙트(prodigal contract) : 이더를 아무런 주소로 보낼 수 있게 만든 스마트 컨트랙트
이런 취약점들은 의도했건 아니건 심각한 자금 손실을 초래할 수 있어서 바람직하지 않다.
바이퍼는 이러한 코드를 작성하기 어렵게 해서, 안전한 코드를 작성할 수 있게 해준다.
솔리디티와 비교
바이퍼가 안전하지 않은 코드 작성을 방지하는 방법 중 하나는 의도적으로 솔리디티의 기능 중 일부를 생략(omitting)하는 것이다. 바이퍼로 스마트 컨트랙트를 개발하고자 한다면, 바이퍼에서 어떤 기능들이 왜 생략되었는지를 이해하는 것이 중요하다.
변경자
변경자는 보통 권한에 대한 부분을 다루지만, 다양하게 쓰일 수 있다.
특정 변경자가 다른 코드를 건드린다면, 코드를 추적해서 확인해야한다.
개발자가 실수로 이 계층을 제대로 추적하지 못할 경우에 사고가 날 수 있다.
따라서 바이퍼는 변경자를 모두 없애버렸다.
바이퍼의 권장사항은 다음과 같다.
변경자를 검증자를 위해 사용하려 했다면?
: 간단한 인라인(inline) 체크를 사용해서 함수의 일부분으로 포함해 검증
변경자를 스마트 컨트랙트의 상태를 변경시키기 위해 사용하려 했다면?
: 이러한 변화를 명시적으로 함수의 일부분으로 만들 것.
이렇게 하면 감사 용의성(auditability)와 가독성이 향상되는데, 왜냐하면 코드를 읽는 사람이 어떻게 작동하는지 보려고 머릿속으로(또는 수동으로) 변경자 코드를 함수 주변에 '감싸(wrap)' 볼 필요가 없어지기 때문이다.
클래스 상속
바이퍼는 다중 상속이 코드를 이해하기 어렵도록 너무 복잡하게 만든다고 생각해 이를 지원하지 않는다.
다중 상속이 어떻게 문제가 되는지를 보여주는 솔리디티 설명서에서는 이 견해를 암묵적으로 인정하고 있다.
(책에는 아래의 페이지가 나와있는데 지금은 닫힌 것 같다)
https://github.com/ethereum/solidity/blob/release/docs/contracts.rst#inheritance
인라인 어셈블리
인라인 어셈블리는 개발자에게 이더리움 가상 머신(EVM)에 대한 낮은 수준의 접근을 제공하므로 솔리디티 프로그램이 EVM 명령어에 직접 접근하여 작업을 수행할 수 있다.
...
바이퍼는 가독성 손실이 아주 큰 문제라고 생각하므로 인라인 어셈블리를 지원하지 않는다.
함수 오버로딩
함수 오버로딩은 다른 인자를 사용하는 여러 함수를 같은 이름으로 작성하는 것인데, 바이퍼는 이를 지원하지 않는다.
변수 형변환
형변환의 경우 바이퍼는 데이터 손실이 없는 변환 함수를 제공한다.
전제 조건과 사후 조건
전제 조건, 사후 조건, 상태 변경을 명시적으로 처리한다.
이는 중복코드가 생성되지만, 가독성과 안전성을 보장한다.
이에 따라 개발자는 세가지를 고려해야 하는데
조건
:이더리움 상태 변수의 현재 상태
효과
:코드 실행 결과 상태 변수에 영향이 있는가?
상호작용
:코드 실행
각각의 사항은 신중하게 고려 후 코드에 철저히 문서화해야 한다.
그래야 코드가 더 읽기 쉬워지고 감사도 더 쉬워진다.
장식자
장식자는 @private, @public, @constant, @payable이 있으며,
바이퍼는 장식자의 로직을 명시적으로 구현한다.
함수와 변수 순서
컴파일
컴파일러 수준에서 오버플로 오류 방지
데이터 읽기 및 쓰기
결론
바이퍼는 강력하고 흥미로운 새로운 컨트랙트용 프로그래밍 언어다. 바이퍼는 유연성보다는 정확성에 중점을 두고 있다. 이로 인해 프로그래머는 더 나은 스마트 컨트랙트를 작성하고 심각한 취약점을 야기하는 여러 유형의 함정을 피할 수 있다.
'블록체인 > 책' 카테고리의 다른 글
스마트 컨트랙트 보안 | 마스터링 이더리움 (0) | 2021.11.02 |
---|---|
스마트 컨트랙트와 솔리디티 | 마스터링 이더리움 (0) | 2021.08.29 |
트랜잭션 | 마스터링 이더리움 (0) | 2021.08.13 |
지갑 | 마스터링 이더리움 (0) | 2021.07.25 |
암호학 | 마스터링 이더리움 (0) | 2021.05.10 |