以太坊 - 快速指南


以太坊 - 简介

比特币的巨大成功引起了一些人创建自己的货币的兴趣。考虑到比特币(一种数字货币)所提供的优势,人们希望在自己的应用程序中使用区块链的概念。人们希望从物理合约转向智能数字合约,这样诸如否认、透明度、安全性等几个问题都会得到自动解决。这项努力的成果导致了以太坊的创建——一个用于创建支持智能合约的分布式区块链应用程序的流行平台。

在本教程中,您将学习如何在以太坊平台上创建分布式应用程序(DAPP)。更具体地说,您将学习如何编写合约,在本地区块链上测试它,最后将其部署在外部区块链上以进行深度测试和商业用途。您将使用Solidity,一种用于合约开发的面向对象语言。您还将使用Remix,这是一个用于开发和测试合约的开源 IDE。要在外部区块链上部署经过测试的合约,您将使用Ganache。要与合约交互,您将需要一个客户端应用程序。我们将使用MyEtherWallet为每个此类客户端创建一个钱包。合约创建者将发布合约。任何其他客户端都会使用合约提供的接口查看合约值,并向创建者发送一些钱以执行合约的一部分。

那么让我们从写合同开始吧。

以太坊 - 智能合约

有多种工具可用于开发和测试合约。以太坊官方网站本身提供了最简单的工具之一。该工具称为Remix,我们将使用它来进行合约开发。

合同开发的混音

在浏览器中输入以下 URL,打开 Remix IDE。

https://remix.ethereum.org

将出现以下屏幕。

合约开发

在中心窗口中,您将看到一些默认代码,这是一个示例 Solidity 代码。您将在此代码编辑器中输入合同代码。您的代码可能会自动编译。成功编译代码后,您将能够在同一个 IDE 中运行该代码。当您执行合约方法时,结果将显示在同一个 IDE 窗口中。有一些工具可以调试代码和对项目进行单元测试。这些可以在右上角的菜单栏中看到,如下面的 IDE 屏幕截图所示。您很快就会使用这些选项。

混音选项

您现在将开始撰写合同。

以太坊 - 合约编写的可靠性

Solidity 是一种专门为合约编写而开发的面向对象语言。它是一种高级语言,继承了 C++、Python 和 JavaScript 的特征。Solidity 编译器将源代码编译为在以太坊虚拟机 (EVM) 上运行的字节码。

要快速了解 Solidity 语法,请查看 IDE 中的示例代码。

pragma solidity >=0.4.22 <0.6.0;
contract Ballot {

第一行是给编译器的指令。第二行开始合约的定义。在合同中,您声明变量,例如 -

address chairperson;

您还可以定义提案等结构,并创建这些结构项的数组。在代码窗口中检查这一点。

然后,您可以定义一个在实例化合约时调用的构造函数。

constructor(uint8 _numProposals) public {

在构造函数之后,您将定义几个方法,这些方法是契约方法。在示例合约中,giveRightToVote是一种具有以下语法的方法 -

function giveRightToVote(address toVoter) public {

public关键字使得任何有权访问合约的客户端都可以公开调用此方法

同样,示例合约定义了另外三个方法,称为delegate、voteWinningProposal。检查这些内容以了解您自己对 Solidity 语法的理解。这些是编写自己的合同的先决条件。解释 Solidity 的完整语法超出了本教程的范围。

以太坊 - 开发 MyContract

我们将我们的合同命名为MyContract,如以下声明所示 -

contract MyContract {

我们将声明两个变量如下 -

uint amount;
uint value;

可变金额将保存合约执行者发送给合约创建者的累积资金。价值字段将保存合同价值当执行者执行合约时,价值字段将被修改以反映平衡的合约价值。

在合约构造函数中,我们设置这两个变量的值。

constructor (uint initialAmount, uint initialValue) public {
   amount = 0;
   value = 1000;
}

最初,合约上收集的金额为零,我们将amount字段设置为 0。我们将合约设置为任意数字,在本例中为 1000。合约创建者决定该值。

为了检查在任何给定时间点收集的金额,我们提供了一个名为getAmount 的公共合约方法,定义如下 -

function getAmount() public view returns(uint) {
   return amount;
}

为了获得任何给定时间点的平衡合约价值,我们定义getBalance方法如下 -

function getBalance() public view returns(uint) {
   return value;
}

最后,我们编写一个合约方法(Send)。它使客户能够向合约创建者发送一些钱 -

function send(uint newDeposit) public {
   value = value - newDeposit;
   amount = amount + newDeposit;
}

send方法的执行将修改合约的valueamount字段。

完整的合约代码如下 -

contract MyContract {
   uint amount;
   uint value;

   constructor (uint initialAmount, uint initialValue) public {
      amount = 0;
      value = 1000;
   }
   function getBalance() public view returns(uint) {
      return value;
   }
   function getAmount() public view returns(uint) {
      return amount;
   }
   function send(uint newDeposit) public {
      value = value - newDeposit;
      amount = amount + newDeposit;
   }
}

以太坊 - 编译合约

一旦编写了完整的合约代码,在这个 IDE 中编译它就很简单了。只需单击IDE 中的“自动编译”复选框,如下面的屏幕截图所示 -

自动编译复选框

或者,您可以通过单击标题为“开始编译”的按钮来编译合约。

开始编译

如果有任何拼写错误,请在代码窗口中修复它。确保代码已完全编译且没有错误。现在,您已准备好部署合同。

以太坊 - 部署合约

在本章中,我们将学习如何在以太坊上部署合约。单击“运行”菜单选项来部署合约。将出现以下屏幕。

部署合约

合约名称显示在突出显示的列表框中。在此下方,您会注意到“部署”按钮,单击它即可部署合约。该合约将部署在 Remix 内置区块链上。您将能够在屏幕底部看到已部署的合约。您可以在下面屏幕截图的突出显示部分中看到这一点。

部署突出显示的部分

请注意,此突出显示区域中存在三个方法名称。接下来,您将通过执行合约方法与合约进行交互。

以太坊 - 与合约交互

当你点击已部署的合约时,你会看到合约提供的各种公共方法。这如下面的屏幕截图所示。

部署公共方法

第一个方法send在其前面包含一个编辑框。在这里,您将键入合约方法所需的参数。其他两个方法不带任何参数。

汇款

现在,在合约窗口中看到的发送函数前面输入一些金额,例如 100 。单击发送按钮。这将执行合约发送方法,减少合约价值字段的值并增加金额字段的值。

汇款

检查合同价值

之前的发送资金操作已使合约价值减少了 100。您现在可以通过调用合约的getBalance方法来检查这一点。当您单击getBalance按钮时,您将看到输出,如下面的屏幕截图所示 -

检查合同价值

合同价值现在减少到900。

检查收取的金额

在本节中,我们将检查迄今为止在此合同中收取的金额。为此,请单击“获取金额”按钮。将出现以下屏幕。

检查收取的金额

金额字段值已从 0 更改为 100

尝试一些发送操作并检查合约金额字段,以得出部署的合约正在按预期执行的结论。

以太坊 - Remix 的局限性

到目前为止,您使用的 Remix IDE 足以用于合约的开发和初始测试。对于现实生活中的合约,您需要根据各种参数测试您的功能。Remix 无法创建真实(非测试)用户帐户来在它们之间转移资金。您无法控制 Remix 创建的区块链的配置。您甚至无法监控交易的执行。

Remix 错过了一些高级操作。因此,我们需要将合​​约部署在提供所有这些功能的更复杂的区块链上。Ganache就是这样一个区块链,您将在后续章节中了解它。

以太坊 - Ganache 区块链

Ganache 用于设置个人以太坊区块链来测试您的 Solidity 合约。与 Remix 相比,它提供了更多功能。当您使用 Ganache 锻炼时,您将了解这些功能。在开始使用 Ganache 之前,您必须首先在本地计算机上下载并安装区块链。

下载甘纳许

您可以从以下 URL 下载 Ganache -

https://truffleframework.com/ganache

Ganache 可在多个平台上使用。我们在 Mac 上开发并测试了整个教程。因此,下面的屏幕截图将显示 Mac 安装情况。当您打开上面给出的安装 URL 时,它会自动检测您计算机的操作系统并引导您进行适当的二进制安装。下面的屏幕截图显示了 Mac 安装情况。

下载甘纳许

当您单击“下载”按钮时,它将开始下载用于 Mac 安装的 DMG 文件。

安装甘纳许

在下载文件夹中找到“Ganache-2.0.0.dmg”,然后双击它以安装 Ganache。安装成功后,将出现以下屏幕 -

安装甘纳许

将 Ganache 图标拖至应用程序文件夹。现在,Ganache 可作为 Mac 上的应用程序使用。

如果您使用其他操作系统,请按照提供的说明进行成功安装。

开始甘纳许

现在,在您的应用程序文件夹中找到Ganache,然后双击其图标来启动 Ganache。

伽纳彻桌面

当 Ganache 启动时,Ganache 屏幕将出现如下所示 -

伽纳彻桌面

单击“快速启动”启动 Ganache。您将看到 Ganache 控制台,如下所示 -

快速开始

上面屏幕截图中的控制台显示了两个用户帐户,余额为 100 ETH(以太币 - 以太坊平台上的交易货币)。它还显示每个帐户的交易计数为零。由于用户到目前为止尚未执行任何交易,因此该计数显然为零。

现在,我们将概述与我们直接相关的 Ganache 的一些重要屏幕。

以太坊 - Ganache 服务器设置

单击屏幕右上角的设置图标,如下面的屏幕截图所示 -

甘纳许设置

服务器设置屏幕将出现如下所示 -

服务器设置

在这里,您将能够设置 Ganache 服务器的服务器地址和端口号的值。目前,将它们保留为默认值。Network ID是Ganache服务器的内部区块链标识符;将此保留为默认值。自动挖矿按钮处于开启状态,表示交易将立即处理。如果您关闭此功能,它会要求您输入开采区块的时间(以秒为单位)。

帐户和密钥

当您单击“帐户和密钥”菜单选项时,您将看到以下屏幕 -

帐户和密钥

您可以在此处设置每个帐户的默认余额。默认值为 100。这现在解释了为什么您在桌面屏幕截图中看到每个帐户显示 100 ETH。您还可以在此屏幕上设置帐户数量。此屏幕截图中显示的值为 2,这就是桌面仅显示两个帐户的原因。

现在,我们将研究两个设置屏幕;了解这两者如何工作就足够了。单击屏幕右侧的“重新启动”按钮重新启动服务器。您现在将返回到桌面屏幕。尝试在上面两个字段中输入不同的值,重启服务器看看效果。

以太坊 - 快速演练

现在我们将简要了解 Ganache 桌面上的可用内容。在桌面上,顶部有几个菜单选项,其中一些与我们直接相关。菜单栏在下面的屏幕截图中突出显示 -

甘纳许菜单选项

单击“交易”菜单会显示迄今为止执行的所有交易。您很快就会进行交易。现在,回到上面的屏幕,不时检查一下交易情况。典型的交易屏幕如下所示 -

甘纳许交易

同样,当您单击“块”菜单时,您将看到各种开采的块。请考虑以下屏幕截图以了解 BLOCKS 菜单的外观 -

甘纳许块

单击“日志”菜单。它将为您打开系统日志。在这里,您可以检查您在以太坊区块链上执行的各种操作。

现在,您已经了解了如何使用 Ganache 来设置私有以太坊区块链,现在您将创建一些将使用该区块链的客户端。

以太坊 - MyEtherWallet

对于客户端应用程序,您将使用MyEtherWallet

从以下 URL下载MyEtherWallet软件 -

https://github.com/kvhnuke/etherwallet/releases/tag/v3.21.06

如果需要,解压缩下载的文件并打开index.html。您将看到以下用于创建新钱包的界面。

我的以太钱包

以太坊 - 创建钱包

在本章中,我们将学习如何创建以太坊钱包。要创建新钱包,请输入您选择的密码,然后单击“创建新钱包”按钮。当您这样做时,将创建一个钱包。数字钱包本质上是生成公钥​​/私钥对,您需要将其存储在安全的地方。钱包创建结果如下:

创建新钱包

单击“下载密钥库文件(UTC / JSON)”按钮保存生成的密钥。现在,点击“我明白了。” 继续”按钮。您的私钥将出现在屏幕上,如下面的屏幕截图所示 -

下载密钥库

单击“打印纸钱包”按钮,保留钱包私钥的物理记录。稍后您将需要它来解锁钱包。您将看到以下屏幕。不要丢失该输出。

打印纸钱包

要解锁您的钱包,请单击“保存您的地址”按钮。您将看到以下屏幕。

解锁你的钱包

可以使用上面屏幕中突出显示的私钥选项解锁钱包。剪切并粘贴上一个屏幕截图中的私钥,然后单击“解锁”按钮。您的钱包将被解锁,您将看到屏幕底部出现一条消息。由于钱包目前不包含任何内容,因此解锁钱包目前对我们来说并没有多大用处。

将钱包附加到 Ganache 区块链

您现在已经创建了一个钱包;该钱包是区块链的客户端接口。我们会将钱包附加到您在前面的课程中启动的 Ganache 区块链。为此,请单击“网络”下拉框,如下面的屏幕截图所示 -

网络下拉菜单

转到列表底部。您将看到“添加自定义网络/节点”的选项。选择此项。

现在,将出现一个屏幕,询问 Ganache 服务器地址及其正在侦听的端口。

添加自定义网络

输入您的 Ganache 服务器详细信息 - http://127.0.0.1和端口:8545。这些将是您在 Ganache 服务器设置中设置的值。为此节点指定您选择的名称。单击“保存并使用自定义节点”按钮。您将在屏幕底部看到已连接的消息。至此,您的钱包已成功连接到 Ganache 区块链。

您现在已准备好在此连接的区块链上部署合约。

以太坊 - 部署合约

要部署合约,请选择“合约”菜单选项,如下面的屏幕截图所示 -

选择合约菜单

您需要在此屏幕上输入合约的字节码。请记住,当您编译 Solidity 合约代码时,它会生成在 EVM 上运行的字节码。您现在需要从Remix IDE获取此字节码。

转到 Remix IDE 屏幕,您之前输入的合同应该出现在代码窗口中。如果没有,请在代码窗口中重新输入合同。单击“字节码”按钮,如以下屏幕截图所示 -

Remix IDE 屏幕

编译源的字节码与一些其他信息一起复制到剪贴板。将复制的代码粘贴到您喜欢的文本编辑器中。以下是文本编辑器的屏幕截图 -

重新混合字节码

对象标记的值包含所需的字节码。仔细复制此内容,确保不要复制随附的引号。字节码非常长,因此请确保复制到包含它的最后一个字节。现在,将此字节码粘贴到部署合约屏幕中,如下所示 -

所需的字节码

Gas Limit字段会自动设置。

在 Gas Limit 字段下方,您将找到用于访问钱包的选项。

访问钱包

现在,使用将部署此合约的 Ganache 帐户的私钥访问钱包。要获取此私钥,请返回Ganache窗口。单击第一个帐户的钥匙图标,如下所示 -

第一个账户

您将看到用户帐户#1的私钥,如下面的屏幕截图所示 -

第一个账户私钥

复制此私钥并将其粘贴到“粘贴您的私钥”部分,如下所示 -

粘贴您的私钥

您将在屏幕底部看到“解锁”按钮。解锁后,屏幕下方会出现“成功”消息。此时,您的钱包已附加到 Ganache 区块链的账户#1。

现在,您已准备好签署并部署合同。单击“签署交易”按钮,如下面的屏幕截图所示 -

签署交易

签署交易会生成并显示原始交易和签名交易。点击“部署合约”按钮将合约部署到 Ganache 区块链上。请记住,该合约是由 Ganache 区块链的账户#1 用户部署的。因此,账户#1 用户成为合约创建者。在部署合约之前,系统会要求您确认交易,因为如果您要在公共真实以太坊区块链上部署此合约,可能会花费您一些真实的钱。不用担心,对于当前在本地机器上运行的私有区块链来说,不涉及真正的金钱。单击进行交易按钮,如下面的屏幕截图所示 -

私有链运行

检查 Ganache 控制台;您将看到帐户 #1 中的 ETH 余额减少,如下面的屏幕截图所示 -

甘纳许控制台

现在,单击“交易”菜单,如下面的屏幕截图所示 -

Ganache 交易截图

您将看到交易详细信息。

甘纳许交易详情

在此屏幕上,您将找到合约的发布地址。地址已在上面的截图中标记出来。您将公开分发此地址,让其他人知道您的合约在这个指定的地址上可用,他们可以连接到该地址并执行合约方法,例如向您(合约创建者)汇款。复制此合约地址以供您自己参考,因为您在下一步中将需要它。

以太坊 - 与已部署的合约交互

现在,您已准备好与已部署的合约进行交互。返回 MyEtherWallet 桌面并单击“与合约交互”选项卡,如下面的屏幕截图所示 -

与合约交互

将之前复制的合约地址粘贴到“合约地址”字段中。您还需要将合约的“ABI / JSON Interface”粘贴到上面的屏幕上。

要获取ABI,请转到Remix窗口并单击ABI按钮,如下面的屏幕截图所示。

ABI按钮

ABI / JSON 接口将被复制到剪贴板。将其粘贴到您最喜欢的编辑器中以检查生成的界面,如下所示 -

ABI / JSON Interface
[
   {
      "constant": false,
      "inputs": [
         {
            "name": "newDeposit",
            "type": "uint256"
         }
      ],
      "name": "send",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
   },
   {
      "inputs": [
         {
            "name": "initialAmount",
            "type": "uint256"
         },
         {
            "name": "initialValue",
            "type": "uint256"
         }
      ],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "constructor"
   },
   {
      "constant": true,
      "inputs": [],
      "name": "getAmount",
      "outputs": [
         {
            "name": "",
            "type": "uint256"
         }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
   },
   {
      "constant": true,
      "inputs": [],
      "name": "getBalance",
      "outputs": [
         {
            "name": "",
            "type": "uint256"
         }
      ],
      "payable": false,
      "stateMutability": "view",
      "type": "function"
   }
]

将此 JSON 粘贴到MyEtherWallet界面后,您会注意到 JSON 界面下方的 ACCESS 按钮现已激活,如下所示 -

我的以太币钱包

单击“访问”按钮以访问合同。

单击“访问”按钮后,合约地址和功能选择下拉列表将出现在屏幕上,就像在 Remix 编辑器中一样。这如下面的屏幕截图所示 -

访问按钮

您可以像 Remix 部署一样检查合约的各种功能。请注意,该联系人现在已部署在外部 Ganache 区块链上。检查getAmount函数;您将得到 Amount 值 0,并且 getBalance显示余额 1000。

现在尝试寄一些钱。它将向您显示一个用于输入金额的文本编辑控件。当您编写合约时,会使用一些“gas”,并且会要求您在将交易写入区块链之前确认交易。交易将在短时间内执行,具体取决于您在 Ganache 服务器上设置的挖掘时间。之后,您可以重新检查合约的金额字段,以验证这些字段是否确实被修改。

您现在可以检查 Ganache 桌面以查看迄今为止已执行的事务。示例输出如下所示 -

样本输出

到目前为止,您既是合约创建者又是合约执行者。这没有多大意义,因为您希望其他人使用您的合同。为此,我们将为 Ganache 区块链创建另一个客户端,并从新创建的 2 号账户向 1 号账户的合约创建者发送一些资金。

以太坊 - 创建合约用户

本章我们将学习以太坊上合约用户的创建。要为我们发布的合约创建用户,我们将创建另一个MyEtherWallet客户端,附加到您在前面的步骤中使用的同一个 Ganache 区块链。转到MyEtherWallet屏幕并创建一个新钱包。

单击合同菜单并选择“与合同交互”选项,如之前的情况所示。请注意,这个新用户将仅与已发布的合约进行交互,而不是部署他自己的合约。指定您在之前的情况下使用的合约地址和 ABI。

与合约地址交互

现在,单击“访问”按钮并调用发送方法。当询问时,输入一些值,例如要发送的 100 ETH。提交交易。提交后,将出现以下屏幕。

与合约访问交互

要将这个新客户端附加到我们的 Ganache 区块链,请转到 Ganache 控制台。单击帐户#2 的钥匙图标,如以下屏幕截图所示 -

Ganache 控制台截图

您将获得帐户 # 2 的私钥。

Ganache 控制台私钥

复制您收到的密钥并在新创建的钱包中使用它,如下所示 -

新创建的钱包

单击解锁按钮以附加钱包。

当钱包成功解锁后,写入所需的发送交易。

钱包成功解锁

单击“生成交易”按钮生成交易。

生成交易

进行交易并等待一段时间以反映在区块链中。现在,执行“getAmount”,现在显示的金额应该是200。

生成获取金额

执行“getBalance”字段现在应为 800。

生成获取余额

检查事务日志以查看不同用户执行的各种事务。

检查交易

以太坊 - 总结

您学习了如何在 Solidity 中编写自己的数字合约。您在 Remix IDE 中开发并测试了合约接口。为了进一步进行多用户测试,您在 Ganache 区块链上部署了此合约。在 Ganache 上,您创建了两个用户帐户。第一个帐户用于发布合约。第二个账户用于消费合约。

下一步是什么?

您在整个过程中使用的 Ganache 区块链对于您的机器来说是私有的且本地的。一旦您对合约的功能完全满意,您就可以继续将其发布到现实生活中的以太坊区块链上。然而,这样做需要你花真钱。在演示应用程序中,我们使用 1000 ETH 作为 Ganache 中每个用户帐户的默认值。当您在现实生活中的区块链上部署合约时,您必须通过将本国货币转换为 ETH 来购买 ETH。该货币将存储在您的钱包中,您将能够按照您想要的方式使用它。