스캠코인 구별법을 찾아보면 거의 빠짐없이 나오는 항목이 있어요. "컨트랙트에 오너 권한 함수가 있으면 위험하다", "소유권을 포기했는지 확인하라" 같은 것들이죠.
그 체크리스트를 실제 코드에 돌려 봤어요. 결과부터 말하면 USDT와 DAI가 걸립니다. 시가총액 상위 스테이블코인 둘이요.
![]()
코드를 직접 받아 함수 선택자를 뒤졌어요
2026년 9월 18일에 이더리움 메인넷 토큰 7종의 계약 코드를 공개 노드에서 인증 없이 받아, 그 안에 위험 목록에 자주 오르는 함수의 4바이트 선택자가 들어 있는지 전수로 찾았어요.
| 토큰 | 코드 크기 | 발견된 오너 권한 함수 |
|---|---|---|
| USDT | 11,075바이트 | pause(), owner(), transferOwnership() |
| DAI | 7,904바이트 | mint() |
| PEPE | 4,517바이트 | owner(), renounceOwnership(), transferOwnership() |
| USDC | 2,186바이트 | (없음) |
| WETH | 3,124바이트 | (없음) |
| LINK | 3,153바이트 | (없음) |
| SHIB | 4,852바이트 | (없음) |
읽는 순서를 뒤집어 보세요. 흔한 체크리스트대로라면 USDT가 가장 위험하고, USDC가 가장 안전해요.
USDC를 한 겹 더 열어 봤더니 정반대였어요
USDC의 코드가 2,186바이트뿐인 게 이상해서 더 파 봤어요. 그 주소는 프록시였어요. 확인한 근거는 이래요.
- 프록시 코드 안에 delegatecall 옵코드가 들어 있어요. 호출을 다른 주소로 넘긴다는 뜻이에요.
- implementation(), upgradeTo(address), upgradeToAndCall(address,bytes) 선택자가 모두 들어 있어요.
- 구현체 주소를 담는 저장소 칸을 직접 읽으니
0x43506849d7c04f9138d1a2050bbf3a0c054402dd가 나왔어요.
그 구현체 주소의 코드는 23,464바이트, 프록시의 열 배가 넘어요. 그 안에서 같은 선택자들을 다시 찾아 보니 이렇게 나왔어요.
| 함수 | 프록시(2,186B) | 구현체(23,464B) |
|---|---|---|
| mint(address,uint256) | 없음 | 있음 |
| pause() | 없음 | 있음 |
| blacklist(address) | 없음 | 있음 |
| owner() | 없음 | 있음 |
체크리스트가 가장 안전하다고 점수를 준 토큰이 실제로는 네 개를 다 갖고 있었어요. 그중 blacklist(address) 는 특정 주소를 지정해 막는 함수로, USDT가 가진 셋에는 없던 항목이에요. 게다가 upgradeTo 가 있으니 구현체 자체를 나중에 갈아끼울 수도 있어요.
정리하면 체크리스트는 한 번에 두 방향으로 다 틀렸어요. 정상 토큰을 위험으로 찍고(USDT·DAI), 권한이 더 많은 토큰을 안전으로 통과시켰어요(USDC). 후자가 훨씬 나쁜 오류예요. 앞의 경우는 한 번 더 확인하게 만들지만, 뒤의 경우는 확인을 멈추게 만들거든요.
이 표에서 "없음"이 뜻하는 것을 정확히 적어 둘게요. 없다는 뜻이 아니라 "내가 읽은 이 주소에는 없다"는 뜻이에요.
투자 정보 안내
본 글은 암호화폐 시장에 대한 객관 데이터·정보 제공 목적이며, 특정 코인 매수·매도 권유가 아닙니다. 암호화폐는 변동성이 매우 크고 원금 전액 손실이 가능하므로 본인 판단과 책임 하에 결정하세요.
그 함수들은 왜 거기 있나
각각 이유가 있어요.
- USDT의 pause() 는 해킹이나 법적 동결 상황에서 발행사가 전송을 멈추기 위한 장치예요. 실제로 도난 자금을 묶는 데 쓰여 왔어요.
- DAI의 mint() 는 담보를 맡기면 새 DAI가 생기는 구조 자체예요. 발행 함수가 없으면 이 코인은 작동하지 않아요.
- PEPE의 renounceOwnership() 은 오히려 권한을 버리기 위한 함수예요. 이 함수가 있다는 것은 포기할 수단이 있다는 뜻이고, 실제로 포기했는지는 코드가 아니라 현재 오너 주소를 조회해야 알 수 있어요.
그래서 정확한 질문은 "그 함수가 있느냐"가 아니라 이 셋이에요.
- 누가 쥐고 있나. 오너가 개인 지갑 한 개인지, 여러 명이 서명해야 움직이는 지갑인지, 시간 지연이 걸린 계약인지.
- 쓰면 무슨 일이 생기나. 전송이 멈추는 정도인지, 내 잔액이 0이 될 수 있는지, 수수료를 100%로 올릴 수 있는지.
- 바꿀 수 있나. 프록시라서 로직 전체를 나중에 갈아끼울 수 있는지.
3번이 가장 무섭고 가장 자주 빠져요. 로직을 교체할 수 있으면 오늘 코드를 아무리 꼼꼼히 읽어도 내일의 코드를 보증하지 못해요.
그럼 무엇을 봐야 하나
코드를 읽을 줄 몰라도 순서대로 확인할 수 있는 것들이 있어요. 위에서 무너진 체크리스트 대신 이 순서를 권해요.
첫째, 이 주소가 프록시인지 먼저 봐요. 프록시면 읽어야 할 코드가 다른 곳에 있어요. 코드 크기가 2천 바이트 남짓으로 유독 작으면 의심하고, implementation() 이나 upgradeTo 가 보이는지 확인하세요. 위에서 USDC가 정확히 그 경우였어요.
둘째, 오너 주소를 조회하고 그 주소가 무엇인지 봐요. 여기서 갈리는 게 크거든요. 단일 지갑이면 그 한 사람이 언제든 쓸 수 있고, 여러 명 서명 지갑이면 담합이 필요하고, 시간 지연 계약이면 쓰기 전에 공개적으로 예고가 돼요. 같은 권한이라도 이 셋은 완전히 다른 위험이에요.
셋째, 실제로 팔린 적이 있는지 봐요. 허니팟은 사는 것은 되고 파는 것만 막는 구조예요. 코드를 읽는 것보다 최근 거래에서 매도가 성사된 기록이 있는지 확인하는 게 빠르고 확실해요. 매수만 줄줄이 있고 매도가 없으면 그 자체가 신호예요.
넷째, 유동성이 잠겨 있는지와 얼마나 남았는지 봐요. 러그풀은 대부분 코드 권한이 아니라 유동성 회수로 일어나요. 잠금 기간이 끝나는 날짜를 보세요.
다섯째, 보유 분포를 봐요. 상위 몇 개 주소가 대부분을 들고 있으면, 코드가 완벽해도 그 주소가 파는 날 가격이 사라져요.
투자 정보 안내
본 글은 암호화폐 시장에 대한 객관 데이터·정보 제공 목적이며, 특정 코인 매수·매도 권유가 아닙니다. 암호화폐는 변동성이 매우 크고 원금 전액 손실이 가능하므로 본인 판단과 책임 하에 결정하세요.
이 확인을 직접 해 보려면
특별한 도구가 필요하지 않아요. 이 글의 표는 두 단계로 만들었어요.
첫째, 계약 코드를 받아요. 이더리움 공개 노드에 주소를 주고 코드를 달라고 하면 됩니다. 인증도 계정도 필요 없어요. 돌아오는 것은 사람이 읽을 수 있는 소스가 아니라 기계어 덩어리예요.
둘째, 그 덩어리 안에서 함수 이름의 지문을 찾아요. 계약 안의 함수는 이름 대신 4바이트 지문으로 불려요. 이 글에서 쓴 지문 세 개를 그대로 적어 둘게요.
| 함수 | 4바이트 지문 |
|---|---|
pause() | 8456cb59 |
mint(address,uint256) | 40c10f19 |
blacklist(address) | f9f92be4 |
이 지문이 코드 안에 있는지 문자열로 찾으면 되고, 지문은 함수 이름과 인자 형식만 알면 누구나 계산할 수 있어요. 그래서 이 표는 누가 다시 해도 같은 값이 나와요.
이 방법의 한계도 그대로 따라와요. 지문이 있다는 것은 그 함수가 코드에 등장한다는 뜻일 뿐이고, 바깥에서 부를 수 있는지, 부르면 누가 막는지는 알려주지 않아요. 그래서 이건 시작점을 찾는 도구이지 판정 도구가 아니에요.
자동 점검 도구를 쓸 때 조심할 것
요즘은 주소를 넣으면 점수를 내주는 도구가 많아요. 쓰는 건 좋지만 두 가지를 기억하세요.
점수가 낮게 나오면 의심하되, 높게 나온 것을 안전으로 읽지 마세요. 위에서 본 것처럼 프록시는 검사기가 볼 게 적어서 오히려 깨끗하게 나와요. "검사해서 문제없음"과 "검사할 수 없었음"이 같은 화면으로 표시되는 것이 이 도구들의 공통 약점이에요.
그리고 도구가 보는 것은 지금의 코드예요. 배포 뒤에 로직을 바꿀 수 있는 구조라면 어제의 점수는 오늘을 보증하지 않아요. 상장 직후 점검해서 통과했던 토큰이 며칠 뒤 문제가 되는 사례가 여기에서 나와요.
이 글의 측정이 증명하지 않는 것
정직하게 적어 둘게요.
- 7종은 표본이 아니에요. 체크리스트가 정상 토큰을 위험으로 찍는 사례가 실재한다는 것까지만 보였어요. 전체에서 얼마나 자주 그러는지는 재지 않았어요.
- 선택자 검색은 존재 여부만 봐요. 그 함수가 실제로 호출 가능한지, 접근 제어가 어떻게 걸려 있는지는 코드를 더 읽어야 알아요. 선택자가 있어도 내부에서만 쓰이는 경우가 있어요.
- "없음"은 안전의 증거가 아니에요. 이 글에서 가장 중요한 한 줄이고, USDC가 그 증거예요. 프록시거나, 이름이 다른 함수로 같은 일을 하거나, 선택자가 다르게 배치될 수 있어요.
- 어떤 토큰도 안전하거나 위험하다고 판정하지 않았어요. 네 토큰 모두 발행사가 공개한 구조대로 작동하고 있고, 그 권한이 실제로 어떻게 통제되는지는 코드 밖의 문제예요. 이 글이 보인 것은 체크리스트가 그 구분을 못 한다는 사실이에요.
거래소가 붙이는 주의 종목과 상장폐지 표시를 읽는 방법은 상장폐지·주의종목 지정 대응 쪽을, 이미 승인해 둔 권한을 회수하는 절차는 토큰 승인 취소와 지갑 드레이너 쪽을, 스테이블코인이 흔들릴 때 먼저 보이는 신호는 스테이블코인 디페그 조기 경보 쪽을 참고하세요.
정리하면 이래요. 스캠코인 구별법에서 가장 흔한 실수는 "기능의 존재"를 "악의의 증거"로 바꿔 읽는 것이에요. 발행 함수가 있어야 작동하는 코인이 있고, 정지 함수로 도난 자금을 묶는 코인이 있어요. 봐야 하는 것은 함수 목록이 아니라 그 권한을 누가 쥐고 있고, 쓰면 내 잔액에 무슨 일이 생기는가입니다.
이 글은 어떤 코인도 매수나 매도 대상으로 지목하지 않고 진입가나 목표가를 제시하지 않아요. 계약 코드와 권한 구조는 언제든 바뀔 수 있으니 실제 판단 전에는 직접 확인하세요. 정보 제공 목적이며 투자 권유가 아닙니다.