跳到主要内容

命令格式

每一个 PiNS 操作都是一笔发往注册方协议地址的屏蔽 PIVX 交易,其中金额即付款,备注即已签名的命令。 两者同处一张票据之中,因此意图与付款被原子性地绑定在一起——不存在需要另行对账的单据或发票。

本页给出确切的传输格式。按此构造的命令,注册方与零知识电路都会接受。

结构

所有命令都是以冒号分隔的 ASCII,以协议标记和版本开头:

PiNS:1:{OP}:{name}:…:{ed25519_pubkey_hex}:…:{nonce}:{signature_hex}

中间的字段取决于具体操作:

操作备注结构应付金额
REG 注册PiNS:1:REG:{name}:{address}:{pubkey}:{nonce}:{sig}按名称长度计的注册费
UPD 更改地址PiNS:1:UPD:{name}:{address}:{pubkey}:{nonce}:{sig}变更费
CHG 转让持有者PiNS:1:CHG:{name}:{new_pubkey}:{nonce}:{sig}变更费
LST 挂牌出售PiNS:1:LST:{name}:{pubkey}:{price}:{nonce}:{sig}变更费
ULT 下架PiNS:1:ULT:{name}:{pubkey}:{nonce}:{sig}变更费
BUY 购买PiNS:1:BUY:{name}:{address}:{pubkey}:{nonce}:{sig}恰好为挂牌价格

对于 CHG{new_pubkey}接收方持有者的密钥,而签名由转出方持有者做出——授权转让的是当前 持有者。

被签名的消息

签名覆盖不含末尾 :{signature} 的命令——也就是从标记一直到 nonce(含)为止的全部内容:

PiNS:1:REG:richard.pivx:ps1f84lvgj…:0101…0101:1780000001

规则很严格,客户端只要违反其中任何一条,产生的签名都会被电路拒绝:

  • pubkey小写十六进制,64 个字符。
  • price 出现在 LST 中。
  • address 出现在 REGUPDBUY 中。
  • pricenonce 为十进制,无前导零、无符号、无补位。
  • 签名是对上述确切字节做出的 Ed25519 签名,十六进制编码,128 个字符。

验证是严格的:非规范签名与小阶密钥都会被拒绝。

字段规则

名称

规则取值
字符a-z0-9、连字符
长度含区域在内共 1–64 个字符
大小写仅小写 — 名称以小写存储并哈希
连字符不在开头、不在结尾,且绝不连续
区域.pivx.private.secure.safe

只允许出现恰好一个点,用于分隔标签与区域。

目标地址

名称所解析到的地址必须是主网上的 PIVX Sapling 屏蔽支付地址——bech32 编码,人类可读前缀 ps,恰好 78 个字符。透明地址以及其他任何形式都会被拒绝。

这个长度并非随意规定。Sapling 支付地址是 43 字节的载荷——11 字节的多样化因子加上 32 字节的 pk_d——bech32 将其编码为 69 个数据字符再加 6 个校验字符,因此 ps + 分隔符 + 69 + 6 = 78。

要求使用屏蔽地址的理由是实际需要而非随意规定:注册方通过 Sapling 密钥材料收款与付款,因此 一个它无法付款的地址,既不能用于退款,也不能用于销售所得。

提示

只接受现代的 bech32 形式

旧的测试网形式 ptestsapling…(88 个字符)在两个网络上都会被拒绝,而且电路强制的规则与注册方 完全一致。任何当前版本的 PIVX 钱包在主网上都会生成 ps… 形式。

Nonce

nonce 是你签名那一刻的 Unix 时间戳(秒)

  • 它必须严格大于该名称当前记录的 nonce。正是这一点阻止了旧的已签名命令被重放。
  • 它领先于承载它的区块不得超过 300 秒;这个余量足以吸收通常的时钟偏差,却不允许把 nonce 停放在遥远 的未来。

首次注册时,任何当前时间戳都可以。

价格

只有 LST 携带价格。它是一个整数 satoshi(1 PIVX = 100,000,000 satoshi),且必须大于零。

允许以新价格重新挂出已挂牌的名称——再发送一条 LST 即可。以最近的一条为准。

大小限制

PIVX 备注恰好占 512 字节,整条命令必须放得下。固定部分占用的空间是可预测的:

PiNS:1:{OP}: … marker, version, operation 11 bytes
{pubkey} 64 hex characters 65 bytes with separator
{nonce} 10 digits today 11 bytes with separator
{signature} 128 hex characters 128 bytes
{address} 78 characters 79 bytes with separator

Sapling 地址固定为 78 个字符,因此与长度可变的地址格式不同,这个预算很容易推算:留给名称的 大约还有 218 字节,远多于名称最多可用的 64 个字符。实际上命令总能放得下。即便如此,客户端仍 应当计算这个预算而不是想当然,这样将来新增的字段才不会悄无声息地把备注撑爆。

付款

金额与备注同样决定着有效性:

  • REG 必须恰好支付与名称长度对应的注册费
  • UPDCHGLSTULT 必须恰好支付变更费
  • BUY 必须恰好支付挂牌价格。

长度按标签计算,不含区域:ab.pivx 是一个 2 字符的名称。

支付不足或超额的命令不会被处理。若操作与公钥可读,金额会记入你的内部余额并可提现——参见问答

顺序

命令按 PIVX 产生它们的顺序处理:先按区块高度,再按区块内的交易索引,最后按输入索引。注册方并不选择 顺序,也无法在不导致每个独立索引器算出不同根的前提下重新排序。

对于相互竞争的操作——同一名称的两条 REG,或同一挂牌的两条 BUY——按该顺序排在最前的那条获胜,其余 的金额退回内部余额。

完整示例

注册 richard.pivx

1. Generate an Ed25519 keypair. The public key is your identity across all your names.

2. Build the message to sign (note: no trailing signature field):

PiNS:1:REG:richard.pivx:ps1f84lvgj0awz…:3757ee1a…a53:1780000001

3. Sign it with the private key; hex-encode the 64-byte signature.

4. Append it to form the memo:

PiNS:1:REG:richard.pivx:ps1f84lvgj0awz…:3757ee1a…a53:1780000001:cfec7a58…04

5. Send a shielded transaction to the registrar address, with that memo, paying the
registration fee for a 7-character name.

几分钟之内,命令便会被打包、证明并锚定。此后 richard.pivx 就能通过任何索引器解析,并附带一份你可以 自行验证的默克尔证明。