Metamask
查看 sendTransaction 實現
我想看看在提供者中實現
getAccounts
的程式碼sendTransaction
。我嘗試深入研究 Metamask 原始碼並找到 Metamask 提供Web3 提供程序的行,但我無法弄清楚該提供程序在哪裡實現
sendTransaction
或getAccounts
.這些方法是如何/在哪裡實施的?
我建議查看將MetaMask 移植到新環境的指南。即使您沒有移植 MetaMask,它也很有用,因為它解釋了項目組織。
getAccounts
如果您在 MetaMask 中搜尋,您會在createMetamaskMiddleware.js中找到它。它將它與其他功能一起傳遞給createWalletSubprovider
createWalletSubprovider({ getAccounts, processTransaction, processEthSignMessage, processTypedMessage, processTypedMessageV3, processTypedMessageV4, processPersonalMessage, }),
在單獨的repo中提供。該中間件將 JSON-RPC 請求映射到 MetaMask 擴展中的函式。
- eth_accounts => getAccounts
- eth_sendTransaction => processTransaction
您可以確定檢查函式呼叫
createMetamaskMiddleware
時的參數的函式的實現。如果您遵循一些躍點,您會發現它是在MetamaskController.initializeProvider完成的
例如,您有
getAccounts
:getAccounts: async ({ origin }) => { // Expose no accounts if this origin has not been approved, preventing // account-requring RPC methods from completing successfully const exposeAccounts = this.providerApprovalController.shouldExposeAccounts(origin) if (origin !== 'MetaMask' && !exposeAccounts) { return [] } const isUnlocked = this.keyringController.memStore.getState().isUnlocked const selectedAddress = this.preferencesController.getSelectedAddress() // only show address if account is unlocked if (isUnlocked && selectedAddress) { return [selectedAddress] } else { return [] } }