我们在进行测试的时候,如果使用ganache,那么就是会用ganache提供的provider
const web3 = new Web3(ganache.provider());
我们进行合约部署的时候,可以使用infura提供的provider
let provider = new HDWalletProvider(mnemonic, "https://rinkeby.infura.io/v3/2b86c426683f4a6095fd175fe931d799");
const web3 = new Web3(provider);
但是注意上面的mnemonic是12个账户助记词,这12个词是合约部署者的
在和以太坊的交互中,面对的成千上百的用户,如果用户都使用部署者的账户,大量的操作消耗gas都是部署者的账户中的钱
因此在交互中,这里应该换为用户使用的钱包的provider,例如metamask的provider
我们只要装了metamask插件,那么浏览器中就被注入了web3
没装当然就是没有的
浏览器无web3.png因此我们是可以拿到用户的provider的
但是!!!
低版本Web3.png
这个web3的版本是相当低的,1.0的在进行紧张的测试中,还未在该插件中上线
但是我们开发使用的就是1.0的,如何让1.0版本的web3使用0.2版本的provider呢?
上面的情况打个比方:
我们给用户提供了高版本的iphone,但是没有也不能提供电话卡,不能打电话
metamask提供了低版本的诺基亚,有电话卡,能打电话
那么我们就需要用户使用我们的iphone,并且把诺基亚的卡插进来
我们使用新的模块web3.js组合web3
import Web3 from 'web3';//ipone without card
const web3 = new Web3(window.web3.currentProvider);//use NOKIA card
export default web3;//export iphone with nokia card
导出后我们在其他的模块中使用的就是这个组装web3
注意,window.web3.currentProvider能找到一定是要装了metamask或者类似插件
网友评论