GUSD初览

in #gusd6 years ago

USDT已经是交易所的标配,后来又有TUSD,最近又出了个GUSD,而且是正规监管(州一级)审批。

支持以太坊ERC20,带给我们很大的一个好处就是,我们可以直接从源码来研究一下它的实现。

GUSD是什么

9月10日,Gemini和Paxo正式宣布推出受纽约金融服务局(NYDFS)批准的合规稳定币:Gemini Dollar(GUSD)

特点:

  1. 以太坊ERC20代币
  2. 由纽约信托公司Gemini发行
  3. 与美元1:1锚定
  4. 受纽约金融服务局监管
  5. 独立第三方审计

代码一览

在etherscan上可以找到合约代码,地址为:https://etherscan.io/address/0x056fd409e1d7a124bd7017459dfea2f387b6d5cd#code


LockRequestable

合约通过generateLockId()函数产生唯一标识

    function generateLockId() internal returns (bytes32 lockId) {
        return keccak256(block.blockhash(block.number - 1), address(this), ++lockRequestCount);
    }

唯一标识由内置函数keccak256()生成,参数为:前一块哈希、合约地址、锁计数


CustodianUpgradeable

提供更新时可重用代码。(不是以太坊合约无法更新吗?后面看看都做啥的!)

托管地址可以是一个帐号,也可以是一个合约地址。

    mapping (bytes32 => CustodianChangeRequest) public custodianChangeReqs;

这个mapping存放托管人变动请求,key就是LockRequestable生成的。

    modifier onlyCustodian {
        require(msg.sender == custodian);
        _;
    }

onlyCustodian保证同意变化(confirmCustodianChange)时必须是原托管人。

好久没看solidity合约(本来没看过几个~),几个语法不认识了:

  • emit 在一个事件前面调用
  • delete 一般变量等同于赋缺省值,直接delete mapping无效,但可以删除成员
  • storage 分配到合约永久存储空间,合约支持的几种内存数据:storage、memory、stack。状态变量使用storgae,函数参数使用memory,局部变量mapping、struct、array缺省使用storgae,其它局部变量使用stack。

看起来这个合约只提供了修改托管者地址的功能,可重用代码呢?


ERC20ImplUpgradeable

contract ERC20ImplUpgradeable is CustodianUpgradeable  {

内部有真正ERC20对象,如下:

    ERC20Impl public erc20Impl;

此合约同样的实现了类似CustodianUpgradeable合约的接口,可以改变erc20Impl对象地址。

contract ERC20ImplUpgradeable is CustodianUpgradeable  {

ERC20Interface

ERC20标准接口声明,Interface。


ERC20Proxy

contract ERC20Proxy is ERC20Interface, ERC20ImplUpgradeable {

ERC20代理接口,实际调用合约“ERC20ImplUpgradeable”中对象“erc20Impl”接口

contract ERC20Proxy is ERC20Interface, ERC20ImplUpgradeable {

ERC20Impl

contract ERC20Impl is CustodianUpgradeable {

此合约实现ERC20核心逻辑,同时扩展了以下几个功能:

  1. 改变token供应量
  2. 批量转帐
  3. 支出审批的相应变化
  4. 委托转移控制

看名字有些功能也理解不了,具体来看看这几个功能:

改变token供应量

同样有struct定义了供应量的变化请求,如下:

    struct PendingPrint {
        address receiver;
        uint256 value;
    }

两个函数实现了请求发布、确认发布token,如下:

    function requestPrint(address _receiver, uint256 _value) public returns (bytes32 lockId);
    function confirmPrint(bytes32 _lockId) public onlyCustodian;

注意“Print”是发布的意思,不是打印...

批量转帐

提供了接口可以给批量地址转帐,减少交易矿工费用和交互次数,例如用在空投等:

    function batchTransfer(address[] _tos, uint256[] _values) public returns (bool success) {

此合约实现很多是对“ERC20Proxy”和“ERC20Store”的操作。

sweep相关功能没仔细看,有时间再看下。

ERC20Store

contract ERC20Store is ERC20ImplUpgradeable {

此合约没有逻辑,主要记录token总量、地址对应余额、地址允许额度。

GUSD合约观察

GUSD合约观察地:0x056fd409e1d7a124bd7017459dfea2f387b6d5cdhttps://etherscan.io/address/0x056fd409e1d7a124bd7017459dfea2f387b6d5cd#readContract

前面说了托管地址可以是用户地址也可以是合约地址,GUSD的custodian地址为:0x9A7b5F6e453d0cDa978163Cb4a9A88367250a52d,这也是一个合约。

erc20Impl地址为:0x6704ba24b8640BCcEe6BF2fd276a6a1b8EdF4Ade,ERC20的真正实现,这必须是一个合约,这个合约的custodian地址为:0x72519fa6cd095C99d5d67e31ddc117409Bc5c047,同样是另一个合约。

结论

GUSD合约的可升级并不是修改以太坊上已发布的合约,而是修改代理合约中的变量,这个变量指向真正的ERC20合约。

GUSD合约的实现在ERC20的基础上加上了中心化的控制,可以更改合约,但是在以太坊上方便监管和审计。

Sort:  

Hello! Your post has been resteemed and upvoted by @ilovecoding because we love coding! Keep up good work! Consider upvoting this comment to support the @ilovecoding and increase your future rewards! ^_^ Steem On!

Reply !stop to disable the comment. Thanks!

你今天过的开心吗?快来使用超级好用的steemit客户端---Partiko,这个可是我们华人团队开发的哦。如果不想再收到我的留言,请回复“取消”。

Coin Marketplace

STEEM 0.27
TRX 0.11
JST 0.031
BTC 67241.02
ETH 3727.25
USDT 1.00
SBD 3.77