CountdownCell|一个关于CELL的倒计时游戏

项目简介

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)

待完善

  • 考虑增加更多校验(防回退/参数边界);

  • 需要控制lock_script关闭之前不允许修改;

  • 合约源码位于仓库 contracts/countdown/ 目录。

免责声明

特别致谢

  • OffCKB:本地 CKB 开发网络与部署工具,便于快速启动 Devnet、部署与调试合约。

仓库:https://github.com/ckb-devrel/offckb

  • CCC:一站式 JS/TS 生态工具集与钱包连接组件,简化交易组合与签名、前端接入。

仓库:https://github.com/ckb-devrel/ccc/

10 Likes

fomo3D :rofl:

有意思 :+1: 用 cell 重现 fomo3d!直觉上是不是可以把这个合约做成 lock script 而不是 type script,这样可以把 fomo3d 这套机制抽出来,去和任意的 type 资产结合,比如某个用户发了个 udt token,可以使用这套机制去做一些活动。

1 Like

很高兴看到这种尝试,至少能聚集下社区。感觉最后付款人拿走一定比例的资金,留下一些给下轮游戏做起始金,会不会更让人fomo些呢?有好玩的大可尝试,在区块链没有大规模商用前,在它上面做的一切透明公平不可篡改的事,都是它的最好用例。(这段时间市场这么不好情况下,ORE的模式游戏被国外fomo都超CKB市值了 :laughing:

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 开始跟以太坊那边的不一样了

这个试了下实现了,放到lock script里面,把type script和data空出来,可以支持spore和udt等资产https://testnet.explorer.nervos.org/transaction/0xed2d8c8535a75a1fd41fb13b9ab49b58eced14faa3275a06a3baaf3dd117c84c

2 Likes

下一步准备尝试一下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实现,同区块不允许多个人同时操作,并发的话还不确定链式交易行不行,如果用链式交易可能要引入后端服务了

目前是的,同区块只允许一笔操作,并发的话看后边链式交易能不能处理

链式交易可以发,那可能就需要统一后端来发交易了。同一个区块一笔也没啥问题,就大家竞争看谁先上链呗。

cool,感觉能做成资产发行平台最好了,很多次局部牛市都是新的发射方式带来的。

因为可以算是不同的方向了,所以单开了一个帖子实现,具体详情可看这里[FairLaunchCell|基于 CKB 的公平发射平台]

1 Like

btw,除了 xudt,这个倒计时的玩法,最后一个用户拿走一切,在 utxo 里感觉特别适合 NFT 的发售。每个 NFT 最终被一个人领走也很自然。

1 Like

这个倒计时功能我给社区里的一些用户体验了之后,他们的第一直觉是说,好像拍卖,但细看又不是拍卖。能不能扩展一下弄一个拍卖的demo(它可能是另一个lock),拍卖的话就不是任意金额的追加了,而是要递增,出价高者得,结果出来之后可能还要考虑返还之前参与拍卖这部分人(他们参与拍卖,但他们的出价不是最终价)的CKB,还挺复杂的。

感觉不如把一个做好能火起来,没必要做太杂分散注意力,拍卖没感觉有什么场景,就算有项目有需求,也可以自己借鉴去做个来用。做拍卖还不如做个现比较火的预测,市场既然这么好赌,就做个BTC将到达区块时的价格,离到达区块越近 相应的拿到奖励比例越低,在到达的前几个区块停止下注,到达后读取价格,然后最接近的那几个按百分比拿走所有押注,谁都可以发起,可以发到X等社交平台展现… 来个竞猜挖矿 :joy:

这个可以实现的,应该也不算复杂,创建一个auction cell,设置好倒计时、每次递增价格、底价,出价者(默认是创建者)、出价(默认是初始化ckb容量)。
然后有人出价,就把出价的ckb存到这个cell里面,更新出价者,并把默认初始化的容量转回默认创建者,后边有人报价就是同样的操作,接收新的ckb容量并把旧ckb的转回上一个出价者,直到倒计时结束,最后出价者可以领走这个cell.

1 Like