主页 > 最新版imtoken官网 > 以太坊智能合约从入门到实战4(ERC20标准代币合约)

以太坊智能合约从入门到实战4(ERC20标准代币合约)

最新版imtoken官网 2023-08-19 05:12:42

什么是标准代币合约

2017年ICO异常火爆,催生了大量以太坊代币。 这些代币基本上都是ERC20标准的代币。 ERC20是一个标准的Token接口以太坊链可以转erc20吗,规定了Token的基本功能(查询余额、转账交易等),方便第三方使用(如钱包、交易所),大大降低了Token的发行和交易成本令牌。

其实除了ERC20,还有其他标准的接口规范,比如ERC223、ERC721等等。 比如2017年以太坊非常火的养猫,其实就是基于ERC721标准的。 以太坊猫里面的猫都是ERC721 Token。 每只猫都有不同的基因。 归根结底,它是一个具有不同属性的Token。 猫的编号其实就是Token的编号,猫的基因就是Token的属性。

接下来我们需要学习的是如何创建和部署我们自己的 ERC20 标准代币合约。

创建并部署ERC20标准合约 1. 初始化合约项目

创建一个新的项目目录。 比如笔者创建的项目名为“SeaCoin”(Ocean Coin,一个很常见的名字),然后使用truffle初始化项目:

松露初始化

2. 安装Zeppelin-Solidity

Zeppelin-Solidity是一个开源的第三方库,可用于快速安全地开发ERC20标准代币合约。 相反,如果我们完全自己编写合约代码,难免会有考虑不周的情况。 一旦代码出现漏洞,被攻击者利用,整个token将彻底失去价值!

在项目的根目录下,执行以下命令:

npm 安装 zeppelin-solidity

安装完成后,我们用Sublime Text打开工程,会发现zepplin-solidity的代码库已经导入到了node_modules目录下。

以太坊私链_以太坊 侧链_以太坊链可以转erc20吗

图片

3.通过继承Zepplin StandardToken编写合约

pragma solidity ^0.4.4;
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
contract SeaCoin is StandardToken {
  string public name = "SeaCoin";
  string public symbol = "SEC";  //token的代号 
  uint8 public decimals = 4;  //小数位
  uint256 public INITIAL_SUPPLY = 2000000; //初始化代币总量,如这里200万
  
  function BloggerCoin() {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}

var SeaCoin = artifacts.require("SeaCoin")
module.exports = function(deployer){
  deployer.deploy(SeaCoin);
};

打开位于根目录中的 truffle.js 文件并将其更改为以下内容。

module.exports = {
    networks: {
        development: {
            host: "localhost",
            port: 8545,
            network_id: "*" // 匹配任何network id
         }
    }
};

4. 编译智能合约

松露编译

5.运行私有链网络

geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3" 控制台

打开一个新的命令行窗口,启动私有链网络后保持窗口打开,等待部署合约。

personal.unlockAccount(eth.accounts[0],"123456")

6.部署智能合约

再打开一个PowerShell窗口(注意此时打开了两个命令行窗口,私有链接所在的命令行不用忽略)。

在命令行中,cd到项目的根目录下,执行以下命令:

松露迁移

命令执行后会输出“Deploying Migrations...”,表示部署正在进行,需要通过挖矿打包部署。

miner.start()

回到私有链所在的命令行窗口,执行挖矿,挖出某个区块后,合约部署成功!

以太坊私链_以太坊 侧链_以太坊链可以转erc20吗

图片

与 ERC20 代币合约交互

之前我们已经成功将SeaCoin部署到私有链网络中,接下来我们将通过一些操作来验证一下。 在上一章我们了解到有两种交互方式,现在我们使用truffle提供的控制台进行交互。

松露控制台

海币。 部署()。然后(实例=>合同=实例)

contract.balanceOf(eth.coinbase)

从第一个账户向第二个账户转账 150,000 SeaCoins。

合同。 转移(web3.eth.accounts[1], 150000)

需要注意的是,在转账之前,需要先解锁账户。 转账后,控制台会因为等待挖矿而卡住,所以需要在私链网络挖矿打包交易。

验证成功以太坊链可以转erc20吗,说明我们的SeaCoin已经在以太坊网络中转账成功。 虽然还是私有链,但是下一章,我们会学习如何部署到以太坊主网上!

以下是笔者的操作记录:

truffle(development)> contract.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 6, c: [ 2000000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(development)> contract.transfer(web3.eth.accounts[1], 150000)
{ tx: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
  receipt:
   { blockHash: '0x66b1e3cc7154548695de3ba7fa705514fa5bb8dabf0a60dc8a50c46c287f1b73',
     blockNumber: 205,
     contractAddress: null,
     cumulativeGasUsed: 51697,
     from: '0x61b7c76de24861f00efddd4b5873c4d188dd88a9',
     gasUsed: 51697,
     logs: [ [Object] ],
     logsBloom: '0x00000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000008000000000000002000040000000000000000000000000000000000000000000000000
000000000000040000000000010000000000000000000000000000000000000000000008000000000000000000000000000001000000000000000000
000000000100000000000000000000000000000000000000002000000000000000000000000000000000000000000001000000000000000000000000
000000000000000000000000000000000000004000000000000',
     root: '0x8c0ab5305f4ec98656d5dd2cd5af384f7b852133a2649ca27efdbdfd9535a2f2',
     to: '0x08e6b912a61da948d064f20e166089c2c7459c4d',
     transactionHash: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
     transactionIndex: 0 },
  logs:
   [ { address: '0x08e6b912a61da948d064f20e166089c2c7459c4d',
       blockNumber: 205,
       transactionHash: '0xd88ef1c6cbba03ce67e81d7eb5c9a62c2dd17b86603517f98a52ed0466b1d9ae',
       transactionIndex: 0,
       blockHash: '0x66b1e3cc7154548695de3ba7fa705514fa5bb8dabf0a60dc8a50c46c287f1b73',
       logIndex: 0,
       removed: false,
       event: 'Transfer',
       args: [Object] } ] }
       
truffle(development)> contract.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 6, c: [ 1850000 ] }
truffle(development)> contract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 5, c: [ 150000 ] }