区块链数字藏品平台:联盟链+uni-app跨平台开发记录
2023年的春天,广州的回南天让宿舍的阳台玻璃总是蒙着一层水汽。看屏幕久了,转头看向窗外,视线也是模糊的。
那个时候,全球范围内的 NFT 热潮其实已经开始退散了。曾经动辄拍出天价的无聊猿和像素头像,价格正在经历断崖式的下跌。但在国内的语境里,「数字藏品」的概念还在维持着一种微妙的余温。刚好学校里有一个需要结合区块链技术的比赛,我想着总得写点什么,就定下了做一个数字藏品交易平台。
不是出于对 Web3 的某种狂热信仰,更多的是一种工程上的实用主义——比赛需要一个看起来有时代感、且能落地演示的业务场景,而数字藏品恰好满足这些条件。
在最开始的技术选型阶段,我就放弃了公链。一方面是因为公链的 Gas 费太贵,作为一个还在广商念大四的学生,我没有预算去为每一次测试合约的部署买单;另一方面,国内的合规环境要求这类项目必须是可控的。于是,联盟链成了唯一的选择。
我最终选了微众银行开源的 FISCO BCOS。搭节点的过程比想象中要枯燥得多。官方文档写得很详实,但当你真的要在自己那台配置可怜的腾讯云学生机上把环境跑起来时,各种依赖冲突和端口问题就像打地鼠一样冒出来。有一天晚上,我对着终端里满屏的报错信息发呆,听着机箱风扇因为编译而发出的轰鸣声,突然觉得挺荒谬的:外面的人把区块链吹得像某种能重构人类信任的魔法,但在开发者的屏幕前,它只是一堆需要小心翼翼维护配置文件的、极其笨重且缓慢的分布式数据库。
为了省去无意义的运维折腾,我最后妥协了,用了一个简化版的私链测试环境。这让我能把精力集中在业务层面的实现上。
链层用智能合约记录藏品的归属和每一次流转的交易记录;后端我选了最顺手的 Node.js 配合 Express 框架,用来提供轻量级的 REST API;至于前端,我用了 uni-app。
选 uni-app 的初衷非常简单粗暴:我想省时间。官方文档里那句「一套代码,编译到 Android、iOS、H5 和小程序」对于一个需要快速出成果的单人项目来说,诱惑力太大了。
但现实很快就在凌晨两点的代码编辑器里给我上了一课。
所谓的「跨端」,很多时候只是一种美好的错觉。在 H5 端跑得完美无缺的 flex 布局,编译到微信小程序里,某些元素的层级就会莫名其妙地崩塌。我不得不开始在代码里大量使用条件编译。#ifdef MP-WEIXIN 和 #ifndef H5 这样的注释标签像补丁一样散落在 Vue 组件的各个角落。有时候为了兼容某个旧版安卓机型在小程序里的滑动卡顿问题,我得把原生组件替换掉,自己手写一个极其别扭的 workaround。看着那些为了妥协而写出的冗余代码,我会产生一种轻微的割裂感——我在做一个号称代表下一代互联网的技术项目,但我大部分的时间,却花在了修补不同浏览器内核带来的陈年 UI 漏洞上。
项目里有一个核心的坑,是关于图片存储的。
没写代码之前,我以为 NFT 就是把一张图片直接塞进区块链里。等我真正开始写合约代码时才发现,这在工程上是极其不现实的。链上的存储资源寸土寸金,如果把一张 2MB 的高清插画直接转成 Base64 存进区块里,不仅写入速度会慢到让人崩溃,节点同步的成本也会是个天文数字。
最后我用的是 IPFS(星际文件系统)分布式存储配合链上哈希的方案。创作者在前端上传作品,后端接收到图片后,先把它传到 IPFS 网络,IPFS 会返回一个唯一的 CID(内容寻址标识符)。然后,我再把这个 CID 加上一些元数据(比如作者、创作时间、作品描述),打包成一个 JSON,算出哈希值,最后只把这个哈希值和归属人的地址写进智能合约里。
代码跑通的那一刻,看着终端里打印出来的交易回执,我心里并没有太多激动的感受,反而有一种祛魅后的平静。原来所谓的「不可篡改的数字资产」,本质上只是你在区块链这个公开账本上,拥有了一串指向某个网络地址的字符的修改权。你拥有的不是那幅画本身,你拥有的只是一张写着那幅画存放地址的收据。技术本身并不神圣,它只是一种解决特定问题的逻辑组合。
除了核心的发行、交易和展示功能,为了满足比赛潜在的审核要求,我还硬着头皮接了一个第三方的实名认证 API。这其实是个挺讽刺的设定:区块链的精神内核是匿名和去中心化,但在这个平台上,你必须先上传身份证号,证明你是你,然后才能去体验所谓的「去中心化交易」。这就是技术在现实土壤里生根时,必须做出的妥协。
几个月后,我去参加了答辩。
答辩的教室在学校的教学楼里,那天下午的阳光很好,甚至有些刺眼。投影仪的灯泡可能老化了,打在幕布上的 PPT 和我精心调过配色的前端 UI 显得有些发灰。台下的评委老师们翻着我的项目书,他们问的问题大多集中在「这个平台的盈利模式是什么」、「如何防止用户炒作」上。至于我在 IPFS 存储上做的优化,以及在 uni-app 跨端兼容上熬过的那些夜,他们并不怎么关心。
我站在台上,尽量用平和的语速回答他们的问题。我知道他们要听的是什么,无非是合规、安全、商业闭环。
最后,这个项目拿了省三等奖。
在我的履历里,这个奖项并不算高。相比于那两次拿国奖时的绩点拼杀,或者那 4.02 的 GPA 背后的无数次期末复习,这个省三的证书显得有些单薄。但我其实并不觉得失落。
把线上地址 nft.caiths.com 部署好,看着域名成功解析,页面在浏览器里正常渲染出来的那一刻,这个项目对我的意义就已经完成了。
它像是我大四这一年里的一个数字标本。在这个标本里,封存着我对区块链底层逻辑从迷茫到清晰的认知过程,封存着我在跨平台开发时做出的无数次取舍,也封存着我对技术与现实合规之间那条微妙边界的试探。
风口会过去,概念会迭代,曾经炒到几十万的 JPEG 图片最终可能会变得一文不值。但在这个过程中,那个在回南天的深夜里,为了解决一个异步回调的 Bug 而不断翻阅英文文档的自己,是真实的。那些敲击键盘形成的肌肉记忆,和对系统架构的理解,最终都沉淀在了我自己的服务器里,谁也拿不走。