İçeriğe geç

Polysnap: Polywrap Wasm Sarmalayıcılarını Anında Çağırma

Bir ETHIndia Hackathon Kazananı

7 dk okuma
Polysnap: Polywrap Wasm Sarmalayıcılarını Anında Çağırma

MetaMask Snaps, MetaMask'ı dünyanın en genişletilebilir cüzdanı haline getirme yol haritasıdır. Geliştirici olarak, özelliklerinizi ve API'larınızı MetaMask'a tamamen yeni yollarla sunabilirsiniz. Web3 geliştiricileri bu büyümenin özünü oluşturmaktadır ve bu seri, bugün inşa edilen yenilikçi MetaMask Snaps'leri tanıtmayı amaçlamaktadır.

Polysnap

Snap Repo: https://github.com/Niraj-Kamdar/Polysnap

Neden geliştirdiniz?

Şu anda geliştiricilerin MetaMask'a eklemek istedikleri her yeni özellik için ayrı bir snap oluşturmaları gerekiyor. Polysnap, kod yeniden kullanımına daha iyi bir yaklaşım sunuyor. IPFS üzerinde geniş bir Polywrap destekli Wasm modülü seçkisi depolanmaktadır. Polysnap, uygulama geliştiricilerinin IPFS üzerinde dağıtılmış herhangi bir Wasm wrapper'ını anında ve güvenli biçimde, basit bir JSON RPC çağrısıyla, yeni bir Snap oluşturmaya gerek kalmadan çalıştırmasına olanak tanır.

Polysnap'e dayanan bir dapp'in kullanıcıları birden fazla snap yüklemek zorunda kalmaz; yalnızca Polysnap'i yüklemeleri yeterlidir. Bu durum, olası saldırı vektörlerini azaltmaya yardımcı olabilir. Polysnap kullanan dapp'ler, geleneksel snap'lere kıyasla daha güvenli olabilir; zira Polysnap, internet erişimi, cüzdan erişimi gibi host yetenekleriyle ilgili tüm işlemleri denetler ve bu yeteneklere dayanan herhangi bir kodu çalıştırmadan önce her zaman kullanıcı onayı ister.

Dapp geliştiricilerinin, uygulamalarını çalıştırabilmek için kullanıcılardan birden fazla Snap yüklemelerini istemesine gerek yoktur; bunun yerine tek bir Snap olan Polysnap'i kullanarak tüm Polywrap wrapper'larını çalıştırabilirler.

Snap geliştiricileri artık Snap geliştirme sürecinde yalnızca JavaScript ve JavaScript ekosistemine bağlı kalmak zorunda değildir. Bunun yerine Rust, Go ve AssemblyScript gibi dillerde Polywrap wrapper'ları yazabilir ve bu wrapper'ları Polysnap aracılığıyla çağırabilirler.

Teknik uygulamayı bize anlatabilir misiniz?

Polysnap projesi iki unsurdan oluşmaktadır:

  1. Polysnap (MetaMask Snap)

  2. Polysnap Demo Web Sitesi

MetaMask Snap, projenin temel özelliği ve odak noktasıdır. Web sitesi ise Snap'i tanıtmak amacıyla kullanılmaktadır.

Snap

Polysnap, 3 farklı bölüme ayrılabilir.

  1. Polywrap Client

  2. Plugin Wrapper

  3. WASM Wrapper

1. Polywrap Client

Polywrap, internet için güvenli, açık ve kullanıcıya ait birleşik bir yürütme ortamı inşa etmektedir.

Polywrap, bir Polywrap Client kullanarak her yerde çalışan, sonsuz genişletilebilir yazılımlar oluşturmamıza olanak tanır. Polywrap Client, iki tür wrapper çalıştırmayı destekler:

  1. Wasm Wrapper - Polywrap araç zinciri kullanılarak IPFS üzerinde oluşturulmuş ve dağıtılmış, sandbox ortamında çalışan herhangi bir Wasm wrapper modülü

  2. Plugin Wrapper - HTTP, dosya sistemi ve JSON-RPC gibi farklı host işlevlerini Wasm wrapper'larına sunan herhangi bir host yeteneği wrapper'ı

Polysnap'e yapılan basit bir JSON-RPC çağrısıyla herhangi bir wrapper'ı çağırmak için Polywrap Client'ı nasıl kullandığımızı inceleyebilirsiniz.

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

2. Plugin Wrapper

Plugin wrapper'lar, Polywrap Client aracılığıyla doğrudan Polysnap'e gömülüdür. Bu Plugin wrapper'lar, MetaMask'ın SES ortamında sağlanan yetenekleri sunar. Örneğin: HTTP, Ethereum JSON-RPC

Bu MVP kapsamında üç farklı plugin için destek ekledik.

  1. HTTP Plugin - Wasm Wrapper'dan doğrudan HTTP GET/POST istekleri yapılmasına olanak tanıyan API'yi sunar

  2. IPFS Plugin - IPFS'te dosya depolama, sabitleme ve alma işlemleri için API sunar

  3. IPFS URI Resolver Plugin - IPFS üzerinde dağıtılmış Wasm Wrapper'larını çözümlemek için API sunar

3. Wasm Wrapper

Wasm wrapper'lar, Polywrap araç zinciri kullanılarak IPFS'e oluşturulan ve dağıtılan Wasm modülleridir. Wasm, sandbox bir ortam olduğundan, host bir API sunmadığı sürece herhangi bir G/Ç işlemi gerçekleştiremez. Bu nedenle, tüm Wasm wrapper'lar MetaMask Snap içinde güvenli biçimde çalıştırılabilir. Polysnap, Plugin wrapper'larının yardımı olmadan internet erişimi gibi host işlevlerini çalıştıramaz. IPFS üzerinde dağıtılmış tüm wrapper'ları şu adreste inceleyebilirsiniz: 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,
  });
}
Kopyala

Polysnap Web Sitesi

Polysnap web sitesi, PolySnap'i canlı olarak sergilemek amacıyla oluşturduğumuz basit bir demo sitesidir. Sitede bir MetaMask cüzdanını bağlamak ve Snap'i yüklemek için kullanılan bir düğme ile Polysnap'e JSON RPC çağrısı gönderip sonucu görüntüleyen bir sorgu panosu yer almaktadır.

Snap'e bir çağrı göndermek için kullanıcının üç unsur sağlaması gerekir:

  • Bir Wasm wrapper'ına çözümlenen uri (hackathon projesi yalnızca IPFS URI'larını desteklemektedir; ancak gelecekteki bir sürüm ENS çözümlemesini de destekleyebilir)

  • Çağrılacak method'un adı

  • Çağrılan metoda iletilecek argümanları içeren bir json nesnesi args

"Invoke" düğmesine tıklandığında web sitesi bu alanlardaki değerleri okur ve Snap'e iletir. Snap, uygulamanın son kullanıcının onayı olmadan herhangi bir çağrı yapmamasını sağlamak amacıyla çağrının onaylanmasını talep eden bir onay penceresi açar.

Çağrı onaylanırsa Snap içindeki Polywrap Client çağrıyı işler ve sonucu döndürür. Sonuç, düğmelerin altındaki bir kutuda görüntülenir. Elbette gerçek dünya uygulamalarında geliştiriciler genellikle çağrıları programatik olarak ayarlar ve sonucu farklı biçimlerde kullanır.

Adından da anlaşılacağı üzere Polysnap, birçoğunun gücünü taşıyan tek bir Snap'tir. Yalnızca Polysnap ile geliştiriciler, Wasm'a derlenebilen herhangi bir dilde yazılmış Polywrap Wasm wrapper'ındaki herhangi bir metodu çağırabilir.

Wrapper'lar çalışma zamanında indirilir ve önbelleğe alınır. Wasm wrapper'lar sandbox ve durumsuz olduğundan Polysnap, zaten güvenli olan Snap ortamına ek bir güvenlik katmanı eklemektedir.

Ve tüm bunlar tamamen merkeziyetsizdir.

Bu projeyi hayata geçirseydik sonraki adımlar ne olurdu?

Polysnap'in bir sonraki sürümü için öngördüğümüz tüm iyileştirmelerin listesi aşağıdadır:

  • Cache, Concurrency, Ethereum, Near, Tezos gibi daha fazla Plugin Wrapper için destek eklenmesi

  • Her Polywrap plugin'ine erişim için izin tabanlı güvenlik eklenerek güvenliğin son kullanıcı tarafından yönetilebilmesinin sağlanması

  • Snap'i tanıtmak, belgeleri barındırmak ve son kullanıcılar için kurulumu kolaylaştırmak amacıyla bir PolySnap kurulum web sitesi oluşturulması

  • IPFS, ENS ve HTTP Polywrap URI Resolver'ları için destek eklenmesi

  • Uygulama geliştiricilerinin MetaMask Snap ile JSON-RPC üzerinden çağrı yaparken Polywrap Client için özel yapılandırmalar sunmasının desteklenmesi

  • PolySnap tarafından önbelleğe alınan wrapper'lar için özel önbellek yönetimi çözümlerinin desteklenmesi

Kendiniz ve ekibiniz hakkında biraz bilgi verebilir misiniz?

İkimiz de serbest yazılım mühendisleri ve tasarımcılardan oluşan bir DAO olan dOrg'un üyeleriyiz ve aynı zamanda Polywrap'te geliştirici olarak çalışıyoruz.

  • Kris - Web3 alanında yazılım mühendisiyim. 2020 yılında bir arkadaşım beni dOrg ve merkeziyetsiz web ile tanıştırdığında hayatım değişti. Kısa süre sonra bir sonraki nesil SDK geliştirici araçlarını inşa etmeye yardımcı olmak için Polywrap ekibine katıldım.

  • Niraj - dOrg'da Web3 Geliştiricisiyim ve şu anda Polywrap projesinde Core geliştirici olarak çalışıyorum. Son 2 yıldır Web3 Geliştiricisi olarak çalışıyor ve Polywrap'e katılmadan önce Badger, Opolis, Coordinape ve Llama projelerine katkıda bulundum.

MetaMask Snaps'in Web3 alanı için sunduğu fırsatları nasıl değerlendiriyorsunuz?

MetaMask Snaps'in, MetaMask'ı milyonlarca yeni kullanıcıyı web3'e kazandıracak bir merkeze dönüştürme potansiyeline sahip olduğunu düşünüyoruz. Geliştirici deneyimi ve güvenlik, herhangi bir plugin ekosisteminin başarısı için son derece önemlidir. Polysnap'in, MetaMask Snaps'i daha kullanımı kolay, genişletilebilir ve güvenli hale getirerek her ikisini de MetaMask Snaps'e kazandırabileceğine inanıyoruz.

MetaMask Snaps'i denemek isteyen geliştiricilere tavsiyeleriniz nelerdir?

MetaMask Snaps, MetaMask cüzdanınız için yeni uzantı MetaMask Snaps yazarak MetaMask'ın yeteneklerini genişletmenize olanak tanır. Bu nedenle, farklı L1 cüzdanlarını doğrudan MetaMask'a entegre etmek, işlemler için daha fazla içgörü sağlamak gibi pek çok kullanım senaryosunu mümkün kılabilen son derece güçlü bir araçtır. Polysnap ile bu tür kullanım senaryolarını etkinleştirmeye yönelik geliştirici deneyimini daha da kolaylaştırmak istiyoruz.

MetaMask Snaps hâlâ yeni olmasına karşın, yalnızca bir hafta sonu içinde ekiplerin MetaMask içinde yaşayan bir Cosmos cüzdanı da dahil olmak üzere inanılmaz MetaMask Snaps'ler inşa ettiğine tanık olduk. MetaMask Snaps özelliği henüz üretim öncesi aşamada olsa bile erken başlayın!

Ya da yeni bir Snap yazmak yerine Rust veya AssemblyScript gibi bir dilde Polywrap Wasm wrapper'ı yazmayı düşünebilirsiniz. Böylece kendi yeni Snap'inizi yazmak zorunda kalmadan Polysnap ile çağırabilir, aynı zamanda Polywrap client ile her yerde kullanabilirsiniz.

MetaMask Snaps ile İnşa Etmek

MetaMask Snaps'e başlamak için:

  1. Geliştirici belgelerini inceleyin

  2. MetaMask Flask'ı yükleyin

  3. Bir MetaMask Snaps kılavuzuna göz atın

  4. Twitter, GitHub tartışmaları ve Discord üzerinden bizimle bağlantıda kalın

Yakınınızdaki bir sonraki hackathon'da ekibimizi takip edin! Mutlu İnşaatlar ⚒️

Sorumluluk Reddi: MetaMask Snaps, genel olarak Consensys Software dışındaki üçüncü taraflarca geliştirilmektedir. Üçüncü taraflarca geliştirilen MetaMask Snaps'lerin kullanımı tamamen kendi takdirinize ve riskinize bağlıdır; bu tür faaliyetlerden kaynaklanabilecek herhangi bir kayıp veya zarardan yalnızca siz sorumlu olacaksınız. Consensys, üçüncü taraflarca geliştirilen Snaps'ler için sözlü veya yazılı, açık veya zımni hiçbir garanti vermemekte ve üçüncü taraflarca geliştirilen MetaMask Snaps'ler için tüm sorumlulukları reddetmektedir. Blok zinciri ile ilgili yazılımların kullanımı risk taşımakta olup MetaMask Snaps'i kullanırken bu riskleri tamamen üstlenmiş olursunuz.

Yapay zeka tarafından çevrildi. Hatalar içerebilir. Lütfen her zaman bilgileri doğrulayın.

Çeviriyi değerlendir

Bu makalenin yazarı:

  • MetaMask

    MetaMask, eski adıyla Consensys Software Inc, dünyada yaklaşık 190 ülkede kullanıcılara ulaşarak insanlara hem kripto hem de geleneksel varlıklar genelinde paralarını tutma, harcama, biriktirme ve büyütme imkânı sunan, dünyanın en büyük self-custodial finansal platformudur. Şirket, ödemeleri, tasarrufları, yatırımları ve dijital varlıkları tek ve kesintisiz bir deneyimde bir araya getiren tüketici platformunu inşa etmektedir. Dünyanın en yaygın kullanılan self-custodial cüzdanından büyüyen MetaMask, kullanıcılara para ve varlıkları üzerinde doğrudan kontrol imkânı tanımaktadır. MetaMask, 2016'dan bu yana Ethereum'un büyümesinde temel bir rol üstlenmiştir. Bugün MetaMask, blokzincir ekonomisinin merkezinde yer alarak Açık Para için işletim sistemini inşa etmekte ve insanları finansal yaşamları üzerinde tam anlamıyla söz sahibi kılmaktadır.

    Tüm makaleleri oku