Saltar al contenido

Polysnap: Invocación de Polywrap Wasm Wrappers al vuelo

Ganador del Hackathon ETHIndia

7 min de lectura
Polysnap: Invocación de Polywrap Wasm Wrappers al vuelo

MetaMask Snaps es la hoja de ruta para convertir a MetaMask en la wallet más extensible del mundo. Como desarrollador, puedes incorporar tus funciones y APIs a MetaMask de formas completamente nuevas. Los desarrolladores de Web3 son el núcleo de este crecimiento, y esta serie tiene como objetivo destacar los innovadores MetaMask Snaps que se están construyendo hoy en día.

Polysnap

Repositorio del Snap: https://github.com/Niraj-Kamdar/Polysnap

¿Por qué lo construiste?

Actualmente, los desarrolladores necesitan crear un snap para cada nueva funcionalidad que quieren añadir a MetaMask. Polysnap presenta un mejor enfoque para la reutilización de código. Una amplia selección de módulos Wasm potenciados por Polywrap se almacena en IPFS. Polysnap permite a los desarrolladores de aplicaciones ejecutar cualquier wrapper Wasm desplegado en IPFS, de forma dinámica y segura, con una simple llamada JSON RPC, sin necesidad de construir un nuevo Snap.

Los usuarios de una dapp que depende de Polysnap no necesitan instalar múltiples snaps, sino únicamente instalar Polysnap, lo que puede ayudar a reducir posibles vectores de ataque. Una dapp que utilice Polysnap puede ser más segura que un snap tradicional, ya que Polysnap controla cualquier acción relacionada con las capacidades del host, como el acceso a internet, el acceso a la wallet, etc., y siempre requerirá la confirmación del usuario antes de ejecutar cualquier código que dependa de estas capacidades.

Los desarrolladores de dapps no necesitan pedir a los usuarios que instalen múltiples Snaps para ejecutar su aplicación; en cambio, pueden usar un solo Snap —Polysnap— y ejecutar cualquier wrapper de Polywrap.

Los desarrolladores de Snaps ya no están limitados a JavaScript y su ecosistema para el desarrollo de Snaps. En su lugar, pueden escribir wrappers de Polywrap en lenguajes como Rust, Go y AssemblyScript, e invocarlos mediante Polysnap.

¿Puedes explicarnos la implementación técnica?

El proyecto Polysnap consta de dos elementos:

  1. Polysnap (MetaMask Snap)

  2. Sitio web de demostración de Polysnap

El MetaMask Snap es la funcionalidad principal y el foco del proyecto. El sitio web se utiliza para demostrar el Snap.

El Snap

Polysnap puede dividirse en 3 partes diferentes.

  1. Cliente de Polywrap

  2. Plugin Wrapper

  3. WASM Wrapper

1. Cliente de Polywrap

Polywrap está construyendo un entorno de ejecución unificado para internet que es seguro, abierto y propiedad del usuario.

Polywrap nos permite crear software infinitamente extensible que se ejecuta en cualquier lugar mediante un cliente de Polywrap. El cliente de Polywrap admite la ejecución de dos tipos de wrappers:

  1. Wasm Wrapper: cualquier módulo wrapper Wasm en sandbox, construido y desplegado en IPFS mediante la cadena de herramientas de Polywrap.

  2. Plugin Wrapper: cualquier wrapper de capacidades del host que expone distintas funcionalidades del host, como HTTP, el sistema de archivos y JSON-RPC, a los wrappers Wasm.

Puedes ver cómo utilizamos el cliente de Polywrap para invocar cualquier wrapper con una simple llamada JSON-RPC a Polysnap.

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.');
  }
};
Copiar

2. Plugin Wrapper

Los plugin wrappers están integrados directamente en Polysnap mediante el cliente de Polywrap. Estos plugin wrappers exponen las capacidades disponibles dentro del entorno SES de MetaMask. Ej.: HTTP, Ethereum JSON-RPC.

Hemos añadido soporte para tres plugins diferentes en este MVP.

  1. HTTP Plugin: expone una API que permite realizar solicitudes HTTP GET/POST directamente desde el Wasm Wrapper.

  2. IPFS Plugin: expone una API para almacenar, fijar y recuperar archivos de IPFS.

  3. IPFS URI Resolver Plugin: expone una API para resolver wrappers Wasm desplegados desde IPFS.

3. Wasm Wrapper

Los wrappers Wasm son módulos Wasm construidos y desplegados en IPFS mediante la cadena de herramientas de Polywrap. Dado que Wasm es un entorno en sandbox, no puede realizar ninguna operación de E/S a menos que el host exponga una API para facilitarlo. Por ello, cualquier wrapper Wasm puede ejecutarse de forma segura dentro del MetaMask Snap. Polysnap no puede ejecutar ninguna función del host, como acceder a internet, sin la ayuda de los plugin wrappers. Puedes consultar todos los wrappers desplegados en IPFS en: wrappers.io

export async function getClient(): Promise<PolywrapClient> {
  const ipfsResolverWrapperResult = await ipfsResolverPlugin(
    {},
  ).createWrapper();
  // IPFS URI RESOLVER
  if (!ipfsResolverWrapperResult.ok) {
    throw ipfsResolverWrapperResult.error;
  }
  const ipfsUriResolver = new WrapperResolver(
    Uri.from('ens/ipfs-resolver.polywrap.eth'),
    ipfsResolverWrapperResult.value,
  );

  // IPFS RESOLVER
  const ipfsWrapperResult = await ipfsPlugin({}).createWrapper();
  if (!ipfsWrapperResult.ok) {
    throw ipfsWrapperResult.error;
  }
  const ipfsResolver = new WrapperResolver(
    Uri.from('ens/ipfs.polywrap.eth'),
    ipfsWrapperResult.value,
  );

  // HTTP RESOLVER
  const httpWrapperResult = await httpPlugin({}).createWrapper();
  if (!httpWrapperResult.ok) {
    throw httpWrapperResult.error;
  }
  const httpResolver = new WrapperResolver(
    Uri.from('ens/http.polywrap.eth'),
    httpWrapperResult.value,
  );

  // AGGREGATED RESOLVER
  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,
  });
}
Copiar

Sitio web de Polysnap

El sitio web de Polysnap es un sencillo sitio de demostración que creamos para mostrar PolySnap en acción. Cuenta con un botón para conectar una wallet de MetaMask e instalar el Snap, y un panel de consultas que envía una llamada JSON RPC a Polysnap y muestra el resultado.

Para enviar una invocación al Snap, el usuario proporciona tres elementos:

  • Un uri que resuelve a un wrapper Wasm (el proyecto del hackathon solo admite URIs de IPFS, pero una versión futura podría admitir también la resolución ENS).

  • El nombre del method a invocar.

  • Un objeto json args que contiene los argumentos que se pasarán al método invocado.

Cuando se hace clic en el botón "Invoke", el sitio web lee los valores de estos campos y los reenvía al Snap. El Snap abre una ventana de confirmación para solicitar la aprobación de la invocación, asegurando que la aplicación no realice ninguna invocación sin el consentimiento del usuario final.

Si la invocación es aprobada, el cliente de Polywrap en el Snap gestiona la invocación y devuelve el resultado. El resultado se muestra en un cuadro debajo de los botones. Por supuesto, en una aplicación real, los desarrolladores normalmente configurarían las invocaciones de forma programática y utilizarían el resultado de manera diferente.

Como su nombre indica, Polysnap es un único Snap con el poder de muchos. Con solo Polysnap, los desarrolladores pueden invocar cualquier método en cualquier wrapper Wasm de Polywrap escrito en cualquier lenguaje compilable a Wasm.

Los wrappers se descargan en tiempo de ejecución y se almacenan en caché. Dado que los wrappers Wasm están en sandbox y son sin estado, Polysnap añade una capa adicional de seguridad al entorno Snap, que ya es seguro de por sí.

Y todo es completamente descentralizado.

¿Cuáles son los próximos pasos si implementaras esto?

Aquí está la lista de todas las mejoras que hemos previsto para la próxima versión de Polysnap:

  • Habilitar soporte para más Plugin Wrappers como: Cache, Concurrency, Ethereum, Near, Tezos, etc.

  • Añadir seguridad basada en permisos para el acceso a cada plugin de Polywrap, garantizando que la seguridad pueda ser gestionada por el usuario final.

  • Crear un sitio web de instalación de PolySnap para mostrar el Snap, alojar documentación y facilitar la instalación a los usuarios finales.

  • Añadir soporte para los resolvers de URI de Polywrap en IPFS, ENS y HTTP.

  • Permitir que los desarrolladores de aplicaciones envíen configuraciones personalizadas para cada invocación del cliente de Polywrap, configurables al invocar mediante JSON-RPC con MetaMask Snap.

  • Admitir soluciones personalizadas de gestión de caché para los wrappers almacenados en caché por PolySnap.

¿Puedes contarnos un poco sobre ti y tu equipo?

Ambos somos miembros de dOrg, una DAO de ingenieros de software y diseñadores freelance, y también desarrolladores en Polywrap.

  • Kris - Soy ingeniero de software en Web3. Mi vida cambió en 2020 cuando un amigo me presentó dOrg y la web descentralizada. Pronto me uní al equipo de Polywrap para ayudar a construir la próxima generación de herramientas para desarrolladores de SDK.

  • Niraj - Soy desarrollador Web3 en dOrg y actualmente trabajo en el proyecto Polywrap como desarrollador principal. Llevo 2 años trabajando como desarrollador Web3 y he contribuido a Badger, Opolis, Coordinape y Llama antes de unirme a Polywrap.

¿Qué oportunidades ves con MetaMask Snaps y las posibilidades que abre para el espacio Web3?

Creemos que MetaMask Snaps tiene el potencial de convertir a MetaMask en un hub que incorporará a millones de nuevos usuarios a Web3. Tanto la experiencia del desarrollador como la seguridad son fundamentales para el éxito de cualquier ecosistema de plugins. Creemos que Polysnap puede aportar ambas cosas a MetaMask Snaps, haciéndolo aún más fácil de usar, extensible y seguro.

¿Algún consejo que quieras compartir con los desarrolladores interesados en probar MetaMask Snaps?

MetaMask Snaps permite ampliar las capacidades de MetaMask escribiendo nuevas extensiones de MetaMask Snaps para tu wallet de MetaMask. Es una herramienta muy poderosa que puede habilitar infinidad de casos de uso, como integrar diferentes wallets L1 directamente dentro de MetaMask, proporcionar más información sobre las transacciones, etc. Y queremos hacer que la experiencia del desarrollador para habilitar estos casos de uso sea aún más sencilla con Polysnap.

MetaMask Snaps todavía es nuevo, pero en tan solo un fin de semana vimos a equipos construir increíbles MetaMask Snaps, incluso una wallet de Cosmos que vive dentro de MetaMask. Aunque la funcionalidad de MetaMask Snaps todavía está en un estado previo a producción, ¡empieza cuanto antes!

O en lugar de escribir un nuevo Snap, podrías considerar escribir un wrapper Wasm de Polywrap en un lenguaje como Rust o AssemblyScript. Así no solo podrás invocarlo con Polysnap sin tener que escribir un nuevo Snap propio, sino también usarlo en cualquier lugar con el cliente de Polywrap.

Construyendo con MetaMask Snaps

Para comenzar con MetaMask Snaps:

  1. Consulta la documentación para desarrolladores

  2. Instala MetaMask Flask

  3. Revisa una guía de MetaMask Snaps

  4. Mantente conectado con nosotros en Twitter, discusiones de GitHub y Discord

¡Estén atentos a nuestro equipo en el próximo hackathon cerca de ti! ¡Feliz BUIDLing! ⚒️

Aviso legal: Los MetaMask Snaps son generalmente desarrollados por terceros distintos a Consensys Software. El uso de MetaMask Snaps desarrollados por terceros se realiza a tu propia discreción y riesgo, y con el acuerdo de que serás el único responsable de cualquier pérdida o daño que resulte de dichas actividades. Consensys no ofrece ninguna garantía expresa o implícita, ya sea oral o escrita, con respecto a los Snaps desarrollados por terceros, y declina toda responsabilidad por los MetaMask Snaps desarrollados por terceros. El uso de software relacionado con blockchain conlleva riesgos, y los asumes en su totalidad al usar MetaMask Snaps.

Traducido por IA. Puede contener errores. Por favor, verifique siempre la información.

Califica la traducción

Este artículo fue escrito por:

  • MetaMask

    MetaMask, anteriormente Consensys Software Inc, es la plataforma financiera self-custodial más grande del mundo, que ofrece a las personas un único lugar para guardar, gastar, ahorrar y hacer crecer su dinero tanto en criptoactivos como en activos tradicionales. La compañía está construyendo la plataforma de consumo donde esto ocurre, reuniendo pagos, ahorros, inversiones y activos digitales en una experiencia fluida y unificada. Habiendo crecido a partir de la wallet self-custodial más utilizada del mundo, MetaMask otorga a los usuarios control directo sobre su dinero y activos, con presencia en aproximadamente 190 países. MetaMask ha desempeñado un papel fundamental en el crecimiento de Ethereum desde 2016. Hoy, MetaMask se sitúa en el centro de la economía blockchain, construyendo el sistema operativo para el Open Money y poniendo a las personas en pleno control de su vida financiera.

    Leer todos los artículos