关于以太坊ERC-20通证智能合约协议

这篇具有很好参考价值的文章主要介绍了关于以太坊ERC-20通证智能合约协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


ERC-20协议是什么意思?

ERC代表“Etuereum Request for Comment”,以太坊社区为了创建一个以太坊平台的标准,开发人员提交了一个以太坊改进方案(EIP),改进方案中包括协议规范和合约标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。这使得智能合约可以遵循这些通用的接口标准来构建。可以在这里检索到所有EIP提案。

而ERC-20是以太坊上最重要的智能合约标准之一。它已经成为基于以太坊公链上用于发行可替换通证,所使用智能合约的技术标准。ERC-20 定义了所有可替换的以太坊通证都应该遵守的通用规则列表。 这简化了开发者的任务,开发者知道只要通证遵循标准中的规则,每次发布新的通证时就不需要重新实现每个新项目。

知识点:什么是可替换的以太坊通证,还有不可替换的以太坊通证吗?
可替换的以太坊通证是表示通证与通证之间是完全一样的,可以被替换的,通常遵循ERC-20标准。比如A钱包中的一个ERC-20通证和B钱包中的一个相同合约地址的ERC-20通证,在区块链上看来完全一致没有什么不同,可以被相互替换。
不可替换的以太坊通证又叫非同质化通证(Non-Fungible Token)缩写为NFT,就算AB两个钱包中存在合约地址相同的两个通证,它们也存在着不一致的属性值,它们是不一样的。所以在区块链上看来是不可被相互替换的。这样的通证通常遵循ERC-721标准。

这里有段 ERC-20 接口代码,它定义了遵循 ERC-20 标准通证所必须实现的函数:

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

下面说明一下这些函数的用途


取值函数

totalSupply

这个函数返回存在的通证数量,展示了目前该通证的流通总量,可以被所有函数调取。该函数是一个取值函数,不会修改合约的状态。重点:Solidity 中没有浮点数。 因此,大多数通证都会采用 18 位小数,并且会返回总供应量和其他结果,如下所示:1 个通证 = 100000000000000000。 这需要在处理通证数量时格外注意,不过并不是每个通证都有 18 位小数。

function totalSupply() external view returns (uint256);

balanceOf

这个函数返回某地址拥有的通证数量(account)。 该函数同样是一个取值函数,不会修改合约的状态。

function balanceOf(address account) external view returns (uint256);

allowance

此函数被用来查看owner给spender的通证额度。此函数是一个取值函数,不会修改合约的状态,并且默认应返回 0。

function allowance(address owner, address spender)
        external
        view
        returns (uint256);

操作函数

transfer

将一定数量(amount)的通证从函数调用者地址(msg.sender)移动到接收者(to)地址。此函数发出稍后定义的Transfer事件。 如果可进行转账,它将返回 true,转账操作需要消耗gas。

function transfer(address to, uint256 amount) external returns (bool);

approve

函数调用方(msg.sender)可以调用这个函数授权spender代表它使用amount数量的通证,即设置允许spender从函数调用方(msg.sender)余额转账的allowance的数额。 此函数发出 Approval 事件。 此函数返回是否成功设置了余量。

function approve(address spender, uint256 amount) external returns (bool);

transferFrom

使用余量机制将通证的amount从from移动到to。 然后从调用者的余量中扣除该数额。 此函数发出Transfer事件。

function transferFrom(
    address from,
    address to,
    uint256 amount
) external returns (bool);

事件

Transfer

将通证的数量value从from地址发送到to地址时会发出此事件,比如在调用 transfer 或 transferFrom 函数时。

event Transfer(address indexed from, address indexed to, uint256 value);

在铸造新的通证情况下,转账通常是 from 0x00…0000 地址,而在销毁通证的情况下,转账是 to 0x00…0000。

Approval

当owner批准要由spender使用的通证数量(value)时,将发出此事件。比如在调用 approve 函数时。

event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
);

ERC-20 通证的基本实现

下面是 ERC-20 通证的最简单代码:文章来源地址https://www.toymoban.com/news/detail-444589.html

pragma solidity ^0.8.0;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

contract ERC20Basic is IERC20 {
    string public constant name = "ERC20Basic";
    string public constant symbol = "ERC";
    uint8 public constant decimals = 18;

    mapping(address => uint256) balances;

    mapping(address => mapping(address => uint256)) allowed;

    uint256 totalSupply_ = 10 ether;

    constructor() {
        balances[msg.sender] = totalSupply_;
    }

    function totalSupply() public view override returns (uint256) {
        return totalSupply_;
    }

    function balanceOf(address tokenOwner)
        public
        view
        override
        returns (uint256)
    {
        return balances[tokenOwner];
    }

    function transfer(address receiver, uint256 numTokens)
        public
        override
        returns (bool)
    {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender] - numTokens;
        balances[receiver] = balances[receiver] + numTokens;
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
    }

    function approve(address delegate, uint256 numTokens)
        public
        override
        returns (bool)
    {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
    }

    function allowance(address owner, address delegate)
        public
        view
        override
        returns (uint256)
    {
        return allowed[owner][delegate];
    }

    function transferFrom(
        address owner,
        address buyer,
        uint256 numTokens
    ) public override returns (bool) {
        require(numTokens <= balances[owner]);
        require(numTokens <= allowed[owner][msg.sender]);

        balances[owner] = balances[owner] - numTokens;
        allowed[owner][msg.sender] = allowed[owner][msg.sender] - numTokens;
        balances[buyer] = balances[buyer] + numTokens;
        emit Transfer(owner, buyer, numTokens);
        return true;
    }
}

到了这里,关于关于以太坊ERC-20通证智能合约协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ERC20和BSC链调用智能合约转移拥有者权限

    自从回答了 bsc合约拥有者权限怎么打入0x000000000000000000地址 这个问题后, 好多人私信我要教程, 在这写一下 实现 先需要满足两个条件 你是合约的拥有者, 你的账户有足够的矿工费调用合约 ERC20链和BSC链都是一样的, 包括调用其他合约的方法(看不懂代码的别自己调用…浪费矿工

    2024年02月11日
    浏览(36)
  • ERC20合约入门

    这篇文章会手把手的教你开发智能合约的基本流程,带你快速入门智能合约的开发。这篇文章假设你了解区块链的基础知识,有一定的开发经验,如果不懂的可以私信我,我发给你一些资料。 智能合约的开发流程是 智能合约最简单的开发方式是用 Remix 在线编辑程序开发,这

    2024年02月03日
    浏览(42)
  • ERC20的创建及合约之间的调用(合约调用合约)

    ERC20是一个token合约标准,具体的概念和友好的合约库,可参考openzeppelin.接下来的代码创建一个erc20 token 注:solidity 0.6.8版本以后增加的SPDX申明,许可证标识符是必须要有的 关于合约与合约的调用我们以ICO作为示例来展示 什么是ICO,大致意思是,你有一个很好的项目需要融资

    2024年02月06日
    浏览(36)
  • 代币合约 ERC20 Token接口

    在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改。 在以太坊上发布了这么多与代币有关的合约,那么

    2024年02月02日
    浏览(58)
  • 以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

    以太坊改进提案(EIP)代表了以太坊区块链内协作进步的顶峰。它们是技术文章或提案,描述对以太坊网络的建议更改或增强。 这些文档经过精心制作,呈现了新的功能、流程或环境,在任何形式的采用或实施之前都需要社区的审查。 至关重要的是要认识到改进提案的概念

    2024年04月11日
    浏览(44)
  • 【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

    在“【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析”一文中,我们提到Ethereum作为一个service,被Node 注册进去。Node start的时候会启动其注册的所有服务,Ethereum service也是一样。 初始化方法

    2024年01月21日
    浏览(54)
  • ERC314协议代币开发及合约开发详解

    ERC314 是一种新的代币标准,旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发,并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账,无需借助 DEX 或 SWAP 进行交易。 这使得交易更加简单、

    2024年04月09日
    浏览(65)
  • conflux开发NFT智能合约(ERC721 & 工厂合约 & 可升级合约)

    以下场景可借鉴本文内容 需要创建很多合约 需要使用conflux代付机制(只需将工厂合约设置为代付,即可无限创建新合约) 合约想要有可升级的能力(如:特殊玩法 or 代码有bug) ERC-721 NFT 基于以上场景,需要三个主要合约实现 工厂合约 代理合约 逻辑合约 想要完全掌握本文

    2024年01月17日
    浏览(51)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包