前面十章,我们把零件一个一个拆开看过了:账户就是银行欠你的钱、复式记账、央行账户、清算和结算的区别、代理行、Nostro/Vostro(同一个账户的两个视角)、还有 SWIFT——它只发消息,不搬钱。
现在到了把所有零件装进一台机器、按下启动键、看它整条链路怎么跑的时候。这一章我们只做一件事:拿一个具体的例子,用慢动作,一跳一跳地走完一笔跨境汇款。走完你会亲眼看到一个也许有点反直觉的事实——那 1000 美元从头到尾没有飞越太平洋,它只是在一串账户上被加加减减,同时另一条轨道上飞着一串 SWIFT 消息。
说人话:钱没「过去」,是「账本上改数字 + 发通知」这两件事配合着,把「谁欠谁」这件事重新排列了一遍。
先摆好人物和道具
小王在中国工商银行(ICBC)有个美元账户,他想给美国的老张汇 1000 美元。老张的钱要落到美国的一家小银行,我们叫它 Bank A。
问题来了:工行和 Bank A 之间没有直接的代理关系——它们俩谁也没在对方那儿开过账户,彼此不认识。(回忆第八章:两家银行要直接互转,得先互相开户建立代理关系。)所以这笔钱得找「中间人」接力。
接力链是这样搭的:
- 工行的美元代理行(帮工行在美国境内持有和收付美元的银行)是纽约的花旗(Citi)。也就是说,工行在花旗开了一个美元账户。
- Bank A 太小,自己够不着大网络,它的上手代理行是摩根大通(JPMorgan,简称 JPM)。也就是说,Bank A 在 JPM 开了个账户。
- 花旗和 JPM 都是美国的大行,它们之间互相有账户、有代理关系,能直接结算。
于是链路是:工行 → 花旗 → JPM → Bank A。四家银行,三跳。
这就是工程师最熟的东西:一个请求要经过好几层中间件才到后端。每一跳都是一个中间件,每一跳都要鉴权、记账、还可能把你拦下来检查。
两条轨道:一定要分清
整章的主线就一句话,请把它钉在脑子里:
资金流(钱):各家银行在自己账本上改 Nostro/Vostro 数字。
消息流(指令):SWIFT 上飞来飞去的 MT103 之类的消息,本质是「请你替我改账」的通知。
这两条轨道是平行跑的。消息先到,不代表钱到;钱到,也得靠账本上真的改了数字、并且两边对上了账。消息 ≠ 资金——这是第十章反复强调的,现在你要看它在真实链路里怎么体现。
慢动作开始
第 0 跳:小王掏钱
小王在工行 App 点了「汇出 1000 美元」。工行做的第一件事,是在自己的账本上:
- 把小王的账户余额减 1000 美元(他对工行的债权少了 1000);
- 顺手把手续费也扣了(后面细说这笔费怎么回事)。
此刻钱还在工行手里,一步都没出去。工行现在欠自己一个内部任务:把这 1000 美元想办法送到 Bank A。
第 1 跳:工行 → 花旗
工行的美元都「停」在花旗的那个账户里。从工行的视角,这是它的 Nostro 账户(我在别人家的钱);从花旗的视角,同一个账户是 Vostro 账户(别人存在我这儿的钱)。同一个账户,两个视角,第九章讲过。
现在发生两件事,同时发生:
- 消息流:工行给花旗发一条 MT103(就是那张标准格式的「客户汇款指令」电报)。内容大意是:「请从我在你这儿的账户里划 1000 美元出去,最终收款人是 Bank A 的老张,下一手请走 JPM。」
- 资金流:花旗收到指令、做完检查后,在自己账本上把工行的 Vostro 账户减 1000。
注意看:钱没有从中国「发」到美国。工行的美元本来就在花旗。这一跳只是花旗在自己账本上把工行那笔余额调小了 1000,然后花旗接手了「把这 1000 送到 JPM」这个任务。
工行说:「我在你花旗存的钱,帮我付出去 1000。」花旗说:「收到,你账上少 1000,剩下的我来接力。」
第 2 跳:花旗 → JPM
花旗和 JPM 是同级大行,彼此有账户。这一跳的钱怎么挪,取决于它俩之间怎么结算——通常是通过美国的银行间清算系统(比如 Fedwire 或 CHIPS)在央行账户/清算账户层面轧一笔。你不用记系统名字,只记住结论:
- 消息流:花旗再发一条消息给 JPM:「有 1000 美元给你,最终落到 Bank A 的老张,请你入账。」
- 资金流:花旗和 JPM 之间做一次结算——花旗欠 JPM 的钱这边加、那边减(或者通过它们各自在美联储的账户对划)。总之在这两家的账本上,1000 美元的「归属」从花旗这边移到了 JPM 这边。
钱还是没「飞」。它只是又在一对账本上改了一次数字。每多一跳,就多一对账本要改、多一次要对账。
第 3 跳:JPM → Bank A
Bank A 在 JPM 开了账户。从 Bank A 看是 Nostro,从 JPM 看是 Vostro——又是同一个账户的两个视角。
- 消息流:JPM 通知 Bank A:「有 1000 美元进来,收款人老张。」
- 资金流:JPM 在自己账本上把 Bank A 的 Vostro 账户加 1000。
最后一步:Bank A → 老张
Bank A 看到自己在 JPM 的账户多了 1000,于是在自己的账本上,给老张的账户加上钱(记住第一章:老张账户上的数字,就是 Bank A 欠老张的钱)。到这儿,老张终于「收到钱」了。
回头看整条链,你会发现一个漂亮的事实:
1000 美元从来没有作为一坨东西移动过。发生的全部事情,是四家银行在各自账本上做了一连串「这边减、那边加」的动作,串起来的净效果是:小王少了 1000,老张多了 1000,中间每家银行的债权债务重新排了一遍队。消息负责传达「该怎么改」,账本负责「真的改」。
为什么要 1 到 3 天?
你可能会想:不就是几家银行改几个数字吗,计算机一秒钟的事,凭什么要一两天?原因是这条链上每一跳都有自己的「慢」:
- 跨时区 + 营业时间:中国和美国差十几个小时。你这边上午发出,人家那边还在睡觉。每家银行只在自己的工作时间处理。
- 批处理窗口(cut-off):很多银行不是来一笔处理一笔,而是攒到每天固定的截止时间(cut-off)再打包处理。错过今天的窗口,就得等明天那一批。链上四家银行,四个 cut-off,一个没赶上就顺延一天。
- 合规筛查:每一跳的银行都要做反洗钱(AML)和制裁名单筛查——把收发款人的名字往黑名单上比对。一旦名字撞车(哪怕只是重名),这一跳就被拦下来转人工核查,可能卡好几个小时甚至几天。链上有几跳,就有几道这样的关卡。
- 结算不是实时:跳与跳之间要在多家银行的账本上依次改数字、还要两两对账确认对上了,很多结算是按批次、甚至隔夜完成的。
不是某一步特别慢,是每一步都慢一点点,四家银行串起来就攒成了一两天。就像一个请求穿过四层中间件,每层都排队、每层都要审一遍,端到端的延迟就上去了。
为什么手续费被一层层扣?
老张有时会发现:小王明明汇了 1000,自己到账却只有 970 几。钱去哪了?被链上各家收「过路费」了。
发起行(工行)收一道手续费;中间每一家代理行(花旗、JPM)也都要收自己的一份——处理、发报、记账,都是它们的成本,它们要收电报费/中间行费用。谁来付这些中间行的费,有三种约定,写在汇款指令里:
- OUR:所有费用都由汇款人(小王)承担。老张能收到完整的 1000,但小王要额外多掏中间行的费。
- BEN:所有费用由收款人(老张)承担。每家中间行直接从这 1000 里扣走自己的份,所以老张收到的是被扣剩的——「汇 1000、到手 970 几」最典型就是这种。
- SHA(shared,最常见):发起行的费小王付,中间行的费从本金里扣。这也是为什么到账常常比原数少一点。
关键点:中间行不是活雷锋,每接力一手都要收钱,而且 BEN/SHA 下它们是直接从你汇的钱里抠。跳数越多,被抠的层数越多。
为什么常常查不到钱到哪了?
小王第二天想查:我的钱现在在哪一跳?往往查不到。因为:
- 多跳、每跳一个系统:钱经过工行、花旗、JPM、Bank A 四家,每家有自己的内部系统和账本。工行只知道自己把指令交给了花旗,交出去之后就像把包裹丢进一个不透明的管道,后面几跳它看不见。
- 早年没有端到端追踪:老式的 SWIFT 消息就像一封封独立的电报,一跳发一封,没有一个贯穿全程的统一编号能让你顺着查到底。每一跳是个黑盒,连起来就是一条查不透的链。
工程师一秒就懂:这就是没有 trace id 的分布式系统。请求穿过四个服务,每个服务各记各的日志,格式还不一样,出了问题你根本没法把一整条链路串起来看。
后来 SWIFT 搞了个改进叫 SWIFT gpi(Global Payments Innovation),核心就是给每笔汇款配一个贯穿全程的追踪号(相当于终于给这条链加上了 trace id),让各跳的状态能被查到、到账更快也更透明。点到为止,你知道有这么个东西补了这个洞就行。
收个尾
把这一章连起来看:一笔跨境 wire,就是沿着代理行链一跳一跳地在各家账本上改 Nostro/Vostro 数字(资金流),同时用 SWIFT 消息一路传达「该怎么改」(消息流)。钱从没飞过大洋,飞的只是指令;到账靠的是每一跳账本上真真切切地加减和对账。慢,是因为多跳、跨时区、要过 cut-off、要合规筛查、结算不实时;贵,是因为每一跳都收过路费;不透明,是因为早年没有端到端的追踪号。
但你也得公平地看它另一面:这套管道是一百多年一点点攒出来的,它能用、可信、几乎连通全世界每一家银行。慢、贵、不透明是它的毛病,可信、通用、经得起考验是它的本事。正因为它这么难被取代,第十六章那些想颠覆它的新方案——稳定币、央行数字货币——才既让人兴奋,又推进得那么艰难。
不过在去看未来之前,我们还得先回答一个更吓人的问题:这条链在一跳跳改账、还没全部对完账的中间那一刻,万一有一家银行突然倒了,会怎样?下一章,我们讲一桩真事——赫斯塔特。