第一节 课程概述前端
本课程面向初学者,内容涵盖以太坊开发相关的基本概念,并将手把手地教你们如何构建一个 基于以太坊的完整去中心化应用 —— 区块链投票系统。react
经过本课程的学习,你将掌握:angularjs
以太坊区块链的基本知识web
开发和部署以太坊合约所需的软件环境算法
使用高级语言(solidity
)编写以太坊合约数据库
使用NodeJS编译、部署合约并与之交互浏览器
使用Truffle
框架开发分布式应用缓存
使用控制台或网页与合约进行交互安全
前序知识要求服务器
为了顺利完成本课程,最好对如下技术已经有一些基本了解:
一种面向对象的开发语言,例如:Python,Ruby,Java...
前端开发语言:HTML/CSS/JavaScript
Linxu命令行的使用
数据库的基本概念
课程的全部代码均已在Ubuntu(Trusty、Xenial)和 macOS 上测试过。
第二节 课程简介
在本课程中,咱们将会构建一个去中心化的(Decentralized
)投票应用。利用这个投票应用, 用户能够在不可信(trustless
)的分布环境中对特定候选人投票,每次投票都会被记录在区块 链上:
所谓去中心化应用(DApp
:Dcentralized Application),就是一个不存在中心服务器 的应用。在网络中成百上千的电脑上,均可以运行该应用的副本,这使得它几乎不可能 出现宕机的状况。
基于区块链的投票是彻底去中心化的,所以无须任何中心化机构的存在。
第三节 开发迭代
本课程将涵盖应用开发的整个过程,咱们将经过三次迭代来渐进地引入区块链应用 开发所涉及的相关概念、语言和工具:
Vanilla:在第一个迭代周期,咱们不借助任何开发框架,而仅仅使用NodeJS来进行应用开发, 这有助于咱们更好地理解区块链应用的核心理念。
Truffle:在第二个迭代周期,咱们将使用最流行的去中心化应用开发框架Truffle
进行开发。 使用开发框架有助于咱们提升开发效率。
Token:在第三个迭代周期,咱们将为投票应用引入代币(Token
) —— 如今你们都改口 称之为通证了 —— 都是ICO
惹的祸。代币是公链上不可或缺的激励机制,也是区块链 应用区别于传统的中心化应用的另外一个显著特征。
为何选择投票应用做为课程项目?
之因此选择投票做为咱们的第一个区块链应用,是由于集体决策 —— 尤为是投票机制 —— 是以太坊的 一个核心的价值主张。
另外一个缘由在于,投票是不少复杂的去中心化应用的基础构件,因此咱们选择了投票应用做为学习区块链 应用开发的第一个项目。
第四节 初识区块链
若是你熟悉关系型数据库,就应该知道一张数据表里能够包含不少行数据记录。例如,下面的数据表中 包含了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
)进行交互。典型的客户端包括浏览器、命令行工具(curl
、wget
等)、 或者是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://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=oschinaw