2022/01/04 디사이퍼 CosmWasm 특별세션 2부: CosmWasm의 강점 및 로드맵

Shin Woochul
Decipher Media |디사이퍼 미디어
16 min readJan 12, 2022

Confio팀 헤드 Ethan Frey의 CosmWasm 특별 세션

시작하며

지난 1월 4일 블록체인 학회 디사이퍼에서 CosmWasm 특별 세션을 진행하였습니다. Confio 팀의 류미상님께서 대면으로 CosmWasm 개요를 설명해주셨고, CosmWasm의 창설자이자 Confio 팀의 헤드인 Ethan Frey가 화상 회의로 CosmWasm의 강점과 로드맵을 설명해주셨습니다. 이 글에서는 이번 세션에서 소개되었던 내용을 정리해서 전달해드리고자 합니다.

[2022/01/04 디사이퍼 CosmWasm 특별세션]

  1. 1부: CosmWasm 개요
  2. 2부: CosmWasm의 강점 및 로드맵

Author

Shin Woochul of Decipher Junior Researcher.
Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

왜 CosmWasm을 사용해야 하는가?

CosmWasm과 EVM이 다른 선택지에 비해 갖는 장점 (출처: Ethan Frey 발표자료)

비트코인, 이더리움, 솔라나 등 많은 레이어-1 프로토콜이 있지만 대다수의 개발자들은 독자적인 블록체인을 출시하고 싶어하지 않습니다. 독자적인 블록체인을 출시하는 것보다 다른 레이어-1 프로토콜 위에서 스마트 컨트랙트을 배포하면 빠른 속도로 시장에 아이디어를 내놓을 수 있기 때문입니다. 현재 이러한 목적에 부합하는 2개의 선택지는 CosmWasm과 Solidity/EVM(Ethereum Virtual Machine)뿐입니다. CosmWasm과 Solidity/EVM을 제외한 다른 스마트 컨트랙트 작성 언어들은 오직 한 체인에서만 구동가능하기 때문입니다. CosmWasm과 Solidity/EVM을 사용하면 한 언어로 개발한 어플리케이션을 여러 개의 체인에 한꺼번에(portable) 출시할 수 있습니다.

아래에서는 CosmWasm이 Solidity/EVM에 비해서 갖는 장점을 1. 높은 성능(higher performance), 2. 디자인에 따른 보안(security by design), 3. 개선된 기능(advanced functionality), 4. 인터체인 네이티브성(interchain native)의 4개 측면에서 살펴보겠습니다.

1. 높은 성능(Higher performance than EVM)

CosmWasm의 성능 (출처 : Ethan Frey 발표 자료)

CosmWasm에서는 개발자가 작성한 스마트 컨트랙트를 WebAssembly로 컴파일합니다. 이후 블록체인 노드에서 WebAssembly를 네이티브 코드로 다시 컴파일하게 됩니다. CosmWasm의 실행 시간(execution time)은 Rust로 코드를 작성한 후 네이티브 Rust로 컴파일하고 LLVM으로 최적화를 한 다음 벤치마크를 측정한 것과 비교해서 10배 정도 느립니다. 비슷하게 네이티브 Go와 비교하면 약 5배 정도 느립니다.

한편 CosmWasm이 제공하는 최적화된 네이티브 Rust 프리컴파일러(precompiler)를 사용하면 서명 검증 시간(signature verification time)을 Cosmos SDK 네이티브 Go 모듈이나 gEth 코드와 비교했을 때 2배 빠르게 줄일 수 있습니다. 대부분의 스마트 컨트랙트에서 서명 검증 과정이 대개 컴퓨팅적으로 비싼(computationally expensive) 것을 고려하면 CosmWasm의 속도는 네이티브 속도는 아니지만 나쁘지 않은 성능이라고 할 수 있습니다.

종합해보면, CosmWasm을 네이티브 코드와 비교해보면 프리컴파일러는 더 빠르게 돌아가고, 컨트랙트 코드는 5배 정도 느리게 돌아가지만 그렇게 나쁜 성능은 아니라고 할 수 있습니다. 이러한 CosmWasm의 성능은 DeFi 어플리케이션들이 합리적인 가스비로 Rust 모듈을 이용한 복잡한 수학 연산을 할 수 있게 도와줍니다.

2021년에는 거버넌스 관련 컨트랙트, 가장 자주 사용되는 컨트랙트, 중요한 컨트랙트를 메모리에 캐싱(cache)하거나 고정(pinning)하는 방식으로 CosmWasm의 성능 최적화를 진행하였고, 이를 통해 기존에 큰 시간을 잡아먹었던 시작 시간(startup time)을 줄일 수 있었습니다.

결론적으로, 네이티브 코드를 이용한 전송(native Cosmos Bank transfers)과 스마트 컨트랙트를 이용한 전송(CW20 transfers)의 성능을 비교하여 평가해보면 후자가 약 20% 정도밖에 느리지 않습니다.

2. 디자인에 따른 보안(Security by Design)

CosmWasm의 디자인과 보안 (출처 : Ethan Frey 발표 자료)

1) 보안-우선(securiy-first)

CosmWasm은 보안을 위하여 MVP에서 기능을 조금씩 천천히 추가하는 방식으로 개발되었습니다. 이더리움에 대한 상위 20개의 공격 요소들 분석하여 디자인적으로 CosmWasm에 대한 유사한 공격이 발생하지 못하도록 하였습니다. 예를 들어, 이더리움에서 블록 해시값을 이용하여 의사 난수 생성기를 조작한 공격 사례에 대응하여 CosmWasm에서는 블록 해시값을 공개하지 않습니다.

CosmWasm의 대표적인 디자인 개선은 행위자 모델(Actor Model)을 도입해서 컨트랙트로의 재진입(reentrancy)에 따른 보안 취약성을 예방한 것입니다. 재진입 문제는 이더리움에서 자주 발생하는 공격 사례로서 설명하면 다음과 같습니다. 컨트랙트 A에서 함수를 실행하던 중 다른 컨트랙트 B에 호출을 넣어 실행시킵니다. 컨트랙트 B에서 함수를 실행하던 중 다시 컨트랙트 A에 호출이 발생하면 컨트랙트 A로 재진입이 이루어집니다. 이 경우 컨트랙트 A가 현재 두 번 실행되고 있는 상태가 됩니다. 컨트랙트 A 내의 상태 관리(state management)에 신중하지 않으면 각 실행이 이전 또는 이후의 상태를 참조하게 되어 예상치 못한 결과가 발생할 수 있습니다.

CosmWasm의 행위자 모델은 각 컨트랙트가 자신의 상태에 독점적인(exclusive) 접근 권한을 갖게 하고, 한 컨트랙트가 다른 컨트랙트를 직접적으로 호출할 수 없도록 하였습니다. 컨트랙트는 로컬에서 상태를 읽고 쓰며 이후 디스패처(dispatcher)에 요청을 보내게 됩니다. 디스패처는 한번에 하나의 요청씩을 실행시킵니다. 이를 통해서 어떤 순간에서든 하나의 컨트랙트만 상태를 쓸 수 있도록 구현하였습니다. 행위자 모델은 아래에서 더 구체적으로 살펴봅니다.

이더리움 공격 사례를 분석하여 개선한 CosmWasm 디자인의 구체적인 사례들은 여기서 더 확인해볼 수 있습니다.

2) 테스트-우선(Test-first)

CosmWasm의 강점 중 하나는 블록체인 노드를 돌릴 필요 없이 Rust로 컨트랙트 테스트를 해볼 수 있다는 것입니다. 기존 Solidity 개발에서는 컨트랙트를 테스트해보기 위해서는, 1) 컨트랙트를 컴파일하고 2) 로컬 노드에 컴파일한 컨트랙트를 올린 후 3) 풀노드(full node)로 컨트랙트를 실행시키고 JavaScript로 클라이언트 측에서 통합 테스트(integration test)를 진행해야 합니다.

CosmWasm에서는 다양한 레벨에서 컨트랙트 테스트를 할 수 있습니다. 낮은 레벨에서는 Rust 코드로 컨트랙트 실행 환경을 모의로 따라해서(mock environment) 컨트랙트에 대한 유닛 테스트(unit test)를 진행할 수 있습니다. 비슷하게 네이티브 Rust 코드로 여러 개의 연결된 실제/모의 컨트랙트가 동시에 잘 작동하는지 테스트(multi-test)해 볼 수 있습니다. 높은 레벨에서는 컨트랙트를 WebAssembly로 컴파일해서 실제 블록체인 상에서 잘 구동되는지 JavaScript나 Go로 통합 테스트를 할 수 있습니다.

3) 행위자 모델(Actor Model)

CosmWasm의 행위자 모델 (출처 : Ethan Frey 발표 자료)

CosmWasm에서는 컨트랙트 호출의 대부분을 차지하는 읽기 전용 질의 코드(query code)와 읽기/쓰기 권한을 모두 갖는 실행 코드(execute code)를 구분합니다. 질의 코드는 읽기 전용 권한만 갖고 있어 재진입 문제를 야기하지 않습니다. 따라서 이더리움과 마찬가지로 동시적으로(synchronously) 다른 컨트랙트를 실행시킬 수 있습니다. 실행 코드는 컨트랙트 호출 과정에서 어느 한 부분이라도 실패하면 전체 트랜잭션을 실패하게 하고 모든 상태를 원상복구시킵니다. 이 때 대부분의 경우에는 실패한 실행 코드에 대해서는 돌아오는 메시지를 받을 필요가 없습니다.

CosmWasm의 서브 메시지 (출처 : Ethan Frey 발표 자료)

그러나 어떤 경우에는 실패한 실행 코드로부터 실패 결과를 돌려받을 필요가 있습니다. 가령 서브호출(sub-call)이 에러를 돌려주면 그것을 폐기하지 않고 에러를 처리해서 다시 실행시키고 싶을 수 있습니다. 혹은 실패 결과에 대한 데이터를 얻어서 다음 호출 때를 위한 분석 근거로 삼고 싶을 수도 있습니다. 이를 위해서 컨트랙트 호출을 할 때, 에러가 났을 때 처리 방법을 알려주거나 성공 또는 실패에 대한 결과를 돌려줄 것을 요구할 수 있습니다.

CosmWasm은 컨트랙트 호출이 성공 또는 실패했을 때 그 결과 메시지를 돌려받을 수 있는 서브메시지(sub-message) 기능을 제공합니다. 서브메시지의 대표적인 사용 예시는 다른 컨트랙트를 생성하고 초기화시킬 때입니다. 컨트랙트 A에서 컨트랙트 호출로 컨트랙트 B를 생성할 때 서브메시지를 활용해서 새로 생성한 컨트랙트 B의 주소를 돌려받을 수 있습니다. 또다른 서브메시지 사용 예시로 컨트랙트에 가스비 제한을 걸어두고 가스비를 초과하여 실패했을 때는 실패 이유를 돌려받을 수 있도록 설계할 수도 있습니다.

3. 개선된 기능(Advanced Functionality)

CosmWasm의 개선된 기능 (출처 : Ethan Frey 발표 자료)

1) 스토리지 플러스(Storage-Plus)

CosmWasm에서는 Solidity와 유사하게 map 타입을 지원합니다. CosmWasm의 map에서는 여러 타입의 중첩된 map(nested maps with multiple types)을 지원하여 2–3 레벨 이상으로 깊게 중첩된 map에 반복자(iterator)를 적용할 수 있습니다. 예를 들어 한 사용자의 잔고들과 각 잔고에서 이루어진 투표를 map해 놓은 후 반복자를 사용해서 사용자의 모든 투표를 알려달라고 요구할 수 있습니다. 또한 CosmWasm의 map에서는 두 번째 색인(secondary indexing) 기능을 제공합니다. 예를 들어 투표를 각각 사용자, 프로포절 별로 색인을 해서 원하는대로 반복자와 결합하여 활용할 수 있습니다.

스토리지 플러스는 모두 Rust 코드로 라이브러리 형태로 만들어졌으며 해당 라이브러리를 포크해서 새로운 기능을 확장할 수 있습니다. 스토리지 플러스 라이브러리를 모듈로 컴파일해서 스마트 컨트랙트에서 불러오는 방식으로 사용할 수 있습니다.

2) 쉽고 안전한 컨트랙트 업그레이드

이더리움에서는 기존 컨트랙트를 업그레이드 하기 위해 프록시 컨트랙트를 사용해야 합니다. 그러나 이 과정이 복잡할 뿐더러 이 마이그레이션 과정을 노린 보안 공격도 발생한 적 있습니다.

CosmWasm에서는 컨트랙트에 관리자 주소(admin address)를 등록할 수 있습니다. 관리자 주소는 없을 수도 있고 하나일 수도 있고 multisig를 활용한 여러개 주소일 수도 있고 다른 거버넌스 컨트랙트 주소일 수도 있습니다. 관리자 주소는 쉽게 컨트랙트 코드를 업그레이드 하거나 마이그레이션할 수 있습니다.

3) Rust 수학 라이브러리 사용

CosmWasm에서는 Rust의 수학 라이브러리를 모두 불러와서 사용할 수 있습니다. 이더리움에서는 2017년경부터 EVM 레벨에서 바로 불러와서 사용될 수 있는 많은 수학 라이브러리들이 개발되었습니다. CosmWasm에서는 CosmWasm용 수학 라이브러리를 직접 개발할 필요 없이 곧바로 Rust의 수학 라이브러리에 접근해서 사용할 수 있습니다.

4) IBC에의 접근

CosmWasm에서는 IBC를 활용해서 한 체인의 컨트랙트에서 다른 체인의 컨트랙트 호출을 자유롭게 할 수 있습니다.

5) 커스텀 확장기능: 네이티브 DEX 호출

CosmWasm은 모든 CosmWasm 체인에 적용가능한 기본 API를 제공합니다. CosmWasm 체인은 이 기본 api를 활용하여 사전동의 방식으로 이용가능한 체인 특화 기능을 구현할 수 있습니다. 예를 들어, 오스모시스는 Go 코드로구현된 모율으을 활용하여 DEX를 운영하고 있습니다. 만약 오스모시스의 DEX에 외부 컨트랙트가 머신러닝 알고리즘을 활용하는 것을 허용하고 싶으면, 네이티브 Go 모듈을 실행시킬 수 있는 콜백 함수를 컨트랙트 내에 구현해둘 수 있습니다.

CosmWasm 체인은 모든 CosmWasm 체인에 사용 가능한 포괄적인(generic) CosmWasm 컨트랙트를 사용할 수 있습니다. 여기에 각 체인은 자기 체인에 특화된 기능을 추가할 수 있습니다.

4. 인터체인 네이티브(Interchain native)

CosmWasm의 인터체인 네이티브 기능 (출처 : Ethan Frey 발표 자료)

EVM은 CosmWasm보다 먼저 개발되었고 분명히 선점자의 우위(first-mover benefit)을 갖고 있습니다. 인터체인 네이티브는 EVM의 선점자의 우위를 깰 수 있는 CosmWasm의 강점입니다.

CosmWasm은 한 체인만이 아닌 모든 체인에서 구동될 수 있습니다. 현재 CosmWasm을 메인 체인으로 활용하고 있는 체인은 테라(Terra), 시크릿 네트워크(Secret Network), 주노(Juno) 등 5개입니다. 2022년에는 오스모시스(Osmosis), 리젠 네트워크(Regen Network) 등이 CosmWasm을 사용할 예정입니다. 이 말은, 개발자가 컨트랙트를 개발하면 15개 이상의 체인에 배포를 할 수 있는 선택지가 생긴다는 것입니다. 어떤 체인에는 그 체인만의 API를 활용해서 그 체인에 특화된 기능을 만들 수도 있습니다. 많은 이더리움 개발자들이 비슷한 컨트랙트를 팬텀(Fantom)과 폴리곤(Polygon)에 배포하고 있는 것과 유사합니다.

여기에 IBC는 체인간에 브릿지 역할을 합니다. IBC는 Cosmos 체인 사이에 싸고 빠르고 안전한 브릿지를 제공합니다. IBC를 사용하면 일반적인 수수료에 30초에 체인 간 트랜잭션을 보낼 수 있습니다. 이는 기존에 옵티미스틱 롤업(Optimistic Roll-up)이나 크로스체인 브릿지와 비교했을 때 굉장히 빠르고 싼 것입니다. 현재 IBC에서는 인터체인 계정(interchain account) 개발이 이루어지고 있으며, 이것을 통해 단순히 체인 간 토큰을 옮기는 것에 더해서 체인 간에 컨트랙트 호출을 옮길 수 있게 됩니다.

또한 IBC는 새로운 기능을 Go 모듈로 만들고 있습니다. 컨트랙트는 IBC 위에서 IBC의 모든 인프라를 Go 언어로 사용할 수 있습니다. 각 체인의 컨트랙트는 그 밑의 인프라는 신경쓸 필요 없이 각 체인에서 독자적인 프로토콜을 만들 수 있습니다. 컨트랙트 단에서 새로운 프로토콜을 만들 수 있다는 것은 IBC와 Cosmos의 엄청난 강점입니다.

IBC를 이용하면 체인의 점진적인 마이그레이션(gradual migration)이 가능해집니다. 이는 이더리움이 포크(fork) 방식을 택하고 있는 것과 비교됩니다. 2022년에 더 많은 연구가 이루어질 것으로 기대합니다.

5. 미래의 개선점(Future Enhancements)

2022년에 연구 중인 CosmWasm의 개선점들 (출처 : Ethan Frey 발표 자료)

2022년 CosmWasm은 1) Rust 컨트랙트를 Solidity 컨트랙트처럼 쉽게 사용할 수 있게 하는 매크로 개발과 2) Go 언어로 CosmWasm 컨트랙트를 빌드할 수 있는 SDK 개발과 3) 새로운 Cosmos SDK 기능을 위한 지원, 4) 클라이언트 사이드에서 부족한 기능(IDE, Etherscan과 유사한 기능)을 위한 InterWasm DAO 지원을 할 예정입니다.

Confio 팀 헤드 Ethan Frey가 CosmWasm 특별 세션을 진행하는 모습

[출처]

“Attack on Pseudo-random number generator(PRNG) used in Cryptogs, an Ethereum (CVE-2018–14715)”, https://medium.com/coinmonks/attack-on-pseudo-random-number-generator-prng-used-in-cryptogs-an-ethereum-cve-2018-14715-f63a51ac2eb9 (검색일: 2022.1.18)

“Ethereum Smart Contract Best Practices — Known Attacks”, https://consensys.github.io/smart-contract-best-practices/known_attacks/ (검색일: 2022.1.18)

“CosmWasm Documentation — Actor Model for Contract Calls”, https://docs.cosmwasm.com/docs/0.14/architecture/actor/ (검색일: 2022.1.18)

“CosmWasm Documentation — Comparison with Solidity Contracts”, https://docs.cosmwasm.com/docs/1.0/architecture/smart-contracts/ (검색일: 2022.1.18)

--

--

Shin Woochul
Decipher Media |디사이퍼 미디어

Junior Blockchain Researcher & Developer at Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)