“我打開球迷卡,分數(shù)已經(jīng)安安靜靜地待在那里了。沒人碰過任何東西。”這是12th Man的創(chuàng)建者描述的那個時刻。上周六英格蘭2比1淘汰挪威的四分之一決賽結(jié)束后,他像往常一樣打開了自己在Solana鏈上的球迷卡,3分已經(jīng)到賬——他在開賽前就準確預(yù)測了2比1的比分,而整個過程,從他觀看比賽到分數(shù)入賬,沒有第二個人、也沒有中心化服務(wù)器介入。那個瞬間讓他覺得,這東西不再是demo了。
12th Man是一個為世界杯球迷搭建的鏈上空間,名字取自足球文化里把球迷稱作“第12人”的傳統(tǒng)。每支球隊有11名場上球員,而看臺上、屏幕前的觀眾就是第12個。這個項目的起點很私人:創(chuàng)建者自己一場不落地看世界杯,卻總在群聊里遇到相同的尷尬——“有人開賽前就在群里喊了準確比分,第二天醒來消息被埋在了400條新消息下面,沒人相信他。”球迷的激情就那樣憑空消失了。他決定造一個它沒法消失的地方。
![]()
這個想法被實現(xiàn)在Solana開發(fā)網(wǎng)上。整個應(yīng)用只有一個Anchor程序和一個Next.js前端,沒有傳統(tǒng)后端,沒有任何數(shù)據(jù)庫,所有狀態(tài)都是鏈上賬戶。程序的ID是EwCR98M9we9XSNpNA7jnSh9HKXdQWtZPonLdJZ6yM6Kc,已經(jīng)通過了14個測試。對于想要上手體驗的人,創(chuàng)建者留了一條低門檻路徑:無需持有任何加密資產(chǎn),訪問twelfth-man.vercel.app,在About頁面找到三個共享測試賬戶,每賬戶里已經(jīng)預(yù)置了devnet SOL(純玩具,無實際價值),把Phantom錢包切到測試網(wǎng)模式,導入一個助記詞,兩分鐘內(nèi)就能參與進來——領(lǐng)一張球迷卡,在墻上發(fā)一句吶喊,猜一個比分。
球迷卡是整個系統(tǒng)的起點。一個錢包只能領(lǐng)一張卡,這個“一人一卡”的約束不是靠代碼里的if判斷,而是由鏈本身強制執(zhí)行。每張球迷卡是一個程序派生地址(PDA),種子源自錢包公鑰,因此每個錢包在程序中只能生成唯一的一張卡。創(chuàng)建者強調(diào)“選擇隊伍時要謹慎,一旦選定就不能再換邊”,這個鎖定同樣不是靠前端按鈕灰掉,而是卡的數(shù)據(jù)結(jié)構(gòu)只允許設(shè)定一次國家隊代碼。一旦初始化交易上鏈,修改的通道就被程序邏輯徹底關(guān)死。
球迷墻則承擔了社交鏡像的功能。你可以發(fā)帖,用文字喊出對球隊的聲援,一旦發(fā)布便不可編輯、不可刪除。創(chuàng)建者沒有解釋為什么連刪除都不允許,但從足球看臺的經(jīng)驗來看,吶喊一旦出口就沒有撤回鍵——墻上的每一行口號都是某種永久的在場。這些內(nèi)容存儲在鏈上賬戶里,不依賴任何內(nèi)容審核系統(tǒng),一個人發(fā)了什么,所有人都能讀到,且永久可見。
最讓球迷有參與感的模塊是賽前比分預(yù)測。規(guī)則簡單:鎖定預(yù)測的窗口是開賽前,開賽后哪怕遲到一秒也會被拒絕。這個約束同樣由鏈上時鐘保證——程序里的predict指令會比對當前集群時間與比賽預(yù)定開球時間,一旦發(fā)現(xiàn)鏈上時間已晚于開球時間,交易直接失敗。預(yù)測一旦提交便不可更改,賽后結(jié)算全憑三段式計分:完全命中比分得3分,只猜對勝負關(guān)系(結(jié)果正確)得1分,其余情況不得分。所有分數(shù)按國家隊匯總,最終生成一份“最響亮球迷陣營”的排行榜,排行榜不是由一個調(diào)度任務(wù)計算出來的,而是直接從鏈上的球隊統(tǒng)計賬戶讀出——每條預(yù)測被結(jié)算的瞬間,積分就累加進對應(yīng)國家代碼的PDA里,排行榜因此實時反映當前鏈上狀態(tài)。
結(jié)算環(huán)節(jié)的設(shè)計充分體現(xiàn)了“無需許可”的思路。這是一場任何人都可以替他人發(fā)起的結(jié)算程序,不需要項目方或任何特權(quán)機器人充當中間人。當一場比賽結(jié)束、最終比分被確認后,任意用戶都可以調(diào)用settle指令,指向某一條預(yù)測記錄,程序會校驗傳入的結(jié)果是否與預(yù)言機已上鏈的賽果一致,再執(zhí)行計分。創(chuàng)建者說,他不希望有什么特殊機器插在球迷和他們的分數(shù)之間——這種設(shè)計把參與權(quán)徹底下放,既避免了單點故障,也讓每個球迷都能主動“為自己和別人的預(yù)測上賬”。
預(yù)言機部分做了一次務(wù)實的權(quán)衡。結(jié)果數(shù)據(jù)來源于ESPN的公開比分板,創(chuàng)建者寫了一個小型輪詢腳本,每隔幾分鐘抓取一次頁面。為了抵抗API瞬間錯誤帶來的誤結(jié)算,腳本只會在連續(xù)兩次抓取都顯示比賽已結(jié)束時,才將最終比分以交易形式提交上鏈。這一步仍然帶有一個信任假設(shè):結(jié)果本身來自創(chuàng)建者的管理員密鑰讀取ESPN并發(fā)起上鏈交易。創(chuàng)建者也坦誠承認這是當前的弱項,結(jié)算雖然無許可,但數(shù)據(jù)源頭仍是受信任的。他說,如果真要用于生產(chǎn)環(huán)境,這里需要換上適當?shù)娜ブ行幕A(yù)言機網(wǎng)絡(luò)。設(shè)計上前端頁面也經(jīng)歷了一夜四版主題的沖刺,有些界面的打磨還差一次修飾。
將所有片段拼接起來看,12th Man本質(zhì)上是把球迷的直覺行為——喊口號、曬預(yù)言——轉(zhuǎn)化成不可撤銷的鏈上記錄,然后用可驗證的方式兌現(xiàn)獎勵感。它不創(chuàng)造新的球迷行為,只是讓那些原本隨風消散的激情沉淀下來。創(chuàng)建者自己反復玩味的一個細節(jié)是,他并沒有在比賽結(jié)束后急著打開電腦查看是否到賬,而是在享受比賽本身;等他再打開球迷卡,分數(shù)已經(jīng)在那里了。這種“過后發(fā)現(xiàn)它早已自動發(fā)生”的體驗,讓它不再像區(qū)塊鏈工具常有的demo感,而更像一種自然延伸至數(shù)字空間的足球文化。
另一個值得留意的設(shè)計味是,整個項目選擇了世界杯的語境,而不是俱樂部聯(lián)賽。國家隊比賽天然帶有更強的身份歸屬和一次性激情的濃度,球迷不會頻繁地更換支持的主隊,購買或領(lǐng)取球迷卡的儀式感更強。同時,四年一次的周期也讓這種鏈上憑證具有某種時間膠囊的意味——正如鏈上吶喊無法刪除,一張2026年世界杯的球迷卡在下一次賽事到來時可能成為一份獨特的數(shù)字紀念品。創(chuàng)建者沒有在文檔里說出這層意思,但當他強調(diào)“一旦選定就不可換邊”時,這種長期持有的暗示已經(jīng)足夠明顯。
從技術(shù)實現(xiàn)的側(cè)面來看,一個沒有后端、沒有數(shù)據(jù)庫的全鏈應(yīng)用跑在Solana開發(fā)網(wǎng)上,本身也在回應(yīng)一個開發(fā)者群體的困惑:到底需要多少鏈下組件才算一個“去中心化應(yīng)用”?12th Man的回答是一句可以量化的零。賬戶模型替你做了數(shù)據(jù)存儲,程序邏輯替你做了業(yè)務(wù)規(guī)則,時鐘替你做了時間閘門,而結(jié)算的開放性則把最后一步控制權(quán)也交了出去。唯一的鏈下環(huán)節(jié)就是那個讀取ESPN的小腳本,創(chuàng)建者給它加上雙次確認邏輯并留下未來替換成去中心化預(yù)言機的路徑后,整個架構(gòu)就幾乎沒有再需要信任的特殊節(jié)點。
當然,作為一場周末編程挑戰(zhàn)的產(chǎn)物,這個項目并不是要宣稱自己解決了所有問題。14個測試覆蓋了Anchor程序的七條指令,意味著還有一些邊界條件未被自動化驗證覆蓋。前端在夜間迭代了四個版本的視覺主題,意味著界面一致性可能還欠打磨。但創(chuàng)建者把這些不足寫進說明里的坦率,也從另一個角度證明,12th Man的核心體驗——從預(yù)測提交到分數(shù)靜默到賬——已經(jīng)跑通了。在一個任何人都可以部署一條智能合約但很少有人去完成最后20%體驗的世界里,把一個想法推到“不再像demo”的時刻,本身就可以被視作一種成就。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.