远期合约是两方在特定未来时间以预定价格买卖资产的衍生工具。它是一种非常常见的对冲波动性的工具。因此,使用 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。
有了这种远期合约,价格波动风险得到了缓解,但它引入了交易对手风险。Alice 或 Bob 可能在合同到期时不履行合同并拒绝付款。
我们分两步使用 BSV 上的智能合约来实现合约:
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 。
合同到期有三种可能:
价格等于 100K
sats/ USD (即每个 BSV 100
USD )。第 38
行的收益为 0
。Alice 和 Bob 各取回他们的 50
个 BSV 。
价格高于 100K
sats/dollar。例如,它是 200K
sats/dollar(即 BSV 价格跌至 50
USD )。 Bob 将支付 Alice 5000 * (200K -100K) = 5 亿 sats = 5 个 BSV
。 Alice 得到 55
个 BSV ,Bob 得到 45
个。
价格低于 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] 这种类型的远期称为不可交割远期。