숨겨진 소유자 권한: '검증된' 계약 내 위험한 관리 기능

— By Tony Rabbit in Tutorials

숨겨진 소유자 권한: '검증된' 계약 내 위험한 관리 기능

검증된 소스 코드가 토큰이 안전하다는 것을 의미하지는 않습니다. 모든 계약의 쓰기-함수 목록을 감사하고, blacklist() 및 pause()와 같은 소유자 전용 권한을 찾아내며, 무해한 관리 도구와 홀더를 가두는 백도어를 구별하는 방법을 알아보세요.

스마트 계약의 숨겨진 소유자 권한은 토큰 배포자가 이미 구매한 후에 규칙을 변경할 수 있도록 하는 관리자 전용 기능이며, 블록 탐색기에서 완벽하게 깨끗해 보이는 계약에서도 일상적으로 발견됩니다. 위험한 부분은 소스 코드 검증이 게시된 코드가 온체인 바이트코드와 일치한다는 것만 증명한다는 것입니다. 해당 코드가 무엇을 할 수 있는지에 대해서는 아무것도 말해주지 않습니다. 계약은 검증되고, 감사되고, 심지어 부분적으로 소유권이 포기되었더라도 소유자가 지갑을 동결하거나, 판매를 제한하거나, 아무것도 없는 상태에서 새로운 공급을 발행할 수 있는 기능을 여전히 가질 수 있습니다. 이 가이드는 용어집이 아닌 실습 감사입니다. 어떤 기능을 찾아야 하는지, 탐색기에서 어떻게 읽어야 하는지, 그리고 일상적인 관리 도구와 함정을 구별하는 방법을 정확히 배우게 될 것입니다.

핵심 요약

  • 검증은 코드가 바이트코드와 일치함을 증명하며, 코드가 안전하다는 것을 증명하지 않습니다.
  • blacklist(), pause(), 및 거래 토글은 판매 주문을 영구적으로 동결할 수 있습니다.
  • mint 백도어는 개발자가 유동성 풀을 건드리지 않고도 홀더를 희석시킬 수 있게 합니다.
  • 탐색기의 Write 탭을 읽고 누가 호출할 수 있는지, 무엇을 변경하는지에 따라 기능을 판단하세요.

검증되거나 부분적으로 소유권이 포기된 계약이 여전히 위험할 수 있는 이유

검증은 투명성 기능이지 안전 보증이 아닙니다. 프로젝트가 계약을 검증하면, 탐색기는 제출된 소스를 컴파일하고 이미 배포된 정확한 바이트코드를 생성하는지 확인합니다. 이는 헥스 코드를 쳐다보는 대신 계약이 무엇을 하는지 읽을 수 있게 해주므로 진정으로 유용합니다. 그러나 악의적인 개발자도 검증을 원합니다. 깨끗하고 읽기 쉬운 계약이 검증되지 않은 계약보다 더 빨리 신뢰를 구축하기 때문입니다. 많은 사기 프로젝트가 의도적으로 검증된 코드를 배포합니다. 이 구분에 대해 명확하지 않다면, 검증된 계약이 실제로 의미하는 것에 대한 저희 설명서가 자세히 한계를 설명합니다.

소유권 포기에도 비슷한 간극이 있습니다. 개발자는 표준 소유자 역할을 포기하고도 로직에 하드코딩된 두 번째 특권 주소를 유지하거나, 위험한 설정자가 이미 피해를 입힌 후에만 포기할 수 있습니다. 또한 위험한 기능이 누구든지 호출할 수 있도록 작성되었거나, 애초에 소유권 뒤에 숨겨져 있지 않았다면 소유권 포기는 아무런 의미가 없습니다. 소유권 포기를 청신호로 간주하기 전에 소유권이 포기된 계약이 실제로 증명하는 것에 대한 저희 분석을 읽어보세요. 솔직한 요약: 검증되고 소유권이 포기된 것은 시작점이지 최종 판결이 아닙니다.

스마트 계약에서 찾아야 할 숨겨진 소유자 권한

대부분의 홀더를 가두는 권한은 소유자 전용 기능 몇 가지에 있습니다. 이 이름들을 알면 1-2분 안에 계약을 스캔할 수 있습니다. 개발자들이 종종 이름을 변경하므로, 라벨뿐만 아니라 동작으로 판단해야 합니다.

  • blacklist() / setBlacklist() / addBot()은 특정 지갑을 표시하여 전송하거나 판매할 수 없게 합니다. 개발자는 구매자가 진입한 직후 블랙리스트에 추가하여, 그들이 절대 팔 수 없는 토큰을 보유하게 만들 수 있습니다.
  • setMaxTx() / setMaxWallet()은 한 거래에서 이동할 수 있는 양을 제한합니다. 아주 작은 값으로 설정되면, 의미 있는 판매는 불가능해지지만 구매는 계속 흐릅니다.
  • enableTrading() / setTradingEnabled()는 전송이 작동하는지 여부를 토글합니다. 출시 후 거래가 꺼질 수 있다면, 언제든지 출구가 닫힐 수 있습니다.
  • mint() 또는 공급을 증가시키는 모든 기능은 모든 홀더를 희석시키는 백도어입니다. 이것이 개발자가 유동성을 전혀 건드리지 않고 가치를 고갈시키는 방법입니다.
  • pause() / unpause()는 모든 토큰 활동을 중단시킵니다. 진정한 안전 일시 중지는 이론적으로는 괜찮지만, 잘못된 손에 들어가면 전체 시장의 동결 버튼이 됩니다.
  • setFee() / setTaxes()는 구매 또는 판매 세금을 변경합니다. 코드에서 하드캡을 찾으세요. 소유자가 99%의 판매 세금을 설정할 수 있다면, 모든 판매는 사실상 몰수됩니다.

블록 탐색기에서 쓰기-함수 목록을 읽는 방법

블록 탐색기에서 토큰을 열고, Contract 탭으로 이동하여 Write Contract (또는 토큰이 프록시 패턴을 사용하는 경우 Write as Proxy)를 선택합니다. 이 목록은 계약이 노출하는 상태 변경 작업의 전체 메뉴입니다. 각 항목을 이름으로 읽고 세 가지 질문을 하세요: 무엇을 변경하는가, 누가 호출할 수 있는가, 그리고 설정할 수 있는 값에 제한이 있는가.

함수를 호출할 수 있는 사람을 확인하려면, Read Contract 탭으로 전환하여 owner()를 찾아 현재 소유자 주소를 확인합니다. 0 주소(0x000...000)를 반환하면 소유권이 포기된 것입니다. 그런 다음 Code 탭에서 함수 정의를 찾아 onlyOwner 수정자 또는 호출자를 제한하는 require 문을 확인합니다. 잔액이나 수수료를 변경하는 접근 제어가 없는 함수는 심각한 위험 신호입니다. Solidity 읽기가 강점이 아니라면, 자동화된 스캐너가 이 분류를 대신 수행하며, 스마트 계약 분석을 위한 최고의 무료 도구에 대한 저희 요약은 특권 기능을 자동으로 플래그하는 도구들을 다룹니다.

기능소유자가 할 수 있는 일위험 수준
blacklist()선택된 지갑이 판매 또는 전송하는 것을 차단높음
mint()새 토큰을 생성하고 모든 홀더를 희석높음
pause()모든 전송 및 거래 중단높음
setFee() (제한 없음)판매 세금을 100%까지 인상높음
setMaxTx()최대 판매 규모를 거의 0으로 축소중간
setFee() (낮게 제한됨)안전한 하드코딩된 제한 내에서 세금 조정낮음

각 권한이 개발자에게 허용하는 것, 유동성을 건드리지 않고 러그 풀하는 것을 포함하여

고전적인 러그 풀은 유동성 풀을 고갈시키며, LP가 잠금 해제되어 있다면 종종 예측할 수 있습니다. 숨겨진 소유자 권한은 유동성을 전혀 건드리지 않는 더 조용한 버전을 가능하게 합니다. 작동하는 blacklist()를 사용하면, 개발자는 모든 사람이 구매하도록 허용하고, 가격이 오르는 것을 지켜본 다음, 홀더를 블랙리스트에 추가하여 팀만 매수 수요에 맞춰 판매할 수 있게 합니다. 풀은 가득 차 있고 차트는 판매가 되돌려지는 순간까지 건강해 보입니다. 제한 없는 setFee()는 모든 판매의 거의 전부를 팀 지갑으로 라우팅하여 동일한 결과를 달성합니다. mint() 백도어는 가장 느리고 가장 부인하기 쉬운 방법입니다. 소유자가 조용히 엄청난 양의 새로운 할당을 발행하고 점진적으로 판매하여, 계약이 여전히 일반적인 유동성 검사를 통과하는 동안 홀더를 희석시킵니다. 이러한 방법들은 LP를 인출할 필요가 없기 때문에 유동성 제거만 감시하는 도구를 종종 통과합니다. 이것이 저희의 더 넓은 러그 풀 체크리스트와 함께 기능 수준 검토가 중요한 이유입니다.

무해한 관리 기능과 홀더를 가두는 기능 구별하기

모든 소유자 전용 기능이 위협적인 것은 아닙니다. 많은 합법적인 토큰은 좋은 이유로 관리 도구를 유지하며, 목표는 편집증이 아니라 조정입니다. 세 가지 테스트가 일상적인 기능과 함정을 구별합니다. 첫째, 위험한 상태가 이미 안전한 방향으로 잠겨 있는가? 거래 토글은 거래가 영구적으로 켜져 있고 기능이 더 이상 비활성화할 수 없을 때 괜찮습니다. 둘째, 하드코딩된 상한선이 있는가? 예를 들어 10%를 초과할 수 없는 setFee()는 방어할 수 있지만, 상한선이 없는 것은 그렇지 않습니다. 셋째, 소유권이 포기되었거나 타임락 또는 멀티시그로 이전되었는가? 단일 개인이 즉시 트리거할 수 없는 권한은 익명의 EOA에 의해 제어되는 권한보다 훨씬 덜 위험합니다. 진정으로 양성인 예로는 출시 시 한 번 켜지고 끌 수 없는 일회성 enableTrading(), 라우터 및 계약 자체를 위한 excludeFromFee(), 그리고 유동성 풀이 아닌 수수료 지갑으로 제한된 인출 기능이 있습니다. 이 판단을 토큰 구매 전 안전성 확인 방법에 대한 저희의 더 넓은 가이드와 함께 사용하여 계약 읽기가 여러 입력 중 하나가 되도록 하세요.

빠른 소유자 권한 감사 체크리스트

어떤 토큰을 구매하기 전에 이 순서를 실행하세요. 몇 분이면 가장 흔한 함정을 잡을 수 있습니다:

  • 계약이 검증되었는지 확인하여 소스를 실제로 읽을 수 있는지 확인합니다.
  • Write Contract 탭을 열고 모든 상태 변경 기능을 나열합니다.
  • blacklist, pause, mint, 거래 토글, max-tx, 및 수수료 설정자를 플래그합니다.
  • 각 플래그에 대해 접근 제어를 확인합니다: 누가 호출할 수 있으며 소유권이 포기되었는지, 타임락되었는지, 또는 멀티시그인지.
  • 세금 설정자에 하드코딩된 상한선이 있는지, 그리고 그 상한선이 무엇인지 확인합니다.
  • 어떤 거래 토글도 출시 후 다시 끌 수 없는지 확인합니다.
  • 놓친 것이 있는지 자동화된 스캐너와 교차 확인합니다.
  • 단일 익명 지갑이 판매를 동결하거나, 세금을 무제한으로 인상하거나, 공급을 발행할 수 있다면, 아무리 깨끗해 보여도 해당 토큰을 고위험으로 간주합니다.

당신을 보호하는 원칙은 간단합니다: 계약을 소유자가 무엇을 할 수 있는지로 판단하고, 계약이 달고 있는 배지로 판단하지 마세요. 검증되고 소유권이 포기된 것은 입력이지 결론이 아닙니다. Write 탭을 읽는 것이 습관이 되면, 숨겨진 레버는 더 이상 숨겨지지 않습니다.

이 기사는 교육 목적으로만 제공되며 재정적 조언이 아닙니다.