周一清晨六点四十,破晓传媒的办公室里还残留着昨夜排练时口琴和木吉他的余味。窗台上那只纸船被晨光镀了层淡金色,棱角被夜风磨得圆润了些,像一只还没决定要不要起航的帆。
何潇推门进来的时候,嘴里还叼着半块煎饼果子,看见程野已经坐在电脑前,背挺得笔直,屏幕的光映在他脸上,像一层薄薄的蓝色水膜。
“你几点来的?”何潇含混不清地问。
“六点半。”程野没回头。
何潇嚼完煎饼咽下去,走过去瞄了一眼屏幕。上面是一张密密麻麻的架构图,布满了不同颜色的节点和连线,像一张蛛网。他看不懂那些代码,但他注意到程野的手速快得几乎看不清。
“这是一个什么……网格?”何潇问。
“网状结构。”程野说,“不是网格。网格有中心,网状没有。”
他敲完最后几行代码,停下来,把屏幕往何潇那边转了转:“我昨晚想了一整夜。全域信息网的审查机制有个特点,它只审查中心化的传播路径。直播间的服务器、视频的存储节点、推荐算法的入口,这些都是单一的、可以被锁定的目标。只要我们还用他们的服务器直播,他们随时能切断信号。”
何潇点头:“所以呢?”
“所以,如果我们不把直播放在他们的服务器上呢?”
程野站起来,走到白板前,画了一个点。“这是破晓的直播间。”然后他在那个点周围画了十几个小圆圈,“这是每一个观众的手机。全域信息网可以切断一条路,但它不可能同时切断所有路——除非它把所有用户都屏蔽掉,那等于自断生命线。”
他放下笔,转过身来。何潇安静了一会儿,说:“我没太听懂,但你的意思是……我们不需要他们的服务器?”
“对。”程野说,“我们只需要每个人的手机。”
田笑和苏未晚几乎是同时到的。田笑手里端着一杯黑咖啡,苏未晚拎着一袋橘子。她们看见程野站在白板前,何潇坐在桌沿上,两个人面对着那张画满圆圈和连线的白板,像在看一张藏宝图。
“你们在密谋什么?”田笑问。
“程野有个想法。”何潇说,“他说,我们不一定要用全域信息网的服务器直播。”
田笑走过去看了一眼白板,看了很久,然后转头看着程野:“你确定可行?”
“不确定。”程野说,声音里带着一丝少见的温度,“但如果成功,我们将彻底打破他们的垄断。”
他话音刚落,已经转身坐回电脑前,手指落在键盘上,敲击声清脆而连贯,像一串急促的鼓点。屏幕上代码飞速滚动,他头也不抬地说:“给我四十分钟,第一版框架就能跑起来。”
田笑嘴角动了一下。她没有笑,但那个幅度,她已经听过这句话一次了。
苏未晚把橘子放在桌上,走到白板旁边也看了看:“那我们怎么直播?直接用手机拍吗?画质会不会很差?”
“画质不是重点。”程野说,手指没有停,“重点是内容能不能传出去。”他指了指白板上的小圆圈,“我的方案是这样:把直播拆成很多个十五秒的小片段,每个片段单独看只是一条普通的短视频,没有标题、没有标签、没有明显的直播间信息。然后通过社交软件的群组、私聊、加密频道,把片段分散传播出去。”
“但观众怎么看完整版?”田笑问。
“这就是关键。”程野说,敲下最后一行代码,屏幕上弹出一个绿色的“运行成功”提示框。他抬起头,“每个片段结尾会有一个隐藏线索——一串数字、一个图案、一段只有持续关注的人才能解码的暗号。观众把这些线索组合起来,就能在另一个加密频道里找到下一个片段。这个频道不公开,只能通过上一段视频里的线索进入。”
他顿了顿:“每一段视频都是下一段的钥匙。每个人只能看到一部分,但当足够多的人把线索拼在一起时,完整的直播就出现了。”
办公室里安静下来。窗外有风吹过梧桐树的叶子,发出沙沙的声音,像一阵低语。
田笑站在白板前,看着那些小圆圈,看了很久。然后她问:“如果平台把那些视频也删了呢?”
“他们可以删。”程野说,“但删一个,就会有另一个冒出来。我已经写好了自动分发系统,能把视频同时发到几百个不同的群组和频道里,每个群组的人数和规模都不同,但都可以互相转发。平台要一个个追踪、删除、封号,需要时间和人力,而我们只需要在它封掉一个之前,发出下一个。”
“就像打地鼠。”何潇说。
“差不多。”程野说,“只不过地鼠是我们,锤子是他们。”
田笑把咖啡杯放在桌上。她看着程野,眼里的神色很复杂——有一点惊讶,有一点怀疑,还有一点她自己说不清的东西。她最后说:“那你需要多久?”
“今天。”程野说,指了指屏幕,“第一版框架已经跑通了。如果顺利,后天我们就能测试。”
“那就做。”田笑说。
她拉开椅子坐下来,翻开旧笔记本,在空白页上写下几个字:“周三测试直播。”
苏未晚剥了一个橘子,掰了一半递给程野。程野接过,说了声谢谢,咬了一口,继续敲键盘。
周远是在他们讨论到一半的时候推门进来的。他穿着一件洗得发白的深蓝色外套,手里拎着一个旧保温杯。进门后他没有立刻说话,而是站在门口,看着白板上那张画满圆圈和连线的图,看了很久。
“这是程野的方案。”何潇说,“他说我们可以不依赖全域信息网。”
周远点了点头,走到桌边把保温杯放下,坐下来,问程野:“有需要我帮忙的地方吗?”
程野想了想:“我需要一个人帮我测试视频的传播路径。我需要有人模拟观众,把片段从一个群组转发到另一个群组。你可以帮我做这个吗?”
周远点了点头:“可以。”
他没有再问更多。整个上午,办公室里只有键盘敲击的声音、橘子皮被撕开的声音、杯子和桌面轻轻碰撞的声音。窗外梧桐树的影子随着太阳的移动慢慢倾斜,从墙角爬到了地板中央。
中午的时候,苏未晚推门进来,手里拎着一个塑料袋,里面装着几个饭盒,是附近那家面馆的炒面和饺子。她看见所有人都在低头忙自己的事,程野面前的屏幕上铺满了代码,田笑在白板上画着新的示意图,苏未晚在纸上写写画画,周远手里捧着一台旧手机,正在模拟群组转发。
“先吃饭。”苏未晚说。
没有人抬头。
苏未晚把塑料袋放在桌上,掀开盖子,炒面的热气冒出来,混着葱油和酱油的香味。何潇第一个抬起头,吸了吸鼻子:“面馆的?”
“嗯。”苏未晚说。
何潇站起来,走过来拿了双筷子,夹了一口炒面塞进嘴里,含糊地说:“好吃。”
其他人陆续放下手里的东西,围过来开始吃饭。程野也站了起来,走到桌前拿了一双筷子,但没急着夹。他站在那儿,目光落在桌上那碗热气腾腾的炒面上,筷子尖在碗沿轻轻点了一下,像在数面条的热气。
“怎么了?”苏未晚问。
“我在想一个事。”程野说,“如果我们要让直播碎片化传播,那每一段视频的开头或结尾,都需要有一个固定的标识——让看到的人知道,这是破晓的内容。”
“标识?”何潇问,“什么样的标识?”
“一个声音。”程野说,“不需要画面,不需要文字,只需要一个声音。一段很短的声音,像水印一样,嵌在每一段视频的开头或结尾。听到这个声音的人就知道:这是破晓的。”
苏未晚放下筷子,想了想:“比如什么声音?”
“比如口琴。”程野说,“何潇那把口琴吹出来的第一个音。”
何潇愣了一下。那把旧口琴还躺在布包里,放在桌角,像一枚安静的种子。他伸手把布包拎起来,口琴从里面滑出来半截,金属壳在日光灯下闪了一下。他盯着它看了两秒,忽然觉得这玩意儿变沉了,像一枚印章,能在每一段碎片上盖下印记。
“可以。”何潇说,“我今晚录一段。”
“不是今晚。”程野说,“是现在。”
何潇把筷子放下,走过去拿起那把口琴。他掀开布包,把口琴握在手里,金属的凉意从掌心传来。他犹豫了一下,问:“吹什么?”
“不用太长。”程野说,“一个音就够了。但那个音要有辨识度——别人一听就知道,是破晓。”
何潇站在窗边,想了一会儿。然后他把口琴凑到唇边,吹了一个音。那个音很轻,不是完整的旋律,只是一个单独的音符,像一颗石子落进水面,激起一圈涟漪。它不属于任何已知的曲调,但有一种奇特的、干净的质感,像清晨第一缕光穿过窗帘时发出的声音。
程野听完,点了点头:“就是这个。”
何潇放下口琴,手指在琴身上摩挲了一下。他忽然觉得这琴比刚才沉了一点——它已经不是一把旧口琴了,它是一枚印章。
下午的时候,程野搭出了第一版方案的框架。他把整个直播流程拆成了五个阶段:录制、切片、加密、分发、拼接。录制和切片在本地完成,加密在本地完成,分发通过社交软件群组和加密频道完成,拼接则需要观众自己完成,通过每一段视频里的线索,逐步找到下一段。
田笑站在白板前,看着程野把整个流程图用线条串起来,沉默了一会儿,问:“观众会不会觉得麻烦?”
“会。”程野说,“麻烦点好,能留下真正想听我们唱歌的人。”
“就像寻宝。”何潇说。
“就像寻宝。”程野说。
周远坐在角落里,手里拿着那台旧手机。他已经模拟了二十多次群组转发,每一次都能顺利把视频从一个群传到另一个群。他抬头看着程野:“测试通过。这个方案可以走通。”
程野点了点头,但没有放松。他转过身,看着白板上那张图,像是在看一件还没有完成的作品。
苏未晚走到他身边,问:“最大风险是什么?”
程野想了想:“被追踪。如果全域信息网派出专门的技术团队来追踪这些碎片的来源,他们可以通过视频的元数据——拍摄设备型号、编码格式、上传时间,来锁定我们的设备。”
“那怎么办?”苏未晚问。
“清洗元数据。”程野说,“我已经写了脚本,每一段视频在上传前,都会自动清洗所有元数据,并修改编码格式。这样即使他们追踪,也只能追到一个空壳。”
苏未晚沉默了一会儿,说:“你什么时候开始想的这些?”
程野没有回答。他低头看了一眼屏幕,屏幕上那行字还亮着——“去中心化直播方案_v0.1”。他把它改成了“v0.2”。
窗外,太阳开始向西边斜去,梧桐树的影子被拉得很长。傍晚的光线从窗户斜斜地切进办公室,在地板上画出一道金黄色的分界线。
傍晚六点半,程野完成了第一轮测试。他调试了三次加密算法,才确保每个片段的线索无法被系统自动识别——前两次尝试中,全域信息网的自动扫描程序都能通过特征匹配将片段串联起来,直到他改用非对称加密并打乱时间戳,才终于让每个片段在系统眼中变成孤立的、毫无关联的普通视频。
他把三段十五秒的视频片段分别发给了三个不同的群组,一个聊天群、一个加密频道、一个私聊窗口。每个视频结尾都嵌着一个不同的线索:第一段结尾是一串数字,第二段结尾是一个图案,第三段结尾是一段旋律的尾音。三段视频合在一起,观众才能拼出完整的直播入口。
何潇作为“观众”,用三个不同的账号分别接收了这三段视频,然后按照线索找到了加密频道,成功拼出了完整的直播入口。整个过程用了不到三分钟。
“成了。”何潇说。
程野看着屏幕上那个完整的直播入口,没有说话。他靠在椅背上,长长地呼出一口气。他的眼睛下方有淡淡的青色,那是连续两天熬夜留下的痕迹,但此刻他的眼神是亮的。
窗外,路灯亮了起来。梧桐树的影子已经融进夜色里,像一张被墨汁浸透的纸。远处有鸟叫了一声,然后一切又安静下来。
周远走到白板前,看着那张画满圆圈和连线的图。他看了一会儿,目光落在那行“碎片计划:v0.3”的字样上,又移开,望向窗外远处那片灯火。他沉默了很久,久到办公室里只剩下键盘的轻响和杯沿碰触桌面的声音。然后他转过身来,声音比平时低了一些,像是斟酌了很久才说出口:“这段口琴音,放到每一段视频的开头吧。”
何潇抬起头,看着他:“为什么?”
周远没有立刻回答。他低头看着自己那双因为常年握乐器而布满薄茧的手,指腹无意识地摩挲着保温杯的杯壁。半晌,他才开口,声音里带着一种少见的、近乎固执的认真:“因为那些碎片,即使被风吹散,也会记得彼此的形状。但听到那个音的人,会知道那些碎片是同一个完整的东西——即使它们被拆开、被分散、被掩埋。那一声口琴,就是它们之间的连线。”
他顿了顿,目光落在何潇放在桌角的那把口琴上,补了一句:“而且,那个音里有我们排练时留下的东西,不是技巧,是那时候我们相信能唱下去的那股劲儿。别人听到,会觉得这不是随便一个什么人发的东西,是有人在认真说话。”
办公室里安静下来。没有人说话。只有程野的手指在键盘上轻轻敲了一下,发出清脆的声响,像一枚棋子落在棋盘上。
窗外,夜色渐浓。但那座城市里,有一些碎片正在被发出、被转发、被拼接——像一颗种子,被风吹到土壤里,还没有发芽,但它已经落在了那里,开始吸收水分。
苏未晚拿起笔,在白板右下角写下了几个字:“碎片计划:v0.3。”
她写完这行字,放下笔,退了两步,看着那张白板。白板上是密密麻麻的线条、圆圈、箭头和代码片段,像一张城市地图,不是那些被规划好的大马路,而是那些藏在楼与楼之间的、只有走惯了的居民才知道的小巷。
夜风从窗缝里灌进来,吹动白板上那张画着方案的A4纸。纸翻了一个角,但没有被吹走。它稳稳地停在白板上,像一枚还没有被撕下的邮票。
远处,一座高楼的顶层亮着一盏灯,那是天幕集团大楼的方向。那盏灯亮着,像一只没有闭上的眼睛,俯瞰着这座城市。但程野没有抬头看它。他低着头,看着自己的屏幕,屏幕上是一行行代码,像一条条细小的河流,正在从城市的地下穿过,流向每一个有手机的人。
那些河流不经过任何人的审批。它们只需要一个声音作为出口,和一块土壤作为入口。
何潇将口琴放回布包,布包微微敞开,金属的反光在昏暗的办公室里划出一道细长的银线。那把口琴躺在布包里,金属的表面上还残留着他嘴唇的温度。他看着它,安静了一会儿,然后说:“我们周三测试吧。”
“周三。”程野说。
苏未晚看着白板上那行字——“碎片计划:v0.3”——没有再说什么。她走到窗边,看着窗台上那只纸船。纸船还停在那里,像一只还没有起航的船。但风已经吹了它一整天了,它的棱角已经被风磨得不再那么尖锐。
夜色浓稠。远处的灯光像碎金一样铺在黑暗的河面上,每一盏灯都像是一个正在等待信号的接收器。而在这个城市的某个角落里,有一段口琴音正在被录下、被切片、被加密,即将被投进那片沉默的海洋里。
它会在水面上漂一会儿,然后被一只手捞起来,传给另一只手。它会被转发、被复制、被粘贴,像一枚漂流瓶,从一个群组漂到另一个群组,从一个深夜漂到另一个深夜。
没有人知道它最终会漂到哪里。但程野知道,它已经不需要任何人的批准才能起航了。
他的手机在裤兜里震了一下。他掏出来看了一眼,一个陌生号码发来的短信,只有一行字:
“口琴音很好听。但你们真的以为,碎片就没有影子吗?”
短信没有署名。程野盯着那行字,瞳孔微微收缩,手指在键盘上停顿了一瞬,随即敲击速度加快了一倍。屏幕上,他刚写完的自动分发脚本末尾有一行注释——“备用方案:若主路径被追踪,切换至备用节点”。他沉默了两秒,然后删掉了那行注释,重新敲下一行字:“若主路径被追踪,立即触发数据自毁协议,并启动预设的伪装流量。”
他没有告诉任何人。但他想起了上周调试系统时,偶然在日志里看到的一串异常访问记录——来自天幕集团内部网络的探测请求,每隔几个小时就会扫过一次破晓传媒的公开端口,像是某种例行巡查,又像是猎人在确认猎物的位置。他当时以为是巧合,现在想来,那或许不是巧合。
窗台上那只纸船被夜风轻轻推了一下,转了半个圈,船头指向窗外那片被灯光照亮的城市。