公开挂单
以单一价格挂出整份代币,任何买家都可购买。一张原生凭证确保恰好只有一位买家付款。
如何让任何人都能购买一份代币,同时保证只有其中一人付款?
开发中
公开挂单(open listings)构建在一条开发线上,尚未在主网上启用。当前的协议向指定买家出售。
公开挂单把指定买家换成了任何人。卖家以一个总价挂出整份代币;第一笔有效购买即可拿下。要解决的是抢购竞争:绝不能让两位买家为同一份代币都付款。
抢购竞争,一步一步看
- 01 / 05
卖家挂出整份代币
一条签名的 LIST 以 120 QTC 的总价预留 50,000 GLYF。不托管任何资产,挂单也不收 Qlyphs 费用。挂单指向一张凭证:一个尚不存在的原生账户地址。
- 02 / 05
两位买家点击「购买」
每位买家的钱包都为同一个三步原子批处理签名:创建凭证、向卖家支付 120 QTC、支付 1% 的费用。两笔交易都到达链上。
- 03 / 05
第一位买家创建了凭证
买家 A 的批处理先上链。凭证创建成功,两笔付款都完成,QLYP 把预留的 50,000 GLYF 记入买家 A。
- 04 / 05
第二位买家在付款前失败
凭证只能创建一次。买家 B 的第一步失败,于是原子批处理停止,两笔付款都不会执行。买家 B 只损失网络费。
- 05 / 05
直说其中的取舍
任何人都能创建凭证,所以任何人都能不买而结束一个挂单,代价是一笔交易。这份代币随后回到卖家手中。没有人会付两次款,但挂单可能遭到恶意干扰。买家整份购买;不支持部分成交,也没有到期机制。
凭证
凭证是一个原生 Quantus 多签地址,在挂单时就已确定,由卖家、挂单所在区块的哈希以及挂单在该区块中的位置共同决定:
ticket = create_multisig(sort([seller, listing_block_hash]), 2, listing_index)
buy = batch_all([ create(ticket), pay(payout, price), pay(fee account, 1%) ])Quantus 只允许这个地址创建恰好一次。这一个原生属性就是锁:第二次创建会失败,而且由于购买是一个原子批处理,落败买家的付款绝不会执行。谁为成功的那笔规范购买签名,谁就得到这份代币。
为什么要从挂单所在区块派生凭证?
凭证不能在挂单之前就存在。 否则有人可以提前创建它,让挂单一出现就失效。
区块出现之前,没有人知道它的哈希。 用挂单所在区块的哈希及挂单在该区块中的位置来派生凭证,使它专属于这一挂单,也不可能提前创建。
事后任何人都能算出它。 买家、钱包和索引器都从公开数据派生出同一个地址,所以每位买家争抢的都是同一张凭证。
条款
- 整份出售,单一价格。 没有部分成交;买家拿走挂出的全部代币。
- 没有托管,没有挂单费。 代币单位在 QLYP 账本中预留;QTC 直接从买家转到卖家的收款账户。买家支付 1% 成交费。
- 没有到期。 挂单一直有效,直到被买走或被卖家取消。
- 安全性优先于活性。 凭证的任何一次使用都会结束挂单。如果有人只创建凭证而不购买,这份代币就直接回到卖家手中:没有人会白白付款,但任何愿意为一笔交易付费的人都可以打断一个挂单。
仅靠 API 检查无法阻止两位买家为同一份代币付款。原生的一次性凭证可以做到,前提是购买由符合规范的钱包基于已最终确认的状态构建。