今天,我将向你展示如何在以太坊区块链上构建你的第一个去中心化应用程序或dApp。我将告诉你如何编写你的第一个以太坊智能合约,我们将在两个候选人之间举行选举。我们将针对智能合约编写测试,将其部署到以太坊区块链,并开发允许帐户投票的客户端应用程序。我们还将研究关键概念,如“什么是区块链?”,“什么是智能合约?”,以及“dApp如何工作?”。
什么是区块链?
让我们用一个类比来理解区块链是什么以及它是如何工作的。我们来看一个Web应用程序。
通常,当你与Web应用程序交互时,你使用Web浏览器通过网络连接到中心服务器。此Web应用程序的所有代码都位于此中心服务器上,并且所有数据都位于中央数据库中。无论何时与应用程序进行交易,都必须与Web上的此中心服务器进行通信。
如果我们要在网上构建我们的投票应用程序,我们会遇到一些问题:
- 可以更改数据库上的数据:可以多次计数,也可以完全删除。
- Web服务器上的源代码也可以随时更改。
我们不想在网络上构建我们的应用程序。我们希望在区块链上构建它,任何连接到网络的人都可以参与选举。我们希望确保他们的投票得到统计,并且他们只计算一次。那么让我们来看看它是如何工作的。
区块链不是拥有网络,中心服务器和数据库,而是一个网络和数据库。区块链是计算机的点对点网络,称为节点,共享网络中的所有数据和代码。因此,如果你是连接到区块链的设备,则你是网络中的节点,并且你可以与网络中的所有其他计算机节点进行通信。你现在拥有区块链上所有数据和代码的副本。没有更多的中心服务器。只是一堆在同一网络上相互通信的计算机。
而不是集中式数据库,区块链中节点之间共享的所有交易数据都包含在称为块的记录包中,这些记录捆绑在一起以创建公共分类帐。此公共分类帐表示区块链中的所有数据。公共分类帐中的所有数据都通过加密散列来保护,并通过一致性算法进行验证。网络上的节点参与以确保通过网络分发的所有数据副本是相同的。这是我们在区块链上构建投票申请的一个非常重要的原因,因为我们希望确保我们的投票得到计算,并且它没有改变。
我们的应用程序用户对区块链进行投票会是什么样子?那么,对于初学者来说,用户需要一个带有钱包地址的帐户,其中有一些Ether,以太坊的加密货币。一旦他们连接到网络,他们就会投票并支付一笔小额交易费用来将此交易写入区块链。这笔交易费用称为gas
。无论何时投票,网络上的一些节点(称为矿工)都会竞争完成此交易。完成此交易的矿工将获得我们付款投票的以太币。
作为回顾,当我投票时,我支付gas价格进行投票,当我的投票被记录时,网络上的一台计算机获得我的以太网费用。我反过来相信我的投票是永远准确记录的。
所以同样重要的是要注意,对区块链进行投票会花费以太币,但只是看到候选人名单没有。这是因为从区块链中读取数据是免费的,但写入区块链则不是。
什么是智能合约?
这就是投票过程的工作原理,但我们如何实际编写应用程序代码呢?好吧,以太坊区块链允许我们使用名为智能合约的东西在区块链上使用以太坊虚拟机(EVM)执行代码。
智能合约是我们应用程序的所有业务逻辑所在。这是我们实际编写应用程序去中心化部分的地方。智能合约负责向区块链读取和写入数据,以及执行业务逻辑。智能联系人使用名为Solidity的编程语言编写,看起来很像Javascript。它是一个完整的编程语言,它允许我们执行Javascript所能提供的许多相同类型的事物,但由于它的用例,它的行为有点不同,正如我们在本教程中将看到的那样。
区块链上智能合约的功能与网络上的微服务非常相似。如果公共分类帐表示区块链的数据库层,那么智能合约就是与该数据进行交易的所有业务逻辑所在的位置。
此外,他们被称为智能合约,因为他们代表契约或协议。在我们的投票dApp的情况下,这是一项协议,我的投票将被计算,其他投票只计算一次,并且投票最多的候选人实际上将赢得选举。
现在让我们快速浏览一下我们正在构建的dApp的结构。
我们将拥有一个用HTML,CSS和Javascript编写的传统前端客户端。该客户端将连接到我们将安装的本地以太坊区块链,而不是与后端服务器通信。我们将使用Solidity编程语言在选举智能合约中编写关于dApp的所有业务逻辑。我们将这个智能合约部署到我们当地的Etherum区块链,并允许账户开始投票。
现在我们已经看到了区块链是什么以及它是如何工作的。我们已经看到了为什么我们要在区块链而不是当前的网络上构建我们的投票dApp。我们已经看到,我们希望通过编写将部署到以太坊区块链的智能合约来编写我们的dApp代码。现在让我们跳进去开始编程吧!
我们将要构建什么
以下是我们将要构建的投票dApp的演示。
我们将构建一个客户端应用程序,它将与我们在区块链上的智能合约进行对话。此客户端应用程序将有一个候选人表,列出每个候选人的ID,姓名和投票计数。它将有一个表格,我们可以为我们想要的候选人投票。它还会在你的帐户your account
下显示我们与区块链关联的帐户。
安装依赖项
为了构建我们的dApp,我们首先需要一些依赖项。
节点包管理器(NPM)
我们需要的第一个依赖是Node Package Manager,或NPM,它随Node.js一起提供。你可以通过转到终端并键入以下内容来查看是否已安装节点:
$ node -v
Truffle框架
下一个依赖是Truffle Framework,它允许我们在以太坊区块链上构建去中心化的应用程序。它提供了一套工具,允许我们使用Solidity编程语言编写智能联系人。它还使我们能够测试我们的智能合约并将其部署到区块链。它还为我们提供了开发客户端应用程序的空间。
你可以在命令行中使用NPM安装Truffle,如下所示:
$ npm install -g truffle
Ganache
下一个依赖项是Ganache,一个本地内存中的区块链。你可以通过从Truffle Framework网站下载来安装Ganache。它将为我们提供10个外部账户,并在我们当地的以太坊区块链上提供地址。每个帐户都预装了100个假以太坊币。
Metamask
下一个依赖项是Google Chrome的Metamask扩展。为了使用区块链,我们必须连接到它(记住,我说块链是一个网络)。我们必须安装一个特殊的浏览器扩展才能使用以太坊区块链。这就是metamask的用武之地。我们将能够通过我们的个人账户连接到我们当地的以太坊区块链,并与我们的智能合约进行互动。
我们将在本教程中使用Metamask chrome扩展,因此如果你还没有安装Google Chrome浏览器,则还需要安装它。要安装Metamask,请在Google Chrome网上应用店中搜索Metamask Chrome插件。安装完成后,请确保在扩展列表中选中它。安装后,你会在Chrome浏览器的右上角看到狐狸图标。如果卡住了,请参考视频演示!
语法突出显示
依赖项是可选的,但建议使用。我建议为Solidity编程语言安装语法高亮显示。大多数文本编辑器和IDE没有开箱即用的Solidity语法高亮显示,因此你必须安装一个软件包才能支持此功能。我正在使用Sublime Text,我已经下载了Ethereum软件包,它为Solidity提供了很好的语法高亮。
Smoke测试 - 第1步
现在我们已经安装了依赖项,让我们开始构建我们的dApp!
首先,找到你下载Ganache的地方,然后打开它。现在Ganache启动了,你有一个本地区块链运行。
Ganache为我们提供了10个预装了100个假以太坊的帐户(这在主要的以太坊网络上是不值得的)。每个帐户都有一个唯一的地址和一个私钥。每个帐户地址将作为我们选举中每位选民的唯一标识符。
现在让我们在命令行中为dApp创建一个项目目录,如下所示:
$ mkdir election
$ cd election
现在我们已经进入了我们的项目,我们可以使用Truffle box快速启动和运行。我们将在本教程中使用Pet Shop box。从项目目录中,从命令行安装Pet Shop box,如下所示:
$ truffle unbox pet-shop
让我们看看Pet Shop box给了我们什么:
- 合约目录:这是所有智能联系人所在的地方。我们已经有一个迁移合约来处理我们到区块链的迁移。
- 迁移目录:这是所有迁移文件所在的位置。这些迁移类似于需要迁移来更改数据库状态的其他Web开发框架。每当我们将智能合约部署到区块链时,我们都会更新区块链的状态,因此需要迁移。
- node_modules目录:这是我们所有Node依赖项的主页。
- src目录:这是我们开发客户端应用程序的地方。
- 测试目录:这是我们为智能合约编写测试的地方。
- truffle.js文件:这是我们的Truffle项目的主要配置文件。
现在让我们开始写我们的智能合约!这个智能合约将包含我们的dApp的所有业务逻辑。它将负责读取和写入以太坊区块链。它将允许我们列出将参加选举的候选人,并跟踪所有选票和选民。它还将管理所有选举规则,例如强制执行只投票一次的帐户。从项目的根目录开始,在contract目录中创建一个新的合约文件,如下所示:
$ touch contracts/Election.sol
让我们首先创建一个冒烟测试,确保我们正确设置项目,并且我们可以成功地将合约部署到区块链。打开文件并从以下代码开始:
pragma solidity 0.4.2;
contract Election {
// Read/write candidate
string public candidate;
// Constructor
function Election () public {
candidate = "Candidate 1";
}
}
让我解释一下这段代码。我们首先使用pragma solidity
语句声明solidity版本。接下来,我们使用contract
关键字声明智能合约,然后是合约名称。接下来,我们声明一个状态变量,它将存储候选名称的值。状态变量允许我们将数据写入区块链。我们已声明此变量将是一个字符串,并且我们已将其可见性设置为public
。因为它是公开的,所以solidity将为我们提供免费的getter功能,这将允许我们在合约之外访问此值。我们稍后会在控制台中看到它!
然后,我们创建一个构造函数,只要我们将智能合约部署到区块链,就会调用它。这是我们将设置候选状态变量的值,该变量将在迁移时存储到区块链中。请注意,构造函数与智能合约具有相同的名称。这就是Solidity知道函数是构造函数的方式。
现在我们已经为智能合约创建了基础,让我们看看我们是否可以将它部署到区块链。为此,我们需要在迁移目录中创建一个新文件。从项目根目录,从命令行创建一个新文件,如下所示:
$ touch migrations/2_deploy_contracts.js
请注意,我们使用数字对迁移目录中的所有文件进行编号,以便Truffle知道执行它们的顺序。让我们创建一个新的迁移来部署合约,如下所示:
var Election = artifacts.require("./Election.sol");
module.exports = function(deployer) {
deployer.deploy(Election);
};
首先,我们需要我们创建的合约,并将其分配给名为Election
的变量。接下来,我们将其添加到已部署合约的清单中,以确保在我们运行迁移时部署它。现在让我们从命令行运行我们的迁移,如下所示:
$ truffle migrate
现在我们已成功将智能合约迁移到当地以太坊区块链,让我们打开控制台与智能合约进行互动。你可以从命令行打开松露控制台,如下所示:
$ truffle console
现在我们已进入控制台,让我们获取已部署智能合约的实例,看看我们是否可以从合约中读取候选人的姓名。从控制台,运行以下代码:
Election.deployed().then(function(instance) { app = instance })
这里Election
是我们在迁移文件中创建的变量的名称。我们使用deployed()
函数检索了部署的合约实例,并将其分配给promise的回调函数中的app
变量。
现在我们可以像这样读取候选变量的值:
app.candidate()
// => 'Candidate 1'
恭喜!你刚刚编写了第一份智能合约,已部署到区块链,并检索了部分数据。继续学习以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(二)
======================================================================
分享一些比特币、以太坊、EOS、Fabric等区块链相关的交互式在线编程实战教程:
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- c#比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在C#代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是C#工程师不可多得的比特币开发学习课程。
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- 深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。
- Hyperledger Fabric 区块链开发详解,本课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、信道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、nodejs链码与应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。
- Hyperledger Fabric java 区块链开发详解,课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、信道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、java链码与应用开发的操作实践,是java工程师学习Fabric区块链开发的最佳选择。
- tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(一)