利用IPFS搭建ENS博客托管

IPFS被诟病存在各种问题,而且使用体验也不尽如人意,但它已经成为实际上的Web3基础设施。与Torrent类似,想要获取到网络上的文件就必须通过专用的程序来进行访问,而一些第三方提供的服务存在例如网络速率、使用流量等方面的种种限制;但他们却也提供了最快快捷的接入方式。

创建托管项目

理论上只要将文件存放在本地并上传至IPFS网络,其他主机就可以直接获取到相关文件。然而由于P2P传输的限制,实际访问速度可能较为缓慢,同时如果本机出现单点故障,也会造成无法访问的问题。

为了实现从Github储存库进行自动化同步,我选取了4everland作为托管提供商。同样的,也可以选择使用fleek进行托管,或是直接将生成好的静态文件存放至任意提供PIN服务的地方,如web3.storage

首先通过MetaMask或其他兼容钱包执行签名进行登录。

Log In
Log In

待登录完成后选择右上角的 "New Project" 创建新项目,并从Github进行同步,之后就可以看到已经部署好的项目。

Project
Project

设置ENS解析

将IPFS内容设置为ENS解析有三种形式。直接作为IPFS内容引入,或通过IPNS通过HASH或DNSLINK形式进行引入。由于每次同步都会生成全新的CID,因此如果使用IPFS方式进行解析,每次都需要重新上链,成本较为高昂,因此着重介绍使用IPNS进行解析的方案。

使用DNSLINK需要准备一个外部域名,通过设置_dnslink的TXT解析,使得例如"dnslink=/ipfs/QmbkR54w3RGgvQrSXeoan6E8ABzVV9g851Krd6JwL9Z8j6"的IPFS能被域名所反向解析。但是由于ContentHash和IPFS对于CID的离谱转码,无法直接在ENS.domains进行设置,因此可以直接前往Etherscan进行合约交互。选择写入,使用setContenthash方法,这时需要我们输入nodehash值。

由于ENS内部会将注册好的域名转换为派生散列,因此我们需要先获取转换后的node值,此处我们使用Node.js实现进行。

首先安装依赖库npm install @ensdomains/eth-ens-namehash -S,然后使用如下实现查询生成值:

var namehash = require('@ensdomains/eth-ens-namehash')
var hash = namehash.hash('sakuradream.eth') //转换ENS地址
console.log(hash)

同样地,我们也需要获取转换后的hash值,该值采用了多重转换,可以使用以下实现:

安装依赖:npm install -g content-hash multihashes bs58

const contentHash = require('content-hash')
const multihashes = require('multihashes')
const bs58 = require('bs58')
const content = multihashes.encode(Buffer.from('sakuradata.com'), 'identity') //转换DNSLink地址
const address = bs58.encode(content)
const racontent = contentHash.encode('ipns-ns', address);
console.log("UTF8: ",content)
console.log("BASE58: "+address)
console.log("ContentHash: 0x"+racontent)

然后在Etherscan链接上钱包,并将生成好的的值对应填写入,发送交易与合约进行交互即可,待交易被打包后就可以访问例如sakuradream.eth.link的地址来进行访问。后续的IPFS CID可以直接通过修改DNSLink的TXT记录进行。

IPNS

相对于DNSLink而言,IPNS无疑简单许多。你可以通过本地的IPFS客户端生成全新的IPNS地址,并在客户端内为其绑定指定的IPFS地址。或者之前复制前述4everland项目中提供的IPNS地址来进行设置,当然你甚至可以直接在项目页面直接用你的钱包发出设置交易。

查看博客页面

如果你使用了一个支持ENS的浏览器,例如Brave或是Opera,或是浏览器上安装了MetaMask插件,可以直接通过你的ENS地址进行访问。或者在你的ENS域名后面添加.link或者.limo来使用公开的网关进行访问。

如果一切顺利,那你只需要稍等片刻,就能够看到你刚刚所搭建好的博客啦~

参考链接

  1. https://github.com/wealdtech/coredns-ens/issues/3
  2. https://github.com/ensdomains/ens-app/issues/849
  3. https://docs.ens.domains/contract-api-reference/name-processing
Subscribe to Leter.io
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.