使用去中心化存储构建网站

news2024/11/25 14:37:46

今天的大多数网站都遵循后端服务器到前端代码的架构。但在 Web3 应用程序中,前端代码不具有与受智能合约保护的后端代码相同的去中心化性和弹性。那么如何使网站像智能合约一样具有弹性呢?

该体系结构似乎很简单:

  1. 创建一个没有服务器的静态网站。
  2. 在去中心化的存储空间托管代码。
  3. 将“入口”放在一个地方,指向去中心化的地址。

为此,我们不得不进入去中心化存储的“兔子洞”。了解这些不同的解决方案可以帮助我们创建最去中心化的网站。

你可以在此处查看我们将要引用的所有代码。

1. 制作静态网站

由于我们试图开发“不可阻挡”的网站,我们需要确保我们没有单点故障的风险。如果我们的网站需要对中央控制的服务器进行 HTTPS 调用,我们就创建了一个故障点。

所以我们需要创建一个静态站点,其中的 HTML、Javascript 和 CSS 文件都是从去中心化的存储位置提取的,我们没有任何 Javascript 或服务器语言运行代码来帮助支持该站点。

对于熟悉 Web 开发的人来说,这是一项非常简单的任务。你可以创建一个包含 HTML、JS 和 CSS 的页面。然后你就完成了。还有更高级的框架可以帮助你做到这一点,例如 Gatsby、Hugo 和 Eleventy。

我们使用 NextJS 的静态导出功能来做展示页面,当然你也可以使用 React 或功能更强大的框架来做到这一点。我们创建了这个演示站点,它只是展示这只青蛙的图片,并且有一个指向 Discord 通过 32 小时的 FreeCodeCamp Javascript & Solidity 课程帮助开发者学习。

如果我们愿意,我们仍然可以让我们的网站与像以太坊这样的区块链作为后端进行交互,因为去中心化的后端不会再多增加一层中心化。

现在我们有了网站,接下来我们必须弄清楚在哪里托管它。

2. 托管站点:尝试使用 ETH

作为一名 Web3 开发者,我的第一个想法是:为什么不是以太坊?

现在,我们可以将所有数据存储在以太坊或其他 EVM 链上。但无论我们怎么做,它的代价都太过高昂。

与其尝试将我们的文件夹复制粘贴到合约中的存储变量中,更聪明的方法是将整个站点进行 base64 编码,将其编码为一个巨大的 URI,我们可以将其存储在一个或多个存储变量中。

我摆弄了几个小时,试图让这种方式在费用方面不那么夸张,然后我放弃了。即使在 Arbitrum 上,存储所有这些数据看起来也至少要花费 200 美元。但是,对于较小的站点,这将是一种可行的方法。

因此,我创建了一个质量很差的网站 SVG,对其进行 base64 编码并将其作为 NFT 发布在 Arbitrum 上。

现在,在看我的下一次尝试之前,使用 base64 编码,我用来使数据 URI 更小和更高效的一种方法是将我的网站代码扁平化到一个 HTML 文件中。这意味着手动检查我的 index.html 文件并用这些文件的 base64 编码替换对其他文件的引用,或者只是将代码复制粘贴到 HTML 文件中。

这很重要,因为我们将这种扁平化用于未来的尝试。因此,尽管我们认为 EVM 合约不是最好的,但我们仍然学到了很多东西,我们将在本文总结中再回到以太坊,将这些知识联系在一起。

3. 托管站点:尝试使用 dStorage

所以以太坊和其他 EVM 链不适合存储大量数据。那么,有什么其他的解决方案?

Sia、Arweave 和 Filecoin。

你会注意到我没有提到 IPFS。我们很快就会讨论 IPFS。

Arweave

让我们从 Arweave 开始。在 Arweave 上存储数据与在以太坊上存储数据几乎完全相同。一旦你存储了数据,它就会永远存在。这称为“基于区块链的数据持久性”,意思是每条数据都存储在 Arweave 网络上。正因为如此,在写这篇文章的时候这个区块链已经存储了 112 TB 的数据,即使它只存在了大约四五年。

因此,为了将数据存储在 Arweave 上,我需要运行一个 Arweave 节点……我不想这样做,所以我使用了一个名为 arkb 的集中式工具来发送数据以存储我的网站。它类似于以太坊的 Infura 或 Alchemy RPC URL,即一种 Arweave 节点即服务。对于 arkb,我不得不稍微扁平化我的网站,因为它只理解相对导入,而不理解 base64 编码的数据 URI。如果我运行自己的 Arweave 节点,我确信我可以使用我的数据 URI。

接下来就成功了,我们可以使用这个 Arweave 浏览器查看我们创建的用于将数据存储在 Arweave 上的交易,然后我们可以使用 Arweave 网关从区块链读取数据并呈现我们的网站! Arweave 区块链上的所有数据都是公开的,因此请记住只更新你认为大家都能看到的数据!

下面是关于存储规模的说明。

你可能会想,“哇,112 TB 的数据量很大,Arweave 链如何保持增长才可行?” Arweave 有一些聪明的共识机制,可以更容易地不必在每个节点上拥有每一条数据,它已经对数据存储成本进行了研究,并认为数据存储将变得越来越便宜,因此不断增长的链规模不会是一个问题。但这是区块链普遍面临的一个问题,称为“状态爆炸”。

12-1.png
显示状态膨胀问题指数增长的图表

状态膨胀是指区块链拥有大量无用数据,不再需要或无法访问,但由于共识的工作方式,你需要所有数据来计算未来数据的哈希值。

因此,Sia 和 Filecoin 网络采用了不同的数据持久化方法,而不是使用“基于合约”的方法。

Sia

Sia 网络由存储数据的主机组成,这些主机与租户(renter)签订合约协议,合约存储在 Sia 的工作量证明区块链上。

使用 Sia,我可以通过查看文档来启动和运行自己的节点,没有问题,并且区块链只有大约 40 GB,因为链存储的是协议信息而不是数据本身。它甚至带有一个 UI!然后我能够将我们的数据放入 UI 中,以与 Sia 区块链上的其他节点达成交易。

Sia 使用周期性的挑战来强制主机保留数据,如果他们无法提交证明他们拥有数据的证据,他们将受到经济上的惩罚。

12-2.png
显示 Sia 如何使用周期性挑战强制主机保留数据的图表

现在这是我们遇到的第一个问题。 Sia 区块链是一个很注重安全性的链,我们的数据在存储时实际上会在许多主机之间进行拆分和加密,只有存储数据的人拥有私钥才能解密。因此,即使我可以看到数据的交易哈希,也只有我可以访问它,因为我是唯一拥有私钥的人。

这就是 Skynet 的用武之地,Skynet 是一种允许人们在其他人的节点上租用数据的工具,一种开源的 Sia 即服务。如果我们将数据上传到其他人的 Skynet 门户,这些门户会提供一种使用我们上传的文件夹或文件的哈希值自动呈现网站的方法。

这种方法的一个主要问题是我们必须相信他们正在为我们提供良好的数据并且没有篡改它。这意味着该网站也不会“不可被阻挡”。如果它们出现故障,我们将失去该站点。我们可以运行自己的门户网站,让人们可以访问我们的数据,并在我们的网站上发布证明,以便用户可以在他们这边进行验证,但这样用户门槛就太高了。

如果我们想创建一个只有我们才能访问的“不可被阻挡”的网站,例如内部网或私人文档,Sia 是完美的选择。

Sia 社区正在努力让这一切在未来变得更容易,我在他们的 Discord 中与他们进行了一些精彩的对话。

IPFS

现在,让我们简单谈谈 IPFS。你可能已经看到我们将 IPFS 用于 NFT 数据。 IPFS 是存储公共分布式数据的绝佳工具。你将数据放在 IPFS 节点上,获得哈希值,然后你可以将该哈希值共享给运行节点的人以验证数据。但它缺乏数据持久性。任何人都可以将数据添加到 IPFS 网络,允许任何人访问它,但如果没有人保留该数据,则没有人可以从哈希中获取数据。并且没有动力让某人固定数据。

因为它对于分布式数据来说是一个快速而可靠的选择,所以我们确实将我们的站点发布到 IPFS,并且我们至少可以将它存储到我们的节点。如果全世界的人都存储我们的网站,那这个网站可能会变得“不可被阻挡”。

我们所要做的就是对站点进行静态导出并将整个文件夹固定到 IPFS 上,现在我们可以将 CID 放入任何兼容 IPFS 的浏览器或任何具有 IPFS 扩展的浏览器中。

Filecoin

现在,这就是 Filecoin 的用武之地。Filecoin 是一种区块链,它为人们托管你的数据增加了经济激励,并在我们的 IPFS 哈希之上添加了数据持久性。

然而,即使在我自己运行了一个节点之后,现在将 Filecoin 与 IPFS 结合使用对我来说也太困难了。所以我打开了 web3.storage 来帮助我。 web3.storage 是一个集中式站点,有助于简化去中心化存储交易。它可能会阻止我与 Filecoin 的交易,然后我只需要回过头来弄清楚如何自己通过 Filecoin 节点达成一个交易。但是一旦我将数据放到 Filecoin 上,我就不再需要它们了(呵呵)。

与 Sia 类似,Filecoin 使用“基于合约”的数据持久性,但它不是“加密”你的数据,而是“密封”它。这意味着它是隐藏的,但任何人都可以支付检索节点来检索数据。
你可以通过查看 Filfox 区块浏览器(或探索我们的节点)来了解我们的网站在 Filecoin 网络上的持续时间。 Filecoin 节点在底层也是 IPFS 节点,并且可以选择将数据固定到 IPFS。然后我们也可以获取 CID 并将其放入我们的 IPFS 节点以呈现存储在 Filecoin 上的数据。

你可以将 Filecoin 想象成一个巨大的市场,例如 Sia,其中的节点正在签订合同并放置抵押品来存储数据。然后,区块链通过询问随机数据片段来定期挑战随机节点。如果他们丢弃数据,他们将受到惩罚。

所以我们可以确定我们的网站在 Filecoin 上是安全的,如果我们想把它永远保存在那里以及在 IPFS 节点上,我们只需要在每次启动时重新启动合约。目前 Filecoin 合约的时间不能超过两年,而且该节点比 Sia 节点大很多。

Filecoin 数据大小是 TB 级别,这增加了我在运行节点的困难。此外,Filecoin 不会自动将数据固定到 IPFS,这很好,因为我们也希望能够在 Filecoin 上存储数据,但大多数 Filecoin 节点都可以选择。我们确实在那里遇到了一些中心化问题,因为我们必须相信我们的 Filecoin 节点会固定我们的数据,并且没有动机让他们固定数据。我们可以让某人支付 Filecoin 节点以获取数据并显示 CID 以确保它是我们想要的数据,但这些解决方案仍在研究中。

所以我们遇到了 Sia 遇到的同样问题——没有私钥或我们自己无法访问节点,如果节点不固定我们的数据,我们是唯一可以查看我们网站的人。或者你必须随时为要从网络中提取的数据付费。

回顾最初的目标

为了让我们的网站真正“无法被阻挡”,我们:

  1. 对站点进行快照并将其存储在以太坊上。
  2. 将我们的网站存储在 Arweave 区块链上。
  3. 将我们的网站存储在 Sia 区块链上,这样至少我们可以随时访问该网站。
  4. 自己固定到 IPFS。
  5. 让 Filecoin 节点也将其固定到 IPFS。

所以我们很好,对吧?这可能有点矫枉过正,但我​​们通过使用多个 dStorage 位置使我们的站点变得有冗余性。我们需要做的最后一件事是拥有某种类型的映射,表明我们的 uns ⊤ pab ≤ og 站点映射到这些不同的 dStorage 位置。

如果我们的网站有一个人类可读的版本而不是这些不可读的哈希值,那就太好了。

对我们来说幸运的是,我们知道有一条链是可靠的,我们可以使用它来将人类可读的名称映射到这些不同的位置,这就是以太坊名称服务。

ENS 是 ETH 区块链上的智能合约,您可以在其中将人类可读的名称映射到这些更复杂的哈希值。我们买了一个名为“unstoppablefrog.eth”的名称,并将我们的 IPFS 哈希添加到内容部分。那里有一个中心化服务器,可以将 .eth 域映射到名称的内容哈希中的任何内容,因此如果我将“unstoppable frog.eth”输入地址栏,我就会得到我们网站的渲染图。

如果该服务器出现故障,任何人仍然可以访问智能合约并自己获取哈希值,因此我们的数据是永久安全的。如果我们的 IPFS 哈希出现故障,我们可以查看描述部分并查看所有这些备份,任何人都可以路由到这些描述之一,而不是仅仅从内容中提取。这为某人提供了一个单一的规范位置,可以读取我们存储数据的所有不同分散位置。

希望我们的网站“不可被阻挡”。

Tor

我们可以做的最后一件事是为我们的“不可阻挡性”添加另一层,即为我们的 ENS 数据添加一个洋葱地址。洋葱地址是通过 Tor 浏览器的网站,Tor 浏览器是一种帮助匿名化用户的点对点网络。将我们的网站放在 Tor 上会增加一个难以删除的托管位置。

12-3.png
显示 Tor 如何加密数据的图表。原始来源:https://2019.www.torproject.org/about/overview.html.en

总结

我希望你能从中学到很多东西。下面是包含我所有代码、实验和笔记的 GitHub Repo,我期待将来使用 dStorage 作为我的智能合约的数据库,而 Chainlink 作为连接两者的中间件。

GitHub: https://github.com/PatrickAlphaC/unstoppable-ui

不可阻挡的网站:https://unstoppablefrog.eth.link/

欢迎关注 Chainlink 预言机并且私信加入开发者社区,有大量关于智能合约的学习资料以及关于区块链的话题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/392249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CorelDRAWX4的VBA插件开发(四十四)建立类(1)汇总相似功能简化重复代码:一键建立设计外框加出血线和等分折页线

这次主要来浅讲一下"类"这个功能,先上一下要实现的功能,建立设计外框加出血线和等分折页线,先上图 那什么是类呢?类其实就是CLASS,用来封装成员参数和函数的,拆开来里面就是这些东西,那写起来其实也没有什么区别,那既然都是参数和函数,那类的出现有什么意义呢.那我…

聚观早报 | 京东百亿补贴今日上线;微软推出全能型人工智能模型

今日要闻:京东“百亿补贴”今日全面上线;小鹏回应人脸识别需对车头半跪;微软推出全能型人工智能模型;雷军建议构建完善汽车数据安全管理体系;苹果、Meta已向国内Micro LED企业下单京东“百亿补贴”今日全面上线 3 月 6…

创建springboot项目文件报红

目录 一、遇到问题 二、出现这个问题的原因 三、解决办法 三种方法 四、操作步骤 一、遇到问题 创建springboot项目的时候,会发现一些重要文件都变成红色了,但是不影响程序的运行。只是看起来会有点不舒服。 二、出现这个问题的原因 因为这个spr…

初识虚拟DOM渲染器

初识虚拟DOM渲染器什么是虚拟DOM什么是渲染器渲染器的实现组件是什么什么是虚拟DOM 首先简单说一下什么是虚拟DOM&#xff0c;虚拟DOM就是一个描述真实DOM的JS对象 例如&#xff1a; 真实的DOM元素 <div onClick"alert(click me)">click me</div>可以…

12 结构:如何系统设计框架的整体目录?

到现在&#xff0c;我们已经将 Gin 集成到框架 hade 中&#xff0c;同时又引入了服务容器和服务提供者&#xff0c;明确框架的核心思想是面向服务编程&#xff0c;一切皆服务&#xff0c;所有服务都是基于协议。后续也会以服务的形式&#xff0c;封装一个个的服务&#xff0c;让…

ESP-C2系列模组开发板简介

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…

空间复杂度与顺序表的具体实现操作(1)

最近更新的少&#xff0c;主要是因为参加了ACM竞赛空间复杂度空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量…

项目使用windows-root证书

项目使用windows-root证书 将证书导入到本地计算机 方式1&#xff1a;使用windows-root证书配置流程(计算机本地) 输入命令(mmc)&#xff0c;进入控制台管理窗口 点击“文件”》“添加或删除管理单元”&#xff0c;进入如下界面 双击证书&#xff0c;选择“计算机账户”…

Swagger生成接口在线文档

OpenAPI规范&#xff08;OpenAPI Specification 简称OAS&#xff09;是Linux基金会的一个项目&#xff0c;试图通过定义一种用来描述API格式或API定义的语言&#xff0c;来规范RESTful服务开发过程&#xff0c;目前版本是V3.0&#xff0c;并且已经发布并开源在github上。&#…

C++核心编程<类和对象>(4)

C核心编程<类和对象>4.类和对象4.1封装4.1.1封装的意义封装的意义1封装的意义24.1.2struct和class区别4.1.3成员属性设置为私有4.2对象的初始化和清理4.2.1构造函数和析构函数1.1构造函数语法&#xff1a;类名(){}1.2析构函数语法&#xff1a; ~类名(){}4.2.2构造函数的分…

【JUC2022】第七章 AQS、ReentrantReadWriteLock 和 StampedLock

【JUC2022】第七章 AQS 文章目录【JUC2022】第七章 AQS一、AQS1.概述2.同步器3.抽象的4.队列式二、ReentrantReadWriteLock1.概述2.案例3.存在的问题三、StampedLock1.概述2.案例3.存在的问题一、AQS 1.概述 AQS(AbstractQueueSynchronizer&#xff0c;抽象的队列式同步器)&am…

tesseract -图像识别

下载链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/如下选择最新的版本&#xff0c;这里我选择tesseract-ocr-w64-setup-5.3.0.20221222.exe有如下python模块操作tesseractpyocr 国内源&#xff1a;pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ py…

ThreadLocal 学习常见问题

ThreadLocal 这个此类提供线程局部变量。这些变量不同于通常的对应变量&#xff0c;因为每个访问一个变量的线程(通过 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是希望将状态与线程(例如&#xff0c;用户 ID 或事务 ID)关联的类中的私有静态字段。使…

vue router elementui template CDN模式实现多个页面跳转

文章目录前言一、elementui Tabs标签页和NavMenu 导航菜单是什么&#xff1f;二、使用方式1.代码如下2.页面效果总结前言 写上一篇bloghttps://blog.csdn.net/jianyuwuyi/article/details/128959803的时候因为整个前端都写在一个index.html页面里&#xff0c;为了写更少的代码…

CENTO OS上的网络安全工具(十九)ClickHouse集群部署

一、VMware上集群部署ClickHouse &#xff08;一&#xff09;网络设置 1. 通过修改文件设置网络参数 &#xff08;1&#xff09;CentOS 在CENTOS上的网络安全工具&#xff08;十六&#xff09;容器特色的Linux操作_lhyzws的博客-CSDN博客中我们提到过可以使用更改配置文件的方式…

推荐 7 个 Vue.js 插件,也许你的项目用的上(五)

当我们可以通过使用库轻松实现相同的结果时&#xff0c;为什么还要编写自定义功能&#xff1f;开发人员最好的朋友和救星就是这些第三方库。我相信一个好的项目会利用一些可用的最佳库。Vue.js 是创建用户界面的最佳 JavaScript 框架之一。这篇文章是关于 Vue.js 的优秀库系列的…

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表…

4-3 Linux启动流程

文章目录前言经典启动流程1 按下电源2 开机自检(BIOS)3 MBR引导4 GRUB菜单5 加载内核6 运行init进程7 读取/etc/inittab8 读取/etc/rc.sysinit初始化系统9 运行/etc/rc.d/rcN.d/脚本10 /etc/rc.local11 登录页面logincentos7与centos6前言 Linux系统的启动过程并不是大家想象中…

防静电监控仪可以检测现场设备是否和实际大地接触

随着电子产品集成化度越来越高&#xff0c;对于电子产品装配来说&#xff0c;静电的危害严重影响到产品的质量、成品率和可靠性, 必须对用于电子产品装配的净化间进行系统防静电措施&#xff0c;将生产过程中的静电危害程度降至最低。近年来电子企业对ESD的危害的深入认识&…

代码随想录刷题-数组-二分查找

文章目录写在前面原理习题题目1思路和代码题目-2写在前面 这个专栏是记录我刷代码随想录过程中的随想和总结。每一小节都是根据自己的理解撰写的&#xff0c;文章比较短&#xff0c;主要是为了记录和督促自己。刷完一章后&#xff0c;我会再单独整理一篇文章来总结和分享。 本…