我学习以太坊区块链平台已经有一段时间了,这个真是让我越学越兴奋啊。网络上有很多关于以太坊的资料(文章,视频,平台官网),这些我们都很容易就获取到,由于平台还在快速迭代所以相关的资料内容普遍普遍滞后。自己基于所学整理了一个关于以太坊是什么,以及他是怎么工作的图。在开发者论坛以及线上社区中发现想了解这些新技术的人同样在学习的时候遇到了很多问题。这篇文章试图从一个web开发者的角度来解释以太坊。
 
如果你是一个web开发者,知道怎么很好的构架webapp的客户端以及服务端。
 

你有一个web应用托管在托管服务器上,像AWS,Heroku,VPS等,所有的客户端都是通过一个中心的应用程序进行交流。客户端可以是web浏览器,或者是其它的消费你程序的API等。当一个客户端像服务端发起一个请求,服务器会像变魔法一样喝数据库进行通信,对数据库进行增删改查,然后相应客户端请求。
 
这种结构大部分情况下都能很好的运行,但是如果数据库是公开的任何人都可以访问,那么有一些应用就会变得很有用,这样我就不用依赖上面的webapp来获取自己个人的数据了,也就是说我可以从其它渠道获取我的个人数据。
 
下面举例说明:例如eBay,如果你是一个超级卖家,已经获得了数百的好评。由于某些原因eBay封停了你的帐号。这事很糟糕会严重的影响你的生意。如果你能够把这数百的好评与评分转移到其他平台(eBay的竞争者)的话,这将是一件很赞的事情。eBay在买家和卖家之间提供了一个第三方信任服务。并且从买卖双方都要收取佣金。是否有这么一种方式买卖双方在交易的时候完全忽略eBay,这样双方也节省了佣金,同时你又可以访问到你的交易数据?这就是下面的图片提出的去中心化应用。以太坊让你很容易的创建Dapps(去中心化应用)。
 
下面是一个从高层次来看待以太坊Dapp:
你是否发现,每一个客户端交流使用的都是它自己的应用实例。没有一个所有的客户端都链接到服务器上的中心化服务器。这就意味着,每一个想通过去中心化应用交互的人,需要在他们的电脑或者是手机上完整的拷贝区块链。这就意味着,在你可以使用应用之前,你需要下载完整的区块链,然后启动使用这个应用。第一次听说感觉很荒唐,但是他有一个好处就是不需要依赖一个中心化的服务,而且这个中心化的服务有可能明天就不存在了。
 
现实中你不需要花费很多的内存和硬盘,来下载完整的区块链。已经有了一些变通的方法或者是优化来使的应用去中心化,保证交互方便快捷。
 
现在确切的说什么是区块链呢?它包含:
1,Database(数据库):在以太坊网络上每发生一个交易就会被包装到一个区块中,每一个区块都和下一个区块相连。这些包含所有交易数据相连的一系列的块就是区块链。如果我们返回去看刚才的eBay的例子,买卖双方无论是出售,退款还是纠纷都将会被记录在区块链上,并且每个人都可以看到。为了保证以太坊网络上的所以网络节点对这条信息都有同样的拷贝,而且为了确保非法数据写入的这个数据库中(区块链的区块中),以太坊使用一个叫做proof的算法来做这件工作。
 
2,Code:区块链的数据库部分只是存储了数据,但是像买,买,取消,退款等操作逻辑在什么地方呢?在以太坊的世界里,你可以使用一个叫做Solidity的语言来写应用(合约)代码。然后可以使用Solidity编译器来把代码编译成以太坊二进制文件,然后把这个二进制代码部署到区块链上。除此之外和Solidity很少有其他的交互,但是Solidity是目前开发合约最流行的开发语言。
 
所以从根本上来说:区块链存储数据,存储代码,而且运行EVM(Ethereum Virtual Machine)中的代码。
 
基于Dapps构建web,Ethereal有一个很好用的javascript包叫web3.js,这个包可以和你的区块链接点建立连接。所以你紧紧需要在你的javascript框架(reactjs, angularjs等)中引入这个包,然后就可以开始构建应用了。
 
另一个大而重要的应用方面是平台的财务能力。如果我告诉你你在使用Dapp的时候,你就拥有了一个内置的银行帐户你会怎么办呢?事实上不是一个银行帐户,你可以在一分钟内创建多个帐户。这些银行帐户被叫做钱包,你可以用来存钱(用在以太坊生态系统的货币)和交易。
 
有许多关于区块链的内部细节是我故意留下的,因为我想集中精力在基于区块链的Dapp和中心化的webapp进行比较。希望这篇文章可以很好的达到说明以太坊是什么,以及怎么去构建去中心化的应用。
 
我现在已经写了3个指导教程来构建全栈的dapp
 
 
延伸阅读:
 

Ethereum for web developers的更多相关文章

  1. [引] Security tips for web developers

    Source :Security tips for web developers

  2. Docker for Web Developers目录

    在OpenStack在私有云占主导定位之后,后起之秀Docker在PaaS平台.CI/CD.微服务领域展露锋芒.作为Web Developers,我们有必要学习和掌握这门技术. 1. 运行第一个Doc ...

  3. 《Professional JavaScript for Web Developers》day02

    <Professional JavaScript for Web Developers>day02 1.在HTML中使用JavaScript 1.1 <script>元素 HT ...

  4. 《Professional JavaScript for Web Developers》day01

    <professional JavaScript for Web Developers>day01 1.JavaScript简介 1.1JavaScript简史:略 1.2JavaScri ...

  5. 《Professional JavaScript for Web Developers》day03

    <Professional JavaScript for Web Developers>day03 1.1ECMAScript语法 1.1.1 区分大小写 1.1.2 标识符 按照惯例,E ...

  6. Professional JavaScript for Web Developers 4th Edition

    Professional JavaScript for Web Developers 4th Edition learning notes / 学习笔记 https://github.com/xgqf ...

  7. 使用Docker-Docker for Web Developers(2)

    1. 使用镜像 1.1 在Docker Hub上查找镜像 我们查找一下之前博客里面,推送到Docker Hub里面的bage88/docker-demo,能看到有2个仓库,第一个就是我们上次上传的镜像 ...

  8. Sublime Text 插件推荐——for web developers

    楼主向高大上的: web front-end development engineer (好吧,google就是这样翻译的 ^_^)们推荐 ST 插件,在此抛砖引玉: NO.1 :Emmet (原名: ...

  9. Elevate Web Builder for Web Developers(类似于unigui的东西)

    推荐一款pascal 语言的web 开发工具 这几天仔细研究了一款使用Pascal 语言开发web 的工具 具体介绍可以参照这里. 先上几张他开发的页面照.

随机推荐

  1. turbo boost - 睿频加速

    turbo boost就是英特尔睿频加速技术 英特尔睿频加速技术是英特尔酷睿 i7/i5 处理器的独有特性,也是英特尔新宣布的一项技术.这项技术可以理解为自动超频.当开启睿频加速之后,CPU会根据当前 ...

  2. 外部函数/external

    定义在moodle/lib/externallib.php 概观 外部函数API允许您创建可由外部程序(如Web服务API)访问的完全参数化的方法. 外部函数位于externallib.php文件中. ...

  3. hdu1573 X问题【中国剩余定理】

    <题目链接> X问题 Problem Description 求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod ...

  4. Linux学习之常用文件处理命令(一)

    (一)文件命名规则 (二)常用文件处理命令 1.ls命令 2.cd命令 3.pwd命令 4.mkdir命令 5.touch命令 6.cp命令 7.mv命令 8.rm命令 9.cat命令 10.more ...

  5. Couple number

    P1348 Couple number 我其实找规律了的,然后也没仔细分析,这个题多巧妙. C=a^2-b^2=(a+b)(a-b) 对于任意a而言,加减同一个数得到的数的奇偶性相同,故c=奇数或4的 ...

  6. LeetCode刷题笔记--Python--28. 实现strStr()

    class Solution: def strStr(self, haystack, needle): """ :type haystack: str :type nee ...

  7. mysql字符类型大小写敏感的讨论

    mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...

  8. Mybatis Generator xml格式配置

    Mybatis Generator可以使用Maven方式和Java方法,使用Maven这里是配置文件: <?xml version="1.0" encoding=" ...

  9. Get package name

    public class GetPackageName { public static void main(String[] args) { GetPackageName obj = new GetP ...

  10. C# Clone控件

    /// <summary> /// Perform a Clone of the object asdfas. /// </summary> /// <typeparam ...