argent钱包软件转账免手续费之谜——钱包合约初始化细节

这里我想通过公开的数据获取到足够的信息,最后尽量能重现创建我的钱包合约的整个过程。

我钱包里的看到的那个地址上回说了是一个智能合约地址,这和传统的以太坊外部账号地址不同。仔细研究这个智能合约,发现它只是一个代理合约。这个合约真正的功能实现是另有其人,就是合约里的implementation变量存储的智能合约地址。

contract Proxy {

    address implementation;
...
}

经过分析智能合约代码,发现是从它的创建者合约传入的该地址,而这个值是0xb6d64221451edbac7736d4c3da7fc827457dec03 

这个地址上的智能合约名是BaseWallet,而创建它的是一个外部账号,这样后面就不用深入它的创建者了。

暂时捋一下过程,

(1)先用外部账号部署BaseWallet合约上链

(2)再用外部账号部署WalletFactory合约上链,并把BaseWallet合约地址传入WalletFactory合约的构造函数;

(3)创建Proxy合约的时候,会把BaseWallet合约地址穿给Proxy的变量implementation作为它的功能实现的合约。

implementation这个问题解决了,接下来看看创建Proxy合约的整个技术流程,看最上层的代码:

function createCounterfactualWalletWithGuardian(
        address _owner,
        address[] calldata _modules,
        string calldata _label,
        address _guardian,
        bytes32 _salt
    )
        external
        onlyManager
        guardianStorageDefined
    {
        require(_guardian != (address(0)), "WF: guardian cannot be null");
        _createCounterfactualWallet(_owner, _modules, _label, _guardian, _salt);
    }

这里就有一系列疑问了:

(1)_owner是哪个地址,是外部账号还是合约账号?

(2)注册了那些模块?

(3)guardian又是哪个地址?

(4)_salt又是哪些数据?

现在目前能确定的也就是_label了,这个就是钱包里的ENS字符串,比如我的就是lilianwen.argent.xyz。因为这些数据都是通过外部输入链上的,所以不能马上确认其内容。试试能不能通过一些蛛丝马迹查明真相。

只能从原点再开始查了,看看我的钱包合约有哪些Event,说不定有什么线索

这两个事件不知道是哪些,只好通过分析源代码,大胆测猜测+检测了。

经过本人各种怼代码+测试+观察,终于把这里的所有event顺序都搞清楚了。

这里有个很重要的地方,看event和代码关联的时候,要从下往上看,才能对应到代码的执行顺序。

event log对应的提交顺序如下:

WalletFactory::createCounterfactualWalletWithGuardian
    --WalletFactory::_createCounterfactualWallet
        --WalletFactory::_configureWallet
            --BaseWallet::init
                --emit AuthorisedModule(WalletFactory, true)
                --emit AuthorisedModule(TransferManager, true)
                ---TransferManager::init
                    ---BaseWallet:: emit enableStaticCall(this, ERC1271_ISVALIDSIGNATURE_BYTES)
                    ---BaseWallet:: emit enableStaticCall(this, ERC1271_ISVALIDSIGNATURE_BYTES32)
                --emit AuthorisedModule(CompoundManager, true);
                --emit AuthorisedModule(ApprovedTransfer, true);
                --emit AuthorisedModule(RecoveryManager, true)
                --emit AuthorisedModule(LockManager, true)
                --emit AuthorisedModule(NftTransfer, true)
                ---NftTransfer::init
                    ---BaseWallet:: emit enableStaticCall(this, ERC721_RECEIVED);
                --emit AuthorisedModule(GuardianManager, true)
                --emit AuthorisedModule(MakerManager, true)
                --emit AuthorisedModule(MakerV2Manager, true)
                --emit AuthorisedModule(TokenExchanger, true)
                --emit Received(address(this).balance, address(0), "");
            WalletFactory::_registerWalletENS
                --BaseWallet::invoke
                    --emit Invoked(msg.sender, _target, _value, _data);

可以看到注册了非常多的模块,总共有10个模块被注册了。这里解答了第二个问题,还有第一三四没解答,看看有其他信息能找到不。在WalletFactory Event log找到这条日志:

这下只剩下第四个问题没有答案了。再仔细查阅源代码,发现不可能通过日志找到了,因为整个流程里,这个_salt都没有被打印到日志里去。这就意味着这个内容只有argent官方知道了。

终结一下:

由于_salt字段没有公开,所以无法知道在创建我的钱包合约的时候,用的是什么内容,也就无法重现创建我的钱包合约的整个过程。

(全文完)

 

参考资料:

https://etherscan.io/address/0x8b55c928602896a1e078e23a3fee33393821eec7#events

https://github.com/argentlabs/argent-contracts

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值