Website · Image — 필드 인벤토리와 추론 지도
URL 하나에서 무엇을 얻고, 각 필드에서 무엇을 추론하는가 · 실측 모수 = website fetch ok 1,886건 / 고유 토큰 4,870개
이 문서가 소셜 7종 문서와 다른 점website·image 는 Creator/Content/Venue 3객체 밖이다 — 작성자도, 발행 시각도, 참여 지표도 없다. 그래서 소셜 문서의 축(URL → sourceType → 필드)이 맞지 않는다.
대신 이 문서의 축은 필드 → 추론할 수 있는 것이다. 스키마상 위치는 엔티티가 아니라 토큰의 지문(tokens.fingerprints[])이다.
실측 표기 — a / b / c 형식은 세 시간분할(IS 6/19-21 · OOS 6/22-24 · OOS 6/24-27)의 값이다. ⚠️ 세 분할은 rug 라벨의 mcSource 가 달라(af-trade vs raw-flow) 분할 간 절대 비교는 무효이고, 각 분할 안에서의 방향만 근거로 쓴다.
1. 어디서 오나 — 무료 소스 3개
셋은 독립 best-effort다. 하나만 성공해도 ok, 셋 다 실패해야 not_found. 그래서 필드별 채움률이 제각각이다.
| 소스 | 비용 | 어떻게 | 무엇을 주나 | 필드 |
|---|
| RDAP | 무료 | https://rdap.org/domain/{apex} | 도메인 등록 정보. 3소스 중 커버리지 최고(81~82%) | domainCreatedDate · domainExpiryDate · registrar |
| HTML / OG | 무료 | 페이지를 평범한 GET(최대 3MB) 후 정규식 파싱 | 페이지가 자기 정체를 신고하는 메타 태그. SPA 면 거의 빈손 | isNews · ogTitle · ogSiteName · publishedTime · discoveredLinks |
| urlscan | 무료(search) | urlscan.io 스캔 DB 조회 — 우리가 스캔을 제출하는 게 아님 | 인증서 · 호스팅 · 페이지 지문. ⚠️ 과거 스캔 결과라 scanTime 확인 필수 | certValidFrom · ip/asn/server · technologies · bodyHashes · trackingIds |
2. website 필드 인벤토리 — 각 필드에서 추론하는 것
채움% = website fetch 성공 1,886건 중 값이 실제로 온 비율. 등급 — A 고유가치 / B 사용가능 / C 군집용 / 호스팅속성(운영자 아님) / 버림 / 철회권고.
| 필드 | 소스 | 채움% | 실제 값 예 | 변동성 | 추론할 수 있는 것 | 등급 |
|---|
domainCreatedDate | RDAP | 81.7% | 2024-12-24T03:29:28Z | immutable | 도메인 나이(fetch − 등록)의 원천. ①731일+ → 남의 사이트(실측 rug 84/80/86%, 3분할 일관) ②2-7일 → 런칭에 맞춰 산 자기 사이트(rug 58/73/80%). 직관과 반대로 오래될수록 나쁘다 | A 고유가치 |
domainExpiryDate | RDAP | 81.6% | 2036-01-28T03:03:04Z | immutable | 등록 기간(expiry − created) → 1년 = 단기 의도 / 10년 = 장기 운영. ⚠️ 지금 이 파생을 안 만들고 있다 — 데이터는 이미 81% 확보돼 공짜 | B 사용가능 |
registrar | RDAP | 82.2% | 1068(273건) · 146 · 625 | mutable | 등록대행사. 🔴 한때 무신호로 판정했으나 재검정에서 뒤집혔다 — 그 테스트는 '같은 대행사를 2개 이상이 쓰나'였는데 고유값이 64종뿐이라 98.6%가 공유 그룹이었다(대조군 20건 = 검정력 없음). 카테고리로 재검정하니 1910·292 가 OOS 두 분할에서 rug +7~8pp. 3분할 일관은 아니나 버릴 근거가 없다. ⚠️ IANA 숫자 ID라 이름 매핑 테이블 필요 | B 사용가능 |
certValidFrom | urlscan | 53.0% | 2026-05-21T08:11:42Z | immutable | 서비스 개시 하한. domainCreatedDate와 크게 갈리면 → 만료 도메인 인수·재사용. 등록은 2007년인데 인증서가 지난달이면 그 사이 방치됐던 것 | B 사용가능 |
certIssuer | urlscan | 53.0% | WE1(239) · YR2 · YR1 | mutable | 발급기관(WE1=Google Trust). 🔴 재검정 결과 YR2 가 3분할 전부 rug +5.0 / +5.5 / +10.4 — 무신호가 아니다. 이전 '분산 없음' 판정은 registrar 와 같은 저검정력 오독이었다. 6 B 라 유지 비용도 없다 | B 사용가능 |
scanTime | urlscan | 57.3% | 2026-02-20T13:49:25Z | immutable | 🔴 urlscan 계열 전 필드의 as-of 앵커. 우리 fetch 시각이 아니라 urlscan 이 그 사이트를 마지막으로 스캔한 시각 — 수개월 과거일 수 있다. 이걸 안 보면 인프라 필드 전체가 시점 불명이 된다 | A 고유가치 |
scanUuid 🆕 | urlscan | (미추출) | raw.task.uuid — 응답에 이미 있으나 안 꺼냄 | immutable | 미검증 필드 전체의 복구 경로. https://urlscan.io/api/v1/result/{uuid}/ 로 그 스캔의 원본 전체를 되받는다 → bodyHashes·globalNames·linkDomains 를 지금 저장하지 않아도 나중에 필요해지면 복구 가능. 40 B 로 2,596 B 를 대체한다. ⚠️ urlscan 이 그 스캔을 보존하는 한에서만 유효 — 그래서 검증된 신호는 그대로 저장하고 uuid 는 백업으로만 쓴다 | A 고유가치 |
isNews | HTML | 76.0% | true 15.1% | immutable | og:type=article 또는 NewsArticle → 뉴스 기사 페이지. 즉 website 가 프로젝트 홈이 아니라 기사 링크. 실측 rug 80/89/100% · ≥100k 2/5/0% — 3분할 단조 악화 | A 고유가치 |
ogTitle | HTML | 46.0% | Grand Theft Auto VI - Rockstar | immutable | 페이지 제목. 토큰명/티커와 대조 → 무관하면 남의 사이트, 일치하면 자기 사이트. 문자열 대조라 별도 fetch 없이 판정 가능 | B 사용가능 |
ogSiteName | HTML | 25.8% | Know Your Meme · Twitch | immutable | 사이트가 자기 정체를 신고한 값. 커버 25.8% 로 ogTitle(46%)의 부분집합에 가깝다. ⚠️ 독립 검정은 안 했다 — 3.5 B 라 유지·제거 어느 쪽도 용량 영향 없음 | C 군집용 |
publishedTime | HTML | 8.7% | 2026-06-23T12:01:21Z | immutable | ✅ 제거 확정 — isNews 에 완전히 흡수된다. 실측: publishedTime 이 있으면서 isNews 가 아닌 경우가 3분할 통틀어 3건. 독립 정보가 없다 | 버림 |
discoveredLinks | HTML | 314건 / 1,886 | {instagram:[...], discord:[...]} | mutable | ⛔ 제거. 실측 1,324개 링크 중 50.3%가 그 사이트 자신의 계정(rockstargames.com → @rockstargames). 2차 발견 입력으로 쓰면 knowyourmeme 인스타를 토큰 소셜로 등록하게 된다. 제3자 방증 용도는 isNews+도메인나이가 이미 커버 → 버그 3건 고칠 이유도 사라진다 | 버림 |
ip | urlscan | 53.6% | 216.198.79.65(41건) | mutable | 호스팅 IP. asn 에 거의 종속이고 자주 바뀐다. Cloudflare/AWS 가 base rate 지배. ⚠️ 독립 검정은 안 했다 — 8.6 B | C 군집용 |
asn | urlscan | 53.4% | AS13335 Cloudflare(270) · AS16509 AWS(251) | mutable | 호스팅 제공자 — 운영자가 아니다. 군집이 생겨도 제공자 점유율일 뿐 | 호스팅속성 |
asnName | urlscan | 53.4% | CLOUDFLARENET - Cloudflare, In… | mutable | ✅ 제거 확정 — asn 과 1:1 대응(AS13335 ↔ CLOUDFLARENET). 매핑 테이블 하나면 충분한데 문자열이 길어 17.3 B 를 쓴다 | 버림 |
server | urlscan | 49.2% | cloudflare(288) · Vercel(176) · nginx | mutable | 호스팅 속성이지만 한 가지 용도가 있다 — SPA 판별. Vercel(=Next.js) 은 링크가 클라이언트 렌더라 HTML 파싱이 거의 빈손(실측 discoveredLinks 산출률 Vercel 4.9% vs nginx 30.1%). OG/링크 결측을 '정보 없음'이 아니라 '구조상 못 봄'으로 해석해야 한다 | B 사용가능 |
country · city | urlscan | 40.4% / 21.4% | US · Frankfurt am Main | mutable | ✅ 제거 확정 — 호스팅 데이터센터 위치이고 asn 이 제공자를 특정하면 자동 결정된다 | 버림 |
technologies | urlscan | 32.8% | Google Analytics · Cloudflare Bot Management | mutable | 상용 스택 목록. 4개 이상 → 성숙한 상용 사이트 = 남의 것. 실측 rug 83/87/98% · ≥100k 7/5/0% — 3분할 일관. 🔻 검증된 신호는 개수뿐이라 techCount: int 로 축약(27.7 → 4 B) | B 사용가능 |
trackingIds | urlscan | 10.4% | ga:G-5FPLDLE8C6 · gtm:GTM-SXRF | mutable | GA/GTM 계정 ID. 선택도는 최고지만 가리키는 대상이 예상과 다르다 — 실측 최대 군집이 knowyourmeme(27) · blog.google(7) · pump.fun(6) 처럼 제3자 사이트 자신의 GA 였다. 존재 자체는 3분할 일관 신호(rug 84/86/98%). 🔻 hasTracking: bool 로 축약(4.6 → 1 B). ⚠️ 잃는 것 — 같은 운영자의 여러 도메인 묶기(world.xyz/docs./api.), 실측 1건 | B 사용가능 |
urlscanLinkDomains | urlscan | 40.7% | x.com(301) · solscan.io · dexscreener.com | mutable | 🔴 '소셜과 중복'이라던 판단이 틀렸다 — 유명 소셜은 25.1% 뿐이다. 꼬리에 dexscreener·solscan 이 있고, 분석도구 링크가 있으면 ≥100k 가 +15.1 / +18.1 / −2.5pp(2/3 분할에서 강함). 사이트가 dexscreener 를 걸었다 = 자기 토큰을 홍보하는 프로젝트 사이트 = 정확히 우리가 찾던 '남의 사이트 아님' 판별자. 🔻 배열은 버리고 hasTokenTool: bool 로 축약(53.3 → 1 B) | B 사용가능 |
bodyHashes | urlscan | 56.2% | 고유 26,492종 · 건당 54.0개 | mutable | 🔴 용량의 73.6%(건당 2,066 B)를 혼자 쓴다. 페이지 리소스 해시 → 동일 템플릿 탐지. 최빈값 e3b0c442…(360건)는 빈 문자열의 SHA-256 = 빈 페이지지 공통 지문이 아니다. 용도가 미검증이라 저장하지 않고 scanUuid 로 복구 경로만 남긴다 | 버림 |
globalNames | urlscan | 46.2% | next · google_tag_data · 0 · 건당 58.9개 | mutable | 용량 16.4%(건당 460 B). 값이 프레임워크 노이즈고 technologies 가 같은 축을 해석 가능한 형태로 커버한다 → 제거, scanUuid 로 복구 가능 | 버림 |
urlscanScore | urlscan | 57.3% | 🔴 1,080건 중 1,075건이 0, 100은 5건 | mutable | ❌ 분산이 없어 버려도 된다. 무료 search 모드 한계일 수 있으나 현재 데이터로는 정보량 0 | 버림 |
brands | urlscan | 5건 | genericcrypto×3 · facebook · amazon | mutable | ❌ 사칭 브랜드 탐지를 기대했으나 전체 5건. 현재 모드에서는 사실상 안 잡힌다 | 버림 |
3. 추론 지도 — 필드가 하나의 축으로 수렴한다
핵심 발견 — §2 의 신호들은 독립이 아니다. 전부 같은 질문의 다른 얼굴이다: “이 website 가 프로젝트 자신의 홈인가, 남의 사이트를 참조한 것인가”
website URL
│
├─ RDAP ────── domainCreatedDate ─┬─ 731일+ ──────┐
│ domainExpiryDate ──┘ (등록기간) │
│ │
├─ HTML ────── isNews = true ─────────────────────┤
│ ogTitle / ogSiteName ──(토큰명 대조)┤
│ ├─▶ 「남의 사이트」
├─ urlscan ─── technologies 4+ ───────────────────┤ rug ↑ · ≥100k ↓
│ trackingIds 존재 ───────────────────┤ (3분할 일관)
│ server = Vercel ──(SPA: 결측 해석) │
│ │
└─ 파생 ────── 도메인 공유 카운트 ─────────────────┘
(as-of · 나이가 못 잡는 신생 공용 도메인)
그래서 주의할 것 — 이 필드들을 독립 피처로 나열하면 같은 정보를 여러 번 세게 된다. 실측 겹침률: 공유 도메인의 55.9%가 이미 나이·뉴스·tracking·tech 중 하나에 걸린다(단독 도메인은 19.5%).
4. 실측 — 3분할 전부 같은 방향인 것만
rug = 72h 내 5만 MC 미달 · ≥100k = 10만 MC 도달. 각 칸은 IS / OOS1 / OOS2.
4.1 일관 — 채택 후보
| 신호 | rug | ≥100k | 해석 |
|---|
website 존재 자체 | −9.7 / −6.4 / −2.5pp | +6.3 / +3.4 / +1.5pp | website 가 있는 토큰이 덜 rug 하고 더 오른다. 3분할 전부 같은 방향 |
isNews = true | 80 / 89 / 100% | 2 / 5 / 0% | 뉴스 기사 = 남의 컨텐츠 |
| 도메인 731일+ | 85 / 84 / 91% | 7 / 6 / 6% | 오래된 도메인 = 남의 사이트 |
trackingIds 있음 | 84 / 86 / 98% | 9 / 6 / 2% | 상용 사이트 = 남의 것 |
technologies 4개+ | 83 / 87 / 98% | 7 / 5 / 0% | 성숙한 스택 = 남의 것 |
discoveredLinks 1-20 | 75 / 85 / 93% | 15 / 4 / 5% | 링크가 나온다 = 서버렌더 상용 사이트 |
4.2 IS 에서만 좋았던 것 — 과적합 사례
같은 데이터로 반대 사례도 남긴다. IS 단독 결과를 채택하면 안 되는 이유의 실물.
| 신호 | IS | OOS 6/22-24 | OOS 6/24-27 |
|---|
server = Vercel | rug 52% / ≥100k 40% | 84% / 9% | 90% / 8% |
| 도메인 91-730일 | rug 35% / ≥100k 57% | 84% / 5% | 85% / 8% |
| 도메인 공유 16개+ | rug 0% / ≥100k 100% | — | rug 95% |
도메인 공유 16개+ 버킷을 까보면 — IS 는 orynth.dev 단독 18건(rug 0%), OOS2 는 knowyourmeme.com 22건(rug 100%) + axiom.trade 21건(rug 90%)이었다. 크기 효과가 아니라 개체 특이적이다 — 버킷 하나가 도메인 하나였다.
5. 파생값 — 저장하지 않고 질의 시점에 계산
| 파생 | 계산식 | 값어치 | 저장 여부 |
|---|
| 도메인 나이 | fetchedAt − domainCreatedDate | 🥇 주력 신호. 3분할 일관 · 커버 81.7% · as-of 완전 | 저장 ❌ — domainCreatedDate 만 저장하고 질의 시점에 계산 |
| 등록 기간 | domainExpiryDate − domainCreatedDate | 🆕 아직 안 만든 파생. 1년 = 단기 의도 | 저장 ❌ — 원본 두 값이 이미 있다 |
| cert ↔ 등록 갭 | certValidFrom − domainCreatedDate | 만료 도메인 인수 탐지 | 저장 ❌ |
| 도메인 공유 카운트 | count(tokens: fingerprints=domain:X, createdAt < T) | 🥈 보조 신호. 나이가 못 잡는 신생 공용 도메인(orynth.dev 30건)을 잡는다 | 🔴 저장 절대 금지 — 값이 계속 변해서 저장 시점이 곧 look-ahead. 질의 시점 계산 |
도메인 공유 카운트를 필드로 저장하면 안 되는 이유 — 값이 계속 변한다. 저장 시점의 카운트는
그 이후 토큰까지 센 값이라 저장하는 순간 look-ahead 가 박힌다.
{fingerprints: "domain:X", createdAt: {$lt: T}} 로
질의 시점에 세는 것이 맞다.
원리상 도메인당 첫 토큰은 반드시 미탐이다(선례가 0). 실측 손실 — look-ahead 42.6% → as-of 31.8%(75% 보존). 군집이 클수록 잘 살아남는다: 2토큰 50.0% · 3-5 71.0% · 6-15 87.5% · 16+ 96.1%.
6. 저장 결정 — 무엇을 빼고, 무엇을 접고, 무엇을 남기나
이 절의 원칙 — 검증된 것은 검증된 형태로만 저장한다. “개수만 신호”면 배열이 아니라 int, “존재 유무만 신호”면 bool. 미검증 필드는 버리되 scanUuid 로 복구 경로를 남긴다.
6.1 제거
| 필드 | 처리 | 절감 B/건 | 근거 |
|---|
bodyHashes | 제거 → scanUuid 로 복구 | 2,066 | 혼자 용량의 73.6%. 템플릿 재사용 용도가 미검증이라 검증되면 uuid 로 되받는다 |
globalNames | 제거 → scanUuid 로 복구 | 460 | 용량 16.4%. 값이 프레임워크 노이즈(next·0)고 technologies 가 같은 축을 커버 |
discoveredLinks | 제거 | 38 | 2차 발견 용도 철회(50.3% 오염). 제3자 방증은 isNews+도메인나이가 이미 커버 |
asnName | 제거 | 17.3 | asn 과 1:1 대응 — 매핑 테이블로 충분 |
publishedTime | 제거 | 2.2 | isNews 에 완전 흡수(독립 사례 3건) |
country · city | 제거 | 1.6+ | 호스팅 위치. asn 에 종속 |
urlscanScore | 제거 | 1 | 1,080건 중 1,075건이 0 — 분산 없음 |
brands | 제거 | 1 | 전체 5건 — 현재 모드에서 미작동 |
6.2 형태 축약 — 배열을 스칼라로
| 현재 | 변경 | B/건 | 검증된 신호가 무엇인가 |
|---|
technologies[] | techCount: int | 27.7 → 4 | 검증된 신호는 개수(4개 이상)뿐. 목록은 쓰는 데가 없다 |
urlscanLinkDomains[] | hasTokenTool: bool | 53.3 → 1 | 검증된 신호는 dexscreener/solscan 링크 유무(≥100k +15.1/+18.1/−2.5pp) |
trackingIds[] | hasTracking: bool | 4.6 → 1 | 검증된 신호는 존재 유무(rug 84/86/98%). ⚠️ 같은 운영자 다중 도메인 묶기를 잃음(실측 1건) |
6.3 유지 — 한때 빼려 했으나 되돌린 것
🔴
이전 판정의 오류를 기록해 둔다. registrar·
certIssuer 를 “실측 무신호”로 판정했었는데, 그 테스트는
“같은 값을 2개 이상이 쓰나”였다. 고유값이 각각 64종·57종뿐이라
98% 이상이 ‘공유’ 그룹이었고 대조군이 20건 남짓이었다.
차이가 없었던 게 아니라 잴 수 없었다. 카테고리로 다시 재니 신호가 나왔다.
교훈 — 검정력을 확인하지 않은 null 결과를 “신호 없음”으로 부르면 안 된다. 측정 불가와 신호 부재는 다른 판정이다.
| 필드 | B/건 | 왜 남기나 |
|---|
registrar | 5 | 재검정에서 1910·292 가 OOS 두 분할 +7~8pp. 이전 무신호 판정은 저검정력 오독 |
certIssuer | 6 | 재검정에서 YR2 가 3분할 전부 +5.0/+5.5/+10.4 |
ip · ogSiteName | 12 | 독립 검정을 안 했다 — 무신호 확인이 아니라 미확인이라 남긴다 |
6.4 용량 실측
website 레코드 하나 평균 2,808 B(중앙값 746 · p95 14,855 · 최대 53 KB). website 보유율이 38.7%라 토큰당으로 환산하면 아래와 같다.
| 구성 | B/토큰 | 5천/일 | 2만/일 |
|---|
| 전부 그대로 | 1,088 | 1.09 GB | 4.35 GB |
bodyHashes 만 처리 | 287 | 287 MB | 1.15 GB |
| 이 문서의 최종안 | 66 | 120 MB | 481 MB |
이 지점부터는 필드를 더 빼도 별로 안 줄어든다 — MongoDB 는 필드 이름을 문서마다 저장한다. 11개 필드 × 평균 15자 ≈ 165 B 로 실제 값(66 B/토큰)보다 크다. 더 줄이려면 필드 제거가 아니라 이름 단축이 효과적이지만, 가독성 손실 대비 이득이 작아 권장하지 않는다.
7. 지금 안 뽑는데 뽑을 수 있는 것
우선 열의 “즉시”는 추가 네트워크 호출이 0이라는 뜻 — 이미 받아둔 데이터에서 파생만 만들면 된다.
| 항목 | 출처 | 비용 | 무엇을 추론하나 | 우선 |
|---|
| 등록 기간 | 이미 보유(RDAP) | 무료 · 추가 호출 0 | 1년 등록 = 단기 의도. 데이터가 이미 있는데 파생만 안 만든 상태 | 즉시 |
| HTTP 상태 · 리다이렉트 체인 | 페이지 GET 시 부산물 | 무료 · 추가 호출 0 | ①사이트가 살아있나(러그 후 내림) ②리다이렉트 목적지가 다른 도메인이면 파킹/전매 | 즉시 |
| 본문 텍스트 | 이미 받는 HTML | 무료 · 추가 호출 0 | 🔴 지금은 OG 메타만 파싱하고 본문을 버린다. CA·티커가 본문에 있어도 못 본다 — 소셜 쪽에서 caption 을 token↔content 링크 지점으로 쓰는 것과 같은 논리 | 즉시 |
| TLD | 도메인 문자열 | 무료 · 추가 호출 0 | .fun / .xyz / .live vs .com — 등록 비용·심사 강도 차이 | 즉시 |
| favicon 해시 | /favicon.ico GET | 무료 · 요청 1회 | 템플릿 재사용 지문. image 축과 같은 성격 — 같은 파비콘 = 같은 제작 파이프라인 | 낮음 |
DNS MX 레코드 | DNS 조회 | 무료 · 요청 1회 | 메일이 설정돼 있나 = 조직 실체의 약한 증거. 밈코인 사이트는 대개 없음 | 미검증 |
DNS NS 레코드 | DNS 조회 | 무료 · 요청 1회 | DNS 제공자 군집 — 운영자 묶기 | 미검증 |
| wayback 최초 스냅샷 | web.archive.org API | 무료 · 요청 1회 | 실제 공개 시점. 도메인 등록일보다 정확 — 등록 후 방치했다 나중에 쓴 경우를 가른다 | 미검증 |
| 페이지 바이트 크기 | GET 부산물 | 무료 · 추가 호출 0 | 빈 랜딩 vs 실제 사이트 구분 | 낮음 |
⚠️ “즉시” 4건 외에는 전부 미검증 가설이다. 라벨로 검정한 적이 없다 — §4 의 실측 신호와 같은 수준의 근거가 아니다.
8. image — 현황과 제안
🔴 현재 완전 미수집이다. 수집 데이터(social.jsonl)에 토큰 이미지가 없고, tokens.json 은 주소 목록뿐이다. 따라서 이 절 전체가 가설이며 실측 근거가 하나도 없다 — §2·§4 의 website 항목과 지위가 다르다.
7.1 뽑을 수 있는 필드
| 필드 | 출처 | 형태 | 추론할 수 있는 것 | 필요한 것 |
|---|
imageUrl | 토큰 메타데이터 URI | 원본 URL 문자열 | 호스팅 도메인이 파생된다 → 같은 CDN/파이프라인 군집. URL 그대로도 완전 동일 재사용은 잡힌다(변형본은 못 잡음) | 즉시 가능 |
imageHash (sha256) | 이미지 다운로드 후 계산 | sha256:abc… | 바이트 단위 완전 동일 판정. 같은 이미지를 여러 토큰이 쓰면 = 같은 소재 재사용/사칭 | 다운로드 + 해시 단계 필요 |
pHash / dHash (perceptual) | 이미지 다운로드 후 계산 | 64bit 지각 해시 | 변형본 탐지 — 크롭·리사이즈·워터마크·재인코딩을 넘어 같은 원본 판정. sha256 이 못 잡는 영역 | 이미지 라이브러리 필요 |
| 포맷 · 해상도 · 바이트 크기 | 다운로드 부산물 | png 512×512 84KB | 제작 파이프라인 지문(같은 툴 = 같은 규격). 약한 신호 | 다운로드 필요 |
7.2 추론 가설
| 관측 | 추론 | 상태 |
|---|
같은 imageHash 를 여러 토큰이 사용 | 같은 소재 재사용 — 연속 발행 정황 | 미검증 |
| 토큰 이미지 = 소셜 프로필 이미지 | 사전 준비 정황 — 팀이 미리 계정과 이미지를 맞춤 | 미검증 (v2 Q10) |
pHash 근접하나 sha256 다름 | 변형 재사용 — 탐지를 피하려 조금 바꾼 것 | 미검증 |
| 이미지 호스팅 도메인 공유 | 같은 배포 파이프라인 | 미검증 |
전제 — pump.fun 계열은
이미지가 불변이라(mint authority 소각 실측 92%) 해시가 안정적인 키가 된다. 이 전제가 깨지는 런치패드에서는
observedAt 이 필수다.
최소 착수안 — 해시 계산 없이 imageUrl 문자열만 저장해도 완전 동일 재사용은 잡힌다. 변형본은 못 잡으니 pHash 는 그 다음 단계.
9. 저장 형태 — 지문은 합성 문자열 배열
tokens {
_id: mint,
createdAt, // as-of 절단축 (토큰 발행)
fingerprints: [ // kind 를 값에 인코딩한 평면 문자열
"domain:orynth.dev",
"image:sha256:def...", // §8 — 아직 미수집
],
fingerprintsObservedAt, // 지문 관측 시각 (look-ahead 가드)
web: { // 지문이 아닌 도메인 속성
domain, // 공유 카운트의 키
domainCreatedAt, // 주력 신호 (731일+ = 남의 사이트)
domainExpiryAt, // 등록기간 파생용
certValidFrom, // 재사용 도메인 탐지
scanTime, // urlscan 계열의 as-of 앵커
scanUuid, // 신규 — 미검증 필드 복구 경로
isNews, // 주력 신호 (rug 80/89/100%)
ogTitle, // 토큰명 대조
ogSiteName, // 미검정 (3.5B)
server, // SPA 판별 (OG 결측 해석용)
ip, // 미검정 (8.6B)
registrar, certIssuer, // 재검정에서 신호 확인
techCount, // 축약 배열→int (4개 이상이 신호)
hasTracking, // 축약 배열→bool (존재 유무가 신호)
hasTokenTool, // 축약 배열→bool (dexscreener/solscan 링크)
},
}
// 인덱스: {fingerprints: 1, createdAt: 1}
// 공유 규모: count({fingerprints: "domain:X", createdAt: {$lt: T}})
객체 배열이 아니라 합성 문자열인 이유 — [{kind, value}] 형태면 kind 와 value 가 같은 원소를 가리킨다는 보장이 없어 $elemMatch 가 강제된다. "kind:value" 로 합치면 단일 조건이 되고, createdAt 이 배열 밖 스칼라라 multikey prefix + range 가 그대로 성립한다.
10. 미결 · 다음
| 항목 | 상태 | 왜 막혀 있나 |
|---|
| as-of 실증 | 불가 | fetchedAt 이 배치 처리 시각(전부 1.5시간 내)이라 토큰 발행 순서가 없다. §4 lift 는 look-ahead 상한이고 §5 의 31.8% 는 원리상 계산이지 성능 측정이 아니다 |
| image 전 항목 | 미수집 | 수집 데이터에 토큰 이미지가 아예 없다 — 가설 검증 자체가 불가 |
discoveredLinks | 제거 확정 | 버그 3건(역슬래시 미제거로 같은 링크가 2종 집계 · 이스케이프 흡수 · oembed API 오탐)이 있었으나 필드 자체를 빼기로 해 수정 불필요 |
hasTokenTool 3분할 미달 | 2/3 | dexscreener/solscan 링크는 IS·OOS1 에서 ≥100k +15~18pp 인데 OOS2 에서 사라진다(n≈41). 개념적 타당성은 높으나 채택 전 재검정 필요 |
registrar 이름 매핑 | 필요 | IANA 숫자 ID(1068·146)라 그대로는 해석 불가 — 매핑 테이블이 있어야 쓴다 |
| 공유 카운트 방향 | 미결 | IS 에서 부호가 뒤집혔다(공유 도메인이 더 좋았다). 판별(남의 사이트냐)에 쓰는 건 안전하나 방향(좋다/나쁘다)은 별도 검증 필요 |
| 공유 도메인 3종 혼재 | 미결 | 참조 사이트(knowyourmeme) · 런치툴(orynth.dev) · 런치패드(pump.fun)의 성격이 다른데 카운트만으로는 하나로 뭉갠다 |
urlscanScore·brands | 보류 | 무료 search 모드 한계일 가능성 — 유료 스캔 제출 모드면 달라질 수 있으나 미확인 |