Web3 提供商引擎

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_getAccountBalanceeth_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

原文来自:天津市足球运动协会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值