在这篇文章中,如果我们离开并开始开发一个基本的智能合约,并了解更多关于可靠性和合约如何工作的信息,我们将继续学习。

以太坊区块链最有趣的品质之一是创建数字代币的能力。代币是可以代表任何事物的数字资产,从硬币忠诚度积分到物理世界中的实际对象。代币也可用于与其他智能合约进行交互。

代币在以太坊网络内作为加密货币出售和交易,并允许用户支付智能合约交易费用,对于我们的第一个合约,我们将创建在我们的私有网络上部署所需的最小可行合约。

关于 ERC20 的一句话

通常在处理 Tokens 时,你会看到 ERC20 这个词被引用。ERC20是一种代币标准,描述了以太坊代币合约必须实现的功能和事件,通过遵循该标准,我们保证代币将立即与以太坊钱包以及使用相同标准的任何其他客户端或合约兼容。

为了使代币成为 ERC20 投诉,它必须实现以下内容:

// https://github.com/ethereum/EIPs/issues/20
contract ERC20 {
 function totalSupply() constant returns (uint totalSupply);
 function balanceOf(address _owner) constant returns (uint balance);
 function transfer(address _to, uint _value) returns (bool success);
 function transferFrom(address _from, address _to, uint _value) returns (bool success);
 function approve(address _spender, uint _value) returns (bool success);
 function allowance(address _owner, address _spender) constant returns (uint remaining);
 event Transfer(address indexed _from, address indexed _to, uint _value);
 event Approval(address indexed _owner, address indexed _spender, uint _value);
}

有关 ERC20 标准的更多详细信息,请查看以下链接:

以太坊钱包

以太坊钱包是以太坊区块链上去中心化应用程序的网关。它允许您持有和保护基于以太坊的以太币和其他加密资产,以及编写、部署和使用智能合约。

到目前为止,我们一直直接在Geth控制台上工作,虽然我强烈建议以太坊开发人员熟悉并熟悉Geth以了解一些以太坊内部运作,以便更快地移动和更智能地工作,但我们将切换到官方以太坊钱包:

image-20220611200557425

确保在继续之前下载并安装以太坊钱包。

将钱包连接到我们的私人测试网

默认情况下,以太坊钱包将尝试连接到主网络,它也将允许您连接到其中一个测试网络。

出于我们的目的,我们希望它自动开始连接到我们的测试网,因此在打开钱包之前执行以下操作:

免责声明:以下操作将覆盖主网络的任何本地信息,这可能会导致以太币丢失,请小心并理解您正在运行的命令。

  1. 停止正在运行的 geth 节点
  2. 运行以下命令
geth --datadir ./TestNetData --identity "HeroNode1" --ipcpath ~/Library/Ethereum/geth.ipc --networkid 24 --maxpeers 1 console

现在我们可以打开我们的以太坊钱包,它应该会自动连接到测试网络,我们所做的是重新启动我们的 Geth 节点,并将 IPC(进程间通信)管道设置在钱包默认的相同位置,方法是因此钱包将直接与我们的 Geth 节点建立连接,而不是与主网络建立连接。

在继续之前,请确保钱包将网络名称显示为Private-Net

最小可行代币

正如我们在本系列的第一篇文章中了解到的,合约是使用Solidity语言编写的;有几种工具可用于编译调试编写solidity合约,目前,我们将使用以太坊钱包附带的solidity合约编辑器。

这是我们的最小可行令牌的代码:

pragma solidity ^0.4.18;

contract HeroToken {
    /* This creates an array with all balances */
    mapping (address => uint256) public balanceOf;

    /* Initializes contract with initial supply tokens to the creator of the contract */
    function HeroToken(
        uint256 initialSupply
        ) public {
        balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens
    }

    /* Send coins */
    function transfer(address _to, uint256 _value) public {
        require(balanceOf[msg.sender] >= _value);           // Check if the sender has enough
        require(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflows
        balanceOf[msg.sender] -= _value;                    // Subtract from the sender
        balanceOf[_to] += _value;                           // Add the same to the recipient
    }
}

现在从上面获取源代码并将其粘贴到Solidity Contract Source Code 字段中。钱包将自动检查代码是否编译,如果编译成功,您将在右侧看到“选择合约”下拉菜单,如下所示:

image-20220611200644409

需要注意的一件有趣的事情是,还有一个构造函数参数,在这种情况下,是英雄代币的初始供应,这将是合约创建的一个问题。

如果您继续向下滚动,您将看到该合约的计算成本估算值,并且您可以选择您愿意为此支付多少以太币的费用。不要忘记设置我们将发行的初始代币数量,现在继续并单击“部署”按钮。

接下来,您将看到如下所示的确认对话框:

image-20220611200657007

合同提交后,您应该会在下面的最新交易中看到它,等待确认。通常,合同确认需要大约 30 秒,但此时,我们可以等待,等待,什么都不会发生。

image-20220611200734389

这是因为网络中没有其他节点,也没有人在挖矿,而以太坊现在就像比特币一样作为工作量证明网络,我不会详细介绍,但你可以阅读以下文章以获得更详细的信息解释:

解释区块链——工作量证明如何实现无需信任的共识

让我们通过跳入我们的节点控制台并输入以下内容来验证我们的合约:

miner.start()

确认合约大约需要 12 次交易,一旦完成,我们可以通过键入以下内容来停止矿工:

miner.stop()

查看最新的交易,我们的合约现在应该得到验证,我们可以通过进入“合约”选项卡来确认,我们应该会看到我们新创建的合约。

image-20220611200748593

单击它以转到其页面。单击“复制地址”并将合约地址粘贴到文本编辑器中,您很快就会需要它。

image-20220611200801912

如果你点击你的钱包地址,没有迹象表明这些代币在那里,是不是出了什么问题?不,钱包只跟踪它知道的代币,我们还没有告诉我们的钱包跟踪我们全新的代币。

image-20220611200816155

跟踪令牌

  1. 进入合约页面
  2. 单击观看令牌按钮
  3. 将出现一个弹出窗口,复制合约地址并确保输入所有详细信息
  4. 点击确定

现在,如果你回到你的钱包,你应该看到它正在跟踪令牌,如下面的屏幕截图所示。

image-20220611200827888

恭喜!您成功创建了第一个令牌。

下一步

虽然我们成功地创建了一个基本令牌,但现在并不是很有用。在下一篇文章中,我们将改进我们的 HeroToken 合约并添加更多高级功能。