這裏我想通過公開的數據獲取到足夠的信息,最後儘量能重現創建我的錢包合約的整個過程。
我錢包裏的看到的那個地址上回說了是一個智能合約地址,這和傳統的以太坊外部賬號地址不同。仔細研究這個智能合約,發現它只是一個代理合約。這個合約真正的功能實現是另有其人,就是合約裏的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