Singleton Design
은 v4에서 가장 핵심이 되는 개념이다. 기존 v3 프로토콜은 파편화된 컨트랙트 간의 상호작용으로 많은 양의 가스가 연산에 소요되었다면, v4는 구조의 개선을 통해 이를 멋지게 개선했다. 아직 개발 단계이지만, 새로운Pool
배포에 소요되는 가스비는 약 99% 절감되는 것으로 밝혀졌다.
Singleton
의 개념Singleton
은 어떤 객체의 인스턴스가 유일하도록 관리하는 방법이다.extcall
)을 기반으로 동작했다면, v4는 hook, router 등의 peripheral contract
이외의 모든 상호작용을 poolManager
내부에서 처리한다.library
의 사용 덕분이다. 라이브러리는 배포된 외부 코드를 컨트랙트 내부에서 참조하여 사용할 수 있는 기능이다.UniswapV3Factory
를 기반으로 각각의 pool이 하나의 컨트랙트로 구현되었다. multi-hop swap
도 많은 extcall을 필요로 하게 되므로, 자연스럽게 비싼 연산이 된다.상호작용하려는 각각의 모든 컨트랙트에 대해
CALL
을 통한 컨택스트 변경과, 많은 변수에 대한SLOAD
, 최종적으로 상호작용 결과를SSTORE
로 모두 갱신한다. 연산을 위해서는 많은 양의 가스가 필요할 수 밖에 없다.
높은 가스비를 야기한 v3의 구조는, 각각의 pool이 독립적인 컨트랙트로서 각자의 스토리지에 상태를 관리하는 순간 예정된 수순이었다. 문제의 핵심은 다음과 같다.
CALL
)SLOAD
)SSTORE
)PoolManager
가 모든 로직의 수행을 내부적으로 처리한다.
PoolManager
는 내부에 mapping으로 모든 pool의 상태를 관리한다.
Singleton
으로 외부 호출 감소했지만, 여전히 스토리지 참조하지 않나?Cancun
업데이트에 도입된 transient storage
를 사용하기에 더 효율적이다. 해당 스토리지 값은 현재 트랜잭션에서만 유효하고, 항상 종료 시에 0으로 초기화한다. Flash Accounting
을 활용하면, 풀 생성에 소요되는 가스비는 99% 감소시킬 수 있다. Flash Accounting은 별도의 🚧작성 예정에서 다룬다.