“我打开球迷卡,分数已经安安静静地待在那里了。没人碰过任何东西。”这是12th Man的创建者描述的那个时刻。上周六英格兰2比1淘汰挪威的四分之一决赛结束后,他像往常一样打开了自己在Solana链上的球迷卡,3分已经到账——他在开赛前就准确预测了2比1的比分,而整个过程,从他观看比赛到分数入账,没有第二个人、也没有中心化服务器介入。那个瞬间让他觉得,这东西不再是demo了。

12th Man是一个为世界杯球迷搭建的链上空间,名字取自足球文化里把球迷称作“第12人”的传统。每支球队有11名场上球员,而看台上、屏幕前的观众就是第12个。这个项目的起点很私人:创建者自己一场不落地看世界杯,却总在群聊里遇到相同的尴尬——“有人开赛前就在群里喊了准确比分,第二天醒来消息被埋在了400条新消息下面,没人相信他。”球迷的激情就那样凭空消失了。他决定造一个它没法消失的地方。

打开网易新闻 查看精彩图片

这个想法被实现在Solana开发网上。整个应用只有一个Anchor程序和一个Next.js前端,没有传统后端,没有任何数据库,所有状态都是链上账户。程序的ID是EwCR98M9we9XSNpNA7jnSh9HKXdQWtZPonLdJZ6yM6Kc,已经通过了14个测试。对于想要上手体验的人,创建者留了一条低门槛路径:无需持有任何加密资产,访问twelfth-man.vercel.app,在About页面找到三个共享测试账户,每账户里已经预置了devnet SOL(纯玩具,无实际价值),把Phantom钱包切到测试网模式,导入一个助记词,两分钟内就能参与进来——领一张球迷卡,在墙上发一句呐喊,猜一个比分。

球迷卡是整个系统的起点。一个钱包只能领一张卡,这个“一人一卡”的约束不是靠代码里的if判断,而是由链本身强制执行。每张球迷卡是一个程序派生地址(PDA),种子源自钱包公钥,因此每个钱包在程序中只能生成唯一的一张卡。创建者强调“选择队伍时要谨慎,一旦选定就不能再换边”,这个锁定同样不是靠前端按钮灰掉,而是卡的数据结构只允许设定一次国家队代码。一旦初始化交易上链,修改的通道就被程序逻辑彻底关死。

球迷墙则承担了社交镜像的功能。你可以发帖,用文字喊出对球队的声援,一旦发布便不可编辑、不可删除。创建者没有解释为什么连删除都不允许,但从足球看台的经验来看,呐喊一旦出口就没有撤回键——墙上的每一行口号都是某种永久的在场。这些内容存储在链上账户里,不依赖任何内容审核系统,一个人发了什么,所有人都能读到,且永久可见。

最让球迷有参与感的模块是赛前比分预测。规则简单:锁定预测的窗口是开赛前,开赛后哪怕迟到一秒也会被拒绝。这个约束同样由链上时钟保证——程序里的predict指令会比对当前集群时间与比赛预定开球时间,一旦发现链上时间已晚于开球时间,交易直接失败。预测一旦提交便不可更改,赛后结算全凭三段式计分:完全命中比分得3分,只猜对胜负关系(结果正确)得1分,其余情况不得分。所有分数按国家队汇总,最终生成一份“最响亮球迷阵营”的排行榜,排行榜不是由一个调度任务计算出来的,而是直接从链上的球队统计账户读出——每条预测被结算的瞬间,积分就累加进对应国家代码的PDA里,排行榜因此实时反映当前链上状态。

结算环节的设计充分体现了“无需许可”的思路。这是一场任何人都可以替他人发起的结算程序,不需要项目方或任何特权机器人充当中间人。当一场比赛结束、最终比分被确认后,任意用户都可以调用settle指令,指向某一条预测记录,程序会校验传入的结果是否与预言机已上链的赛果一致,再执行计分。创建者说,他不希望有什么特殊机器插在球迷和他们的分数之间——这种设计把参与权彻底下放,既避免了单点故障,也让每个球迷都能主动“为自己和别人的预测上账”。

预言机部分做了一次务实的权衡。结果数据来源于ESPN的公开比分板,创建者写了一个小型轮询脚本,每隔几分钟抓取一次页面。为了抵抗API瞬间错误带来的误结算,脚本只会在连续两次抓取都显示比赛已结束时,才将最终比分以交易形式提交上链。这一步仍然带有一个信任假设:结果本身来自创建者的管理员密钥读取ESPN并发起上链交易。创建者也坦诚承认这是当前的弱项,结算虽然无许可,但数据源头仍是受信任的。他说,如果真要用于生产环境,这里需要换上适当的去中心化预言机网络。设计上前端页面也经历了一夜四版主题的冲刺,有些界面的打磨还差一次修饰。

将所有片段拼接起来看,12th Man本质上是把球迷的直觉行为——喊口号、晒预言——转化成不可撤销的链上记录,然后用可验证的方式兑现奖励感。它不创造新的球迷行为,只是让那些原本随风消散的激情沉淀下来。创建者自己反复玩味的一个细节是,他并没有在比赛结束后急着打开电脑查看是否到账,而是在享受比赛本身;等他再打开球迷卡,分数已经在那里了。这种“过后发现它早已自动发生”的体验,让它不再像区块链工具常有的demo感,而更像一种自然延伸至数字空间的足球文化。

另一个值得留意的设计味是,整个项目选择了世界杯的语境,而不是俱乐部联赛。国家队比赛天然带有更强的身份归属和一次性激情的浓度,球迷不会频繁地更换支持的主队,购买或领取球迷卡的仪式感更强。同时,四年一次的周期也让这种链上凭证具有某种时间胶囊的意味——正如链上呐喊无法删除,一张2026年世界杯的球迷卡在下一次赛事到来时可能成为一份独特的数字纪念品。创建者没有在文档里说出这层意思,但当他强调“一旦选定就不可换边”时,这种长期持有的暗示已经足够明显。

从技术实现的侧面来看,一个没有后端、没有数据库的全链应用跑在Solana开发网上,本身也在回应一个开发者群体的困惑:到底需要多少链下组件才算一个“去中心化应用”?12th Man的回答是一句可以量化的零。账户模型替你做了数据存储,程序逻辑替你做了业务规则,时钟替你做了时间闸门,而结算的开放性则把最后一步控制权也交了出去。唯一的链下环节就是那个读取ESPN的小脚本,创建者给它加上双次确认逻辑并留下未来替换成去中心化预言机的路径后,整个架构就几乎没有再需要信任的特殊节点。

当然,作为一场周末编程挑战的产物,这个项目并不是要宣称自己解决了所有问题。14个测试覆盖了Anchor程序的七条指令,意味着还有一些边界条件未被自动化验证覆盖。前端在夜间迭代了四个版本的视觉主题,意味着界面一致性可能还欠打磨。但创建者把这些不足写进说明里的坦率,也从另一个角度证明,12th Man的核心体验——从预测提交到分数静默到账——已经跑通了。在一个任何人都可以部署一条智能合约但很少有人去完成最后20%体验的世界里,把一个想法推到“不再像demo”的时刻,本身就可以被视作一种成就。