HashLotteryCell | 一个伪随机的哈希彩票

testnet:

目标与原则

  • 只使用一个类型脚本 lottery 完成下注与结算

  • 中奖用户主动发起结算;未中奖用户无需参与且无动力也不阻塞结算

  • 平台不提交交易,可自动获得抽水(可配置)

  • 结算依据下注上链区块之后的第N个区块哈希的最后一位,简单、可运营

合约分为两种Cell

  • Bet Cell:承载单笔下注信息(类型脚本为 lottery

  • Pot Cell:奖池资金仓(同一类型脚本 lottery),用于支付中奖差额与平台抽水,尤其是初期,池子里还没有足够cell,需要平台方存入Pot Cell供结算

  • 两类 Cell 使用轻量锁(如 always_success),消费权限由类型脚本完全控制

类型脚本 args(全局配置)

  • platform_lock_hash:平台收益地址哈希(32B)

  • house_edge_bp:平台抽水基点(u16,默认 500 表示 5%)

  • confirmations:结算所需确认块数(u16,推荐 1 或更高,越高越安全,越低响应越快)

数据布局(Molecule 简化)

  • Bet.output_data
    • stake_shannons: u64
    • guess: u8(0=小,1=大)
    • bettor_lock_hash: [32](用户锁哈希)
  • Pot.output_data
    • kind: u8 = 1

下注交易(创建 Bet)

  • 构造 Bet Cell:容量至少覆盖最小占用;填充上列数据
  • 类型脚本校验:
    • 数据字段合法(stake_shannons >= occupied_sizeguess ∈ {0,1}
    • bettor_lock_script 合法编码

结算交易(中奖/未中奖)

  • header_deps:每个被消费 Bet 需包含 H_created(创建头)与 H_target(目标头,满足 number ≥ created + confirmations),以此判定输赢(取 H_target.hash 最后一位)
  • 金额计算(整数基点):
    • 用户输出 = stake + floor(stake * (10000 - house_edge_bp) / 10000)(例如 5% 抽水时为 1.95 × stake
    • 平台抽水 = ceil(stake * house_edge_bp / 10000)
  • 中奖分支:
    • Inputs:中奖 Bet(按当前钱包锁哈希筛选)+ 若干输家 Bet +(不足时)一个或多个 Pot
    • 资金来源:优先吞并输家 sum_losers 覆盖中奖差额,不足再使用 Pot
    • 必须输出:
      • 用户锁(bettor_lock_hash 对应)收到 stake + payout
      • Pot_out = Pot_in + sum_losers - payoutTotal
    • 被消费的输家 Bet 不再重建
  • 未中奖分支:
    • 输家被吞并仅计入奖池:Pot_out = Pot_in + stake
    • 无用户/平台输出
  • 公共约束:
    • 所有参与的 Bet/Pot 必须引用同一 type.args 配置(platform_lock_hashhouse_edge_bpconfirmations
    • 输出容量满足最小占用,不增发;手续费仅用于矿工费,由普通输入覆盖
    • 奖池最小容量:MIN_POT_CAPACITY = 120 CKB;若不满足将继续选择更多输家或追加更多 Pot;钱包资金不用于补足奖池容量

交易形态示例

  • 单注结算(Pot 足额):
    • Inputs:Bet(X) + Pot(P)
    • Outputs:User(stake + payout=1.95X) + Pot(P - payout)
  • 单注结算(Pot 不足,吞并输家):
    • Inputs:Bet(X) + Pot(P) + Bet(L1..Ln)
    • 要求:sum(Li) + P ≥ payout
    • Outputs:User(stake + payout=1.95X) + Pot(P - used + sum(Li) - payout)
  • 批量结算:
    • Inputs:多笔 Bet + 若干 Pot
    • Outputs:聚合支付所有中奖;Pot 净变动 = 输家总额 - 中奖差额总额;平台抽水暂不输出

激励与运营

  • 中奖者主动结算:天然动力领取 payout

  • 输家无需结算:其 Bet 可被任何人(通常是中奖者)在结算时吞并入 Pot

  • 平台交易:平台可管理Pot,初期可创建Pot(非必须,吞并输家即可增长),后期可以在Pot领抽水。

9 Likes

so cool!

1 Like

这个场景似乎可以完全基于 light client 实现?

设想一个基于 light client 实现的 HashLottery android app, 它将会是一个可以通过 github 托管代码和分发,不依赖任何第三方api的 serverless p2p app?

4 Likes