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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章