Web3 ProviderEngine 是一个用于组合您自己的web3 提供商的工具。
警告
这个包已经被弃用。
metamask/json-rpc-engine该软件包最初是为 MetaMask 创建的,但已被、、和metamask/eth-json-rpc-middleware其他metamask/eth-json-rpc-provider各种软件包所取代。
以下是如何使用这些包创建提供程序的示例:
import { providerFromMiddleware } from 'metamask/eth-json-rpc-provider';
import { createFetchMiddleware } from 'metamask/eth-json-rpc-middleware';
import { valueToBytes, bytesToBase64 } from '@metamask/utils';
import fetch from 'cross-fetch';
const rpcUrl = '[insert RPC URL here]';
const fetchMiddleware = createFetchMiddleware({
btoa: (stringToEncode) => bytesToBase64(valueToBytes(stringToEncode)),
fetch,
rpcUrl,
});
const provider = providerFromMiddleware(fetchMiddleware);
provider.sendAsync(
{ id: 1, jsonrpc: '2.0', method: 'eth_chainId' },
(error, response) => {
if (error) {
console.error(error);
} else {
console.log(response.result);
}
}
);
etamask/eth-json-rpc-middleware
此示例使用 的 v12.1.0 、 的 v3.0.1metamask/eth-json-rpc-provider
和 的 v8.4.0编写metamask/utils
。
可组合
构建为模块化 - 通过一组“子提供商”工作,这些子提供商类似于普通的 web3 提供商,但仅处理 rpc 方法的子集。
子提供程序可以发出新的 rpc 请求以处理自己的请求;例如,eth_call
可能触发eth_getAccountBalance
、eth_getCode
等。提供程序引擎还处理 rpc 请求结果的缓存。
const ProviderEngine = require('web3-provider-engine')
const CacheSubprovider = require('web3-provider-engine/subproviders/cache.js')
const FixtureSubprovider = require('web3-provider-engine/subproviders/fixture.js')
const FilterSubprovider = require('web3-provider-engine/subproviders/filters.js')
const VmSubprovider = require('web3-provider-engine/subproviders/vm.js')
const HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js')
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js')
const RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js')
var engine = new ProviderEngine()
var web3 = new Web3(engine)
// static results
engine.addProvider(new FixtureSubprovider({
web3_clientVersion: 'ProviderEngine/v0.0.0/javascript',
net_listening: true,
eth_hashrate: '0x00',
eth_mining: false,
eth_syncing: true,
}))
// cache layer
engine.addProvider(new CacheSubprovider())
// filters
engine.addProvider(new FilterSubprovider())
// pending nonce
engine.addProvider(new NonceSubprovider())
// vm
engine.addProvider(new VmSubprovider())
// id mgmt
engine.addProvider(new HookedWalletSubprovider({
getAccounts: function(cb){ ... },
approveTransaction: function(cb){ ... },
signTransaction: function(cb){ ... },
}))
// data source
engine.addProvider(new RpcSubprovider({
rpcUrl: 'https://testrpc.metamask.io/',
}))
// log new blocks
engine.on('block', function(block){
console.log('================================')
console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex'))
console.log('================================')
})
// network connectivity error
engine.on('error', function(err){
// report connectivity errors
console.error(err.stack)
})
// start polling for blocks
engine.start()
在 webpack 中导入时:
import * as Web3ProviderEngine from 'web3-provider-engine';
import * as RpcSource from 'web3-provider-engine/subproviders/rpc';
import * as HookedWalletSubprovider from 'web3-provider-engine/subproviders/hooked-wallet';
专为零客户端打造
以太坊 JSON RPC并非设计为让一个节点为许多客户端提供服务。但是,可以使用更小、更轻量的 JSON RPC 子集来提供以太坊“零客户端”节点运行所需的区块链数据。我们尽可能在本地处理尽可能多的请求类型,并让数据查找回退到某些数据源(托管 rpc、区块链 api 等)。明确地说,我们不希望/不能让以下类型的 RPC 调用进入网络:
id mgmt + tx 签名(需要私人数据)
过滤器(需要状态数据 API)
vm(昂贵,难以扩展)
运行测试
yarn test
原文来自:天津市足球运动协会