以太坊 - 快速指南



以太坊 - 简介

比特币的巨大成功激发了很多人创建自己货币的想法。看到比特币——一种数字货币——提供的优势,人们希望在自己的应用程序中使用区块链的概念。人们希望摆脱物理合同,转向智能数字合同,其中诸如否认、透明度、安全等问题将自动得到解决。这项努力的结果导致了以太坊的创建——一个流行的平台,用于创建支持智能合约的分布式区块链应用程序。

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

那么让我们从编写合约开始。

以太坊 - 智能合约

有几种工具可用于开发和测试合约。其中一个最简单的工具是在以太坊官方网站上提供的。该工具称为**Remix**,我们将使用它来进行合约开发。

用于合约开发的Remix

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

https://remix.ethereum.org

将出现以下屏幕。

Contract Development

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

Remix options

您现在将开始编写您的合约。

以太坊 - 用于合约编写的Solidity

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

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

pragma solidity >=0.4.22 <0.6.0;
contract Ballot {

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

address chairperson;

您还可以定义结构,例如**Proposal**,并创建这些结构项的数组。在代码窗口中检查一下。

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

constructor(uint8 _numProposals) public {

在构造函数之后,您将定义几个方法,这些方法是合约方法。在示例合约中,**giveRightToVote**就是一个这样的方法,其语法如下:

function giveRightToVote(address toVoter) public {

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

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

以太坊 - 开发MyContract

我们将把我们的合约命名为**MyContract**,如以下声明所示:

contract MyContract {

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

uint amount;
uint value;

变量**amount**将保存合约执行者发送给合约创建者的累计金额。**value**字段将保存合约值。随着执行者执行合约,**value**字段将被修改以反映平衡的合约值。

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

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

最初,合约上收取的金额为零,我们将**amount**字段设置为0。我们将合约**value**设置为某个任意数字,在本例中为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**方法的执行将修改合约的**value**和**amount**字段。

完整的合约代码如下:

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中的**Autocompile**复选框,如下面的屏幕截图所示:

Autocompile checkbox

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

Start to compile

如果存在任何错别字,请在代码窗口中修复它。确保代码完全无错误地编译。现在,您可以准备部署合约了。

以太坊 - 部署合约

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

Deploy Contract

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

Deploy Highlighted Portion

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

以太坊 - 与合约交互

当您单击已部署的合约时,您将看到合约提供的各种公共方法。这在下面的屏幕截图中显示。

Deploy Public Methods

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

发送资金

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

Sending Money

检查合约值

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

Examining Contract Value

合约**value**现在减少到900。

检查已收集的金额

在本节中,我们将检查到目前为止在此合约上收集的金额。为此,请单击**getAmount**按钮。将出现以下屏幕。

Examining Collected Amount

**amount**字段的值已从0更改为100。

尝试一些**send**操作并检查合约**value**和**amount**字段,以得出已部署的合约按预期执行的结论。

以太坊 - Remix的局限性

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

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

以太坊 - 用于区块链的Ganache

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

下载Ganache

您可以从以下URL下载Ganache:

https://truffleframework.com/ganache

Ganache可在多个平台上使用。我们在Mac上开发和测试了本教程的全部内容。因此,下面的屏幕截图将显示Mac安装。当您打开上面给出的安装URL时,它会自动检测您的机器的操作系统并引导您到相应的二进制安装程序。下面的屏幕截图显示了Mac安装。

Downloading Ganache

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

安装Ganache

找到下载文件夹中的“Ganache-2.0.0.dmg”文件,双击安装Ganache。安装成功后,将出现以下界面:

Installing Ganache

将Ganache图标拖动到应用程序文件夹。现在,Ganache已作为应用程序安装在您的Mac上。

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

启动Ganache

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

Ganache桌面

Ganache启动后,将出现如下所示的Ganache界面:

Ganache Desktop

点击“QUICKSTART”启动Ganache。您将看到如下所示的Ganache控制台:

QUICKSTART

以上截图中的控制台显示了两个用户帐户,每个帐户的余额为100 ETH(以太币——以太坊平台交易的货币)。每个帐户的交易计数也为零。由于用户尚未执行任何交易,因此此计数显然为零。

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

以太坊 - Ganache服务器设置

点击屏幕右上角的设置图标,如下图所示:

Ganache Settings

将出现服务器设置界面,如下图所示:

Server Settings

在这里,您可以设置Ganache服务器的服务器地址和端口号的值。目前,请保留其默认值。“网络ID”是Ganache服务器的内部区块链标识符;请保留其默认值。“自动挖矿”按钮处于开启状态,表示交易将立即处理。如果您将其关闭,则系统会要求您输入区块挖矿所需的时间(秒)。

帐户和密钥

当您点击“帐户和密钥”菜单选项时,您将看到以下界面:

Account and Keys

在这里,您可以**设置**每个帐户的默认余额。默认值为100。这解释了为什么在桌面截图中每个帐户显示100 ETH。您还可以在此界面设置帐户数量。此截图中显示的值为2,这就是桌面只显示两个帐户的原因。

现在,我们将了解这两个设置界面;掌握这两个界面的使用方法就足够了。点击屏幕右侧的“重启”按钮重启服务器。您将返回到桌面界面。尝试输入上述两个字段中的不同值,重启服务器并查看其效果。

以太坊 - 快速入门

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

Ganache Menu Options

点击“交易”菜单将显示迄今为止执行的所有交易。您很快就会执行交易。现在,返回到上面的界面,并定期检查交易。典型的交易界面如下图所示:

Ganache TRANSACTIONS

同样,当您点击“区块”菜单时,您将看到各种已挖出的区块。请参考以下截图了解“区块”菜单的外观:

Ganache Blocks

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

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

以太坊 - MyEtherWallet

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

从以下网址下载**MyEtherWallet**软件:

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

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

MyEtherWallet

以太坊 - 创建钱包

在本节中,我们将学习如何创建以太坊钱包。要创建新钱包,请输入您选择的密码,然后点击“**创建新钱包**”按钮。这样做后,将创建一个钱包。数字钱包实际上是生成您需要安全存储的公钥/私钥对。钱包创建结果如下所示:

Create New Wallet

点击“**下载密钥库文件(UTC/JSON)**”按钮保存生成的密钥。现在,点击“**我理解。继续**”按钮。您的私钥将显示在屏幕上,如下面的截图所示:

Download KeyStore

点击“**打印纸质钱包**”按钮,保留钱包私钥的物理记录。稍后解锁钱包时将需要此记录。您将看到以下界面。请勿丢失此输出。

Print Paper Wallet

要解锁您的钱包,请点击“**保存您的地址**”按钮。您将看到以下界面。

Unlock Your Wallet

可以使用上面界面中突出显示的“私钥”选项解锁钱包。从之前的截图中复制并粘贴私钥,然后点击“解锁”按钮。您的钱包将被解锁,您将在屏幕底部看到一条消息。由于钱包目前没有任何内容,因此解锁钱包对我们来说并没有什么用处。

将钱包连接到Ganache区块链

您现在已经创建了一个钱包;此钱包是区块链的客户端接口。我们将把钱包连接到您在上一节中启动的Ganache区块链。为此,请点击下面的截图中显示的“网络”下拉框:

Network Dropdown

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

现在,将出现一个界面,要求您输入Ganache服务器地址和其监听的端口。

Add Custom Network

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

您现在可以将合约部署到此连接的区块链上了。

以太坊 - 部署合约

要部署合约,请选择下面的截图中显示的“合约”菜单选项:

Select Contracts Menu

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

转到Remix IDE界面,您之前键入的合约应该在代码窗口中。如果没有,请在代码窗口中重新键入合约。点击“字节码”按钮,如下图所示:

Remix IDE Screen

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

Remix bytecode

**object** 标记的值包含所需的字节码。仔细复制此值,确保您没有复制包含的引号。字节码很长,因此请确保您复制到最后一个字节(包括最后一个字节)。现在,将此字节码粘贴到下面的“部署合约”界面中:

Desired Bytecode

“Gas Limit”字段会自动设置。

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

Accessing Wallet

现在,使用将在此合约上部署的Ganache帐户的**私钥**访问钱包。要获取此私钥,请返回到**Ganache**窗口。点击第一个帐户的“密钥”图标,如下图所示:

First Account

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

First Account Private Key

复制此私钥并将其粘贴到下面的“粘贴您的私钥”部分:

Paste Your Private Key

您将在屏幕底部看到“解锁”按钮。解锁后,屏幕底部将显示一条“成功”消息。此时,您的钱包已连接到Ganache区块链的帐户#1。

现在,您可以签名并部署合约了。点击下面的截图中显示的“签名交易”按钮:

Sign Transaction

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

Private Blockchain Running

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

Ganache console

现在,点击下面的截图中显示的“交易”菜单:

Ganache Transactions Screenshot

您将看到交易详细信息。

Ganache Transactions Details

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

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

现在,您可以与已部署的合约进行交互了。返回到MyEtherWallet桌面,并点击下面的截图中显示的“与合约交互”选项卡:

Interact With Contract

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

要获取**ABI**,请转到**Remix**窗口并点击“ABI”按钮,如下图所示。

ABI button

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接口下方的“访问”按钮现在已激活,如下所示:

My Ether Wallet

点击“访问”按钮访问合约。

点击“访问”按钮后,合约地址和函数选择下拉列表将显示在屏幕上,就像在Remix编辑器中一样。这在下面的截图中显示:

Access button

您可以像在Remix部署中一样检查合约的各种函数。请注意,合约现在已部署到外部Ganache区块链上。检查“getAmount”函数;您将获得值为零的Amount值,“getBalance”将显示余额为1000。

现在尝试发送一些资金。它将为您提供一个**文本编辑**控件来输入金额。当您编写合约时,将使用一些“gas”,并且系统会在将其写入区块链之前要求您确认交易。交易将在短时间内执行,具体取决于您在Ganache服务器上设置的挖矿时间。之后,您可以重新检查合约的“value”和“amount”字段,以验证这些字段是否确实已修改。

你现在可以查看Ganache桌面客户端来查看你已经执行过的交易。下面显示一个示例输出:

sample output

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

以太坊 - 创建合约用户

在本章中,我们将学习如何在以太坊上创建合约用户。为了为我们已发布的合约创建用户,我们将创建另一个连接到同一Ganache区块链的MyEtherWallet客户端,你已经在之前的步骤中使用了该区块链。前往MyEtherWallet界面并创建一个新钱包。

点击合约菜单,并选择“与合约交互”选项,就像之前的案例一样。请注意,这个新用户只是与已经发布的合约交互,而不是部署他自己的合约。指定你在之前的案例中使用的合约地址和ABI。

Interact with Contract Address

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

Interact with Contract Access

要将这个新客户端连接到我们的Ganache区块链,请转到Ganache控制台。点击账户#2的密钥图标,如下面的屏幕截图所示:

Ganache Console Screenshot

你将获得账户#2的私钥。

Ganache Console private key

复制你收到的密钥,并将其用于你新创建的钱包,如下所示:

Newly Created Wallet

点击解锁按钮以连接钱包。

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

Wallet Successfully Unlocked

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

Generate Transaction

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

Generate get Amount

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

Generate get Balance

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

Examine The Transaction

以太坊 - 总结

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

下一步是什么?

你在整个过程中使用的Ganache区块链是私有的,并且只存在于你的机器上。一旦你完全满意合约的功能,你就可以继续将其发布到真实的以太坊区块链上。但是,这样做需要你花费真金白银。在演示应用程序中,我们为Ganache中的每个用户账户使用了1000 ETH作为默认值。当你在真实的区块链上部署你的合约时,你必须通过将你所在国家/地区的货币兑换成ETH来购买ETH。这种货币将存储在你的钱包中,你可以根据自己的意愿使用它。

广告