Shielded Ordinals原理图解

SHORD: 持有私密,证明公开

比特币原生的隐私协议

← 左右滑动,看整条街 →

导读|SHORD 是什么,你持有的是什么

SHORD 是比特币上的隐私协议:作品公开,谁持有哪件不公开。你持有的是一张票据,记着哪一件、归谁;链上只留它的指纹,明文和钥匙都在你自己的金库里,只有你的钥匙能花它。

图中

  1. 金库:在你自己的设备上,放钥匙和票据明文,证明在这里做。
  2. 信封:每次操作写进一笔比特币交易发出去,作品的信封在 OP_RETURN 输出里(图上的牌子)。
  3. 区块:比特币按顺序记下交易,谁都能读。
  4. 索引器:逐块按 SHORD 的规则验收信封,把公开的账记在自己机器上;屏幕上的 9F3A 是账的摘要(第 08 章)。

普通 Ordinals 作品放在谁的地址里就归谁,谁都查得到。SHORD 把作品停在谁也花不动的 NUMS 地址,持有关系改记在票据里,它自己的说法是“作品公开,持有人隐藏”。比特币只认 BTC 交易本身,SHORD 的账由索引器按规则来算,所以一笔交易比特币确认了,SHORD 仍可能不认。本文拿 Shielded Nakas(NAKA)和持有它挖出的符文 SHNAKAS 举例。

链上公开的链上看不出的
作品本身和它停放的地址作品归谁
SHORD 交易本身,以及信封里的作废码和密文私密转账花的票据和收件人
挂单编号、价格和收款方式金库钥匙和票据内容

提醒打开网页金库时钱包签的那段签名,能算出金库的全部钥匙,别给任何人(第 01 章)。

技术卡 00以一次私密转账为例:每样东西从哪来、放在哪东西 · 用途金库比特币区块索引器钥匙花票据、读密文从种子算出只在本机不上链不碰钥匙票据明文记着哪一件、归谁转出方做好收件方解出保存不上链看不到明文承诺 cm票据的公开指纹转出方算好写进信封加进记录树密文 ct收件方靠它读出票据用收件方的查看公钥加密写进信封存着,供金库扫描作废码 nf防止一张票据花两次花旧票据时算出写进信封记进作废码清单证明 π证明这笔转账合规转出方在本机生成写进信封验过就算不存进账索引器这一列全从区块算出:同一条链、同一版规则,谁重放都得到同样的结果
看技术卡大图

技术说明技术卡给想核对实现的人看,跳过不影响读正文。这张卡以一次私密转账为例;铸造、购买和取回由收的人自己做新票据,承诺由索引器补算,也不带证明。证明参数的来历见附录 D。

02

金库|持有靠什么,钥匙从哪来

持有,就是握着钥匙:金库里的钥匙花得动哪张票据,你就持有哪件作品。网页金库的钥匙,全部由钱包的一份签名算出:这份签名就是整个金库。

图中

  1. 官网:钱包在这里签一段固定文字,金库就打开了。
  2. 签名纸:这份签名算成金库的种子。
  3. 影子是一串钥匙:种子算出金库的全部钥匙。
  4. 仿冒网站:招牌只差一个字符(红色的 0),签了名,钥匙就归它。
  5. 手机:同一个种子编成 24 个助记词(不是钱包的助记词),在 Shielded Vault 里打开的还是这个金库。

钥匙不用另外备份。换台设备,用当初那个钱包的同一账户、同一地址类型再签一次,打开的还是这个金库;换成别的,打开的是另一个空金库。票据都在链上的信封里,金库拿钥匙扫一遍就找回来;眼下只有官网的索引器列得全,项目方说新版本会开源,到时自己搭的索引器也行(附录 H)。

收作品用的隐私地址 shord1… 也由种子算出,可以公开给别人。官网写着它“只有别人直接给你发送藏品时才需要”,买和卖都用不着。

签名框里写着:“Anyone with this signature can move your shielded pieces.” 这份签名算出整个金库,管的不只是作品,还有金库里的 BTC 和收过的票据。

误解不转钱,只签个名,不会丢失资产。

事实这份签名就是金库的全部钥匙。只在官网签,不给任何人。

技术卡 01一份签名,算出全部钥匙钱包对官网这段固定文字签名Ord Dropz shielded vault key v1 …seed = SHA-256("shord/seed/v1" ‖ sig)同一签名,同一金库同一钱包、同一账户和同一地址类型换了就是另一个空金库种子算出各把钥匙和地址花费密钥spend花掉票据查看密钥view解开密文取回密钥return取回挂单卖出收款payout这次挂单专用金库 BTCbtc收 BTC、找零种子直接算出种子 + 这次挂单的作废码种子 + 序号签名泄露 = 金库交了出去能转走作品、取走金库的 BTC,看到你持有过哪些作品钱包自己的 BTC不在其中签名推不出钱包私钥
看技术卡大图

技术说明卡上的 ‖ 表示前后接起来。每把钥匙都是 SHA-256(固定标签 ‖ 种子 …) 算出来的,标签是 shord/spend、shord/view 这样的固定文字。手机上的 24 个助记词,就是这 32 字节的种子加一字节校验。隐私地址 shord1… 是持有人公钥 Poseidon(sk) 接上查看公钥,两样都推不出私钥,所以能公开。

03

发行|规则写在父铭文,铸造的钱分给谁

合集从一枚父铭文开始,供应量、价格和收款地址都刻在里面。铸造照规则付钱,索引器照规则验收,对不上就不算。

图中

  1. 规则石碑:父铭文,碑上刻着 NAKA 的供应量和价目。
  2. 铸造:A 带着自己金库做好的票据在柜台付款,交易花掉一枚平台许可币(柜台上的紫色币)。
  3. 分钱:15,000 给艺术家,铭刻费和 3 个额度给中继。
  4. 铸好之后:平台另发交易,把作品铭刻成子铭文,停进 NUMS。

索引器验收一次铸造看三件事。编号要在供应量内,还没铸过。付给每个收款脚本的钱不能少于规则写的数,多付不算错。交易要花掉一枚许可币,NAKA 的许可币只有平台能签。三样都对上,索引器才收下这次铸造。新票据由铸造的人自己的金库生成,索引器补算承诺。

按官网默认,铸一件顺带买 3 个中继额度,合计 25,500 sats,矿工费另算,每一笔给谁见技术卡。中继额度是预付的代发次数,一个额度让官方中继代发一次私密转账、挂单或撤单(第 04 章)。

NAKA 的作品文件不先上链:父铭文不放图,只放全部文件的哈希树根,图铸出来以后才铭刻上链。父铭文要等最后一件铭刻完才停进 NUMS,之后谁也不能再给它添子铭文;10 月 28 日它还没停进去(附录 G)。SHNAKAS 符文另有蚀刻,不在父铭文里(挖矿原理)。

误解合集规则是网站后台的设置,项目方可以修改。

事实规则刻在父铭文里,刻下就改不了,网站后台也改不了它;索引器只认链上这一份。

技术卡 02规则刻在父铭文,付款照规则验收父铭文 · 刻在链上的规则(NAKA,单位 sats)作品供应量 3,333文件树根 artRoot铸造铸造价 15,000铭刻费 3,000平台铸造费 0中继、成交中继额度 2,500/个成交费 2%,最低 1,000公钥铸造许可公钥 gateKey挂单锁公钥 lockKey收款艺术家、平台、中继三类收款脚本;NAKA 的艺术家和平台是同一地址索引器从父铭文的交易里读规则,不经网站铸造一件(MINT)15,000 → 艺术家3,000 铭刻费 → 中继3 × 2,500 额度 → 中继,官网默认平台铸造费 0合计 25,500,矿工费另算交易花掉一枚许可币成交一件(BUY)标价 → 卖家2%,最低 1,000 → 平台买家在标价之外另付例:标价 100,000,买家共付 102,000NAKA 没有版税交易花掉挂单锁
看技术卡大图

技术说明信封头里的合集编号,是父铭文编号 SHA-256 的前 8 字节,索引器只收带这个编号的信封。许可币是锁在平台许可公钥上的一枚比特币输出,每笔铸造交易花掉一枚;批量铸造一笔最多 20 件,也只花一枚。

04

存放|作品在哪,你买到的是什么

你买到的不是那张图,是一张票据。图铭刻后停在 NUMS 地址,谁也转不走;转手时换的是票据,图一直不动。

图中

  1. 作品:挂在 NUMS 画廊里,谁都看得见,谁也拿不走。
  2. 没有钥匙孔的锁:NAKA 已铭刻的 3,327 件都锁在这个地址,没人知道私钥,也没有脚本(附录 G)。
  3. A 家里的票据写着 #4:锁在 A 的金库里,指向画廊里那一件。
  4. 区块顶上的 CM:票据的承诺。
  5. SHNAKAS:2,100 万枚符文也停在这个地址。

这张票据记着三件事:哪一件(作品编号)、还能请中继代发几次(中继额度,第 04 章)、归谁(持有人公钥)。另外还有两个随机数 ρ 和 s,让票据算出来的东西看不出内容;s 叫作品秘密,和图片无关。

票据本身不上链。上链的是它算出来的指纹,叫承诺:混了那两个随机数,谁也看不出是哪一件、归谁。索引器把每个承诺收进记录树,这棵树就是“出现过哪些票据”的公开账本。指纹算不回票据,所以每个承诺还带着一份密文,是用持有人的查看公钥锁上的票据内容,只有持有人解得开。明文只留在生成和收下它的金库里。

不过有些操作本身就公开编号:铸造、购买、取回时,大家都知道是哪一件换了新票据。私密转账不公开编号,转完以后,外人对不上新承诺是哪一件、归谁。

SHNAKAS 也是这样存的:你持有的钱袋同样是一张票据,只是编号换成了钱袋号;每袋多少枚跟着钱袋号公开登记,所以看得到每袋多少,看不出归谁(挖矿原理)。

误解买了 NAKA,图会转进我的钱包。

事实作品一直停在 NUMS 地址上,普通钱包里看不到它是正常的,持仓在 SHORD 金库里看。

技术卡 03一张票据,链上只有承诺和密文内容票据:明文只在金库里,不上链编号assetId额度tickets持有人公钥ownerPk随机数ρ作品秘密s计算inner = Poseidon(ownerPk, ρ, s)cm = Poseidon(assetId, tickets, inner)= 承诺:进记录树的指纹ct = Enc(assetId, tickets, ρ, s)= 密文,用收件人的查看公钥加密私密转账:转出方的金库算好 cm 和 ct,再附证明铸造、购买、取回:收的人交 inner 和 ct,索引器补算 cm存放信封cm 或 inner,加 ct比特币区块永久公开记录树只收 cm:一片叶子
看技术卡大图

技术说明记录树深 20 层,最多收 1,048,576 张票据,只增不减:每张新票据一片叶子,票据花掉了叶子也还在。花票据时,证明以最近 100 块里的某个树根为准,只说明票据在树上,不说是哪一片;是否已经花过,由索引器查作废码清单(第 04 章)。

05

转让|私下转给别人,链上看见什么

任何人能验证私密转账有效、票据没被双花,但是看不出花掉的是哪一张、转给了谁。

图中

  1. 旧票据:A 手里打叉的那张,转账被索引器认下后就作废。
  2. 信封:写进最新一块,就是装着信的那节车厢。
  3. 作废码清单:牌上是开头几位,红的刚记入;重复就拒收。
  4. B 的钥匙:查看密钥解开密文,金库里多出一张新票据。

A 要把 #4 转给 B,就在收件人一栏填 B 的隐私地址(shord1…)或隐私名字(如 bob.naka,附录 J)。金库先算出旧票据的作废码,再给 B 写一张新票据、用 B 的查看公钥加密,最后生成一份证明:旧票据在树上、归 A,新票据还是同一件,但不说是哪一张。信封可以由 A 自己付矿工费发出,也可以交给官方中继代发,扣票据上的一个中继额度,或者用官网另卖的预付中继(第 08 章、附录 I04)。

索引器拿到信封,验过证明、确认作废码是第一次出现,才把它记进清单、把新承诺加进记录树。旧票据再花就会被拒收;外人对不上作废码属于哪片叶子,所以不知道花掉的是哪一张。B 的金库扫到这笔交易、解开密文,算出的承诺和树上的对得上,新票据才算到手。密文写给 B 的查看密钥,B 的金库一扫就能解开(附录 H)。

SHNAKAS 钱袋整袋转出,和转作品一模一样。只给一部分,得分两步:先把钱袋拆成 2 到 16 个,再发送其中一个。拆分不像转账,原钱袋号和每袋数量都公开,只是看不出归谁(附录 I07)。

私密转账只管交出作品,不管收钱:拿它做买卖,谁先给都得信对方。要一手交钱一手交货,就用挂单(第 05 章)。

误解私密转账谁也查不到,没有任何线索。

事实链上看得到有人花了一张票据;自己付矿工费,还看得出是哪个钱包发的,交给中继代发就看不出。

技术卡 04私密转账:一个信封,各去各处A 的旧票据 · #4✗B 的新票据 · #4作废码 nfA 的花费密钥承诺 cm'B 的持有人公钥密文B 的查看公钥证明 πA 的金库里生成信头nf · 32 Bcm' · 32 Bepk + 密文 · 120 Bπ · 256 B索引器记进作废码清单索引器加进记录树B 的金库用查看密钥解开索引器验完不进账本这四样装进同一个 OP_RETURN 信封(公开 v1 格式,共 462 字节)条宽不按比例;另有树根高度 4 字节、用掉和新买的额度 1 + 2 字节没画证明 π:旧票据在树上、A 有花费密钥、编号没变,不说是哪一张,还绑住信封正文索引器全部验过才记账;#4 只在两人的金库里,信封里没有编号钱袋拆分:另用 SPLIT 信封,写在见证里,公开原钱袋号和每个新钱袋的数量
看技术卡大图

技术说明索引器不把旧叶子标成已花,因为一标出来,外人就能把这次花费和当初生成这片叶子的那笔交易连起来。它另记一个作废码,由 ρ 和持有人的花费密钥一起算出。缺了花费密钥,私密转账就藏不住了:新票据的 ρ 是用信封里公开的作废码算的,谁都算得到;作废码要是只用 ρ 算,外人就能提前算出新票据的作废码,一张接一张,把这件作品的每次转手串成一条线。

06

交易|挂单公开什么,平台能做什么

NAKA 挂单要公开编号、价格和收款地址,作品的去向从此由一把锁决定。锁的钥匙在平台手里:平台能随时关掉挂单,却拿不走作品,也拿不走货款。

图中

  1. 价签:编号和价格写进区块,谁都看得到。
  2. 挂单锁:装着 330 sats 的比特币输出,钥匙挂在平台牌子上。
  3. 买家:标价付给卖家,2% 平台费另付(最低 1,000 sats)。
  4. 沙漏:锁确认满 1,008 块,卖家不用平台,自己花锁取回。
  5. CLOSED:锁花掉却没成交,挂单关闭,卖家签取回才拿回作品。

挂单(LIST)的信封交出卖家票据的作废码,同一笔交易建好挂单锁。索引器认下以后,这张票据就花不了了,作品暂时挂在锁上:锁怎么被花,决定新票据归谁(下一页从头走一遍)。

收款地址可以是金库里的新地址、连接的钱包,也可以手输,bc1p、bc1q、3 开头的线上都成交过;标价不能低于这种地址的粉尘限额。

购买(BUY)的交易要花掉这把锁,同一笔里付清货款,新票据由买家自己生成。花锁要平台签名,协议文档写明平台只签付款正确的交易:标价 1,000,000 sats,卖家要收到不少于 1,000,000,平台不少于 20,000,少一样索引器就不认。

撤单(CLAIM)是平台签名花锁、卖家用取回密钥签取回,两样可以放进同一笔交易。平台不配合,卖家等锁确认满 1,008 块,自己花锁取回。锁要是被花掉又没成交,挂单就关了,卖家随时能签取回,不用再等 1,008 块。

误解BTC 付款确认了,购买就成功了。

事实付款进了区块,索引器再按挂单验收;验收通过、金库里出现新票据,这笔才算成交。

技术卡 05一把锁,三条出路卖家票据LIST挂单记录 + 挂单锁卖家票据已花掉 · 编号、价格公开 · 作品仍在 NUMS买家付清货款平台只为付款正确的交易签名买家新票据BUY撤单:平台签名花锁卖家签取回,可在同一笔卖家新票据CLAIM后路:锁确认满 1,008 块卖家自己花锁,再签取回卖家新票据CLAIM谁能花掉这把锁平台钥匙:随时能花卖家取回密钥:满 1,008 块后作品回来,还要卖家签 CLAIM锁花掉却没成交:挂单关闭,卖家随时签 CLAIM 取回,不用等 1,008 块货款付到卖家自己的收款地址,平台费 2%(最低 1,000 sats)由买家另付
看技术卡大图

技术说明挂单锁是一个 P2TR 输出,有两条花法:平台钥匙走密钥路径,随时能花;卖家的取回公钥走脚本路径,锁确认满 1,008 块才能用。平台花掉锁,只拿得到锁里那点聪(官方中继建锁放 330 sats,协议不限金额);作品要靠取回签名才回到卖家手里,取回密钥由卖家的种子和这次挂单的作废码算出,平台算不出来。

07

05 交易 · 续

所有权流转|交易和信封

上一页讲了一张挂单的三条出路。这一页把 #4 从铸造到成交完整走一遍:每一步交出什么、带出什么;信封在内存池里谁都读得到,为什么改不了;一笔购买上链前,谁能叫停。

这里按 NAKA 的链上挂单讲。其他合集已改成链下挂单(官方叫即时挂单),成交时才上链;项目方 10 月 27 日说 NAKA 保持原样。

流程图 01#4 从铸造到成交:每一步的交易和信封铸造 · MINT 信封带出:编号、A 的 inner 和密文;花一枚许可币A 的票据私密转账 · TRANSFER 信封交出 A 的 nf(作废);带出 B 的 cm、密文、证明B 的票据挂单 · LIST 信封交出 B 的 nf;带出编号、价格、收款脚本、取回公钥、证明同一笔建挂单锁(330 sats)挂单记录:期间没有可花的票据编号 · 价格 · 收款脚本 · 取回公钥 · 锁的位置购买 · BUY 信封花锁,平台签名带出:C 的 inner、密文付标价给卖家,另付平台费撤单或取回 · CLAIM 信封花锁:平台签,或满 1,008 块带出:B 的新 inner、密文取回密钥签名C 的票据(成交)B 的新票据(取回)锁被花掉而没有有效购买:挂单关闭,卖家再补一封 CLAIM挂单编号就是挂单时交出的 nf;锁本身不记所有权
流程图 02内存池里的信封:谁都读得到,为什么改不了作废码、证明、价格、收款脚本都公开;三种改法的结局① 改信封内容换收件人、地址或价格cm 和 hbody 是公开输入重做证明要花费密钥证明不过,整封拒收原票据照用② 原样抢发复制字节,自付一笔两笔都可能上链链上在前的生效结果不变后到的 nf 重复③ 换成自己的购买购买无证明,但要花锁平台签名只认原交易一把锁只能花一次改写不成最多一笔成交改不了:重做证明要花费密钥,签 CLAIM 要取回密钥,都只在持有人的金库里转账、挂单、取回信封可原样搬走;购买、铸造的平台签名只认原交易

一笔购买上链前,谁能叫停

谁怎么叫停结果
买家确认前用同一个输入再发一笔手续费更高的交易(RBF)新交易先确认,购买就上不了链,挂单照旧;买家只付新交易的矿工费
平台抢先用平台钥匙花掉挂单锁花锁的交易先确认,购买就上不了链,买家不花钱;挂单关闭,卖家签取回
卖家锁满 1,008 块前叫停不了,撤单要平台签名;满了以后能自己花锁,和购买抢先谁先确认算谁:卖家先,挂单关闭、取回;购买先,成交
其他人改不了这封信(见上图);要抢同一单,得另有一笔平台签过的购买一把锁只能花一次,最多一笔购买成交
矿工不打包这笔购买其他矿工仍可能打包
08

证明|证明持有,各要交出什么

证明在金库里生成,票据和密钥都留在本机。三种用法差在交给谁、票据动不动:投票交给投票服务,点“证明”交给官网,票据都原封不动;领基础奖励写进比特币链,旧票据换成一张新的。

图中

  1. 证明卡:#46 交出去的只是这张卡,票据留在脚边的保险箱里。
  2. 核对单:SNAP(在本轮快照里)、VALID(证明有效)。
  3. 投票箱:选项连同证明交给投票服务,不上链。
  4. 标签板:投票服务公开的标签记录,每票一行。
  5. 挂单牌:#4 后来挂单,作废码上链,就和板上红的那行对上。

投票按快照算:快照那一块持有的 NAKA 每件一票,之后卖掉也算数。证明借用私密转账那套电路(花费电路),只是什么都不花。也正因为是这套电路,证明里带着作废码,投票服务公开每一票时都附上由它算出的标签,计票谁都能核。投票当时标签对不上任何票据;票据日后花掉、作废码上链,才对得上,那次若是挂单,编号也公开。

没有 NAKA 也能用 Snickets 投票。这种票不用证明,金库签个名交给平台就行,投出去的 Snickets 不退(附录 I06)。

领基础奖励就要上链了:奖励信封把旧票据换成一张新的,外加一个 SHNAKAS 钱袋;链上看得到作废码和新承诺,看不出是哪一件。加成得另发一封信封,签名亮出编号(补领、批量领取见附录 I06)。

“证明”按钮走另一套电路,叫持有证明:证明交给官网的验证接口,申领人是你的钱包地址,公开的只有树根、活动标识和去重标记,连作废码都不露。它证明的是票据在记录树上,不检查是否已经卖出:卖掉的票据叶子一直在树上,用最新的树根照样能证明。

误解投票、点“证明”都会花掉我的 NAKA。

事实这两样都不花票据,也不上链。领基础奖励会花掉旧票据,同一笔就换回新的,挖矿的周数照样接着算(第 07 章)。

技术卡 06三种用法,各交出什么官网投票花费电路证明什么快照时持有一张合格票据交出去的选项和证明(公开输入含作废码),交给投票服务票据怎样不花,不上链边界票据日后花掉,公开的标签就对得上它投了什么领基础奖励花费电路证明什么资格树上有一张整周持有的票据交出去的上链的奖励信封:作废码、新承诺、证明票据怎样正常领取时,旧票据换成新的边界不亮编号,作废码公开持有证明Holder 电路证明什么知道树上某张票据的数据和密钥交出去的证明和申领人地址,交给官网(“证明”按钮)票据怎样不花,不上链边界不检查是否已花:旧叶子仍在新树根里领加成另发一封 BONUS 信封:用签名,不用证明,编号公开票数和标签对得上公开记录;证明没公开,资格只能抽查
看技术卡大图

技术说明持有证明的去重标记是 Poseidon(作品秘密 s, 活动标识, 13)。活动标识由合集、用途和申领人一起算出,所以同一件作品在一个活动里只能证明一次;申领人也在里面,别人抄走这份证明也用不上。投票的标签是另一回事,由作废码和主题、轮次算出,前面说的“对得上”就出在它身上。

09

挖矿|拿着 NAKA 就在挖 SHNAKAS,转手为什么断

SHNAKAS 按整周发:每 1,008 个区块算一周,一张票据从这周开始拿到这周结束,这一周的份额才算它的。份额先记在账上,可以攒着一起领,领了才变成钱袋。

图中

  1. 钟柱:每 1,008 块一根,两根之间就是第 3 周。
  2. 转手:A 的信写进第 3 周中间的一块,B 的新票据从这一块才有。
  3. 打叉的代币:第 3 周的份额,A 和 B 都领不到。
  4. C 和宝箱:另一件整周没动,第 3 周的份额照算,领了才到手。

图里是第 04 章那次转手,转账在第 3 周中间上链:A 的旧票据在那一块花掉,没拿到周末;B 的新票据从那一块才有,不是从周初拿起,所以第 3 周两人都不算。之前的周不受影响,A 拿满的第 1、2 周照领;B 接着拿下去,从第 4 周开始算。

挂单、撤单、转给自己(给作品加中继额度就是一次)同样会断掉当周,因为它们都花掉了旧票据。领基础奖励也花掉旧票据,不过同一笔交易就把这件换回你的金库,索引器把新票据补进当周的资格树,所以挖矿不断。领加成、改价、投票、持有证明不动票据,不影响。

资格决定一周能不能领,权重决定能领多少。每件从 100% 起算,属性地板价高、编号小的另有加成,封顶 400%;规则写在链上的铭文里,谁算都一样(附录 I07),每件每周多少,用浏览器插件 Naka Sigil 看。挂单中和没铸的作品也占份额,这份谁都领不到。

份额不用每周领,可以攒着一起领。只领基础的 100% 不用亮编号,要领加成就得亮出编号。奖励算到第 1,050,324 块为止,之后再留 52 周来领,第 1,102,740 块截止;怎样变成钱袋,见下一页。

误解一挂单或卖掉,以前拿满的周也没了。

事实拿满的周照领,卖掉以后还能补领。挂单期间每周都不算,取回后从下一周恢复。

技术卡 07一周 1,008 块第 1 周第 2 周第 3 周第 4 周971,700972,708973,716974,724975,732✓ 算 ✗ 不算A 的旧票据B 的新票据C 的票据✓✓✗✗✓✓✓✓✓转手交易在这一块上链某一周算你的:这周开始时已经拿着,一直拿到这周结束例外:领奖励换出的新票据,当周照样算每周 1,008 块、266,640 枚,共 78 周;轴上是分界块,第 3 周即 973,717–974,724 块
看技术卡大图

技术说明资格只看两个区块高度:创建票据的区块不晚于周起点,花掉它的区块晚于周终点(没花也算)。权重每块按当时的挂单重算,所以属性地板价一变,加成跟着变。每周的区块区间见附录 E。

10

07 挖矿 · 续

挖矿原理|从蚀刻到钱袋

上一页攒下的份额,领了才变成钱袋。SHNAKAS 在 SHORD 里是一个合集,装的不是作品,是一个个有编号、记着数量的钱袋;2,100 万枚符文在蚀刻时全部给了 NUMS 地址,一直停着不动,钱袋也兑不回去。流程图 03 跟着一次领取走一遍。

流程图 03一次领取:份额怎样变成钱袋蚀刻交易 · 区块 970,2512,100 万枚 SHNAKAS 全部给到 NUMS 地址(符文协议叫预挖)这个地址谁也花不动,这些符文从此不再移动规则铭文 · SHNAKAS 符文合集写明对应这次蚀刻;合集里是编号的钱袋,每个记一个数量3 个固定钱袋加 78 周奖池共 20,798,160 枚,不能超过 2,100 万每周开始 · 资格树索引器把周初已有的 NAKA 票据做成这一周的树当周领奖换出的新票据,也补进这棵树正常领取 · REWARD 信封证明:这张票据在这周的树上作废码没出现过:一直没花同一笔换回新票据,挖矿不断按 100% 的基础份额发一个钱袋可选:领加成 · BONUS 信封亮出编号签个名,不动票据按加成那部分再发一个钱袋没人能领的份额挂单期间:这件没有能花的票据没铸的编号:根本没有票据截止 1,102,740 块后:不再受理不生成钱袋:从没发行规则里没安排的 201,840 枚同样永远不会发钱袋:编号、数量公开,持有人不公开;能拆分、转出、挂单、烧成 Snickets钱袋兑不回 NUMS 上的符文:那 2,100 万枚领不领都原样不动图里是正常领取;卖掉以后补领、一次领好几周,见附录 I07

总量怎么算

流程图只走了一次领取。把所有领取加起来,和上限、规则摆在一起,就是下面这张表:上限是蚀刻时定的,每周发多少写在链上的规则铭文里,已发行是把官网账本里的钱袋逐个加起来。

名称怎么来的数量(枚)
上限蚀刻时全部给到 NUMS 地址;官网叫“上限”,永远不会超过的数量21,000,000
规则最多发3 个固定钱袋各 80 枚,加 78 周、每周 266,640 枚;剩下的 201,840 枚规则里没有安排20,798,160
已发行到 974,323 块领成 987 个钱袋:基础 506 个共 74,989.91 枚,加成 481 个共 92,265.79 枚;3 个固定钱袋还没铸167,255.70
不会发行挂单期间和没铸编号的份额没人能领;截止以后还没领的,也不再发本文没统计
已销毁烧成 Snickets 的钱袋转进花不出的地址;账本认不出是哪几个看官网代币页
流通量已发行减已销毁,官网代币页这样算看官网代币页

为什么叫上限

蚀刻时那 2,100 万枚全部给了 NUMS,符文协议管这叫预挖(Premine)。但 NUMS 谁也花不动,这份预挖不归任何人,只给钱袋总量划了个上限,所以本文照官网叫它“上限”。

误解没人领的份额被销毁了。

事实销毁是已经发出的钱袋再也花不出去,比如烧成 Snickets。没人领的份额从来没变成钱袋,账上本来就没有它;官网的说法是“从未领取的部分永不发行”。

11

核验|账是谁记的,能不能自己核

账是索引器照规则从比特币区块里算出来的,官网的账也一样。要核,就用自己的索引器把区块重算一遍,在同一块上和官网比摘要。只是公开代码还追不上官网的规则,眼下核不全。

图中

  1. 区块按顺序开过来,车厢上写的是高度。
  2. 两台索引器,一台是官网的,一台是你自己跑的。
  3. 规则一样、读到同一块,摘要就一样(9F3A 是开头几位的示意)。
  4. 吐出的纸带:每台机器自己存的账和检查点。

索引器逐块读区块,按规则验收每封 SHORD 信封,过了才记账。验收不看时钟,也不问哪台服务器,所以规则和验证参数一样,谁来跑结果都一样。

这本账存在每台索引器自己的机器上,隔几块存一份检查点。重启时从最新一份能用的接着读,都用不了才从起始区块重算。

对账就比同一块上的状态摘要。10 月 11 日用公开代码从头重放到 970,879 块,摘要和官网一模一样。眼下官网的规则比公开代码新:公开代码只能认出六类消息,官方线上后加的奖励、链下挂单和拆分还没公开,现在记录树和官方有差异,差多少见附录 H。

中继替人发的信,不跑索引器也能核。10 月 29 日起它改用新钱包代发(bc1pr5vsx…5hcp73),官网状态接口列的就是它,在区块浏览器里能看到它发的每一封信。规则里的收款地址见附录 I08。

误解索引器记着全部的账,知道每件作品在谁手里。

事实索引器只记承诺、作废码和密文,私密转账以后看不出哪张票据是哪件、归谁。密文只有收件人的金库解得开。

技术卡 08索引器验什么,摘要盖住什么以私密转账为例:核对证明只用公开的数据和验证参数,不用任何人的私钥读取区块SHORD 信封验证树根在近 100 块内作废码没见过证明成立登记记下作废码收下新承诺存下密文更新记下这一块的树根和叶子数有一项不过:记一条拒收,账本不动存在本机:记录树 · 作废码 · 票据密文 · 铸造 · 挂单 · 检查点重组:退回还在主链上的检查点nn+1n+1′n+2检查点n+1′:同一高度换上来的另一块摘要 v1 盖住树根和叶子数 · 作废码 · 已铸编号挂单的状态、作品、额度和价格不含密文 · 交易号 · 挂单锁 · 收款脚本两台对账:在同一块上比完整的摘要,高度和区块哈希都一样前提:同一条比特币链、同一套规则和验证参数、同一个起始高度
看技术卡大图

技术说明有了检查点,重启就不用从头读。可它也许是旧规则下存的、被改过,或者最后几块已被重组换掉,所以用之前先核三样:规则和验证参数的哈希,用存下的承诺重建出来的每块树根,最后 12 块还在不在主链上。有一样不对就换更早的一份。遇到重组也退回还在主链上的那份重读,追上最新区块之前对外仍用旧账。

12

快问快答

常有人问、正文又没细讲的十件事,先讲转账,再讲钱、钱袋和钥匙的安全。按主题排的完整问答见附录 K。

问私密转账多久能到?对方怎么知道收到了?

答交给官方中继,它会把一段时间里的信攒成一批再发,然后等交易进区块、索引器验收。自己付矿工费就不用等这一批。到了不会有通知,对方打开金库同步,看到新票据就是到了。

问私密转账转错了地址,能撤回吗?

答不能。信封上链、作废码记下,旧票据就作废了。隐私地址没有校验位,抄错一个字符多半仍是“合法”地址,作品就转给了一个谁也打不开的地址。地址要复制粘贴,转前核对首尾。

问把 BTC 或别的铭文直接转到 NUMS 地址,能变成隐私资产吗?

答不能。普通转入不会生成 SHORD 票据,转过去的东西没人有私钥,拿不回来。

问复制一份票据数据,或者两台设备同时打开金库,能花两次吗?

答不能。同一张票据只有一个作废码,索引器只认第一笔,后到的不算。后到的那笔要是用另一份 BTC 付了费,照样能上链,矿工费白付。

问卖出后的 BTC 在哪里?

答在挂单时选的收款地址。选“隐私地址”的,钱在金库的比特币页里,从那里提到任何地址;选连接的钱包或手输地址的,钱直接到那个地址。

问领到的 SHNAKAS 能进普通符文钱包或市场吗?

答不能。领到的是 SHORD 账本里的钱袋;2,100 万枚符文在蚀刻时给了 NUMS 地址,谁也花不动,钱袋也兑不回符文。钱袋能做什么见附录 I07。

问作品锁在 NUMS 地址上,我还要保管什么?

答锁住的是作品所在的比特币输出;持有权记在 SHORD 账本里,跟着金库的钥匙走,要保管的就是这把钥匙(第 01、03 章)。

问解锁签名泄露了,重新签一次、换个 PIN 有用吗?

答没用。同一钱包、同一地址签出的总是同一套钥匙。要换,就用另一个钱包地址开新金库,把票据私密转过去。

问查看密钥泄露了会怎样?

答对方能解开写给你的密文,看到你收过哪些票据,以后发给这把钥匙的也一样。没有花费密钥,动不了它们。

问可信设置是什么,会影响我的作品吗?

答生成证明密钥用的一次性随机数。NAKA 这份由官方单方生成,拿不走你金库里的作品;下一个合集计划改用多方仪式(附录 D)。

13

交易和保管提醒

在 SHORD 里,你的钥匙说了算,每一步上链就作数。动手之前对着下面几条核一遍,资产就稳稳在你手里。

  • 从收藏的官网入口进,看到签解锁文字的签名框先核对网址。这份签名只在官网用,任何人都不能给。
  • 付款后,BTC 确认、索引器验收、金库里出现新票据,三步都到了才算成交。
  • 私下买卖时,BTC 和票据分两笔走,没有挂单锁替双方担保,只和信得过的人做。转完让对方在金库里确认收到,担保方怎么核对见附录 K。
  • 费用看合集:NAKA 平台费 2%,最低 1,000 sats,买家另付,没有版税。Trollbox 等合集是 1% 平台费加 1% 版税。
  • 想领哪一周的奖励,那一周就别挂单、撤单、转手,也不能自己转给自己。
  • 网页金库靠钱包打开,同一个钱包和付款地址总打开同一个金库,要保管好钱包的助记词。手机 Shielded Vault App 另有 24 个词,和 UniSat 等钱包的不是一套,抄在纸上别截图。
  • 作品和钱袋用隐私地址收,BTC 用比特币页的地址收,别往比特币地址转铭文或符文,会被当成 BTC 花掉。搬金库到手机的二维码和链接就是金库,别拍照、别外发;别人发来的金库链接别打开,那是对方的金库,存进去的都归对方。
  • 官网另卖的预付中继只存在买它的浏览器里,换设备、清数据前先用完;票据里的中继额度跟着作品走,卖出时归买家。
出场作品:A 是 #2,B 是 #0,买家 C 是 #21,#4 是被买卖的那一件;#12、#14、#42 是观众,#15、#1、#3 是博物馆里的作品,#7 是来铸造的人,#46 是出示证明的人,#37、#49 运行账本机。

本版 2026 年 11 月 3 日。线上数据截至 10 月 28 日,中继 11 月 2 日复核,项目方在 X 上的说明核到 11 月 2 日,官网金库、市场和游戏 11 月 3 日逐页核过;代码依据公开仓库提交 3cdbdfdf(10 月 12 日)和官网客户端(SHA-256 57457629…,10 月 28 日读取,11 月 3 日复核未变)。规则以后的变化见资料页的版本记录,每条说法的出处和复核日期见资料与复核,完整的操作和术语见网页版的附录(PDF 不收附录)。摊位上的 Ord Dropz 标志照官网图标画成了像素,后窗里那双眼睛是本指南自己画的。

14

附录

A 术语 B 操作与公开 C 票据与消息 D 参数 E 奖励资格 F 线上索引 G 共同地址 H 链上与自主 I 逐章说明 J 隐私名字 K 常见问题

这里是查的时候用的细节,第一次读可以跳过。下面的说法以已存档的线上产品和客户端为准,写着“公开 v1”的数,指公开代码仓库里 v1 版本的数。

A 术语

每个词后面写了它由谁生成、存在哪里:私钥和票据明文在金库里,不上链;写进信封的在比特币区块里,谁都读得到;索引器记的账谁都能从区块重算。

术语在这套协议里指什么
金库 vault你设备上保管钥匙和票据明文的程序(网页金库或手机 App),加密、解密和生成证明都在本机做。网页金库的钥匙全由一份签名算出(第 01 章)
索引器 indexer按 SHORD 规则逐块读比特币区块、验收信封、记账的程序。账存在它自己的机器上,谁都可以自己跑一台(第 08 章)
中继 relay替你付矿工费、把信封发上链的服务。官方中继按预付的中继额度收费,不用中继也能自己付费广播(第 04 章)。收费地址写在合集规则里,10 月 29 日起代发换了新钱包(附录 I08)
sats比特币的最小单位,1 BTC = 100,000,000 sats
票据 note一组代表处置权的数据:作品编号、中继额度、持有人公钥、随机数 ρ 和作品秘密 s。明文不上链,留在金库里,链上只有它的承诺和密文。花它要持有人的花费密钥
隐私地址 shord1shord1 后面是 128 个十六进制字符,解码后 64 字节:前 32 字节是持有人公钥 Poseidon(sk),后 32 字节是查看公钥。别人私密转给你时用它写票据、加密密文;自己铸造、购买、取回用不到。地址公开也看不出金库里有什么,因为每张票据的承诺都混了新的随机数(附录 I01)
隐私名字一枚内容为 {"p":"shord","op":"name",…} 的普通铭文,把 bob.naka 这样的名字指向一个隐私地址。先刻先得,指向写死不能改;协议验收不看它(附录 J)
信封 envelope一条 SHORD 消息的全部字节,写在比特币交易的 OP_RETURN 输出里(大的切开放进 tapscript)。固定 15 字节信头:SHORD 5 字节、版本 1 字节、类型 1 字节、合集编号 8 字节;然后是按类型排的正文;带证明的类型最后接 256 字节证明。私密转账的正文是引用的树根高度 4、作废码 32、新承诺 32、用掉的额度 1、买的额度 2、一次性公钥 32、密文 88,整封 462 字节;挂单 359 字节加收款脚本,购买 201,取回 264,铸造 173。类型 1 转账、2 铸造、3 挂单、4 购买、5 取回、6 批量铸造,线上另有 7 到 12:奖励、加成、链下挂单、拆分
承诺 cm票据的公开指纹,用票据内容和其中的随机数算出,别人从指纹猜不出是哪件作品。私密转账时由转出方的金库算好写进信封。铸造、购买、取回时,信封里写的是 inner,索引器用公开的编号和额度补算
内层指纹 inner票据明文里除编号、额度以外的部分(持有人公钥、ρ、s)算出的指纹。铸造、购买、取回时收的人只公开它,索引器再配上公开的编号和额度算出承诺
记录树索引器按上链顺序把每个承诺作为一片叶子加进树里,存在自己的机器上。树深 20 层,只增不删,谁重放区块都得到同一棵树
默克尔树根 root用一个值代表整棵记录树。索引器记下每个区块之后的树根,证明里引用其中一个,再配一条路径证明某片叶子在树上
作废码 nf花票据时金库用花费密钥算出,写进信封公开。每张票据只有一个,索引器把见过的作废码存成清单,同一个码再出现就拒收
密文 ct 与临时公钥 epk写票据的一方用收件人的查看公钥加密票据明文,写进信封。每次加密都换一个新的临时密钥,所以用私钥重算不出同一段密文,但随时能从区块里再读到
中继额度 tickets票据里记着的预付代发次数,跟着作品走:转手、卖出时随票据一起到下家,官网写的是 “Credits stay with the piece”。在官网按件购买,每个 2,500 sats,当场付给合集规则写死的中继收款地址,归中继拿去付矿工费,协议里没有退回的办法。交给中继代发时,每次私密转账、挂单、撤单用掉一个,自己付矿工费广播可以不扣。官方 10 月 19 日宣布不再出售额度、已有的照用;10 月 28 日的存档里 NAKA 仍开着额度(creditsOff 为 false),铸造照样默认捆 3 个;11 月 3 日官网配置还是这样,市场上每件挂单都标着带几个额度
预付中继 prepaid relays官网金库“中继”页另卖的代发凭证:每个 2,500 sats,一次操作要几个看当时的网络费。浏览器自己生成秘密,用 BTC 买,官网盲签后存在买它的浏览器里、记在当前金库名下;任何一件作品的私密转账、挂单、撤单都能用一个(购买要付 BTC 价款,走钱包或金库的 BTC)。盲签让官网认不出是谁买的,没有钱包弹窗,链上也没有指向你的输入。它不记在票据里、不从种子算出,所以手机上的同一个金库没有它,换浏览器或清数据前先用完。官网把它和票据里的中继额度、连接的钱包、金库里的 BTC 并列为付网络费的方式
种子 seed金库全部钥匙的来源。网页金库由对官网解锁文字的签名算出,手机 App 用 24 个词表示。客户端里没有把它上传的代码
花费密钥 sk、查看密钥都从种子派生,只在金库里。花费密钥用来花票据,查看密钥用来解开写给你的密文
NUMS一个公认没人知道私钥的公钥。作品停放的地址用它做公钥,而且没设脚本花费路径
Poseidon这里用来算指纹的哈希算法,承诺和作废码都用它算。选它是因为在零知识电路里算得快
hbody把一条消息的正文(密文、价格、收款脚本、取回公钥等)算成的一个值,放进证明的公开输入;正文改一个字,证明就不通过。索引器自己算,不写在信封里
活动标识 context 与去重标记 ctxNf持有证明用的两个值:context 由合集、用途和申领人算出,ctxNf = Poseidon(s, context, 13) 按作品秘密 s 算,是同一件作品在同一个 context 里的标记:私密转账不换 s,标记也不变;换了申领人或用途,标记就不同,所以不等于整场活动每件只能用一次(附录 E)
见证 witness 与证明 proofwitness 是生成证明时用的秘密输入,只在金库里。proof 是交给验证方检查的证明数据:转账、挂单的证明随交易写进信封,索引器验过不另存,原文一直在区块里;投票和持有证明交给各自的验证方,不上链
挂单锁挂单交易里建的一个 BTC 输出(官方中继建的都是 330 sats,索引器只认脚本、不看金额),用 txid:vout 定位,只能花一次。撤单时由平台签名花掉它;同一笔交易里没有有效的购买,作品不会转走,由卖家签 CLAIM 取回。卖家的取回密钥在它确认满 1,008 块后也能花
挂单记录索引器验收挂单时记下的编号、额度、价格、收款脚本、取回公钥和锁的位置,存在索引器本机
取回密钥由种子和这次挂单的作废码派生的一把钥匙,每笔挂单一把,挂单时写进挂单锁;撤单或超时取回时,用它签 CLAIM 拿回票据
许可币一枚锁在平台公钥上的比特币输出,每次铸造要花掉一枚,所以铸造要平台签名
父铭文与子铭文父铭文是一枚写着合集规则的 Ordinals 铭文;每件作品铸出后由平台铭刻成它的子铭文(铭刻交易花掉父铭文并写上父标签);全部作品文件的哈希树根 artRoot 写在父铭文里
信封的载体公开 v1 把信封写在交易的 OP_RETURN 输出里;现在的客户端还能把信封切开放进 tapscript,用 commit、reveal 两笔交易发出
资格树与快照领奖励时用的是某一周边界时的记录树,叶子固定下来就是那一周的资格树;投票按某一轮的快照高度决定谁有资格
奖励票据、钱袋领奖励时账本里新生成的票据,官网叫钱袋:编号和数量公开,持有人不公开。符文本身停在 NUMS 地址不动,钱袋兑不回去(挖矿原理)
Snickets烧掉 SHNAKAS 换来的点数,一枚换一个,只能烧整枚,一次从一个钱袋里烧;由平台记账,用来换 GTD 名额、投票
全局编号 Shielded #官网市场和质押页写的编号:各个 SHORD 合集接着排,NAKA 是 0 到 3,332,和作品编号相同;COMMEMORATIVE COINS 从 3,333 起,Trollbox 从 3,833 起。质押页说的“Shielded 编号小于 1K、100、10”加成,对 NAKA 就是作品编号
状态摘要 digest索引器对选定的状态字段算出来的值,用来和别的索引器对账。公开版 v1 覆盖树根和叶子数、用过的作废码、铸造记录,以及每个挂单的作废码、状态、编号、额度和价格,不含密文、收款脚本和挂单锁
检查点索引器隔一段把验证过的状态存成文件,重启从这里接着读。文件被截断或改过就不用,退回更早的一份或从头重放。要确认内容确实来自链上,最直接的是自己从区块重放一遍
重组比特币最长链换掉了最近几块,那几块里的交易回到未确认状态;索引器退回还在主链上的检查点重读,刚验收的记录可能撤回

B 每种操作查什么、会公开什么

操作怎么检查会公开什么,要注意什么
创建合集父铭文写死供应量、费用、收款脚本这些,artRoot 管住作品文件的内容规则和作品都公开。后面的铭刻做没做完,要另外查
单件铸造编号没超出供应量,也没被铸过,许可币和付款都对编号、付款和新的承诺会公开。NAKA 还要一个许可签名
批量铸造 MINTN公开 v1 一次最多 20 件,付款整批一起查已经铸过的编号会被跳过,索引器不会自动退钱
接收与保管金库在本机扫描,重算承诺和作废码,看票据还能不能用以金库扫到的最新状态为准,以前的记录说明不了现在还拿着。持有不收保管费
私密转账证明有权花、编号没变、作废码没用过一般情况下,编号和旧叶子都不公开。密文由转出方的金库按规则生成,电路不检查它
添加中继额度buy 要对得上付款,新额度由电路算NAKA 一个额度 2,500 sats,付给规则写死的中继收款地址 bc1phcjk…3t3cuy,不退。在官网自己转给自己来充值,会断掉当周的奖励
使用中继证明或签名已经把内容定死,中继只负责广播,改不了链上的付费方是中继,看不到你的钱包。你预付的额度只在官方中继兑现;它没及时发出,可以改成自己付费广播
预付中继用 BTC 向官网买,官网盲签,存在买它的浏览器里代发时交出一个抵费用;盲签让官网认不出是谁买的;换浏览器、清数据前先用完(附录 A)
自己广播那笔 BTC 交易自己构建、签名、广播付款用的输入会公开。证明太旧就重做一份,资产本身没有过期一说
旧式挂单 LIST(NAKA 用的)花掉旧票据,证明里绑定编号和报价,建一个挂单锁(官方中继建的是 330 sats)编号、价格、收款脚本、取回公钥和额度都公开。收款脚本可以是任何类型的地址(附录 I05)。撤单靠平台签名花掉锁,作品不会因此转走
链下挂单 LIST3挂单签名先放在链下,买的时候一起上链,挂单最长有效 4,032 块Trollbox、COMMEMORATIVE COINS 已经在用,平台费 1%,版税 1%,官网前端还可能另加一笔收款手续费(上限 20,000 sats)。项目方说 NAKA 不改
购买 BUY挂单有效,花的正是那把锁,卖家收足标价,平台费另付平台费由买家在标价之外另付,新票据由买家准备;以索引器验收为准(第 05 章)
正常撤单花掉锁关闭挂单,再用取回密钥签 CLAIM马上撤单要平台签名花锁。两步可以放进同一笔交易。只关了挂单的话,还得补一笔把票据取回来
超时取回锁过了 1,008 块的相对时间锁,走卖家的脚本路径从锁那笔输出确认的区块算起,用取回密钥自己签,矿工费自己付
BTC 收入与提取对金库派生地址里的普通 UTXO 签名,算好手续费和找零卖出所得每次收在一个由种子和挂单算出的新地址上,地址不复用;它们都是普通的比特币地址
恢复金库同一种子、配套规则与验证参数,在本机扫描并查哪些已经花掉网页金库用同一个钱包、同一个付款地址签出同样的签名,就是同一个种子。领奖励派生出来的票据也要认得出来
领基础奖励资格树和花费证明、整周的范围、同一份不能领两次正常领取会花掉原票据,换出一张新票据,持有周数接着算;基础那份不用公开编号
领加成、批量领和之前那次领取绑在一起,核对编号、周的范围和每一项金额加成要公开编号、领了多少、从领的第一周起没挂单没转手,领到的钱袋一直和这件绑在一起,付矿工费的钱包也在交易上。批量领可能分成提交、揭示两笔
拆分钱袋当前客户端检查拆成 2 到 16 份、每份大于零、加起来不变原来的编号、额度和每份金额都公开。目前没有合并钱袋的操作
持有验证公开的 holder 电路查票据在不在记录树里,再算一个按活动去重的标记 ctxNf证明票据在记录树上,不检查是否已经卖出;去重的范围看 context 怎么定(附录 E)
隐私投票官网金库页的投票:按这一轮的快照挑出合格票据(快照时持有,之后花掉的也算),本机用花费电路生成证明,主题、轮次、选项哈希在里面,选项和证明交给投票服务不上链,票据不动。交出去的有选项和证明的公开输入(含这张票据的作废码)。服务公开每票的标签和选项,计票人人可核(第 06 章、附录 I06)
失败、重试与重组分清几种状态:提交了、广播了、进了内存池、BTC 确认了、协议接受了先查原来那笔的结果,免得重复付钱。重组以后,状态可能往回退

隐私边界:每一步留下什么

SHORD 藏的是“哪件归谁”和票据之间的联系,不藏比特币交易本身。编号是贯穿始终的公开标识:#N 什么时候被哪个地址买走、什么时候以什么价挂出,都看得到;SHORD 不能证明现在的卖家就是上次的买家,也不能证明不是,因为中间的私密转账在链上没有编号。

操作链上或对方看得到看不到
铸造付款地址、编号、付了多少这一步全部公开
私密转账有人花了一张票据:作废码、密文;自己广播还多一个付费地址花的哪张、是哪件、给了谁
挂单编号、价格、收款脚本、取回公钥上次公开操作之后换没换过手
购买买家的付款地址、付给谁多少、编号买家之后把它转给谁
撤单、取回锁被花掉、取回的签名新票据归谁,链上只有承诺
领基础奖励上链的信封:作废码、新承诺编号、持有人
领加成编号、领了多少;领到的钱袋一直和这件绑在一起金库地址
拆分钱袋原钱袋和拆出的每个钱袋:编号、数量拆出的钱袋归谁
Snickets(交给平台)烧掉的钱袋和它的 s;Snickets 按 Snickets 钥匙记在平台账上链上没有 Snickets 的记录
投票(交给投票服务)选项、含作废码的公开输入;每票的标签和选项公开票据花掉以前,对不上是哪张
持有证明(交给验证方)树根、活动标识、去重标记;官网按钮还带上申领人(连接的钱包地址)哪张票据、哪件
走中继中继看到你的请求链上没有你的付费地址
取隐私名字名字和隐私地址的对应;自己铭刻还有付费钱包金库里有什么

这样做更私密

留意这三处

C 票据、证明和链上消息

票据写成 (assetId, tickets, ownerPk, rho, s)。这里的 tickets 是这张票据带着的中继额度,和“票据”是两码事。花费电路里的几个关系:

ownerPk = Poseidon(sk)
inner   = Poseidon(ownerPk, rho, s)
cm      = Poseidon(assetId, tickets, inner)
nf      = Poseidon(sk, rho, 7)

普通转账保留 assetId 和作品秘密 s,新的随机数是 rhoOut = Poseidon(nf, 11),新承诺 cmOut 由转出方的金库算好写进信封。铸造、购买和取回时,收的人的金库只公开 inner 和密文,索引器用公开的编号和额度补算承诺。额度按 ticketsOut = ticketsIn - spend + buy 算。收款地址(隐私地址)里是持有人公钥 Poseidon(sk) 和查看公钥,普通密文是 88 字节。

电路的公开输入有 root、nf、hbody、cmOut、spend、buy、mode、assetIdPub、ticketsPub。mode 是 0 表示转账,是 1 表示公开挂单。hbody 把证明和消息正文绑在一起。root 和 hbody 是索引器根据消息和自己的状态拿到或者算出来的,并不是原样写在信封里的两个字段。

公开 v1 的信封头由 SHORD 标记、版本、类型和 cid 组成,一共 15 字节。转账和挂单带一份 256 字节的证明,BUY 和 CLAIM 有各自的验收、锁和返回签名规则。官网现在的客户端还多了几种类型:奖励是 7 到 10,LIST3 是 11,SPLIT 是 12。只看公开版的六种,线上的情况说不全。

D 参数和容易弄混的地方

理论来源。SHORD 用的组件都有公开的论文或标准,下表列出对应关系。它说明 SHORD 建立在哪些成熟的密码学组件上;SHORD 自己的电路和实现目前没有公开的第三方审计报告。

组件出处在 SHORD 里做什么
Groth16 证明Groth,“On the Size of Pairing-based Non-interactive Arguments”,EUROCRYPT 2016;实现是 snarkjs,曲线 BN254花费电路、持有电路
Poseidon 哈希Grassi 等,“Poseidon: A New Hash Function for Zero-Knowledge Proof Systems”,USENIX Security 2021;实现是 circomlib承诺、作废码、持有人公钥、记录树
票据、承诺树、作废码Zerocash(Ben-Sasson 等,IEEE S&P 2014)和 Zcash 协议规范结构上可以对照;SHORD 的公开代码和文档没有引用它们
票据加密X25519(RFC 7748)、ChaCha20-Poly1305(RFC 8439),密钥是 SHA-256("shord/note/v1" ‖ 共享秘密 ‖ 临时公钥)写给收件人的票据明文
比特币脚本BIP340 Schnorr 签名、BIP341 Taproot、BIP342 Tapscript;相对时间锁 BIP68 和 BIP112(CHECKSEQUENCEVERIFY)挂单锁、取回密钥的签名、1,008 块后自己取回
网页金库ECDSA 消息签名,钱包常用 RFC 6979 确定性签名;24 个词用 BIP39 词表编码 32 字节种子,不走 BIP39 的 PBKDF2签名算出种子、助记词

E 奖励和持有资格

链上的计划是这样的:起算高度 971,700,第一周是 971,701 到 972,708。每周名义上发 266,640 枚,一共 78 周,领取截止到第 1,102,740 块。分母算的是目录里全部 3,333 个编号,权重每个区块都在变。个人能不能领、累计怎么算、已经领了多少、最后流通了多少,得分开统计。

78 周的奖池加上开头固定的 3 个钱袋(每个 80 枚),一共是 20,798,160 枚。挂着的和还没铸的作品也占份额,这部分没人领得到,也就从不发行,官网写着“从未领取的部分永不发行”(挖矿原理)。

公开的 holder 电路证明的是:某张票据在记录树里,并按活动去重。用它时要知道两点。一是它不检查票据花没花掉:记录树只增不删,作品卖掉以后旧叶子还在,原持有人拿最新的树根照样能证明;协议文档用“验证方只认最近 6 个区块的树根”限制证明的时效,限的是树根的新旧,旧叶子仍在新树根里。二是去重按作品算:去重标记 ctxNf = Poseidon(s, context, 13) 由作品秘密 s 算出,私密转账保留 s,转出方和接收方只有一个能用上;成交会换新 s,卖家和买家各能证明一次。线上投票用的不是这条电路,而是花费电路,见附录 B。

context 里带上不同的申领账号,同一份证明复制过去就用不了;相应地,去重也分到了不同的 context 里,所以它不等于整场活动每件只能用一次。

F 线上索引怎么保持一致

先把网络、合集、规则版本、验证密钥、生效高度和区块哈希对齐,再去比状态。索引器按链上的顺序验收消息,不同类型的消息验法不同:转账和挂单查引用的树根、作废码和证明,购买查是否花了那把锁、钱付得对不对,取回查卖家的签名。承诺、已花费标记、挂单和奖励记录各记各的。读到同一个高度只是对账的起点,比摘要时要知道它覆盖了什么:公开版 v1 的摘要不含密文、收款脚本和挂单锁,摘要一致只说明它覆盖的那几部分一致。线上接口另有一个奖励摘要。官网状态接口只给高度和摘要,不给区块哈希;Ord Dropz 托管的公开接口两样都给。2026 年 11 月 3 日两边在 974,394 块的摘要相同,但都是 Ord Dropz 自己运行的,这不算独立核验。

索引器存在本机的是:记录树的全部叶子、每个区块之后的树根和叶子数、见过的作废码、铸造记录、挂单和锁的位置,以及每封信封验收或拒收的记录。证明不另存,原文在区块里。它不知道私密转账后的票据是哪件作品,也不知道票据属于谁。检查点存的是验证过的中间状态,重启以后从那里接着读。碰上链重组,就退回到共同的那段历史,再往下重放。增量同步从上次读到的位置接着读,钱包在本机扫描,认出自己的密文。naka-sigil 公开的资料里能看到它怎么读官方 API、怎么前后核对高度、怎么校验奖励表、碰上重组怎么作废旧数据。

线上的规则比公开仓库新。本指南按线上的合集资料、状态、客户端和链上记录来讲。想完整地独立重放,得有对应的规则和参数,拿旧版本跑出来的数字差异,评判不了线上机制。

G 共同地址和依据

bc1prykz5vxt6lgr2tu56np35slhvlc77s7hlajr3qucsrkqwhvp48mq5grvgr

这个地址上有 NAKA 已铭刻的子作品和蚀刻时给到这里的 2,100 万枚 SHNAKAS,Trollbox 等其他 SHORD 合集的作品也在这里。父铭文不在这儿,这个地址也不是哪个用户隐私票据的余额地址。

怎么核对的:重算 NUMS 的构造。NAKA 全部 26 笔子铭文创建交易,每一笔打到这个地址的输出数,都等于这笔交易里的铭文数,加起来 3,327 件。SHNAKAS 的蚀刻交易里,Runestone 的预挖(Premine)2,100 万枚指向输出 1,2026 年 10 月 28 日读的时候还没花。这是按输出个数核对的,没有一个 sat 一个 sat 地做 Ordinals 重放。

签名那一章说的,只是官网那段固定解锁文字的派生方式,套不到任意签名上,也套不到单独生成的金库密钥上。原始响应、哈希和完整的核对范围见资料与复核。

H 链上留了什么,自己能做多少

资产和账本有多少在链上、不经官网的服务器自己能做到哪一步,常有人问。下面的结论依据公开代码 3cdbdfdf 和 2026 年 10 月 28 日保存的官网客户端。

问题结论依据
链上存了什么公开 v1 的每条 SHORD 消息都写在比特币交易的 OP_RETURN 里;现在的客户端还能把信封切开放进 tapscript,用 commit 和 reveal 两笔交易发出,批量领奖就这么发。转账和挂单带作废码和证明,转账还带新承诺。铸造、购买、取回带 inner,由索引器补算承诺。公开 v1 里给出新票据的消息都带一个临时公钥和 88 字节密文;批量领奖换出的 NAKA 新票据没有自己的密文(见下),钱袋本身带一份公开代码的信封格式(envelope.mjs);线上新类型见客户端
密文谁保管跟着比特币区块走,存着完整区块的节点都有,项目方不单独保管同上
能不能用私钥重新生成密文不能。发送方每次加密都用新的临时密钥,收款人只能解开它。也不用保存,随时能从区块里再读出来客户端的加密函数每次生成新的临时私钥
只凭钥匙能找回全部持仓吗按客户端代码,拿到完整的票据列表就能。金库逐张试着解密;批量领奖换出的新票据没有自己的密文,用上一张票据推出随机数,钱袋的密文另有一份。现在完整的列表只有官网索引器给得出:自己跑公开版,只能列出前六类消息产生的票据,奖励、拆分等新类型产生的列不出来,要等规则公开。票据本身都在链上,不靠项目方保管;缺的是认全 12 种消息的开源索引器。官网客户端(浏览器下载的 JS)已经能解析全部 12 种,照它补齐索引器就能自己列全客户端的扫描函数,有密文就解密,没有就按上一张票据推算,再核对承诺
密文写错会怎样官网客户端照规则加密,不会写错。用了把密文写错的第三方软件,电路和索引器都不检查密文,收款人的金库就认不出那张票据。挂单成交、取回和铸造的新票据由收的人自己生成,不会这样PROTOCOL-v1.md“Still open”一节
能自己重放整本账吗公开代码认的前六类消息现在就能;线上后来加的奖励(7–10)、链下挂单(11)和拆分(12)还没有公开实现,项目方在 X 上说索引器会全部开源,开源后链上的信封谁都能重放。一次对照:区块 973,352 上官网记着 9,882 张票据,公开代码算出 8,678 张,差额来自公开代码还不认的新类型。奖励权重的规则和属性表都在链上的 SHNAKAS 规则铭文里(阶梯、编号加成、没人挂单的属性怎么定档、算地板价只认 546 sats 以上和五种脚本的挂单,见附录 I07),输入是账本里的挂单和成交,任何索引器按区块都能算出同样的权重公开代码只定义到第 6 类;两边的状态记录
两台索引器一定一致吗规则版本、参数、起始高度和链都相同时,验收只看区块,不看时钟、随机数和服务器数据,结果一致。2026 年 10 月 11 日有一次独立重放,在区块 970,879 和官网摘要对上。规则版本不同才会分开,所以对账先对规则版本公开仓库 docs/STATUS.md
中继额度的 BTC 在哪买额度时当场付给合集规则写死的中继收款地址(附录 I08),由中继拿去付矿工费;票据里记的是代发次数,由官方中继兑现。不用中继,自己付矿工费照样能发PROTOCOL-v1.md 付款规则、NAKA 父铭文规则、官网 status
有没有只存在你浏览器里的东西只有官网的预付中继,存在买它的浏览器里(附录 A),换浏览器前先用完。作品和票据都不在浏览器里,票据里的中继额度跟着作品走官网金库页脚本:shielded_relays_v1 本地存储、/tokens/build、/tokens/mint、/relay
索引器要存什么记录树、作废码清单、铸造、挂单和每块树根,隔一段存检查点。全能从区块重算,检查点都用不了就从起始区块重放公开代码 indexer.mjs、checkpoint.mjs
哪些在平台服务器上中继的待发队列;铸造许可币和挂单锁的平台签名密钥(铸造和购买由平台签名);未铸作品的原图清单;算好的奖励权重表(规则在链上,任何人都能按区块重算,这次没有逐块复核数值)relayer、docs/STATUS.md、客户端代码
不经官网服务器,能做什么持有不受影响。有完整的账本状态、配套的客户端、规则和证明密钥,私密转账就能自己生成、自己付矿工费广播。证明密钥(spend.zkey、spend.wasm)在官网下载,公开仓库里有验证密钥,想离线自己做证明可以存一份(附录 K)。铸造和购买现在由平台签名,按创始人的说明,这是上线阶段用来及时叫停漏洞的保护,下个版本拿掉(附录 K);已挂的单,卖家满 1,008 块也能自己取回。完整重放账本,等索引器全部开源PROTOCOL-v1.md “Running without Ord Dropz” 一表

要保管的是钱包,或者 24 个词。网页金库靠钱包:官网请钱包用 ECDSA 方式签那段固定文字,界面写着 “The same wallet always opens the same vault.”。前提是钱包每次签出同样的签名:比特币钱包常用的签名库按 RFC 6979 做确定性签名,签名一样,种子才一样。所以要保管好钱包自己的助记词,并记住当时连接的付款地址。手机 App 是那 24 个词,它们就是金库的种子,网页金库也能导进 App 抄下来。

数据放在链上也有取舍。每笔交易更大,少数矿池不打包超过 83 字节的 OP_RETURN,要等别的矿池。密文一直在链上,所以查看密钥和花费密钥一样要保管好:它能看到写给你的票据,但动不了它们。

I 逐章技术说明

这是各章图下“技术说明”的完整版,回答“为什么这样设计、出了岔子协议怎么处理”。

00 导读|SHORD 是什么,你持有的是什么

比特币不认识 SHORD。信封对它来说只是一段数据(公开 v1 放在 OP_RETURN 里,现在的客户端也能放进 tapscript),矿工照常打包,不看里面写了什么。哪一封有效、记录树长成什么样,全靠索引器按 SHORD 的规则一封封验。所以同一笔交易,比特币确认了,SHORD 仍可能拒收。

信封里的东西都公开,但没有票据的明文。私密转账只有指纹、作废码、密文和证明。铸造、购买和挂单还会公开编号、价格、收款脚本这些交易本身要公开的内容。索引器那一列全是从区块算出来的,用不着信任哪一台。要自己核验,得有配套的规则、参数和完整的区块数据,最好接自己的比特币节点。

承诺由谁算,分两种情况。私密转账时,转出方的金库算好写进信封,证明保证它和旧票据是同一件作品。铸造、购买、取回时,新票据由收的人自己生成,信封里只放 inner 和密文,索引器用公开的编号和额度补算承诺。

证明用的是 Groth16,验证参数在公开代码里固定,索引器验证时只用这份公开参数和信封里的数据,碰不到任何人的私钥。这份参数的可信设置见附录 D。

01 金库|持有靠什么,钥匙从哪来

官网请钱包用 ECDSA 方式签那段固定文字:UniSat 用 signMessage 的 ecdsa 模式,Xverse 用 ECDSA 协议,签名的都是连接时的付款地址。种子 = SHA-256("shord/seed/v1" ‖ 签名)。文字原文在官网引擎的 VAULT_KEY_MESSAGE 里,共四句:“Ord Dropz shielded vault key v1”“Signing this unlocks your Shielded Ordinals vault on Ord Dropz.”“ONLY sign this on ord dropz. Anyone with this signature can move your shielded pieces.”“It does not move any bitcoin.”。最后一句指的是你连接的钱包;金库自己的 BTC 地址也从种子算出,拿到签名的人一样能取走。

种子派生出花费密钥和查看密钥。每次挂单的取回密钥和卖出所得地址,由种子加这次挂单的作废码算出。金库自己的 BTC 地址按序号排开,链下挂单用的币、领加成另有几把钥匙。这些全是确定的算法,只要签名一样,换设备重签就能全部重算出来(官网写着同一个钱包总是打开同一个金库),卖出所得的地址也能对着成交记录找回。

查看密钥和花费密钥是分开的:只有查看密钥,能看到写给你的票据,动不了。网页金库的签名两样都给,所以它等于整个金库。

隐私地址 shord1… 是种子给出的另一样东西:shord1 后面是 128 个十六进制字符,解码后 64 字节,前 32 字节是持有人公钥 ownerPk = Poseidon(sk),后 32 字节是查看公钥(x25519)。它只在别人替你生成票据时用到:私密转账或转一个 SHNAKAS 钱袋时,转出方把 ownerPk 写进新票据的内层指纹 inner = Poseidon(ownerPk, ρ′, s),算出承诺,以后只有握着对应 sk 的人能证明“这是我的”;再用你的查看公钥加一把一次性密钥加密密文,你的金库才读得到。铸造、购买、取回、领奖励的新票据是你自己的金库生成的,直接用自己的钥匙,用不到地址。持有人公钥是花费密钥的单向哈希,公开了也算不出 sk;查看公钥和花费密钥分开,所以交出查看密钥只能读不能花。地址本身是公开的,名字(附录 J)指向的也是它。隐私不靠藏地址:每张票据的承诺都混了新的随机数,同一个地址收到几件,链上的承诺彼此毫无关系;密文每次换一次性公钥,外人对不上是写给哪个查看公钥的。转出方是例外:私密转账沿用作品秘密 s。你下次花这张票据时,作废码会公开写进信封,下一张的随机数 ρ = Poseidon(作废码, 11) 就由它算出(电路规定)。转出方用不着算出你的作废码:他拿链上每封信公开的作废码和新承诺,套上 s、编号和猜到的地址算一遍,对上就认出来了。所以你领基础奖励、再私密转给他认得的地址,他都对得上,直到作品成交、或链上挂单后取回,换了新的 s(附录 K)。

手机 App 的 24 个词,就是 32 字节的金库种子加一字节校验。网页金库可以导进 App,抄下它的 24 个词。

官网另卖的预付中继(附录 A)不从种子算出:秘密由浏览器自己生成、官网盲签,所以它只在买它的浏览器里,手机上的同一个金库没有它。

02 发行|规则写在父铭文,铸造的钱分给谁

规则是父铭文内容里的一段 JSON(p = shord,v = 1 或 2):供应量、文件树根 artRoot 和内容类型、铸造价、平台铸造费、铭刻费、成交费、中继额度价、三个收款脚本、许可钥匙 gateKey 和挂单锁钥匙 lockKey,可选的 2-of-3 多签和证明参数哈希。索引器只盯一枚父铭文,从它的揭示交易里读规则;信封头里的合集编号 cid 是父铭文编号哈希的前 8 字节,别的合集的信封不看。

铸造的验收:编号在供应量内、没铸过;付款先按收款脚本把金额加起来,每个脚本收到的不少于规则要求的数;交易花掉一枚 P2TR(gateKey) 的许可币。许可币只有平台能签,所以铸造离不开平台;批量铸造 MINTN 公开 v1 一次最多 20 件,铸过的编号跳过,钱不退。新票据由铸造的人自己生成,信封里只放 inner 和密文,索引器用公开的编号和额度补算承诺。

作品文件:父铭文不放图,只放 artRoot。铸出来之后平台把文件铭刻成父铭文的子铭文(ord 的规则:铭刻交易花掉父铭文,带上父标签),元数据里写着第几件,同一编号以最早的子铭文为准。核对一件文件是不是第 N 件,要有它到 artRoot 的默克尔路径,路径由全部作品的哈希清单算出,清单还没公布;#0 的子铭文没写编号,公开代码里写死了它的路径。父铭文要等最后一件铭刻完才停进 NUMS,2026 年 10 月 28 日它还不在 NUMS 地址上(附录 G)。

分钱:NAKA 规则里 mintPrice 15,000 付艺术家脚本,mintFee 0,inscribeFee 3,000 和 ticketPrice 2,500 付中继脚本,saleFeeBps 200、saleFeeMin 1,000 付平台脚本,没有 royalty。艺术家脚本和平台脚本是同一段脚本(存档的 collection.json)。v2 规则多一项转售版税,付给艺术家脚本,比例参数最高 10%,另有最低额,低价成交时实际比例更高;只认 v1 规则的旧索引器读不了 v2 父铭文。NAKA 的父铭文是 v1,不会追加版税。顺带说明,这里的“规则 v1、v2”是父铭文里的版本号,和公开代码的 src/v1 目录、信封版本号、持有证明电路的第二版不是一回事。

03 存放|作品在哪,你买到的是什么

承诺分两层算:ownerPk = Poseidon(sk),inner = Poseidon(ownerPk, ρ, s),cm = Poseidon(编号, 额度, inner)。分两层是为了铸造、购买和取回:编号和额度这时本来就公开,收的人只交出 inner,索引器自己补算 cm,不用另做证明。

铸造、购买和取回时,ρ 和 s 都是新的随机值。私密转账时,新的 ρ′ 由旧票据的作废码算出(见第 04 章),s 保持不变。每换一次手,持有人公钥或 ρ 就变了,承诺也就完全不同。s 叫作品秘密,成交、铸造、取回时换新,持有证明靠它去重(附录 E)。

记录树深 20 层,最多 1,048,576 片叶子。索引器记下每个区块之后的树根。花票据时,证明引用最近 100 块里的一个树根,说明“我的票据在这棵树上”,不说是哪一片叶子。

中继额度也算在承诺里,平时外人看不到你还剩几次。但铸造和购买时买了几次是公开的,挂单时票据上剩几次也会一起公开。每花一次票据,电路都检查新额度等于旧额度减去用掉的、加上新买的,而且不能小于零。

04 转让|私下转给别人,链上看见什么

为什么不直接把旧票据标成已花?链上的票据只是树上的一片叶子。要是花的时候公开是哪一片,外人就能把这次花费和生成这片叶子的那笔交易连起来,谁买的、转给了谁,一路追下去。

作废码是同一张票据的另一个指纹:nf = Poseidon(sk, ρ, 7)。一张票据只算得出一个作废码,同一个码第二次出现就拒收,重花就防住了。外人对不上它是哪片叶子,证明负责说明“这个作废码属于树上某张归我的票据”。

为什么要用花费密钥来算?私密转账的新票据,随机数 ρ′ = Poseidon(nf, 11) 由旧票据公开的作废码算出,谁都算得到,写这张新票据的转出方更不用说。作废码要是只由 ρ 算,任何人都能先算好新票据的作废码,等它在链上出现,一路把这件作品的转手串起来。加上只有持有人有的花费密钥,别人就算不出来(电路注释:“only the owner can compute it”)。式子里的 7 和 11 只是区分用途的常数。ρ′ 由旧票据唯一确定,转出方也没法故意造出两张作废码相同的票据。

作废码会不会被抢用?信封在内存池里谁都看得到,作废码和证明也在里面。但作废码不是钥匙,只是一个公开的标记:证明的公开输入里有它、新承诺,还有正文哈希 hbody(密文、额度这些都算在里面),改任何一样证明就不通过,要重做证明得有花费密钥。别人能做的只有把这封信原样放进自己付更高手续费的交易,抢先上链,结果和原来一样:旧票据作废,新票据归收件人,后到的那封因作废码重复被拒。挂单信封也一样,价格、收款脚本和取回公钥都在 hbody 里,抢先照发只会替卖家挂出同一张单,还得自己出锁里的 BTC。购买信封没有证明,但它所在的交易必须花掉挂单锁,平台只在核对过的那笔购买上签名。

没有中继也能转:信封里“用掉的额度”写 0,自己付矿工费广播。代价是付费的那笔 BTC 公开,外人看得出是哪个钱包发了这笔 SHORD 交易,看不出是哪张票据、转给了谁。用一笔和自己身份无关的 BTC 付费,能少掉这层关联。官网的“自己发送”用的是你连接的钱包。中继的好处是替你付费,还把一段时间里收到的几封信随机排序、合进一笔交易发出去。官方中继的状态接口报的窗口是 5 分钟(batchWindowMs = 300000);公开中继代码的默认是 10 分钟,每批在窗口的 0.5 到 1.5 倍之间随机发出,官方中继是不是同样的随机法没有公开。代发的交易由中继自己的钱包出钱,它收进的额度费就变成替人付的矿工费和挂单锁(10 月 29 日起换了新钱包,见本附录 08)。官方 10 月在 X 上的长帖有一节叫 “CREDITS GONE”,原文:“Same update kills relay credits. No more buying tickets to do private actions. Your vault's own bitcoin pays the network fee, same as any wallet. Old credits still work if you have them, nobody loses anything. Prepaid relays stay as an option for people who want the extra privacy. The platform never pays for anything, which is what keeps it honest.” 取消的是按件卖中继额度,中继和预付中继都保留,默认改由金库里的 BTC 付网络费。到 10 月 28 日的存档,NAKA 的配置里 creditsOff 仍是 false,额度还开着;11 月 3 日官网配置照旧,市场上每件挂单都标着带几个额度,SHNAKAS 钱袋每个也带 1 个。改用金库的 BTC 付网络费,付费的输入会出现在这封信封的交易里;金库的 BTC 多半来自挂单收款,收款地址又写在挂单里,所以想更私密,就走中继或预付中继。

写进票据的中继额度,是预付给官方中继的服务费。它跟着作品走,转手、卖出时随票据到下家,卖家没用完的额度归了买家。买额度的 BTC 当时就付给了中继,票据里记的是代发次数,由官方中继兑现。公开的中继程序谁都能跑,替别人代发要它自己付矿工费。预付中继见附录 A。

05 交易|挂单公开什么,平台能做什么

挂单锁是一个 P2TR 输出,有两条花法。平台的 lockKey 走密钥路径,随时能花。卖家的取回公钥走脚本路径,要等锁确认满 1,008 块。取回密钥由种子和这次挂单的作废码派生,只有卖家算得出。

索引器每读一个区块,都看每笔交易花掉了哪些币,不管这笔交易带不带 SHORD 信封。只要有挂单锁被花掉,就看同一笔交易里有没有有效的购买:付款对、花的正是这把锁,就算成交,新票据归买家。没有,挂单就变成“已关闭”,这时作品没有票据,只有卖家取得回来。

所以锁在一笔没有有效购买的交易里被花掉,挂单就关闭,作品等卖家用取回密钥签一笔 CLAIM,换成卖家的新票据;这个签名只有卖家签得出。官方中继建的锁都是 330 sats。货款也不经过平台,购买时直接付到卖家的收款地址。

锁里没有作废码:它是一个 P2TR 输出,内部公钥是平台的 lockKey,脚本叶子是“1,008 块相对时间锁 + 卖家取回公钥”。挂单记录以挂单的作废码为编号,记着编号、额度、价格、收款脚本、取回公钥和锁的位置。取回信封带上卖家新票据的内层指纹和密文,用取回密钥对整封正文签名;索引器核对签名,再用挂单记录里公开的编号和额度补算承诺。取回密钥由种子和这次挂单的作废码算出,平台算不出来。

平台签名绑住什么:公开代码的多签模块签挂单锁时用 SIGHASH_DEFAULT,签名绑住整笔交易的每个输入和输出,签之前先用自己的索引器模拟验收,并记住已经签过的单,不给同一件再签第二笔。NAKA 用平台单签,签名在平台服务器上做;不论用哪种签名类型,同一把锁在比特币上只能花一次,只有一笔购买能成立。

平台签名只用在两处:成交时签购买,撤单时花锁。作品不会因此到平台手里:锁被花掉却没成交,挂单关闭,卖家签 CLAIM 取回;平台没签撤单,卖家等锁满 1,008 块,自己花锁,在同一笔里取回。正常撤单时,平台花锁和卖家取回放在同一笔交易里,挂单直接变成“已取回”。

购买不引用树根,也不带证明,在内存池里不会过期。撤单就是花掉那把锁。

收款地址不限类型。官网挂单的“其他地址”把你输入的地址交给比特币节点接口(validate-address)换成输出脚本,节点认的地址都行;公开协议文档给挂单信封算长度时,举的例子就是 P2WPKH(bc1q)381 字节和 P2TR(bc1p)393 字节。信封格式只规定卖家脚本 1 到 80 字节,索引器验收只多一条:标价不低于这类脚本的粉尘限额(P2TR 330;bc1q 这类 v0 脚本 294,P2WSH 也算;其它 546 sats),成交时按脚本把金额加起来,付够就算。到 2026 年 10 月 29 日(高度 973,703),官网状态里 5,233 个挂单:bc1p 4,622 个,3 开头的 P2SH 311 个,bc1q 300 个,没有 P2WSH 和 1 开头的旧地址,三类都有成交记录。手输的地址和“连接的钱包”一样,会把挂单和那个地址绑在一起,同一个地址用在多个挂单上,官网会提醒别人能把它们归为同一个卖家;“隐私地址”是种子和这次挂单的作废码派生出的新 P2TR 地址,只有金库算得出。

06 证明|证明持有,各要交出什么

官网投票(存档的客户端)用的是花费电路,不是持有证明电路:按这一轮的快照高度挑出合格票据,快照时持有、之后花掉的也算;证明的 hbody 绑定 “ordz-vote-v1、合集、主题、轮次、选项”;选项和证明的公开输入提交给投票服务,公开输入里有这张票据的作废码。11 月 3 日的官网脚本照旧这样做,只多了一个标签:tag = Poseidon(作废码, SHA-256("ordz-vote-tag-v1" ‖ 主题 ‖ 轮次)),每张票据每轮一个,服务按它去重,还在“公开标签记录”里列出每票的标签、选项和时间。投票页写着服务“只看到每个 Naka 每轮一个一次性标签,看不到是哪件、哪个金库”:投票时确实如此,作废码在票据花掉以前和链上任何东西都对不上。公开标签让计票人人可核,对应的取舍是:票据日后花掉,作废码写进链上的信封,拿它算出标签,就知道这张票据投了什么;挂单的作废码和编号写在一起,连是哪件也对得上。11 月 3 日拿官网账本(高度 974,323)核过:第 1 轮公开记录 1,463 票,888 票能用账本里已公开的作废码算出,其中 38 票的作废码来自挂单,编号公开;第 2 轮 774 票里能算出 82 票,8 票带编号(只数条数,不记是哪件,脚本 tools/vote_tag_check.mjs)。核资格、去重、计票的代码在投票服务的服务器上,公开记录可以这样核:第 2 轮公开标签记录里 774 票,按选项数出来和主题公布的总数一致,标签没有重复;能对上作废码的 82 票,票据都在快照块 973,899 之后才花掉,符合资格;其余 692 票的作废码还没上链,证明也不公开,这部分按设计核不到(脚本 tools/vote_round_check.mjs,11 月 3 日的存档)。

投票页叫 Naka Council(Naka 议会),现在投的是下一个上线的合集,分组淘汰,各组胜者进决赛。快照块上持有的每件 NAKA 一票,不管现在在谁手里;快照之后买的,下一轮再投。NAKA 票也能投反对,候选里还有“暂时都不要”。

11 月 2 日起也能用 Snickets 投票(附录 I07),能投反对,没有 NAKA 也能投。这种不用证明:金库用 Snickets 钥匙签一份请求,写着主题、轮次、选项、赞成或反对、票数和票价,交给平台,票价由平台报,投票页写的是“一票 = 一件基础 NAKA 一周挖出的量”,随时在变;投出去的 Snickets 就花掉了,不退。Snickets 投票也有公开记录,列出票数、方向和票价,不写钥匙;Snickets 按钥匙记在平台账上,同一个金库的销毁、名额和投票记在同一个账户下。

领奖励(存档客户端的 buildReward)也用花费电路,输入是这一周的资格树根和原票据,生成的奖励信封(类型 REWARD)写进比特币交易:带原票据的作废码、新承诺、证明,以及钱袋的密文。它花掉原票据,给自己换出一张新的 NAKA 票据,再加一张奖励票据;索引器把这张新票据补进当周的资格树,第 07 章说的当周照算就是这么来的。批量领取(REWARD2)一次最多 200 份,换出的新票据没有自己的密文,由上一张推出。加成(BONUS、BONUS2)明文写编号,用签名不用证明。同一个作废码领过就不能再领;卖出以后还能补领卖出前完整持有的周。

公开代码里的 Holder 电路:公开输入是树根 root、活动标识 context 和去重标记 ctxNf = Poseidon(s, context, 13);电路只查叶子在树上、算出 ctxNf,不查作废码。记录树只增不删,所以卖掉的票据仍能证明,和附录 E 说的一样。协议文档用“只认最近 6 块的树根”限制证明的时效;它限的是树根的新旧,旧叶子仍在新树根里,所以不代替“票据没花掉”的检查。去重只在同一个 context 里有效,换个用途或申领人,同一张票据又能证明一次。v1 版公开作废码,票据日后挂单时能被认出来,v2 改成不公开,隐私更好;这个“v2”是电路的第二版,和父铭文规则的 v2 无关。

每种用途各要交出什么,对照如下:

用途用什么证明交到哪里上链旧票据公开什么
官网投票花费电路投票服务否不动选项、公开输入(含作废码);公开记录有每票的标签
领基础奖励花费电路,用资格树根比特币交易是花掉,换出新票据作废码、新承诺、证明、钱袋的密文
领加成签名比特币交易是绑在上一次领取上编号、持有关系
持有证明(公开代码)Holder 电路链下验证方否不动树根、活动标识、去重标记
私密转账(对照)花费电路比特币交易是花掉作废码、新承诺、密文、证明

07 挖矿|拿着 NAKA 就在挖 SHNAKAS,转手为什么断

第 w 周是第 S_w + 1 到 S_w + 1,008 块,起点 S_1 = 971,700,每周 1,008 块。一张票据在某一周算数,要满足两条:创建它的区块不晚于周起点,花掉它的区块晚于周终点,还没花也算。

转手和自己转给自己,是花掉旧票据、生成新票据;挂单花掉旧票据,撤单(取回)才生成新票据。哪一种都一样:旧的没撑到周末,新的不是从周初开始,这一周两边都不算。正常领奖励换出的新票据例外:索引器把它补进当周的资格树(官网状态里每周的 carry),所以当周照算。加成信封只签名、发钱袋,不花票据,也不生成票据。

权重的规则写在链上的 SHNAKAS 规则铭文里:基准 100%,属性地板价达到合集地板价的 1.25、1.5、2、3 倍分别加 25%、50%、75%、100%;编号 0–9、10–99、100–999 分别加 200%、100%、50%,取最高一档;封顶 400%。算地板价只认 546 sats 以上、五种收款脚本的挂单。没人挂单的属性,作品不少于 20 件的直接加 100%,不足 20 件的改看成交记录(10 月 27 日的快照里分别有 62 个和 106 个属性这样算)。输入全是账本里的挂单和成交,任何索引器按区块都能算出同样的权重;官网把算好的权重表发给客户端,只是省得各自重算。项目方 10 月 27 日说其他合集改成即时挂单、NAKA 保持原样,NAKA 的挂单还在链上,这套算法照旧谁都能算(11 月 3 日官网配置里 NAKA 的链下挂单仍是关着的)。官网市场和质押页写的“Shielded #”是全局编号,NAKA 从 0 排起,和作品编号一样,所以“Shielded 编号小于 1K、100、10”的加成就是这里的编号加成。

每周 266,640 枚,按权重分给目录里全部 3,333 个编号(已铭刻 3,327 件)。挂单期间和没铸的编号,那几周的份额没人领得到,挂单前已经拿满的整周照样能领。领基础份额不用亮编号,证明你在资格树上有一张整周持有的票据就行。领加成要公开编号和持有关系。官网金库里这一页叫 Staking(中文界面“质押”):不用锁定、不用签名,收到或买到的作品从下一周算起;一次领取把到现在为止的周一起结清,矿工费按次付,不按周付,不扣中继额度。亮编号的确认框写得很清楚:编号永久上链,谁都看得到这件领过、领了多少,领到的 SHNAKAS 一直和这件绑在一起,卖掉以后也是;还看得出它从领的第一周起没挂单、没卖、没转出;付矿工费的钱包也在交易上,这件要是当初用你的主钱包铸造或买入、之后没私密转过,这几次领取就能和那个钱包连上;几件挨着亮,也像是同一个人的。

奖励发的是 SHORD 账本里的钱袋,不是直接打到钱包的符文。钱袋怎么生成、没人领的份额为什么不算销毁、总量怎么算,见挖矿原理页。

领到的 SHNAKAS 在金库里是一个个钱袋,钱袋的编号和数量公开,持有人不公开。钱袋能整袋私密发送,也能拆成 2 到 16 个小钱袋,拆分要用自己的比特币付矿工费。协议允许拆的同时把其中几个直接写给别人,但官网金库的“拆分”只拆给自己,想给别人得再发送一次;一步做完的只有烧成 Snickets 和存进 Naka Lounge 两处。项目方说 11 月 6 日开放钱袋市场,挂单、购买,一次最多扫 10 个。还能烧成 Snickets,一枚换一个,两个区块后到账,用来换新合集的 GTD 名额、投票(附录 I06)。烧进去的 SHNAKAS 谁也花不出来,Snickets 由平台记账,链上没有。

按 11 月 3 日的官网文案和 SHNAKAS 配置,钱袋的拆分、私密转出和烧成 Snickets 对所有人开放,挂单和购买先给少数持访问码的测试者,11 月 6 日正式开。钱袋挂单走即时挂单(配置里 listings3 开着):成交前链上什么都没有,改价、撤单都马上生效;金库第一次挂单时,从金库的 BTC 里做一枚 330 sats 的挂单币。买的人按“每枚多少”比价,买到的是整个钱袋,平台费 2%,最低 330 sats。烧 Snickets 只能烧整枚,一次从一个钱袋里烧,矿工费从金库的 BTC 里付,不走中继。GTD 名额是“一个名额、一个码、铸一次”:码的样子是 GTD-XXXX-XXXX-XXXX-XXXX,任何钱包都能用,谁拿到码谁就能用。名额拿了就算数,确认框写着“到时没铸,Snickets 不退”,“我的 GTD 码”下面又写着“阶段结束没用的码会把 Snickets 退回”,两处文案说法不同,以官方届时的说明为准。

Naka Lounge(play.ord-dropz.xyz)是官方限时开的德州扑克,筹码就是 SHNAKAS。游戏自己就是一个金库,和你的金库分开:存进去的 SHNAKAS 转到它的隐私地址,由它保管(页面叫“箱子”),提现也由它发回。你的金库连上去当玩家账户,游戏拿到的是一个由金库算出的玩家账号,加上你金库的隐私地址和 BTC 地址;按金库的说明,提现只回这个隐私地址,游戏动不了金库里的东西。存入是一笔拆分:从一个钱袋拆出要存的数,发到游戏的隐私地址,同一笔从金库的 BTC 里另付一点给游戏的收费地址,其中有以后提现要用的矿工费。这笔拆分在链上认得出来:钱袋编号和数量公开,付给游戏的那份到 11 月 3 日的 21 笔都是 3,330 sats,看得出是 Lounge 存入,看不出是谁。页面上公开“箱里有多少、欠玩家多少”。项目方的说明:每张牌在发牌前锁定,由你的设备核对;看到翻牌的牌局抽 5%,最多 2 个大盲,抽到的 SHNAKAS 攒起来烧掉。玩的时候 SHNAKAS 由游戏保管,提现时发回你的隐私地址。

烧成 Snickets,是把钱袋整袋私密转给一个销毁地址,或拆分时把其中一个发过去:shord1 后面先接 SHA-256("Shielded Ordinals SNICKETS burn v1" ‖ 0 ‖ Snickets 公钥)(首字节清零)当持有人公钥,再接你自己的查看公钥。正常的持有人公钥是 Poseidon(sk),这个数不是从谁的 sk 算出来的,想花它,得找到一个 sk 让 Poseidon(sk) 正好等于这个数,这做不到,所以烧进去的钱袋花不出来。金库再用 Snickets 钥匙签一份请求交给平台,带着这封信的哈希和打开烧掉那份的数据(整袋烧是钱袋编号、额度和 s,拆出一份烧是那一份的 ρ 和 s),两个区块后记上 Snickets,核对和记账在平台服务器上做。Snickets 钥匙由种子算出(SHA-256("shord/snickets" ‖ 种子)),查余额、烧、换 GTD 码、投票都用它签名,同一个金库永远是同一把。

08 核验|账是谁记的,能不能自己核

私密转账的验收顺序(公开代码 indexer.mjs):先查引用的树根在最近 100 块里、早于当前这一块,再查作废码没见过,再验证明;都过了才记下作废码、收下新承诺和密文,有一项不过只记一条拒收,账本不动。每块读完记下这一块的树根和叶子数。

状态摘要 v1 是对一份固定格式的状态概要算 SHA-256:记录树根、叶子数、排好序的作废码、已铸的编号,以及每个挂单的作废码、状态、编号、额度和价格。不含密文、交易号、收款脚本和锁的位置,摘要一致只说明这几部分一致。

检查点:索引器隔一段把整份状态存成文件,写进规则和验证参数的哈希、最近 12 块的区块哈希,最后附一个 SHA-256 校验值。读回来时重建记录树,核对每块的树根和摘要,最近 12 块还在主链上才用。哪一项对不上,就退回更早的一份,或者从起点重放。

重组:最新的几块被换掉时,索引器退回到最近一份还在主链上的检查点,没有就从起点重放。追上最新区块之前,对外仍用旧的状态。

规则版本不同会怎样?公开版遇到不认识的消息类型直接拒收,那些票据进不了它的树。从那一块起,它的树根和官网的不一样,之后的转账和挂单证明只要引用的是分叉之后的树根,它都验不过。所以比摘要之前,先比规则版本。

核中继:10 月 29 日以前,官方中继的地址三处能对上。父铭文规则的 relayerPayoutScript 是 5120be2563233bb4feb149c3a6111f67a2ec5061991921d97406c78ca48614fefe43,换算成地址是 bc1phcjkxgemknltzjwr5cg37eaza3gxrxgey8vhgpk83jjgv987leps3t3cuy;官网状态接口的 relayer.address 也是它;链上这个地址发出的交易都是一个样子:输入是它自己的找零,一个以 SHORD 开头的 OP_RETURN(PUSHDATA2,两三百到四百多字节),挂单时多一个付给新地址的 330 sats 锁,余下找零回自己。到 2026 年 10 月 29 日它有 5,517 笔交易,余额约 0.018 BTC;累计收进的 1.27 BTC 里含它自己的找零,不是净收入。同一天(区块 973,769 到 973,777)它把余额分几笔全部转进 bc1pr5vsx…5hcp73(第一笔 fe200a20…,最后一笔 83409f79…),之后余额为 0、不再发信;状态接口的 relayer.address 改成了这个新钱包,它发出的交易还是原来的样子:自己的币作输入,一个 SHORD 开头的 OP_RETURN,挂单时多一个 330 sats 的锁。规则里的收款脚本写在父铭文里,改不了,仍是旧地址。

J 隐私名字

隐私名字把一个好记的名字(以 .naka 或 .shield 结尾)指向一个隐私地址(shord1…)。转账时填 bob.naka,钱包先按名字查出它指向的地址,再照常给这个地址写票据。协议不要求钱包把查到的地址显示给你,想自己核对,用下表里的查询方法。信封里写的仍是地址算出的东西,链上看不到名字。名字是协议之外的附加信息:索引器验收转账、挂单时完全不看它。下面依据公开代码 3cdbdfdf 的 src/v1/names.mjs、接口文档 docs/API.md 和官网接口。

问题结论
名字是什么,自己刻算不算一枚普通的 ord 铭文,内容类型是 JSON 或纯文本,内容是 {"p":"shord","op":"name","name":"bob.naka","to":"shord1…"},不超过 400 字节。不要父铭文,不要签名,没有费用规则:自己按格式刻的和官网代刻的一样有效。索引器读每一块里每笔交易的铭文,内容合格就收,不看是谁刻的、付没付钱;官网接口和用公开代码跑的接口摘要相同,认的是同一批名字
谁先刻归谁同一个标签(点前面那段)只认链上最早的有效铭文:先比区块高度,再比块内交易顺序,再比交易里的铭文顺序,之后再刻的永远不算。标签在两个结尾之间也唯一:bob.naka 有人刻了,bob.shield 就不能用
格式小写字母、数字和连字符,3 到 20 个字符,首尾不能是连字符,不能有两个连着的连字符;地址必须是 shord1 加 128 位十六进制(持有人公钥和查看公钥)。admin、support、official、orddropz、shord、naka、vault、unisat、xverse 这类会被当成官方或钱包的名字是保留的,谁都不能用,完整名单是 names.mjs 的 RESERVED_LABELS,共 35 个
从哪一块算起主网从第 969,800 块开始,更早的铭文不算名字。每台名字索引都从这一块读起,结果才一致
能不能改指向不能。指向写死在铭文里,代码里没有修改、续期或注销的操作,也不会过期
能不能转移、交易、销毁名字铭文本身是普通铭文,可以像别的铭文一样转走、卖掉,也可以烧掉;但索引器只在它刻下的那一块读一次,之后不再跟踪这枚铭文,代码写明转走、卖掉都不改变它指向的地址,烧掉也一样。所以买到别人的名字铭文,用它收不到东西,名字的用处没有跟着转过来
索引存什么,能直接查吗每台索引器在本机记一张表:名字 → 地址、铭文编号、所在区块,也能反查一个地址有哪些名字。查询接口:/names/bob.naka 查地址,/names/of/shord1… 查名字,/names?after= 翻全表,/names/info 看高度、数量和摘要(公开接口除 /names/info 外要申请密钥)。自己跑 tools/names-indexer.mjs --lookup bob.naka 也能查
换了金库怎么办名字仍指向旧地址。网页金库用同一钱包、同一付款地址重建,地址不变,名字照用;换成新金库,就只能另取一个新名字,旧名字还会把东西送到旧地址
谁来解析,信得过吗钱包向一个名字索引查询。任何人都能用公开代码的 tools/names-indexer.mjs 从区块自己建索引,不用账号、不用项目方服务器;索引公开一个累计摘要,两台在同一高度摘要相同,名字就完全一样。转账前看一眼钱包显示的地址,是对付错误解析最直接的办法
会公开什么名字和隐私地址的对应是公开的,但隐私地址看不出金库里有什么。自己铭刻时,付铭刻费的钱包会和这个名字连在一起;官网代刻是你付费后,下一块由中继用一枚无关的币刻上,公开代码的状态文档记录过一例(dub.naka)
官网现在怎样2026 年 10 月 30 日官网名字接口显示:开放中,费用字段 2,500,结尾 .naka 和 .shield;索引到第 973,831 块共 533 个名字,官网接口和公开接口的摘要一致

K 常见问题

讨论和社区里问得最多的问题,按主题排。每条先给结论,细节在括号里标的章节和附录。

资产和金库

买了 NAKA,图在哪,我手里是什么?

作品铭刻后一直停在 NUMS 地址,谁也花不动;你手里是金库里的一张票据,记着编号和你的持有人公钥,花它要你的花费密钥。普通钱包里看不到它,要在 SHORD 金库里看(第 03 章)。

解锁签名泄露了会怎样?重新签一次有用吗?

这份签名就是整个金库(第 01 章)。同一钱包、同一地址签出的永远是同一个签名,重签没用;用另一个钱包地址开新金库,把票据私密转过去。

Shielded Vault 是什么,怎么装?PIN 忘了怎么办?

ord-dropz.xyz/wallet 打开的就是它:一个凭 PIN 打开的金库。可以新建(一套新的 24 个助记词,里面是空的),也可以用 UniSat 或 Xverse 签名导入网页金库,要用当初铸造或购买的那个钱包、账户和地址类型,换一个就是另一个空金库;导入以后不再需要钱包。它不走应用商店:iPhone 在 Safari 里加到主屏幕,Android 下载安装包,电脑用 Chrome 或 Edge 安装。PIN 找不回,忘了只能删掉,再用 24 个助记词恢复,或者重新从 UniSat、Xverse 导入。从网页金库搬到手机时出的二维码和链接就是金库本身,只能用一次、五分钟内有效,别拍照、别发聊天;别人发来的金库链接别打开,打开的是对方的金库,你买的、存的都归对方(附录 I01)。

换电脑、换手机,资产还在吗?

在。网页金库用同一钱包、同一付款地址再签一次,就是同一个金库;也可以把 24 个助记词抄进 Shielded Vault(手机、浏览器都能开)。票据在链上的信封里,扫一遍就回来;只有预付中继存在原来的浏览器里,换之前先用完(第 01 章、附录 A)。

电脑浏览器里买的预付中继,手机上同一个金库能用吗?

不能。预付中继的秘密由那台浏览器随机生成、官网盲签,存在那台浏览器里,不从种子算出,所以手机上没有;盲签的好处是官网认不出是谁买的。票据里的中继额度不一样,它记在链上的票据里,跟着作品走(附录 A、附录 H)。

网页金库签的那段固定文字是什么?签名当种子,够随机、够安全吗?

文字在官网引擎里,共四句:“Ord Dropz shielded vault key v1”“Signing this unlocks your Shielded Ordinals vault on Ord Dropz.”“ONLY sign this on ord dropz. Anyone with this signature can move your shielded pieces.”“It does not move any bitcoin.”。钱包用 ECDSA 签它,种子 = SHA-256("shord/seed/v1" ‖ 签名),整套钥匙再从种子算出(附录 I01)。签名由钱包私钥和这段文字决定,没有钱包私钥的人算不出、也伪造不了,所以种子和钱包私钥一样难猜,从密码学上说够用。要当心的不是随机性,而是同一钱包、同一地址每次签出的都是同一个签名:签名就是种子的全部来源,给出去就收不回,也换不掉。最后一句 “It does not move any bitcoin” 说的是你连接的钱包,金库自己的 BTC 拿到签名的人照样能取走。

别的网站让我签同样的文字,会怎样?

同一个付款地址、同样用 ECDSA 签这段文字,签出来的就是同一个签名,等于把整个金库交了出去,这就是第 01 章那个仿冒摊位。对网页金库来说,这份签名是钥匙的唯一来源,24 个助记词只是同一份种子换了个写法,所以交出签名就是交出金库。Shielded Vault App 也能新建一个随机种子的金库,但那是另一个全新的金库:地址和钥匙都不同,里面是空的,原来金库里的作品不会过去。签名泄露后要换钥匙,只能新建金库,再把作品逐件私密转过去、把 BTC 提过去;转完之前,它们都还在旧金库里,拿到签名的人随时能动。

能把作品提回普通的 Ordinals 钱包,拿到别的市场卖吗?

不能。铭文铭刻后停在 NUMS 地址,没有人有它的私钥,谁也转不出来(第 03 章)。别的市场和浏览器看得到这枚铭文,但它永远停在那里;归谁只记在 SHORD 账本的票据里,买卖要在认这本账的地方做,现在是 Ord Dropz。创始人说下个版本以后,任何人都能跑索引器、在自己的站点交易 NAKA。

隐私

挂单公开了编号、价格和收款地址,隐私体现在哪?

收款地址不是被别人按金额“对应上”的,它本来就写在挂单里,买家的付款地址也公开。SHORD 藏的是票据之间的联系:两次公开操作之间这件作品换没换过手、换给了谁,外人证明不了(附录 B)。

必须经过私密转账才能断开联系吗?

私密转账只让外人无法证明“现在的卖家就是上次的买家”,编号的公开轨迹还在。真正让买入和卖出接不上的,是两头的地址都和你的身份无关:买入用无关的 BTC 付款,卖出用“隐私地址”收款(附录 B)。

怎样用最私密?

收款选“隐私地址”且不重复用,发信封走中继,买入用无关的 BTC,卖出所得先留在金库再提到无关地址,只领基础奖励。会多公开一些的做法:收款到连接的钱包、自己付矿工费广播、一个收款地址用在多个挂单、领加成(亮编号,领到的钱袋和这件绑在一起)、投票(票据日后花掉时对得上)(附录 B)。

以后改用金库里的 BTC 付网络费,隐私会下降吗?

会。付费的输入会出现在这封信封的交易里;金库的 BTC 多半来自挂单收款,而收款地址写在挂单里,用它付费就把信封和那笔挂单连了起来。想更私密,用预付中继(附录 I04)。

隐私地址里的“公钥”是什么?是哈希吗?和比特币花钱用的公钥一样吗?

隐私地址是 shord1 加 64 字节。前 32 字节是持有人公钥 ownerPk = Poseidon(sk),是花费密钥的单向哈希,不是椭圆曲线上的点,只在证明电路里用;后 32 字节是查看公钥,一把 x25519 公钥,只用来加密。两样都不是比特币交易签名用的公钥。金库里签比特币交易的钥匙(金库的比特币地址、挂单的取回密钥、卖出所得地址)是另外的 secp256k1 钥匙,和花费密钥、查看密钥一样从种子按不同标签哈希出来,知道其中一把推不出别的;你签名用的钱包又是另一把(附录 I01)。

地址里有查看公钥,名字注册时也公开了,别人能拿它查出我持有什么吗?

不能。公开的是查看公钥,不是查看密钥。查看公钥只能用来给你加密,像一把谁都能扣上、只有你能打开的锁。每张密文用一把一次性的临时密钥加密,外人只有你的查看公钥和这把临时公钥,算不出解密要的共享秘密,分不出哪些密文是写给你的。链上的承诺里混着作品秘密 s 和随机数,外人不知道 s,拿你的持有人公钥也试不出哪片叶子是你的。正在转给你的那笔也一样:中继收到的只是信封字节,上链后外人也只看到一个新承诺。网站和接口同样没法按地址查:官网接口和公开索引器给出的是全部票据,不标归属,金库全部下载下来,在本机用查看密钥逐条试解(公开代码 view.mjs 的说明:服务器因此不知道哪张票据属于谁);按地址能反查的只有隐私名字(/names/of/)。例外是把作品私密转给你的人,见下一问。

作品私密转出去以后,转出方还能跟着它吗?什么时候断开?

能跟一段,直到 s 换新。私密转账的新票据沿用旧票据的作品秘密 s,新随机数 ρ′ = Poseidon(nf, 11) 由信封里公开的作废码算出,这两条是电路规定的。s 并不公开,只有自上次换新以来经手过这件作品的人知道,转出方就是其中之一。他算不出你的作废码,也用不着:你每次花它,作废码都会公开写进信封,下一张的随机数就由这个公开的作废码算出。他拿链上每封信的作废码和新承诺,套上 s、编号、额度和猜到的地址算一遍,就能对一对:你领基础奖励(花旧票据、给自己生成新票据),他认得出这件还在你手里、哪周领的;你再私密转给他认得的地址,比如任何公开的隐私名字,他也对得上;转给他猜不到的地址就对不上。s 只在新票据由新主人自己生成时换新:成交时买家生成,链上挂单后取回时卖家重新生成,铸造时铸造者生成;SHNAKAS 钱袋拆分时,拆出的每个钱袋也用新的 s。私密转账、领基础奖励不换;链下挂单没成交就撤掉,链上什么都没发生,也不换。所以发生一次成交、或一次链上挂单再取回,这条线就断了。外人从来不知道 s,不受影响(附录 I01)。

同一个地址收到的票据彼此对不上,我自己怎么认出、又怎么证明是我的?

认出靠查看密钥:金库把链上每封信的密文都用查看密钥试着解一遍,解得开的就是写给你的,里面有编号、额度、ρ 和 s。确认靠重算:用自己的持有人公钥和解出的 ρ、s 算一遍承诺,和链上的叶子对上,就是这张。花的时候,证明说的是“我知道 sk、ρ、s,它们算出的承诺在这棵树上,作废码也由它们算出”,不说是哪片叶子。外人对不上靠的是 s 和随机数,只有你能证明靠的是花费密钥。

官网金库里的“证明”按钮,点完证明交给了谁?

交给 Ord Dropz 自己的验证接口 /holder/verify。按钮先要你连接钱包,提示是 “to name who the proof is for”:钱包的付款地址作为申领人,和合集、用途 holder-demo 一起算进 context。浏览器用持有电路生成证明,连同用途和申领人地址发给官网,官网验过后,弹窗显示 “Verified: you hold a piece of this collection. The verifier did not learn which one.”。不上链,也没有别的动作,现在是演示,说明里写着以后用于 Discord 身份组和白名单(“will use”)。说明里的“不透露你的钱包”,指的是证明不透露你的金库和哪一件;请求里用连接的钱包地址标明这份证明给谁。context 带了申领人,一件作品换个钱包地址就能再证明一次(附录 E)。

交易和挂单

挂单时“其他地址”填 bc1p、bc1q 都行吗?

都行,3 开头的也行。协议只把它当 1 到 80 字节的输出脚本写进挂单,只要求标价不低于这类脚本的粉尘限额;线上 bc1p、bc1q、3 开头的挂单都成交过(第 05 章、附录 I05)。

挂单的 330 sats 锁被直接转走、没带信封,作品会丢吗?

不会。索引器每块都看哪些交易花了挂单锁,同一笔里没有有效购买就判挂单关闭;卖家用取回密钥签一封 CLAIM,换回新票据。能随时花这把锁的只有平台,卖家满 1,008 块后也能花;锁里没有作废码(附录 I05)。

挂单时,所有权交给 330 锁了吗?

没有。挂单信封交出卖家票据的作废码,票据作废;索引器在本机记下挂单(编号、价格、收款脚本、取回公钥、锁的位置)。锁不记所有权,它怎么被花,决定下一张票据归谁(所有权流转)。

购买时,索引器怎么判断付款对不对?

查本机的挂单记录:这笔交易花的正是登记的那把锁,挂单还有效,付给卖家收款脚本的不少于标价,付给平台的不少于平台费。这些在挂单时就记下了,买家改不了(附录 I05)。

私密转账时有人改了收件人,会怎样?

收件人在新承诺里,新承诺和信封正文都在证明的公开输入里,改了证明就不通过,整封拒收;作废码不会记进清单,原票据照样能用(所有权流转)。

别人把我的信封原样复制去发,是在给我加速吗?

不是。加速是让原交易本身更快;复制是把同样的字节放进另一笔他自己出钱的交易。两笔输入不同、互不冲突,都可能上链,索引器按链上先后只认在前的那封,后到的因作废码重复被拒。结果不变,只是原交易的手续费白付。购买和铸造要平台在那笔交易上签名,复制不了(所有权流转)。

两个人同时买同一件,会怎样?

两笔购买都要花同一把挂单锁,比特币只让其中一笔上链;另一笔整笔无效,钱也付不出去(所有权流转)。两笔都得有平台对那一笔的签名:公开的多签模块在前一笔没确认时不签第二笔(“this listing is already being bought or cancelled”),NAKA 平台怎么做没有公开。

一笔购买正在上链,谁能叫停?

买家可以确认前用同一个输入发更高手续费的交易顶掉它;平台可以抢先花掉锁,挂单随之关闭;卖家在锁满 1,008 块前叫停不了,撤单要平台签名,满了以后能自己花锁抢先(所有权流转)。

作废码在内存池里公开,会被人抢先拿去用吗?

不会。证明把作废码、新承诺和信封正文绑在一起,改一个字就失效,重做证明要花费密钥。别人最多把同一封信原样抢先上链,结果还是收件人拿到票据(附录 I04、所有权流转)。

私密转账转错了,能撤回吗?

不能。信封上链、作废码记下,旧票据就作废了,没有撤回这一步。隐私地址没有校验位:钱包只查 shord1 开头、长度对、前半段的数值没超出电路的上限,抄错一个字符多半仍是“合法”地址,作品就转给了一个谁也打不开的地址,再也找不回。地址要复制粘贴,转前核对开头和结尾;转给名字时,名字指向的地址可以先按附录 J 的方法核对。地址对、只是对方暂时不用金库,没关系:票据一直在链上,对方哪天用种子打开金库都扫得回来。

私密转账多久能到?对方怎么知道收到了?

交给官方中继时,它把一段时间里收到的信攒成一批再发,状态接口报着下一批什么时候发(附录 I04);之后等这笔交易进区块、索引器验收,对方金库同步时扫到密文,作品就出现了。自己付矿工费广播,不用等批次。没有通知,要对方打开金库同步才看得到,以对方金库里出现新票据为准(附录 I04)。

私密转账以后,能向对方或第三方证明转过吗?OTC 找担保时,担保方怎么确认卖家已经把 NAKA 或 SHNAKAS 转给了买家?

能,用密码学核对,不必只听买家一句话。最直接的是买家金库同步后出现新票据;担保方要防买家抵赖,就让卖家交出这张新票据的明细:交易号、编号(SHNAKAS 是钱袋编号)、额度和作品秘密 s。担保方用买家给的隐私地址取出持有人公钥,从这笔交易的信封里读出作废码 nf,算 cm = Poseidon(编号, 额度, Poseidon(持有人公钥, Poseidon(nf, 11), s))。它等于信封里的新承诺,而且这个承诺已经在索引器的记录里(官网 /state 查得到它和交易号),就说明这张新票据只有买家的花费密钥能花,卖家拿不回来;一个钱袋有多少 SHNAKAS,按钱袋编号公开可查。用到的只有公开数据和卖家交出的这几个数,不碰买家的任何钥匙。官网把整袋 SHNAKAS 烧成 Snickets 时就是这么做的:把钱袋编号、额度和 s 交给平台核对(附录 I07)。卖家事后也拿得出这组数:旧票据当初是写给他的,金库随时能重新解开,作废码由他的花费密钥算出。

这组明细怎么拿到:官网界面不显示 s,官网页面用到的接口里也没有替用户签名或导出证明的。能走通的办法要用到金库的种子:官网引擎(金库网页自己下载的那份脚本,谁都能下载)提供了由种子算出整套钥匙、把公开账本里写给自己的票据逐张解开的函数。卖家在自己的电脑上用金库的 24 个助记词得到钥匙,载入官网公开的账本(NAKA 是 /state,SHNAKAS 是 /rewards/rune/state),扫出自己的票据,已经花掉的也在里面;找到作废码等于那笔转账信封里作废码的那张旧票据,它的编号、额度和 s 就是要交的明细,额度按这笔转账用掉、新买的中继额度改一下。担保方用公开仓库里的 Poseidon 自己算一遍新承诺核对,用不着卖家的任何钥匙。

这一步要用到 24 个助记词,要格外小心:助记词就是整个金库,泄露一次,藏品和金库里的 BTC 都能被拿走,也换不掉,只能新建金库再一件件转过去。真要做:只在自己能控制的电脑上做,最好断网;助记词不输进任何网页、表格、聊天窗口或别人给的工具;不让担保方或任何人代劳,交出去的只有这组明细。网页金库的解锁签名同理:任何网页都能请求钱包签那段解锁文字,签了就等于交出金库,所以不要在官网以外的页面签。没有十足把握,就用下面说的担保方中转,或者只凭买家金库里出现了新票据。

要知道三点。一,这组明细核不到密文写没写对:电路不查密文,买家金库靠解开密文才认得出这张票据。官网客户端照规矩加密,不会写错;真碰上故意写坏的,买家拿着这组明细,数据上也够花这张票据,但官网金库只认能解开密文的票据,存档的页面里没有手动导入的入口,要另写工具。二,SHNAKAS 用“拆分时直接发给对方”转的,卖家的引擎不留那个钱袋的 ρ 和 s,事后拿不出明细;找担保时,先拆给自己凑出约定的数,再把那个钱袋整袋私密转给买家。三,交出 s 以后,担保方和卖家一样能跟着这件作品,直到 s 换新(上一问)。另一种做法是让担保方中转:卖家先转到担保方的隐私地址,担保方自己的金库看到了,收款后再转给买家;多一次转账,担保方同样知道 s。现在没有不交出 s 的零知识证明,要做得另写电路。官网的“证明”按钮证明的是持有这个合集的某一件,不说哪件,也不查是否已花,帮不上这件事。放款前等交易多确认几块,防重组(附录 I04)。

BTC 付款确认了,就算买到了吗?

以索引器验收为准:验收通过、金库里出现新票据,才算成交(第 05 章)。

卖出后的 BTC 在哪?

在挂单时选的收款地址:选“隐私地址”的在金库的比特币页,选连接的钱包或手输地址的直接到那个地址(第 05 章)。

中继

bc1phcjk…3t3cuy 是项目方的中继地址吗?为什么有那么多信封交易?

是官方中继写在规则里的收款地址:额度费和铭刻费付进来,中继用这些钱替用户付矿工费、建挂单锁,所以链上全是它发出的信封。10 月 29 日起代发换了新钱包,状态接口列的也是新钱包(第 08 章、附录 I08)。

中继额度和预付中继有什么不同?

中继额度记在票据里,跟着作品走,每个 2,500 sats,在作品上按件买。预付中继是官网“中继”页另卖的凭证,存在这台浏览器里,任何作品的私密转账、挂单、撤单都能用,一次要几个看当时的网络费。购买由买家自己付 BTC,官网没把它列进这两样的可用范围(附录 A)。

中继额度跟着作品走还是跟着金库?

跟着作品走,卖出时没用完的额度归买家(附录 A)。

付网络费有哪几种选法?

官网列了四种:用这件作品的中继额度、用连接的钱包付、用金库里的 BTC 付、用预付中继。走额度和预付中继的,链上没有你的付费地址(附录 A)。

官方取消中继了吗?

没有。创始人 10 月 19 日长帖的 “CREDITS GONE” 一节说的是不再卖中继额度、已有的照用,默认改由金库 BTC 付网络费,预付中继保留给想多一层隐私的人。到 11 月 3 日,NAKA 的额度还开着,市场上每件挂单都标着带几个(附录 I04)。

挖矿和权重

要挖 SHNAKAS,需要做什么?

什么都不用做。NAKA 在金库里、没挂单,就按区块计着,每满一周可以领,在金库的 Staking(中文界面“质押”)页看和领。挂单、撤单、转手会断那一周;新收到或买到的从下一周算起(第 07 章)。

领加成会公开什么?

编号永久上链:谁都看得到这件领过、领了多少、从领的第一周起没挂单没转手,领到的钱袋一直和这件绑在一起,卖掉钱袋也一样。付矿工费的钱包也在交易上;这件要是用主钱包铸造或买入、之后没私密转过,就能和那个钱包连上。只领基础那份不会这样(附录 I07)。

Naka Lounge 是什么,存进去的 SHNAKAS 怎么保管?

官方限时开的德州扑克,筹码是真的 SHNAKAS。游戏自己就是一个金库:存入是从钱袋拆出一份转到它的地址,玩的时候由游戏保管,和你的金库分开;提现由它发回你的金库地址。页面公开箱里的余额和欠款,抽水攒起来烧掉;游戏动不了你金库里的东西(附录 I07)。

第三方能接入 Naka Lounge 或金库,做要动资产的游戏和应用吗?

接不进官方金库。金库里的“连接”和一键存入只认官方的 play.ord-dropz.xyz 和 lounge-api.ord-dropz.xyz,写死在金库代码里,别的网站发来请求,金库只回“不是 Naka Lounge,什么也没给”;“证明”按钮也只为官网自己的用途出证明。要做,就得自己写收发资产的软件,分两种。一种是钱包:用户在你的软件里新建一个金库,钥匙留在用户自己的设备上,再把作品或钱袋从官方金库私密转过来;资产还是用户自己管,不经过谁的手,前提是这个钱包本身可信。另一种像 Lounge,要把多人的资产放在一起(对局、奖池):一张票据只有一把主人钥匙,协议里没有多人共管的票据,所以只能由应用方开一个自己的金库,玩家把资产转进去、用完再转回。应用方的钥匙一直在它自己手里,玩家的资产却交给了它保管,所以要让人信得过,最好也公开“箱里有多少、欠多少”;也没有一键存入,地址要玩家自己填。两种能做到哪一步,见本节“开发者想自己做钱包或市场”和“官网钱包的引擎和证明密钥”两问:公开仓库不含组交易的代码和钱包,证明密钥只在官网下载,SHNAKAS 的拆分和领取消息还没公开,只能照官网引擎做。只看数据、往别人的隐私地址发奖励,不用碰别人的资产。让你在别的网站签金库那段固定文字或导入助记词,不是授权,是把整个金库交出去(附录 I07)。

奖励权重靠项目方算吗?

不靠。规则写在链上的 SHNAKAS 规则铭文里,输入是账本里的挂单和成交,任何索引器按区块都能算出同样的权重;官网发给客户端的权重表只是省事(附录 I07)。

NAKA 也会改成链下挂单吗?

项目方 10 月 27 日说不会:其他合集改成即时挂单,NAKA 保持原样。挂单还在链上,权重照样谁都能按区块算(附录 I07)。

每一枚的权重和产量去哪看?

规则见第 07 章和附录 I07,链上公开,谁都能算;现成的数可以用 Naka Sigil 插件看,仅供参考。

隐私名字

隐私名字是怎么工作的?

它是一枚普通铭文,内容写着“bob.naka 指向 shord1…”。同一个名字只认链上最早刻的那枚;钱包按名字查到地址,再照常转账,链上看不到名字(附录 J)。

自己按格式铭刻的名字,索引认吗?

认。没有费用规则,也不看是谁刻的;内容合格、标签没被占,就和官网代刻的一样有效(附录 J)。

名字铭文转走或烧掉了,名字还有效吗?

有效,指向也不变。索引器只在名字刻下的那一块读一次,之后不跟踪这枚铭文(附录 J)。

隐私地址是什么,什么时候用?

shord1… 后面是持有人公钥 Poseidon(sk) 加查看公钥。只有别人私密转给你时用到;你自己铸造、购买、取回,金库用自己的钥匙,不需要地址(附录 I01)。

同一个隐私地址能收别的合集吗?

能。地址只由种子算出,不带合集编号;每封信的开头写着合集编号,所以同一个地址能收 NAKA,也能收 SHNAKAS 钱袋和以后别的 shielded 合集,名字也照样指向它(附录 I01)。

同一个地址收了好几件,链上看得出来吗?

看不出来。每张新票据的承诺都混了新的随机数,彼此毫无关系;密文每次换一次性公钥,也对不上收件人。地址公开不等于持仓公开(附录 I01)。

名字能转让或买卖吗?

名字铭文能转、能卖,但它指向的地址写死了,转走、卖掉都不变,也没有修改的办法。买到别人的名字,用它收不到东西(附录 J)。

换了金库,名字会怎样?

还指向旧地址。同一钱包、同一付款地址重建的网页金库地址不变,名字照用;换成新金库只能另取一个(附录 J)。

取名字会公开什么?

名字和隐私地址的对应公开,但看不出金库里有什么。自己铭刻会把付费钱包和名字连在一起;官网代刻用的是中继的一枚无关的币(附录 J)。

安全边界

可信设置是什么,会影响我的作品吗?

Groth16 的证明密钥要用一批一次性随机数生成,用完即弃,这批随机数就是设置秘密。NAKA 这份由官方单方生成,公开代码把密钥哈希固定为 e7dbcdb0…e788;留着它的人能多造一张同编号的票据,但拿不走你金库里的作品,真票据照常能花。下一个合集计划改用多方仪式(附录 D)。

任何持有人都能伪造吗?

不能。只有手里有那份设置秘密的人才能:当时跑设置的人,或者从那台机器上复制走它的人。其他人只有公开的证明密钥和验证密钥,做证明必须真有一张在树上的票据和它的花费密钥,只能花自己的东西;没有秘密却想让假陈述通过检查,在算力上做不到。

怎么看有没有多出来的票据?

链上能看到的迹象,是同一编号同时出现两条进行中的挂单。10 月 29 日官网状态里的 5,233 个挂单没有这种情况。

项目方说下个版本要拿掉“我们的钥匙”,指的是设置秘密吗?

不是。创始人 10 月 19 日长帖 “TRAINING WHEELS OFF” 一节说的是平台放在交易流程里的签名密钥:上线以来它一直在环节里,万一有人找到漏洞,平台能在持有人受损前叫停;下个版本拿掉它,挂单、改价、撤单在成交前都不上链。它管的是铸造和购买要不要平台签字,和证明密钥是两回事。设置秘密的打算写在官方状态文档里:下一个合集上线前做公开的多方仪式,把新验证密钥的哈希写进那个合集的父铭文。

以后怎么换成仪式生成的密钥?

新合集的父铭文写死新验证密钥的哈希,索引器启动时拿到的钥匙对不上就拒绝运行;铭文改不了,谁跑索引器都只认这一把。NAKA 的验证密钥固定在索引器代码里(src/v1/collections.mjs),要换就从某个区块起统一升级索引器;电路不变的话,已有的票据用新证明密钥照样能花。公开文档目前写的是下一个合集用仪式。

多方仪式在密码学上靠得住吗?

靠得住,这是 Groth16 消除单人秘密的通行做法。每个参与者在自己机器上混进一份随机数,最终的钥匙由所有人的随机数共同决定,所以只要有一个人销毁了自己那份,谁也伪造不了。每一步都留有记录,任何人都能用脚本从第一阶段文件和电路文件一路验到最终钥匙;最后再混入一个事先公布高度、当时还没挖出的比特币区块哈希,最后一个参与者也左右不了结果。要留意三点:参与者最好是不同的人,最稳的是自己或信得过的人参与一份,事后在记录里找到自己的贡献哈希;电路本身的约束要靠审计,仪式管不到;仪式保护的是用新密钥的合集。

多方仪式怎么参加?什么时候、做什么?

报名方式和时间等官方公布,公开文档写的是下一个合集上线前做。按脚本,仪式是一棒接一棒的:协调人用电路和第一阶段文件生成起始钥匙(init),连同记录 transcript.json 交给第一位;参与者在自己的机器上运行 node ceremony/ceremony.mjs contribute spend --name "名字",脚本把操作系统的随机数和你随手敲的字混进去,只在内存里用一次,写出下一把钥匙和你的贡献哈希;你把新钥匙和记录交给下一位。花费电路和持有电路各做一轮,最后混入事先公布高度的比特币区块哈希。想自己保证公平,能做三件事:参加时记下自己的贡献哈希;结束后下载全部记录、自己编译电路、运行 verify,确认整条链有效、你的哈希在里面;再核对新合集父铭文里的 spendVkeyHash 等于最终验证密钥的哈希。只要你那份随机数确实丢了,就没人能伪造。

购买时,签名前看什么?

官网组装付款交易,你在钱包里签名。钱包会列出每个输出:给卖家的地址和金额应和挂单一致,平台费另列一项,对上了再签。链下挂单由卖家事先签好报价,签名绑住挂单用的那枚币和付给卖家的那一笔(附录 I05)。

去中心化和核验

能自己扫回票据、重放整本账吗?

票据都在链上的信封里,扫回不靠谁保管;重放整本账的进度见第 08 章和附录 H,奖励权重按链上规则算,不依赖官网的表。

首页索引器屏幕上的 9F3A 是什么?

状态摘要开头几位的示意。两台索引器在同一块上的摘要相同,摘要盖住的那几部分才对得上(第 08 章)。

开发者想自己做钱包或市场,现在能做到哪一步?

公开仓库是 MIT 许可,里面有索引器、中继、多签、仪式脚本、电路和验证密钥:可以自己跑索引器核账(和官方比摘要),不要密钥、不限次数,也可以自己当中继代发。现成的接口有两套。官网自己的接口(shielded-api.ord-dropz.xyz/api/shielded,金库就用它)现在不要密钥,挂单、整份状态都取得到,限额没有公开。Ord Dropz 另开的托管接口要密钥,见下一问。官网钱包的引擎和证明密钥能下载,但不在公开仓库里,也没写许可,见再下一问。NAKA 的铸造和购买由平台对那笔交易签名,所以成交现在在官网做;公开代码只认六类消息,线上后加的奖励、链下挂单和拆分还没公开(附录 H)。创始人说下个版本拿掉平台钥匙后,任何人都能跑索引器、在自己的站点交易 NAKA,之后再全部开源。

托管接口的密钥怎么申请,有了它多什么?

在 Ord Dropz 的 Discord 里先用 /verify 验证钱包,再用 /apikey 领,密钥只显示一次。托管接口(shielded-public-api-production.up.railway.app,跑的就是公开仓库的索引器)不带密钥只答 /status、/collections、/names/info 和 /health,每个网络地址每分钟 30 单位。有了密钥,每分钟 60 单位、每天 5,000 单位,多出这些接口:/listings 在售挂单,/state 整份公开状态(自己扫票据要用它,整份算 20 单位),/collection 规则原文,/pieces 作品和子铭文的对应、属性和图片校验,/registry 链上找到的所有 shielded 合集,/c/<合集>/… 别的合集,/names 名字全表,/names/<名字> 查名字指向的地址,/names/of/<地址> 反查名字。用处是不自己跑索引器也能做行情页、挂单提醒、钱包扫描,转给名字前先查它指向哪里(官网接口的 /names/<名字> 只回答名字有没有被占)。它不多给任何权限:全是链上公开的数据,动不了任何作品,自己跑索引器能拿到同样的东西。密钥按验证过的钱包发放,只放在自己的服务器上,别写进网页或发给别人的程序。

官网钱包的引擎和证明密钥在哪下载,有什么用?

在官网接口的 /engine/ 下面,浏览器打开或用 curl 都能直接下载:shielded-browser.js(引擎,567,545 字节)、spend.wasm 和 spend.zkey(花费电路的程序和证明密钥,约 2.5 MB 和 6.3 MB)、holder.wasm 和 holder.zkey(持有电路,约 2.4 MB 和 5.6 MB)。打开金库时网页自己也是下载这几份。用处有三样。一是读:钥匙怎么从签名算出来、签的文字是什么、发给官网哪些东西,都写在引擎里,本指南附录 I01 和附录 K 里不少说法就是读它核出来的。二是核:用 snarkjs 从 spend.zkey 导出验证密钥再算哈希,得到的正是公开代码给 NAKA 固定的 e7dbcdb0…e788;holder.zkey 导出的也和公开仓库的验证密钥一致;证明密钥里还记着第二阶段只有一次贡献(附录 D)。三是留:公开仓库只有验证密钥,没有证明密钥,没有 spend.zkey 和 spend.wasm 就做不了证明。想离线自己做证明,可以存一份(附录 H)。引擎没写许可,复用前先问官方;读它不用交出任何钥匙,别把种子交给来路不明的副本。

名词

信封里有什么?

一条 SHORD 消息的全部字节,写在比特币交易的 OP_RETURN 里:15 字节信头(SHORD、版本、类型、合集编号),按类型排的正文,带证明的类型最后接 256 字节证明。一封私密转账 462 字节(附录 A)。

承诺包含什么?谁算的?存在哪?

cm = Poseidon(编号, 额度, inner),inner = Poseidon(持有人公钥, ρ, s)。私密转账由转出方的金库算好并附证明;铸造、购买、取回由收的人交 inner,索引器补算。它随信封写进区块,再成为每台索引器记录树上的一片叶子(第 03 章、附录 I03)。

inner 是什么?

内层指纹:票据里除编号和额度以外的部分(持有人公钥、ρ、s)算出的指纹(附录 A)。

图版 04 那块 NF 牌上的字符是什么?

作废码的开头几位,红的那条是刚记进去的;同一个作废码再出现就拒收(第 04 章)。