IPFS被诟病存在各种问题,而且使用体验也不尽如人意,但它已经成为实际上的Web3基础设施。与Torrent类似,想要获取到网络上的文件就必须通过专用的程序来进行访问,而一些第三方提供的服务存在例如网络速率、使用流量等方面的种种限制;但他们却也提供了最快快捷的接入方式。
理论上只要将文件存放在本地并上传至IPFS网络,其他主机就可以直接获取到相关文件。然而由于P2P传输的限制,实际访问速度可能较为缓慢,同时如果本机出现单点故障,也会造成无法访问的问题。
为了实现从Github储存库进行自动化同步,我选取了4everland作为托管提供商。同样的,也可以选择使用fleek进行托管,或是直接将生成好的静态文件存放至任意提供PIN服务的地方,如web3.storage。
首先通过MetaMask或其他兼容钱包执行签名进行登录。
待登录完成后选择右上角的 "New Project" 创建新项目,并从Github进行同步,之后就可以看到已经部署好的项目。
将IPFS内容设置为ENS解析有三种形式。直接作为IPFS内容引入,或通过IPNS通过HASH或DNSLINK形式进行引入。由于每次同步都会生成全新的CID,因此如果使用IPFS方式进行解析,每次都需要重新上链,成本较为高昂,因此着重介绍使用IPNS进行解析的方案。
使用DNSLINK需要准备一个外部域名,通过设置_dnslink
的TXT解析,使得例如"dnslink=/ipfs/QmbkR54w3RGgvQrSXeoan6E8ABzVV9g851Krd6JwL9Z8j6"
的IPFS能被域名所反向解析。但是由于ContentHash和IPFS对于CID的离谱转码,无法直接在ENS.domains进行设置,因此可以直接前往Etherscan进行合约交互。选择写入,使用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链接上钱包,并将生成好的的值对应填写入,发送交易与合约进行交互即可,待交易被打包后就可以访问例如sakuradream.eth.link
的地址来进行访问。后续的IPFS CID可以直接通过修改DNSLink的TXT记录进行。
相对于DNSLink而言,IPNS无疑简单许多。你可以通过本地的IPFS客户端生成全新的IPNS地址,并在客户端内为其绑定指定的IPFS地址。或者之前复制前述4everland项目中提供的IPNS地址来进行设置,当然你甚至可以直接在项目页面直接用你的钱包发出设置交易。
如果你使用了一个支持ENS的浏览器,例如Brave或是Opera,或是浏览器上安装了MetaMask插件,可以直接通过你的ENS地址进行访问。或者在你的ENS域名后面添加.link或者.limo来使用公开的网关进行访问。
如果一切顺利,那你只需要稍等片刻,就能够看到你刚刚所搭建好的博客啦~