GUSD初览
USDT已经是交易所的标配,后来又有TUSD,最近又出了个GUSD,而且是正规监管(州一级)审批。
支持以太坊ERC20,带给我们很大的一个好处就是,我们可以直接从源码来研究一下它的实现。
GUSD是什么
9月10日,Gemini和Paxo正式宣布推出受纽约金融服务局(NYDFS)批准的合规稳定币:Gemini Dollar(GUSD)
特点:
- 以太坊ERC20代币
- 由纽约信托公司Gemini发行
- 与美元1:1锚定
- 受纽约金融服务局监管
- 独立第三方审计
代码一览
在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核心逻辑,同时扩展了以下几个功能:
- 改变token供应量
- 批量转帐
- 支出审批的相应变化
- 委托转移控制
看名字有些功能也理解不了,具体来看看这几个功能:
改变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合约观察地:0x056fd409e1d7a124bd7017459dfea2f387b6d5cd:https://etherscan.io/address/0x056fd409e1d7a124bd7017459dfea2f387b6d5cd#readContract
前面说了托管地址可以是用户地址也可以是合约地址,GUSD的custodian地址为:0x9A7b5F6e453d0cDa978163Cb4a9A88367250a52d,这也是一个合约。
erc20Impl地址为:0x6704ba24b8640BCcEe6BF2fd276a6a1b8EdF4Ade,ERC20的真正实现,这必须是一个合约,这个合约的custodian地址为:0x72519fa6cd095C99d5d67e31ddc117409Bc5c047,同样是另一个合约。
结论
GUSD合约的可升级并不是修改以太坊上已发布的合约,而是修改代理合约中的变量,这个变量指向真正的ERC20合约。
GUSD合约的实现在ERC20的基础上加上了中心化的控制,可以更改合约,但是在以太坊上方便监管和审计。
Leave GUSD初览 to:
Read more #gusd posts
Best Posts From 老鱼
We have not curated any of chaimyu's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.