项目简介
CountdownCell 是一个轻量、有趣、可扩展的链上小游戏:每个 Cell 都有到期区块 endBlock,向该 Cell 追加 CKB 会按比例延长到期时间,并记录“最后付款人”。直到无人追加,最后一位付款人获得全部奖励。
玩法规则
-
创建:新建 Cell 后自动计算结束区块:endBlock = capacity × rateBlocksPerCkb;初始 lastPayerLockHash 为创建者。
-
追加:任意用户追加 CKB(需 ≥ minAddShannons),系统按比例延长到期时间,并更新 lastPayerLockHash 为付款人。
-
关闭:如果无人追加,到期后最后一个追加者可领取这个Cell;
具体实现:
lock_script
- 使用
always_success 锁脚本(任何人均可解锁/消费)。
type_script
-
作用:约束倒计时 Cell 的状态过渡(创建、追加、关闭),保证时间与容量的规则不被破坏。
-
关键状态字段(示例):
-
endBlock:到期区块高度
-
rateBlocksPerCkb:每 CKB 增加的区块数
-
minAddShannons:最小追加金额
-
lastPayerLockHash:最近一次付款人的锁哈希(32 字节)
-
校验逻辑要点:
-
创建:根据初始容量计算 endBlock = capacity × rateBlocksPerCkb,初始化 lastPayerLockHash 为创建者锁哈希。
-
追加:要求输出容量大于输入容量;endBlock_out = endBlock_in + (added_capacity_in_ckb × rateBlocksPerCkb);追加金额需 ≥ minAddShannons;更新 lastPayerLockHash = payer_lock_hash。
-
关闭领取:要求当前区块高度 ≥ endBlock,关闭后输出不再携带该 type_script。仅最后付款人可关闭。
-
边界与安全:
-
防止 endBlock 回退(只允许增长或到期关闭),防止状态字段被任意写入
交易流程示意
-
创建:Inputs: 用户普通 Cell → Outputs: 倒计时 Cell(lock=always_success, type=countdown, data=初始状态)
-
追加:Inputs: 倒计时 Cell + 付款人 Cell → Outputs: 新的倒计时 Cell(更新容量/endBlock/lastPayerLockHash)
-
关闭:Inputs: 倒计时 Cell(已到期) → Outputs: 普通 Cell(返还容量,去除 type_script)
待完善
免责声明
特别致谢
- OffCKB:本地 CKB 开发网络与部署工具,便于快速启动 Devnet、部署与调试合约。
仓库:https://github.com/ckb-devrel/offckb
- CCC:一站式 JS/TS 生态工具集与钱包连接组件,简化交易组合与签名、前端接入。
仓库:https://github.com/ckb-devrel/ccc/
10 Likes
有意思
用 cell 重现 fomo3d!直觉上是不是可以把这个合约做成 lock script 而不是 type script,这样可以把 fomo3d 这套机制抽出来,去和任意的 type 资产结合,比如某个用户发了个 udt token,可以使用这套机制去做一些活动。
1 Like
Thinker
4
很高兴看到这种尝试,至少能聚集下社区。感觉最后付款人拿走一定比例的资金,留下一些给下轮游戏做起始金,会不会更让人fomo些呢?有好玩的大可尝试,在区块链没有大规模商用前,在它上面做的一切透明公平不可篡改的事,都是它的最好用例。(这段时间市场这么不好情况下,ORE的模式游戏被国外fomo都超CKB市值了
)
2 Likes
是可以做成lock script的,cell data放到script args里面,不过这样做的话每次延时lock script都会更新。
延伸一下,想到另一种玩法,资产发行平台
初始cell为:
lock script: count down lock
type script: xudt
cell_data: xudt_data
用户:
延时支付ckb,获取xudt
直到没有用户延时,cell关闭,不允许延时,开启兑换模式,将收到的ckb和剩余的xudt按比例供用户进行swap
2 Likes
有意思,有点像是为初始的 udt 提供一种最初的价格发现的机制?这时候感觉 utxo/cell 开始跟以太坊那边的不一样了
下一步准备尝试一下Launch
使用一次性密封固定xudt总量,创建xudt cell
lock:count down lock
type:udt type
data: udt总量
每次延时根据count down lock的规则来分发xudt,直到无人延时就关闭,用收到的ckb和剩余的xudt作为池子,用户可以直接swap
绝对公平,而且不可能 Rug Pull。
大家有什么意思的方向也可以讨论一下
3 Likes
这里我没完全看懂,具体分发 udt 的时候,是首先生成一个 cell 分配固定的 udt 金额,然后用 countdown lock 去给这个 cell 分发,结束时最后一个用户可以得到这部分配额的 udt,而之前投入的 CKB 则返回给发行代币的人?
假设这个 udt 总量固定,是不是需要先把 udt 分成 N 份的 XXX 金额(比如每份 100 UDT token)的 cell,然后这些 cell 同时开始 countdown ?这样同时可以有许多用户参与获得 token?
Cool! 相信很多小伙伴和我一样,已经等不及了,确实需要一个好玩的应用来点燃社区热情。往xudt cell里放入CKB的交易是一个区块只允许一笔交易成功吗?
1 Like
这里现在我想的是就不保存参与人了,只要参与延时就可以收到xudt,参与的ckb和剩余的xudt作为池子的交易对,目前不太想拆分多个udt实现,同区块不允许多个人同时操作,并发的话还不确定链式交易行不行,如果用链式交易可能要引入后端服务了
目前是的,同区块只允许一笔操作,并发的话看后边链式交易能不能处理
链式交易可以发,那可能就需要统一后端来发交易了。同一个区块一笔也没啥问题,就大家竞争看谁先上链呗。
Fisher
16
cool,感觉能做成资产发行平台最好了,很多次局部牛市都是新的发射方式带来的。
因为可以算是不同的方向了,所以单开了一个帖子实现,具体详情可看这里[FairLaunchCell|基于 CKB 的公平发射平台]
1 Like
btw,除了 xudt,这个倒计时的玩法,最后一个用户拿走一切,在 utxo 里感觉特别适合 NFT 的发售。每个 NFT 最终被一个人领走也很自然。
1 Like
这个倒计时功能我给社区里的一些用户体验了之后,他们的第一直觉是说,好像拍卖,但细看又不是拍卖。能不能扩展一下弄一个拍卖的demo(它可能是另一个lock),拍卖的话就不是任意金额的追加了,而是要递增,出价高者得,结果出来之后可能还要考虑返还之前参与拍卖这部分人(他们参与拍卖,但他们的出价不是最终价)的CKB,还挺复杂的。
Thinker
20
感觉不如把一个做好能火起来,没必要做太杂分散注意力,拍卖没感觉有什么场景,就算有项目有需求,也可以自己借鉴去做个来用。做拍卖还不如做个现比较火的预测,市场既然这么好赌,就做个BTC将到达区块时的价格,离到达区块越近 相应的拿到奖励比例越低,在到达的前几个区块停止下注,到达后读取价格,然后最接近的那几个按百分比拿走所有押注,谁都可以发起,可以发到X等社交平台展现… 来个竞猜挖矿 
这个可以实现的,应该也不算复杂,创建一个auction cell,设置好倒计时、每次递增价格、底价,出价者(默认是创建者)、出价(默认是初始化ckb容量)。
然后有人出价,就把出价的ckb存到这个cell里面,更新出价者,并把默认初始化的容量转回默认创建者,后边有人报价就是同样的操作,接收新的ckb容量并把旧ckb的转回上一个出价者,直到倒计时结束,最后出价者可以领走这个cell.
1 Like