API
POST /trace
穿过混币器或交易所追踪一笔转账,获取另一端最可能属于同一个人的钱包。
请求
描述要追踪的转账。其取值来自 /analyze 响应的 connections[].transfers。对于 Bitcoin 钱包,交易对手是 CoinJoin(即报告中关联所示的 txid),signature 就是该 txid:见经过 Bitcoin CoinJoin。
| 字段 | 类型 | 含义 |
|---|---|---|
wallet | string | 必填。被追踪转账所属的钱包。 |
counterparty | string | 必填。另一端的混币器资金池或交易所钱包。 |
signature | string | 必填。该转账的交易。 |
direction | "in" | "out" | 必填。out:钱包存入(向前追踪)。in:钱包提取(向后追踪)。 |
time | integer | 必填。Unix 秒。 |
sol | number | 必填。转移的 SOL(没有则为 0);非 Solana 链上为该链的币种(ETH、BNB、BTC)。 |
usd | number | 必填。转移的稳定币,以美元计(没有则为 0)。 |
window | integer | 搜索的秒数。混币器默认 24 小时,交易所默认 1 小时;最多 7 天。经由 EVM 隐私池时:默认 7 天(Privacy Pools 为 30 天),最多 30 天。 |
chain | string | 转账所在的链:solana(默认)、ethereum、base、arbitrum、robinhood、bsc、polygon、bitcoin 或 tron。未指定时,两个 0x 地址视为 Ethereum。在 ethereum、arbitrum 和 bsc 上,进出 Railgun、Tornado Cash 或 Privacy Pools 的转账会穿过资金池追踪(此时 sol 和 usd 只用于在包含多种代币的 shield 中挑选一种);其他情况下,非 Solana 链只追踪进出兑换服务的转账,Tron 上还包括进出交易所的转账,Bitcoin 上则穿过 CoinJoin 追踪(见下文)。signature 为交易哈希或 Bitcoin txid。在 Tron 上,sol 存放 TRX,usd 存放 USDT 或 USDC。 |
hops | integer | 2:对经过 Houdini Swap 12 家合作交易所中两家(也可能是同一家两次)的路线的首尾两段进行配对:其中任一家在 90 分钟内发出、价值最多少两次价差的支付,按损失与真实路线约 3% 的接近程度以及到账快慢排序(10 分钟内为满权重,一端在 Bitcoin 上时为 35 分钟),同链同币的支付略靠前,收款人与发送方在链上有关联时大幅靠前(candidates[].link)。direction: "out" 时对手方可以是任何链上的任何地址:Iris 不认识的地址会被视为某家合作交易所的一次性存款地址(会有警告说明)。只是线索,不是证据;swap.coverage 说明搜索了多少家合作交易所和几条链。只有两段都出现合作交易所的钱包时才称为 Houdini Swap 路线,否则称为“私密兑换,Houdini 式(双交易所)”(swap.name)。 |
account | boolean | true,且 direction: "out"时:对手方是交易所的充值地址(有此标签,或可见其把收到的资金转入该交易所热钱包),按经由该交易所账户的即时兑换追踪(Husher 等经纪商的方式):该交易所热钱包在 3 分钟内(window 最多 30 分钟)发出的、价值低 0.05–1% 再加提现手续费的支付,仅此一种。method 为 value_match_account。仅凭形态不会给出任何品牌名称:只是线索,不是证据。现在已不再需要:不传此项时,转入交易所充值地址的存款会同时按其可能立刻转出的每种方式追踪(method: "exchange_out",见 swap.verdict)。它仍可用于把交易所热钱包的支付经由账户反向追踪。 |
request.sh
1curl -X POST https://iriscan.app/api/trace \2 -H "Authorization: Bearer $IRIS_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "wallet": "21DnhyxUW2vJghLXXnXwEkmyHrV9vkAmGXvGqoTytzqF",6 "counterparty": "4AV2Qzp3N4c9RfzyEbNZs2wqWfW4EwKnnxFAZCndvfGh",7 "signature": "<deposit signature>",8 "direction": "out",9 "time": <unix seconds>,10 "sol": 254.0226,11 "usd": 012 }'响应
response.json (200 OK, abridged)
1{2 "entity": "Privacy Cash",3 "kind": "mixer",4 "direction": "forward",5 "method": "fee_model",6 "anchor": { "signature": "…", "amount": 254.0226, "asset": "SOL", "time": … },7 "window": {8 "from": …, "to": …, "searched": ["4AV2…"], "transactions": 1840,9 "complete": true, "truncated": false, "open": false, "closes_at": null, "fallback": false10 },11 "anonymity_set": 1,12 "candidates": [13 {14 "address": "EeTpxJBVuT6mUDFekexBbza79Ss2arkQ3C4tYgYcHxBF",15 "signature": "…",16 "amount": 253.1275,17 "time": …,18 "delta_seconds": …,19 "tier": "trivial",20 "confidence": 1,21 "via": null,22 "label": null,23 "same_wallet": false24 }25 ],26 "warnings": []27}| 字段 | 类型 | 含义 |
|---|---|---|
entity, kind | string | 中间方是谁,以及它是 mixer(混币器)、exchange(交易所)还是 swap_service(兑换服务:SideShift、ChangeNOW、FixedFloat…)。 |
direction | "forward" | "backward" | 从存入向前追踪,或从提现向后追踪。 |
method | "fee_model" | "tolerance" | "exact_feed" | "value_match" | "value_match_two_hops" | "value_match_account" | "exchange_out" | "coinjoin" | "exact_label" | "amount_timing" | "heuristics" | "owner_signed" | fee_model:资金池手续费已知,匹配是精确的(Privacy Cash、Cloak、Umbra、encrypt.trade、MagicBlock Private Payments、ShadowWire)。tolerance:金额接近(交易所、疑似混币器)。经由兑换服务时:exact_feed,该兑换在 SideShift 的公开记录中,精确到最小单位;value_match,按当时价格,任意币种、任意链上价值少 0.3–3% 的支付(约 80% 准确);value_match_two_hops,同上但经过 Houdini Swap 的两家合作交易所(hops: 2);value_match_account,经由交易所账户(Husher 充值地址,或 account);exchange_out,转入交易所充值地址:同时搜索其可能转出的每种方式并合并权衡(swap.verdict)。coinjoin:经过 Bitcoin CoinJoin。经由 EVM 隐私池时:Railgun 为 fee_model,Privacy Pools 的 ragequit 及其存入为 exact_label,其他 Privacy Pools 匹配为 amount_timing,Tornado Cash 为 heuristics。owner_signed:经由 Solana Privacy Rings,其默认 ring 隐藏金额而不隐藏所有者,按签名的所有者关联,而不是按金额(见下文)。 |
anchor | object | 被追踪的转账。 |
window | object | 搜索的范围。complete:窗口已结束且已读完。truncated:繁忙的钱包只读取了一部分。open 和 closes_at:窗口延伸到当前时间之后,以及何时结束;届时请再追踪一次。fallback:不知道该交易所的热钱包,只搜索了充值地址。 |
anonymity_set | number | 找到了多少笔相同金额的转账:1 表示只有一笔符合,0 表示没有完全相同的。 |
candidates[] | Candidate | 最佳的在前:address、amount、delta_seconds、tier、confidence(0 到 1)、via(经过的交易所充值地址)、same_wallet。经由兑换服务时还有 asset(amount 的币种)、usd(当时的价值)和 chain(所在的链,非 Solana 时:某条 EVM 链、bitcoin 或 tron)。经由 EVM 隐私池时还有 reasons(用文字说明关联依据)和 parts(由多笔交易组成的匹配所含的交易)。经由记录手续费的混币器(Privacy Cash)时:fee,该笔提现被扣的手续费。当一笔存入以多笔提现取出时:split,带有 group(同一组候选结果共享)、parts 和 with(该组的其他提现,每笔包含 signature、address、amount、time)。 经由交易所、交易所账户、按价值匹配的兑换服务或 hops: 2 时:候选钱包与被追踪钱包在链上有关联时有 link(kind:same_wallet、paid_traced、paid_by_traced 或 same_funder;显示关联的交易的 signature、chain 和 time,共同的 funder,置信度所乘的 weight,以及 text)。 经由 Solana Privacy Rings 时:rings(signed:它签署了这笔提现;withdrawal:由所有者签署的提现支付给它;deposit:它存入了该所有者的余额;private_transfer:所有者之间的私密转账)、owner(隐私所有者)、exact(同一所有者,链上签名,或经其注册表记录核对;否则只是线索)、amount_hidden(私密转账,amount 为 0)、reasons、to_itself(所有者提现给自己),以及 path:资金在 ring 中逐跳经过的路径(每跳含 kind:deposit、private_transfer 或 withdrawal;from、to、signature、time、amount 和 asset(隐藏时为 null)、exact 和 why),另有 route,即同一路径的文字说明。正向追踪时,候选是出口,最多经过四层所有者。结果另有 owners(每个含 address 和 resolved_by:signer、registry 或 view_tag)、explanation,以及 anonymous(匿名策略 ring:没有可追踪的所有者)。 |
chain, clusters[] | string, Cluster | 仅限 EVM 隐私池:所在的链,以及 Tornado Cash 中与被追踪批次形态相似的提现分组(relayer、mix、addresses、overlap、fresh、confidence、reasons):是线索,不是关联。 |
swap | object | 仅限兑换服务:service、matched(exact、value 或 two_hops)、deposit 和 settle(各含 coin、network、amount、usd、time)、recorded_at(SideShift 记录该兑换或 FixedFloat 列出该兑换的时间)、other_chain(另一端在另一条链上)、priced(有价格数据)和 shifts(精确吻合的已记录兑换)。按价值匹配时还有 coverage:读取到钱包的交易所数(partners)、应搜索的数量(of:hops: 2 时为 Houdini Swap 的 12 家合作交易所,否则为 1)、读取的链(chains),以及在读完所有钱包前时间用尽时的 partial(返回目前找到的结果)、reach(另一端落在所搜索范围内的可能性,按真实兑换测得:Iris 不认识的合作交易所或热钱包、不读取的链都在范围之外;没有链上关联的匹配,置信度最多为 reach 乘以 0.8),以及经交易所账户时的 wallets(已读取的交易所出款钱包数,与当时可能出款的钱包数)。交易所是 Houdini Swap 合作交易所之一时,houdini_partner 为 true。margin: 第一个候选的置信度是第二个的几倍(第二个四舍五入为 0 时为 100)。name:按证据给出的兑换名称(“Swap through Husher”、“Instant swap through a Binance account”、“Houdini Swap route”、“Private swap, Houdini-style (2 exchanges)”、“Swap through ChangeNOW's wallets”),named_by 为其依据:order_record、deposit_address、partner_wallets、wallets 或 shape(无品牌)。品牌只来自其充值地址或记录;entity 和 service 遵循同样的规则。account:经由交易所账户时,付款热钱包所属的交易所。verdict:转入交易所充值地址时(method: "exchange_out"),哪种形态最吻合:shape(brand、account、two_exchanges、plain_deposit 或 unmatched)和 strength(likely;lead,与发送方有链上关联但不比“都不是”更可能;或 none);line 为结论原文(“Came back out 41 s later through a Binance account: ...”,或 “No matching withdrawal within 3 minutes: most likely a plain deposit to Binance. Only Binance can say who owns this account.”),basis 为其依据;exchange、brand、candidate(资金转出所对应的候选序号)、confidence、no_match(候选都不是的可能性)、plain(其中普通存款的可能性)、prior(看到证据前是兑换的可能性:大多数存款只是存款)、untied_cap(没有链上关联的支付最多能得到的置信度)、complete,以及 shapes[]:每项搜索的 shape、name、entity、window、candidates(candidates 中的序号)、cut(未能及时读完的链)、notes 和 error。候选结果的置信度为合并后的值。 |
warnings[] | string[] | 让结果比看上去更弱的因素,可直接展示给用户。无话可说时为空。 |
等级从 trivial(5 分钟内)依次为 strong、likely、weak、loose,直到 distant(超过一天)。见解读结果。
经过 Bitcoin CoinJoin
向 CoinJoin 付过款(out)或从中获得过输出(in)的 Bitcoin 钱包,会穿过 CoinJoin 本身追踪:Wasabi(以其协调者命名)、Whirlpool(一次混币,或进入资金池的 Tx0)或 JoinMarket。不使用 time、sol 和 usd,也没有时间窗口。anchor 的 asset 为 BTC。
每个候选结果都是很可能属于该钱包自己的输出(向后追踪时,则是很可能在其输出背后的输入),chain 为 bitcoin,tier 说明关联类型(change、premix、doxxic change、consolidated、reused、leftover、equal output、depositor),reason 用文字说明。signature 是体现该关联的交易:CoinJoin 本身,或之后花费其输出的交易。anonymity_set 是该币混在多少个等额输出之中。见Bitcoin CoinJoin。
特有错误
400“Not a mixer or an exchange Iris knows”:无法穿过该交易对手追踪(兑换服务的一次性充值地址在把资金归集给该服务后,视同该服务)。400“The transfer moved no SOL or stablecoin to trace”:该转账没有转移可追踪的 SOL 或稳定币。400“direction must be "in" or "out"”:direction 必须为 "in" 或 "out"。400“The transfer is not a Railgun, Tornado Cash or Privacy Pools deposit or withdrawal”:交易对手是它们的合约之一,但该交易中没有它们的事件。400“Not an instant exchange Iris knows on Base”:在非 Solana 链上,该转账没有经过 Iris 已知的任何隐私池(Ethereum、Arbitrum 和 BNB Chain 上)、CoinJoin 或兑换服务。