第一节概述对于初学者,我们将从以太坊开发的基本概念入手,教您如何构建一个完整的基于以太坊的去中心化应用-区块链投票系统。通过学习,你将掌握:以太坊区块链基础知识开发和部署以太坊合约所需的软件环境使用高级语言(solidity)编写以太坊合约使用NodeJS编译、部署和交互合约使用Truffle开发framework分布式应用程序使用控制台或网页与合约进行交互。必备知识为了顺利完成本课程,最好对以下技术有一些基本了解:一种面向对象的开发语言,例如:Python、Ruby、Java…….前端开发语言:HTML/CSS/JavaScriptLinxu命令行使用数据库的基本概念所有涉及的代码都在Ubuntu(Trusty,Xenial)和macOS上测试过。Section2Introduction我们将构建一个去中心化(Decentralized)的投票应用。有了这个投票应用,用户可以在去信任的分布式环境中为特定的候选人投票,每一次投票都会记录在区块链上:所谓去中心化应用(DApp:DcentralizedApplication)就是去中心化应用有一个中心化的应用服务器。应用程序的副本可以在网络中的成百上千台计算机上运行,??因此几乎不可能出现停机。基于区块链的投票是完全去中心化的,因此不需要任何中心化的权力。第三节开发迭代,我们需要涵盖应用开发的全过程。我们将通过三个迭代逐步介绍区块链应用开发涉及的相关概念、语言和工具:Vanilla:在第一个迭代周期中,我们不使用任何开发框架,只使用NodeJS进行应用开发,这有助于我们更好地理解区块链应用的核心概念。Truffle:在第二个迭代周期,我们将使用最流行的去中心化应用开发框架Truffle进行开发。使用开发框架可以帮助我们提高开发效率。代币:在第三个迭代周期,我们会为投票应用引入代币(Token)——现在大家都改名通证了——都是ICO造成的。代币是公链上不可或缺的激励机制,也是区块链应用区别于传统中心化应用的又一显着特征。为什么选择投票应用程序作为演示项目?投票被选为我们的第一个区块链应用程序,因为集体决策——尤其是投票——是以太坊的核心价值主张。另一个原因是投票是很多复杂的去中心化应用的基础构建块,所以我们选择了投票应用作为学习区块链应用开发的第一个项目。第四节初识区块链如果你熟悉关系型数据库,你应该知道一个数据表可以包含很多行数据记录。例如,下面的数据表包含6条交易记录:从本质上讲,区块链首先是一个分布式(Distributed)数据库,它维护着一个不断增长的记录列表。现在,让我们分批存储数据,比如每批100行,然后将存储的批连接起来,它像一个链条吗?在区块链中,一批多条数据记录称为一个区块,一个区块中的每一行数据记录称为一个交易:第一个区块通常称为创世区块,它不指向任何其他区块。不可变区块链的一个显着特点是数据一旦写入链中,就无法被篡改和改写。在传统的关系数据库中,您可以轻松地更新一条数据记录。然而,在区块链中,数据一旦写入,就无法更新——因此,区块链一直在增长。那么,区块链是如何实现数据不可篡改的特性的呢?这首先归功于哈希(Hash)函数——如果你没有接触过哈希函数,不妨把它看成是数字指纹计算函数:输入任意长度的内容,输出固定长度的码流(指纹))。哈希函数的一个重要特性是输入的任何微小变化都会导致输出发生变化。散列值因此可以用作内容的指纹。您可以在此处了解有关哈希函数的更多信息。由于区块链中的每个区块都存储了前一个区块内容的哈希值,如果任何一个区块的内容被篡改,那么被篡改区块之后的所有区块的哈希值也会随之发生变化,所以我们是易于检测区块链的每个区块是否被篡改。去中心化的挑战一旦完全去中心化,网络上就会有大量的区块链副本(即:全节点),很多事情会变得比以前的中心化应用环境更加复杂,比如:如何保证所有副本都同步到最新?如何保证所有交易都广播到所有运行和维护区块链副本的节点计算机?如何防止恶意参与者篡改区块链……在接下来的课程中,我们将通过对比经典的C/S架构,逐步了解去中心化应用的核心思想,掌握如何在市场上构建以太坊去中心化应用。第5节C/S体系结构以服务器为中心理解分散式应用程序体系结构的最佳方法是将其与熟悉的客户端/服务器体系结构进行比较。如果你是Web开发者,你应该对下图很熟悉,这是一个典型的Client/Server架构:典型的Web应用的服务器端通常由Java、Ruby、Python等语言实现。前端代码由HTML/CSS/JavaScript实现。然后将整个应用程序托管在云中,例如AWS、GoogleCloudPlatform、Heroku...,或者将其放在您租用的VPS主机上。用户通过客户端(Client)与网络应用(Server)进行交互。典型的客户端包括浏览器、命令行工具(curl、wget等)或API访问代码。请注意,在此架构中,始终存在一个(或一组)集中式Web服务器,所有客户端都需要与这(一组)服务器进行交互。当客户端向服务器发出请求时,服务器处理请求,与数据库/缓存交互,读取/写入/更新数据库,并返回响应给客户端。这就是我们熟悉的中心化架构。在下一节中,我们将研究基于区块链的去中心化架构之间的一些显着差异。第六节去中心化架构——等节点下图展示了基于以太坊的去中心化应用架构:大家应该注意到,每个客户端(浏览器)都是一个Interact,而不是向一个中心化的服务器请求服务。在理想的去中心化环境中,每个想要与DApp交互的人都需要在他们的计算机或手机上运行一个完整的区块链节点——简而言之,每个人都运行一个完整的节点。这意味着用户必须先下载整个区块链才能真正使用去中心化应用程序。但是我们并不是生活在乌托邦中,期望每个用户都先运行一个全节点然后再使用你的应用是不现实的。但去中心化背后的核心思想是不依赖中心化服务器。因此区块链社区出现了一些解决方案,比如提供公共区块链节点的Infura,以及浏览器插件Metamask等。通过这些解决方案,你不需要花费大量的硬盘、内存和下载并运行一个完整的区块链节点的时间,您还可以利用去中心化的优势。我们将在以后的课程中单独评估这些解决方案中的每一个。第七节以太坊——世界计算机以太坊是一个区块链实现。在以太坊网络中,许多节点相互连接形成以太坊网络:以太坊节点软件提供两个核心功能:数据存储和合约代码执行。在每个以太坊全节点中,都存储着完整的区块链数据。以太坊不仅将交易数据保存在链上,还将编译好的合约代码保存在链上。在以太坊的全节点中,还提供了一个虚拟机来执行合约代码。交易数据以太坊中的每笔交易都存储在区块链上。当您部署合约时,部署就是一个事务。当您投票给候选人时,一票就是另一笔交易。所有这些交易都是公开的,每个人都可以看到和验证。这些数据永远不会被篡改。为了保证网络中的所有节点都拥有相同的数据副本,并且不将无效数据写入数据库,以太坊目前使用工作量证明(POW:ProofOfWork)算法来保证网络安全,即,通过矿工挖矿(Mining)达成共识(Consensus)——将数据同步到所有节点。工作量证明不是达成共识的唯一算法,挖掘也不是区块链的唯一选择。现在,我们只需要明白,共识就是每个节点的数据是一致的,而POW只是用来建立共识的众多算法中的一种。该算法需要矿工挖矿才能实现可靠的信函交易。共识是目的,POW是手段。合约代码以太坊不仅在链上存储交易数据,还可以在链上存储合约代码。在数据库层面,区块链的作用是存储交易数据。那么投票候选人或检索投票结果的逻辑在哪里?在以太坊世界中,可以使用Solidity语言编写业务逻辑/应用代码(即合约:Contract),然后将合约代码编译成以太坊字节码,并将字节码部署到区块链中:合约代码可以写在其他语言,但Solidity是迄今为止最受欢迎的选择。以太坊虚拟机以太坊区块链不仅存储数据和代码,每个节点还包含一个虚拟机(EVM:EthereumVirtualMachine)来执行合约代码——听起来像一个计算机操作系统。其实这就是区分以太坊和比特币(Bitcoin)的核心点:虚拟机的存在让区块链进入了2.0时代,也让区块链第一次成为了对应用开发者友好的平台。JS开发库为了方便构建基于web的DApps,以太坊还提供了一个非常方便的JavaScript库web3.js,它封装了以太坊节点的API协议,让开发者可以方便的连接到区块链节点并且不需要编写繁琐的RPC协议包。因此,我们可以在常用的JS框架(如reactjs、angularjs等)中直接引入这个库来构建去中心化应用:PC端的入门教程在这里:http://xc.hubwiz.com/course/5...
