BSV 上的点对点结算衍生品:远期合约

Posted sCrypt 智能合约

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BSV 上的点对点结算衍生品:远期合约相关的知识,希望对你有一定的参考价值。

远期合约简介

远期合约是两方在特定未来时间以预定价格买卖资产的衍生工具。它是一种非常常见的对冲波动性的工具。因此,使用 USD 远期合约可以对冲 USD 兑 BSV 汇率的波动。

远期合约的收益图

例如,Alice 与 Bob 签订了一份 USD 远期合约。Alice 同意从现在起一个月后以每 BSV 100 USD 的价格从 Bob 那里购买 5000 USD (即每 USD 100,000 聪(=0.01 BSV ))。

Alice 是一名矿工,必须每月支付电费,并希望减轻波动风险。该合同到期后将赋予她 5000 USD 的权利,无论当时的 BSV 汇率如何。 Bob 是一名交易员,他将这份合约作为一种投机手段,期望 BSV 的价格上涨并获利。

他们同意以 BSV 结算合同。各方将相互支付约定价格与 BSV 市场价格之间的差额¹。因此,如果 BSV 的 USD 价值贬值(即 BSV 价格下跌),Bob 将向 Alice 支付差额。同样,如果 BSV 升值,Alice 将不得不支付给 Bob。

BSV USD 远期合约

有了这种远期合约,价格波动风险得到了缓解,但它引入了交易对手风险。Alice 或 Bob 可能在合同到期时不履行合同并拒绝付款。

我们分两步使用 BSV 上的智能合约来实现合约:

  1. Alice 和 Bob 各自将 50 个 BSV (5000 USD * 0.01 BSV / USD )锁定到以下合约中。抵押品不需要第三方保管人。
  2. 当合约到期且预言机公布现货价格时,可以使用公布的价格分割抵押品。交易对手风险得到缓解,因为任何一方都不能作弊。
import "rabin.scrypt";

// price info published by oracle
struct OraclePrice 
    // spot/market price
    int price;
    int time;


// a USD forward contract settled in bitcoin, as denominated
contract Forward 
    Ripemd160 alice;
    Ripemd160 bob;

    // how much bitcoin Alice plans to sell to Bob, in dollars
    int dollars;

    // predetermined delivery price, in satoshis / dollar
    int deliveryPrice;
    // contract mature time
    int matureTime;

    RabinPubKey oraclePubKey;

    public function settle(OraclePrice op, RabinSig sig, SigHashPreimage txPreimage) 
        Tx.checkPreimage(txPreimage);

        // oracle signs serialized price data
        bytes msg = serializePrice(op);
        // verify price info
        require(RabinSignature.checkSig(msg, sig, this.oraclePubKey));

        // verify price is for the agreed-on matrue time
        require(op.time == this.matureTime);

        // total collateral amount, in satoshis
        int totalSats = SigHash.value(txPreimage);

        // Bob pays Alice the difference; could be nagative
        int payoff = this.dollars * (op.price - this.deliveryPrice);
        int aliceAmount = totalSats / 2 + payoff;
        if (aliceAmount < 0) aliceAmount = 0;   //bounded
        int bobAmount = totalSats - aliceAmount;
        if (bobAmount < 0) bobAmount = 0;       //bounded

        // split according to the price when the contract is mature

        bytes aliceScript = Utils.buildPublicKeyHashScript(this.alice);
        bytes aliceOutput = Utils.buildOutput(aliceScript, aliceAmount);

        bytes bobScript = Utils.buildPublicKeyHashScript(this.bob);
        bytes bobOutput = Utils.buildOutput(bobScript, bobAmount);

        require(hash256(aliceOutput + bobOutput) == SigHash.hashOutputs(txPreimage));
    

    // serialized price data. It is what oracle signs
    static function serializePrice(OraclePrice op) : bytes 
        return num2bin(op.price, 4) + num2bin(op.time, 4);
    

远期合约源代码

智能合约中的预言机使用 Rabin Signature 签署喂价(第 29 行)并使用 OP_PUSH_TX 分割抵押品,即 100 个 BSV 。

合同到期有三种可能:

  1. 价格等于 100K sats/ USD (即每个 BSV 100 USD )。第 38 行的收益为 0。Alice 和 Bob 各取回他们的 50 个 BSV 。

  2. 价格高于 100K sats/dollar。例如,它是 200K sats/dollar(即 BSV 价格跌至 50 USD )。 Bob 将支付 Alice 5000 * (200K -100K) = 5 亿 sats = 5 个 BSV 。 Alice 得到 55 个 BSV ,Bob 得到 45 个。

  3. 价格低于 100K sats/dollar。例如,它是 50K sats/dollar(即 BSV 价格上涨到 200 USD )。 Alice 将支付 Bob 5000 * (100K -50K) = 2.5 亿 sats = 2.5 个 BSV 。 Alice 得到 47.5 个 BSV ,Bob 得到 52.5 个。

讨论

我们只实施了基本的智能合约作为概念证明。有很多方法可以使它更实用,我们列出了其中的一些。

  • 最大曝光:当价格上涨到 1100K sats/ USD ( BSV 价格下跌到 90.9 USD )。 Bob 将支付 Alice 5000 * (1100K -100K) = 50 亿 sats = 50 个 BSV 。如果价格进一步上涨,Bob 将无法用 50 BSV 抵押品支付全部金额。需要更多的抵押品来应对更多的波动风险。

  • 以 USD 结算:当 USD 代币可用于 BSV 时,合约可以以 USD 而非 BSV 结算。也可以使用 USD 抵押品。

  • 故障安全:如果预言机没有发布所需的价格数据,我们可以在智能合约中添加一个公共函数,让 Alice 和 Bob 都签署以取回他们的抵押品。

  • 多个预言机:为了降低恶意预言机的风险,可以使用多个预言机。

总结

我们展示了一个以 BSV 结算的 USD 远期合约。它可以很容易地扩展到任何需要根据外部未来价值划分以 BSV 计价的资金的金融工具。标的资产可以是任何东西,例如黄金、小麦或石油。只要有预言机发布价格,就可以使用上面的智能合约构建远期合约。


[1] 这种类型的远期称为不可交割远期

以上是关于BSV 上的点对点结算衍生品:远期合约的主要内容,如果未能解决你的问题,请参考以下文章

金融衍生工具-金融远期期货与互换

一个 BSV 网络上的井字棋游戏合约

一个 BSV 网络上的井字棋游戏合约

金融工程 | 概述

远期合约

-远期和期货价格的确定--课后作业--金融衍生工具