1. 系統概述
Crypto AML Agent 是一套針對加密貨幣地址的反洗錢(AML)風險監控與調查系統,支援 Ethereum、BNB Smart Chain、TRON 與 Bitcoin 四條鏈。使用者輸入地址後,系統會:
- 即時抓取鏈上交易並正規化為統一格式(NormTx);
- 比對 OFAC 制裁名單與地址標籤,執行 21 條以洗錢態樣(typology)為基礎的偵測規則;
- 以可解釋的公式計算 0–100 風險分數與四級風險等級;
- 在瀏覽器端以 Isolation Forest 找出行為異常的單筆交易(與官方分數分開呈現);
- 由 GLM AI Agent 透過工具呼叫查證後撰寫中文調查報告,並保存執行軌跡供稽核;
- 以排程(Cron)持續掃描監控名單,於儀表板顯示警示。
設計原則是「分數由程式決定、文字由 LLM 撰寫」:所有數字皆可由規則與證據重現,LLM 只負責整理與敘述。
2. 系統架構
- 前端:Next.js 16(App Router)部署於 Vercel;所有資料皆由瀏覽器直接呼叫 Worker API,頁面本身可靜態產生。
- 後端:Cloudflare Worker(Hono)提供 REST API 與 SSE 串流;D1 儲存警示、監控名單、調查紀錄與快取;Cron Triggers 執行排程掃描。
- 共用引擎:
@aml/engine為 TypeScript 原始碼套件,Worker 用於評分,前端用於位址偵測、格式化、Isolation Forest 與本頁的規則表。
3. 資料來源
| 資料 | 來源 | 內容 |
|---|---|---|
| ETHEthereum 鏈上資料 | Zerion API(未設定金鑰時改用 Blockscout) | 錢包交易:ETH 與 ERC-20 轉帳(含合約內部轉出),附交易當時 USD 價值、應用名稱與垃圾代幣標記 |
| BSCBNB Smart Chain 鏈上資料 | Zerion API(需 API 金鑰) | 錢包交易:BNB 與 BEP-20 轉帳;未設定金鑰時 BSC 僅提供內建情境 |
| TRONTRON 鏈上資料 | TronGrid | 帳戶資訊、TRX 與 TRC-20(USDT/USDC)轉帳 |
| BTCBitcoin 鏈上資料 | mempool.space | 地址統計與 UTXO 交易(輸入/輸出明細,用於 CoinJoin 與剝離鏈判斷) |
| 制裁名單 | OFAC SDN(github.com/0xB10C/ofac-sanctioned-digital-currency-addresses) | ETH / USDT / USDC / BSC / TRX / XBT 地址;引擎內建快照日期 2026-10-07,Worker 排程更新 |
| 地址標籤 | 內建策展名單 + Zerion 應用名稱 / Blockscout 標籤 | 交易所、混幣器(Tornado Cash)、跨鏈橋、穩定幣合約;外部標籤以關鍵字對應類別 |
| AI 報告 | Z.ai GLM(OpenAI 相容 API) | 工具呼叫(function calling)蒐集證據後撰寫中文報告;不可用時改用規則模板 |
4. 偵測規則
共 21 條規則,涵蓋制裁、混幣/匿名化、結構化、分層、詐騙、高風險服務與異常行為。下表由 ruleCatalog() 直接產生;嚴重度為預設值,部分規則會依強度升級(例如 R06 強度 ≥ 0.85 時升為高)。
| ID | 名稱 | 類型 | 說明 | 嚴重度 | 權重 | 適用鏈 |
|---|---|---|---|---|---|---|
| R01 | 制裁名單主體 | 制裁 | 調查地址本身列於 OFAC SDN 制裁名單,任何往來皆可能違反制裁規定。 | 極高 | 100 | 全部 |
| R02 | 制裁直接往來 | 制裁 | 與 OFAC 制裁地址有直接轉入或轉出紀錄;轉出至制裁地址視為最嚴重情形。 | 極高 | 90 | 全部 |
| R03 | 制裁間接暴露(1-hop) | 制裁 | 主要交易對手(依金額前 N 名)曾與制裁地址或混幣器直接往來,形成間接暴露。 | 高 | 45 | 全部 |
| R04 | 混幣器互動 | 混幣/匿名化 | 與 Tornado Cash 等混幣器合約往來。存入(轉出至混幣器)權重高於提領。 | 高 | 60 | 全部 |
| R05 | CoinJoin 混幣交易 | 混幣/匿名化 | 比特幣交易具多輸入、多輸出且大量輸出金額相同(Whirlpool/Wasabi 等 CoinJoin 特徵)。 | 中 | 40 | BTC |
| R06 | 結構化/拆分交易 | 結構化 (Structuring) | 7 天內多筆金額落在申報門檻 85%–100% 之間(US$10,000、US$3,000、約 NT$500,000),或 24 小時內大量小額來源匯集超過門檻(Smurfing)。 | 中 | 40 | 全部 |
| R07 | 快速過帳/分層 | 分層 (Layering) | 資金轉入後短時間(EVM/TRON 1 小時、BTC 6 小時)內 80% 以上即轉出,且整體留存率極低,屬典型過水帳戶行為。 | 高 | 45 | 全部 |
| R08 | 剝離鏈 (Peel Chain) | 分層 (Layering) | 比特幣交易反覆以「小額支付 + 大額找零」方式逐步剝離資金(小額/大額輸出比 < 0.2),常見於駭客與勒索款洗錢。 | 中 | 35 | BTC |
| R09A | 資金匯集 (Fan-in) | 匯集 | 24 小時內自 20 個以上(或 7 天內 50 個以上)不同地址收款,常見於詐騙收款或車手帳戶。 | 中 | 30 | 全部 |
| R09B | 資金分散 (Fan-out) | 分散 | 24 小時內轉出至 20 個以上(或 7 天內 50 個以上)不同地址,常見於分散洗錢或空投洗量。 | 中 | 30 | 全部 |
| R10 | 交易速度突增 | 異常行為 | 單日交易筆數相對於歷史基線的穩健 z 分數 > 3.5 且至少 10 筆。 | 中 | 25 | 全部 |
| R11 | 整數金額偏好 | 異常行為 | 過半數交易為整數金額(如 10 ETH、5,000 USDT),常見於人工操作的洗錢或詐騙收付。 | 低 | 15 | 全部 |
| R12 | 休眠後活化 | 異常行為 | 地址沉寂 180 天以上後,於 7 天內移動 US$50,000 以上資金。 | 中 | 30 | 全部 |
| R13 | 新地址大額 | 異常行為 | 建立不到 30 天的地址即轉入或轉出 US$100,000 以上(US$1,000,000 以上為高風險)資金。 | 中 | 25 | 全部 |
| R14A | 地址投毒(受害目標) | 詐騙 | 收到與既有交易對手首尾字元相同之「相似地址」發出的零元、粉塵或假冒穩定幣轉帳。 | 中 | 20 | ETHBSCTRON |
| R14B | 地址投毒受害轉帳 | 詐騙 | 在投毒事件後,實際轉帳至仿冒的相似地址,資金極可能已遭竊取。 | 高 | 55 | ETHBSCTRON |
| R14C | 地址投毒攻擊者 | 詐騙 | 地址活動以零元/粉塵/假代幣轉帳為主,且對象達 10 個以上,符合投毒攻擊者特徵。 | 高 | 60 | ETHBSCTRON |
| R15 | 詐騙/釣魚交易對手 | 詐騙 | 交易對手被標記為詐騙、釣魚、駭客或漏洞利用者(Blockscout 標籤、is_scam 或內建名單)。 | 高 | 50 | 全部 |
| R16 | 跨鏈橋跳轉 | 分層/跨鏈 | 資金自跨鏈橋轉入後短時間內再轉往跨鏈橋,常見於跨鏈分層以切斷追蹤。 | 中 | 30 | 全部 |
| R17 | 高風險服務 | 高風險服務 | 交易對手為高風險服務(如受 FinCEN 311 處分之擔保平台、無 KYC 交易所、線上博弈)。 | 高 | 40 | 全部 |
| R18 | 統計離群金額 | 統計異常 | 以 log 金額的穩健 z 分數(MAD)偵測離群交易:z > 3.5、金額 ≥ US$10,000 且為中位數 5 倍以上。 | 低 | 12 | 全部 |
5. 關鍵門檻
所有偵測門檻集中於 RULE_CONFIG,下表為程式內的實際值。台灣大額通貨交易申報門檻 NT$500,000 以約 US$15,500 換算。
| 規則 | 項目 | 門檻 |
|---|---|---|
| R03 | 1-hop 追蹤的主要交易對手 | 依金額前 5 名(BSC 前 3 名);強度下限 0.3 |
| R05 | CoinJoin 特徵 | 輸入 ≥ 5、輸出 ≥ 5、等額輸出 ≥ 5(每筆 ≥ 0.001 BTC) |
| R05 | Whirlpool 池面額 | 0.001 / 0.01 / 0.05 / 0.5 BTC |
| R06 | 結構化:申報門檻 | US$10,000、US$3,000、US$15,500 |
| R06 | 結構化:門檻區間與頻率 | 門檻 85%–100%,7 天內 ≥ 3 筆 |
| R06 | Smurfing(小額匯集) | 1 天內 ≥ 10 個來源、單筆 < US$1,000、合計 ≥ US$10,000 |
| R07 | 快速過帳 | 轉入後 1.0 小時(BTC 6.0 小時)內轉出 ≥ 80%;≥ 3 次;單次轉入 ≥ US$100 |
| R08 | 剝離鏈 | ≥ 3 次「小額支付 + 大額找零」,小額/大額比 < 0.2 |
| R09A/B | 資金匯集/分散 | 24 小時內 ≥ 20 個或 7 天內 ≥ 50 個不同地址 |
| R10 | 交易速度突增 | 單日筆數穩健 z > 3.5 且 ≥ 10 筆;基線 7–90 天 |
| R11 | 整數金額偏好 | 整數金額占比 ≥ 50%,樣本 ≥ 5 筆 |
| R12 | 休眠後活化 | 沉寂 ≥ 180 天,之後 7 天內移動 ≥ US$50,000 |
| R13 | 新地址大額 | 地址年齡 < 30 天,金額 ≥ US$100,000(≥ US$1,000,000 升為高) |
| R14A/B/C | 地址投毒 | 粉塵 < US$1;攻擊者:對象 ≥ 10 個、投毒轉帳占比 ≥ 80%;相似地址 = 首尾各 4 字元相同 |
| R16 | 跨鏈橋跳轉 | 2.0 小時內 ≥ 2 次跨鏈橋進出 |
| R18 | 統計離群金額 | log 金額穩健 z > 3.5、≥ US$10,000、≥ 中位數 5 倍;樣本 ≥ 10 |
| A | 統計異常指數 | 金額/間隔/單日筆數穩健 z ≥ 3.5(間隔 < 600 秒、爆量日 ≥ 10 筆);最多加成 10% |
| — | 交易所/服務商減權 | ×0.3,適用 R06、R07、R09A、R09B、R10、R11、R18 |
6. 風險評分
每條命中規則 i 有權重 wi(0–100)與強度 ci(0–1)。規則分數以 noisy-OR 合成,具飽和性,多條弱訊號不會無限累加:
再以統計異常指數 A(0–1;金額離群、短間隔連續交易、爆量日)做有上限的加成(最多 +10%):
最後套用嚴重度下限,避免關鍵訊號被稀釋,並四捨五入為整數:
- R01(地址本身在制裁名單)⇒ S = 100
- R02(與制裁地址直接往來)⇒ S ≥ 80
- 任一未減權之「極高」嚴重度規則 ⇒ S ≥ 75
- 任一未減權之「高」嚴重度規則 ⇒ S ≥ 50
交易所減權:若調查對象本身為交易所/服務商,行為類規則(R06、R07、R09A、R09B、R10、R11、R18)的貢獻乘以 ×0.3,以降低熱錢包大量收付造成的誤報。
0–24
低:一般盡職調查即可
25–49
中:加入觀察、必要時補充說明
50–74
高:啟動加強盡職調查(EDD)
75–100
極高:暫停往來並評估申報 STR
7. 機器學習異常偵測(Isolation Forest)
規則擅長捕捉已知態樣;為了發現「與該地址自身行為模式不同」的交易,系統另以 Isolation Forest(Liu, Ting & Zhou, 2008)做非監督式異常偵測。模型在瀏覽器端對每個地址即時訓練與評分,不需標註資料。
特徵(12 維,每筆交易一列)
| # | 特徵 | 中文名稱 | 定義 |
|---|---|---|---|
| 1 | log_usd | 金額規模 | log₁₀(1 + 美元金額) |
| 2 | direction | 資金方向 | 轉入 0、轉出 1、自轉 0.5 |
| 3 | hour_sin | 交易時段 | 交易時刻(UTC)的正弦編碼 |
| 4 | hour_cos | 交易時段 | 交易時刻(UTC)的餘弦編碼 |
| 5 | log_gap_prev | 與前筆交易間隔 | log₁₀(1 + 與前一筆的秒數) |
| 6 | log_hold | 轉入至轉出的持有時間 | 轉出距最近一次轉入的持有秒數(log) |
| 7 | cp_frequency | 交易對手往來頻率 | 該交易對手出現次數 / 總筆數 |
| 8 | first_interaction | 首次往來的對手 | 是否為首次往來的對手(0/1) |
| 9 | label_risk | 對手標籤風險 | 對手標籤風險(制裁 1、混幣 0.9…未標記 0.15) |
| 10 | amount_z | 金額偏離程度 | log 金額的穩健 z 分數(截斷於 ±10) |
| 11 | round_amount | 整數金額 | 是否為整數金額(0/1) |
| 12 | degree_24h | 24 小時內對手數 | log₁₀(1 + 24 小時內不同對手數) |
演算法
- 建立 100 棵隔離樹;每棵樹自 n 筆交易中不放回抽樣 ψ = min(256, n) 筆,樹高上限 ⌈log₂ ψ⌉。
- 每個節點隨機選擇一個特徵與介於最小、最大值之間的切點遞迴分割;異常點通常較早被「隔離」,路徑長度 h(x) 較短。
- 異常分數:
- s 接近 1 表示極易被隔離(異常),約 0.5 以下表示正常。s > 0.6,或位於前 5% 且 s > 0.5 時標記為異常。
- 可解釋性:以各特徵的穩健 z 分數找出偏離最大的特徵作為標記原因(例如「金額規模異常(z=+4.2)」)。
- 可重現性:亂數種子由地址決定,同一份資料每次結果相同。
- 樣本需 ≥ 20 筆成功交易,否則顯示「樣本不足」。
- ML 分數與官方風險分數分開呈現,不影響規則評分;它是協助調查人員排序與聚焦的輔助訊號。
8. AI Agent 設計(Z.ai GLM)
調查報告由 GLM 以 function calling 驅動的 Agent 產生。Agent 在 Worker 中執行,事件以 SSE 即時串流到瀏覽器(狀態、工具呼叫與結果、預算、報告)。可用工具:
| 工具 | 名稱 | 用途 |
|---|---|---|
| get_address_profile | 取得地址概況 | 餘額、交易數、首次/最近活動時間與地址標籤 |
| get_transactions | 取得交易紀錄 | 近期交易摘要(方向、對手、金額、時間),供報告引用 |
| run_aml_analysis | 執行 AML 規則分析 | 執行 21 條規則與評分;回傳分數、等級、命中規則與證據(分數以此為準) |
| screen_sanctions | 制裁名單篩查 | 檢查地址是否列於 OFAC SDN 名單 |
| trace_counterparties | 追蹤交易對手 | 追蹤主要交易對手的 1-hop 曝險(是否接觸制裁地址或混幣器) |
防幻覺護欄
- 分數由程式計算:風險分數、等級與規則命中只來自 run_aml_analysis,LLM 無權更改。
- 評分卡前置:報告開頭固定插入由程式產生的評分卡(分數、S_rules、統計加成、下限與規則貢獻表),LLM 的文字接在其後。
- 未驗證地址標註:報告中出現、但未經工具查得的地址會被標記為「未驗證」,並統計數量顯示於報告標頭。
- 預算與輪數限制:限制 Worker 子請求數與 LLM 輪數,避免失控迴圈;預算即時顯示於執行軌跡。
- 失效安全:LLM 無法使用或逾時時,改以規則模板產生完整報告(標示「規則模板(LLM 不可用)」)。
- 輸入清洗:代幣名稱、標籤等鏈上字串先去除控制字元與標記符號,降低提示注入風險;前端不渲染報告中的原始 HTML。
9. 限制
- 地址標籤與制裁名單並不完整;未標記不代表無風險,制裁名單亦可能有更新延遲。
- 受免費 API 分頁與 Worker 子請求上限影響,僅分析最近一段交易;長期歷史可能被截斷(會於「資料品質」標示)。
- 美元估值依可取得的價格資料換算,部分代幣(尤其新發行或假冒代幣)可能缺少價格。
- 1-hop 曝險僅追蹤主要交易對手,未做多跳圖分析;跨鏈資金流需人工串接。
- 規則門檻為一般化設定,可能對特定業務(如做市商、支付服務)產生誤報;交易所減權僅部分緩解。
- Isolation Forest 只比較地址自身的交易分布,對交易筆數少或行為極為一致的地址效果有限。
- LLM 報告可能出現措辭不精確;所有結論應以評分卡與規則證據為準。
- 情境資料為合成資料,用於展示偵測邏輯,不代表真實案件。