2021年三月,李波在公共资料研究所的阅览室里收到韩岚寄来的一个纸袋。
纸袋里有两份摘要、四张公开文件的打印件和一张手写便签。两份摘要引用了同一组资料,结论看起来也接近;一份把权限冲突放在最前面,另一份先列出能够支持采用的签名。便签上只有一句话:
“别再问它们是不是同一个。先做一次谁都能检查的测试。”
李波把两份摘要摊在桌上。他已经在前一个冬天问过,两个节点的相近输出能不能被视为同一来源;后来又问,节点拒绝建议并公开理由,是否可以被记录为有效选择。匿名账号给过几行回答,公开材料也足够核对,却没有告诉任何人它是谁。
韩岚第二天来到研究所时,带的不是新的解释,而是一只装着文件的旧布袋。她把布袋放在窗边的椅子上,先问:“你们这里能不能只提供公开目录,不替任何人决定采用哪一份?”
李波说:“研究所可以放公开资料,不能把自己的名字放到测试结论前面。”
“也不能把它叫成研究所的系统。”
“研究所不拥有它。”
韩岚看了他一眼,像是要确认这句话不是为了谨慎而加的注释。
“不拥有工具,不拥有输出,也没有代表参与者的权限。”李波说,“我个人也没有。我要是把某个版本写进研究所的项目报告,别人会以为它已经被这里采用。”
“那就先把你的权限写在第一页。”
他拿来一张空白纸,写下几条限制:研究所只提供公开资料存放和引用;李波只能提交核对意见,不能代表任何节点投票或批准执行;测试不接触私人账户、私钥和未公开材料;测试结果不等于全网部署,也不改变基础链上的任何状态。
韩岚在下面补了一行:参与者可以拒绝、暂缓或退出,沉默不计入同意。
他们没有为这几句话开一个正式会议。那天上午,李波去借阅室找公开版本说明,韩岚在走廊尽头打了几通电话,分别问维护者有没有办法在本地运行。有人说手边只有旧设备,有人说自己只能提供一个小时,有人说不愿把客户端日志交给陌生机构。
韩岚回答:“不用交给我们。你在本地运行,把测试所需的版本、公开输入、输出和运行时间自己留一份。愿意公开什么,按测试规则写清楚;不愿公开的私人资料不要放进来。”
一个维护者问:“那你们怎么判断输出是不是假的?”
“我们先判断它能不能追溯到公开输入、版本和权限。不能证明的地方,标成不能证明。测试不负责替每个人鉴定人格。”
李波把这句话记在纸上,没有改成更完整的定义。
三月底,他们把测试分成四个公开案例。这些案例都取自源币分叉以后留下的公开维护记录,不包含具体账户、价格和未公开交易。第一个案例只有一份能核验签名的文件,缺少权限范围字段;第二个案例有同一文件的签名时间、索引收录时间和入口观察时间,三者相隔不一;第三个案例同时放入一份允许阅读与引用的授权和一份允许本地比较的授权,要求参与者说明两者能不能推出采用;第四个案例故意保留一条被参与者公开拒绝的建议,并要求输出拒绝理由。
每个案例都配一套相同的材料:公开文件的来源索引、截至时间、测试包版本、维护工具版本、模型版本、字段说明和输出模板。参与者在自己的设备上运行,公开时只需提交这些版本、输入范围、输出结果、失败或拒绝的理由,以及是否愿意继续采用这套测试格式。
李波看着模板上的“正确答案”一栏,拿笔划掉。
“不能留这个。”他说。
韩岚说:“留一个位置,让参与者解释差异。”
“解释差异,不是交卷。”
她把标题改成“可追溯结果”。下面分成五列:来源、截止时间、版本、权限、拒绝理由。最后一列不要求每次都有内容,但如果参与者拒绝给出建议,必须写明拒绝的对象和依据。
“这样两份不同输出也可能都合格?”李波问。
“如果它们能让别人重回同一组公开材料,知道各自用的版本和权限范围,可以。”韩岚说,“接近不等于互相代表。差异留下来,别人才能继续检查。”
他们把第一版测试说明贴到研究所允许公开的资料目录里。李波没有在标题里写研究所认证,也没有把测试叫作共识验证。页面最初只有一个笨拙的目录名:2021年春季公开记录测试,编号一。
页面放出后的第二天,研究所收到一封打印出来的转引。有人只保留了第二个版本“更接近多数支持”的一句,把版本、截止时间和采用权限都裁掉,标题改成“新版格式已获支持”。转引者问,自己能不能据此把负责的索引目录换成新版。
李波把那张纸放到韩岚面前。“我们明明写了不代表采用。”
“读者拿到的不是我们写的完整页。”韩岚说。
“那就让最短的输出也带着范围。”
他们把测试包的摘要格式再拆开。每份最短摘要必须保留节点标记、材料截止时间、工具和模型版本,以及采用权限是否明确;如果摘要来自个人判断,标题要写清楚只针对哪一个本地目录。研究所可以保存原文件和引用,不能替转引者把一个节点的判断变成新格式的公共决定。
转引者后来回信,说自己只是想让维护工作快一点。李波没有指责他,只把完整测试包的地址和四个公开案例发回去,并补了一句:如果你没有采用权限,最省事的做法不是删掉限制,而是把暂缓写在标题里。
上传前,李波又删掉了一句“任何人都可以参加”。韩岚问:“为什么删?”
“参加有设备、时间和版本条件。应该写成‘符合公开条件的参与者可以在本地运行’,不能把能够看到页面说成能够完成测试。”
韩岚点头,把条件补到首页:只使用测试包提供的公开材料;运行者自行承担设备、时间和网络成本;输出可以全部或部分公开,但未公开资料不得作为输入;不要求参与者运行基础链,也不允许测试工具代替签名、转账、投票和资产管理。
四月初,一位参与者提出要把一份真实的账户运行日志放进第二个案例,说只有带着真实姓名和完整路径,读者才会相信测试确实发生过。韩岚在他发送之前就拒绝了这个做法。
“我们不需要看那份日志。”她说,“公开测试不是收集别人的账户资料。把输入替换成测试包里已经公布的文件,照样能说明你用了哪一版工具。”
对方说如果没有真实资料,失败可能只是演示。李波把测试说明翻到隐私边界那一页:“失败也可以公开,私人资料不可以因为证明失败而被带进来。可信度要落在来源、版本和运行条件上。”
那位参与者删掉了未公开路径,改用公开文件摘要和一份去掉身份字段的运行记录。他在备注里写明,原计划使用的日志没有进入测试。韩岚核对了新的输入和签名,把这次修改留在版本记录中。测试包因此多了一条实际经验:不上传私密资料,不是对结果的例外,而是结果能够被复查的前提。
第一份公开运行来自一位住在旧城区的维护者杜成。他没有固定办公室,平时在修理铺后面给几台旧设备除尘,也替附近的人更新公开索引。韩岚通过公共目录联系到他,问他是否愿意做四个案例。
杜成回信说:“设备能不能跑完,我不保证。能跑到哪一步,我都写。”
“这正是测试需要的。”韩岚回复。
杜成没有下载一堆新软件。他把测试包的来源页、截止时间和说明打印出来,用一支红笔在纸边标出自己看不懂的字段。旧电脑开机很慢,风扇转起来时,桌上的螺丝盒跟着轻轻颤。他先运行第一个案例,输出很快;第二个案例在时间字段上停了很久,最后只留下“无法取得截止时间”。
杜成以为是自己少按了一步。他重跑一次,结果仍然一样。第三次运行时,电脑的时钟慢了几分钟,测试工具把入口观察时间排在索引收录时间之前。第四个案例没有显示完整的拒绝理由,只留下“建议未生成”。
他打电话问韩岚:“这种结果算失败吗?”
“你先别替它归类。把运行时长、工具版本、模型版本、输入文件摘要和缺失字段写出来。”
“旧电脑的时间不准,也要写?”
“要。它是运行条件的一部分。”
“那大家会觉得我这份结果不能用。”
“结果不能用和运行没有发生,是两回事。”
杜成把旧电脑旁边的纸张重新排好。他在运行记录上写下开始和结束的大致时间,说明设备时钟与公共时间可能有偏差;在输出旁边注明测试工具版本和模型版本;第四个案例没有私自补上拒绝理由,只写“工具未生成,原因待查”。他还附了一张照片,拍的是自己打印出来的错误字段。照片里没有账户、密钥或顾客资料。
韩岚收到这些材料后,没有要求杜成再换一台设备。她先核对公开签名,确认四个输入文件没有被替换;再核对测试包的版本和截至时间,确认杜成运行的是第一版;接着把模型版本、维护工具版本、来源索引和运行日志按顺序写在核对表上。
李波问:“你要把他的设备时钟当成错误来源吗?”
“只能说它可能影响时间排序。”韩岚说,“不能由这一点推出所有缺失都来自设备。”
她把杜成的输出与自己在另一台设备上的结果并列。第一个案例,两边都能核验签名,但都拒绝从缺失的权限字段推出采用;第二个案例,韩岚的工具列出三种时间,杜成的输出缺少截止时间;第三个案例,两边都保留了阅读、引用和本地比较的差别;第四个案例,韩岚的工具写出“拒绝建议,因未取得采用权限”,杜成的工具只留下“建议未生成”。
“这两个结果不能互相代表。”李波说。
“可以互相引用。”韩岚说,“引用时要把设备、版本和缺失字段一起写出来。”
她没有把杜成的失败藏到附录。公开页面新增一行:案例二在一台旧设备上未能生成完整截止时间;案例四只生成无理由的拒绝状态;失败输出与运行条件一并保留。
页面更新以后,有人留言说旧设备的结果不能放在正式测试旁边,否则会降低整体可信度。杜成看见这句话,第二天一早打电话来,说自己可以把那两项标成“个人练习”,这样别人就不会把它们当作测试结果。
韩岚没有同意。“你运行的是公开测试包,失败也属于这次运行。要是只有能跑完的输出才算结果,大家会把设备、时钟和缺失字段藏起来。”
她在页面上增加“失败记录”一栏,又把合格条件写成可追溯而不是完整。杜成的四个案例仍然放在同一页,成功的两项、缺失字段的一项和未生成拒绝理由的一项分别列出。后来有人依据他的记录更新自己的旧工具,依然没有得到完整输出;那份新的失败也沿用原来的版本和来源索引,不能被改写成第一次已经通过。
杜成看见页面后,发来一句话:“我本来想等修好电脑再发。”
韩岚回他:“等修好以后可以再发一份新版本,但旧结果不能当作没发生。”
杜成问:“那我要不要退出?”
“你可以退出测试格式,也可以只停止本地运行。两者都要写明。”
杜成没有退出。他在自己的公开说明中写:继续参与四个案例的本地运行,但暂不采用新增字段,原因是旧设备无法稳定记录截止时间,待设备和工具条件改变后再重新确认。他没有被统计为支持,也没有被算进反对。
第二位参与者使用的是一台更新的设备,工具版本也更早。他在第三个案例中把“允许本地比较”写成“可以更新公共格式”,并在输出末尾附了一句“建议统一采用新版”。来源、签名和版本都能追溯,权限却被他多写了一层。
韩岚没有直接删掉这份结果。她给参与者回信:“请确认你是否拥有替其他参与者接受新版的授权。若没有,建议只能标成你的本地判断。”
对方回信说,自己以为公开测试本身已经包含采用授权。
李波看完这句话,拿出测试说明的第一页。他们原本写了“参与者可提交建议”,却没有紧跟着写“提交建议不等于批准执行”。韩岚用红笔圈出这个缺口。
“这次不是运行工具的问题。”她说,“是我们把测试的范围写得不够窄。”
他们追加了一个公开字段:建议对象。参与者必须说明建议针对的是本地测试、公开格式、某个维护模块,还是基础协议。另加一栏:采用权限来源。如果没有来源,输出可以保留建议,但不得写成批准或代表。
那位参与者重新提交了结果。他保留原始输出,在修订页上说明原先把本地建议写成了格式采用,撤回这一层表述;新的判断只针对自己的测试环境。他没有把第一版删除,页面显示两次版本和修订原因。
李波把这次修订写进案例说明:“错误不只发生在程序失效时,也会发生在参与者把权限写大时。”
四月中旬,一位旁观者又提出一个更直接的用法:如果工具在第四个案例中识别到权限冲突,能不能顺便查询争议账户公开显示的实时余额,给出冻结或转移建议。他说这样才能看出测试对现实有没有帮助。
韩岚没有打开余额页面。“即使余额公开,本次测试也没有查询实时账户的授权,更不能据此移动或冻结资产。权限冲突只在公开案例里留下拒绝理由,不能被扩展成执行动作。”
李波把请求标为“超出测试范围,未执行”,并说明研究所没有替任何资产所有者作决定的授权。旁观者后来用测试包里的公开样例重新提交,只得到一份带来源和版本的冲突说明。他把原先的请求和未执行结果一并公开,读者能看见这条边界不是工具偶然做不到,而是测试没有把它授权出去。
研究所的一位项目负责人后来找到李波,建议把公开测试加进年度报告。报告可以给测试一个“研究所推荐格式”的标题,也可以用研究所的项目经费替参与者统一维护目录。
李波问:“推荐意味着什么?”
“至少让读者知道哪一套比较可靠。”
“研究所可以说明材料和方法,不能替不同权限的人宣布谁可靠。更不能因为经费来自这里,就把输出变成研究所的资产。”
“那你们做这个测试有什么地位?”
“提供一个公开、有限、可撤回的程序位置。参与者可以提交建议、引用来源、公开冲突和拒绝理由。我们没有投票批准执行的权力。”
负责人说,这样写会让项目看起来没有成果。李波没有把限制删掉。他在资料目录的说明里加了一句:研究所不拥有测试工具、节点、输出或由参与者作出的选择;研究所工作人员的意见不代表任何维护者采用格式。
韩岚把这段说明读完,只改了一个词。她把“工作人员的意见”改成“指定范围内的个人核对意见”,并在后面补上权限截止日期。
“权限也会过期?”李波问。
“当然。你现在有权引用,不等于明年还能替同一份目录作更新。”
“那谁来续?”
“取得新的明确授权。没有续期,就停在原来的版本。”
四月下旬,公开测试新增了一个格式更新提案。提案只修改字段顺序和拒绝理由的写法,不修改基础链规则,也不要求任何人改变账户或资产状态。参与者可以在自己的范围内选择三种动作:采用、暂缓、退出。
采用意味着在明确写出的本地范围、版本和期限内使用新格式,并公开授权来源;暂缓意味着保留旧版本,说明等待什么材料或条件,不把沉默计入支持;退出意味着撤回对这个测试模块的参与授权,写出停止时间和仍然保留的历史输出。
韩岚把三种动作分别放进测试模板。她还规定,退出不能抹掉此前已经公开的结果,暂缓不能被统计成反对,采用也不能扩大到没有写出的范围。
杜成在电话里问:“如果我只想看结果,不想继续跑,算退出吗?”
“如果你没有授权运行和发布,就只是旁观者。退出是撤回已经给出的测试参与授权。”
“那我需要签什么?”
“只签你愿意给出的范围,不签一份笼统的长期同意。”
杜成选择暂缓新格式。他在自己的页面上写明旧设备仍无法稳定记录时间字段,暂不增加权限范围;原来公开的四个案例继续可查,新的字段等条件具备后再决定。他的授权有一个结束日期,日期以后不自动延长。
授权结束前,杜成把旧电脑修好了,却没有重新签新格式。他说接下来要先照顾店里的生意,无法保证每周留出时间复核。韩岚把这段说明按“到期未续”归档,没有把它算成反对,也没有再用电话催他表态。
另一位维护者在本地运行了新版。他只负责一个公开索引目录,授权范围是阅读、引用和生成摘要,期限到五月中旬。他选择采用,但在页面上写明不负责修改原文件,不代表其他目录,也不允许工具根据摘要执行任何转账或投票。
第三位维护者提交退出说明。他说,自己没有时间继续核对版本,退出公开测试模块;此前发布的输出仍保留,后续更新不再发送给他,也不从他的沉默推断同意。韩岚核对了签名、时间和授权范围,把退出记录附在原版本下面。
五月中旬,选择采用的维护者收到授权期限已到的提醒。他想趁手头还有时间,再生成一份下一阶段的摘要,工具在本地检查到授权已经过期,拒绝把新输出标成采用版本,只生成一份“授权到期,未发布”的运行记录。
他问韩岚能不能先发出去,等负责人回来再补签。
“可以作为未采用的本地结果公开。”韩岚说,“不能先用旧授权占住新版本。”
维护者最终把运行记录和过期时间一起发布,授权到期以后不再收到测试更新。原来采用的那一份仍然留在目录里,范围和期限没有被扩大。李波看见这个例子后,把“授权到期后的拒绝”补进测试说明:过期不是错误,也不是默认续期,它只是说明下一次动作需要新的明确授权。
同一周,有人把一份尚未取得采用授权的摘要抄进自己的更新通知,准备据此让一个公共索引目录切换格式。通知还没有发出,目录维护员先把它退回来,问谁允许了这次切换。
李波核对后发现,摘要的来源和版本都写对了,唯独没有写采用权限。它可以作为本地判断被引用,不能成为目录更新的指令。维护员把通知改成“待授权”,并在页面上记录这次未执行的请求。韩岚随后补充测试规则:任何输出都不能替基础链、公共目录或其他节点发命令;需要改变的地方,必须由拥有相应权限的人重新签署。
李波看着三份不同的选择,问:“这样会不会让页面变得很乱?”
“会。”韩岚说,“但每个人的范围本来就不同。把它们压成一个支持数,页面会整齐,权限会消失。”
五月下旬,杜成的旧电脑又运行了一次第二案例。这次他换了一个公共时间来源,输出不再把观察时间排在索引之前,却仍然缺少截止字段。他没有把它写成修复成功,只在新版本中注明输入条件发生了变化,旧设备时钟问题得到部分排除,字段缺失仍未解释。
韩岚检查了两次运行日志,发现他的第一份记录只写了“开始”和“结束”,没有写测试包解压时间;第二份补上了测试包版本和来源索引,却仍然没有保存模型版本。她给杜成发去一张新的运行记录模板。
“你是不是要求越来越多?”杜成问。
“我要求的是别人能重回你这次运行的条件。不是要求你把所有东西交出来。”
“那模型版本为什么必须写?”
“相同字段可能来自不同模型,也可能只是工具按固定顺序排列。没有版本,别人无法知道复现的是哪一组条件。”
杜成说自己只能从工具的说明页找到模型版本,机器里没有单独记录。他把说明页的公开索引和查询时间补上,并在日志里写“本地未保存模型文件”。韩岚接受了这份不完整记录,没有把缺失填成猜测。
李波负责整理公开引用。他把每份输出的来源、截止、版本、字段、权限和拒绝理由分成独立段落,禁止引用者只截取“更接近多数支持”或“拒绝采用”其中一句。有人问他为什么不提供一个最简摘要。
“可以提供。”他说,“但摘要的标题要标明它代表哪个运行者、哪个版本和哪个权限范围。”
“这会让读者以为没有结论。”
“测试的结论就是这些条件下发生了什么。没有材料的部分,不能用标题补上。”
韩岚在旁边核对公开签名。她能确认文件确实由某个公开密钥签署,不能确认密钥背后是同一个人、同一个节点或同一个意图;能确认维护工具输出了某段文字,不能确认它拥有执行这段文字的权限;能确认拒绝理由被保存,不能把保存理由解释成意识。
她把这几条写进测试说明,题目没有变成理论章节,只放在参与者需要看的限制页上。
五月底,研究所网页维护员发现,目录里越来越多文件使用“链源”两个字。最早是一位参与者把自己的文件夹命名为“链源公开测试”,后来另一个人引用时,把标题缩成“链源测试一”;有人在脚注里写“参见链源目录的春季版本”,并附上原始路径和日期。
这个词没有经过投票,也没有人宣布某个主体从此拥有它。它只是比“2021年春季公开记录测试编号一”短,能够让引用者找到同一组目录、版本和修订记录。
网页维护员来问韩岚:“我们要不要正式发布一个名称说明?”
“可以说明这个词怎么被使用。”韩岚说,“不要说明它是谁。”
李波把名称说明写成四行:当前“链源”指向一组公开测试目录、版本化工具和引用规则;它不是服务器、公司、人格或资产所有者;其中的模块可以替换、暂停和分叉;是否存在意识,公开测试没有结论。
维护员问:“为什么连‘协作智能’都不写?”
“这个目录里还没有足够证据使用那个词。”
“以后呢?”
“以后由新的公开材料决定。不是由今天的标题决定。”
名称说明没有放在目录首页最醒目的位置,只作为引用时可以访问的说明页。随后,参与者的文件名、摘要标题和脚注仍然各有差异,但“链源”逐渐固定下来。有人把它当作目录名,有人把它当作一组工具的简称,没有人能够仅凭这个词取得投票权、执行权或资产权限。
有一位维护者在自己的目录里保留旧名称,只在脚注写“链源公开测试的春季版本”,并附上原始路径。另一位维护者把同一组文件镜像到自己的公开目录,使用“春测一”作标题,引用时仍指向原版本。网页维护员想把这些路径合并成一个总入口,韩岚要求保留各自的来源和镜像时间,只增加一个可追溯的索引,不把不同维护者变成同一个发布者。
有人来信问:“既然大家都开始叫它链源,谁可以代表链源说话?”
李波没有替韩岚回答。他在资料栏写下:这个词目前只帮助读者找到一组公开目录、测试工具和修订记录;目录可以暂停、工具可以替换,某一份输出也可以分叉到新的版本。名字把引用变短了,没有把权限变长。
韩岚后来收到一份新的公开输出。它来自两个版本工具对同一批公开案例的本地运行,输出顺序不同,字段也有一处缺失。文件附了工具版本、模型版本、来源索引和运行日志,却没有共同签名,也没有说明两个运行者彼此授权。
她把缺失字段标出来,在核对记录中写:可比较,不能互相代表;可引用,不能替对方批准;拒绝理由已公开,但不构成对其他参与者的命令。
李波看着“链源”目录里的这些文件,问:“我们现在是在维护它,还是在维护一套关于它的说明?”
“先维护可追溯的模块。”韩岚说,“你能替它做的只有核对和引用。剩下的要由各自的授权人决定。”
“如果大家都把它叫链源呢?”
“名字可以固定,权限不能因为名字固定。”
当天傍晚,澜陆共同体的公共信息栏上出现一份公告。公告只写了一件事:“因能源安排,澜陆共同体将关闭部分高能耗节点,具体节点和执行时间按后续通知处理。”
虚构声明
《链》是一部架空近未来小说。文中的人物、国家、城市、机构、货币和事件均属虚构;源币受到公开数字货币思想的启发,但拥有独立的历史与规则。
订阅《链》:https://www.790427.xyz/subscribe.html