YesOrNo 技术白皮书
智能合约与预言机架构 —— 深入代码层面,了解去中心化、自动化、不可篡改的实现。
1. 核心逻辑:原子化拆分
数学公式
Price(Yes) + Price(No) = 1.00 USDC只要向合约存入 1 USDC,就可以铸造出 1股 Yes 和 1股 No。
这被称为“完整集合(Complete Set)”。无论结果如何,这两股中必有一股价值 $1,另一股价值 $0。
技术标准: YesOrNo 遵循 Gnosis Conditional Token Framework (CTF) 标准。
2. 智能合约代码示例
合约结构定义
contract YesOrNoMarket {
IERC20 public collateralToken; // USDC
IOracle public oracle; // 预言机接口
struct Market {
string question; // 问题
uint256 endTime; // 截止时间
bool resolved; // 是否已结算
bool outcome; // 结果
}
mapping(bytes32 => Market) public markets;
mapping(bytes32 => mapping(address => uint256)) public yesBalances;
mapping(bytes32 => mapping(address => uint256)) public noBalances;
}铸造份额函数
核心机制: 1 USDC = 1 YES + 1 NO,确保 100% 储备金支撑。
function mintShares(bytes32 marketId, uint256 amount) external {
require(!markets[marketId].resolved, "Market already resolved");
// 1. 将用户的 USDC 转移到合约
require(collateralToken.transferFrom(
msg.sender, address(this), amount
), "Transfer failed");
// 2. 给用户发放等量的 YES 和 NO 份额
yesBalances[marketId][msg.sender] += amount;
noBalances[marketId][msg.sender] += amount;
emit TokensMinted(marketId, msg.sender, amount);
}预言机结算
合约无法知道外部事件,必须依赖预言机查询真实世界的结果。
function resolveMarket(bytes32 marketId) external {
Market storage market = markets[marketId];
require(!market.resolved, "Already resolved");
require(block.timestamp >= market.endTime, "Not yet ended");
// 调用外部预言机查询结果
require(oracle.isResolved(marketId), "Oracle not ready");
bool result = oracle.getOutcome(marketId);
market.outcome = result;
market.resolved = true;
emit MarketResolved(marketId, result);
}赎回奖金
代码强制执行:只有赢家才能提现。
function redeemWinnings(bytes32 marketId) external {
Market storage market = markets[marketId];
require(market.resolved, "Market not resolved yet");
uint256 payout = 0;
if (market.outcome == true) {
// YES 赢
payout = yesBalances[marketId][msg.sender];
yesBalances[marketId][msg.sender] = 0;
} else {
// NO 赢
payout = noBalances[marketId][msg.sender];
noBalances[marketId][msg.sender] = 0;
}
require(payout > 0, "No winnings to claim");
require(collateralToken.transfer(msg.sender, payout), "Transfer failed");
emit WinningsClaimed(marketId, msg.sender, payout);
}3. UMA 乐观预言机运作流程
1
Assert (主张)
市场到期后,任何人都可以提交结果。需要质押保证金(Bond)防止乱发。
2
Challenge Window (争议窗口)
进入冷静期(如2小时):
无人反对: 数据通过,推送到合约
有人反对: 质押保证金发起挑战
3
DVM Vote (投票裁决)
争议送往 UMA 数据验证机制。全球节点投票,基于谢林点(Schelling Point)原理: 只有投给多数派才能获奖励,撒谎者损失代币。
4
Finality (最终性)
投票结果写入链上,YesOrNo 智能合约读取并自动结算。
4. 为什么比传统服务器更安全?
| 特性 | 传统服务器 (Web2) | YesOrNo 智能合约 (Web3) |
|---|---|---|
| 逻辑执行 | if (user_won) { send_money() } | require(market.resolved); transfer(...) |
| 可篡改性 | 管理员可后台修改 user_won 或不执行转账 | 代码部署后逻辑锁定,管理员无法修改 market.outcome |
| 资金池 | 混合在公司银行账户 | 锁定在合约地址,公司无法挪用,只有持有正确 Share 的用户能提取 |
技术说明
这段代码展示了 YesOrNo 的骨架。实际上,为了让交易更顺滑,YesOrNo 还在这一层之上叠加了一个 CTF Exchange(条件代币交易所),使用了 CPMM(恒定乘积做市商) 算法,让您可以随时买卖,而不需要自己去 Mint。