# 利用IPFS搭建ENS博客托管

By [Leter.io](https://paragraph.com/@leter) · 2022-08-25

---

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

创建托管项目
------

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

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

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

![Log In](https://storage.googleapis.com/papyrus_images/d92976c72ea55378b9e40fbbbc33da634edf2ec1cd2f2b557286c9fafc439e52.png)

Log In

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

![Project](https://storage.googleapis.com/papyrus_images/6bfef3d5bb455bea4b4351fcd1d084804b615f9ab16890ffbb61119e622bf892.png)

Project

设置ENS解析
-------

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

### ENSLink

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

由于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](https://etherscan.io/address/0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41#writeContract)链接上钱包，并将生成好的的值对应填写入，发送交易与合约进行交互即可，待交易被打包后就可以访问例如`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](https://github.com/wealdtech/coredns-ens/issues/3)
    
2.  [https://github.com/ensdomains/ens-app/issues/849](https://github.com/ensdomains/ens-app/issues/849)
    
3.  [https://docs.ens.domains/contract-api-reference/name-processing](https://docs.ens.domains/contract-api-reference/name-processing)

---

*Originally published on [Leter.io](https://paragraph.com/@leter/ipfs-ens)*
