ERC-3475能否取代ERC-20?
为什么写这篇文章?
2021/04/05推出的EIP-3475 终于在近期被通过成为ERC-3475,相关新闻的出现令我好奇的去翻了他的EIP 文件,原本只是想了解其运作模式以及开发动机,看一看觉得有点东西,写成文章整理思绪顺便跟读者分享一下。
关于EIP, ERC 的差异曾在ERC721A 这篇文章介绍过,不熟的人可以去看看。
债券在传统金融中的占比大约为股票的三倍大,这么重要的商品居然还没在DeFi中被广泛运用,其原因可能是没办法进行“信用”评估,但现在DID(去中心化数位身分)的快速发展,会不会让它成为下一个机会点?
在介绍ERC-3475 之前,来简单说明一下债券是什么,讲得不深,金融大师请鞭小力点。
如果只是想了解ERC-3475的特色,请看这边
现在市面上流动性高token 几乎都是ERC-20,并没有足够多的功能来支持它做各种操作,许多开发者为了赋予这些token 功能,会去写智能合约,在没有统一标准的情况下,容易被骇客攻击,因此我们需要一个拥有更多功能的token 标准来让市面上的token 更多玩法以及更加安全。
也因为如此,有个开发团队就提出了ERC-3475,它拥有以下特点
- 支援多个token ID
- 可储存链上metadata
- 没有硬性规定metadata 的资料结构
- 有经过gas 优化
- 可以在第三方钱包或是交易所中读取这些token 的余额以及赎回条件
- 这些债券可以被批量传送(batch transaction),收到的人也可以把它分割后操作
进入正文…
一、何谓债券
一言以蔽之,债券是投资人借钱给政府或公司的凭证,通常债券的发行方(政府/公司)会跟投资人约定给付利息的方式与到期返还的金额。
其实债券跟定存很像,差别在于你放钱的地方从银行变成政府/银行/一般企业,而且债券的利率较高、可以在次级市场交易。
投资人承担的风险
- 信用风险:如果发行机构信用变差,投资人会担心该机构还不出本金,这时会纷纷出手卖出,该机构债券价格就会变低。
- 利率风险:如果市场利率高于债券票面利率,这时投资人会去投资市场,而不购买债券,债券价格就会下跌;反之如果市场利率低于债券票面利率,买债券反而赚钱,这时投资人会去投资债券,债券价格就会上涨。
债券通常需要明确记载
- 票面金额:发行机构于约定日支付投资人特定金额。
- 票面利率:投资人可以领取到的利息。
- 付息期间:债券多久给付一次利息。
- 到期期间:债券到期日期。
二、债券的信任成本
一直以来,债券都是金融行业的重要组成。然而,其低风险的特性也决定了只有政府、通过债券管理部门审查的公司才能发行,这部分是在降低风险以及建立信任。
在贷款过程中增加中间商和监管会导致高额费用,而且手续处理的时间可能达到几周之久。简而言之,高额的费用以及冗长的时间是这个机制的信任成本,使债券的发展受到极大的限制。
三、Web3解放中心化的债券发行
Web3 将逻辑写在智能合约中,以强制交易者履行契约,不同产品也会有不同的共识机制认证不同身份的使用者所应执行的责任,使去中心化这种分散式的运作模式可以在一定程度上获得保障。
既然web3 的性质可能可以将信任成本降低,那么,将债券这个香香的金融商品到web3 好像就有那么一点立场了,不过正如我们前面提到的,现在的ERC-20 所含的功能实在太少,怎么说呢?我举三个用ERC-20 来做债券的缺点:
1.因为ERC-20 本身只能定义九个最基本的资讯,债券的到期日、票面利率等等资讯无法写入,因此要部署新的智能合约,增加负担。
2.不同类型的债券必须写出不同智能合约,而每个开发团队写的智能合约也会不同,多样性太多就容易产生漏洞,若有不慎就会被骇,造成投资者血亏。
看看这几个月被骇了多少protocol,就算经过审计,照样会被骇几亿美元。我爱罗的绝对防御,也会被千鸟破防。
3.在送出交易时要花更多gas fee。
讲到这里,读者应该可以初步理解ERC-3475 想达到什么效果了,我也不卖关子
定义出一个可以储存更多资讯的token 标准,使DeFi 的玩法更多样化且更安全
小小的反思
以去中心化的方式去运作债券的模式虽然可以把信任成本降低,但回归到债券的本质,其实还是存在一个盲点,那就是我们怎么确保借款人会还钱?
如果没有经过繁琐的流程确保借款人的还款能力,那还能称为避险吗?对此我的看法是,web3 上的P2P lending 可能还会需要一些时间来发展出计算信用的机制或是强制还款的方式,现在正夯的DID 是否会是一个突破口?
话虽如此,但用这个模式来进行B2C 募资,感觉是有搞头的,我已经有个不错的想法,有兴趣的可以跟我讨论一下。
telegram:@gregshen0925
email: gregshen0925@proton.me
回到ERC-3475
建立一个多功能的token 标准,降低被骇风险
他究竟有什么好处?为什么我在标题提到他可能取代ERC-20?其实刚刚就提到过ERC-20 所包含的功能与资讯不够多,写太多不同智能合约可能会有很多被骇的机会,不如直接统一token 的标准,令其可以有多一点功能。
扩展了现有叫流行的token 标准
ERC-3475 不但延伸了ERC-20, ERC-721, ERC-1155,并额外增加了一些功能,除了将债券会用到的资讯、功能直接写进这个token 标准,也提供token更多的玩法。
ERC-3475特色
- 支援多个token ID
- 可储存链上metadata
- 没有硬性规定metadata 的资料结构
- 有经过gas 优化
- 可以在第三方钱包或是交易所中读取这些token 的余额以及赎回条件
- 这些债券可以被批量传送(batch transaction),收到的人也可以把它分割后操作
四、ERC-3475 的Interface
那么ERC-3475 具体是新增了什么function?又将什么资料存在token 资讯中?我把interface 中比较特别的function 几个抓出来说明下。
transferFrom
function transferFrom(address _from, address _to, Transaction[] calldata _transactions) external;
将债券从_from传给_to ,提到这个基本的function 主要是想介绍_transaction是债券资讯,形式为['classId', 'nonceId', '_amountBonds']。
- classId:债券的种类代号
- nonceId:nonce 的Id,这个nonce 并不是我们熟知的transaction 流水号,而是如下图所示,其中_values 又是一个用到IERC3475.Values 结构的mapping,真的包含很多资讯
- _amountBonds:债券数量
举个例子
function transferFrom(address1, address2, [[1, 42, 500000000]]);
意思是从address1传送500000000个债券类别1 、 nonceId为42的债券到address2
issue (发行)
function issue(address _to, Transaction[] calldata _transaction) external;
- 向_to发行_transaction (债券资讯)
- 只有债券发行者可以调用issue
redeem(赎回)
function redeem(address _from, Transaction[] calldata _transactions) external;
- 调用redeem的地址一定要是发行债券的地址
- 发行者会从_from赎回债券
- 开发时要记得设定让redeem在债券到期时执行。
- 开发时要记得设定只能被银行或是次级市场造市商调用。
burn(销毁)
function burn(address _from, Transaction[] calldata _transactions) external;
- burn只能被controller 合约调用。
- _from是要被burn掉的债券的持有者地址。
- 开发时要记得设定让burn在债券到期时执行。
- 开发时要记得设定只能被银行或是次级市场造市商调用。
可调用的Supply分四种
totalSupply
function totalSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
当我们调用totalSupply,会回传以下三种supply的值:
- redeemedSupply
- activeSupply
- burnedSupply
redeemedSupply(已赎回量)
function redeemedSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
activeSupply(流通量)
function activeSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
burnedSupply(已销毁数量)
function burnedSupply(uint256 classId, uint256 nonceId) external view returns (uint256);
balanceOf
function balanceOf(address _account, uint256 _classId, uint256 _nonceId) external view returns (uint256);
回传_account所持有的“债券种类为_classId , nonceId为_nonceId “的债券数量
Metadata分三种
这里会比较复杂,这篇文章只讲Interface 及简单概念!建议开发者要开发的时候去参考ERC3475 实做的合约。
nonceMetadata
function nonceMetadata(uint256 classId, uint256 metadataId) external view returns (Metadata memory);
- 以JSON 形式回传nonces 的metadata
- metadata 必须遵守定义好的结构,如下图所示
classMetadata
function classMetadata(uint256 metadataId) external view returns (Metadata memory);
- 以JSON 形式回传classes 的metadata
- metadata 必须遵守定义好的结构,如下图所示
classValues
function classValues(uint256 classId, uint256 metadataId) external view returns (Values memory);
- 任何人都可以读取不同债券类别的Values
- 复习一下,classId 是债券种类的代号
- values 必须遵守在class metadata 中定义好的不同mapping 的结构
- 回传class metadata 中的Values,例如[string, uint, address]
nonceValues
function nonceValues(uint256 classId, uint256 nonceId, uint256 metadataId) external view returns (Values memory);
- 任何人都可以读取不同债券类别、 nonceId的Values
- values 必须遵守在不同mapping 中的metadata中所定义好的不同的结构
- 回传class metadata 中的Values,例如[string, uint, address]
getProgress
function getProgress(uint256 classId, uint256 nonceId) external view returns (uint256 progressAchieved, uint256 progressRemaining);
- 回传代表债券到期日的参数
- 赎回的条件必须被定义在一个或数个internal function
- progressAchieved可以用来定义债券目前的状态,例如流动性百分比、时间等等
- progressRemaining则是用来定义剩余的时间等等资讯
以上就是Interface 中比较需要提到的内容,至于细项、后续还能拿来做什么应用,我想篇幅也比较长了,就留到下次再说吧!
在研究时觉得文件中有些参数容易混肴,在这边也感谢D/Bond的core dev主动来看我文章并且给予支持!
参考资料
EIP-3475: Abstract Storage Bonds
EIP-3475/IERC3475.sol at main · Debond-Protocol/EIP-3475
投资工具介绍|什么是债券? | 永丰ibrAin | 永丰银行
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!
- 来自作者
- 相关推荐