YesOrNo 技术白皮书

智能合约与预言机架构 —— 深入代码层面,了解去中心化、自动化、不可篡改的实现。

1. 核心逻辑:原子化拆分

数学公式

Price(Yes) + Price(No) = 1.00 USDC

只要向合约存入 1 USDC,就可以铸造出 1股 Yes1股 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。

了解更多技术细节?

查看 API 文档
スマートコントラクト - 検証済みデプロイメント