問題
署名付きトランザクションを発行したいが、秘密鍵をコード側に記述したくない。
そこで、MetaMaskのweb3を使いたいが、なぜか使えない。
web3.currentProvider.selectedAddress
の返り値がnull
になってしまう。
当然、web3.eth.accounts[0]
の返り値もundefined
になる。
解決策
ethereum.enable()
を実行して、Webサイトからのアクセスを許可する。
原因
バージョン4.18以降のMetaMaskでは、PrivacyModeというオプションが追加されたみたいです。
そして、7.0以降では全てのユーザにおいて、PrivacyModeがデフォルトの設定になっています。
そのため、従来の初期化方法では、MetaMaskのアカウントにアクセスができなくなっているようです。
許可前のethereum
ではselectedAddress
がnull
ですが、許可後は値が入っています。
ethereum.enable()
の実行後にポップアップで、許可するか聞かれます。許可すれば、アカウントアドレスを取得することができます。
余談
これまでは window.web3 = new Web3(web3.currentProvider);
のようにプロバイダを使ってWeb3を初期化していましたが、
これからは window.web3 = new Web3(ethereum);
のように初期化するのが、いいみたいです。詳しくは、公式DocやMediumを参照してください。
ちなみにMetaMaskは2020年3月14日時点でバージョン7.7.8のようです。