Alert Source Discuss
📢 Last Call Standards Track: ERC

ERC-2266: 基于原子互换的美式看涨期权合约标准

Authors Runchao Han <runchao.han@monash.edu>, Haoyu Lin <chris.haoyul@gmail.com>, Jiangshan Yu <jiangshan.yu@monash.edu>
Created 2019-08-17
Last Call Deadline 2020-12-31

简单总结

一种为代币合约提供基于原子互换的美式看涨期权功能的标准。

摘要

该标准提供了进行基于原子互换的美式看涨期权支付的功能。基于哈希时间锁定合约 (HTLC) 的原子互换协议 1 具有选择性 2,这种选择性可以用来构建美式看涨期权而无需信任第三方。该标准定义了实现此协议的通用方法。特别是,此 EIP 定义了技术术语,提供了接口,并提供了此协议的参考实现。

动机

原子互换允许用户在没有可信第三方的情况下原子地交换他们的代币,而 HTLC 通常用于实现。然而,基于 HTLC 的原子互换具有选择性。更具体地说,互换发起者可以选择进行或中止互换几个小时,这使他有时间根据汇率进行投机。一项讨论 2 表明,基于 HTLC 的原子互换相当于金融中的美式看涨期权。另一方面,由于这种选择性,基于 HTLC 的原子互换可以用来构建美式看涨期权而无需信任第三方。一篇论文 3 提出了一种基于智能合约的安全的基于原子互换的美式看涨期权协议。该协议不仅消除了套利机会,而且防止任何一方恶意锁定另一方的资金。本 EIP 旨在提供在现有代币标准中实现此协议的标准。

规范

基于原子互换的美式看涨期权智能合约应遵循以太坊智能合约的语法和语义。

定义

  • initiator:发布互换广告的一方。
  • participant:同意该广告并与 initiator 参与互换的一方。
  • asset:要交换的代币数量。
  • premiuminitiator 作为溢价支付给 participant 的代币数量。
  • redeem:从另一方索取代币的行为。
  • refund:由于时间锁到期,从自己索取代币的行为。
  • secrect:由 initiator 选择的随机字符串,作为哈希的原像。
  • secrectHash:一个等于 secrect 哈希值的字符串,用于构建 HTLC。
  • timelock:表示时间限制的时间戳,在此之前可以兑换资产,否则只能退款。

存储变量

swap

此映射存储交换合约的元数据,包括所涉及的双方和代币。每个合约使用不同的 secretHash,并通过 secretHash 区分。

mapping(bytes32 => Swap) public swap;

initiatorAsset

此映射存储发起者想要出售的资产的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash 的交换合约相关联。

mapping(bytes32 => InitiatorAsset) public initiatorAsset;

participantAsset

此映射存储参与者想要出售的资产的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash 的交换合约相关联。

mapping(bytes32 => ParticipantAsset) public participantAsset;

premiumAsset

此映射存储发起者在交换合约中附加的溢价的详细信息,包括数量、时间锁和状态。它与具有相同 secretHash 的交换合约相关联。

mapping(bytes32 => Premium) public premium;

方法

setup

此函数设置交换合约,包括所涉及的双方、要交换的代币等等。

function setup(bytes32 secretHash, address payable initiator, address tokenA, address tokenB, uint256 initiatorAssetAmount, address payable participant, uint256 participantAssetAmount, uint256 premiumAmount) public payable

initiate

发起者调用此函数来填充和锁定她/他想要出售并加入合约的代币。

function initiate(bytes32 secretHash, uint256 assetRefundTime) public payable

fillPremium

发起者调用此函数来填充和锁定溢价。

function fillPremium(bytes32 secretHash, uint256 premiumRefundTime) public payable

participate

参与者调用此函数来填充和锁定她/他想要出售并加入合约的代币。

function participate(bytes32 secretHash, uint256 assetRefundTime) public payable

redeemAsset

其中一方通过提供哈希锁 secret 的原像来调用此函数以从另一方获取代币。

function redeemAsset(bytes32 secret, bytes32 secretHash) public

refundAsset

其中一方在时间锁过期后调用此函数以取回代币。

function refundAsset(bytes32 secretHash) public

redeemPremium

参与者调用此函数以获得溢价。只有在参与者已经调用 participate 并且参与者的代币被赎回或退还后才能调用此函数。

function redeemPremium(bytes32 secretHash) public

refundPremium

发起者在时间锁过期后调用此函数以取回溢价。

function refundPremium(bytes32 secretHash) public

事件

SetUp

此事件表明一方已使用函数 setup() 设置了合约。

event SetUp(bytes32 secretHash, address initiator, address participant, address tokenA, address tokenB, uint256 initiatorAssetAmount, uint256 participantAssetAmount, uint256 premiumAmount);

Initiated

此事件表明 initiator 已使用函数 initiate() 填充并锁定了要交换的代币。

event Initiated(uint256 initiateTimestamp, bytes32 secretHash, address initiator, address participant, address initiatorAssetToken, uint256 initiatorAssetAmount, uint256 initiatorAssetRefundTimestamp);

Participated

此事件表明 participant 已使用函数 participate() 填充并锁定了要交换的代币。

event Participated(uint256 participateTimestamp, bytes32 secretHash, address initiator, address participant, address participantAssetToken, uint256 participantAssetAmount, uint256 participantAssetRefundTimestamp);

PremiumFilled

此事件表明 initiator 已使用函数 fillPremium() 填充并锁定了 premium

event PremiumFilled(uint256 fillPremiumTimestamp, bytes32 secretHash, address initiator, address participant, address premiumToken, uint256 premiumAmount, uint256 premiumRefundTimestamp);

InitiatorAssetRedeemed/ParticipantAssetRedeemed

这两个事件表明 asset 已在时间锁之前通过提供 secret 被另一方赎回。

event InitiatorAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);
event ParticipantAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);

InitiatorAssetRefunded/ParticipantAssetRefunded

这两个事件表明 asset 已在时间锁过期后被原始所有者退还。

event InitiatorAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);
event ParticipantAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);

PremiumRedeemed

此事件表明 premium 已被 participant 赎回。这意味着如果 initiator 可以在 asset 时间锁过期之前提供 secrectHash 的原像,则 asset 要么被 initiator 赎回;要么如果 asset 时间锁过期,则由 participant 退还。

event PremiumRedeemed(uint256 redeemTimestamp,bytes32 secretHash,address redeemer,address token,uint256 amount);

PremiumRefunded

此事件表明由于 participantpremium 时间锁到期时根本没有参与,因此 premium 已退还给 initiator

event PremiumRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address token, uint256 amount);

理由

  • 为了实现原子性,使用了 HTLC。
  • 参与者应在发起者锁定代币并设置时间锁后决定是否参与。
  • 在参与者锁定代币并设置时间锁后,发起者应决定是否继续兑换(从参与者那里赎回代币并显示哈希锁的原像)。
  • 仅当参与者参与交换并且在溢价时间锁过期之前赎回发起者的代币时,参与者才能赎回溢价。
  • 仅当发起者启动但参与者根本没有参与交换时,溢价才能退还给发起者。

安全注意事项

  • initiateTimestamp 应涵盖整个交换过程。
  • 参与者绝不应在溢价存入之前参与。

向后兼容性

此提案完全向后兼容。现有标准的功能不会受到此提案的影响,因为它仅向它们提供附加功能。

实施

请访问 here 以找到我们的示例实现。

版权

通过 CC0 放弃版权及相关权利。

参考文献

Citation

Please cite this document as:

Runchao Han <runchao.han@monash.edu>, Haoyu Lin <chris.haoyul@gmail.com>, Jiangshan Yu <jiangshan.yu@monash.edu>, "ERC-2266: 基于原子互换的美式看涨期权合约标准 [DRAFT]," Ethereum Improvement Proposals, no. 2266, August 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2266.