注:
仅作技术交流,禁止商用
如有侵权,请联系删除
以太坊主链-稳定币合约对比(busd, usdc, dai, luna, ust)
usdt合约简介
合约描述
地址:0xdac17f958d2ee523a2206206994597c13d831ec7
基于erc20实现,拥有黑名单,暂停管理,便捷更新等功能
通过Tether公司中心化运营来保证对美元的锚定
通过把owner地址设置为 多签合约 实现一定的安全性
主体合约结构
TetherToken(solidity ^0.4.17)
核心合约结构
ownable —— 代币管理员合约
erc20basic + erc20 —— erc20提案的3大接口
pausable —— 代币暂停合约
blackList —— 黑名单管理合约
safeMath —— 数学安全计算库
upgradeStandardToken —— 代币扩展接口
usdt合约重点功能实现 —— erc20协议实现
说明:usdt将erc20的接口拆分为2个分别实现,允许未来切换到其他合约实现而不用大改当前合约
合约接口:erc20basic和erc20
实现:
1 合约BasicToken实现了erc20basic合约,有了基础的货币交易功能
实现了transfer接口,代币供应量,代币余额查询管理等
并且做了短地址攻击的防御应对
2 合约StandardToken实现了erc20合约,有了授权交易的功能
实现了transferFrom, approve接口,交易利率, 授权额度管理等
特点:
1 安全性:如溢出处理,owner校验,短地址攻击的防御,先减再加
2 approve接口避免交易竞争:不允许在有额度场景下设置其他非0值(busd等稳定币合约无此要求)
3 usdt对于erc20协议的实现并不标准(核心接口没返回state)
合约重点功能实现 —— 代币管理权限及转移
说明:usdt实现了一个ownable接口用于进行合约的管理,进行一些简单的接口权限校验,所有者转移等操作,提高安全性
合约接口:Ownable
实现:
1 构造函数中,将合约的部署者设置为合约所有者
2 提供了modifier onlyOwner作为“注解”提供给需要进行权限校验的接口,如添加删除黑名单,代币增发赎回等操作。
3 提供了接口transferOwnership用于转移合约的所有者到另一个[非0]地址
合约重点功能实现 —— 代币紧急暂停恢复
说明:usdt实现了一个Pausable接口用于进行合约的紧急管理(暂停和恢复),便于运行过程中对于未知安全风险的预防
合约接口:Pausable
实现:
1 提供了pause和unpause2个接口用于更新合约状态,要求调用者必须是所有者,并且处于其他状态(如pause需要当前合约处于paused=true的状态)
2 提供了modifier whenNotPaused和whenPaused作为“注解”提供给需要校验合约运行状态的接口,比如transfer, transferFrom等接口需要合约处于正常状态才能进行,否则拒绝执行
3 当发生了暂停或恢复的状态变更时,抛出日志事件
合约重点功能实现 —— 代币用户黑名单
说明:用于黑名单地址的管理,进入黑名单的用户无法进行交易(可接受和查看),以及销毁黑名单地址代币余额,仅允许owner操作
合约接口:BlackList
实现:
1 构造函数中,将所有者设置为合约的部署者
2 销毁某个黑名单地址上的代币资产的时候,要求某个资产必须先在黑名单中,其次进行获取并扣除该地址的代币余额,再扣减整个代币的发行总量
3 添加,删除黑名单,以及删除黑名单地址代币资产时,均会抛出对应的日志事件
合约重点功能实现 —— 主体合约功能
说明:usdt在以太坊上的主体合约, 相关操作均由该合约实现, 包括前述功能,以及代币的增发赎回等
合约接口:TetherToken
实现:
1 构造函数中(即合约部署时): 指定了合约的全名,代号,小数位数,是否已废弃(deprecated)以及新合约地址
2 各个接口均有过期判定,如果当前合约已过期,就通过新版本合约的地址实现功能, 否则使用基类(StandardToken)对应接口
3 代币增发时加到owner地址。代码上先加owner余额再加总发行量
4 代币赎回时从owner地址删除。代码上先减总发行量
5 各操作均会抛出对应的日志事件
特点:
1 调用新合约时,传入了调用者的信息,避免新合约没有sender信息
合约重点功能实现 —— 合约便捷更新管理
说明:用于便捷的进行usdt的合约升级,并且整个过程中仍然保持旧合约的正常访问
合约接口:UpgradedStandardToken
实现:
1 当前usdt合约里未实现这个合约接口
2 更新数据流:以太坊上新地址A发布usdt新合约——usdt当前合约设置为deprecated, 并填入新合约地址A——各个接口的访问通过访问地址A上的合约对应接口实现(如transfer, approve等)
3 3个主要接口携带的参数均多了一个发起者地址
新合约无法直接获取调用者地址(a合约调用b合约)
合约重点功能实现 —— 合约安全管理(多签合约)
说明:usdt通过把合约owner部署为一个多签钱包合约地址来完成绝大部分的风险管控。代币增发等重要操作需要3个及以上的管理人员同意。
合约:MultiSigWallet
实现:
数据结构
transctions -> 提案id和对应的提案信息,包括目标地址,是否已执行,以及执行时的参数和函数信息
confirmations -> 各管理人员的同意情况
isOwner, owners -> 管理人员名单,方便遍历
required -> 最低提案同意人数
提案及执行数据流:
提案后,多个管理人员各自访问合约的confirmTx接口同意提案
submitTx(提交提案): 提交提案,无权限验证,由add和confirm构成
addTx(添加提案):生成txId和结构, 并添加到映射txs。校验权限
confirmTx(确认提案):默认提交者同意提案。检查并尝试执行提案
executeTx(执行提案):如果同意的人数超过了要求,就发起执行。
执行方式:tx.destination.call.value(tx.value)(tx.data)