本篇内容介绍了“以太坊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,我们首先需要一些依赖项。
我们需要的第一个依赖是Node Package Manager,或NPM,它随Node.js一起提供。你可以通过转到终端并键入以下内容来查看是否已安装节点:
$ node -v
下一个依赖是Truffle Framework,它允许我们在以太坊区块链上构建去中心化的应用程序。它提供了一套工具,允许我们使用Solidity编程语言编写智能联系人。它还使我们能够测试我们的智能合约并将其部署到区块链。它还为我们提供了开发客户端应用程序的空间。
你可以在命令行中使用NPM安装Truffle,如下所示:
$ npm install -g truffle
下一个依赖项是Ganache,一个本地内存中的区块链。你可以通过从Truffle Framework网站下载来安装Ganache。它将为我们提供10个外部账户,并在我们当地的以太坊区块链上提供地址。每个帐户都预装了100个假以太坊币。
下一个依赖项是Google Chrome的Metamask扩展。为了使用区块链,我们必须连接到它(记住,我说块链是一个网络)。我们必须安装一个特殊的浏览器扩展才能使用以太坊区块链。这就是metamask的用武之地。我们将能够通过我们的个人账户连接到我们当地的以太坊区块链,并与我们的智能合约进行互动。
我们将在本教程中使用Metamask chrome扩展,因此如果你还没有安装Google Chrome浏览器,则还需要安装它。要安装Metamask,请在Google Chrome网上应用店中搜索Metamask Chrome插件。安装完成后,请确保在扩展列表中选中它。安装后,你会在Chrome浏览器的右上角看到狐狸图标。如果卡住了,请参考视频演示!
依赖项是可选的,但建议使用。我建议为Solidity编程语言安装语法高亮显示。大多数文本编辑器和IDE没有开箱即用的Solidity语法高亮显示,因此你必须安装一个软件包才能支持此功能。我正在使用Sublime Text,我已经下载了Ethereum软件包,它为Solidity提供了很好的语法高亮。
现在我们已经安装了依赖项,让我们开始构建我们的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怎么构建一个完整的全栈”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。