eth-proj-bg-merge-0

news/发布时间2024/5/18 14:46:51

面向初学者的 ETH 项目(全)

原文:zh.annas-archive.org/md5/5b197ea4ae8836b6854907e58ea8a1dc

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

本书旨在让你深入了解以太坊区块链世界,并让你使用以太坊制作自己的加密货币。在本书中,你将学习各种概念,并直接应用这些知识,同时还将介绍以太坊区块链在未来提供的广泛功能范围。

本书适合谁阅读

如果你是一个对区块链如何运作充满热情的人,或者你是一个希望从事加密货币工作或对黑客技术感兴趣的爱好者,那么这本书就是为你准备的。

要充分利用这本书

至少需要了解一种面向对象的编程语言。如果你懂一些 JavaScript 就更好了。

我们将大量使用 NPM,并且会回顾区块链的基础知识,但一些先前的基础知识当然是有益的。

下载示例代码文件

您可以从 www.packtpub.com 账户下载本书的示例代码文件。如果您在其他地方购买了本书,您可以访问 www.packtpub.com/support 并注册,文件将直接发送到您的邮箱。

您可以按照以下步骤下载代码文件:

  1. 请登录或注册 www.packtpub.com。

  2. 选择“支持”选项卡。

  3. 点击“代码下载 & 勘误”。

  4. 在搜索框中输入书名,然后按照屏幕上的说明操作。

文件下载完成后,请确保使用最新版本的软件解压或提取文件夹:

  • Windows 用户请使用 WinRAR/7-Zip

  • Mac 用户请使用 Zipeg/iZip/UnRarX

  • Linux 用户请使用 7-Zip/PeaZip

本书的代码包也托管在 GitHub 上,网址为 github.com/PacktPublishing/Ethereum-Projects-for-Beginners。如果代码有更新,将会更新到现有的 GitHub 代码库上。

我们还有其他代码包来自我们丰富的图书和视频目录,可在 github.com/PacktPublishing/ 上查看!快来看看吧!

使用的约定

本书中使用了许多文本约定。

CodeInText:表示文本中的代码字词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 句柄。这里有一个例子:“这可以通过在终端窗口中输入 ganache-cli 来完成。”

代码块设置如下:

function MetaCoin() public {balances[tx.origin] = 10000;}

任何命令行输入或输出都将按照以下方式显示:

C:\Windows\System32\my_project>truffle-cli compile

粗体:表示一个新术语、一个重要单词或屏幕上显示的单词。例如,菜单或对话框中的单词在文本中显示为这样。这里有一个例子:“在上述提到的本地主机 URL 中输入并点击“保存”。”

警告或重要说明会以这种方式出现。

小贴士和技巧会以这种方式出现。

联系我们

我们的读者的反馈总是受欢迎的。

一般反馈:发邮件至feedback@packtpub.com,并在邮件主题中提及书名。如果您对本书的任何方面有疑问,请发邮件至 questions@packtpub.com 联系我们。

勘误:尽管我们已经尽最大努力确保内容的准确性,但错误总是在所难免。如果您在本书中发现错误,我们将不胜感激地接受您的报告。请访问 www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表格链接,并填写详细信息。

盗版:如果您在互联网上发现我们作品的任何形式的非法复制,请提供给我们地址或网站名称。请发送邮件至 copyright@packtpub.com 并附上资料链接。

如果您对成为作者感兴趣:如果您有专业知识的领域,并有意撰写或为一本书作出贡献,请访问 authors.packtpub.com。

评论

请留下您的评论。阅读并使用本书后,为什么不在购买书籍的网站上留下评论呢?潜在读者可以查看并使用您不带偏见的意见做出购买决定,我们在 Packt 可以了解到您对我们产品的看法,而我们的作者们也可以看到您对他们的书籍的反馈。谢谢!

欲了解更多有关 Packt 的信息,请访问 packtpub.com。

第一章:工作流程设置和区块链思考

区块链是加密货币世界中的新潮流;我们见证了比特币的显著增长的流行。以太坊使用与比特币类似的技术,它交易的货币被称为以太币。除了智能合约外,两者之间几乎没有什么区别。智能合约实际上就是使用以太坊虚拟机EVM)编写的代码,它会在不可篡改的账本上自动执行协议。我们稍后会更多地了解这一点。要深入了解,首先我们将研究一些用例-它们非常有趣。接下来我们将介绍以太坊区块链和区块链的概述。我们将了解一些区块链的益处和局限性。然后,我们将着手建立一个高效的工作流程,以便我们可以进入后续章节而没有任何阻碍。

这一章我们将涉及的主题如下:

  • 基于以太坊的项目

  • 区块链和以太坊的概述

  • 益处和局限性

  • 建立高效的工作流程

基于以太坊的项目

以太坊就像比特币,但它是为代码而存在!它是用于智能合约的区块链,并且它在区块链中存储不可变的代码和逻辑。这里不可变是一个非常重要的词。这基本上就是你需要了解的全部关于以太坊的信息。那么,现在可能有什么可能性?让我们在接下来的章节中深入了解。

Gnosis

Gnosis 是基于市场驱动的预测技术。它基于经过验证的科学研究。它有自己的平台,称为 Gnosis 平台,你可以在其上构建自己的平台。它基本上预测交易。而正确的预测将获得押注的代币。访问gnosis.pm/以访问 Gnosis。

它的工作原理是你交易预测或者你对预测进行赌注。以下是 Gnosis 的主页:

Gnosis 首页

在上面的截图中,请注意主页上提出的问题。杜拜的世界纪录最大跨年烟花表演会被打破吗?你可以选择是或否进行投票,投票会使用你的代币,并且一个预言机随后会告诉你活动是否发生。区块链会对这个预言机进行验证。预言机实际上就是与外部元素进行交互的智能合约。它们能存储和检索数据,这正是以太坊交易所需要做出决定的东西。预言机是一个可信的来源,在与这个可信来源进行核实后,你就可以在区块链中确定这个活动是否真的发生了,并且你可以对此绝对确定。

以下的图表解释了这一点的实际发生:

Gnosis 平台层级

FirstBlood

FirstBlood 类似于 Gnosis;它是为电子竞技而设计的。在你是一名玩家的情况下,你可以使用代币注册比赛。你可以把代币拿来押注以赢取更多代币,你可以把自己放入一个由其他团队或人组成的队列中,并与他们进行比赛。你甚至可以参加比赛。游戏的获胜者获得代币。Oracle 用于决定比赛的结果。访问 firstblood.io 以访问 FirstBlood。

Dynamis

这是一家点对点保险公司,意味着不再有中间商。目前,他们正在开展失业保险业务,你可以因失业而获得报酬!你只需向人们展示你正在积极寻找工作。他们验证此方式是通过使用类似于 Gnosis 和 FirstBlood 的 Oracle,但他们用它来检查 LinkedIn 并验证你是否一直在申请工作。

要了解更多关于 Dynamis 的信息,请访问 www.dynamisapp.com。

你也可以访问 blog.dynamisapp.com/p2p-insurance-solutions/ 以获得更深入的见解。

Ujo Music

这基本上是一个为艺术家打造的去中心化音乐商店!我们都知道 iTunes、Spotify 等等。这些是坐在艺术家和他们的粉丝之间的公司,但是粉丝无法立即知道艺术家每次销售可以赚多少钱。Ujo Music 通过去中心化音乐商店来解决这个问题。没有了中间商,这意味着它们是艺术家和粉丝之间的桥梁。这当然意味着它为艺术家提供了更多的权力和金钱。不必担心许可,它只向已验证的身份提供音乐服务。要访问 Ujo Music,请访问 ujomusic.com/

它的工作方式如截图所述;它们有多个层次,其许可和支付基于以太坊。它们在 uPort 上有一个持久的身份,uPort 也是基于以太坊构建的:

Ujo Music

文件本身存储在去中心化文件存储 星际文件系统(IPFS) 中,元数据使用的是也建立在以太坊上的 constellation。

下一个项目是我最喜欢的之一。

Golem

它是一个去中心化的超级计算机!它执行离线计算。离线计算是不在区块链上进行的计算;计算是在区块链外进行的。然后在链上,它将验证这些计算。这意味着你可以出租你多余的计算能力,或者在需要时租用额外的计算能力。你可以用于 3D 渲染、计算化学、人工智能机器学习——任何你喜欢的事情。要访问 Golem,请转到 golem.network/

在下面的截图中,您可以看到 Golem 的 GUI。 在左侧,您可以看到一个基本的钱包; 您还可以看到正在使用多少 CPU、RAM 和磁盘空间。 在右侧,您可以看到三个任务的一个小概念,这是三个 Blender 任务,在这种情况下,是 3D 渲染任务:

Golem GUI

区块链和以太坊概述

在这里,我们将简要概述以太坊和区块链。 我们将稍微深入了解一下,以便您更好地了解以太坊和区块链是如何制造出这些伟大的产品—我们已经看到的这些伟大的用例是可能的。

从比特币到以太坊

比特币是第一个区块链,但比特币只是用于支付。 人们开始发现比特币可以用于其他场景; 我们称之为有色硬币。 比特币具有惊人的开放设计,一个人,Vitalik Buterin,决定在比特币区块链上开始开发以太坊。 但是,由于比特币的限制,以太坊现在有了自己的区块链。

以下表格显示了比特币和以太坊之间的区别:

比特币 以太坊
用于支付 用于代码和逻辑
它是数字货币 它是智能合约平台
平均块时间/交易处理时间为 10 分钟 平均块时间/交易处理时间仅为 17.5 秒
它不是图灵完备的 它是图灵完备的

比特币和以太坊都是区块链。 它们都严重依赖于私钥/公钥加密,尽管比特币主要是一种支付形式,但两者都可以用于转移价值,尽管使用以太坊区块链时,价值将通过逻辑处理。 两者都是完全不可变的。

关于区块链需要记住的事项:

  • 当某事在区块链上时,它是最终的。 这意味着您所做的任何事情都不会被回滚,因此即使是您的代码,您也必须找到特殊的方式来更新它。

  • 你的私钥是你的数字身份,所以不要丢失它!

  • 区块链不是独立存在的;它通常与其他技术一起使用,主要是前端技术或后端技术。

好处和限制

现在我们已经对区块链进行了概述,我们将看一下区块链的一些好处。 当您开发区块链应用程序时,我们还将看一些限制,并且我们将看一下如何克服这些限制或如何解决这些限制。

区块链和以太坊的好处

以下是区块链的一些好处:

  • 去中心化

  • 无信任性——您无需信任或将所有资金放在单一的失败点上

  • 它可能非常具有成本效益

  • 它也可以表现为物联网和电动汽车的支柱,电力网格或智能手机中的分散式身份,或电子身份证

区块链和以太坊的局限性

在使用区块链时,以下是一些可能遇到的困难:

  • 如果尝试在不需要的地方使用区块链,可能会非常昂贵。

  • 区块链对私有数据的处理能力并不理想,因为区块链本来就应该是公开的。

  • 有时,需要集中化,而区块链总是去中心化的;这并不匹配。

  • 大多数区块链在高使用量下的扩展能力并不理想。

  • 不建议存储大文件,因为更多的计算意味着更多的功耗和更多的钱在公共区块链上;在私有区块链上,这只意味着更多的功耗——你需要投资更多的基础设施,所以这也是更多的钱。

克服限制

有时,您只是无法克服限制,因为您必须在需要时使用区块链。有些事情是可以克服的,比如在公共链上存储私有数据。这可以通过对数据添加额外的加密来完成。您可以将大文件存储在 IPFS 上,这也是去中心化的——它不是区块链,但它是去中心化的文件存储,它与以太坊非常配合。可伸缩性问题通过以太坊的分片得到解决:分片意味着将账户空间(如合同)分割为更小的子空间。如果需要的话,还可以使用私有链,比如 J.P. 摩根的 Quorum、Monax 和 Bletchley。它们都是基于以太坊的。

设置工作流程

在这里,我们将进行一些工作流程设置,以便开始开发。

要求

设置工作流程所需的以下内容:

  • Google Chrome。

  • MetaMask,这是一个 Chrome 扩展程序。我们将使用它来连接和测试区块链。

  • Node Package ManagerNPM)。

  • Truffle,这是我们的第一个框架。我们将使用它来开发我们的第一个去中心化应用程序。

  • Ethereum-JS ganache-cli,这是一个测试区块链。

入门

按照以下步骤设置工作流程:

  1. 获取 NPM。它是 Node.js 的一部分。您可以在 www.npmjs.com/get-npm 上获取它,如下图所示:

获取 NPM。

  1. 选择显示在网页上的最新版本:

    • 安装 MetaMask。要下载 MetaMask,请访问 metamask.io/
  2. 点击“获取 Chrome 扩展程序”。

    • 然后点击“添加到 Chrome”。
  3. 我们将使用上述工具来测试我们的区块链应用程序。安装完成后,将打开一个新标签页,其中有一个视频详细解释了如何使用它以及它是什么。

  4. 在本书期间,请务必记住,您可以连接到主网络以及三个测试网络,但您也可以设置自己的网络、自己的区块链,并在其中运行。以下截图显示了这一点:

MetaMask 主网络

  1. 安装名为ganache-cli的以太坊区块链模拟器。

  2. 这可以按照以下截图中的说明完成:

安装以太坊区块链模拟器的命令

  1. 你可以将此作为节点包安装,只需复制此命令并粘贴到你的终端中。一旦你在终端中粘贴了它,它将开始安装,如下所示:

安装以太坊模拟器

安装完成后,它将告诉你安装成功了;现在先退出,因为我已经重新安装了这个。你可以继续通过在命令提示符中键入ganache-cli来验证它是否运行。如果你已正确安装了模拟器,你将获得以下输出:

以太坊模拟器

  1. 安装和下载 Truffle。

  2. Truffle 也是一个简单的节点包,来自truffleframework.com,你可以通过复制并粘贴命令到你的终端来安装,如下所示:

安装 Truffle 的命令

  1. 安装完成后,你可以通过在终端中键入truffle来验证,如下截图所示,现在你可以使用其中任何命令:

Truffle

  1. 你可以使用init初始化一个新项目,在下一章中我们将这样做。因此,我们已成功完成了安装。

总结

我们已经讨论了运行在以太坊上的不同项目,并对区块链有了概述;之后,我们转向其优点和限制,以及如何克服这些限制。最后,我们为我们自己的以太坊工作流创建了一个设置。

在下一章中,我们将使用以太坊开发我们的第一个简单的去中心化支付应用程序。

第二章:使用以太坊开发您的第一个去中心化应用程序

DApps去中心化应用程序 是在区块链上运行的应用程序。以太坊为其用户提供了一些灵活性,使他们能够创建此类应用程序。在本章中,我们将专注于创建一个 DApp 并学习如何在我们生活的各个方面实施它。

在本章中,我们将学习如何进行以下操作:

  • 创建一个项目

  • 部署和测试项目

  • 探索 Solidity 语法和 JavaScript 代码

  • 修复智能合约中的错误并进行调试

  • 用更好的支付方式改变我们的应用程序

要构建一个应用程序,我们需要理解用于开发它的代码和语法。因此,我们将查看 Solidity 语法,并了解 JavaScript 代码的工作方式。

创建一个项目

本节将教我们如何创建一个新项目。我们需要探索代码和 Solidity 语法。部署项目将帮助我们了解将该项目转变为更好的支付应用程序有多容易。为了更好地理解这个概念,我们将详细了解一些关于 bug 修复的具体内容,还将学习调试智能合约和一些功能应用程序。

要开始,我们需要创建一个新文件夹。为了符合约定,让我们将其命名为 my_first_project

接下来的即时步骤是运行 Truffle。使用以下命令进行此操作:

C:\WINDOWS\system32>truffle

命令的输出应该如下所示:

这显示了可以用于 Truffle 的各种过程的命令列表。Truffle init 命令允许我们初始化一个新的 Truffle 项目。

在整本书中,我们将使用一个方便的 Truffle unbox 命令来下载和设置一个样板项目。为此,我们将使用 webpack 盒子,通过运行 truffle unbox webpack 命令来完成,如下面的截图所示:

C:\Windows\System32\my_project>truffle unbox webpack

所有的盒子都在他们的网站上列出来,这是一个不断增长的列表,其中包括一些 React 盒子和许多其他盒子。解包需要一段时间,之后您将在屏幕上看到以下消息:

完成此操作后,我们可以在所选编辑器中开始创建我们的项目。我们可以通过查看项目结构开始。解包将为我们创建几个文件和文件夹。您的屏幕应该看起来类似于以下内容:

它还将安装一个 webpack,可以通过 webpack.config.js 文件进行配置。此文件允许您配置如何将 JSON、CSS 和 JavaScript 进行最小化,以及介于其中的所有内容。您还将拥有一个 truffle.js 文件,用于定义您的网络。点击此按钮后,您的屏幕将如下所示:

truffle.js文件预先定义了一个默认为localhost:7545的开发网络。它还将创建一个包含我们主要项目的 app 文件夹。此文件夹包含一个 HTML 索引以及一些 CSS 和 JavaScript,用于导入我们的智能合约。contracts文件夹包含一个ConvertLib,这是一个简单的库,用于演示目的,在main文件MetaCoin.sol中导入。文件扩展名清楚地表明此处使用的语言是 Solidity,有人可能称其为为 Ethereum 开发的 JavaScript 方言。您还可以看到迁移和test文件夹。每个都有自己的目的,我们将在本书的课程中学习。下一节将向我们展示如何部署和测试项目。

部署和测试项目

我们现在将部署在前一节中创建的应用程序。我们将通过启动开发区块链,配置我们的部署,部署我们的智能合约以及构建应用程序来完成此操作。

启动开发区块链

首先,我们要运行我们的开发区块链。这可以通过在终端窗口中输入ganache-cli来完成。您的屏幕将如下所示:

确保记下或记住本地主机端口号。这很重要,因为您将在项目的后期阶段连接到它。Ganache-cli 生成 10 个可用账户,然后生成相应的私钥。这些私钥用于加密从每个个人账户发送的交易。在底部,您将看到一个助记词。这十二个单词非常重要。请务必记住这些单词,因为您将需要它们来导入您的私钥以及相同的账户到 MetaMask 中。

配置您的部署

继续前进,我们需要确保项目设置与我们的区块链创建时的主机名和端口对应。为此,您需要回到编辑器,找到位于root文件夹中的truffle.js文件,并在此处将端口号从7545更改为8545,以匹配托管我们的开发区块链的端口号。不需要对主机进行任何更改,因为它只是本地主机。然后,在终端窗口中继续在my_first_project文件夹中部署您的项目。使用以下命令:

C:\Windows\System32\my_project>truffle-cli compile

如果您使用的是 Windows 系统,我们需要在位于C:/users/[YOUR USERNAME]/appdata/roaming/npm的 npm 包文件夹中进行一些更改。路径可能因每个用户在不同机器上安装npm包的位置而异。我们需要将npm包中的truffle.cmd文件重命名为truffle-cli.cmd

这样可以确保智能合约在没有任何错误的情况下被编译。一旦发生这种情况,您的屏幕应如下所示:

构建输出文件现在已写入合同文件夹(也称为 build 文件夹)。

部署智能合约

立即执行的下一步是将这些智能合约迁移并部署到您的开发区块链。为此,我们使用以下命令:

C:\Windows\System32\my_project>truffle-cli migrate

上述命令有助于创建您的合同并为每个合同进行交易。以下截图应该帮助您清楚地确定您需要在屏幕上注意的因素:

在这里,您可以观察到第一个合同后的创建 - 某些变量已更新,某些交易已发生。同样的过程重复创建多个合同,每个合同都有自己的变量和交易。

返回您选择的编辑器,您将在您的 migration 文件夹中找到这些合约。部署的过程从 migration 智能合约开始,然后转移到 ConverLib 智能合约。MetaCoin 是最后一个要部署的智能合约。如果我们查看位于编辑器的 migration 文件夹中的 deploy_contracts.js 文件,就可以更清楚地理解。

以下截图还可帮助您了解已部署的智能合约的顺序:

探索 Solidity 语法和 JavaScript 代码

本节将帮助我们理解 Solidity 语法。我们将探索 Solidity 和 JavaScript 代码,以深入了解我们的项目。这也将赋予我们修改代码以根据需要自定义它的能力。

理解 Solidity 语法

为了理解语法,让我们看一下 Solidity 文件 MetaCoin.sol。以下截图将作为指南,以便我们理解每一行代码:

如您所见,每个 Solidity 文件都以您当前使用的 Solidity 版本的定义开始。在本例中,那将是 0.4.17。接下来立即导入转换库(通常称为 ConvertLib.sol)。如下所示的代码块显示了这一点:

pragma solidity ⁰.4.17;library ConvertLib{function convert(uint amount,uint conversionRate) public pure returns (uint convertedAmount){return amount * conversionRate;}
}

我们现在将继续创建一个合约。我们将使用 contract 关键字,后跟您的合约名称。例如,contract xyz。合约运行类似于其他任何编程语言中的类的概念:

contract MetaCoin {

MetaCoin 智能合约首先添加的是第一个变量,即映射,一个名为 balances 的映射。映射本质上是一种键值存储,允许您将地址映射到无符号整数。这个地址可以是一个独特的人或一个独特的账户。这个 mapping 函数是您应用程序的核心变量:

mapping (address => uint) balances;

下一个变量被定义为一个事件,并且它被分配了三个参数。这些参数是FROMTOVALUE。事件可以用于触发 JavaScript 事件,甚至记录一些数据:

event Transfer(address indexed _from, address indexed _to, uint256 _value);

MetaCoin 构造函数用于向部署智能合约的人提供 10,000 个MetaCoin。这个人通常是管理员。也可以是另一个部署了这个智能合约的智能合约:

function MetaCoin() public {balances[tx.origin] = 10000;}

下一个函数是sendCoin。它接受两个参数:接收者和金额。它也可以返回一个值。在函数中定义返回值有两种方法。第一种方法是直接实现返回函数,写作returns(uint),第二种是给它任何名字,比如returns(bool sufficient)。这个函数使用if循环来检查消息或交易的发送者是否有足够的余额。然后代码继续检查如果发送者的余额小于他/她想要发送的金额,如果是,返回的值是false或者是不足额的余额。如果不是,我们继续前进并检查它是否从发送者扣除了金额,并将相同金额添加到接收者。

function sendCoin(address receiver, uint amount) public returns(bool sufficient) {if (balances[msg.sender] < amount) return false;balances[msg.sender] -= amount;balances[receiver] += amount;Transfer(msg.sender, receiver, amount);return true;}

结束后,将触发转账事件,随后是日志或 JavaScript 事件,也会返回true来指示发送者实际上有足够的余额:

function getBalanceInEth(address addr) public view returns(uint){return ConvertLib.convert(getBalance(addr),2);}function getBalance(address addr) public view returns(uint) {return balances[addr];}

getBalanceInEthgetBalance 函数被定义为视图,返回一个整数。视图是一种返回展示数据的功能。getBalanceInEth 函数利用了 Convert 库,它传递的第一个参数来源于 getBalance 函数。getBalance 函数返回被传递的参数的余额。你可以观察到 address.addr 被外部调用,因此它将被传递到 JavaScript 端。数字 2 被传递作为第二个参数。这是一个转换率,而第一个参数是金额。这是一个简单的乘法,模拟代币和以太币之间的转换。

现在我们将使用ConvertLib,它不仅被定义为一个库,而且还被单独部署。以下代码帮助我们更好地理解其运作方式:

library ConvertLib{function convert(uint amount,uint conversionRate) public pure returns (uint convertedAmount){return amount * conversionRate;}
}

这样做的主要好处是你可以维护一个包含你的业务逻辑的智能合约,也可以维护一个包含一堆辅助函数甚至变量的智能合约。

使用 JavaScript

Truffle 为我们提供了易于导入并与智能合约交互的工具。以下是一个名为app.js的 JavaScript 代码文件的截图,你可以在app目录下的javascript文件夹中找到它:

这里首先导入的是Web3库,它是由以太坊提供的。它与以太坊区块链进行接口。它可以根据当前需求请求信息或发送交易。

下一个导入是truffle-contract。它作为 Truffle 提供的合约接口的包装器。

然后,我们从build目录中的MetaCoin.JSON文件导入metacoin_artifacts。使用此合约初始化一个MetaCoin变量,并将metacoin_artifacts作为参数传递给此合约构造函数。这使我们可以使用MetaCoin智能合约的可用抽象。MetaCoin合约用于设置提供者,这个提供者是我们将与区块链进行接口的方式。

currentProvider通常由提供Web3库的任何东西填充,这在这种情况下是MetaMask

然后,我们使用Web3库获取我们测试区块链设置中处于活动状态的所有账户。getAccounts函数将获取您拥有的实际上属于您的安装中所有可用的账户。为了理解,让我们假设每个账户代表多个人或多个账户。

如果你正在运行一个真实的、在线的区块链节点,getAccounts函数实际上不会获取到所关注的区块链中的所有账户。

一旦账户被获取,refreshBalance函数就会使用我们之前定义的MetaCoin抽象来获取所关注合约的已部署实例。然后,该实例用于获取余额。请记住,这不是一个交易;这是一个用于获取一些数据的调用。因此,使用关键字调用。调用实际上不会花费我们任何东西。

如果这真的是一笔交易,你会改变什么?不多。你只会消除关键字call。简单,对吧?

让我们继续定义getBalance函数的第一个参数;这里的账户参数与我们为我们的 Solidity 文件MetaCoin.sol定义的getBalancegetBalanceinEth函数的第一个参数相一致。

这里的第二个参数是一些额外的数据,你可以添加到一个调用或一个交易中。在这种情况下,我们可以确定它来自于与调用相同的账户。完成后,我们可以返回一个值,或者使用它来更新balance_element。如果发生错误,它将被记录在控制台上。

发送一枚硬币也是使用类似的过程——我们再次获取已部署的实例,然后使用sendCoin函数。仔细观察会让我们意识到这里没有call关键字,因为这是一笔实际的交易。从一个人发送一枚硬币到另一个人是区块链的变化,因此这是一笔交易。

进一步的步骤将保持不变;这些包括语法、参数顺序等。

修复和调试智能合约

本节告诉您如何进行故障修复和调试代码。通常,代码将在开发者控制台中调试,这类似于开发常规 JavaScript 代码。如果 JavaScript 代码中存在错误,则可以在开发者控制台上轻松更正。但是,如果错误出现在您的智能合约中,您需要深入了解。一旦智能合约上线,您将如何调试它?好吧,您不能在本地调试。如果有人发现了错误,您需要找出它来自哪里。因为这些原因,我们可以使用remix.ethereum.org和etherscan.io

在remix.ethereum.org找到的MetaCoin Solidity文件的修改版本如下所示:

您可以通过单击左上角的加号图标并给它一个您选择的名称来创建此文件。编译此代码后,您将注意到一个绿色的条形图,表示代码已成功编译。让我们尝试通过省略一个分号引入错误;条形图现在将变为红色,表示存在需要纠正的错误。

以下截图将帮助您了解屏幕上的各个选项卡:

运行选项卡包含环境部分,我们应确保选择 JavaScript VM 作为我们希望使用的环境。这样可以在我们的浏览器中模拟以太坊区块链,类似于 TestRPC 的功能。

您可能会注意到MetaCoin Solidity文件的构造函数现在包含一个firstHolder参数。firstHolder将是首个获得 10,000 个 MetaCoins 的人。您可以选择任意账户。然后需要确保您复制并将其作为构造函数的参数给出。对于地址,通常最好将它们放在引号之间。

创建MetaCoin后,屏幕下半部分将显示一个包含您的交易的窗口。它看起来像下面的截图所示:

货币交易

此窗口包含交易的详细信息。我们还可以调试文件。但首先让我们通过将地址复制到 GetBalance 选项卡来获取此人的余额。

完成此操作后,我们可以继续调试。我们可以逐步进行以更好地理解过程。这将仅有三个步骤,因为这是一个小函数。

现在让我们试着在任意两个帐户之间发送一些硬币。这将要求我们复制第二个帐户的地址并将其用作“SendCoin”选项卡中的第一个参数。当然,第二个参数将是您希望转移的硬币数量。请参考以下屏幕截图以获得清晰的理解:

您可以在“详细信息”下的灰色区域或调试中检查交易的详细信息,如下面的屏幕截图所示。您还可以检查交易的状态。要了解清楚,请单击调试以查看逐步过程。由于 remix 是以太坊开发者的开源项目,几乎任何人都可以使用它。您可以通过从 Git 上拉取它,也可以在线使用它。由您决定:

获取余额并将硬币发送到不同的账户

一旦您的智能合同启动,您可以在etherscan.io上监视交易。只需选择任意交易。您可以查看源代码或找出它是否是智能合同。交易信息显示所有已发生的交易。您可以查看事件日志,其中显示了你在 Solidity 代码中创建的事件写入的文本。如果您已执行其中任何交易,您可以使用Geth DebugTrace来追踪它们。如果您试图追踪不属于您的任何交易,您会遇到错误,因为没有可用的追踪。这可以在交易的工具和实用程序部分中看到。

Parity 跟踪只是另一个可以使用的以太坊客户端。您将在这里看到跟踪,尽管这可能没有太多意义。当您的智能合同上线时,您将不会对其进行修复,而是进行更新。您总是可以在本地进行调试。

更改我们的应用程序,使用更好的支付应用程序

本节将集中于我们改进我们的代码。这将包括添加诸如存入以太币、获得代币和以以太币换取代币以及一个创建者费用等功能。

我们将使用上一节中使用的相同代码并继续构建它。

由于我们不希望以太币的存款交换免费代币,我们将彻底删除以下代码行:

function MetaCoin() public {balances[tx.origin] = 10000;}

我们首先设置一个创建者。为此,我们需要定义一个地址创建者和一个creatorFee如下:

contract MetaCoin {mapping (address => uint) balances;address creator;uint creatorFee = 1;uint collectedFees = 0;uint conversionRate = 5;uint CURRENCY_MULTIPLIER = 10**18;

collectedFees可以说是一个资金池。这用于收集creatorFees。转换率是用来乘以代币数量的率。例如,如果您有一单位以太币,您将获得五个代币作为交换。假设有 0.1 单位以太币的情况下,转换仍然在后端使用整数。currency_multiplier用于等价您的代币和以太币的价值。最小面额是 wei。

当智能合约被创建时,我们还需要将message.sender初始化为创建者:

  function MetaCoin() public {creator = msg.sender;}

创建者需要一些自己的特殊功能,比如用于提取费用的功能。这要求我们创建一个名为onlyCreator的修饰符。在这里,代码应该如下所示:

modifier onlyCreator() {if (msg.sender == creator || tx.origin ==creator) {_;} 
}

这增加了一个条件,即如果message.sender是创建者,或者如果transaction.origin来自创建者,那么才会执行代码。这是通过添加下划线来实现的。

接下来的步骤将是创建一个名为collectFees的函数。出于代码的考虑,我们将它设为 public,但仅有创建者才能调用这个函数。您的代码应该如下所示:

function collectFees() public onlyCreator {creator.transfer(collectedFees);collectedFees = 0;
}

现在,我们将资金转移到创建者,并将收取的费用设置为 0。现在,我们要添加的是一些功能,以便每当有人发送硬币时,我们希望这些硬币的一部分能够流向创建者,为此我们将创建存款和提款功能。

存款功能将是一个可支付的功能。可支付功能在您想要接收以太币时使用。如果您忘记使用它,它只会显示一个错误:

function depsoit() public payable {balances[msg.sender] += msg.value * conversionRate *  CURRENCY_MULTIPLIER;
}

已经在合同函数中设置了使用的转化率。记住,我们的代币将与以太币的工作方式相同;这意味着一个代币将被乘以 10 的 18 次方。因此,当您存款任何代币时,它将被乘以CURRENCY_MULTIPLIER

然后,我们将进入提款功能。在实现此功能时需要格外小心,因为我们首先需要使用合同函数中设置的货币乘数进行乘法。然后我们将通过执行交易者的余额来扣除需要提取的金额。该金额将被除以转换率。此功能的代码如下:

function withdraw(uint amount) public {amount = amount * CURRENCY_MULTIPLIER;balances[msg.sender] -= amount;msg.sender.transfer(amount / conversionRate);}

总结

在本章中,我们看了一下如何创建基于以太坊的应用程序。我们还部署并测试了相同的项目。然后,我们深入了解了 Solidity 语法,这不仅是庞大的,而且还非常广泛。我们还学习了如何使用我们自己的系统以及外部系统来修复错误。最后,我们将我们的项目转换为一个支付应用程序。

下一章重点介绍了创建我们自己的代币的概念。我们将更仔细地研究 ICO 和处理我们自己的代币交易。

第三章:在以太坊区块链上创建你自己的加密货币

在本章中,我们将看看如何创建我们自己的 ERC20 代币项目。ERC20 代币是建立在以太坊区块链之上的加密货币。我们将查看其规范,以及如何进行首次代币发行。我们还将学习如何处理代币交易和转移价值。

我们将在本章中涵盖的主题如下:

  • 创建一个加密货币/ERC20 代币项目

  • ERC20 标准/规范

  • 首次代币发行

  • 处理代币交易

创建一个 ERC20 代币

在本节中,你将学习如何创建一个 ERC20 代币。我们将从设置一个新项目开始 —— 我们将使用 OpenZeppelin Solidity 框架来创建我们的项目。

安装 OpenZepplin Solidity

OpenZeppelin 基本上只是一组智能合约,你可以导入到自己的智能合约中,以加快开发速度。它们还可以从一开始就使您的智能合约更加安全。

你可以访问 OpenZeppelin 的 GitHub 页面,网址为 OpenZeppelin Github:

如果你一直在浏览 Truffle 网站 —— truffleframework.com —— 那么你可能已经见过 Ganache。我们将在本节中一直使用它。Ganache 是一个 GUI,比 TestRPC 更容易导航,但做的事情和 TestRPC 一样多。你可以在 Ganache 的 GitHub 页面上下载它,网址为 Ganache GitHub。

ethereumjs-testrpc 已被弃用,并更名为 ganache-cli。详细信息请访问以下链接:www.npmjs.com/package/ethereumjs-testrpc

下载后,您可以运行它。打开应用程序后,您将看到类似以下屏幕截图的界面:

Ganache

这应该很熟悉:这些是由 TestRPC 生成的 10 个帐户。你可以看到你的区块、你的交易和你的日志。

设置新项目

要设置一个新项目,请按以下步骤操作:

  1. 为项目创建一个新文件夹。

  2. 在控制台上,运行 truffle 命令,truffle –cli unbox webpack

  1. 运行 npm install –E 命令。因为 OpenZeppelin 建议指定 –E,并将拉取一个特定版本的 OpenZeppelin,它永远不会更新它,并将保持相同的版本。这是因为它还没有语义化版本控制。

  2. 运行 npm install –E zeppelin-solidity。OpenZeppelin 更加安全,因为它从一开始就考虑了安全性。

  3. 现在让我们切换到编辑器。在这里,我们将找到我们的起始项目。

  4. 让我们开始删除我们不需要的东西。在迁移中,点击 deploy contracts 并删除 ConvertLib 的部署,即删除 ConvertLib 变量和 deployer.deploy() 变量;但是让 deployer.link() 保留 MetaCoin 变量:

  1. 进入 contracts 文件夹,并通过右键单击删除 ConvertLib.sol 来删除它。

  2. MetaCoin Solidity 文件中,删除 ConvertLib。删除所有的函数代码。

  3. 从 OpenZeppelin 中导入标准代币。OpenZeppelin 是一个基本的 ERC20 接口,我们可以通过运行命令 import ‘zeppelin-solidity/contracts/tokens/ERC20/StandardToken.sol' 来使用它。这导入了 OpenZeppelin 框架中的 StandardToken Solidity 文件,并且它知道要在您的 node modules 文件夹中查找:

  1. 现在我们可以为此定义 MetaCoin。在 contract MetaCoin 之前添加 is StandardToken

  2. 现在让我们迁移 MetaCoin。确保 Ganache 正在运行。在 RPC 服务器下,你应该看到 Ganache 运行在本地主机或端口号为 7545。Truffle 默认运行在 7545;您应该能够在编辑器中看到这一点:

  1. 现在,要迁移 MetaCoin,我们可以运行命令 truffle -cli migrate

  1. 现在你应该看到它正在编译您的 MetaCoin、迁移以及一堆来自 OpenZeppelin 框架的文件。

执行完所有这些步骤后,我们的 Ganache 应该看起来类似于以下内容:

在进行合同调用后的 Ganache

现在你应该看到您的交易已经完成。Ganache 已经进行了合同调用,创建了合同。我们已经准备好继续进行了。

部署和测试 ERC20 代币

在这个部分,我们将看一下如何部署和测试我们的 ERC20 代币,或者加密货币。我们将看一下在转移代币时可能会遇到的一些潜在问题和安全问题,我们将查看所需的 Solidity 和 JavaScript 来进行转移代币。我们也将使用 Ganache 和 MetaMask 进行测试。

部署 ERC20 代币

首先,我们需要一些数据输入到编辑器中。在 MetaCoin.sol 中,我们需要定义一个名称、一个符号、小数点的数量和 INITIAL_SUPPLY。我们也将我们的 INITIAL_SUPPLY 赋给构造函数中的 totalSupply。我们还将给予代币的创建者 INITIAL_SUPPLY

我们知道我们需要totalSupply,因为如果你去到 StandardToken,位于 node modules | zeppelin-solidity | contracts | token | ERC20 | StandardToken 下,你会发现它导入了 ERC20BasicToken。现在,如果我们去到 ERC20 文件夹,我们会发现这是一个接口,但是 BasicToken.sol 实现了这个接口。所以让我们去到 BasicToken.sol 文件夹。它将拥有totalSupplybalances。我希望你还记得上一章的内容。它有一个 Transfer 函数,使用了来自 SafeMath.Solidity 文件的 SafeMath。这是一个小的 Solidity 文件,它将确保每当你执行数学运算时,你的输入和输出数据都是正确的,并且不会损坏任何东西,因为一旦数据在区块链中,它就会保留在区块链中。所以,在定义了这一点之后,我们可以继续部署它。按照以下步骤部署 ERC20 代币,你的第一个加密货币:

  1. 让我们确保 Ganache 正在运行。

  2. 一旦 Ganache 运行起来了,复制助记词,粘贴到 metamask.io 的“恢复保险库”中。我们之前已经做过这个,你可能还记得。

你甚至可以重新安装 MetaMask 来重置所有内容。这会使事情变得更简单,因为 MetaMask 目前还没有这个功能。

  1. 点击确定。一开始你应该什么也看不到。检查网络。如果你在主网络上,你将不得不连接到 http://localhost:7545 —— 这是 Ganache 正在监听的端口。你可以通过点击主网络旁边的下拉箭头,并选择 自定义 RPC 来做到这一点。在上述本地主机 URL 中键入并保存。你应该看到 MetaMask 已经立即连接上了。你可以查看你的账户;你应该有一些以太币:

  1. 转到migrations文件夹,确保其中有var MetaCoin

  2. 让我们去MetaCoin.sol。请注意,INITIAL_SUPPLY 将被指定的小数位数除以。

  3. 切换到终端窗口。输入truffle-cli migrate命令。你应该能够看到成功出现的交易。复制合同代币:

合同代币

  1. 复制完这些内容后,你可以转到 MetaMask。访问左上角的图标,点击添加代币,并粘贴代币地址到代币地址部分。它将自动检索代币符号和指定的小数位数。点击添加。你将看到你的第一个代币,前面跟着你的符号:

  1. 现在你可以点击上方的用户图标创建一个账户。你现在会有一个第二个账户。退出代币标签页,你会发现你的第二个账户上有 0 个代币:

  1. 现在,这里有一个小惊喜。你可以直接使用你已经有的代码来发送这些代币。与上一个示例中的 MetaCoin 的不同之处在于,现在这些代币实际上遵循了一个真正的标准,即 ERC20 标准。它规定你需要一个名称、一个代币符号、小数位数和一个INITIAL_SUPPLY

  2. 要转移代币,请运行npm run dev命令。

  3. 打开网络浏览器并导航到localhost:8080

  1. 转到编辑器。JavaScript 函数仍将尝试调用getBalance函数,但这已经改变了。如果你转到BasicToken Solidity文件,你会看到你有balanceOf。所以让我们去app | JavaScripts | app.js,然后到refreshBalance函数。在这里,我们将meta.getBalance改为meta.balanceOf。还要转到sendCoin函数并将meta.sendCoin更改为meta.transfer。确保你在ERC20文件夹下的BasicToken.sol中有相同类型的方法签名:

  1. 现在转到localhost:8080页面的浏览器。切换到第一个账户。就是这样。你看不到小数点,但那只是一个前端的东西;我们以后会再看一下:

测试 ERC20 代币

我们现在将在你的第二个账户上进行测试。

  1. 复制你的第二个账户的地址,如下截图所示:

复制第二个账户的地址

  1. 你需要在项目的app目录下的javascript文件夹中的app.js文件中进行更改:

  1. 切换到第一个账户并发送你的 MetaCoin。输入一个值,比如 5,000,000 单位(等于 5 个代币)。这个值应该小于INITIAL_SUPPLY中指定的值。请记住,INITIAL_SUPPLY除以小数点将给出 5 个代币,因此是 5,000,000。粘贴地址并点击发送 MetaCoin:

  1. 刷新页面后,你会看到你的两个账户都有代币:

你现在已经创建了你的第一个 ERC20 标准加密货币并部署了它。

理解代币标准

在本节中,我们将更深入地研究 ERC20 代币以及为什么需要其他代币标准,如 ERC721 和 ERC827。

ERC20

如果你去 以太坊维基 查看 ERC20 代币标准,你可以看到所有你可以实现的函数和事件。此外,大多数代币都符合 ERC20 标准。你可以看到 Golem 网络代币 (GNT) 只是部分符合 ERC20 标准,但它仍然是一个标准代币;你不一定要完全遵循所有规定,但如果你这样做总是更好。在这些函数中,我们以前没有见过的是 allowanceapprove。在某些情况下,这些函数可能很有用。例如,如果你有 20 个 MetaCoin 代币,你可以说我希望我的朋友或另一个账户以我的名义花费代币。嗯,你可以用 approve 函数做到这一点。使用 allowance 函数,你可以指定一个花费者和你希望他们能够花费的代币数量。

ERC721

让我们去 EIP GitHub。EIP 指的是以太坊改进协议。在这里,在问题标签页,我们可以看到许多关于改进的讨论。如果你觉得你可以提出一个改进,你可以写成一份草案。正是通过这些讨论,有人提出了 ERC: 不可互换代币标准。

首先,让我们定义一下什么是可互换的代币。根据定义,可互换的代币可以用于购买一定数量的商品或服务或其他可交易物品。同样地,美元可以花费,或者美元可以用来交换欧元。在这方面,不可互换的代币更像是棒球卡片,你可以有两个同一张卡片的任意引号或非引号选项,但一个可能比另一个更有价值,因为人们给它的价值不同。这就是 ERC721 代币的情况。如果你去 ERC-721 定义,你可以看到一个简要定义。你可以看到 name()symbol()totalsupply()

在这个定义中,你可以拥有一个代币,而且代币有一个所有者;你不必把代币交给所有者,你可以只是交易它。代币还有元数据,这个元数据指定了一个代币拥有哪些属性,这意味着它有一个价值。因此,这使得这些代币非常像棒球卡片,或者,如果你熟悉的话,以太坊 CryptoKitties:

CryptoKitties 是这种类型代币的一个例子。它是一种可收集、可繁殖、可爱的代币。访问 cryptokitties.co 获取更多信息。在他们的市场上,你可以看到出售的 CryptoKitties。一些是由像你和我这样的人出售的,以太币,如下图所示:

CryptoKitties 市场

其中一些甚至是独家的 CryptoKitties。它们是以高数量的以太币出售的非常特殊的代币。

你可以用这些 CryptoKitties 交易以太币,价格将会根据你所设置的内容而变化。这些是我的一些小猫:

我的小猫

ERC827

再次,如果你访问EIP GitHub,你将得到一个摘要,以及为什么我们需要 ERC827 代币标准的解释。你实际上可以指定一些数据或一个函数,在转账发生后执行。这可以通过以下函数完成:

function transferAndCall(address _to, uint256 _value, bytes _data) public payable returns (bool) {require(_to != address(this));require(super.transfer(_to, _value));require(_to.call(_data));return true;}

你可以在以下链接找到这个函数:github.com/ethereum/EIPs/issues/827

你可以对接收方的地址调用上述函数。

这一切都关于代币标准。这还不是结束——将来肯定会出现很多新的代币标准。肯定会有很多提案。并非所有提案都会被接受,但一旦被接受,那是因为它们确实为整个体系带来了一些新东西。你甚至可以提出改进;谁知道,它可能会变成一个新的代币标准!现在我们可以学习如何使用我们的代币为智能合约的一些逻辑支付。

使用代币和执行逻辑

你可能会想知道第三方是如何在收到代币后执行调用的。实际上,这非常容易。在 JavaScript 中,可以使用以太坊提供的 Web3 库来完成。以下是在 remix 上显示的智能合约。我们之前已经探索了 remix:

一个智能合约

这只是递增一个整数,检查它是否小于 10,并且如果是,则返回 true;否则返回 false。你可以使用 JavaScript VM 解决这个问题。编译和运行后,如果点击SampleFunc,灰色区域会增加一个新的条目。如果点击详情,你会看到一个输入条目——你可以复制这个。这将是你为这个函数的第三个参数。你可以像执行其他函数一样执行它。

现在,如果你使用 ERC827 智能合约发送代币,这个函数将被执行。

但是这有什么用呢?总的来说,安全性。接收方可以提取代币,引用或取消引用,并收到它们。原因在于智能合约中,你不希望仅仅发送代币并假设操作成功。像这样假设成功过去曾导致一些相当大的黑客攻击。你可以采用某种提取方案,在其中发送代币,然后使其可供接收方提取。

总结

在这一章中,我们学习了如何创建 ERC20 代币,然后部署和测试它们。我们还研究了不同的代币标准,看到了一些代币的示例,比如 CryptoKitties,并了解了可能在未来出现的新标准的范围。我们还学习了如何使用这些代币,并在有人收到这些代币时执行逻辑。在下一章中,我们将学习如何签署文件和处理更大的文件,然后利用这些知识构建一个应用程序!

第四章:在区块链上签署法律文件和身份验证

区块链的广泛使用使得有必要专门讨论这个主题。区块链的多功能性诱使用户尝试在我们生活的各个领域实施它们。虽然有时可能看起来很繁琐,但在网络上访问这些分类账以执行诸如交易或签署文件之类的活动,使其成为一种可以在没有实际付出太多努力的情况下传达数据的可行方法。然而,在一定程度上使用去中心化分类账来存储和处理数据是非常方便和安全的。

本章将专注于以下主题:

  • 在区块链上存储用户身份和敏感数据

  • 在区块链上处理大文件

  • 区块链上的用户身份验证

  • 在区块链上签署文件

与其他章节相比,本章更多的是理论性的,因为它很大程度上取决于我们选择工作的后端技术。

用户身份和区块链上的敏感数据

让我们从讨论用户身份的主要方面开始——用于验证的参数。我们可以通过使用人的电子邮件地址、电话号码,甚至物理地址来实现这一点。也许有人会想知道我们如何做到这一点。实际上,在区块链上非常容易验证上述任何参数。为此,我们可以使用确认代码。用户可以将此确认代码与他/她的以太坊账户相连,进而将其与他/她的私钥相连。作为管理员,您必须确保不是您生成此代码。这将赋予您随意制造用户的权力。您希望您的用户是真实和经过验证的人,以消除您的区块链中的不可信元素。我们可以使用 Twilio 或任何外部服务提供商来生成这些代码。Twilio 广泛用于短信验证,包括电话验证。

现在让我们考虑如何处理无法存储在公共区块链上的敏感数据的情况。您可能会自言自语:有私有区块链。我知道,我知道。但是现在,假设所有的区块链都是公共区块链。您不能在该特定区块链上存储诸如您的姓名、电话号码或电子邮件地址之类的敏感数据。这将是一个严重的隐私问题。成功的区块链需要真实的证据来证明存储在其中的数据是无法篡改的。这涉及不将整个区块链存储在中央服务器上。为了解决这个问题,我们将求助于散列和使用我们的后端存储,包括 MySQL 或 Oracle。

哈希

哈希是一种将大字符串值转换为小的固定长度值的方法。它用于索引的目的。搜索字符串与搜索值相比是困难的。哈希不仅使索引变得更容易,还会影响到任何字符串的搜索时间。它减少了搜索时间,因为找到一个短值比原始字符串值要容易得多,也更有效率。

要学习如何执行哈希操作,你将首先对一些用户信息进行哈希处理,并将其存储在你的智能合约中,从而允许你将一个匿名的区块链身份与现实生活中的身份关联起来。

为了使这个工作正常,你需要鼓励用户为你的应用程序创建一个新的以太坊账户。这将在他们在应用程序外部使用此账户时为他们提供匿名性。

使用私有区块链也是一个解决方案。这种方法的缺点超过了它的优点。其中两个缺点涉及数据篡改和数据审查。然而,只有当区块链由你控制的实体托管时,这些问题才会成为问题。找到解决这些问题的方法是目前银行感兴趣的内容。假设我们有银行 A、B 和 C。这三家银行已经联合起来使用一个单一的私有区块链,而不管它们之间是否竞争。这导致它们制定了内部安全措施,使任何人都无法操纵数据。

要更好地理解这一点,让我们看一个例子,涉及到我们验证用户身份。这始于用户访问你的应用程序并生成一个新的地址和一个新的私钥。他也可以使用 MetaMask、Geth 或任何其他提供者来执行此操作。后端系统将通知智能合约有一个新的未经验证的用户,并且第三方应用程序,比如 Twilio,将发送一个验证代码。在这一点上,即使你是管理员,你也无法看到代码。这样做可以防止任何管理团队成员凭空捏造用户的可能性。一旦代码被输入,它将传递给智能合约。

pragma solidity ⁰.4.17;contract SensitiveDataExample {bytes32[] userHashes;// The backend would take a user-object. For example a simple JSON// {name: "Kenny", familyName: "Vaneetvelde", address: "Some Address 123"}// After hashing this entire object, you can pass it to the function below.// Later, you can re-hash it, to verify the user and data if/when needed.function addUser(bytes32 userHash) {userHashes.push(userHash);}}

上述代码是一个 JSON 文件,它将向我们展示如何使用哈希来保护敏感数据:

在 remix.org 上的 SensitiveData.sol 文件及其输出

这里的数据被哈希处理,然后传递给addUser函数。这将允许数据保留在你自己的数据库中。

如果你试图以邪恶的管理员身份操纵数据,那么你的哈希值就不会正确。一旦哈希值传递给addUser函数,addUser函数将把userHash推送到userHashes字节数组的顶部。

处理区块链上的文件和大型数据

在本节中,我们将学习如何处理任何区块链上的大文件和文档。如之前多次提到的,区块链通常是公开的,因此隐私和安全应处于首要位置。区块链包含填入其中的所有数据,这在以太坊的情况下会导致成本增加,即每次交易都需要支付更多的 gas。由于这不是我们想要的,我们将使用一些变通方法。

这些变通方法之一是Swarm。还有 IPFS,即星际文件系统,在第一章,工作流设置和区块链思考中我们简要介绍了。您还可以使用自己的服务器来存储数据和更大的文件。

Swarm 和 IPFS 并不是区块链,但它们遵循去中心化的共同原则,使它们成为不易篡改的分布式文件存储系统。

一开始文件并不是去中心化的。当通过 IPFS 上传文件时,您成为该文件的第一个独立主机。当其他人下载或请求相同的文件时,他们也成为主机,其余网络也会有主机的参考。对点之间的连接关系允许一个人通过重定向到正确的位置/人来下载或查询文件。

由于 Swarm 和 IPFS 还没有完全开发,您可以选择使用自己的系统和一些哈希。您可以从后端开始制作 SHA 哈希文件,并将此文件存储在区块链中。在不更改哈希的情况下,将无法编辑此文件,从而使哈希失效。

无论何种情况,如果用户想要验证其合同,他们只需重新对文件进行哈希处理以与原始哈希进行比较。这可以作为确保其合同未被篡改的保证。

让我们看一下以下代码示例,以帮助我们更深入地理解哈希的概念:

pragma solidity ⁰.4.17;contract DocumentExample {bytes32[] documentHashes;function addDocument(bytes32 documentHash) {documentHashes.push(documentHash);}}

remix 中前述代码的输出:

在上图中,我们已经对整个文档进行了哈希处理,并且我们还将通过调用addDocument函数将该哈希添加到智能合约或区块链中,该函数将传递哈希并将其推送到数组。

使用区块链进行用户身份验证

本节着重介绍用户验证过程和背后的 Solidity 代码。让我们考虑以下 Solidity 代码:

pragma solidity ⁰.4.17;
contract UserExample {mapping(address => bool) user_verified;mapping(address => bytes32) user_codes;mapping(bytes32 => address) to_sign;mapping(bytes32 => bool) signed;address owner;modifier onlyOwner() {require(msg.sender == owner);_;}function UserExample() public {owner = msg.sender;}function addUser(address user, bytes32 hashed_verification) public onlyOwner {user_verified[user] = false;user_codes[user] = hashed_verification;}function verify(bytes32 verification_code) public {if (user_verified[msg.sender] == false && sha256(verification_code) == user_codes[msg.sender]) {user_verified[msg.sender] = true;}}
}

正如您所看到的,所有者是您自己的服务器。构造函数将所有者的值定义为message.sender,其中包含部署智能合约的人的地址。

代码经历以下步骤:

  1. 用户访问您的应用程序。

  2. 相同的用户输入了一些私人详细信息。

  3. 详细信息以哈希的形式存储在所选智能合约中。

  4. Twilio 或第三方服务提供商将向用户发送短信,同时系统调用名为add.User的 Solidity 函数。

  5. add.User函数传递两个参数,即address userhashed_verification,后者是一个 32 字节的数组,其中包含您发送给用户的代码的哈希值。该函数只能由所有者或修改者调用,在本例中是您或您的服务器。

  6. 合同构造函数包括一个布尔值,该布尔值存储了由add.User函数中的user_verified映射的地址。这个布尔值默认为false值。

  7. user_codeshashed_verification映射到一个 32 字节的数组。

  8. 用户在前端输入代码。

  9. verify函数然后通过比较用户提供的验证代码的哈希与管理员在add.User函数中发送的哈希来检查用户是否经过验证。

您不要在 JavaScript 中对验证代码进行哈希处理,以备将来进行验证,因为第三方可以直接拿取该代码,对其进行哈希处理并进行检查。

  1. 一旦用户通过验证,布尔值的默认值就会从false更改为true

  2. 用户经过验证后,验证代码将存储在区块链上的明文中。

在区块链上签署文件

本节将教您如何在区块链上签署文件,比如合同。让我们考虑以下代码以了解如何完成这项工作:

pragma solidity ⁰.4.17;
contract UserExample {mapping(address => bool) user_verified;mapping(address => bytes32) user_codes;mapping(bytes32 => address) to_sign;mapping(bytes32 => bool) signed;address owner;modifier onlyOwner() {require(msg.sender == owner);_;}function UserExample() public {owner = msg.sender;}function inviteUser(bytes32 documentHash, address user) public onlyOwner {to_sign[documentHash] = user;}function signDocument(bytes32 documentHash) public {if (msg.sender != to_sign[documentHash]) {revert();}signed[documentHash] = true;}
function addUser(address user, bytes32 hashed_verification) public onlyOwner {user_verified[user] = false;user_codes[user] = hashed_verification;}function verify(bytes32 verification_code) public {if (user_verified[msg.sender] == false && sha256(verification_code) == user_codes[msg.sender]) {user_verified[msg.sender] = true;}}
}

以下截图是 remix-Solidity 框架中前述代码的结果:

remix 中 UserExample.sol 文件的输出

这段代码允许您将用户添加到您的区块链中。它还允许您邀请用户签署文件。由于该代码类似于我们在上一节中使用的代码,标题为使用区块链进行用户身份验证,因此我们只会关注我们对代码做出的修改,以适应额外的功能——即允许用户签署合同。

如果我们仔细查看代码,我们会注意到有两个新的参数映射。其中一个将 32 字节的数组(bytes32)映射到一个用户的地址,而另一个将 32 字节的数组(bytes32)映射到一个名为signed的布尔值。

Structs也可以用来映射变量。

合同部署后,您可以上传文件,对其进行哈希处理,然后将其添加到区块链中。完成这些步骤后,您可以邀请用户。邀请用户会导致用户被添加到to_sign映射中的documentHash。让我们假设我们有如下代码:

//to_sign[0x121212121212] = 0x121212133293928

在这里,0x121212121212是哈希值,0x121212133293928是你的用户。然后你可以通过包含一个指向该文件的链接的电子邮件通知用户关于他的邀请。用户可以使用这个链接来查看和验证这份文件。用户端的验证过程需要他们对文件进行哈希,并将其与提供给他们的哈希进行比较。如果用户想要深入进行验证,他们可以在区块链上查找这个哈希。之后,用户可以调用signDocument函数。

要理解signDocument函数是如何工作的,让我们假设你想要签署0x1212哈希的文件。你应该首先调用该函数,第一个参数是用户。首先,它将检查你的地址是否与受邀用户的地址不同。如果是的话,你的交易将被取消,并使用revert函数,在这段代码中是null。如果这两个地址匹配,我们可以简单地继续签署文件。

这是我喜欢区块链的原因之一。人们可以通过将变量设置为true来简单地签署一份文件。一旦这个变量被设置为true,你就可以将这份文件视为已签署。如果这在法庭上作为证据,文件应该有效,因为它已经用私钥签署了。这使得这个人签署了合同是毋庸置疑的。

总结

这一章带我们学习了如何在区块链上处理大型数据文件的旅程。考虑到数据敏感性是当前世界发展中必不可少的概念,我们学习了一些简单的方法来实现区块链的安全性。然后,我们了解了在区块链上通过第三方验证真实世界用户身份的过程,并学习了如何借助区块链签署文件。

下一章将教我们在浏览器之外使用以太坊所需的基本概念和方法,以及它如何作为物联网的支撑。我们还将快速浏览组成区块链的物理组件。

第五章:以太坊在 PC/Web 环境之外

到目前为止,我们已经了解了如何在个人电脑上使用以太坊。本章将介绍以太坊在各种其他应用程序中的用途:智能手机是其中最常用的电子设备之一。当前技术的增长要求我们实现需要自动系统的物联网。本章重点讨论以下主题:

  • 以太坊在浏览器之外

  • 以太坊和物联网

  • 以太坊和智能手机应用程序

  • 进一步的步骤和资源

我们将看一下人们如何在浏览器之外使用以太坊,人们如何将以太坊作为物联网的支柱,以及你如何在区块链中使用物理组件。此外,我们还将看一下你如何在智能手机应用程序中使用以太坊。我们还将讨论一些进一步的步骤和资源,供你使用。所以让我们开始看一下如何在浏览器之外使用以太坊。

以太坊在浏览器之外

本节将教我们如何在浏览器之外使用以太坊。以太坊团队已经开发了可以在 Java、Python、Go 或.NET 上使用的标准库。这些库可以直接从 GitHub(github.com/ethereum)访问。

要在浏览器之外使用以太坊,你需要的一个必要功能是与以太坊网络建立连接。这种连接可以是直接的——即直接连接到你的应用程序——或者你可以使用一个中继服务器。虽然使用中继服务器并不是最佳选择,但完全可行。要使用中继服务器,你首先需要拥有一个自己的服务器,它是集中式的,并且只接受预签名的交易。

在浏览器之外使用以太坊所必需的另一个要求是你将用于开发它的语言的以太坊库。这是可选的,因为我们始终从原始数据开始任何交易。要让以太坊网络上的交易进行下去,我们需要对原始数据进行编码并分配一个私钥。交易受私钥签名保护,因此受到修改的限制。之后,你可以将其发送到网络上。这可以通过中继服务器完成。这涉及到一些选择性的静音,因此,确保你自己发送交易到网络上是更可靠的选择。根据你使用的软件,可以使用以下链接来完成这一操作:

  • 如果你是 Python 用户,可以使用Web3.py库。它可以在github.com/ethereum/web3.py免费获取。

  • 如果你是 Java 的忠实用户,Java 库可以在 Web3J 的 GitHub 账户上找到,网址为 github.com/web3j/web3j

对于任何其他实施,您可以在以太坊 GitHub 帐户下找到库,网址为github.com/ethereum/。Golem 是一个很好的例子,它在浏览器之外使用以太坊。我们在第一章已经看过这个了。Golem 在链下计算,但在链上验证完成的所有计算。这使得大量分布式计算能力成为可能。要获取更多信息,您可以参考 Golem Github 页面,并查看存储库中的代码,网址为github.com/golemfactory/golem

以太坊和物联网

在本部分,我们将看一下以太坊以及它如何帮助传播物联网。在我个人看来,以太坊是物联网的完美支撑系统。这是因为两个因素:数据流和安全。数据分布在整个网络中,这是物联网最基本的概念;这种畅通无阻的数据流是使用以太坊来帮助建立物联网的关键因素。此外,每个设备都有自己的私钥,这增强了安全因素。这两个元素的结合带来了许多新的可能性。

让我们看一个涉及电动车充电的案例研究。目前,电动车或充电站并不多。未来很有可能所有车辆都将使用电力。这意味着会在更多地点设置更多的充电站。让我们考虑一个在超市设置充电站的情况。为了提供这项设施是不可行的。为了使这个过程更容易,车辆可以直接支付服务费。该如何做到这点呢?

必须要有两个智能电表,每个都有自己的私钥。一个在充电站,另一个在车上。车辆的所有者/用户需要将一些以太币添加到与车辆私钥相关联的地址上。当车辆在充电站请求电力时,这将被添加到负责此交易的智能合约中。充电站的智能电表将跟踪车辆消耗的电量,并相应地扣费。这里的金额将直接支付。充电站的所有者随后会根据需要撤回以太币。

尽管目前整个场景都是假设的,但有一些特殊的考虑。由于每辆汽车和每个充电站都需要一台计算机,因为它们各自都需要有私钥。同时还需要一个工作中的互联网连接和一些防篡改的智能电表。一旦数据进入区块链,任何人都无法篡改它,因为这些数据都是公开记录的一部分。即使防篡改的智能电表存在漏洞,它也会公开展示出来。避免欺诈的另一种方式是向相关机构注册车辆的私钥。

以太坊和智能手机应用程序

您可以通过三种方式制作支持以太坊的智能手机应用程序:

  • 使用 DApp 浏览器。

  • 使用 Android 或 iOS 库。

  • 从密钥生成到密钥安全以及其中的所有操作,都使用 JavaScript 完成。但是,不建议这样做,因为这会使您非常脆弱。

使用 DApp 浏览器

一种类型的 DApp 浏览器是 Toshi。它将允许您使用集中式应用程序,并且您可以以几乎与您在移动设备上使用 MetaMask 相同的方式使用它。另一个更受欢迎的选项是 Status.IM。它实际上是一个安全聊天,但也是一个聊天机器人。您可以给它命令,例如检索浏览器位置,如以下屏幕截图所示,如果您给它这样的命令,那么您可以触发智能合约内部的函数:

Status.IM 主页

使用此方法开发了一些应用程序。其中一款应用程序是 WhoPays。这是一个基于合同的机器人,可以创建用户可以通过新的聊天机器人使用命令跟踪他们向群组支付的款项。这意味着您可以使用聊天命令设置组。假设您为三个人购买了杂货,并且您支付了所有费用。其他人必须向您支付。您可以设置此安排,他们可以同意一笔金额,并使用应用程序向您支付。以下屏幕截图显示了 WhoPays GitHub 页面,网址为 github.com/Nielsvdiermen/WhoPays

WhoPays

另一个例子是 favor.network。在这里,您可以向人们请求帮助,并支付他们来完成这些帮助:

Favor.network

这些应用程序要么赢得了Status.IM黑客马拉松的奖项,要么排名非常靠前。我强烈建议您查看这些应用程序并使用它们来学习如何与 Status.IM 一起工作。

使用 Android 或 iOS 库

在 2016 年 12 月,以太坊发布了一个也可以在移动平台上运行的桌面客户端版本,因此您只需将这些库导入到您的 Android 应用程序或 iOS 应用程序中,并以与在桌面上使用它相同的方式使用以太坊。

以下屏幕截图显示了 go-ethereum GitHub 仓库:

Go-Ethereum GitHub 仓库

进一步的步骤和资源

我想提一下 Infura。Infura 基本上是以太坊和 IPFS 网络的中继服务器,你不必自己管理,这使得它再次变得不可信任。只要还有人没有运行自己的以太坊节点,它就会存在。访问 www.infura.io 了解更多信息。当然,强烈建议你运行自己的节点,但如果你不能的话,可以看看 Infura。你可以远程发送交易到这个服务器,它们将把它们传播到网络中。

另一个你可以查看的资源是以太坊的 GitHub 页面,我们之前已经提到过。在这里,你可以找到所有的项目,比如以太坊改进协议、remix 和黄皮书,其中包含了以太坊的所有技术规范。你可以了解关于 Solidity 编程语言和已构建的不同客户端的一切。你可以调整这些客户端,然后在你自己的项目中使用它们来连接以太坊网络。所以只要去看一看吧!

另一个信息来源是以太坊 Subreddit,你可以在 www.reddit.com/r/ethereum/ 找到它。你可以在这里找到很多信息和很多新闻;如果你想要保持更新,这是一个值得你关注的地方。

另一个资源是 CoinDesk,你可以在 www.coindesk.com 找到它。你可能已经知道这个,但这里有很多关于以太坊和区块链的新闻。

Consensys 是一家公司,你可以在 new.consensys.net/ 找到它。他们几乎从以太坊创立之初就一直在利用以太坊,他们有很多正在进行中的项目。他们与许多非常大的公司合作,例如微软。他们几乎致力于使以太坊适用于企业。

最后但并非最不重要的是,请务必查看 State Of The DApps,你可以在 www.stateofthedapps.com 找到它。在这里,你可以找到很多已经制作的应用程序。你可以对它们进行分类,并查看它们是否有任何原型,或者可能有一些正在运行的应用程序。几乎所有这些应用程序都是开源的。这绝对是你最大的资源,因为有什么比从现有的应用程序中学习更好的方式呢?所以,如果你查看这些,我相信你很快就会完全掌握以太坊。

摘要

在本章中,我们了解了以太坊是如何在浏览器之外运行的。我们学习了以太坊如何用于各种物联网应用。然后,我们继续看到以太坊如何在安卓和 iOS 智能手机设备上使用各种方法实现。接着,您将获得一些链接到各种资源,这些资源可以帮助您掌握以太坊。在本书中,我们几乎涵盖了您构建、使用和部署自己的以太坊代币所需的一切,并为您提供了有关利用这些以太坊知识构建哪些应用的额外见解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/88445654.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

初三奥赛模拟测试5

初三奥赛模拟测试5点击查看快读快写代码 #include <cstdio>using namespace std; // orz laofudasuan // modifiednamespace io {const int SIZE = (1 << 21) + 1;char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55]; int f, qr;…

网络接收全流程

网卡简介 网卡是一块通信硬件。属于数据链路层。用户可以通过电缆或无线相互连接。每一个网卡都有一个独一无二的MAC地址(48位),它被写在卡上的一块ROM中。IEEE负责为网卡销售商分配唯一的MAC地址。 可以在终端运行sudo lshw -C network来查看网卡型号 可以在/lib/modules/$(u…

重链剖分题目选讲

染色 给定一棵 \(n\) 个节点的无根树,共有 \(m\) 个操作,操作分为两种:将节点 \(a\) 到节点 \(b\) 的路径上的所有点(包括 \(a\) 和 \(b\))都染成颜色 \(c\)。 询问节点 \(a\) 到节点 \(b\) 的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如 1…

for reading (没有那个文件或目录)en file `

001、奇怪的报错: for reading (没有那个文件或目录)en file `[sy20223040796@admin1 test]$ ls ## 测试文件及命令 test.bed test.sh [sy20223040796@admin1 test]$ cat test.bed ## 测试文件 1 5400001 5400002 1 5425001 5425002 1 …

2024年4月总结及随笔之多事之月

2024年4月总结及随笔之多事之月1. 回头看 日更坚持了486天。读《所罗门的密码》更新完成 读《天才与算法:人脑与AI的数学思维》开更并持续更新中2023年至2024年3月底累计码字1081378字,累计日均码字2225字。 2024年4月码字87695字,同比增长52.5%,环比下降7.5%,日均码字数2…

华夏芯产品技术概述

华夏芯产品技术概述GPTX1 CPU 概述: GPTX1 CPU是华夏芯完全自主知识产权、自主架构的面向嵌入式的高能效CPU核。此CPU核依托Unity指令集,针对先进半导体工艺对微架构和流水线进行了深度优化,能够在相同工艺下达到更高的主频和更高的能效,应用于网络、通讯、数字电视、存储等…