Parliamo del progetto
Blockchain / Crypto

Creare un token sulla Binance Smart Chain

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...

Creare un token sulla Binance Smart Chain

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

image

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/

image-1


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.

Selection_202

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

Selection_210

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
Per il momento, nessuno n’ha fatto una donazione. Sii il primo!

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.

Condividi questo articolo