Vai al contenuto principale

Comprendere il contratto intelligente del token ERC-20

contratti intelligenti
token
Solidity
erc-20
Principiante
jdourlens
5 aprile 2020
5 minuti di lettura

Uno dei più significativi standard per i contratti intelligenti su Ethereum è noto come ERC-20, che è emerso come lo standard tecnico utilizzato per tutti i contratti intelligenti sulla blockchain di Ethereum per le implementazioni di token fungibili.

L'ERC-20 definisce un elenco comune di regole a cui tutti i token fungibili di Ethereum dovrebbero aderire. Di conseguenza, questo standard per i token consente agli sviluppatori di tutti i tipi di prevedere accuratamente come funzioneranno i nuovi token all'interno del più ampio sistema di Ethereum. Questo semplifica e agevola i compiti degli sviluppatori, perché possono procedere con il loro lavoro, sapendo che ogni nuovo progetto non dovrà essere rifatto ogni volta che viene rilasciato un nuovo token, a patto che il token segua le regole.

Ecco, presentate come un'interfaccia, le funzioni che un ERC-20 deve implementare. Se non sei sicuro di cosa sia un'interfaccia: dai un'occhiata al nostro articolo sulla programmazione OOP in Solidity (opens in a new tab).

1pragma solidity ^0.6.0;
2
3interface IERC20 {
4
5 function totalSupply() external view returns (uint256);
6 function balanceOf(address account) external view returns (uint256);
7 function allowance(address owner, address spender) external view returns (uint256);
8
9 function transfer(address recipient, uint256 amount) external returns (bool);
10 function approve(address spender, uint256 amount) external returns (bool);
11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
Mostra tutto

Ecco una spiegazione riga per riga a cosa serve ogni funzione. Dopodiché presenteremo una semplice implementazione del token ERC-20.

Getter

1function totalSupply() external view returns (uint256);

Restituisce la quantità di token esistenti. Questa funzione è un getter e non modifica lo stato del contratto. Tieni presente che non ci sono numeri in virgola mobile (float) in Solidity. Pertanto, la maggior parte dei token adotta 18 decimali e restituirà l'offerta totale e altri risultati come segue: 1000000000000000000 per 1 token. Non tutti i token hanno 18 decimali e questo è un aspetto a cui devi prestare molta attenzione quando hai a che fare con i token.

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

Restituisce la quantità di token posseduti da un indirizzo (account). Questa funzione è un getter e non modifica lo stato del contratto.

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

Lo standard ERC-20 consente a un indirizzo di concedere un'indennità (allowance) a un altro indirizzo per poterne prelevare i token. Questo getter restituisce il numero rimanente di token che lo spender (spenditore) sarà autorizzato a spendere per conto dell'owner (proprietario). Questa funzione è un getter, non modifica lo stato del contratto e dovrebbe restituire 0 per impostazione predefinita.

Funzioni

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

Sposta l'amount (quantità) di token dall'indirizzo del chiamante della funzione (msg.sender) all'indirizzo del destinatario. Questa funzione emette l'evento Transfer definito in seguito. Restituisce true se il trasferimento è stato possibile.

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

Imposta la quantità di allowance (indennità) che lo spender è autorizzato a trasferire dal saldo del chiamante della funzione (msg.sender). Questa funzione emette l'evento Approval. La funzione restituisce se l'indennità è stata impostata con successo.

1function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

Sposta l'amount di token dal sender (mittente) al recipient (destinatario) utilizzando il meccanismo di indennità. L'importo viene quindi detratto dall'indennità del chiamante. Questa funzione emette l'evento Transfer.

Eventi

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

Questo evento viene emesso quando la quantità di token (valore) viene inviata dall'indirizzo from (da) all'indirizzo to (a).

Nel caso in cui si debbano coniare nuovi token, il trasferimento è solitamente from (dall') indirizzo 0x00..0000, mentre nel caso in cui si brucino token il trasferimento è to (all') indirizzo 0x00..0000.

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

Questo evento viene emesso quando la quantità di token (value) viene approvata dall'owner per essere utilizzata dallo spender.

Un'implementazione di base dei token ERC-20

Ecco il codice più semplice su cui basare il tuo token ERC-20:

1pragma solidity ^0.8.0;
2
3interface IERC20 {
4
5 function totalSupply() external view returns (uint256);
6 function balanceOf(address account) external view returns (uint256);
7 function allowance(address owner, address spender) external view returns (uint256);
8
9 function transfer(address recipient, uint256 amount) external returns (bool);
10 function approve(address spender, uint256 amount) external returns (bool);
11 function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
12
13
14 event Transfer(address indexed from, address indexed to, uint256 value);
15 event Approval(address indexed owner, address indexed spender, uint256 value);
16}
17
18
19contract ERC20Basic is IERC20 {
20
21 string public constant name = "ERC20Basic";
22 string public constant symbol = "ERC";
23 uint8 public constant decimals = 18;
24
25
26 mapping(address => uint256) balances;
27
28 mapping(address => mapping (address => uint256)) allowed;
29
30 uint256 totalSupply_ = 10 ether;
31
32
33 constructor() {
34 balances[msg.sender] = totalSupply_;
35 }
36
37 function totalSupply() public override view returns (uint256) {
38 return totalSupply_;
39 }
40
41 function balanceOf(address tokenOwner) public override view returns (uint256) {
42 return balances[tokenOwner];
43 }
44
45 function transfer(address receiver, uint256 numTokens) public override returns (bool) {
46 require(numTokens <= balances[msg.sender]);
47 balances[msg.sender] = balances[msg.sender]-numTokens;
48 balances[receiver] = balances[receiver]+numTokens;
49 emit Transfer(msg.sender, receiver, numTokens);
50 return true;
51 }
52
53 function approve(address delegate, uint256 numTokens) public override returns (bool) {
54 allowed[msg.sender][delegate] = numTokens;
55 emit Approval(msg.sender, delegate, numTokens);
56 return true;
57 }
58
59 function allowance(address owner, address delegate) public override view returns (uint) {
60 return allowed[owner][delegate];
61 }
62
63 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {
64 require(numTokens <= balances[owner]);
65 require(numTokens <= allowed[owner][msg.sender]);
66
67 balances[owner] = balances[owner]-numTokens;
68 allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens;
69 balances[buyer] = balances[buyer]+numTokens;
70 emit Transfer(owner, buyer, numTokens);
71 return true;
72 }
73}
Mostra tutto

Un'altra eccellente implementazione dello standard del token ERC-20 è l'implementazione ERC-20 di OpenZeppelin (opens in a new tab).

Ultimo aggiornamento della pagina: 21 agosto 2025

Questo tutorial è stato utile?