Comprendere il contratto intelligente del token ERC-20
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;23interface IERC20 {45 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);89 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);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}Mostra tuttoEcco 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;23interface IERC20 {45 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);89 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);121314 event Transfer(address indexed from, address indexed to, uint256 value);15 event Approval(address indexed owner, address indexed spender, uint256 value);16}171819contract ERC20Basic is IERC20 {2021 string public constant name = "ERC20Basic";22 string public constant symbol = "ERC";23 uint8 public constant decimals = 18;242526 mapping(address => uint256) balances;2728 mapping(address => mapping (address => uint256)) allowed;2930 uint256 totalSupply_ = 10 ether;313233 constructor() {34 balances[msg.sender] = totalSupply_;35 }3637 function totalSupply() public override view returns (uint256) {38 return totalSupply_;39 }4041 function balanceOf(address tokenOwner) public override view returns (uint256) {42 return balances[tokenOwner];43 }4445 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 }5253 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 }5859 function allowance(address owner, address delegate) public override view returns (uint) {60 return allowed[owner][delegate];61 }6263 function transferFrom(address owner, address buyer, uint256 numTokens) public override returns (bool) {64 require(numTokens <= balances[owner]);65 require(numTokens <= allowed[owner][msg.sender]);6667 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 tuttoUn'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