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:
Polysnap (MetaMask Snap)
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.
Polywrap Client
Plugin Wrapper
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:
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ü
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.');
}
};
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.
HTTP Plugin - Wasm Wrapper'dan doğrudan HTTP GET/POST istekleri yapılmasına olanak tanıyan API'yi sunar
IPFS Plugin - IPFS'te dosya depolama, sabitleme ve alma işlemleri için API sunar
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();
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 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:
Geliştirici belgelerini inceleyin
MetaMask Flask'ı yükleyin
Bir MetaMask Snaps kılavuzuna göz atın
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.