当前位置: 首页 > Web前端 > HTML

干货 - 以太坊Mist负责人教你建立无服务器应用

时间:2023-04-02 23:26:32 HTML

干货|EthereumMist负责人教你搭建serverless应用的架构经验,目前积极探索区块链的实现  蔡家辉:万云平台实习生,区块链技术爱好者,在伦敦帝国理工学院学习数学本教程负责人以太坊的Mist浏览器某人写的,完整介绍了如何开发一个标准的DApp。正文如下:以太坊并不是那种需要STEM文凭(1)才能理解的高深莫测的智能合约应用搭建平台,它的目标其实是成为万维网各种应用架构的中坚力量。在本文中,我们试图解释如何实现这一目标,并提供一些基本示例来展示如何开始构建去中心化应用程序。译者注:(1)STEM文凭是指:科学-科学、技术-技术、工程-工程、数学-数学相关文凭。目标读者本文适用于对Web技术有基本了解并知道如何构建简单的基于javascript和html的应用程序的读者。同时,我希望利用这些技能为以太坊生态系统构建应用程序。没有服务器的应用如何运行目前,Web应用中服务器完成的工作已经远远超出了最初的想象。除了提供静态网页外,它们还托管私人信息、处理用户身份验证并提供复杂的数据分析和存储。用户的计算机(在最初发明网络技术的时代,这样的设备将被视为超级计算机)无非就是加载信息并将其显示给用户。与当前的服务器模型不同,更加分散的系统结构允许采用更加模块化的方法。在这种方法中,不同的机器和不同的协议将处理特定的任务,一些任务由用户负责,一些由部署在对等网络中的专用机器负责。因此,所有的数据逻辑(存储什么,存储谁,如何解决冲突等)在区块链上由智能合约解决,静态文档由Swarm提供,实时通信在Whisper上进行.用户设备保留用户认证信息并运行程序界面。很少有单个节点保留大量未加密的数据,这降低了数据泄露和攻击的风险。同时,通过将它们分布在整个网络中,还可以降低应用程序的加载和开销成本。由于所有这些协议都是去中心化的,任何人都可以连接到网络并开始提供某些服务:例如,如果用户在功能强大的笔记本电脑上浏览,该计算机也可以提供静态文档。去中心化服务器模型去中心化的系统结构同时鼓励创新:由于交互界面与数据分离,任何人都可以为同一个应用程序提出一个全新的用户界面,创造一个更有活力和竞争力的生态系统。可以说,Twitter历史上最有趣和最具创新性的时期之一是它由中央数据中心提供服务,任何人都可以创建自己的Twitter应用程序。看看它是如何工作的如果您想在学习之前试用该应用程序,我们建议您下载Mist并阅读我们的入门教程,了解如何启动和运行该应用程序(下载链接:https://github.com/ethereum/米…)。如果只是想看看完整的应用,可以直接从Github下载(下载链接:https://github.com/ethereum/s...)。在Mist浏览器上运行的StakeVoice我们现在开始,我们将构建一个非常简单的应用程序,称为“StakeVoice”。它的要点是允许以太币投注者对他们想要的任何东西进行投票,该应用程序将计算所有同意和不同意该声明的以太币的总和。以下代码是本应用中用Solidity语言编写的合约。Solidity是一种类似于javascript的语言。很简单:第一行创建合约名称,第二行创建一个名为“LogVote”的事件,该事件将在日志文件中记录以下内容:将要投票的提案的哈希值投票者是否同意或拒绝提案投票者的地址“投票”功能然后启动日志,应用程序稍后对其进行计数。它还会检查以确保没有意外发送以太币。当任何以太币被存入智能合约时,一个“匿名”功能被执行并自动拒绝接收以太币。如果您想了解有关Solidity编程的更多信息,我们建议您从以太坊solidity教程(https://ethereum.org/dao)开始并阅读官方文档页面(https://solidity.readthedocs...)并尝试浏览器上的在线编译器(https://ethereum.github.io/br…)。差不多就是这样:你选择一个散列,选择一个边然后运行??Vote()。那么这如何转化为投票应用程序呢?Serverless架构遵循KISS原则,我们正在使产品尽可能小并且仍然可用。这意味着我们不使用数据库来存储提案,也不使用纯javascript和纯html以外的任何东西。因此,我们将使用应用程序本身的URL来存储提案文本,我们将使用URL向用户显示提案内容,并生成哈希值来检测投票。用户可以使用社交媒体分享他们想要辩论的提案,或者直接使用链接。从基础开始使用您最喜欢的html框架并在您的本地计算机上构建一个简单的网站,然后在Mist中打开它。Mist上的所有页面都可以访问名为web3的javascript对象,这是您的主要工作区域。我们做的第一件事是检查web3是否存在:一些应用程序开发人员可能希望加载自己的web3对象以确保向前兼容。为此,只需在标记之前添加:并将其添加到初始函数以加载您的自定义web3提供程序:从您检查的区块链加载信息到您的连接您是否在区块链网络上?但究竟是哪个区块链网络?它是主要的以太坊网络吗?也许是测试网或专用网络?或许在未来的某一天,你会分叉(fork)一份以太坊源代码,构建一条全新的属于你自己的区块链。检查网络的最好方法是查看您要加载的合约地址是否包含代码。此外,为了执行合约,你需要知道两个基本的东西:它的地址和ABI(ABI是一个用json编码的接口文档)。现在有了上面的内容,你可以在启动函数上检查合约是否存在:你甚至可以递归地运行这个命令,尝试连接不同的地址(假设你在测试网络上)。找到您的合约后,您可以在此处加载它:您使用web3对象创建的javascript对象,能够直接在浏览器中执行所有以太坊命令。如果你只想加载一个合约实例,你甚至可以用一行代码来完成:用户身份验证及其交易记录。因此,默认情况下将此信息提供给所有应用程序将创建一个超级cookie,由于侵犯隐私,这是不可接受的。另一方面,要求用户为每个网站创建一个带有登录信息的账户,不仅对用户来说是一种痛苦,而且会将你的隐私置于第三方手中,这将使第三方成为一个巨大的蜜罐黑客可以随意开采。面对这种困境,大多数用户选择将自己的个人信息和验证信息交给一家价值数十亿美元的公司。不应为了实用而损害隐私:用户应该能够轻松验证其身份以登录任何应用程序,同时控制他们的个人信息。对于Mist,除非用户决定向应用程序发布有关他自己的信息,否则应用程序不会获得有关用户的信息。当你想查询自己的账户信息时,应该调用getAccounts函数:目前返回的对象是一个包含用户本地访问权限的简单账户的数组,但未来还会包含用户的自我标识.智能合约账户。这将允许用户访问目前仅供集中式身份验证器使用的功能,例如双因素身份验证或云备份。用户还可以访问未来对智能合约的改进,例如,如果您丢失了密钥,允许一些可信赖的朋友为您提供访问帐户的权限,或者对不活跃的帐户行使自动继承权。每个未来的以太坊浏览器都将解决用户如何向应用程序识别自己的问题。在Mist中,我们有两种方法:用户可以通过点击“连接”按钮(目前称为“无帐户”按钮)来启动它,或者应用程序可以通过调用“requestAccount”api来请求身份验证。注意:此列表中的账户只是用户声称拥有密钥的账户,但用户没有提供证明,所以你可以显示不同的界面,但不要向用户发送任何关于账户的加密信息。如果需要用户证明自己的身份,则需要让用户对消息进行签名,Mist会在未来支持这一点,请注意,这将需要用户做一个额外的步骤——输入密码。因此,您只在必要时才需要用户签名。投票一旦你有了合约对象,投票只是从javascript调用它的问题。调用函数会在下面的代码中提供一个operator,解决用户如何识别应用,并弹出一个Mist交易面板供用户使用。用户可以在面板上查看交易内容并输入密码。因此,首先我们创建两个调用投票函数的可点击对象:请注意,我们用true调用一个函数,用false调用另一个函数。投票函数可以很简单,如下:“Ethervote”是我们之前创建的对象,“vote”是它的函数之一,对应其中一个合约函数:根据函数的要求,我们需要传入两个参数,并添加包含交易信息的第三个对象,例如:谁发送了此交易,以及两个选项:包含多少gas或购买gas的成本。由此,这将创建一个面板来要求用户确认交易——但在大多数情况下它会返回一条错误消息,因为目前web3.eth.accounts对象默认是一个空数组,所以你需要检查是否它是空的,如果为空,则向用户请求一个帐户:你应该只在用户启动一个操作时请求一个帐户:凭空显示交易当然只会激怒用户,更有可能让他/她关闭你的应用程序。如果我们观察到应用程序滥用此功能,我们可以对弹出警报的时间施加更严格的要求。查看合约最后,为了累积所有的选票,我们需要查看合约事件,以及选票的内容。为了做到这一点,在我们实例化“ethervote”之后,我们需要运行一次这个函数来查看事件:上面的代码会从180万高度开始读取所有区块(这是合约上传的时间点),没有当一个块被读取时,receivedEvent()函数将被执行;并且每产生一个新的区块,都会再次触发这个函数,所以不需要一直调用。那么,这个函数有什么用呢?从最初的solidity合约可以看出,LogVote有proposalHash、Pro和Addr三个参数:那么这个函数的作用就是使用函数web3.eth.getBalance来查询投票地址当前的以太币余额。所有的余额都会返回一个wei单位数,也就是一个1/1000000000000000000000000000000000000000000000,000,对于这个具体的应用来说用处不大,所以我们还使用了另一个web3函数,将其转换为任意us。所需的醚单元。在这里,我们将使用芬尼,它是以太的千分之一。接下来,此函数将以用户地址为键将选民的余额和位置保存在地图上。因此,如果某人投票两次,则只会保留他们最后的意见。此外,我们还可以识别用户并显示他们是否投票。累积选票最后,我们应该添加一个单独的函数来计算总票数:为什么我们要在一个单独的函数中累积选票?因为投票权重是基于每个账户的当前余额,所以我们应该重新计算每个新区块的余额,即使我们没有收到新事件。为此,您可以扩充该函数,使其在每次收到新块时自动执行;最后,直到添加最终总数。我们以前在同步模式下使用过eth.getBalance,在这种模式下,应用程序在继续之前等待先前操作的结果。这里,因为我们可以为每个块调用很多操作,所以我们将以异步方式运行:可以异步调用getBalance函数,等待节点返回,然后统计选票。就像您对代码所做的一样,应用程序所做的是循环遍历每个投票地址并获取它们的余额,每当返回结果时,它都会将其添加到赞成或反对中,并计算总和。额外奖励一些额外的注意事项:当没有事件时,什么都不返回,不计票,所以你应该为区块链上所有依赖于事件的函数添加一个超时函数。现在您可以自由使用所有现有的Web开发工具来实现您想要的任何魔法。使用数字构建漂亮的3D可视化或连接到您最喜爱的社交媒体以分享最佳问题。Mist还尝试提供一些基本的导航和UI方法来简化您的代码。如果您希望您的应用不包含标题并占据Mist应用的所有高度,只需将其添加到您的标签中:如果您想使用Mist本身进行导航?对于您的应用程序,您可以使用Mist.menu对象:以太坊的一大优点是您可以在未经许可的情况下扩展这个简单的合约功能:您可以将每个附加功能放入一个单独的合约中,这里是每个独立合约的功能很简单,可以更容易调试。这也意味着其他人可以在他们自己的应用程序中使用您创建的合约并添加新功能。同时,所有应用程序都使用相同的数据和后端。你可以在Github(https://github.com/ethereum/s...)上在线体验这个应用,但这并不是一个权威的规范,只是它众多可能的接口之一。同样的应用程序也可以作为本地html文件在您的计算机或IPFS网络(https://ipfs.io)中运行,并且将来可以使用Swarm技术直接在Mist中下载应用程序。关于如何尝试的一些建议:创建一个当前可用的演讲列表。任何人都可以通过查看提案文本的sha3来检查它们,因此您不需要任何许可。创建线性化的评论,用户可以在其中回复评论并投票赞成或反对,就像基于Reddit的去中心化投票系统。您可以使用其他一些以太坊代币(如TheDAO或DigixGold)来衡量您的问题,而不是使用您的以太币余额。由于所有合约的原始保存位置是发件人,您可以查看所有发件人的余额。或者,也许您可??以根据声誉、业力或其他因素创建自己的货币。本文由WanyunBasS整理,未经许可不得转载。