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_datastake_shannons: u64guess: u8(0=小,1=大)bettor_lock_hash: [32](用户锁哈希)
Pot.output_datakind: u8 = 1
下注交易(创建 Bet)
- 构造
Bet Cell:容量至少覆盖最小占用;填充上列数据 - 类型脚本校验:
- 数据字段合法(
stake_shannons >= occupied_size,guess ∈ {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_hash、house_edge_bp、confirmations) - 输出容量满足最小占用,不增发;手续费仅用于矿工费,由普通输入覆盖
- 奖池最小容量:
MIN_POT_CAPACITY = 120 CKB;若不满足将继续选择更多输家或追加更多 Pot;钱包资金不用于补足奖池容量
- 所有参与的 Bet/Pot 必须引用同一
交易形态示例
- 单注结算(Pot 足额):
- Inputs:
Bet(X)+Pot(P) - Outputs:
User(stake + payout=1.95X)+Pot(P - payout)
- Inputs:
- 单注结算(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:
- 批量结算:
- Inputs:多笔
Bet+ 若干Pot - Outputs:聚合支付所有中奖;
Pot净变动 = 输家总额 - 中奖差额总额;平台抽水暂不输出
- Inputs:多笔
激励与运营
-
中奖者主动结算:天然动力领取
payout -
输家无需结算:其
Bet可被任何人(通常是中奖者)在结算时吞并入Pot -
平台交易:平台可管理Pot,初期可创建Pot(非必须,吞并输家即可增长),后期可以在Pot领抽水。