跳到主要内容

Substrate Connect 中的轻客户端

ref: https://docs.substrate.io/learn/light-clients-in-substrate-connect/

通常,为区块链提供点对点网络的节点需要大量资源,包括强大的高速处理器和高容量存储设备。相比之下,轻客户端节点可以在资源受限的环境中运行,还可以嵌入到其它应用程序中,用来同步区块链的数据。

有了轻客户端节点,你可以以安全和去中心化的方式与区块链进行交互,而无需负担运行全节点所需的高性能硬件和网络容量。

JavaScript 生态中的轻客户端

针对基于Substrate的链,轻客户端节点被实现为一个WebAssembly客户端——称为smoldot,它可以在浏览器中运行,并使用JSON-RPC请求与链进行交互。为了使smoldot WebAssembly轻客户端更容易与JavaScript和TypeScript应用程序集成,我们在smoldot源代码之上构建了一个名为Substrate Connect的JavaScript包。

Substrate Connect可作为一个Node.js包使用,可以通过npm包管理器进行安装。Substrate Connect包使轻客户端节点能够与JavaScript生态系统中的应用程序集成。在将Substrate Connect添加到应用程序后,该应用程序可以通过JSON-RPC消息与轻客户端通信,并访问区块链数据。

在浏览器中直接连接区块链

通过Substrate Connect,可以配置应用程序来运行一个轻节点,该轻节点运行在本地的浏览器内。应用程序的用户可以直接在浏览器中与区块链进行交互,无需连接到任何第三方节点或其他服务器。

通过消除对中介服务器的需求,Substrate Connect为区块链构建者、应用开发者和最终用户提供了好处。一些关键的好处包括:

  • 提高了安全性
  • 简化了网络基础设施
  • 降低了维护成本
  • 为初级区块链用户降低了入门门槛
  • 为Web3应用程序的推广提供了更快捷的路径

知名的区块链网络

你可以使用Substrate Connect连接到任何基于Substrate的区块链。然而,你必须指定你想要连接的链的正确名称。有一些众所周知的链名称被定义为WellKnownChain枚举类型。

你可以使用这里列出的名称连接到以下公共区块链网络:

要连接的链使用的链标识符
Polkadotpolkadot
Kusamaksmcc3
Westendwestend2
Rococorococo_v2_2

请注意,你必须使用在对应网络的链规范(chain spec)中出现的链标识符,而不是通常使用的网络名称。例如,你必须指定ksmcc3作为链标识符来连接到Kusama。对于已经分叉的链,使用正确的名称尤其重要。例如,rococo_v2rococo_v2_2是两个不同的链。

集成到使用Polkadot-JS API的应用中

如果你已经构建了使用现有Polkadot-JS API的应用程序,那么@polkadot/rpc-provider包已经包含了substrate-connect RPC provider。

要将substrate-connect添加到你的应用程序:

  1. 通过运行合适的包管理器的相应命令来安装@polkadot/rpc-provider包。

例如,如果你使用yarn,运行以下命令:

yarn add @polkadot/rpc-provider

如果你使用npm作为你的包管理器,运行以下命令:

npm i @polkadot/rpc-provider
  1. 通过运行合适的包管理器的相应命令来安装@polkadot/api包。

例如,如果你使用yarn,运行以下命令:

yarn add @polkadot/api

如果你使用npm作为你的包管理器,运行以下命令:

npm i @polkadot/api

使用RPC provider连接到知名网络

以下示例说明了如何使用rpc-provider连接到诸如Polkadot、Kusama、Westend或Rococo等众所周知的网络。

import { ScProvider, WellKnownChain } from "@polkadot/rpc-provider/substrate-connect";
import { ApiPromise } from "@polkadot/api";
// Create the provider for a known chain
const provider = new ScProvider(WellKnownChain.westend2);
// Stablish the connection (and catch possible errors)
await provider.connect();
// Create the PolkadotJS api instance
const api = await ApiPromise.create({ provider });
await api.rpc.chain.subscribeNewHeads(lastHeader => {
console.log(lastHeader.hash);
});
await api.disconnect();

使用RPC provider连接到自定义网络

以下示例说明了如何使用rpc-provider连接到自定义网络,通过指定其链规范。

import { ScProvider } from "@polkadot/rpc-provider/substrate-connect";
import { ApiPromise } from "@polkadot/api";
import jsonCustomSpec from "./jsonCustomSpec.json";
// Create the provider for the custom chain
const customSpec = JSON.stringify(jsonCustomSpec);
const provider = new ScProvider(customSpec);
// Stablish the connection (and catch possible errors)
await provider.connect();
// Create the PolkadotJS api instance
const api = await ApiPromise.create({ provider });
await api.rpc.chain.subscribeNewHeads(lastHeader => {
console.log(lastHeader.hash);
});
await api.disconnect();

使用RPC provider连接到平行链

以下示例说明了如何使用rpc-provider通过指定其链规范连接到平行链。

import { ScProvider, WellKnownChain } from "@polkadot/rpc-provider/substrate-connect";
import { ApiPromise } from "@polkadot/api";
import jsonParachainSpec from "./jsonParachainSpec.json";
// Create the provider for the relay chain
const relayProvider = new ScProvider(WellKnownChain.westend2);
// Create the provider for the parachain. Notice that
// we must pass the provider of the relay chain as the
// second argument
const parachainSpec = JSON.stringify(jsonParachainSpec);
const provider = new ScProvider(parachainSpec, relayProvider);
// Stablish the connection (and catch possible errors)
await provider.connect();
// Create the PolkadotJS api instance
const api = await ApiPromise.create({ provider });
await api.rpc.chain.subscribeNewHeads(lastHeader => {
console.log(lastHeader.hash);
});
await api.disconnect();

配合其它库使用Substrate Connect

前一节演示了如何将Substrate Connect provider集成到使用Polkadot-JS API的应用程序中。有了这个provider,你可以创建应用程序,使用户能够通过浏览器调用Polkadot-JS API方法与链进行交互。然而,你可以在不依赖Polkadot-JS API的应用程序中安装和使用@substrate-connect。例如,如果你正在构建自己的应用程序库或编程接口,你可以通过运行合适的包管理器的相应命令来安装Substrate Connect依赖项。

例如,如果你使用yarn,运行以下命令:

yarn add @substrate/connect

如果你使用npm作为你的包管理器,运行以下命令:

npm i @substrate/connect

连接到知名链

以下示例说明了如何使用Substrate Connect连接到诸如Polkadot、Kusama、Westend或Rococo等众所周知的网络。

import { WellKnownChain, createScClient } from "@substrate/connect";
// Create the client
const client = createScClient();
// Create the chain connection, while passing the `jsonRpcCallback` function.
const chain = await client.addWellKnownChain(WellKnownChain.polkadot, function jsonRpcCallback(response) {
console.log("response", response);
});
// send a RpcRequest
chain.sendJsonRpc('{"jsonrpc":"2.0","id":"1","method":"system_health","params":[]}');

连接到平行链

以下示例说明了如何使用Substrate Connect连接到平行链。

import { WellKnownChain, createScClient } from "@substrate/connect";
import jsonParachainSpec from "./jsonParachainSpec.json";
// Create the client
const client = createScClient();
// Create the relay chain connection. There is no need to pass a callback
// function because we will sending and receiving messages through
// the parachain connection.
await client.addWellKnownChain(WellKnownChain.westend2);
// Create the parachain connection.
const parachainSpec = JSON.stringify(jsonParachainSpec);
const chain = await client.addChain(parachainSpec, function jsonRpcCallback(response) {
console.log("response", response);
});
// send a request
chain.sendJsonRpc('{"jsonrpc":"2.0","id":"1","method":"system_health","params":[]}');

API 文档

有关substrate-connect API的更多信息,请参阅Substrate Connect

浏览器插件

Substrate Connect浏览器插件使用了Substrate ConnectSmoldot轻客户端节点模块,并在浏览器启动时更新并同步那些知名substrate链(Polkadot、Kusama、Rococo、Westend)的状态,将它们的最新状态保存在浏览器插件内,以便更快地同步链。

当集成Substrate Connect的dApp(例如polkadotJS/apps)在浏览器的标签页中打开时,它会从插件中接收最新的spec,而不是从dApp中最后导入的状态获取;与此同时,dApp的"已连接"状态将出现在插件中,这意味着它正在使用插件的bootnode和spec;

你可以从Substrate Connect下载Chrome和Firefox插件,或者在Github仓库上找到更多信息。

项目案例

不安全的可赎回钱包:一种基于轻客户端的、在浏览器中使用的Substrate钱包。它旨在快速易用,但安全性比其他解决方案低。Github

简单的演示,涵盖了多链和平行链的例子。Github

Brave 浏览器 WebSocket 问题

从Brave v1.36开始,插件和网页被限制为最多使用10个活跃的WebSocket连接,以防止旁路攻击。你可以在Partition WebSockets Limits to prevent side channels中找到有关此更改的更多信息。

如果你正在使用Brave浏览器,并且由于已经达到了允许的最大WebSocket连接数而无法连接,你可以禁用此限制。

要禁用WebSocket限制:

  1. 在Brave浏览器中打开一个新标签。
  2. 复制URL brave://flags/#restrict-websockets-pool
  3. 将URL粘贴到地址栏中,以选择Restrict WebSockets pool设置。
  4. 点击设置列表并选择Disabled
  5. 重新启动浏览器。