Introduzione agli Smart Contract

In questo articolo vedremo cosa sono i contratti intelligenti, cosa sono, conosceremo le diverse piattaforme di contratti intelligenti, le loro caratteristiche e discuteremo anche come funzionano e quali vantaggi possono portare. Questo materiale sarà molto utile per i lettori che non conoscono bene il tema dei contratti intelligenti, ma vogliono avvicinarsi alla sua comprensione.

Contratto regolare vs. contratto intelligente

Prima di entrare nei dettagli, facciamo un esempio delle differenze tra un contratto regolare, specificato su carta, e un contratto intelligente, rappresentato digitalmente.

Introduzione agli Smart Contract

Come funzionava prima dell’avvento dei contratti intelligenti? Immagina un gruppo di persone che vogliono stabilire determinate regole e condizioni per la distribuzione dei valori, nonché un certo meccanismo per garantire l'attuazione di questa distribuzione secondo le regole e le condizioni date. Poi si riunivano, redigevano un foglio su cui annotavano i loro dati identificativi, i termini, i valori coinvolti, li datavano e li firmavano. Anche questo contratto è stato certificato da una parte fidata, come un notaio. Inoltre, queste persone sono andate in direzioni diverse con la loro copia cartacea di tale contratto e hanno iniziato a compiere alcune azioni che potrebbero non corrispondere al contratto stesso, cioè hanno fatto una cosa, ma sulla carta era certificato che avrebbero dovuto fare qualcosa completamente differente. E come uscire da questa situazione? Infatti, uno dei membri del gruppo deve prendere questo documento, raccogliere alcune prove, portarle in tribunale e ottenere la conformità tra il contratto e le azioni effettive. Molto spesso è difficile ottenere un'equa attuazione di questo contratto, il che porta a conseguenze spiacevoli.

Cosa si può dire dei contratti intelligenti? Combinano sia la possibilità di scrivere i termini del contratto sia il meccanismo per la loro rigorosa attuazione. Se le condizioni sono state fissate e la corrispondente transazione o richiesta è stata firmata, una volta accettata tale richiesta o transazione non è più possibile modificare le condizioni né influenzarne l'attuazione.

Esiste un validatore o un'intera rete, nonché un database che memorizza tutti i contratti intelligenti inviati per l'esecuzione in rigoroso ordine cronologico. È anche importante che questo database contenga tutte le condizioni di attivazione per l’esecuzione del contratto intelligente. Inoltre, si deve tener conto del valore stesso la cui distribuzione è descritta nel contratto. Se questo si applica ad alcune valute digitali, questo database dovrebbe tenerne conto.

In altre parole, i validatori del contratto intelligente devono avere accesso a tutti i dati su cui opera il contratto intelligente. Ad esempio, dovrebbe essere utilizzato un unico database per tenere conto simultaneamente delle valute digitali, dei saldi degli utenti, delle transazioni degli utenti e dei timestamp. Quindi, in uno smart contract, la condizione può essere il saldo dell’utente in una determinata valuta, l’arrivo di una certa ora, oppure il fatto che una determinata transazione sia stata effettuata, ma niente di più.

Definizione di contratto intelligente

In generale, la terminologia stessa è stata coniata dal ricercatore Nick Szabo e utilizzata per la prima volta nel 1994, ed è stata documentata nel 1997 in un articolo che descrive l’idea stessa di contratti intelligenti.

I contratti intelligenti implicano che venga eseguita una certa automazione della distribuzione del valore, che può dipendere solo da condizioni predeterminate in anticipo. Nella sua forma più semplice, si presenta come un contratto con termini rigorosamente definiti, firmato da alcune parti.

I contratti intelligenti sono progettati per ridurre al minimo la fiducia nei terzi. A volte il centro decisionale da cui tutto dipende viene completamente escluso. Inoltre, tali contratti sono più facili da controllare. Questa è una conseguenza di alcune caratteristiche progettuali di un tale sistema, ma molto spesso per contratto intelligente intendiamo un ambiente decentralizzato e la presenza di funzioni che consentono a chiunque di analizzare il database e condurre un audit completo dell'esecuzione dei contratti. Ciò garantisce la protezione contro modifiche retroattive dei dati che comporterebbero modifiche nell’esecuzione del contratto stesso. La digitalizzazione della maggior parte dei processi durante la creazione e il lancio di un contratto intelligente spesso semplifica la tecnologia e i costi della loro implementazione.

Un semplice esempio: il servizio di deposito a garanzia

Consideriamo un esempio molto semplice. Ti aiuterà ad avvicinarti alla comprensione della funzionalità dei contratti intelligenti, nonché a capire meglio in quali casi dovrebbero essere utilizzati.

Introduzione agli Smart Contract

Può anche essere implementato utilizzando Bitcoin, anche se al momento Bitcoin difficilmente può ancora essere definito una piattaforma a tutti gli effetti per contratti intelligenti. Quindi, abbiamo qualche acquirente e abbiamo un negozio online. Un cliente desidera acquistare un monitor da questo negozio. Nel caso più semplice, l'acquirente completa e invia il pagamento, quindi il negozio online lo accetta, lo conferma e quindi spedisce la merce. Tuttavia, in questa situazione è necessaria grande fiducia: l'acquirente deve fidarsi del negozio online per l'intero costo del monitor. Poiché un negozio online può avere una bassa reputazione agli occhi dell'acquirente, esiste il rischio che per qualche motivo, dopo aver accettato il pagamento, il negozio rifiuterà il servizio e non invierà la merce all'acquirente. Pertanto, l'acquirente pone la domanda (e, di conseguenza, il negozio online pone questa domanda) cosa può essere applicato in questo caso per ridurre al minimo tali rischi e rendere tali transazioni più affidabili.

Nel caso di Bitcoin è possibile consentire all’acquirente e al venditore di scegliere autonomamente un mediatore. Ci sono molte persone coinvolte nella risoluzione di questioni controverse. E i nostri partecipanti possono scegliere da un elenco generale di mediatori quello di cui si fideranno. Insieme creano un indirizzo multifirma 2 su 3 in cui sono presenti tre chiavi e sono necessarie due firme con due chiavi qualsiasi per spendere monete da quell'indirizzo. Una chiave apparterrà all'acquirente, la seconda al negozio online e la terza al mediatore. E a tale indirizzo multifirma l'acquirente invierà l'importo necessario per pagare il monitor. Ora, quando il venditore vede che il denaro è bloccato per qualche tempo su un indirizzo multifirma che dipende da lui, può tranquillamente inviare il monitor per posta.

Successivamente, l'acquirente riceve il pacco, ispeziona la merce e prende una decisione sull'acquisto finale. Potrebbe essere completamente d'accordo con il servizio fornito e firmare la transazione con la sua chiave, dove trasferisce monete dall'indirizzo multifirma al venditore, oppure potrebbe essere insoddisfatto di qualcosa. Nel secondo caso, contatta un mediatore per mettere insieme una transazione alternativa che distribuirà diversamente quelle monete.

Diciamo che il monitor è arrivato un po' graffiato e nel kit non era compreso il cavo per il collegamento al computer, anche se il sito del negozio online diceva che il cavo dovrebbe essere compreso nel kit. Quindi l'acquirente raccoglie le prove necessarie per dimostrare al mediatore di essere stato ingannato in questa situazione: prende screenshot del sito, scatta una foto della ricevuta della posta, scatta una foto dei graffi sul monitor e mostra che il sigillo era rotto e il cavo è stato staccato. Il negozio online, a sua volta, raccoglie le prove e le trasmette al mediatore.

Il mediatore è interessato a soddisfare contemporaneamente sia l'indignazione dell'acquirente che gli interessi del negozio online (il motivo sarà chiaro in seguito). Si tratta di una transazione in cui le monete provenienti da un indirizzo multifirma verranno spese in una certa proporzione tra l'acquirente, il negozio online e il mediatore, poiché ne prenderà una parte per sé come ricompensa per il suo lavoro. Diciamo che il 90% dell'importo totale va al venditore, il 5% al ​​mediatore e il 5% all'acquirente. Il mediatore firma questa transazione con la sua chiave, ma non può ancora essere applicata, perché richiede due firme, ma ne vale solo una. Invia tale transazione sia all'acquirente che al venditore. Se almeno uno di loro è soddisfatto di questa opzione di ridistribuzione delle monete, la transazione verrà prefirmata e distribuita alla rete. Per validarla è sufficiente che una delle parti della transazione sia d’accordo con la scelta del mediatore.

È importante scegliere inizialmente un mediatore in modo che entrambi i partecipanti si fidino di lui. In questo caso, agirà indipendentemente dagli interessi dell'uno o dell'altro e valuterà obiettivamente la situazione. Se il mediatore non fornisce un'opzione per la distribuzione delle monete che soddisfi almeno un partecipante, allora, dopo aver concordato insieme, sia l'acquirente che il negozio online possono inviare le monete a un nuovo indirizzo multifirma apponendo le loro due firme. Il nuovo indirizzo multifirma verrà compilato con un mediatore diverso, che potrebbe essere più competente in materia e fornire un'opzione migliore.

Esempio con un dormitorio e un frigorifero

Diamo un'occhiata a un esempio più complesso che mostra le capacità di uno smart contract in modo più esplicito.

Introduzione agli Smart Contract

Diciamo che ci sono tre ragazzi che si sono recentemente trasferiti nello stesso dormitorio. I tre sono interessati ad acquistare un frigorifero per la loro stanza da poter utilizzare insieme. Uno di loro si è offerto volontario per raccogliere la somma necessaria per acquistare un frigorifero e negoziare con il venditore. Tuttavia, si sono incontrati solo di recente e non c'è abbastanza fiducia tra loro. Ovviamente due di loro rischiano dando soldi al terzo. Inoltre, devono raggiungere un accordo nella scelta del venditore.

Possono utilizzare il servizio di deposito a garanzia, ovvero scegliere un mediatore che monitorerà l'esecuzione della transazione e risolverà eventuali questioni controverse. Quindi, dopo aver concordato, redigono un contratto intelligente e vi prescrivono determinate condizioni.

La prima condizione è che prima di un certo tempo, diciamo entro una settimana, il corrispondente conto smart contract debba ricevere tre pagamenti da determinati indirizzi per un determinato importo. Se ciò non accade, il contratto intelligente interrompe l’esecuzione e restituisce le monete a tutti i partecipanti. Se la condizione è soddisfatta, vengono impostati i valori degli identificatori del venditore e del mediatore e viene verificata la condizione che tutti i partecipanti siano d'accordo con la scelta del venditore e del mediatore. Quando tutte le condizioni saranno soddisfatte, i fondi verranno trasferiti agli indirizzi specificati. Questo approccio può proteggere i partecipanti dalle frodi provenienti da qualsiasi parte e generalmente elimina la necessità di fidarsi.

Vediamo in questo esempio il principio stesso secondo cui questa capacità di impostare passo dopo passo i parametri per soddisfare ciascuna condizione consente di creare sistemi di qualsiasi complessità e profondità di livelli nidificati. Inoltre, puoi prima definire la prima condizione nello smart contract e solo dopo il suo adempimento puoi impostare i parametri per la condizione successiva. In altre parole, la condizione è scritta formalmente e i relativi parametri possono essere impostati già durante il suo funzionamento.

Classificazione dei contratti intelligenti

Per la classificazione è possibile impostare diversi gruppi di criteri. Tuttavia, al momento dello sviluppo tecnologico, quattro di essi sono rilevanti.

I contratti intelligenti possono essere distinti dal loro ambiente di esecuzione, che può essere centralizzato o decentralizzato. Nel caso della decentralizzazione, abbiamo una maggiore indipendenza e tolleranza agli errori nell’esecuzione dei contratti intelligenti.

Possono anche essere distinti dal processo di impostazione e adempimento delle condizioni: possono essere liberamente programmabili, limitati o predefiniti, cioè rigorosamente tipizzati. Quando sono presenti solo 4 contratti intelligenti specifici sulla piattaforma dei contratti intelligenti, i relativi parametri possono essere impostati in qualsiasi modo. Di conseguenza, impostarli è molto più semplice: selezioniamo un contratto dall'elenco e passiamo i parametri.

Secondo il metodo di initiation, ci sono contratti intelligenti automatizzati, cioè quando si verificano determinate condizioni, si autoeseguono, e ci sono contratti in cui vengono specificate le condizioni, ma la piattaforma non ne controlla automaticamente l'adempimento; per questo devono essere avviati separatamente.

Inoltre, i contratti intelligenti variano nel livello di privacy. Possono essere completamente aperti, parzialmente o completamente confidenziali. Quest’ultimo significa che gli osservatori di terze parti non vedono i termini dei contratti intelligenti. Tuttavia il tema della privacy è molto ampio ed è meglio considerarlo separatamente dal presente articolo.

Di seguito esamineremo più da vicino i primi tre criteri per portare maggiore chiarezza nella comprensione dell’argomento attuale.

Contratti intelligenti per runtime

Introduzione agli Smart Contract

In base all’ambiente di esecuzione, viene fatta una distinzione tra piattaforme di contratto intelligente centralizzate e decentralizzate. Nel caso dei contratti digitali centralizzati si utilizza un unico servizio, dove è presente un solo validatore e può essere presente un servizio di backup e ripristino, anch'esso gestito centralmente. Esiste un database che memorizza tutte le informazioni necessarie per impostare i termini del contratto intelligente e distribuire il valore preso in considerazione proprio in questo database di servizi. Un servizio così centralizzato ha un cliente che stabilisce condizioni con determinate richieste e utilizza tali contratti. A causa della natura centralizzata della piattaforma, i meccanismi di autenticazione potrebbero essere meno sicuri rispetto alle criptovalute.

Prendiamo ad esempio i fornitori di servizi di telefonia mobile (diversi operatori di telefonia mobile). Supponiamo che un determinato operatore mantenga un registro centralizzato del traffico sui suoi server, che può essere trasmesso in diversi formati, ad esempio: sotto forma di chiamate vocali, trasmissione di SMS, traffico Internet mobile e secondo diversi standard, e conservi anche registri di fondi sui saldi degli utenti. Di conseguenza, il fornitore di servizi di telefonia mobile può stipulare contratti per la contabilizzazione dei servizi forniti e il loro pagamento a condizioni diverse. In questo caso, è facile impostare condizioni come "invia un SMS con questo e quel codice a questo e quel numero e riceverai queste e quelle condizioni per la distribuzione del traffico".

Si può fare un altro esempio: le banche tradizionali con funzionalità estese di Internet banking e contratti molto semplici come pagamenti regolari, conversione automatica dei pagamenti in entrata, detrazione automatica degli interessi su un conto specifico, ecc.

Se parliamo di contratti intelligenti con un ambiente di esecuzione decentralizzato, allora abbiamo un gruppo di validatori. Idealmente, chiunque può diventare un validatore. Grazie al protocollo di sincronizzazione del database e al raggiungimento del consenso, disponiamo di un database comune che ora memorizzerà tutte le transazioni con contratti rigorosamente descritti, e non alcune query condizionali, i cui formati spesso cambiano, e non esistono specifiche aperte. Qui, le transazioni conterranno le istruzioni per eseguire il contratto secondo una specifica rigorosa. Questa specifica è aperta e, pertanto, gli stessi utenti della piattaforma possono verificare e convalidare i contratti intelligenti. Qui vediamo che le piattaforme decentralizzate sono superiori a quelle centralizzate in termini di indipendenza e tolleranza ai guasti, ma la loro progettazione e manutenzione sono molto più complesse.

Contratti intelligenti mediante il metodo di definizione e adempimento delle condizioni

Ora diamo uno sguardo più da vicino a come i contratti intelligenti possono differire nel modo in cui stabiliscono e soddisfano le condizioni. Qui rivolgiamo la nostra attenzione ai contratti intelligenti che sono programmabili in modo casuale e completi di Turing. Uno smart contract Turing-complete ti consente di impostare quasi tutti gli algoritmi come condizioni per l'esecuzione del contratto: cicli di scrittura, alcune funzioni per il calcolo delle probabilità e simili, fino ai tuoi algoritmi di firma elettronica. In questo caso intendiamo una scrittura logica veramente arbitraria.

Esistono anche contratti intelligenti arbitrari, ma non quelli completi di Turing. Ciò include Bitcoin e Litecoin con il proprio script. Ciò significa che puoi utilizzare solo determinate operazioni in qualsiasi ordine, ma non puoi più scrivere cicli e algoritmi personalizzati.

Inoltre, esistono piattaforme di contratti intelligenti che implementano contratti intelligenti predefiniti. Questi includono Bitshares e Steemit. Bitshares dispone di una gamma di contratti intelligenti per il trading, la gestione del conto, la gestione della piattaforma stessa e dei suoi parametri. Steemit è una piattaforma simile, ma non è più focalizzata sull’emissione di token e sul trading, come Bitshares, ma sul blogging, ovvero archivia ed elabora i contenuti in modo decentralizzato.

I contratti arbitrari completi di Turing includono la piattaforma Ethereum e RootStock, che è ancora in fase di sviluppo. Pertanto, di seguito ci soffermeremo un po' più in dettaglio sulla piattaforma di contratto intelligente Ethereum.

Contratti intelligenti per metodo di avvio

In base alla modalità di avvio, anche i contratti intelligenti possono essere suddivisi in almeno due gruppi: automatizzati e manuali (non automatizzati). Quelli automatizzati sono caratterizzati dal fatto che, tenendo conto di tutti i parametri e le condizioni noti, il contratto intelligente viene eseguito in modo completamente automatico, ovvero non richiede l'invio di transazioni aggiuntive e il pagamento di una commissione aggiuntiva per ogni esecuzione successiva. La piattaforma stessa dispone di tutti i dati per calcolare come verrà completato il contratto intelligente. La logica lì non è arbitraria, ma predeterminata e tutto questo è prevedibile. Cioè, puoi stimare in anticipo la complessità dell'esecuzione di un contratto intelligente, utilizzare una sorta di commissione costante per esso e tutti i processi per la sua implementazione saranno più efficienti.

Per i contratti intelligenti programmati liberamente, l’esecuzione non è automatizzata. Per avviare un contratto intelligente di questo tipo, praticamente in ogni passaggio è necessario creare una nuova transazione, che chiamerà la fase di esecuzione successiva o il metodo di contratto intelligente successivo, pagare la commissione appropriata e attendere la conferma della transazione. L'esecuzione può essere completata con successo o meno, perché il codice del contratto intelligente è arbitrario e potrebbero verificarsi alcuni momenti imprevedibili, come un ciclo eterno, la mancanza di alcuni parametri e argomenti, eccezioni non gestite, ecc.

Conti Ethereum

Tipi di conto Ethereum

Diamo un'occhiata a quali tipi di account possono esserci sulla piattaforma Ethereum. Ci sono solo due tipi di account qui e non ci sono altre opzioni. Il primo tipo è chiamato account utente, il secondo è un account contrattuale. Scopriamo come differiscono.

L'account utente è controllato solo dalla chiave personale della firma elettronica. Il titolare dell'account genera la propria coppia di chiavi per la firma elettronica utilizzando l'algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm). Solo le transazioni firmate con questa chiave possono modificare lo stato di questo conto.

Viene fornita una logica separata per l'account del contratto intelligente. Può essere controllato solo da un codice software predefinito che determina completamente il comportamento dello smart contract: come gestirà le sue monete in determinate circostanze, su iniziativa di quale utente e in quali condizioni aggiuntive queste monete verranno distribuite. Se alcuni punti non vengono previsti dagli sviluppatori nel codice del programma, potrebbero sorgere dei problemi. Ad esempio, un contratto intelligente può ricevere un determinato stato in cui non accetta l'avvio di un'ulteriore esecuzione da parte di nessuno degli utenti. In questo caso le monete verranno effettivamente congelate, perché lo smart contract non prevede l’uscita da questo stato.

Come vengono creati gli account su Ethereum

Nel caso di un account utente, il proprietario genera autonomamente una coppia di chiavi utilizzando ECDSA. È importante notare che Ethereum utilizza esattamente lo stesso algoritmo e esattamente la stessa curva ellittica per le firme elettroniche di Bitcoin, ma l’indirizzo viene calcolato in modo leggermente diverso. Qui non viene più utilizzato il risultato del doppio hashing, come in Bitcoin, ma con la funzione Keccak viene fornito il singolo hashing con una lunghezza di 256 bit. I bit meno significativi vengono tagliati dal valore risultante, vale a dire i 160 bit meno significativi del valore hash di output. Di conseguenza, otteniamo un indirizzo in Ethereum. In effetti, occupa 20 byte.

Tieni presente che l'identificatore dell'account in Ethereum è codificato in esadecimale senza applicare un checksum, a differenza di Bitcoin e molti altri sistemi, dove l'indirizzo è codificato in un sistema numerico a base 58 con l'aggiunta di un checksum. Ciò significa che devi fare attenzione quando lavori con gli identificatori di conto in Ethereum: anche un solo errore nell'identificatore porterà sicuramente alla perdita di monete.

C'è una caratteristica importante ed è che un account utente a livello di database generale viene creato nel momento in cui accetta il primo pagamento in entrata.

La creazione di un account smart contract richiede un approccio completamente diverso. Inizialmente, uno degli utenti scrive il codice sorgente del contratto intelligente, dopodiché il codice viene passato attraverso un compilatore speciale per la piattaforma Ethereum, ottenendo bytecode per la propria macchina virtuale Ethereum. Il bytecode risultante viene inserito in un campo speciale della transazione. È certificato per conto dell'account dell'iniziatore. Successivamente, questa transazione viene propagata in tutta la rete e inserisce il codice del contratto intelligente. La commissione per la transazione e, di conseguenza, per l’esecuzione del contratto viene prelevata dal saldo del conto dell’iniziatore.

Ogni contratto intelligente contiene necessariamente il proprio costruttore (di questo contratto). Potrebbe essere vuoto o potrebbe avere contenuto. Dopo l'esecuzione del costruttore, viene creato un identificatore dell'account del contratto intelligente, utilizzando il quale è possibile inviare monete, chiamare determinati metodi del contratto intelligente, ecc.

Struttura delle transazioni di Ethereum

Per renderlo più chiaro, inizieremo a guardare la struttura di una transazione Ethereum e un esempio di codice di contratto intelligente.

Introduzione agli Smart Contract

Una transazione Ethereum è composta da diversi campi. Il primo di questi, nonce, è un certo numero seriale della transazione relativo al conto stesso che la distribuisce e ne è l'autore. Ciò è necessario per distinguere le doppie transazioni, ovvero per escludere il caso in cui la stessa transazione viene accettata due volte. Utilizzando un identificatore, ogni transazione ha un valore hash univoco.

Poi arriva un campo come prezzo del gas. Indica il prezzo al quale la valuta base Ethereum viene convertita in gas, che viene utilizzato per pagare l'esecuzione dello smart contract e l'allocazione della risorsa della macchina virtuale. Cosa significa?

In Bitcoin, le commissioni vengono pagate direttamente dalla valuta di base, ovvero il Bitcoin stesso. Ciò è possibile grazie ad un semplice meccanismo per calcolarli: paghiamo rigorosamente per la quantità di dati contenuti nella transazione. In Ethereum la situazione è più complicata, perché è molto difficile fare affidamento sul volume dei dati delle transazioni. In questo caso, la transazione può contenere anche un codice di programma che verrà eseguito sulla macchina virtuale e ogni operazione della macchina virtuale può avere una complessità diversa. Esistono anche operazioni che allocano memoria per le variabili. Avranno la loro complessità, da cui dipenderà il pagamento per ciascuna operazione.

Il costo di ogni operazione in equivalente gas sarà costante. Viene introdotto appositamente per determinare il costo costante di ciascuna operazione. A seconda del carico della rete cambierà il prezzo del gas, cioè il coefficiente secondo il quale la valuta base verrà convertita in questa unità ausiliaria per pagare la commissione.

C'è un'altra caratteristica di una transazione in Ethereum: il bytecode che contiene per l'esecuzione in una macchina virtuale verrà eseguito fino al completamento con qualche risultato (successo o fallimento) o fino all'esaurimento di una certa quantità di monete assegnate per pagare la commissione . È per evitare una situazione in cui, in caso di errore, tutte le monete dal conto del mittente vengono spese in commissione (ad esempio, una sorta di ciclo eterno avviato in una macchina virtuale), esiste il seguente campo: avviare il gas (spesso chiamato limite del gas) - determina la quantità massima di monete che il mittente è disposto a spendere per completare una determinata transazione.

Viene chiamato il campo successivo indirizzo di destinazione. Ciò include l'indirizzo del destinatario delle monete o l'indirizzo di uno specifico contratto intelligente i cui metodi verranno chiamati. Dopo viene il campo APPREZZIAMO, dove viene inserita la quantità di monete che vengono inviate all'indirizzo di destinazione.

Il prossimo è un campo interessante chiamato dati, dove si inserisce l'intera struttura. Questo non è un campo separato, ma un'intera struttura in cui viene definito il codice per la macchina virtuale. Puoi inserire dati arbitrari qui: ci sono regole separate per questo.

E l'ultimo campo viene chiamato firma. Contiene contemporaneamente sia la firma elettronica dell'autore di questa transazione sia la chiave pubblica con cui verrà verificata questa firma. Dalla chiave pubblica è possibile ottenere l’identificativo del conto del mittente di questa transazione, cioè identificare in modo univoco il conto del mittente nel sistema stesso. Abbiamo scoperto la cosa principale sulla struttura della transazione.

Esempio di codice di contratto intelligente per Solidity

Diamo ora uno sguardo più da vicino al contratto intelligente più semplice utilizzando un esempio.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Sopra c'è un codice sorgente semplificato che può contenere le monete degli utenti e restituirle su richiesta.

Quindi, esiste uno smart contract bancario che svolge le seguenti funzioni: accumula monete sul suo saldo, cioè, quando una transazione viene confermata e viene stipulato tale contratto intelligente, viene creato un nuovo conto che può contenere monete sul suo saldo; ricorda gli utenti e la distribuzione delle monete tra loro; dispone di diversi metodi per la gestione dei saldi, ovvero è possibile ricostituire, prelevare e controllare il saldo dell'utente.

Esaminiamo ogni riga del codice sorgente. Questo contratto ha campi costanti. Uno di questi, con indirizzo di tipo, si chiama proprietario. Qui il contratto ricorda l'indirizzo dell'utente che ha creato questo contratto intelligente. Inoltre esiste una struttura dinamica che mantiene la corrispondenza tra indirizzi utente e saldi.

Segue il metodo Banca, che ha lo stesso nome del contratto. Di conseguenza, questo è il suo costruttore. Qui alla variabile proprietario viene assegnato l'indirizzo della persona che ha inserito questo contratto intelligente nella rete. Questa è l'unica cosa che accade in questo costruttore. Cioè, msg in questo caso sono esattamente i dati che sono stati trasferiti alla macchina virtuale insieme alla transazione contenente l'intero codice di questo contratto. Di conseguenza, msg.sender è l'autore di questa transazione che ospita questo codice. Sarà lui il proprietario del contratto intelligente.

Il metodo di deposito consente di trasferire un certo numero di monete sul conto del contratto tramite transazione. In questo caso lo smart contract, ricevendo queste monete, le lascia nel suo bilancio, ma registra nella struttura dei saldi chi è stato esattamente il mittente di queste monete per sapere a chi appartengono.

Il metodo successivo si chiama prelievo e richiede un parametro: la quantità di monete che qualcuno vuole ritirare da questa banca. Questo controlla se ci sono abbastanza monete nel saldo dell'utente che chiama questo metodo per inviarle. Se ce ne sono abbastanza, il contratto intelligente stesso restituisce quel numero di monete al chiamante.

Poi arriva il metodo per controllare il saldo attuale dell'utente. Chiunque chiami questo metodo verrà utilizzato per recuperare questo saldo nel contratto intelligente. Vale la pena notare che il modificatore di questo metodo è view. Ciò significa che il metodo stesso non modifica in alcun modo le variabili della sua classe ed è in realtà solo un metodo di lettura. Non viene creata alcuna transazione separata per chiamare questo metodo, non viene pagata alcuna commissione e tutti i calcoli vengono eseguiti localmente, dopodiché l'utente riceve il risultato.

Il metodo kill è necessario per distruggere lo stato del contratto intelligente. E qui c'è un ulteriore controllo se il chiamante di questo metodo è il proprietario di questo contratto. Se è così, il contratto si autodistrugge e la funzione di distruzione accetta un parametro: l'identificatore del conto a cui il contratto invierà tutte le monete rimanenti sul suo saldo. In questo caso, le monete rimanenti andranno automaticamente all'indirizzo del titolare del contratto.

Come funziona un nodo completo sulla rete Ethereum?

Diamo un'occhiata schematicamente a come vengono eseguiti tali contratti intelligenti sulla piattaforma Ethereum e come funziona un nodo di rete completo.

Introduzione agli Smart Contract

Un nodo completo sulla rete Ethereum deve avere almeno quattro moduli.
Il primo, come per qualsiasi protocollo decentralizzato, è il modulo di rete P2P, un modulo per la connessione di rete e il lavoro con altri nodi, dove vengono scambiati blocchi, transazioni e informazioni su altri nodi. Questo è un componente tradizionale per tutte le criptovalute decentralizzate.

Successivamente, abbiamo un modulo per archiviare dati blockchain, elaborarli, scegliere un ramo prioritario, aggiungere blocchi, scollegare blocchi, convalidare questi blocchi, ecc.

Il terzo modulo si chiama EVM (Ethereum virtual machine): si tratta di una macchina virtuale che riceve bytecode dalle transazioni Ethereum. Questo modulo prende lo stato corrente di un particolare account e apporta modifiche al suo stato in base al bytecode ricevuto. La versione della macchina virtuale su ciascun nodo di rete deve essere la stessa. I calcoli che avvengono su ciascun nodo Ethereum sono esattamente gli stessi, ma avvengono in modo asincrono: qualcuno prima controlla e accetta questa transazione, cioè esegue tutto il codice in essa contenuto, e qualcuno dopo. Di conseguenza, quando viene creata una transazione, viene distribuita alla rete, i nodi la accettano e al momento della verifica, allo stesso modo in cui viene eseguito Bitcoin Script in Bitcoin, qui viene eseguito il bytecode della macchina virtuale.

Una transazione è considerata verificata se tutto il codice in essa contenuto è stato eseguito, un nuovo stato di un determinato account è stato generato e salvato finché non è chiaro se questa transazione è stata applicata o meno. Se la transazione viene applicata, questo stato è considerato non solo completato, ma anche attuale. Esiste un database che memorizza lo stato di ciascun account per ciascun nodo di rete. Dato che tutti i calcoli avvengono allo stesso modo e lo stato della blockchain è lo stesso, anche il database contenente gli stati di tutti i conti sarà lo stesso per ciascun nodo.

Miti e limitazioni dei contratti intelligenti

Per quanto riguarda le restrizioni esistenti per le piattaforme di contratto intelligente simili a Ethereum, si possono citare quanto segue:

  • esecuzione del codice;
  • allocare memoria;
  • dati blockchain;
  • inviare pagamenti;
  • creare un nuovo contratto;
  • chiamare altri contratti.

Diamo un'occhiata alle restrizioni imposte a una macchina virtuale e, di conseguenza, sfatamo alcuni miti sui contratti intelligenti. Su una macchina virtuale, che può trovarsi non solo su Ethereum, ma anche su piattaforme simili, puoi eseguire operazioni logiche veramente arbitrarie, ovvero scrivere codice e verrà eseguito lì, puoi inoltre allocare memoria. Tuttavia, la tariffa viene pagata separatamente per ogni operazione e per ogni unità aggiuntiva di memoria allocata.

Successivamente, la macchina virtuale può leggere i dati dal database blockchain per utilizzare questi dati come trigger per eseguire l'una o l'altra logica del contratto intelligente. La macchina virtuale può creare e inviare transazioni, può creare nuovi contratti e richiamare modalità di altri smart contract già pubblicati in rete: esistenti, disponibili, ecc.

Il mito più comune è che i contratti intelligenti di Ethereum possano utilizzare le informazioni provenienti da qualsiasi risorsa Internet nei loro termini. La verità è che una macchina virtuale non può inviare una richiesta di rete a qualche risorsa informativa esterna su Internet, cioè è impossibile scrivere un contratto intelligente che distribuisca valore tra gli utenti a seconda, ad esempio, del tempo fuori, o chi ha vinto qualche campionato, o in base a quale altro incidente è accaduto nel mondo esterno, perché le informazioni su questi incidenti semplicemente non sono nel database della piattaforma stessa. Cioè, non c’è nulla sulla blockchain a riguardo. Se non appare lì, la macchina virtuale non può utilizzare questi dati come trigger.

Svantaggi di Ethereum

Elenchiamo i principali. Il primo svantaggio è che ci sono alcune difficoltà nella progettazione, sviluppo e test dei contratti intelligenti in Ethereum (Ethereum utilizza il linguaggio Solidity per scrivere contratti intelligenti). In effetti, la pratica dimostra che una percentuale molto elevata di tutti gli errori appartiene al fattore umano. Questo è in realtà vero per i contratti intelligenti Ethereum già scritti che hanno una complessità media o superiore. Se per i contratti intelligenti semplici la probabilità di un errore è piccola, allora nei contratti intelligenti complessi si verificano molto spesso errori che portano al furto di fondi, al loro congelamento, alla distruzione di contratti intelligenti in modo inaspettato, ecc. Molti di questi casi sono già conosciuto.

Il secondo svantaggio è che la macchina virtuale in sé non è perfetta, poiché anch'essa è scritta da persone. Può eseguire comandi arbitrari e qui sta la vulnerabilità: alcuni comandi possono essere configurati in un certo modo che porterà a conseguenze impreviste in anticipo. Si tratta di un ambito molto complesso, ma esistono già diversi studi che dimostrano che queste vulnerabilità esistono nell’attuale versione della rete Ethereum e possono portare al fallimento di molti contratti intelligenti.

Un'altra grande difficoltà, può essere considerata uno svantaggio. Sta nel fatto che puoi praticamente o tecnicamente giungere alla conclusione che se compili il bytecode di un contratto che verrà eseguito su una macchina virtuale, puoi determinare un ordine specifico di operazioni. Se eseguite insieme, queste operazioni caricheranno notevolmente la macchina virtuale e la rallenteranno in modo sproporzionato rispetto alla tariffa pagata per l'esecuzione di queste operazioni.

In passato, c'è stato già un periodo nello sviluppo di Ethereum in cui molti ragazzi che hanno compreso in dettaglio il funzionamento di una macchina virtuale hanno scoperto tali vulnerabilità. In effetti, le transazioni pagavano una commissione molto piccola, ma praticamente rallentavano l'intera rete. Questi problemi sono molto difficili da risolvere, poiché è necessario, in primo luogo, determinarli, in secondo luogo, adeguare il prezzo per eseguire queste operazioni e, in terzo luogo, effettuare un hard fork, ovvero aggiornare tutti i nodi della rete a una nuova versione del software, e quindi l'attivazione simultanea di tali modifiche.

Per quanto riguarda Ethereum, sono state fatte molte ricerche, è stata maturata molta esperienza pratica: sia positiva che negativa, ma tuttavia rimangono difficoltà e vulnerabilità che devono ancora essere affrontate in qualche modo.

Quindi, la parte tematica dell’articolo è completata, passiamo alle domande che sorgono abbastanza spesso.

Часто задаваемые вопросы

— Se tutte le parti di un contratto intelligente esistente desiderano modificare i termini, possono annullare questo contratto intelligente utilizzando multisig e quindi creare un nuovo contratto intelligente con i termini aggiornati della sua esecuzione?

La risposta qui sarà duplice. Perché? Perché da un lato uno smart contract viene definito una volta e non implica più alcuna modifica, e dall'altro può avere una logica pre-scritta che prevede il cambiamento totale o parziale di alcune condizioni. Cioè, se vuoi cambiare qualcosa nel tuo contratto intelligente, allora devi prescrivere le condizioni alle quali puoi aggiornare queste condizioni. Pertanto solo in maniera così prudenziale si potrà organizzare il rinnovo del contratto. Ma anche qui puoi finire nei guai: commetti qualche errore e ottieni la vulnerabilità corrispondente. Pertanto, tali cose devono essere molto dettagliate, progettate e testate attentamente.

— Cosa succede se il mediatore stipula un accordo con una delle parti partecipanti: deposito a garanzia o contratto intelligente? È necessario un mediatore in uno smart contract?

In uno smart contract non è richiesto un mediatore. Potrebbe non esistere. Se, nel caso del deposito a garanzia, il mediatore entra in una cospirazione con una delle parti, allora sì, questo schema perde bruscamente tutto il suo valore. Pertanto, i mediatori vengono selezionati in modo tale da godere contemporaneamente della fiducia di tutte le parti coinvolte in questo processo. Di conseguenza, semplicemente non trasferirai monete a un indirizzo multifirma con un mediatore di cui non ti fidi.

— È possibile con una transazione Ethereum trasferire molti token diversi dal tuo indirizzo a diversi indirizzi di destinazione, ad esempio scambiare indirizzi in cui questi token vengono scambiati?

Questa è una buona domanda e riguarda il modello di transazione di Ethereum e come differisce dal modello di Bitcoin. E la differenza è radicale. Se nel modello di transazione Ethereum trasferisci semplicemente monete, queste verranno trasferite solo da un indirizzo a un altro, senza alcun cambiamento, solo l'importo specifico specificato. In altre parole, questo non è un modello di output non spesi (UTXO), ma un modello di conti e saldi corrispondenti. In teoria è possibile inviare più token diversi in una transazione contemporaneamente se si scrive un contratto intelligente intelligente, ma sarà comunque necessario effettuare molte transazioni, creare un contratto, quindi trasferire token e monete su di esso e quindi chiamare il metodo appropriato . Ciò richiede impegno e tempo, quindi in pratica non funziona così e tutti i pagamenti in Ethereum vengono effettuati in transazioni separate.

— Uno dei miti sulla piattaforma Ethereum è che sia impossibile descrivere le condizioni che dipendono dai dati di una risorsa Internet esterna, quindi cosa fare allora?

La soluzione è che lo stesso contratto intelligente può fornire uno o più cosiddetti oracoli fidati, che raccolgono dati sullo stato delle cose nel mondo esterno e li trasmettono ai contratti intelligenti attraverso metodi speciali. Il contratto stesso considera veritieri i dati ricevuti da persone di fiducia. Per una maggiore affidabilità, basta scegliere un ampio gruppo di oracoli e ridurre al minimo il rischio di una loro collusione. Il contratto stesso potrebbe non tenere conto dei dati degli oracoli che contraddicono la maggioranza.

A questo argomento è dedicata una delle lezioni del corso online sulla Blockchain – “Introduzione agli Smart Contract".

Fonte: habr.com

Aggiungi un commento