usdt合约分析(以太坊主链) - 2023-02-18

注:

仅作技术交流,禁止商用

如有侵权,请联系删除

以太坊主链-稳定币合约对比(busd, usdc, dai, luna, ust)



usdt合约简介


usdt 合约架构

合约描述

    地址:0xdac17f958d2ee523a2206206994597c13d831ec7

    基于erc20实现,拥有黑名单,暂停管理,便捷更新等功能

    通过Tether公司中心化运营来保证对美元的锚定

    通过把owner地址设置为  多签合约  实现一定的安全性

主体合约结构

    TetherToken(solidity ^0.4.17)

核心合约结构

    ownable —— 代币管理员合约

    erc20basic + erc20 —— erc20提案的3大接口

    pausable —— 代币暂停合约

    blackList —— 黑名单管理合约

    safeMath —— 数学安全计算库

    upgradeStandardToken —— 代币扩展接口

usdt合约重点功能实现 —— erc20协议实现


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)

合约重点功能实现 —— 代币管理权限及转移

ownable合约实现

说明:usdt实现了一个ownable接口用于进行合约的管理,进行一些简单的接口权限校验,所有者转移等操作,提高安全性

合约接口:Ownable

实现:

    1 构造函数中,将合约的部署者设置为合约所有者

    2 提供了modifier onlyOwner作为“注解”提供给需要进行权限校验的接口,如添加删除黑名单,代币增发赎回等操作。

    3 提供了接口transferOwnership用于转移合约的所有者到另一个[非0]地址

合约重点功能实现 —— 代币紧急暂停恢复

pausable合约实现

说明:usdt实现了一个Pausable接口用于进行合约的紧急管理(暂停和恢复),便于运行过程中对于未知安全风险的预防

合约接口:Pausable

实现:

    1 提供了pause和unpause2个接口用于更新合约状态,要求调用者必须是所有者,并且处于其他状态(如pause需要当前合约处于paused=true的状态)

    2 提供了modifier whenNotPaused和whenPaused作为“注解”提供给需要校验合约运行状态的接口,比如transfer, transferFrom等接口需要合约处于正常状态才能进行,否则拒绝执行

    3 当发生了暂停或恢复的状态变更时,抛出日志事件

合约重点功能实现 —— 代币用户黑名单

blackList合约实现

说明:用于黑名单地址的管理,进入黑名单的用户无法进行交易(可接受和查看),以及销毁黑名单地址代币余额,仅允许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)   

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 不上不下的生活,就是你明明想改变自己,却觉得自己像被卡住了一般,明明付出了努力,却不知道付出的努力到哪里去了。你不...
    遇见yh阅读 88评论 0 2
  • 我生来便是孤独的,而后也孑然一身,到底无法逃脱命运的安排
    桃匋阅读 221评论 0 1
  • 今天上午9:47,把小林coding的图解mysql部分看完了,总共看了嗯,大约六天,的每个上午当然了实际时间更短...
    景之_阅读 93评论 0 2
  • 自我价值评判标准 天赋和能力,达不到自己渴望的结果。 没有名,没有利,也没有荣誉,我一无所有,还到处欠债,欠了一堆...
    我心我愿秀阅读 73评论 0 0
  • 二十一世纪旧体诗词风骚榜[//www.greatytc.com/c/da968ae2d498] 上榜絮语...
    张成昱阅读 469评论 1 20