LKS Foundation

Founder Junior

Analisi tecnica dello smart contract LKSC.finance

2021-07-19 14:06:08

La tecnologia e il funzionamento

Benvenuto al terzo articolo dedicato alla campagna di Liquidity Mining di LKS annunciata nel precedente articolo.

Nei precedenti articoli abbiamo parlato del Liquidity Mining dal punto di vista operativo e pratico, ma come funziona davvero? Come faccio a verificare il funzionamento della piattaforma?
Questo articolo nasce proprio per fornire completa trasparenza sulla piattaforma che puoi trovare su lksc.finance.

Prima di tutto, come funziona Ethereum?

Prima di capire UniSwap e lksc.finance dobbiamo capire la tecnologia su cui si basa, Ethereum. Ethereum è una rete di computer che comunicano scambiandosi messaggi.

Dentro questi messaggi troviamo transazioni e dati riguardanti i famosi Smart Contracts.
Tutti questi messaggi vengono poi salvati per sempre e non verranno mai più cancellati: la famosa Blockchain.

Cosa sono invece gli Smart Contract?

Vitalik Buterin, co-fondatore di Ethereum ha recentemente twittato di essersi pentito di diffondere il termine “Smart Contracts”, tradotto “contratti intelligenti” in quanto non rende bene l’idea dietro questa tecnologia. Che termine preferisce Vitalik? Persistent scripts.

Uno “script” (dall’inglese “copione”) consiste essenzialmente in righe di codice informatico che qualche programmatore ha scritto. La potenza degli Smart Contracts nascono da diverse caratteristiche:

  1. vengono eseguiti non da un computer, non da un server, ma da migliaia di nodi
  2. i nodi non appartengono ad una società privata né a Stati
  3. i nodi sono completamente anonimi e non possono essere fermati da terze parti
  4. questi smart contracts sono tecnicamente incensurabili


Immagina il datacenter di Google ma distribuito tra migliaia di persone, ecco Ethereum, che nasce con l’obiettivo di fornire al mondo un computer globale.

Su questo computer globale oggi verrà offerto anche il servizio di LKSC.finance!
Quando andrete ad utilizzare il sito di lks.finance utilizzerete quello che viene chiamato “front end” dell’applicazione, cioè l’interfaccia che usa l’utente per interagire con un servizio.

Questo front-end è una versione modificata del famoso UniSwap, uno standard di sicurezza e soprattutto permette di offrire agli utenti una User Experience ormai consolidata nel mondo Ethereum. Questo front-end viene offerto da un server Amazon: lo so, ora starai pensando “ma quindi è centralizzato su Amazon?” e la risposta è assolutamente NO!

Chiunque può interagire con gli Smart Contracts di Ethereum, anche senza questa interfaccia: LKSC.finance rientra nella categoria delle DApp, cioè Decentralized App!
Andiamo a studiarne la struttura.

L’infografica che vedi sopra rappresenta l’architettura di una DApp e ci sei anche tu rappresentato in alto a sinistra dove trovi l’icona di un utente!

Quando andiamo ad interagire con una DApp quindi usiamo una DApp Web Browser, nel nostro caso consigliamo l’uso di Metamask, una estensione da installare nel vostro browser che vi permetterà di interagire con gli Smart Contracts della Blockchain di Ethereum (oppure cloni di Ethereum come Binance Smart Chain, Polygon..).

Subito dopo il browser troviamo HTML/CSS/Javascript forniti da NGINX, famoso WebServer estremamente veloce e sicuro.

I nostri file Javascript nel browser comunicano tramite chiamate HTTPS con Infura, un servizio per aziende che lavorano su Blockchain Ethereum. Questa chiamate HTTPS ci permettono di interagire con la Blockchain di Ethereum per compiere operazioni quali trasmettere transazioni, ricevere informazioni sui nuovi blocchi e tanto tanto altro!

Infura quindi si occupa di comunicare poi con la Blockchain di Ethereum tramite il loro network di nodi Ethereum, rappresentati in arancione nell’infografica.

Un passo avanti

Abbiamo ora capito come avviene l’interazione tra Blockchain e Browser (Firefox, Google Chrome, Brave..) andiamo capire come funzionano gli Smart Contracts su Ethereum.

Dentro i blocchi Ethereum non viene salvato il codice degli Smart Contracts (che vengono tipicamente scritti in Solidity, un linguaggio simile a Javascript) bensì viene salvato il bytecode, cioè la versione compilata del codice, il famoso codice macchina che verrà poi eseguito dalla Ethereum Virtual Machine di cui i nodi Ethereum sono dotati, il componente principale del Global Computer ideato da Vitalik e altri pionieri.

Analisi LKSC.finance


Parliamo ora dello Smart Contract dietro lks.finance: com’è stato scritto? Quali sono i suoi componenti?

Math/SafeMath

Prima di tutto troviamo la libreria per le operazioni matematiche, necessaria per evitare pericolosi bug come ad esempio i famosi overflow che durante il 2017 hanno dato vita a molti furti di fondi depositati dagli utenti all’interno di Smart Contracts.

Questa librerie merita una sezione dedicata, perchè se oggi possiamo usare la famosa DeFi senza incorrere in pericolosi bug, è soprattutto grazie a questa libreria. Vediamo ora come Math risolva il problema dell’overflow.

Abbiamo un overflow quando andiamo ad operare con numeri troppo grandi, talmente grandi che non riescono più ad essere “salvati” nella memoria del computer portando ad un crash del sistema.
Purtroppo quello che avviene non è un vero e proprio crash, bensì la cella di memoria diventa talmente grande da tornare a zero, 0! Un po’ come quando conti con le mani: una volta arrivato a 10, torni per forza a zero. Come ci aiuta la libreria Math?

Quando sommiamo per esempio due numeri, viene controllato che il risultato sia maggiore di uno dei due addendi. Perchè? Immagina di avere un sistema informatico che salva dati fino a 10, quando compare quindi il numero 11 il sistema va in overflow, riportando 0 come risultato.
Abbiamo un overflow quando uno dei due addendi (5+5 per esempio) risulterà maggiore del risultato, andiamo a dimostrarlo.

5 + 5 = 10. 10 è maggiore di 5? si, nessun problema di overflow
5 + 6 = 0 (perchè il nostro sistema non supporta numeri maggiori di 10 e si crea un overflow). 0 è maggiore di 5? No, avvertiamo il programmatore dell’errore, si crea un overflow! I programmatori Solidity quindi per eseguire le operazioni matematica non usano + / * - bensì le funzioni sum, div, mul, sub della libreria Math.sol

Ecco l’implementazione in Solidity spiegata poco prima per la somma

function add(uint256 a, uint256 b) internal pure returns (uint256) 
{
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
}

IERC20, ERC20Detailed

Questi due particolari Smart Contract costituiscono una piccola parte dello standard ERC20. Sicuramente hai letto in questi anni parlare di ERC20, l’interfaccia per i token fungibili come le migliaia di Tokens nati durante la bolla delle ICO.

I token ERC20 sono uno standard di settore e seguendo le specifiche dello standard ERC20 possiamo trovare le stesse caratteristiche su tutti i tokens tra cui LKSC, ad esempio:

  • il nome del token: “LKSCOIN”
  • il simbolo: “LKSC”
  • il numero di decimali che il token possiede: 8 nel caso di LKS, 1,00000000

Questo standard di settore ha velocizzato la crescita dell’ecosistema Ethereum, rendendo più facile la vita a sviluppatori e utenti. Senza gli ERC20 non avremmo per esempio la DeFi e tutti questi sistemi interoperabili.

Un esempio a supportare questa tesi arriva dallo stesso codice dello Smart Contract dietro LKSC.finance: stiamo parlando dell’interfaccia IUniswapV2ERC20.

IUniswapV2ERC20

IUniswapV2ERC20 è una delle interfacce dello standard Uniswap e tramite la sua funzione permit un utente può garantire una allowance cioè un “permesso di spesa” da parte di altri Smart Contract.
Andiamo a vedere le altre funzioni che fanno parte di questa interfaccia: anche qui troviamo le stesse funzioni dello standard ERC20, da qui il nome ERC20!
In questo caso siamo davanti ad una interfaccia che va a wrappare un’altra interfaccia, cioè la “ingloba”

Address

una libreria che espone un'importante funzione chiamata isContract(address account) che serve per sapere se un indirizzo Ethereum appartenga ad una persona “umana” o ad uno Smart Contract.

ReentrancyGuard

Impedisce ad uno Smart Contract di chiamare le sue stesse funzioni

Staking

Il vero e proprio Staking avviene tramite due Smart Contracts: IStakingRewards e StakingRewards, rispettivamente interfaccia e implementazione di quest’ultima.

La funzione più interessante è sicuramente getReward(), quella che andrai ad utilizzare anche tu (senza saperlo, ovviamente!) quando andrai a reclamare gli interessi maturati. Possiamo notare il modifier updateReward, una funzione cioè che viene eseguita prima del corpo della funzione stessa, in questo caso getReward.


function getReward() public nonReentrant updateReward(msg.sender) {
        uint256 reward = rewards[msg.sender];
        if (reward > 0) {
            rewards[msg.sender] = 0;
            rewardsToken.transfer(msg.sender, reward);
            emit RewardPaid(msg.sender, reward);
        }
    }

Andiamo quindi a studiare il comportamento della funzione updateReward(msg.sender), dove msg.sender risulta l’utente che sta cercando di prelevare gli interessi.

modifier updateReward(address account) {
        rewardPerTokenStored = rewardPerToken();
        lastUpdateTime = lastTimeRewardApplicable();
        if (account != address(0)) {
            rewards[account] = earned(account);
            userRewardPerTokenPaid[account] = rewardPerTokenStored;
        }
        _;
    }

Puoi vedere in grassetto una terza funzione earned che si occupa di calcolare il guadagno dell’utente in quel momento, in modo da permettere un prelievo corretto degli interessi!

function earned(address account) public view returns (uint256) {
        return _balances[account].mul(rewardPerToken().sub(userRewardPerTokenPaid[account])).div(1e18).add(rewards[account]);
    }



Etherscan, uno strumento fondamentale per Ethereum!


Etherscan è molto probabilmente uno dei software presente in questo settore più sottovalutato. Ciascuno di noi l’ha usato almeno una volta, per controllare lo stato di una transazione o controllare il balance di un certo indirizzo Ethereum..

Per chi non dovesse essere pratico di Etherscan, una piccola guida sulla sua interfaccia:
In alto potete trovare una barra di ricerca, tramite cui cercare indirizzi, token, smart contracts.. Appena sotto troviamo un po’ di statistiche sul network Ethereum e infine gli ultimi blocchi e transazioni minate e propagate tra i nodi.

Proviamo ora a cercare il seguente indirizzo Ethereum: 0x85D725bd75D6b9359fAAc4f72Af7def8F90BC27F

L’immagine che stai guardando rappresenta l’attività di LKSC.finance!
Evidenziato in giallo puoi trovare l’indirizzo cercato, seguito da alcune informazioni che poi andremo ad approfondire e infine tutte le transazioni che hanno coinvolto questo indirizzo, dietro cui agisce lo Smart Contract.

Puoi vedere tutte le transazioni, il momento esatto in cui sono state eseguite, il mittente (campo from), le fee pagate dall’utente e addirittura il nome dell’azione invocata dall’utente (stake with permit, exit, get reward..) nella colonna “Method”.

Tra le informazioni che possiamo trovare poco sotto l’indirizzo del contratto andiamo a cliccare la freccia per espandere il menù ed ecco che troviamo tutti gli LKSC e i token chiamati “LP Tokens” per “Liquidity Pool Tolens” che sono stati generati da lks.finance durante la fase di deposito all’interno della Pool (sezione Pool del sito).

Controllo del codice

Siamo quasi arrivati alla di questo approfondimento tecnico: andiamo ora a studiare l’ultima sezione di Etherscan dove possiamo controllare effettivamente che il codice che andremo ad utilizzare sia quello spiegato prima.
Posizionati nella sezione “Contract”, “code”: su Contract source code possiamo trovare il codice dello Smart Contract analizzati prima! E non è tutto: vicino a code puoi trovare un’altra voce, Read Contract e Write contract

Clicca Read e poi rewardsToken, cioè il Token con cui la piattaforma pagherà gli interessi. Etherscan ti risponderà con “0xfc4a2cd574bdcc385173f03a6a52cc3b853bb9d4”

Andiamo ora a cercare questo token su Etherscan: https://etherscan.io/address/0xfc4a2cd574bdcc385173f03a6a52cc3b853bb9d4
.. È proprio il token LKSC! 

Andiamo invece a controllare l’indirizzo di Staking: “0x073f095f0d69f9269bf9ffdb9934f27539ca3cf8”
https://etherscan.io/address/0x073f095f0d69f9269bf9ffdb9934f27539ca3cf8

Questo token è il famoso LP Token di UniSwap, il token che hai ricevuto quando hai depositato liquidità all’interno della Pool. Puoi facilmente notare che questo particolare token si riferisce alla pool “USDT-LKSC”.



Un’altra sezione utile da conoscere è quella di decodifica dei parametri di input, cioè per rispondere alla domanda “come è stato configurato lo Smart Contract alla sua nascita?”

Ecco che troviamo la risposta tramite i seguenti parametri:

  1. _rewardsDistribution (address): indirizzo del “gestore” della piattaforma
  2. _rewardsToken (address): indirizzo del token distribuito come interesse
  3. _stakingToken (address): indirizzo del token da bloccare nella sezione Stake di LKSC.finance

Conclusioni

Possiamo definire concluso questo ricco e completo articolo di analisi tecnica, tuttavia anche per i non tecnici potrebbe risultare interessante provare a capire un po’ la macchina che in questi anni alcuni pionieri sono riusciti ad inventare e altri pionieri, tra cui noi utenti di lks.finance, stanno portando avanti! Per qualsiasi chiarimento non esitare a chiedere all’interno della community LKSCOIN!