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

做者:Alex Van de Sande
译者:王建/蔡佳慧
译者介绍:
  王建:万云平台区块链技术专家,拥有多年应用系统架构经验,目前在区块链落地方面进行积极探索
  蔡佳慧:万云平台实习生,区块链技术爱好者,英国帝国理工学院数学专业在读javascript

这篇教程是由以太坊Mist浏览器的负责人撰写,完整地介绍了如何开发一个标准的DApp。html

如下是正文:java

以太坊并非那种须要一个STEM文凭(1)才能理解的高深莫测的智能合约应用创建平台,它的目标实际上是成为万维网中各类应用架构的支柱。在这篇文章里,咱们尝试去阐述如何实现这个目标,并提供一些基本例子来展现如何开始构建一个去中心化的应用。git

译者注:github

(1)STEM文凭,指:科学-science,科技-technology,工程-engineering,及数学-mathematics相关文凭。web

目标读者数据库

这篇文章面向有如下背景的读者:对于Web技术有基本了解,并知道如何构建一个简单的基于javascript和html的应用。同时,但愿使用这些技能为以太坊生态系统构建应用。编程

没有服务器,应用是如何运行的json

当前,Web应用中的服务器所作的工做已经远超当初的设想。除了提供静态网页,它们还保管私有信息,处理用户验证,同时还提供复杂数据分析与保存。而用户计算机(在Web技术刚被发明的年代,这种设备会被认为是超级计算机)所作的仅仅是加载信息,并展现给用户而已。后端

clipboard.png

Current server models

与此不一样的是,更为去中心化的系统结构则会容许一种更加模块化的处理方式。在这种方式中,不一样的机器与不一样的协议将会处理特定的任务,有些属于用户方面,而也有些属于配置于点对点网络中的专用机器方面。所以全部的数据逻辑(什么会被储存,谁会去储存,如何解决冲突等)是由区块链上的智能合约解决的,静态文档由Swarm提供,同时实时通讯在Whisper上进行。用户设备保留用户认证信息并运行程序界面。

几乎没有单节点保留大量未加密数据,这么作将会下降数据泄漏与攻击的危险。同时,经过将其分散于全网络,也能够下降应用的加载与花销成本。因为全部这些协议都是去中心化的,任何人均可以链接到网络并开始提供特定服务:好比说,若是用户在一个功能强大的笔记本电脑上浏览,这台电脑也能够向网络邻居们提供静态文件。

clipboard.png

Decentralised Server models

一个去中心化的系统结构同时鼓励创新:因为交互界面脱离于数据,任何人均可觉得同一个应用提出一个全新的用户界面,建立一个更富生机与竞争力的生态系统。能够说,Twitter历史上最具趣味性及创新力的时期之一即是它做为中央数据中心提供服务,同时任何人均可以建立他们本身的Twitter应用。

观察它如何运做

若是你想在学习这个应用以前实验它,咱们推荐你下载Mist并阅读咱们关于如何安装应用并运行的入门教程(下载连接:https://github.com/ethereum/m...)。若是你只是想要看一看完整的应用,你能够直接从Github上将其下载下来(下载连接:https://github.com/ethereum/s...)。

clipboard.png

Stake Voice running on the Mist Browser

咱们如今上手操做

咱们将会创建一个叫作“Stake Voice”的很是简单的应用。其主旨是容许以太币投注人对任何他们想投的事情进行投票,同时这个应用将会计算全部赞成与不一样意这个陈述的以太币总和。

下面代码是这个应用里用Solidity语言编写合约,Solidity是一种相似于javascript的语言,很是简单:
clipboard.png
第一行创建了合约名称,同时第二行建立了一个命名为“LogVote”的事件,它将会在日志文件中记录如下内容:

将会被投票的提案的哈希值
投票者是赞成仍是反对提案
投票者的地址

函数“vote”接着会启动日志,应用程序稍后会计数。它同时会检查确保没有意外发送的以太币。当任何以太币被存入智能合约时,“匿名”函数会被执行,并会自动拒绝接收以太币。

若是你想要学习关于Solidity更多的编程内容,咱们推荐你从以太网solidity教程( https://ethereum.org/dao)开始,阅读官方文档页面( https://solidity.readthedocs....)并在你的浏览器上尝试在线编译器( https://ethereum.github.io/br...)。

大体上就是如此了:你选择一个哈希值,选择一方而后运行Vote()。因此这又如何转化成一个投票应用?

无服务器架构

遵循KISS原则,咱们正在制做尽可能小却仍然可以使用的产品。这意味着咱们不会使用数据库来储存提案,也不会使用普通javascript与纯粹html以外的功能。

所以,咱们将使用应用自己的URL来保存提案文本,而且咱们会使用URL来向用户展现提案内容,再生成一个用来检测投票的哈希值。用户可使用社交媒体来分享他们想要辩论的提案,或者直接使用连接。
clipboard.png

从基础开始

拿出你最喜欢的html框架,并在你本地机器上创建一个简单网站,而后在Mist上打开它。Mist上全部的页面均可以访问一个名叫web3的javascript对象,这也是你的主要工做区域。咱们要作的第一件事就是检查web3是否存在:
clipboard.png
一些应用开发者也许会想要去加载他们本身的web3对象,以保证向前的兼容性。要作到这些,只须要在</body>标签前加上:
clipboard.png
而后在初始函数上加上这个去加载你自定义的web3提供方(provider):
clipboard.png

从区块链上加载信息

你检查到你链接到区块链网络上了吗?可是究竟是哪个区块链网络呢?是主体(main)以太坊网络吗?也许是一个测试网络(testnet)或者是一个私有(private)网络?或许将来某一天,你会分叉(fork)一个以太坊源码,构建一个属于你本身的全新品牌区块链。检查网络的最好办法是查看你想要加载的合约地址中是否包含了代码。

此外,为了执行一个合约你须要知道两个基本事项:它的地址和ABI(ABI是使用json编码的接口文档)。
clipboard.png
如今有了上面这些内容,你就可以在启动函数上检测合约是否存在了:
clipboard.png
你甚至能够递归地运行这条命令,尝试用不一样的地址去链接(假定你测试网络上)。一旦你找到你的合约,你就能够在这里加载它了:
clipboard.png
你用web3对象建立的javascript对象,可以直接在浏览器中执行全部以太坊命令。若是你仅仅想要加载一个合同的实例,你甚至能够在一行代码里作到:
clipboard.png
用户鉴别

获取用户帐户披露了这个用户的大量信息:帐户余额中有多少以太币和其余代币,以及其交易历史。所以,默认让全部应用获取这一信息将会建立一个超级cookie,因为对隐私的侵犯,这是不能够接收的。另外一方面,要求用户为每个网站建立一个带有登陆信息的帐户,这不只对用户来讲是一个痛苦,并且把你的隐私交给第三方来掌控,这种方式将会让个第三方变成一个可被黑客随意掘取的巨大蜂蜜罐。

面对这一困境,多数用户选择将本身我的信息及验证信息交由一个几十亿美圆公司处理。隐私权不该该为了取得实用性而妥协:用户应该在掌控他们的我的信息的同时,可以轻松地验证身份信息以登入任何应用。

使用Mist,应用不拥有关于用户的信息,除非用户决定公布其自身信息给应用。当你想要查询本身的帐户信息,你应该调用getAccounts函数:
clipboard.png

目前,返回对象是一个数组,其中包含了用户拥有本地访问权限的简单帐户,可是在将来,其中还会包含用户用于自身识别的智能合约帐户。这将会使得用户拥有权限来访问目前只供给集中式验证器(centralized authenticators)的特性,好比双重身份验证或者云备份。用户一样将会拥有权限来访问将来针对智能合约的改进,好比在你遗失密钥的时候容许一些受信任的朋友来给你访问帐户的权限,或者对于不活动帐户行使自动继承权。

每个将来的以太坊浏览器将会解决用户如何向应用辨别自身的问题。在Mist中咱们由两种方式:要么用户能够经过敲击“connect”按键(目前仅叫作“no accounts”按键)来启动它,或者应用能够经过调用“requestAccount”api来要求身份验证。

注意:这个列表上的帐户仅仅只是用户声明拥有密钥的帐户,可是用户并无提供证实,所以你能够展现一个不一样的界面,可是不要给用户发送任何与帐户有关的加密信息。若是须要用户证实他们的身份,你须要让用户对信息签名,同时Mist也会在将来支持它,请注意这会要求用户作一个额外步骤--输入密码。因此只在必要的时候,你才会须要用户签名。

投票

一旦你有了合约对象,投票就仅仅只是从javascript中调用它。调用函数会下面这段代码处提供操做器将会解决用户们如何向应用辨别会包含用户们弹出一个Mist交易面板,用户能够在面板上检查交易内容,并输入密码。

所以,首先咱们要建立两个能够调用投票函数的可点击对象:
clipboard.png
注意咱们调用的一个函数参数为true,另外一个则为false。投票函数能够像下面这么简单:
clipboard.png
“Ethervote”是咱们以前建立的对象,而且“vote”是它函数中的一个,对应着合约函数的一个:
clipboard.png
根据函数的要求,咱们须要传入两个参数,并增长包含交易信息的第三个对象,好比:谁发送了此交易,以及两个可选项:包含多少gas或者购买gas的费用。

由此,这将会建立一个面板,以要求用户确认交易——可是多数状况下它会返回一个错误信息,由于目前web3.eth.accounts对象默认是一个空数组,因此你须要检查其是否为空,若为空,则从用户处请求帐户:
clipboard.png
你应该只在用户初始化一项操做的状况下请求帐户:无中生有地显示一项交易只会理所固然地激怒用户,更可能使他/她关闭你的应用。若是咱们观察到应用对于这一功能的滥用行为,咱们能够对于什么时候弹出警报施加更为严格的要求。

查看合约

最后,为了累计全部的投票,咱们须要查看合约事件,以及投票内容。为了完成这些工做,在咱们实例化“ethervote”后咱们须要去运行这个函数一次来查看事件:
clipboard.png

上述代码会从第180万(这是合约被上传的时间点)高度读取全部的区块,没读取一个区块时,都会执行receivedEvent()函数;而且,每产生一个新区块时,这个函数就会被再次触发,因此你不须要连续调用。那么,这个函数到底有什么用呢?
clipboard.png

从初始solidity合约中,你能够看到LogVote带有三个参数,proposalHash,Pro和Addr:
clipboard.png

因此这个函数的做用是它会使用函数web3.eth.getBalance来检查投票地址当下的以太币余额。全部的余额都会返回以wei为单位的数字,也就是一个以太币的1/1000000000000000000,这对于这个特定的应用并不是很是的有用,因此咱们也使用另外一个包含的web3函数来将其转换为任何咱们须要的以太币单位。这里,咱们会使用finney,也就是一个以太币的一千分之一。

接下来,这个函数将会保存投票者的余额及位置于一个以用户地址为Key的Map上。因此若是有人投了两次票,只有他们最后的意见会被保留。

另外咱们还能鉴别用户,并展现他们是否投票。
clipboard.png

累积票数

最后,咱们应该加入一个独立的函数来计算票数的总数:
clipboard.png

为何咱们会想要经过一个独立的函数来累积票数呢?由于票数权重是创建在每个帐户的当前余额之上的,咱们应该对于每个新区块从新计算余额,即便咱们并无收到新的事件。为了作到这个,你能够增长这个函数,使它每收到一个新区块时就会自动执行;
clipboard.png

最后,直到加到最终的总数为止。咱们以前已经在同步模式下使用了eth.getBalance,在此模式下,应用会等待前一个操做的结果再继续。此处,由于咱们能够对于每个区块调用大量操做,咱们将会在异步模式下运行它:你能够异步调用getBalance函数,等到节点返回后,再进行票数统计。
clipboard.png

就像你根据代码所做的同样,应用所作的就是在循环投票地址中的每个并获得它们的余额,只要它返回结果,它会将其加到支持或反对阵营中,并计算总和。

额外的好处

一些附加说明:当没有事件时,什么也不会被返回,而且投票也不会被计算,因此你应该对依赖于区块链上事件的全部函数增长一个超时函数。
clipboard.png

如今你能够随意地使用全部你现有的网络开发工具来施展你想要的任何魔法。使用数字来构建一个漂亮的3D可视化效果或者关联你最爱的社交媒体来分享最佳问题。

Mist也尝试提供一些基本的导览,以及UI方式来简化你的代码。若是你想要你的应用不包含header而且占据mist应用的全部高度,只要将这个加入到你的<head>标签:
clipboard.png

而且若是你想要使用Mist自身来导览?你的应用,你可使用Mist.menu对象:
clipboard.png

以太坊强大的一点是你能够在不须要许可的状况下,扩展这项简单的合约功能:你能够把每一个额外的功能放到一个独立的合约里,让每一个独立合约的功能简单且能够更轻松的调试。这也意味着别人能够在他们本身的应用中使用你建立的合约并增长新的功能。同时,全部的应用使用相同的数据和后端。

你能够在Github上(https://github.com/ethereum/s...)在线体验这个应用,可是这不是权威的规范,只是它众多可能接口中的一个。同一个应用也可能在你的电脑上或一个IPFS网络( https://ipfs.io)中做为一个本地html文档工做,而且在将来它可使用Swarm技术,在Mist里直接下载应用。

关于如未尝试的一些建议:

建立当前可用发言列表。任何人均可以经过查看提案文本的sha3来检查它们,因此你不须要任何许可。

建立线性化的评论,在这里用户能够回复评论并经过投票来表达支持或反对,就像一个基于Reddit的去中心化的投票制。

除了使用以太币余额,你还可使用一些其它的以太坊代币,好比TheDAO或者Digix Gold来给你的问题加权。由于全部合约保存的原始位置是发送方,你能够检查所有发送方的余额。或者也许你能够基于信誉(reputation)、甚至是业力(karma)或者其它方式来建立你本身的货币。

本文为万云BasS编译,未经容许不可转载

相关文章
相关标签/搜索