Vediamo come crécreare un Token (Smart Contract) sulla Binance Smart Chain (BSC) e il dépiegare per permettere à tutto il mondo del trader.
Partiamo dal principio che voi conoscete déjà i principi della criptovaluta, che ne aveteéjà
acquistareé, e che sapete come funzionano i portafogli (wallet).
I Smart Contract sono programmi che controllanoôpresta direttamente attività digitaliériques. Sono questi programmi che, una volta
« inséré » nella blockchain,
vanno daéfinire come vanno questi attivi être
gérés.
Una volta che il programma è aggiuntoé à la blockchain, il n’non è più modificabile ed è impossibile eliminarlo.
Noi
usiamo qui le mémeccanismi di Smart Contract della Blockchain di Binance, la BSC (su résecchio
BEP20).
Abbiamo scelto la BSC perché le commissioni del gas sono trèi deboli.
È possibile fare la même
cosa sulla Blockchain Ethereum (ERC20) ma ogni transazione
può représentire diverse decine di’euro contro alcune frazioni di centesimo sulla BSC.
Aggiungere il résecchio BSC al wallet MetaMask
Per convalidare le transazioni sulla BSC avrete bisogno di un portafoglio (wallet) collegatoé al résecchio BEP20.
Per questo installeremo MetaMask, gli aggiungeremo del BNB (la moneta nénecessario per pagare le tasse di transazione), e collegarlo al résecchio BEP20.
Puoi farlo’installare sul vostro télételefono o
sul tuo PC (préférable per seguire questo articolo).
https://metamask.io/download
Annotate bene la vostra frase seed (la clé privée) e
conservatela in luoghi sûr.
Ne la transfémai rez à un terzo.
C’è questa clé qui vi permetterà di réinstallare il vostro portafoglio più tardi.
Una volta installatoée dovrete andare nella configurazione di l’estensione e aggiungere la résecchio BSC.
Clicca sulla barra di mezzo che contiene il nome del résecchio poi
su « RPC personalizzatoé ».
Complécompila il modulo seguente :
Per il résecchio principale (Main Net) :
Nome Rete : Binance Smart Chain
Nuovo URL RPC :
https://bsc-dataseed.binance.org/
ChainID
: 56
Simbolo :
BNB
URL dell'Esploratore di Blocchi : https://bscscan.com
Poi il résecchio di prova (Testnet) :
https://docs.binance.org/smart-chain/developer/rpc.html
Network
Nome : Testnet di Binance Smart Chain
Nuovo RPC
URL :
https://data-seed-prebsc-2-s1.binance.org:8545/
ChainID
: 97
Simbolo :
BNB
URL dell'Esploratore di Blocchi :
https://testnet.bscscan.com
In règle générale, per testare il tuo contratto, inizierai pubblicandolo nel testnet.
Per questo vi servirà ricaricare il vostro wallet con del BNB di prova (per fortuna gratuito).
Vi basta recarvi sulla pagina seguente: https://testnet.binance.org/faucet-smart
Poi di informare l’indirizzo del tuo portafoglio.
Il tuo indirizzo si trova qui:
Inserite il vostro indirizzo poi séseleziona 1 BNB nella lista ‘Dammi BNB’.
Il tuo account sarà creato automaticamenteédettoé.
Créazione del vostro Smart Contract
Si è visto précédemente che’uno Smart Contract
éera un programma inséré nella blockchain.
Per il résecchio BEP20 (BSC), il linguaggio di programmazione utilizzé è il Solidity.
Troverete la documentazione completaètu qui :
https://solidity-fr.readthedocs.io/fr/latest/
Honnêtement, ce n’non è très complicé. Basta Leggi il manuale come un po' tutti i linguaggi. È anche accessibile quanto JavaScript.
Per rédigerire il nostro programma, compilarlo e pubblicarlo, lo faremo direttamente online sul sito https://remix.ethereum.org/
Tutto si farà direttamente da questo sito.
Noi
andiamo créper una chiamata di tokené e
« Token PartiTech » con il simbolo
« PTECH ».
1 – Su crée il nostro file
Prenderemo cura di nominare il nostro file con il nome del nostro progetto.
2 – L’entête del nostro file
Trèè importante, c’è lei che va définire la versione del compilatore utilizzataé e quindiéquent la versione del linguaggio.
Nel nostro caso, useremo l'ultimaère versione :
pragma solidity ^0.8.4;
3 – Il corpo del nostro programma
Noi crépoi il nostro contratto tramite la dédichiarazione
« contratto » che chiameremo della mêcon le manière che il nostro file (il che è un po' più pulito).
Da notare che potete dédichiarare
quanti contratti desideri in un même
file.
pragma solidity ^0.8.4;
contract PTECH
{
}
4 – Défine del nostro contratto
Dovremoéfinire alcuni paramètrès de
notre contrat.
Il suo nome, il numero di token e il suo simbolo.
Arrêfermarsi un istante sulla sintassi che useremo. Dobbiamo dédichiarare delle variabili.
Come nella maggior parte dei linguaggi, esse sono tipiciées (int, string, bool ecc.) e hanno una portataée (pubblico o privée).
Nelle blockchain tutto è pubblico. Quindi non vi ménon prendete sulla nozione di privée,
c’è un portoée d’accèdella valore
ma è sempre possibile di’e accéder.
pragma solidity ^0.8.4;
contract PTECH
{
uint private totalSupply = 1 000 000 000 000;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
}
Il nostro contratto avrà 1k miliardi di token disponibili e
s’appellerà le « Parti Tech Token »
con un simbolo « PTECH ».
(Francamente,
non abbiamo molto tempo hésieditié tra PTECH e PTT…)
Quindi come vedete, déchiarire una chaîè tutto semplice:
Tipo+Portaée+Nome = valore;
Ma questo non’non è tutto.
Vogliamo aggiungere dei
décimali à il nostro token in modo che i trader possano acquistare delle frazioni. Quindi noi andremo a spéspecificare il numero di décimali.
pragma solidity ^0.8.4;
contract PTECH
{
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
}
Prendete nota della nostra nuova variabile
« decimali » e la modifica fatta sulla variabile « offertaTotale ».
18
décimal, quindi un numero di token di 1 000 000 000 000 * 10 ** 18
Il doppio * serve a dare la potenza del numero, e si moltiplica il numero di token per 10 perché d’un punto di vista del portafoglio per mostrare un token, gli servono 10 unitàés. Quindi dobbiamo moltiplicare il numero réel di token per 10 alla potenza 18 per i décimali.
5 – Aggiungere la mappatura dei token agli indirizzi
A questo punto, il nostro contratto non sa nulla di meêpoi che’ha per logica di’assegnare dei token à degli utenti. Per il momento, sa solo che’ha un numero totale di token del quale la réspartito a lui è totalmente sconosciuto.
Per questo, aggiungeremo una mappatura degli indirizzi delle persone (wallet) à la répartizione dei token che chiameremo bilancio (come una bilancia in contabilità)é).
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
}
Facendo ça, si assegna à il nostro oggetto
« bilanci » l’insieme degli indirizzi che interagiranno con il nostro contratto. Potremo più tardi manipolare « equilibrio » per aggiungere o rimuovere token agli indirizzi.
Per farla semplice, mapperemo un indice à un valore. L’indice sarà
l’indirizzo d’un utente e il valore dei token
che’avrà compratoé o vincié (sì perché’non siamo costrettié d’comprare il token, si può anche farne guadagnare, à l’immagine dei token
déflazionisti).
6 – Il costruttore
Il costruttore è à l’immagine di’un « costruttore » negli altri linguaggi. C’è una funzione che sarà exétaglioée qu’una sola volta nella vita del programma. E come abbiamo visto che il programma était exétaglioé à vie, senza possibilitàé di metterlo à giorno, il costruttore sarà davvero exétagliareé qu’una sola volta.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
constructor(){
balances[msg.sender]=totalSupply;
}
}
Facciamo il punto su ciò che l’si è appena’aggiungere.
Il nostro costruttore non prende d’argomento. Dentro, assegniamo l’insieme di token à un indice
précis. Il nostro indice, c’è un indirizzo.
Per capire bene il mécanismo, à ogni interazione
tra un utente e il nostro programma, la blockchain invierà
messaggi. Un messaggio in entrataée, un messaggio di ritorno.
Quando il contratto è pubblicatoé, chi lo pubblica è
il détentatore del contratto, c’è noi.
Quindi il messaggio in entrataée qui è ripresoéinviatoé per
l’oggetto « messaggio » contiene in parametroètre « mittente » il nostro indirizzo.
Assegniamo quindi à il nostro indirizzo’insieme dei token disponibili.
Si potrebbe
très bene fare una répartizione su diversi indirizzi. Ad esempio, créper un portafoglio morto (dead wallet) e assegnarvi dès la créazione del contratto un percentuale dei nostri token.
Potremmo anche créper un portafoglio per il marketing, per gli sviluppatori e il loroépartire dai token che’li useranno più tardi, quando’ci sarà liquiditàé, per siémunécreare o finanziare un'azione di marketing.
7 – Funzione per leggere la bilancia d’un utente
Dobbiamo
ora produrre una séserie di funzionalitàés
à il nostro programma che permetterà di géle funzioni di base del nostro contratto.
La premiaère est de rétazzaéfar pendere la bilancia di’utente.
In sostanza, quando apri il tuo portafoglio, la primaère cosa
qu’quello che farà è di’inviare una richiestaêa te verso il contratto per rétazzaéVerificare il vostro saldo.
E il protocollo va exétagliare una funzione déterminata dal protocollo che s’chiama
« balanceOf() ». Questa funzione avrà sempre come argomento l’indirizzo del messaggero.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
}
Aspetta. Prendi 2 secondi per analizzare la sintassi della nostra funzione.
funzione balanceOf(indirizzo utente) pubblico
view returns (uint)
In breve che’è che l’abbiamo appena fatto? Stiamo spéspecifica il tipo di ritorno che la nostra funzione produrrà. Semplicemente.
Con
una portaée pubblico o privatoée un ritorno di tipo integer (uint). E cosa importante, la propriété
n’è leggibile (visualizzazione, in pratica sola lettura).
Poi, vediamo che la nostra funzione prende in entrataéè una variabile
user che non’è altro che’un indirizzo e che l’poi si restituisce il valore assegnatoée per l’indice corrispondente à il nostro indirizzo nella nostra tabella
« bilance ».
8 – Il trasferimento di token agli utenti
Ora ci serve définire l’interazione tra ogni transazione.
Quando’un utente acquisterà il nostro token su un marketplace e ci invierà una richiesta di trasferimento. A la récezione dovremo assegnare il numero di token à il nostro utente.
Se volessimo
fare un sistème come il DOGE coin, che crée dei token à ogni transazione, potremmo farla qui.
Da mêio, se volessimo fare una mémeccanismo di Burn, potremmo farlo anche qui.
Come vedete, tutti questi termini che circolano intorno ai contratti sono in réalité turchièsemplice à
implémentre.
Una rèmatematica gleématica tutta bête.
ÇNon sarà il nostro caso qui. Restiamo semplici.
Quindi à ogni transazione il protocollo della blockchain ci invierà un messaggio che chiamerà la funzione
« trasferire() » qui conterrà
l’indirizzo di l’utente.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
function transfer(address to, uint value) public view returns (uint)
{
require(balanceOf(msg.sender)>=value, "Solde est insuffisant");
}
}
Globalmente, una transazione c’è un trasferimento di’un
valore di’un indirizzo à un altro. Quindi se il détentatore A vuole trasferireécreare un token à un
détentatore B, è necessario impératvamente che A
possèdi almeno 1 token.
Per questo useremo l’istruzione « richiedere », che permette di convalidare una condizione. Se la condizione
écavolo, allora il processo è fermoêté, e viene restituito un erroreée al protocollo che si occupa di trasmetterlo à l’utente.
Quindi quello che’si fa, c’è rétazzaérer
l’indirizzo di l’utente e chiamare la nostra funzione
« saldoDi » qui ci restituisce il saldo
per l’indirizzo fornitoée convalidare che il numero di token à trasférer è disponibile nel bilancio del donatore di’ordine.
Se il saldo è insufficiente, noi arrêla transazione.
Da notare che l’oggetto msg
è globale e disponibile à in ogni momento in ogni funzione
al momento di’una transazione.
In funzione del résultat, on incrémentre il saldo del destinatario e si décrémentre il saldo del donatore d’ordine.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
function transfer(address to, uint value) public view returns (uint)
{
require(balanceOf(msg.sender)>=value, "Solde est insuffisant");
balances[to]+=value;
balances[msg.sender]-=value;
}
}
Una volta fatto il bilancio, andiamo éscrivere nella blockchain. Per questo andremo émettere un
évévemente « Trasferire ».
Un po' come in JS si potrebbe fare un fire event nel DOM.
Per invocare un évènemente, si usa la parola-chié « emettere », e per
déchiarire l’évènemente, si usa la parola-chiaveé « evento ».
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
event Transfer(address indexed from, address indexed to, uint value);
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
function transfer(address to, uint value) public returns (bool)
{
require(balanceOf(msg.sender)>=value, "Solde insuffisant");
balances[to]+=value;
balances[msg.sender]-=value;
emit Transfer(msg.sender, to, value);
return true;
}
}
Quindi una volta convalidatoée, si invia un ordine di trasferimento dal donatore di’ordine « msg.sender » verso il destinatario « a » per un valore « valore ».
8 -La délénavigazione di trasferimento
La délégestione del trasferimento dà la possibilitàé à un terzo di fare trasferimenti
à la piazza del détentatore del contratto. C’è esattamente quello che fa la finanza diécentralizzatoée
(DEFI).
Quindi ciò che’succede c’è che il’si autorizza il contratto à effettuare dei trasferimenti à
il nostro posto il che permette poi al contratto di inviare ordini da’indirizzo del détentatore verso il’indirizzo del destinatario.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
mapping (address => mapping (address=>uint)) public allowance;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
function transfer(address to, uint value) public returns (bool)
{
require(balanceOf(msg.sender)>=value, "Solde insuffisant");
balances[to]+=value;
balances[msg.sender]-=value;
emit Transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint value) public returns (bool)
{
allowance[msg.sender][spender]=value;
emit Approval(msg.sender, spender, value);
return true;
}
}
Non tornerò sui concetti che abbiamo visto più sopra.
Su créè una mappatura di’indirizzi che contiene lui même una mappatura di’indirizzi. In sostanza una tabella
à 3 dimensioni.
Su créè una funzione
« approvare » qui va affecter à la nostra mappatura di’indirizza un valore. Questo permetterà di dire al sistemaèmi che questo indirizzo ha il diritto di dépensare
a nostro nome tale numero di token.
Si aggiunge una funzione « TrasferisciDa » qui, quando l’ordine sarà un ordine diélégué, va véverificare la bilancia e véverificare la délégation. Se la bilancia è sufficiente, e che la déléla gation è sufficiente anche, quindi calcoliamo i saldi della nostra tabella « bilanci » e noi émet un évètrasferimento momentaneo per éscrivere nella blockchain.
pragma solidity ^0.8.4;
contract PTECH
{
mapping (address => uint) public balances;
mapping (address => mapping (address=>uint)) public allowance;
uint private totalSupply = 1 000 000 000 000 * 10 ** 18;
string public name = "Parti Tech Token";
string public symbol = "PTECH";
uint public decimals = 18;
event Transfer(address indexed from, address indexed to, uint value);
event Approval(address indexed owner, address indexed spender, uint value);
constructor(){
balances[msg.sender]=totalSupply;
}
function balanceOf(address user) public view returns (uint)
{
return balances[user];
}
function transfer(address to, uint value) public returns (bool)
{
require(balanceOf(msg.sender)>=value, "Solde insuffisant");
balances[to]+=value;
balances[msg.sender]-=value;
emit Transfer(msg.sender, to, value);
return true;
}
function TransferFrom(address from, address to, uint value) public returns (bool)
{
require(balanceOf(from)>=value, "Solde insuffisant");
require(allowance[from][msg.sender]>=value, "Délégation insuffisante");
balances[to]+=value;
balances[from]-=value;
emit Transfer(from, to, value);
return true;
}
function approve(address spender, uint value) public returns (bool)
{
allowance[msg.sender][spender]=value;
emit Approval(msg.sender, spender, value);
return true;
}
}
Déimplementazione del contratto nella Blockchain
Per lé dédispiegamento, rimaniamo nel nostro éeditore del sito https://remix.ethereum.org/
Adesso compileremo il nostro contratto in véspecificando chiaramente la versione del compilatore e il tipo di linguaggio.
In garage
« Nascondi avviso » per non inquinarsi con messaggi non bloccanti.
Bisogna poi iniettare web3 nel vostro progetto. In pratica, questo legherà il vostro portafoglio MetaMask à il vostro contratto.
Ci posizioneremo al préinstallare MetaMask su résecchio
TestNet.
Poi ci si posiziona nella’scheda déschiacciamento, si inietta « Web3 », MetaMask s’apre e ci chiede di confermare quale account vogliamo utilizzare.
Si conferma.
Il numeroéro del nostro conto è riempito direttamente in
il’interfaccia.
Si clicca su « Détattica » e
MétaMask ci chiede di convalidare la transazione.
Il déil dispiegamento ci faràûter 0,0088 BNB. Una sciocchezza.
Senza contare che sul TestNet, si può se crédire dei BNB di test 😉
E confermiamo.
Abbiamo la piccola spunta verde, tutto va bene!
Su véconferma la transazione in MétaMask.
Si clicca sul link per véverificare il dédispiegamento su bscscan.com
Eccoà, il nostro contratto è créé.
Vedremo in un prossimo capitolo come aggiungerci liquiditàé al fine di permettere il trading nelle différendite dei posti di mercatoé.
Création d’una coppia e pool di liquiditàé
Affinché il tuo contratto sia in capacitàé d’être
traidé, sarà necessario crécreare una coppia con un altro token e aggiungerci liquiditàé.
Per esempio, fare una coppia PTECH/BNB. Ci créera un pool di’una frazione o della totalitàé dei nostri token disponibili, e gli sarà assegnato un valore di départe.
250 000 000 000 token per 33BNB (cioè à può prestare 10.000$ nel corso di’oggi’hui) sarebbe un buon valore di départe.
Per questo andremo su PancakeSwap: https://pancakeswap.finance
On scelto
« Liquidità » nel menu
« Commercio »
Successivamente si seleziona l’scheda « Liquidità » e si clicca su « + Aggiungi Liquidità »
Bisogna imprimereécollegare rapidamente il suo wallet al sito, se desideriamo che il sito créé la nostra piscina.
Una volta connessoé, il sito ci indica le nostre piscine. Per il momento, non’Non ne abbiamo.
Si clicca su « + Aggiungi liquidità »
E aggiungiamo il nostro token. Nella lista, clicchiamo su Gestisci token
Poi in l’scheda token si aggiunge l’indirizzo del nostro contratto:
Una volta importato il contrattoé, lo selezioniamo:
E scegliamo la seconda valuta a
« accoppiare » con il nostro contratto.
Contratto/valuta o valuta/Contratto, c’è come desiderate.
Si clicca su « Abilita » e si lascia lavorare Metamask che vi chiederà di’autorizzare le transazioni necessarie à la créazionamento del pool.
Non dovresti tardare a vederlo in listaé nei nuovi contratti disponibili. Ad esempio su https://poocoin.app/ape
Una volta che il vostro pool èéé
Se questo articolo vi ha été Utile,
n’hénon esitate a farmi una piccola donazione di qualche miliardo 😉
Il mio indirizzo:
0x3637fCa571aeA47DBC90f61c38629dd92a742315
Elencherò qui di seguito le généfelici donatori con l’indirizzo del pool su un exchange per poterlo scambiare:
| Importo | Gettone | Scambio di indirizzi |
Precauzioni prima di ogni dispiegamento
Questo tutorial è un esempio tecnico storico, non una raccomandazione finanziaria. Un contratto pubblicato è difficile da correggere e può comportare fondi reali.
- Non inserire mai una chiave privata o una frase di recupero nel codice, nel terminale condiviso o nel repository Git.
- Distribuite prima su una rete di test con indirizzi senza valore.
- Fate rileggere il contratto, i suoi diritti di amministrazione, l'offerta totale e le funzioni di creazione o distruzione prima di qualsiasi uso reale.