Solidity는 이더리움 스마트 컨트랙트에 가장 많이 사용되는 프로그래밍 언어입니다. 본 논문은 Solidity 언어의 메모리 모델을 고수준으로 정형화하는 것을 제시합니다. 특히, 언어에서 상태와 메모리를 관리하는 모든 기능에 초점을 맞추고 있습니다. 또한 제공된 정형화는 효과적입니다: 대부분의 기능이 표준 SMT 이론의 양자자유 프래그먼트로 인코딩될 수 있습니다. 이를 통해 Solidity로 작성된 스마트 컨트랙트의 상태에 대한 정확하고 효율적인 추론을 가능하게 합니다. 정형화는 solc-verify 검증기에서 구현되었으며, 요구되는 의미론을 포괄하는 광범위한 테스트 세트를 제공합니다. 또한 테스트 세트에 대한 평가를 통해 의미론을 검증하고 다른 Solidity 수준의 컨트랙트 분석 도구와 비교하여 접근법의 독창성을 보여줍니다.
This paper focuses on the formalization of Solidity's memory model, which is crucial for understanding and verifying smart contracts. Smart contracts often involve complex data structures and memory management that can lead to errors if not handled correctly. The authors formalize the memory model in a way that aligns with SMT theories, allowing most features to be encoded into quantifier-free fragments. This approach enables more efficient reasoning about contract states. The formalization is implemented within solc-verify, a Solidity verification tool, and evaluated using various test cases. Comparisons with other analysis tools show the novel approach's effectiveness in handling memory-related operations.
# 배경
Ethereum
Ethereum은 블록체인 기반의 분산 컴퓨팅 플랫폼입니다. Ethereum 장부는 계정(주소로 식별) 및 계정과 연관된 데이터를 저장하는 층입니다. 모든 계정에는 이더(이더리움의 원래 암호화폐)의 잔액이 있습니다. 또한, 계정은 컨트랙트의 실행 가능한 바이너리 코드와 컨트랙트 상태와 연결될 수 있습니다.
Ethereum 컨트랙트는 이더리움 가상 머신(EVM)의 바이너리 코드 형태로 블록체인에 배포되지만, 일반적으로 고수준 프로그래밍 언어인 Solidity로 작성되고 컴파일됩니다. 배포 후, 컨트랙트는 공개 접근 가능하며 코드 수정이 불가능합니다. 외부 사용자나 다른 컨트랙트는 API를 통해 컨트랙트의 공용 함수를 호출하여 상호작용할 수 있습니다. 이를 위해 트랜잭션을 발행하고, 트랜잭션은 호출할 함수와 인자를 인코딩하며, 컨트랙트 주소를 수신자로 지정합니다. Ethereum 네트워크는 컨트랙트 코드를 해당 컨트랙트 인스턴스의 맥락에서 실행하여 트랜잭션을 처리합니다.
컨트랙트 인스턴스는 두 가지 유형의 메모리를 사용할 수 있습니다: 컨트랙트 저장소와 메모리. 컨트랙트 저장소는 컨트랙트가 지속 가능한 상태를 저장하는 전용 데이터 스토어입니다. EVM 수준에서, 이는 블록체인에 저장된 256비트 저장 슬롯의 배열입니다. 슬롯 하나 또는 고정된 수의 슬롯으로 분할될 수 있는 컨트랙트 데이터는 일반적으로 0번 슬롯부터 할당됩니다. 복잡한 데이터 유형, 예를 들어 매핑이나 동적 배열은 EVM에서 직접 지원되지 않으며, Solidity 컴파일러가 해시 테이블로 구현하여 구조화된 데이터를 결정적이며 충돌 없는 방식으로 분배합니다. 컨트랙트 메모리는 트랜잭션 실행 중에 사용되며, 트랜잭션이 종료되면 삭제됩니다. 여기에는 함수 매개변수, 반환 값 및 일시적인 데이터가 할당되고 저장될 수 있습니다.
Solidity
Solidity는 이더리움 스마트 컨트랙트 개발을 지원하는 고수준 프로그래밍 언어입니다. 이는 빠른 개발을 위한 다양한 기능을 제공하는 객체 지향 프로그래밍 언어입니다. 본 논문은 Solidity 메모리 모델의 의미론에 초점을 맞추고 있습니다: 컨트랙트 저장소와 메모리에 대한 Solidity의 관점과 이를 수정할 수 있는 연산자들. 따라서, 우리는 메모리 모델을 설명하고 정형화하는 데 관련된 광범위한 Solidity 프래그먼트를 제시합니다. [[IMG_PROTECT_1]]은 관련 특징을 보여주는 예제 컨트랙트입니다.
Solidity는 정적 타입이기 때문에, 값 타입과 참조 타입 두 가지 클래스의 타입을 제공합니다. 값 타입에는 주소, 정수 및 불리언 같은 기본 타입이 포함되며 항상 값으로 전달됩니다. 반면에, 참조 타입은 메모리 위치를 가리키며 구조체, 배열 및 매핑을 포함합니다. [[IMG_PROTECT_2]]는 Solidity의 데이터 모델과 관련 특징을 보여주는 예입니다.
컨트랙트
Solidity 컨트랙트는 객체 지향 프로그래밍에서 클래스와 유사합니다. 컨트랙트는 필요한 추가 타입을 정의할 수 있으며, 상태 변수 및 함수를 선언하고 선택적으로 단일 생성자 함수를 포함할 수 있습니다. 컨트랙트의 상태 변수는 컨트랙트 인스턴스가 블록체인에 저장하는 유일한 지속 가능한 데이터입니다. 생성자는 컨트랙트 인스턴스가 블록체인에 배포될 때 한 번만 사용됩니다. 다른 공용 함수는 외부 사용자에게 트랜잭션을 통해 호출할 수 있습니다.
타입
Solidity는 값 타입과 참조 타입 두 가지 클래스의 타입을 제공합니다. 값 타입에는 주소, 정수 및 불리언 같은 기본 타입이 포함되며 항상 값으로 전달됩니다. 반면에, 참조 타입은 메모리 위치를 가리키며 구조체, 배열 및 매핑을 포함합니다.
데이터 모델
Solidity의 데이터 모델은 다양한 타입과 그들의 관계를 정의하고, 이를 통해 복잡한 데이터 구조와 메모리 관리를 수행할 수 있습니다. 예를 들어, [[IMG_PROTECT_3]]는 Solidity에서 사용되는 구조체와 배열을 보여주며, 이러한 타입은 서로 결합되어 더욱 복잡한 데이터 모델을 구성합니다.
방법론
본 논문에서는 Solidity의 메모리 모델을 정형화하는 데 초점을 맞추고 있습니다. 이를 위해, 우리는 Solidity 프래그먼트를 SMT 기반 언어로 번역하여 명확하고 간결한 의미론을 제공합니다.
SMT 기반 언어는 표준 SMT 타입과 데이터를 사용하며, 표현력이 높은 구조체와 함께 배열 및 재귀적 데이터 유형을 포함할 수 있습니다. 이를 통해 Solidity의 복잡한 메모리 모델을 정확하게 추론하고 검증할 수 있는 툴을 개발합니다.
실험
본 논문에서 제시된 정형화는 solc-verify와 같은 Solidity 검증 도구의 기반으로 사용됩니다. 우리는 다양한 테스트 케이스를 통해 이 방법론을 평가하고, 이를 다른 분석 도구들과 비교하여 성능을 확인합니다.
테스트 세트는 메모리 모델의 다양한 특징과 모서리 사례를 포괄하도록 수작업으로 개발되었습니다. 각 테스트는 특정 기능을 검증하며, 정확한 검증 결과를 제공해야 합니다. 이는 EVM에서 실행하여 단언 실패 없이 동작하는지 확인됩니다.
테스트는 다음과 같은 클래스로 구성되어 있습니다:
- assignment: 할당문의 적절한 모델링을 체크합니다.
- delete: 삭제 연산자의 적절한 모델링을 체크합니다.
- init: 변수 및 데이터 초기화의 적절한 모델링을 체크합니다.
- storage: 다양한 참조 타입에 대한 저장소의 적절한 모델링을 체크합니다.
- storageptr: 저장소 포인터의 적절한 모델링을 체크합니다.
이러한 테스트를 통해, 본 논문에서 제시된 정형화가 기존 도구들보다 더 나은 성능을 보여주는 것을 확인할 수 있습니다. 이를 통해 Solidity 스마트 컨트랙트의 메모리 관리를 더욱 안전하게 수행할 수 있는 새로운 접근법이 제공됩니다.
이 글은 ArXiv의 공개 자료를 바탕으로 AI가 자동 번역 및 요약한 내용입니다.
저작권은 원저자에게 있으며, 인류 지식 발전에 기여한 연구자분들께 감사드립니다.