MetaMask Snaps 是让 MetaMask 成为全球最具扩展性钱包的发展路线图。作为开发者,您可以以全新的方式将自己的功能和 API 带入 MetaMask。Web3 开发者是这一增长的核心,本系列旨在展示当今正在构建的创新 MetaMask Snaps。
Polysnap
Snap 代码库:https://github.com/Niraj-Kamdar/Polysnap
您为什么要构建它?
目前,开发者每次想为 MetaMask 添加新功能时,都需要创建一个新的 Snap。Polysnap 提供了一种更好的代码复用方式。大量由 Polywrap 驱动的 Wasm 模块存储在 IPFS 上。Polysnap 让应用开发者无需构建新的 Snap,只需通过简单的 JSON RPC 调用,即可即时、安全地执行部署在 IPFS 上的任意 Wasm wrapper。
依赖 Polysnap 的 dapp 用户无需安装多个 Snap,只需安装 Polysnap 即可,这有助于减少潜在的攻击面。使用 Polysnap 的 Dapp 可以比传统 Snap 更安全,因为 Polysnap 会对涉及主机能力的所有操作(如互联网访问、钱包访问等)进行把关,并在执行任何依赖这些能力的代码之前,始终要求用户确认。
Dapp 开发者无需要求用户安装多个 Snap 来运行其应用,而是只需使用一个 Snap——Polysnap——即可运行任意 Polywrap wrapper。
Snap 开发者不再局限于 JavaScript 及其生态系统进行 Snap 开发,而是可以使用 Rust、Go 和 AssemblyScript 等语言编写 Polywrap wrapper,并通过 Polysnap 调用这些 wrapper。
能否带我们了解一下技术实现?
Polysnap 项目由两个部分组成:
Polysnap(MetaMask Snap)
Polysnap 演示网站
MetaMask Snap 是项目的核心功能,也是项目的重点。网站用于演示该 Snap 的功能。
Snap
Polysnap 可分为三个不同部分:
Polywrap Client
Plugin Wrapper
WASM Wrapper
1. Polywrap Client
Polywrap 正在为互联网构建一个统一的执行环境,该环境安全、开放且由用户所有。
Polywrap 允许我们通过 Polywrap Client 创建可在任何地方运行的无限可扩展软件。Polywrap Client 支持运行两种类型的 wrapper:
Wasm Wrapper——使用 Polywrap 工具链构建并部署在 IPFS 上的任意沙箱化 Wasm wrapper 模块
Plugin Wrapper——向 Wasm wrapper 暴露不同主机功能(如 HTTP、文件系统和 JSON-RPC)的主机能力 wrapper
您可以查看我们如何使用 Polywrap Client,通过简单的 JSON-RPC 调用 Polysnap 来调用任意 wrapper。
export const onRpcRequest: OnRpcRequestHandler = async ({
origin,
request,
}) => {
switch (request.method) {
case 'wrap_invoke':
const invocation = request.params as unknown as InvokerOptions;
const isApproved = await wallet.request({
method: 'snap_confirm',
params: [
{
prompt: `${origin}`.substring(0, 40),
description: `URI: ${invocation.uri}\nMethod: ${invocation.method}`,
textAreaContent: `Args ${JSON.stringify(invocation.args)}`,
},
],
});
if (isApproved === true) {
const client = await getClient();
const response = await client.invoke<any>(invocation);
if (!response.ok) {
throw response.error;
}
return deserializeMap(response.value);
}
throw new Error('User declined invocation');
default:
throw new Error('Method not found.');
}
};
2. Plugin Wrapper
Plugin wrapper 通过 Polywrap Client 直接嵌入 Polysnap。这些 Plugin wrapper 暴露了 MetaMask SES 环境内提供的能力,例如:HTTP、Ethereum JSON-RPC。
在此 MVP 版本中,我们已添加对三种不同插件的支持:
HTTP Plugin——暴露 API,允许直接从 Wasm Wrapper 发起 HTTP GET/POST 请求
IPFS Plugin——暴露 API,用于在 IPFS 上存储、固定和检索文件
IPFS URI Resolver Plugin——暴露 API,用于从 IPFS 解析已部署的 Wasm Wrapper
3. Wasm Wrapper
Wasm wrapper 是使用 Polywrap 工具链构建并部署到 IPFS 的 Wasm 模块。由于 Wasm 是沙箱化环境,除非主机暴露 API 来支持 IO 操作,否则它无法执行任何 IO。因此,任何 Wasm wrapper 都可以在 MetaMask Snap 内安全运行。Polysnap 在没有 Plugin wrapper 的帮助下,无法执行任何主机函数(如访问互联网)。您可以在 wrappers.io 查看所有已部署到 IPFS 的 wrapper。
export async function getClient(): Promise<PolywrapClient> {
const ipfsResolverWrapperResult = await ipfsResolverPlugin(
{},
).createWrapper();
if (!ipfsResolverWrapperResult.ok) {
throw ipfsResolverWrapperResult.error;
}
const ipfsUriResolver = new WrapperResolver(
Uri.from('ens/ipfs-resolver.polywrap.eth'),
ipfsResolverWrapperResult.value,
);
const ipfsWrapperResult = await ipfsPlugin({}).createWrapper();
if (!ipfsWrapperResult.ok) {
throw ipfsWrapperResult.error;
}
const ipfsResolver = new WrapperResolver(
Uri.from('ens/ipfs.polywrap.eth'),
ipfsWrapperResult.value,
);
const httpWrapperResult = await httpPlugin({}).createWrapper();
if (!httpWrapperResult.ok) {
throw httpWrapperResult.error;
}
const httpResolver = new WrapperResolver(
Uri.from('ens/http.polywrap.eth'),
httpWrapperResult.value,
);
const resolver = RecursiveResolver.from([
httpResolver,
ipfsResolver,
ipfsUriResolver,
new ExtendableUriResolver(),
]);
return new PolywrapClient({
interfaces: [
{
interface: new Uri('wrap://ens/uri-resolver.core.polywrap.eth'),
implementations: [
new Uri('wrap://ens/ipfs-resolver.polywrap.eth'),
],
},
],
envs: [
{
uri: new Uri('wrap://ens/ipfs.polywrap.eth'),
env: {
provider: defaultIpfsProviders[0],
fallbackProviders: defaultIpfsProviders.slice(1),
},
},
],
resolver,
});
}
Polysnap 网站
Polysnap 网站是我们创建的一个简单演示站点,用于展示 Polysnap 的实际效果。它有一个用于连接 MetaMask 钱包并安装 Snap 的按钮,以及一个查询面板,可向 Polysnap 提交 JSON RPC 调用并显示结果。
要向 Snap 发送调用,用户需要提供三个要素:
一个解析为 Wasm wrapper 的 uri(黑客松项目仅支持 IPFS URI,但未来版本也可支持 ENS 解析)
要调用的 method 名称
一个包含传递给被调用方法的参数的 json 对象 args
点击"Invoke"按钮后,网站会读取这些字段中的值并将其转发给 Snap。Snap 会打开一个确认窗口,请求用户批准此次调用,确保应用不会在未经终端用户同意的情况下进行任何调用。
如果调用获得批准,Snap 中的 Polywrap Client 将处理该调用并返回结果。结果将显示在按钮下方的文本框中。当然,在实际应用中,开发者通常会以编程方式设置调用,并以不同的方式使用结果。
顾名思义,Polysnap 是一个集众多功能于一身的 Snap。仅凭 Polysnap,开发者就可以调用任何以任意 Wasm 可编译语言编写的 Polywrap Wasm wrapper 中的任意方法。
wrapper 在运行时下载并缓存。由于 Wasm wrapper 是沙箱化且无状态的,Polysnap 在已经安全的 Snap 环境基础上又增加了一层安全保障。
而且这一切完全去中心化。
如果您要实现这个项目,下一步计划是什么?
以下是我们为 Polysnap 下一版本设想的所有改进:
支持更多 Plugin Wrapper,例如:Cache、Concurrency、Ethereum、Near、Tezos 等
为访问每个 Polywrap 插件添加基于权限的安全机制,确保安全性可由终端用户管理
创建 PolySnap 安装网站,展示 Snap、托管文档,并方便终端用户安装
添加对 IPFS、ENS 和 HTTP Polywrap URI Resolver 的支持
支持应用开发者在通过 MetaMask Snap 的 JSON-RPC 调用时,为每次 Polywrap Client 调用提交自定义配置
支持针对 PolySnap 缓存的 wrapper 的自定义缓存管理方案
能否介绍一下您自己和您的团队?
我们都是 dOrg 的成员——一个由自由职业软件工程师和设计师组成的 DAO,同时也是 Polywrap 的开发者。
Kris——我是一名 Web3 软件工程师。2020 年,一位朋友将我介绍给 dOrg 和去中心化网络,从此改变了我的人生轨迹。我随后加入了 Polywrap 团队,致力于构建下一代 SDK 开发者工具。
Niraj——我是 dOrg 的 Web3 开发者,目前以核心开发者身份参与 Polywrap 项目。我从事 Web3 开发已有两年,在加入 Polywrap 之前,曾为 Badger、Opolis、Coordinape 和 Llama 做出贡献。
您认为 MetaMask Snaps 为 Web3 领域带来了哪些机遇?
我们认为 MetaMask Snaps 有潜力使 MetaMask 成为一个枢纽,将数百万新用户引入 Web3。开发者体验和安全性对于任何插件生态系统的成功都至关重要。我们相信 Polysnap 能够为 MetaMask Snaps 带来这两方面的提升,使其更易用、更具扩展性且更安全。
您对有意尝试 MetaMask Snaps 的开发者有什么建议?
MetaMask Snaps 允许通过为 MetaMask 钱包编写新的扩展 Snap 来扩展 MetaMask 的功能。因此,它是一个非常强大的工具,可以支持大量使用场景,例如将不同的 L1 钱包直接集成到 MetaMask 中、为交易提供更多洞察等。我们希望通过 Polysnap,让实现这些使用场景的开发者体验变得更加轻松。
MetaMask Snaps 仍然是新生事物,但仅仅一个周末,我们就看到各团队构建出了令人惊叹的 MetaMask Snaps——甚至包括一个内置于 MetaMask 的 Cosmos 钱包。即使 MetaMask Snaps 功能仍处于预生产阶段,也请尽早开始!
或者,您也可以考虑不编写新的 Snap,而是用 Rust 或 AssemblyScript 等语言编写一个 Polywrap Wasm wrapper。这样不仅可以通过 Polysnap 调用它,无需编写自己的新 Snap,还可以通过 Polywrap client 在任何地方使用它。
使用 MetaMask Snaps 进行构建
开始使用 MetaMask Snaps:
查阅开发者文档
安装 MetaMask Flask
查看 MetaMask Snaps 指南
在 Twitter、GitHub discussions 和 Discord 上与我们保持联系
请关注我们团队在您附近举办的下一场黑客松!祝 BUIDL 愉快 ⚒️
免责声明:MetaMask Snaps 通常由 Consensys Software 以外的第三方开发。使用第三方开发的 MetaMask Snaps 完全由您自行决定并承担风险,且您同意对因此类活动造成的任何损失或损害承担全部责任。Consensys 对第三方开发的 Snap 不作任何明示或暗示的保证,无论是口头还是书面形式,并对第三方开发的 MetaMask Snaps 免除一切责任。使用区块链相关软件存在风险,使用 MetaMask Snaps 即表示您完全承担这些风险。