如何使用您已经掌握的有关Web开发的知识来构建dApp

嗨, 我是菲利普。 我和我的合伙人JP制作了一个名为 CryptoCare的dApp ,该应用程序使用户可以直接向社会影响组织捐款,以换取加密货币收藏品。 我想与以下社区分享我学到的东西。 如果您有任何反馈意见,请鼓掌,评论,分享和联系。 我将不胜感激!

大约一年前,我对构建与以太坊区块链接口的Web应用程序非常感兴趣。 我已经对去中心化网络,共识机制,金钱的概念,编写智能合约的乐趣和陷阱以及使用这些新技术构建的一些激动人心的面向用户的项目进行了大量阅读。 这一切都令我着迷。

在这段发现期间,我记得我第一次使用dApp。 它是一个非常简单的界面,并且具有非常独特的用途,但是它以一些基本方式改变了我查看网络的方式。 有了此dApp,我意识到无需给我任何电子邮件地址,密码或信用卡,就可以对我进行安全身份验证,并且可以在互联网上花钱。 我永远不必担心不可避免的一天,当这些信息丢失,泄露或违背我的意愿使用时。 另外,我使用dApp创建的数据在非常加密的意义上是我的,无法被某些中央机构操纵或删除。 对我来说,这是一个真正强大的认识。

我想成为其中的一部分。 我只需要弄湿双手并弄清楚即可。 因此,我着手了解如何通过构建名为CryptoCare的产品来构建dApp。 从这一经验中,我注意到,虽然dApp和传统的Web应用程序在许多方面有所不同,但最终的结构最终还是非常相似。 我想就他们之间的某些异同分享我的想法。

由于围绕此技术的环境总是在变化,因此这并不意味着它是最好的做事方式,而是对那些可能会觉得自己构建Web应用程序并希望跨越式使用的人的有用指南。他们下一个产品中的一些去中心化技术。 我肯定有一些要改进我们的体系结构的内容,并且一直在思考如何使事情变得更好。 本文将假设您具有以太坊和IPFS之类的工作知识,并且具有使用React和Ruby on Rails之类的工具构建Web应用程序的经验。

首先,让我们看一下我认为是Web应用程序最基本的结构。 这个很复杂,所以戴上你的帽子吧🙂

有一个用户想要访问您的网站,因此他们导航到正确的URL。 向服务器发出一个请求,该请求确定您想要的内容,并以完整格式的HTML文档作为响应,以在浏览器中进行查看。 当用户在站点中导航时,将向服务器发出请求,服务器将呈现新的HTML文档。 十分简单。

接下来,让我们看看这些天似乎是架构事物的更主流方式:

有一个用户想要访问您的网站,因此他们导航到正确的URL。 向服务器发出请求,该服务器为前端应用程序提供逻辑。 一旦将此前端应用程序发送给用户,该前端就可以向另一台服务器发送零对多请求,该服务器的唯一功能是提供数据(API)。 该API将使用诸如关系数据库之类的工具来存储相关数据以进行查找,并将成为该系统中存在哪些数据的真实来源。 当用户浏览前端时,它将从此API检索需要的内容,并根据其前端规则进行显示。

与第一个设计相比,此结构具有许多独特的品质和改进。 将数据与数据的显示方式分开本身是好的,但也允许以新的方式显示围绕API形成的数据,而无需真正增加数据层。 我经历过的一些示例是使用API​​来提供其他服务,例如移动应用程序,适合您业务的任意数量的面向内部的应用程序,或为其他开发人员打开数据以构建一些东西。

这两个都是非常简单的示例,根据我的经验,我知道每个Web应用程序以其自己的方式都是唯一且复杂的。 对于每个简单的应用程序,有十二个采用独特的面向服务的体系结构,在幕后利用第三方API,并使用多种不同的技术以极具Rube-Goldberg风格的方式存储其数据。 但是我相信,当您将所有内容精简到其核心时,大多数Web应用程序都遵循此客户端-服务器模式,并且前端与API相连。 该API以确定性的方式提供数据,并由一个简单的数据库支持。

但是,当真理的源头转移时,会发生什么呢? 现在,事实不再是将数据存储在诸如SQL之类的可查询接口中,而将文件存储在诸如S3之类的文件中,而是将事实存储在区块链上的智能合约中,并将其存储在IPFS中。 当人们一开始可能不了解或不关心分散性时,他们如何构建一个Web应用程序,供那些期望我们都已经习惯于Internet的速度和可用性的人们使用?

在探讨如何回答其中一些问题之前,让我们花点时间介绍一下CryptoCare的含义。 为了从最高点开始,我们希望开发一种产品,使捐赠过程充满欢乐。 我们想要一个平台来发现值得支持的原因。 我们希望通过向用户发放可爱且一成不变的收藏品来表示用户的良好行为,以此来奖励用户的慷慨捐助。 在最基本的可交付产品方面对此进行了细分:

  1. 我们需要一种方法来存储受益人的代表(例如,GiveDirectly,Electronic Frontier Foundation或Heifer International),他们的以太地址以及其他相关的元数据。
  2. 我们需要一种按共同原因将这些受益人分组的方法。
  3. 我们希望有一种方法可以查看这些原因并在其保护下显示有关受益人的信息。
  4. 在用户选择支持的受益人之后,我们希望用户界面能够构建可定制的收藏品,以代表其良好行为。
  5. 我们需要建立流程来创建和存储其收藏品,然后将钱转给受益人。

以这种方式看,我意识到唯一的分散部分是最后一个要点-存储收藏品并将金钱路由到正确位置的逻辑。 这使我相信最好的方法是从我已经知道的开始,这是使用React构建前端,该前端向使用Ruby on Rails构建的后端API发出请求,并处理需要单独分散的部分。

一旦所有这些API都建立好了,数据库模式就位,前端上的接口正确读取了所有内容之后,就该弄清楚如何处理分散的部分了-现在进行捐赠,并证明它们已经发生了,并转移到以太。 因此,我开始开发智能合约和另一个后端服务以帮助验证数据。 我们需要他们做几件事:

  1. 给定要捐赠的数量,原因和所需收藏品的配置,我们需要生成代表收藏品的图像。
  2. 生成此图像后,我们需要将其与有关捐赠和收藏品的许多其他元数据存储在IPFS中。 将这些数据存储在IPFS中将意味着,即使CryptoCare最终消失了,用户也将能够使用由他们创建的内容。 我们还希望数据格式可以供Opensea使用。
  3. 将此数据存储在IPFS中后,我们需要在ERC721智能合约中存储此收藏品的参考。 作为ERC721,这将是用户真正拥有的,使他们能够进行传输,并且无需CryptoCare的许可就可以在其他dapp中使用。
  4. 我们需要智能合约将用户指定的以太币数量路由到正确的地址。 将以太币用作汇款方式,极大地简化了使用信用卡处理程序和银行帐户时出现的非常复杂的问题,同时又使这些捐款保持了可抵税的能力。 我们希望资金的传输是即时的,而不是在CryptoCare的控制之下。 我们想开源此作品,以便每个人都可以清楚地验证这笔钱的去向。
  5. 我们需要验证创造新的CryptoCare令牌的人们正在经历上述过程,并且无法在智能合约中存储不良数据。
  6. 成功铸造令牌后,我们需要在Rails应用程序中存储引用,以便API可以快速查询它。 在这种情况下,API并不是捐赠的最终真相,而是我认为是IPFS +以太坊之上的缓存层。 我们的API可以更快地查询,这对于构建Web应用程序非常有用,但是由于这些分散的网络中的任何人都可以使用数据,因此如果有人愿意,可以围绕它构建自己的API。
  7. 智能合约中数据的任何更改(例如:用户希望将其收藏品转移到另一个地址,对收藏品的名称进行编辑)都需要在rails API中进行说明和更新。

因此,现在我们的关系图对此有点膨胀:

尽管它比普通的Web堆栈复杂得多,但很多部分仍然非常可识别。 主要区别在于, 在分散数据的分散性并在其他大部分数据中使用已经知道的信息时,才可以转移数据的真实来源。

如果您想了解所有工作原理的杂草,我将为CryptoCare平台提供支持的智能合约开源。 我最终想对我如何解决从前端与区块链接口,验证传递给智能合约的数据以及观察链上更新以更新API数据的问题进行更深入的探讨。首先从非常高层的概述开始,我是如何基于Web开发背景构建我的第一个dApp的。

我想大声疾呼一些资源,并让人们更轻松地在这些平台上进行开发,并使我能够制造这样的产品。 首先,Consensys及其产品Infura,Metamask和Truffle必不可少。 暑假期间,我也参加了Consensys学院的课程,这对我的学习有很大帮助。 如果没有在OpenZeppelin内完成的工作以及它们产生的所有开放源代码,经过审核的智能合约,我也无法构建它。 在这个领域中,免费或开源工具的数量非常可观,我感谢他们所产生的一切。

如果您喜欢这个,请:
在Twitter上关注CryptoCare,我本人和我的合作伙伴JP,了解有关我们为何启动该项目的更多信息,并访问CryptoCare并支持您所相信的事业! ✌️🌍💕