帮人做网站收多少钱/网站优化建议怎么写
今天的大多数网站都遵循后端服务器到前端代码的架构。但在 Web3 应用程序中,前端代码不具有与受智能合约保护的后端代码相同的去中心化性和弹性。那么如何使网站像智能合约一样具有弹性呢?
该体系结构似乎很简单:
- 创建一个没有服务器的静态网站。
- 在去中心化的存储空间托管代码。
- 将“入口”放在一个地方,指向去中心化的地址。
为此,我们不得不进入去中心化存储的“兔子洞”。了解这些不同的解决方案可以帮助我们创建最去中心化的网站。
你可以在此处查看我们将要引用的所有代码。
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 有一些聪明的共识机制,可以更容易地不必在每个节点上拥有每一条数据,它已经对数据存储成本进行了研究,并认为数据存储将变得越来越便宜,因此不断增长的链规模不会是一个问题。但这是区块链普遍面临的一个问题,称为“状态爆炸”。
显示状态膨胀问题指数增长的图表
状态膨胀是指区块链拥有大量无用数据,不再需要或无法访问,但由于共识的工作方式,你需要所有数据来计算未来数据的哈希值。
因此,Sia 和 Filecoin 网络采用了不同的数据持久化方法,而不是使用“基于合约”的方法。
Sia
Sia 网络由存储数据的主机组成,这些主机与租户(renter)签订合约协议,合约存储在 Sia 的工作量证明区块链上。
使用 Sia,我可以通过查看文档来启动和运行自己的节点,没有问题,并且区块链只有大约 40 GB,因为链存储的是协议信息而不是数据本身。它甚至带有一个 UI!然后我能够将我们的数据放入 UI 中,以与 Sia 区块链上的其他节点达成交易。
Sia 使用周期性的挑战来强制主机保留数据,如果他们无法提交证明他们拥有数据的证据,他们将受到经济上的惩罚。
显示 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 遇到的同样问题——没有私钥或我们自己无法访问节点,如果节点不固定我们的数据,我们是唯一可以查看我们网站的人。或者你必须随时为要从网络中提取的数据付费。
回顾最初的目标
为了让我们的网站真正“无法被阻挡”,我们:
- 对站点进行快照并将其存储在以太坊上。
- 将我们的网站存储在 Arweave 区块链上。
- 将我们的网站存储在 Sia 区块链上,这样至少我们可以随时访问该网站。
- 自己固定到 IPFS。
- 让 Filecoin 节点也将其固定到 IPFS。
所以我们很好,对吧?这可能有点矫枉过正,但我们通过使用多个 dStorage 位置使我们的站点变得有冗余性。我们需要做的最后一件事是拥有某种类型的映射,表明我们的 uns ⊤ pab ≤ og 站点映射到这些不同的 dStorage 位置。
如果我们的网站有一个人类可读的版本而不是这些不可读的哈希值,那就太好了。
对我们来说幸运的是,我们知道有一条链是可靠的,我们可以使用它来将人类可读的名称映射到这些不同的位置,这就是以太坊名称服务。
ENS 是 ETH 区块链上的智能合约,您可以在其中将人类可读的名称映射到这些更复杂的哈希值。我们买了一个名为“unstoppablefrog.eth”的名称,并将我们的 IPFS 哈希添加到内容部分。那里有一个中心化服务器,可以将 .eth 域映射到名称的内容哈希中的任何内容,因此如果我将“unstoppable frog.eth”输入地址栏,我就会得到我们网站的渲染图。
如果该服务器出现故障,任何人仍然可以访问智能合约并自己获取哈希值,因此我们的数据是永久安全的。如果我们的 IPFS 哈希出现故障,我们可以查看描述部分并查看所有这些备份,任何人都可以路由到这些描述之一,而不是仅仅从内容中提取。这为某人提供了一个单一的规范位置,可以读取我们存储数据的所有不同分散位置。
希望我们的网站“不可被阻挡”。
Tor
我们可以做的最后一件事是为我们的“不可阻挡性”添加另一层,即为我们的 ENS 数据添加一个洋葱地址。洋葱地址是通过 Tor 浏览器的网站,Tor 浏览器是一种帮助匿名化用户的点对点网络。将我们的网站放在 Tor 上会增加一个难以删除的托管位置。
显示 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 预言机并且私信加入开发者社区,有大量关于智能合约的学习资料以及关于区块链的话题!
相关文章:

使用去中心化存储构建网站
今天的大多数网站都遵循后端服务器到前端代码的架构。但在 Web3 应用程序中,前端代码不具有与受智能合约保护的后端代码相同的去中心化性和弹性。那么如何使网站像智能合约一样具有弹性呢? 该体系结构似乎很简单: 创建一个没有服务器的静态…...

L - Let‘s Swap(哈希 + 规律)
2023河南省赛组队训练赛(四) - Virtual Judge (vjudge.net) 约瑟夫最近开发了一款名为Pandote的编辑软件,现在他正在测试,以确保它能正常工作,否则,他可能会被解雇!Joseph通过实现对Pandote上字符串的复制和…...

c语言自动内存回收(RAII实现)
简述 什么是RAII RAII(Resource Acquisition Is Initialization)是c之父Bjarne Stroustrup提出的概念。资源一般分三个步骤:获取、使用和销毁,而在自由使用内存的c语言中,资源的销毁常常是程序员容易遗漏的事情&…...

Node.js的简单学习一-----未完待续
文章目录前言学习目标一、初识Node.js1.1 回顾与思考1.1.1 需要掌握那些技术1.1.2 浏览器中的JavaScript的组成部分1.2 Node.js简介1 什么是Node.js2 Node.js中的JavaScript运行环境3 Node.js 可以做什么1.3 Node.js环境的安装1.4 在Node.js环境中执行JavaScript 代码终端中的快…...

linux入门---粘滞位
为什么会有粘滞位 一台服务器有很多人使用,每个人在机器上都会有一个家目录,在家目录里可以实现自己想要的操作,但是有时候我们需要一个公共路径来完成一些操作,比如说资料分享产生临时文件的增删查改等等,这就好比我…...

关于正则表达式的讲解
以下内容源于《linux命令行与shell脚本编程大全【第三版】》一书的整理。 在shell脚本中成功运用sed编辑器和gawk程序的关键,在于熟练地使用正则表达式。 一、正则表达式的简介 1、正则表达式的定义 正则表达式(regular expression)是一个…...

贝塞尔曲线与B样条曲线
文章目录0.参考1.问题起源与插值法的曲线拟合1.1.问题起源1.2.拉格朗日插值1.3.“基”的概念1.4.插值存在的Runge现象2.贝塞尔曲线2.1.控制点的思想2.2.由控制点生成贝塞尔曲线2.3.多个控制点时的贝塞尔曲线公式2.4.贝塞尔曲线的递推公式2.5.贝塞尔曲线的性质3.B样条曲线3.1.B样…...

C语言-基础了解-24-C头文件
C头文件 一、C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件,需要使用 C 预处理指令 #include…...

The 19th Zhejiang Provincial Collegiate Programming Contest vp
和队友冲了这场,极限6题,重罚时铁首怎么说,前面的A题我贡献了太多的罚时,然后我的G题最短路调了一万年,因为太久没写了,甚至把队列打成了优先队列,没把head数组清空完全,都是我的锅呜…...

用于<分类>的卷积神经网络、样本不平衡问题的解决
输入图像——卷积层——池化层——全连接层——输出 卷积层:核心,用来提取特征。 池化层:对特征降维。实际的主要作用是下采样,减少参数量来提高计算速度。 卷积神经网络的训练:前向传播(分类识别…...

网上订餐管理系统的设计与实现
技术:Java、JSP等摘要:随着信息技术的广泛使用,电子商务对于提高管理和服务水平发挥着关键的作用。越来越多的商家开始着手于电子商务建设。电子商务的发展为人们的生活提供了极大的便利,也成为现实社会到网络社会的真实体现。当今…...

Httpclient测试
在IDEA中有一个非常方便的http接口测试工具httpclient,下边介绍它的使用方法,后边我们会用它进行接口测试。如果IDEA版本较低没有自带httpclient,需要安装httpclient插件1.插件2.controller进入controller类,找到http接口对应的方…...

EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数
1 公式计算后的数,用只粘贴数值后,后面自动多了 0.0001,导致不再是整数的问题 问题入戏 见第1个8400,计算时就出现了问题,按正常,这里8400应该是整数,而不应该带小数,但是确实就计…...

PHP CRUL请求GET、POST
// GET请求 public function curlGet($url,$header){ $ch curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_s…...

Oracle技术分享 exp导数据时报错ORA-01578 ORA-01110
问题描述:exp导数据时报错ORA-01578 ORA-01110,如下所示: 数据库:oracle 19.12 多租户 1、异常重现 [oracledbserver ~]$ exp ora1/ora1orclpdbfileemp.dmp tablesemp logexp.log Export: Release 19.0.0.0.0 - Production onS…...

Maven学习笔记
目录1 概述1.1 Maven是什么1.2 作用1.2.1 构建1.3 jar包是什么2 下载及配置2.1 下载2.2 配置环境变量3 基本概念3.1 仓库3.2 坐标3.2.1 概念3.2.2 如何获取指定jar包的坐标3.3 项目结构3.3.1 普通java项目的目录结构3.3.2 java web项目的目录结构3.4 项目构建命令4 IDEA中创建M…...

654. 最大二叉树
题目 leetcode题目地址 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返…...

快速幂----快速求解底数的n次幂
目录 一.快速幂 1.问题的引入 2.快速幂的介绍 3.核心思想 4.代码实现 2.猴子碰撞的方法数 1.题目描述 2.问题分析 3.代码实现 一.快速幂 1.问题的引入 问题:求解num的n次幂,结果需要求余7 对于这个问题我们可能就是直接调用函数pow(a,b)来直接求解a的b次幂问题,但是如果…...

【FMCW 04】测角-Angle FFT
在之前的文章中,我们已经详尽讨论过FMCW雷达测距和测速的原理,现在来讲最后一块内容,测角。测角对于硬件设备具有要求,即要求雷达具有多发多收结构,从而形成多个空间信道(channel),我…...

Linux操作系统学习(线程同步)
文章目录线程同步条件变量生产者与消费者模型信号量环形队列应用生产者消费者模型线程同步 现实生活中我们经常会遇到同一个资源多个人都想使用的问题,例如游乐园过山车排队,玩完的游客还想再玩,最好的办法就是玩完的游客想再玩就去重新排…...

了解动态规划算法:原理、实现和优化指南
动态规划 详细介绍例子斐波那契数列最长回文子串优化指南优化思路斐波那契数列优化最长回文子串优化详细介绍 动态规划(Dynamic Programming,简称 DP)是一种通过将原问题拆分成子问题并分别求解这些子问题来解决复杂问题的算法思想。 它通常用于求解优化问题,它的核心思想…...

《NFL橄榄球》:明尼苏达维京人·橄榄1号位
明尼苏达维京人(英语:Minnesota Vikings)是一支职业美式足球球队,位于明尼苏达州的明尼阿波利斯。他们现时在国家橄榄球联合会北区参与国家美式足球联盟比赛。该球队本为美国美式足球联盟(AFL)的球队。但是…...

sheng的学习笔记-Actuator健康监控
前言在微服务系统里,对微服务程序的运行状况的跟踪和监控是必不可少的;例如GPE,TelegrafinfluxDB都提供了微服务体系监控的方案, ZIPKIN, Skywalking都提供了微服务云体系的APM的方案; 这些解决方案功能全面…...

初次使用ESP32-CAM记录
模块的配置和图片 摄像头:8225N V2.0 171026 模块esp-32s 参考资料:https://docs.ai-thinker.com/esp32 配置环境 参考:https://blog.csdn.net/weixin_43794311/article/details/128622558 简单使用需要注意的地方 基本的环境配置和串口…...

华为OD机试真题Python实现【最长连续交替方波信号】真题+解题思路+代码(20222023)
最长连续交替方波信号 题目 输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出, 如果有相同长度的交替方波信号,输出任一即可,方波信号高位用1标识,低位用0标识 如图: 说明: 一个完整的信号一定以0开始然后以0结尾, 即 010 是一个完整的信号,但101,101…...

【操作系统原理实验】页面替换策略模拟实现
选择一种高级语言如C/C等,编写一个页面替换算法的模拟实现程序。1) 设计内存管理相关数据结构;2) 随机生成一个页面请求序列;3) 设置内存管理模拟的关键参数;4) 实现该页面置换算法;5) 模拟实现给定配置请求序列的换页…...

Java中解析XML文件
1 在Java中解析XML文件共有四种方式 A、DOM方式解析XML数据 树结构,有助于更好地理解、掌握,代码易于编写,在解析过程中树结构是保存在内存中,方便修改 B、SAX方式解析 采用事件驱动模式,对内存消耗比较小࿰…...

二点回调测买 源码
如图所示,两点回调测买点的效果图,这是我们常见的一种预测买点计算方法。 现将源码公布如下: DRAWKLINE(H,O,L,C); N:13; A1:REF(HIGH,N)HHV(HIGH,2*N1); B1:FILTER(A1,N); C1:BACKSET(B1,N1); D1:FILTER(C1,N); A2:REF(LOW,N)LLV(LOW,2*N1…...

钉钉端H5开发调试怎么搞
H5开发本地调试教程 作为一名前端开发,大家平时工作中或多或少都有接触或需要开发H5页面的场景,在开发过程中,如何像PC端页面一样有有丝滑的体验呢? 不同的情况需要在不同的端调试更方便有效: 1. 在画UI的时候,更适合在PC端调试,更改代码或者直接在浏览器调试,都是实…...

Mysql Server原理简介
Mysql客户端包括JDBC、 Navicat、sqlyog,只是为了和mysql server建立连接,向mysql server提交sql语句。mysql server组件第一部分叫连接器主要承担的功能叫管理连接和验证权限,每次在进行数据库访问的时候,必然要输入用户名和密码…...