使用Ethereum ens和IPF构建永久和审查的博客

2021-06-29 23:03:34

现在互联网是短暂的。在在线分发内容必需的三层上的图层是在线分发内容。它需要持续的维护,易受审查或敌对的侵袭。在本博客文章中,我描述了我使用IPFS网络和Ethereum BlockChain在无限,永久和审查的方式中托管我的博客的步骤。

我们将涵盖许多主题,包括NFT,Ethereum Smart合同和ENS域,但您不需要熟悉任何一个。这篇文章旨在帮助您为您的无数无限和分散的网站配置您的无限制和分散的网站,即使您没有任何与链条相关的经验。

免责声明:本博客文章中提供的信息仅供教育目的。请对自己试图规避审查的潜在后果进行研究。

由于我开始博客,因此我的目标是在我拥有的基础设施上发布。像媒介这样的平台发布正在免费赠送您的工作。不要这样做。如果您信任公司永久托管您的内容,您可能希望阅读雅虎团体的故事,并且绝望的社区试图挽救它们。

此博客是使用Nginx Server上的AWS EC2实例上托管的Jekyll,并通过CloudFlare CDN分发了一个静态网站。 CloudFlare也是我域名的注册商。

此博客的设置与标准Web Toolkit一起获得专有。然而,说我正在控制它,这将是一个巨大的夸张。

这个博客有一个公共汽车因子。如果我未能资助或续订信用卡,我的所有博客帖子都会在一个月或两个月内消失。我能希望最好的是,有人最终会购买返回这个域名来收集SEO的反向链接。

最近我开始探索加密货币的生态系统和区块。事实证明,它比赌博和价格过高的小猫更多。阅读如果您想了解慢慢新兴的Web 3.0如何帮助您的在线存在更加独立和永久性。

IPFS是用于服务静态资产的HTTP的替代协议。将其与HTTP区分开的主要原则是文件由其内容而不是位置的加密散列(所谓的CID - 内容标识符)解决。文件与文本Hello World!将始终被解决为IPFS:// qmxgbq2xjkmqvo8jzdziyudnmnbiwjbpaycy5rbfdbojrm无论如何,如果美国或印度的节点服务于它。

如果您的浏览器支持它(勇敢或歌剧),您可以直接使用IPFS协议。否则,您可以使用可用的众多HTTP网关之一访问它,即CloudFlare:

额外的奖金是,由于文件的地址源自其内容,因此您可以始终验证它是否没有被篡改。安装IPFS CLI后,您可以检查我们的Hello World!通过运行以下命令确实是合法的:

另一个强大的副作用是与他们的位置托管文件相反,基于内容的寻址意味着您可以轻松实现最终的冗余。如果您在AWS S3和暂停帐户上寄存资产,则无法再访问它们。只要至少有一个托管它们,就可以下载IPFS资产。我们将讨论如何在本文后面帮助您的网站的永久性。

此博客帖子绝不是尝试对IPF的全面介绍。但我想快速解决常见的误解。

IPF在云中不是免费存储。 noone将免费托管您的文件。某些节点可能会暂时缓存它们,但除非您使用所谓的商业“固定服务”或自己运行24/7节点,您的文件最终将从网络中消失。

IPFS是不可溶解的,因此只要至少一个副本留在点对点网络中,就可以访问文件。 2017年,加泰罗尼亚政府利用IPF来绕过西班牙的审查企图。此外,在土耳其政府禁止它之后创建了一个不可批准的维基百科。但是,IPFS不是匿名的。所有节点都公开宣传他们的IPS以及他们托管的文件。这意味着分配非法内容可能会产生后果。

将文件上传到IPFS后,只要至少一个节点托管它就无法删除。您无法强制其他节点删除文件。

除非另有配置,否则您的节点将暂时缓存您访问的所有内容并将其分发到网络的其余部分。但是,您未访问的文件将永远不会被节点自动托管。

简短的答案,是的。较长的答案以下,但扰流器警报:它尚未简单。

当我开始将这个网站迁移到IPF时,我的方法是尽可能靠近金属。少数服务可以帮助托管您的网站上IPFS。但是,这些是额外的信任第三方,我希望避免遵循“任何可信赖的第三方是安全漏洞”的规则。

要将内容上传到IPFS网络,您需要从安装IPFS CLI开始。在MacOS上,这是一个简单的键入:

有关如何在其他系统上安装的信息,请参阅官方文档。

本教程的其余部分假定您有一个包含静态网站内容的文件夹。我正在使用jekyll,但是,无论您使用的工具包如何生成它,以下过程都会相同。

接下来,您必须制作所有内部链接相对。我们将使用主文件夹的IPFS CID而不是单个文件的哈希值进行链接。这意味着我的CSS链接必须如下所示:

否则,它将无法正确解析IPFS路径。有一个很好的工具,可自动化此过程NPM全相对包。让我们使用它:

Jekyll生成带有HTML扩展的文件。在IPF上,没有nginx服务器将转换/关于about.html文件的路径。我们需要从index.html以外的所有文件中剥离此扩展名。在_blog_ipfs文件夹中,运行这些命令:

现在我们已准备好将我们的静态网站上传到IPFS网络。在父文件夹中,运行以下命令:

如果[-f〜/ .ipfs / api];然后导出new_cid = $(ipfs添加-r -cid-version 1 _blog_ipfs | tail -1 |剪切'' -f2)else echo" ipfs守护程序未运行" ; FI.

它检查本地IPFS节点是否正在运行,上传整个文件夹,并在$ new_cid变量中保存其哈希值。

此时,您应该能够通过公共网关访问您的博客。假设您的CID是BAFYBEIAHPN3ZPSP27KYXRTBELH56W7N3DJORILV7UM3N7DF4FPBQ5GIBE您可以使用以下链接:

我们的网站现在在公共IPFS网络中可以访问。但是,我们只使用本地节点上传我们的文件。这意味着当我们的计算机脱机时,在从其他节点缓存中清除后,网站可能不再可到达。

让我们使用前面提到的“Pinning”服务来解决它。目前,我正在向Pinata Cloud和Infura上传我的博客的每个新版本。由于文件由其内容的散列而不是位置而解决,因此可以上传到多个提供商。

这两个服务都有支持HTTP API。获取凭据后,您可以使用像这样的Pinata:

Curl -X帖子" https://api.pinata.cloud/pinning/pinbyhash" \ -h" Pinata_api_key:$ pinata_api_key" \ -H" Pinata_secret_api_key:$ pinata_secret_api_key" \ -H"内容类型:应用程序/ JSON" \ -d" {\" hashtopin \" :\" $ new_cid \" ,\" Pinatametadata \" :{\"名称\" :\" blog_release \" }}}}}}"

我对这个设置并不完全满意。两种服务目前都依赖于我的信用卡。我很乐意找到一项服务,允许我前面预付存储期限。曾经有过的eEREREREN,这就是这样的工作,但他们不再是新的客户。

有很多关于FileCoin的讨论,旨在以无数方式存储文件。但是,我找不到支持托管IPFS文件夹文件的生产就绪服务,并由FileCoin协议备份。如果您知道可靠的东西,请在评论中告诉我。

与我以前的基础架构相比,两个提供者而不是单个EC2实例仍然是相当大的改进。这种生态系统正在快速发展。我期待在几个月内重新审视我的设置的一部分。

您现在可以联系您的受众,但这些网址只是丑陋,不可能记住。让我们看看我们如何改进它。

使用DNS系统解决IPFS文件的标准方法是使用所谓的DNSLink。它是一个TXT DNS记录,将网站URL映射到其相应的IPFS CID。我正在镜像IPFS子域内的此博客的内容:

有关为什么我没有迁移根域的更多详细信息将稍后提供。

您可以通过运行以下命令查看此博客的当前DNSLink条目:

在部署过程中使用以下CURL调用以更新TXT DNS条目,并在CloudFlare中使用新的CID值更新:

卷曲-x put" https://api.cloudflare.com/client/v4/zones/ $ cloudflare_zone_id / dns_records / $ ipfs_dns_id" \ -h" x-auth-email:$ cloudflare_email" \ -h" x-auth-key:$ cloudflare_api_key" \ -H"内容类型:应用程序/ JSON" \ -d" {\"类型\" :\" TXT \" ,\"名称\" :\" _dnslink.ipfs \" ,\" TTL \" :1,\"内容\" :\" dnslink = / ipfs / $ new_cid \" }"

确保始终始终使DNSSEC能够至少以某种方式减轻DNS查询结果的篡改威胁。

我们仍然依赖我们的域名及其注册商作为可信赖的第三方。这意味着这种解决方案无处可靠,靠近承诺的审查抗性和无信任。

让我们看看Ethereum的姓名服务如何帮助我们改进。

ex是分享您的加密货币钱包地址和其他数据等社交媒体帐户的简单方法。 Pawelurbanek.eth,以防一个读者决定抛出一些Eth或Crypto Kitties捐赠我的方式。

有关域所有权和所有相应元数据的信息仍然存在于Ethereum BlockChain中。除了域名的成本(5美元/年),您还必须支付燃气费。只要您认为合适,您可以索取域名所有权。相反,CloudFlare域名注册商最多支持10年。能够为不受限制的时间购买您的域名是迈向您在线存在持久性的极好一步。

有一个特殊的内容条目,允许您指定应该为您的域分配的IPFS文件的CID哈希。它将在我们的案例中显示文件,以前构建的网站到访问者。没有更多笨重的哈希地址!

链接后缀是必要的,因为Eth不是标准浏览器支持的顶级域。从理论上讲,勇敢和歌剧已经增加了本机支持,但我发现它是随机滞后,有时完全破碎。在Firefox和Chrome上,您可以通过流行的MetAmask扩展为欧尔域添加支持。不幸的是,它有点令人困惑,因为你必须用https命名域名://。您还可以使用不需要手动前缀的不可悬挂的域扩展名。

请注意,ENS还在引擎盖下使用DNS协议。您可以通过运行此命令检查您的域为您的域添加了哪些TXT条目:

这是一个尊敬的内容是一个不可阻挡的域项目,与ENS类似。它提供了更酷的Crypto域扩展。

这两个项目以NFT的形式分配域(非污染令牌,ERC271标准)。这意味着所有权是在国内区块链上确认的,不能篡改。由于NFT是一个统一的标准,您可以通过登录流行的NFT Marketplace OpenSea来查看所有域。

基于区块链的寻址消除了可信赖的第三方,即iCann依赖域名注册商。一个下行的是,每次数据更新成本金钱,写作时〜1.5美元。此外,对于必须安装扩展或使用链接后缀的访问者来说,这是一个略有的不便。

在审查时,可以通过政府级别的行动者进行审查* .eth.link命名空间中的子域。但是,您的IPFS网站的CID可以始终从区块链或Web3 JavaScript API直接检索:

但是,你能完全信任Ethereum ens系统吗?我认为这一切都取决于你的偏执狂和信任问题。在理论上,您必须可以访问私钥以更新与域相关的数据。但在实践中......

“钥匙圈可以取代管理发布和管理域(在.eth或任何其他顶级域的域)的合同,使其最终控制ENS系统的结构和注册的名称。”

“随着时间的推移,我们计划减少和分散对系统的人类控制”

这意味着目前,奴役不是100%无信任。如果您想以完全在您的控制范围内的方式分发您的内容CID,并且无法审查,您可以使用自定义形象智能合同。智能合约是部署到Ethereum区块链的不可变计划。您可以将其作为广告本网站最近的CID的媒介。 UX会很糟糕。潜在用户必须在etherscan上或直接从街区读取其专有的全节点上的原始合同状态。

但是,我无法想到更好的方法可以以100%独立于任何第三方的方式公开分发信息。反馈赞赏。

查看可以为此目的提供稳定智能合同的示例代码:

合同CIDStorage {地址公众不可变老板= MSG。发件人; UINT256 Public Updatedat =块。时间戳;字符串公共CurrentCID;函数setnewcid(string memory _newcid)外部{carger(msg。发件人==所有者,"访问被拒绝!"); currentcid = _newcid; updatedat =块。时间戳; }}

我已将此示例合同部署到Ropsten测试网络。即使您没有配置MetAmask扩展,您也可以读取其状态。

这是我目前用于构建和部署我的Jekyll网站的完整脚本。

如果 [ ! -f〜/ .ipfs / api];然后回声" IPFS守护程序未运行" ;退出1; fi jekyll_env =生产jekyll构建--destination _blog_ipfs / cd _blog_ipfsall-相对于文件中的文件;html;做mv - " $文件" " $ {file %%。HTML}}}"完成MV index index.html CD ..导出new_cid = $(ipfs添加-r -cid-version 1 _blog_ipfs | tail -1 |剪切'' -f2)回声"新的发布CID:" echo $ new_cid echo $ new_cid> letware_ipfs_release.txtcurl" https://cloudflare-ipfs.com/ipfs/ $ new_cid /" > / dev / nullcurl -x put" https://api.cloudflare.com/client/v4/zones/ $ cloudflare_zone_id / dns_records / $ ipfs_dns_id" \ -h" x-auth-email:$ cloudflare_email" \ -h" x-auth-key:$ cloudflare_api_key" \ -H"内容类型:应用程序/ JSON" \ -d" {\"类型\" :\" TXT \" ,\"名称\" :\" _dnslink.ipfs \" ,\" TTL \" :1,\"内容\" :\" dnslink = / ipfs / $ new_cid \" }"卷曲-X帖子" https://api.pinata.cloud/pinning/pinbyhash" \ -h" Pinata_api_key:$ pinata_api_key" \ -H" Pinata_secret_api_key:$ pinata_secret_api_key" \ -H"内容类型:应用程序/ JSON" \ -d" {\" hashtopin \" :\" $ new_cid \" ,\" Pinatametadata \" :{\"名称\" :\" blog_release \" }}}}}}"睡眠45curl -x post" https://ipfs.infura.io:5001 / api / v0 / pin / gave?arg = $ new_cid" \ -u" $ infura_ipfs_project_id:$ infura_ipfs_project_secret"

此脚本不会自动更新ENS域中的CID哈希值。它的成本〜1.5每部署1.5美元,因此我只需要手动进行主要版本。我使用卷曲调用CloudFlare IPFS网关来加快新的上传传播。睡眠45是必要的,以防止超时在试图在网络传播之前针对Invura中的新CID。

如前所述,我尚未决定将我的根域迁移到IPFS。所描述的设置有一些缺点。让我们一对一地覆盖它们:

我的评论系统评论评论期望单个预定义的域。可以通过任何网关或本地浏览IPFS网站,因此它无法正常工作。现在,只有通过根域访问我的博客,就可以评论。

不可能为使用dnslink.instead配置的IPFS网站添加客户端缓存标题,他们使用Eetag进行缓存。它不是灾难,但在每个页面刷新时生成不必要的额外304请求。通过“ugly”CID URL访问的网站使用正确的客户端缓存,但是浏览UX的成本。

您可以通过运行以下命令,将缓存相关标题用于“ung”与“ugly”URL使用:

您会注意到后者缺少缓存控制标题。这不是一个错误,而是对这个设置的限制,因为添加此标题可能会导致新版本的陈旧缓存问题。

不幸的是,我注意到加密和eth.link域都会随机失败。不时我的网站不会加载并卷曲呼叫返回以下DNS结果错误:

它通常在几次尝试后固定自己。与自定义域的DNSLink比Eth.Link和Crypto扩展更可靠地工作。

我的大多数流量来自Google搜索结果。我担心这个网站的降级可靠性可能会损害其SEO评级。镜像到IPFS的所有帖子都使用rel =&#34宣传其作为规范版本的根域副本;规范标记。我怀疑我注意到的问题的主要罪魁祸首是目前已知不完美的所谓IPNS(行星际名称系统)。我相信这种情况会随着时间的推移而改善。但是,现在,我不会冒险移动域,这取决于SEO有机流量到IPF。

此博客已经存在一段时间,我使用了一些自定义nginx重定向规则来挽救我的旧反线线并顺利掌握不再支持Google AMP页面。 IPF不允许进行这种微调控制。新的网站或具有更简单的SEO相关要求的问题可能不存在此问题。

我的网站可能不是使用IPFS作为其主要托管平台的完美候选者。但是,我相信,对于一些用例,所提到的任何问题都不会超过运行不可互动和分散的网站的好处。

这篇文章比我预期的要长得多得多。恭喜结束!正如我所提到的那样,这些是我在Web 3.0生态系统中的第一步,所以我可能会混合一些东西。如果您注意到任何错误,请在评论中告诉我。

我想夸大,所描述的设置与匿名无关。您的网站可能会从外部无法兴奋,但可以根据IPFS节点或区块链操作跟踪您的公共IP地址。

未来互联网的愿景是由用户分散和控制的未来互联网,而不是几个IT巨头非常令人兴奋。 目前的Web 3.0生态系统提供了一些真正独特的功能,但仍处于一个非常粗略的状态。 我相信现在可能是作为早期采用者参与的完美时间。 由于Scoutapm赞助我的博客的Ruby和Rails性能相关内容,因此广告很大。 如果您想尝试侦察侦察,您可以在此处查看: