Alert Source Discuss
🚧 Stagnant Standards Track: ERC

ERC-2020: 电子货币标准代币

Authors Julio Faura <julio@adhara.io>, Fernando Paris <fer@io.builders>, Daniel Lehrner <daniel@io.builders>
Created 2019-05-10
Discussion Link https://github.com/ethereum/EIPs/issues/2407
Requires EIP-20, EIP-1066, EIP-1996, EIP-2009, EIP-2018, EIP-2019, EIP-2021

简述

电子货币标准代币旨在实现区块链网络上受监管的电子货币的发行,并在实际金融应用中的实际使用。

参与者

操作员

一个账户,它已被另一个账户批准代表其执行操作。

摘要

金融机构目前使用电子系统,这些系统在核心银行系统的数据库中保存账户余额。 要想让一个机构被允许维护客户余额的记录,这些记录要被隔离并可供客户使用,该机构必须在已知的法律框架下受到监管,并且必须拥有这样做的许可证。 在监管监督下保持许可证需要确保合规性(即在允许交易之前对所有客户执行 KYC 并确保良好的 AML 实践),并通过定期审计证明技术和运营偿付能力,因此将资金存入机构的客户可以放心他们的资金是安全的。

动机

只有少数潜在的监管许可框架允许机构为客户发行和持有货币余额(无论是零售公司还是机构类型)。 最重要和最实用的是三个:

  • 电子货币实体:这些是受法律监管的工具,目前主要用于现金和支付服务,而不是更复杂的金融服务。 例如,预付卡或 PayPal 等在线支付系统就是在这种计划上运行的。 在大多数司法管辖区,电子货币余额需要 100% 的资产支持,这通常需要在银行的综合账户中持有现金,该账户中 100% 的资金已发行给电子货币账本中的客户。
  • 银行牌照:这些包括商业银行和投资银行,它们使用在核心银行系统中实施的活期和其他类型的账户来隔离客户资金。 银行可以通过向客户贷款来创造货币,因此银行货币可以由付款承诺和其他非流动性资产来支持。
  • 中央银行:中央银行在 RTGS 系统中为银行持有余额,类似于核心银行系统,但功能更加受限但至关重要。 中央银行通过将资金借给银行来创造货币,银行将其资产质押给中央银行,作为官方利率的最后贷款人。

所有这些类型的电子货币的法规都是本地的,即仅对每个司法管辖区有效,而对其他司法管辖区无效。 不同司法管辖区的法规也可能差异很大——例如,在某些地方没有电子货币框架,一切都必须通过银行牌照或直接与中央银行进行。 但在所有情况下,都需要确保符合现有法规,特别是:

  • 了解您的客户 (KYC):该机构需要在为客户提供存款或交易的可能性之前识别客户。 在不同的司法管辖区和不同类型的许可证中,对于不同级别的 KYC,可以允许不同级别的余额和活动。 例如,如果现金余额保持在较低水平(即数百美元),那么在许多司法管辖区中,对于低 KYC 要求(几乎没有检查甚至根本没有检查)通常是可以接受的
  • 反洗钱 (AML):该机构需要检查与其客户进行交易的各方,通常是根据黑名单进行检查并进行制裁筛选,尤其是在国际交易方面

除了现金之外,股票或债券等金融工具在大多数情况下也以电子系统注册,尽管所有这些系统和银行会计系统仅通过基本的消息传递方式连接,这导致在许多情况下需要对账和人工管理。 用于提供资本市场交易结算的现金系统与交易系统的连接不够紧密,并且经常导致延误和结算风险。

电子货币标准代币建立在当前使用的以太坊标准(如 ERC-20)之上,但它对其进行了扩展,以提供一些在受监管的金融领域中所需的重要附加功能:

  • 合规性:电子货币标准代币实现了一组方法,用于提前检查从合规性角度来看,用户发起的交易是否可以进行。 在执行交易之前,实现必须 require 这些方法返回肯定答案。
  • 结算:除了标准的 ERC-20 transfer 方法之外,电子货币标准代币还提供了一种提交需要由代币发行机构链下结算的转账的方式。 然后,这些转账分两步执行:
    1. 对转账进行排序
    2. 在结算它们之后,由代币合约的运营商执行或拒绝转账
  • 持有:代币余额可以被置于持有状态,这将使被持有的金额无法进一步使用,直到持有被解决(即执行或释放)。 持有有付款人、收款人和负责解决持有的公证人。 持有还实现了到期期限,之后任何人都可以释放持有。 持有类似于托管,因为它是坚定的并导致最终结算。 持有也可以用于实施抵押。
  • 资金请求:用户可以通过调用智能合约并附加借记指令字符串来请求为钱包提供资金。 分词器读取此请求,解释借记指令,并在银行账本中触发转账以启动代币化过程。
  • 付款:用户可以通过调用智能合约并附加付款指令字符串来请求付款。 (解)分词器读取此请求,解释付款指令,并在可能的情况下触发将资金(通常来自综合账户)转移到目标账户。 请注意,赎回请求是一种特殊的付款,其中付款的目标(银行)账户是链接到代币钱包的银行账户。

因此,电子货币标准代币与其他通常被称为“稳定币”的代币不同,因为它旨在通过获得许可的工具(电子货币实体、银行或中央银行),以合规的方式(即完全符合 KYC 和 AML 合规性)发行、销毁和提供给用户,并且因为它提供了上述附加功能,因此可以被实现更复杂的金融应用程序的其他智能合约使用,例如银行间支付、供应链金融工具或创建以电子货币标准代币计价的债券和股票并自动进行交割与付款。

规范

interface EMoneyToken /* is ERC-1996, ERC-2018, ERC-2019, ERC-2021 */ {
    function currency() external view returns (string memory);
    function version() external pure returns (string memory);
    
    function availableFunds(address account) external view returns (uint256);
    
    function checkTransferAllowed(address from, address to, uint256 value) external view returns (byte status);
    function checkApproveAllowed(address from, address spender, uint256 value) external view returns (byte status);
    
    function checkHoldAllowed(address from, address to, address notary, uint256 value) external view returns (byte status);
    function checkAuthorizeHoldOperatorAllowed(address operator, address from) external view returns (byte status);    

    function checkOrderTransferAllowed(address from, address to, uint256 value) external view returns (byte status);
    function checkAuthorizeClearableTransferOperatorAllowed(address operator, address from) external view returns (byte status);
    
    function checkOrderFundAllowed(address to, address operator, uint256 value) external view returns (byte status);
    function checkAuthorizeFundOperatorAllowed(address operator, address to) external view returns (byte status);
    
    function checkOrderPayoutAllowed(address from, address operator, uint256 value) external view returns (byte status);
    function checkAuthorizePayoutOperatorAllowed(address operator, address from) external view returns (byte status);
}

强制检查

必须在其相应的操作中验证检查。 只有当检查返回 Allowed 状态代码时,该操作才能成功。 在任何其他情况下,函数都必须恢复。

状态码

如果允许执行操作,则必须返回 0x11(允许),或者返回具有等效但更精确含义的发行者特定代码。 如果不允许执行操作,则状态必须为 0x10(不允许),或者返回具有等效但更精确含义的发行者特定代码。

函数

currency

返回支持代币的货币。 该值必须是 ISO 4217 中定义的代码。

| 参数 | 描述 | | ———|————-| | - | - |

version

返回智能合约的当前版本。 版本的格式由 EIP 的实现者决定。

| 参数 | 描述 | | ———|————-| | - | - |

availableFunds

返回帐户的总净资金。 考虑到直接余额和持有余额。

参数 描述
account 应该返回可用资金的帐户

checkTransferAllowed

检查是否允许使用给定的参数执行 transfertransferFrom 函数。

参数 描述
from 付款人的地址,如果要执行,则从该地址获取代币
to 收款人的地址,如果要执行,则将代币转移到该地址
value 要转移的金额

checkApproveAllowed

检查是否允许使用给定的参数执行 approve 函数。

参数 描述
from 付款人的地址,如果要执行,则从该地址获取代币
spender 消费者的地址,该地址有可能代表 from 发起转账
value 要转移的最大金额

checkHoldAllowed

检查是否允许使用给定的参数执行 hold 函数。

参数 描述
from 付款人的地址,如果要执行,则从该地址获取代币
to 收款人的地址,如果要执行,则将代币转移到该地址
notary 公证人的地址,他将确定是否要执行或释放持有
value 要转移的金额。 必须小于或等于付款人的余额

checkAuthorizeHoldOperatorAllowed

检查是否允许使用给定的参数执行 checkAuthorizeHoldOperatorAllowed 函数。

参数 描述
operator 要批准为可结算转账运营商的地址
from 可能在其名义下签发持有的地址

checkOrderTransferAllowed

检查是否允许使用给定的参数执行 orderTransfer 函数。

参数 描述
from 付款人的地址,如果要执行,则从该地址获取代币
to 收款人的地址,如果要执行,则将代币支付到该地址
value 要转移的金额。 必须小于或等于付款人的余额

checkAuthorizeClearableTransferOperatorAllowed

检查是否允许使用给定的参数执行 authorizeClearableTransferOperator 函数。

参数 描述
operator 要批准为可结算转账运营商的地址
from 可能在其名义下订购可结算转账的地址

checkOrderFundAllowed

检查是否允许使用给定的参数执行 orderFund 函数。

参数 描述
to 如果执行,则将代币给予的地址
operator 请求者的地址,它会启动资金订单
value 要注资的金额

checkAuthorizeFundOperatorAllowed

检查是否允许使用给定的参数执行 authorizeFundOperator 函数。

参数 描述
operator 要批准为订购资金的运营商的地址
to 如果执行,则将代币给予的地址

checkOrderPayoutAllowed

检查是否允许使用给定的参数执行 orderPayout 函数。

参数 描述
from 如果执行,则从中获取代币的地址
operator 请求者的地址,它会启动付款请求
value 要支付的金额

checkAuthorizePayoutOperatorAllowed

检查是否允许使用给定的参数执行 authorizePayoutOperator 函数。

参数 描述
operator 要批准为订购付款的运营商的地址
from 如果执行,则从中获取代币的地址

理由

此 EIP 统一了 ERC-1996ERC-2018ERC-2019ERC-2021,并在此之上增加了合规性检查。 通过这种方式,单独的 EIP 在其他方面彼此独立,并且电子货币标准代币为受监管的电子货币的所有必要功能提供了解决方案。

虽然没有要求,但检查函数的命名是从 ERC-1462 采用的。

向后兼容性

此 EIP 是完全向后兼容的,因为它的实现扩展了 ERC-1996ERC-2018ERC-2019ERC-2021ERC-1066 的功能。

实现

GitHub 存储库 IoBuilders/em-token 包含正在进行中的实现。

贡献者

这个提案是由 adhara.ioio.builders 合作实施的。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Julio Faura <julio@adhara.io>, Fernando Paris <fer@io.builders>, Daniel Lehrner <daniel@io.builders>, "ERC-2020: 电子货币标准代币 [DRAFT]," Ethereum Improvement Proposals, no. 2020, May 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2020.