625 字
3 分鐘
[Day4] 用Workers做IPFS Subdomain Gateway — 30天學會Cloudflare
2023-05-20
無標籤

IPFS Gateway有兩種非別為Path gatewaySubdomain gateway,而Cloudflare Web3提供的Universal Path gateway就是Path gateway,但我們也可以透過Workers來建構自己的Subdomain Gateway。


Path gateway VS Subdomain gateway#

IPFS的原理我就不多做介紹,我們要知道每個網站上傳到IPFS上後都會有個CID,我們可以將CID設定到DNS的txt紀錄,就可以綁定到網域上。

我們可以透過任Public Gateway來訪問網站,下圖中只有Origin有打勾的才是Subdomain gateway,他會自動跳轉到subdomain,使得網站會在獨立的網域上。

我們舉Cloudflare兩個免費公開的gateway並使用數位部官網為例。可以透過下面這網址進行訪問:

第二個網址會自動跳轉到subdomain的方式,好處是可以避免相對路徑設定不全產生無法瀏覽的問題,對於前端的cookie、localstroage安全性也較高。也可以從上面網址觀察到subdomain會用 - 取代原本網域的 .


CID#

我們也可以透過IPFS的CID訪問網站,透過dig _dnslink.moda.gov.tw txt,可以找到moda.gov.tw的CID是QmZzWQrRStXBBb5pEFaWNh5kEMYwQXeDaf1on7rsL5WAK6。

這時候也可以CID來訪問網站:

你會發現前面出現一個bafy…的東西,那是因為IPFS有規範如果要做成subdomain這串hash有特別算過,可以參考官方文件。由於這部分比較麻煩,我範例就展示如何做IPNS就好。


Universal Path Gateway#

Cloudflare提供Public gateway功能,我們先從建立一個Universal Path Gateway。透過這個Gateway就可以訪問各種網站,跟其他gateway用法一樣,如https://gateway.twcanhelp.me/ipns/moda.gov.tw。


範例#

先構思我們服務的目標,我希望moda-gov-tw.gateway.twcanhelp.me可以訪問到IPFS,所以我們需要讀取hostname再來fetch gateway。而不用建立上面自己的Gateway也沒關係,我們用Pinata gateway為例。程式範例如下:

export default {
async fetch(request, env) {
return new Response("");
try {
const { host, pathname, search } = new URL(request.url);
const dist = host.split(".")[0].replaceAll("-", ".");
const url = "https://gateway.pinata.cloud/ipns/" + dist + pathname + search;
return fetch(url, request);
} catch(e) {
return new Response(e, { status: 500 })
}
}
}

只要訪問a-b-c.twcanhelp.me就會去fetch gateway.pinata.cloud/ipns/a.b.c,取得IPFS內容。再來設定上路由到*.gateway.twcanhelp.me/*,由於我們是用在subdomain下,還需要在Cloudflare另外購買subdomain的SSL憑證。


結語#

今天講到透過Workers就可以簡單實作一個Subdomain Gateway範例,外部提供的Gateway很少,就可以自己做一個。