Metamask

查看 sendTransaction 實現

  • September 15, 2019

我想看看在提供者中實現getAccounts的程式碼sendTransaction

我嘗試深入研究 Metamask 原始碼並找到 Metamask 提供Web3 提供程序的行,但我無法弄清楚該提供程序在哪裡實現sendTransactiongetAccounts.

這些方法是如何/在哪裡實施的?

我建議查看將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 []
   }
 }

引用自:https://ethereum.stackexchange.com/questions/74824