主页 > imtoken怎么用 > ERC20解析:最流行的以太坊智能合约

ERC20解析:最流行的以太坊智能合约

imtoken怎么用 2023-02-21 07:46:34

目前用于在 ICO 中筹集资金的几乎所有代币都基于相同的技术:以太坊 ERC-20 标准。因此,这些代币实际上是执行 ERC20 标准的智能合约。下面我们将全面解析ERC20标准规范,给出一个ERC20代币合约的完整实现代码。此外,在下文中,我们将使用代币和代币来表示遵循 ERC20 规范的智能合约,尽管前者完全涵盖了后者的范围。

ERC20 是 Fabian Vogelsteller 在 2015 年底提出的以太坊改进提案,是许多流行合约遵循的标准。 ERC20 使代币智能合约的行为与传统加密货币非常相似,例如在不同账户之间发送和接收、查看代币总供应量或查看某个地址可用的代币余额,就像比特币或以太币一样。这类似于使用以太坊钱包发送和接收以太币,查看流通中的以太币总量,查看特定钱包的货币余额等。

ERC20接口

ERC20 定义了一些标准的接口函数:balanceOf、totalSupply、transfer、transferFrom、approval 和allowance。以及一些可选字段,例如令牌名称、符号和小数位。可以在github上查看ERC-20的全文。

以下代码声明了一个简洁的 ERC20 智能合约:

1
2
3
4
5
6
7
8
9
10

contract ERC20 {
function totalSupply() constant returns (uint theTotalSupply);
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);
}

合同中每个字段的描述和示例如下。

货币能不能查询代币的合约地址

totalSupply()

虽然与比特币一样,代币的总供应量可以很容易地确定,但该函数允许合约实例计算并返回流通中的代币总量。

1
2
3
4
5
6
7
8
9
10

contract MyERCToken {
//在本示例中,通证供给量是固定的,但也可以将其设定为可修改的
uint256 _totalSupply = 1000000;

function totalSupply() constant returns (uint256 theTotalSupply) {
//函数声明中已经定义了返回变量theTotalSupply
theTotalSupply = _totalSupply;
return theTotalSupply;
}
}

balanceOf()

该功能允许智能合约返回指定账户地址的代币余额。该函数接受地址作为参数货币能不能查询代币的合约地址,因此任何地址的代币余额都是公开的。

1
2
3
4
5
6
7
8
9
10
11
12

contract MyERCToken {
//创建映射表来记录账户余额
mapping(address => uint256) balances;
// Owner of this contract
//合约拥有者
address public owner;

function balanceOf(address _owner) constant returns (uint256 balance) {
//返回指定地址的通证余额
return balances[_owner];
}
}

货币能不能查询代币的合约地址

批准()

此函数的调用者授权给定地址从其地址提取资金。

在这里,在下面的代码片段中,您可能会看到一个变量 msg。这是外部应用程序(例如钱包)提供的隐式字段,用于更好地与合约交互。以太坊虚拟机 (EVM) 允许我们使用该字段来存储和处理外部应用程序提供的数据。

在本例中,msg.sender 是合约方法调用者的地址。

1
2
3
4
5
6
7
8
9
10
11

contract MyERCToken {
//创建映射表记录通证持有者、被授权者以及授权数量
mapping(address => mapping (address => uint256)) allowed;

function approve(address _spender, uint256 _amount) returns (bool success) {
allowed[msg.sender][_spender] = _amount;
//当授权时触发Approval事件
Approval(msg.sender, _spender, _amount);
return true;
}
}

转移()

这个函数让调用者将指定数量的代币发送到另一个地址,就像加密货币交易一样。

货币能不能查询代币的合约地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

contract MyERCToken {
mapping(address => uint256) balances;

//返回值为true时,表示转账成功
function transfer(address _to, uint256 _amount) returns (bool success) {
//如果发送方有足够的资金并且发送数量非0 ,则发送给指定地址
if (balances[msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[msg.sender] -= _amount;
balances[_to] += _amount;
//触发Transfer事件
Transfer(msg.sender, _to, _amount);
return true;
} else {
return false;
}
}
}

transferFrom()

此功能允许智能合约自动执行转移过程并代表所有者发送给定数量的代币。

看到这里你可能会有些疑惑:为什么你有 transfer() 的时候还需要 transferFrom()? .

回到通过转账支付账单的日常生活。通常你需要自己做转账和汇款来支付账单,这就像使用 transfer() :你需要自己做,不需要别人的帮助。

或者,您可以与银行签订自动付款协议。这就像使用 transferFrom() :银行的机器自动支持以您的名义转账。有了这个功能,合约可以自动代表你将代币发送到另一个地址货币能不能查询代币的合约地址,而无需你的干预。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

货币能不能查询代币的合约地址

contract MyERCToken {
mapping(address => uint256) balances;

function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) {
if (balances[_from] >= _amount
&& allowed[_from][msg.sender] >= _amount
&& _amount > 0
&& balances[_to] + _amount > balances[_to]) {
balances[_from] -= _amount;
balances[_to] += _amount;
Transfer(_from, _to, _amount);
return true;
} else {
return false;
}
}
}

名称 - 令牌名称

name 是一个可选字段,但许多流行的代币都定义了这个字段,以便 Mist 和 MyEtherWallet 等钱包可以识别它们:

1
2
3

contract MyERCToken {
string public constant name = "My Custom ERC20 Token";
}

symbol - 标记符号

symbol 是另一个用于识别代币的可选字段,通常是三到四个字母的缩写,如 BTC、ETH、AUG 或 SJCX,

1
2
3

货币能不能查询代币的合约地址

contract MyERCToken {
string public constant symbol = "MET";
}

小数 - 小数位

这是一个可选字段,用于确定代币金额的小数位数。最常见的小数位数是 18。

1
2
3

contract MyERCToken {
uint8 public constant decimals = 18;
}

这个 ERC20 代币的源代码可以在 Github 上找到。

ERC20 标准开辟了一套新的智能合约,可以像比特币或以太坊一样创建和分发。此外,这些代币可以托管在交易所并像其他资产一样进行交易,因此投资者也可以轻松买卖这些代币。

如果你想马上开始学习以太坊智能合约和应用开发,可以访问汇智网优秀的在线互动教程:

英文原文