metamask 注入的 window.ethereum 和 web3.js 之间有什么关系吗?我们可以同时使用吗?

Is there some relation between window.ethereum injected by metamask and web3.js? Can we use both?

我正在学习 DApp 编程,出现的一个问题是 Metamask 注入的 API 和 web3.js 之间的区别。据我了解,MetaMask 注入了一个对象,它有自己的 API,与 web3.js 库无关。这个对吗?我还能在 MetaMask 中使用 web3.js 库吗?在后一种情况下,我该怎么做?如果有人可以进一步解释这种差异,我将不胜感激。谢谢!

web3 是一些客户可能仍在使用的旧实现,

window.ethereum 是新的 api。由于一些客户仍在使用 web3,我们仍应检查它。

Metamask 将您连接到区块链。区块链由数据块组成,这些数据块存储在节点上。没有节点,您无法访问区块链数据。

MetaMask 允许通过 Infura (https://infura.io) 提供的基础设施连接到以太坊区块链。这允许用户与区块链交互,而无需在本地安装任何节点。 infura 连接到 到不同环境的不同节点,比如mainnet, rinkeby, ropsten等

web3js 或 web3py 库与元掩码 web3 无关。 Metamask 为 web3.js 库提供了一个提供者。该提供商告诉 web3.js 图书馆我们要与哪个网络通信,然后连接到该网络中的一个节点。

获得提供者后,实例化一个 web3 实例:

   const web3 = new Web3(provider);

然后你创建一个合约实例

contract = new web3.eth.Contract(
      Contract.abi,
      Contract.address
    );

现在 contract.methods 您可以调用合约上的方法。 web3js 库也提供了太多的实用函数,比如散列、转换单位等