在以太坊区块链上创建自己的加密货币
在本章中,我们将了解如何创建我们自己的 ERC20 令牌项目。ERC20 令牌是一种建立在以太坊区块链之上的加密货币。我们将看看它的规格,以及你如何做一个最初的硬币提供。我们还将学习如何处理代币交易和转移价值。
我们将在本章中讨论的主题如下:
- 创建加密货币/ERC20 令牌项目
- ERC20 标准/规范
- 首次硬币发行
- 处理代币交易
创建 ERC20 令牌
在本节中,您将学习如何创建 ERC20 令牌。我们将从建立一个新项目开始——我们将使用 OpenZeppelin Solidity 框架来创建我们的项目。
安装 OpenZepplin Solidity
OpenZeppelin 基本上只是一个智能合约的集合,您可以将它导入到您自己的智能合约中,以便加速您的开发。它们还可以让您的智能合同从一开始就更加安全。
您可以访问 OpenZeppelin GitHub 页面,网址为 OpenZeppelin Github :
如果你一直在浏览松露网站——truffleframework.com——那么你可能会遇到加纳切。我们将在本节中使用它。 Ganache 是一个比 TestRPC 更容易导航的 GUI,但是做的事情和 TestRPC 一样。如果你去 Ganache 的 GitHub 页面 Ganache GitHub ,你可以为 Windows 或任何其他操作系统下载它。
ethereumjs-testrpc
已被弃用,并被重命名为ganache-cli
。详细信息可以访问以下链接:【https://www.npmjs.com/package/ethereumjs-testrpc。
下载后就可以运行了。打开应用程序后,您将看到一个类似于以下屏幕截图的用户界面:
加纳切
这应该很熟悉:这是由 TestRPC 生成的 10 个帐户。您可以看到您的块、交易和日志。
设置新项目
要设置新项目,请执行以下步骤:
- 为项目创建一个新文件夹。
- 在控制台上,运行 truffle 命令
truffle –cli unbox webpack
。
- 运行
npm install –E
命令。因为 OpenZeppelin 建议指定–E
,会拉特定版本的 OpenZeppelin,所以永远不会更新,会保持同一个版本。这是因为它还没有语义版本控制。 - 运行
npm install –E zeppelin-solidity
。OpenZeppelin 要安全得多,因为它从一开始就考虑到了安全性。 -
让我们现在切换到编辑器。在这里,我们将找到我们的启动项目。
-
让我们从移除我们不需要的东西开始。在 migrations 下,点击
deploy contracts
,通过删除ConvertLib
变量和deployer.deploy()
变量来移除ConvertLib
的部署;允许deployer.link()
保持MetaCoin
变量:
- 进入
contracts
文件夹,右键点击ConvertLib.sol
,然后点击删除文件,删除ConvertLib.sol
。 -
在
MetaCoin Solidity
文件中,删除ConvertLib
。删除所有的功能代码。 -
从 OpenZeppelin 导入标准令牌。OpenZeppelin 是一个基本的 ERC20 接口,我们可以通过运行命令
import ‘zeppelin-solidity/contracts/tokens/ERC20/StandardToken.sol';
来使用它。这将从 OpenZeppelin 框架中导入StandardToken
Solidity 文件,它知道查看您的node modules
文件夹:
- 我们现在可以为此定义元币。在
contract MetaCoin
前面加上is StandardToken
。 - 现在让我们迁移元币。确保 Ganache 正在运行。在 RPC server 下,应该会看到 Ganache 运行在本地主机上的或者端口号
7545
。松露默认在7545
运行;您应该能够在编辑器中看到这一点:
- 现在,为了迁移
MetaCoin
,我们可以运行truffle -cli migrate
命令:
- 您现在应该看到它正在编译您的元币、迁移以及来自 OpenZeppelin 框架的许多文件。
执行完所有这些步骤后,我们的 Ganache 应该类似于下面这样:
发出合同呼叫后的 Ganache
您现在应该看到您的交易已经完成。Ganache 发出了一个契约调用,创建了契约。我们都准备继续前进。
部署和测试 ERC20 令牌
在本节中,我们将了解如何部署和测试我们的 ERC20 令牌或加密货币。我们将看看在转移令牌时可能遇到的一些陷阱和安全问题,我们还将看看转移这些令牌所需的可靠性和 JavaScript。我们还将使用 Ganache 和 MetaMask 对它们进行测试。
部署 ERC20 令牌
首先,我们需要一些数据输入编辑器。在MetaCoin.sol
中,我们需要定义一个名称、一个符号、小数位数和INITIAL_SUPPLY
。我们还将把我们的INITIAL_SUPPLY
赋给构造函数中的totalSupply
。我们也将给予令牌的创造者INITIAL_SUPPLY
。
我们知道我们需要totalSupply
,因为如果你去StandardToken
,在node modules
| zeppelin-solidity
| contracts
| token
| ERC20
| StandardToken
下找到,那么你可以看到这个进口ERC20
和BasicToken
。现在,如果我们转到ERC20
文件夹,我们可以看到这是一个接口,但是BasicToken.sol
实现了这个接口。所以让我们转到BasicToken.sol
文件夹。它会有totalSupply
、balances
。我希望你记得上一章的内容。它有一个利用来自SafeMath.Solidity
文件的SafeMath
的Transfer
函数。这是一个小小的可靠性文件,它将确保无论何时你执行一个数学运算,你的输入和输出数据都是正确的,并且它不会破坏任何东西,因为一旦数据进入区块链,它就会留在区块链。因此,在定义了这一点之后,我们就可以开始部署它了。通过以下步骤部署您的第一种加密货币 ERC20 令牌:
- 让我们确保加纳切正在运行。
- 一旦 Ganache 运行,复制助记符并将其粘贴到 metamask.io 恢复库中。你可能还记得,我们以前做过这种事。
你甚至可以重新安装 MetaMask 来重置一切。这使得它更简单,因为 MetaMask 还没有这个功能。
- 按确定。最初,您应该看不到任何东西。检查网络。如果你在主网络上,你必须连接到
http://localhost:7545
——这是 Ganache 监听的端口。您可以通过单击主网络旁边的下拉箭头并选择Custom RPC
来完成此操作。键入前面提到的本地主机 URL,然后单击 Save。您应该会看到 MetaMask 立即连接了。你可以看看你的账户;你应该喝点乙醚:
- 转到
migrations
文件夹,确保其中有var MetaCoin
。 - 我们上
MetaCoin.sol
。请注意,INITIAL_SUPPLY
将除以指定的小数位数。 - 切换到终端窗口。键入
truffle-cli migrate
命令。您应该能够看到成功出现的事务。复制合同令牌:
契约令牌
- 复制完成后,您可以前往 MetaMask。访问左上方的图标,点击
Add Token
,并将令牌地址粘贴到令牌地址部分。它将自动检索令牌符号和指定的小数位数。点击添加。您将看到您的第一个标记,前面有您的符号:
- 现在,您可以通过单击上面的用户图标来创建帐户。您现在将拥有第二个帐户。退出“令牌”选项卡,您将看到第二个帐户上有 0 个令牌:
- 现在,这里有一个小小的惊喜。你可以只使用你已经有的代码来发送这些代币。上一个例子中的元币和这个例子中的不同之处在于,现在的代币实际上遵循一个真正的标准,即 ERC20 标准。它声明您需要一个名称、一个令牌符号、小数和一个
INITIAL_SUPPLY
。 - 要传送令牌运行,
npm run dev
命令。 - 打开网络浏览器并导航至
localhost:8080
:
- 去找编辑。JavaScript 函数仍然会尝试调用
getBalance
函数,但是这已经被改变了。如果您转到BasicToken Solidity
文件,就可以看到这一点;你会看到你有balanceOf
。所以让我们转到app
|JavaScripts
|app.js
,然后转到refreshBalance
函数。这里,我们将meta.getBalance
改为meta.balanceOf
。此外,转到sendCoin
功能,将meta.sendCoin
改为meta.transfer
。确保在ERC20
文件夹下的BasicToken.sol
中有相同类型的方法签名:
- 现在转到浏览器的
localhost:8080
页面。切换到第一个帐户。就在那里。你不会看到小数的位置,但这只是一个前端的东西;我们稍后将对此进行研究:
测试 ERC20 令牌
我们现在将测试您的第二个帐户。
- 复制您的第二个帐户的地址,如下图所示:
复制第二个帐户的地址
- 您需要对项目的
app
目录下的javascript
文件夹中的app.js
文件进行修改:
- 切换到第一个帐户,发送您的元币。输入一个值,例如 5,000,000 个单位(相当于 5 个令牌)。该值应小于
INITIAL_SUPPLY
中指定的值。记住INITIAL_SUPPLY
除以小数将得到 5 个代币,因此是 5,000,000。粘贴地址并点击发送元币:
- 刷新页面后,您将看到您的两个帐户都有令牌:
现在,您已经创建并部署了您的首个 ERC20 标准加密货币。
了解令牌标准
在本节中,我们将深入了解 ERC20 令牌以及为什么需要其他令牌标准,如 ERC721 和 ERC827。
ERC20
如果你去以太坊维基看看 ERC20 令牌标准,你可以看到你可以实现的所有功能和事件。此外,大多数令牌都符合 ERC20 标准。可以看到假人网络令牌 ( GNT )只是部分符合 ERC20,但仍然是标准令牌;你不一定要遵循所有的事情,但是如果你这样做了,总是会更好。在这些函数中,我们之前没见过的是allowance
和approve
。这些功能在某些情况下会很有用。例如,如果你有 20 个元币代币,你可以说我希望我的朋友或另一个账户以我的名义消费代币。嗯,你可以用approve
功能做到这一点。使用allowance
功能,您可以指定一个消费者以及您希望他们能够消费多少代币。
ERC721
让我们继续看 EIP GitHub。EIP 代表以太坊改进协议。在这里,在“问题”选项卡中,我们可以看到许多关于改进的讨论。如果你觉得可以提出改进意见,可以写在草稿里。正是通过这样的讨论,有人提出了 ERC:不可替代令牌标准。
首先,让我们定义什么是可替换令牌。根据定义,可替代代币可用于购买一定数量的商品或服务或其他可交易物品。以类似的方式,一美元可以花掉,或者一美元可以换成一欧元。在这方面,不可替代的代币更像棒球卡,在同一张卡上你可以有两个可以引用或不引用的选项,但一个可能比另一个更有价值,因为人们赋予它价值。ERC721 令牌就是这种情况。如果你去 ERC-721 定义,你可以看到一个简短的定义。你可以看到name()
、symbol()
和totalsupply()
。
在这个定义中,你可以有一个令牌,一个令牌有一个所有者;你不必把代币交给主人,你可以直接交易它。令牌也有元数据,该元数据指定令牌有哪些属性,这意味着它有一个值。这使得这些代币很像棒球卡,或者,如果你熟悉它们,以太坊密码猫:
CryptoKitties 就是这种令牌的一个例子。这是一个可收藏的,可繁殖的,可爱的纪念品。更多信息,请访问 cryptokitties.co。在他们的市场上,你可以看到出售的小猫咪。有些被像你我这样的人用来卖乙醚,如下图所示:
密码猫市场
其中一些甚至是专属的密码猫。它们实际上是出售大量醚的特殊代币。
你可以用这些 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;
}
你可以通过下面的链接找到这个功能:https://github.com/ethereum/EIPs/issues/827。
您在接收方的地址上调用前面的函数。
这都是关于令牌标准的。这还不是结束——将来肯定会出现许多新的令牌标准。当然有很多提议。并不是所有的人都被接受,但当他们被接受时,那是因为他们确实带来了新的东西。你甚至可以进行改进;谁知道呢,可能会变成新的 token 标准!现在我们可以学习如何使用我们的令牌来支付智能合约的一些逻辑的执行。
使用令牌和执行逻辑
您可能想知道第三方如何在收到令牌后执行调用。事实上,这非常简单。这可以使用以太坊提供的 Web3 库在 JavaScript 中完成。以下是 remix 上显示的智能合约。我们之前已经探讨过混音:
精明的合同
这只是增加一个整数,检查它是否小于 10,如果是,则返回 true 否则返回 false。你可以用 JavaScript VM 来解决这个问题。编译运行时,点击SampleFunc
,灰色区域会添加一个新条目。如果您单击 Details,您将看到一个输入条目—您可以复制它。这将是这个函数的第三个参数。您可以像执行任何其他函数一样执行此操作。
现在,如果您使用 ERC827 智能合约发送令牌,将会执行此功能。
但是这有什么用呢?一句话,安全。接收者可以提取代币,引用或取消引用,并接收它们。这样做的原因是,在智能合约中,您不希望只是发送令牌并假设它已经成功。假设像这样的成功在过去已经导致了一些相当大的黑客攻击。你所能做的是采取某种提款计划,即你发送代币,然后让接收者可以提取代币。
摘要
在本章中,我们学习了如何创建 ERC20 令牌,然后部署和测试它们。我们还研究了不同的令牌标准,看到了一些令牌的例子,如 CryptoKitties,并看到了未来可能出现的新标准的范围。我们还学习了如何使用这些令牌,以及当有人收到这些令牌时如何执行逻辑。在下一章,我们将学习如何签署文件和处理更大的文件,然后用这些知识构建一个应用程序!