Web3.0 기본 언어: Move는 Solidity의 어떤 부족함을 보완했는가?
저자: 송가길, 임학의, 국성증권 연구소
왜 Solidity 언어 기반의 이더리움 생태계가 이렇게 방대하며, 시장은 여전히 새로운 공공 블록체인에 대한 기대를 가지고 있는가? Move는 대기업(Meta)에서 출발하여 업계에서 일반적으로 긍정적으로 평가받고 있으며, 초기 몇몇 Move 언어 기반으로 개발된 공공 블록체인이 시장의 주목과 자본의 지지를 받았다. Web3를 위한 더 풍부한 응용을 위해, 기본 언어의 진화는 기초가 되며, Move는 어떤 장점을 가지고 있으며, Solidity의 어떤 부족함을 보완하는가? 이러한 특징을 바탕으로 Move 생태계는 새로운 모델과 새로운 응용을 탄생시킬 가능성이 있다.
기존의 프로그래밍 언어인 Solidity에 비해 Move 언어는 많은 세부 디자인에서 배려가 돋보이며, 예를 들어 라이브러리와 응용 로직을 분리하는 방식이다; 그러나 가장 두드러진 특징은 자원 타입, 즉 자원 지향 프로그래밍이다. Dapp 응용 지원 측면에서 비트코인 스크립트와 이더리움의 스마트 계약의 장점을 흡수하여, 업계는 이 프로그래밍 언어에 대해 긍정적인 시각을 가지고 있다. Solidity가 외부에서 비판받는 보안 문제에 대해서도 Move는 해결을 시도하고 있다.
Move는 자원(resources) 지향 프로그래밍 언어로, Move의 세계에서 자원은 "1급 시민" (first-class resource)이며, 그 핵심 특성은 사용자 정의 자원 타입이다: 자원은 절대 복사되거나 암묵적으로 폐기될 수 없으며, 프로그램 저장 위치 간에만 이동할 수 있다. Solidity는 자원 지향적이지 않으며, 사용자의 계좌는 특정 토큰 자산을 소유하지만, 이는 단지 해당 토큰 계약이 사용자에게 할당한 수치일 뿐이다.
Move가 생성한 토큰 계좌 자산은 독특한 자원 타입으로, 예를 들어 계좌 A의 자산은 A 계좌에 저장되며, 비록 수치이긴 하지만 복사, 폐기 또는 재사용이 불가능하고, 안전하게 저장 및 전송될 수 있다. 동시에, 계좌 자산은 해당 자원을 정의한 모듈에 의해서만 생성 및 소멸될 수 있어, 동질적인 수치 타입 자산에서 발생할 수 있는 재진입, 이중 지불 또는 계좌 잔액 불균형 문제를 피할 수 있다. 이 점에서 Move 계좌 자산은 비트코인의 UTXO 메커니즘과 유사하며, 토큰은 더 이상 단순한 동질적 수치가 아니라 구별 가능한 것이다.
더 유연한 비즈니스를 실현하기 위해, Move는 추가로 4가지 권한 속성을 정의했다: 복사 가능(copy), 폐기 가능(drop), 저장 가능(store), 검색 가능(key). 이 4가지 속성은 임의로 조합되어 자원의 속성을 정의할 수 있어, 사용자가 유연하게 조작할 수 있다. 예를 들어 drop+store+key의 조합으로 정의된 자원은 복사할 수 없으며, 복사로 인한 토큰 증발 및 이중 지불 문제를 피할 수 있다. 이는 NFT 및 비트코인의 UTXO 메커니즘과 유사하다.
모듈화 및 계약 조합성 측면에서, Move는 모듈과 스크립트 디자인을 사용하여 자원을 전달함으로써 계약 상호작용을 실현한다. Solidity(예: 이더리움)에서의 계약은 라이브러리를 통해 메시지를 전달하여 계약 간 호출 및 상호작용을 실현한다. 반면 Move 언어는 모듈(module)과 스크립트(script) 디자인을 사용하며, 전자는 계약과 유사하고 Move 언어의 계약 조합성은 모듈 간의 조합을 통해 자원을 전달하는 방식이다. 조합성 측면에서 Solidity와 Move의 차이는 매우 뚜렷하다.
거래 실행 측면에서, Move의 병렬 처리 기능은 Solidity에 비해 블록체인 성능을 크게 향상시킨다. 병렬 실행(PE)은 독립적인 거래를 인식하고 동시에 실행하여 블록체인의 확장성을 크게 향상시킨다. Solidity는 병렬 처리를 지원하지 않으며, 이더리움의 거래는 순차적으로 실행되고 다른 거래는 일시 중지(정렬) 상태에 놓인다. 따라서 mempool(메모리 풀)과 MEV 시장이 발생한다. Move 기반의 공공 블록체인 Aptos는 Block-STM(소프트웨어 트랜잭셔널 메모리) 엔진을 활용하여 병렬 처리를 구현하고 성능을 눈에 띄게 향상시킨다.
1: 핵심 관점
Move는 대기업(Meta)에서 출발하여 업계에서 일반적으로 긍정적으로 평가받고 있으며, 이 과정에서 Move 언어 기반으로 개발된 몇몇 공공 블록체인이 시장의 주목과 자본의 지지를 받았다. 왜 Solidity 언어 기반의 이더리움 생태계가 이렇게 방대하며, 시장은 여전히 새로운 공공 블록체인에 대한 기대를 가지고 있는가? Move가 가진 장점은 Solidity의 어떤 부족함을 보완하는가? 이러한 특징을 바탕으로 Move 생태계는 새로운 모델과 새로운 응용을 탄생시킬 가능성이 있다.
본 문서는 Solidity와 EVM의 부족함을 비교하고, Move의 장점과 특징을 분석한다.
2: 왜 Move를 발명했는가: Solidity(이더리움)의 어떤 문제를 보완하는가?
Move는 Meta(구 Facebook)에서 Diem 프로젝트(최초의 글로벌 스테이블코인 프로젝트 Libra)를 위해 개발한 안전하고 신뢰할 수 있는 스마트 계약 언어로, Aptos, Sui 등의 새로운 공공 블록체인이 바로 Move 프로그래밍 언어를 사용하고 있다. 이들 공공 블록체인은 Move의 장점과 병렬 처리 특성을 주목하여 단일 체인의 한계를 확장하고자 한다. Move는 Rust 기반의 프로그래밍 언어이지만, Move는 스마트 계약을 위해 특별히 개발 및 최적화되어 자원을 조작하는 데 주로 사용되므로, 입문 장벽은 Rust보다 낮다.
스마트 계약을 주로 다루기 때문에 Rust의 불필요한 작업을 많이 제거하여 더욱 간결해졌다. Solidity와 EVM에서 발생하는 몇 가지 부족함을 보완하기 위해 Move는 몇 가지 최적화를 진행하여 Move 기반의 Dapp 응용이 더 많은 유연한 플레이를 제공할 수 있도록 했다.
기존의 프로그래밍 언어인 Solidity에 비해 Move 언어는 많은 세부 디자인에서 배려가 돋보이며, 예를 들어 라이브러리와 응용 로직을 분리하는 방식이다; 그러나 가장 두드러진 특징은 자원 타입, 즉 자원 지향 프로그래밍이다. Dapp 응용 지원 측면에서 비트코인 스크립트와 이더리움의 스마트 계약의 장점을 흡수하여, 업계는 이 프로그래밍 언어에 대해 긍정적인 시각을 가지고 있다. Solidity가 외부에서 비판받는 보안 문제에 대해서도 Move는 해결을 시도하고 있다.
2.1. 1급 자원과 디지털 자산 (first-class resource)
Move의 출현 배경에 맞춰, Move는 자원(resources) 지향 프로그래밍 언어로, Move의 세계에서 자원은 "1급 시민" (first-class resource)이며, 그 핵심 특성은 사용자 정의 자원 타입이다: 자원은 절대 복사되거나 암묵적으로 폐기될 수 없으며, 프로그램 저장 위치 간에만 이동할 수 있다. 자원은 전통적인 타입처럼 데이터 구조에 저장될 수 있으며, 매개변수로 전달될 수 있다.
간단히 말해, 이는 전통 프로그래밍 언어에서 임의로 파괴할 수 없는 새로운 데이터 타입이다. Solidity가 정의한 자산과 비교할 때, 예를 들어 이더리움의 특정 토큰 계좌는 자산이 단지 수치일 뿐이며, 두 계좌 간의 송금 후 계좌 자산 수치가 변경되지만, 서로 다른 계좌 자산의 차이는 수치 잔액에 불과하며 본질적인 차이는 없다(즉, 자산은 동질적이다).
또한 주의해야 할 점은, 예를 들어 이더리움의 ERC20 토큰 TokenA는 독립적인 계약 계좌로, 이 계약은 사용자(계좌 주소)에게 수치를 할당하여 사용자가 소유한 Token A의 수량을 나타낸다. 이 점에서 볼 때, Solidity는 자원 지향적이지 않으며, 사용자의 계좌는 특정 토큰 자산을 소유하지만, 이는 단지 해당 토큰 계약이 사용자에게 할당한 수치일 뿐이다.
반면 Move가 생성한 토큰 계좌 자산은 독특한 자원 타입으로, 예를 들어 계좌 A의 자산은 A 계좌에 저장되며, 비록 수치이긴 하지만 복사, 폐기 또는 재사용이 불가능하고, 안전하게 저장 및 전송될 수 있다. 다소 부정확한 비유를 하자면, A 계좌의 자산은 다른 계좌 자산과 어떤 의미에서 완전히 동질적이지 않다고 볼 수 있다.
또한, 계좌 자산은 해당 자원을 정의한 모듈에 의해서만 생성 및 소멸될 수 있어, 동질적인 수치 타입 자산에서 발생할 수 있는 재진입, 이중 지불 또는 계좌 잔액 불균형 문제를 피할 수 있다. 이 점에서 Move 계좌 자산은 비트코인의 UTXO 메커니즘과 유사하며, 토큰은 더 이상 단순한 동질적 수치가 아니라 구별 가능한 것이다.
더 유연한 비즈니스를 실현하기 위해, Move는 추가로 4가지 권한 속성을 정의했다: 복사 가능(copy), 폐기 가능(drop), 저장 가능(store), 검색 가능(key). 이 4가지 속성은 임의로 조합되어 자원의 속성을 정의할 수 있어, 사용자가 유연하게 조작할 수 있다. 예를 들어 drop+store+key의 조합으로 정의된 자원은 복사할 수 없으며, 복사로 인한 토큰 증발 및 이중 지불 문제를 피할 수 있다. 이는 NFT 및 비트코인의 UTXO 메커니즘과 유사하다.
이렇게 이해할 수 있다: 이더리움(Solidity)의 자산은 해당 계약에 의해 제어되며, Token A 계약을 금고에 비유하면, 금고는 모든 사용자에게 수치 잔액을 할당하여 사용자가 소유한 Token A 자산의 수량을 표현하지만, 자산 자체는 여전히 Token A 계약의 금고에 보관된다. 반면 Move 사용자의 계좌는 독립적인 큰 금고로, 사용자가 직접 제어하며, 모든 토큰 자산이 이 금고에 저장된다. 그리고 이 토큰은 숫자 형태로 존재하는 것이 아니라, 복사할 수 없고 사용자에 의해 제어되는 자원(타입)이다.
Move 언어에서 자원 정의와 권한은 분리되어 있으며, 자원의 권한은 사용자에게 속한다. Solidity에서는 계좌 자원 권한이 계약에 귀속되며, 예를 들어 이더리움의 특정 ERC20 토큰은 해당 계약에 속한다. 사용자가 DEX에서 Token A(권한은 Token A 계약에 속함)를 Token B(권한은 Token B 계약에 속함)으로 교환할 때, Uniswap 계약에서 자신의 A 자산을 B 자산으로 직접 인출할 수 없다.------왜냐하면 Uniswap의 자산 권한은 해당 계약에 속하기 때문이다.
실제 프로세스는 최소한 세 단계의 거래 작업이 필요하다: i) 먼저 Uniswap 계약에 대한 권한을 부여(approve)하여 Uniswap 계약이 사용자 대신 A 계약의 자산을 인출할 수 있도록 한다; ii) Uniswap 계약에 들어가 교환을 진행하고, A를 인출한 후 B를 계좌에 저장한다; iii) 권한을 취소(revoke)한다. 그러나 사용자는 일반적으로 교환을 완료한 후 즉시 권한을 취소하지 않으며(후속 교환을 위해 가스 비용을 절약하기 위해), 한 번 Uniswap 계약이 공격받거나 취약점이 발생하면, 사용자의 A 토큰 계좌에 위험이 발생할 수 있다. 주의할 점은, 권한 부여/취소는 모두 이더리움에서 계약 작업을 실행해야 하며, 이로 인해 가스 비용이 발생한다.
여기서 우리는 Token A, Token B, Uniswap의 LP 자산 권한이 각자의 계약에 속해 있으며, 사용자가 하나의 계좌를 통해 세 개의 계약 간에 자유롭게 전환할 수 없음을 명확히 볼 수 있다. 반면 Move의 자산 대계좌는 계약 간 권한을 필요로 하지 않으며, 권한은 사용자에게 속한다. 사용자는 DEX에서 A를 인출하고 B로 교환하여 계좌에 저장할 수 있으며, 이 과정은 하나의 거래 작업으로 완료될 수 있어, 권한 부여/취소 작업이 필요 없으며, 어느 정도 보안성을 높인다.
2.2. Move 언어의 모듈화 및 유연한 조합성
이전의 심층 보고서 《Web3.0 시대: 개방, 프라이버시, 공동 구축》에서 우리는 Web3.0과 Web2.0의 큰 차이점이 개방성과 조합성에 있다고 제안했다. 그렇다면 이러한 개방 호출은 기본적으로 어떻게 실현되는가? Move 언어는 어떤 편의를 제공할 것인가?
모듈화 및 계약 조합성 측면에서, Solidity(예: 이더리움)에서의 계약은 라이브러리를 통해 메시지를 전달하여 계약 간 호출 및 상호작용을 실현한다. 반면 Move 언어는 모듈(module)과 스크립트(script) 디자인을 사용하며, 전자는 계약과 유사하고 Move 언어의 계약 조합성은 모듈 간의 조합을 통해 자원을 전달하는 방식이다. 조합성 측면에서 Solidity와 Move의 차이는 매우 뚜렷하다.
토큰 계약 배포를 예로 들면, Solidity의 토큰은 서비스로 존재하며 잔액을 조회할 수 있지만, Move의 토큰은 자원으로, 앞서 언급한 "절대 복사되거나 암묵적으로 폐기될 수 없으며, 프로그램 저장 위치 간에만 이동할 수 있다"는 특성을 가진다. 이 두 가지 간의 차이를 비유하자면, Solidity 기반의 계약 간 호출은 메시지 서비스를 통해 이루어지며, Solidity의 계약 상호작용은 두 원시 부족 간의 무역 교류와 같다. 두 부족 간의 왕래를 편리하게 하기 위해서는 생산 도구와 제작 방법 등의 표준 정보를 통일해야 한다.------즉 두 계약 간의 상태 동기화를 통해 상호작용을 실현하는 것이다.
A 부족이 석기 도끼를 발명하였고, 이 석기 도끼의 재료 표준과 제작 방법 등의 정보를 B 부족에 전달하여 B 부족이 스스로 생산하게 된다(이는 Token A와 Token B가 각각의 계약에 의해 제어되는 것과 유사하다). 여기서 안전을 위해 계약은 격리 상태를 유지해야 하며, 메시지 서비스만 전달할 수 있지만, 메시지 서비스는 명백히 복사되거나 폐기될 수 있다(석각 정보를 지우는 것과 같다).
계약이 업그레이드되는 경우, 예를 들어 이더리움 NFT 인터페이스 표준 ERC 721, ERC 721A 및 ERC4907 등의 일련의 최적화 업그레이드가 이루어지면, 이는 A 부족이 철기를 발명한 것과 같아, 서로 부족 간에 생산 구성을 업데이트해야 한다는 메시지를 전달해야 한다. 하나의 계약 업그레이드는 해당 계약을 호출한 다른 계약이 상태 동기화를 수행해야 하며, 업그레이드를 따라가야 한다. 이 작업 흐름은 복잡성을 증가시키며, 이더리움 계약의 업그레이드 반복도 마찬가지로 복잡하며, EVM의 바이트 코드 팽창을 초래할 수 있다.
Move의 세계에서 계약 상호작용은 더 유연한 조합성을 갖는다. 여전히 위의 비유를 사용하자면, Move의 모듈(module) 간 상호작용(즉 부족 간의 거래)은 자원을 전달하여 실현되며, 이러한 최적화는 기술 업그레이드에 해당한다. A 부족은 B 부족에 생산 도구의 구성 정보를 전달하는 것이 아니라, 필요에 따라 생산 도구(석기 도끼든 업그레이드된 철기 도구든)를 적절한 모델의 표준 운송 차량에 포장하여 전달한다. 상대방은 생산 구성을 업그레이드할 필요 없이 매번 차량을 수령하기만 하면 된다.
다시 말해, Move의 모듈 간 상호작용은 메시지를 전달하는 것이 아니라, 차량(이는 자원으로, 절대 복사되거나 암묵적으로 폐기될 수 없으며, 프로그램 저장 위치 간에만 이동할 수 있는 자원)을 전달하는 것이다. 이 방식은 더 유연한 조합성을 제공하며, 수령자는 차량을 저장하거나 다른 쪽(다른 계약)으로 전송할 수 있으며, 심지어 차량의 화물을 내린 후 여러 차량에 분산할 수도 있다. 즉, 하나의 Move 모듈이 업그레이드되면, 해당 모듈을 사용한 다른 계약은 자동으로 최신 상태로 업그레이드된다.
2.3. Web3 보안성 개선
Move 언어가 가져오는 보안 개선은 여러 측면에서 이루어진다.
Move 언어의 자원은 네 가지 속성을 가진다: 복사 가능, 인덱스 가능, 폐기 가능, 저장 가능. 이 네 가지 속성의 조합을 통해 사용자는 편리하게 어떤 유형의 자원이든 정의할 수 있다. Solidity의 자산은 토큰 계약이 사용자 계좌에 부여한 수치 잔액으로, Move는 자산의 보안성을 확실히 증가시킨다.
Solidity의 자산은 해당 토큰 계약이 사용자에게 부여한 수치이다. 반면 Move는 자원이 소유자의 계좌가 제어하는 모듈에 저장되며, 자원의 소유자는 최고의 결정권을 가진다. 오직 소유자만이 자원(Resource)의 저장 및 이동을 결정할 수 있다. 작업 권한의 분리는 다양한 상황에서 서로 다른 권한을 정의할 수 있게 하며, 이는 보안의 한 측면이다.
Move 자원의 설계는 디지털 자산의 이동이 계좌 간 잔액 수치의 단순한 더하기와 빼기가 아니라, 저장 위치 간의 이동(복사 불가, 폐기 불가)으로 이루어져 재진입 및 이중 지불 공격을 피할 수 있다. 재진입은 해커가 코드 취약점을 이용해 악성 계약을 생성하고, 사용자가 송금하는 동시에 다시 송금 함수를 호출(재진입)하여 계좌 잔액을 변경하지 않고 자금을 계속 인출하는 것이다. Solidity 언어의 토큰 계약 할당 방식은 재진입 공격과 이중 지불의 위험이 크다.
또한 Move의 모듈 작업 방식은 시스템 위험을 대폭 줄인다.------앞서 언급한 바와 같이, Solidity 계약 업그레이드는 다른 계약이 적절히 업그레이드해야 하며, 그렇지 않으면 보안 위험이 발생할 수 있지만, Move의 계약 업그레이드는 매우 간단하며, 해당 계약 자체만 업그레이드하면 되므로 다른 계약이 업데이트할 필요가 없다. 이는 일정 부분 계약 업그레이드의 지연으로 인한 보안 위험을 회피할 수 있다.
2.4. Move의 병렬 처리가 더 높은 확장성을 가져온다
거래 실행 측면에서, Move의 병렬 처리 기능은 Solidity에 비해 블록체인 확장성을 크게 향상시킨다. 병렬 실행(PE)은 독립적인 거래를 인식하고 동시에 실행하여 블록체인의 확장성을 크게 향상시킨다. Solidity는 병렬 처리를 지원하지 않으며, 이더리움의 거래는 순차적으로 실행되고 다른 거래는 일시 중지(정렬) 상태에 놓인다. 따라서 mempool(메모리 풀)과 MEV 시장이 발생한다. 두 개의 관련 없는 거래가 병렬 처리될 수 있다면, 효율적이고 확장 가능하다.
Move 기반의 공공 블록체인 Aptos는 Block-STM(소프트웨어 트랜잭셔널 메모리) 엔진을 활용하여 병렬 처리를 구현하고 성능을 눈에 띄게 향상시킨다. 그 작업 원리는 이더리움 2층 네트워크의 Optimistic Rollup(낙관적 집계)과 유사하며, 거래는 블록 내에서 미리 정렬되고, 거래 간 의존 관계가 없다고 가정하여 낙관적으로 병렬 거래를 실행한다.
실행 후 모든 거래 결과를 검증하며, 만약 하나의 거래가 이전 거래가 수정한 메모리 위치에 접근한 경우, 해당 거래는 무효가 된다.------왜냐하면 두 거래가 명백히 관련이 있기 때문이다. 거래 결과를 새로 고치고, 거래를 다시 실행한다. 이 과정을 반복하여 블록 내의 모든 거래가 실행될 때까지 진행한다. Block-STM의 특징은 비교적 복잡한 트랜잭션을 지원하며, 다양한 응용 부하 조건에 적합하다.
아래 그림은 Block-STM과 블록을 거래 순서대로 실행한 것을 비교한 것이다. 각 블록은 만 건의 거래를 포함하며, 계좌 수는 블록 처리 거래의 경쟁 복잡성을 결정한다. 낮은 경쟁과 높은 경쟁 상황에서 Block-STM은 순차 실행 방식보다 8-16배의 속도를 구현했다. 거래 작업이 순차적일 경우 Block-STM의 소모도 더 적다. 따라서 Move가 가져오는 병렬 성능은 매우 두드러진다.
따라서 L2(2층 네트워크) 이전에 주 체인의 병렬 처리 능력도 공공 블록체인 확장에 적극 고려되는 방안이다. 이는 Move 생태계에 더 많은 가능성을 가져온다. 위험 경고 블록체인 비즈니스 모델의 실현이 기대에 미치지 못할 위험: 블록체인, 암호학 등 관련 기술과 프로젝트는 발전 초기 단계에 있으며, 비즈니스 모델의 실현이 기대에 미치지 못할 위험이 있다.
규제 정책의 불확실성: 블록체인 프로젝트의 실제 운영 과정에서 여러 금융, 네트워크 및 기타 규제 정책이 관련되며, 현재 각국의 규제 정책은 연구 및 탐색 단계에 있으며, 성숙한 규제 모델이 없으므로 업계는 규제 정책의 불확실성 위험에 직면해 있다.