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的基础上加上了中心化的控制,可以更改合约,但是在以太坊上方便监管和审计。
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,这个可是我们华人团队开发的哦。如果不想再收到我的留言,请回复“取消”。