- 以太坊教程
- 以太坊 - 主页
- 以太坊 - 简介
- 以太坊 - 智能合约
- 以太坊 - 合约编写的可靠性
- 以太坊 - 开发 MyContract
- 以太坊 - 编译合约
- 以太坊 - 部署合约
- 以太坊 - 与合约交互
- 以太坊 - Remix 的局限性
- 以太坊 - Ganache 区块链
- 以太坊 - Ganache 服务器设置
- 以太坊 - 快速演练
- 以太坊 - MyEtherWallet
- 以太坊 - 创建钱包
- 将钱包附加到 Ganache 区块链
- 以太坊 - 部署合约
- 与已部署的合约交互
- 以太坊 - 创建合约用户
- 以太坊 - 总结
- 以太坊有用资源
- 以太坊 - 快速指南
- 以太坊 - 有用的资源
- 以太坊 - 讨论
以太坊 - 快速指南
以太坊 - 简介
比特币的巨大成功引起了一些人创建自己的货币的兴趣。考虑到比特币(一种数字货币)所提供的优势,人们希望在自己的应用程序中使用区块链的概念。人们希望从物理合约转向智能数字合约,这样诸如否认、透明度、安全性等几个问题都会得到自动解决。这项努力的成果导致了以太坊的创建——一个用于创建支持智能合约的分布式区块链应用程序的流行平台。
在本教程中,您将学习如何在以太坊平台上创建分布式应用程序(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、vote和WinningProposal。检查这些内容以了解您自己对 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方法的执行将修改合约的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 中的“自动编译”复选框,如下面的屏幕截图所示 -
或者,您可以通过单击标题为“开始编译”的按钮来编译合约。
如果有任何拼写错误,请在代码窗口中修复它。确保代码已完全编译且没有错误。现在,您已准备好部署合同。
以太坊 - 部署合约
在本章中,我们将学习如何在以太坊上部署合约。单击“运行”菜单选项来部署合约。将出现以下屏幕。
合约名称显示在突出显示的列表框中。在此下方,您会注意到“部署”按钮,单击它即可部署合约。该合约将部署在 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/ganacheGanache 可在多个平台上使用。我们在 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 屏幕,您之前输入的合同应该出现在代码窗口中。如果没有,请在代码窗口中重新输入合同。单击“字节码”按钮,如以下屏幕截图所示 -
编译源的字节码与一些其他信息一起复制到剪贴板。将复制的代码粘贴到您喜欢的文本编辑器中。以下是文本编辑器的屏幕截图 -
对象标记的值包含所需的字节码。仔细复制此内容,确保不要复制随附的引号。字节码非常长,因此请确保复制到包含它的最后一个字节。现在,将此字节码粘贴到部署合约屏幕中,如下所示 -
Gas Limit字段会自动设置。
在 Gas Limit 字段下方,您将找到用于访问钱包的选项。
现在,使用将部署此合约的 Ganache 帐户的私钥访问钱包。要获取此私钥,请返回Ganache窗口。单击第一个帐户的钥匙图标,如下所示 -
您将看到用户帐户#1的私钥,如下面的屏幕截图所示 -
复制此私钥并将其粘贴到“粘贴您的私钥”部分,如下所示 -
您将在屏幕底部看到“解锁”按钮。解锁后,屏幕下方会出现“成功”消息。此时,您的钱包已附加到 Ganache 区块链的账户#1。
现在,您已准备好签署并部署合同。单击“签署交易”按钮,如下面的屏幕截图所示 -
签署交易会生成并显示原始交易和签名交易。点击“部署合约”按钮将合约部署到 Ganache 区块链上。请记住,该合约是由 Ganache 区块链的账户#1 用户部署的。因此,账户#1 用户成为合约创建者。在部署合约之前,系统会要求您确认交易,因为如果您要在公共真实以太坊区块链上部署此合约,可能会花费您一些真实的钱。不用担心,对于当前在本地机器上运行的私有区块链来说,不涉及真正的金钱。单击进行交易按钮,如下面的屏幕截图所示 -
检查 Ganache 控制台;您将看到帐户 #1 中的 ETH 余额减少,如下面的屏幕截图所示 -
现在,单击“交易”菜单,如下面的屏幕截图所示 -
您将看到交易详细信息。
在此屏幕上,您将找到合约的发布地址。地址已在上面的截图中标记出来。您将公开分发此地址,让其他人知道您的合约在这个指定的地址上可用,他们可以连接到该地址并执行合约方法,例如向您(合约创建者)汇款。复制此合约地址以供您自己参考,因为您在下一步中将需要它。
以太坊 - 与已部署的合约交互
现在,您已准备好与已部署的合约进行交互。返回 MyEtherWallet 桌面并单击“与合约交互”选项卡,如下面的屏幕截图所示 -
将之前复制的合约地址粘贴到“合约地址”字段中。您还需要将合约的“ABI / JSON Interface”粘贴到上面的屏幕上。
要获取ABI,请转到Remix窗口并单击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 的钥匙图标,如以下屏幕截图所示 -
您将获得帐户 # 2 的私钥。
复制您收到的密钥并在新创建的钱包中使用它,如下所示 -
单击解锁按钮以附加钱包。
当钱包成功解锁后,写入所需的发送交易。
单击“生成交易”按钮生成交易。
进行交易并等待一段时间以反映在区块链中。现在,执行“getAmount”,现在显示的金额应该是200。
执行“getBalance”。值字段现在应为 800。
检查事务日志以查看不同用户执行的各种事务。
以太坊 - 总结
您学习了如何在 Solidity 中编写自己的数字合约。您在 Remix IDE 中开发并测试了合约接口。为了进一步进行多用户测试,您在 Ganache 区块链上部署了此合约。在 Ganache 上,您创建了两个用户帐户。第一个帐户用于发布合约。第二个账户用于消费合约。
下一步是什么?
您在整个过程中使用的 Ganache 区块链对于您的机器来说是私有的且本地的。一旦您对合约的功能完全满意,您就可以继续将其发布到现实生活中的以太坊区块链上。然而,这样做需要你花真钱。在演示应用程序中,我们使用 1000 ETH 作为 Ganache 中每个用户帐户的默认值。当您在现实生活中的区块链上部署合约时,您必须通过将本国货币转换为 ETH 来购买 ETH。该货币将存储在您的钱包中,您将能够按照您想要的方式使用它。