9月份以太坊社区相继出现 ERC-1400/1404/1410/1411 等证券型通证发行(Security Token Offering,简称STO)的标准提案,预示着通证市场开始主动拥抱政策监管,以太坊社区也在技术上寻求合规通证的实现机制。wlamos 今天为大家带来以太坊ERC-1594的草案标准详解, 让大家了解到社区最新的技术动态。
证券型通证的特殊性
与最常见的ERC-20通证相比, 证券型通证具有以下几个特殊性:
1. 证券型通证具有转移限制
我们熟悉的各种通证并不属于证券型通证,对此类通证要发起转账操作,通常只要转出账户有足够余额即可进行,但对于证券型通证,情况要复杂的多,需要考虑的因素可能包括:
证券的锁定期,有可能不同部分的锁定期不同,比如每年解禁25%
发送方与接收方的身份,是否通过了背景调查,之间是否有隶属关系等
对证券本身的限制,比如根据相关法律,某类证券的投资者有数量限制(不超过2000人),或者单个投资者的持有上限有限制(持有比例不超过10%)
此类限制较为多样,一方面很难完全用链上逻辑实现(比如将规则硬编码、白名单等),另一方面实现此类逻辑代价很大,即使实现也很难动态维护。
为解决此问题,需要在进行相关操作时,可以参考链下数据。比如采用co-signing的方法,证券的转移需要证券的持有者批准,同时需要另一个可信机构签名过的数据(比如动态白名单)。
2. 出错原因多样性
证券型通证的操作可能有多种限制,这也意味着操作出错的原因多种多样。在操作失败时,开发者/用户需要知道出错的原因。此时可以考虑ERC1066,采用标准的错误编码。
3. 发行与赎回
证券型通证的发行与赎回(类似铸币与销毁)有其特殊性,比如需要第三方监管机构的批准签名数据。
ERC-1594的解决方案
ERC1594继承自ERC20,如有需要可以扩展为ERC777.
继承自ERC20意味着符合ERC1594的证券型通证自动具有如下接口
关于ERC20部分,此处不再赘述。本文主要介绍新增加的接口。
通证转移
ERC1594提供了两个接口用于通证的转移,每个接口都有一个_data数据,用于存放链下数据(比如签名过的数据等),这意味着链上逻辑(智能合约)可以获取并处理链下数据,可以根据链下数据进行更为灵活的控制。
当_data为空时,其语义与ERC20的transfer/transferFrom一致。
transferWithData/transferFromWithData都必须emit一个Transfer事件。
检查通证转移是否可行
如前所述,有多种原因可以导致转移操作失败,ERC1594提供了两个接口用于查询转移操作是否可以进行,其返回值
- bool 类型表示此操作是否会成功
- byte 类型返回值符合EIP-1066标准,表示标准的返回码
- bytes32 类型可以存储应用相关的其他附加信息
这两个接口都提供了一个_data参数用于存放链下数据,如果此数据为空,则这两个接口用于检测transfer/transferFrom是否会成功,如果此数据不为空,则用于检测transferWithData/transferFromWithData是否会成功。
- canTransfer假设msg.sender就是通证的发送者,后续会调用transfer/ transferWithData
- canTransferFrom则可以指定通证的发送者,后续会调用transferFrom/ transferFromWithData
发行
用于检测发行是否结束,如果isIssuable()返回FALSE,则
后续对isIssuable()的调用必须总是返回FALSE
通证的总发行量不会增加
此接口用于发行通证,增加通证的总发行量。_data可以存放链下数据来验证此次发行的合法性。当此函数被调用必须emit Issued事件。
赎回
用于通证的持有者赎回通证。
赎回的通证必须从通证的总发行量与赎回者的账户中减去。 与transferWithData类似,参数_data可以存放链下数据 此函数的调用必须emitRedeemed事件。
与transferFromWithData类似,_tokenHolder必须给msg.sender足够的allowance,并且赎回成功后,allowance必须进行更新,减去_value. 每次此函数调用都必须emit Redeemed事件。
ERC-1594完整接口
参考
https://github.com/ethereum/EIPs/issues/1594
其他:
扫描关注最新区块链技术解读 本文经「原本」原创认证,作者好码实验室,访问yuanben.io查询【1FH7OXCQ】获取授权信息。
网友评论