본문으로 건너뛰기
Boring Security
프로필
최선의 행동 양식

프록시 컨트랙트에 대한 모든 것

NeedMoreManas
공유

여러분에게 프록시 컨트랙트에 대해 위험하고 “믿을 수 없다”고 말을 해주는 사람이 있었을지도 모릅니다. 누가, 아니면 그게 누구건 왜 프록시 컨트랙트를 쓰게 되는 걸까요? 그건 웹3 정신에 위배되는 것인가요? 그건 실제로 위험할까요? 이 글에서 우리는 이러한 질문에 답변을 하고 프록시 컨트랙트에 대한 다른 중요한 정보들을 공유해 여러분이 일반적인 웹3 유저로서 프록시 컨트랙트에 대해 어떻게 생각해야하고 그것을 어떻게 다뤄야할지 설명하고자 합니다. 그럼 시작해볼까요!

근데, 프록시 컨트랙트라는 게 대체 뭘까요?

일반적으로 이더리움 상의 컨트랙트는 변경할 수 없고, 따라서 분산되기 시작한 이후로는 업그레이드될 수 없습니다. 결국 블록체인은 일반적으로 “변경할 수 없는 공공 원장”으로 정의되지만, 개발자들은 프록시 컨트랙트 모델을 이용하여 이러한 한계를 벗어날 수 있습니다. 프록시 컨트랙트는 그것의 모든 기능을 실행 컨트랙트라고 불리는 다른 스마트 컨트랙트에 보냅니다(또는 위임합니다). 

실행 컨트랙트 그 자체(“일을 하는” 코드 전부를 담고 있는 컨트랙트)는 필요에 따라 추후에 변경되거나 “업그레이드” 할 수 있습니다. 개발자는 단순히 다른 실행 컨트랙트 버전을 블록체인에 분산시키고 프록시 컨트랙트가 받은 모든 요청을 두번째 실행 컨트랙트로 보내도록 업데이트하면 됩니다.(아래 그림을 보세요) 그러한 요청은 토큰이나 NFT 같은 자산을 전송하는 것을 포함합니다.

프록시 컨트랙트는 땅을 사는 것에 대한 비유로 잘 설명할 수 있습니다. 땅은 프록시 컨트랙트 역할을 하고, 유용한 기능을 전부 집 자체에 위임하며, 집 주인은 지붕을 바꾸고, 주방을 리모델링할 수 있습니다. 하지만 리모델링을 아무리 해도, 아니면 땅 위에 완전히 새로운 집을 지어도, 주소는 바뀌지 않죠!

ProxyHouse.jpg

프록시 컨트랙트를 사용하는 프로젝트

프록시 컨트랙트는 위험할까요? 프록시 컨트랙트를 사용하는 NFT 프로젝트에서 구매를 해야할까요? 마켓플레이스나 토큰, 디파이 프로토콜은 어떤가요? 이 질문들에 대답하기 전에, 야생의 프록시 컨트랙트들을 좀 알아보도록 하겠습니다.

10KTF - 이 스마트 컨트랙트는 업그레이드를 가능하기 위해 이러한 프록시 컨트랙트 모델을 이용하는 가장 잘 알려진 NFT 스마트 컨트랙트라 할 수 있을 겁니다. 그들은 지갑 위임(wallet delegation)와 같은 기능을 통합해 컨트랙트를 업그레이드 하고, 로열티를 강제로 부과하고, 새로운 프리미티브나 표준을 적용합니다.

USDC - 가장 규모 있는 스테이블 코인 중 하나인 USDC 또한 프록시 컨트랙트 모델을 채택했습니다. 그들은 2020년 “수 억 원 어치의 ERC-20 토큰 업그레이드”라는 제목의 블로그 포스트에서 이 방식을 채택한 이유에 대해 설명합니다. 이 글에서, 그들은 다음과 같은 문장으로 그들의 우려에 대해 통렬하게 설명했습니다. “업그레이드 시점에 USDC 시가 총액이 1.4억 달러 규모로 성장했고 우리의 커리어는 위태로웠습니다. 수억 달러를 불태운 개발자로 역사속에서 사라지기를 원하는 사람은 아무도 없었습니다.”

Blur - Blur는 $BLUR 토큰 컨트랙트를 제외하고 실질적으로 모든 분산 컨트랙트에 대해 프록시 컨트랙트를 쓰는 NFT 마켓플레이스입니다. 유저들은 이미 프록시 주소에 자산을 승인했고, 따라서 새로운 실행 컨트랙트가 유저들의 지갑에서 이러한 자산을 빼낼 수 있게 되었기 때문에 이러한 방식은 위험할 수 있습니다. Blur의 새로운 실행 컨트랙트에 버그가 있다면, Blur의 프록시 컨트랙트에 승인된 수천개의 NFT들은 위험에 처할 것입니다. 스캐머들은 유저들의 지갑에서 NFT를 빼가고, 이는 NFT 시장의 종말을 의미할 것입니다. 이것은 가능성이 매우 희박한 종말 시나리오이고, 서킷 브레이커 기능과 컨트랙트 오딧(감사)과 같은 안전 장치와 화이트해커들이 이러한 일이 일어나기 전에 공격을 막을 것입니다.

Compound Finance - Blur와 10KTF의 업그레이드에 대한 거버넌스는 명확하지 않은데, 그들은 사기업이기 때문에 아마도 더 성숙한 DAO의 업그레이드에 비해 엄밀하지 않다고 (그리고 확실히 투명하지 않다고) 할 수 있을 것입니다. 한 주요 사례는 컴파운드 파이낸스로, TVL이 1억 달러 이상인 디파이 대출 플랫폼입니다. 컴파운드 파이낸스는 보안에 매우 신경쓰는 것으로 알려져 있습니다. 가령 컴파운드 파이낸스의 거버넌스 과정은 최소 1주일의 리드 타임이 주어지지 않는다면 프로토콜을 업데이트하도록 허락하지 않으며, 이는 코드로 강제됩니다.

프로젝트에서는 왜 그것을 사용하나요?

프록시 컨트랙트를 사용하는 데에는 미묘한 차이가 있는 여러 이유가 존재하지만, 주된 이유는 다음과 같습니다.

  • 업그레이드 가능성: 이것이 가장 주된 이유입니다. 실행 컨트랙트는 프록시 컨트랙트나 유저에게 영향을 주지 않고 업그레이드 될 수 있습니다. 프로젝트들은 유저들이 이미 존재하는 재산에 대해 다시 승인하게 해서 유저를 잃어버리거나 자산을 옮기게 되지를 원하지 않습니다. 프록시 컨트랙트는 실행 컨트랙트의 주소만을 저장하며 코드는 저장하지 않기 때문에 유저들은 실행 컨트랙트 업그레이드에 영향을 받지 않습니다. 따라서 유저들은 실행 컨트랙트가 업그레이드 되었더라도 계속해서 프록시 컨트랙트와 상호작용할 수 있습니다.
  • 미래 기능 숨기기: 프로젝트팀은 미래에 컨트랙트에 기능을 추가할 계획을 가지고 있지만, 그것을 공개할 준비가 되어있지 않을 수 있습니다. 그들은 쉽게 시간이 지나면 기능을 공개할 수 있고, 다른 컨트랙트로 가는 플레이스홀더 방식을 만들어낼 필요가 없습니다. 프록시 컨트랙트는 블록체인 프로젝트가 갑자기 새로운 기능을 출시하기에 간편한 방법입니다.
  • 미래를 준비하기: 환상을 가지기는 쉽지만 암호화폐의 미래가 어떻게 될지는 아무도 모릅니다. 새로운 신규 자산 유형이나 NFT는 Blur에 의해 특별한 방법으로 취급되어야 할 것입니다. 새로운 기능이나 프리미티브가 개발될 수도 있습니다. 예를 들어 크립토펑크는 ERC-721 표준이 생기기 전에 나타났고, 서드 파티 “래핑 컨트랙트”에 의존해야만 오픈씨 같은 마켓플레이스에서 거래할 수 있습니다. 크립토펑크가 ERC-721 표준 이전에 생겼기 때문입니다. 암호화폐 프로젝트는 여러 버전의 컨트랙트를 갖는 것을 피하고자 하는데, 그렇게 하는 것이 디파이를 위한 유동성을 분리시키고 NFT의 기원을 복잡하게 만들기 때문입니다. 프록시 컨트랙트를 쓴다면, 크립토펑크는 (이론상) 이러한 변화를 해결하기 위해 단순히 업그레이드 하기만 하면 됐을 수 있습니다!

이 이유들은 똑같은 것을 다르게 설명하는 것처럼 보일 수 있지만, 그 차이는 미묘합니다. 몇몇 프로젝트에 있어 그들의 유틸리티나 프로젝트에 대해 동일한 컨트랙트 주소를 가지고 있는 것은 필수적이지 않습니다. 프로젝트의 유저들은 특수한 UI나 웹사이트를 통해서만 컨트랙트와 상호작용할 수도 있습니다. 그들의 유저들이 (우리가 NFT 보안 101 수업에서 가르쳐주는 보안 전략인) 스마트 컨트랙트 북마크를 사용하지 않는 한, 그들은 전혀 현명하지 않은 것입니다! 하지만 어떤 프로젝트들은 토큰 컬렉션의 기원과 토큰의 일관성을 필요로 할지도 모릅니다.

컨트랙트가 프록시 컨트랙트인지 확인하는 방법

어떤 컨트랙트가 프록시 컨트랙트인지를 확인하는 방법은 주로 두 가지가 있습니다. 물론 블록체인 분석 툴은 수많은 종류가 있지만, 우리는 대부분의 사람들에게 Etherscan을 추천합니다.

방****법 1: 먼저, Etherscan의 컨트랙트로 가세요. 여기서 저는 우리의 NFT 보안 102 수업에서 자주 쓰는 예시인 Helix의 프록시 컨트랙트를 보겠습니다.

Contract 탭으로 가세요. 여러분은 대부분의 컨트랙트에서 보지 못하는 버튼 두 개를 보게 될 것입니다. “Write as Proxy”와 “Read as Proxy”입니다.

writeasproxy.png

Etherscan팀에서 인증된 프록시로 확인된 컨트랙트 스크린샷.

필요하다면 “Write as Proxy” 버튼을 이용해 프록시 컨트랙트와 상호작용하세요.

방법 2: 프록시 컨트랙트를 알아보는 다른 방법은 이더스캔(Etherscan)이 그것이 프록시라고 하지만 개발자가 이더스캔에 위에서 설명한 버튼을 만들지 않기로 명시적으로 선택한 경우입니다. 대신에, Contract 페이지에서 그것이 프록시 컨트랙트”일지도 모른다”는 배너가 있을 것입니다.

maybeproxy.png

Etherscan이 프록시일 것이라고 생각하지만, 개발자가 프록시로 제출하지 않았거나 확인하지 않은 컨트랙트.

프록시 컨트랙트를 사용하는 것의 위험

이제 프록시 컨트랙트라는 것에 대해 알게 되었으니, 유저에게 어떤 위험이 있는지 알아보겠습니다. [프록시 컨트랙트를 사용하는 프로젝트]에서 그것에 대해 일부 설명했지만, 다음과 같이 정리할 수 있습니다.

  1. 개발자의 분****산/관리 지갑이 해킹되어 악성 업데이트가 분산될 수 있음: 정말 뛰어난 개발자들의 예시가 수도 없이 많으며, 그 중 한 예는 비트코인 프로토콜의 핵심 개발자인 LukeDashJr.이 지갑 해킹을 당한 것입니다. 악성 이용자들은 프록시 컨트랙트 분산자 주소를 이용해 전체 컬렉션을 망가뜨리거나 더 나쁜 짓도 할 수 있습니다.
     
  2. 개발자가 흑화해서 악성 업데이트를 분산시킬 수 있음: 대부분의 사기꾼 개발자들은 자산을 훔쳐서 도망가기만 하지만(이것을 암호화폐에서는 러그풀이라고 부릅니다), 그들은 프록시 컨트랙트를 악성 업그레이드해서 더 많은 피해를 줄 수도 있습니다. 그들은 자산을 훔치는 실행 컨트랙트를 사용해 컨트랙트에 승인된 모든 자산을 훔칠 수도 있고, 심지어 관리 소각 기능 같은 기능을 추가해 유저의 지갑에 이미 “보내진” 토큰을 훔칠 수도 있습니다!
     
  3. 개발자들의 컨트랙트 업데이트가 버그를 만들어낼 수 있음: 최근 스시스왑(Sushiswap)은 버그가 있는 컨트랙트를 배포했습니다. 공격자들은 이 버그를 이용해 암호화폐 인사들과 당시 스시스왑을 사용하던 일반 유저들의 지갑에서 330만 달러를 가져갔습니다. 스시스왑이 프록시 컨트랙트를 쓰던 것은 아니었지만, 그랬다면 상황은 훨씬 나빴을 것입니다. 버그가 있는 컨트랙트 업그레이드는 스시스왑에서 승인을 한번이라도 한 적 있는 사람이라면 동일한 버그에 취약하게 만들었을 것임을 의미합니다! 해커들은 스시스왑에서 토큰 승인을 한 적이 있는 누구에게서든 자산을 훔칠 수 있었을 겁니다. 만약 그랬다면, 이것은 2023년 최대의 디파이 악용이 되었을 것입니다! 

거래소에서 프록시 컨트랙트를 쓰지 않는 것은 합리적인 행위입니다. 그것은 조금 더 조심스러운 유저나 기관들이 업데이트 이후 신규 유저가 겪을법한 문제들을 기다리게 합니다. 프록시 컨트랙트를 사용해 실행 컨트랙트를 업데이트하는 것은 모든 유저들이 이전에 승인했던 모든 토큰에 대해 그들이 승인을 철회하지 않는 한 새로운 위험을 지니게 된다는 것을 의미합니다.

권고

프록시 컨트랙트를 이용하는 것의 위험을 이해하는 것과 별개로, 야생의 프록시 컨트랙트를 마주쳤을 때 따를 수 있는 경험 법칙은 다음과 같습니다.

  1. NFT 컨트랙트가 그들의 생태계 밖에 있는 자산에 대한 승인을 요구할 때 특히 주의하세요 (그렇지 않다면 너무 스트레스 받을 필요 없습니다).

예를 들어 여러분은 컬렉션에 대해 배포된 프록시 컨트랙트를 가지고 있는 NFT 프로젝트의 일부일지도 모릅니다. 그 컬렉션이 여러분의 에이프코인(APE)이나 래핑된 이더리움(wETH)에 대한 승인을 요구한다면, 그것을 매우 위험한 행위로 판단해야 합니다. Blur는 종종 이러한 행위의 “피할 수 없는” 예시로 여겨지지만, 이미 말한 것처럼 Blur는 프록시 컨트랙트를 사용하기만 할 뿐입니다.

  1. NFT나 ERC-20 토큰을 승인할 때, 그리고 특히 마켓플레이스나 거래소에 대해 승인할 때, 승인하기 전에 그것이 프록시 컨트랙트인지 확인하세요.

저는 새로운 마켓플레이스나 탈중앙화 거래소를 이용할 때, 이것을 체크해 그들이 프록시 컨트랙트를 사용하는 이유에 대해 설명했는지를 확인하거나 그들이 새로운 실행 컨트랙트를 업데이트 하기 전에 새로운 배포를 보호하거나 그에 대한 감사(오딧)을 했는지를 알아봅니다.

  1. Revoke.cash나 Approvals.xyz 같은 서비스를 통해 사용하지 않는, 또는 비활성화된 프록시(또는 하는 김에 모든 컨트랙트)에 대한 승인을 철회하세요.

비활성화된 프로젝트나 특히 설립자가 분명하지 않은 프로젝트는 여러분의 승인을 악용해 승인된 토큰을 제어할 수 있는 코드가 포함된 실행 컨트랙트에 코드를 배포할 수 있습니다. 이러한 가능성을 피하기 위해, 여러분의 승인을 깔끔하게 유지하고, 승인에 대한 지출 최대치를 설정하고, 여러분의 지갑에서 불필요한 승인을 없애기 위해 정기적으로 오딧을 하세요!

결론

프록시 컨트랙트는 나쁘기만 한 것은 아니며, 솔직히 여러 프로젝트에서, 특히 자체 생태계나 토큰 내에서 자체적 수단으로 프록시 컨트랙트를 사용하는 프로젝트들에서 프록시 컨트랙트는 프로젝트의 장기적인 실행 가능성을 보장하는 매우 합리적인 방법입니다! 그것은 최신 ERC 표준과 트렌드에 맞추는 데 도움이 되고, 지갑 위임과 같은 새로운 프리미티브를 부드럽게 통합시키는 것을 가능하게 합니다. 하지만, 프록시 컨트랙트를 사용하는 것은 예측 가능성을 줄어들게 하고, 블록체인 사용자들이 수십년간 익숙해져 온 정말 중요한 관습인 _변동 불가능성_을 감소시킵니다.

궁극적으로, 프록시 컨트랙트를 쓸 것인지 말 것인지는 유저와 그들의 선택에 달려있습니다. 대부분의 경우에, 프록시 컨트랙트는 프로젝트의 장기적 실현 가능성을 보장하기 위한 합리적인 방법입니다. 그러나, 업데이트가 잦지 않아야 하는 거래소나 마켓플레이스(Blur나 오픈씨 등)의 경우, 프록시 컨트랙트를 쓰는 것은 적절하지 못할 수 있습니다.

웹3 보안에 대해 질문이 있거나 더 많은 것을 배우고 싶으신가요? 최신 보안 정보와 스캠, 전략들에 대해 꾸준히 정보를 얻고 싶나요? Boring Security 디스코드 서버에 가입해보세요_._

읽기목록