제퍼넷 로고

ERC4626 볼트에 대한 일반화된 속성 테스트

시간

DeFi가 성장하고 성숙해짐에 따라 확장 가능한 인프라와 구성 가능성은 개발자의 최우선 과제입니다. Ethereum Requests for Comments(또는 ERC) — 널리 사용되는 토큰 표준과 같은 Ethereum 기반 앱을 구축하기 위한 표준화된 툴킷 ERC20 — 개발자가 처음부터 시작하지 않고 생태계에 기여할 수 있도록 일관된 지침을 제공하는 필수적인 역할을 수행합니다. 올해, 토큰화된 볼트 표준 ERC4626 수익률 베어링 토큰 간의 상호 호환성을 장려하기 위해 만들어졌습니다. 구현 세부 사항을 표준화하면 긴급한 구성 가능성 문제를 해결할 수 있으므로 프로토콜 통합이 더 쉬워지고 궁극적으로 오류가 발생하기 쉽습니다.

여러 DeFi 프로젝트는 이미 채택 볼트의 구성 가능성을 높이기 위해 표준을 따르고 있으며 생태계 전반에 걸쳐 더 광범위하게 채택될 것으로 예상합니다. 그러나 기존 볼트를 적용하면 성장통이 발생합니다. 결정적으로 특정 구현 오류는 새로운 공격 대상을 노출시킬 수 있습니다. 작은 오류(표준 인터페이스를 잘못 해석하는 것만큼 작음)라도 보안과 사용자 경험 모두에 심각한 결과를 초래할 수 있으며, 특히 더 구성 가능한 DeFi 생태계 내에서 더 많은 보안 도구와 조치가 필요함을 강조합니다. 

다행스럽게도 단순한 오류는 악용되기 훨씬 전에(이상적으로는 배포되기 전에) 감지되면 비교적 간단한 솔루션을 가질 수 있습니다. 이를 위해 출시한 ERC4626 속성 테스트 볼트 빌더가 통합을 중단하거나 취약성을 초래할 수 있는 표준 위반을 감지하는 데 도움이 되는 퍼징 및 기호 실행. 이 게시물에서 우리는 동기 부여 문제를 설명하고 접근 방식을 살펴보고 실행 가능한 조언으로 결론을 내립니다.

먼저 ERC4626 표준에 대한 약간의 배경 지식

XNUMX월 최종 확정, ERC4626 토큰화된 볼트의 표준입니다. 널리 사용되는 범위를 확장하기 위해 도입되었습니다. ERC20 표준(현재 수백 개의 토큰에 대한 기반), 수율 베어링 볼트 전반에 걸친 표준화를 장려하고 상호 작용해야 하는 앱 및 프로토콜(예: 수율 집계기)에 대한 구성 가능성을 보장합니다. 즉, ERC4626 볼트에 구축된 모든 앱은 다른 ERC4626 볼트와 함께 작동하도록 쉽게 확장할 수 있습니다. 

토큰화된 금고를 통해 사용자는 자산을 금고 주식에 자유롭게 예치하고 나중에 해당 주식을 상환하여 금고에서 원금과 이자를 인출할 수 있습니다. 이러한 볼트 주식은 ERC20 토큰이므로 쉽게 거래하거나 다른 자산을 빌릴 때 담보로 사용할 수 있습니다. 예를 들어, 사용자는 YVault 토큰을 발행하기 위해 Yearn 금고에 자산을 예치한 다음 Uniswap에서 거래하거나 추가 수익을 위해 스테이킹하거나 대출 프로토콜을 위한 담보로 사용할 수 있습니다.

수익률을 생성하고 분배하는(그리고 주가를 결정하는) 비즈니스 로직은 구현에 따라 다를 수 있습니다. 가능한 한 많은 볼트를 다루기 위해(상호 운용성 vs. 동일성을 목표로) ERC4626 표준은 사용자 인터페이스를 설명하는 데 중점을 두고 구현 세부 사항의 대부분을 지정하지 않은 채로 둡니다. 볼트가 인터페이스의 특정 요구 사항을 충족하는 한 비즈니스 로직의 변형을 허용하고 다양한 종류의 앱과 ERC4626 볼트 유형 간의 상호 운용성.

더 많은 볼트가 생성됨에 따라 처음부터 ERC4626 표준에 따라 구현될 것으로 예상됩니다. 그러나 우리는 현재 더 큰 구성 가능성을 활용하려는 개발자가 표준을 준수하도록 기존 볼트, 앱 및 프로토콜을 업데이트해야 하는 다소 과도기 단계에 있습니다. 그리고 업그레이드하면서 수많은 복잡성과 도전 과제에 직면하게 됩니다. 

표준 준수의 문제(및 준수 실패의 함정)

새로운 표준을 따르는 것이 항상 간단한 것은 아닙니다. 모든 ERC4626 볼트는 설명된 대로 표준의 요구 사항을 충실하게(그리고 정확하게) 구현해야 합니다. 그렇지 않으면 ERC4626 볼트의 통합이 다양한 변형을 설명하기 위해 점점 더 복잡해집니다. 이러한 복잡성으로 인해 통합은 본질적으로 오류가 발생하기 쉽습니다. 그리고 미래에 대한 충분한 증거가 없기 때문에 시간이 지남에 따라 보안 취약성이 발생할 수 있습니다.

비표준 ERC20 토큰(예: Tether USD)은 다양한 행동을 안전하게 처리하기 위해 토큰 전송을 수행할 때 추가 라이브러리(예: SafeERC20)를 사용하기 위해 많은 DeFi 시스템이 필요합니다(예: 전송이 성공하면 반환하는 대신 아무 것도 반환하지 않음) true). 이는 시스템이 "누락된 반품" 사례를 적절하게 처리하도록 설계되지 않은 경우 이러한 토큰과 상호 작용하는 모든 시스템이 취약해질 수 있음을 의미합니다. 이러한 시나리오는 잠재적으로 일반적인 보안 함정을 도입하고 전체 개발 및 유지 관리 비용을 증가시킬 수 있습니다(문제를 완화하는 데 필요한 추가 논리 및 종속성을 고려할 때). 따라서 표준을 준수하는 것은 개별 구현뿐만 아니라 전체 생태계의 보안을 위해서도 중요합니다. 단일 시스템 또는 종속성의 하나의 취약점으로 인해 광범위한 문제가 발생할 수 있습니다.

이상적으로는 표준이 모호하지 않고 공식적으로 지정되어야 합니다(예: ERC20의 공식 사양), 모든 구현은 표준 사양에 대해 공식적으로 검증될 수 있습니다. 그러나 실제로는 커뮤니티에서 요구하는 비용과 노력으로 인해 단기간에 달성하기가 쉽지 않습니다.

적합성 문제를 식별하기 위한 실행 가능한 ERC4626 속성 도입 

이상적인 상태(엄격한 공식 사양에 대해 공식적으로 검증된 모든 볼트)를 향해 작업하면서 ERC4626 표준을 작성했습니다. 속성 표준 요구 사항의 미묘하고 놓치기 쉬운 세부 사항에서 불일치를 포착합니다.  

Vault 개발자는 배포 전에 구현에서 잠재적인 표준 위반을 감지하기 위해 테스트를 실행할 수 있습니다. 또한 볼트 통합자는 해당 볼트를 시스템에 통합하기 전에 해당 볼트가 표준을 따르는지 확인할 수 있습니다. 속성은 메인넷 포크 테스트를 통해 이미 메인넷에 배포된 라이브 볼트에 대해 테스트할 수도 있습니다. 라이브 볼트 테스트는 특히 볼트가 최근에 배포 또는 업그레이드된 경우 모든 시스템 매개변수가 올바르게 설정되었는지 확인하는 데 유용할 수 있습니다. 

속성을 실행 가능하게(따라서 테스트 가능) 만들기 위해 Foundry로 작성되고 해당 fuzzer에서 실행할 준비가 된 속성 기반 테스트를 선택했습니다. 미래에는 주어진 볼트가 가능한 모든 입력 및 조건에 대한 속성을 충족하는지 공식적으로 확인하기 위해 기호 실행 또는 모델 검사 도구로 실행할 수도 있습니다.

우리는 다른 비즈니스 로직을 구현하는 광범위한 볼트에 적용할 수 있을 만큼 충분히 일반적으로 속성을 작성했습니다. 우리는 공개 인터페이스 기능만 사용하여 구현 세부 사항에 구애받지 않도록 했습니다. (단, 이러한 제한으로 인해 구현별 내부 데이터를 참조하는 특정 표준 요구 사항은 속성에서 생략되었습니다.)

예를 들어 다음 속성은 요구 사항 중 하나에 해당합니다. convertToShares() 기능, "호출자에 따라 변형을 표시하면 안 됩니다(MUST NOT)..” 두 계정 주소와 금액이 주어지면 각 계정을 호출합니다. convertToShares() 동일한 금액으로 두 반환 값이 동일한지 확인합니다. 이 속성은 구현 세부 정보와 무관합니다. convertToShares(), 볼트에 따라 다르며 ERC4626을 구현하는 모든 볼트에서 충족되어야 합니다. 이 속성은 특정 입력 값(단위 테스트의 경우), 많은 임의 입력(퍼즈 테스트의 경우) 또는 기호 값(기호적 실행 및 형식 검증의 경우)을 제공하여 실행할 수 있습니다. 로컬로 실행하거나 메인넷 포크에 대해 실행할 수도 있습니다(통합 테스트용).

사용 사례: 반올림 오류를 테스트하는 속성

예를 들어 반올림 오류는 일련의 의미를 가질 수 있는 (사소해 보이는) 버그의 중요한 클래스입니다. ERC4626의 기본 회계 논리(예: 발행할 주식 수 또는 인출할 자산 금액 계산)는 고정 소수점 산술을 사용하여 구현되며 반올림 오류는 불가피합니다. 을 위한 보안그러나 표준은 각 인터페이스 기능에 대해 선호하는 반올림 방향을 명시적으로 지정하고 오류 범위는 지정되지 않고 구현에 따라 다릅니다. 구체적으로, deposit()redeem() 함수는 반환해야 합니다 아래에-정확한 값의 근사치인 반면 mint()withdraw() 함수는 반환해야 합니다 위에-근사. 예를 들어, 현재 주가(즉, 주당 자산의 양)가 2라면, deposit() 3 wei 자산으로 최대 1 wei 주식만 발행해야 합니다(즉, floor(3/2)), 동안 withdraw() 3 wei 자산으로 최소 2 wei 주식을 소각해야 합니다(즉, ceil(3/2)).

반올림 관련 속성을 블랙박스로 처리하여 기본 회계 논리와 독립적으로 작성했습니다. 특히, 두 개의 반대 기능 간의 관계를 설명하는 소위 "왕복" 속성으로 공식화했습니다. 예를 들어 다음 속성은 N주를 발행하여 에스크로된 자산을 인출할 때 N주 이상을 소각해야 한다고 지정합니다. 즉, 반복적으로 발행과 출금을 하여 자산과 금고 주식을 왔다갔다 하여 공짜로 이익을 얻을 수 있는 사람은 아무도 없습니다.

ERC4626 속성 테스트의 스니펫

실제로 우리는 메인넷의 여러 ERC4626 볼트가 반올림 오류로 인해 위의 속성을 충족하지 못하는 것을 발견했습니다. 이것은 예를 들어 누구나 간단하게(그리고 반복적으로) 발행 및 출금하여 금고를 천천히 비우면 1개의 사토시 BTC(작성 당시 0.02사토시 ~= XNUMX센트)를 얻을 수 있음을 의미합니다. 이것은 실제로 매우 낮은 가스 수수료를 누리는 체인(예: Fantom)에서 또는 자산 가격이 미래에 충분히 높아지면 수익을 낼 수 있습니다.

야생에서 ERC4626 표준 테스트

우리는 메인넷에서 ~100개의 ERC4626 볼트에 대해 속성을 테스트했으며 대부분 반올림 오류로 인해 표준 요구 사항을 따르지 않는 많은 볼트를 발견했습니다(예: 천장이 필요한 경우 바닥 반올림 사용). 특히, 특정 금고는 요청한 정확한 수의 주식을 발행하지 못했습니다. mint() 표준이 명시적으로 요구하지만 . 그들 중 일부는 또한 일관성 없는 Deposit 기록된 데이터가 실제로 발행된 데이터와 다른 이벤트. 놀랍게도 일부 금고는 그 자리에서 전혀 주조되지 않았습니다. 대신, 그들은 단지 mint 요청을 대기열에 넣고 나중에 일괄 처리에서 별도의 트랜잭션으로 처리합니다.

이러한 다양한 동작은 그 자체로 악용할 수 없었지만 표준 동작만 예상하는 다른 시스템에 통합될 때 취약해질 수 있습니다. 이러한 문제로 인해 볼트 통합이 훨씬 더 어려워지고 잠재적으로 진행 중인 노력을 무력화하고 표준화 이면에 동기를 부여할 수 있습니다.

속성 테스트 및 표준 준수를 위한 기타 실행 가능한 단계 사용

표준을 정확하게 따르면 다양한 동작을 방지할 수 있습니다(이상적으로는 배포되기 전에). 몇 가지 추가 작업 항목과 함께 우리의 속성이 도움이 되기를 바랍니다. ERC4626 볼트를 개발 및/또는 통합하는 사람들을 위해:

  • 우리는 우리의 재산을 운영하는 것이 좋습니다 테스트 당신의 금고에 대해. 표준에 대한 명백한 위반 사항이 있는 경우 신속하게 문제를 찾습니다.
  • 우리는 또한 우리의 속성 표준 요구 사항에 대한 이해를 교차 확인하고 의도하지 않은 불일치가 있는 경우 구현을 조정합니다.
  • 볼트가 표준과 달라야 하는 경우 비표준 동작을 명확하게 문서화하여 다른 사용자가 볼트와 통합할 때 이러한 편차를 적절하게 처리할 수 있도록 하는 것이 좋습니다. 이것은 최후의 수단으로 간주되어야 합니다.

***
ERC4626 볼트는 가까운 장래에 DeFi의 중요한 빌딩 블록이 될 가능성이 있으며 구성 가능성을 위해 신규 및 기존 볼트가 표준을 따르는 것이 중요합니다. 표준에 따라 새로운 구현이 나타날 것이므로 기존 볼트를 표준화하기에 지금보다 더 좋은 시기는 없습니다. 

이상적인 상태(서로 다른 볼트를 균일하게 구성할 수 있는 상태)로 작업할 때 ERC4626 속성 테스트를 실행하여 볼트 구현에서 표준 위반을 보다 쉽게 ​​감지할 수 있습니다. 속성 테스트(문서 및 예제 포함)는 모두 Github에서 공개적으로 사용할 수 있습니다. 저장소. 여러분의 피드백과 기여를 환영합니다!

***
여기에 표현된 견해는 인용된 개별 AH Capital Management, LLC("a16z") 직원의 견해이며 16z 또는 그 계열사의 견해가 아닙니다. 여기에 포함된 특정 정보는 16z가 관리하는 펀드의 포트폴리오 회사를 포함하여 제16자 출처에서 얻은 것입니다. 신뢰할 수 있는 출처에서 가져왔지만 16z는 이러한 정보를 독립적으로 확인하지 않았으며 정보의 현재 또는 지속적인 정확성 또는 주어진 상황에 대한 적절성에 대해 어떠한 진술도 하지 않습니다. 또한 이 콘텐츠에는 타사 광고가 포함될 수 있습니다. XNUMXz는 그러한 광고를 검토하지 않았으며 여기에 포함된 광고 콘텐츠를 보증하지 않습니다.

이 콘텐츠는 정보 제공의 목적으로만 제공되며 법률, 비즈니스, 투자 또는 세금 관련 조언에 의존해서는 안 됩니다. 그러한 문제에 관해서는 자신의 고문과 상의해야 합니다. 증권 또는 디지털 자산에 대한 언급은 설명을 위한 것일 뿐이며 투자 추천이나 투자 자문 서비스 제공을 의미하지 않습니다. 또한, 이 콘텐츠는 투자자 또는 예비 투자자를 대상으로 하거나 사용하도록 의도되지 않았으며, 어떤 상황에서도 a16z가 관리하는 펀드에 투자하기로 결정할 때 의존할 수 없습니다. (16z 펀드에 대한 투자 제안은 사모 투자 각서, 청약 계약서 및 해당 펀드의 기타 관련 문서에 의해서만 이루어지며 전체 내용을 읽어야 합니다.) 언급되거나 언급된 모든 투자 또는 포트폴리오 회사 설명된 내용은 16z가 관리하는 차량에 대한 모든 투자를 대표하는 것은 아니며 투자가 수익성이 있거나 미래에 수행되는 다른 투자가 유사한 특성 또는 결과를 가질 것이라는 보장이 없습니다. Andreessen Horowitz가 관리하는 펀드의 투자 목록(발행자가 16z가 공개적으로 공개하도록 허가하지 않은 투자 및 공개적으로 거래되는 디지털 자산에 대한 미고지 투자 제외)은 https://a16z.com/investments에서 볼 수 있습니다. /.

내부에 제공된 차트와 그래프는 정보 제공의 목적으로만 사용되며 투자 결정을 내릴 때 의존해서는 안 됩니다. 과거의 성과는 미래의 결과를 나타내지 않습니다. 내용은 표시된 날짜 현재만 말합니다. 이 자료에 표현된 모든 예측, 추정, 예측, 목표, 전망 및/또는 의견은 예고 없이 변경될 수 있으며 다른 사람이 표현한 의견과 다르거나 반대될 수 있습니다. 추가 중요 정보는 https://a16z.com/disclosures를 참조하십시오.

spot_img

최신 인텔리전스

spot_img