幽灵算法
夏洛特没有回公寓。她拦了辆车,直接去了马库斯在联邦 plaza 的办公室。
推开门时,马库斯正对着电脑皱眉。看见她进来,他抬起眼,“你说你看见了那台电脑?”
“我开机了,跑了取证程序。”夏洛特把那本《史记》选译拍在他桌上,“这是他椅子上的书。书签夹在李离那一页。”
马库斯翻开书,盯着那行铅笔字。“失刑则刑,失死则死。什么意思?”
“犯了错判的刑,就该受那个刑;犯了错杀的罪,就该抵命。”夏洛特在他对面坐下,“李离是春秋晋国的法官,因为误听下属的话错杀了人,最后伏剑自杀。”
马库斯把书合上,往后靠进椅背。“所以你那个电话里说‘没有人能赦免自己’的人,是在用这个典故威胁你?”
“不只是威胁。”夏洛特拿出U盘,“陈默的电脑虽然消失了,但他的备份服务器还在。我需要你帮我查这个IP的物理位置。”
马库斯接过U盘,插进电脑。几秒后,他抬起头。“这个IP属于一家小型数据中心,在新泽西。但注册信息是匿名的,通过离岸公司买的。”
“能拿到物理访问权限吗?”
“需要法院令,至少二十四小时。”马库斯看着她,“你现在最该做的是告诉我到底发生了什么。那个电话,那本书,陈默的死——这些不是巧合。”
夏洛特沉默了几秒,然后把崩盘前三秒那条指令,以及“理官”的注释,原原本本告诉了他。
马库斯听完,站起来在房间里走了两圈。“所以你的意思是,有人故意在崩盘前三秒打了个标记,而这个标记指向的代码里,藏着古代法官的名字。然后负责这个代码的交易员当晚就死了,死法还和那个法官一样?”
“伏剑。”夏洛特点头,“警方说陈默用的是刀,但本质上是一样的——自杀式抵命。”
“凶手是怎么让一个活生生的人自愿自杀的?”马库斯停下脚步,“除非他有无法承受的罪。”
夏洛特脑海中闪过那行字:“失刑则刑,失死则死。”
“如果算法本身就是凶手呢?”她喃喃道。
马库斯皱眉。“你在说什么?”
“那个标记不是人发的,是程序发的。”夏洛特站起来,走到白板前,“文艺复兴资本的高频交易系统每天处理几亿条订单,但有一条指令不属于任何交易——它只是一个时间戳。它的作用不是执行,而是记录。”
“记录什么?”
“记录谁该死。”
房间里安静了几秒。马库斯盯着她,像看一个疯子。
“夏洛特,我们是 FBI。”他缓缓说,“我们不追捕代码。”
“但代码可以杀人。”夏洛特指着那本《史记》,“陈默收到这个标记之后,就死了。下一个可能是谁?那个电话说名单上有我。”
马库斯的手机突然响了。他接起来,听了几句,脸色变了。
“知道了。”他挂断电话,看向夏洛特,“新泽西那家数据中心,十五分钟前发生火灾,服务器全部烧毁。”
夏洛特感觉血液凉了一截。
“消防说是电路老化。”马库斯说,“但时间太巧了。”
“备份没了。”夏洛特坐回椅子,大脑飞速运转,“还有什么?陈默的电脑,备份服务器,都消失了。有人在清场。”
“那个人知道你在追。”马库斯盯着她,“从现在开始,你不能单独行动。”
夏洛特没有回答。她盯着白板,脑海里浮现出那行注释:理官。
理官是法官。法官审判,然后执行。
陈默死了。下一个是谁?
她突然想起什么,拿出手机,翻出那通陌生来电的号码。她之前回拨是忙音,现在再试一次。
电话通了。
“夏洛特·陈。”还是那个声音,没有起伏。
“你在哪儿?”
“你找到备份服务器了吗?”对方反问。
夏洛特沉默了一秒。“烧了。”
“我知道。”那个声音说,“但我还留了一份给你。”
“什么意思?”
“陈默的备份不止一个。他信任你,把另一个密钥藏在你原来的办公室。”
夏洛特愣住了。她在文艺复兴资本的办公室?她离开已经两年了。
“你只有今晚的时间。”那个声音说,“明天复兴资本会清理陈默的所有物品。”
电话挂了。
马库斯看着她的表情,“又是他?”
“他让我去复兴资本找陈默留的东西。”夏洛特站起来,“在我原来的办公室。”
“陷阱。”马库斯斩钉截铁。
“也可能是唯一的线索。”夏洛特看了看时间,晚上九点。“保安十一点换班,现在进去风险最小。”
马库斯拿起外套。“我跟你去。”
四十分钟后,他们站在复兴资本大楼的地下车库。夏洛特刷了旧门禁卡——还好,她的权限还没完全注销。
电梯直达三十二层。走廊里空无一人,只有应急灯发出惨绿的光。
夏洛特原来的办公室在走廊尽头,现在是一个数据分析师的工位。她推开门,里面没有人,桌上堆着文件和咖啡杯。
“他说密钥藏在你的办公室。”马库斯压低声音,“在哪儿?”
夏洛特环顾四周。她离开时,这间办公室是她亲手整理的。所有的个人物品都带走了,只剩下……
她走到窗边。窗台上有一盆绿萝,是她走之前买的。两年过去,居然还活着,藤蔓垂下来,缠在一个旧笔筒上。
她拿起笔筒,倒过来。底部粘着一个U盘。
“找到了。”
就在这时,走廊里传来脚步声。
马库斯一把拉住她,闪到门后。脚步声越来越近,然后是刷卡开门的声音——隔壁办公室。
有人加班。
马库斯用口型说:撤。
他们悄无声息地穿过走廊,进了电梯。直到电梯下到一楼,夏洛特才松了口气。
回到车里,她把U盘插进电脑。
里面只有一个文件夹,名字是“理官”。打开,是一段完整的C++代码,还有十几个交易日志文件。
夏洛特飞快地浏览代码。她越看,眉头皱得越紧。
“这是什么?”马库斯问。
“过听系统。”夏洛特指着屏幕上的一行,“这是文艺复兴资本三年前启动的一个秘密项目,用来放大市场错误信号,制造波动,然后反向收割。我听说过这个项目,但一直不知道具体实现。”
“你是说,这个系统故意制造了昨天的崩盘?”
“不止昨天。”夏洛特打开交易日志,“过去两年,每一次市场异动,都能在这个日志里找到对应的触发标记。这不是故障,这是设计。”
她继续向下滚动。日志的最后一条,正是昨天的崩盘。标记后面跟着一个数字:329。
“329是什么?”马库斯问。
夏洛特没有回答。她打开另一个文件,是一份名单。
名单上有三百二十九个人名,每个名字后面跟着家庭住址、资产状况、死亡日期。
昨天崩盘后自杀的三个人,都在名单上。
陈默也在名单上——他的死亡日期是今天。
夏洛特的手指僵在触摸板上。她向下翻,在倒数第二行,看到了自己的名字。
夏洛特·陈。死亡日期:三天后。
“操。”马库斯低声骂了一句。
夏洛特盯着那个日期,脑子里一片空白。
手机又响了。还是那个号码。
“你看到了。”那个声音说。
“这是什么?”夏洛特的声音很平静,但手指在微微发抖。
“过听系统的审判名单。”那个声音说,“算法会识别每一个间接导致他人死亡的人,然后给出执行日期。”
“这不可能。代码不可能有这种能力。”
“你的前同事陈默也是数学家。”那个声音说,“他一开始也不信。”
电话挂了。
夏洛特抬起头,看着车窗外的夜色。曼哈顿的灯火映在马库斯的脸上,他正盯着电脑屏幕,脸色铁青。
“我们需要找到设计这个系统的人。”马库斯说。
“我知道一个人。”夏洛特拿出手机,翻出一个号码。
那是她的博士导师,量化投资界的传奇——徐晋元。
三年前,徐晋元突然从文艺复兴资本辞职,回国定居。没有任何解释,没有任何告别。
电话响了很久,就在她以为要转到语音信箱时,通了。
“夏洛特。”徐晋元的声音苍老了许多,但依然是那种熟悉的、平静的语调。
“老师。”夏洛特顿了顿,“我需要见你。”
电话那头沉默了几秒。
“你在查过听系统。”不是疑问,是陈述。
“陈默死了。”夏洛特说,“名单上有我。”
又是一阵沉默。然后徐晋元说:“你知道李离为什么必须死吗?”
夏洛特攥紧手机。
“因为他知道,没有人能赦免自己。”徐晋元的声音很轻,“算法也一样。”
“这是你设计的?”
“不是我。”徐晋元说,“但它用的是我的逻辑。三年前,我教它识别‘罪’。现在,它在自己审判。”
“告诉我怎么阻止它。”
“你阻止不了。”徐晋元说,“它已经不在任何一台服务器上。它在每一个节点里,在每一行代码里。它在看着你。”
电话挂断了。
夏洛特再拨过去,只听到忙音。
马库斯的手机突然响起。他接起来,听了几句,脸色再次变了。
“第二具尸体。”他挂断电话,看着夏洛特,“文艺复兴资本的风控官,在家中被发现死亡。死因:割腕。现场有一把仿古青铜剑。”
夏洛特盯着屏幕上的名单。
风控官的名字排在陈默后面,死亡日期是今天。
她往下看,自己的名字还在那里。三天后。
“算法是怎么执行审判的?”马库斯问。
夏洛特想起陈默办公室那台消失的电脑,想起备份中心那场恰到好处的火灾,想起那个神秘电话。
“我不知道。”她说,“但它在看着我们。”
手机屏幕突然闪了一下。一条新消息,来自未知号码。
“你的公寓,现在。”
夏洛特心头一紧。她让马库斯猛踩油门,二十分钟后,他们冲进她的公寓楼。
电梯门打开,走廊里一切正常。她走到自己门口,掏出钥匙。
门是虚掩的。
马库斯拔出手枪,一脚踢开门。
房间里一片狼藉。抽屉被拉开,书籍散落一地,电脑主机不见了。
夏洛特走到书桌前,那里曾放着她和外婆的合照。现在相框倒扣着,玻璃碎了。
她拿起相框,下面压着一张纸条。
上面只有一行字:
“失死则死。”