Gnosis Safe 是一个在以太坊使用相当广泛的多签钱包实现。本文旨在解析该合约在链上创建多签钱包的详细流程与技术细节。

钱包概览

Gnosis Safe 多签钱包的所有操作都是在链上进行的,包括创建合约与发送交易等。这笔交易就是我在 Rinkeby 以太测试网上创建钱包的一笔交易:
2022-07-05T01:53:19.png

实际上,这笔交易是一次合约调用,由被调用的合约负责创建了这个钱包。

合约解析

查看收款合约的概览可得知,负责创建钱包的合约名为 GnosisSafeProxyFactory
2022-07-05T01:57:01.png

查看交易的输入数据,可以看到Etherscan已经解析了部分输入了:

Function: createProxyWithNonce(address _singleton, bytes initializer, uint256 saltNonce)

MethodID: 0x1688f0b9
[0]:  000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee709552
[1]:  0000000000000000000000000000000000000000000000000000000000000060
[2]:  00000000000000000000000000000000000000000000000000000181b7857c3e
[3]:  0000000000000000000000000000000000000000000000000000000000000184
[4]:  b63e800d00000000000000000000000000000000000000000000000000000000
[5]:  0000010000000000000000000000000000000000000000000000000000000000
[6]:  0000000200000000000000000000000000000000000000000000000000000000
[7]:  0000000000000000000000000000000000000000000000000000000000000000
[8]:  00000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33a
[9]:  ec0fe5e400000000000000000000000000000000000000000000000000000000
[10]: 0000000000000000000000000000000000000000000000000000000000000000
[11]: 0000000000000000000000000000000000000000000000000000000000000000
[12]: 0000000000000000000000000000000000000000000000000000000000000000
[13]: 00000002000000000000000000000000e0cab803e4635e50ee2f27d77b2543df
[14]: 5537941300000000000000000000000074a6a114a128b67b738581e366065564
[15]: 3f49fb9900000000000000000000000000000000000000000000000000000000
[16]: 0000000000000000000000000000000000000000000000000000000000000000

解析这些数据,可以看到函数的实参:

#    Name            Type     Data
0    _singleton      address  0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552
1    initializer     bytes    0xb63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000e0cab803e4635e50ee2f27d77b2543df5537941300000000000000000000000074a6a114a128b67b738581e3660655643f49fb990000000000000000000000000000000000000000000000000000000000000000
2    saltNonce       uint256  1656641387582

我们可以看到,函数一共有_singleton、initializer和saltNonce一共三个参数。

点进_singleton的值查看其详细信息,发现其实际上是合约 GnosisSafe 的一个实例。结合合约代码注释可得知,参数 _singleton 实际上就是部署合约 GnosisSafe 的地址。

initializer 则在调用函数deployProxyWithNonce部署钱包之后,使用call指令对部署的 proxy 合约进行初始化调用。initializer 作为合约调用代码,遵守以太坊合约调用ABI。其开头便是合约ID b63e800d,到 GnosisSafe 合约中查找,可知其调用的函数为 function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns()

saltNonce 根据其合约注释以及实际操作,发现其只是一个用来将合约地址随机化的盐,其具体作用机制我们稍后再讲。

setup 概览

解析 initializer 的内容,可得 setup 的实参为:

_owners          [0xe0cab803e4635e50ee2f27d77b2543df55379413, 0x74a6a114a128b67b738581e3660655643f49fb99]
_threshold       2
to               0x0000000000000000000000000000000000000000
data             0x
fallbackHandler  0xf48f2b2d2a534e402487b3ee7c18c33aec0fe5e4
paymentToken     0x0000000000000000000000000000000000000000
payment          0
paymentReceiver  0x0000000000000000000000000000000000000000

未完

标签: none

添加新评论