概述

对初学者,首先要了解以太坊开发相关的基本概念。

学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解:

  • 一种面向对象的开发语言,例如:Python,Ruby,Java...

  • 前端开发语言:HTML/CSS/JavaScript

  • Linxu命令行的使用

  • 数据库的基本概念

项目简介

我们构建一个去中心化的(Decentralized)投票应用。利用这个投票应用, 用户可以在不可信(trustless)的分布环境中对特定候选人投票,每次投票都会被记录在区块 链上:

所谓去中心化应用(DApp:Dcentralized Application),就是一个不存在中心服务器 的应用。在网络中成百上千的电脑上,都可以运行该应用的副本,这使得它几乎不可能 出现宕机的情况。

基于区块链的投票是完全去中心化的,因此无须任何中心化机构的存在。

之所以选择投票作为我们的第一个区块链应用,是因为集体决策 —— 尤其是投票机制 —— 是以太坊的 一个核心的价值主张。

另一个原因在于,投票是很多复杂的去中心化应用的基础构件,所以我们选择了投票应用作为学习区块链 应用开发的第一个项目。

初识区块链

如果你熟悉关系型数据库,就应该知道一张数据表里可以包含很多行数据记录。例如,下面的数据表中 包含了6条交易记录:

本质上,区块链首先就是一个分布式(Distributed)数据库,这个数据库维护了一个不断增长的记录列表。 现在,让我们对数据进行批量(batch)存储,比如每批 100 行,并将各存储批次连接起来,是不是就像一条链?

在区块链里,多个数据记录组成的批次就被称为块(block),块里的每一行数据记录就被称为交易(transaction):

最开始的那个块,通常被称为创世块(genesis block),它不指向任何其他块。

不可篡改性

区块链的一个显著特点是,数据一旦写入链中,就不可篡改重写。

在传统的关系型数据库中,你可以很容易地更新一条数据记录。但是,在区块链中,一旦数据写入就无法 再更新了 —— 因此,区块链是一直增长的。

那么,区块链是如何实现数据的不可篡改特性?

这首先得益于哈希(Hash)函数 —— 如果你还没接触过哈希函数,不妨将它视为一个数字指纹的计算函数: 输入任意长度的内容,输出定长的码流(指纹)。哈希函数的一个重要特性就是,输入的任何一点微小变化,都会 导致输出的改变。因此可以将哈希值作为内容的指纹来使用。

由于区块链里的每个块都存储有前一个块内容的哈希值,因此如果有任何块的内容被篡改,被篡改的块之后 所有块的哈希值也会随之改变,这样我们就很容易检测出区块链的各块是否被篡改了。

去中心化的挑战

一旦完全去中心化,在网络上就会存在大量的区块链副本(即:全节点),很多事情都会变得比之前中心化 应用环境复杂的多,例如:

  • 如何保证所有副本都已同步到最新状态?

  • 如何保证所有交易都被广播到所有运行和维护区块链副本的节点计算机上?

  • 如何防止恶意参与者篡改区块链

  • ......

通过与经典的C/S架构的对比,我们将逐步理解去中心化应用的核心思路, 并掌握如何构建以太坊上的去中心化应用。

C/S架构以服务器为中心

理解去中心化应用架构的最好方法,就是将它与熟悉的Client/Server架构进行对比。如果你是一个web开发者, 应该对下图很了解,这是一个典型的Client/Server架构:

一个典型web应用的服务端通常由 Java,Ruby,Python 等等语言实现。前端代码由 HTML/CSS/JavaScript 实现。 然后将整个应用托管在云端,比如 AWS、Google Cloud Platform、Heroku....,或者放在你租用的一个VPS 主机上。

用户通过客户端(Client)与 web 应用(Server)进行交互。典型的客户端包括浏览器、命令行工具(curlwget等)、 或者是API访问代码。注意在这种架构中,总是存在一个(或一组)中心化的 web 服务器,所有的客户端都需要 与这一(组)服务器进行交互。当一个客户端向服务器发出请求时,服务器处理该请求,与数据库/缓存进行交互, 读/写/更新数据库,然后向客户端返回响应。

这是我们熟悉的中心化架构。

去中心化架构——彼此平等的节点

下图给出了基于以太坊的去中心化应用架构:

你应该已经注意到,每个客户端(浏览器)都是与各自的节点应用实例进行交互,而不是向 一个中心化的服务器请求服务。

在一个理想的去中心化环境中,每个想要跟DApp交互的人,都需要在他们的计算机或手机上面运行 一个的完整区块链节点 —— 简言之,每个人都运行一个全节点。这意味着,在能够真正使用一个 去中心化应用之前,用户不得不下载整个区块链。

不过我们并非生活在一个乌托邦里,期待每个用户都先运行一个全节点,然后再使用你的应用是不现实的。 但是去中心化背后的核心思想,就是不依赖于中心化的服务器。所以,区块链社区已经出现了 一些解决方案,例如提供公共区块链节点的Infura, 以及浏览器插件Metamask等。通过这些方案, 你就不需要花费大量的硬盘、内存和时间去下载并运行完整的区块链节点,同时也可以利用去中心化 的优点。我们将会以后的课程中对这些解决方案分别进行评测。

以太坊——世界计算机

以太坊是一种区块链的实现。在以太坊网络中,众多的节点彼此连接,构成了以太坊网络:

以太坊节点软件提供两个核心功能:数据存储、合约代码执行。

在每个以太坊全节点中,都保存有完整的区块链数据。以太坊不仅将交易数据保存在链上,编译后 的合约代码同样也保存在链上。

以太坊全节点中,同时还提供了一个虚拟机来执行合约代码。

交易数据

以太坊中每笔交易都存储在区块链上。当你部署合约时,一次部署就是一笔交易。当你为候选者投票时,一次投票 又是另一笔交易。所有的这些交易都是公开的,每个人都可以看到并进行验证。这个数据永远也无法篡改。

为了确保网络中的所有节点都有着同一份数据拷贝,并且没有向数据库中写入任何无效数据,以太坊 目前使用工作量证明 (POW:Proof Of Work)算法来保证网络安全,即通过矿工挖矿(Mining)来达成共识(Consensus)—— 将数据同步到所有节点。

工作量证明不是达成共识的唯一算法,挖矿也不是区块链的唯一选择。现在,我们只需要了解,共识是指各节点 的数据实现了一致,POW只是众多用于建立共识的算法中的一种,这种算法需要通过矿工的挖矿来实现非可信环境下的 可信交易。共识是目的,POW是手段。

合约代码

以太坊不仅仅在链上存储交易数据,它还可以在链上存储合约代码。

在数据库层面,区块链的作用就是存储交易数据。那么给候选者投票、或者检索投票结果的逻辑放在哪儿呢? 在以太坊的世界里,你可以使用Solidity语言来编写业务逻辑/应用代码(也就是合约:Contract), 然后将合约代码编译为以太坊字节码,并将字节码部署到区块链上:

编写合约代码也可以使用其他的语言,不过 Solidity是到目前为止最流行的选择。

以太坊虚拟机

以太坊区块链不仅存储数据和代码,每个节点中还包含一个虚拟机(EVM:Ethereum Virtual Machine)来执行 合约代码 —— 听起来就像计算机操作系统。

事实上,这一点是以太坊区别于比特币(Bitcoin)的最核心的一点:虚拟机的存在使区块链迈入了2.0 时代,也让区块链第一次成为应用开发者友好的平台。

JS开发库

为了便于构建基于web的DApp,以太坊还提供了一个非常方便的JavaScript库web3.js,它封装了以太坊节点的API 协议,从而让开发者可以轻松地连接到区块链节点而不必编写繁琐的RPC协议包。所以,我们可以在常用的JS框架 (比如 reactjs、angularjs 等)中直接引入该库来构建去中心化应用:

本教程的网址是:http://www.dwz.cn/7zBqC2,希望深入学习以太坊Dapp开发可以访问。

转载于:https://www.cnblogs.com/jasonnode/p/8552621.html

以太坊(ethereum)开发DApp应用的入门区块链技术教程相关推荐

  1. 以太坊(Ethereum) - 分布式应用(DApp)

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  2. 当Google大数据遇上以太坊数据集,这会是一个区块链+大数据的成功案例吗?

    作者 | Allen Day.Evgeny Medvedev 编译 | 王柯凝.kou 就像熟知"互联网+"一样,你肯定或多或少也了解"区块链+"这个名词,甚至 ...

  3. 小白入门区块链技术与应用展望(有参考文献)

    区块链技术的技术原理与应用展望      区块链技术是一种去中心化,去信任的分布式数据库技术方案.该数据库由参与系统的所有节点集体维护,具有去中心化,不可篡改,透明,安全等特性.随着比特币数字加密货币 ...

  4. python入门区块链技术_区块链入门教程

    什么是区块链? 从字面上看:区块链是由一个个记录着各种信息的小区块链接起来组成的一个链条,类似于我们将一块块砖头叠起来,而且叠起来后是没办法拆掉的,每个砖头上面还写着各种信息,包括:谁叠的,什么时候叠 ...

  5. python入门区块链技术_Python学习入门之区块链详解

    前言 本文将给大家简单介绍关于区块链(BlockChain)的相关知识,并用Python做一简单实现.下面话不多说,来一起看看详细的介绍: 什么是区块链 简单来说,区块链就是把加密数据(区块)按照时间 ...

  6. 以太坊(Ethereum) - 网络节点

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

  7. 【区块链】以太坊区块链技术初探

    2019独角兽企业重金招聘Python工程师标准>>> [国内首家]以太坊区块链实战教学:http://edu.csdn.net/course/detail/6455 LinApex ...

  8. 比特币、以太坊、瑞波币、万融链和区块链

      关于比特币 8 年,比特币创造一个神话--价格上涨近 300 万倍,国内价格一度突破 2 万元.在这场神话中,不同的人看到了不同的故事.投机者看到了赚钱的机会,技术极客看到了改变未来的技术,传统金 ...

  9. 区块链技术--Ethereum(以太坊)

    以太坊项目进一步扩展了区块链网络的能力,从交易延伸为智能合约(Smart Contract) 其官网首页为 ethereum.org. 简介 根据以太坊官方的宣称,以太坊(Ethereum)目标是打造 ...

  10. 以太坊(Ethereum) - 让浏览器支持区块链(MetaMask)

    章节 以太坊(Ethereum) – 是什么 以太坊(Ethereum) – 什么是智能合约 以太坊(Ethereum) – 以太币 以太坊(Ethereum) – 虚拟机(E.V.M.) 以太坊(E ...

最新文章

  1. Atitit Java OpenCV 捕获视频
  2. php文件之间相互引用路径问题的一般处理方法
  3. 程振波 算法设计与分析_算法分析与设计之动态规划
  4. python 字符串split 正则分割 换行符_python数据分析实战-JOINamp;SPLIT分割与合并
  5. MySoft组件之MySoft.Data更新日志
  6. .NET 6 使用 Obfuscar 进行代码混淆
  7. 关键字驱动小例子_example2
  8. YUV422格式信号格式(以备学习之用)
  9. 计算机图书管理属于计算机应用中的,计算机在图书管理中应用探究.doc
  10. 主分区、扩展分区和逻辑分区(转载)
  11. Atitit mysql数据库自定义异常在java里面的捕获与处理推荐标准与规范
  12. Ubunu16.04安装CPU版本Tensorflow
  13. 从 VI 编辑器谈操作系统起源及编辑器本质
  14. 常用Web漏洞扫描工具汇总
  15. 从少年变成老男孩-----韩寒与郭敬明的十年
  16. npm i安装命令中的-g -D -S的区别
  17. 事务四大特征:(原子性、一致性、隔离性、持久性)
  18. iVX和其它低代码平台没啥好比的 (一)
  19. android 统一推送平台,工信部实验室成立安卓统一推送联盟:推送服务将实现统一...
  20. MTK android系统源码修改快速上手

热门文章

  1. 非线性方程的数值解法:二分法的MATLAB实现
  2. ubuntu安装阿里源
  3. MATLAB地图作为底图,Matlab中自带地图绘制WorldMap详解
  4. PHP集成环境 Xampp,PHPwamp等等国内外著名的集成环境
  5. keil5兼容keil4操作
  6. 在美团,我从暑期实习到转正
  7. android horizontalscrollview 固定宽度,Android HorizontalScrollView 内容宽度
  8. pthread_attr详解
  9. 斐讯路由器k2编程器救砖教程
  10. LPDDR4协议规范之 (六)刷新