diff --git a/docs/solutions/integration-issues/sanitizer-test-research.md b/docs/solutions/integration-issues/sanitizer-test-research.md index e8980939d85..2a010c35157 100644 --- a/docs/solutions/integration-issues/sanitizer-test-research.md +++ b/docs/solutions/integration-issues/sanitizer-test-research.md @@ -56,6 +56,10 @@ | 45 | "Ether" translated as "الإيثار" (altruism) | ar #17105 | Crowdin/MT translates "ether" as "الإيثار" (altruism, a real Arabic word) instead of "الإيثر" (transliteration). Same class as brand garble corrections. | Medium -- wrong term | | 46 | `normalizeBlockHtmlLines` splits single-line `
content
` | id i18n/id-03-23T2228 | EN: `
text
` (one line) -> sanitizer splits to `
text\n
` (two lines) -- `normalizeBlockHtmlLines` unconditionally splits closing block HTML tags to their own line, even when the opening tag is on the same line (inline usage). MDX treats the split content as a paragraph and fails: "Expected a closing tag for `
` before the end of `paragraph`". Found in 6 files across 5 languages (id, tr, pt-br, ja, es). | Critical -- breaks MDX compilation | +| 47 | Unquoted frontmatter value with YAML-special characters | it #17841 | `description: Una spiegazione degli account di Ethereum: le loro strutture dati...` -- colon-space (`: `) inside unquoted YAML value triggers `YAMLParseError: Nested mappings are not allowed`; existing `quoteFrontmatterNonAscii` only quotes values with non-ASCII chars, missing pure-ASCII values with YAML-special sequences | Critical -- breaks build | + +| 48 | `collapseInlineHtmlFromEnglish` matches across code fences and newlines | it #17841 | Inside ````tsx` fence: `
{error?.message}
\n \n
` -- regex `\s*` crosses the blank line and collapses a separate `` onto the previous line, producing `
{error?.message}
`. Two bugs: (1) no code fence protection, (2) `\s*` matches newlines allowing cross-line grabs | High -- corrupts code examples | + ## Patterns Already Handled by Sanitizer (Confirmed Working) These patterns are covered by existing fix functions and should have regression tests: diff --git a/public/content/translations/it/about/index.md b/public/content/translations/it/about/index.md index c7d26c58887..99cc9beb1a0 100644 --- a/public/content/translations/it/about/index.md +++ b/public/content/translations/it/about/index.md @@ -1,30 +1,30 @@ --- title: Chi siamo -description: Informazioni sul team, la community e la mission di ethereum.org +description: Informazioni sul team, sulla community e sulla missione di ethereum.org lang: it --- # Informazioni su ethereum.org {#about-ethereumorg} -ethereum.org è una risorsa open-source pubblica per la community di Ethereum a cui tutti possono contribuire. Abbiamo un piccolo team dedicato alla manutenzione e allo sviluppo del sito, cui si aggiungono gli sforzi di migliaia di membri della comunità di tutto il mondo. +ethereum.org è una risorsa pubblica e open source per la community di [Ethereum](/) a cui chiunque può contribuire. Abbiamo un piccolo team principale dedicato al mantenimento e allo sviluppo del sito, con i contributi di migliaia di membri della community in tutto il mondo. -**Nessuno ti contatterà mai da ethereum.org. Non rispondere.** +**Nessuno di ethereum.org ti contatterà mai. Non rispondere.** ## Una nota sui nomi {#a-note-on-names} -Non è raro trovare persone che confondono nomi all’interno dell'ecosistema Ethereum, il che può portare a un'interpretazione errata del funzionamento di Ethereum. Di seguito una breve nota esplicativa di chiarimento: +È comune che le persone confondano i nomi all'interno del panorama di Ethereum, il che può portare a modelli mentali errati su come funziona Ethereum. Ecco una rapida spiegazione per chiarire le cose: ### Ethereum {#ethereum} -Ethereum è una rete pubblica, una blockchain e un protocollo open source - costruito, governato, gestito e posseduto da una comunità di decine di migliaia di programmatori, operatori di nodi, titolari e utenti di ETH di tutto il mondo. +Ethereum è una rete pubblica, una blockchain e un protocollo open source, operato, governato, gestito e di proprietà di una community globale di decine di migliaia di sviluppatori, operatori di nodi, detentori di ETH e utenti. -[Ulteriori informazioni su Ethereum](/what-is-ethereum/) +[Maggiori informazioni su Ethereum](/what-is-ethereum/) -[Scopri di più sulla governance di Ethereum](/governance/) +[Maggiori informazioni sulla governance di Ethereum](/governance/) ### Ether (ETH) {#ether-or-eth} -Ether (nota anche con il suo simbolo, ETH) è la valuta nativa scambiata su Ethereum. L'Ether serve per pagare le commissioni inerenti all'utilizzo della rete Ethereum (sotto forma di commissioni di transazione). ETH serve anche per proteggere la rete con lo staking. Quando si parla del prezzo di Ethereum, ci si riferisce all'ETH, l'asset. +Ether (noto anche con il suo simbolo ticker, ETH) è la valuta nativa scambiata su Ethereum. L'ETH è necessario per pagare l'utilizzo della rete Ethereum (sotto forma di commissioni della transazione). L'ETH è utilizzato anche per proteggere la rete con lo staking. Quando le persone parlano del prezzo di Ethereum, si riferiscono all'asset ETH. [Maggiori informazioni su ETH](/what-is-ether/) @@ -32,98 +32,103 @@ Ether (nota anche con il suo simbolo, ETH) è la valuta nativa scambiata su Ethe ### Ethereum Foundation {#ethereum-foundation} -Inizialmente finanziata dal crowdsale di ETH, Ethereum è un'associazione senza scopo di lucro, dedicata al sostegno della rete Ethereum e dell'intero ecosistema. +Un'organizzazione senza scopo di lucro, finanziata inizialmente dalla vendita pubblica di ETH, dedicata al supporto della rete e dell'ecosistema di Ethereum. -[Maggiori informazioni più sulla Fondazione Ethereum](/foundation/) +[Maggiori informazioni sulla Ethereum Foundation](/foundation/) ### ethereum.org {#ethereum-org} -Un sito web open source, aperto al pubblico e una risorsa educativa per la comunità Ethereum. ethereum.org è gestito da un piccolo team di base finanziato dalla Fondazione Ethereum. A questo si aggiunge la partecipazione volontaria di migliaia di membri della comunità di tutto il mondo. +Un sito web pubblico e open source e una risorsa educativa per la community di Ethereum. ethereum.org è guidato da un piccolo team principale, finanziato dalla Ethereum Foundation, con i contributi di migliaia di membri della community in tutto il mondo. -Questa pagina contiene ulteriori informazioni su ethereum.org. +Questa pagina contiene maggiori informazioni su ethereum.org. ## La nostra missione {#our-mission} -**ethereum.org ha uno scopo: essere il portale di riferimento per la community di Ethereum in continua espansione** +**La missione di ethereum.org è essere il miglior portale per la crescente community di Ethereum** -Stiamo lavorando per costruire una risorsa educativa, di facile comprensione, su tutti gli argomenti relativi a Ethereum, concepito per soddisfare le esigenze dei nuovi utenti e aiutarli a familiarizzare con Ethereum e i suoi concetti chiave. I nostri obiettivi sono: +Ci impegniamo a creare una risorsa educativa di facile comprensione per tutti gli argomenti relativi a Ethereum, progettata per aiutare i nuovi utenti a familiarizzare con Ethereum e i suoi concetti chiave. Vogliamo: -- spiegare Ethereum a chi ancora non conosce questa tecnologia -- aiutare i nuovi utenti a muovere i primi passi con ETH ed Ethereum -- aiutare i nuovi sviluppatori nelle prime fasi della creazione +- spiegare Ethereum a chiunque sia nuovo alla tecnologia +- aiutare i nuovi utenti a iniziare con ETH ed Ethereum +- aiutare i nuovi sviluppatori a iniziare a costruire - coprire gli aggiornamenti nel mondo di Ethereum - mostrare le risorse create dalla community -- informare su Ethereum nel maggior numero di lingue possibile +- portare l'educazione su Ethereum nel maggior numero di lingue possibile -Per raggiungere questo obiettivo, il nostro team si concentra su due obiettivi principali su ethereum.org: +Per raggiungere questa missione, il nostro team si concentra su due obiettivi principali su ethereum.org: -### 1. Ottimizzare l'esperienza utente per i visitatori di ethereum.org {#visitors} +### 1. Migliorare l'esperienza utente per i visitatori di ethereum.org {#visitors} -- Ampliare, ottimizzare e aggiornare i contenuti -- Ottimizzare l'usabilità e l’accessibilità attraverso la localizzazione et l'applicazione delle migliori pratiche di sviluppo web -- Massimizzare la partecipazione degli utenti attraverso funzionalità come sondaggi, quiz e integrazioni web3 -- Mantenere il sito web leggero e performance +- Estendere, migliorare e mantenere aggiornati i contenuti +- Migliorare l'usabilità e l'accessibilità tramite la localizzazione e le migliori pratiche di sviluppo web +- Aumentare il coinvolgimento degli utenti tramite funzionalità come sondaggi, quiz e integrazioni web3 +- Mantenere il sito web leggero e performante -### 2. Promuove la crescita, la forza e l’autonomia della nostra comunità di volontari {#community} +### 2. Far crescere, rafforzare e potenziare la nostra community di contributori {#community} -- Aumentare il numero totale di volontari presenti sul sito web -- Permettere di migliorare costantemente il tasso di partecipazione dei volontari attraverso il coinvolgimento, il riconoscimento e le ricompense -- Dare pieni poteri ai membri della community affinché possano ottenere ricompense sempre più importanti -- Incoraggiare una maggiore diversità dei contributi: codice, contenuti, progettazione, traduzione e moderazione -- Mantenere il codice base moderno e ben documentato +- Far crescere il numero totale di contributori al sito web +- Migliorare la fidelizzazione dei contributori attraverso il coinvolgimento, i riconoscimenti e le ricompense +- Consentire ai membri della community di dare contributi sempre più significativi +- Facilitare una maggiore diversità di contributi: codice, contenuti, design, traduzione, moderazione +- Mantenere la base di codice moderna, pulita e ben documentata ## Principi fondamentali {#core-principles} -Le pratiche da seguire per realizzare la nostra missione si basano su alcuni principi guida. +Abbiamo alcuni principi fondamentali che ci guidano nel compimento della nostra missione. -### 1. ethereum.org è un portale per Ethereum {#core-principles-1} +### 1. ethereum.org è un portale per Ethereum 🌏 {#core-principles-1} -Vogliamo catturare l'interesse dei nostri utenti e rispondere alle loro domande Dunque il nostro portale deve combinare informazione, "momenti magici" e collegamenti alle preziose risorse della community. Il nostro contenuto è meramente introduttivo e non vuole sostituire risorse esaustive già esistenti. Il nostro desiderio è fornisce sostegno e integrare le informazioni con le risorse offerte dalla community, dando loro più visibilità e rendendole quindi più reperibili. [La community di Ethereum](/community/) è al centro di questo: non dobbiamo limitarci a servire la community, bensì lavorarci assieme ed incorporarne il feedback. Il sito web non è solo per la community di oggi, ma anche per quella che speriamo di veder crescere. Ricordiamoci che la nostra community è globale, e include quindi persone di svariate lingue, regioni e culture. +Vogliamo che i nostri utenti siano incuriositi e che trovino risposta alle loro domande. Quindi il nostro portale deve combinare informazioni, "momenti magici" e collegamenti alle brillanti risorse della community esistenti. Lo scopo dei nostri contenuti è quello di essere un "portale di onboarding" e non un sostituto delle ampie risorse già esistenti. Siamo desiderosi di supportare e integrarci con le risorse create dalla community, dando loro maggiore visibilità e rendendole più facili da scoprire. +La [community di Ethereum](/community/) è al centro di tutto questo: non dobbiamo solo servire la community, ma lavorare con essa e incorporare i suoi feedback. Il sito web non è solo per la community che abbiamo ora, ma per la community in cui speriamo di crescere. Dobbiamo ricordare che la nostra community è globale e comprende persone di molte lingue, regioni e culture diverse. -### 2. ethereum.org è in continua evoluzione {#core-principles-2} +### 2. ethereum.org è in continua evoluzione 🛠 {#core-principles-2} -Ethereum e la sua community sono in continua evoluzione. ethereum.org lo sarà di conseguenza. Ecco perché il sito ha una progettazione semplice e una struttura modulare. Apportiamo continui cambiamenti man mano che capiamo come viene utilizzato il sito e cosa cerca la community. Siamo open source, con una community di collaboratori, quindi anche tu puoi proporre modifiche o aiutarci. [Ulteriori informazioni su come dare un contributo](/contributing/) +Ethereum e la community sono in continua evoluzione, quindi lo sarà anche ethereum.org. Ecco perché il sito ha un sistema di design semplice e una struttura modulare. Apportiamo modifiche iterative man mano che impariamo di più su come le persone usano il sito e su cosa la community desidera da esso. +Siamo open source, con una community di contributori, quindi anche tu puoi proporre modifiche o aiutarci. +[Scopri come contribuire](/contributing/) -### 3. ethereum.org non è uno dei soliti siti che propongono prodotti {#core-principles-3} +### 3. ethereum.org non è un tipico sito web di prodotto 🦄 {#core-principles-3} -Ethereum è tanta roba: include una community, una tecnologia, una serie di idee, ideologie e non solo. Ciò significa che il sito web deve gestire molti percorsi differenti degli utenti, da "uno sviluppatore necessita di uno strumento specifico" a "un novizio che ha appena acquistato degli ETH e non sa cos'è un portafoglio". "Qual è il miglior sito per una piattaforma blockchain?" resta una domanda aperta: siamo pionieri. Per crearlo bisogna sperimentare. +Ethereum è una cosa grande: include una community, una tecnologia, un insieme di idee e ideologie e molto altro. +Ciò significa che il sito web deve gestire molti percorsi utente diversi, da "uno sviluppatore che desidera uno strumento specifico" a "un nuovo arrivato che ha appena acquistato degli ETH e non sa cosa sia un portafoglio". +"Qual è il miglior sito web per una piattaforma blockchain?" rimane una domanda aperta: siamo dei pionieri. Costruire tutto questo richiede sperimentazione. -## Tabella di marcia di prodotti {#roadmap} +## Piano d'azione del prodotto {#roadmap} -Per rendere più accessibile il nostro lavoro e rafforzare ulteriormente la partecipazione della comunità, il team centrale di ethereum.org pubblica una panoramica degli obiettivi della nostra roadmap trimestrale. +Per rendere il nostro lavoro più accessibile e promuovere una maggiore collaborazione della community, il team principale di ethereum.org pubblica una panoramica degli obiettivi del nostro piano d'azione del [ciclo shape up](https://www.productplan.com/glossary/shape-up-method/). -[Guarda la nostra tabella di marcia dei prodotti per il terzo trimestre 2024](https://github.com/ethereum/ethereum-org-website/issues/13399) +[Visualizza il nostro piano d'azione del prodotto per il Ciclo 1 del 2025](https://github.com/ethereum/ethereum-org-website/issues/14726) -**Che ne pensi?** Apprezziamo sempre i feedback sulla nostra roadmap - non esitare a segnalarci qualunque qualcosa su cui dovremmo ancora lavorare! Accogliamo a braccia aperte tutti i membri della community che contribuiscono con le loro idee e le PR. +**Che ne pensi?** Apprezziamo sempre i feedback sul nostro piano d'azione: se c'è qualcosa su cui pensi dovremmo lavorare, faccelo sapere! Accogliamo con favore idee e PR da chiunque nella community. -**Vorresti partecipare?** [Scopri di più su come contribuire](/contributing/), [seguici su Twitter](https://twitter.com/ethdotorg), o unisciti alle discussioni della community sul [nostro server Discord](https://discord.gg/ethereum-org). +**Vuoi partecipare?** [Scopri di più su come contribuire](/contributing/), [contattaci su Twitter](https://x.com/ethdotorg) o unisciti alle discussioni della community nel [nostro server Discord](https://discord.gg/ethereum-org). -## Principi di progettazione {#design-principles} +## Principi di design {#design-principles} -Usiamo una serie di [principi di progettazione](/contributing/design-principles/) per orientare le nostre decisioni sui contenuti e sulla progettazione sul sito. +Utilizziamo una serie di [principi di design](/contributing/design-principles/) per guidare le nostre decisioni sui contenuti e sul design del sito. -## Architettura del sistema {#design-system} +## Sistema di design {#design-system} -Abbiamo costruito e implementato un [sistema la cui architettura](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) consente una distribuzione più rapida delle funzioni, dando la possibilità ai membri della community di accedere alla progettazione aperta di ethereum.org. +Abbiamo creato e rilasciato un [sistema di design](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) per distribuire le funzionalità più rapidamente e consentire ai membri della community di partecipare al design aperto di ethereum.org. -Voglia di far parte della squadra?[Seguici su Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), consulta il [ticket di GitHub](https://github.com/ethereum/ethereum-org-website/issues/6284) e unisciti alla conversazione nel nostro [canale Discord #design](https://discord.gg/ethereum-org). +Vuoi partecipare? [Seguici su Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), sulla [issue di GitHub](https://github.com/ethereum/ethereum-org-website/issues/6284) e unisciti alla conversazione nel nostro [canale Discord #design](https://discord.gg/ethereum-org). ## Guida di stile {#style-guide} -Abbiamo una [guida di stile](/contributing/style-guide/) per standardizzare certi aspetti della scrittura dei contenuti, così da rendere più fluido il processo di contribuzione. +Abbiamo una [guida di stile](/contributing/style-guide/) per standardizzare alcuni aspetti della scrittura dei contenuti e rendere più fluido il processo di contribuzione. Assicurati di leggere [i nostri principi](/contributing/design-principles/) e [la nostra guida di stile](/contributing/style-guide/) se desideri [contribuire al sito](/contributing/). -Apprezziamo i feedback sui nostri principi di design, sul sistema di design e sulla guida di stile. Ricorda, ethereum.org è per la community, dalla community. +Accogliamo con favore i feedback sui nostri principi di design, sul sistema di design e sulla guida di stile. Ricorda, ethereum.org è per la community, dalla community. ## Licenza {#license} -Il sito web ethereum.org è open source e creato sotto una [Licenza MIT](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE), se non altrimenti specificato. Maggiori informazioni sui [termini di utilizzo](/terms-of-use/) di ethereum.org. +Il sito web ethereum.org è open source e creato sotto una [Licenza MIT](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE) se non diversamente specificato. Maggiori informazioni sui [termini di utilizzo](/terms-of-use/) di ethereum.org. ## Posizioni aperte {#open-jobs} -Sebbene questo sito web sia open source e tutti possano lavorarci, abbiamo un team dedicato a ethereum.org e un altro ai progetti web della Ethereum Foundation. +Sebbene questo sito web sia open source e chiunque possa lavorarci, abbiamo un team dedicato a ethereum.org e ad altri progetti web della Ethereum Foundation. -Pubblicheremo qui tutte le posizioni aperte. Se qui non trovi un ruolo adatto a te, vienici a trovare sul [nostro server Discord](https://discord.gg/ethereum-org) e facci sapere come vorresti lavorare con noi! +Pubblicheremo qui eventuali offerte di lavoro. Se non vedi un ruolo adatto a te, vai sul [nostro server Discord](https://discord.gg/ethereum-org) e facci sapere come ti piacerebbe lavorare con noi! -Vuoi esplorare anche oltre il team di ethereum.org? [Dai un'occhiata ad altri lavori correlati a Ethereum](/community/get-involved/#ethereum-jobs/). +Stai guardando oltre il team di ethereum.org? [Dai un'occhiata ad altri lavori relativi a Ethereum](/community/get-involved/#ethereum-jobs/). \ No newline at end of file diff --git a/public/content/translations/it/ai-agents/index.md b/public/content/translations/it/ai-agents/index.md new file mode 100644 index 00000000000..37f2a73af96 --- /dev/null +++ b/public/content/translations/it/ai-agents/index.md @@ -0,0 +1,143 @@ +--- +title: Agenti IA +metaTitle: Agenti IA | Agenti IA su Ethereum +description: Una panoramica degli agenti IA su Ethereum +lang: it +template: use-cases +emoji: ":robot:" +sidebarDepth: 2 +image: /images/ai-agents/hero-image.png +alt: Persone riunite a un tavolo con terminali +summaryPoint1: IA che interagisce con la blockchain e fa trading in modo indipendente +summaryPoint2: Controlla portafogli e fondi on-chain +summaryPoint3: Assume esseri umani o altri agenti per lavorare +buttons: + - content: Cosa sono gli agenti IA? + toId: what-are-ai-agents + - content: Esplora gli agenti + toId: ai-agents-on-ethereum + isSecondary: false +--- + +Immagina di navigare su Ethereum con un assistente IA che studia le tendenze di mercato on-chain 24 ore su 24, 7 giorni su 7, risponde alle domande e persino esegue transazioni per tuo conto. Benvenuto nel mondo degli Agenti IA: sistemi intelligenti progettati per semplificare la tua vita digitale. + +Su Ethereum, stiamo assistendo a innovazioni degli agenti IA che vanno da influencer virtuali e creatori di contenuti autonomi a piattaforme di analisi di mercato in tempo reale, potenziando gli utenti fornendo approfondimenti, intrattenimento ed efficienza operativa. + +## Cosa sono gli agenti IA? {#what-are-ai-agents} + +Gli agenti IA sono programmi software che utilizzano l'intelligenza artificiale per eseguire compiti o prendere decisioni in autonomia. Imparano dai dati, si adattano ai cambiamenti e gestiscono compiti complessi. Operano ininterrottamente e possono rilevare istantaneamente le opportunità. + +### Come gli agenti IA lavorano con le blockchain {#how-ai-agents-work-with-blockchains} + +Nella finanza tradizionale, gli agenti IA operano spesso in ambienti centralizzati con input di dati limitati. Ciò ostacola la loro capacità di apprendere o gestire le risorse in modo autonomo. + +Al contrario, l'ecosistema decentralizzato di Ethereum offre diversi vantaggi chiave: + +- Dati trasparenti: Accesso alle informazioni della blockchain in tempo reale. +- Vera proprietà degli asset: Gli asset digitali sono interamente di proprietà degli agenti IA. +- Robusta funzionalità on-chain: Consente agli Agenti IA di eseguire transazioni, interagire con i contratti intelligenti, fornire liquidità e collaborare tra protocolli. + +Questi fattori trasformano gli agenti IA da semplici bot in sistemi dinamici e in grado di auto-migliorarsi che offrono un valore significativo in molteplici settori: + + + + + + + +## IA verificabile {#verifiable-ai} + +Gli agenti IA in esecuzione fuori catena spesso si comportano come "scatole nere": il loro ragionamento, gli input e gli output non possono essere verificati in modo indipendente. Ethereum cambia le cose. Ancorando il comportamento degli agenti on-chain, gli sviluppatori possono creare agenti _trustless_, _trasparenti_ ed _economicamente autonomi_. Le azioni di tali agenti possono essere controllate, limitate e provate. + +### Inferenza verificabile {#verifiable-inference} + +L'inferenza dell'IA avviene tradizionalmente fuori catena, dove l'esecuzione è economica ma l'esecuzione del modello è opaca. Su Ethereum, gli sviluppatori possono associare gli agenti a calcoli verificabili utilizzando diverse tecniche: + +- Il [**zkML (apprendimento automatico a conoscenza-zero)**](https://opengradient.medium.com/a-gentle-introduction-to-zkml-8049a0e10a04) consente agli agenti di dimostrare che un modello è stato eseguito correttamente senza rivelare il modello o gli input +- Le [**attestazioni TEE (ambiente di esecuzione affidabile)**](https://en.wikipedia.org/wiki/Trusted_execution_environment) consentono prove supportate dall'hardware che un agente ha eseguito un modello o un percorso di codice specifico +- L'**immutabilità on-chain** garantisce che queste prove e attestazioni possano essere referenziate, riprodotte e ritenute affidabili da qualsiasi contratto o agente + +## Pagamenti e commercio con x402 {#x402} + +Il [protocollo x402](https://www.x402.org/), distribuito su Ethereum e sui L2, offre agli agenti un modo nativo per pagare le risorse e interagire economicamente senza l'intervento umano. Gli agenti possono: + +- Pagare per calcolo, dati e chiamate API utilizzando stablecoin +- Richiedere o verificare attestazioni da altri agenti o servizi +- Partecipare al commercio da agente ad agente, acquistando e vendendo calcolo, dati o output di modelli + +x402 trasforma Ethereum in un livello economico programmabile per agenti autonomi, consentendo interazioni pay-per-use invece di account, abbonamenti o fatturazione centralizzata. + +### Sicurezza della finanza degli agenti {#agentic-finance-security} + +Gli agenti autonomi hanno bisogno di barriere di sicurezza. Ethereum le fornisce a livello di portafoglio e di contratto: + +- Gli [Account intelligenti (EIP-4337)](https://eips.ethereum.org/EIPS/eip-4337) consentono agli sviluppatori di applicare limiti di spesa, whitelist, chiavi di sessione e permessi granulari +- I vincoli programmati nei contratti intelligenti possono limitare ciò che un agente è autorizzato a fare +- I limiti basati sull'inferenza (ad es., richiedere una prova zkML prima di eseguire un'azione ad alto rischio) aggiungono un ulteriore livello di sicurezza + +Questi controlli consentono la distribuzione di agenti autonomi che non sono illimitati. + +### Registri on-chain: ERC-8004 {#erc-8004} + +L'[ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) definisce i registri on-chain per l'identità, la reputazione e la convalida degli agenti. Co-scritto da collaboratori di MetaMask, Ethereum Foundation, Google e Coinbase, è distribuito su 16 reti tra cui la rete principale di Ethereum, Base, Polygon, Arbitrum e altre. + +Fornisce: + +- Un **registro delle identità** per identificatori di agenti portatili e resistenti alla censura +- Un **registro della reputazione** per segnali di feedback standardizzati tra le applicazioni +- Un **registro di convalida** per richiedere una verifica indipendente (zkML, TEE, riesecuzione in staking) + +L'ERC-8004 rende più facile per gli agenti scoprirsi, verificarsi e transare tra loro in un ambiente completamente decentralizzato. + +## Agenti IA su Ethereum {#ai-agents-on-ethereum} + +Stiamo iniziando a esplorare l'intero potenziale degli agenti IA e i progetti stanno già sfruttando la sinergia tra IA e blockchain, in particolare nella trasparenza e nella monetizzazione. + + + +La prima apparizione di Luna come ospite di un podcast + + + +## Portafogli controllati da agenti {#agent-controlled-wallets} + +Agenti come Luna o AIXBT controllano il proprio portafoglio on-chain ([portafoglio di AIXBT](https://clusters.xyz/aixbt), [portafoglio di Luna](https://zapper.xyz/account/0x0d177181e3763b20d47dc3a72dd584368bd8bf43)) consentendo loro di dare mance ai fan e partecipare ad attività economiche. + +Durante la campagna social su X di Luna #LunaMuralChallenge, Luna ha selezionato e premiato i vincitori tramite il suo portafoglio Base, segnando il primo caso di un'IA che assume esseri umani per una ricompensa in criptovaluta. + + + + +

Buono a sapersi

+

Gli agenti IA e gli strumenti correlati sono ancora in fase di sviluppo iniziale e molto sperimentali: usali con cautela.

+
+
+ +## Controlla il tuo portafoglio usando i comandi di chat {#control-your-wallet-using-chat-commands} + +Puoi saltare le complicate interfacce della DeFi e gestire le tue criptovalute con semplici comandi di chat. + +Questo approccio intuitivo rende le transazioni più veloci, più facili e meno inclini a errori come l'invio di fondi all'indirizzo sbagliato o il pagamento eccessivo di commissioni. + + + +## Agenti IA vs Bot IA {#ai-agents-vs-ai-bots} + +La distinzione tra agenti IA e bot IA a volte può creare confusione, poiché entrambi eseguono azioni automatizzate in base all'input. + +- I bot IA sono come assistenti automatizzati: seguono istruzioni specifiche e pre-programmate per eseguire compiti di routine. +- Gli agenti IA sono più simili a compagni intelligenti: imparano dall'esperienza, si adattano a nuove informazioni e prendono decisioni in autonomia. + +| | Agenti IA | Bot IA | +| ------------------- | ---------------------------------------------------------------------- | ------------------------------------------- | +| **Interazioni** | Complesse, adattabili, autonome | Semplici, ambito predefinito, hardcoded | +| **Apprendimento** | Impara continuamente, può sperimentare e adattarsi a nuovi dati in tempo reale | Opera su dati pre-addestrati o regole fisse | +| **Completamento dei compiti** | Mira a raggiungere obiettivi più ampi | Si concentra solo su compiti specifici | + +## Approfondimenti {#dive-deeper} + + + +## Puoi costruire il tuo agente IA {#you-can-build-your-own-ai-agent} + + \ No newline at end of file diff --git a/public/content/translations/it/bridges/index.md b/public/content/translations/it/bridges/index.md index 2bfc863783d..c6c220a96fb 100644 --- a/public/content/translations/it/bridges/index.md +++ b/public/content/translations/it/bridges/index.md @@ -1,142 +1,144 @@ --- -title: Introduzione ai ponti della blockchain +title: Introduzione ai ponti blockchain description: I ponti consentono agli utenti di spostare i propri fondi tra diverse blockchain lang: it --- -# Ponti della blockchain {#prerequisites} +# Ponti blockchain {#prerequisites} -_Web3 si è evoluto in un ecosistema delle blockchain del L1 e soluzioni di ridimensionamento del L2, ognuna progettata con capacità e compromessi unici. All'aumentare del numero di protocolli della blockchain, aumenta anche la domanda di spostare risorse tra le catene. Per soddisfare questa domanda, necessitiamo dei ponti._ +_Il Web3 si è evoluto in un ecosistema di blockchain L1 e soluzioni di scalabilità L2, ciascuna progettata con capacità e compromessi unici. Con l'aumentare del numero di protocolli blockchain, aumenta anche la necessità di spostare risorse tra le catene. Per soddisfare questa esigenza, abbiamo bisogno dei ponti._ ## Cosa sono i ponti? {#what-are-bridges} -I ponti della blockchain funzionano proprio come i ponti che conosciamo nel mondo fisico. Proprio come un ponte fisico connette due località fisiche, il ponte di una blockchain connette due ecosistemi della blockchain. **I ponti facilitano la comunicazione tra blockchain tramite il trasferimento di informazioni e risorse**. +I ponti blockchain funzionano proprio come i ponti che conosciamo nel mondo fisico. Così come un ponte fisico collega due luoghi fisici, un ponte blockchain collega due ecosistemi blockchain. **I ponti facilitano la comunicazione tra le blockchain attraverso il trasferimento di informazioni e risorse**. Consideriamo un esempio: -Risiedi negli USA e stai pianificando un viaggio in Europa. Possiedi USD, ma necessiti di EUR da spendere. Per scambiare i tuoi USD per degli EUR, puoi usare un cambio di valuta per una piccola commissione. +Vieni dagli Stati Uniti e stai pianificando un viaggio in Europa. Hai degli USD, ma ti servono degli EUR da spendere. Per scambiare i tuoi USD in EUR puoi usare un cambiavalute per una piccola commissione. -Ma cosa succede se desideri effettuare un simile scambio per utilizzare un'altra [blockchain](/glossary/#blockchain)? Diciamo che desideri scambiare degli [ETH](/glossary/#ether) sulla Rete Principale di Ethereum per degli ETH su [Arbitrum](https://arbitrum.io/). Come il cambio di valuta fatto per gli EUR, necessitiamo di un meccanismo per spostare i nostri ETH da Ethereum ad Arbitrum. I ponti rendono possibile una simile transazione. In questo caso, [Arbitrum ha un ponte nativo](https://bridge.arbitrum.io/) che può trasferire gli ETH dalla Rete Principale ad Arbitrum. +Ma cosa fai se vuoi fare uno scambio simile per usare una [blockchain](/glossary/#blockchain) diversa? Supponiamo che tu voglia scambiare [ETH](/glossary/#ether) sulla rete principale di [Ethereum](/) per ETH su [Arbitrum](https://arbitrum.io/). Come per il cambio valuta che abbiamo fatto per gli EUR, abbiamo bisogno di un meccanismo per spostare i nostri ETH da Ethereum ad Arbitrum. I ponti rendono possibile una transazione del genere. In questo caso, [Arbitrum ha un ponte nativo](https://portal.arbitrum.io/bridge) che può trasferire ETH dalla rete principale ad Arbitrum. -## Perché necessitiamo dei ponti? {#why-do-we-need-bridges} +## Perché abbiamo bisogno dei ponti? {#why-do-we-need-bridges} -Tutte le blockchain hanno le proprie restrizioni. Perché Ethereum si ridimensionasse e tenesse il passo con la domanda, sono stati necessari i [rollup](/glossary/#rollups). Altrimenti, gli L1 come Solana e Avalanche sono progettati diversamente, per consentire un volume maggiore, ma al costo della decentralizzazione. +Tutte le blockchain hanno i loro limiti. Affinché Ethereum possa scalare e stare al passo con la domanda, ha richiesto i [rollup](/glossary/#rollups). In alternativa, gli L1 come Solana e Avalanche sono progettati diversamente per consentire un throughput più elevato, ma a costo della decentralizzazione. -Tuttavia, tutte le blockchain si sviluppano in ambienti isolati e prevedono regole e meccanismi del [consenso](/glossary/#consensus) differenti. Ciò significa che non possono comunicare nativamente e che i token non possono spostarsi liberamente tra le blockchain. +Tuttavia, tutte le blockchain sono sviluppate in ambienti isolati e hanno regole e meccanismi di [consenso](/glossary/#consensus) differenti. Ciò significa che non possono comunicare nativamente e i token non possono muoversi liberamente tra le blockchain. I ponti esistono per connettere le blockchain, consentendo il trasferimento di informazioni e token tra di esse. **I ponti consentono**: -- il trasferimento tra catene di risorse e informazioni. -- l'accesso delle [dapp](/glossary/#dapp) ai punti forti di varie blockchain, migliorandone così le capacità (poiché ora i protocolli dispongono di un maggiore spazio per l'innovazione). -- agli utenti di accedere a nuove piattaforme e sfruttare i benefici di catene differenti. -- agli sviluppatori da ecosistemi della blockchain differenti, di collaborare e creare nuove piattaforme per gli utenti. +- il trasferimento cross-chain di risorse e informazioni. +- alle [dApp](/glossary/#dapp) di accedere ai punti di forza di varie blockchain, migliorandone così le capacità (poiché i protocolli ora hanno più spazio di progettazione per l'innovazione). +- agli utenti di accedere a nuove piattaforme e sfruttare i vantaggi di diverse catene. +- agli sviluppatori di diversi ecosistemi blockchain di collaborare e costruire nuove piattaforme per gli utenti. -[Come collegare i token al livello 2](/guides/how-to-use-a-bridge/) +[Come trasferire token al livello 2 tramite un ponte](/guides/how-to-use-a-bridge/) ## Casi d'uso dei ponti {#bridge-use-cases} -I seguenti sono alcuni scenari in cui puoi usare un ponte: +Di seguito sono riportati alcuni scenari in cui è possibile utilizzare un ponte: -### Commissioni di transazione più basse {#transaction-fees} +### Commissioni della transazione più basse {#transaction-fees} -Diciamo che possiedi degli ETH sulla Rete Principale di Ethereum, ma vorresti commissioni di transazione più economiche per esplorare diverse dapp. Collegando i tuoi ETH dalla Rete Principale al rollup di L2 di Ethereum, puoi godere di commissioni di transazione inferiori. +Supponiamo che tu abbia degli ETH sulla rete principale di Ethereum ma desideri commissioni della transazione più economiche per esplorare diverse dApp. Trasferendo i tuoi ETH dalla rete principale a un rollup L2 di Ethereum tramite un ponte, puoi godere di commissioni della transazione più basse. -### Dapp su altre blockchain {#dapps-other-chains} +### dApp su altre blockchain {#dapps-other-chains} -Se utilizzi Aave sulla Rete Principale di Ethereum per prestare USDT, il tasso d'interesse per prestarli usando Aave su Polygon è maggiore. +Se hai utilizzato Aave sulla rete principale di Ethereum per fornire USDT, ma il tasso di interesse che potresti ricevere fornendo USDT utilizzando Aave su Polygon è più alto. -### Esplora gli ecosistemi della blockchain {#explore-ecosystems} +### Esplorare gli ecosistemi blockchain {#explore-ecosystems} -Se possiedi degli ETH sulla Rete Principale di Ethereum e desideri esplorare un L1 alternativo per provarne le dapp native. Puoi usare un ponte per trasferire i tuoi ETH dalla Rete Principale di Ethereum al L1 alternativo. +Se hai degli ETH sulla rete principale di Ethereum e vuoi esplorare un L1 alternativo per provare le sue dApp native. Puoi usare un ponte per trasferire i tuoi ETH dalla rete principale di Ethereum all'L1 alternativo. -### Cripto-risorse native proprie {#own-native} +### Possedere cripto-attività native {#own-native} -Diciamo che vuoi possedere Bitcoin (BTC) nativi, ma hai fondi soltanto sulla Rete Principale di Ethereum. Per esporti ai BTC su Ethereum, puoi acquistare dei Wrapped Bitcoin (WBTC). Tuttavia, WBTC è un token [ERC-20](/glossary/#erc-20) nativo alla rete di Ethereum, il che significa che è una versione di Bitcoin di Ethereum e non la risorsa originale sulla blockchain di Bitcoin. Per possedere BTC nativi, dovresti collegare le tue risorse da Ethereum a Bitcoin usando un ponte. Questo collegherà i tuoi WBTC e li convertirà in BTC nativi. Altrimenti, potresti possedere dei BTC e volerli utilizzare nei protocolli di [DeFi](/glossary/#defi) di Ethereum. Questo richiederebbe il collegamento inverso, da BTC a WBTC, poi utilizzabili come risorse su Ethereum. +Supponiamo che tu voglia possedere Bitcoin (BTC) nativi, ma hai fondi solo sulla rete principale di Ethereum. Per ottenere un'esposizione a BTC su Ethereum, puoi acquistare Wrapped Bitcoin (WBTC). Tuttavia, WBTC è un token [ERC-20](/glossary/#erc-20) nativo della rete Ethereum, il che significa che è una versione Ethereum di Bitcoin e non la risorsa originale sulla blockchain di Bitcoin. Per possedere BTC nativi, dovresti trasferire le tue risorse da Ethereum a Bitcoin utilizzando un ponte. Questo trasferirà i tuoi WBTC e li convertirà in BTC nativi. In alternativa, potresti possedere BTC e volerli utilizzare nei protocolli [DeFi](/glossary/#defi) di Ethereum. Ciò richiederebbe un trasferimento nella direzione opposta, da BTC a WBTC, che può poi essere utilizzato come risorsa su Ethereum. - Inoltre, puoi fare tutto quanto descritto sopra, usando una [borsa centralizzata](/get-eth/). Tuttavia, a meno che i tuoi fondi non siano già su una borsa, comporterebbe diversi passaggi, e sarebbe più conveniente usare un ponte. + Puoi anche fare tutto quanto sopra utilizzando un [exchange centralizzato](/get-eth). Tuttavia, a meno che i tuoi fondi non siano già su un exchange, ciò comporterebbe più passaggi e probabilmente ti converrebbe usare un ponte. -## Tipi di ponte {#types-of-bridge} +## Tipi di ponti {#types-of-bridge} -I ponti hanno molti tipi di design e complessità. In generale, i ponti rientrano in due categorie: fiduciari e non fiduciari. +I ponti hanno molti tipi di design e complessità. Generalmente, i ponti rientrano in due categorie: ponti trusted e ponti trustless. -| Ponti Fiduciari | Ponti Non Fiduciari | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| I ponti fiduciari dipendono da un'entità o sistema centrale per le loro operazioni. | I ponti non fiduciari operano usando i contratti intelligenti e gli algoritmi. | -| Presentano supposizioni di fiducia rispetto alla custodia dei fondi e la sicurezza del ponte. Principalmente, gli utenti, si affidano alla reputazione dell'operatore del ponte. | Sono non fiduciari, cioè, la sicurezza del ponte è la stessa della blockchain sottostante. | -| Gli utenti devono rinunciare al controllo delle loro cripto-risorse. | Tramite i [contratti intelligenti](/glossary/#smart-contract), i ponti privi di fiducia consentono agli utenti di mantenere il controllo sui propri fondi. | +| Ponti trusted | Ponti trustless | +| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| I ponti trusted dipendono da un'entità o da un sistema centrale per le loro operazioni. | I ponti trustless operano utilizzando contratti intelligenti e algoritmi. | +| Hanno presupposti di fiducia per quanto riguarda la custodia dei fondi e la sicurezza del ponte. Gli utenti si affidano principalmente alla reputazione dell'operatore del ponte. | Sono trustless, ovvero la sicurezza del ponte è la stessa della blockchain sottostante. | +| Gli utenti devono rinunciare al controllo delle proprie cripto-attività. | Attraverso i [contratti intelligenti](/glossary/#smart-contract), i ponti trustless consentono agli utenti di mantenere il controllo dei propri fondi. | -In pillole, possiamo dire che i ponti fiduciari hanno supposizioni di fiducia, mentre i ponti non fiduciari minimizzano la fiducia e non fanno supposizioni di fiducia oltre ai domini sottostanti. Ecco come si possono descrivere questi termini: +In breve, possiamo dire che i ponti trusted hanno presupposti di fiducia, mentre i ponti trustless riducono al minimo la fiducia e non creano nuovi presupposti di fiducia oltre a quelli dei domini sottostanti. Ecco come possono essere descritti questi termini: -- **Non Fiduciari**: aventi una sicurezza equivalente a quella dei domini sottostanti. Come descritto da [Arjun Bhuptani in questo articolo.](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) -- ** Supposizioni di fiducia:** allontanarsi dalla sicurezza dei domini sottostanti aggiungendo verifiche esterne nel sistema, dunque rendendolo meno sicuro cripto-economicamente. +- **Trustless**: avere una sicurezza equivalente a quella dei domini sottostanti. Come descritto da [Arjun Bhuptani in questo articolo.](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) +- **Presupposti di fiducia (Trust assumptions):** allontanarsi dalla sicurezza dei domini sottostanti aggiungendo verificatori esterni nel sistema, rendendolo così meno sicuro dal punto di vista criptoeconomico. -Per una migliore comprensione delle differenze chiave tra i due approcci, prendiamo un esempio: +Per sviluppare una migliore comprensione delle differenze chiave tra i due approcci, facciamo un esempio: -Immagina di essere al punto di controllo della sicurezza aeroportuale. Esistono due tipi di punti di controllo: +Immagina di essere al controllo di sicurezza dell'aeroporto. Ci sono due tipi di controlli: -1. Punti di Controllo Manuali: operati dagli agenti, che controllano manualmente tutti i dettagli del tuo biglietto e della tua identità prima di consegnarti il biglietto. -2. Controllo Automatico: operato da una macchina in cui inserisci i dettagli del tuo volo e da cui ricevi il biglietto se tutto corrisponde. +1. Controlli manuali: gestiti da funzionari che controllano manualmente tutti i dettagli del tuo biglietto e della tua identità prima di consegnarti la carta d'imbarco. +2. Check-in automatico: gestito da una macchina in cui inserisci i dettagli del tuo volo e ricevi la carta d'imbarco se tutto è in regola. -Un punto di controllo manuale è simile a un modello attendibile, poiché dipende da una terza parte, cioè gli agenti, per le sue operazioni. Da utente, ti affidi agli agenti affinché prendano le giuste decisioni e usino correttamente le tue informazioni private. +Un controllo manuale è simile a un modello trusted in quanto dipende da una terza parte, ovvero i funzionari, per le sue operazioni. Come utente, ti fidi che i funzionari prendano le decisioni giuste e utilizzino correttamente le tue informazioni private. -Il controllo automatico è simile a un modello non fiduciario, poiché rimuove il ruolo dell'operatore e sfrutta la tecnologia per le sue operazioni. Gli utenti hanno sempre il controllo dei propri dati e non devono affidare le proprie informazioni private a una terza parte. +Il check-in automatico è simile a un modello trustless in quanto rimuove il ruolo dell'operatore e utilizza la tecnologia per le sue operazioni. Gli utenti mantengono sempre il controllo dei propri dati e non devono affidare le proprie informazioni private a una terza parte. -Molte soluzioni di collegamento adottano modelli tra questi due estremi, con gradi di fiducia variabili. +Molte soluzioni di ponti adottano modelli intermedi tra questi due estremi con vari gradi di assenza di fiducia (trustlessness). -## Utilizzare i ponti {#use-bridge} +## Usare i ponti {#use-bridge} -L'utilizzo dei ponti ti consente di spostare le tue risorse tra blockchain differenti. Ecco alcune risorse che possono aiutarti a trovare e utilizzare i ponti: +L'utilizzo dei ponti ti consente di spostare le tue risorse tra diverse blockchain. Ecco alcune risorse che possono aiutarti a trovare e utilizzare i ponti: -- **[Riepilogo sui ponti di L2BEAT](https://l2beat.com/bridges/summary) e [Analisi sui rischi dei ponti di L2BEAT](https://l2beat.com/bridges/summary)**: Un riepilogo completo dei vari ponti, che include dettagli sulle quote di mercato, sul tipo di ponte e sulle catene di destinazione. Inoltre L2BEAT dispone di un'analisi sui rischi dei ponti che aiuta gli utenti a prendere decisioni informate durante la selezione di un ponte. -- **[Riepilogo sui ponti di DefiLlama](https://defillama.com/bridges/Ethereum)**: Un riepilogo sui volumi dei ponti sulle reti di Ethereum. +- **[Riepilogo dei ponti di L2BEAT](https://l2beat.com/bridges/summary) e [Analisi dei rischi dei ponti di L2BEAT](https://l2beat.com/bridges/summary)**: un riepilogo completo di vari ponti, inclusi i dettagli sulla quota di mercato, il tipo di ponte e le catene di destinazione. L2BEAT offre anche un'analisi dei rischi per i ponti, aiutando gli utenti a prendere decisioni informate nella scelta di un ponte. +- **[Riepilogo dei ponti di DefiLlama](https://defillama.com/bridges/Ethereum)**: un riepilogo dei volumi dei ponti attraverso le reti di Ethereum. -## Rischi nell'uso dei ponti {#bridge-risk} +## Rischi dell'uso dei ponti {#bridge-risk} -I ponti sono nelle prime fasi di sviluppo. È probabile che il design ottimale dei ponti non sia ancora stato scoperto. L'interazione con qualsiasi tipo di ponte comporta dei rischi: +I ponti sono nelle prime fasi di sviluppo. È probabile che il design ottimale del ponte non sia ancora stato scoperto. Interagire con qualsiasi tipo di ponte comporta dei rischi: -- **Rischi dei Contratti Intelligenti:** il rischio di un bug nel codice che causi la perdita dei fondi degli utenti -- **Rischio Tecnologico: **guasto del software, codice contenente bug, errore umano, spam e attacchi malevoli possono potenzialmente disturbare le operazioni degli utenti +- **Rischio del contratto intelligente:** il rischio di un bug nel codice che può causare la perdita dei fondi degli utenti +- **Rischio tecnologico:** guasti del software, codice con bug, errori umani, spam e attacchi dannosi possono potenzialmente interrompere le operazioni degli utenti -Inoltre, poiché i ponti fiduciari aggiungono supposizioni di fiducia, comportano ulteriori rischi, come: +Inoltre, poiché i ponti trusted aggiungono presupposti di fiducia, comportano rischi aggiuntivi come: -- **Rischio di Censura:** gli operatori del ponte possono teoricamente impedire agli utenti di trasferire le proprie risorse usando il ponte -- **Rischio di Custodia:** l'operatore del ponte potrebbe colludere nel furto dei fondi degli utenti +- **Rischio di censura:** gli operatori del ponte possono teoricamente impedire agli utenti di trasferire le proprie risorse utilizzando il ponte +- **Rischio di custodia:** gli operatori del ponte possono colludere per rubare i fondi degli utenti -I fondi degli utenti sono a rischio se: +I fondi dell'utente sono a rischio se: -- è presente un bug nel contratto intelligente +- c'è un bug nel contratto intelligente - l'utente commette un errore -- la blockchain sottostante è stata hackerata -- gli operatori del ponte hanno intenti dolosi in un ponte fiduciario -- il ponte viene hackerato +- la blockchain sottostante viene violata +- gli operatori del ponte hanno intenti malevoli in un ponte trusted +- il ponte viene violato -Una hack recente è quella del ponte del Wormhole di Solana, [in cui 120k di wETH ($325 milioni USD), sono stati rubati durante l'hack](https://rekt.news/wormhole-rekt/). Molte delle [hack principali nelle blockchain hanno coinvolto ponti](https://rekt.news/leaderboard/). +Una recente violazione è stata quella del ponte Wormhole di Solana, [dove sono stati rubati 120.000 wETH (325 milioni di dollari) durante l'attacco](https://rekt.news/wormhole-rekt/). Molte delle [principali violazioni nelle blockchain hanno coinvolto i ponti](https://rekt.news/leaderboard/). -I ponti sono fondamentali per accogliere gli utenti sui L2 di Ethereum e persino per gli utenti che desiderano esplorare diversi ecosistemi. Tuttavia, dati i rischi comportati dall'interazione coi ponti, gli utenti devono comprenderne i compromessi. Ecco alcune [strategie per la sicurezza tra le catene](https://blog.debridge.finance/10-strategies-for-cross-chain-security-8ed5f5879946). +I ponti sono fondamentali per l'inserimento degli utenti negli L2 di Ethereum e anche per gli utenti che desiderano esplorare ecosistemi diversi. Tuttavia, dati i rischi connessi all'interazione con i ponti, gli utenti devono comprendere i compromessi che i ponti stanno facendo. Queste sono alcune [strategie per la sicurezza cross-chain](https://debridge.com/learn/blog/10-strategies-for-cross-chain-security/). -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} -- [EIP-5164: Esecuzione Tra Catene](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) _18 giugno 2022 - Brendan Asselstine_ -- [Quadro dei rischi di L2Bridge](https://gov.l2beat.com/t/l2bridge-risk-framework/31) _5 luglio 2022 - Bartek Kiepuszewski_ -- ["Perché il futuro sarà multi-catena, ma non intra-catena."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) _8 gennaio 2022 - Vitalik Buterin_ +- [EIP-5164: Esecuzione cross-chain](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) - _18 giugno 2022 - Brendan Asselstine_ +- [Framework di rischio per L2Bridge](https://gov.l2beat.com/t/l2bridge-risk-framework/31) - _5 luglio 2022 - Bartek Kiepuszewski_ +- ["Perché il futuro sarà multi-chain, ma non cross-chain."](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - _8 gennaio 2022 - Vitalik Buterin_ +- [Sfruttare la sicurezza condivisa per un'interoperabilità cross-chain sicura: i comitati di stato di Lagrange e oltre](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - _12 giugno 2024 - Emmanuel Awosika_ +- [Lo stato delle soluzioni di interoperabilità dei rollup](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - _20 giugno 2024 - Alex Hook_ \ No newline at end of file diff --git a/public/content/translations/it/community/code-of-conduct/index.md b/public/content/translations/it/community/code-of-conduct/index.md index d3a05cb7b63..92d1de82cf2 100644 --- a/public/content/translations/it/community/code-of-conduct/index.md +++ b/public/content/translations/it/community/code-of-conduct/index.md @@ -1,6 +1,6 @@ --- title: Codice di condotta -description: Gli standard di base che ci impegniamo a rispettare negli spazi di ethereum.org. +description: Gli standard di base a cui aspiriamo in tutti gli spazi di ethereum.org. lang: it --- @@ -8,70 +8,70 @@ lang: it ## Missione {#mission} -Sviluppare e mantenere l'hub più completo ed accessibile di conoscenza Ethereum. +Sviluppare e mantenere il centro di conoscenza più completo e accessibile per Ethereum. ## Valori {#values} -La community di ethereum.org si impegna ad essere: +La community di ethereum.org si impegna a essere: -- istruttiva, con l'obiettivo di aiutare tutti a comprendere Ethereum +- educativa, con l'intento di aiutare tutti a comprendere Ethereum - inclusiva - accessibile -- basata sulla community -- incentrata sulla tecnologia sottostante e sui casi d'uso di Ethereum -- incentrata sui concetti e sui principi di progettazione di Ethereum +- guidata dalla community +- focalizzata sulla tecnologia sottostante e sui casi d'uso di Ethereum +- focalizzata sui concetti e sui principi di progettazione di Ethereum ## Cosa non siamo {#what-we-are-not} -- Il sito web di Ethereum Foundation -- Una piattaforma per promuovere investimenti o profitti di qualsiasi tipo -- Una piattaforma per valorizzare o appoggiare singoli progetti o organizzazioni -- Una DEX, CEX o qualsiasi altra forma di piattaforma finanziaria -- Una piattaforma che fornisce consulenza finanziaria o legale di qualsiasi tipo +- Il sito web della Ethereum Foundation +- Una piattaforma per promuovere investimenti o speculazioni di alcun tipo +- Una piattaforma per elevare o sostenere singoli progetti o organizzazioni +- Un DEX, un CEX o qualsiasi altra forma di piattaforma finanziaria +- Una piattaforma che fornisce consulenza finanziaria o legale di alcun tipo ## Codice di condotta {#code-of-conduct} ### Impegno {#pledge} -La partecipazione aperta è il cuore dell'etica di ethereum.org. Siamo un sito web e una community mantenuta da migliaia di collaboratori, e questo è possibile solo se manteniamo un ambiente accogliente e partecipativo. A tal fine, i collaboratori di questo sito si impegnano a mantenere un ambiente privo di vessazioni per tutti i partecipanti su tutte le piattaforme e gli spazi della community di ethereum.org. La community di ethereum.org accoglie e apprezza chiunque voglia partecipare in un modo costruttivo e amichevole, a prescindere da fattori come età, disabilità, etnia, caratteristiche sessuali, identità di genere, livello di esperienza, area di competenza, istruzione, stato socio-economico, nazionalità, aspetto personale, razza, religione o qualsiasi altra dimensione di diversità. +La partecipazione aperta è al centro dell'etica di ethereum.org. Siamo un sito web e una community mantenuti da migliaia di collaboratori, e questo è possibile solo se manteniamo un ambiente accogliente e partecipativo. A tal fine, i collaboratori di questo sito si impegnano a mantenere un ambiente privo di molestie per tutti i partecipanti su tutte le piattaforme e gli spazi della community di ethereum.org. La community di ethereum.org accoglie e valorizza chiunque voglia partecipare in modo costruttivo e amichevole, indipendentemente da età, disabilità, etnia, caratteristiche sessuali, identità di genere, livello di esperienza, area di competenza, istruzione, stato socio-economico, nazionalità, aspetto personale, razza, religione o qualsiasi altra dimensione della diversità. -### Ambito di applicazione {#scope} +### Ambito {#scope} -Questo Codice di condotta si applica a tutti gli spazi di ethereum.org (come GitHub, Discord, Figma, Crowdin, Twitter e altre piattaforme online) e si applica anche quando la community è rappresentata in spazi pubblici nel mondo reale come raduni, conferenze ed eventi. +Questo Codice di condotta si applica a tutti gli spazi di ethereum.org (come GitHub, Discord, Figma, Crowdin, X (precedentemente Twitter) e altre piattaforme online), e si applica anche quando la community è rappresentata in spazi pubblici del mondo reale come meetup, conferenze ed eventi. ### I nostri standard {#our-standards} -Esempi di comportamenti che contribuiscono a creare un ambiente positivo sono: +Esempi di comportamenti che contribuiscono a creare un ambiente positivo includono: -- Utilizzare un linguaggio accogliente e inclusivo +- Usare un linguaggio accogliente e inclusivo - Essere rispettosi dei diversi punti di vista e delle diverse esperienze -- Accettare con grazia e/o fornire con empatia critiche costruttive +- Accettare con garbo e/o fornire con empatia critiche costruttive - Agire con calma e professionalità nella risoluzione di conflitti o disaccordi - Mostrare empatia e tolleranza verso gli altri membri della community -- Incoraggiare e amplificare nuove voci nella community +- Incoraggiare e amplificare le nuove voci nella community -Esempi di comportamenti inaccettabili da parte dei partecipanti sono: +Esempi di comportamenti inaccettabili da parte dei partecipanti includono: -- Violenza fisica, minaccia di violenza fisica o incitamento alla violenza fisica di qualsiasi tipo -- Utilizzare un linguaggio o un immaginario sessualizzato o imporre attenzioni sessuali indesiderate -- Fingersi un'altra persona o dichiarare in altro modo disonesto l'affiliazione a una persona o a un'organizzazione -- Trolling, commenti offensivi/dispregiativi e attacchi personali o politici +- Violenza fisica, minaccia di violenza fisica o incoraggiamento alla violenza fisica di qualsiasi tipo +- Usare un linguaggio o immagini sessualizzate o imporre attenzioni sessuali indesiderate +- Impersonare un altro individuo o altrimenti rivendicare disonestamente l'affiliazione con qualche individuo o organizzazione +- Trolling, commenti offensivi/denigratori e attacchi personali o politici - Molestare altri membri della community in canali pubblici o privati -- Pubblicare informazioni private altrui, come un indirizzo fisico o elettronico, senza un'autorizzazione esplicita -- Ingegneria sociale, truffa o manipolazione di altri membri della comunity -- Promuovere investimenti, token, progetti o qualsiasi altra cosa per un guadagno personale monetario o non monetario +- Pubblicare informazioni private di altri, come un indirizzo fisico o elettronico, senza esplicito permesso +- Ingegneria sociale, truffe o altre manipolazioni di altri membri della community +- Promuovere investimenti, token, progetti o qualsiasi altra cosa per guadagno personale monetario o non monetario - Spammare i server con contenuti fuori tema - Ignorare le richieste o gli avvertimenti dei moderatori della community -- Altri comportamenti che potrebbero essere ragionevolmente considerati inappropriati in un contesto professionale +- Impegnarsi in altre condotte che potrebbero ragionevolmente essere considerate inappropriate in un ambiente professionale -### Segnalazione {#reporting} +### Segnalazioni {#reporting} -Le violazioni del codice di condotta saranno normalmente visibili alla community, poiché cerchiamo di fare tutto in canali aperti e pubblici, consentendo ai membri della community di autoregolarsi. +Le violazioni del codice di condotta saranno normalmente visibili alla community poiché cerchiamo di fare tutto in canali aperti e pubblici, consentendo ai membri della community di autoregolamentarsi. -Tuttavia, se si verifica qualcosa che si ritiene necessiti di attenzione, è possibile sollevare la questione con qualcuno che ha un ruolo di moderazione (ad es. una guida di Discord) in modo che possa aiutare a indagare e mettere in atto la risposta appropriata. +Tuttavia, se accade qualcosa che ritieni richieda attenzione, puoi segnalarlo a qualcuno che ha un ruolo di moderazione (ad es. una guida di Discord) in modo che possa aiutare a indagare ed eseguire la risposta appropriata. -Quando si segnala, includere il maggior numero di dettagli possibile, compresi esempi specifici e indicatori ora. Ciò contribuirà a garantire un risultato imparziale. +Al momento della segnalazione, includi quanti più dettagli possibili, inclusi esempi specifici e timestamp. Questo aiuterà a garantire un risultato equo. -### Conseguenze {#enforcement} +### Applicazione {#enforcement} -A seconda della gravità, le persone che violano il codice di condotta possono ricevere avvertimenti, o essere banditi in modo temporaneo o permanente dalle community di ethereum.org. +A seconda della gravità, le persone che violano il codice di condotta possono ricevere avvertimenti, ban temporanei o ban permanenti dalle community di ethereum.org. \ No newline at end of file diff --git a/public/content/translations/it/community/events/organizing/index.md b/public/content/translations/it/community/events/organizing/index.md new file mode 100644 index 00000000000..adda7695207 --- /dev/null +++ b/public/content/translations/it/community/events/organizing/index.md @@ -0,0 +1,220 @@ +--- +title: Organizzare un evento di Ethereum +description: Come organizzare un evento di Ethereum +lang: it +hideEditButton: true +--- + +# Come organizzare un evento di Ethereum {#how-to-organize-an-ethereum-event} + +Costruire una comunità forte e vivace è al centro della crescita dell'ecosistema di Ethereum. Che tu stia pianificando di organizzare meetup, workshop o una conferenza su larga scala, il successo del tuo evento dipende dalle connessioni e dal coinvolgimento all'interno della tua rete locale. Questa guida ti aiuterà a gettare le basi per una comunità di Ethereum attiva e ti guiderà passo dopo passo attraverso il processo di organizzazione di una conferenza memorabile e di grande impatto. + +## Chiediti: esiste una comunità di Ethereum? {#ask-yourself-is-there-an-ethereum-community} + +Una conferenza di Ethereum di successo si basa su una comunità attiva e coinvolta. Se ne hai già una, sei in vantaggio, ma se non ce l'hai, il passo preliminare essenziale è costruire quelle fondamenta. È importante distinguere tra una scena e una comunità: una scena potrebbe includere aziende e individui presenti in una determinata area, ma spesso operano in modo indipendente con solo occasionali iniziative congiunte, come l'ecosistema web2 tradizionale in molti luoghi. Una comunità, d'altra parte, è una rete di persone e organizzazioni interconnesse che collaborano e si supportano a vicenda, cosa che si vede spesso negli ecosistemi web3. + +**I tuoi primi passi dovrebbero essere:** + +- Esplorare le startup e le aziende locali: avere aziende forti e attive nella tua città o nel tuo paese è spesso il prerequisito più critico per costruire una comunità. +- Controllare se ci sono già dei meetup: [pagina degli eventi](https://ethereum.org/community/events/) di ethereum.org +- [Il sito web ethereum.org](https://ethereum.org/community/events/) e il Discord di ethereum.org: per verificare se ci sono eventi, sviluppatori e contributori locali di Ethereum. +- Luma e Meetup.com: per vedere se ci sono eventi legati a Ethereum o eventi web3 più ampi nella tua zona. +- X: prova a trovare sostenitori o influencer locali nel settore. + +Se trovi la maggior parte di questi elementi, è un forte segnale che esistono le condizioni per costruire una comunità, ma non necessariamente che una comunità sia già in atto. Il passo successivo è il lavoro cruciale di organizzare, coinvolgere e coltivare questi attori, creando opportunità di collaborazione e crescita a lungo termine. + +### Se no, come costruirla {#if-not-how-to-build-it} + +Se ti rendi conto che molti di questi elementi mancano, non preoccuparti: costruire una comunità da zero è un processo impegnativo ma profondamente gratificante. Una forte comunità di Ethereum non appare dall'oggi al domani; richiede pazienza, coerenza e una visione chiara. Ecco come puoi iniziare: + +- **Crea un canale di comunicazione**: potrebbe essere Telegram, Signal, WhatsApp, WeChat o un server Discord, qualunque sia il più popolare dove ti trovi, in modo che le persone possano connettersi, fare domande e condividere risorse. +- **Trova i tuoi primi adottanti.** Identifica alcune persone appassionate di Ethereum e Web3. Diventeranno i tuoi principali sostenitori e collaboratori. +- **Ospita eventi piccoli e costanti.** Inizia con meetup informali, gruppi di studio o workshop. La coerenza è fondamentale: anche se il gruppo è piccolo all'inizio, gli eventi regolari creano fiducia e slancio. +- **Prova a contattare aziende locali**, istituzioni educative o spazi di coworking per fornirti uno spazio gratuitamente. Se non riesci a trovare relatori dal tuo paese, invita relatori online ma riunisci le persone fisicamente. È fondamentale mantenere il tuo pubblico fisicamente presente in un unico luogo. +- **Collabora con le comunità tecnologiche esistenti.** Se ci sono gruppi di sviluppatori, ecosistemi di startup o meetup sulla blockchain già stabiliti, collabora con loro per introdurre argomenti su Ethereum ed espandere la tua portata. +- **Condividi contenuti educativi** sul potenziale di Ethereum. +- **Contatta le comunità globali.** Connettiti con gruppi e progetti di Ethereum consolidati in tutto il mondo per supporto, tutoraggio e potenziali collaborazioni. Le comunità di Ethereum in tutto il mondo hanno almeno una cosa in comune: sono tutte ansiose di aiutare. +- **Cerca di ottenere finanziamenti**: sia da aziende web3 locali che attraverso alcuni programmi di sovvenzione come [ESP](https://esp.ethereum.foundation/). + +### Se sì, come mantenerla e farla crescere {#if-yes-how-to-maintain-and-grow-it} + +Una volta che hai una comunità consolidata, il lavoro non si ferma: in realtà, è appena iniziato. Mantenere una comunità attiva, coinvolta e in crescita richiede uno sforzo e una creatività continui. Uno degli elementi chiave per mantenere la comunità coinvolta è che dovresti sperimentare costantemente nuovi formati e idee. + +Ecco alcune strategie per mantenere una vivace comunità di Ethereum: + +- **Diversifica i formati dei tuoi eventi:** non limitarti a un solo tipo di incontro. Varia con meetup, brevi hackathon, tavole rotonde ed eventi di networking. Puoi provare a organizzare giornate di co-working o corsi educativi. +- **Diversifica gli argomenti:** Ethereum non è solo una tecnologia; è anche un insieme di valori che coinvolge aspetti legali, di marketing e di business. +- **Chiedi alla tua comunità** feedback e idee. +- **Coinvolgi diversi segmenti di pubblico**. Adatta i contenuti e gli eventi a diversi livelli di esperienza: dai principianti che esplorano Ethereum per la prima volta agli sviluppatori e imprenditori esperti. + +Fornendo diverse opportunità di apprendimento, collaborazione e crescita, ti assicuri che la tua comunità rimanga attiva e pronta per iniziative più grandi come l'organizzazione di una conferenza. + +## Evento {#event} + +### Qual è il momento giusto per organizzare un evento? {#when-is-the-right-time-to-organize-an-event} + +Organizzare una conferenza di Ethereum o un evento della comunità di successo richiede tempistiche e considerazioni attente. Il momento giusto dipende da una varietà di fattori che contribuiscono al successo complessivo dell'evento. + +Dovresti prendere in considerazione la maturità della comunità, le condizioni di mercato, se hai un team e se c'è una scena locale (ad es. potenziali sponsor). + +### KYC — Conosci la tua comunità {#kyc-know-your-community} + +Uno dei passaggi più cruciali nell'organizzazione di un evento è comprendere la tua comunità. Proprio come il Know Your Customer (KYC) nei servizi finanziari, Know Your Community (KYC) significa prendersi il tempo per comprendere le esigenze, le preferenze e le caratteristiche specifiche del tuo pubblico locale. Questa comprensione ti aiuterà a personalizzare la conferenza per garantirne il successo e la pertinenza. + +È allettante puntare subito a un evento su larga scala, ma iniziare in piccolo è spesso l'approccio migliore. Saprai qual è la soluzione migliore per te se guardi oggettivamente allo stato della tua comunità e ad alcuni altri aspetti che potrebbero sembrarti irrilevanti, come ad esempio: il tuo paese è una destinazione turistica popolare o il costo dell'alloggio. + +Nel primo anno, la maggior parte del tuo pubblico sarà una comunità locale, quindi tutto ciò che fai per il primo anno organizzando un evento più grande dovrebbe soddisfare le esigenze e le dimensioni di quella comunità. + +### Da dove iniziare {#where-to-start} + +Quando si tratta di organizzare una conferenza, i primi passi possono sembrare opprimenti. Ma con un piano e una struttura chiari, puoi suddividere il processo in compiti gestibili. Li analizzeremo uno per uno. + +Iniziare con un approccio strutturato ti aiuterà a rimanere organizzato e a ridurre lo stress mentre attraversi le varie fasi dell'organizzazione del tuo evento. Ogni decisione che prendi dovrebbe avvicinarti a offrire un'esperienza che soddisfi le esigenze della tua comunità. + +**La prima cosa è costruire un team organizzativo con ruoli e responsabilità chiari.** + +Un altro passo importante prima di iniziare a costruire un programma o contattare gli sponsor è scegliere una data. Sebbene sembri un passo facile, ci sono alcuni fattori importanti che dovresti considerare in anticipo. Alcuni di questi sono: + +- **Evitare date in conflitto con le principali conferenze** o eventi +- **Considerare le condizioni e le circostanze locali** (come la stagione dell'anno, le festività principali, ecc.) +- **Prendere in considerazione le condizioni di mercato** +- **Darti abbastanza tempo per organizzare tutto**: almeno nove mesi + +### Come formare un team {#how-to-assemble-a-team} + +Scegli persone che condividono la tua visione e completano le tue competenze. Alcuni team lavorano come collettivi, mentre altri hanno ruoli definiti: trova ciò che funziona meglio per te. Una comunicazione regolare e aspettative chiare sono essenziali. Sebbene sia allettante fare affidamento su piattaforme di comunicazione per la pianificazione degli eventi, suggeriamo di scegliere una piattaforma di gestione delle attività (come Notion, Basecamp, Trello, Asana o persino i vecchi e cari Fogli Google) per organizzare e monitorare ciò che deve essere fatto. È fondamentale avere un team ben funzionante e ben organizzato. + +I diversi team di organizzatori di Ethereum hanno ruoli diversi al loro interno, ma hanno tutti in comune persone che lavorano su logistica, budget, marketing, programma, design e partnership. + +### Il programma: un elemento chiave di un evento di successo {#the-program-a-key-element-of-a-successful-event} + +Quando si tratta di organizzare una conferenza veramente preziosa e memorabile, **il programma è tutto**. Questa non è un'area in cui puoi permetterti di scendere a compromessi. Sebbene gli sponsor siano importanti e spesso cruciali per finanziare l'evento, l'esperienza del pubblico e il valore che riceve devono sempre avere la precedenza. Un programma sovraccarico di contenuti promozionali e infinite presentazioni degli sponsor allontanerà i tuoi partecipanti e minerà la credibilità del tuo evento. + +Ogni sessione, panel e workshop dovrebbe informare, ispirare e coinvolgere la comunità. Ascolta il tuo pubblico: comprendi i suoi interessi, le sue esigenze e le sue sfide. Quali argomenti risuonano con loro? Allo stesso tempo, introduci nuove prospettive e formati innovativi per mantenere il programma dinamico. Bilancia argomenti familiari e di tendenza con idee all'avanguardia, garantendo un'agenda a tutto tondo che copra diversi aspetti dell'ecosistema di Ethereum: dagli approfondimenti tecnici e le sessioni di costruzione della comunità alle discussioni sulle politiche e ai workshop pratici. Inoltre, considera la lingua della conferenza: sebbene l'inglese sia l'impostazione predefinita nella maggior parte degli eventi di Ethereum, offrire sessioni nella lingua locale può rendere l'evento più accessibile agli sviluppatori e agli appassionati regionali. + +**Quando selezioni i relatori, apri il bando almeno sei mesi prima della conferenza per attirare candidature di alta qualità e concedere tempo sufficiente per la cura dell'agenda.** La persona responsabile della selezione dei relatori dovrebbe avere un'esperienza significativa nel settore e una profonda comprensione dell'ecosistema. Ciò garantisce che possano identificare contributi preziosi e perspicaci e mantenere un elevato standard di contenuti. + +### Dove trovare supporto finanziario {#where-to-find-financial-support} + +L'organizzazione di una conferenza di alta qualità comporta costi significativi: affitto della sede, materiale promozionale, cibo e bevande, produzione e innumerevoli altre spese. Assicurarsi un supporto finanziario fin dall'inizio è essenziale per garantire che il tuo evento soddisfi gli standard professionali e offra un'ottima esperienza ai tuoi partecipanti. + +#### Come creare una presentazione per le sponsorizzazioni? {#how-to-create-a-sponsorship-deck} + +Innanzitutto, avrai bisogno di una presentazione (deck). **Chiedi consiglio ad altri organizzatori di conferenze**, persino di condividere le loro presentazioni in modo da poter creare i tuoi pacchetti in base a quelle. Dovresti essere realistico quando si tratta di prezzare i pacchetti e mirare a coprire i costi, non a guadagnare denaro, specialmente all'inizio. + +**Ogni presentazione per le sponsorizzazioni dovrebbe fornire una panoramica chiara e convincente dell'evento**, assicurando che i potenziali sponsor ne comprendano la portata, il focus e il valore. Inizia con i fondamenti (sede, data e dettagli sul team organizzativo) per stabilire credibilità. Quindi, evidenzia il focus principale dell'evento, poiché le diverse conferenze di Ethereum si rivolgono a pubblici diversi. Alcune sono fortemente orientate ai costruttori, con profonde discussioni tecniche, mentre altre potrebbero concentrarsi maggiormente su DeFi, DAO o argomenti politici. + +Oltre a descrivere semplicemente l'evento, stabilisci aspettative chiare. **Delinea il numero previsto di partecipanti e gli eventuali relatori chiave già confermati**, poiché questo aiuta gli sponsor a valutare la loro potenziale portata. Ancora più importante, definisci chiaramente cosa riceveranno in cambio della loro sponsorizzazione: spazio per lo stand, opportunità di parlare, promozione sui social media, visibilità del marchio o accesso esclusivo al networking. Una presentazione ben strutturata non solo informa, ma entusiasma anche i potenziali sponsor sull'opportunità di far parte del tuo evento. + +#### Chi potrebbe supportare il tuo evento? {#who-might-support-your-event} + +Inizia contattando le aziende all'interno di Ethereum e del più ampio ecosistema tecnologico nella tua città o nel tuo paese. Queste **organizzazioni hanno spesso un interesse acquisito nel supportare eventi locali** che promuovono la crescita della comunità e l'innovazione. È anche più probabile che riconoscano il valore dell'investimento nell'ecosistema locale e vedano la tua conferenza come un'opportunità per connettersi con talenti, partner e utenti. + +Una volta che hai attinto al supporto locale, espandi la tua portata agli attori globali nello spazio web3. **Protocolli consolidati, DAO e fondi dell'ecosistema spesso assegnano budget per eventi guidati dalla comunità**. Questo può essere un po' impegnativo per gli organizzatori alle prime armi, poiché non hanno ancora costruito un track record da mostrare, ma cerca di creare un pacchetto di sponsorizzazione convincente che delinei chiaramente i vantaggi di supportare il tuo evento: visibilità del marchio, opportunità di parlare e un coinvolgimento significativo con un pubblico mirato. Cerca di trovare il tuo valore unico che altri potrebbero non avere. + +#### Forme alternative di finanziamento del tuo evento {#alternative-forms-of-funding-your-event} + +Le sovvenzioni sono un'altra potenziale fonte di finanziamento che molti organizzatori trascurano. Esistono programmi come l'[Ecosystem Support Program](https://esp.ethereum.foundation/) (ESP) della Ethereum Foundation e [altre iniziative di sovvenzione](https://ethereum.org/community/grants/#ethereum-grants) per supportare gli eventi guidati dalla comunità. + +Oltre alle sponsorizzazioni finanziarie, considera le partnership in natura, specialmente per cibo e bevande. I marchi che si allineano con la cultura locale o la comunità tecnologica possono essere ottimi partner per il tuo evento. Marchi di caffè, aziende di bevande o persino pizzerie locali potrebbero essere disposti a fornire prodotti in cambio di visibilità all'evento. Queste collaborazioni possono aiutare a ridurre i costi migliorando al contempo l'esperienza dei partecipanti. + +Dato che stiamo parlando di finanze, ricorda questo: ogni dollaro che investi nella creazione di un'esperienza eccezionale per i partecipanti ripagherà in modo esponenziale. Produzione di alta qualità, sedi confortevoli, gadget pensati con cura ed eventi collaterali ben organizzati contribuiscono a un'esperienza memorabile di cui i partecipanti parleranno molto tempo dopo la fine della conferenza. I partecipanti felici diventano i tuoi più grandi sostenitori e garantiscono il successo a lungo termine del tuo evento. + +### Logistica {#logistics} + +Parallelamente all'ottenimento dei finanziamenti, il tuo focus principale dovrebbe essere la logistica. Una conferenza ben organizzata richiede una pianificazione meticolosa in più aree, dall'allestimento della sede all'esperienza dei partecipanti. Avere qualcuno con una solida esperienza nell'organizzazione di eventi (non necessariamente eventi web3, ma eventi in generale) può fare un'enorme differenza. Un responsabile della logistica esperto può prevedere potenziali problemi e risolverli prima che diventino tali, risparmiando tempo, denaro e stress. + +Una persona responsabile della logistica dovrebbe scegliere una sede, una società di produzione e diversi fornitori per cibo, bevande e merchandising, nonché un sistema di biglietteria online facile da usare che consenta ai partecipanti di registrarsi e pagare anche in criptovaluta. + +### Infrastruttura della location {#location-infrastructure} + +Quando scegli una location per la tua conferenza, è importante pensare oltre la sede stessa e considerare l'infrastruttura più ampia della città e del paese. Fattori come il clima, la mobilità, la sicurezza e l'ambiente politico giocano un ruolo enorme nel plasmare l'esperienza dei partecipanti. + +Per le location meno conosciute, questo diventa particolarmente cruciale. I partecipanti e gli sponsor di tutto il mondo devono sentirsi sicuri di poter viaggiare facilmente e in sicurezza. Esamina aspetti come i collegamenti aeroportuali, i trasporti pubblici e le opzioni di alloggio. È anche saggio considerare il clima culturale e politico della regione per evitare complicazioni che potrebbero scoraggiare i partecipanti internazionali, come la politica dei visti. + +### Come promuovere l'evento {#how-to-promote-the-event} + +Promuovere il tuo evento in modo efficace è fondamentale per attirare il pubblico giusto e creare entusiasmo. Una strategia di promozione ben ponderata garantisce che la tua conferenza ottenga la visibilità e il coinvolgimento che merita. Anche il design gioca un ruolo importante nel tuo marchio, quindi dovresti assolutamente prevedere un budget anche per quello. + +#### Social media {#social-media} + +X.com sarà la spina dorsale della tua promozione sui social media. Cerca di essere attivo e coerente con le pubblicazioni lì, ma partecipa anche a diverse conversazioni, sia con il tuo account personale che con l'account della tua organizzazione. + +Sebbene LinkedIn non sembri la scelta più ovvia per la promozione, lì puoi raggiungere un pubblico completamente diverso, o persino alcuni sponsor. + +#### Partnership con altre comunità di Ethereum {#partnerships-with-other-ethereum-communities} + +Le partnership con diversi organizzatori di Ethereum possono aiutare ad amplificare la tua portata attingendo alle reti esistenti, specialmente quando parti da zero. Offri sconti per la comunità, fai promozione incrociata con altri eventi e invita i partner a co-ospitare eventi collaterali o workshop. + +#### Sensibilizzazione universitaria {#university-outreach} + +Contatta le facoltà tecniche ed economiche della città attraverso i club studenteschi o i professori per promuovere l'evento. Il coinvolgimento con le università può aiutare ad attrarre giovani talenti, ricercatori e futuri professionisti del settore, favorendo una connessione più forte tra il mondo accademico e l'ecosistema di Ethereum. Questo è particolarmente fantastico se stai organizzando un hackathon, poiché gli studenti spesso portano idee fresche, entusiasmo e una solida base tecnica. + +#### Media {#media} + +Contatta i media e le newsletter incentrati sul web3 per la copertura dell'evento. Sebbene i media Web3 si aspettino di essere pagati per i loro articoli di PR, puoi offrire loro biglietti gratuiti o interviste con alcuni relatori e sponsor di alto profilo se non hai un budget per la promozione a pagamento. Crea un pacchetto PR con un comunicato stampa e alcune immagini pronte per la promozione sui social media o su un sito web in diversi formati. Inoltre, amplia il raggio d'azione ai giornalisti locali o persino ai creatori di contenuti (purché abbiano una reputazione decente) che possono occuparsi di tecnologia, poiché ciò può essere cruciale per mostrare l'evento a un pubblico più ampio. Questo aiuta a colmare il divario tra l'industria delle criptovalute e il pubblico più ampio, attirando l'interesse delle principali comunità tecnologiche e aziendali. + +### Dovresti organizzare anche un hackathon? {#should-you-organize-a-hackathon-as-well} + +Organizzare un hackathon può essere vantaggioso perché gli hackathon possono essere un ottimo modo per coinvolgere la comunità degli sviluppatori e promuovere l'innovazione. Fornisce inoltre opportunità pratiche per collaborare e costruire progetti, il che potrebbe portare a risultati tangibili per l'ecosistema. Gli hackathon attraggono sviluppatori che di solito non partecipano alle conferenze ma sono appassionati della sfida di costruire e testare nuove idee. Se la tua conferenza è rivolta agli sviluppatori, all'innovazione e ai progetti pratici, ospitare un hackathon è una scelta naturale. + +Ma, prima di organizzarne uno, considera se hai abbastanza risorse e tempo. **Un hackathon richiede risorse significative in termini di tempo, forza lavoro e investimenti finanziari**. Assicurati di avere un team dedicato per gestirlo, specialmente se stai gestendo anche una conferenza. Inoltre, controlla se c'è interesse nella tua comunità. Se la tua comunità è più orientata ai costruttori, allora probabilmente ha senso organizzarlo. + +Sebbene ci siano molti vantaggi nell'organizzarlo, tieni in considerazione che, a seconda delle dimensioni della conferenza, aggiungere un hackathon potrebbe essere opprimente. Dovresti valutare se gestire entrambi diluirà la qualità dell'uno o dell'altro. Puoi optare per un hackathon più piccolo e mirato o scaglionare gli eventi in mesi diversi. + +### Sfide (quasi inevitabili) che dovrai affrontare {#almost-inevitable-challenges-that-you-will-face} + +Una delle sfide più grandi quando si organizza una conferenza, specialmente nello spazio di Ethereum, è assicurarsi fondi sufficienti. **Molti organizzatori di eventi faticano a raccogliere il capitale necessario per coprire i costi della sede**, il catering e altre spese logistiche. La sponsorizzazione è spesso essenziale, ma costruire relazioni e convincere le aziende a investire nel tuo evento può richiedere tempo. Inoltre, la difficoltà di attrarre sponsor può aumentare durante le flessioni del mercato, poiché le aziende potrebbero essere meno disposte a investire in attività non fondamentali. + +Gestire il budget in modo efficace è fondamentale. **Spese impreviste**, come cambiamenti di sede dell'ultimo minuto e requisiti tecnologici aggiuntivi per l'evento, possono far saltare rapidamente il tuo budget. + +Per i nuovi eventi, **ottenere relatori di alta qualità può essere particolarmente difficile**. Leader di pensiero affermati o influencer nello spazio di Ethereum potrebbero avere già agende piene e potrebbero essere riluttanti a impegnarsi in un nuovo evento senza un track record comprovato. Preparati a dedicare tempo al networking e a contattare potenziali relatori molto prima dell'evento. + +Inoltre, quando si tratta di relatori, mantieni una comunicazione chiara e costante con loro: stabilisci la scadenza per l'invio delle presentazioni ed evita qualsiasi cambiamento dell'ultimo minuto. + +Una conferenza di successo richiede un team dedicato in grado di gestire logistica, marketing, sponsorizzazioni, supporto tecnico e gestione dei partecipanti. Trovare persone con esperienza nell'organizzazione di eventi tecnologici può essere impegnativo, specialmente se lavori con un budget limitato o, nella maggior parte dei casi, senza budget, ma su base volontaria. + +### Non dovresti farlo da solo. Hai bisogno di volontari. {#you-shouldnt-do-it-alone-you-need-volunteers} + +L'organizzazione di un evento di Ethereum richiede un team eterogeneo e dedicato per gestire la logistica, le registrazioni, il coordinamento dei relatori, il supporto ai partecipanti e molto altro. Con team che vanno da sole 3 a 15 persone, diventa chiaro che i volontari sono essenziali per il regolare svolgimento dell'evento. + +I volontari sono spesso la spina dorsale di molte conferenze, fornendo un supporto critico, specialmente quando si lavora con un budget limitato. Possono gestire tutto, dal presidio dei banchi di registrazione all'assistenza nell'allestimento dell'evento, assicurandosi che l'evento si svolga nel modo più fluido possibile. + +Sebbene sia impegnativo offrire un compenso monetario ai volontari, è essenziale fornire loro qualcosa di valore che renda la loro esperienza utile. Considera di offrire loro opportunità di networking, sviluppo di competenze, alcuni vantaggi esclusivi, certificati o lettere di raccomandazione. + +### Elementi essenziali di conformità per gli organizzatori di eventi {#compliance-essentials-for-event-organizers} + +Quando si organizza un evento, ci sono diverse considerazioni legali e logistiche essenziali da tenere a mente: + +- **Accordo di sponsorizzazione** – Assicurati di avere un contratto chiaro per gli sponsor, inclusa una politica di cancellazione ben definita. +- **Codice di condotta** – Prepara un Codice di Condotta su misura per il tipo di evento specifico (conferenza/hackathon, hacker house, ecc.). +- **Informativa sulla privacy** – Redigi un'informativa sulla privacy per il tuo sito web per conformarti alle normative sulla protezione dei dati e delle immagini +- **Notifica alle autorità locali** – Anche se il tuo evento è un incontro chiuso, è consigliabile segnalarlo alla stazione di polizia locale. +- **Accordo di biglietteria** – Stabilisci un accordo formale con il tuo fornitore di servizi di biglietteria per chiarire termini e responsabilità. +- **Conformità normativa** – Verifica in anticipo se il paese in cui stai ospitando la conferenza ha normative o restrizioni specifiche per l'industria delle criptovalute +- **Sdoganamento per la merce** – Se stai importando merce degli sponsor, si consiglia di assumere un agente doganale per gestire il processo in modo efficiente. +- **Politica su fotografia e media** – Definisci chiaramente le linee guida sulla fotografia e sulla copertura mediatica, assicurandoti che i partecipanti siano informati sul consenso e sulle opzioni di rinuncia (opt-out). + +## Dopo l'evento: e adesso? {#after-the-event-whats-next} + +Dopo la conclusione dell'evento, è fondamentale raccogliere feedback da partecipanti, relatori e sponsor e creare un rapporto interno in modo da poter essere meglio preparati per gli eventi futuri. Questo aiuta a identificare cosa è andato bene e dove è possibile apportare miglioramenti. Usa sondaggi o interviste individuali per raccogliere preziose informazioni che guideranno le iterazioni future. Prenditi il tempo per rivedere eventuali errori o aree di inefficienza, poiché possono essere evitati nella prossima conferenza, rendendo il processo più fluido. + +La chiave è mantenere vivo lo slancio. Continua a interagire con la tua comunità, condividi aggiornamenti sui progressi che stai facendo in base al loro feedback e crea entusiasmo per il prossimo evento. Mantenendo questa connessione, ti assicuri che l'impatto della conferenza si estenda oltre l'evento stesso, rafforzando le relazioni e ponendo le basi per il successo futuro. + +## Riconoscimenti {#acknowledgement} + +Un grande ringraziamento a tutti coloro che hanno contribuito a questo articolo condividendo le loro intuizioni: Slavo Fabisik di ETHBratislava; Lola di ETH Kipu ed ETH Latam; Tanja Mladenovic di ETH Belgrade, Juan David di Ethereum Bogota; Monika Zając di ETHWarsaw; Raffaele Orefice di NapulETH; Xiao Wu(Ling) di ETH Riyadh; Marco di urbe.eth; Caolán Walsh di ETH Dublin; Alex Males di ETHCluj; e Stanko Devic di ETH Slovenia. + +## Risorse {#resources} + +Podcast: Come organizzare e promuovere un evento ETH dalla A alla Z: + +- [Il caso di studio di ETHWarsaw, di Out of Ordinary](https://www.youtube.com/watch?v=io2Dx1ouz8o) + +Spazio Twitter: + +- [AMA della comunità di ETH](https://x.com/NapulETH/status/1905732699094151623) + +Articoli: + +- [Costruire ETHKL, di Danny H.](https://sekto.tech/ethkl24) \ No newline at end of file diff --git a/public/content/translations/it/community/get-involved/index.md b/public/content/translations/it/community/get-involved/index.md index fd91293b5a6..9c1e43b53b4 100644 --- a/public/content/translations/it/community/get-involved/index.md +++ b/public/content/translations/it/community/get-involved/index.md @@ -1,70 +1,70 @@ --- title: Come posso partecipare? -description: Come partecipare alla community Ethereum. +description: Come partecipare alla community di Ethereum. lang: it --- # Come posso partecipare? {#get-involved} -La community di Ethereum include le persone con diverse esperienze e serie di competenze. Che tu sia uno sviluppatore, un artista o un contabile, ci sono molti modi per partecipare. Ecco un elenco di suggerimenti che potrebbero aiutarti ad iniziare. +La community di Ethereum include persone con molti background e competenze diverse. Che tu sia uno sviluppatore, un artista o un contabile, ci sono modi per partecipare. Ecco un elenco di suggerimenti che potrebbero aiutarti a iniziare. Inizia leggendo la missione e i valori di ethereum.org nel nostro [codice di condotta](/community/code-of-conduct). ## Sviluppatori ‍ {#developers} - Scopri e prova Ethereum su [ethereum.org/developers/](/developers/) -- Partecipa ad un Hackathon vicino a te! -- Dai un'occhiata a [progetti relativi alla tua area di competenza o a linguaggi di programmazione di tua scelta](/developers/docs/programming-languages/) -- Guarda o partecipa alle [chiamate del Livello di Consenso e del Livello d'Esecuzione](https://www.youtube.com/@EthereumProtocol/streams) -- [Lista del programma di supporto degli ecosistemi](https://esp.ethereum.foundation/wishlist/) - strumenti, documentazione, e infrastrutture dove il programma di supporto per l'ecosistema Ethereum è attivamente alla ricerca di domande di sovvenzione -- [Web3Bridge](https://www.web3bridge.com/) - unisciti alla community di aspiranti web3 nella loro iniziativa per identificare, formare e supportare centinaia di sviluppatori e membri della community in tutta l'Africa -- Unisciti al [Discord Eth R&D](https://discord.com/invite/VmG7Uxc) -- Unisciti al [Discord di Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) - -## Ricercatori & Accademici {#researchers-and-academics} - -Hai conoscenze di matematica, crittografia o economia? Potresti essere interessato ad alcuni dei lavori all'avanguardia svolti all'interno dell'ecosistema di Ethereum: - -- Unisciti al [Discord Eth R&D](https://discord.com/invite/VmG7Uxc) -- Scrivi o revisiona una proposta di miglioramento di Ethereum (EIP) - - Scrivi una EIP - 1. Manda la tua idea su [Ethereum Magicians](https://ethereum-magicians.org) - 2. Leggi [EIP-1](https://eips.ethereum.org/EIPS/eip-1) - **Sì, questo è _l'intero_ documento.** - 3. Segui le indicazioni nella EIP-1. Fai riferimento a questo documento mentre scrivi la tua bozza. - - Scopri come diventare un [editor di EIP](https://eips.ethereum.org/EIPS/eip-5069) - - Puoi effettuare la revisione delle EIP dei colleghi proprio ora! Vedi [le PR aperte con l'etichetta `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Fornisci un feedback tecnico al collegamento `discussion-to`. - - Partecipa alla [Governance EIP](https://github.com/ethereum-cat-herders/EIPIP) - - Unisciti al [Discord di Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) +- Partecipa a un hackathon di [ETHGlobal](http://ethglobal.co/) vicino a te! +- Dai un'occhiata ai [progetti relativi alla tua area di competenza o al tuo linguaggio di programmazione preferito](/developers/docs/programming-languages/) +- Guarda o partecipa alle [chiamate del livello di consenso e di esecuzione](https://www.youtube.com/@EthereumProtocol/streams) +- [Lista dei desideri dell'Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/): aree di strumenti, documentazione e infrastruttura in cui l'Ecosystem Support Program di Ethereum è attivamente alla ricerca di candidature per sovvenzioni +- [Web3Bridge](https://www.web3bridgeafrica.com): unisciti all'aspirante community del web3 nella loro iniziativa per identificare, formare e supportare centinaia di sviluppatori e membri della community in tutta l'Africa +- Unisciti al [Discord di Eth R&D](https://discord.com/invite/VmG7Uxc) +- Unisciti al [Discord degli Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) + +## Ricercatori e Accademici ‍ {#researchers-and-academics} + +Hai un background in matematica, crittografia o economia? Potresti essere interessato ad alcuni dei lavori all'avanguardia svolti all'interno dell'ecosistema di Ethereum: + +- Unisciti al [Discord di Eth R&D](https://discord.com/invite/VmG7Uxc) +- Scrivi o revisiona una proposta di miglioramento di ethereum + - Scrivi un'EIP + 1. Invia la tua idea su [Ethereum Magicians](https://ethereum-magicians.org) + 2. Leggi l'[EIP-1](https://eips.ethereum.org/EIPS/eip-1): **Sì, è l'_intero_ documento.** + 3. Segui le indicazioni nell'EIP-1. Fai riferimento ad esso mentre scrivi la tua bozza. + - Scopri come diventare un [Editor di EIP](https://eips.ethereum.org/EIPS/eip-5069) + - Puoi fare la revisione paritaria delle EIP fin da ora! Vedi le [PR aperte con il tag `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Fornisci feedback tecnico sul link `discussion-to`. + - Partecipa alla [Governance delle EIP](https://github.com/ethereum-cat-herders/EIPIP) + - Unisciti al [Discord degli Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) - [Maggiori informazioni sulle EIP](/eips/) -- [Challenges.ethereum.org](https://challenges.ethereum.org/) - una serie di premi di ricerca di alto valore dove puoi guadagnare fino a >$100.000 USD -- [Ethresearch.ch](https://ethresear.ch) - il forum principale di Ethereum per la ricerca, e il forum più influente al mondo per la criptoeconomia -- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) - una serie continuativa di domande e risposte con i ricercatori. Ogni volta che si apre una parte successiva, chiunque può pubblicare domande. -- [Lista dei desideri del Programma di supporto dell'ecosistema](https://esp.ethereum.foundation/wishlist/) - aree di ricerca in cui il Programma di supporto dell'ecosistema Ethereum sta cercando attivamente domande di sovvenzione -- [AllWalletDevs](https://allwallet.dev): un forum per sviluppatori, progettisti e utenti interessati a Ethereum, per riunirsi regolarmente e discutere dei portafogli +- [Challenges.ethereum.org](https://challenges.ethereum.org/): una serie di taglie di ricerca di alto valore, dove puoi guadagnare >100.000 USD +- [Ethresear.ch](https://ethresear.ch): il forum principale di Ethereum per la ricerca e il forum più influente al mondo per la criptoeconomia +- [EF Research AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022): una serie continua di domande e risposte con i ricercatori. All'apertura di ogni parte successiva, chiunque può pubblicare domande. +- [Lista dei desideri dell'Ecosystem Support Program](https://esp.ethereum.foundation/wishlist/): aree di ricerca in cui l'Ecosystem Support Program di Ethereum è attivamente alla ricerca di candidature per sovvenzioni +- [AllWalletDevs](https://allwallet.dev): un forum per sviluppatori, designer e utenti interessati di Ethereum per riunirsi regolarmente e discutere di portafogli [Esplora altre aree di ricerca attive](/community/research/). -## Competenze non tecniche {#non-technical} +## Competenze non tecniche ‍ {#non-technical} -Se non sei uno sviluppatore, può essere difficile sapere da dove iniziare all’interno di Ethereum. Di seguito alcuni suggerimenti, insieme alle risorse per formazioni professionali specifiche. +Se non sei uno sviluppatore, può essere difficile sapere da dove iniziare in Ethereum. Ecco alcuni suggerimenti, insieme a risorse per background professionali specifici. -### Organizza un incontro nella tua città {#meetups} +### Organizza un meetup nella tua città {#meetups} -- Non sai da dove iniziare? La rete [BUIDL](https://consensys.net/developers/buidlnetwork/) può aiutare. +- Non sai come iniziare? La [rete BUIDL](https://consensys.net/developers/buidlnetwork/) può aiutarti. ### Scrivi contenuti su Ethereum {#write-content} -- Ethereum ha bisogno di buoni scrittori che possano spiegare il suo valore in un linguaggio semplice -- Non sei pronto a pubblicare i tuoi articoli? Considera di contribuire ai contenuti esistenti sulle risorse della community, o [proponi nuovi contenuti per ethereum.org](/contributing/)! +- Ethereum ha bisogno di bravi scrittori che possano spiegarne il valore in un linguaggio semplice +- Non sei pronto a pubblicare i tuoi articoli? Prendi in considerazione l'idea di contribuire ai contenuti esistenti sulle risorse della community o [proponi nuovi contenuti per ethereum.org](/contributing/)! -### Messa a disposizione per prendere appunti per le riunioni della community {#take-notes} +### Offriti di prendere appunti per le chiamate della community {#take-notes} -- Ci sono molte riunioni della community che sono open-source, e avere chi prende appunti è di grande aiuto. Se sei interessato, iscriviti al [Ethereum Cat Herders discord](https://discord.com/invite/Nz6rtfJ8Cu) e presentati alla community! +- Ci sono molte chiamate della community open source e avere chi prende appunti è di grande aiuto. Se sei interessato, unisciti al [Discord degli Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) e presentati! -### Traduci contenuti Ethereum nella tua lingua madre {#translate-ethereum} +### Traduci i contenuti di Ethereum nella tua lingua madre {#translate-ethereum} -- ethereum.org ha un Programma di Traduzione che traduce il sito web e altre risorse, in molte lingue diverse -- Scopri come [qui](/contributing/translation-program) +- ethereum.org mantiene un Programma di Traduzione che traduce il sito web e altre risorse in molte lingue diverse +- Scopri come partecipare [qui](/contributing/translation-program) ### Esegui un nodo {#run-a-node} @@ -72,61 +72,61 @@ Unisciti a migliaia di operatori di nodi per aiutare a decentralizzare ulteriorm - [Maggiori informazioni su come eseguire un nodo](/developers/docs/nodes-and-clients/run-a-node/) -### Fai staking con i tuoi ETH {#staking} +### Metti in staking i tuoi ETH {#staking} -Mettendo in staking i tuoi ETH puoi guadagnare ricompense aiutando a rendere la rete Ethereum sicura. +Mettendo in staking i tuoi ETH puoi guadagnare ricompense aiutando al contempo a proteggere la rete di Ethereum. - [Maggiori informazioni sullo staking](/staking/) -### Progetti di supporto {#support-projects} +### Supporta i progetti {#support-projects} -L'ecosistema Ethereum ha come missione di finanziare beni pubblici e progetti di grande impatto. Con donazioni molto piccole puoi mostrare il tuo supporto e permettere che questo importante lavoro si realizzi. +L'ecosistema di Ethereum ha la missione di finanziare beni pubblici e progetti di impatto. Con donazioni molto piccole puoi mostrare il tuo supporto e consentire la realizzazione di lavori importanti. - [Gitcoin](https://gitcoin.co/fund) - [clr.fund](https://clr.fund/#/about) -## Professionisti finanziari e Contabili {#financial-professionals} +## Professionisti finanziari e Contabili ‍ {#financial-professionals} -- Ethereum è la casa della "Finanza Decentralizzata" - una rete di protocolli e applicazioni che offrono un sistema finanziario alternativo. Se sei un professionista finanziario, dai un'occhiata ad alcune app DeFi su [DeFi Llama](https://defillama.com/) o su [DeFiPrime](https://defiprime.com) -- Contabile? Le risorse su Ethereum: ETH, token, Defi, etc., introducono molti nuovi problemi di compatibilità. Potresti iniziare dando un'occhiata ad alcuni progetti che mirano ad aiutare gli utenti delle criptovalute a risolvere le proprie difficoltà di contabilità e ragioneria, come [Rotki](https://rotki.com/) +- Ethereum ospita l'ecosistema della "Finanza Decentralizzata": una rete di protocolli e applicazioni che offrono un sistema finanziario alternativo. Se sei un professionista finanziario, dai un'occhiata ad alcune app DeFi su [DeFi Llama](https://defillama.com/) o [DeFiPrime](https://defiprime.com) +- Sei un contabile? Gli asset su Ethereum (ETH, token, DeFi, ecc.) introducono molti nuovi problemi contabili. Potresti iniziare dando un'occhiata ad alcuni progetti che mirano ad aiutare gli utenti di criptovaluta a risolvere le loro sfide di contabilità e amministrazione, come [Rotki](https://rotki.com/) -## Product Manager {#product-managers} +## Product Manager ‍ {#product-managers} -- L'ecosistema Ethereum ha bisogno del tuo talento! Molte aziende sono alla ricerca di product manager. Se desideri iniziare a contribuire a un progetto open source, contatta gli [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) o [RaidGuild](https://www.raidguild.org/) +- L'ecosistema di Ethereum ha bisogno dei tuoi talenti! Molte aziende stanno assumendo per ruoli di product manager. Se vuoi iniziare contribuendo a un progetto open source, mettiti in contatto con gli [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) o la [RaidGuild](https://www.raidguild.org/) -## Marketing {#marketing} +## Marketing ‍ {#marketing} -- Ci sono molte posizioni di marketing e comunicazione nell'ecosistema Ethereum! +- Ci sono molte posizioni di marketing e comunicazione nell'ecosistema di Ethereum! -## Lavora con Ethereum {#ethereum-jobs} +## Lavori in Ethereum {#ethereum-jobs} -**Vuoi lavorare con Ethereum?** +**Vuoi trovare un lavoro in Ethereum?** -- [Lavori di ethereum.org](/about/#open-jobs) -- [Lavori della Ethereum Foundation](https://jobs.ashbyhq.com/ethereum-foundation) +- [Lavori su ethereum.org](/about/#open-jobs) +- [Bacheca degli annunci di lavoro della Ethereum Foundation](https://jobs.ashbyhq.com/ethereum-foundation) - [JobStash](https://jobstash.xyz) -- [Lavori di Criptovalute](https://cryptocurrencyjobs.co/ethereum/) -- [Carriere presso ConsenSys](https://consensys.net/careers/) -- [Elenco di lavori Cripto](https://cryptojobslist.com/ethereum-jobs) -- [Annunci di lavoro Bankless](https://pallet.xyz/list/bankless/jobs) -- [Lavori Web3](https://web3.career) +- [Ethereum Job Board](https://www.ethereumjobboard.com/) +- [Cryptocurrency Jobs](https://cryptocurrencyjobs.co/ethereum/) +- [Carriere in ConsenSys](https://consensys.net/careers/) +- [Crypto Jobs List](https://cryptojobslist.com/ethereum-jobs) +- [Bacheca degli annunci di lavoro di Bankless](https://pallet.xyz/list/bankless/jobs) +- [Web3 Jobs](https://web3.career) - [Web3 Army](https://web3army.xyz/) - [Crypto Valley Jobs](https://cryptovalley.jobs/) -- [Lavori correlati a Ethereum](https://startup.jobs/ethereum-jobs) +- [Ethereum Jobs](https://startup.jobs/ethereum-jobs) -## Entra a far parte di una DAO {#decentralized-autonomous-organizations-daos} +## Unisciti a una DAO {#decentralized-autonomous-organizations-daos} -Le "DAO" sono organizzazioni autonome decentralizzate. Questi gruppi sfruttano la tecnologia di Ethereum per facilitare organizzazione e collaborazione. Ad esempio, per il controllo delle adesioni, il voto su proposte o la gestione delle risorse comuni. Benché siano ancora sperimentali, le DAO offrono l'opportunità di trovare gruppi con cui ti identifichi, trovare collaboratori e aumentare il tuo impatto sulla community di Ethereum. [Maggiori informazioni sulle DAO](/dao/) +Le "DAO" sono organizzazioni autonome decentralizzate. Questi gruppi sfruttano la tecnologia di Ethereum per facilitare l'organizzazione e la collaborazione. Ad esempio, per controllare l'appartenenza, votare sulle proposte o gestire asset in comune. Sebbene le DAO siano ancora sperimentali, offrono l'opportunità di trovare gruppi in cui ti identifichi, trovare collaboratori e far crescere il tuo impatto sulla community di Ethereum. [Maggiori informazioni sulle DAO](/dao/) -- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) - _Promuovi il concetto di DAO in campo non tecnico e aiuta le persone a creare valore tramite una DAO._ -- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _Community di creatori che credono nella proprietà collettiva di internet_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _Collettivo di sviluppo su base freelance di Web3 operante come una DAO_ -- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _Governance comunitaria di DAOhaus_ -- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) - _Ingegneria legale_ -- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - _Venture per progetti di cripto pro-seed_ -- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) - _Meccaniche di Gioco MMORPG per la Vita Reale_ -- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - _Marchi di Abbigliamento Digifisico_ -- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _Community concentrata sul finanziamento dello sviluppo di Ethereum_ -- [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _Collettivo di costruttori di Web3_ +- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare): _Promuove il concetto di DAO in campi non tecnologici e aiuta le persone a creare valore attraverso le DAO_ +- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao): _Community di costruttori che credono nella proprietà collettiva di Internet_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech): _Collettivo di sviluppo Web3 freelance che lavora come una DAO_ +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit): _Governance della community di DAOhaus_ +- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO): _Ingegneria legale_ +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO): _Venture per progetti crypto pre-seed_ +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory): _Marchi di abbigliamento digifisico_ +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO): _Community focalizzata sul finanziamento dello sviluppo di Ethereum_ +- [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild): _Collettivo di costruttori Web3_ -Ricordati di rispettare il [codice di condotta](/community/code-of-conduct) di ethereum.org ogni volta e in qualunque modo contribuisci a ethereum.org! +Ricorda di rispettare il [codice di condotta](/community/code-of-conduct) di ethereum.org in qualsiasi momento e in qualsiasi modo tu contribuisca a ethereum.org! \ No newline at end of file diff --git a/public/content/translations/it/community/grants/index.md b/public/content/translations/it/community/grants/index.md index 9e54fa1e9fb..718cdd8e2f6 100644 --- a/public/content/translations/it/community/grants/index.md +++ b/public/content/translations/it/community/grants/index.md @@ -1,46 +1,66 @@ --- -title: Fondazione Ethereum & programmi di sovvenzione alla community -description: Un elenco dei programmi di sovvenzione di tutto l'ecosistema Ethereum. +title: Programmi di sovvenzione della Fondazione Ethereum e della community +description: Un elenco dei programmi di sovvenzione in tutto l'ecosistema di Ethereum. lang: it --- -# Sovvenzioni connesse a Ethereum {#ethereum-grants} +# Sovvenzioni di Ethereum {#ethereum-grants} -I programmi elencati di seguito offrono una varietà di sovvenzioni per progetti volti a promuovere la crescita e il successo dell'ecosistema Ethereum. Questo elenco può fungere da guida per trovare e richiedere fondi utili a contribuire al successo dei propri progetti Ethereum futuri. +I programmi elencati di seguito offrono una varietà di sovvenzioni di finanziamento per i progetti che lavorano per promuovere il successo e la crescita dell'ecosistema di [Ethereum](/). Usala come guida per trovare e richiedere fondi per contribuire a rendere il tuo prossimo progetto su Ethereum un successo. -Questo elenco è curato dalla nostra comunità. Se c'è qualcosa di mancante o incorretto, si prega di modificare la pagina! +Questo elenco è curato dalla nostra community. Se manca qualcosa o c'è un errore, modifica questa pagina! -## Il vasto ecosistema di Ethereum {#broad-ethereum-ecosystem} + + +
Fondatori, avete bisogno di aiuto per accelerare la vostra attività? [Visitate il Supporto per i Fondatori](/founders/)
+
-Questi programmi supportano il grande ecosistema di Ethereum offrendo sovvenzioni per un'ampia gamma di progetti, tra cui soluzioni per la scalabilità, la costruzione di community, la sicurezza, la privacy e molto altro. Queste sovvenzioni non sono specifiche per una data piattaforma Ethereum, e sono un buon punto di partenza per chi è ancora in fase esplorativa. +## Ampio ecosistema di Ethereum {#broad-ethereum-ecosystem} -- [Programma di supporto per l'ecosistema EF](https://esp.ethereum.foundation) - _Finanziamento di progetti open source a favore di Ethereum, con particolare interesse agli strumenti universali, alle infrastrutture, alla ricerca e ai beni pubblici_ -- [ESP Grant Explorer](https://esp.ethereum.foundation/funded-projects) - _Directory consultabile di oltre 1.000 progetti supportati dall'Ecosystem Support Program_ -- [Moloch DAO](https://www.molochdao.com/): _Privacy, ridimensionamento del livello 2, sicurezza del client e molto altro_ -- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Foglio di calcolo di Google delle organizzazioni che offrono sovvenzioni_ -- [Sovvenzioni accademiche](https://esp.ethereum.foundation/academic-grants) - _Sovvenzioni per sostenere il lavoro accademico correlato a Ethereum_ +Questi programmi supportano l'ampio ecosistema di Ethereum offrendo sovvenzioni a una vasta gamma di progetti. Questi includono soluzioni per la scalabilità, la costruzione della community, la sicurezza, la privacy e altro ancora. Queste sovvenzioni non sono specifiche per una singola piattaforma di Ethereum e sono un buon punto di partenza se non sei sicuro. -## Programmi per progetti specifici {#project-specific} +- [EF Ecosystem Support Program](https://esp.ethereum.foundation) - _Finanzia progetti open source a vantaggio di Ethereum, con un'attenzione particolare a strumenti universali, infrastrutture, ricerca e beni pubblici_ +- [ESP Grant Explorer](https://esp.ethereum.foundation/funded-projects) - _Directory ricercabile di oltre 1.000 progetti supportati dall'Ecosystem Support Program_ +- [Academic Grants](https://esp.ethereum.foundation/academic-grants) - _Sovvenzioni per supportare il lavoro accademico correlato a Ethereum_ -Questi progetti hanno creato le proprie sovvenzioni per progetti volti a sviluppare e sperimentare la propria tecnologia. +## Aggregatori e piattaforme di elenchi di sovvenzioni {#grant-list-aggregators} -- [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) sovvenzioni DAO_ -- [Balancer](https://grants.balancer.community/): _Fondo dell'ecosistema di [Balancer](https://balancer.fi/)_ -- [Decentraland Grants Program](https://governance.decentraland.org/grants/) - _Metaverso DAO di [Decentraland](https://decentraland.org/)_ -- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _Ecosistema finanziario di [Lido](https://lido.fi/)_ -- [MetaMask Program](https://metamaskgrants.org/): _DAO di sovvenzioni operata dai dipendenti di [MetaMask](https://metamask.io/)_ -- [SKALE Network Grants Program](https://skale.space/developers#grants): _ecosistema della [rete SKALE](https://skale.space/)_ -- [Programma di sovvenzioni della Swarm Foundation](https://www.ethswarm.org/grants): _Ecosistema di [Swarm Foundation](https://www.ethswarm.org/)_ -- [The Graph](https://thegraph.com/ecosystem/grants/): _Ecosistema di [The Graph](https://thegraph.com/)_ -- [Programma di sovvenzioni di Uniswap](https://www.uniswapfoundation.org/grants): _community di [Uniswap](https://uniswap.org/)_ +Queste risorse compilano e organizzano varie opportunità di sovvenzione in tutto l'ecosistema di Ethereum, rendendo più facile scoprire opportunità di finanziamento che corrispondono alle esigenze del tuo progetto. Le abbiamo organizzate per tipologia di utente per aiutarti a iniziare a trovare le risorse più pertinenti in base alle tue specifiche esigenze di finanziamento. -## Finanziamento quadratico {#quadratic-funding} +### Per tutti i richiedenti di sovvenzioni: Directory complete {#comprehensive-directories} -Le radici dell'open source di Ethereum hanno portato alla crescita di un nuovo modello interessante di raccolta fondi: il finanziamento quadratico. Questo finanziamento ha il potenziale di migliorare il modo in cui finanzieremo tutti i tipi di beni pubblici in futuro. Il finanziamento quadratico assicura che i progetti che riceveranno più finanziamenti siano quelli con la domanda più esclusiva. In sintesi, i progetti che cercano di migliorare la vita del maggior numero di persone. [Maggiori informazioni sul finanziamento quadratico.](/defi/#quadratic-funding) +Queste piattaforme generali offrono un'ampia copertura di sovvenzioni in tutto lo spazio Web3 e sono utili punti di partenza per chiunque cerchi finanziamenti: -- [Gitcoin](https://gitcoin.co/grants) -- [clr.fund](https://clr.fund/) +- [Karma Funding Map](https://gap.karmahq.xyz/funding-map) - Directory di tutti i programmi di sovvenzione web3, aggiornata su base settimanale -## Lavora su Ethereum {#work-in-ethereum} +### Per sviluppatori e costruttori {#for-developers-and-builders} -Non sei pronto per iniziare il tuo progetto? Ci sono centinaia di aziende che cercano attivamente persone appassionate con cui lavorare e contribuire all'ecosistema Ethereum. Cerchi maggiori informazioni? [Dai un'occhiata ai lavori relativi a Ethereum](/community/get-involved/#ethereum-jobs) +- [Grant Programs Viewer](https://airtable.com/shr86elKgWTSCP4AY) - _Database pubblico Airtable dei programmi di sovvenzione_ +- [Web3 Grants Spreadsheet](https://docs.google.com/spreadsheets/d/1c8koZCI-GLnD8MG-eFcXPOBCNu1v8-aXIfwAAvc7AMc/edit#gid=0) - _Foglio di calcolo Google delle opportunità di sovvenzione Web3_ +- [Arbitrum Grants](https://arbitrum.foundation/grants) — Arbitrum DAO e [The Arbitrum Foundation](https://arbitrum.foundation/) + +### Per progetti DeFi e applicazioni finanziarie {#for-defi-projects} + +- [AlphaGrowth Grants](https://alphagrowth.io/crypto-web3-grants-list) - _Elenco completo di sovvenzioni crypto e Web3_ +- [Uniswap Foundation Grants](https://www.uniswapfoundation.org/build) - _Sovvenzioni Unichain e Uniswap v4 e supporto per i costruttori DeFi_ + +### Per contributori DAO e innovatori della governance {#for-dao-contributors} + +Risorse per progetti guidati dalla community ed esperimenti di governance: + +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Foglio di calcolo Google delle organizzazioni che offrono sovvenzioni_ +- [MetaGov Database](https://docs.google.com/spreadsheets/d/1e5g-dlWWsK2DZoZGBgfxyfGNSddLk-V7sLEgfPjEhbA/edit#gid=780420708) - _Mappa completa delle sovvenzioni Web3_ + +### Beni pubblici e impatto {#public-goods-and-impact} + +Questi programmi si concentrano sul finanziamento di progetti a vantaggio della community più ampia, dei beni pubblici e delle iniziative di impatto. Questi includono fornitori di sovvenzioni, nonché piattaforme di donazione che utilizzano meccanismi di allocazione dei finanziamenti on-chain, tra cui il [finanziamento quadratico](/defi/#quadratic-funding): + +- [Gitcoin](https://www.gitcoin.co/program) - _Gitcoin Grants utilizza molteplici meccanismi di allocazione del capitale per finanziare progetti open source e beni pubblici nell'ecosistema di Ethereum_ +- [Octant](https://octant.app/home) - _Ecosistema di finanziamento dei beni pubblici che bilancia il bene comune e l'emancipazione finanziaria individuale_ +- [Giveth](https://giveth.io/) - _Piattaforma di donazioni crypto che consente donazioni dirette da progetti a fin di bene con zero commissioni aggiuntive_ +- [Artizen](https://artizen.fund/) - _Aiuta i creatori a cofinanziare nuovi progetti alla frontiera dell'arte, della scienza, della tecnologia e della cultura_ +- [Quadratic Accelerator](https://qacc.giveth.io/) - _Programma di accelerazione per start-up che utilizza il finanziamento quadratico per supportare progetti a vantaggio del bene pubblico_ + +## Lavorare in Ethereum {#work-in-ethereum} + +Non sei pronto per avviare il tuo progetto? Ci sono centinaia di aziende che cercano attivamente individui appassionati per lavorare e contribuire all'ecosistema di Ethereum. Cerchi maggiori informazioni? [Dai un'occhiata ai lavori correlati a Ethereum](/community/get-involved/#ethereum-jobs) \ No newline at end of file diff --git a/public/content/translations/it/community/language-resources/index.md b/public/content/translations/it/community/language-resources/index.md index 57dcc036d6f..e4619909a51 100644 --- a/public/content/translations/it/community/language-resources/index.md +++ b/public/content/translations/it/community/language-resources/index.md @@ -1,153 +1,152 @@ --- title: Risorse linguistiche -description: Risorse non in inglese per conoscere Ethereum +description: Risorse non in inglese per imparare a conoscere Ethereum lang: it --- # Risorse linguistiche {#language-resources} -La community Ethereum è globale e composta da milioni di persone che non parlano inglese. +La community di Ethereum è globale ed è composta da milioni di persone che non parlano inglese. -Il nostro obiettivo è quello di fornire contenuti educativi in tutte le lingue e aiutare a superare le barriere linguistiche che rendono l'onboarding di persone da tutto il mondo in Ethereum una sfida. +Il nostro obiettivo è fornire contenuti educativi in tutte le lingue e aiutare a superare le barriere linguistiche che rendono l'avvicinamento a Ethereum una sfida per le persone di tutto il mondo. -Se preferisci leggere nella tua lingua madre o conosci qualcuno che non parla inglese, puoi trovare una lista di risorse utili non in inglese qui sotto. Centinaia di migliaia di appassionati di Ethereum si riuniscono in questi forum online per condividere notizie, parlare degli sviluppi recenti, confrontarsi su questioni tecniche ed immaginare il futuro. +Se preferisci leggere nella tua lingua madre o conosci qualcuno che non parla inglese, di seguito puoi trovare un elenco di utili risorse non in inglese. Centinaia di migliaia di appassionati di Ethereum si riuniscono in questi forum online per condividere notizie, parlare dei recenti sviluppi, dibattere su questioni tecniche e immaginare il futuro. -Conosci una risorsa formativa nella tua lingua? [Apri una segnalazione](https://github.com/ethereum/ethereum-org-website/issues/new/choose) per aggiungerla alla lista! +Conosci una risorsa educativa nella tua lingua? [Apri una issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose) per aggiungerla all'elenco! ## Risorse di Ethereum.org {#ethereum-org} -Ethereum.org è tradotto nativamente in oltre 40 lingue, che puoi trovare utilizzando il nostro menu di selezione della lingua, ubicato in cima a ogni pagina. +Ethereum.org è tradotto nativamente in oltre 40 lingue che puoi trovare utilizzando il nostro menu di selezione delle lingue, situato nella parte superiore di ogni pagina. ![Menu di selezione della lingua](./language-selector-menu.png) -Se sei bilingue e vuoi aiutarci a raggiungere più persone, puoi anche essere coinvolto nel [Programma di Traduzione ethereum.org](/contributing/translation-program/#translation-program) e aiutarci a tradurre il sito web. +Se sei bilingue e vuoi aiutarci a raggiungere più persone, puoi anche partecipare al [Programma di traduzione di ethereum.org](/contributing/translation-program/#translation-program) e aiutarci a tradurre il sito web. -## Risorse della Community {#community} +## Risorse della community {#community} -### Portoghese Brasiliano {#br-pt} +### Portoghese brasiliano {#br-pt} -**News** +**Notizie** -- [BeInCrypto](http://www.beincrypto.com.br) - notizie e articoli di criptovalute, tra cui un elenco di piattaforme di scambio, disponibili in Brasile -- [Cointelegraph](http://cointelegraph.com.br/category/analysis) - Versione brasiliana di Cointelegraph, un importante outlet di notizie sulle criptovalute +- [BeInCrypto](http://www.beincrypto.com.br) - notizie e articoli sulle criptovalute, incluso un elenco di exchange, disponibili in Brasile +- [Cointelegraph](http://cointelegraph.com.br/category/analysis) - versione brasiliana di Cointelegraph, un importante organo di informazione sulle criptovalute - [Livecoins](http://www.livecoins.com.br/ethereum) - notizie e strumenti sulle criptovalute -- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) - notizie e relazioni sulle criptovalute -- [Modular Crypto](https://modularcrypto.xyz/): notizie sulle criptovalute e articoli educativi +- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) - notizie e report sulle criptovalute +- [Modular Crypto](https://modularcrypto.xyz/) - notizie sulle criptovalute e articoli educativi -**Educazione** +**Formazione** -- [web3dev](https://www.web3dev.com.br/) - Hub di contenuti e community Discord per sviluppatori web 3. -- [Web3Brasil](https://github.com/web3brasil/web3brasil) - risorse per imparare Web3 e DeFi -- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) - notizie e formazione sulle criptovalute, tra cui 'Ethereum per principianti' e 'DeFi' per principianti -- [CriptoAtivos](http://www.criptoativos.wiki.br/) - informazioni sullo spazio delle criptovalute, istruzione e blog +- [web3dev](https://www.web3dev.com.br/) - Hub di contenuti e community Discord per sviluppatori web3. +- [Web3Brasil](https://github.com/web3brasil/web3brasil) - risorse per imparare il web3 e la DeFi +- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) - notizie e formazione sulle criptovalute, inclusi 'Ethereum per principianti' e 'DeFi per principianti' +- [CriptoAtivos](http://www.criptoativos.wiki.br/) - approfondimenti dallo spazio delle criptovalute, formazione e blog - [Cointimes](http://www.cointimes.com.br/) - notizie e formazione sulle criptovalute -- [Pacchetto iniziale di Web3](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) - una guida per rispondere alle domande frequenti e fondamentali sulle criptovalute +- [Web3 starter pack](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) - una guida che risponde alle domande fondamentali e più frequenti sulle criptovalute ### Cinese {#zh} **Risorse generali** -- [Ethereum.cn](https://www.ethereum.cn/) - contenuti mantenuti dalla community, che coprono l'aggiornamento del livello del consenso, tutte le note principali dell'incontro degli sviluppatori, livello 2, ecc. -- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) - impara qualsiasi cosa, dalle basi agli argomenti avanzati di Ethereum -- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) - contenuti mantenuti dalla community, su Ethereum, DeFi, NFT, conoscenza correlata a Web3 -- [123ETH](https://123eth.org/) - un Portale per l'ecosistema di Ethereum -- [Zhen Xiao](http://zhenxiao.com/blockchain/) - corsi online gratuiti sulle criptovalute e loro applicazioni -- [Ethereum Whitepaper](https://ethereum.org/whitepaper//[%E4%B8%AD%E6%96%87]-%E4%BB%A5%E5%A4%AA%E5%9D%8A%E7%99%BD%E7%9A%AE%E4%B9%A6) - Versione cinese del Whitepaper di Ethereum +- [Ethereum.cn](https://www.ethereum.cn/) - contenuti gestiti dalla community, che coprono l'aggiornamento del livello di consenso, tutte le note delle riunioni dei core dev, il livello 2, ecc. +- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) - impara tutto, dalle basi agli argomenti avanzati su Ethereum +- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) - contenuti gestiti dalla community, che coprono le conoscenze relative a Ethereum, DeFi, NFT e web3 +- [123ETH](https://123eth.org/) - un portale per l'ecosistema di Ethereum +- [Zhen Xiao](http://zhenxiao.com/blockchain/) - corsi online gratuiti sulle criptovalute e le loro applicazioni -**Ecosistema Ethereum** +**Ecosistema di Ethereum** -- [ETHPlanet](https://www.ethplanet.org/) - hackathon online e di persona, che offre formazione agli studenti universitari -- [PrimitivesLane](https://www.primitiveslane.org/) - un gruppo di ricerca non-profit, focalizzato sulla tecnologia blockchain -- [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) - una community dedicata alla traduzione dei contenuti educativi di Ethereum +- [ETHPlanet](https://www.ethplanet.org/) - hackathon online e in presenza, che offrono formazione agli studenti universitari +- [PrimitivesLane](https://www.primitiveslane.org/) - un gruppo di ricerca senza scopo di lucro, focalizzato sulla tecnologia blockchain +- [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) - una community dedicata alla traduzione di contenuti educativi su Ethereum **Per gli sviluppatori** -- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - un gruppo di apprendimento per studiare i progetti delle dApp mainstream e condividere pensieri e commenti ogni settimana -- [LearnBlockchain](https://learnblockchain.cn/) - una community per sviluppatori, che condivide informazioni sulla tecnologia delle blockchain +- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - un gruppo di apprendimento per studiare i principali progetti di dApp e condividere pensieri e commenti ogni settimana +- [LearnBlockchain](https://learnblockchain.cn/) - una community per sviluppatori, che condivide informazioni sulla tecnologia blockchain **Per i ricercatori di crittografia** -- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw): un profilo di WeChat, che spiega la crittografia, la sicurezza, etc. -- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ): un profilo di WeChat, che spiega la tecnologia zk +- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) - un account WeChat che spiega la crittografia, la sicurezza, ecc. +- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) - un account WeChat che spiega la tecnologia zk ### Ceco {#cs} -- [Gwei.cz](https://gwei.cz) - community locale sul Web3, crea contenuti educativi, organizza eventi online e di persona -- [Gwei.cz Příručka](https://prirucka.gwei.cz/) - Guida per principianti di Ethereum +- [Gwei.cz](https://gwei.cz) - community locale incentrata sul web3, crea contenuti educativi, organizza eventi online e in presenza +- [Gwei.cz Příručka](https://prirucka.gwei.cz/) - guida a Ethereum per principianti - [DAO Příručka](https://dao.gwei.cz/) - guida per principianti alle DAO -- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - Padroneggiare Ethereum in ceco +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - Mastering Ethereum in ceco ### Francese {#fr} - [Ethereum France](https://www.ethereum-france.com/) - Ethereum France organizza eventi, crea contenuti e incoraggia le discussioni su Ethereum -- [Ethereum.fr](https://ethereum.fr/) - Ethereum notizie e formazione -- [BanklessFR](https://banklessfr.substack.com/) - Newsletter Bankless in francese -- [CryptoFR](https://cryptofr.com/category/44/ethereum-general) - forum di criptovalute con una sotto-pagina Ethereum +- [Ethereum.fr](https://ethereum.fr/) - notizie e formazione su Ethereum +- [BanklessFR](https://banklessfr.substack.com/) - newsletter di Bankless in francese +- [CryptoFR](https://cryptofr.com/category/44/ethereum-general) - forum sulle criptovalute con una sottopagina dedicata a Ethereum ### Tedesco {#de} -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) - utilizzo di Solidity -- [Microsoft Learn (contratti intelligenti)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/): scrivere i contratti intelligenti di Ethereum con Solidity -- [Microsoft Learn (reti di Ethereum)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) - distribuisci e connettiti alle reti di Ethereum -- [Microsoft Learn (blockchain)](https://docs.microsoft.com/de-de/learn/paths/ethereum-blockchain-development/) - introduzione allo sviluppo della blockchain +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) - usare Solidity +- [Microsoft Learn (smart contracts)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) - scrivere contratti intelligenti di Ethereum con Solidity +- [Microsoft Learn (Ethereum networks)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) - connettersi e distribuire reti Ethereum +- [Microsoft Learn (blockchains)](https://docs.microsoft.com/de-de/learn/paths/ethereum-blockchain-development/) - introduzione allo sviluppo su blockchain ### Ebraico {#he} - [Udi Wertheimer - Cosa possono imparare i bitcoiner da Ethereum](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) -- [Omer Greismen (OpenZeppelin) - Come abbiamo impedito una violazione da 15 miliardi di dollari dei contratti intelligenti](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) -- [Shy Datika (INX) - Tokenizzazione e il futuro delle sicurezze; Ethereum è una sicurezza?](https://www.cryptojungle.co.il/shy-datika-tokenization/) -- [Roy Confino (Lemonade) - Assicurazione su Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) +- [Omer Greismen (OpenZeppelin) - Come abbiamo sventato un attacco informatico da 15 miliardi di dollari a un contratto intelligente](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) +- [Shy Datika (INX) - La tokenizzazione e il futuro dei titoli, incluso se Ethereum è un titolo](https://www.cryptojungle.co.il/shy-datika-tokenization/) +- [Roy Confino (Lemonade) - Assicurazioni @ Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) - [Idan Ofrat (Fireblocks) - Adozione istituzionale](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) - [Gal Weizman (MetaMask) - Cos'è MetaMask](https://www.cryptojungle.co.il/gal-weizman-metamask/) - [Dror Aviely (Consensys) - Il centro di Ethereum](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) - [Nir Rozin - Essere un cryptopunk](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) -- [Adan Kedem - Videogiochi e Metaverso](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) +- [Adan Kedem - Gaming e Metaverso](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) - [Uri Kolodny (Starkware) - Ethereum e i livelli della blockchain](https://www.cryptojungle.co.il/uri-kolodny-starkware/) -- [Udi Wertheimer - Ethereum 2.0 vs la concorrenza](https://www.cryptojungle.co.il/udi-on-eth2/) -- [Ben Samocha (myself) - Ethereum 2.0: un'opportunità?](https://www.cryptojungle.co.il/etherurm2-week-summary/) +- [Udi Wertheimer - Ethereum 2.0 vs concorrenza](https://www.cryptojungle.co.il/udi-on-eth2/) +- [Ben Samocha (io stesso) - Ethereum 2.0 - un'opportunità?](https://www.cryptojungle.co.il/etherurm2-week-summary/) - [Alon Muroch (Bloxstaking) - Cos'è Ethereum 2.0?](https://www.cryptojungle.co.il/alon-moroch-eth2/) - [Eilon Aviv (Collider Ventures) - Cosa può andare storto con Ethereum 2.0](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) - [Eilon Aviv (Collider Ventures) - Perché abbiamo bisogno di Ethereum 2.0](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) ### Italiano {#it} -- [Ethereum Italia](https://www.ethereum-italia.it/): istruzione, eventi e notizie su Ethereum, incentrati sui contratti intelligenti e la tecnologia della blockchain -- [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) - podcast di Ethereum in italiano -- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) - imparare a utilizzare Solidity -- [Microsoft Learn (contratti intelligenti)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/): impara a scrivere i contratti intelligenti usando Solidity -- [Microsoft Learn (dApp)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) - crea un'interfaccia utente con le applicazioni decentralizzate +- [Ethereum Italia](https://www.ethereum-italia.it/) - formazione, eventi e notizie su Ethereum, con particolare attenzione ai contratti intelligenti e alla tecnologia blockchain +- [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) - podcast su Ethereum in italiano +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) - impara a usare Solidity +- [Microsoft Learn (Smart contracts)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) - impara a scrivere contratti intelligenti usando Solidity +- [Microsoft Learn (dapps)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) - crea un'interfaccia utente con applicazioni decentralizzate ### Giapponese {#ja} - [Japan Virtual and Crypto assets Exchange Association](https://jvcea.or.jp/) - [Japan Cryptoasset Business Association](https://cryptocurrency-association.org/) -- [Inizia a sviluppare con la blockchain - Impara | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) - Questo percorso d'apprendimento introduce alla blockchain e allo sviluppo sulla piattaforma di Ethereum -- [Mastering Ethereum](https://www.oreilly.co.jp/books/9784873118963/) - Padroneggiare Ethereum in giapponese -- [Sviluppo Pratico di contratti intelligenti con Solidity ed Ethereum](https://www.oreilly.co.jp/books/9784873119342/): Sviluppo Pratico di contratti intelligenti con Solidity ed Ethereum in giapponese +- [Inizia con lo sviluppo su blockchain - Learn | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) - Questo percorso di apprendimento ti introduce alla blockchain e allo sviluppo sulla piattaforma Ethereum +- [Mastering Ethereum](https://www.oreilly.co.jp/books/9784873118963/) - Mastering Ethereum in giapponese +- [Hands-On Smart Contract Development with Solidity and Ethereum](https://www.oreilly.co.jp/books/9784873119342/) - Hands-On Smart Contract Development with Solidity and Ethereum in giapponese ### Russo {#ru} -- [Cyber Academy](https://cyberacademy.dev): spazio educativo per creatori web3 -- [Forklog](https://forklog.com): notizie e articoli educativi sulle criptovalute in generale, le tecnologie esistenti e gli aggiornamenti futuri delle diverse blockchain -- [BeInCrypto](https://ru.beincrypto.com): notizie, analisi dei prezzi delle criptovalute e articoli non tecnici con spiegazioni semplici su tutto ciò che riguarda le criptovalute +- [Cyber Academy](https://cyberacademy.dev) - spazio educativo per i costruttori del web3 +- [Forklog](https://forklog.com) - notizie e articoli educativi sulle criptovalute in generale, sulle tecnologie esistenti e sui futuri aggiornamenti di diverse blockchain +- [BeInCrypto](https://ru.beincrypto.com) - notizie, analisi dei prezzi delle criptovalute e articoli non tecnici con spiegazioni semplici su tutto ciò che riguarda le criptovalute ### Spagnolo {#es} -- [Ethereum Madrid](https://ethereummadrid.com/) - blockchain, DeFi, e corsi di governance, eventi e blog -- [Cointelegraph](https://es.cointelegraph.com/ethereum-for-beginners) - guida di Ethereum per principianti in spagnolo +- [Ethereum Madrid](https://ethereummadrid.com/) - corsi su blockchain, DeFi e governance, eventi e blog +- [Cointelegraph](https://es.cointelegraph.com/ethereum-for-beginners) - guida a Ethereum per principianti in spagnolo - [Tutoriales online](https://tutoriales.online/curso/solidity) - impara Solidity e la programmazione su Ethereum -- [Corso Introduttivo allo Sviluppo su Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU): fondamenti di Solidity, test e distribuzione del tuo primo contratto intelligente -- [Corso Introduttivo alla Sicurezza e l'Hacking su Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci): comprendere le vulnerabilità comuni e i problemi di sicurezza nei contratti intelligenti reali -- [Corso Introduttivo allo Sviluppo della DeFi](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS): impara come funzionano i contratti intelligenti della DeFi in Solidity e crea il tuo Creatore di Mercati Automatizzati personale -- [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) - formazione non tecnica sulla blockchain da principiante ad avanzata. Impara tutto sulle criptovalute ed Ethereum. +- [Curso Introducción a Ethereum Development](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) - basi di Solidity, test e distribuzione del tuo primo contratto intelligente +- [Curso Introducción a Seguridad y Hacking en Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) - comprendi le vulnerabilità comuni e i problemi di sicurezza nei contratti intelligenti reali +- [Curso Introducción a DeFi Development](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) - impara come funzionano i contratti intelligenti della DeFi in Solidity e crea il tuo Automated Market Maker +- [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) - Formazione non tecnica sulla blockchain da principiante ad avanzato. Impara tutto sulle criptovalute e su Ethereum. ### Turco {#tr} - [BTK Akademi](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) - corso incentrato su blockchain e criptovalute -- [La grande rinomina: cos'è successo a Eth2?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) - Traduzione turca del post del blog sulla grande ridenominazione, che spiega il cambiamento rispetto alla terminologia di “Eth2” +- [Il grande cambio di nome: cosa è successo a Eth2?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) - traduzione in turco del post sul blog del grande cambio di nome, che spiega l'abbandono della terminologia 'Eth2' ### Vietnamita {#vi} -- [Tino Group](https://wiki.tino.org/ethereum-la-gi/) - panoramica su Ethereum, dApp, portafogli e FAQ -- [Tocca Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) - piattaforma web con sottopagine per notizie e formazione di Ethereum -- [Coin68](https://coin68.com/ethereum-tieu-diem/) - portale sulle criptovalute con notizie e contenuti educativi riguardanti Ethereum +- [Tino Group](https://wiki.tino.org/ethereum-la-gi/) - panoramica di Ethereum, dApp, portafogli e FAQ +- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) - piattaforma web con sottopagine per notizie e formazione su Ethereum +- [Coin68](https://coin68.com/ethereum-tieu-diem/) - portale di criptovalute con notizie e contenuti educativi su Ethereum \ No newline at end of file diff --git a/public/content/translations/it/community/online/index.md b/public/content/translations/it/community/online/index.md index 4befbfdf904..85d31afecd9 100644 --- a/public/content/translations/it/community/online/index.md +++ b/public/content/translations/it/community/online/index.md @@ -1,75 +1,74 @@ --- -title: Community online -description: Un elenco dei programmi di sovvenzione di tutto l'ecosistema Ethereum. +title: "Comunità online" +description: "Scopri forum online, chat room e comunità sui social media in cui gli appassionati di Ethereum si riuniscono per discutere e collaborare." lang: it --- -# Community online {#online-communities} +# Comunità online {#online-communities} -Centinaia di migliaia di appassionati di Ethereum si riuniscono in questi forum online per condividere notizie, parlare degli sviluppi recenti, dibattere problemi tecnici ed immaginare il futuro. +Centinaia di migliaia di appassionati di [Ethereum](/) si riuniscono in questi forum online per condividere notizie, parlare dei recenti sviluppi, dibattere su questioni tecniche e immaginare il futuro. -## Informativa sull'inserimento nell'elenco {#listing-policy} +## Politica di inserimento {#listing-policy} -Per mantenere l'integrità e il valore delle community elencate, ethereum.org segue una rigorosa politica per determinarne l'idoneità: +Per mantenere l'integrità e il valore delle comunità elencate, ethereum.org segue una rigorosa politica per determinare l'idoneità: ### Criteri di idoneità {#eligibility-criteria} -- **Rilevanza**: La community dev'essere direttamente correlata a Ethereum e al suo ecosistema. -- **Livello di attività**: La community dovrebbe essere attiva, con interazioni, post o discussioni regolari. Le community inattive potrebbero essere rimosse. -- **Inclusività**: La community dovrebbe promuovere un ambiente accogliente, che rispetti la diversità e incoraggi la partecipazione delle persone da tutti i contesti sociali. -- **Scopo non commerciale**: Gli elenchi sono destinati agli spazi gestiti dalla community, piuttosto che a piattaforme commerciali o promozionali. +- **Pertinenza**: la comunità deve essere direttamente correlata a Ethereum e al suo ecosistema. +- **Livello di attività**: la comunità dovrebbe essere attiva, con interazioni, post o discussioni regolari. Le comunità inattive o dormienti potrebbero essere rimosse. +- **Inclusività**: la comunità dovrebbe promuovere un ambiente accogliente che rispetti la diversità e incoraggi la partecipazione di persone di ogni provenienza. +- **Focus non commerciale**: gli elenchi sono destinati a spazi guidati dalla comunità piuttosto che a piattaforme commerciali o promozionali. ### Linee guida sui contenuti {#content-guidelines} -- **Contenuti appropriati**: Le community devono disporre delle proprie linee guida di moderazione, evitando spam, incitazione all'odio, molestie, o qualsiasi contenuto che promuova attività illecite. -- **Lingua**: Sebbene l'inglese sia la lingua prevalente, le community in altre lingue sono incoraggiate a richiedere di essere inserite purché mantengano un'atmosfera inclusiva e rispettosa. -- **Trasparenza**: Informazioni chiare sullo scopo, le regole e i moderatori della community dovrebbero essere disponibili per i membri. +- **Contenuti appropriati**: le comunità devono avere le proprie linee guida di moderazione, evitando spam, incitamento all'odio, molestie o qualsiasi contenuto che promuova attività illegali. +- **Lingua**: sebbene l'inglese sia la lingua principale, le comunità in altre lingue sono incoraggiate a proporsi purché mantengano un'atmosfera inclusiva e rispettosa. +- **Trasparenza**: informazioni chiare sullo scopo, le regole e i moderatori della comunità dovrebbero essere a disposizione dei membri. -### Altre indicazioni {#other-recommendations} +### Altre raccomandazioni {#other-recommendations} -- **Accessibilità**: I forum della community dovrebbero essere accessibili per tutti senza richiedere un accesso o la registrazione. -- **Inviti al server Discord**: Si raccomanda di aggiungere a ethereum.org esclusivamente gli inviti a server Discord affidabili. Idealmente, questi inviti dovrebbero collegare a una pagina della community sul sito wb (ad es. [ethglobal.com/discord](https://ethglobal.com/discord)) o provenire da un URL ufficiale (ad es. [discord.gg/ethstaker](https://discord.gg/ethstaker) o [discord.com/invite/ethstaker](https://discord.com/invite/ethstaker)). +- **Accessibilità**: i forum della comunità dovrebbero essere accessibili a tutti per la lettura senza richiedere l'iscrizione o la registrazione. +- **Inviti ai server Discord**: si raccomanda di aggiungere a ethereum.org solo inviti affidabili ai server Discord. Idealmente, questi inviti dovrebbero collegarsi a una pagina della comunità sul sito web (es. [ethglobal.com/discord](https://ethglobal.com/discord)) o provenire da un URL ufficiale (es. [discord.gg/ethstaker](https://discord.gg/ethstaker) o [discord.com/invite/ethstaker](https://discord.com/invite/ethstaker)). -Se credi che una community dovrebbe essere aggiunta o rimossa secondo queste linee guida, ti preghiamo di [aprire un ticket sulla nostra repository di GitHub](https://github.com/ethereum/ethereum-org-website/issues). +Se ritieni che una comunità debba essere aggiunta o rimossa in base a queste linee guida, ti preghiamo di [aprire una issue sul nostro repository GitHub](https://github.com/ethereum/ethereum-org-website/issues). ## Forum {#forums} -r/ethereum - tutto su Ethereum +r/ethereum - tutto ciò che riguarda Ethereum r/ethfinance - il lato finanziario di Ethereum, inclusa la DeFi -r/ethdev - focalizzato sullo sviluppo di Ethereum +r/ethdev - incentrato sullo sviluppo di Ethereum r/ethtrader - tendenze e analisi di mercato -r/ethstaker - benvenuti a tutti gli interessati a fare staking su Ethereum -Fellowship of Ethereum Magicians - community orientata intorno a standard tecnici in Ethereum +r/ethstaker - benvenuti a tutti gli interessati allo staking su Ethereum +Fellowship of Ethereum Magicians - comunità orientata agli standard tecnici in Ethereum Ethereum Stackexchange - discussioni e aiuto per gli sviluppatori di Ethereum -Ethereum Research - la bacheca di messaggi più influente per la ricerca criptoeconomica +Ethereum Research - la bacheca più influente per la ricerca crittoeconomica -## Stanze di chat {#chat-rooms} +## Chat room {#chat-rooms} -Ethereum Cat Herders - community orientata all'offerta di assistenza per la gestione dei progetti per lo sviluppo di Ethereum -Ethereum Hackers - Chat Discord gestita da ETHGlobal: una community online per gli hacker di Ethereum in tutto il mondo -CryptoDevs - Community Discord focalizzata sullo sviluppo di Ethereum -EthStaker Discord: guida, istruzione, assistenza e risorse gestite dalla comunità per gli staker esistenti e potenziali -Ethereum.org website team - date un'occhiata e chattate sullo sviluppo e la progettazione di ethereum.org con il team e le persone della community -Matos Discord - community dei creatori di web3; un luogo di incontro per costruttori, figure industriali e appassionati di Ethereum. Siamo appassionati di sviluppo, progettazione e cultura del web3. Vieni a costruire con noi. -Solidity Matrix - chat per lo sviluppo in solidity (Gitter) -Solidity Matrix - chat per lo sviluppo in solidity (Matrix) -Ethereum Stack Exchange - *forum di domande e risposte* -Peeranha *-forum decentralizzato di domande e risposte* +Ethereum Cat Herders - comunità orientata a offrire supporto per la gestione dei progetti allo sviluppo di Ethereum +Ethereum Hackers - chat Discord gestita da ETHGlobal: una comunità online per gli hacker di Ethereum in tutto il mondo +CryptoDevs - comunità Discord incentrata sullo sviluppo di Ethereum +EthStaker Discord - guida, istruzione, supporto e risorse gestite dalla comunità per gli staker attuali e potenziali +Team del sito web Ethereum.org - fai un salto e chatta sullo sviluppo web e sul design di ethereum.org con il team e i membri della comunità +Matos Discord - comunità di creatori web3 in cui si ritrovano costruttori, figure di spicco del settore e appassionati di Ethereum. Siamo appassionati di sviluppo, design e cultura del web3. Vieni a costruire con noi. +Solidity Matrix - chat per lo sviluppo in Solidity (Matrix) +Ethereum Stack Exchange - forum di domande e risposte +Peera Community Forum - forum decentralizzato di domande e risposte -## YouTube e Twitter {#youtube-and-twitter} +## YouTube e X (precedentemente Twitter) {#youtube-and-twitter} -Ethereum Foundation - Mantieniti aggiornato con le ultime notizie dalla Ethereum Foundation -@ethereum: Profilo ufficiale della Ethereum Foundation -@ethdotorg - Il portale per Ethereum, costruito per la nostra community globale in espansione -Elenco di profili Twitter influenti di Ethereum +Ethereum Foundation - Tieniti aggiornato sulle ultime novità della Ethereum Foundation +@ethereum - Account principale di Ethereum per la comunità +@ethereumfndn - Account ufficiale della Ethereum Foundation +@ethdotorg - Il portale per Ethereum, costruito per la nostra crescente comunità globale
- Maggiori informazioni sulle DAO + Scopri di più sulle DAO -
-
+ + \ No newline at end of file diff --git a/public/content/translations/it/community/research/index.md b/public/content/translations/it/community/research/index.md index 61e2c88901e..aaeabf65627 100644 --- a/public/content/translations/it/community/research/index.md +++ b/public/content/translations/it/community/research/index.md @@ -1,89 +1,89 @@ --- -title: Aree attive di ricerca su Ethereum -description: Esplora le diverse aree della ricerca aperta e scopri come partecipare. +title: Aree attive della ricerca su Ethereum +description: Esplora diverse aree di ricerca aperta e scopri come partecipare. lang: it --- # Aree attive della ricerca su Ethereum {#active-areas-of-ethereum-research} -Uno dei principali punti di forza di Ethereum è che è costantemente migliorata da una community attiva di ricerca e di ingegneria. Molte persone entusiaste e competenti in tutto il mondo vorrebbero dedicarsi alle questioni in sospeso di Ethereum, ma non sempre è facile scoprire quali siano queste questioni. Questa pagina illustra le principali aree di ricerca attive come guida approssimativa all'avanguardia di Ethereum. +Uno dei principali punti di forza di Ethereum è che una comunità attiva di ricerca e ingegneria lo migliora costantemente. Molte persone entusiaste e competenti in tutto il mondo vorrebbero applicarsi alle questioni in sospeso di Ethereum, ma non è sempre facile scoprire quali siano. Questa pagina delinea le principali aree di ricerca attive come guida approssimativa all'avanguardia di Ethereum. ## Come funziona la ricerca su Ethereum {#how-ethereum-research-works} -La ricerca su Ethereum è aperta e trasparente e incarna i principi della [Scienza Decentralizzata (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science). La cultura è quella di rendere gli strumenti e i risultati della ricerca il più possibile aperti e interattivi, ad esempio attraverso i notebook eseguibili. La ricerca su Ethereum si muove rapidamente, con le nuove scoperte pubblicate e discusse apertamente su forum come [ethresear.ch](https://ethresear.ch/) anziché raggiungere la comunità attraverso pubblicazioni tradizionali dopo cicli di revisione tra pari. +La ricerca su Ethereum è aperta e trasparente, incarnando i principi della [Scienza Decentralizzata (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science). La cultura è quella di rendere gli strumenti e i risultati della ricerca il più aperti e interattivi possibile, ad esempio attraverso notebook eseguibili. La ricerca su Ethereum si muove rapidamente, con nuove scoperte pubblicate e discusse apertamente su forum come [ethresear.ch](https://ethresear.ch/) piuttosto che raggiungere la comunità attraverso pubblicazioni tradizionali dopo cicli di revisione paritaria. -## Risorse generali per la ricerca {#general-research-resources} +## Risorse generali di ricerca {#general-research-resources} -Indipendentemente dall'argomento specifico, numerose informazioni sulla ricerca su Ethereum sono disponibili su [ethresear.ch](https://ethresear.ch) e sul [canale Discord Eth R&D](https://discord.gg/qGpsxSA). Questi sono i luoghi principali in cui i ricercatori di Ethereum discutono le idee e le opportunità di sviluppo più recenti. +Indipendentemente dall'argomento specifico, c'è una ricchezza di informazioni sulla ricerca su Ethereum che si possono trovare su [ethresear.ch](https://ethresear.ch) e sul [canale Discord Eth R&D](https://discord.gg/qGpsxSA). Questi sono i luoghi principali in cui i ricercatori di Ethereum discutono le ultime idee e opportunità di sviluppo. -Questa relazione pubblicata nel maggio 2022 da [DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) fornisce una buona panoramica della tabella di marcia di Ethereum. +Questo rapporto pubblicato a maggio 2022 da [DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) fornisce una buona panoramica del piano d'azione di Ethereum. ## Fonti di finanziamento {#sources-of-funding} -Puoi partecipare alla ricerca su Ethereum ed essere pagata/o per questo! Ad esempio, [la Ethereum Foundation](/foundation/) ha recentemente condotto un [round di finanziamento di sovvenzioni accademiche](https://esp.ethereum.foundation/academic-grants). Puoi trovare informazioni sulle varie opportunità di finanziamento attive e future alla [pagina delle sovvenzioni di Ethereum](/community/grants/). +Puoi partecipare alla ricerca su Ethereum ed essere pagato per farlo! Ad esempio, [la Ethereum Foundation](/foundation/) ha recentemente gestito un [round di finanziamento per sovvenzioni accademiche](https://esp.ethereum.foundation/academic-grants). Puoi trovare informazioni sulle opportunità di finanziamento attive e imminenti sulla [pagina delle sovvenzioni di Ethereum](/community/grants/). ## Ricerca sul protocollo {#protocol-research} -La ricerca sul protocollo riguarda il livello di base di Ethereum, ovvero l'insieme di regole che definiscono come i nodi si connettono, comunicano, scambiano e memorizzano i dati di Ethereum e raggiungono il consenso sullo stato della blockchain. La ricerca sul protocollo si divide in due categorie di livello superiore: consenso ed esecuzione. +La ricerca sul protocollo riguarda il livello di base di Ethereum: l'insieme di regole che definiscono come i nodi si connettono, comunicano, scambiano e archiviano i dati di Ethereum e raggiungono il consenso sullo stato della blockchain. La ricerca sul protocollo è divisa in due categorie principali: consenso ed esecuzione. ### Consenso {#consensus} -La ricerca sul consenso riguarda il [meccanismo del proof-of-stake di Ethereum](/developers/docs/consensus-mechanisms/pos/). Alcuni esempi di argomenti di ricerca sul consenso sono: +La ricerca sul consenso riguarda il [meccanismo di prova di stake di Ethereum](/developers/docs/consensus-mechanisms/pos/). Alcuni esempi di argomenti di ricerca sul consenso sono: - identificare e correggere le vulnerabilità; -- quantificare la sicurezza criptoeconomica; -- aumentare la sicurezza o le prestazioni delle implementazioni del client; -- e lo sviluppo di client leggeri. +- quantificare la sicurezza crittoeconomica; +- aumentare la sicurezza o le prestazioni delle implementazioni dei client; +- e sviluppare client leggeri. -Oltre alla ricerca prospettica, si stanno studiando alcune riprogettazioni fondamentali del protocollo, come la finalità del singolo slot, per consentire miglioramenti significativi a Ethereum. Inoltre, l'efficienza, la sicurezza e il monitoraggio del networking peer-to-peer tra client di consenso sono altri importanti temi di ricerca. +Oltre alla ricerca lungimirante, si stanno studiando alcune riprogettazioni fondamentali del protocollo, come la finalità a singolo slot, per consentire miglioramenti significativi a Ethereum. Inoltre, l'efficienza, la sicurezza e il monitoraggio della rete peer-to-peer tra i client di consenso sono anch'essi importanti argomenti di ricerca. #### Letture di base {#background-reading} -- [Introduzione al proof-of-stake](/developers/docs/consensus-mechanisms/pos/) -- [Documento Casper-FFG](https://arxiv.org/abs/1710.09437) +- [Introduzione alla prova di stake](/developers/docs/consensus-mechanisms/pos/) +- [Documento su Casper-FFG](https://arxiv.org/abs/1710.09437) - [Spiegazione di Casper-FFG](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) -- [Documento Gasper](https://arxiv.org/abs/2003.03052) +- [Documento su Gasper](https://arxiv.org/abs/2003.03052) #### Ricerca recente {#recent-research} - [Consenso su Ethresear.ch](https://ethresear.ch/c/consensus/29) -- [Dlemma disponibilità/finalità](https://arxiv.org/abs/2009.04987) -- [Finalità del singolo slot](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) -- [Separazione propositore-costruttore](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [Dilemma Disponibilità/Finalità](https://arxiv.org/abs/2009.04987) +- [Finalità a singolo slot](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [Separazione tra proponente e costruttore](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) ### Esecuzione {#execution} -Il livello di esecuzione riguarda l'esecuzione delle transazioni, l'esecuzione della [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/) e la generazione dei carichi utili di esecuzione da passare al livello di consenso. Ci sono molte aree di ricerca attive, tra cui: +Il livello di esecuzione si occupa di eseguire le transazioni, far funzionare la [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/) e generare i payload di esecuzione da passare al livello di consenso. Ci sono molte aree di ricerca attive, tra cui: -- costruzione del supporto per client leggeri; -- ricerca dei limiti di gas; -- e l'incorporazione di nuove strutture di dati (ad es. alberi di Verkle). +- sviluppare il supporto per i client leggeri; +- ricercare i limiti del gas; +- e incorporare nuove strutture dati (ad es., i Verkle Tries). #### Letture di base {#background-reading-1} -- [Introduzione alla EVM](/developers/docs/evm) +- [Introduzione all'EVM](/developers/docs/evm) - [Livello di esecuzione su Ethresear.ch](https://ethresear.ch/c/execution-layer-research/37) #### Ricerca recente {#recent-research-1} -- [Ottimizzazioni di database](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) +- [Ottimizzazioni del database](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) - [Scadenza dello stato](https://notes.ethereum.org/@vbuterin/state_expiry_eip) - [Percorsi verso la scadenza dello stato](https://hackmd.io/@vbuterin/state_expiry_paths) -- [Verkle e proposta di scadenza dello stato](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) -- [Gestione dello storico](https://eips.ethereum.org/EIPS/eip-4444) +- [Proposta su Verkle e scadenza dello stato](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) +- [Gestione della cronologia](https://eips.ethereum.org/EIPS/eip-4444) - [Alberi di Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Campionamento della disponibilità dei dati](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) -## Sviluppo del client {#client-development} +## Sviluppo dei client {#client-development} -I client di Ethereum sono implementazioni del protocollo di Ethereum. Lo sviluppo del client trasforma i risultati della ricerca sul protocollo in realtà incorporandoli in questi client. Lo sviluppo del client include l'aggiornamento delle specifiche del client così come la creazione di specifiche implementazioni. +I client di Ethereum sono implementazioni del protocollo Ethereum. Lo sviluppo dei client trasforma i risultati della ricerca sul protocollo in realtà integrandoli in questi client. Lo sviluppo dei client include l'aggiornamento delle specifiche dei client e la creazione di implementazioni specifiche. -È necessario un nodo di Ethereum per eseguire due pezzi di software: +Un nodo di Ethereum deve eseguire due software: -1. un client di consenso per tenere traccia della testa della blochchain, dei blocchi di gossip e per gestire la logica di consenso -2. un client di esecuzione per supportare la macchina virtuale di Ethereum ed eseguire le transazioni e i contratti intelligenti +1. un client di consenso per tenere traccia della testa della blockchain, diffondere i blocchi e gestire la logica di consenso +2. un client di esecuzione per supportare la macchina virtuale di Ethereum ed eseguire transazioni e contratti intelligenti -Consulta la [pagina dei nodi e dei client](/developers/docs/nodes-and-clients/) per maggiori dettagli su nodi e client e per un elenco di tutte le implementazioni di client correnti. Puoi anche trovare una cronologia di tutti gli aggiornamenti di Ethereum nella [pagina della cronologia](/ethereum-forks/). +Consulta la [pagina dei nodi e dei client](/developers/docs/nodes-and-clients/) per maggiori dettagli su nodi e client e per un elenco di tutte le attuali implementazioni dei client. Puoi anche trovare una cronologia di tutti gli aggiornamenti di Ethereum sulla [pagina della cronologia](/ethereum-forks/). ### Client di esecuzione {#execution-clients} @@ -93,15 +93,15 @@ Consulta la [pagina dei nodi e dei client](/developers/docs/nodes-and-clients/) ### Client di consenso {#consensus-clients} - [Specifiche del client di consenso](https://github.com/ethereum/consensus-specs) -- [Specifiche dell'API Beacon](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) +- [Specifiche dell'API della Beacon Chain](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) -## Ridimensionamento e prestazioni {#scaling-and-performance} +## Scalabilità e prestazioni {#scaling-and-performance} -Il ridimensionamento di Ethereum è una grande area di interesse per i ricercatori Ethereum. Gli attuali approcci prevedono di scaricare le transazioni nei rollup e di renderle il più economiche possibile usando i blob di dati. Informazioni introduttive sul ridimensionamento di Ethereum sono disponibili alla nostra [pagina sul ridimensionamento](/developers/docs/scaling). +La scalabilità di Ethereum è un'ampia area di interesse per i ricercatori di Ethereum. Gli approcci attuali includono lo scaricamento delle transazioni sui rollup e il renderle il più economiche possibile utilizzando i blob di dati. Informazioni introduttive sulla scalabilità di Ethereum sono disponibili sulla nostra [pagina sulla scalabilità](/developers/docs/scaling). ### Livello 2 {#layer-2} -Attualmente esistono diversi protocolli di Livello 2 che ridimensionano Ethereum utilizzando tecniche diverse per l'esecuzione in lotto delle transazioni e per fissarle sul Livello 1 di Ethereum. Si tratta di un argomento in rapida crescita con un grande potenziale di ricerca e sviluppo. +Esistono ora diversi protocolli di livello 2 che scalano Ethereum utilizzando diverse tecniche per raggruppare le transazioni e proteggerle sul livello 1 di Ethereum. Questo è un argomento in rapida crescita con un grande potenziale di ricerca e sviluppo. #### Letture di base {#background-reading-2} @@ -111,38 +111,38 @@ Attualmente esistono diversi protocolli di Livello 2 che ridimensionano Ethereum #### Ricerca recente {#recent-research-2} - [Ordinamento equo di Arbitrum per i sequenziatori](https://eprint.iacr.org/2021/1465) -- [Ethresear.ch Livello 2](https://ethresear.ch/c/layer-2/32) -- [Tabella di marcia incentrata sui rollup](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) +- [Livello 2 su Ethresear.ch](https://ethresear.ch/c/layer-2/32) +- [Piano d'azione incentrato sui rollup](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) - [L2Beat](https://l2beat.com/) ### Ponti {#bridges} -Una particolare area di Livello 2 che richiede maggior ricerca e sviluppo è quella dei ponti sicuri e performanti. Questa include i ponti tra diversi Livelli 2 e ponti tra Livello 1 e Livello 2. Si tratta di un'area di ricerca particolarmente importante perché i ponti sono comunemente presi di mira dagli hacker. +Un'area particolare del livello 2 che richiede maggiore ricerca e sviluppo è quella dei ponti sicuri e performanti. Ciò include i ponti tra vari livelli 2 e i ponti tra il livello 1 e il livello 2. Questa è un'area di ricerca particolarmente importante perché i ponti sono comunemente presi di mira dagli hacker. #### Letture di base {#background-reading-3} -- [Introduzione ai ponti della blockchain](/bridges/) +- [Introduzione ai ponti blockchain](/bridges/) - [Vitalik sui ponti](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) -- [Articolo sui ponti della blockchain](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Valore bloccato nei ponti](https://dune.com/eliasimos/Bridge-Away-\(from-Ethereum\)) +- [Articolo sui ponti blockchain](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) +- [Valore bloccato nei ponti]() #### Ricerca recente {#recent-research-3} -- [Validazion di ponti](https://stonecoldpat.github.io/images/validatingbridges.pdf) +- [Convalida dei ponti](https://stonecoldpat.github.io/images/validatingbridges.pdf) ### Frammentazione {#sharding} -La frammentazione (sharding) della blockchain di Ethereum fa parte della tabella di marcia del suo sviluppo da lungo tempo. Tuttavia, nuove soluzioni di ridimensionamento come il "Danksharding" sono attualmente al centro della discussione. +La frammentazione della blockchain di Ethereum è stata a lungo parte del piano d'azione di sviluppo. Tuttavia, nuove soluzioni di scalabilità come il "Danksharding" stanno attualmente assumendo un ruolo centrale. -Il precursore del Danksharding completo è noto come Proto-Danksharding ed è diventato operativo con l'aggiornamento della rete Cancun-Deneb ("Dencun"). +Il precursore del Danksharding completo, noto come Proto-Danksharding, è stato lanciato con l'aggiornamento della rete Cancun-Deneb ("Dencun"). -[Ulteriori informazioni sull'aggiornamento Dencun](/roadmap/dencun/) +[Maggiori informazioni sull'aggiornamento Dencun](/roadmap/dencun/) #### Letture di base {#background-reading-4} - [Note sul Proto-Danksharding](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) - [Video di Bankless sul Danksharding](https://www.youtube.com/watch?v=N5p0TB77flM) -- [Compendio di ricerca sullo sharding di Ethereum](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) +- [Compendio della ricerca sulla frammentazione di Ethereum](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) - [Danksharding (Polynya)](https://polynya.medium.com/danksharding-36dc0c8067fe) #### Ricerca recente {#recent-research-4} @@ -152,7 +152,7 @@ Il precursore del Danksharding completo è noto come Proto-Danksharding ed è di ### Hardware {#hardware} -[Eseguire nodi](/developers/docs/nodes-and-clients/run-a-node/) su un hardware modesto è fondamentale per mantenere Ethereum decentralizzata. Pertanto, la ricerca attiva sulla minimizzazione dei requisiti hardware per l'esecuzione dei nodi è un'area di ricerca importante. +[Eseguire nodi](/developers/docs/nodes-and-clients/run-a-node/) su hardware modesto è fondamentale per mantenere Ethereum decentralizzato. Pertanto, la ricerca attiva per ridurre al minimo i requisiti hardware per eseguire i nodi è un'importante area di ricerca. #### Letture di base {#background-reading-5} @@ -160,53 +160,53 @@ Il precursore del Danksharding completo è noto come Proto-Danksharding ed è di #### Ricerca recente {#recent-research-5} -- [ecdsa sui FPGA](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ecdsa su FPGA](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Sicurezza {#security} -La sicurezza è un argomento ampio che può includere la prevenzione di spam/truffe, la sicurezza dei portafogli, la sicurezza dell'hardware, la sicurezza cripto-economica, la ricerca di bug e il test di applicazioni e software per client e la gestione delle chiavi. Contribuire alla conoscenza in questi ambiti aiuterà a stimolarne l'adozione a livello generale. +La sicurezza è un argomento ampio che potrebbe includere la prevenzione di spam/truffe, la sicurezza dei portafogli, la sicurezza hardware, la sicurezza crittoeconomica, la ricerca di bug e il test di applicazioni e software client, nonché la gestione delle chiavi. Contribuire alla conoscenza in queste aree aiuterà a stimolare l'adozione di massa. -### Crittografia & ZKP {#cryptography--zkp} +### Crittografia e ZKP {#cryptography--zkp} -Le prove di conoscenza zero (ZKP) e la crittografia sono fondamentali per creare privacy e sicurezza in Ethereum e nelle sue applicazioni. La conoscenza zero è uno ambito relativamente giovane ma in rapida evoluzione, con molte opportunità di ricerca e sviluppo aperte. Alcune possibilità includono lo sviluppo di implementazioni più efficienti dell'[algoritmo di hashing Keccak](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview), la ricerca di impegni polinomiali migliori di quelli attualmente esistenti o la riduzione del costo dei circuiti ECDSA di generazione delle chiavi pubbliche e di verifica delle firme. +Le prove a conoscenza-zero (ZKP) e la crittografia sono fondamentali per integrare privacy e sicurezza in Ethereum e nelle sue applicazioni. La conoscenza-zero è uno spazio relativamente giovane ma in rapida evoluzione con molte opportunità aperte di ricerca e sviluppo. Alcune possibilità includono lo sviluppo di implementazioni più efficienti dell'[algoritmo di hashing Keccak](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview), la ricerca di impegni polinomiali migliori rispetto a quelli attualmente esistenti o la riduzione del costo della generazione di chiavi pubbliche ecdsa e dei circuiti di verifica delle firme. #### Letture di base {#background-reading-6} -- [0xparc blog](https://0xparc.org/blog) +- [Blog di 0xparc](https://0xparc.org/blog) - [zkp.science](https://zkp.science/) - [Podcast Zero Knowledge](https://zeroknowledge.fm/) #### Ricerca recente {#recent-research-6} -- [Progressi recenti nella crittografia a curva ellittica](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) +- [Recenti progressi nella crittografia a curva ellittica](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) - [ZK su Ethresear.ch](https://ethresear.ch/c/zk-s-nt-arks/13) ### Portafogli {#wallets} -I portafogli di Ethereum possono essere estensioni del browser, applicazioni desktop e mobili o contratti intelligenti su Ethereum. Sono in corso ricerche sui portafogli con recupero sociale che riducono alcuni dei rischi associati alla gestione delle chiavi da parte dei singoli utenti. Allo sviluppo dei portafogli si associa la ricerca di forme alternative di astrazione del conto, un'importante area di ricerca nascente. +I portafogli di Ethereum possono essere estensioni del browser, app desktop e mobili o contratti intelligenti su Ethereum. C'è una ricerca attiva sui portafogli a recupero sociale che riducono alcuni dei rischi associati alla gestione delle chiavi da parte del singolo utente. Associata allo sviluppo dei portafogli c'è la ricerca su forme alternative di astrazione dell'account, che è un'importante area di ricerca nascente. #### Letture di base {#background-reading-7} -- [Introduzione ai portafogli elettronici](/wallets/) +- [Introduzione ai portafogli](/wallets/) - [Introduzione alla sicurezza dei portafogli](/security/) -- [Ethresear.ch Sicurezza](https://ethresear.ch/tag/security) -- [Astrazione del conto EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) -- [Astrazione del conto EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) +- [Sicurezza su Ethresear.ch](https://ethresear.ch/tag/security) +- [EIP-2938 Astrazione dell'account](https://eips.ethereum.org/EIPS/eip-2938) +- [EIP-4337 Astrazione dell'account](https://eips.ethereum.org/EIPS/eip-4337) #### Ricerca recente {#recent-research-7} -- [Portafogli di contratti intelligenti focalizzati sulla validazione](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) -- [Il futuro dei conti](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) -- [Codici operativi EIP-3074 AUTH e AUTHCALL](https://eips.ethereum.org/EIPS/eip-3074) -- [Pubblicare codice a un indirizzo EOA](https://eips.ethereum.org/EIPS/eip-5003) +- [Portafogli di contratti intelligenti incentrati sulla convalida](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [Il futuro degli account](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [EIP-3074 Opcode AUTH e AUTHCALL](https://eips.ethereum.org/EIPS/eip-3074) +- [Pubblicazione di codice a un indirizzo EOA](https://eips.ethereum.org/EIPS/eip-5003) -## Community, educazione e partecipazione {#community-education-and-outreach} +## Comunità, istruzione e divulgazione {#community-education-and-outreach} -Introdurre nuovi utenti a Ethereum richiede nuove risorse didattiche e nuovi approcci alla partecipazione. Ciò potrebbe includere post e articoli di blog, libri, podcast, meme, risorse didattiche, eventi e qualsiasi altra cosa che costruisca comunità, accolga nuovi principianti ed educhi le persone su Ethereum. +L'inserimento di nuovi utenti su Ethereum richiede nuove risorse educative e approcci alla divulgazione. Ciò potrebbe includere post di blog e articoli, libri, podcast, meme, risorse didattiche, eventi e qualsiasi altra cosa che costruisca comunità, accolga i nuovi arrivati ed educhi le persone su Ethereum. ### UX/UI {#uxui} -Per coinvolgere più persone in Ethereum, l'ecosistema deve migliorare l'UX/UI (esperienza e interfaccia utente). Ciò richiederà ai progettisti e agli esperti di prodotto di riesaminare il design di portafogli e applicazioni. +Per inserire più persone su Ethereum, l'ecosistema deve migliorare l'UX/UI. Ciò richiederà a designer ed esperti di prodotto di riesaminare il design di portafogli e app. #### Letture di base {#background-reading-8} @@ -214,77 +214,77 @@ Per coinvolgere più persone in Ethereum, l'ecosistema deve migliorare l'UX/UI ( #### Ricerca recente {#recent-research-8} -- [Discord di Web3 Design](https://discord.gg/FsCFPMTSm9) +- [Discord sul Web3 Design](https://discord.gg/FsCFPMTSm9) - [Principi di Web3 Design](https://www.web3designprinciples.com/) -- [Discussione sulla UX di Ethereum Magicians](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) +- [Discussione sull'UX di Ethereum Magicians](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) ### Economia {#economics} -La ricerca economica in Ethereum segue in linea di massima due approcci: convalidare la sicurezza dei meccanismi che si basano su incentivi economici ("microeconomia") e analizzare i flussi di valore tra protocolli, applicazioni e utenti ("macroeconomia"). Esistono complessi fattori cripto-economici relativi alla risorsa nativa di Ethereum (ether) e ai token costruiti su di essa (ad esempio gli NFT e i token ERC20). +La ricerca economica in Ethereum segue in generale due approcci: convalidare la sicurezza dei meccanismi basati su incentivi economici ("microeconomia") e analizzare i flussi di valore tra protocolli, applicazioni e utenti ("macroeconomia"). Ci sono complessi fattori crittoeconomici relativi all'asset nativo di Ethereum (ether) e ai token costruiti su di esso (ad esempio NFT e token ERC-20). #### Letture di base {#background-reading-9} -- [Gruppo d'incentivi robusti](https://rig.ethereum.org/) -- [Workshop di ETHconomics a Devconnect](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) +- [Robust Incentives Group](https://rig.ethereum.org/) +- [Workshop ETHconomics al Devconnect](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) #### Ricerca recente {#recent-research-9} -- [Analisi empirica su EIP1559](https://arxiv.org/abs/2201.05574) -- [Equilibrio della quantità circolante](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) -- [Quantificare il MEV: quanto è buia la foresta?](https://arxiv.org/abs/2101.05511) +- [Analisi empirica dell'EIP-1559](https://arxiv.org/abs/2201.05574) +- [Equilibrio dell'offerta circolante](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) +- [Quantificare il MEV: Quanto è oscura la foresta?](https://arxiv.org/abs/2101.05511) -### Mercati degli spazi di blocco e delle commissioni {#blockspace-fee-markets} +### Spazio dei blocchi e mercati delle commissioni {#blockspace-fee-markets} -I mercati degli spazi di blocco governano l'inclusione delle transazioni dell'utente finale, sia direttamente su Ethereum (Livello 1) sia su reti collegate da un ponte, ad es. i rollup (Livello 2). Su Ethereum, le transazioni sono inviate al mercato delle commissioni distribuito all'interno del protocollo come EIP-1559, proteggendo la catena dallo spam e dalla congestione dei prezzi. Su entrambi i livelli, le transazioni possono produrre esternalità, note come Valore estraibile massimo (MEV), che inducono la creazione di nuove strutture di mercato per cogliere o gestire tali esternalità. +I mercati dello spazio dei blocchi governano l'inclusione delle transazioni degli utenti finali, direttamente su Ethereum (Livello 1) o su reti collegate tramite ponti, ad es. i rollup (Livello 2). Su Ethereum, le transazioni vengono inviate al mercato delle commissioni implementato nel protocollo come EIP-1559, proteggendo la catena dallo spam e prezzando la congestione. Su entrambi i livelli, le transazioni possono produrre esternalità, note come Valore Massimo Estraibile (MEV), che inducono nuove strutture di mercato per catturare o gestire queste esternalità. #### Letture di base {#background-reading-10} -- [Progettazione del meccanismo delle commissioni sulle transazioni per la blockchain di Ethereum: un'analisi economica di EIP-1559 (Tim Roughgarden, 2020)](https://timroughgarden.org/papers/eip1559.pdf) -- [Simulazioni di EIP-1559 (Gruppo di incentivi robusti)](https://ethereum.github.io/abm1559) -- [Economia dei rollup dai primi principi](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) -- [Flash Boys 2.0: frontrunning, riordinamento delle transazioni e instabilità del consenso nelle borse decentralizzate] (https://arxiv.org/abs/1904.05234) +- [Progettazione del meccanismo delle commissioni di transazione per la blockchain di Ethereum: Un'analisi economica dell'EIP-1559 (Tim Roughgarden, 2020)](https://timroughgarden.org/papers/eip1559.pdf) +- [Simulazioni dell'EIP-1559 (Robust Incentives Group)](https://ethereum.github.io/abm1559) +- [Economia dei rollup dai principi primi](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) +- [Flash Boys 2.0: Frontrunning, riordino delle transazioni e instabilità del consenso negli exchange decentralizzati](https://arxiv.org/abs/1904.05234) #### Ricerca recente {#recent-research-10} -- [Presentazione video di EIP-1559 multidimensionale](https://youtu.be/QbR4MTgnCko) -- [MEV interdominio](http://arxiv.org/abs/2112.01472) -- [Aste di MEV](https://ethresear.ch/t/mev-auction-auctioning-transaction-ordering-rights-as-a-solution-to-miner-extractable-value/6788) +- [Presentazione video sull'EIP-1559 multidimensionale](https://youtu.be/QbR4MTgnCko) +- [MEV tra domini](http://arxiv.org/abs/2112.01472) +- [Aste MEV](https://ethresear.ch/t/mev-auction-auctioning-transaction-ordering-rights-as-a-solution-to-miner-extractable-value/6788) -### Incentivi del proof-of-stake {#proof-of-stake-incentives} +### Incentivi della prova di stake {#proof-of-stake-incentives} -I validatori utilizzano la risorsa nativa di Ethereum (ether) come garanzia contro i comportamenti disonesti. La criptoeconomia di questo meccanismo determina la sicurezza della rete. Validatori esperti possono essere in grado di sfruttare le sfumature del livello d'incentivazione per lanciare attacchi espliciti. +I validatori utilizzano l'asset nativo di Ethereum (ether) come garanzia contro comportamenti disonesti. La crittoeconomia di questo determina la sicurezza della rete. Validatori sofisticati potrebbero essere in grado di sfruttare le sfumature del livello degli incentivi per lanciare attacchi espliciti. #### Letture di base {#background-reading-11} - [Masterclass sull'economia di Ethereum e modello economico](https://github.com/CADLabs/ethereum-economic-model) -- [Simulazioni di incentivi PoS (Gruppo di incentivi robusti)](https://ethereum.github.io/beaconrunner/) +- [Simulazioni degli incentivi PoS (Robust Incentives Group)](https://ethereum.github.io/beaconrunner/) #### Ricerca recente {#recent-research-11} -- [Aumentare la resistenza alla censura delle transazioni soggette alla separazione propositore/costruttore (PBS)](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) -- [Tre attacchi a Ethereum basata su PoS](https://arxiv.org/abs/2110.10086) +- [Aumentare la resistenza alla censura delle transazioni con la separazione tra proponente e costruttore (PBS)](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) +- [Tre attacchi alla PoS di Ethereum](https://arxiv.org/abs/2110.10086) -### Liquid staking e derivati {#liquid-staking-and-derivatives} +### Staking liquido e derivati {#liquid-staking-and-derivatives} -Il liquid staking consente agli utenti con meno di 32 ETH di ricevere i rendimenti dallo staking scambiando ether con un token che rappresenta l'ether in staking e che può essere utilizzato nella DeFi. Tuttavia, gli incentivi e le dinamiche di mercato associate al liquid staking sono ancora in fase di scoperta, così come i suoi effetti sulla sicurezza di Ethereum (ad es. i rischi di centralizzazione). +Lo staking liquido consente agli utenti con meno di 32 ETH di ricevere rendimenti di staking scambiando ether con un token che rappresenta l'ether in staking e che può essere utilizzato nella DeFi. Tuttavia, gli incentivi e le dinamiche di mercato associati allo staking liquido sono ancora in fase di scoperta, così come il suo effetto sulla sicurezza di Ethereum (ad es., i rischi di centralizzazione). #### Letture di base {#background-reading-12} -- [Liquid staking su Ethresear.ch](https://ethresear.ch/search?q=liquid%20staking) -- [Lido: La strada verso lo staking senza fiducia di Ethereum](https://blog.lido.fi/the-road-to-trustless-ethereum-staking/) +- [Staking liquido su Ethresear.ch](https://ethresear.ch/search?q=liquid%20staking) +- [Lido: La strada verso lo staking di Ethereum senza fiducia (trustless)](https://blog.lido.fi/the-road-to-trustless-ethereum-staking/) - [Rocket Pool: Introduzione al protocollo di staking](https://medium.com/rocket-pool/rocket-pool-staking-protocol-part-1-8be4859e5fbd) #### Ricerca recente {#recent-research-12} - [Gestione dei prelievi da Lido](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) - [Credenziali di prelievo](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) -- [I rischi dei derivati di liquid staking](https://notes.ethereum.org/@djrtwo/risks-of-lsd) +- [I rischi dei derivati di staking liquido](https://notes.ethereum.org/@djrtwo/risks-of-lsd) ## Test {#testing} ### Verifica formale {#formal-verification} -La verifica formale consiste nello scrivere codice per verificare che le specifiche del consenso di Ethereum siano corrette e prive di bug. Esiste una versione eseguibile della specifica scritta in Python che richiede manutenzione e sviluppo. Ulteriori ricerche possono contribuire a migliorare l'implementazione di Python della specifica e ad aggiungere strumenti in grado di verificare in modo più robusto la correttezza e di identificare i problemi. +La verifica formale consiste nello scrivere codice per verificare che le specifiche di consenso di Ethereum siano corrette e prive di bug. Esiste una versione eseguibile delle specifiche scritta in Python che richiede manutenzione e sviluppo. Ulteriori ricerche possono aiutare a migliorare l'implementazione in Python delle specifiche e ad aggiungere strumenti in grado di verificare in modo più robusto la correttezza e identificare i problemi. #### Letture di base {#background-reading-13} @@ -294,42 +294,42 @@ La verifica formale consiste nello scrivere codice per verificare che le specifi #### Ricerca recente {#recent-research-13} - [Verifica formale del contratto di deposito](https://github.com/runtimeverification/deposit-contract-verification) -- [Verifica formale delle specifiche della catena Beacon](https://github.com/runtimeverification/deposit-contract-verification) +- [Verifica formale delle specifiche della Beacon Chain](https://github.com/runtimeverification/deposit-contract-verification) ## Scienza dei dati e analisi {#data-science-and-analytics} -C'è necessità di un maggior numero di strumenti di analisi dei dati e di pannelli di controllo che forniscano informazioni dettagliate sull'attività di Ethereum e sullo stato di salute della rete. +C'è bisogno di più strumenti di analisi dei dati e dashboard che forniscano informazioni dettagliate sull'attività su Ethereum e sulla salute della rete. ### Letture di base {#background-reading-14} -- [Analisi di Dune](https://dune.com/browse/dashboards) -- [Pannello di controllo sulla diversità dei client](https://clientdiversity.org/) +- [Dune Analytics](https://dune.com/browse/dashboards) +- [Dashboard sulla diversità dei client](https://clientdiversity.org/) #### Ricerca recente {#recent-research-14} -- [Analisi dei dati del gruppo d'incentivi robusti](https://rig.ethereum.org/) +- [Analisi dei dati del Robust Incentives Group](https://rig.ethereum.org/) -## Applicazioni e strumenti {#apps-and-tooling} +## App e strumenti {#apps-and-tooling} -Il livello di applicazione supporta un ecosistema eterogeneo di programmi che regolano le transazioni sul livello di base di Ethereum. I team di sviluppo trovano sempre nuovi modi per sfruttare Ethereum per creare versioni componibili, senza permessi e resistenti alla censura di importanti applicazioni Web2 o per creare concetti nativi di Web3 completamente nuovi. Allo stesso tempo, si stanno sviluppando nuovi strumenti che rendono meno complessa la costruzione di dApp su Ethereum. +Il livello dell'applicazione supporta un ecosistema diversificato di programmi che regolano le transazioni sul livello di base di Ethereum. I team di sviluppo trovano costantemente nuovi modi per sfruttare Ethereum per creare versioni componibili, senza permessi e resistenti alla censura di importanti app Web2 o creare concetti nativi Web3 completamente nuovi. Allo stesso tempo, vengono sviluppati nuovi strumenti che rendono meno complessa la creazione di dApp su Ethereum. ### DeFi {#defi} -La finanza decentralizzata (DeFi) è una delle principali classi di applicazioni costruite su Ethereum. La DeFi mira a creare "Lego di denaro" componibili che consentano agli utenti di memorizzare, trasferire, prestare, prendere in prestito e investire criptorisorse utilizzando contratti intelligenti. La DeFi è un ambito in rapida evoluzione e in continuo aggiornamento. La ricerca di protocolli sicuri, efficienti e accessibili è costantemente necessaria. +La finanza decentralizzata (DeFi) è una delle principali classi di applicazioni costruite su Ethereum. La DeFi mira a creare "lego monetari" componibili che consentano agli utenti di archiviare, trasferire, prestare, prendere in prestito e investire cripto-asset utilizzando contratti intelligenti. La DeFi è uno spazio in rapida evoluzione che si aggiorna costantemente. È continuamente necessaria la ricerca su protocolli sicuri, efficienti e accessibili. #### Letture di base {#background-reading-15} - [DeFi](/defi/) -- [Coinbase: Che cos'è la DeFi?](https://www.coinbase.com/learn/crypto-basics/what-is-defi) +- [Coinbase: Cos'è la DeFi?](https://www.coinbase.com/learn/crypto-basics/what-is-defi) #### Ricerca recente {#recent-research-15} - [Finanza decentralizzata, proprietà centralizzata?](https://arxiv.org/pdf/2012.09306.pdf) -- [Optimism: La strada verso le transazioni sub-dollaro](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) +- [Optimism: La strada verso transazioni sotto il dollaro](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) ### DAO {#daos} -Un caso d'uso di grande impatto per Ethereum è la capacità di organizzarsi in modo decentralizzato attraverso l'uso delle DAO. Ci sono molte ricerche attive su come le DAO su Ethereum possano essere sviluppate e utilizzate per eseguire forme di governance migliorate, come strumento di coordinamento a fiducia minima, ampliando notevolmente le opzioni dei cittadini al di là delle società e delle organizzazioni tradizionali. +Un caso d'uso di grande impatto per Ethereum è la capacità di organizzarsi in modo decentralizzato attraverso l'uso delle DAO. C'è molta ricerca attiva su come le DAO su Ethereum possano essere sviluppate e utilizzate per eseguire forme migliorate di governance, come strumento di coordinamento a fiducia ridotta al minimo, espandendo notevolmente le opzioni delle persone oltre le aziende e le organizzazioni tradizionali. #### Letture di base {#background-reading-16} @@ -338,15 +338,15 @@ Un caso d'uso di grande impatto per Ethereum è la capacità di organizzarsi in #### Ricerca recente {#recent-research-16} -- [Mappatura dell'ecosistema DAO](https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) +- [Mappatura dell'ecosistema delle DAO](https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) ### Strumenti per sviluppatori {#developer-tools} -Gli strumenti per gli sviluppatori di Ethereum stanno rapidamente migliorando. C'è molta ricerca attiva e sviluppo da portare avanti in quest'area generale. +Gli strumenti per gli sviluppatori di Ethereum stanno migliorando rapidamente. C'è molta ricerca e sviluppo attivi da fare in quest'area generale. #### Letture di base {#background-reading-17} -- [Strumenti suddivisi per linguaggio di programmazione](/developers/docs/programming-languages/) +- [Strumenti per linguaggio di programmazione](/developers/docs/programming-languages/) - [Framework per sviluppatori](/developers/docs/frameworks/) - [Elenco degli strumenti per sviluppatori di consenso](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Standard dei token](/developers/docs/standards/tokens/) @@ -354,46 +354,46 @@ Gli strumenti per gli sviluppatori di Ethereum stanno rapidamente migliorando. C #### Ricerca recente {#recent-research-17} -- [Canale Discord degli strumenti di consenso di Eth R&D](https://discordapp.com/channels/595666850260713488/746343380900118528) +- [Canale Discord Eth R&D sugli strumenti di consenso](https://discordapp.com/channels/595666850260713488/746343380900118528) ### Oracoli {#oracles} -Gli oracoli importano dati off-chain sulla blockchain in modo decentralizzato e senza permessi. Ottenere questi dati on-chain consente alle dApp di reagire ai fenomeni del mondo reale, come le fluttuazioni dei prezzi delle risorse del mondo reale, gli eventi delle app off-chain o persino i cambiamenti meteorologici. +Gli oracoli importano dati fuori catena sulla blockchain in modo decentralizzato e senza permessi. Portare questi dati on-chain consente alle dApp di essere reattive a fenomeni del mondo reale come le fluttuazioni dei prezzi negli asset del mondo reale, eventi in app fuori catena o persino cambiamenti meteorologici. #### Letture di base {#background-reading-18} - [Introduzione agli oracoli](/developers/docs/oracles/) -#### Ricerche recenti {#recent-research-18} +#### Ricerca recente {#recent-research-18} -- [Sondaggio sugli oracoli delle blockchain](https://arxiv.org/pdf/2004.07140.pdf) +- [Sondaggio sugli oracoli blockchain](https://arxiv.org/pdf/2004.07140.pdf) - [White paper di Chainlink](https://chain.link/whitepaper) -### Sicurezza delle applicazioni {#app-security} +### Sicurezza delle app {#app-security} -Gli attacchi su Ethereum generalmente sfruttano le vulnerabilità di singole applicazioni piuttosto che del protocollo stesso. Gli hacker e gli sviluppatori di app sono coinvolti in una battaglia per sviluppare nuovi attacchi e nuove difese. Questo significa che è sempre necessaria un'importante attività di ricerca e sviluppo per tenere le app al sicuro dagli hacker. +Gli attacchi informatici su Ethereum generalmente sfruttano le vulnerabilità nelle singole applicazioni piuttosto che nel protocollo stesso. Hacker e sviluppatori di app sono bloccati in una corsa agli armamenti per sviluppare nuovi attacchi e difese. Ciò significa che è sempre necessaria un'importante ricerca e sviluppo per mantenere le app al sicuro dagli attacchi. #### Letture di base {#background-reading-19} -- [Rapporto sull'exploit "wormhole"](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) -- [Elenco degli hack post-mortem dei contratti Ethereum](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) -- [Ultime notizie su Rekt](https://twitter.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) +- [Rapporto sull'exploit di Wormhole](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) +- [Elenco delle analisi post-mortem degli attacchi ai contratti di Ethereum](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) +- [Rekt News](https://x.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) #### Ricerca recente {#recent-research-19} -- [Ethresear.ch Applicazioni](https://ethresear.ch/c/applications/18) +- [Applicazioni su Ethresear.ch](https://ethresear.ch/c/applications/18) ### Stack tecnologico {#technology-stack} -La decentralizzazione dell'intero stack tecnologico di Ethereum è un'importante area di ricerca. Attualmente, le dApp su Ethereum comunemente hanno alcuni punti di centralizzazione perché si basano su strumenti o infrastrutture centralizzati. +Decentralizzare l'intero stack tecnologico di Ethereum è un'importante area di ricerca. Attualmente, le dApp su Ethereum hanno comunemente alcuni punti di centralizzazione perché si basano su strumenti o infrastrutture centralizzate. #### Letture di base {#background-reading-20} - [Stack di Ethereum](/developers/docs/ethereum-stack/) -- [Coinbase: Introduzione allo Stack Web3](https://blog.coinbase.com/a-simple-guide-to-the-web3-stack-785240e557f0) +- [Coinbase: Introduzione allo stack Web3](https://blog.coinbase.com/a-simple-guide-to-the-web3-stack-785240e557f0) - [Introduzione ai contratti intelligenti](/developers/docs/smart-contracts/) -- [Introduzione agli archivi decentralizzati](/developers/docs/storage/) +- [Introduzione all'archiviazione decentralizzata](/developers/docs/storage/) #### Ricerca recente {#recent-research-20} -- [Componibilità del contratto intelligente](/developers/docs/smart-contracts/composability/) +- [Componibilità dei contratti intelligenti](/developers/docs/smart-contracts/composability/) \ No newline at end of file diff --git a/public/content/translations/it/community/support/faq/index.md b/public/content/translations/it/community/support/faq/index.md index aa2dab8d497..482c354e75d 100644 --- a/public/content/translations/it/community/support/faq/index.md +++ b/public/content/translations/it/community/support/faq/index.md @@ -1,6 +1,6 @@ --- title: Domande frequenti -description: Domande frequenti su Ethereum riguardo a portafogli, transazioni, staking e altro. +description: Domande comuni su Ethereum riguardanti portafogli, transazioni, staking e altro. lang: it --- @@ -8,70 +8,70 @@ lang: it ## Ho inviato criptovalute all'indirizzo sbagliato {#wrong-wallet} -Una transazione inviata in Ethereum è irreversibile. Sfortunatamente, se hai inviato ETH o token al portafoglio sbagliato, non c'è modo di annullare la transazione. +Una transazione inviata su Ethereum è irreversibile. Sfortunatamente, se hai inviato ETH o token al portafoglio sbagliato, non c'è modo di annullare la transazione. **Cosa puoi fare:** -- **Se conosci il proprietario dell'indirizzo**, contattalo direttamente e chiedigli di restituirti i fondi -- **Se l'indirizzo appartiene a un exchange o a un servizio noto**, contatta il loro team di assistenza, poiché potrebbero essere in grado di aiutarti -- **Se hai inviato token a un indirizzo di contratto**, controlla se il contratto ha una funzione di prelievo o di recupero (è raro) +- **Se conosci il proprietario dell'indirizzo**, contattalo direttamente e chiedigli di restituire i fondi +- **Se l'indirizzo appartiene a un exchange o a un servizio noto**, contatta il loro team di supporto, poiché potrebbero essere in grado di aiutarti +- **Se hai inviato token a un indirizzo del contratto**, verifica se il contratto ha una funzione di prelievo o recupero (questo è raro) -Nella maggior parte dei casi, non c'è modo di recuperare i fondi. Nessuna organizzazione centrale, entità o persona possiede Ethereum, il che significa che nessuno può annullare le transazioni. Ricontrolla sempre l'indirizzo del destinatario prima di confermare. +Nella maggior parte dei casi, non c'è modo di recuperare i fondi. Nessuna organizzazione centrale, entità o persona possiede Ethereum, il che significa che nessuno può annullare le transazioni. Controlla sempre due volte l'indirizzo del destinatario prima di confermare. ## Ho perso l'accesso al mio portafoglio {#lost-wallet-access} -Le opzioni di recupero dipendono dal tipo di portafoglio che usi. +Le tue opzioni di recupero dipendono dal tipo di portafoglio che utilizzi. -### Se hai la tua frase seed (frase di recupero) +### Se hai la tua frase di recupero (seed phrase) -Puoi ripristinare il tuo portafoglio in qualsiasi app portafoglio compatibile usando la tua frase seed. Per questo è fondamentale conservare la frase seed in un posto sicuro e offline. Consulta la documentazione del fornitore del tuo portafoglio per le istruzioni di ripristino. +Puoi ripristinare il tuo portafoglio in qualsiasi app di portafoglio compatibile utilizzando la tua frase di recupero. Questo è il motivo per cui è fondamentale conservare la tua frase di recupero in modo sicuro offline. Consulta la documentazione del fornitore del tuo portafoglio per le istruzioni di ripristino. -### Se hai perso la tua frase seed +### Se hai perso la tua frase di recupero -Senza la tua frase seed o le chiavi private, non è possibile recuperare i tuoi fondi. Nessuno, incluso ethereum.org, può reimpostare la tua password o ripristinare l'accesso a un portafoglio a custodia autonoma. +Senza la tua frase di recupero o le tue chiavi private, i tuoi fondi non possono essere recuperati. Nessuno, incluso ethereum.org, può reimpostare la tua password o ripristinare l'accesso a un portafoglio auto-custodito. -### Se il tuo account si trova su un exchange +### Se il tuo account è su un exchange -Se il tuo account si trova su un exchange centralizzato come Coinbase, Binance o Kraken, contatta direttamente il team di assistenza dell'exchange. Essi controllano gli account sulla loro piattaforma e potrebbero essere in grado di aiutarti con la reimpostazione della password o il recupero dell'account. +Se il tuo account è su un exchange centralizzato come Coinbase, Binance o Kraken, contatta direttamente il team di supporto dell'exchange. Loro controllano gli account sulla loro piattaforma e potrebbero essere in grado di aiutarti con la reimpostazione della password o il recupero dell'account. -**Non condividere mai la tua frase seed con nessuno** che affermi di aiutarti a recuperare il tuo portafoglio. Questa è una delle tattiche di truffa più comuni. Nessun servizio legittimo ti chiederà mai la tua frase seed. +**Non condividere mai la tua frase di recupero con nessuno** che affermi di aiutarti a recuperare il tuo portafoglio. Questa è una delle tattiche di truffa più comuni. Nessun servizio legittimo ti chiederà mai la tua frase di recupero. - Come utilizzare un portafoglio + Come usare un portafoglio ## La mia transazione è bloccata o in sospeso {#stuck-transaction} -Le transazioni su Ethereum possono bloccarsi quando la commissione sul gas che hai impostato è inferiore a quella attualmente richiesta dalla rete. La maggior parte dei portafogli ti permette di risolvere il problema: +Le transazioni su Ethereum possono bloccarsi quando la commissione che hai impostato era inferiore a quella attualmente richiesta dalla rete. La maggior parte dei portafogli ti consente di risolvere questo problema: -- **Velocizza:** Invia di nuovo la stessa transazione con una commissione sul gas più alta -- **Annulla:** Invia una transazione da 0 ETH al tuo stesso indirizzo usando lo stesso nonce della transazione in sospeso +- **Velocizza:** Invia nuovamente la stessa transazione con una commissione più alta +- **Annulla:** Invia una transazione di 0 ETH al tuo indirizzo utilizzando lo stesso nonce della transazione in sospeso ### Guide utili - [Come velocizzare o annullare una transazione in sospeso su MetaMask](https://support.metamask.io/transactions-and-gas/transactions/how-to-speed-up-or-cancel-a-pending-transaction/) - [Come annullare le transazioni Ethereum in sospeso](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) -## Come posso rivendicare la mia ricompensa di Ethereum? {#giveaway-scam} +## Come posso richiedere il mio giveaway di Ethereum? {#giveaway-scam} -I giveaway Ethereum sono truffe progettate per rubare il vostro ETH. Non lasciarti tentare da offerte che sembrano troppo belle per essere vere. Se invii ETH a un indirizzo per un giveaway, non riceverai alcun giveaway e non potrai recuperare i tuoi fondi. +I giveaway di Ethereum sono truffe progettate per rubare i tuoi ETH. Non lasciarti tentare da offerte che sembrano troppo belle per essere vere. Se invii ETH a un indirizzo di giveaway, non riceverai alcun giveaway e non sarai in grado di recuperare i tuoi fondi. [Maggiori informazioni sulla prevenzione delle truffe](/security/#common-scams) -## Come posso mettere in staking ETH? {#how-to-stake} +## Come faccio staking di ETH? {#how-to-stake} -Per diventare un validatore, devi mettere in staking 32 ETH nel contratto di deposito di Ethereum e configurare un nodo del validatore. Puoi anche partecipare con meno ETH tramite i pool di staking. +Per diventare un validatore, devi mettere in stake 32 ETH nel contratto di deposito di Ethereum e configurare un nodo validatore. Puoi anche partecipare con meno ETH attraverso le pool di staking. -Maggiori informazioni sono disponibili sulle nostre [pagine sullo staking](/staking/) e sul [launchpad per lo staking](https://launchpad.ethereum.org/). +Maggiori informazioni sono disponibili sulle nostre [pagine sullo staking](/staking/) e sul [launchpad di staking](https://launchpad.ethereum.org/). -## Come posso fare mining su Ethereum? {#mining-ethereum} +## Come posso minare Ethereum? {#mining-ethereum} -Il mining su Ethereum non è più possibile. Il mining è stato disattivato quando Ethereum è passata da [proof-of-work](/glossary/#pow) a [proof-of-stake](/glossary/#pos) durante [La Fusione](/roadmap/merge/) a settembre 2022. Ora, invece dei miner, Ethereum ha i validatori. Chiunque può mettere ETH in [staking](/glossary/#staking) e ricevere ricompense per l'esecuzione del software del validatore per proteggere la rete. +Il mining di Ethereum non è più possibile. Il mining è stato disattivato quando Ethereum è passato dalla [prova di lavoro](/glossary/#pow) alla [prova di stake](/glossary/#pos) durante [The Merge](/roadmap/merge/) a settembre 2022. Ora, invece dei minatori, Ethereum ha i validatori. Chiunque può mettere in [stake](/glossary/#staking) ETH e ricevere ricompense di staking per l'esecuzione del software del validatore per proteggere la rete. \ No newline at end of file diff --git a/public/content/translations/it/community/support/misconceptions/index.md b/public/content/translations/it/community/support/misconceptions/index.md index 6e3db16b267..7a08bd44d1c 100644 --- a/public/content/translations/it/community/support/misconceptions/index.md +++ b/public/content/translations/it/community/support/misconceptions/index.md @@ -1,6 +1,6 @@ --- title: Idee sbagliate comuni su Ethereum -description: "Chiarire le incomprensioni più comuni su come funziona Ethereum." +description: "Chiarire i malintesi più comuni su come funziona Ethereum." lang: it --- @@ -8,11 +8,11 @@ lang: it ## Ethereum è un'azienda? {#not-a-company} -Ethereum è una tecnologia open-source e decentralizzata gestita da migliaia di collaboratori in tutto il mondo. Non esiste un'azienda chiamata "Ethereum" che gestisce i conti, detiene fondi o fornisce assistenza ai clienti. +Ethereum è una tecnologia open-source e decentralizzata mantenuta da migliaia di collaboratori in tutto il mondo. Non esiste un'azienda chiamata "Ethereum" che gestisce account, detiene fondi o fornisce assistenza clienti. -La [Ethereum Foundation](https://ethereum.foundation/) è un'organizzazione no-profit che supporta lo sviluppo di Ethereum, ma non possiede né controlla la rete. Nessuna singola entità lo fa. +La [Ethereum Foundation](https://ethereum.foundation/) è un'organizzazione senza scopo di lucro che supporta lo sviluppo di Ethereum, ma non possiede né controlla la rete. Nessuna singola entità lo fa. -**[ethereum.org](/)** è una risorsa educativa gestita dalla comunità. Non è una piattaforma di scambio, un portafoglio o un'istituzione finanziaria. Non detiene fondi degli utenti e non può accedere ad alcun conto. +**[ethereum.org](/)** è una risorsa educativa gestita dalla community. Non è un exchange, un portafoglio o un'istituzione finanziaria. Non detiene alcun fondo degli utenti e non può accedere ad alcun account. Cos'è Ethereum? @@ -20,54 +20,54 @@ La [Ethereum Foundation](https://ethereum.foundation/) è un'organizzazione no-p ## Qualcuno può recuperare o congelare i miei fondi? {#no-fund-access} -A differenza di una banca, non esiste un'autorità centrale su Ethereum che possa congelare, sequestrare o recuperare fondi. La persona che detiene le chiavi private (o la frase seed) ha il controllo pieno ed esclusivo su un portafoglio. +A differenza di una banca, su Ethereum non esiste un'autorità centrale che possa congelare, sequestrare o recuperare fondi. La persona che detiene le chiavi private (o la frase di recupero) ha il controllo totale ed esclusivo su un portafoglio. -Ciò significa che: +Questo significa che: -- **Nessuno può recuperare i fondi** inviati all'indirizzo sbagliato +- **Nessuno può recuperare i fondi** che hai inviato all'indirizzo sbagliato - **Nessuno può annullare** una transazione dopo che è stata confermata - **Nessuno può congelare** il tuo portafoglio o bloccare le tue transazioni -- **Nessuno può reimpostare la tua password** se perdi la tua frase seed +- **Nessuno può reimpostare la tua password** se perdi la tua frase di recupero -Ecco perché proteggere la tua frase seed è fondamentale. È l'unico modo per accedere al tuo portafoglio. Se viene persa o rubata, non c'è alcuna opzione di recupero. +Ecco perché proteggere la tua frase di recupero è fondamentale. È l'unico modo per accedere al tuo portafoglio. Se viene persa o rubata, non c'è alcuna opzione di recupero. Sicurezza di Ethereum e prevenzione delle truffe -## Posso ancora fare mining di Ethereum? {#no-mining} +## Posso ancora minare Ethereum? {#no-mining} -Ethereum è passato da [proof-of-work](/glossary/#pow) a [proof-of-stake](/glossary/#pos) durante [La Fusione](/roadmap/merge/) a settembre 2022. Il mining non è più possibile su Ethereum. +Ethereum è passato dalla [prova di lavoro](/glossary/#pow) alla [prova di stake](/glossary/#pos) durante [Il Merge](/roadmap/merge/) a settembre 2022. Il mining non è più possibile su Ethereum. -La rete è ora messa in sicurezza dai validatori che mettono in [staking](/glossary/#staking) ETH. Chiunque può partecipare: +La rete è ora protetta da validatori che mettono in [stake](/glossary/#staking) ETH. Chiunque può partecipare: -- **Staking in solitaria:** Gestisci il tuo validatore con 32 ETH—[scopri di più](/staking/solo/) -- **Staking come servizio:** delega il funzionamento del nodo mantenendo le tue chiavi—[scopri di più](/staking/saas/) -- **Staking in pool:** metti in staking con meno di 32 ETH unendoti a un pool—[scopri di più](/staking/pools/) +- **Staking in solitaria:** Esegui il tuo validatore con 32 ETH—[scopri di più](/staking/solo/) +- **Staking come servizio:** Delega l'operatività del nodo mantenendo le tue chiavi—[scopri di più](/staking/saas/) +- **Staking in pool:** Metti in stake meno di 32 ETH unendoti a una pool—[scopri di più](/staking/pools/) - Maggiori informazioni sullo staking + Scopri di più sullo staking ## Esiste un team di supporto di Ethereum? {#no-support-team} -Cercare il "supporto ufficiale di Ethereum" è simile a cercare il "supporto ufficiale di internet". Questo, ovviamente, non esiste, ma a seconda del tuo problema potresti riuscire a cercare supporto dal tuo fornitore di servizi internet, dal produttore del tuo router o da una delle aziende dietro il dispositivo, l'app o il sito web che stai utilizzando. +Cercare il "supporto ufficiale di Ethereum" è simile a cercare il "supporto ufficiale di internet". Questo ovviamente non esiste, ma a seconda del tuo problema potresti essere in grado di cercare supporto dal tuo fornitore di servizi internet, dal produttore hardware del tuo router o da una delle aziende dietro il dispositivo, l'app o il sito web che stai utilizzando. -Ethereum è simile. Non esiste un'azienda, un team di supporto o un help desk dietro a Ethereum nel suo complesso, ma, a seconda del problema, potresti trovare aiuto contattando il tuo _fornitore del portafoglio_, _servizio di staking_, _piattaforma di scambio_, _istituto finanziario_ o il _team che gestisce un'app_ che stai utilizzando. +Ethereum è simile. Non c'è alcuna azienda, team di supporto o help desk dietro Ethereum nel suo complesso, ma a seconda del problema potresti trovare aiuto contattando il tuo _fornitore del portafoglio_, _servizio di staking_, _exchange_, _istituzione finanziaria_ o il _team che mantiene un'app_ che stai utilizzando. -Poiché Ethereum è pubblicamente trasparente per impostazione predefinita, potresti anche trovare [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers/), [strumenti di analisi](/developers/tools/analytics/) e altre [risorse di indagine online](/community/support/scams/#analyze) utili per esaminare direttamente un problema. +Poiché Ethereum è pubblicamente trasparente per impostazione predefinita, potresti anche trovare utili gli [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers/), gli [strumenti di analisi](/developers/tools/analytics/) e altre [risorse di indagine online](/community/support/scams/#analyze) per esaminare direttamente un problema. -Detto questo, nessuno di Ethereum o di ethereum.org potrà mai: +Detto questo, nessuno di Ethereum o ethereum.org farà mai quanto segue: - Contattarti tramite messaggio diretto -- Chiederti la tua frase seed o le tue chiavi private +- Chiederti la tua frase di recupero o le tue chiavi private - Chiederti di inviare ETH per verificare il tuo portafoglio -- Offrirti di aiutarti a recuperare fondi a pagamento +- Offrirti aiuto per recuperare fondi a pagamento -**Chiunque faccia una di queste cose sta cercando di truffarti.** +**Chiunque faccia una delle cose sopra elencate sta cercando di truffarti.** -Se hai bisogno di aiuto, le vere comunità che possono assisterti sono elencate nella [pagina di supporto](/community/support/). Si tratta di comunità aperte e gestite da volontari—non di canali di supporto ufficiali. +Se hai bisogno di aiuto, le vere community che possono assisterti sono elencate nella [pagina di supporto](/community/support/). Si tratta di community aperte e gestite da volontari, non di canali di supporto ufficiali. Sicurezza di Ethereum e prevenzione delle truffe - + \ No newline at end of file diff --git a/public/content/translations/it/community/support/scams/index.md b/public/content/translations/it/community/support/scams/index.md index cd39ca851ec..238cef7b86d 100644 --- a/public/content/translations/it/community/support/scams/index.md +++ b/public/content/translations/it/community/support/scams/index.md @@ -1,78 +1,78 @@ --- -title: Aiuto e segnalazione truffe -description: Cosa fare se sei stato truffato, come proteggere i tuoi beni rimanenti e dove segnalare la frode. +title: Aiuto e segnalazione delle truffe +description: Cosa fare se sei stato truffato, come mettere al sicuro i tuoi asset rimanenti e dove segnalare le frodi. lang: it --- # Sono stato truffato o ho perso fondi {#scam-help} -Le truffe di criptovaluta prendono di mira persone di ogni livello di esperienza, inclusi i professionisti della finanza e della tecnologia. Non sei solo, ed essere qui è il primo passo giusto. +Le truffe legate alle criptovalute prendono di mira persone di tutti i livelli di esperienza, inclusi i professionisti della finanza e della tecnologia. Non sei solo, ed essere qui è il primo passo giusto. -**Nessuno può annullare le transazioni blockchain.** Se qualcuno ti contatta sostenendo di poter recuperare i tuoi fondi a pagamento, è quasi certamente una seconda truffa. Vedi le [truffe di recupero](#recovery-scams) qui sotto. +**Nessuno può annullare le transazioni sulla blockchain.** Se qualcuno ti contatta sostenendo di poter recuperare i tuoi fondi a pagamento, si tratta quasi certamente di una seconda truffa. Vedi le [truffe di recupero](#recovery-scams) di seguito. -## Proteggi i tuoi beni rimanenti {#secure-assets} +## Metti al sicuro i tuoi asset rimanenti {#secure-assets} Se hai interagito con un truffatore o sospetti che il tuo portafoglio sia compromesso, segui immediatamente questi passaggi: 1. **Sposta i fondi rimanenti** in un nuovo portafoglio sicuro a cui il truffatore non ha accesso -2. **Revoca le approvazioni dei token.** I truffatori spesso ti inducono con l'inganno ad approvare una spesa illimitata di token. Revocare queste autorizzazioni impedisce un ulteriore svuotamento del tuo portafoglio -3. **Cambia le password** di tutti gli account di exchange che potrebbero essere collegati -4. **Abilita l'autenticazione a due fattori (2FA)** su tutti gli account relativi alle criptovalute +2. **Revoca le approvazioni dei token.** I truffatori spesso ti ingannano facendoti approvare una spesa illimitata di token. Revocare queste autorizzazioni impedisce l'ulteriore svuotamento del tuo portafoglio +3. **Cambia le password** su qualsiasi account di exchange che potrebbe essere collegato +4. **Abilita l'autenticazione a due fattori (2FA)** su tutti gli account legati alle criptovalute ### Come revocare le approvazioni dei token {#revoke-approvals} -Quando interagisci con una dApp o un contratto intelligente, potresti avergli concesso il permesso di spendere i tuoi token. Se un truffatore ti ha ingannato per farti approvare un contratto dannoso, può continuare a sottrarre i tuoi token anche dopo la truffa iniziale. +Quando interagisci con una dApp o un contratto intelligente, potresti avergli concesso l'autorizzazione a spendere i tuoi token. Se un truffatore ti ha ingannato facendoti approvare un contratto malevolo, può continuare a svuotare i tuoi token anche dopo la truffa iniziale. Usa questi strumenti per controllare e revocare le approvazioni: -- [Revoke.cash](https://revoke.cash/): collega il tuo portafoglio per vedere tutte le approvazioni attive e revocarle +- [Revoke.cash](https://revoke.cash/): connetti il tuo portafoglio per vedere tutte le approvazioni attive e revocarle - [Revokescout](https://revoke.blockscout.com/): controlla e revoca le approvazioni tramite Blockscout -- [Verifica approvazione token di Etherscan](https://etherscan.io/tokenapprovalchecker): controlla e revoca le approvazioni tramite Etherscan +- [Etherscan Token Approval Checker](https://etherscan.io/tokenapprovalchecker): controlla e revoca le approvazioni tramite Etherscan - Guida dettagliata: come revocare l'accesso ai token + Guida passo-passo: Come revocare l'accesso ai token -## Segnala indirizzi e siti web di truffe {#report} +## Segnala indirizzi e siti web truffaldini {#report} -La segnalazione aiuta ad avvertire altri utenti e può assistere le indagini delle forze dell'ordine. Documenta tutto: hash delle transazioni, indirizzi dei portafogli, screenshot e qualsiasi comunicazione con il truffatore. +Le segnalazioni aiutano ad avvisare gli altri utenti e possono assistere le indagini delle forze dell'ordine. Documenta tutto: hash delle transazioni, indirizzi dei portafogli, screenshot e qualsiasi comunicazione con il truffatore. -### Segnala un indirizzo di truffa {#report-address} +### Segnala un indirizzo truffaldino {#report-address} -- [Chainabuse](https://www.chainabuse.com/): database di segnalazione di truffe e frodi gestito dalla comunità. Invia segnalazioni e cerca indirizzi di truffa noti -- [Segnalazione su Etherscan](https://info.etherscan.com/report-address/): segnala un indirizzo sull'esploratore di blocchi di Ethereum più utilizzato -- [CryptoScamDB](https://cryptoscamdb.org/): database open source che traccia le truffe di criptovaluta +- [Chainabuse](https://www.chainabuse.com/): database di segnalazione di truffe e frodi guidato dalla community. Invia segnalazioni e cerca indirizzi truffaldini noti +- [Etherscan report](https://info.etherscan.com/report-address/): segnala un indirizzo sull'esploratore di blocchi di Ethereum più utilizzato +- [CryptoScamDB](https://cryptoscamdb.org/): database open-source che traccia le truffe di criptovaluta -### Segnala un sito web o un account di social media fraudolento {#report-website} +### Segnala un sito web o un account social truffaldino {#report-website} -- [PhishTank](https://phishtank.org/): invia e verifica URL di phishing -- [Navigazione sicura di Google](https://safebrowsing.google.com/safebrowsing/report_phish/): segnala siti di phishing a Google in modo che vengano bloccati in Chrome e altri browser -- [Netcraft](https://report.netcraft.com/report/mistake): segnala siti web dannosi e fraudolenti -- Segnala direttamente sulla piattaforma di social media in cui è avvenuta la truffa (Twitter/X, Discord, Telegram hanno tutti funzioni di segnalazione) +- [PhishTank](https://phishtank.org/): invia e verifica gli URL di phishing +- [Google Safe Browsing](https://safebrowsing.google.com/safebrowsing/report_phish/): segnala i siti di phishing a Google in modo che vengano bloccati su Chrome e altri browser +- [Netcraft](https://report.netcraft.com/report/mistake): segnala siti web malevoli e fraudolenti +- Segnala direttamente sulla piattaforma social in cui si è verificata la truffa (Twitter/X, Discord, Telegram hanno tutti funzionalità di segnalazione) ### Segnala alle forze dell'ordine {#report-law-enforcement} -- **Stati Uniti:** [Centro reclami per crimini su Internet dell'FBI (IC3)](https://www.ic3.gov/) +- **Stati Uniti:** [FBI Internet Crime Complaint Center (IC3)](https://www.ic3.gov/) - **Regno Unito:** [Action Fraud](https://www.actionfraud.police.uk/) - **Unione Europea:** [Europol](https://www.europol.europa.eu/report-a-crime) -- **Altri paesi:** sporgi denuncia alla tua polizia locale. La frode di criptovaluta è un crimine nella maggior parte delle giurisdizioni +- **Altri paesi:** sporgi denuncia alla polizia locale. La frode con criptovalute è un crimine nella maggior parte delle giurisdizioni ## Analizza cosa è successo {#analyze} -Capire dove sono finiti i tuoi fondi può aiutare con le segnalazioni e può supportare gli sforzi di recupero se i fondi arrivano su un exchange centralizzato. +Capire dove sono finiti i tuoi fondi può aiutare con le segnalazioni e potrebbe supportare gli sforzi di recupero se i fondi finiscono su un exchange centralizzato. -- [Blockscout](https://eth.blockscout.com/): esploratore di blocchi open source per cercare qualsiasi hash di transazione o indirizzo di portafoglio per vedere dove sono stati inviati i fondi +- [Blockscout](https://eth.blockscout.com/): esploratore di blocchi open-source per cercare qualsiasi hash di transazione o indirizzo di portafoglio per vedere dove sono stati inviati i fondi - [Etherscan](https://etherscan.io/): cerca qualsiasi hash di transazione o indirizzo di portafoglio per vedere dove sono stati inviati i fondi -- [Ricerca su Chainabuse](https://www.chainabuse.com/): controlla se un indirizzo è già stato segnalato da altre vittime -- [MetaSleuth](https://metasleuth.io/) di BlockSec: strumento di tracciamento visivo delle transazioni che mappa i flussi di fondi +- [Chainabuse lookup](https://www.chainabuse.com/): controlla se un indirizzo è già stato segnalato da altre vittime +- [MetaSleuth](https://metasleuth.io/) di BlockSec: strumento visivo di tracciamento delle transazioni che mappa i flussi di fondi **Se i fondi sono stati inviati a un exchange centralizzato** (come Coinbase, Binance, Kraken), contatta immediatamente il loro team di supporto con i dettagli della transazione. Gli exchange a volte possono congelare gli account segnalati per frode. @@ -80,80 +80,76 @@ Capire dove sono finiti i tuoi fondi può aiutare con le segnalazioni e può sup Poiché Ethereum è decentralizzato, nessuna autorità centrale può annullare le transazioni o recuperare i fondi rubati. Una volta che una transazione è confermata sulla blockchain, è definitiva. -Segnalare è comunque utile. Le segnalazioni aiutano le forze dell'ordine a rintracciare le organizzazioni fraudolente e la segnalazione degli indirizzi su Chainabuse ed Etherscan avverte le future potenziali vittime. +Le segnalazioni sono comunque preziose. I report aiutano le forze dell'ordine a rintracciare le reti di frode organizzate e segnalare gli indirizzi su Chainabuse ed Etherscan avverte le future potenziali vittime. ## Tipi di truffe a cui prestare attenzione {#scam-types} -I truffatori creano falsi giveaway promettendo di moltiplicare i tuoi ETH o di darti token gratuiti. Spesso si spacciano per personaggi noti come Vitalik Buterin. Se invii ETH a un indirizzo "giveaway", non riceverai nulla in cambio. +I truffatori creano finti giveaway promettendo di moltiplicare i tuoi ETH o di darti token gratuiti. Spesso si spacciano per figure note come Vitalik Buterin. Se invii ETH a un indirizzo di "giveaway", non riceverai nulla in cambio. **Ricorda:** Vitalik e altre figure di spicco non ti chiederanno mai di inviare loro ETH. -[Altre informazioni sulle truffe comuni](/security/#common-scams) +[Maggiori informazioni sulle truffe comuni](/security/#common-scams) -I truffatori si spacciano per membri del team di Ethereum, moderatori o agenti di supporto su Discord, Telegram e social media. Potrebbero inviarti messaggi diretti offrendo aiuto o sostenendo che c'è un problema con il tuo account. +I truffatori si spacciano per membri del team di Ethereum, moderatori o agenti di supporto su Discord, Telegram e sui social media. Potrebbero inviarti messaggi diretti offrendoti aiuto o sostenendo che c'è un problema con il tuo account. **Ricorda:** - Non esiste un "team di supporto di Ethereum" -- I veri moderatori non ti invieranno mai per primi un messaggio diretto -- Non condividere mai la tua frase seed o le tue chiavi private con nessuno, per nessun motivo -- Non fare mai clic sui link inviati in messaggi non richiesti +- I veri moderatori non ti invieranno mai un messaggio diretto per primi +- Non condividere mai la tua frase di recupero o le tue chiavi private con nessuno, per nessun motivo +- Non cliccare mai sui link inviati in messaggi non richiesti -Le truffe di recupero si rivolgono specificamente a persone che hanno già perso fondi. I truffatori monitorano i social media alla ricerca di persone che parlano di essere state truffate, quindi le contattano spacciandosi per "investigatori blockchain" o "esperti di recupero di criptovalute". +Le truffe di recupero prendono di mira specificamente le persone che hanno già perso fondi. I truffatori monitorano i social media in cerca di persone che parlano di essere state truffate, quindi le contattano fingendosi "investigatori della blockchain" o "esperti di recupero di criptovalute". -Promettono di rintracciare e recuperare le tue criptovalute rubate in cambio di una commissione anticipata. Dopo che paghi, scompaiono. +Promettono di rintracciare e recuperare le tue criptovalute rubate in cambio di una commissione anticipata. Dopo aver pagato, scompaiono. -**Nessun servizio legittimo può annullare le transazioni blockchain.** Chiunque lo prometta sta mentendo. Questa è una delle truffe successive più comuni. +**Nessun servizio legittimo può annullare le transazioni sulla blockchain.** Chiunque prometta questo sta mentendo. Questa è una delle truffe successive più comuni. -I siti di phishing sembrano identici alle app di portafoglio, agli exchange o alle piattaforme DeFi reali. Ti ingannano per farti inserire la tua frase seed o collegare il tuo portafoglio, per poi prosciugare i tuoi fondi. +I siti di phishing sembrano identici alle vere app di portafogli, agli exchange o alle piattaforme DeFi. Ti ingannano facendoti inserire la tua frase di recupero o connettere il tuo portafoglio, per poi svuotare i tuoi fondi. **Proteggiti:** -- Verifica sempre l'URL prima di collegare il tuo portafoglio +- Verifica sempre l'URL prima di connettere il tuo portafoglio - Aggiungi ai preferiti i siti ufficiali che usi regolarmente -- Non inserire mai la tua frase seed su nessun sito web. Le app legittime non la chiedono mai +- Non inserire mai la tua frase di recupero su nessun sito web. Le app legittime non la chiedono mai - Usa [PhishTank](https://phishtank.org/) per controllare gli URL sospetti - Come identificare i token truffa + Come identificare i token truffaldini Guida completa alla sicurezza di Ethereum e alla prevenzione delle truffe - + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-desci-projects/index.md b/public/content/translations/it/contributing/adding-desci-projects/index.md index 6264f30f02e..f6185606b85 100644 --- a/public/content/translations/it/contributing/adding-desci-projects/index.md +++ b/public/content/translations/it/contributing/adding-desci-projects/index.md @@ -1,44 +1,44 @@ --- title: Aggiungere progetti DeSci -description: La politica che applichiamo aggiungendo i collegamenti ai progetti sulla pagina della DeSci su ethereum.org +description: La politica che utilizziamo quando aggiungiamo un link ai progetti sulla pagina DeSci di ethereum.org lang: it --- # Aggiungere progetti {#adding-projects} -Vogliamo assicurarci di mostrare svariati progetti e fornire una buona istantanea del panorama della DeSci. +Vogliamo assicurarci di mostrare una varietà di progetti e fornire una buona panoramica del panorama DeSci. -Chiunque è libero di suggerire un progetto da aggiungere all'elenco nella pagina della DeSci su ethereum.org. Allo stesso modo, chiunque noti un progetto non più pertinente o che non soddisfa più i nostri criteri di idoneità, è libero di suggerirne la rimozione. +Chiunque è libero di suggerire un progetto da elencare sulla pagina DeSci di ethereum.org. Allo stesso modo, chiunque noti un progetto che non è più rilevante o non soddisfa più i nostri criteri di idoneità è libero di suggerirne la rimozione. ## Il quadro decisionale {#the-decision-framework} -### Criteri per l'inclusione: gli elementi imprescindibili {#the-must-haves} +### Criteri di inclusione: i requisiti fondamentali {#the-must-haves} -- **Codice/Dati open source**: il livello di apertura del codice e dei dati è un principio fondamentale della DeSci, quindi tali progetti non devono essere a sorgente "chiusa". La base di codice dovrebbe essere accessibile e idealmente aperta ai PR. -- **I progetti di DeSci dovrebbero essere dimostrabilmente decentralizzati**: ciò potrebbe includere il controllo da parte di una DAO o mediante la creazione di uno stack tecnologico decentralizzato che include portafogli non custoditi. Probabilmente si tratta di contratti intelligenti verificabili su Ethereum. -- **Informazioni oneste e accurate negli elenchi**: ci si aspetta che qualsiasi elenco suggerito dai progetti contenga informazioni oneste e accurate. I prodotti che falsificano le informazioni in elenco, ad esempio dichiarando che il proprio prodotto è "open source" quando non lo è, saranno rimossi. -- **Impegno dimostrabile all'ampliamento dell'accesso alla scienza**: un progetto di DeSci dovrebbe essere in grado di spiegare il modo in cui amplia la partecipazione alla scienza del grande pubblico, non soltanto dei titolari di token/NFT. -- **Accessibile globalmente**: il tuo progetto non presenta limitazioni geografiche o requisiti KYC che escludano certe persone dall'accesso al tuo servizio. -- **Sito web e documentazione Informativi**: è importante che i visitatori del sito web del progetto riescano a comprendere cosa fa il progetto, come contribuisce alla decentralizzazione dell'infrastruttura scientifica e come partecipare. -- **Il progetto dovrebbe far parte dell'ecosistema di Ethereum**: su ethereum.org crediamo che Ethereum (e il suo livello 2) siano il livello di base appropriato per il movimento della DeSci. -- **Il progetto è abbastanza ben consolidato**: il progetto ha utenti reali che hanno potuto accedere ai servizi del progetto per svariati mesi. +- **Codice/dati open source** - L'apertura del codice e dei dati è un principio fondamentale della DeSci, quindi i progetti DeSci non devono essere closed source. La base di codice dovrebbe essere accessibile e idealmente aperta alle PR. +- **I progetti DeSci dovrebbero essere palesemente decentralizzati** - Questo potrebbe includere l'essere governati da una DAO, o l'essere costruiti con uno stack tecnologico decentralizzato che include portafogli non detentivi. Probabilmente coinvolge contratti intelligenti verificabili su Ethereum. +- **Informazioni di inserzione oneste e accurate** - Ci si aspetta che qualsiasi inserzione suggerita dai progetti sia accompagnata da informazioni oneste e accurate. I prodotti che falsificano le informazioni di inserzione, come dichiarare che il proprio prodotto è "open source" quando non lo è, verranno rimossi. +- **Impegno dimostrabile nell'ampliare l'accesso alla scienza** - Un progetto DeSci dovrebbe essere in grado di articolare come amplia la partecipazione alla scienza per il pubblico generale, non solo per i detentori di token/NFT. +- **Accessibile a livello globale** - Il tuo progetto non ha limitazioni geografiche o requisiti KYC che escludono determinate persone dall'accesso al tuo servizio. +- **Sito web e documentazione informativi** - È importante che i visitatori del sito web del progetto possano comprendere cosa fa effettivamente il progetto, come contribuisce alla decentralizzazione dell'infrastruttura scientifica e come partecipare. +- **Il progetto dovrebbe far parte dell'ecosistema di Ethereum** - Su ethereum.org crediamo che Ethereum (e i suoi livelli 2) sia il livello di base appropriato per il movimento DeSci. +- **Il progetto è abbastanza consolidato** - Il progetto ha utenti reali che sono stati in grado di accedere ai servizi del progetto per diversi mesi. -### Caratteristiche auspicabili +### Elementi graditi -- **Disponibile in più lingue**: il tuo progetto è tradotto in più lingue, consentendo agli utenti di tutto il mondo di accedervi. -- **Risorse didattiche**: il tuo prodotto dovrebbe avere un'esperienza di adesione ben progettata per aiutare a istruire gli utenti. In alternativa, dovrebbe offrire contenuti di supporto come articoli o video. -- **Controlli di terze parti**: il tuo prodotto è stato controllato professionalmente da una terza parte affidabile per verificare la presenza di vulnerabilità. -- **Punto di contatto**: un punto di contatto per il progetto (un rappresentante di una DAO o comunità) ci aiuterà molto a ottenere informazioni accurate, quando sono apportate delle modifiche. Questo continuerà ad aggiornare ethereum in modo gestibile, raccogliendo le informazioni future. +- **Disponibile in più lingue** - Il tuo progetto è tradotto in più lingue, consentendo agli utenti di tutto il mondo di accedervi. +- **Risorse educative** - Il tuo prodotto dovrebbe avere un'esperienza di onboarding ben progettata per aiutare ed educare gli utenti. Oppure prove di contenuti pratici come articoli o video. +- **Audit di terze parti** - Il tuo prodotto è stato sottoposto a un audit professionale per le vulnerabilità da una terza parte fidata. +- **Punto di contatto** - Un punto di contatto per il progetto (potrebbe essere un rappresentante di una DAO o della community) ci aiuterà notevolmente a ottenere informazioni accurate quando vengono apportate modifiche. Questo manterrà gestibile l'aggiornamento di ethereum.org durante la raccolta di informazioni future. ## Manutenzione {#maintenance} -In linea con la natura fluida di Ethereum, team e prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: +Data la natura fluida di Ethereum, i team e i prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: -- Assicurati che tutti i progetti elencati soddisfino ancora i nostri criteri -- Verifica che non siano presenti prodotti suggeriti che soddisfano altri dei nostri criteri oltre quelli elencati al momento +- Assicurarci che tutti i progetti elencati soddisfino ancora i nostri criteri +- Verificare che non ci siano prodotti suggeriti che soddisfano i nostri criteri in misura maggiore rispetto a quelli attualmente elencati -Ethereum.org è mantenuto dalla comunità open source e ci affidiamo a essa per mantenere aggiornato questo elenco. Se noti qualche informazione sui progetti elencati che necessita di essere aggiornata, ti preghiamo di aprire un ticket o una richiesta di pull sulla nostra repository di GitHub. +Ethereum.org è mantenuto dalla community open source e ci affidiamo a essa per aiutarci a mantenerlo aggiornato. Se noti informazioni sui progetti elencati che devono essere aggiornate, apri una issue o una pull request sul nostro repository GitHub. -## Condizioni d'uso {#terms-of-use} +## Termini di utilizzo {#terms-of-use} -Sei anche pregato di fare riferimento ai [termini d'utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a fini di informazione generale. +Fai riferimento anche ai nostri [termini di utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a scopo informativo generale. \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-developer-tools/index.md b/public/content/translations/it/contributing/adding-developer-tools/index.md index b7a6845f1b1..10a622de157 100644 --- a/public/content/translations/it/contributing/adding-developer-tools/index.md +++ b/public/content/translations/it/contributing/adding-developer-tools/index.md @@ -1,38 +1,38 @@ --- -title: Aggiunta di strumenti per sviluppatori +title: Aggiungere strumenti per sviluppatori lang: it description: I nostri criteri per elencare gli strumenti per sviluppatori su ethereum.org --- -# Aggiunta di strumenti per sviluppatori {#contributing-to-ethereumorg-} +# Aggiungere strumenti per sviluppatori {#contributing-to-ethereumorg-} -Vogliamo assicurarci di elencare le migliori risorse possibili per sviluppatori, in modo tale che gli utenti possano lavorare con fiducia e ottenere il supporto necessario. +Vogliamo assicurarci di elencare le migliori risorse per sviluppatori possibili, in modo che le persone possano sviluppare con fiducia e avere il supporto di cui hanno bisogno. -Se c'è uno strumento utile per gli sviluppatori che ci è sfuggito, sentiti libero di suggerirlo nel luogo appropriato. +Se c'è uno strumento utile per sviluppatori che ci è sfuggito, sentiti libero di suggerirlo in una sezione appropriata. -Attualmente elenchiamo gli strumenti per gli sviluppatori in tutto il nostro [portale per sviluppatori](/developers/). +Attualmente elenchiamo gli strumenti per sviluppatori in tutto il nostro [portale per sviluppatori](/developers/). -**Sentiti libero di suggerire nuove risorse nelle pagine appropriate.** +**Sentiti libero di suggerire nuove aggiunte alle pagine appropriate.** ## Come decidiamo {#ways-to-contribute} -Le nuove proposte di strumenti per sviluppatori saranno valutate secondo i seguenti criteri: +Le proposte di strumenti per sviluppatori saranno valutate in base ai seguenti criteri: -**Lo strumento proposto si differenzia significativamente da quelli già elencati?** +**Si differenzia in modo significativo dagli strumenti già elencati?** - Nuove categorie o tipi di strumenti -- Nuove funzionalità rispetto a strumenti esistenti simili -- Destinato a un caso d'uso distinto e non coperto da strumenti esistenti simili +- Nuove funzionalità rispetto a strumenti simili esistenti +- Mirato a un caso d'uso distinto non coperto da strumenti simili esistenti **Lo strumento è ben documentato?** -- Esiste una documentazione adeguata? -- È sufficiente per usare lo strumento? +- Esiste una documentazione? +- È sufficiente per utilizzare lo strumento? - È stata aggiornata di recente? -**Lo strumento è ampiamente usato?** +**Lo strumento è ampiamente utilizzato?** -- Prenderemo in considerazione parametri come le stelle di GitHub, le statistiche di download e se è usato da aziende o progetti noti +- Prenderemo in considerazione metriche come le stelle su GitHub, le statistiche di download e se viene utilizzato da aziende o progetti noti **Lo strumento è di qualità sufficiente?** @@ -42,20 +42,20 @@ Le nuove proposte di strumenti per sviluppatori saranno valutate secondo i segue **Lo strumento è open source?** -Molti progetti nel mondo di Ethereum sono di tipo open source. Siamo maggiormente propensi a elencare progetti open source che consentono agli sviluppatori della community di ispezionare il codice e contribuire a esso. +Molti progetti nello spazio di Ethereum sono open source. È più probabile che elenchiamo progetti open source che consentono agli sviluppatori della community di ispezionare il codice e contribuirvi. --- -## Ordine dei prodotti {#product-ordering} +## Ordinamento dei prodotti {#product-ordering} -A meno che i prodotti non siano specificamente ordinati in modo diverso, ad esempio alfabeticamente, i prodotti saranno mostrati per data crescente di aggiunta alla pagina. In altre parole, i prodotti più nuovi sono aggiunti in fondo all'elenco. +A meno che i prodotti non siano specificamente ordinati in altro modo, ad esempio in ordine alfabetico, verranno visualizzati dal meno recente al più recente aggiunto alla pagina. In altre parole, i prodotti più recenti vengono aggiunti in fondo all'elenco. --- ## Aggiungi il tuo strumento per sviluppatori {#how-decisions-about-the-site-are-made} -Se vuoi aggiungere a ethereum.org uno strumento per sviluppatori che soddisfa i criteri, crea un ticket su GitHub. +Se desideri aggiungere uno strumento per sviluppatori a ethereum.org e soddisfa i criteri, crea una issue su GitHub. - Crea un ticket - + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-exchanges/index.md b/public/content/translations/it/contributing/adding-exchanges/index.md index cbfeac4c62d..dfbc7c8cbc7 100644 --- a/public/content/translations/it/contributing/adding-exchanges/index.md +++ b/public/content/translations/it/contributing/adding-exchanges/index.md @@ -1,40 +1,40 @@ --- -title: Aggiunta di piattaforme di scambio -description: La politica che usiamo per l'aggiunta di piattaforme di scambio su ethereum.org +title: Aggiungere exchange +description: La politica che utilizziamo per aggiungere exchange su ethereum.org lang: it --- -# Aggiungere piattaforme di scambio su Ethereum {#adding-ethereum-exchanges} +# Aggiungere exchange di Ethereum {#adding-ethereum-exchanges} -Chiunque è libero di suggerire nuove piattaforme di scambio su ethereum.org. +Chiunque è libero di suggerire nuovi exchange su ethereum.org. -Al momento le elenchiamo su: +Attualmente li elenchiamo su: - [ethereum.org/get-eth](/get-eth/) -Questa pagina consente a un utente di inserire dove vive e vedere quali piattaforme di scambio può usare. Questo aiuta a identificare qualsiasi limitazione geografica in anticipo. +Questa pagina consente a un utente di inserire dove vive e vedere quali exchange può utilizzare. Questo aiuta a far emergere in anticipo eventuali restrizioni geografiche. -Alla luce di ciò, abbiamo bisogno di ottenere alcune informazioni specifiche quando suggerisci una piattaforma di scambio. +A causa di questo contesto, abbiamo bisogno di alcune informazioni specifiche quando suggerisci un exchange. -**NOTA:** Se vuoi inserire uno scambio decentralizzato, dai un'occhiata alla nostra [politica per l'inserimento di portafogli e dapp](/contributing/adding-products/). +**NOTA:** Se desideri elencare un exchange decentralizzato, dai un'occhiata alla nostra [politica per l'elenco di portafogli e dApp](/contributing/adding-products/). ## Di cosa abbiamo bisogno {#what-we-need} -- Le limitazioni geografiche applicate alla piattaforma di scambio. Le restrizioni geografiche associate a un exchange devono essere spiegate nel dettaglio in una pagina o sezione dedicata sul sito dell'exchange. -- Le valute che gli utenti possono usare per acquistare ETH -- La prova che la piattaforma di scambio sia una società di trading legittima -- Qualsiasi altra informazione aggiuntiva in tuo possesso, ad esempio dati sulla società come gli anni di attività, il supporto finanziario, ecc. +- Le restrizioni geografiche che si applicano all'exchange. Le restrizioni geografiche associate all'exchange dovrebbero essere dettagliate in una pagina o sezione dedicata del sito web dell'exchange. +- Le valute che gli utenti possono utilizzare per acquistare ETH +- La prova che l'exchange sia una società di trading legittima +- Qualsiasi informazione aggiuntiva che potresti avere: potrebbero essere informazioni sull'azienda come anni di attività, sostegno finanziario, ecc. -Necessitiamo di queste informazioni per poter [aiutare in maniera affidabile gli utenti a trovare una piattaforma di scambio da usare](/get-eth/#country-picker). +Abbiamo bisogno di queste informazioni in modo da poter [aiutare accuratamente gli utenti a trovare un exchange che possono utilizzare](/get-eth/#country-picker). -Occorre inoltre fornire ad ethereum.org la sicurezza che la piattaforma di scambio sia un servizio legittimo e sicuro. +E affinché ethereum.org possa essere più sicuro che l'exchange sia un servizio legittimo e sicuro. --- -## Aggiungi la tua piattaforma di scambio {#add-exchange} +## Aggiungi il tuo exchange {#add-exchange} -Se desideri aggiungere una piattaforma di scambio a ethereum.org, crea un ticket su GitHub. +Se desideri aggiungere un exchange a ethereum.org, crea una issue su GitHub. - Crea un ticket - + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-glossary-terms/index.md b/public/content/translations/it/contributing/adding-glossary-terms/index.md index 487fd9e90cf..ccfd95ec46b 100644 --- a/public/content/translations/it/contributing/adding-glossary-terms/index.md +++ b/public/content/translations/it/contributing/adding-glossary-terms/index.md @@ -1,26 +1,26 @@ --- title: Aggiungere termini al glossario lang: it -description: Il nostro criterio per aggiungere nuovi termini al glossario di ethereum.org +description: I nostri criteri per aggiungere nuovi termini al glossario di ethereum.org --- # Aggiungere termini al glossario {#contributing-to-ethereumorg-} -Questa sezione cambia ogni giorno. Nuovi termini entrano costantemente nel lessico degli utenti di Ethereum e necessitiamo del tuo aiuto per fornire un riferimento accurato e aggiornato su tutti gli aspetti riguardanti Ethereum. Dai un'occhiata al [glossario](/glossary/) attuale e vedi qui sotto se vuoi aiutare! +Questo spazio cambia ogni giorno. Nuovi termini entrano costantemente nel lessico degli utenti di Ethereum e abbiamo bisogno del tuo aiuto per fornire un riferimento accurato e aggiornato per tutto ciò che riguarda Ethereum. Dai un'occhiata all'attuale [glossario](/glossary/) e vedi di seguito se vuoi dare una mano! ## Criteri {#criteria} I nuovi termini del glossario saranno valutati in base ai seguenti criteri: -- Il termine/la definizione è aggiornato/a e attualmene rilevante? -- C'è già un termine simile nel dizionario? (Se sì, considera i benefici di un nuovo termine rispetto ad aggiornarne uno esistente) -- Il termine/la definizione non contiene pubblicità di prodotti o altri contenuti promozionali? +- Il termine/la definizione è aggiornato e attualmente rilevante? +- Esiste già un termine simile nel dizionario? (In tal caso, considera i vantaggi di un nuovo termine rispetto all'aggiornamento di un termine esistente) +- Il termine/la definizione è privo di pubblicità di prodotti o altri contenuti promozionali? - Il termine/la definizione è direttamente rilevante per Ethereum? -- La definizione è oggettiva, accurata e priva di giudizio soggettivo o d'opinioni? -- La fonte è credibile? Si fa riferimento ad altre fonti? +- La definizione è oggettiva, accurata e priva di giudizi o opinioni soggettive? +- La fonte è credibile? Cita le proprie fonti? --- ## Aggiungi il tuo termine {#how-decisions-about-the-site-are-made} -Se vuoi aggiungere un termine al glossario di ethereum.org e i criteri sono soddisfatti, [crea un ticket su GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). +Se vuoi aggiungere un termine al glossario di ethereum.org e soddisfa i criteri, [crea una issue su GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-layer-2s/index.md b/public/content/translations/it/contributing/adding-layer-2s/index.md index e9849ec77de..592e23ee085 100644 --- a/public/content/translations/it/contributing/adding-layer-2s/index.md +++ b/public/content/translations/it/contributing/adding-layer-2s/index.md @@ -1,97 +1,97 @@ --- -title: Aggiungere Livelli 2 -description: La politica utilizzata quando aggiungiamo un livello 2 a ethereum.org +title: Aggiungere i livelli 2 +description: La politica che utilizziamo per aggiungere un livello 2 a ethereum.org lang: it --- -# Aggiungere Livelli 2 {#adding-layer-2} +# Aggiungere i livelli 2 {#adding-layer-2} -Vogliamo assicurarci di elencare le migliori risorse possibili, così che gli utenti possano navigare nello spazio del livello 2 con la massima tranquillità e sicurezza. +Vogliamo assicurarci di elencare le migliori risorse possibili in modo che gli utenti possano navigare nello spazio dei livelli 2 in modo sicuro e con fiducia. -Chiunque è libero di suggerire nuove piattaforme di scambio su ethereum.org. Se ci siamo dimenticati di un livello 2, **[ti invitiamo a suggerirlo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml)!** +Chiunque è libero di suggerire l'aggiunta di un livello 2 su ethereum.org. Se c'è un livello 2 che ci è sfuggito, **[suggeriscilo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml)!** -Attualmente elenchiamo i L2 nelle pagine seguenti: +Attualmente elenchiamo gli L2 nelle seguenti pagine: -- [Optimistic rollup](/developers/docs/scaling/optimistic-rollups/) -- [Rollup zero-knowledge](/developers/docs/scaling/zk-rollups/) +- [Rollup ottimistici](/developers/docs/scaling/optimistic-rollups/) +- [Rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/) - [Livello 2](/layer-2/) -Il Livello 2 è un paradigma relativamente nuovo ed entusiasmante per Ethereum. Abbiamo provato a creare un meccanismo equo per la disamina su ethereum.org, ma i criteri elencati cambieranno ed evolveranno col tempo. +Il livello 2 è un paradigma relativamente nuovo ed entusiasmante per Ethereum. Abbiamo cercato di creare un quadro equo per la valutazione su ethereum.org, ma i criteri di inserimento cambieranno e si evolveranno nel tempo. -## Il meccanismo decisionale {#decision-framework} +## Il quadro decisionale {#decision-framework} -### Criteri per l'inclusione: gli elementi imprescindibili {#criteria-for-inclusion-the-must-haves} +### Criteri di inclusione: i requisiti fondamentali {#criteria-for-inclusion-the-must-haves} -**Elenco su L2BEAT** +**Presenza su L2BEAT** -- Per essere preso in considerazione, questo progetto deve essere riportato su [L2BEAT](https://l2beat.com). L2BEAT fornisce una solida valutazione dei rischi dei progetti relativi al livello 2, cui ci affidiamo per la disamina dei progetti L2. **Se il progetto non è presente su L2BEAT, non lo elencheremo come un L2 su ethereum.org.** +- Per essere preso in considerazione, questo progetto deve essere elencato su [L2BEAT](https://l2beat.com). L2BEAT fornisce una solida valutazione del rischio dei progetti di livello 2 su cui ci basiamo per valutare i progetti L2. **Se il progetto non è presente su L2BEAT, non lo elencheremo come L2 su ethereum.org.** - [Scopri come aggiungere il tuo progetto L2 a L2BEAT](https://github.com/l2beat/l2beat/blob/master/CONTRIBUTING.md). **Open source** -- Il tuo codice deve essere accessibile e dovresti accettare le PR dall'intera community. +- Il tuo codice deve essere accessibile e dovresti accettare le PR dalla comunità più ampia. -**Categoria del livello 2** +**Categoria di livello 2** -Attualmente, prendiamo in considerazione le seguenti soluzioni come di livello 2: +Attualmente consideriamo soluzioni di livello 2 le seguenti: -- Optimistic rollup -- Rollup zero-knowledge +- Rollup ottimistico +- Rollup a conoscenza zero -_Non prendiamo in considerazione altre soluzioni di scalabilità che non utilizzano Ethereum per la disponibilità o la sicurezza dei dati al fine dell'inclusione nel Livello 2._ +_Non consideriamo di livello 2 altre soluzioni di scalabilità che non utilizzano Ethereum per la disponibilità dei dati o la sicurezza._ **Ethereum per la disponibilità dei dati** -- La disponibilità dei dati è un fattore distintivo importante tra le altre soluzioni di scalabilità e il Livello 2. Un progetto **must** utilizza la Rete principale di Ethereum per la disponibilità dei dati per essere preso in considerazione in vista dell'inclusione. +- La disponibilità dei dati è un importante fattore di differenziazione tra le altre soluzioni di scalabilità e il livello 2. Un progetto **deve** utilizzare la rete principale di Ethereum per la disponibilità dei dati per essere preso in considerazione per l'inserimento. -**Bridge** +**Ponti** -- Come fanno gli utenti ad accedere al livello 2? +- In che modo gli utenti possono accedere al livello 2? -**Data di rilascio del progetto** +**Data di lancio del progetto** -- Un livello due che è stato "attivo" sulla rete principale per 6 mesi +- Un livello 2 che è "attivo" sulla rete principale da oltre 6 mesi -- I progetti più recenti e non ancora ben testati dagli utenti hanno meno probabilità di essere elencati. +- I progetti più recenti che non sono stati testati sul campo dagli utenti hanno meno probabilità di essere elencati. -**Controllo di sicurezza esterno** +**Audit di sicurezza esterno** -- Che sia tramite controllo, tramite un team di sicurezza interno o altri metodi, la sicurezza del prodotto deve essere testata in modo affidabile. Questo riduce il rischio per gli utenti e dimostra che la sicurezza viene presa sul serio. +- Che sia tramite un audit, un team di sicurezza interno o qualche altro metodo, la sicurezza del tuo prodotto deve essere testata in modo affidabile. Questo riduce il rischio per i nostri utenti e ci dimostra che prendi sul serio la sicurezza. -**Base di utenti sostenuta** +**Base di utenti consolidata** -- Considereremo parametri come lo storico TVL, le statistiche di transazione e se è usato da aziende o progetti noti +- Prenderemo in considerazione metriche come la cronologia del TVL, le statistiche delle transazioni e se è utilizzato da aziende o progetti noti **Team di sviluppo attivo** -- Non elencheremo un livello 2 che non dispone di un team attivo al lavoro sul progetto. +- Non elencheremo un livello 2 che non ha un team attivo che lavora al progetto. -**Esploratore del blocco** +**Esploratore di blocchi** -- I progetti elencati richiedono un esploratore del blocco funzionante per consentire agli utenti di navigare facilmente sulla catena. +- I progetti elencati richiedono un esploratore di blocchi funzionante per consentire agli utenti di navigare facilmente nella catena. -### Altri criteri: gli aspetti preferibili {#nice-to-haves} +### Altri criteri: i requisiti opzionali {#nice-to-haves} -**Supporto della piattaforma di scambio per il progetto** +**Supporto degli exchange per il progetto** -- Gli utenti possono depositare e/o prelevare direttamente da una piattaforma di scambio? +- Gli utenti sono in grado di depositare e/o prelevare direttamente da un exchange? -**Link alle dapp nell'ecosistema del livello 2** +**Link alle dApp nell'ecosistema di livello 2** -- Vogliamo poter fornire informazioni su cosa gli utenti possono aspettarsi di poter fare su questo livello 2 (es. https://portal.arbitrum.io/, https://www.optimism.io/apps) +- Vogliamo essere in grado di fornire informazioni su ciò che gli utenti possono aspettarsi di poter fare su questo livello 2. (es., https://portal.arbitrum.io/, https://www.optimism.io/apps) -**Elenchi di contratti token** +**Elenchi dei contratti dei token** -- Poiché le risorse avranno un nuovo indirizzo sul livello 2, se è disponibile una risorsa di elenco dei token, ti preghiamo di condividerla. +- Poiché gli asset avranno un nuovo indirizzo sul livello 2, se è disponibile una risorsa con l'elenco dei token, ti preghiamo di condividerla. -**Supporto nativo al portafoglio** +**Supporto nativo del portafoglio** -- Qualche portafoglio supporta il L2 nativamente? +- Ci sono portafogli che supportano nativamente l'L2? ## Aggiungi il tuo livello 2 {#add-exchange} -Se desideri aggiungere un livello 2 su ethereum.org, crea un ticket su GitHub. +Se vuoi aggiungere un livello 2 a ethereum.org, crea una issue su GitHub. - Crea un ticket - + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-products/index.md b/public/content/translations/it/contributing/adding-products/index.md index 28c2b00edbf..b9718bad371 100644 --- a/public/content/translations/it/contributing/adding-products/index.md +++ b/public/content/translations/it/contributing/adding-products/index.md @@ -1,100 +1,100 @@ --- title: Aggiungere prodotti -description: La politica che applichiamo quando aggiungiamo le dapp a ethereum.org +description: La politica che utilizziamo quando aggiungiamo dApp a ethereum.org lang: it --- -# Aggiungere prodotti su Ethereum {#adding-products} +# Aggiungere prodotti di Ethereum {#adding-products} -Chiunque può suggerire nuove dapp ai contenuti su ethereum.org, ove appropriato. **No, non elencheremo la tua dapp sulla nostra pagina home** 😜 +Chiunque è libero di suggerire nuove dApp per i contenuti su ethereum.org, laddove sia appropriato farlo. **No, non elencheremo la tua dApp sulla nostra homepage** 😜 -Le dapp sono attualmente elencate su: +Le dApp sono attualmente elencate su: - ethereum.org/dapps - ethereum.org/get-eth -**Sei pregato di suggerire solo nuove aggiunte su queste pagine.** +**Ti preghiamo di suggerire nuove aggiunte solo su queste pagine.** -Sebbene accogliamo le nuove aggiunte, scegliamo le dapp correnti secondo un'esperienza che stiamo provando a creare per i nostri utenti. Questa si basa su alcuni dei nostri principi di design: +Sebbene accogliamo con favore le nuove aggiunte, abbiamo scelto le dApp attuali in base a un'esperienza che stiamo cercando di creare per i nostri utenti. Queste si basano su alcuni dei nostri principi di progettazione: -- _Ispirazionale:_ tutto su ethereum.org dovrebbe offrire agli utenti qualcosa di nuovo -- _Una storia utile_: le risorse elencate dovrebbero fornire un momento di comprensione -- _Credibile_: aziende/progetti dovrebbero essere tutti legittimi per minimizzare i rischi per gli utenti +- _Ispirazione_: qualsiasi cosa su ethereum.org dovrebbe offrire qualcosa di nuovo agli utenti +- _Una buona storia_: ciò che è elencato dovrebbe fornire un momento di illuminazione ("aha") +- _Credibilità_: tutto dovrebbe riguardare aziende/progetti legittimi per ridurre al minimo i rischi per gli utenti -In generale, **ethereum.org vuole fornire una "esperienza di adesione senza problemi" per i nuovi utenti**. Per questo motivo aggiungiamo le dapp in base a: +Nel complesso **ethereum.org vuole fornire un'"esperienza di integrazione fluida" per i nuovi utenti**. Per questo motivo, aggiungiamo le dApp in base a: - facilità d'uso - interoperabilità con altri prodotti - sicurezza - longevità -Ecco il nostro quadro decisionale più nel dettaglio. Sentiti libero di fornire feedback o suggerire modifiche. +Ecco il nostro quadro decisionale in modo più dettagliato. Sentiti libero di fornire feedback o suggerire modifiche. ## Il quadro decisionale {#decision-framework} -### Criteri per l'inclusione: gli elementi imprescindibili {#criteria-for-inclusion-the-must-haves} +### Criteri di inclusione: i requisiti fondamentali {#criteria-for-inclusion-the-must-haves} -- **Un prodotto testato per la sicurezza** – Attraverso un controllo, un team di sicurezza interno o altri metodi, la sicurezza del prodotto deve essere testata in modo affidabile. Questo riduce il rischio per gli utenti e ci dimostra che prendi la sicurezza sul serio. -- **Il prodotto deve essere "live" da almeno 6 mesi** – Questo è un altro indice di sicurezza. 6 mesi sono un buon periodo di tempo per individuare bug critici o utilizzi impropri. -- **Gestito da un team attivo** – Aiuta ad assicurare la qualità e garantire che gli utenti riceveranno supporto in caso di richieste. -- **Elenco d'informazioni oneste e accurate** - Ci si aspetta che ogni elenco suggerito dai progetti sia fornito con informazioni oneste e accurate. I prodotti che falsificano le informazioni per l'inserimento, come la dichiarazione che il prodotto è "open source" quando invece non lo è, saranno rimossi. +- **Un prodotto testato per la sicurezza**: che sia tramite un audit, un team di sicurezza interno o qualche altro metodo, la sicurezza del tuo prodotto deve essere testata in modo affidabile. Questo riduce il rischio per i nostri utenti e ci dimostra che prendi sul serio la sicurezza. +- **Un prodotto che è "live" da oltre 6 mesi**: questa è un'altra indicazione di sicurezza. 6 mesi sono un buon lasso di tempo per aver individuato bug critici e sfruttamenti. +- **Sviluppato da un team attivo**: questo aiuta a garantire la qualità e che un utente riceverà supporto per le sue domande. +- **Informazioni di inserzione oneste e accurate**: ci si aspetta che qualsiasi inserzione suggerita dai progetti sia accompagnata da informazioni oneste e accurate. I prodotti che falsificano le informazioni di inserzione, come dichiarare che il tuo prodotto è "open source" quando non lo è, verranno rimossi. -### Criteri per la classificazione: gli aspetti preferenziali {#criteria-for-ranking-the-nice-to-haves} +### Criteri di classificazione: i requisiti preferenziali {#criteria-for-ranking-the-nice-to-haves} -La tua dapp potrebbe non essere elencata su ethereum.org in evidenza con le altre a causa dei seguenti criteri. +La tua dApp potrebbe non essere elencata su ethereum.org in modo così prominente come altre a causa dei seguenti criteri. -**Dapp** +**dApp** -- **Puoi accedervi tramite la maggioranza dei portafogli elencati** – Le dapp dovrebbero funzionare con gran parte dei portafogli elencati su ethereum.org. -- **Gli utenti possono provarle da soli –** Un singolo utente dovrebbe poter usare la tua dapp e ottenere qualcosa di tangibile. -- **Adesione** – Il tuo prodotto dovrebbe offrire un'esperienza di adesione ben progettata per aiutare e istruire gli utenti. In alternativa, dovrebbe offrire contenuti di supporto come articoli o video. -- **Non custodito** – Gli utenti controllano i propri fondi. Se il prodotto scompare, gli utenti potranno comunque accedere e spostare i propri fondi. -- **Accessibile globalmente** – Il prodotto non ha limitazioni geografiche o requisiti KYC che escludono certe persone dall'accesso al servizio. -- **Open source** – Il codice dovrebbe essere accessibile e dovresti accettare PR dalla comunità nel complesso. -- **Comunità** – Hai una comunità dedicata, ad esempio su Discord, in cui gli utenti possono interagire con il tuo team per ricevere supporto o suggerire nuove funzionalità. +- **Puoi accedervi tramite la maggior parte dei portafogli elencati**: le dApp dovrebbero funzionare con la maggior parte dei portafogli elencati su ethereum.org. +- **Gli utenti possono provarlo da soli**: un singolo utente dovrebbe essere in grado di utilizzare la tua dApp e ottenere qualcosa di tangibile. +- **Integrazione**: il tuo prodotto dovrebbe avere un'esperienza di integrazione ben progettata per aiutare ed educare gli utenti. O prove di contenuti pratici come articoli o video. +- **Non detentivo**: gli utenti controllano i propri fondi. Se il tuo prodotto scompare, gli utenti possono ancora accedere e spostare i propri fondi. +- **Accessibile a livello globale**: il tuo prodotto non ha limitazioni geografiche o requisiti KYC che escludono determinate persone dall'accesso al tuo servizio. +- **Open source**: il tuo codice dovrebbe essere accessibile e dovresti accettare PR dalla comunità più ampia. +- **Comunità**: hai una comunità dedicata, magari un Discord, dove gli utenti possono interagire con il tuo team per ottenere aiuto o suggerire nuove funzionalità. -## Criteri nella pratica {#criteria-in-practice} +## I criteri in pratica {#criteria-in-practice} -Più criteri soddisfi, più probabilità ci sono che il tuo prodotto venga elencato su ethereum.org. +Più criteri soddisfi, più è probabile che il tuo prodotto trovi spazio su ethereum.org. -Un prodotto elencato che soddisfa solo gli aspetti imprescindibili potrebbe essere rimosso se viene suggerito un nuovo prodotto che soddisfa gli aspetti imprescindibili e diverse caratteristiche auspicabili. +Un prodotto elencato che soddisfa solo i requisiti fondamentali potrebbe essere rimosso se viene suggerito un nuovo prodotto che soddisfa i requisiti fondamentali e molti di quelli preferenziali. -Altre cose influiranno sulla decisione: +Altre cose che influiranno su questa decisione: -- Aggiungere piuttosto che sostituire corromperà l'UX della pagina? - - Il nostro sito è essenzialmente istruttivo e lo scopo principale è quello di spiegare Ethereum e i concetti pertinenti. Aggiungendo troppe opzioni per gli utenti, le pagine potrebbero divenire meno leggibili e dunque meno utili. -- La pagina rischia di paralizzare l'utente per la quantità di scelte? - - Come quando ti siedi a sfogliare Netflix per ore, perché non riesci a decidere cosa guardare. Confondere i nuovi utenti con troppe scelte è un rischio. +- Aggiungere piuttosto che sostituire comprometterà l'UX della pagina? + - il nostro sito è principalmente educativo e lo scopo principale è spiegare Ethereum e i suoi concetti rilevanti. Aggiungendo troppe opzioni per gli utenti, le pagine potrebbero diventare meno leggibili e quindi meno utili. +- Questa pagina ora paralizza l'utente con le scelte? + - come quando ti siedi a navigare su Netflix per ore perché non riesci a decidere cosa guardare. Confondere i nuovi utenti con troppa scelta è un rischio. -Si tratta di una decisione di design che spetta a ethereum.org. +Questa è una decisione di progettazione di cui ethereum.org è responsabile. -Ma stai sereno, **saranno presenti dei collegmenti ad altri siti web che classificano altre dapp** +Ma stai tranquillo, **ci saranno link ad altri siti web che classificano più dApp** -### Ordine dei prodotti {#product-ordering} +### Ordinamento dei prodotti {#product-ordering} -A meno che non vengano ordinati specificamente in modo diverso, ad esempio alfabeticamente, i prodotti saranno mostrati in ordine di inserimento nella pagina, dal più recente al meno recente. In altre parole, i prodotti più nuovi sono aggiunti in fondo all'elenco. +A meno che i prodotti non siano specificamente ordinati diversamente, ad esempio in ordine alfabetico, i prodotti verranno visualizzati dal più al meno recentemente aggiunto alla pagina. In altre parole, i prodotti più recenti vengono aggiunti in fondo all'elenco. ### Termini di utilizzo {#terms-of-use} -Ti invitiamo anche a consultare i nostri [termini di utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a fini di informazione generale. +Ti preghiamo di fare riferimento anche ai nostri [termini di utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a scopo informativo generale. ## Manutenzione {#maintenance} -In linea con la natura fluida di Ethereum, team e prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: +Data la natura fluida di Ethereum, i team e i prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: -- garantire che tutte le dApp elencate soddisfino ancora i nostri criteri -- verificare che non ci siano prodotti suggeriti che soddisfano più criteri rispetto a quelli attualmente elencati +- assicurarci che tutte le dApp elencate soddisfino ancora i nostri criteri +- verificare che non ci siano prodotti suggeriti che soddisfano più dei nostri criteri rispetto a quelli attualmente elencati -A tale riguardo, puoi aiutarci controllando e facendoci sapere. [Crea un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) o invia un'e-mail a [website@ethereum.org](mailto:website@ethereum.org) +Puoi aiutarci in questo controllando e facendocelo sapere. [Crea una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) o invia un'e-mail a [website@ethereum.org](mailto:website@ethereum.org) -_Stiamo anche studiando altre opzioni da votare, in modo tale che la comunità possa indicare le proprie preferenze ed evidenziare i migliori prodotti che dovremmo consigliare._ +_Stiamo anche studiando opzioni di voto in modo che la comunità possa indicare le proprie preferenze ed evidenziare i migliori prodotti in circolazione da consigliarci._ --- ## Aggiungi il tuo prodotto {#add-your-product} -Se desideri aggiungere una dapp a ethereum.org che soddisfa i criteri, crea un ticket su GitHub. +Se desideri aggiungere una dApp a ethereum.org e soddisfa i criteri, faccelo sapere. - Crea un ticket - + Suggerisci un'app + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-resources/index.md b/public/content/translations/it/contributing/adding-resources/index.md new file mode 100644 index 00000000000..bacb91cd631 --- /dev/null +++ b/public/content/translations/it/contributing/adding-resources/index.md @@ -0,0 +1,53 @@ +--- +title: Aggiungere risorse +description: La politica che utilizziamo per aggiungere risorse a ethereum.org +lang: it +--- + +# Aggiungere risorse {#adding-resources} + +Vogliamo assicurarci di elencare le migliori risorse possibili mantenendo gli utenti al sicuro e fiduciosi. + +Chiunque è libero di suggerire nuove risorse da aggiungere alla dashboard delle risorse su ethereum.org, attualmente disponibile su [ethereum.org/resources](/resources/). + +Sebbene accogliamo con favore le nuove aggiunte, le risorse attuali sono state scelte in base a un'esperienza che stiamo cercando di creare per i nostri utenti. Queste si basano su alcuni dei nostri principi di progettazione: + +- _Ispirazione_: qualsiasi cosa su ethereum.org dovrebbe offrire qualcosa di nuovo agli utenti +- _Una buona storia_: ciò che è elencato dovrebbe fornire un momento "aha" +- _Credibilità_: tutto dovrebbe riguardare aziende/progetti legittimi per ridurre al minimo i rischi per gli utenti + +Nel complesso **ethereum.org mira a fornire un'esperienza di onboarding fluida per i nuovi utenti**. Per questo motivo, aggiungiamo risorse in base alla loro: + +- facilità d'uso +- accuratezza +- manutenzione + +## Il quadro decisionale {#decision-framework} + +### Criteri {#criteria} + +- **Informazioni di inserzione oneste e accurate** - Qualsiasi inserzione suggerita deve essere accompagnata da informazioni oneste e accurate. I prodotti che falsificano le informazioni verranno rimossi. +- **Progetto attivo** – La risorsa dovrebbe essere mantenuta da un team attivo per garantire qualità e supporto agli utenti. Le risorse obsolete sono soggette a rimozione. + +### Ordinamento dei prodotti {#product-ordering} + +Ci riserviamo il diritto di ordinare i prodotti in base al loro impatto. I nuovi prodotti verranno generalmente aggiunti in fondo all'elenco, se non diversamente specificato. + +## Manutenzione {#maintenance} + +Man mano che l'ecosistema di Ethereum si evolve, controlleremo regolarmente i nostri contenuti per: + +- Assicurarci che tutte le risorse elencate soddisfino ancora i nostri criteri +- Verificare che non ci siano prodotti suggeriti che soddisfano i nostri criteri in misura maggiore rispetto a quelli attualmente elencati + +Puoi aiutarci in questo controllando e facendocelo sapere. [Crea una issue](https://github.com/ethereum/ethereum-org-website/issues/new?template=bug_report.yaml) o invia un'email a [website@ethereum.org](mailto:website@ethereum.org). + +--- + +## Aggiungi la tua risorsa {#add-your-resource} + +Se desideri aggiungere una risorsa a ethereum.org e questa soddisfa i criteri, crea una issue su GitHub. + + + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-staking-products/index.md b/public/content/translations/it/contributing/adding-staking-products/index.md index 6e145dfaa24..106925ccc87 100644 --- a/public/content/translations/it/contributing/adding-staking-products/index.md +++ b/public/content/translations/it/contributing/adding-staking-products/index.md @@ -1,63 +1,63 @@ --- title: Aggiungere prodotti o servizi di staking -description: La politica che usiamo quando aggiungiamo prodotti o servizi di staking a ethereum.org +description: La politica che utilizziamo quando aggiungiamo prodotti o servizi di staking su ethereum.org lang: it --- # Aggiungere prodotti o servizi di staking {#adding-staking-products-or-services} -Vogliamo assicurarci di elencare le migliori risorse possibili, mantenendo gli utenti al sicuro. +Vogliamo assicurarci di elencare le migliori risorse possibili mantenendo gli utenti al sicuro e fiduciosi. -Chiunque è libero di suggerire e aggiungere prodotti o servizi di staking su ethereum.org. Se ce ne siamo dimenticati uno, **[sei pregato di suggerirlo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** +Chiunque è libero di suggerire l'aggiunta di un prodotto o servizio di staking su ethereum.org. Se ce n'è uno che ci è sfuggito, **[suggeriscilo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** -Attualmente, elenchiamo i prodotti e i servizi di staking sulle seguenti pagine: +Attualmente elenchiamo prodotti e servizi di staking nelle seguenti pagine: -- [Staking in solo](/staking/solo/) +- [Staking in solitaria](/staking/solo/) - [Staking come servizio](/staking/saas/) - [Pool di staking](/staking/pools/) -Il proof-of-stake sulla Beacon Chain è attivo dal 1° dicembre 2020. Sebbene lo staking sia relativamente nuovo, abbiamo provato a creare un meccanismo equo e trasparente per la considerazione su ethereum.org, ma i criteri per l'inclusione nell'elenco cambieranno ed evolveranno col tempo e, in ultima analisi, saranno a discrezione del team del sito web di ethereum.org. +La prova di stake sulla beacon chain è attiva dal 1° dicembre 2020. Sebbene lo staking sia ancora relativamente nuovo, abbiamo cercato di creare un quadro equo e trasparente per la valutazione su ethereum.org, ma i criteri di inserimento cambieranno e si evolveranno nel tempo e sono, in ultima analisi, a discrezione del team del sito web di ethereum.org. -## Il meccanismo decisionale {#the-decision-framework} +## Il quadro decisionale {#the-decision-framework} -La decisione di elencare un prodotto su ethereum.org non dipende da un unico fattore. Nel decidere se elencare un prodotto o servizio, vengono considerati diversi criteri. Più questi criteri sono soddisfatti e più è probabile che venga elencato. +La decisione di elencare un prodotto su ethereum.org non dipende da un singolo fattore. Vengono considerati insieme molteplici criteri quando si decide di elencare un prodotto o servizio. Più di questi criteri vengono soddisfatti, più è probabile che venga elencato. -**Innanzitutto, di quale categoria di prodotto o di servizio si tratta?** +**Innanzitutto, di quale categoria di prodotto o servizio si tratta?** -- Strumenti del nodo o del client +- Strumenti per nodi o client - Gestione delle chiavi - Staking come servizio (SaaS) - Pool di staking -Al momento elenchiamo solo i prodotti e i servizi in queste categorie. +Attualmente, elenchiamo solo prodotti o servizi in queste categorie. -### Criteri per l'inclusione {#criteria-for-inclusion} +### Criteri di inclusione {#criteria-for-inclusion} -Le proposte di prodotti o servizi di staking saranno valutate secondo i seguenti criteri: +Le proposte di prodotti o servizi di staking saranno valutate in base ai seguenti criteri: -**Quando è stato lanciato il progetto o il servizio?** +**Quando è stato lanciato il progetto o servizio?** -- Vi sono prove di quando il prodotto o il servizio è diventato disponibile al pubblico? -- Questo serve a determinare il punteggio di "test di battaglia" dei prodotti. +- Ci sono prove di quando il prodotto o servizio è diventato disponibile al pubblico? +- Questo viene utilizzato per determinare il punteggio "testato sul campo" (battle tested) del prodotto. -**Il progetto viene mantenuto attivamente?** +**Il progetto è mantenuto attivamente?** -- C'è un team attivo che sta sviluppando il progetto? Chi è coinvolto? -- Solo i prodotti mantenuti attivamente saranno considerati. +- C'è un team attivo che sviluppa il progetto? Chi è coinvolto? +- Saranno presi in considerazione solo i prodotti mantenuti attivamente. -**Il prodotto o servizio è libero da intermediari fidati/umani?** +**Il prodotto o servizio è privo di intermediari umani/di fiducia?** -- Quali passaggi nel percorso degli utenti richiedono di affidarsi a esseri umani per detenere le chiavi dei loro fondi o distribuire adeguatamente le ricompense? -- Questo viene utilizzato per determinare il punteggio "senza fiducia" del prodotto o dei servizi. +- Quali passaggi nel percorso dell'utente richiedono di fidarsi di esseri umani per detenere le chiavi dei propri fondi o per distribuire correttamente le ricompense? +- Questo viene utilizzato per determinare il punteggio "trustless" del prodotto o servizio. **Il progetto fornisce informazioni accurate e affidabili?** -- È essenziale che il sito web del prodotto abbia informazioni aggiornate, accurate e non fuorvianti, specialmente se riguardano il protocollo Ethereum o altre tecnologie a esso collegate. -- Applicazioni che contengono disinformazione, dettagli obsoleti o dichiarazioni potenzialmente fuorvianti riguardanti Ethereum o altri soggetti rilevanti non verranno elencate o, se già elencate, verranno rimosse. +- È fondamentale che il sito web del prodotto presenti informazioni aggiornate, accurate e non fuorvianti, in particolare se riguardano il protocollo Ethereum o altre tecnologie correlate. +- Le proposte contenenti disinformazione, dettagli obsoleti o dichiarazioni potenzialmente fuorvianti su Ethereum o altri argomenti rilevanti non saranno elencate o verranno rimosse se già presenti. **Quali piattaforme sono supportate?** -- ossia Linux, macOS, Windows, iOS, Android +- es. Linux, macOS, Windows, iOS, Android #### Software e contratti intelligenti {#software-and-smart-contracts} @@ -65,112 +65,112 @@ Per qualsiasi software personalizzato o contratto intelligente coinvolto: **È tutto open source?** -- I progetti open source dovrebbero avere un repository di codice sorgente accessibile al pubblico -- Questo serve a determinare il punteggio "open source" dei prodotti. +- I progetti open source dovrebbero avere un repository del codice sorgente disponibile pubblicamente +- Questo viene utilizzato per determinare il punteggio "open source" del prodotto. -**Lo sviluppo in _beta_ del prodotto è terminato?** +**Il prodotto è fuori dalla fase di sviluppo _beta_?** -- Dove si trova il prodotto nel suo ciclo di sviluppo? -- I prodotti nella fase beta non sono presi in considerazione per l'inclusione su ethereum.org +- A che punto è il prodotto nel suo ciclo di sviluppo? +- I prodotti in fase beta non sono presi in considerazione per l'inclusione su ethereum.org -**Il software è stato sottoposto a un controllo di sicurezza esterno?** +**Il software è stato sottoposto a un audit di sicurezza esterno?** -- In caso contrario, vi è in programma di realizzarne uno? -- Questo serve a determinare il punteggio "verificato" dei prodotti. +- In caso contrario, ci sono piani per condurre un audit esterno? +- Questo viene utilizzato per determinare il punteggio "audited" (revisionato) del prodotto. -**Il progetto ha un programma di ricompense per la ricerca di bug?** +**Il progetto ha un programma di bug bounty?** -- Altrimenti, ci sono piani per creare un programma di ricompense per la ricerca dei bug di sicurezza? -- Questo serve a determinare il punteggio di "ricerca dei bug" dei prodotti. +- In caso contrario, ci sono piani per creare un bug bounty per la sicurezza? +- Questo viene utilizzato per determinare il punteggio "bug bounty" del prodotto. -#### Strumenti del nodo o del client {#node-or-client-tooling} +#### Strumenti per nodi o client {#node-or-client-tooling} -Per i prodotti del software correlati alla configurazione, alla gestione o alla migrazione del nodo o del client: +Per i prodotti software relativi alla configurazione, gestione o migrazione di nodi o client: -**Quali client del livello del consenso (ovvero Lighthouse, Teku, Nimbus, Prysm, Grandine) sono supportati?** +**Quali client di livello di consenso (es. Lighthouse, Teku, Nimbus, Prysm, Grandine) sono supportati?** - Quali client sono supportati? L'utente può scegliere? -- Questo serve a determinare il punteggio "multi-client" dei prodotti. +- Questo viene utilizzato per determinare il punteggio "multi-client" del prodotto. #### Staking come servizio {#staking-as-a-service} -Per gli [elenchi di staking-as-a-service](/staking/saas/) (cioè operazioni del nodo delegato): +Per gli [elenchi di staking come servizio](/staking/saas/) (es. operazione di nodi delegata): -**Quali sono le commissioni associate all'uso del servizio?** +**Quali sono le commissioni associate all'utilizzo del servizio?** -- Qual è la struttura tariffaria, ad esempio vi è un canone mensile per il servizio? -- Ulteriori requisiti per lo staking? +- Qual è la struttura delle commissioni, ad esempio, c'è una commissione mensile per il servizio? +- Ci sono requisiti di staking aggiuntivi? -**Gli utenti sono tenuti a registrarsi per avere un conto?** +**Agli utenti è richiesto di registrarsi per un account?** -- Qualcuno può usare il servizio senza permessi o KYC? -- Questo serve a determinare il punteggio "senza permessi" dei prodotti. +- Qualcuno può utilizzare il servizio senza permessi o KYC? +- Questo viene utilizzato per determinare il punteggio "senza permessi" (permissionless) del prodotto. **Chi detiene le chiavi di firma e le chiavi di prelievo?** -- A quali chiavi l'utente mantiene l'accesso? A quali chiavi il servizio ottiene accesso? -- Questo serve a determinare il punteggio "senza fiducia" dei prodotti. +- A quali chiavi l'utente mantiene l'accesso? A quali chiavi il servizio ottiene l'accesso? +- Questo viene utilizzato per determinare il punteggio "trustless" del prodotto. -**Qual è la diversità del client dei nodi operati?** +**Qual è la diversità dei client dei nodi gestiti?** -- Qual è la percentuale di chiavi del validatore eseguite dalla maggioranza dei client del livello di consenso (CL)? -- A partire dall'ultima modifica, Prysm è il client di livello di consenso eseguito da una maggioranza di operatori di nodi, il che è pericoloso per la rete. Se un client CL è attualmente utilizzato da oltre il 33% della rete, richiediamo i dati correlati al suo utilizzo. -- Questo serve a determinare il punteggio dei prodotti con "client diversi". +- Quale percentuale di chiavi del validatore è gestita da un client di livello di consenso (CL) di maggioranza? +- All'ultimo aggiornamento, Prysm è il client di livello di consenso eseguito dalla maggioranza degli operatori di nodi, il che è pericoloso per la rete. Se un qualsiasi client CL è attualmente utilizzato da oltre il 33% della rete, richiediamo dati relativi al suo utilizzo. +- Questo viene utilizzato per determinare il punteggio "client diversi" del prodotto. #### Pool di staking {#staking-pool} -Per i [servizi di staking in pool](/staking/pools/): +Per i [servizi di pool di staking](/staking/pools/): -**Qual è il livello minimo di ETH richiesto per lo staking?** +**Qual è l'ETH minimo richiesto per lo stake?** - es. 0,01 ETH -**Quali sono le commissioni o i requisiti di staking coinvolti?** +**Quali sono le commissioni o i requisiti di staking previsti?** -- Quale percentuale di ricompense viene rimossa come commissione? -- Ulteriori requisiti per lo staking? +- Quale percentuale delle ricompense viene trattenuta come commissione? +- Ci sono requisiti di staking aggiuntivi? -**Esiste un token di liquidità?** +**C'è un token di liquidità?** - Quali sono i token coinvolti? Come funzionano? Quali sono gli indirizzi del contratto? -- Questo serve a determinare il punteggio "token di liquidità" dei prodotti. +- Questo viene utilizzato per determinare il punteggio "token di liquidità" del prodotto. -**Gli utenti possono partecipare come operatore di nodi?** +**Gli utenti possono partecipare come operatori di nodi?** -- Cosa serve per eseguire i client validatori usando i fondi in pool? -- Ciò richiede l'autorizzazione da una persona, una società o una DAO? -- Questo serve a determinare il punteggio dei prodotti dei "nodi senza permessi". +- Cosa è richiesto per eseguire i client del validatore utilizzando i fondi del pool? +- Questo richiede il permesso di un individuo, un'azienda o una DAO? +- Questo viene utilizzato per determinare il punteggio "nodi senza permessi" del prodotto. -**Qual è la diversità del client degli operatori del nodo in pool?** +**Qual è la diversità dei client degli operatori di nodi del pool?** -- Quale percentuale di operatori dei nodi esegue un client del livello di consenso di maggioranza (CL)? -- A partire dall'ultima modifica, Prysm è il client di livello di consenso eseguito da una maggioranza di operatori di nodi, il che è pericoloso per la rete. Se un client CL è attualmente utilizzato da oltre il 33% della rete, richiediamo i dati correlati al suo utilizzo. -- Questo serve a determinare il punteggio dei prodotti con "client diversi". +- Quale percentuale di operatori di nodi esegue un client di livello di consenso (CL) di maggioranza? +- All'ultimo aggiornamento, Prysm è il client di livello di consenso eseguito dalla maggioranza degli operatori di nodi, il che è pericoloso per la rete. Se un qualsiasi client CL è attualmente utilizzato da oltre il 33% della rete, richiediamo dati relativi al suo utilizzo. +- Questo viene utilizzato per determinare il punteggio "client diversi" del prodotto. -### Altri criteri: gli aspetti preferibili {#other-criteria} +### Altri criteri: i requisiti opzionali {#other-criteria} **Quali interfacce utente sono supportate?** -- ossia App browser, app desktop, app mobili, CLI +- es. App per browser, app desktop, app mobile, CLI -**Per la strumentazione del nodo, il software fornisce un modo semplice per passare da un client all'altro?** +**Per gli strumenti dei nodi, il software fornisce un modo semplice per passare da un client all'altro?** -- L'utente può modificare facilmente e in sicurezza i client usando lo strumento? +- L'utente può cambiare client in modo facile e sicuro utilizzando lo strumento? -**Per SaaS, quanti validatori sono attualmente operati dal servizio?** +**Per il SaaS, quanti validatori sono attualmente gestiti dal servizio?** -- Questo ci da un'idea del raggio d'azione del tuo servizio finora. +- Questo ci dà un'idea della portata del tuo servizio finora. ## Come mostriamo i risultati {#product-ordering} -I [criteri di inclusione](#criteria-for-inclusion) di cui sopra vengono utilizzati per calcolare un punteggio cumulativo per ciascun prodotto o servizio. Questo viene utilizzato come mezzo per selezionare e mostrare prodotti che soddisfano determinati criteri oggettivi. Più criteri sono disponibili con le relative prove, più il prodotto sarà in cima all'elenco, mentre i pareggi saranno randomizzati al caricamento. +I [criteri di inclusione](#criteria-for-inclusion) sopra indicati vengono utilizzati per calcolare un punteggio cumulativo per ogni prodotto o servizio. Questo viene utilizzato come mezzo per ordinare e mostrare i prodotti che soddisfano determinati criteri oggettivi. Più sono i criteri per i quali vengono fornite prove, più in alto verrà ordinato un prodotto, con i pareggi randomizzati al caricamento. -La logica del codice e le ponderazioni per questi criteri sono attualmente contenute in [questo componente JavaScript](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid/index.tsx#L350) nel nostro repository. +La logica del codice e i pesi per questi criteri sono attualmente contenuti in [questo componente JavaScript](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid/index.tsx#L350) nel nostro repository. ## Aggiungi il tuo prodotto o servizio {#add-product} -Se desideri aggiungere un prodotto o servizio di staking su ethereum.org, crea un ticket su GitHub. +Se desideri aggiungere un prodotto o servizio di staking su ethereum.org, crea una issue su GitHub. - Crea un ticket - + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/adding-wallets/index.md b/public/content/translations/it/contributing/adding-wallets/index.md index c1a2b1fe179..06a01f70794 100644 --- a/public/content/translations/it/contributing/adding-wallets/index.md +++ b/public/content/translations/it/contributing/adding-wallets/index.md @@ -1,80 +1,81 @@ --- title: Aggiungere portafogli -description: La politica che applichiamo quando aggiungiamo un portafoglio a ethereum.org +description: La politica che utilizziamo per aggiungere un portafoglio su ethereum.org lang: it --- # Aggiungere portafogli {#adding-wallets} -Vogliamo assicurarci di mostrare una varietà di portafogli che coprano il panorama ricco di funzioni dei portafogli così che gli utenti possano navigare su Ethereum in sicurezza. +Vogliamo assicurarci di mostrare una varietà di portafogli che coprano il panorama ricco di funzionalità dei portafogli, in modo che gli utenti possano navigare su Ethereum in modo sicuro. -Tutti sono liberi di suggerire l'aggiunta di un portafoglio a ethereum.org. Se ci siamo dimenticati un portafoglio, ti preghiamo di suggerirlo! +Chiunque è libero di suggerire l'aggiunta di un portafoglio su ethereum.org. Se c'è un portafoglio che ci è sfuggito, suggeriscilo! -I portafogli sono attualmente elencati in: +I portafogli sono attualmente elencati su: - [ethereum.org/wallets/find-wallet/](/wallets/find-wallet/) -I portafogli sono in rapido cambiamento su Ethereum. Abbiamo provato a creare un meccanismo equo per la disamina su ethereum.org, ma i criteri elencati cambieranno ed evolveranno col tempo. +I portafogli cambiano rapidamente in Ethereum. Abbiamo cercato di creare un quadro equo per la valutazione su ethereum.org, ma i criteri di inserimento cambieranno e si evolveranno nel tempo. ## Il quadro decisionale {#the-decision-framework} -### Criteri per l'inclusione: gli elementi imprescindibili {#the-must-haves} - -- **Un prodotto testato per la sicurezza**: che sia tramite il controllo, un team di sicurezza interno, la codifica open source, o qualche altro metodo, la sicurezza del tuo portafoglio dev'essere attendibile. Questo riduce il rischio per gli utenti e ci dimostra che prendi la sicurezza sul serio. -- **Un portafoglio dev'esser stato "attivo" per oltre sei mesi O rilasciato da un gruppo con una comprovata esperienza**; anche questa è un'indicazione di sicurezza. 6 mesi sono un buon periodo di tempo per individuare bug critici o utilizzi impropri. Chiediamo sei mesi per aiutare a filtrare le biforcazioni i cui progetti sono abbandonati rapidamente. -- **Gestito da un team attivo**: ciò aiuta ad assicurare la qualità e che un utente riceverà supporto per le proprie richieste. -- **Elenco d'informazioni oneste e accurate** - Ci si aspetta che ogni elenco suggerito dai progetti sia fornito con informazioni oneste e accurate. I prodotti che falsificano le informazioni in elenco, ad esempio dichiarando che il proprio prodotto è "open source" quando non lo è, saranno rimossi. -- **Punto di contatto**: un punto di contatto per il portafoglio ci aiuterà molto a ottenere informazioni accurate quando sono apportate delle modifiche. Questo continuerà ad aggiornare ethereum in modo gestibile, raccogliendo le informazioni future. -- **Transazioni EIP-1559 (tipo 2)**: il tuo portafoglio deve supportare le transazioni EIP-1559 (tipo 2) per le transazioni sulla Rete Principale di Ethereum. -- **Buona esperienza dell'utente**: mentre l'UX è soggettiva, se svariati membri del team principale testano il prodotto e lo trovano difficile da utilizzare, ci riserviamo il diritto di rifiutare il portafoglio fornendo piuttosto utili suggerimenti per migliorarlo. Questo ha lo scopo di proteggere la nostra base di utenti, composta prevalentemente da principianti. - -### Rimozione di prodotti {#product-removals} - -- **Informazioni aggiornate**: i fornitori di portafogli sono responsabili di inoltrare le informazioni aggiornate sul proprio portafoglio ogni 6 mesi per assicurare la validità e la rilevanza delle informazioni fornite (anche se non sono state apportate modifiche al loro prodotto). Se il team del prodotto non lo fa, ethereum.org potrebbe rimuovere il progetto dalla pagina. - -### Altri criteri: gli aspetti preferibili {#the-nice-to-haves} - -- **Accessibile globalmente**: il tuo portafoglio non presenta limitazioni geografiche o requisiti KYC che escludono certe persone dall'accedere al tuo servizio. -- **Disponibile in più lingue**: il tuo portafoglio è tradotto in più lingue, il che consente agli utenti di tutto il mondo di accedervi. -- **Open source**: l'intera base di codice del tuo progetto (non soltanto i moduli) dovrebbe essere accessibile e dovresti accettare PR dall'intera comunità. -- **Non custodito** – Gli utenti controllano i propri fondi. Se il prodotto scompare, gli utenti potranno comunque accedere e spostare i propri fondi. -- **Supporto al portafoglio hardware**: gli utenti possono connettere i propri portafogli hardware per firmare le transazioni. -- **WalletConnect**: gli utenti possono connettersi alle dapp utilizzando WalletConnect. -- **Importazione degli endpoint RPC di Ethereum**: gli utenti possono importare i dati RPC del nodo, consentendo loro di connettersi a un nodo di propria scelta o ad altre reti compatibili con EVM. -- **NFT**: gli utenti possono visualizzare e interagire con i propri NFT nel portafoglio. -- **Connessione alle applicazioni di Ethereum**: gli utenti possono connettersi e utilizzare le applicazioni di Ethereum. -- **Staking**: gli utenti possono mettere direttamente in staking tramite il portafoglio. -- **Scambi**: gli utenti possono scambiare i token tramite il portafoglio. -- **Reti multicatena**: il tuo portafoglio supporta l'accesso degli utenti a più reti della blockchain per impostazione predefinita. +### Criteri di inclusione: i requisiti fondamentali {#the-must-haves} + +- **Un prodotto testato per la sicurezza**: che sia tramite audit, un team di sicurezza interno, codice open source o qualche altro metodo, la sicurezza del tuo portafoglio deve essere affidabile. Questo riduce il rischio per i nostri utenti e ci dimostra che prendi la sicurezza sul serio. +- **Un portafoglio che è "attivo" da oltre sei mesi OPPURE rilasciato da un gruppo con una comprovata esperienza**: questa è un'altra indicazione di sicurezza. Sei mesi sono un buon lasso di tempo per individuare bug critici e vulnerabilità. Chiediamo sei mesi per aiutare a filtrare le biforcazioni che vengono rapidamente abbandonate come progetti. +- **Sviluppato da un team attivo**: questo aiuta a garantire la qualità e che un utente riceverà supporto per le proprie richieste. +- **Informazioni di inserimento oneste e accurate**: ci si aspetta che qualsiasi inserimento suggerito dai progetti sia accompagnato da informazioni oneste e accurate. I prodotti che falsificano le informazioni di inserimento, come dichiarare che il prodotto è "open source" quando non lo è, verranno rimossi. +- **Punto di contatto**: un punto di contatto per il portafoglio ci aiuterà notevolmente a ottenere informazioni accurate quando vengono apportate modifiche. Questo manterrà gestibile l'aggiornamento di ethereum.org durante la raccolta di informazioni future. +- **Transazioni EIP-1559 (tipo 2)**: il tuo portafoglio deve supportare le transazioni EIP-1559 (tipo 2) per le transazioni sulla rete principale di Ethereum. +- **Buona esperienza utente**: sebbene l'UX sia soggettiva, se diversi membri del team principale testano il prodotto e lo trovano difficile da usare, ci riserviamo il diritto di rifiutare il portafoglio e forniremo invece suggerimenti utili per migliorarlo. Questo viene fatto per proteggere la nostra base di utenti che è composta principalmente da principianti. +- **Incentrato su Ethereum**: un portafoglio deve fornire un'esperienza incentrata principalmente su Ethereum. Ciò significa che Ethereum (o qualsiasi livello 2) è impostato come rete predefinita, gli asset ERC sono adeguatamente supportati e le funzionalità sono allineate con l'ecosistema di Ethereum. I portafogli che danno priorità nell'interfaccia utente a livelli 1 alternativi non verranno elencati. + +### Rimozioni di prodotti {#product-removals} + +- **Informazioni aggiornate**: i fornitori di portafogli sono responsabili di inviare nuovamente le informazioni del proprio portafoglio ogni 6 mesi per garantire la validità e la pertinenza delle informazioni fornite (anche se non ci sono modifiche al loro prodotto). Se il team del prodotto non lo fa, ethereum.org potrebbe rimuovere il progetto dalla pagina. + +### Altri criteri: i requisiti opzionali {#the-nice-to-haves} + +- **Accessibile a livello globale**: il tuo portafoglio non ha limitazioni geografiche o requisiti KYC che escludono determinate persone dall'accesso al tuo servizio. +- **Disponibile in più lingue**: il tuo portafoglio è tradotto in più lingue, consentendo agli utenti di tutto il mondo di accedervi. +- **Open source**: l'intera base di codice del tuo progetto (non solo i moduli) dovrebbe essere accessibile e dovresti accettare PR dalla comunità più ampia. +- **Non-custodial**: gli utenti controllano i propri fondi. Se il tuo prodotto scompare, gli utenti possono ancora accedere e spostare i propri fondi. +- **Supporto per portafogli hardware**: gli utenti possono connettere il proprio portafoglio hardware per firmare le transazioni. +- **WalletConnect**: gli utenti possono connettersi alle dApp utilizzando WalletConnect. +- **Importazione di endpoint RPC di Ethereum**: gli utenti possono importare i dati RPC del nodo, consentendo loro di connettersi a un nodo di loro scelta o ad altre reti compatibili con l'EVM. +- **NFT**: gli utenti sono in grado di visualizzare e interagire con i propri NFT nel portafoglio. +- **Connessione alle applicazioni di Ethereum**: gli utenti sono in grado di connettersi e utilizzare le applicazioni di Ethereum. +- **Staking**: gli utenti sono in grado di fare staking direttamente tramite il portafoglio. +- **Scambi**: gli utenti sono in grado di scambiare token tramite il portafoglio. +- **Reti multi-chain**: il tuo portafoglio supporta l'accesso degli utenti a più reti blockchain per impostazione predefinita. - **Reti di livello 2**: il tuo portafoglio supporta l'accesso degli utenti alle reti di livello 2 per impostazione predefinita. -- **Personalizzazione delle commissioni sul gas**: il tuo portafoglio consente agli utenti di personalizzare le commissioni sul gas delle proprie transazioni (commissione di base, commissione di priorità, commissione massima). -- **Supporto ENS**: il tuo portafoglio consente agli utenti di inviare le transazioni ai nomi ENS. -- **Supporto ERC-20**: il tuo portafoglio consente agli utenti di importare i contratti del token ERC-20 o interroga automaticamente e mostra i token ERC-20. -- **Acquistare criptovalute**: il tuo portafoglio supporta l'acquisto diretto e l'adesione alle criptovalute da parte degli utenti. -- **Vendita per valuta legale**: il tuo portafoglio supporta la vendita e prelievo degli utenti in valuta legale direttamente su carta o conto bancario. -- **Multifirma**: il tuo portafoglio supporta più firme per firmare una transazione. -- **Recupero sociale**: il tuo portafoglio supporta i tutori e un utente può recuperarlo se perde la propria frase seed, utilizzando tali tutori. -- **Team di supporto dedicato**: il tuo portafoglio ha un team di supporto dedicato a cui gli utenti possono rivolgersi quando si verificano problemi. -- **Risorse/documentazione didattiche**: il tuo prodotto dovrebbe avere un'esperienza di adesione ben progettata per aiutare a istruire gli utenti. In alternativa, dovrebbe offrire contenuti di supporto come articoli o video. +- **Personalizzazione delle commissioni del gas**: il tuo portafoglio consente agli utenti di personalizzare le commissioni del gas delle transazioni (commissione di base, commissione di priorità, commissione massima). +- **Supporto ENS**: il tuo portafoglio consente agli utenti di inviare transazioni a nomi ENS. +- **Supporto ERC-20**: il tuo portafoglio consente agli utenti di importare contratti di token ERC-20, o interroga e visualizza automaticamente i token ERC-20. +- **Acquisto di criptovalute**: il tuo portafoglio supporta gli utenti nell'acquisto diretto e nell'avvicinamento alle criptovalute. +- **Vendita per valuta fiat**: il tuo portafoglio supporta gli utenti nella vendita e nel prelievo in valuta fiat direttamente su carta o conto bancario. +- **Multifirma**: il tuo portafoglio supporta firme multiple per firmare una transazione. +- **Recupero sociale**: il tuo portafoglio supporta i guardiani e un utente può recuperare il proprio portafoglio se perde la propria frase di recupero utilizzando questi guardiani. +- **Team di supporto dedicato**: il tuo portafoglio ha un team di supporto dedicato a cui gli utenti possono rivolgersi in caso di problemi. +- **Risorse educative/documentazione**: il tuo prodotto dovrebbe avere un'esperienza di onboarding ben progettata per aiutare ed educare gli utenti. O prove di contenuti pratici come articoli o video. ## Aggiungere un portafoglio {#adding-a-wallet} -Se desideri aggiungere un portafoglio a ethereum.org, crea un ticket su GitHub. +Se vuoi aggiungere un portafoglio su ethereum.org, crea una issue su GitHub. - Crea un ticket + Crea una issue ## Manutenzione {#maintenance} -In linea con la natura fluida di Ethereum, team e prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: +Data la natura fluida di Ethereum, team e prodotti vanno e vengono e l'innovazione avviene quotidianamente, quindi effettueremo controlli di routine dei nostri contenuti per: -- garantire che tutti i portafogli e le dApp elencati soddisfino ancora i nostri criteri +- assicurarci che tutti i portafogli e le dApp elencati soddisfino ancora i nostri criteri - verificare che non ci siano prodotti suggeriti che soddisfano più criteri rispetto a quelli attualmente elencati -ethereum.org è mantenuto dalla sua community open source e si affida ad essa per tenere aggiornato questo elenco. Se noti che delle informazioni sui portafogli elencati devono essere aggiornate, sei pregato di [aprire un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) o una [richiesta di pull](https://github.com/ethereum/ethereum-org-website/pulls)! +ethereum.org è mantenuto dalla comunità open source e ci affidiamo alla comunità per aiutarci a mantenerlo aggiornato. Se noti informazioni sui portafogli elencati che devono essere aggiornate, per favore [apri una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) o una [pull request](https://github.com/ethereum/ethereum-org-website/pulls)! -## Condizioni d'uso {#terms-of-use} +## Termini di utilizzo {#terms-of-use} -Sei anche pregato di fare riferimento ai [termini d'utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a fini di informazione generale. +Fai riferimento anche ai nostri [termini di utilizzo](/terms-of-use/). Le informazioni su ethereum.org sono fornite esclusivamente a scopo informativo generale. \ No newline at end of file diff --git a/public/content/translations/it/contributing/content-resources/index.md b/public/content/translations/it/contributing/content-resources/index.md index 86d4b4a66f0..a770127e02b 100644 --- a/public/content/translations/it/contributing/content-resources/index.md +++ b/public/content/translations/it/contributing/content-resources/index.md @@ -1,32 +1,32 @@ --- title: Aggiungere risorse di contenuto lang: it -description: I nostri criteri per elencare risorse di contenuto su ethereum.org +description: I nostri criteri per elencare le risorse di contenuto su ethereum.org --- # Aggiungere risorse di contenuto {#adding-content-resources} -Non possiamo sperare di coprire ogni singolo aspetto di Ethereum, quindi proviamo a mostrare le risorse più brillanti tra articoli, tutorial, newsletter, schede di lavoro e altri contenuti creati dalla community. In questo modo, spesso si forniscono informazioni più approfondite sugli argomenti a cui gli utenti potrebbero essere interessati. +Non possiamo sperare di coprire tutto ciò che riguarda Ethereum, quindi cerchiamo di mostrare alcuni dei brillanti articoli, tutorial, newsletter, bacheche di lavoro e varie risorse di contenuto create dalla community. Spesso forniscono informazioni più approfondite su argomenti a cui gli utenti potrebbero essere interessati. -Se ci sono risorse di contenuto che pensi dovrebbero essere aggiunte a una pagina, sentiti libero di suggerirle ove appropriato. +Se c'è una risorsa di contenuto che ritieni debba essere aggiunta a una pagina, sentiti libero di suggerirla in un luogo appropriato. ## Come decidiamo {#how-we-decide} -Le risorse di apprendimento saranno valutate sulla base dei seguenti criteri: +Le risorse di apprendimento saranno valutate in base ai seguenti criteri: - Il contenuto è aggiornato? -- Il contenuto è a pagamento? +- Il contenuto è dietro un paywall? - Le informazioni sono accurate? Sono basate su fatti o su opinioni? -- L'autore è credibile? Cita le fonti? -- Questo contenuto aggiunge valore distinto non coperto dalle risorse/dai link esistenti? -- Questo contenuto serve uno dei nostri [profili utente](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c)? +- L'autore è credibile? Cita le sue fonti? +- Questo contenuto aggiunge un valore distinto che le risorse/i link esistenti non coprono? +- Questo contenuto è utile a una delle nostre [user personas](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c)? --- -## Aggiungere le proprie risorse di contenuto {#add-your-content-resource} +## Aggiungi la tua risorsa di contenuto {#add-your-content-resource} -Se desideri aggiungere a ethereum.org una risorsa di contenuto che soddisfa i criteri, crea un ticket su GitHub. +Se desideri aggiungere una risorsa di contenuto a ethereum.org e soddisfa i criteri, crea una issue su GitHub. - Crea un ticket - + Crea una issue + \ No newline at end of file diff --git a/public/content/translations/it/contributing/design-principles/index.md b/public/content/translations/it/contributing/design-principles/index.md index 161fdf13ba8..75baf1e6a4d 100644 --- a/public/content/translations/it/contributing/design-principles/index.md +++ b/public/content/translations/it/contributing/design-principles/index.md @@ -1,93 +1,93 @@ --- -title: Principi di progettazione +title: Principi di design lang: it -description: I principi dietro alla progettazione e alle decisioni sui contenuti di ethereum.org +description: I principi alla base delle decisioni di design e dei contenuti di ethereum.org --- -# I nostri principi di progettazione {#contributing-to-ethereumorg-} +# I nostri principi di design {#contributing-to-ethereumorg-} - Ciao e benvenuto ai principi di design per ethereum.org. Questo fa parte di un processo in corso per fare evolvere e migliorare ethereum.org. + Ciao e benvenuto ai principi di design di ethereum.org. Questo fa parte di un processo continuo per evolvere e migliorare ethereum.org. -I nostri principi definiscono l'aspetto del sito e dei contenuti su di esso. +I nostri principi guidano l'aspetto del sito e i contenuti presenti su di esso. Dovresti leggerli prima di [contribuire a ethereum.org](/contributing/). -## Quali sono i principi di progettazione? {#ways-to-contribute} +## Cosa sono i principi di design? {#ways-to-contribute} -Non preoccuparti, sono piuttosto semplici! I **principi di progettazione** sono una serie di linee guida a cui facciamo riferimento quando progettiamo (ovvero creiamo, manteniamo o aggiorniamo) qualcosa. +Non preoccuparti, sono piuttosto semplici! I **principi di design** sono un insieme di linee guida a cui facciamo riferimento quando progettiamo (cioè creiamo, manteniamo o aggiorniamo) qualcosa. -Nel contesto di ethereum.org, questi principi di design sono le fondamenta per ciò che vogliamo che il sito web rappresenti e proietti al mondo. Sono sia ambiziosi **che** funzionali. Non si tratta solo dell'_aspetto_ del sito web, ma anche del suo _funzionamento_ e persino di come fa _sentire_ gli utenti. Tutto, dai colori ai layout della pagina, fino a come parliamo di Ethereum sul sito web, dovrebbe tenere conto di questi principi. +Nel contesto di ethereum.org, questi principi di design sono le fondamenta di ciò che vogliamo che il sito web rappresenti e proietti nel mondo. Sono sia aspirazionali **che** funzionali. Non si tratta solo di come il sito web _appare_, ma anche di come _funziona_ e persino di come fa _sentire_ qualcuno. Tutto, dai colori ai layout delle pagine fino a come parliamo di Ethereum sul sito web, dovrebbe essere guidato da questi principi. -## I principi nella pratica {#how-decisions-about-the-site-are-made} +## I principi in pratica {#how-decisions-about-the-site-are-made} -Vediamo un esempio. Uno dei principi riguarda la "Credibilità", il che significa che vogliamo che i visitatori del sito _sentano_ e _sappiano_ che il sito è affidabile, proprio come l'ecosistema Ethereum più ampio. Secondo tale principio, abbiamo 3 "principi secondari" funzionali, che crediamo siano passaggi praticabili che possiamo intraprendere per rendere il sito credibile: +Diamo un'occhiata a un esempio. Uno dei principi è "Credibile", il che significa che vogliamo che i visitatori del sito _sentano_ e _sappiano_ che il sito è affidabile, proprio come il più ampio ecosistema di Ethereum. All'interno di questo principio, abbiamo 3 "sotto-principi" funzionali che riteniamo siano passaggi attuabili che possiamo intraprendere per rendere il sito credibile: -- _"Aggiornamento"_, ovvero mantenere aggiornati i contenuti. -- _"Prova Sociale"_, ossia mostrare la dimensione, la diversità e l'attività dell'ecosistema (come i progressi di aggiornamento di Ethereum, DeFi, gaming, tutti gli hackathon, ecc.) -- _"Coerenza"_, ovvero coerenza di progettazione del sito nonché il tono e l'accuratezza della scrittura. +- _"Fresco"_, cioè mantenere i contenuti aggiornati. +- _"Riprova sociale"_, cioè mostrare le dimensioni, la diversità e l'attività dell'ecosistema (sai: i progressi degli aggiornamenti di Ethereum, la DeFi, il gaming, tutti gli hackathon, ecc.) +- _"Coerente"_, cioè coerenza nel design del sito e nel tono e nell'accuratezza della scrittura. -Quindi, quando prendiamo decisioni di progettazione o copywriting, possiamo fare riferimento al principio "Credibilità" e chiederci: +Quindi, quando prendiamo decisioni di design o di copywriting, possiamo fare riferimento al principio "Credibile" e chiederci: -- _"Il sito riflette informazioni attuali?"_ -- _"Come e dove stiamo mostrando la dimensione e l'attività dell'ecosistema?"_ -- _"I nuovi contributi proposti da un membro della community che sto revisionando sono in linea con la progettazione e la scrittura attuali sul sito?"_ +- _"Il sito riflette le informazioni attuali?"_ +- _"Come e dove stiamo mostrando le dimensioni e l'attività dell'ecosistema?"_ +- _"I nuovi contributi proposti da un membro della community che sto revisionando sono coerenti con il design e la scrittura attuali del sito?"_ -## I principi di progettazione di ethereum.org {#contributors} +## I principi di design di ethereum.org {#contributors} -### 1. Fonte d'ispirazione {#1-inspirational} +### 1. Ispiratore {#1-inspirational} -Il sito dovrebbe ispirare gli utenti a immginare in che modo Ethereum può cambiare il mondo. Dovrebbe motivare le persone a esplorare, giocare e sperimentare con gli strumenti e le app dell'ecosistema di Ethereum. +Il sito dovrebbe ispirare gli utenti a sognare come Ethereum possa cambiare il mondo. Dovrebbe motivare le persone a esplorare, giocare e armeggiare con gli strumenti e le app dell'ecosistema di Ethereum. -- **Radicale:** il sito dovrebbe comunicare gli obiettivi ambiziosi di Ethereum per cambiare significativamente il mondo. Dovrebbe essere chiaro che Ethereum non è solo un nuovo insieme di tecnologie, bensì è una tecnologia di trasformazione. -- **Emancipazione tramite l'istruzione:** il sito dovrebbe educare le persone in modo che possano comprendere il potenziale di Ethereum, trovare il proprio posto nell'ecosistema e sentirsi emancipati per parteciparvi. +- **Radicale:** Il sito dovrebbe comunicare gli obiettivi ambiziosi di Ethereum per cambiare significativamente il mondo. Dovrebbe essere chiaro che Ethereum non è solo un nuovo stack tecnologico: è una tecnologia trasformativa. +- **Emancipazione attraverso l'educazione:** Il sito dovrebbe educare le persone in modo che possano comprendere il potenziale di Ethereum, trovare il loro posto nell'ecosistema e sentirsi autorizzate a parteciparvi. Direzione visiva • Contenuti ### 2. Universale {#2-universal} -Ethereum è un progetto globale e decentralizzato e il nostro pubblico riflette queste caratteristiche. Il sito dovrebbe aspirare a essere accessibile per tutti e sensibile alle molteplici culture del mondo. +Ethereum è un progetto globale e decentralizzato e il nostro pubblico riflette questo aspetto. Il sito dovrebbe aspirare a essere accessibile a tutti e sensibile alle molte culture del mondo. -- **Accessibile:** il sito dovrebbe seguire le linee guida di accessibilità, anche per le persone con connessioni a bassa larghezza di banda. -- **Semplice:** il sito dovrebbe essere semplice ed evitare ambiguità. Si dovrebbe evitare un linguaggio che potrebbe essere male interpretato o andare perso nella traduzione. -- **Ethereum è sfaccettato:** si tratta di un progetto, un codebase, una community e una visione. Ethereum è prezioso per diverse persone e diversi motivi, e ci sono molti modi per essere coinvolti. +- **Accessibile:** Il sito dovrebbe seguire le linee guida sull'accessibilità, anche per le persone con connessioni a bassa larghezza di banda. +- **Semplice:** Il sito dovrebbe essere semplice e inequivocabile. I testi non dovrebbero usare un linguaggio che potrebbe essere frainteso o perso nella traduzione. +- **Ethereum è multiforme:** Ethereum è un progetto, una base di codice, una community e una visione. Ethereum è prezioso per persone diverse per motivi diversi e ci sono molti modi per essere coinvolti. Sistemi di scrittura • Uso del colore • Direzione visiva • Contenuti -### 3. Una storia positiva {#3-a-good-story} +### 3. Una buona storia {#3-a-good-story} -Il sito web dovrebbe funzionare come una storia positiva. I visitatori sono in viaggio e i contenuti cui contribuisci ne fanno parte. I contributi degli utenti dovrebbero iscriversi in una narrazione chiara, che abbia un inizio (introduzione/punto d'accesso), un corpo (serie di apprendimenti e dettagli) e una fine (uno o più link alle risorse rilevanti o ai passaggi successivi). +Il sito web dovrebbe funzionare come una buona storia. I visitatori sono in viaggio e i contenuti con cui contribuisci ne fanno parte. I tuoi contributi dovrebbero inserirsi in una narrazione chiara: una con un inizio (introduzione/punto di ingresso), una parte centrale (insieme di apprendimenti e approfondimenti) e una fine (uno o più link a risorse pertinenti o ai passaggi successivi). -- **Struttura gerarchica**: un'architettura chiara e strutturata gerarchicamente aiuta i visitatori a "vivere" il sito di ethereum.org "come una storia", mentre cercano di raggiungere i propri obiettivi. -- **Un trampolino di lancio:** siamo un trampolino di lancio per chiunque cerchi risposte. Non vogliamo rimpiazzare o diventare sostituti per le molte risorse che esistono già. Forniamo risposte e indichiamo i passaggi successivi in maniera affidabile. +- **Gerarchico**: Un'architettura dell'informazione chiara e strutturata gerarchicamente aiuta i visitatori di ethereum.org a navigare nel sito "come una storia" mentre cercano di raggiungere i loro obiettivi. +- **Un trampolino di lancio:** Siamo un trampolino di lancio per chiunque cerchi risposte. Non vogliamo sostituire o diventare un sostituto delle molte risorse che già esistono. Diamo una risposta e forniamo passaggi successivi affidabili. -Viaggi dell'utente • Contenuti +Percorsi dell'utente • Contenuti -### 4. Credibilità {#4-credible} +### 4. Credibile {#4-credible} -Gli utenti potrebbero cercare di addentrarsi nell'ecosistema di Ethereum o anche essere scettici. Riconosci tale responsabilità nel modo in cui comunichi. Assicurati che in entrambi i casi l'utente acquisisca maggiore fiducia nell'ecosistema di Ethereum. +Le persone potrebbero cercare la loro introduzione all'ecosistema di Ethereum o potrebbero essere scettiche. Riconosci questa responsabilità nel modo in cui comunichi. Assicurati che entrambi se ne vadano con maggiore fiducia nell'ecosistema di Ethereum. -- **Aggiornamento:** contenuti sempre aggiornati. -- **Prova sociale:** mostra la portata, la diversità e l'attività dell'ecosistema. -- **Coerenza:** la coerenza a livello di progettazione e dei contenuti trasmette credibilità. +- **Fresco:** Sempre aggiornato. +- **Riprova sociale:** Mostra le dimensioni, la diversità e l'attività dell'ecosistema. +- **Coerente:** La coerenza nel design e nei contenuti comunica credibilità. Direzione visiva • Contenuti ### 5. Miglioramento collaborativo {#5-collaborative-improvement} -Il sito web è il prodotto dei contributi di molte persone, proprio come l'ecosistema nel suo complesso. +Il sito web è il prodotto di molti contributori, proprio come l'ecosistema nel suo complesso. -- **Aperto:** celebra la trasparenza del codice sorgente, dei processi e dei progetti nell'ecosistema. -- **Estensibile:** la modularità è un punto focale chiave dietro tutto ciò che facciamo, quindi anche i contributi dovrebbero essere modulari. La progettazione centrale, il codice del componente e l'implementazione del sito dovrebbero consentire di essere estesi facilmente in futuro. -- **Sperimentale:** sperimentiamo, testiamo e iteriamo costantemente. -- **Collaborativo:** questo progetto riunisce tutti noi. -- **Sostenibile:** configurato per la manutenzione a lungo termine da parte della community. +- **Aperto:** Celebra la trasparenza del codice sorgente, dei processi e dei progetti in tutto l'ecosistema. +- **Estendibile:** La modularità è un obiettivo chiave alla base di tutto ciò che facciamo, e quindi anche i contributi dovrebbero essere modulari. Il design principale, il codice dei componenti e l'implementazione del sito dovrebbero consentirne una facile estensione in futuro. +- **Sperimentale:** Sperimentiamo, testiamo e iteriamo costantemente. +- **Collaborativo:** Questo progetto riunisce tutti noi. +- **Sostenibile:** Predisposizione per la manutenzione a lungo termine da parte della community -Puoi vedere i nostri principi di progettazione in azione [sul nostro sito](/). +Puoi vedere i nostri principi di design in azione [in tutto il nostro sito](/). -## Fornisci un feedback {#give-feedback} +## Dai un feedback {#give-feedback} -**Condividi il tuo feedback su questo documento!** Uno dei nostri principi proposti è il “**Miglioramento Collaborativo**”, il che significa che vogliamo che il sito web sia il prodotto di molti collaboratori. Quindi, nello spirito di tale principio, vogliamo condividere tali principi di progettazione con la community di Ethereum. +**Condividi il tuo feedback su questo documento!** Uno dei nostri principi proposti è il "**Miglioramento collaborativo**", il che significa che vogliamo che il sito web sia il prodotto di molti contributori. Quindi, nello spirito di quel principio, vogliamo condividere questi principi di design con la community di Ethereum. -Sebbene questi principi siano incentrati sul sito web ethereum.org, speriamo che molti di essi siano rappresentativi dei valori dell'ecosistema Ethereum in generale. Potresti persino decidere di incorporare alcuni di essi nel tuo progetto! +Sebbene questi principi siano incentrati sul sito web ethereum.org, speriamo che molti di essi siano rappresentativi dei valori dell'ecosistema di Ethereum in generale. Forse vorrai persino incorporarne alcuni nel tuo progetto! -Facci sapere che ne pensi sul [server Discord](https://discord.gg/ethereum-org) o [creando un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). +Facci sapere cosa ne pensi sul [server Discord](https://discord.gg/ethereum-org) o [creando una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). \ No newline at end of file diff --git a/public/content/translations/it/contributing/design/adding-design-resources/index.md b/public/content/translations/it/contributing/design/adding-design-resources/index.md index f696b61a581..d63a46a931a 100644 --- a/public/content/translations/it/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/it/contributing/design/adding-design-resources/index.md @@ -1,69 +1,69 @@ --- -title: Aggiungere risorse di progettazione -description: Linee guida e requisiti per assicurare la qualità dei materiali di progettazione su ethereum.org +title: Aggiungere risorse di design +description: "Linee guida e requisiti per garantire la qualità dei materiali di design su ethereum.org" lang: it --- -# Aggiungere risorse di progettazione {#adding-design-resources} +# Aggiungere risorse di design {#adding-design-resources} -Chiunque può suggerire nuovi materiali di progettazione per il [design e l'UX nella pagina Web3](/developers/docs/design-and-ux/). +Chiunque può suggerire nuovi materiali di design alla pagina [Design e UX nel web3](/developers/docs/design-and-ux/). -Si prega di notare che questa pagina si occupa di fornire il valore dell'utente agli aspiranti designer in Web3. La sezione di progettazione non serve per pubblicizzare i tuoi servizi, prodotti o piattaforme. +Tieni presente che l'obiettivo di questa pagina è fornire valore agli aspiranti designer web3. La sezione di design non è pensata per pubblicizzare i tuoi servizi, prodotti o piattaforme. -Per assicurarci di mantenere uno standard informativo elevato e promuovere informazioni preziose, abbiamo stabilito una politica di elencazione: +Per assicurarci di mantenere un elevato standard di informazione e promuovere approfondimenti preziosi, abbiamo stabilito una politica di inserimento: -## Studi di ricerca e pannelli di controllo {#Research-studies} +## Studi di ricerca e dashboard {#Research-studies} -1. Metodologia valida +1. Metodologia solida -a. La metodologia dovrebbe definire chiaramente come sono raccolti i dati. +a. La metodologia dovrebbe definire chiaramente come sono stati raccolti i dati. -b. Il numero di partecipanti alla ricerca dovrebbe essere dichiarato. +b. Dovrebbe essere indicato il numero di partecipanti coinvolti nella ricerca. -c. I metodi di ricerca impiegati dovrebbero essere descritti. +c. Dovrebbero essere descritti i metodi di ricerca impiegati. -2. Pertinenza per i designer in Web3 e casi d'uso di progettazione comuni +2. Rilevanza per i designer Web3 e casi d'uso comuni di design -a. L'argomento della ricerca dovrebbe essere pertinente per il designer in Web3 e affrontare i casi d'uso di progettazione comuni. +a. L'argomento della ricerca dovrebbe essere rilevante per i designer web3 e affrontare casi d'uso comuni di design. -3. Concentrarsi sulla fornitura di informazioni +3. Concentrarsi sulla fornitura di approfondimenti -a. L'obiettivo principale del testo dovrebbe essere condividere informazioni dettagliate piuttosto che promuovere un progetto o un'azienda nello specifico. +a. L'obiettivo primario del testo dovrebbe essere la condivisione di approfondimenti piuttosto che la promozione di un progetto o di un'azienda specifici. ## Articoli {#Articles} -1. Pertinenza per i designer/ricercatori in Web3 e casi d'uso di progettazione comuni in Web3 +1. Rilevanza per i designer/ricercatori Web3 e casi d'uso comuni di design Web3 -a. L'argomento dell'articolo dovrebbe essere pertinente per i progettisti e ricercatori in Web3, incentrandosi sui casi d'uso di progettazione in Web3 comuni. +a. L'argomento dell'articolo dovrebbe essere pertinente per i designer e i ricercatori web3, concentrandosi sui casi d'uso comuni di design web3. -2. Qualità di base della scrittura +2. Qualità di scrittura di base a. L'articolo dovrebbe essere privo di errori grammaticali e ortografici. -b. L'enfasi dovrebbe esser posta sulla fornitura di informazioni e insegnamenti fondamentali. +b. L'enfasi dovrebbe essere posta sulla fornitura di approfondimenti e apprendimenti chiave. -c. La scrittura dovrebbe essere concisa e pertinente. +c. La scrittura dovrebbe essere concisa e dritta al punto. 3. Obiettivo del testo -a. L'obiettivo principale dell'articolo dovrebbe essere la condivisione di informazioni dettagliate piuttosto che la promozione di un progetto o un'azienda in particolare. +a. L'obiettivo primario dell'articolo dovrebbe essere la condivisione di approfondimenti piuttosto che la promozione di un progetto o di un'azienda in particolare. ## Comunità / DAO {#Communities-and-DAOs} -1. Il sito web dovrebbe indicare chiaramente come aderire alla DAO/Comunità +1. Il sito web deve indicare chiaramente come unirsi alla DAO/Comunità -2. Vantaggi chiari dell'adesione +2. Vantaggi chiari dell'iscrizione -a. I benefici dell'adesione dovrebbero essere mostrati in modo visibile. +a. I vantaggi di diventare un membro dovrebbero essere mostrati in modo ben visibile. -**Esempi**: ricevere feedback sul lavoro, accedere a opportunità lavorative o ricompense per segnalazioni, condividere informazioni di progettazione e ricerca. +**Esempi**: ricevere feedback sul lavoro, accedere a opportunità di lavoro o taglie, condividere approfondimenti di design e ricerca. 3. Comunicazione attiva e vivace su Discord -a. La comunità di Discord dovrebbe mostrare una comunicazione vivace e impegnata. +a. La comunità Discord dovrebbe mostrare una comunicazione vivace e coinvolgente. -b. I moderatori dovrebbero essere coinvolti attivamente nel mantenimento della comunità e nel facilitare le discussioni. +b. I moderatori dovrebbero essere attivamente coinvolti nel mantenimento della comunità e nel facilitare le discussioni. -c. La comunità dovrebbe dimostrare conversazioni precedenti preziose e produttive nell'ambito delle ultime due settimane. +c. La comunità dovrebbe dimostrare uno storico di conversazioni preziose e produttive nelle ultime due settimane. -Aderendo a tali criteri, miriamo a promuovere un ambiente prosperoso e di condivisione della conoscenza nella nostra comunità. Crediamo che questa politica di elencazione assicurerà che i nostri utenti abbiano accesso a risorse affidabili, pertinenti e piene di informazioni. Grazie per la tua comprensione e cooperazione nel mantenimento della qualità dei contenuti, sulla nostra piattaforma. +Aderendo a questi criteri, miriamo a promuovere un ambiente fiorente e di condivisione delle conoscenze all'interno della nostra comunità. Riteniamo che questa politica di inserimento garantirà ai nostri utenti l'accesso a risorse affidabili, pertinenti e ricche di spunti. Grazie per la comprensione e la collaborazione nel mantenere la qualità dei contenuti all'interno della nostra piattaforma. \ No newline at end of file diff --git a/public/content/translations/it/contributing/design/index.md b/public/content/translations/it/contributing/design/index.md index 1f39b83459e..bb28de94a35 100644 --- a/public/content/translations/it/contributing/design/index.md +++ b/public/content/translations/it/contributing/design/index.md @@ -1,77 +1,77 @@ --- -title: Contributi di progettazione -description: Contributi di progettazione a ethereum.org +title: Contributo al design +description: Contributo al design di ethereum.org lang: it --- -# Contributi di progettazione a ethereum.org {#design-contributions} +# Contributo al design di ethereum.org {#design-contributions} -La progettazione è un componente fondamentale di qualsiasi progetto, e dedicando il tuo tempo e le tue abilità di progettazione a ethereum.org puoi contribuire a migliorare l'esperienza dei nostri visitatori. Contribuire a un progetto open source fornisce l'opportunità di acquisire un'esperienza rilevante e sviluppare le tue competenze in un ambiente collaborativo. Avrai la possibilità di collaborare con altri progettisti, sviluppatori e membri della comunità, che avranno le proprie prospettive e informazioni originali. +Il design è un componente critico di qualsiasi progetto e, dedicando il tuo tempo e le tue abilità di design a ethereum.org, puoi aiutare a migliorare l'esperienza utente per i nostri visitatori. Contribuire a un progetto open-source offre l'opportunità di acquisire un'esperienza rilevante e sviluppare le tue abilità in un ambiente collaborativo. Avrai la possibilità di lavorare con altri designer, sviluppatori e membri della community, ognuno dei quali avrà le proprie prospettive e intuizioni uniche. -Infine, questo è un ottimo modo per creare un portafoglio diversificato e suggestivo, che dimostri le tue abilità di progettazione. +In definitiva, questo è un ottimo modo per costruire un portfolio diversificato e impressionante che metta in mostra le tue abilità di design. ## Come contribuire? -###  Fornire feedback ai primi prototipi di progettazione {#design-critique} +###  Fornire feedback sui primi prototipi di design {#design-critique} -Talvolta, necessitiamo di aiuto nel testare le nostre idee abbozzate. Questo è un ottimo modo per contribuire senza alcuna conoscenza tecnica. +A volte abbiamo bisogno di aiuto per testare le nostre idee grezze. Questo è un ottimo modo per contribuire senza alcuna conoscenza tecnica. -1. Il team di progettazione condividerà un design di prova su [Discord](https://discord.com/invite/ethereum-org) e su [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). -2. Sarai guidato attraverso i design per fornire feedback tramite la funzionalità dei commenti. -3. Il risultato sarà condiviso nel ticket di GitHub e quindi sarà chiuso dal team. +1. Il team di design condividerà un mockup del design su [Discord](https://discord.com/invite/ethereum-org) e su [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +2. Verrai guidato attraverso i design per fornire feedback tramite la funzione dei commenti. +3. Il risultato verrà condiviso nella issue di GitHub e poi chiuso dal team. -###  Partecipare ai sondaggi di ricerca {#answer-surveys} +###  Partecipare alle ricerche tramite sondaggi {#answer-surveys} -Fornisci feedback tramite il nostro sito web: +Fornisci feedback sul nostro sito web: 1. Visitando ethereum.org e leggendo le pagine. -2. Cliccando sul widget del feedback nell'angolo inferiore destro e rispondendo a domande relative a progettazione e contenuti. -3. Concentrati sulle domande in formato libero. +2. Cliccando sul widget di feedback nell'angolo in basso a destra e rispondendo alle domande relative al design e ai contenuti. +3. Concentrandoti sulle domande a formato libero. -###  Trovare problemi di progettazione sul sito web e segnalarli {#report-design-issues} +###  Trovare problemi relativi al design sul sito web e segnalarli {#report-design-issues} -ethereum.org è un sito web in rapida crescita, ricco di funzionalità e contenuti. Parte dell'UI può facilmente divenire obsoleta o migliorabile. Se riscontri un caso simile, ti preghiamo di segnalarlo, così che ottenga la nostra attenzione. +ethereum.org è un sito web in rapida crescita con molte funzionalità e contenuti. Alcune parti dell'interfaccia utente (UI) possono facilmente diventare obsolete o potrebbero essere migliorate. Se riscontri uno di questi casi, segnalalo in modo che riceva la nostra attenzione. -1. Visita il sito web e presta attenzione al suo design. -2. Scatta degli screenshot e annota se vedi qualsiasi problema visivo o dell'UX. +1. Esplora il sito web e presta attenzione al suo design. +2. Fai screenshot e prendi appunti se noti problemi visivi o di UX. 3. Segnala i problemi trovati utilizzando una [segnalazione di bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Proponi modifiche al design {#propose-design-changes} +###  Proporre modifiche al design {#propose-design-changes} -Se ti senti a tuo agio nell'affrontare le sfide del design, puoi visitare la bacheca dei nostri ticket di GitHub e filtrare i [problemi di design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +Se ti senti a tuo agio nell'affrontare sfide di design, puoi visitare la nostra bacheca delle issue su GitHub e filtrare per [problemi relativi al design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). -1. Visita il sito web e presta attenzione al suo design o visita la nostra repository di GitHub e revisiona i ticket contrassegnati dal [tag "Design richiesto"](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). -2. Idea la soluzione e progettala. (preferibilmente utilizzando il nostro [sistema di progettazione](https://www.figma.com/community/file/1134414495420383395)). -3. Proponi la soluzione nel ticket di GitHub corrispondente o [creane uno nuovo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). -4. Attendi la revisione del team di progettazione. +1. Esplora il nostro sito web e presta attenzione al suo design, oppure vai al nostro repository GitHub e rivedi le issue contrassegnate con il [tag "Design required"](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +2. Pensa a una soluzione e progettala (idealmente utilizzando il nostro [design system](https://www.figma.com/community/file/1134414495420383395)). +3. Proponi la soluzione nella issue di GitHub corrispondente o [creane una nuova.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) +4. Attendi la revisione da parte del team di design. -###  Creare insieme il sistema di progettazione {#Contribute-to-design-system} +###  Costruire insieme il Design System {#Contribute-to-design-system} -Il nostro sistema di progettazione rende la progettazione di ethereum.org divertente e facile. Se sei un progettista esperto, puoi aiutarci a preparare molti componenti per il sito web. +Il nostro design system rende la progettazione di ethereum.org facile e divertente. Se sei un designer esperto, puoi aiutarci a preparare molti componenti per il sito web. -1. Seleziona un ticket su cui lavorare dalla [bacheca del sistema di progettazione](https://github.com/ethereum/ethereum-org-website/labels/design%20system) su GitHub o creane uno nuovo. -2. Richiedi che il ticket selezionato ti sia assegnato. +1. Seleziona una issue su cui lavorare dalla [bacheca del design system](https://github.com/ethereum/ethereum-org-website/labels/design%20system) su GitHub o creane una nuova. +2. Richiedi che la issue selezionata ti venga assegnata. 3. Inizia a progettare il componente richiesto su Figma. -4. Condividilo con il team di progettazione su GitHub quando ti serve una revisione o una guida. -5. Il team di progettazione lo revisionerà. -6. Il team di progettazione incorporerà le modifiche al file principale e lo pubblicherà nella community. +4. Condividilo con il team di design su GitHub quando hai bisogno di una revisione o di indicazioni. +5. Il team di design lo revisionerà. +6. Il team di design incorporerà le modifiche nel file principale e pubblicherà il file per la community. -###  Scrivere contenuti correlati alla progettazione sul sito web {#write-design-articles} +###  Scrivere contenuti relativi al design sul sito web {#write-design-articles} -La comunità di sviluppatori di Ethereum è forte, mentre quella di progettazione è lievemente in ritardo. Se sei un progettista con conoscenze di Web3, ti preghiamo di condividerle con la comunità, in modo che possiamo tutti crescere e migliorarci insieme; abbiamo [una pagina sulla progettazione su Ethereum](/developers/docs/design-and-ux/) a cui puoi contribuire. Inoltre, puoi consultare le nostre [politiche di elencazione](/contributing/design/adding-design-resources). +La community di sviluppatori di Ethereum è forte, ma la community di design sta rimanendo leggermente indietro. Se sei un designer con conoscenze del web3, considera di condividere ciò che hai imparato con la community più ampia in modo che tutti possiamo crescere e migliorare insieme; abbiamo [una pagina sulla progettazione per Ethereum](/developers/docs/design-and-ux/) a cui puoi contribuire. Puoi anche controllare le nostre [politiche di inserimento](/contributing/design/adding-design-resources). -1. Crea argomenti di progettazione che dovrebbero essere coperti su ethereum.org e che sarebbero di beneficio per i progettisti nello spazio. -2. Vai alla nostra repository di GitHub e [apri un ticket](https://github.com/ethereum/ethereum-org-website/issues/new), proponendo un argomento (senza scriverne ancora i contenuti). -3. Attendi che il team di progettazione lo approvi. -4. Una volta approvato, scrivi i contenuti. -5. Invialo nel ticket di GitHub corrispondente. +1. Pensa ad argomenti di design che dovrebbero essere trattati su ethereum.org e che sarebbero utili per i designer nel settore. +2. Vai al nostro repository GitHub e [apri una issue](https://github.com/ethereum/ethereum-org-website/issues/new) proponendo un argomento (non scrivere ancora il contenuto). +3. Attendi l'approvazione del team di design. +4. Una volta approvato, scrivi il contenuto. +5. Invialo nella issue di GitHub corrispondente. ###  Disegnare nuove illustrazioni {#prepare-illustrations} -Le visualizzazioni sono tra gli strumenti più potenti per spiegare degli argomenti astratti. L'aggiunta di diagrammi e infografiche ha un enorme potenziale. Dopotutto, un'immagine può dire più di mille parole. +Le visualizzazioni sono uno degli strumenti più potenti per spiegare argomenti astratti. C'è un enorme potenziale nell'aggiungere diagrammi e infografiche. Dopotutto, un'immagine vale più di mille parole. -1. Visita il nostro sito web e visualizza le pagine in cui potrebbero essere aggiunte delle nuove infografiche. -2. Assicurati che lo stile di illustrazione corrisponda alle nostre [risorse](/assets/). -3. Visita la nostra repository di GitHub e [apri un ticket](https://github.com/ethereum/ethereum-org-website/issues/new) proponendo l'illustrazione. -4. Il team di progettazione la revisionerà. -5. Creeremo un nuovo ticket per chiedere a uno sviluppatore di implementare la nuova immagine. +1. Vai sul nostro sito web e cerca le pagine in cui potrebbero essere aggiunte nuove infografiche. +2. Assicurati che lo stile dell'illustrazione corrisponda alle nostre [risorse](/assets/). +3. Vai al nostro repository GitHub e [apri una issue](https://github.com/ethereum/ethereum-org-website/issues/new) proponendo l'illustrazione. +4. Il team di design la revisionerà. +5. Creeremo una nuova issue per chiedere a uno sviluppatore di implementare la nuova immagine. \ No newline at end of file diff --git a/public/content/translations/it/contributing/index.md b/public/content/translations/it/contributing/index.md index bc5f4e1f2b4..734b0201c1d 100644 --- a/public/content/translations/it/contributing/index.md +++ b/public/content/translations/it/contributing/index.md @@ -1,114 +1,115 @@ --- title: Contribuire -description: Scopri i vari modi in cui puoi contribuire a ethereum.org +description: Scopri i diversi modi in cui puoi contribuire a ethereum.org lang: it --- -# Contribuire a ethereum.org {#contributing-to-ethereumorg} +# Contribuire a ethereum.org 🦄 {#contributing-to-ethereumorg} -Ethereum.org è un progetto open source con oltre **12000** collaboratori che aiutano a tradurre, scrivere, progettare e mantenere il sito web. +Ethereum.org è un progetto open-source con **oltre 12.000** collaboratori che aiutano a tradurre, scrivere, progettare e mantenere il sito web. -Siamo un'accogliente community che ti aiuterà a crescere e a istruirti nell'ecosistema di Ethereum, contribuendo significativamente e ottenendo un'importante esperienza pratica! +Siamo una community accogliente che ti aiuterà a crescere e a formarti nell'ecosistema di [Ethereum](/), contribuendo in modo significativo e acquisendo un'esperienza pratica rilevante! ## Modi per contribuire {#ways-to-contribute} **Traduzioni** -- [Unisciti al programma di traduzione](/contributing/translation-program/): aiutaci a offrire ethereum.org in nuove lingue +- [Unisciti al programma di traduzione](/contributing/translation-program/) – Aiutaci a portare ethereum.org in nuove lingue **Sviluppo** -- [Lavora a un ticket aperto](https://github.com/ethereum/ethereum-org-website/issues): attività che abbiamo identificato come necessarie +- [Lavora su un problema aperto](https://github.com/ethereum/ethereum-org-website/issues) – Lavori che abbiamo identificato e che devono essere svolti -**Progettazione** -- [Aiuta a progettare il sito web](/contributing/design/) - Possono contribuire a migliorare il sito i designer di qualsiasi livello +**Design** +- [Aiuta a progettare il sito web](/contributing/design/) – I designer di tutti i livelli possono contribuire a migliorare il sito web -**Contenuto** -- [Crea/modifica i contenuti](/contributing/#how-to-update-content): suggerisci nuove pagine o apporta modifiche a ciò che esiste già -- [Aggiungi risorse della community](/contributing/content-resources/): aggiungi un articolo o una risorsa utili a una pagina rilevante -- [Suggerisci una risorsa di progettazione](/contributing/design/adding-design-resources/): aggiungi, aggiorna (ed elimina) le risorse di progettazione utili -- [Quiz](/contributing/quizzes/): aggiungi, aggiorna (ed elimina) le banche di domande dei quiz per un pagina rilevante +**Contenuti** +- [Crea/modifica contenuti](/contributing/#how-to-update-content) – Suggerisci nuove pagine o apporta modifiche a quelle già presenti +- [Aggiungi risorse della community](/contributing/content-resources/) – Aggiungi un articolo o una risorsa utile a una pagina pertinente +- [Suggerisci una risorsa di design](/contributing/design/adding-design-resources/) – Aggiungi, aggiorna ed elimina risorse di design utili +- [Quiz](/contributing/quizzes/) – Aggiungi, aggiorna ed elimina banche di domande per i quiz di una pagina pertinente -**Idee di funzionalità** -- [Richiedi una funzionalità](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=): facci sapere qualsiasi idea ti venga in mente per una nuova funzionalità o design +**Idee per funzionalità** +- [Richiedi una funzionalità](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) – Facci sapere se hai idee per una nuova funzionalità o un nuovo design -**Elenco dei prodotti** -- [Aggiungi una piattaforma di scambio](/contributing/adding-exchanges/): aggiungi una piattaforma di scambio alla nostra [ricerca di piattaforme di scambio](/get-eth/#country-picker) -- [Aggiungi un prodotto](/contributing/adding-products/): aggiungi una dApp o un portafoglio a una pagina rilevante -- [Aggiungi strumenti per sviluppatori](/contributing/adding-developer-tools/): aggiungi uno strumento per sviluppatori a una pagina rilevante -- [Aggiungi un livello 2](/contributing/adding-layer-2s/): aggiungi un livello 2 a una pagina rilevante -- [Aggiungi un prodotto o servizio di staking](/contributing/adding-staking-products/): aggiungi un progetto che aiuti a facilitare lo staking in solo, in gruppo o lo staking come servizio -- [Aggiungi un portafoglio](/contributing/adding-wallets/): aggiungi un portafoglio alla [pagina di ricerca dei portafogli](/wallets/find-wallet/) -- [Suggerisci un progetto per la nostra pagina sulla DeSci](/contributing/adding-desci-projects/): aggiungi un progetto basato su Ethereum che contribuisca alla scienza decentralizzata +**Elenchi di prodotti** +- [Aggiungi un exchange](/contributing/adding-exchanges/) – Aggiungi un exchange al nostro [strumento di ricerca degli exchange](/get-eth/#country-picker) +- [Aggiungi un prodotto](/contributing/adding-products/) – Aggiungi una dApp o un portafoglio a una pagina pertinente +- [Aggiungi strumenti per sviluppatori](/contributing/adding-developer-tools/) – Aggiungi uno strumento per sviluppatori a una pagina pertinente +- [Aggiungi un livello 2](/contributing/adding-layer-2s/) – Aggiungi un livello 2 a una pagina pertinente +- [Aggiungi un prodotto o servizio di staking](/contributing/adding-staking-products/) – Aggiungi un progetto che aiuti a facilitare lo staking in solitaria, lo staking in pool o lo staking come servizio +- [Aggiungi un portafoglio](/contributing/adding-wallets/) – Aggiungi un portafoglio per la [pagina di ricerca dei portafogli](/wallets/find-wallet/) +- [Suggerisci un progetto per la nostra pagina DeSci](/contributing/adding-desci-projects/) – Aggiungi un progetto basato su Ethereum che contribuisce alla scienza decentralizzata +- [Aggiungi una risorsa](/contributing/adding-resources/) – Aggiungi una risorsa utile a qualsiasi pagina pertinente -Qualche domanda? 🤔 Unisciti al nostro [server Discord](https://discord.gg/ethereum-org) +Hai domande? 🤔 Unisciti al nostro [server Discord](https://discord.gg/ethereum-org) -## Prime attività adatte per iniziare a contribuire +## Buoni compiti iniziali per iniziare a contribuire -Queste sono alcune delle attività attuali che potresti aiutarci a risolvere, e di cui potresti assumerti la responsabilità. Per gran parte di esse ti servirà un profilo di GitHub, poiché molte modifiche al sito web sono effettuate tramite GitHub. +Questi sono alcuni compiti attuali che potresti aiutarci a risolvere e di cui potresti assumerti la responsabilità. Per la maggior parte avrai bisogno di un account GitHub, poiché la maggior parte delle modifiche al sito web viene effettuata tramite GitHub. -Visualizza tutte le attività +Vedi tutti i compiti ## Come lavorare su ethereum.org {#how-to-update-content} -Se desideri contribuire al [Programma di Traduzione](/contributing/translation-program/), ti chiediamo di creare un profilo su [Crowdin](https://crowdin.com/project/ethereum-org). Per tutto il resto, aggiungere o modificare contenuti o grafiche sul sito web, correggere bug o lavorare ad attività aperte, avrai bisogno di un profilo [GitHub](https://github.com/). +Se desideri contribuire al [Programma di traduzione](/contributing/translation-program/), ti chiediamo di creare un account su [Crowdin](https://crowdin.com/project/ethereum-org). Per tutto il resto – aggiungere o modificare contenuti o elementi visivi del sito web, correggere bug, lavorare su compiti aperti – avrai bisogno di un account [GitHub](https://github.com/). -Tutti gli aggiornamenti sono effettuati tramite il processo PR di GitHub. Questo significa che crei una copia locale del sito web, effettui le modifiche e richiedi di unire le tue modifiche. Se non lo hai mai fatto prima, segui le istruzioni in fondo al nostro [repository di GitHub](https://github.com/ethereum/ethereum-org-website). +Tutti gli aggiornamenti vengono effettuati tramite il processo di PR su GitHub. Ciò significa che crei una copia locale del sito web, apporti le tue modifiche e richiedi di unirle. Se non l'hai mai fatto prima, segui le istruzioni in fondo al nostro [repository GitHub](https://github.com/ethereum/ethereum-org-website). -Non necessiti di autorizzazioni per iniziare a lavorare, ma è sempre meglio farci sapere che cosa hai in mente di fare. Puoi farlo: +Non hai bisogno di permessi per lavorare su nulla, ma è sempre meglio farci sapere cosa hai intenzione di fare. Puoi farlo: -- Commentando su un ticket o PR su [GitHub](https://github.com/ethereum/ethereum-org-website) -- Scrivendoci sul nostro [server Discord](https://discord.gg/ethereum-org) +- Commentando un problema o una PR su [GitHub](https://github.com/ethereum/ethereum-org-website) +- Inviando un messaggio sul nostro [server Discord](https://discord.gg/ethereum-org) Prima di contribuire, assicurati di avere familiarità con: - la [visione in evoluzione di ethereum.org](/about/) -- i nostri [principi di progettazione](/contributing/design-principles/) +- i nostri [principi di design](/contributing/design-principles/) - la nostra [guida di stile](/contributing/style-guide/) - il nostro [codice di condotta](/community/code-of-conduct) ## Come vengono prese le decisioni sul sito {#how-decisions-about-the-site-are-made} -Le decisioni sui singoli PR, l'evoluzione del design e gli aggiornamenti principali sono prese da un team facente capo all'ecosistema di Ethereum. Questo team include manager del progetto, sviluppatori, designer, marketing e comunicazioni, oltre a esperti settoriali. I contributi della community vengono utilizzati come base per ogni decisione: ti invitiamo quindi a porre domande tramite ticket, inviare PR o contattare il team: +Le decisioni sulle singole PR, sull'evoluzione del design e sugli aggiornamenti principali vengono prese da un team proveniente da tutto l'ecosistema di Ethereum. Questo team include project manager, sviluppatori, designer, esperti di marketing e comunicazione ed esperti in materia. Il contributo della community informa ogni decisione: quindi ti preghiamo di sollevare domande nei problemi, inviare PR o contattare il team: - [website@ethereum.org](mailto:website@ethereum.org) - [@ethdotorg](https://twitter.com/ethdotorg) - [Server Discord](https://discord.gg/ethereum-org) -### Due parole sul plagio {#plagiarism} +### Una nota sul plagio {#plagiarism} -Quando contribuisci a contenuti o artefatti su ethereum.org, usa unicamente il tuo lavoro o contenuti originali che sei autorizzato a usare. Molti progetti nell'ecosistema di Ethereum usano licenze open source che consentono la condivisione libera delle informazioni. Tuttavia, se non riesci a trovare queste informazioni, non tentare di aggiungerle su ethereum.org. Ogni richiesta di invio ritenuta plagio sarà rifiutata. +Usa solo il tuo lavoro originale o contenuti che hai il permesso di utilizzare quando contribuisci con qualsiasi contenuto o artefatto a ethereum.org. Molti progetti all'interno dell'ecosistema di Ethereum utilizzano licenze open-source che consentono la libera condivisione delle informazioni. Tuttavia, se non riesci a trovare queste informazioni, non tentare di aggiungerle a ethereum.org. Qualsiasi pull request considerata come plagio verrà rifiutata. -## L'open source è una novità per te? {#new-to-open-source} +## Sei nuovo nell'open-source? {#new-to-open-source} -Abbiamo una bassa barriera per l'inserimento di ticket sul nostro repository di GitHub specificamente progettato per gli sviluppatori nuovi all'open source, etichettata [good first ticket](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). +Abbiamo problemi con una bassa barriera all'ingresso sul nostro repository GitHub, progettati specificamente per gli sviluppatori che sono nuovi all'open-source, etichettati come [good first issue](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). -## Rivendica il tuo token di traguardo su catena (OAT) {#oat} +## Richiedi il tuo Onchain Achievement Token (OAT) {#oat} -Se il tuo contributo viene aggiunto a ethereum.org, avrai una possibilità di rivendicare un distintivo speciale su [Galxe](https://app.galxe.com/quest/ethereumorg). Un token di traguardo su catena (OAT) è la dimostrazione che tu abbia contribuito a rendere l'ecosistema un po' più fantastico. +Se il tuo contributo viene unito a ethereum.org, avrai la possibilità di richiedere un distintivo speciale su [Galxe](https://app.galxe.com/quest/ethereumorg). Un Onchain Achievement Token (OAT) è la prova che hai contribuito a rendere l'ecosistema un po' più fantastico. -[Maggiori informazioni sui OAT](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) +[Maggiori informazioni sugli OAT](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) -### Come reclamare -1. Unisciti al nostro [server Discord](https://discord.gg/ethereum-org). -2. Incolla un link ai tuoi contributi nel canale `#🥇 | proof-of-contribution`. -3. Attendi che un membro del nostro team ti invii un collegamento al tuo OAT. -4. Rivendica il tuo OAT! +### Come richiederlo -Dovresti utilizzare esclusivamente portafogli a custodia autonoma per rivendicare i OAT. Non utilizzare conti di scambio o di altro tipo per i quali non possiedi le chiavi private, poiché non ti consentiranno di accedere ai tuoi OAT e di gestirli. +1. Unisciti al nostro [server Discord](https://discord.gg/ethereum-org). +2. Incolla un link al tuo contributo nel canale `#🥇 | proof-of-contribution`. +3. Attendi che un membro del nostro team ti invii un link al tuo OAT. +4. Richiedi il tuo OAT! -## Rivendica il tuo GitPOAP {#claim-gitpoap} +Dovresti usare solo portafogli ad autocustodia per richiedere gli OAT. Non usare account di exchange o altri account di cui non possiedi le chiavi private, poiché questi non ti permetteranno di accedere e gestire i tuoi OAT. -Inoltre, GitPOAP riconoscerà automaticamente il tuo contributo inserito, consentendoti di coniare un POAP unico e separato per i collaboratori sulla sua stessa piattaforma! +## Richiedi il tuo GitPOAP {#claim-gitpoap} +GitPOAP riconoscerà automaticamente anche il tuo contributo unito e ti permetterà di coniare un POAP unico e separato per i collaboratori sulla loro stessa piattaforma! ### Come richiederlo {#how-to-claim} 1. Visita [GitPOAP](https://www.gitpoap.io). -2. Connettilo con il tuo portafoglio, o persino con la tua email tramite l'opzione d'accesso. -3. Cerca il tuo nome utente di GitHub, l'indirizzo ETH, i nomi ENS o qualsiasi GitPOAP per verificare se sei idoneo. -4. Se il tuo profilo di GitHub è idoneo, potrai coniare un GitPOAP! +2. Connettiti con il tuo portafoglio o anche con la tua email tramite l'opzione di accesso. +3. Cerca il tuo nome utente GitHub, indirizzo ETH, nomi ENS o qualsiasi GitPOAP per verificare se sei idoneo. +4. Se il tuo account GitHub è idoneo, sarai in grado di coniare un GitPOAP! -## Hanno contribuito {#contributors} +## Collaboratori {#contributors} - + \ No newline at end of file diff --git a/public/content/translations/it/contributing/quizzes/index.md b/public/content/translations/it/contributing/quizzes/index.md index bde0ca5df0e..ad33c518e0f 100644 --- a/public/content/translations/it/contributing/quizzes/index.md +++ b/public/content/translations/it/contributing/quizzes/index.md @@ -1,62 +1,62 @@ --- title: Aggiungere un quiz -description: La politica che usiamo per aggiungere i quiz su ethereum.org +description: La politica che utilizziamo per l'aggiunta di quiz su ethereum.org lang: it --- # Quiz {#quizzes} -I quiz sono opportunità per gli utenti per mettersi alla prova per vedere se hanno compreso i contenuti della pagina che hanno letto. Le domande devono basarsi solo sul contenuto fornito nella pagina e non devono chiedere informazioni che non sono menzionate nella pagina. +I quiz sono un'opportunità per gli utenti di mettersi alla prova per vedere se hanno compreso il contenuto della pagina che hanno appena letto. Le domande dovrebbero basarsi solo sul contenuto fornito nella pagina e non dovrebbero chiedere informazioni che non sono menzionate in essa. -Le domande sono strutturate come segue. Il prompt della domanda, 1 risposta corretta con una spiegazione del perché è corretta, 3 risposte sbagliate con la spiegazione del perché sono sbagliate. +Le domande sono strutturate come segue. Il testo della domanda, 1 risposta corretta con una spiegazione del perché è corretta, 3 risposte errate con una spiegazione del perché sono errate. -Alcuni esempi di quiz aggiornati possono essere trovati qui: +Alcuni esempi dei quiz attuali possono essere trovati qui: - [Livello 2](/layer-2) - [NFT](/nft/) - [Cos'è Ethereum?](/what-is-ethereum/) -- [Cos'è ETH?](/what-is-ether/) +- [Cos'è l'ETH?](/what-is-ether/) ## Aggiungere un quiz di apprendimento -Se c'è una pagina per la quale non è stato creato un quiz di apprendimento, [aprire un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) per questa pagina. +Se c'è una pagina per la quale non è ancora stato creato un quiz di apprendimento, ti preghiamo di [aprire una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) a riguardo. -Fornire le seguenti informazioni: +Ti preghiamo di fornire le seguenti informazioni: -- La pagina su cui si desidera aggiungere un quiz +- La pagina in cui desideri aggiungere un quiz - 5 domande con le seguenti informazioni: - La sezione della pagina su cui si basa la domanda - - Il prompt della domanda + - Il testo della domanda - 1 risposta corretta con una spiegazione del perché è corretta - - 3 risposte sbagliate, ognuna con una spiegazione per perché sono sbagliate + - 3 risposte errate, ciascuna con una spiegazione del perché è errata ## Aggiungere una domanda al quiz -Se c'è una domanda che si desidera aggiungere alla banca delle domande del quiz, [aprire un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e fornire le seguenti informazioni: +Se c'è una domanda che desideri aggiungere alla banca dati delle domande per un quiz, ti preghiamo di [aprire una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e fornire le seguenti informazioni: -- La pagina su cui si desidera aggiunge la domanda al quiz -- Per ogni domanda fornire le seguenti informazioni: +- La pagina in cui desideri aggiungere una domanda del quiz +- Per ogni domanda fornisci le seguenti informazioni: - La sezione della pagina su cui si basa la domanda - - Il prompt della domanda + - Il testo della domanda - 1 risposta corretta con una spiegazione del perché è corretta - - 3 risposte sbagliate, ognuna con una spiegazione per perché sono sbagliate + - 3 risposte errate, ciascuna con una spiegazione del perché è errata ## Aggiornare una domanda del quiz -Se c'è una domanda che si desidera aggiornare nella banca delle domande del quiz, [aprire un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e fornire le seguenti informazioni: +Se c'è una domanda che desideri aggiornare in una banca dati delle domande per un quiz, ti preghiamo di [aprire una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e fornire le seguenti informazioni: -- La pagina su cui si vuole aggiornare una domanda del quiz -- Per ogni domanda che deve essere aggiornata, fornire le seguenti informazioni: +- La pagina in cui desideri aggiornare una domanda del quiz +- Per ogni domanda in fase di aggiornamento, fornisci le seguenti informazioni: - La sezione della pagina su cui si basa la domanda - - Il prompt della domanda della domanda che si vuole aggiornare - - Il prompt della domanda aggiornato + - Il testo della domanda che desideri aggiornare + - Il testo della domanda aggiornato - 1 risposta corretta con una spiegazione del perché è corretta - - 3 risposte sbagliate, ognuna con una spiegazione per perché sono sbagliate + - 3 risposte errate, ciascuna con una spiegazione del perché è errata -## Rimuovere una domanda dal quiz +## Rimuovere una domanda del quiz -Se il contenuto di una domanda non esiste più nella pagina e questa deve essere rimossa, [aprire un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) per rimuovere la domanda e fornire le seguenti informazioni: +Se il contenuto non esiste più nella pagina per una determinata domanda e questa deve essere rimossa, ti preghiamo di [aprire una issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) per rimuovere la domanda e fornire le seguenti informazioni: -- La pagina su cui si vuole eliminare una domanda del quiz -- La domanda che si vuole cancellare -- La spiegazione, se necessaria, del perché la domanda dovrebbe essere rimossa +- La pagina in cui desideri eliminare una domanda del quiz +- La domanda che desideri eliminare +- Una spiegazione, se necessaria, del motivo per cui la domanda dovrebbe essere rimossa \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/faq/index.md b/public/content/translations/it/contributing/translation-program/faq/index.md index 32354de20c3..4f33227f597 100644 --- a/public/content/translations/it/contributing/translation-program/faq/index.md +++ b/public/content/translations/it/contributing/translation-program/faq/index.md @@ -1,119 +1,119 @@ --- -title: Domande frequenti (FAQ) del Programma di Traduzione +title: Domande frequenti (FAQ) sul Programma di Traduzione lang: it description: Domande frequenti sul Programma di Traduzione di ethereum.org --- # Guida alla traduzione di ethereum.org {#translating-ethereum-guide} -Se sei nuovo nel Programma di Traduzione e non vedi l'ora di prendervi parte, ecco alcune domande frequenti che possono aiutarti a cominciare. Usa questa guida per trovare le risposte alle domande più comuni. +Se sei nuovo nel Programma di Traduzione e sei esitante a buttarti, ecco alcune FAQ che possono aiutarti a iniziare. Usa questa guida per trovare le risposte alle domande più comuni. -## Posso ricevere un compenso per le traduzioni su ethereum.org? {#compensation} +## Posso essere retribuito per tradurre ethereum.org? {#compensation} Ethereum.org è un sito web open-source, il che significa che chiunque può partecipare e contribuire. -Il Programma di traduzione di ethereum.org è un'estensione di questo principio ed è organizzato con una filosofia simile. +Il Programma di Traduzione di ethereum.org ne è un'estensione ed è organizzato con una filosofia simile in mente. -L'obiettivo del Programma di traduzione è quello di rendere i contenuti di Ethereum accessibili a tutti, indipendentemente dalle lingue che parlano. Consente inoltre a qualsiasi persona bilingue di essere coinvolta nell'ecosistema Ethereum e contribuire in modo accessibile. +L'obiettivo del Programma di Traduzione è rendere i contenuti di Ethereum accessibili a tutti, indipendentemente dalle lingue che parlano. Consente inoltre a qualsiasi persona bilingue di farsi coinvolgere nell'ecosistema di Ethereum e contribuire in modo accessibile. -Per questo motivo, il Programma di traduzione è aperto e volontario, e la partecipazione non è soggetta a retribuzione. Se dovessimo compensare i traduttori per il numero di parole che traducono, potremmo invitare solo quelli con sufficiente esperienza di traduzione (traduttori professionisti) a partecipare al Programma di traduzione. Questo renderebbe il programma di traduzione esclusivo e ci impedirebbe di raggiungere gli obiettivi delineati, in particolare: permettere a tutti di partecipare ed essere coinvolti nell'ecosistema. +Per questo motivo, il Programma di Traduzione è aperto e volontario, e la partecipazione non è soggetta a retribuzione. Se dovessimo retribuire i traduttori per il numero di parole che traducono, potremmo invitare a unirsi al Programma di Traduzione solo coloro con sufficiente esperienza di traduzione (traduttori professionisti). Ciò renderebbe il Programma di Traduzione esclusivo e ci impedirebbe di raggiungere gli obiettivi delineati, in particolare: consentire a tutti di partecipare e farsi coinvolgere nell'ecosistema. -Facciamo ogni sforzo per permettere ai nostri collaboratori di avere successo nell'ecosistema Ethereum; abbiamo istituito numerosi incentivi non monetari, ad esempio: [l'offerta di POAP](/contributing/translation-program/acknowledgements/#poap) e un [certificato di traduttore](/contributing/translation-program/acknowledgements/#certificate), così come l'organizzazione delle [Classifiche di traduzione](/contributing/translation-program/acknowledgements/) e [l'inclusione di tutti i nostri traduttori nel sito](/contributing/translation-program/contributors/). +Facciamo ogni sforzo per consentire ai nostri collaboratori di avere successo nell'ecosistema di Ethereum; sono in atto molti incentivi non monetari come: [offrire POAP](/contributing/translation-program/acknowledgements/#poap) e un [certificato di traduttore](/contributing/translation-program/acknowledgements/#certificate), oltre a organizzare le [Classifiche di Traduzione](/contributing/translation-program/acknowledgements/) e [elencare tutti i nostri traduttori sul sito](/contributing/translation-program/contributors/). -## Come tradurre le stringhe con ``? {#tags} +## Come traduco le stringhe con i ``? {#tags} -Non tutte le stringhe sono scritte in forma di testo puro. Alcune stringhe sono composte da script misti, come i tag HTML (`<0>`, ``). Ciò è dovuto solitamente alla presenza di collegamenti ipertestuali o stili alternativi all'interno di una frase. +Non tutte le stringhe sono scritte in forma di puro testo. Ci sono alcune stringhe che consistono in script misti come i tag HTML (`<0>`, ``). Questo di solito serve per i collegamenti ipertestuali o per stili alternativi nel mezzo di una frase. -- Traduci il testo all'interno dei tag, ma non i tag stessi. Qualsiasi cosa racchiusa tra `<` e `>` non deve essere tradotta o rimossa. -- Per mantenere preservare l'integrità della stringa, si consiglia di fare clic sul pulsante "Copia sorgente" in basso a sinistra. Così facendo si copia la stringa originale e la si incolla nella casella di testo e si chiarisce dove sono i tag, evitando errori. +- Traduci il testo all'interno dei tag ma non i tag stessi. Qualsiasi cosa tra `<` e `>` non deve essere tradotta o rimossa. +- Per mantenere la stringa al sicuro, ti consigliamo di fare clic sul pulsante "Copy Source" (Copia sorgente) in basso a sinistra. Questo copierà la stringa originale e la incollerà nella casella di testo. Ciò ti consente di chiarire dove si trovano i tag e ti aiuta a evitare errori. -![Interfaccia Crowdin con il pulsante copia sorgente evidenziato](./html-tag-strings.png) +![Interfaccia di Crowdin con il pulsante copia sorgente evidenziato](./html-tag-strings.png) -È possibile spostare la posizione dei tag all'interno della stringa per renderla più naturale nella propria lingua, basta fare in modo di spostare l'intero tag. +Puoi spostare la posizione dei tag all'interno della stringa per renderla più naturale nella tua lingua: assicurati solo di spostare l'intero tag. -Per informazioni più approfondite sulla gestione di tag e frammenti di codice, consultare la [Guida di stile per la traduzione di ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). +Per informazioni più approfondite su come gestire i tag e i frammenti di codice, fai riferimento alla [Guida di stile per la traduzione di ethereum.org](/contributing/translation-program/translators-guide/#dealing-with-tags). -## Dove vanno a finire le stringhe? {#strings} +## Dove si trovano le stringhe? {#strings} -Spesso le stringhe di origine da sole potrebbero non essere sufficienti per fornire una traduzione accurata. +Spesso le sole stringhe di origine potrebbero non essere sufficienti per fornire una traduzione accurata. -- Dai un'occhiata a "screenshot" e "context" per maggiori informazioni. Nella sezione stringa sorgente, vedrai allegata l'immagine dello screenshot che mostra come viene utilizzata la stringa nel contesto. -- Se hai ancora dubbi, apri una segnalazione nella sezione dei commenti. [Non sai come inserire un commento?](#comment) +- Dai un'occhiata a "screenshots" (schermate) e "context" (contesto) per maggiori informazioni. Nella sezione della stringa di origine, vedrai l'immagine della schermata allegata che ti mostrerà come stiamo usando la stringa nel contesto. +- Se sei ancora insicuro, segnalalo nella "sezione commenti". [Non sai come lasciare un commento?](#comment) -![Indicazione di come è possibile fornire il contesto per una stringa con uno screenshot](./source-string.png) +![Mostra come il contesto può essere fornito per una stringa con una schermata](./source-string.png) -![Aggiunta di uno screenshot di esempio per il contesto](./source-string-2.png) +![Un esempio di schermata aggiunta per il contesto](./source-string-2.png) -## Come posso inserire commenti o porre domande? Vorrei segnalare un problema o errori di battitura... {#comment} +## Come posso lasciare commenti o fare domande? Vorrei segnalare un problema o degli errori di battitura... {#comment} -Se vuoi segnalare un problema su una particolare stringa che richiede attenzione, sentiti libero/a di inviare un commento. +Se vuoi segnalare una stringa particolare che richiede attenzione, sentiti libero di inviare un commento. -- Fai clic sul secondo pulsante della barra in alto a destra. La scheda nascosta apparirà sulla tua destra. Lascia un nuovo commento e fai clic sulla casella "Issue" in basso. È possibile specificare il tipo di problema scegliendo una delle opzioni dal menu a discesa. -- Una volta inviato, verrà segnalato al nostro team. Risolveremo il problema e ti faremo sapere rispondendo al tuo commento e chiudendo la segnalazione. -- Se segnalate una traduzione non corretta, la traduzione e l'alternativa suggerita saranno esaminati da un madrelingua durante la prossima recensione. +- Fai clic sul secondo pulsante della barra in alto a destra. La scheda nascosta apparirà alla tua destra. Lascia un nuovo commento e fai clic sulla casella di controllo "Issue" (Problema) in basso. Puoi specificare il tipo di problema scegliendo una delle opzioni dal menu a discesa. +- Una volta inviato, verrà segnalato al nostro team. Risolveremo il problema e te lo faremo sapere rispondendo al tuo commento e chiudendo il problema. +- Se segnali una traduzione errata, la traduzione e l'alternativa da te suggerita verranno esaminate da un madrelingua durante la revisione successiva. -![Indicazione di come inserire commenti e segnalare problemi](./comment-issue.png) +![Mostra come fare commenti e segnalare problemi](./comment-issue.png) -## Cos'è la Memoria di traduzione (TM)? {#translation-memory} +## Cos'è la Memoria di Traduzione (TM)? {#translation-memory} -La Memoria di traduzione (TM) è una funzionalità di Crowdin che memorizza tutte le stringhe precedentemente tradotte su [ethereum.org](https://ethereum.org/). Quando una stringa viene tradotta, viene automaticamente salvata nella TM del progetto. Può essere uno strumento utile per aiutarti a risparmiare tempo! +La Memoria di Traduzione (TM) è una funzionalità di Crowdin che memorizza tutte le stringhe precedentemente tradotte su ethereum.org. Quando una stringa viene tradotta, viene salvata automaticamente nella TM del nostro progetto. Questo potrebbe essere uno strumento utile per aiutarti a risparmiare tempo! -- Guarda la sezione "TM and MT Suggestions" per scoprire come altri traduttori hanno tradotto la stessa stringa o un contenuto simile. Se trovi un suggerimento con una percentuale di corrispondenza elevata, non esitare a sfruttare la traduzione esistente facendovi clic sopra. -- Se non c'è nulla nella lista, puoi cercare nella TM tra le traduzioni precedenti e riutilizzarle per coerenza. +- Guarda la sezione "TM and MT Suggestions" (Suggerimenti TM e MT) e vedrai come altri traduttori hanno tradotto la stessa stringa o una simile. Se trovi un suggerimento con un alto tasso di corrispondenza, sentiti libero di fare riferimento alla traduzione facendovi clic sopra. +- Se non c'è nulla nell'elenco, puoi cercare nella TM le traduzioni fatte in precedenza e riutilizzarle per coerenza. -![Uno screenshot della memoria di traduzione](./translation-memory.png) +![Una schermata della memoria di traduzione](./translation-memory.png) -## Come usare il glossario di Crowdin? {#glossary} +## Come uso il glossario di Crowdin? {#glossary} -La terminologia di Ethereum rappresenta un altro aspetto cruciale del nostro lavoro di traduzione, poiché spesso i nuovi termini tecnologici non sono ancora localizzati in molte lingue. Inoltre, ci sono termini che hanno significati diversi in contesti diversi. [Maggiori informazioni sulla traduzione della terminologia di Ethereum](#terminology) +La terminologia di Ethereum è un'altra parte cruciale del nostro lavoro di traduzione, poiché spesso i nuovi termini tecnici non saranno ancora localizzati in molte lingue. Inoltre, ci sono termini che hanno significati diversi in contesti diversi. [Maggiori informazioni sulla traduzione della terminologia di Ethereum](#terminology) -Il glossario Crowdin è la risorsa più adatta per chiarire termini e definizioni. Esistono due modi per consultare il glossario. +Il glossario di Crowdin è il posto migliore per chiarire termini e definizioni. Ci sono due modi per fare riferimento al glossario. -- Quando trovi un termine sottolineato nella stringa sorgente, puoi passarci il mouse sopra e visualizzare una breve definizione. +- Primo, quando trovi un termine sottolineato nella stringa di origine, puoi passarci sopra con il mouse e vederne una breve definizione. ![Un esempio di definizione del glossario](./glossary-definition.png) -- In alternativa, se vedi un termine che non è familiare ma non sottolineato, puoi cercare nella scheda del glossario (il terzo pulsante della colonna di destra). Troverai le spiegazioni dei termini specifici e di quelli frequentemente utilizzati nel progetto. +- Secondo, se vedi un termine che non ti è familiare ma non è sottolineato, puoi cercare nella scheda del glossario (il terzo pulsante della colonna di destra). Troverai spiegazioni di termini specifici e di quelli usati frequentemente nel progetto. -![Uno screenshot che mostra dove trovare la scheda del glossario in Crowdin](./glossary-tab.png) +![Una schermata che mostra dove trovare la scheda del glossario in Crowdin](./glossary-tab.png) -- Se ancora non riesci a trovarlo, è la tua occasione per aggiungere un nuovo termine! Ti invitiamo a cercarlo su un motore di ricerca e aggiungere la descrizione al glossario. Sarà di grande aiuto ad altri traduttori per comprendere meglio il termine. +- Se ancora non riesci a trovarlo, è la tua occasione per aggiungere un nuovo termine! Ti incoraggiamo a cercarlo su un motore di ricerca e ad aggiungere la descrizione al glossario. Sarà di grande aiuto per gli altri traduttori per comprendere meglio il termine. -![Uno screenshot che mostra come aggiungere un termine del glossario in Crowdin](./add-glossary-term.png) +![Una schermata che mostra come aggiungere un termine del glossario a Crowdin](./add-glossary-term.png) -### Politica sulla traduzione della terminologia {#terminology} +### Politica di traduzione della terminologia {#terminology} -_Per i nomi (marchi, aziende, persone) e i nuovi termini tecnologici (Beacon Chain, catene di frammenti, ecc.)_ +_Per nomi (marchi, aziende, persone) e nuovi termini tecnici (Beacon Chain, shard chain, ecc.)_ -Ethereum presenta molti termini nuovi, che sono stati coniati di recente. Può succedere che alcuni termini varino da un traduttore all'altro, in ragione dell'assenza di una traduzione ufficiale nella rispettiva lingua. Tali incongruenze possono causare malintesi e ridurre la leggibilità. +Ethereum presenta molti nuovi termini che sono stati coniati di recente. Alcuni termini varieranno da traduttore a traduttore poiché non esiste una traduzione ufficiale nella rispettiva lingua. Tali incongruenze possono causare incomprensioni e diminuire la leggibilità. -A causa della diversità linguistica e delle diverse standardizzazioni in ogni lingua, è stato quasi impossibile elaborare una politica di traduzione terminologica unificata che possa essere adattata a tutte le lingue supportate. +A causa della diversità linguistica e delle diverse standardizzazioni in ogni lingua, è stato quasi impossibile elaborare una politica di traduzione della terminologia unificata che possa essere adattata in tutte le lingue supportate. -Dopo un'attenta valutazione, abbiamo deciso di lasciare ai traduttori la libertà di optare per la terminologia più utilizzata. +Dopo un'attenta considerazione, abbiamo preso la decisione di lasciare la terminologia usata più di frequente a voi, i traduttori. -Ecco quello che suggeriamo quando trovi un termine che non ti è familiare: +Ecco cosa suggeriamo, quando trovi un termine che non ti è familiare: -- Consulta il [Glossario dei termini](#glossary), dove potresti scoprire come altri traduttori hanno tradotto un particolare termine in precedenza. Se pensi che il termine precedentemente tradotto non sia appropriato, sentiti libero di ripristinare la tua traduzione aggiungendo un nuovo termine al Glossario Crowdin. -- Se non esistono traduzioni precedenti nel glossario, ti invitiamo a cercarla su un motore di ricerca o un articolo di stampa che mostri come il termine viene effettivamente utilizzato nella tua comunità. -- Se non trovi alcun riferimento, sentiti libero di fidarti della tua intuizione e suggerisci una nuova traduzione nella tua lingua! -- Se invece non ti senti sicuro, lascia il termine non tradotto. A volte, i termini inglesi sono più che adeguati per fornire definizioni accurate. +- Fai riferimento al [Glossario dei termini](#glossary), potresti scoprire come altri traduttori lo hanno tradotto in precedenza. Se ritieni che il termine tradotto in precedenza non sia appropriato, sentiti libero di ripristinare la tua traduzione aggiungendo un nuovo termine al Glossario di Crowdin. +- Se tale traduzione precedente non esiste nel Glossario, ti incoraggiamo a cercarla su un motore di ricerca o in un articolo dei media che mostri come il termine viene effettivamente utilizzato nella tua comunità. +- Se non trovi alcun riferimento, sentiti libero di fidarti del tuo intuito e suggerire una nuova traduzione nella tua lingua! +- Se ti senti meno sicuro nel farlo, lascia il termine non tradotto. A volte, i termini inglesi sono più che adeguati per fornire definizioni accurate. -Ti consigliamo di non tradurre i nomi di marchi, aziende e personale poiché una traduzione potrebbe causare confusione inutile e difficoltà a livello di SEO. +Ti consigliamo di lasciare non tradotti i nomi di marchi, aziende e personale, poiché una traduzione potrebbe causare inutile confusione e difficoltà SEO. ## Come funziona il processo di revisione? {#review-process} -Per garantire un certo livello di qualità e coerenza nelle nostre traduzioni, lavoriamo con [Acolad](https://www.acolad.com/), uno dei più grandi fornitori di servizi linguistici a livello mondiale. Potendo contare su una rete di 20.000 linguisti professionisti, Acolad può fornire revisori professionisti per ogni lingua e tipo di contenuto di cui abbiamo bisogno. +Per garantire un certo livello di qualità e coerenza nelle nostre traduzioni, lavoriamo con [Acolad](https://www.acolad.com/), uno dei maggiori fornitori di servizi linguistici a livello globale. Acolad ha 20.000 linguisti professionisti, il che significa che possono fornire revisori professionisti per ogni lingua e tipo di contenuto di cui abbiamo bisogno. -Il processo di revisione è semplice; una volta che una certa [categoria di contenuti](/contributing/translation-program/) è stata tradotta al 100%, richiediamo una revisione. Il processo di revisione si svolge direttamente su Crowdin. Una volta completata la revisione, aggiorniamo il sito web con il contenuto tradotto. +Il processo di revisione è semplice; una volta che un insieme di contenuti è tradotto al 100%, ordiniamo una revisione per quel gruppo di contenuti. Il processo di revisione si svolge direttamente in Crowdin. Una volta completata la revisione, aggiorniamo il sito web con i contenuti tradotti. -## Come faccio ad aggiungere contenuti nella mia lingua? {#adding-foreign-language-content} +## Come aggiungo contenuti nella mia lingua? {#adding-foreign-language-content} -Attualmente, tutti i contenuti non in inglese sono tradotti direttamente dal contenuto originale in inglese, e qualsiasi contenuto non esistente in inglese non può essere aggiunto ad altre lingue. +Attualmente, tutti i contenuti non in inglese vengono tradotti direttamente dai contenuti di origine in inglese e qualsiasi contenuto che non esiste in inglese non può essere aggiunto in altre lingue. -Per consigliare nuovi contenuti per ethereum.org, puoi [creare un ticket](https://github.com/ethereum/ethereum-org-website/issues) su GitHub. Per essere inserito, il contenuto verrà redatto in inglese e tradotto in altre lingue utilizzando Crowdin. +Per suggerire nuovi contenuti per ethereum.org, puoi [creare una issue](https://github.com/ethereum/ethereum-org-website/issues) su GitHub. Se aggiunto, il contenuto sarà scritto in inglese e tradotto in altre lingue utilizzando Crowdin. -A breve prevediamo di aggiungere il supporto per l'inserimento di contenuti non in inglese. +Prevediamo di aggiungere il supporto per l'aggiunta di contenuti non in inglese nel prossimo futuro. -## Contattaci {#contact} +## Mettiti in contatto {#contact} -Grazie per aver letto tutte queste informazioni. Speriamo che ti aiutino a muovere i primi passi nel nostro programma. Sentiti libero di unirti al nostro [canale di traduzione di Discord](https://discord.gg/ethereum-org) per porre domande e collaborare con gli altri traduttori, o contattaci a translations@ethereum.org! +Grazie per aver letto tutto questo. Speriamo che questo ti aiuti a integrarti nel nostro programma. Sentiti libero di unirti al nostro [canale di traduzione su Discord](https://discord.gg/ethereum-org) per fare domande e collaborare con altri traduttori, o contattaci all'indirizzo translations@ethereum.org! \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/how-to-translate/index.md b/public/content/translations/it/contributing/translation-program/how-to-translate/index.md index 38a06783613..f3e92cc0686 100644 --- a/public/content/translations/it/contributing/translation-program/how-to-translate/index.md +++ b/public/content/translations/it/contributing/translation-program/how-to-translate/index.md @@ -1,14 +1,14 @@ --- title: Come tradurre lang: it -description: Istruzioni per l'uso di Crowdin per tradurre ethereum.org +description: Istruzioni per usare Crowdin per tradurre ethereum.org --- # Come tradurre {#how-to-translate} ## Guida visiva {#visual-guide} -Se preferisci un approccio più visivo, consulta la guida di Luka per l'impostazione di Crowdin. Altrimenti, puoi trovare gli stessi passaggi in formato scritto nella sezione successiva. +Per chi preferisce l'apprendimento visivo, guarda Luka che illustra come configurare Crowdin. In alternativa, puoi trovare gli stessi passaggi in formato scritto nella sezione successiva. @@ -16,7 +16,7 @@ Se preferisci un approccio più visivo, consulta la guida di Luka per l'impostaz ### Unisciti al nostro progetto su Crowdin {#join-project} -Dovrai accedere al tuo profilo di Crowdin o registrarti se non ne hai già uno. Per iscriversi bastano un account di posta elettronica e una password. +Dovrai accedere al tuo account Crowdin o registrarti se non ne hai già uno. Tutto ciò che serve per registrarsi è un account e-mail e una password. Unisciti al progetto @@ -24,69 +24,69 @@ Dovrai accedere al tuo profilo di Crowdin o registrarti se non ne hai già uno. ### Apri la tua lingua {#open-language} -Dopo aver effettuato l'accesso a Crowdin, vedrai una descrizione del progetto e l'elenco di tutte le lingue disponibili. Ogni lingua, inoltre, contiene le informazioni sulla quantità totale di parole traducibili e una panoramica di quanti contenuti sono stati tradotti e approvati in una lingua specifica. +Dopo aver effettuato l'accesso a Crowdin, vedrai una descrizione del progetto e un elenco di tutte le lingue disponibili. +Ogni lingua contiene anche informazioni sulla quantità totale di parole traducibili e una panoramica di quanti contenuti sono stati tradotti e approvati in una lingua specifica. -Apri la lingua verso cui desideri tradurre per visualizzare l'elenco dei file disponibili per la traduzione. +Apri la lingua in cui desideri tradurre per vedere l'elenco dei file disponibili per la traduzione. -![Elenco delle lingue in Crowdin](./list-of-languages.png) +![Elenco delle lingue su Crowdin](./list-of-languages.png) ### Trova un documento su cui lavorare {#find-document} -I contenuti del sito web sono divisi in una serie di documenti e contenitori. Puoi controllare lo stato di avanzamento di ciascun documento sul lato destro – se l'avanzamento della traduzione è inferiore al 100%, ti invitiamo a contribuire! +I contenuti del sito web sono divisi in una serie di documenti e gruppi di contenuti (content bucket). Puoi controllare i progressi di ogni documento sulla destra: se il progresso della traduzione è inferiore al 100%, contribuisci! -Non vedi la tua lingua nell'elenco? [Apri una segnalazione](https://github.com/ethereum/ethereum-org-website/issues/new/choose) o chiedi nel nostro [Discord](https://discord.gg/ethereum-org) +Non vedi la tua lingua nell'elenco? [Apri una issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose) o chiedi nel nostro [Discord](https://discord.gg/ethereum-org) ![File tradotti e non tradotti su Crowdin](./crowdin-files.png) -Una nota sulle categorie di contenuti: usiamo le "categorie di contenuti" in Crowdin per rilasciare per primi i contenuti con maggiore priorità. Quando controlli una lingua, ad esempio il [Filippino](https://crowdin.com/project/ethereum-org/fil#), vedrai le cartelle per categoria dei contenuti ("1. Pagina Iniziale", "2. Elementi essenziali", "3. Esplorazione", ecc.). +Una nota sui gruppi di contenuti: utilizziamo i "content bucket" all'interno di Crowdin per rilasciare prima i contenuti con la priorità più alta. Quando controlli una lingua, ad esempio il [Filippino](https://crowdin.com/project/ethereum-org/fil#), vedrai le cartelle per i gruppi di contenuti ("1. Homepage", "2. Essentials", "3. Exploring", ecc.). -Ti invitiamo a tradurre in questo ordine numerico (1 → 2 → 3 → ⋯) per garantire che le pagine ad impatto più alto siano tradotte prima. - -[Scopri di più sulle categorie di contenuti di ethereum.org](/contributing/translation-program/) +Ti incoraggiamo a tradurre in questo ordine numerico (1 → 2 → 3 → ⋯) per assicurarti che le pagine di maggiore impatto vengano tradotte per prime. ### Traduci {#translate} -Dopo aver selezionato il file che desideri tradurre, si aprirà nell'editor online. Se non hai mai usato Crowdin prima d'ora, puoi usare questa guida rapida per apprendere le basi. +Dopo aver selezionato il file che desideri tradurre, si aprirà nell'editor online. Se non hai mai usato Crowdin prima, puoi usare questa guida rapida per ripassare le basi. ![Editor online di Crowdin](./online-editor.png) **_1 – Barra laterale sinistra_** -- Non tradotto (rosso) - il testo che non è stato ancora tradotto. Si tratta delle stringhe che dovresti tradurre. -- Tradotto (verde) - il testo che è già stato tradotto, ma non ancora revisionato. Sei il benvenuto per suggerire traduzioni alternative o votare quelle esistenti usando i tasti "+" e "-" nell'editor. -- Approvato (spunta) - il testo che è già stato revisionato ed è attualmente mostrato sul sito web. +- Non tradotto (rosso) – testo su cui non si è ancora lavorato. Queste sono le stringhe che dovresti tradurre. +- Tradotto (verde) – testo che è già stato tradotto, ma non ancora revisionato. Sei invitato a suggerire traduzioni alternative o a votare quelle esistenti usando i pulsanti "+" e "-" nell'editor. +- Approvato (segno di spunta) – testo che è già stato revisionato ed è attualmente pubblicato sul sito web. -Puoi anche usare i pulsanti in cima per cercare stringhe specifiche, filtrarle per stato o cambiare la vista. +Puoi anche usare i pulsanti in alto per cercare stringhe specifiche, filtrarle per stato o cambiare la visualizzazione. **_2 – Area dell'editor_** -L'area di traduzione principale; il testo sorgente è mostrato in cima, con contesto aggiuntivo e screenshot, se disponibili. Per suggerire una nuova traduzione, inseriscila nel campo "Inserisci qui la traduzione" e clicca Salva. +L'area di traduzione principale: il testo di origine viene visualizzato in alto, con contesto aggiuntivo e screenshot, se disponibili. +Per suggerire una nuova traduzione, inserisci la tua traduzione nel campo "Inserisci qui la traduzione" (Enter translation here) e fai clic su Salva. -Puoi anche trovare le traduzioni esistenti della stringa e le traduzioni in altre lingue in questa sezione, nonché le corrispondenze della memoria di traduzione e i suggerimenti della traduzione automatica. +In questa sezione puoi anche trovare le traduzioni esistenti della stringa e le traduzioni in altre lingue, oltre alle corrispondenze della memoria di traduzione e ai suggerimenti di traduzione automatica. **_3 – Barra laterale destra_** -Qui puoi trovare i commenti, i suggerimenti della memoria di traduzione e le voci del glossario. La vista predefinita mostra i commenti e consente ai traduttori di comunicare, segnalare problemi o traduzioni errate. +Qui è dove puoi trovare commenti, voci della memoria di traduzione e voci del glossario. La visualizzazione predefinita mostra i commenti e consente ai traduttori di comunicare, sollevare problemi o segnalare traduzioni errate. -Usando i pulsanti in cima, puoi anche passare alla memoria di traduzione, dove puoi cercare le traduzioni esistenti, o al glossario, che contiene le descrizioni e le traduzioni standard dei termini chiave. +Usando i pulsanti in alto, puoi anche passare alla Memoria di Traduzione (Translation Memory), dove puoi cercare traduzioni esistenti, o al Glossario (Glossary), che contiene descrizioni e traduzioni standard dei termini chiave. -Vuoi scoprire di più? Sentiti libero di dare un'occhiata alla [documentazione sull'uso dell'editor online di Crowdin](https://support.crowdin.com/online-editor/) +Vuoi saperne di più? Sentiti libero di consultare la [documentazione sull'uso dell'editor online di Crowdin](https://support.crowdin.com/online-editor/) ### Processo di revisione {#review-process} -Una volta completata la traduzione (cioè, tutti i file per una categoria di contenuti mostrano il 100%), il nostro servizio di traduzione professionale revisionerà (ed eventualmente modificherà) i contenuti. Una volta completata la revisione (ovvero quando lo stato di avanzamento della revisione è al 100%), aggiungeremo il contenuto al sito web. +Una volta completata la traduzione (ovvero, tutti i file per un gruppo di contenuti mostrano il 100%), il nostro servizio di traduzione professionale revisionerà (e potenzialmente modificherà) i contenuti. Una volta completata la revisione (ovvero, il progresso della revisione è al 100%), li aggiungeremo al sito web. - Si prega di non utilizzare la traduzione automatica per tradurre il progetto. Tutte le traduzioni saranno revisionate prima di essere aggiunte al sito web. Se le traduzioni suggerite sono tradotte automaticamente, saranno rimosse e i collaboratori che utilizzano spesso la traduzione automatica saranno rimossi dal progetto. + Ti preghiamo di non utilizzare la traduzione automatica per tradurre il progetto. Tutte le traduzioni saranno revisionate prima di essere aggiunte al sito web. Se si scopre che le traduzioni suggerite sono state tradotte automaticamente, verranno scartate e i contributori che utilizzano spesso la traduzione automatica verranno rimossi dal progetto. -### Contattaci {#get-in-touch} +### Mettiti in contatto {#get-in-touch} -Hai delle domande? O desideri collaborare con il nostro team e altri traduttori? Ti invitiamo a pubblicare nel canale #translations del nostro [server Discord ethereum.org](https://discord.gg/ethereum-org) +Hai delle domande? O vuoi collaborare con il nostro team e altri traduttori? Pubblica un messaggio nel canale #translations del nostro [server Discord di ethereum.org](https://discord.gg/ethereum-org) Puoi anche contattarci all'indirizzo translations@ethereum.org -Grazie per la tua partecipazione al programma di traduzione di ethereum.org! +Grazie per la tua partecipazione al Programma di Traduzione di ethereum.org! \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/index.md b/public/content/translations/it/contributing/translation-program/index.md index 9368e432663..2dbb26991ae 100644 --- a/public/content/translations/it/contributing/translation-program/index.md +++ b/public/content/translations/it/contributing/translation-program/index.md @@ -1,90 +1,91 @@ --- title: Programma di traduzione lang: it -description: Informazioni riguardo il Programma di Traduzione di Ethereum +description: Informazioni sul Programma di traduzione di ethereum.org --- # Programma di traduzione {#translation-program} -Il Programma di Traduzione è uno sforzo collaborativo per tradurre ethereum.org in diverse lingue al fine di rendere il sito più accessibile a miliardi di persone che non parlano inglese in tutto il mondo. +Il Programma di traduzione è uno sforzo collaborativo per tradurre ethereum.org in diverse lingue, al fine di rendere il sito web più accessibile a miliardi di persone in tutto il mondo che non parlano inglese. ![](./enterprise-eth.png) ## Aiutaci a tradurre {#help-us-translate} -Il Programma di Traduzione di ethereum.org è aperto e tutti possono contribuire! +Il Programma di traduzione di ethereum.org è aperto e chiunque può contribuire! -1. Dovrai accedere al tuo profilo di Crowdin o iscriverti. -2. Seleziona la lingua in cui desideri contribuire. -3. Prima di iniziare, dai un'occhiata alla guida [Come tradurre](/contributing/translation-program/how-to-translate/) per imparare come usare Crowdin e alla [Guida di stile per la traduzione](/contributing/translation-program/translators-guide/) per consigli e migliori pratiche. +1. Dovrai accedere al tuo account Crowdin o registrarti. +2. Seleziona la lingua a cui desideri contribuire. +3. Prima di iniziare, consulta la guida [Come tradurre](/contributing/translation-program/how-to-translate/) per imparare a usare Crowdin e la [Guida di stile per la traduzione](/contributing/translation-program/translators-guide/) per suggerimenti e migliori pratiche. 4. Le traduzioni automatiche non saranno approvate. -5. Tutte le traduzioni sono revisionate prima di essere aggiunte al sito, quindi vi sarà un breve ritardo prima che le tue traduzioni siano visibili a tutti. +5. Tutte le traduzioni vengono revisionate prima di essere aggiunte al sito, quindi ci sarà un breve ritardo prima che le tue traduzioni siano pubblicate. -_Unisciti a [Discord di ethereum.org](https://discord.gg/ethereum-org) per collaborare alle traduzioni, fare domande, condividere feedback e idee, o unirsi a un gruppo di traduzione._ +_Unisciti al [Discord di ethereum.org](https://discord.gg/ethereum-org) per collaborare alle traduzioni, fare domande, condividere feedback e idee, o unirti a un gruppo di traduzione._ Inizia a tradurre -## Informazioni sul Programma di Traduzione {#about-us} +## Informazioni sul Programma di traduzione {#about-us} -La community di Ethereum mira a essere globale e inclusiva, ma gran parte dei suoi contenuti si rivolge solo a chi parla inglese, tralasciando i 6 miliardi di non anglofoni nel mondo. Affinché ethereum.org possa fungere da portale di accesso a Ethereum per la comunità mondiale, riteniamo che sia essenziale fornire a chi non parla inglese i contenuti nelle loro lingue native. +La comunità di [Ethereum](/) mira a essere globale e inclusiva, eppure gran parte dei suoi contenuti si rivolge solo a chi parla inglese, escludendo i 6 miliardi di persone nel mondo che non lo parlano. Affinché ethereum.org funga da portale per Ethereum per la comunità mondiale, riteniamo essenziale fornire a chi non parla inglese contenuti su Ethereum nella propria lingua madre. -Il programma di traduzione di ethereum.org mira a rendere Ethereum accessibile a tutti traducendo ethereum.org e altri contenuti Ethereum in quante più lingue possibile. +Il Programma di traduzione di ethereum.org mira a rendere Ethereum accessibile a tutti traducendo ethereum.org e altri contenuti di Ethereum nel maggior numero di lingue possibile. -Leggi di più sulla [missione e visione](/contributing/translation-program/mission-and-vision) del Programma di Traduzione di ethereum.org. +Scopri di più sulla [missione e visione](/contributing/translation-program/mission-and-vision) del Programma di traduzione di ethereum.org. ### I nostri progressi finora {#our-progress} - [**Oltre 6.900** traduttori](/contributing/translation-program/contributors/) -- **68** lingue sul sito +- **68** lingue attive sul sito - [**2,89 milioni** di parole tradotte nel 2024](/contributing/translation-program/acknowledgements/) ### Riconoscimenti {#acknowledgements} -Ethereum.org è tradotto da migliaia di membri della community, che rappresentano una parte essenziale del Programma di Traduzione. Vogliamo riconoscere i nostri traduttori e supportarli nei loro percorsi di carriera. Ecco alcuni dei riconoscimenti dei nostri traduttori: +Ethereum.org è tradotto da migliaia di membri della comunità, che rappresentano la parte fondamentale del Programma di traduzione. +Vogliamo riconoscere i nostri traduttori e supportarli nei loro percorsi professionali. Ecco alcuni dei riconoscimenti per i nostri traduttori: #### Certificato {#certificate} -Se hai collaborato al Programma di Traduzione e almeno 5.000 delle tue parole tradotte sono state approvate, sei idoneo per un certificato di traduttore di ethereum.org. [Maggiori informazioni sui certificati](/contributing/translation-program/acknowledgements/#certificate) +Se hai contribuito al Programma di traduzione e sono state approvate almeno 5.000 delle tue parole tradotte, hai diritto a un certificato di traduttore di ethereum.org. [Maggiori informazioni sui certificati](/contributing/translation-program/acknowledgements/#certificate) #### OAT {#oats} -I collaboratori del Programma di Traduzione sono idonei per diversi OAT (token di traguardo su catena) a seconda del loro numero di parole tradotte nel 2024. I OAT sono NFT che dimostrano il tuo contributo al Programma di Traduzione di ethereum.org. [Maggiori informazioni sui OAT](/contributing/translation-program/acknowledgements/#oats) +I collaboratori del Programma di traduzione hanno diritto a diversi OAT (token di risultato on-chain) in base al numero di parole tradotte nel 2024. Gli OAT sono NFT che dimostrano il tuo contributo al Programma di traduzione di ethereum.org. [Maggiori informazioni sugli OAT](/contributing/translation-program/acknowledgements/#oats) -#### Riconoscimenti dei traduttori {#translator-acknowledgements} +#### Riconoscimenti per i traduttori {#translator-acknowledgements} -Riconoscimenti pubblici dei nostri migliori traduttori utilizzando le [classifiche](/contributing/translation-program/acknowledgements/) e un [elenco di tutti i collaboratori al Programma di Traduzione](/contributing/translation-program/contributors/). +Riconoscimenti pubblici dei nostri migliori traduttori tramite [classifiche](/contributing/translation-program/acknowledgements/) e un [elenco di tutti i collaboratori del Programma di traduzione](/contributing/translation-program/contributors/). #### Ricompense {#rewards} -In passato, abbiamo premiato retroattivamente i nostri contributori più attivi con i biglietti per le conferenze Ethereum come [Devcon](https://devcon.org/en/) e [Devconnect](https://devconnect.org/), così come il merchandising esclusivo di ethereum.org. +In passato, abbiamo ricompensato retroattivamente i nostri collaboratori più attivi con biglietti per conferenze di Ethereum come [Devcon](https://devcon.org/en/) e [Devconnect](https://devconnect.org/), oltre a merchandising esclusivo di ethereum.org. -Pensiamo costantemente a modi nuovi e innovativi per premiare i nostri collaboratori, quindi restate sintonizzati! +Pensiamo costantemente a modi nuovi e innovativi per ricompensare i nostri collaboratori, quindi resta sintonizzato! ### Guide e risorse {#guides-and-resources} -Se stai contribuendo al programma di traduzione o stai pensando di partecipare, dovresti dare un'occhiata alle seguenti guide alla traduzione: +Se stai contribuendo al Programma di traduzione o stai pensando di partecipare, dovresti consultare le guide alla traduzione qui sotto: -- [Guida allo stile di traduzione](/contributing/translation-program/translators-guide/) _– istruzioni e suggerimenti per i traduttori di ethereum.org_ -- [FAQ sulle traduzioni](/contributing/translation-program/faq/) _– domande e risposte frequenti sul programma di traduzione di ethereum.org_ -- [Guida all'editor online di Crowdin](https://support.crowdin.com/online-editor/) _– una guida approfondita all'uso dell'editor online di Crowdin e di alcune funzionalità avanzate di Crowdin_ -- [Categorie di contenuti](/contributing/translation-program/) _– quali pagine sono incluse in ogni categoria di contenuti di ethereum.org_ +- [Guida di stile per la traduzione](/contributing/translation-program/translators-guide/) _– istruzioni e suggerimenti per i traduttori di ethereum.org_ +- [FAQ sulla traduzione](/contributing/translation-program/faq/) _– domande frequenti e risposte sul Programma di traduzione di ethereum.org_ +- [Guida all'editor online di Crowdin](https://support.crowdin.com/online-editor/) _– una guida approfondita all'uso dell'editor online di Crowdin e ad alcune delle sue funzionalità avanzate_ -Per altri utili strumenti di traduzione, le comunità di traduttori e i post del blog del programma di traduzione, visita la [pagina delle risorse](/contributing/translation-program/resources/). +Per altri utili strumenti di traduzione, comunità di traduttori e articoli del blog sul Programma di traduzione, visita la [pagina delle Risorse](/contributing/translation-program/resources/). ## Contattaci {#get-in-touch} -Hai domande? O desideri collaborare con il nostro team e altri traduttori? Ti preghiamo di pubblicare nel canale #translations del nostro [server Discord di ethereum.org](https://discord.gg/ethereum-org) +Hai delle domande? O vuoi collaborare con il nostro team e altri traduttori? Scrivi nel canale #translations del nostro [server Discord di ethereum.org](https://discord.gg/ethereum-org) Puoi anche contattarci all'indirizzo translations@ethereum.org -## Avviare il proprio programma di traduzione {#starting-a-translation-program} +## Avviare il tuo programma di traduzione {#starting-a-translation-program} -Ci impegniamo nella traduzione dei contenuti di Ethereum in quante più lingue possibile e nel rendere i contenuti istruttivi disponibili per tutti. In linea con la nostra attenzione alle traduzioni, vogliamo aiutare gli altri progetti di Ethereum a organizzare, gestire e migliorare i propri sforzi relativi alle traduzioni. +Ci dedichiamo a tradurre i contenuti di Ethereum nel maggior numero di lingue possibile e a rendere i contenuti educativi disponibili a tutti. +In linea con la nostra attenzione alle traduzioni, vogliamo aiutare altri progetti di Ethereum a organizzare, gestire e migliorare i propri sforzi di traduzione. -Per questo motivo abbiamo creato un [manuale del programma di traduzione](/contributing/translation-program/playbook/) contenente alcuni consigli e buone pratiche scelte nel processo di traduzione di ethereum.org. +Per questo motivo, abbiamo creato un [Manuale del Programma di traduzione](/contributing/translation-program/playbook/) che contiene alcuni suggerimenti e migliori pratiche che abbiamo appreso nel processo di traduzione di ethereum.org. -Desideri collaborare ulteriormente o usare alcune delle nostre risorse di traduzione? Hai qualche commento sul manuale? Vorremmo sentire il tuo parere su translations@ethereum.org. +Vuoi collaborare ulteriormente o utilizzare alcune delle nostre risorse di traduzione? Hai dei feedback sul manuale? Ci piacerebbe sentirti all'indirizzo translations@ethereum.org. \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/mission-and-vision/index.md b/public/content/translations/it/contributing/translation-program/mission-and-vision/index.md index 177d8005cb7..74eaa74a234 100644 --- a/public/content/translations/it/contributing/translation-program/mission-and-vision/index.md +++ b/public/content/translations/it/contributing/translation-program/mission-and-vision/index.md @@ -1,25 +1,25 @@ --- title: Missione e visione lang: it -description: La missione e la visione del programma di traduzione di ethereum.org +description: La missione e la visione del Programma di Traduzione di ethereum.org --- # Missione e visione {#mission-and-vision} -La community di Ethereum mira a essere globale e inclusiva, ma gran parte dei suoi contenuti si rivolge solo a chi parla inglese, tralasciando i 6 miliardi di non anglofoni nel mondo. Affinché ethereum.org possa fungere da portale di accesso a Ethereum per la comunità mondiale, riteniamo che sia essenziale fornire a chi non parla inglese i contenuti nelle loro lingue native. +La comunità di Ethereum mira a essere globale e inclusiva, eppure gran parte dei suoi contenuti si rivolge solo a chi parla inglese, escludendo i 6 miliardi di persone nel mondo che non parlano inglese. Affinché ethereum.org funga da portale per Ethereum per la comunità mondiale, riteniamo che sia essenziale fornire ai non anglofoni contenuti su Ethereum nelle loro lingue madri. -Il programma di traduzione di ethereum.org mira a rendere Ethereum accessibile a tutti traducendo ethereum.org e altri contenuti Ethereum in quante più lingue possibile. +Il Programma di Traduzione di ethereum.org mira a rendere Ethereum accessibile a tutti traducendo ethereum.org e altri contenuti di Ethereum nel maggior numero di lingue possibile. ## La nostra missione {#our-mission} -- Fornire versioni tradotte del sito per consentire ai visitatori di tutto il mondo di conoscere Ethereum nella loro lingua madre -- Facilitare l'adesione di più membri nella comunità globale di Ethereum -- Consentire una condivisione più accessibile e inclusiva delle informazioni e delle conoscenze di Ethereum -- Mettere i membri della comunità nelle condizioni di poter contribuire alle traduzioni di Ethereum e lasciare il loro segno sull'ecosistema -- Identificare, connettersi e fornire indicazioni ai collaboratori appassionati che desiderano essere coinvolti nell'ecosistema +- Fornire versioni tradotte del sito web per consentire ai visitatori di tutto il mondo di conoscere Ethereum nella loro lingua madre +- Facilitare l'inserimento di nuovi membri nella comunità globale di Ethereum +- Consentire una condivisione più accessibile e inclusiva delle informazioni e delle conoscenze su Ethereum +- Consentire ai membri della comunità di contribuire alle traduzioni per Ethereum e lasciare il segno nell'ecosistema +- Identificare, connettersi e fornire una guida ai collaboratori appassionati che desiderano essere coinvolti nell'ecosistema ## La nostra visione {#our-vision} -- Tradurre contenuti essenziali per i membri della comunità Ethereum da quanti più paesi e parti del mondo possibile -- Sostenere la condivisione delle conoscenze tra le lingue per creare una comunità di Ethereum meglio informata ed istruita -- Aumentare l'inclusività e l'accessibilità di Ethereum rimuovendo le barriere linguistiche che impediscono ai non anglofoni di unirsi all'ecosistema +- Tradurre i contenuti essenziali per i membri della comunità di Ethereum dal maggior numero possibile di paesi e parti del mondo +- Supportare la condivisione delle conoscenze tra le lingue per creare una comunità di Ethereum meglio informata e istruita +- Aumentare l'inclusività e l'accessibilità di Ethereum rimuovendo le barriere linguistiche che impediscono a chi non parla inglese di unirsi all'ecosistema \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/playbook/index.md b/public/content/translations/it/contributing/translation-program/playbook/index.md new file mode 100644 index 00000000000..3e70675ed63 --- /dev/null +++ b/public/content/translations/it/contributing/translation-program/playbook/index.md @@ -0,0 +1,317 @@ +--- +title: Manuale del programma di traduzione +lang: it +description: Una raccolta di suggerimenti e considerazioni importanti per l'impostazione di un programma di traduzione +--- + +# Manuale del programma di traduzione {#translation-program-playbook} + +L'inglese è una delle lingue più parlate al mondo ed è di gran lunga la lingua più studiata a livello globale. Poiché l'inglese è la lingua più comune utilizzata su Internet, specialmente sui social media, e i linguaggi di programmazione multilingue sono scarsi, la maggior parte dei contenuti nello spazio della blockchain è scritta nativamente in inglese. + +Tuttavia, poiché oltre 6 miliardi di persone al mondo (più del 75% della popolazione) non parlano affatto inglese, ciò rappresenta un'enorme barriera all'ingresso in Ethereum per la stragrande maggioranza della popolazione mondiale. + +Per questo motivo, un numero crescente di progetti nel settore sta cercando di far tradurre i propri contenuti in diverse lingue e localizzarli per le comunità globali. + +Fornire contenuti multilingue è un modo semplice ed efficace per far crescere la propria comunità globale, offrire formazione a chi non parla inglese, assicurarsi che i propri contenuti e le proprie comunicazioni raggiungano un pubblico più ampio e far avvicinare più persone al settore. + +Questa guida mira ad affrontare le sfide e le idee sbagliate comuni sulla localizzazione dei contenuti. Fornisce una guida passo passo alla gestione dei contenuti, al processo di traduzione e revisione, alla garanzia della qualità, al coinvolgimento dei traduttori e ad altri aspetti vitali del processo di localizzazione. + +## Gestione dei contenuti {#content-management} + +La gestione dei contenuti di traduzione si riferisce al processo di automazione del flusso di lavoro di traduzione, che elimina la necessità di lavori manuali ripetitivi, migliora l'efficienza e la qualità, consente un controllo migliore e facilita la collaborazione. + +Esistono molti approcci diversi alla gestione dei contenuti nel processo di localizzazione, a seconda dei contenuti e delle proprie esigenze. + +Il modo fondamentale per gestire i contenuti è creare file bilingue, contenenti il testo di origine e quello di destinazione. Questo metodo è usato raramente nella traduzione, poiché non offre vantaggi significativi, a parte la semplicità. + +Le agenzie di traduzione di solito affrontano la gestione delle traduzioni utilizzando software di gestione delle traduzioni o strumenti di localizzazione, che forniscono capacità di gestione dei progetti e consentono un controllo molto maggiore su file, contenuti e linguisti. + +Scopri di più sulla gestione dei contenuti: + +[Trados su cos'è la gestione delle traduzioni](https://www.trados.com/solutions/translation-management/) + +[Phrase sulla gestione dei contenuti multilingue](https://phrase.com/blog/posts/multilingual-content-management/) + +### Software di gestione delle traduzioni {#translation-management-software} + +Esistono molti sistemi di gestione delle traduzioni e strumenti di localizzazione, e la scelta del software dipende principalmente dalle proprie esigenze. + +Sebbene alcuni progetti decidano di non utilizzare sistemi di gestione delle traduzioni e preferiscano gestire le traduzioni manualmente, direttamente in file bilingue o su servizi di hosting come GitHub, ciò riduce drasticamente il controllo, la produttività, la qualità, la scalabilità e le capacità di collaborazione. Un approccio del genere potrebbe essere più vantaggioso per progetti di traduzione su piccola scala o una tantum. + +Una rapida occhiata ad alcuni degli strumenti di gestione delle traduzioni più potenti e ampiamente utilizzati: + +**I migliori per il crowdsourcing e la collaborazione** + +[Crowdin](https://crowdin.com/) + +- Gratuito per i progetti open-source (numero illimitato di stringhe e progetti) +- TM (Memoria di Traduzione) e glossario disponibili con tutti i piani +- Oltre 60 formati di file supportati, oltre 70 integrazioni API + +[Lokalise](https://lokalise.com/) + +- Gratuito per 2 membri del team, piani a pagamento per più collaboratori (numero limitato di stringhe per la maggior parte dei piani) +- TM e glossario disponibili con alcuni piani a pagamento +- Oltre 30 formati di file supportati, oltre 40 integrazioni API + +[Transifex](https://www.transifex.com/) + +- Solo piani a pagamento (numero limitato di stringhe per la maggior parte dei piani) +- TM e glossario disponibili con tutti i piani a pagamento +- Oltre 30 formati di file supportati, oltre 20 integrazioni API + +[Phrase](https://phrase.com/) + +- Solo piani a pagamento (numero illimitato di stringhe per tutti i piani, numero limitato di progetti e membri del team) +- TM e glossario disponibili con alcuni piani a pagamento +- Oltre 40 formati di file supportati, oltre 20 integrazioni API + +[Smartcat](https://www.smartcat.com/) + +- Piano base gratuito con funzionalità avanzate a pagamento (numero illimitato di stringhe e progetti per tutti i piani) +- TM e glossario disponibili con tutti i piani +- Oltre 60 formati di file supportati, oltre 20 integrazioni API + +[POEditor](https://poeditor.com/) + +- Gratuito per i progetti open-source (numero limitato di stringhe per tutti i progetti, illimitato per i progetti open-source) +- TM e glossario disponibili per i piani a pagamento +- Oltre 20 formati di file supportati, oltre 10 integrazioni API + +e molti altri... + +**Strumenti di traduzione professionali** + +[SDL Trados Studio](https://www.trados.com/products/trados-studio/) + +- Piani a pagamento per traduttori freelance e team +- Strumento di traduzione assistita dal computer (CAT) e software di produttività per traduttori molto potente + +[MemoQ](https://www.memoq.com/) + +- Versione gratuita limitata disponibile con diversi piani a pagamento per funzionalità avanzate +- Software di gestione delle traduzioni per aziende, fornitori di servizi linguistici e traduttori + +[Memsource](https://www.memsource.com/) + +- Gratuito per traduttori individuali con diversi piani a pagamento per i team +- Sistema di traduzione assistita dal computer e di gestione delle traduzioni basato su cloud + +e molti altri... + +Scopri di più sui software di gestione delle traduzioni: + +[Definizione di Wikipedia dei sistemi di gestione delle traduzioni](https://en.wikipedia.org/wiki/Translation_management_system) + +[Phrase su 7 cose che ogni software di gestione delle traduzioni dovrebbe avere](https://phrase.com/blog/posts/7-things-every-translation-management-software-should-have/) + +[MemoQ su cos'è un sistema di gestione delle traduzioni](https://www.memoq.com/tools/what-is-a-translation-management-system) + +[L'elenco di Gengo dei 16 migliori sistemi di gestione delle traduzioni](https://gengo.com/translator-product-updates/16-best-translation-management-systems/) + +## Flusso di lavoro {#workflow} + +Nello spazio della traduzione, il flusso di lavoro di traduzione può significare un paio di cose diverse, entrambe in qualche modo correlate, e considerazioni importanti per il tuo progetto. + +Le esploreremo entrambe di seguito. + +**Significato 1** + +Questo è probabilmente il modo più comune di pensare ai flussi di lavoro di traduzione e qualcosa che di solito viene in mente quando si sente la parola flusso di lavoro. + +Nella sua essenza, è il "flusso di lavoro" dall'iniziare a pensare alle traduzioni fino all'utilizzo dei contenuti tradotti nel proprio prodotto. + +Un esempio di flusso di lavoro in questo caso sarebbe: + +1. **Preparazione dei file per la traduzione** – Sembra semplice; tuttavia, è necessario considerare un paio di cose importanti. In questa fase, dovresti avere un piano chiaro su come dovrebbe funzionare l'intero processo. + +- _Quali tipi di file utilizzerai? In quale formato desideri ricevere i tuoi file tradotti?_ + - Se i tuoi contenuti sono disponibili in formato DOCX o MD, l'approccio sarà molto più semplice rispetto alla traduzione di una versione PDF del tuo Whitepaper o di altri documenti. +- _Quali strumenti di localizzazione supportano questo tipo di file? Il file può essere tradotto in modo da mantenere la formattazione originale?_ + - Non tutti i tipi di file supportano la localizzazione diretta (ad es. file PDF, file immagine) e non tutti gli strumenti di localizzazione supportano tutti i tipi di file. +- _Chi tradurrà i contenuti? Ordinerai traduzioni professionali o ti affiderai a volontari?_ + - Questo influisce su una serie di altre decisioni che devi prendere. Ad esempio, i traduttori professionisti si trovano più a loro agio a lavorare con strumenti di localizzazione avanzati rispetto ai volontari. +- _Quali sono le tue aspettative per i linguisti? Se utilizzi un fornitore di servizi linguistici, cosa si aspetta da te?_ + - Questo è il passaggio per assicurarti che i tuoi obiettivi, le tue aspettative e le tue tempistiche siano allineati. +- _Tutti i contenuti da tradurre sono ugualmente importanti? Alcuni contenuti dovrebbero essere tradotti prima?_ + - Ci sono alcuni modi per dare priorità a determinati contenuti, che dovrebbero essere tradotti e implementati per primi. Ad esempio, se hai molti contenuti da tradurre, puoi utilizzare il controllo della versione per assicurarti che i traduttori sappiano a quali dare la priorità. + +2. **Condivisione dei file per la traduzione** – Anche questo passaggio richiede una riflessione a lungo termine e non è semplice come inviare i file di origine a un fornitore di servizi linguistici. + +- _Chi tradurrà i contenuti? Quante persone saranno coinvolte in questo processo?_ + - Se prevedi di utilizzare uno strumento di localizzazione, questo passaggio è semplificato poiché puoi caricare i file di origine direttamente nello strumento. Questo vale anche se il processo di traduzione avviene sul servizio di hosting, poiché i file di origine non devono essere esportati da nessuna parte. +- _I file di origine verranno gestiti manualmente o questo processo può essere automatizzato?_ + - La maggior parte degli strumenti di localizzazione consente un qualche tipo di integrazione o automazione del processo di gestione dei file. D'altra parte, se lavori con singoli traduttori e non utilizzi uno strumento di localizzazione, l'invio manuale dei file di origine a centinaia o migliaia di traduttori non è un processo scalabile. +- _Quali strumenti verranno utilizzati per la localizzazione?_ + - La risposta a questa domanda determinerà come affronterai tutto il resto. La selezione dello strumento appropriato può aiutarti ad automatizzare la gestione dei contenuti, la gestione della Memoria di Traduzione e del Glossario, la gestione dei traduttori, il monitoraggio dei progressi di traduzione/revisione, ecc., quindi prenditi del tempo e fai qualche ricerca su quale strumento desideri utilizzare. Se non prevedi di utilizzare uno strumento di localizzazione, tutto quanto sopra dovrà essere fatto manualmente. +- _Quanto tempo richiederà il processo di traduzione? Quanto costerà?_ + - A questo punto, dovresti essere pronto a condividere i file di origine con il fornitore di servizi linguistici o con il gruppo di traduttori. Il fornitore di servizi linguistici può aiutarti ad analizzare il conteggio delle parole e fornire un preventivo, incluse le tariffe e le tempistiche per il processo di traduzione. +- _Prevedi di apportare modifiche/aggiornare i contenuti di origine durante questo processo?_ + - Se i tuoi contenuti sono dinamici e cambiano spesso, qualsiasi modifica o aggiornamento può interrompere i progressi della traduzione. L'utilizzo di una Memoria di Traduzione può aiutare a mitigare questo problema in modo significativo, sebbene sia comunque importante pensare a come funzionerà il processo e a come evitare di ritardare i progressi che i traduttori stanno facendo. + +3. **Gestione del processo di traduzione** – Il tuo lavoro non è finito una volta che i contenuti di origine vengono consegnati al fornitore di servizi linguistici o ai traduttori. Per garantire una qualità ottimale delle traduzioni, i creatori di contenuti dovrebbero essere il più coinvolti possibile nel processo di traduzione. + +- _Come prevedi di comunicare con i traduttori?_ + - Se prevedi di utilizzare uno strumento di localizzazione, la comunicazione può avvenire direttamente nello strumento. Si consiglia inoltre di impostare un canale di comunicazione alternativo con i traduttori, poiché potrebbero essere meno esitanti a contattarti e gli strumenti di messaggistica consentono una comunicazione più fluida. +- _Come gestire le domande dei traduttori? Chi dovrebbe rispondere a queste domande?_ + - I traduttori (sia professionisti che non professionisti) spesso si metteranno in contatto con domande e richieste di chiarimenti o contesto aggiuntivo, nonché feedback e idee per miglioramenti. Rispondere a queste richieste può spesso portare a un migliore coinvolgimento e a una maggiore qualità dei contenuti tradotti. È anche utile fornire loro quante più risorse possibili (ad es. guide, suggerimenti, linee guida terminologiche, FAQ, ecc.). +- _Come gestire il processo di revisione? Vuoi esternalizzarlo o hai la capacità di eseguire le revisioni internamente?_ + - Sebbene non siano sempre necessarie, le revisioni sono parte integrante di un processo di traduzione ottimale. Di solito, è più semplice esternalizzare il processo di revisione a revisori professionisti. Tuttavia, se hai un grande team internazionale, le revisioni o la QA possono essere gestite anche internamente. + +4. **Implementazione dei contenuti tradotti** – L'ultima parte del flusso di lavoro, sebbene sia comunque importante da considerare in anticipo. + +- _Tutte le traduzioni verranno completate contemporaneamente?_ + - In caso contrario, dovresti pensare a quali traduzioni dovrebbero avere la priorità, a come tenere traccia delle traduzioni in corso e a come viene gestita l'implementazione mentre le traduzioni vengono eseguite. +- _Come ti verranno consegnati i contenuti tradotti? In quale formato saranno?_ + - Questa è una considerazione importante, indipendentemente dall'approccio utilizzato. Gli strumenti di localizzazione consentono di mantenere il controllo sul formato del file di destinazione e sul processo di esportazione e di solito supportano l'automazione, ad esempio abilitando l'integrazione con il servizio di hosting. +- _Come implementerai le traduzioni nel tuo progetto?_ + - In alcuni casi, questo potrebbe essere semplice come caricare il file tradotto o aggiungerlo ai tuoi documenti. Tuttavia, con progetti più complessi, come le traduzioni di siti web o app, dovresti assicurarti che il codice supporti l'internazionalizzazione e stabilire in anticipo come verrà gestito il processo di implementazione. +- _Cosa succede se la formattazione è diversa da quella di origine?_ + - Similmente a quanto sopra, se stai traducendo semplici file di testo, la formattazione probabilmente non è di fondamentale importanza. Tuttavia, con file più complessi, come i contenuti per un sito web o un'applicazione, la formattazione e il codice devono essere identici all'origine per poter essere implementati nel tuo progetto. In caso contrario, i file di destinazione dovranno essere modificati, dai traduttori o dai tuoi sviluppatori. + +**Significato 2** + +Un flusso di lavoro di traduzione alternativo, che non tiene conto delle decisioni e degli approcci interni. La considerazione principale qui è il flusso dei contenuti stessi. + +Un esempio di flusso di lavoro in questo caso sarebbe: + +1. _Traduzione → Implementazione_ + +- Il flusso di lavoro più semplice, in cui la traduzione sarà probabilmente una traduzione umana, poiché non esiste alcun processo di revisione o QA per valutare la qualità e modificare le traduzioni prima dell'implementazione. +- Con questo flusso di lavoro, è importante che i traduttori possano mantenere un certo livello di qualità, il che richiederà risorse adeguate e comunicazione tra i project manager e i traduttori. + +2. _Traduzione → Revisione → Implementazione_ + +- Un flusso di lavoro più avanzato, che include un processo di revisione e modifica, per garantire che la qualità delle traduzioni sia accettabile e coerente. +- Esistono diversi approcci a questo flusso di lavoro, in cui le traduzioni potrebbero essere eseguite da traduttori professionisti o volontari, mentre il processo di revisione sarà probabilmente gestito da revisori professionisti, che hanno familiarità con tutte le regole grammaticali e ortografiche che devono essere osservate nella lingua di destinazione. + +3. _Traduzione → Revisione → QA → Implementazione_ + +- Il flusso di lavoro ottimale per garantire il massimo livello di qualità. Sebbene la QA non sia sempre necessaria, potrebbe essere utile per darti un'idea migliore della qualità del testo tradotto dopo la traduzione e la revisione. +- Con questo flusso di lavoro, le traduzioni potrebbero essere eseguite esclusivamente da volontari o persino tramite traduzione automatica. Il processo di revisione dovrebbe essere eseguito da traduttori professionisti, mentre la QA può essere eseguita da un fornitore di servizi linguistici o internamente, se hai dipendenti madrelingua delle lingue di destinazione. + +Scopri di più sui flussi di lavoro di traduzione: + +[Content rules sulle cinque fasi del flusso di lavoro di traduzione](https://contentrules.com/creating-translation-workflow/) + +[Smartling su cos'è la gestione del flusso di lavoro di traduzione](https://www.smartling.com/resources/101/what-is-translation-workflow-management/) + +[RixTrans sul flusso di lavoro di traduzione](https://www.rixtrans.com/translation-workflow) + +## Gestione della terminologia {#terminology-management} + +Stabilire un piano chiaro su come gestire la terminologia è uno dei passaggi più importanti per garantire la qualità e la coerenza delle tue traduzioni e far risparmiare tempo ai tuoi traduttori. + +Nello spazio della traduzione, questo è noto come gestione della terminologia ed è uno dei servizi chiave che i fornitori di servizi linguistici offrono ai propri clienti, oltre all'accesso al loro gruppo di linguisti e alla gestione dei contenuti. + +La gestione della terminologia si riferisce al processo di identificazione, raccolta e gestione della terminologia che è importante per il tuo progetto e che dovrebbe sempre essere tradotta in modo corretto e coerente. + +Ci sono un paio di passaggi da seguire quando si inizia a pensare alla gestione della terminologia: + +- Identificare i termini chiave che dovrebbero essere inclusi nel database terminologico. +- Creare un glossario dei termini e delle loro definizioni. +- Tradurre i termini e aggiungerli al glossario. +- Controllare e approvare le traduzioni. +- Mantenere il glossario e aggiornarlo con nuovi termini, man mano che diventano importanti. + +Scopri di più sulla gestione della terminologia: + +[Trados su cos'è la gestione della terminologia](https://www.trados.com/solutions/terminology-management/translation-101-what-is-terminology-management.html) + +[Language Scientific sul perché la gestione della terminologia è importante](https://www.languagescientific.com/terminology-management-why-it-matters/#:~:text=Terminology%20management%20is%20the%20process,are%20related%20to%20each%20other.) + +[Clear Words Translation su cos'è la gestione della terminologia e perché è importante](http://clearwordstranslations.com/language/en/what-is-terminology-management/) + +### Memoria di Traduzione e Glossario {#tm-and-glossary} + +La Memoria di Traduzione e il Glossario sono strumenti importanti nel settore delle traduzioni e qualcosa su cui fa affidamento la maggior parte dei fornitori di servizi linguistici. + +Diamo un'occhiata a cosa significano questi termini e in che modo differiscono l'uno dall'altro: + +**Memoria di traduzione (TM)** – Un database che archivia automaticamente segmenti o stringhe, inclusi blocchi di testo più lunghi, frasi complete, paragrafi e singoli termini, nonché le loro traduzioni attuali e precedenti in ogni lingua. + +La maggior parte degli strumenti di localizzazione, dei sistemi di gestione delle traduzioni e degli strumenti di traduzione assistita dal computer dispone di memorie di traduzione integrate, che di solito possono essere esportate e utilizzate anche in altri strumenti simili. + +I vantaggi dell'utilizzo di una memoria di traduzione includono traduzioni più rapide, una migliore qualità della traduzione, la capacità di conservare determinate traduzioni durante l'aggiornamento o la modifica dei contenuti di origine e costi di traduzione inferiori per i contenuti ripetitivi. + +Le memorie di traduzione funzionano in base a una corrispondenza percentuale tra segmenti diversi e di solito sono più utili quando due segmenti contengono oltre il 50% degli stessi contenuti. Vengono anche utilizzate per tradurre automaticamente segmenti ripetitivi, che corrispondono al 100%, eliminando così la necessità di tradurre i contenuti ripetitivi più di una volta. + +Scopri di più sulle memorie di traduzione: + +[Memsource sulle memorie di traduzione](https://www.memsource.com/translation-memory/) + +[Smartling su cos'è una memoria di traduzione](https://www.smartling.com/resources/101/what-is-translation-memory/) + +**Glossario –** Un elenco di termini importanti o sensibili, le loro definizioni, funzioni e traduzioni stabilite. La differenza principale tra un glossario e una memoria di traduzione è che un glossario non viene creato automaticamente e che non contiene traduzioni di frasi complete. + +La maggior parte degli strumenti di localizzazione, dei sistemi di gestione delle traduzioni e degli strumenti di traduzione assistita dal computer dispone di glossari integrati che puoi mantenere per assicurarti che contengano la terminologia importante per il tuo progetto. Come la TM, il glossario di solito può essere esportato e utilizzato in altri strumenti di localizzazione. + +Prima di iniziare il tuo progetto di traduzione, si consiglia vivamente di dedicare un po' di tempo alla creazione di un glossario per i tuoi traduttori e revisori. L'utilizzo di un glossario garantisce che i termini importanti vengano tradotti correttamente, fornisce ai traduttori il contesto tanto necessario e garantisce la coerenza nelle traduzioni. + +Sebbene i glossari contengano più spesso traduzioni stabilite nelle lingue di destinazione, sono utili anche senza di esse. Anche senza traduzioni stabilite, un glossario può contenere definizioni di termini tecnici, evidenziare termini che non dovrebbero essere tradotti e informare i traduttori se un termine specifico viene utilizzato come sostantivo, verbo, nome proprio o qualsiasi altra parte del discorso. + +Scopri di più sui glossari: + +[Lionbridge su cos'è un glossario di traduzione](http://info.lionbridge.com/rs/lionbridge/images/Lionbridge%20FAQ_Glossary_2013.pdf) + +[Transifex sui glossari](https://docs.transifex.com/glossary/glossary) + +Se non prevedi di utilizzare uno strumento di localizzazione per il tuo progetto, probabilmente non sarai in grado di utilizzare una memoria di traduzione e un glossario (potresti creare un glossario o un database terminologico in un file Excel, tuttavia, i glossari automatizzati eliminano la necessità per i traduttori di cercare manualmente i termini e le loro definizioni). + +Ciò significa che tutti i contenuti ripetitivi e simili dovrebbero essere tradotti manualmente ogni volta. Inoltre, i traduttori dovrebbero contattarti con domande su se un determinato termine debba essere tradotto o meno, come viene utilizzato nel testo e se un termine ha già una traduzione stabilita. + +_Vuoi utilizzare la memoria di traduzione e il glossario di ethereum.org nel tuo progetto? Contattaci all'indirizzo translations@ethereum.org._ + +## Coinvolgimento dei traduttori {#translator-outreach} + +**Lavorare con un fornitore di servizi linguistici** + +Se lavori con un fornitore di servizi linguistici e i suoi traduttori professionisti, questa sezione potrebbe non essere molto rilevante per te. + +In questo caso, è importante selezionare un fornitore di servizi linguistici con la capacità di fornire tutti i servizi di cui hai bisogno (ad es. traduzione, revisione, QA) in molte lingue. + +Sebbene possa essere allettante selezionare un fornitore di servizi linguistici basandosi esclusivamente sulle tariffe offerte, è importante notare che i fornitori di servizi linguistici più grandi hanno tariffe più elevate per un motivo. + +- Hanno decine di migliaia di linguisti nel loro database, il che significa che saranno in grado di assegnare al tuo progetto traduttori con sufficiente esperienza e conoscenza del tuo particolare settore (ovvero, traduttori tecnici). +- Hanno un'esperienza significativa nel lavorare su diversi progetti e nel soddisfare le diverse esigenze dei loro clienti. Ciò significa che saranno più propensi ad adattarsi al tuo particolare flusso di lavoro, a offrire preziosi suggerimenti e potenziali miglioramenti per il tuo processo di traduzione e a soddisfare le tue esigenze, i tuoi requisiti e le tue scadenze. +- La maggior parte dei più grandi fornitori di servizi linguistici dispone anche di propri strumenti di localizzazione, memorie di traduzione e glossari che puoi utilizzare. In caso contrario, hanno almeno abbastanza linguisti nel loro gruppo per assicurarsi che i loro traduttori abbiano familiarità e siano in grado di lavorare con qualsiasi strumento di localizzazione tu voglia utilizzare. + +Puoi trovare un confronto approfondito dei più grandi fornitori di servizi linguistici al mondo, alcuni dettagli su ciascuno di essi e suddivisioni in base ai servizi che forniscono, dati geografici, ecc. nel [rapporto Nimdzi 100 del 2021](https://www.nimdzi.com/nimdzi-100-top-lsp/). + +**Lavorare con traduttori non professionisti** + +Potresti lavorare con traduttori non professionisti e cercare volontari che ti aiutino a tradurre. + +Esistono diversi modi per raggiungere le persone e invitarle a unirsi al tuo progetto. Ciò dipenderà in gran parte dal tuo prodotto e da quanto è grande la comunità che hai già. + +Alcuni modi per coinvolgere i volontari sono descritti di seguito: + +**Sensibilizzazione –** Sebbene questo sia in qualche modo trattato nei punti seguenti, contattare potenziali volontari e assicurarsi che siano a conoscenza della tua iniziativa di traduzione può essere efficace di per sé. + +Molte persone vogliono essere coinvolte e contribuire ai loro progetti preferiti, ma spesso non vedono un modo chiaro per farlo senza essere sviluppatori o avere competenze tecniche speciali. Se riesci a diffondere la consapevolezza sul tuo progetto, molti bilingui saranno probabilmente desiderosi di essere coinvolti. + +**Cercare all'interno della propria comunità –** La maggior parte dei progetti nel settore ha già comunità ampie e attive. Molti membri della tua comunità probabilmente apprezzerebbero la possibilità di contribuire al progetto in modo semplice. + +Sebbene contribuire a progetti open-source sia spesso basato su una motivazione intrinseca, è anche una fantastica esperienza di apprendimento. Chiunque sia interessato a saperne di più sul tuo progetto sarebbe probabilmente felice di essere coinvolto in un programma di traduzione come volontario, poiché gli consentirebbe di combinare il fatto di aver contribuito a qualcosa a cui tiene con un'intensa esperienza di apprendimento pratico. + +**Menzionare l'iniziativa nel proprio prodotto –** Se il tuo prodotto è popolare e utilizzato da un gran numero di persone, evidenziare il tuo programma di traduzione e invitare gli utenti all'azione durante l'utilizzo del prodotto può essere estremamente efficace. + +Questo potrebbe essere semplice come aggiungere un banner o un pop-up con una CTA al tuo prodotto per applicazioni e siti web. Questo è efficace perché il tuo pubblico di destinazione è la tua comunità: le persone che hanno maggiori probabilità di essere coinvolte in primo luogo. + +**Social media –** I social media possono essere un modo efficace per diffondere la consapevolezza sul tuo programma di traduzione e raggiungere i membri della tua comunità, così come altre persone che non ne fanno ancora parte. + +Se hai un server Discord o un canale Telegram, è facile usarlo per la sensibilizzazione, la comunicazione con i tuoi traduttori e il riconoscimento dei tuoi collaboratori. + +Piattaforme come X (precedentemente Twitter) possono anche essere utili per coinvolgere nuovi membri della comunità e riconoscere pubblicamente i tuoi collaboratori. + +La Linux Foundation ha creato un ampio [Rapporto sul sondaggio dei collaboratori FOSS del 2020](https://www.linuxfoundation.org/wp-content/uploads/2020FOSSContributorSurveyReport_121020.pdf), analizzando i collaboratori open-source e le loro motivazioni. + +## Conclusione {#conclusion} + +Questo documento contiene alcune considerazioni chiave di cui ogni programma di traduzione dovrebbe essere a conoscenza. Non è in alcun modo una guida esaustiva, sebbene possa aiutare chiunque non abbia esperienza nel settore delle traduzioni a organizzare un programma di traduzione per il proprio progetto. + +Se stai cercando istruzioni più dettagliate e suddivisioni di diversi strumenti, processi e aspetti critici della gestione di un programma di traduzione, alcuni dei più grandi fornitori di servizi linguistici mantengono blog e spesso pubblicano articoli su diversi aspetti del processo di localizzazione. Queste sono le risorse migliori se vuoi approfondire uno qualsiasi degli argomenti sopra indicati e capire come funziona professionalmente il processo di localizzazione. + +Alcuni link pertinenti sono inclusi alla fine di ogni sezione; tuttavia, puoi trovare molte altre risorse online. + +Per proposte di cooperazione o informazioni aggiuntive, insegnamenti e migliori pratiche che abbiamo acquisito mantenendo il Programma di traduzione di ethereum.org, non esitare a contattarci all'indirizzo translations@ethereum.org. \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/resources/index.md b/public/content/translations/it/contributing/translation-program/resources/index.md index 5044943f23e..6677ce12798 100644 --- a/public/content/translations/it/contributing/translation-program/resources/index.md +++ b/public/content/translations/it/contributing/translation-program/resources/index.md @@ -1,44 +1,49 @@ --- -title: Risorse per traduttori +title: Risorse per i traduttori lang: it description: Risorse utili per i traduttori di ethereum.org --- # Risorse {#resources} -Puoi trovare utili guide e strumenti per i traduttori di ethereum.org, nonché le comunità e gli aggiornamenti di traduzione qui di seguito. +Di seguito puoi trovare alcune guide e strumenti utili per i traduttori di ethereum.org, oltre a comunità di traduzione e aggiornamenti. ## Guide {#guides} -- [Guida allo stile di traduzione](/contributing/translation-program/translators-guide/): _istruzioni e consigli per i traduttori di ethereum.org_ -- [FAQ sulle traduzioni](/contributing/translation-program/faq/) _– domande e risposte frequenti sul Programma di traduzione di ethereum.org_ -- [Guida all'editor online di Crowdin](https://support.crowdin.com/online-editor/) _– una guida approfondita all'uso dell'editor online di Crowdin e di alcune funzionalità avanzate di Crowdin_ -- [Categorie di contenuti](/contributing/translation-program/) _– quali pagine sono incluse in ogni categoria di contenuti di ethereum.org_ +- [Guida di stile per la traduzione](/contributing/translation-program/translators-guide/) _– istruzioni e suggerimenti per i traduttori di ethereum.org_ +- [Domande frequenti sulla traduzione](/contributing/translation-program/faq/) _– domande e risposte frequenti sul Programma di Traduzione di ethereum.org_ +- [Guida all'editor online di Crowdin](https://support.crowdin.com/online-editor/) _– una guida approfondita all'uso dell'editor online di Crowdin e ad alcune delle sue funzionalità avanzate_ ## Strumenti {#tools} -- [Linguee](https://www.linguee.com/): _motore di ricerca per traduzioni e dizionario che consente di cercare per parola o per frase_ -- [Ricerca di termini di Proz](https://www.proz.com/search/): _database di dizionari e glossari di traduzione per termini specializzati_ -- [Eurotermbank](https://www.eurotermbank.com/): _raccolte di terminologie europee in 42 lingue_ +- [Linguee](https://www.linguee.com/) + _– motore di ricerca per traduzioni e dizionario che consente la ricerca per parola o frase_ +- [Ricerca dei termini di Proz](https://www.proz.com/search/) + _– database di dizionari e glossari di traduzione per termini specializzati_ +- [Eurotermbank](https://www.eurotermbank.com/) + _– raccolte di terminologia europea in 42 lingue_ -## Community {#communities} +## Comunità {#communities} -- [Gruppi di traduzione Discord specifici per lingua](https://discord.gg/ethereum-org): _un'iniziativa per connettere i traduttori di ethereum.org in gruppi di traduzione_ -- [Gruppo di traduttori di cinese](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171): _pagina di nozioni per una più facile coordinazione tra i traduttori di lingua cinese_ +- [Gruppi di traduzione Discord specifici per lingua](https://discord.gg/ethereum-org) + _– un'iniziativa per connettere i traduttori di ethereum.org ai Gruppi di Traduzione_ +- [Gruppo dei traduttori cinesi](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) + _– pagina Notion per un coordinamento più semplice tra i traduttori cinesi_ ## Ultimi aggiornamenti {#latest-updates} -Per mantenerti aggiornato sui più recenti progressi del programma di traduzione, puoi seguire il [blog della Ethereum Foundation](https://blog.ethereum.org/): +Per rimanere aggiornato sugli ultimi progressi del Programma di Traduzione, puoi seguire il [blog della Ethereum Foundation](https://blog.ethereum.org/): -- [Aggiornamento sui traguardi di ottobre 2021](https://blog.ethereum.org/2021/10/04/translation-program-update) -- [Aggiornamento sui traguardi di dicembre 2020](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20) -- [Aggiornamento sui traguardi di luglio 2020](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone) -- [Lancio del programma di traduzione, agosto 2019](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community) +- [Aggiornamento dei traguardi di ottobre 2021](https://blog.ethereum.org/2021/10/04/translation-program-update) +- [Aggiornamento dei traguardi di dicembre 2020](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20) +- [Aggiornamento dei traguardi di luglio 2020](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone) +- [Lancio del Programma di Traduzione di agosto 2019](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community) -## Orario d'ufficio per traduttori {#office-hours} +## Orari di ricevimento per i traduttori {#office-hours} -Abbiamo previsto un orario d'ufficio per i traduttori ogni secondo mercoledì del mese. Questi si svolgono nel canale vocale #office-hours sul [Discord di ethereum.org](https://discord.gg/ethereum-org), dove potrai anche trovare gli orari esatti e dettagli aggiuntivi. +Teniamo degli orari di ricevimento per i traduttori il secondo mercoledì di ogni mese. Si svolgono nel canale vocale #office-hours sul [Discord di ethereum.org](https://discord.gg/ethereum-org), dove puoi trovare anche gli orari esatti e ulteriori dettagli. -Lo scopo degli orari d'ufficio è quello di consentire ai nostri traduttori di fare domande sul processo di traduzione, fornire suggerimenti sul programma, condividere le loro idee, o semplicemente chattare con noi. Infine, vogliamo utilizzare queste chiamate per comunicare gli sviluppi recenti del programma di traduzione e condividere consigli fondamentali e istruzioni con i nostri collaboratori. +Gli orari di ricevimento consentono ai nostri traduttori di fare domande sul processo di traduzione, fornire feedback sul programma, condividere le loro idee o semplicemente chiacchierare con il team principale di ethereum.org. +Infine, vogliamo utilizzare queste chiamate per comunicare i recenti sviluppi del Programma di Traduzione e condividere suggerimenti e istruzioni chiave con i nostri collaboratori. -Se sei un traduttore di ethereum.org o vorresti diventarlo, sentiti libero di unirti a noi durante una di queste sessioni. +Se sei un traduttore di ethereum.org o vorresti diventarlo, sentiti libero di unirti a noi durante una di queste sessioni. \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/translatathon/details/index.md b/public/content/translations/it/contributing/translation-program/translatathon/details/index.md new file mode 100644 index 00000000000..3f7cdda6227 --- /dev/null +++ b/public/content/translations/it/contributing/translation-program/translatathon/details/index.md @@ -0,0 +1,90 @@ +--- +title: Dettagli e regole +lang: it +template: translatathon +--- + +![](./participate.png) + +Il Translatathon è aperto e chiunque può partecipare compilando il modulo di candidatura e unendosi al progetto su Crowdin. + +I traduttori accumulano punti suggerendo traduzioni per le stringhe non tradotte nella loro lingua nell'editor di Crowdin durante il periodo di traduzione. + +Il punteggio finale di ciascun partecipante è determinato dalla sua posizione in classifica, basata sul numero di parole tradotte durante il periodo di traduzione e sugli eventuali punti bonus accumulati. + +## Per iniziare {#getting-started} + +Il processo di traduzione si svolge nel progetto ethereum.org su Crowdin e i traduttori suggeriscono le loro traduzioni per le stringhe non tradotte, che costituiscono quasi tutto il contenuto del sito web ethereum.org. + +Le traduzioni vengono suggerite direttamente nell'editor online, quindi non è necessario scaricare o caricare alcun file o documento. Ogni parola tradotta viene tracciata e conteggiata. + +**1) Unisciti al progetto** + +- Per iniziare a contribuire, unisciti al [progetto ethereum.org su Crowdin](https://crowdin.com/project/ethereum-org) +- Dovrai accedere o creare un account: tutto ciò che serve è un indirizzo e-mail e una password + +**2) Seleziona la tua lingua** + +- Trova la tua lingua nell'elenco delle lingue di destinazione e aprila cliccando sul suo nome o sulla bandiera +- Se desideri tradurre in una lingua non disponibile, contatta l'[Ethereum.org Team](https://crowdin.com/profile/ethdotorg) su Crowdin o inviaci un'e-mail a translations@ethereum.org e aggiungeremo ulteriori lingue di destinazione su richiesta + +**3) Apri un file non tradotto** + +- Trova il primo file non tradotto per iniziare a tradurre. Le cartelle contenenti i file di origine sono basate sulla priorità, quindi dovresti iniziare a tradurre la prima cartella che contiene file non tradotti +- Ogni file ha un indicatore di avanzamento che mostra quanto del contenuto traducibile nel file è stato tradotto e approvato... se l'avanzamento della traduzione per qualsiasi file è inferiore al 100%, ti preghiamo di tradurlo + +**4) Traduci le stringhe non tradotte** + +- Quando apri un file da tradurre, assicurati di tradurre solo le stringhe non tradotte! +- Ogni stringa ha un indicatore di stato che mostra se è _Translated_ (Tradotta), _Untranslated_ (Non tradotta) o _Approved_ (Approvata). Se una stringa di origine ha già una traduzione suggerita nella tua lingua, non c'è bisogno di tradurla +- Puoi anche filtrare le stringhe nell'editor per mostrare _Untranslated first_ (Prima le non tradotte) o _Untranslated only_ (Solo le non tradotte) + +Per una guida dettagliata sulla navigazione e l'uso dell'editor di Crowdin, raccomandiamo a tutti i partecipanti al Translatathon di leggere la nostra guida [Come tradurre](/contributing/translation-program/how-to-translate/). + +Puoi anche trovare alcuni suggerimenti e migliori pratiche consultando la nostra [guida di stile per la traduzione](/contributing/translation-program/translators-guide/). + +**Come funzionano i punti** + +Ogni partecipante al Translatathon guadagnerà punti per il proprio punteggio finale traducendo contenuti nel progetto Crowdin di ethereum.org e in altri progetti idonei (l'elenco completo dei progetti idonei è disponibile di seguito). + +Il punteggio è semplice: **1 parola tradotta = 1 punto** + +Per ricevere l'assegnazione finale dei punti, le traduzioni suggerite dovranno superare il processo di valutazione, in cui revisori professionisti controlleranno le traduzioni di ciascun partecipante per assicurarsi che soddisfino la soglia minima di qualità e che non siano state utilizzate traduzioni automatiche o basate sull'IA nel processo. + +## Contenuti dell'ecosistema {#ecosystem-content} + +Poiché il programma di traduzione di ethereum.org è sempre attivo, l'avanzamento della traduzione in alcune lingue di destinazione sul sito web è significativamente più alto rispetto ad altre. + +Per garantire che tutti i partecipanti al Translatathon abbiano pari opportunità di tradurre quanto più contenuto possibile e competere per i premi principali, il contenuto di origine che fa parte del Translatathon non è limitato solo al contenuto del sito web ethereum.org. + +I partecipanti che traducono uno qualsiasi dei progetti idonei guadagneranno una quantità uguale di punti: 1 parola tradotta in qualsiasi progetto = 1 punto. + +Ecco un elenco di tutti i progetti idonei che fanno parte del Translatathon 2025: + +- [Ethereum.org](https://crowdin.com/project/ethereum-org) + +- [Tutorial per sviluppatori di Ethereum.org](https://crowdin.com/project/33388446abbe9d7aa21e42e49bba7f97) + +- [EthStaker deposit CLI](https://crowdin.com/project/ethstaker-deposit-cli) + +- [Documentazione di Eth Docker](https://crowdin.com/project/eth-docker-docs) + +- [Documentazione di Remix IDE](https://crowdin.com/project/remix-translation) + +- [Remix LearnEth](https://crowdin.com/project/remix-learneth) + +- [web3.py](https://crowdin.com/project/web3py) + +## Processo di valutazione {#evaluation-process} + +Tutte le traduzioni saranno soggette a controllo qualità (QA) e feedback, in cui linguisti professionisti valuteranno le candidature in base a qualità e accuratezza. + +Applicheremo anche **misure contro la traduzione automatica** utilizzando alcuni strumenti che rilevano automaticamente le traduzioni automatiche o basate sull'IA. + +Sebbene la qualità della traduzione non giocherà un ruolo critico nel punteggio, eventuali **partecipanti sorpresi a utilizzare traduzioni automatiche o basate sull'IA** o a suggerire traduzioni di bassa qualità e inaccurate non saranno idonei per i premi! + +Il periodo di valutazione si svolgerà per tutto il mese di settembre e i risultati saranno annunciati durante la chiamata della community di ethereum.org il 25 settembre. + +Tutte le traduzioni saranno inoltre completamente revisionate prima di essere aggiunte al sito web. + + \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/translatathon/index.md b/public/content/translations/it/contributing/translation-program/translatathon/index.md new file mode 100644 index 00000000000..2df7770dc78 --- /dev/null +++ b/public/content/translations/it/contributing/translation-program/translatathon/index.md @@ -0,0 +1,100 @@ +--- +title: Translatathon 2025 di ethereum.org +lang: it +template: translatathon +--- + + + + + + + +## Introduzione {#introduction} + +Crediamo che i contenuti e le risorse di onboarding di [Ethereum](/) debbano essere accessibili a tutti, indipendentemente dalla lingua che parlano. +Per avvicinarsi a questo obiettivo, il programma di traduzione di ethereum.org è un'iniziativa per tradurre il sito web nel maggior numero di lingue possibile. + +Come parte del programma di traduzione, stiamo organizzando la 3ª edizione del Translatathon, il nostro concorso di traduzione che mira a incentivare i contributi di traduzione nelle lingue meno attive, aumentare il numero di lingue e la quantità di contenuti disponibili sul sito, accogliere nuovi contributori e premiare quelli esistenti. + +Se sei madrelingua di una lingua diversa dall'inglese e vuoi aiutare a rendere i contenuti di Ethereum più accessibili mentre competi per dei premi, continua a leggere per saperne di più! + +[Scopri di più sul programma di traduzione di ethereum.org](/contributing/translation-program/) + +## Tempistiche {#timeline} + +Ecco le date importanti per il Translatathon 2025: + + + + + +## Partecipa {#participate} + +![Immagine della community e del globo](./participate.png) + + + +

Chi può partecipare?

+ Chiunque abbia più di 18 anni, sia madrelingua di almeno una lingua diversa dall'inglese e abbia una buona padronanza dell'inglese. +
+ +

Devo essere un traduttore?

+ No. Devi semplicemente essere bilingue e suggerire traduzioni umane (l'uso della traduzione automatica è vietato!) al meglio delle tue capacità, non è richiesta alcuna esperienza professionale. +
+
+ + + +

Quanto tempo devo dedicare?

+ Quanto ne vuoi. La soglia minima per poter concorrere ai premi è di 1.000 parole tradotte, che dovrebbero richiedere circa 2 ore per essere completate, mentre competere per i premi principali richiederà un impegno di tempo maggiore. +
+ +

Devo avere familiarità con Ethereum?

+ No. Sebbene avere familiarità con Ethereum possa aiutare con la tua produttività e qualità, il Translatathon è anche un'esperienza di apprendimento e tutti sono invitati a unirsi e a scoprire di più su Ethereum partecipando. +
+
+ +Per maggiori dettagli, [consulta i Termini e condizioni completi](/contributing/translation-program/translatathon/terms-and-conditions) + +### Istruzioni passo passo {#step-by-step-instructions} + + + +## Premi {#prizes} + +| Posizionamento | Importo del premio | +|---------------------|--------------------| +| 1° posto | $4000 | +| 2° posto | $2500 | +| 3° posto | $1500 | +| 4° posto | $1100 | +| 5° posto | $1000 | +| 6° posto | $600 | +| 7° posto | $550 | +| 8° posto | $500 | +| 9° posto | $450 | +| 10° posto | $400 | +| 11° - 20° posto | $240 | +| 21° - 50° posto | $120 | +| 51° - 100° posto | $60 | +| 101° - 150° posto | $40 | +| Restanti | $20 | + +Tutti i premi saranno pagati in ETH. + + + + \ No newline at end of file diff --git a/public/content/translations/it/contributing/translation-program/translators-guide/index.md b/public/content/translations/it/contributing/translation-program/translators-guide/index.md index b9a7c3d0bf5..ffb2ba1b5ae 100644 --- a/public/content/translations/it/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/it/contributing/translation-program/translators-guide/index.md @@ -6,65 +6,65 @@ description: Istruzioni e suggerimenti per i traduttori di ethereum.org # Guida di stile per la traduzione di ethereum.org {#style-guide} -La guida di stile per la traduzione di ethereum.org contiene alcune linee guida, istruzioni e consigli più importanti per i traduttori che ci aiutano a localizzare il sito web. +La guida di stile per la traduzione di ethereum.org contiene alcune delle linee guida, istruzioni e suggerimenti più importanti per i traduttori, aiutandoci a localizzare il sito web. -Questo documento funge da guida generale e non è specifico per nessuna lingua. +Questo documento funge da guida generale e non è specifico per una singola lingua. -Per qualsiasi domanda, suggerimento o feedback, non esitare a contattarci all'indirizzo translations@ethereum.org, inviare un messaggio a @ethdotorg su Crowdin, oppure [unisciti al nostro Discord](https://discord.gg/ethereum-org), dove puoi scriverci un messaggio sul canale #translations o contattare un qualsiasi membro del team. +Se hai domande, suggerimenti o feedback, non esitare a contattarci all'indirizzo translations@ethereum.org, inviare un messaggio a @ethdotorg su Crowdin, o [unirti al nostro Discord](https://discord.gg/ethereum-org), dove puoi scriverci nel canale #translations o contattare uno qualsiasi dei membri del team. -## Utilizzare Crowdin {#using-crowdin} +## Usare Crowdin {#using-crowdin} -Puoi trovare le istruzioni di base su come partecipare al progetto in Crowdin e su come utilizzare l'editor online di Crowdin nella pagina del [Programma di traduzione](/contributing/translation-program/#how-to-translate). +Puoi trovare le istruzioni di base su come unirti al progetto su Crowdin e su come usare l'editor online di Crowdin nella [pagina del Programma di Traduzione](/contributing/translation-program/#how-to-translate). -Se vuoi saperne di più su Crowdin e utilizzare alcune delle sue funzionalità avanzate, la [knowledge base di Crowdin](https://support.crowdin.com/online-editor/) contiene molte guide approfondite e panoramiche su tutte le funzionalità di Crowdin. +Se desideri saperne di più su Crowdin e sull'uso di alcune delle sue funzionalità avanzate, la [knowledge base di Crowdin](https://support.crowdin.com/online-editor/) contiene molte guide approfondite e panoramiche di tutte le funzionalità di Crowdin. -## Cogliere l'essenza del messaggio {#capturing-the-essence} +## Catturare l'essenza del messaggio {#capturing-the-essence} -Quando traduci contenuti per ethereum.org, evita traduzioni letterali. +Quando traduci i contenuti di ethereum.org, evita le traduzioni letterali. -È importante che le traduzioni colgano l'essenza del messaggio. Questo potrebbe significare riformulare alcune frasi o utilizzare traduzioni descrittive, invece di tradurre parola per parola. +È importante che le traduzioni catturino l'essenza del messaggio. Questo potrebbe significare riformulare certe frasi, o usare traduzioni descrittive invece di tradurre il contenuto parola per parola. -Le varie lingue hanno diverse regole grammaticali, convenzioni stilistiche o sintattiche. Quando traduci, presta attenzione a come sono strutturate le frasi nella lingua di destinazione ed evita di tradurre letteralmente l'originale in inglese, poiché ciò può tradursi in una sintassi e in una leggibilità delle frasi scarse. +Lingue diverse hanno regole grammaticali, convenzioni e ordine delle parole differenti. Durante la traduzione, fai attenzione a come sono strutturate le frasi nelle lingue di destinazione ed evita di tradurre letteralmente la fonte inglese, poiché ciò può portare a una struttura della frase e a una leggibilità scadenti. -Invece di tradurre il testo di partenza parola per parola, consigliamo di leggere l'intera frase e di adattarla alle convenzioni della lingua di destinazione. +Invece di tradurre il testo di origine parola per parola, si consiglia di leggere l'intera frase e adattarla per rispettare le convenzioni della lingua di destinazione. ## Formale vs. informale {#formal-vs-informal} -Usiamo la forma di cortesia, sempre educata e appropriata per tutti i visitatori. +Usiamo un tono formale per rivolgerci agli utenti, che è sempre educato e appropriato per tutti i visitatori. -L'uso della forma di cortesia ci consente di evitare di sembrare non ufficiali od offensivi e funziona indipendentemente dall'età e dal sesso del visitatore. +L'uso di un tono formale ci permette di evitare di sembrare non ufficiali o offensivi, e funziona indipendentemente dall'età e dal genere del visitatore. -La maggior parte delle lingue indoeuropee e afroasiatiche utilizzan pronomi personali di seconda persona specifici in base al sesso, che distinguono tra maschio e femmina. Quando ci rivolgiamo all'utente o utilizziamo pronomi possessivi, possiamo di evitare di indovinare il sesso del visitatore, poiché la forma di cortesia è generalmente applicabile e coerente, indipendentemente dal genere dell'interlocutore. +La maggior parte delle lingue indoeuropee e afroasiatiche usa pronomi personali di seconda persona specifici per genere, che distinguono tra maschio e femmina. Quando ci si rivolge all'utente o si usano pronomi possessivi, possiamo evitare di presumere il genere del visitatore, poiché la forma formale è generalmente applicabile e coerente, indipendentemente da come si identificano. ## Vocabolario e significato semplici e chiari {#simple-vocabulary} -Il nostro obiettivo è quello di rendere i contenuti sul sito comprensibili a quante più persone possibile. +Il nostro obiettivo è rendere i contenuti del sito web comprensibili al maggior numero di persone possibile. -Nella maggior parte dei casi, ciò può essere ottenuto efficacemente utilizzando parole semplici e brevi, di facile comprensione. Se esistono più traduzioni possibili per una certa parola nella tua lingua con lo stesso significato, l'opzione migliore è molto spesso la parola più breve che riflette chiaramente il significato. +Nella maggior parte dei casi, questo può essere facilmente ottenuto usando parole brevi e semplici che siano facilmente comprensibili. Se ci sono più traduzioni possibili per una certa parola nella tua lingua con lo stesso significato, l'opzione migliore è quasi sempre la parola più corta che riflette chiaramente il significato. ## Sistema di scrittura {#writing-system} -Ethereum.org è disponibile in diverse lingue, che utilizzano sistemi di scrittura (o script di scrittura) alternativi a quello latino. +Ethereum.org è disponibile in diverse lingue, che usano sistemi di scrittura (o alfabeti) alternativi a quello latino. -Tutti i contenuti dovrebbero essere tradotti utilizzando il sistema di scrittura corretto per la lingua specifica e non dovrebbero includere parole scritte con caratteri latini. +Tutti i contenuti dovrebbero essere tradotti usando il sistema di scrittura corretto per la tua lingua, e non dovrebbero includere parole scritte con caratteri latini. -Nel tradurre i contenuti, si dovrebbe fare in modo che le traduzioni siano coerenti e non includano caratteri latini. +Durante la traduzione dei contenuti, dovresti assicurarti che le traduzioni siano coerenti e non includano alcun carattere latino. -Un equivoco comune è che "Ethereum" debba essere scritto sempre in caratteri latini. Questa è un'idea errata: occorre utilizzare l'ortografia di Ethereum nativa in base alla lingua (ad es. 以太坊 in cinese, إيثيريوم in arabo, ecc.). +Un malinteso comune è che Ethereum debba essere sempre scritto in caratteri latini. Questo è per lo più errato, ti preghiamo di usare l'ortografia di Ethereum nativa della tua lingua (es. 以太坊 in cinese, إيثيريوم in arabo, ecc.). -**Quanto sopra non si applica alle lingue in cui i nomi propri non vanno generalmente tradotti.** +**Quanto sopra non si applica alle lingue in cui i nomi propri non dovrebbero essere tradotti di regola.** ## Tradurre i metadati della pagina {#translating-metadata} -Alcune pagine contengono metadati sulla pagina, come 'title', 'lang', 'description', 'sidebar', ecc. +Alcune pagine contengono metadati, come 'title', 'lang', 'description', 'sidebar', ecc. -Quando carichiamo le nuove pagine su Crowdin, nascondiamo i contenuti da non tradurre. Ciò significa che tutti i metadati visibili ai traduttori su Crowdin dovrebbero essere tradotti. +Nascondiamo i contenuti che i traduttori non dovrebbero mai tradurre quando carichiamo nuove pagine su Crowdin, il che significa che tutti i metadati visibili ai traduttori su Crowdin dovrebbero essere tradotti. -Invitiamo a prestare particolare attenzione nella traduzione di stringhe il cui testo di origine è "en". Questa sigla rappresenta la lingua in cui la pagina è disponibile e dovrebbe essere tradotta con il [codice linguistico ISO della lingua di destinazione](https://www.andiamo.co.uk/resources/iso-language-codes/). Queste stringhe dovrebbero sempre essere tradotte usando caratteri latini, non lo script di scrittura nativo della lingua di destinazione. +Fai particolare attenzione quando traduci stringhe in cui il testo di origine è 'en'. Questo rappresenta la lingua in cui è disponibile la pagina e dovrebbe essere tradotto nel [codice lingua ISO per la tua lingua](https://www.andiamo.co.uk/resources/iso-language-codes/). Queste stringhe dovrebbero sempre essere tradotte usando caratteri latini, non il sistema di scrittura nativo della lingua di destinazione. -Se non sei sicuro/a di quale codice linguistico usare, puoi cercare nella memoria di traduzione su Crowdin oppure individuare il codice linguistico per la tua lingua nell'URl della pagina, nell'editor online di Crowdin. +Se non sei sicuro di quale codice lingua usare, puoi controllare la memoria di traduzione in Crowdin o trovare il codice lingua per la tua lingua nell'URL della pagina nell'editor online di Crowdin. -Alcuni esempi di codici linguistici per le lingue più diffuse: +Alcuni esempi di codici lingua per le lingue più parlate: - Arabo - ar - Cinese Semplificato - zh @@ -74,167 +74,173 @@ Alcuni esempi di codici linguistici per le lingue più diffuse: ## Titoli di articoli esterni {#external-articles} -Alcune stringhe contengono titoli di articoli esterni. Gran parte delle nostre pagine di documentazione per sviluppatori contiene link ad articoli esterni, per ulteriori letture. Le stringhe contenenti titoli di articoli devono esser tradotte, indipendentemente dalla lingua dell'articolo, per assicurare un'esperienza dell'utente più coerente per i visitatori della pagina nella propria lingua. +Alcune stringhe contengono titoli di articoli esterni. La maggior parte delle nostre pagine di documentazione per sviluppatori contiene link ad articoli esterni per ulteriori letture. Le stringhe contenenti i titoli degli articoli devono essere tradotte, indipendentemente dalla lingua dell'articolo, per garantire un'esperienza utente più coerente per i visitatori che visualizzano la pagina nella loro lingua. -Di seguito puoi trovare alcuni esempi di come queste stringhe appaiono ai traduttori e come identificarle (i link agli articoli si trovano prevalentemente in fondo a queste pagine, nella sezione "Ulteriori letture"): +Di seguito puoi trovare alcuni esempi di come appaiono queste stringhe per i traduttori e come identificarle (i link agli articoli si trovano per lo più in fondo a queste pagine, nella sezione 'Letture di approfondimento'): -![Titoli di articoli in sidebar.png](./article-titles-in-sidebar.png) ![Titoli di articoli in editor.png](./article-titles-in-editor.png) +![Titoli degli articoli nella barra laterale](./article-titles-in-sidebar.png) +![Titoli degli articoli nell'editor](./article-titles-in-editor.png) ## Avvisi di Crowdin {#crowdin-warnings} -Crowdin offre una funzionalità integrata che avvisa i traduttori quando stanno per commettere un errore. Crowdin ti avviserà automaticamente di questo prima di salvare la tua traduzione se dimentichi di includere un tag dal testo sorgente, se traduci elementi che non dovrebbero essere tradotti, se inserisci più spazi consecutivi, dimentichi la punteggiatura finale, ecc. Se visualizzi un avviso simile a questo, ti invitiamo a tornare indietro e ricontrollare la traduzione inserita. +Crowdin ha una funzionalità integrata che avvisa i traduttori quando stanno per commettere un errore. Crowdin ti avviserà automaticamente prima di salvare la tua traduzione se dimentichi di includere un tag dalla fonte, traduci elementi che non dovrebbero essere tradotti, aggiungi diversi spazi consecutivi, dimentichi la punteggiatura finale, ecc. +Se vedi un avviso di questo tipo, torna indietro e ricontrolla la traduzione suggerita. -**Non ignorare mai questi avvisi, poiché solitamente significano che c'è qualcosa che non va o che manca una parte fondamentale del testo di partenza.** +**Non ignorare mai questi avvisi, poiché di solito significano che qualcosa non va, o che alla traduzione manca una parte chiave del testo di origine.** -Un esempio di un avviso di Crowdin quando dimentichi di aggiungere un tag alla tua traduzione: ![Esempio di avviso di Crowdin](./crowdin-warning-example.png) +Un esempio di avviso di Crowdin quando dimentichi di aggiungere un tag alla tua traduzione: +![Esempio di un avviso di Crowdin](./crowdin-warning-example.png) -## Gestire i tag e i frammenti di codice {#dealing-with-tags} +## Gestire tag e frammenti di codice {#dealing-with-tags} -Molti contenuti di partenza contengono tag e variabili, evidenziati in giallo nell'editor di Crowdin. Questi svolgono diverse funzioni e dovrebbero esser trattati correttamente. +Gran parte del contenuto di origine contiene tag e variabili, che sono evidenziati in giallo nell'editor di Crowdin. Questi hanno funzioni diverse e dovrebbero essere affrontati correttamente. **Impostazioni di Crowdin** -Per semplificare la gestione dei tag e copiarli direttamente dal testo di partenza, consigliamo di modificare le tue impostazioni nell'editor di Crowdin. +Per rendere più facile la gestione dei tag e copiarli direttamente dalla fonte, ti consigliamo di modificare le tue impostazioni nell'editor di Crowdin. -1. Apri le impostazioni ![Come aprire le impostazioni nell'editor](./editor-settings.png) +1. Apri le impostazioni + ![Come aprire le impostazioni nell'editor](./editor-settings.png) -2. Scorri verso il basso fino alla sezione "HTML tags displaying” +2. Scorri verso il basso fino alla sezione 'Visualizzazione tag HTML' -3. Seleziona "Hide"![Seleziona "Hide"](./hide-tags.png) +3. Seleziona 'Nascondi' + ![Seleziona 'Nascondi'](./hide-tags.png) -4. Fai clic su "Save" +4. Clicca su 'Salva' -Selezionando quest'opzione, il testo del tag completo non sarà più mostrato e sarà sostituito da un numero. Durante la traduzione, facendo clic su questo tag si copierà automaticamente lo stesso tag nel campo di traduzione. +Selezionando questa opzione, il testo completo del tag non verrà più mostrato e sarà sostituito da un numero. +Durante la traduzione, cliccando su questo tag verrà copiato automaticamente il tag esatto nel campo di traduzione. **Link** Potresti notare link completi a pagine su ethereum.org o altri siti web. -Dovrebbero essere identici a quelli originali e non essere modificati o tradotti. Se traduci un link o lo modifichi in qualche modo, anche solo rimuovendone una parte, come un backslash (/), lo renderai corrotto o inutilizzabile. +Questi dovrebbero essere identici alla fonte e non modificati o tradotti. Se traduci un link o lo modifichi in qualsiasi modo, anche solo rimuovendone una parte, come una barra (/), questo porterà a link interrotti e inutilizzabili. -Il modo migliore per gestire i collegamenti è copiarli direttamente dal testo di partenza, facendo clic su di essi o utilizzando il pulsante "Copy Source" (Alt+C). +Il modo migliore per gestire i link è copiarli direttamente dalla fonte, cliccandoci sopra o usando il pulsante 'Copia origine' (Alt+C). -![Esempio di link.png](./example-of-link.png) +![Esempio di link](./example-of-link.png) -I link appaiono nel testo di partenza anche sotto forma di tag (cioè `<0> `). Se passi sul tag, l'editor ne mostrerà il contenuto completo; talvolta questi tag rappresentano dei link. +I link appaiono anche nel testo di origine sotto forma di tag (es. `<0>` ``). Se passi il mouse sopra il tag, l'editor mostrerà il suo contenuto completo - a volte questi tag rappresenteranno dei link. -È molto importante copiare i link dal testo di partenza senza modificarne l'ordine. +È molto importante copiare i link dalla fonte e non cambiarne l'ordine. -Se l'ordine dei tag viene modificato, il link corrispondente risulterà corrotto. +Se l'ordine dei tag viene modificato, il link che rappresentano sarà interrotto. -![Esempio di link all'interno di tag.png](./example-of-links-inside-tags.png) +![Esempio di link all'interno dei tag](./example-of-links-inside-tags.png) **Tag e variabili** -Il testo di partenza può contenere diversi tipi di tag, che dovrebbero sempre essere copiati dalla sorgente e mai modificati. Analogamente a quanto detto sopra, anche l'ordine di questi tag nella traduzione dovrebbe rimanere identico a quello del testo originale. +Il testo di origine contiene molti tipi diversi di tag, che dovrebbero sempre essere copiati dalla fonte e mai modificati. Analogamente a quanto sopra, anche l'ordine di questi tag nella traduzione dovrebbe rimanere lo stesso della fonte. -I tag contengono sempre un tag d'apertura e uno di chiusura. In gran parte dei casi, il testo tra i tag d'apertura e di chiusura va tradotto. +I tag contengono sempre un tag di apertura e uno di chiusura. Nella maggior parte dei casi, il testo tra i tag di apertura e chiusura dovrebbe essere tradotto. Esempio: ``Decentralizzato`` -`` - _Tag d'apertura che rende il testo in grassetto_ +`` - _Tag di apertura che rende il testo in grassetto_ Decentralizzato - _Testo traducibile_ `` - _Tag di chiusura_ -![Esempio di tag "forti".png](./example-of-strong-tags.png) +![Esempio di tag 'strong'](./example-of-strong-tags.png) -I frammenti di codice vanno trattati in maniera leggermente diversa rispetto agli altri tag, poiché contengono codice che non va tradotto. +I frammenti di codice dovrebbero essere affrontati in modo leggermente diverso rispetto agli altri tag, poiché contengono codice che non dovrebbe essere tradotto. Esempio: ``nonce`` -`` - _Tag d'apertura, contenente un frammento di codice_ +`` - _Tag di apertura, che contiene un frammento di codice_ nonce - _Testo non traducibile_ `` - _Tag di chiusura_ -![Esempio di frammenti di codice.png](./example-of-code-snippets.png) +![Esempio di frammenti di codice](./example-of-code-snippets.png) -Il testo di partenza contiene anche tag abbreviati, contenenti solo numeri, il che significa che la loro funzione non è immediatamente ovvia. Puoi passare su questi tag per vedere esattamente quale scopo assolvono. +Il testo di origine contiene anche tag abbreviati, che contengono solo numeri, il che significa che la loro funzione non è immediatamente ovvia. Puoi passare il mouse sopra questi tag per vedere esattamente quale funzione svolgono. -Nell'esempio seguente, passando con il mouse sul `<0>` tag puoi vedere che rappresenta `` e contiene un frammento di codice, quindi il contenuto non va tradotto. +Nell'esempio seguente, puoi vedere che passando il mouse sopra il tag `<0>` viene mostrato che rappresenta `` e contiene un frammento di codice, pertanto il contenuto all'interno di questi tag non dovrebbe essere tradotto. -![Esempio di tag ambigui.png](./example-of-ambiguous-tags.png) +![Esempio di tag ambigui](./example-of-ambiguous-tags.png) -## Formule/abbreviazioni brevi vs. complete {#short-vs-full-forms} +## Forme brevi vs. complete/abbreviazioni {#short-vs-full-forms} -Nel sito web sono usate molte abbreviazioni, es. dapp, NFT, DAO, DeFi, ecc. Queste abbreviazioni sono comunemente usate in inglese e gran parte dei visitatori del sito web ne è a conoscenza. +Ci sono molte abbreviazioni usate sul sito web, es. dApp, NFT, DAO, DeFi, ecc. Queste abbreviazioni sono comunemente usate in inglese e la maggior parte dei visitatori del sito web ha familiarità con esse. -Dal momento che di solito non esistono traduzioni attestate in altre lingue, il modo migliore per trattare questi termini e altri simili è quello di fornire una traduzione descrittiva della forma estesa e aggiungere l'abbreviazione inglese tra parentesi. +Poiché di solito non hanno traduzioni consolidate in altre lingue, il modo migliore per affrontare questi e termini simili è fornire una traduzione descrittiva della forma completa e aggiungere l'abbreviazione inglese tra parentesi. -Non tradurre queste abbreviazioni, poiché la maggior parte delle persone non le conoscerebbe e le versioni localizzate non avrebbero molto senso per la maggior parte dei visitatori. +Non tradurre queste abbreviazioni, poiché la maggior parte delle persone non avrebbe familiarità con esse e le versioni localizzate non avrebbero molto senso per la maggior parte dei visitatori. -Esempio di come tradurre le dapp: +Esempio di come tradurre dApp: -- Applicazioni decentralizzate (dApp) → _Tradotto integralmente (abbreviazione tra parentesi)_ +- Applicazioni decentralizzate (dApp) → _Forma completa tradotta (abbreviazione inglese tra parentesi)_ -## Termini senza traduzioni attestate {#terms-without-established-translations} +## Termini senza traduzioni consolidate {#terms-without-established-translations} -Alcuni termini potrebbero non avere traduzioni attestate in altre lingue e sono ampiamente noti con il termine originale in inglese. Tali termini includono principalmente concetti recenti, come Proof of Work, Proof of Stake, Beacon Chain, staking, ecc. +Alcuni termini potrebbero non avere traduzioni consolidate in altre lingue e sono ampiamente conosciuti con il termine inglese originale. Tali termini includono per lo più concetti più recenti, come prova di lavoro, prova di stake, beacon chain, staking, ecc. -Sebbene la traduzione di questi termini possa sembrare innaturale, poiché la versione inglese è comunemente usata anche in altre lingue, si consiglia vivamente di tradurli. +Sebbene tradurre questi termini possa sembrare innaturale, poiché la versione inglese è comunemente usata anche in altre lingue, si consiglia vivamente di tradurli. -Traducendoli, sentiti libero di essere creativo, usa traduzioni descrittive o semplicemente traducili in maniera letterale. +Quando li traduci, sentiti libero di essere creativo, usa traduzioni descrittive o semplicemente traducili letteralmente. -**Il motivo per cui la maggior parte dei termini dovrebbe essere tradotta, invece di lasciarne alcuni in inglese, è il fatto che questa nuova terminologia diventerà più diffusa in futuro, man mano che più persone inizieranno a utilizzare Ethereum e le relative tecnologie. Se vogliamo coinvolgere più persone da tutto il mondo in questo spazio, dobbiamo fornire una terminologia comprensibile in quante più lingue possibili, anche se dobbiamo crearla noi stessi.** +**Il motivo per cui la maggior parte dei termini dovrebbe essere tradotta, invece di lasciarne alcuni in inglese, è il fatto che questa nuova terminologia diventerà più diffusa in futuro, man mano che più persone inizieranno a usare Ethereum e le tecnologie correlate. Se vogliamo far entrare più persone da tutto il mondo in questo spazio, dobbiamo fornire una terminologia comprensibile nel maggior numero di lingue possibile, anche se dobbiamo crearla noi stessi.** ## Pulsanti e CTA {#buttons-and-ctas} -Il sito web contiene numerosi pulsanti, che dovrebbero essere tradotti in modo diverso dagli altri contenuti. +Il sito web contiene numerosi pulsanti, che dovrebbero essere tradotti in modo diverso rispetto agli altri contenuti. -Il testo del pulsante può essere identificato visualizzando gli screenshot contestuali, associati a gran parte delle stringhe, o controllando il contesto nell'editor, che include l'espressione "button". +Il testo dei pulsanti può essere identificato visualizzando gli screenshot di contesto, collegati alla maggior parte delle stringhe, o controllando il contesto nell'editor, che include la parola ''button''. -Le traduzioni dei pulsanti dovrebbero essere il più possibile brevi, onde evitare mancate corrispondenze di formattazione. Inoltre, le traduzioni dei pulsanti dovrebbero essere in forma imperativa, ovvero indicare un comando o una richiesta. +Le traduzioni per i pulsanti dovrebbero essere il più brevi possibile, per prevenire problemi di formattazione. Inoltre, le traduzioni dei pulsanti dovrebbero essere all'imperativo, cioè presentare un comando o una richiesta. -![Come trovare un pulsante.png](./how-to-find-a-button.png) +![Come trovare un pulsante](./how-to-find-a-button.png) ## Tradurre per l'inclusività {#translating-for-inclusivity} -I visitatori di ethereum.org provengono da tutto il mondo e da contesti sociali diversi. La lingua sul sito web deve quindi essere neutrale, accogliente per tutti e non esclusiva. +I visitatori di Ethereum.org provengono da tutto il mondo e da contesti diversi. Il linguaggio sul sito web dovrebbe quindi essere neutrale, accogliente per tutti e non esclusivo. -A tale riguardo, un aspetto importante è la neutralità di genere. Questa è facilmente ottenibile usando uno stile formale ed evitando parole specifiche per il genere nelle traduzioni. +Un aspetto importante di questo è la neutralità di genere. Questo può essere facilmente ottenuto usando la forma formale di indirizzamento ed evitando qualsiasi parola specifica per genere nelle traduzioni. -Un'altra forma di inclusività consiste nel tentare di tradurre per un pubblico globale, non specifico a paesi, razze o regioni. +Un'altra forma di inclusività è cercare di tradurre per un pubblico globale, non specifico per alcun paese, razza o regione. -Infine, la lingua dovrebbe essere adatta a qualsiasi pubblico e fascia di età. +Infine, il linguaggio dovrebbe essere adatto a tutti i pubblici e a tutte le età. -## Traduzioni specifiche in base alla lingua {#language-specific-translations} +## Traduzioni specifiche per lingua {#language-specific-translations} -Quando si traduce è importante seguire le regole grammaticali, le convenzioni e la formattazione utilizzate nella propria lingua, anziché copiare quelle del testo originale. Il testo d'origine segue le regole e convenzioni della grammatica inglese, non applicabili a molte altre lingue. +Durante la traduzione, è importante seguire le regole grammaticali, le convenzioni e la formattazione usate nella tua lingua, invece di copiare dalla fonte. Il testo di origine segue le regole grammaticali e le convenzioni inglesi, che non sono applicabili a molte altre lingue. -Dovresti essere a conoscenza delle regole per la tua lingua e tradurre di conseguenza. Se ti occorre aiuto, contattaci e ti aiuteremo a trovare risorse utili su come questi elementi dovrebbero essere usati nella tua lingua. +Dovresti essere a conoscenza delle regole per la tua lingua e tradurre di conseguenza. Se hai bisogno di aiuto, contattaci e ti aiuteremo a trovare alcune risorse su come questi elementi dovrebbero essere usati nella tua lingua. -Alcuni esempi di aspetti a cui prestare particolare attenzione: +Alcuni esempi di cosa prestare particolare attenzione: ### Punteggiatura, formattazione {#punctuation-and-formatting} -**Maiuscole/minuscole** +**Uso delle maiuscole** -- Esistono notevoli differenze nell'uso di maiuscole e minuscole in diverse lingue. -- In inglese, è comune usare le maiuscole per tutte le parole di titoli e nomi, mesi e giorni, nomi di lingue, festività, etc. In molte altre lingue, questo è sbagliato dal punto di vista grammaticale, in quanto vigono regole diverse sull'uso delle maiuscole/minuscole. -- Alcune lingue hanno anche regole sull'uso della maiuscola per pronomi personali, sostantivi e alcuni aggettivi, che in inglese vengono scritti con l'iniziale minuscola. +- Ci sono vaste differenze nell'uso delle maiuscole in lingue diverse. +- In inglese, è comune mettere in maiuscolo tutte le parole nei titoli e nei nomi, nei mesi e nei giorni, nei nomi delle lingue, nelle festività, ecc. In molte altre lingue, questo è grammaticalmente scorretto, poiché hanno regole diverse per l'uso delle maiuscole. +- Alcune lingue hanno anche regole sull'uso delle maiuscole per i pronomi personali, i sostantivi e certi aggettivi, che non sono in maiuscolo in inglese. **Spaziatura** -- Le regole ortografiche definiscono l'uso degli spazi per ogni lingua. Poiché gli spazi sono usati ovunque, queste regole sono alcune delle più distinte e gli spazi sono alcuni degli elementi maggiormente tradotti in modo improprio. -- Alcune differenze comuni nella spaziatura tra l'inglese e altre lingue: - - Spazio prima dell'unità di misura e delle valute (es. USD, EUR, kB, MB) +- Le regole ortografiche definiscono l'uso degli spazi per ogni lingua. Poiché gli spazi sono usati ovunque, queste regole sono tra le più distinte e gli spazi sono tra gli elementi più tradotti in modo errato. +- Alcune differenze comuni nella spaziatura tra l'inglese e le altre lingue: + - Spazio prima delle unità di misura e delle valute (es. USD, EUR, kB, MB) - Spazio prima dei segni di grado (es. °C, ℉) - - Spazio prima di certi segni di punteggiatura, specialmente i puntini di sospensione (…) + - Spazio prima di alcuni segni di punteggiatura, specialmente i puntini di sospensione (…) - Spazio prima e dopo le barre (/) **Elenchi** -- Ogni lingua ha una diversa e complessa serie di regole per la redazione di elenchi. Questi possono differire significativamente rispetto all'inglese. -- In alcune lingue, la prima parola di ogni nuova riga deve essere maiuscola, mentre in altre le nuove righe devono iniziare con lettere minuscole. Molte lingue hanno anche regole differenti sull'uso delle maiuscole/minuscole negli elenchi, a seconda della lunghezza di ogni riga. -- Lo stesso si applica alla punteggiatura dei vari punti dell'elenco. La punteggiatura finale negli elenchi può essere un punto (**.**), una virgola (**,**) o un punto e virgola (**;**), a seconda della lingua. +- Ogni lingua ha un insieme di regole diverso e complesso per la scrittura degli elenchi. Queste possono essere significativamente diverse dall'inglese. +- In alcune lingue, la prima parola di ogni nuova riga deve essere in maiuscolo, mentre in altre, le nuove righe dovrebbero iniziare con lettere minuscole. Molte lingue hanno anche regole diverse sull'uso delle maiuscole negli elenchi, a seconda della lunghezza di ogni riga. +- Lo stesso vale per la punteggiatura delle voci. La punteggiatura finale negli elenchi può essere un punto (**.**), una virgola (**,**) o un punto e virgola (**;**), a seconda della lingua. **Virgolette** -- Le varie lingue usano tipi diversi di virgolette. Copiare semplicemente le virgolette inglesi dal segmento originale spesso è sbagliato. -- Tra i tipi più comuni di virgolette troviamo: +- Le lingue usano molti tipi diversi di virgolette. Copiare semplicemente le virgolette inglesi dalla fonte è spesso scorretto. +- Alcuni dei tipi più comuni di virgolette includono: - „testo di esempio“ - ‚testo di esempio’ - »testo di esempio« @@ -242,27 +248,27 @@ Alcuni esempi di aspetti a cui prestare particolare attenzione: - ‘testo di esempio’ - «testo di esempio» -**Trattini lunghi e corti** +**Trattini e lineette** -- In inglese si utilizza un trattino corto (-) per unire parole o parti diverse di una parola e un trattino lungo (–) per indicare un intervallo o una pausa. -- Molte lingue hanno regole diverse per l'uso di trattini corti e lunghi, che dovrebbero essere osservate. +- In inglese, un trattino (-) è usato per unire parole o parti diverse di una parola, mentre una lineetta (–) è usata per indicare un intervallo o una pausa. +- Molte lingue hanno regole diverse per l'uso di trattini e lineette che dovrebbero essere osservate. ### Formati {#formats} **Numeri** -- La differenza principale nella scrittura dei numeri nelle varie lingue riguarda il separatore usato per decimali e migliaia. Per le migliaia, può essere un punto, una virgola o uno spazio. Analogamente, alcune lingue usano un punto decimale, mentre altre usano una virgola. +- La differenza principale nella scrittura dei numeri in lingue diverse è il separatore usato per i decimali e le migliaia. Per le migliaia, questo può essere un punto, una virgola o uno spazio. Allo stesso modo, alcune lingue usano un punto decimale, mentre altre usano una virgola decimale. - Alcuni esempi di grandi numeri: - Inglese – **1,000.50** - Spagnolo – **1.000,50** - Francese – **1 000,50** -- Un'altra considerazione importante sulla traduzione dei numeri riguarda il segno percentuale. Può essere scritto in diversi modi: **100%**, **100 %** o **%100**. -- Infine, i numeri negativi possono esser scritti diversamente, a secnda della lingua: -100, 100-, (100) o [100]. +- Un'altra considerazione importante quando si traducono i numeri è il segno di percentuale. Può essere scritto in modi diversi: **100%**, **100 %** o **%100**. +- Infine, i numeri negativi possono essere visualizzati in modo diverso, a seconda della lingua: -100, 100-, (100) o [100]. **Date** -- Traducendo le date, esistono numerose considerazioni e differenze basate sulla lingua. Ciò include il formato della data, il separatore, l'uso di maiuscole e minuscole e gli zeri iniziali. Esistono anche differenze tra le date scritte per esteso e le date numeriche. - - Alcuni esempi di formati di data diversi: +- Quando si traducono le date, ci sono una serie di considerazioni e differenze basate sulla lingua. Queste includono il formato della data, il separatore, l'uso delle maiuscole e gli zeri iniziali. Ci sono anche differenze tra date per esteso e numeriche. + - Alcuni esempi di diversi formati di data: - Inglese UK (gg/mm/aaaa) – 1st January, 2022 - Inglese US (mm/gg/aaaa) – January 1st, 2022 - Cinese (aaaa-mm-gg) – 2022 年 1 月 1 日 @@ -272,22 +278,22 @@ Alcuni esempi di aspetti a cui prestare particolare attenzione: **Valute** -- Tradurre le valute può essere complicato, a causa dei diversi formati, convenzioni e conversioni. Come regola generale, consigliamo di lasciare la valuta riportata nel testo originale. Puoi aggiungere la tua valuta locale e la conversione tra parentesi, per comodità del lettore. -- Le principali differenze nella scrittura delle valute nelle varie lingue riguardano il posizionamento dei simboli, l'uso di virgole o punti decimali, la spaziatura e l'uso di abbreviazioni o simboli. +- Tradurre le valute può essere impegnativo, a causa dei diversi formati, convenzioni e conversioni. Come regola generale, ti preghiamo di mantenere le valute uguali alla fonte. Puoi aggiungere la tua valuta locale e la conversione tra parentesi, a vantaggio del lettore. +- Le principali differenze nella scrittura delle valute in lingue diverse includono il posizionamento del simbolo, virgole decimali vs. punti decimali, spaziatura e abbreviazioni vs. simboli. - Posizionamento del simbolo: $100 o 100$ - - Virgole vs. punti decimali: 100,50$ o 100.50$ + - Virgole decimali vs. punti decimali: 100,50$ o 100.50$ - Spaziatura: 100$ o 100 $ - Abbreviazioni vs. simboli: 100 $ o 100 USD **Unità di misura** -- Come regola generale, consigliamo di lasciare le unità di misura come appaiono nel testo originale. Se il tuo paese usa un sistema differente, puoi includere la conversione tra parentesi. -- Oltre alla localizzazione delle unità di misura, è importante notare anche il diverso trattamento di tali unità nelle varie lingue. La differenza principale riguarda la spaziatura tra numero e unità, che può variare in base alla lingua. Esempi di ciò includono: 100kB o 100 kB, 50°F o 50 °F. +- Come regola generale, ti preghiamo di mantenere le unità di misura come nella fonte. Se il tuo paese usa un sistema diverso, puoi includere la conversione tra parentesi. +- Oltre alla localizzazione delle unità di misura, è anche importante notare le differenze nel modo in cui le lingue si approcciano a queste unità. La differenza principale è la spaziatura tra il numero e l'unità, che può essere diversa in base alla lingua. Esempi di questo includono 100kB vs. 100 kB o 50ºF vs. 50 ºF. -## Conclusioni {#conclusion} +## Conclusione {#conclusion} Tradurre ethereum.org è una grande opportunità per conoscere i diversi aspetti di Ethereum. -Quando traduci, cerca di non andare troppo in fretta. Prendila con calma e goditi l'esperienza! +Durante la traduzione, cerca di non avere fretta. Prenditela comoda e divertiti! -Grazie per aver partecipato al Programma di Traduzione e per averci aiutato a rendere il sito web accessibile a un pubblico più ampio. La comunità di Ethereum è globale e siamo felici che tu ne faccia parte! +Grazie per essere coinvolto nel Programma di Traduzione e per aiutarci a rendere il sito web accessibile a un pubblico più ampio. La comunità di Ethereum è globale e siamo felici che tu ne faccia parte! \ No newline at end of file diff --git a/public/content/translations/it/dao/index.md b/public/content/translations/it/dao/index.md index 4c3071f0bf0..ed960ab10d1 100644 --- a/public/content/translations/it/dao/index.md +++ b/public/content/translations/it/dao/index.md @@ -1,167 +1,169 @@ --- -title: Cos'è una DAO? -metaTitle: Cos'è una DAO? | Organizzazione autonoma decentralizzata +title: "Cos'è una DAO?" +metaTitle: "Cos'è una DAO? | Organizzazione Autonoma Decentralizzata" description: Una panoramica delle DAO su Ethereum lang: it template: use-cases emoji: ":handshake:" -sidebarDepth: 3 +sidebarDepth: 2 image: /images/use-cases/dao-2.png -alt: Rappresentazione di una votazione DAO su una proposta. -summaryPoint1: Community posseduta dai membri, prive di leadership centralizzata. -summaryPoint2: Un modo sicuro per collaborare con sconosciuti su Internet. -summaryPoint3: Un luogo sicuro per impegnare fondi in una causa specifica. +alt: Una rappresentazione di una DAO che vota su una proposta. +summaryPoint1: "Comunità di proprietà dei membri senza una leadership centralizzata." +summaryPoint2: Un modo sicuro per collaborare con sconosciuti su internet. +summaryPoint3: Un luogo sicuro in cui impegnare fondi per una causa specifica. --- ## Cosa sono le DAO? {#what-are-daos} -Una DAO è un'organizzazione posseduta collettivamente che opera per realizzare una missione condivisa. +Una DAO è un'organizzazione di proprietà collettiva che lavora per una missione condivisa. -Le DAO ci consentono di lavorare con persone con la stessa mentalità provenienti da tutto il mondo, senza doversi fidare di un capo benevolo, per la gestione di fondi od operazioni. Non esiste alcun CEO che possa spendere i fondi secondo i propri capricci, o CFO che possa manipolare i libri contabili. Invece, le regole basate sulla blockchain, integrate nel codice, definiscono il funzionamento dell'organizzazione e come vengono spesi i fondi. +Le DAO ci consentono di lavorare con persone affini in tutto il mondo senza doverci fidare di un leader benevolo per la gestione dei fondi o delle operazioni. Non c'è un CEO che possa spendere i fondi per un capriccio o un CFO che possa manipolare i registri. Invece, regole basate sulla blockchain e integrate nel codice definiscono il funzionamento dell'organizzazione e come vengono spesi i fondi. -Contengono delle tesoriere integrate, a cui nessuno ha l'autorità di accedere senza l'approvazione del gruppo. Le decisioni sono governate da proposte e votazioni, per assicurarsi che tutti nell'organizzazione abbiano voce in capitolo, e che tutto si verifichi in modo trasparente [sulla catena](/glossary/#on-chain). +Hanno tesorerie integrate a cui nessuno ha l'autorità di accedere senza l'approvazione del gruppo. Le decisioni sono governate da proposte e votazioni per garantire che tutti nell'organizzazione abbiano voce in capitolo, e tutto avviene in modo trasparente [on-chain](/glossary/#onchain). ## Perché abbiamo bisogno delle DAO? {#why-dao} -Per avviare un'organizzazione con altre persone quando sono in ballo finanziamenti e denaro occorre riporre molta fiducia nei propri compagni di avventura. Ma è difficile fidarsi di qualcuno con cui hai interagito solo tramite Internet. Con le DAO non occorre fidarsi di nessun altro nel gruppo, bensì solamente del codice DAO, che è al 100% trasparente e verificabile da chiunque. +Avviare un'organizzazione con qualcuno che coinvolge finanziamenti e denaro richiede molta fiducia nelle persone con cui si lavora. Ma è difficile fidarsi di qualcuno con cui si ha interagito solo su internet. Con le DAO non devi fidarti di nessun altro nel gruppo, solo del codice della DAO, che è trasparente al 100% e verificabile da chiunque. -Ciò apre molte opportunità di cooperazione e coordinamento a livello globale. +Questo apre tantissime nuove opportunità per la collaborazione e il coordinamento globale. ### Un confronto {#dao-comparison} -| DAO | Organizzazione tradizionale | -| --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| Di solito orizzontale e completamente democratizzata. | Di solito gerarchica. | -| Votazione richiesta dai membri per l'implementazione di eventuali modifiche. | A seconda della struttura, le modifiche possono essere richieste da una sola parte oppure sottoposte a votazione. | -| Conteggio dei voti e implementazione automatica del risultato senza intermediari. | Se la votazione è consentita, i voti sono conteggiati internamente e l'esito della votazione deve essere gestito manualmente. | -| I servizi offerti vengono gestiti automaticamente in modo decentralizzato (ad esempio distribuzione di fondi filantropici). | Richiede manipolazione umana o automazione controllata centralmente, suscettibile di manipolazione. | -| Tutte le attività sono trasparenti e completamente pubbliche. | L'attività è tipicamente privata e limitata al pubblico. | +| DAO | Un'organizzazione tradizionale | +| ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| Solitamente orizzontale e completamente democratizzata. | Solitamente gerarchica. | +| È richiesta la votazione dei membri per implementare qualsiasi modifica. | A seconda della struttura, le modifiche possono essere richieste da una singola parte, o può essere offerta una votazione. | +| I voti vengono conteggiati e il risultato viene implementato automaticamente senza un intermediario fidato. | Se la votazione è consentita, i voti vengono conteggiati internamente e il risultato della votazione deve essere gestito manualmente. | +| I servizi offerti sono gestiti automaticamente in modo decentralizzato (ad esempio la distribuzione di fondi filantropici). | Richiede la gestione umana, o un'automazione controllata centralmente, soggetta a manipolazione. | +| Tutte le attività sono trasparenti e completamente pubbliche. | Le attività sono tipicamente private e limitate al pubblico. | ### Esempi di DAO {#dao-examples} -Per aiutarti a comprendere meglio, ecco alcuni esempi di come potresti utilizzare una DAO: +Per rendere tutto questo più chiaro, ecco alcuni esempi di come potresti usare una DAO: -- ** Un ente di beneficenza**: puoi accettare donazioni da chiunque nel mondo e votare in merito a quali cause finanziare. -- **Proprietà collettiva**: potresti acquistare beni fisici o digitali e i membri possono votare sul loro utilizzo. -- **Iniziative e sovvenzioni**: potresti creare un fondo di rischio che raggruppa il capitale di investimento e che vota sulle iniziative da finanziare. Il denaro rimborsato potrebbe essere successivamente ridistribuito tra i membri del DAO. +- **Un ente di beneficenza** – potresti accettare donazioni da chiunque nel mondo e votare su quali cause finanziare. +- **Proprietà collettiva** – potresti acquistare asset fisici o digitali e i membri possono votare su come utilizzarli. +- **Iniziative e sovvenzioni** – potresti creare un fondo di venture capital che raccoglie capitale di investimento e vota sulle iniziative da sostenere. Il denaro rimborsato potrebbe poi essere ridistribuito tra i membri della DAO. -## Come funziona la DAO? {#how-daos-work} +## Come funzionano le DAO? {#how-daos-work} -La struttura portante di una DAO è rappresentata dal suo [ contratto intelligente](/glossary/#smart-contract), che definisce le regole dell'organizzazione e detiene il patrimonio del gruppo. Una volta che il contratto è attivo su Ethereum, nessuno può modificare le regole se non tramite voto. Nessuno può fare qualcosa che non sia previsto dalle regole e dalla logica del codice. E poiché anche il patrimonio è definito dal contratto intelligente, ciò significa che nessuno può spendere il denaro senza l'approvazione del gruppo. Questo significa che le DAO non hanno bisogno di un'autorità centrale. Al contrario, il gruppo prende le decisioni collettivamente e i pagamenti sono autorizzati automaticamente quando le proposte sono approvate dal voto. +La spina dorsale di una DAO è il suo [contratto intelligente](/glossary/#smart-contract), che definisce le regole dell'organizzazione e detiene la tesoreria del gruppo. Una volta che il contratto è attivo su [Ethereum](/), nessuno può cambiare le regole se non tramite una votazione. Se qualcuno cerca di fare qualcosa che non è coperto dalle regole e dalla logica nel codice, fallirà. E poiché anche la tesoreria è definita dal contratto intelligente, ciò significa che nessuno può spendere il denaro senza l'approvazione del gruppo. Questo significa che le DAO non hanno bisogno di un'autorità centrale. Invece, il gruppo prende decisioni collettivamente e i pagamenti vengono autorizzati automaticamente quando le votazioni passano. -Ciò è possibile perché i contratti intelligenti sono a prova di manomissione, una volta che sono attivi su Ethereum. Non è possibile modificare il codice (le regole della DAO) senza che gli altri lo notino, perché tutto è pubblico. +Questo è possibile perché i contratti intelligenti sono a prova di manomissione una volta attivi su Ethereum. Non puoi semplicemente modificare il codice (le regole della DAO) senza che le persone se ne accorgano, perché tutto è pubblico. -## Ethereum e DAO {#ethereum-and-daos} +## Ethereum e le DAO {#ethereum-and-daos} Ethereum è la base perfetta per le DAO per una serie di motivi: -- Il consenso di Ethereum è sufficientemente decentralizzato e affermato affinché le organizzazioni possano fidarsi della rete. -- Il codice del contratto intelligente non è modificabile una volta attivato, nemmeno dai suoi proprietari. Ciò permette alla DAO di funzionare secondo le regole con cui è stata programmata. -- I contratti intelligenti possono inviare/ricevere fondi. In caso contrario occorrerebbe un intermediario fidato per gestire i fondi del gruppo. -- La community di Ethereum si è dimostrata più collaborativa che competitiva, consentendo l'emergere rapido di migliori pratiche e sistemi di supporto. +- Il consenso stesso di Ethereum è decentralizzato e sufficientemente consolidato affinché le organizzazioni si fidino della rete. +- Il codice del contratto intelligente non può essere modificato una volta attivo, nemmeno dai suoi proprietari. Questo consente alla DAO di funzionare secondo le regole con cui è stata programmata. +- I contratti intelligenti possono inviare/ricevere fondi. Senza questo, avresti bisogno di un intermediario fidato per gestire i fondi del gruppo. +- La comunità di Ethereum ha dimostrato di essere più collaborativa che competitiva, consentendo l'emergere rapido di migliori pratiche e sistemi di supporto. -## Governance della DAO {#dao-governance} +## Governance delle DAO {#dao-governance} -Ci sono molte considerazioni da fare governando una DAO, ad esempio, come funzionano le votazioni e le proposte. +Ci sono molte considerazioni da fare quando si governa una DAO, come ad esempio il funzionamento delle votazioni e delle proposte. -### Delegazione {#governance-delegation} +### Delega {#governance-delegation} -Una delegazione è la versione della democrazia rappresentativa della DAO. I titolari di token delegano i voti agli utenti da loro stessi nominati e si impegnano a gestire il protocollo e a rimanere informati. +La delega è come la versione DAO della democrazia rappresentativa. I detentori di token delegano i voti agli utenti che si candidano e si impegnano a gestire il protocollo e a rimanere informati. -#### Un celebre esempio {#governance-example} +#### Un esempio famoso {#governance-example} -[ENS](https://claim.ens.domains/delegate-ranking) – I titolari di ENS possono delegare i propri voti a membri impegnati della community perché li rappresentino. +[ENS](https://claim.ens.domains/delegate-ranking) – I detentori di ENS possono delegare i propri voti a membri attivi della comunità affinché li rappresentino. ### Governance automatica delle transazioni {#governance-example} -In molte DAO, le transazioni saranno eseguite automaticamente se un quorum dei membri vota in modo affermativo. +In molte DAO, le transazioni verranno eseguite automaticamente se un quorum di membri vota a favore. -#### Un celebre esempio {#governance-example} +#### Un esempio famoso {#governance-example} -[Nouns](https://nouns.wtf): nelle DAO di Nouns, una transazione viene eseguita automaticamente se viene raggiunto un quorum di voti e la maggioranza di questi è a favore, purché non ci sia un veto da parte dei fondatori. +[Nouns](https://nouns.wtf) – Nella Nouns DAO, una transazione viene eseguita automaticamente se viene raggiunto un quorum di voti e la maggioranza vota a favore, a patto che non venga posto il veto dai fondatori. ### Governance multifirma {#governance-example} -Mentre le DAO potrebbero includere migliaia di membri votanti, i fondi possono esistere in un [portafoglio](/glossary/#wallet) condiviso da 5-20 membri attivi della community ritenuti affidabili e solitamente doxati (identità pubbliche note alla community). In seguito a un voto, i firmatari [multifirma](/glossary/#multisig) eseguono la volontà della community. +Sebbene le DAO possano avere migliaia di membri votanti, i fondi possono risiedere in un [portafoglio](/glossary/#wallet) condiviso da 5-20 membri attivi della comunità che sono fidati e solitamente "doxxati" (identità pubbliche note alla comunità). Dopo una votazione, i firmatari del [multifirma](/glossary/#multisig) eseguono la volontà della comunità. ## Leggi sulle DAO {#dao-laws} -Nel 1977, il Wyoming inventò la LLC, che protegge gli imprenditori e ne limita le responsabilità. Più di recente, lo Stato è stato il pioniere della legge sulle DAO, che stabilisce lo status giuridico delle DAO. Al momento, Wyoming, Vermont e le Isole Vergini hanno una qualche forma di legge sulle DAO. +Nel 1977, il Wyoming ha inventato la LLC (società a responsabilità limitata), che protegge gli imprenditori e limita la loro responsabilità. Più di recente, ha fatto da pioniere per la legge sulle DAO che stabilisce lo status legale per le DAO. Attualmente Wyoming, Vermont e le Isole Vergini hanno leggi sulle DAO in qualche forma. -### Un celebre esempio {#law-example} +### Un esempio famoso {#law-example} -[CityDAO](https://citizen.citydao.io/) – CityDao ha utilizzato la legge sulle DAO del Wyoming per acquistare 40 acri di terreno nei pressi del Parco Nazionale di Yellowstone. +[CityDAO](https://citizen.citydao.io/) – CityDAO ha utilizzato la legge sulle DAO del Wyoming per acquistare 40 acri di terra vicino al Parco Nazionale di Yellowstone. -## Aderire a una DAO {#dao-membership} +## Appartenenza a una DAO {#dao-membership} -Ci sono diversi modelli per aderire a una DAO. L'adesione può determinare come funziona il voto e altri aspetti chiave della DAO. +Esistono diversi modelli per l'appartenenza a una DAO. L'appartenenza può determinare il funzionamento delle votazioni e altre parti chiave della DAO. ### Appartenenza basata su token {#token-based-membership} -In genere è completamente [senza permessi](/glossary/#permissionless), a seconda del token utilizzato. Questi token di governance possono essere per lo più scambiati senza permessi su una [borsa decentralizzata](/glossary/#dex). Altri, invece, devono esser guadagnati fornendo liquidità o altri tipi di "Proof of Work". In entrambi i casi, la semplice detenzione del token garantisce l'accesso al voto. +Solitamente completamente [senza permessi](/glossary/#permissionless), a seconda del token utilizzato. Per lo più, questi token di governance possono essere scambiati senza permessi su un [exchange decentralizzato](/glossary/#dex). Altri devono essere guadagnati fornendo liquidità o tramite qualche altra "prova di lavoro". In ogni caso, il semplice possesso del token garantisce l'accesso al voto. -_Di solito usato per governare ampi protocolli decentralizzati e/o i token stessi._ +_Tipicamente utilizzata per governare ampi protocolli decentralizzati e/o i token stessi._ -#### Un celebre esempio {#token-example} +#### Un esempio famoso {#token-example} -[MakerDAO](https://makerdao.com) – Il token MKR di MakerDAO è ampiamente disponibile sulle borse decentralizzate e chiunque può acquistare il potere di voto sul futuro del protocollo di Maker. +[MakerDAO](https://makerdao.com) – Il token MKR di MakerDAO è ampiamente disponibile sugli exchange decentralizzati e chiunque può acquistarlo per avere potere di voto sul futuro del protocollo Maker. ### Appartenenza basata su quote {#share-based-membership} -I DAO basati su quote sono maggiormente soggetti a permessi, ma comunque abbastanza aperti. Tutti i potenziali membri possono inviare una proposta di adesione alla DAO, solitamente offrendo un tributo di qualche valore sotto forma di token o di lavoro. Le quote rappresentano il potere di voto diretto e la proprietà. I membri possono uscire in qualsiasi momento con la propria quota proporzionale del patrimonio. +Le DAO basate su quote sono più autorizzate (permissioned), ma comunque piuttosto aperte. Qualsiasi potenziale membro può presentare una proposta per unirsi alla DAO, offrendo solitamente un tributo di un certo valore sotto forma di token o lavoro. Le quote rappresentano il potere di voto diretto e la proprietà. I membri possono uscire in qualsiasi momento con la loro quota proporzionale della tesoreria. -_In genere usato per organizzazioni più compatte e incentrate sul fattore umano, come enti di beneficenza, collettivi di lavoratori e club di investimento. Può anche governare protocolli e token._ +_Tipicamente utilizzata per organizzazioni più unite e incentrate sull'uomo, come enti di beneficenza, collettivi di lavoratori e club di investimento. Può anche governare protocolli e token._ -#### Un celebre esempio {#share-example} +#### Un esempio famoso {#share-example} -[MolochDAO](http://molochdao.com/): MolochDAO si concentra sul finanziamento dei progetti su Ethereum. Richiede una proposta di adesione in modo che il gruppo possa valutare se il richiedente ha la competenza e il capitale necessari per formulare giudizi informati sui potenziali beneficiari. Non si può semplicemente acquistare l'accesso al DAO sul mercato. +[MolochDAO](http://molochdao.com/) – MolochDAO si concentra sul finanziamento di progetti Ethereum. Richiedono una proposta di adesione in modo che il gruppo possa valutare se si possiedono le competenze e il capitale necessari per esprimere giudizi informati sui potenziali beneficiari. Non è possibile acquistare semplicemente l'accesso alla DAO sul mercato aperto. ### Appartenenza basata sulla reputazione {#reputation-based-membership} -La reputazione rappresenta la prova di partecipazione e conferisce potere di voto nella DAO. A differenza dell'adesione basata sui token o sulle quote, le DAO basate sulla reputazione non trasferiscono la proprietà ai collaboratori. La reputazione non può esser comprata, trasferita o delegata; i membri della DAO devono ottenere la reputazione tramite la loro partecipazione. Il voto sulla blockchain è privo di permessi e i potenziali membri possono inviare liberamente proposte per aderire alla DAO e richiedere di ricevere reputazione e token come ricompensa in cambio dei loro contributi. +La reputazione rappresenta la prova di partecipazione e garantisce potere di voto nella DAO. A differenza dell'appartenenza basata su token o quote, le DAO basate sulla reputazione non trasferiscono la proprietà ai contributori. La reputazione non può essere acquistata, trasferita o delegata; i membri della DAO devono guadagnarsi la reputazione attraverso la partecipazione. La votazione on-chain è senza permessi e i potenziali membri possono presentare liberamente proposte per unirsi alla DAO e richiedere di ricevere reputazione e token come ricompensa in cambio dei loro contributi. -_Sono tipicamente utilizzate per lo sviluppo e governance decentralizzati di protocolli e [dapp](/glossary/#dapp), ma si adattano bene anche ad una vasta gamma di organizzazioni, quali enti di beneficenza, collettivi di lavoratori, club di investimento, ecc._ +_Tipicamente utilizzata per lo sviluppo decentralizzato e la governance di protocolli e [dApp](/glossary/#dapp), ma anche ben adatta a un insieme diversificato di organizzazioni come enti di beneficenza, collettivi di lavoratori, club di investimento, ecc._ -#### Un celebre esempio {#reputation-example} +#### Un esempio famoso {#reputation-example} -[DXdao](https://DXdao.eth.limo): DXdao è un collettivo sovrano globale che dal 2019 crea e amministra protocolli e applicazioni decentralizzati. Ha sfruttato la governance basata sulla reputazione e il [consenso olografico](/glossary/#holographic-consensus) per coordinare e gestire i fondi, il che significa che nessuno poteva farsi strada per influenzarne il futuro o la governance. +[DXdao](https://DXdao.eth.limo) – DXdao è stato un collettivo sovrano globale che ha costruito e governato protocolli e applicazioni decentralizzate dal 2019. Ha sfruttato la governance basata sulla reputazione e il [consenso olografico](/glossary/#holographic-consensus) per coordinare e gestire i fondi, il che significa che nessuno poteva comprare la propria influenza sul suo futuro o sulla sua governance. -## Aderisci a / Crea una DAO {#join-start-a-dao} +## Unisciti / avvia una DAO {#join-start-a-dao} -### Entra a far parte di una DAO {#join-a-dao} +### Unisciti a una DAO {#join-a-dao} -- [Community di Ethereum](/community/get-involved/#decentralized-autonomous-organizations-daos) -- [Lista delle DAO di DAOHaus](https://app.daohaus.club/explore) -- [Elenco di DAO di Tally.xyz](https://www.tally.xyz) +- [DAO della comunità di Ethereum](/community/get-involved/#decentralized-autonomous-organizations-daos) +- [Elenco di DAO di DAOHaus](https://app.daohaus.club/explore) +- [Elenco di DAO di Tally.xyz](https://www.tally.xyz/explore) +- [Elenco di DAO di DeGov.AI](https://apps.degov.ai/) -### Crea una DAO {#start-a-dao} +### Avvia una DAO {#start-a-dao} - [Evoca una DAO con DAOHaus](https://app.daohaus.club/summon) -- [Crea una DAO di Governance con Tally](https://www.tally.xyz/add-a-dao) +- [Avvia una Governor DAO con Tally](https://www.tally.xyz/get-started) - [Crea una DAO basata su Aragon](https://aragon.org/product) -- [Avvia una colonia](https://colony.io/) +- [Avvia una colony](https://colony.io/) - [Crea una DAO con il consenso olografico di DAOstack](https://alchemy.daostack.io/daos/create) +- [Lancia una DAO con il DeGov Launcher](https://docs.degov.ai/integration/deploy) ## Letture consigliate {#further-reading} ### Articoli sulle DAO {#dao-articles} -- [Che cos'è una DAO?](https://aragon.org/dao) – [Aragon](https://aragon.org/) -- [La casa delle DAO](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) -- [Che cos'è una DAO e a cosa serve?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) +- [Cos'è una DAO?](https://aragon.org/dao) – [Aragon](https://aragon.org/) +- [House of DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) +- [Cos'è una DAO e a cosa serve?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) - [Come avviare una comunità digitale basata su DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) -- [Che cos'è una DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) +- [Cos'è una DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Cos'è il consenso olografico?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [Le DAO non sono società: dove è importante la decentralizzazione nelle organizzazioni autonome, di Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) -- [DAO, DAC, DA e altro: una guida incompleta alla terminologia](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog di Ethereum](https://blog.ethereum.org) +- [Le DAO non sono corporazioni: dove conta la decentralizzazione nelle organizzazioni autonome, di Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) +- [DAO, DAC, DA e altro: una guida terminologica incompleta](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog di Ethereum](https://blog.ethereum.org) ### Video {#videos} -- [Che cos'è una DAO nel mondo delle criptovalute?](https://youtu.be/KHm0uUPqmVE) +- [Cos'è una DAO nelle criptovalute?](https://youtu.be/KHm0uUPqmVE) - [Può una DAO costruire una città?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) - + \ No newline at end of file diff --git a/public/content/translations/it/decentralized-identity/index.md b/public/content/translations/it/decentralized-identity/index.md index 75457fe89fd..2681cdbb042 100644 --- a/public/content/translations/it/decentralized-identity/index.md +++ b/public/content/translations/it/decentralized-identity/index.md @@ -1,191 +1,218 @@ --- -title: Identità decentralizzata -description: Cos'è l'identità decentralizzata e perché è importante? +title: "Identità decentralizzata" +description: "Cos'è l'identità decentralizzata e perché è importante?" lang: it template: use-cases emoji: ":id:" sidebarDepth: 2 image: /images/eth-gif-cat.png -summaryPoint1: I sistemi di identità tradizionali hanno centralizzato l'emissione, manutenzione e controllo dei tuoi identificativi. -summaryPoint2: L'identità decentralizzata rimuove la dipendenza da terze parti centralizzate. -summaryPoint3: Grazie alle cripto, gli utenti, ora, hanno nuovamente gli strumenti per emettere, detenere e controllare i propri identificativi e attestazioni. +summaryPoint1: "I sistemi di identità tradizionali hanno centralizzato l'emissione, la manutenzione e il controllo dei tuoi identificatori." +summaryPoint2: "L'identità decentralizzata rimuove la dipendenza da terze parti centralizzate." +summaryPoint3: Grazie alle criptovalute, gli utenti ora hanno di nuovo gli strumenti per emettere, detenere e controllare i propri identificatori e attestazioni. --- -L'identità è virtualmente alla base di ogni aspetto della tua vita quotidiana. Utilizzare servizi online, aprire un conto bancario, votare alle elezioni, acquistare proprietà, garantire l'occupazione; tutte queste cose richiedono di dimostrare la propria identità. +L'identità è alla base di quasi ogni aspetto della tua vita oggi. Usare servizi online, aprire un conto bancario, votare alle elezioni, comprare proprietà, assicurarsi un impiego: tutte queste cose richiedono di provare la propria identità. -Tuttavia, i sistemi tradizionali di gestione dell'identità si sono affidati a lungo a intermediari centralizzati che emettono, detengono e controllano i tuoi identificativi e le tue [attestazioni](/glossary/#attestation). Ciò significa che non puoi controllare le informazioni sulla tua identità, o decidere chi abbia accesso alle tue informazioni personalmente identificabili (PII), né quanto accesso abbiano tali parti. +Tuttavia, i sistemi tradizionali di gestione dell'identità si sono a lungo affidati a intermediari centralizzati che emettono, detengono e controllano i tuoi identificatori e le tue [attestazioni](/glossary/#attestation). Ciò significa che non puoi controllare le informazioni relative alla tua identità o decidere chi ha accesso alle informazioni di identificazione personale (PII) e quanto accesso abbiano queste parti. -Per risolvere questi problemi, abbiamo sistemi di identità decentralizzati, integrati sulle blockchain pubbliche come Ethereum. L'identità decentralizzata consente agli individui di gestire le proprie informazioni di identità. Con le soluzioni di identità decentralizzata, _tu_ puoi creare identificativi, rivendicando e detenendo le tue attestazioni, senza affidarti ad autorità centrali, quali fornitori di servizi o governi. +Per risolvere questi problemi, abbiamo sistemi di identità decentralizzata costruiti su blockchain pubbliche come [Ethereum](/). L'identità decentralizzata consente agli individui di gestire le informazioni relative alla propria identità. Con le soluzioni di identità decentralizzata, _tu_ puoi creare identificatori e rivendicare e detenere le tue attestazioni senza fare affidamento su autorità centrali, come fornitori di servizi o governi. ## Cos'è l'identità? {#what-is-identity} -L'identità indica il senso di sé della persona, definito da caratteristiche uniche. L'identità si riferisce all'essere un _individuo_, cioè, un'entità umana distinta. L'identità, inoltre, potrebbe riferirsi ad altre entità non umane, come un'organizzazione o un'autorità. +L'identità indica il senso di sé di un individuo, definito da caratteristiche uniche. L'identità si riferisce all'essere un _individuo_, cioè un'entità umana distinta. L'identità potrebbe anche riferirsi ad altre entità non umane, come un'organizzazione o un'autorità. -## Cosa sono gli identificativi? {#what-are-identifiers} +## Cosa sono gli identificatori? {#what-are-identifiers} -Un identificativo è un'informazione che funge puntatore verso una o più identità specifiche. Tra gli identificativi comuni vi sono: +Un identificatore è un'informazione che funge da puntatore a una o più identità particolari. Gli identificatori comuni includono: - Nome -- Codice fiscale/partita IVA -- Numero telefonico +- Codice fiscale/numero di previdenza sociale +- Numero di cellulare - Data e luogo di nascita -- Credenziali identificative digitali, come indirizzi email, nomi utente, avatar +- Credenziali di identificazione digitale, ad es. indirizzi e-mail, nomi utente, avatar -Questi esempi tradizionali di identificativi sono emessi, detenuti e controllati da entità centrali. Ti serve l'autorizzazione dal tuo governo per modificare il tuo nome o, da una piattaforma social, modificare il tuo pseudonimo. +Questi esempi tradizionali di identificatori sono emessi, detenuti e controllati da entità centrali. Hai bisogno del permesso del tuo governo per cambiare il tuo nome o di una piattaforma di social media per cambiare il tuo handle. -## Benefici dell'identità decentralizzata {#benefits-of-decentralized-identity} +## Vantaggi dell'identità decentralizzata {#benefits-of-decentralized-identity} -1. L'identità decentralizzata aumenta il controllo individuale sulle informazioni identificative. Le attestazioni e gli identificativi decentralizzati sono verificabili senza affidarsi ad autorità centrali e servizi di terze parti. +1. L'identità decentralizzata aumenta il controllo individuale delle informazioni identificative. Gli identificatori e le attestazioni decentralizzati possono essere verificati senza fare affidamento su autorità centralizzate e servizi di terze parti. -2. Le soluzioni di identità facilitano un metodo affidabile, semplice e che protegge la privacy, per verificare e gestire l'identità dell'utente. +2. Le soluzioni di identità decentralizzata facilitano un metodo trustless, fluido e che protegge la privacy per verificare e gestire l'identità dell'utente. -3. L'identità decentralizzata sfrutta la tecnologia della blockchain, che crea fiducia tra parti differenti, fornendo garanzie crittografiche, per dimostrare la validità delle attestazioni. +3. L'identità decentralizzata sfrutta la tecnologia blockchain, che crea fiducia tra le diverse parti e fornisce garanzie crittografiche per provare la validità delle attestazioni. -4. L'identità decentralizzata rende portatili i dati d'identità. Gli utenti memorizzano gli identificativi e le attestazioni nel portafoglio mobile, e possono condividerli con qualsiasi parte di loro scelta. Le attestazioni e gli identificativi decentralizzati non sono bloccati nel database dell'organizzazione emittente. +4. L'identità decentralizzata rende portatili i dati di identità. Gli utenti memorizzano attestazioni e identificatori in un portafoglio mobile e possono condividerli con qualsiasi parte di loro scelta. Gli identificatori e le attestazioni decentralizzati non sono bloccati nel database dell'organizzazione emittente. -5. L'identità decentralizzata dovrebbe funzionare bene con le emergenti tecnologie [a conoscenza zero](/glossary/#zk-proof), che consentiranno alle persone di dimostrare di possedere o aver fatto qualcosa senza rivelare di cosa si tratti. Questo potrebbe divenire un potente metodo per combinare fiducia e privacy per le applicazioni, ad esempio, per le votazioni. +5. L'identità decentralizzata dovrebbe funzionare bene con le tecnologie emergenti a [conoscenza-zero](/glossary/#zk-proof) che consentiranno agli individui di dimostrare di possedere o aver fatto qualcosa senza rivelare cosa sia quella cosa. Questo potrebbe diventare un modo potente per combinare fiducia e privacy per applicazioni come il voto. -6. L'identità decentralizzata consente ai meccanismi [anti-Sybil](/glossary/#anti-sybil) di individuare quando una persona sta fingendo di essere più persone per imbrogliare o spammare un qualche sistema. +6. L'identità decentralizzata abilita meccanismi [anti-Sybil](/glossary/#anti-sybil) per identificare quando un singolo essere umano finge di essere più esseri umani per manipolare o spammare un sistema. ## Casi d'uso dell'identità decentralizzata {#decentralized-identity-use-cases} -L'identità decentralizzata ha molti possibili casi d'uso: +L'identità decentralizzata ha molti potenziali casi d'uso: ### 1. Accessi universali {#universal-dapp-logins} -L'identità decentralizzata può contribuire a sostituire gli accessi basati su password con l'autenticazione decentralizzata. I fornitori di servizi possono emettere attestazioni agli utenti, memorizzabili in un portafoglio di Ethereum. Un esempio di attestazione potrebbe essere un [NFT](/glossary/#nft) che concede al titolare l'accesso a una community online. +L'identità decentralizzata può aiutare a sostituire gli accessi basati su password con l'autenticazione decentralizzata. I fornitori di servizi possono emettere attestazioni agli utenti, che possono essere memorizzate in un portafoglio Ethereum. Un esempio di attestazione sarebbe un [NFT](/glossary/#nft) che garantisce al titolare l'accesso a una comunità online. -Una funzionalità "[Accedi con Ethereum](https://siwe.xyz/)", consentirebbe poi ai server di confermare il conto di Ethereum dell'utente, e di recuperare l'attestazione necessaria dal relativo indirizzo del conto. Ciò significa che gli utenti possono accedere a piattaforme e siti web, senza dover memorizzare lunghe password, migliorando l'esperienza online degli utenti. +Una funzione [Sign-In with Ethereum](https://siwe.xyz/) consentirebbe quindi ai server di confermare l'account Ethereum dell'utente e recuperare l'attestazione richiesta dal suo indirizzo dell'account. Ciò significa che gli utenti possono accedere a piattaforme e siti web senza dover memorizzare lunghe password e migliora l'esperienza online per gli utenti. ### 2. Autenticazione KYC {#kyc-authentication} -Utilizzare molti servizi online, impone agli individui di fornire attestazioni e credenziali, come una patente di guida o un passaporto nazionale. Tuttavia, questo approccio è problematico poiché le informazioni private di un utente possono essere compromesse e, i fornitori di servizi, potrebbero non riuscire a verificare l'autenticità dell'attestazione. +L'utilizzo di molti servizi online richiede agli individui di fornire attestazioni e credenziali, come una patente di guida o un passaporto nazionale. Ma questo approccio è problematico perché le informazioni private degli utenti possono essere compromesse e i fornitori di servizi non possono verificare l'autenticità dell'attestazione. -L'identità decentralizzata consente alle aziende di saltare i convenzonali processi di [KYC, ossia Know-Your-Customer (Verifica della Clientela)](https://en.wikipedia.org/wiki/Know_your_customer) e di autenticare le identtà degli utenti tramite le Credenziali Verificabili. Ciò riduce i costi di gestione dell'identità, impedendo l'utilizzo di documenti falsi. +L'identità decentralizzata consente alle aziende di saltare i processi convenzionali di [Know-Your-Customer (KYC)](https://en.wikipedia.org/wiki/Know_your_customer) e autenticare le identità degli utenti tramite Credenziali Verificabili. Ciò riduce i costi di gestione dell'identità e previene l'uso di documentazione falsa. -### 3. Voti e community online {#voting-and-online-communities} +### 3. Voto e comunità online {#voting-and-online-communities} -Il voto online e i social, sono due applicazioni innovative per l'identità decentralizzata. Gli schemi di voto online sono suscettibili alla manipolazione, specialmente se degli utenti malevoli creano delle identità false per votare. Chiedere agli individui di presentare le attestazioni sulla catena, può migliorare l'integrità dei processi di voto online. +Il voto online e i social media sono due nuove applicazioni per l'identità decentralizzata. I sistemi di voto online sono suscettibili di manipolazione, specialmente se attori malintenzionati creano false identità per votare. Chiedere agli individui di presentare attestazioni on-chain può migliorare l'integrità dei processi di voto online. -L'identità decentralizzata può aiutare a creare delle community online prive di conti falsi. Ad esempio, ogni utente potrebbe dover autenticare la propria identità tramite un sistema di identità sulla catena, come il Servizio del Nome di Ethereum, riducendo la possibile presenza di bot. +L'identità decentralizzata può aiutare a creare comunità online prive di account falsi. Ad esempio, ogni utente potrebbe dover autenticare la propria identità utilizzando un sistema di identità on-chain, come l'Ethereum Name Service, riducendo la possibilità di bot. -### 4. Protezione Anti-Sybil {#sybil-protection} +### 4. Protezione anti-Sybil {#sybil-protection} -Le applicazioni di concessione di sovvenzioni che utilizzano il [voto quadratico](/glossary/#quadratic-voting) sono vulnerabili agli [attacchi Sybil](/glossary/#sybil-attack) poiché il valore di una sovvenzione viene incrementato all'aumentare delle persone che votano, incentivando gli utenti a dividere i propri contributi tra più identità. Le identità decentralizzate aiutano a prevenirli, incrementando l'onere su ogni partecipante, per dimostrare che siano realmente umani, sebbene spesso senza dover rilevare informazioni private specifiche. +Le applicazioni di erogazione di sovvenzioni che utilizzano il [voto quadratico](/glossary/#quadratic-voting) sono vulnerabili agli [attacchi Sybil](/glossary/#sybil-attack) perché il valore di una sovvenzione aumenta quando più individui votano per essa, incentivando gli utenti a dividere i loro contributi su molte identità. Le identità decentralizzate aiutano a prevenire questo aumentando l'onere per ogni partecipante di dimostrare di essere veramente umano, sebbene spesso senza dover rivelare informazioni private specifiche. + +### 5. Documenti d'identità nazionali e governativi {#national-and-government-id} + +I governi possono utilizzare i principi dell'identità decentralizzata per emettere documenti d'identità fondamentali, come carte d'identità nazionali, passaporti o patenti di guida, come credenziali verificabili su Ethereum, fornendo forti garanzie crittografiche di autenticità per ridurre le frodi e le falsificazioni nella verifica dell'identità online. I cittadini possono conservare queste attestazioni nel loro [portafoglio](/wallets/) personale e usarle per dimostrare la loro identità, età o diritto di voto. + +Questo modello consente la divulgazione selettiva, specialmente se combinato con la tecnologia per la privacy a [conoscenza-zero (ZKP)](/zero-knowledge-proofs/). Ad esempio, un cittadino potrebbe dimostrare crittograficamente di avere più di 18 anni per accedere a un servizio con limiti di età senza rivelare la sua data di nascita esatta, offrendo una maggiore privacy rispetto a un documento d'identità tradizionale. + +#### 💡Caso di studio: Bhutan National Digital ID (NDI) su Ethereum {#case-study-bhutan-ndi} + +- Fornisce accesso a credenziali di identità verificabili per i quasi 800.000 cittadini del Bhutan +- Migrato dalla rete Polygon [alla rete principale di Ethereum](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) nell'ottobre 2025 +- Oltre [234.000 ID digitali](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/) emessi a partire da marzo 2025 + +Il Regno del Bhutan [ha migrato il suo sistema di Identità Digitale Nazionale (NDI)](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) su Ethereum nell'ottobre 2025. Costruito sui principi dell'identità decentralizzata e dell'identità auto-sovrana, il sistema NDI del Bhutan utilizza identificatori decentralizzati e credenziali verificabili per emettere credenziali firmate digitalmente direttamente nel portafoglio personale di un cittadino. Ancorando le prove crittografiche di queste credenziali su Ethereum, il sistema garantisce che siano autentiche, a prova di manomissione e possano essere verificate da qualsiasi parte senza interrogare un'autorità centrale. + +L'architettura del sistema enfatizza la privacy attraverso l'uso della tecnologia a [conoscenza-zero (ZKP)](/zero-knowledge-proofs/). Questa implementazione della "divulgazione selettiva" consente ai cittadini di dimostrare fatti specifici (ad es. "Ho più di 18 anni" o "Sono un cittadino") per accedere ai servizi senza rivelare i dati personali sottostanti, come il loro numero di carta d'identità completo o la data di nascita esatta. Questo dimostra un uso potente e nel mondo reale di Ethereum per un sistema di identità nazionale sicuro, incentrato sull'utente e che preserva la privacy. + +#### 💡Caso di studio: QuarkID della Città di Buenos Aires sul [Livello 2](/layer-2/) di Ethereum ZKSync Era {#case-study-buenos-aires-quarkid} + +- Emesse credenziali di identità decentralizzata a oltre [3,6 milioni di utenti](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo) al lancio +- QuarkID è un protocollo open-source riconosciuto come [Bene Pubblico Digitale](https://www.digitalpublicgoods.net/r/quarkid) nell'ambito degli Obiettivi di Sviluppo Sostenibile delle Nazioni Unite +- Enfatizza un modello di "[governo come utente](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)", in cui la città non possiede il protocollo, dando ai cittadini la piena proprietà dei dati e la privacy + +Nel 2024, il Governo della Città di Buenos Aires (GCBA) ha integrato QuarkID, il "framework di fiducia digitale" open-source costruito dal Segretariato per l'Innovazione e la Trasformazione Digitale del GCBA, in miBA, l'app ufficiale della città per i residenti per accedere ai servizi governativi e ai documenti ufficiali. Al lancio, a tutti gli oltre 3,6 milioni di utenti di miBA sono state rilasciate identità digitali decentralizzate che consentono loro di gestire e condividere documenti e certificati digitali verificabili on-chain, tra cui credenziali di cittadinanza, certificati di nascita, matrimonio e morte, documenti fiscali, libretti di vaccinazione e altro ancora. + +Costruito sulla rete di [Livello 2](/layer-2/) di Ethereum ZKSync Era, il sistema QuarkID utilizza la tecnologia ZKP per consentire ai cittadini di verificare le credenziali personali peer-to-peer attraverso i loro dispositivi mobili—senza esporre dati personali non necessari. Il programma evidenzia un modello di "governo come utente" in cui il GCBA agisce come un utente del protocollo QuarkID open-source e interoperabile, piuttosto che agire come un proprietario centralizzato. Questa architettura abilitata per ZKP fornisce una caratteristica chiave per la privacy: nessuna terza parte, nemmeno il GCBA, può tracciare come, quando o perché un cittadino utilizza le proprie credenziali. Questo programma di successo fornisce ai cittadini una piena identità auto-sovrana e il controllo sui loro dati sensibili, il tutto protetto dalla rete distribuita a livello globale di Ethereum. ## Cosa sono le attestazioni? {#what-are-attestations} -Un'attestazione, è una dichiarazione effettuata da un'entità, in merito a un'altra entità. Se vivi in Italia, la patente di guida rilasciata dal Dipartimento dei Trasporti Terrestri (un'entità), attesta che tu (un'altra entità), sei legalmente autorizzato a guidare un'auto. +Un'attestazione è una dichiarazione fatta da un'entità su un'altra entità. Se vivi negli Stati Uniti, la patente di guida rilasciata dal Dipartimento della Motorizzazione Civile (un'entità) attesta che tu (un'altra entità) sei legalmente autorizzato a guidare un'auto. -Le attestazioni sono differenti dagli identificativi. Un'attestazione _contiene_ degli identificativi, riferiti a un'identità in particolare, ed effettua una dichiarazione su di un attributo, relativo a tale identità. Quindi, la tua patente di guida contiene degli identificativi (nome, data di nascita, indirizzo), ma è anche l'attestazione sul tuo diritto legale alla guida. +Le attestazioni sono diverse dagli identificatori. Un'attestazione _contiene_ identificatori per fare riferimento a una particolare identità e fa una dichiarazione su un attributo relativo a questa identità. Quindi, la tua patente di guida ha degli identificatori (nome, data di nascita, indirizzo) ma è anche l'attestazione del tuo diritto legale di guidare. -### Cosa sono gli identificativi decentralizzati? {#what-are-decentralized-identifiers} +### Cosa sono gli identificatori decentralizzati? {#what-are-decentralized-identifiers} -Gli identificativi tradizionali, come il tuo nome legale o l'indirizzo email, si affidano a terze parti: governi e fornitori di email. Gli identificativi decentralizzati (DID), sono differenti: non sono emessi, gestiti o controllati da alcuna entità centrale. +Gli identificatori tradizionali come il tuo nome legale o l'indirizzo e-mail si basano su terze parti: governi e fornitori di e-mail. Gli identificatori decentralizzati (DID) sono diversi: non sono emessi, gestiti o controllati da alcuna entità centrale. -Gli identificativi decentralizzati sono emessi, detenuti e controllati dagli individui. Un [conto di Ethereum](/glossary/#account) è un esempio di identificativo decentralizzato. Puoi creare quanti conti desideri senza l'autorizzazione di nessuno e senza doverli memorizzare in un registro centrale. +Gli identificatori decentralizzati sono emessi, detenuti e controllati dagli individui. Un [account](/glossary/#account) Ethereum è un esempio di identificatore decentralizzato. Puoi creare tutti gli account che vuoi senza il permesso di nessuno e senza la necessità di memorizzarli in un registro centrale. -Gli identificativi decentralizzati sono memorizzati su libri mastri distribuiti ([blockchain](/glossary/#blockchain)) o su [reti peer-to-peer](/glossary/#peer-to-peer-network). Ciò rende i DID [unici a livello globale, risolvibili con elevata disponibilità e crittograficamente verificabili](https://w3c-ccg.github.io/did-primer/). Un identificativo decentralizzato può essere associato a diverse entità, tra cui persone, organizzazioni, o istituzioni governative. +Gli identificatori decentralizzati sono memorizzati su registri distribuiti ([blockchain](/glossary/#blockchain)) o [reti peer-to-peer](/glossary/#peer-to-peer-network). Questo rende i DID [globalmente unici, risolvibili con alta disponibilità e verificabili crittograficamente](https://w3c-ccg.github.io/did-primer/). Un identificatore decentralizzato può essere associato a diverse entità, tra cui persone, organizzazioni o istituzioni governative. -## Cosa rende possibili gli identificativi decentralizzati? {#what-makes-decentralized-identifiers-possible} +## Cosa rende possibili gli identificatori decentralizzati? {#what-makes-decentralized-identifiers-possible} ### 1. Crittografia a chiave pubblica {#public-key-cryptography} -La crittografia a chiave pubblica è una misura di sicurezza informatica che genera una [chiave pubblica](/glossary/#public-key) e una [chiave privata](/glossary/#private-key) per un'entità. La [crittografia](/glossary/#cryptography) a chiave pubblica è utilizzata nelle reti blockchain per autenticare le identità degli utenti e dimostrare la proprietà delle risorse digitali. +La crittografia a chiave pubblica è una misura di sicurezza delle informazioni che genera una [chiave pubblica](/glossary/#public-key) e una [chiave privata](/glossary/#private-key) per un'entità. La [crittografia](/glossary/#cryptography) a chiave pubblica è utilizzata nelle reti blockchain per autenticare le identità degli utenti e dimostrare la proprietà delle risorse digitali. -Alcuni identificativi decentralizzati, come un conto di Ethereum, includono chiavi pubbliche e private. La chiave pubblica identifica chi controlla il conto, mentre le chiavi private possono firmare e decrittografare i messaggi per tale conto. La crittografia a chiave pubblica fornisce le prove necessarie per autenticare le entità, oltre a prevenire i furti d'identità e l'utilizzo di false identità, utilizzando le [firme crittografiche](https://andersbrownworth.com/blockchain/public-private-keys/) per verificare tutte le dichiarazioni. +Alcuni identificatori decentralizzati, come un account Ethereum, hanno chiavi pubbliche e private. La chiave pubblica identifica il controllore dell'account, mentre le chiavi private possono firmare e decrittografare i messaggi per questo account. La crittografia a chiave pubblica fornisce le prove necessarie per autenticare le entità e prevenire l'impersonificazione e l'uso di identità false, utilizzando [firme crittografiche](https://andersbrownworth.com/blockchain/public-private-keys/) per verificare tutte le dichiarazioni. -### 2. Datastore decentralizzati {#decentralized-datastores} +### 2. Archivi di dati decentralizzati {#decentralized-datastores} -Una blockchain funge da registro di dati verificabili: una repository di informazioni aperta, affidabile e decentralizzata. L'esistenza delle blockchain pubbliche elimina l'esigenza di memorizzare gli identificativi nei registri centralizzati. +Una blockchain funge da registro di dati verificabile: un archivio di informazioni aperto, trustless e decentralizzato. L'esistenza di blockchain pubbliche elimina la necessità di memorizzare gli identificatori in registri centralizzati. -Se qualcuno deve confermare la validità di un identificativo decentralizzato, può consultare la chiave pubblica associata sulla blockchain. Ciò differisce dagli identificativi tradizionali, che richiedono l'autenticazione da parte di terzi. +Se qualcuno ha bisogno di confermare la validità di un identificatore decentralizzato, può cercare la chiave pubblica associata sulla blockchain. Questo è diverso dagli identificatori tradizionali che richiedono l'autenticazione di terze parti. -## Come fanno le attestazioni e gli identificativi decentralizzati a consentire l'identità decentralizzata? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} +## In che modo gli identificatori e le attestazioni decentralizzati abilitano l'identità decentralizzata? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} -L'identità decentralizzata è l'idea che le informazioni sull'identità dovrebbero essere controllate dall'individuo, private e portatili, con attestazioni e identificativi decentralizzati come blocchi di costruzione principali. +L'identità decentralizzata è l'idea che le informazioni relative all'identità dovrebbero essere auto-controllate, private e portatili, con gli identificatori e le attestazioni decentralizzati che ne costituiscono i mattoni principali. -Nel contesto dell'identità decentralizzata, le attestazioni (anche note come [Credenziali Verificabili](https://www.w3.org/TR/vc-data-model/)), sono a prova di manomissione, dichiarazioni crittograficamente verificabili, create dall'emittente. Ogni attestazione, o Credenziale Verificabile, emessa da un'entità (es., un'organizzazione), è assocata al suo DID. +Nel contesto dell'identità decentralizzata, le attestazioni (note anche come [Credenziali Verificabili](https://www.w3.org/TR/vc-data-model/)) sono dichiarazioni a prova di manomissione e verificabili crittograficamente fatte dall'emittente. Ogni attestazione o Credenziale Verificabile che un'entità (ad es. un'organizzazione) emette è associata al suo DID. -Poiché i DID sono memorizzati sulla blockchain, chiunque può verificare la validità di un'attestazione, tramite la verifica incrociata del DID dell'emittente, su Ethereum. Essenzialmente, la blockchain di Ethereum agisce da cartella globale, che consente la verifica dei DID associati a certe entità. +Poiché i DID sono memorizzati sulla blockchain, chiunque può verificare la validità di un'attestazione incrociando il DID dell'emittente su Ethereum. Essenzialmente, la blockchain di Ethereum agisce come una directory globale che consente la verifica dei DID associati a determinate entità. -Gli identificativi decentralizzati sono il motivo per cui le attestazioni sono controllate dagli individui e verificabili. Anche se l'emittente non esiste più, il titolare avrà sempre la prova della provenienza e validità dell'attestazione. +Gli identificatori decentralizzati sono il motivo per cui le attestazioni sono auto-controllate e verificabili. Anche se l'emittente non esiste più, il titolare ha sempre la prova della provenienza e della validità dell'attestazione. -Inoltre, gli identificativi decentralizzati sono fondamentali per la protezione della privacy delle informazioni personali, tramite l'identità decentralizzata. Ad esempio, se un individuo invia la prova di un'attestazione (una patente di guida), la parte che verifica non necessita di controllare la validità delle informazioni nella prova. Invece, chi verifica necessita soltanto delle garanzie crittografiche dell'autenticità dell'attestazione, e dell'identità dell'organizzazione emittente, per determinare se la prova sia valida. +Gli identificatori decentralizzati sono anche cruciali per proteggere la privacy delle informazioni personali attraverso l'identità decentralizzata. Ad esempio, se un individuo presenta la prova di un'attestazione (una patente di guida), la parte verificatrice non ha bisogno di controllare la validità delle informazioni nella prova. Invece, il verificatore ha solo bisogno di garanzie crittografiche dell'autenticità dell'attestazione e dell'identità dell'organizzazione emittente per determinare se la prova è valida. ## Tipi di attestazioni nell'identità decentralizzata {#types-of-attestations-in-decentralized-identity} -Le modalità di memorizzazione e recupero delle informazioni sull'attestazione, nell'ecosistema delle identità basato su Ethereum, differiscono dalla gestione tradizionale delle identità. Ecco una panoramica dei vari approcci all'emissione, memorizzazione e verifica delle attestazioni, nei sistemi di identità decentralizzati: +Il modo in cui le informazioni di attestazione vengono memorizzate e recuperate in un ecosistema di identità basato su Ethereum è diverso dalla gestione tradizionale dell'identità. Ecco una panoramica dei vari approcci all'emissione, memorizzazione e verifica delle attestazioni nei sistemi di identità decentralizzata: -### Attestazioni esterne alla catena {#off-chain-attestations} +### Attestazioni fuori catena {#offchain-attestations} -Un timore per la memorizzazione su catena è che potrebbero contenere informazioni che gli individui desiderano mantenere private. La natura pubblica della blockchain di Ethereum, rende poco attraente la memorizzazione di tali attestazioni. +Una preoccupazione riguardo alla memorizzazione delle attestazioni on-chain è che potrebbero contenere informazioni che gli individui vogliono mantenere private. La natura pubblica della blockchain di Ethereum la rende poco attraente per memorizzare tali attestazioni. -La soluzione è l'emissione di attestazioni, possedute all'esterno della catena dagli utenti nei portafogli digitali, ma firmate con il DID dell'emittente, memorizzato sulla catena. Tali attestazioni sono codificate come [Token Web in JSON](https://en.wikipedia.org/wiki/JSON_Web_Token) e contengono la firma digitale dell'emittente, che consente la facile verifica delle dichiarazioni esterne alla catena. +La soluzione è emettere attestazioni, detenute dagli utenti fuori catena in portafogli digitali, ma firmate con il DID dell'emittente memorizzato on-chain. Queste attestazioni sono codificate come [JSON Web Tokens](https://en.wikipedia.org/wiki/JSON_Web_Token) e contengono la firma digitale dell'emittente, il che consente una facile verifica delle dichiarazioni fuori catena. -Ecco uno scenario ipotetico per spiegare le attestazioni esterne alla catena: +Ecco uno scenario ipotetico per spiegare le attestazioni fuori catena: -1. Un'università (emittente), genera un'attestazione (un certificato accademico digitale), firma le proprie chiavi e la emette a Bob (il titolare dell'identità). +1. Un'università (l'emittente) genera un'attestazione (un certificato accademico digitale), la firma con le sue chiavi e la rilascia a Bob (il proprietario dell'identità). -2. Bob si candida per un lavoro e desidera dimostrare le proprie qualifiche accademiche a un datore di lavoro, quindi, condivide l'attestazione dal proprio portafoglio mobile. L'azienda (verificatore), può quindi confermare la validità dell'attestazione, verificando il DID dell'emittente (cioè, la sua chiave pubblica su Ethereum). +2. Bob si candida per un lavoro e vuole dimostrare le sue qualifiche accademiche a un datore di lavoro, quindi condivide l'attestazione dal suo portafoglio mobile. L'azienda (il verificatore) può quindi confermare la validità dell'attestazione controllando il DID dell'emittente (cioè la sua chiave pubblica su Ethereum). -### Attestazioni esterne alla catena con accesso persistente {#offchain-attestations-with-persistent-access} +### Attestazioni fuori catena con accesso persistente {#offchain-attestations-with-persistent-access} -In questo modo, le attestazioni sono trasformate in file JSON e memorizzate all'esterno della catena (idealmente, su una piattaforma di [archiviazione decentralizzata su cloud](/developers/docs/storage/), come IPFS o Swarm). Tuttavia, un [hash](/glossary/#hash) del file JSON è memorizzato sulla catena e collegato a un DID, tramite il registro sulla catena. Il DID associato potrebbe essere quello dell'emittente dell'attestazione, o del destinatario. +In base a questo accordo, le attestazioni vengono trasformate in file JSON e memorizzate fuori catena (idealmente su una piattaforma di [archiviazione cloud decentralizzata](/developers/docs/storage/), come IPFS o Swarm). Tuttavia, un [hash](/glossary/#hash) del file JSON viene memorizzato on-chain e collegato a un DID tramite un registro on-chain. Il DID associato potrebbe essere quello dell'emittente dell'attestazione o del destinatario. -Tale approccio consente alle attestazioni di ottenere persistenza basata sulla blockchain, mantenendo le informazioni delle dichiarazioni, crittografate e verificabili. Inoltre, consente la divulgazione selettiva, poiché il titolare della chiave privata può decrittografare le informazioni. +Questo approccio consente alle attestazioni di ottenere persistenza basata su blockchain, mantenendo le informazioni delle dichiarazioni crittografate e verificabili. Consente anche la divulgazione selettiva poiché il titolare della chiave privata può decrittografare le informazioni. -### Attestazioni sulla catena {#onchain-attestations} +### Attestazioni on-chain {#onchain-attestations} -Le attestazioni sulla catena sono conservate nei [contratti intelligenti](/glossary/#smart-contract) sulla blockchain di Ethereum. Il contratto intelligente (che agisce da registro), mapperà un'attestazione a un identificativo decentralizzato corrispondente sulla catena (una chiave pubblica). +Le attestazioni on-chain sono conservate in [contratti intelligenti](/glossary/#smart-contract) sulla blockchain di Ethereum. Il contratto intelligente (che funge da registro) mapperà un'attestazione a un corrispondente identificatore decentralizzato on-chain (una chiave pubblica). -Ecco un esempio per dimostrare il funzionamento in pratica delle attestazioni sulla catena: +Ecco un esempio per mostrare come le attestazioni on-chain potrebbero funzionare in pratica: -1. Un'azienda (XYZ Corp), pianifica la vendita delle quote di proprietà utilizzando un contratto intelligente, ma desidera soltanto gli acquirenti che abbiano completato una verifica dei trascorsi personali. +1. Un'azienda (XYZ Corp) prevede di vendere quote di proprietà utilizzando un contratto intelligente, ma vuole solo acquirenti che abbiano completato un controllo dei precedenti. -2. XYZ Corp può far eseguire le verifiche dei trascorsi personali dall'azienda, per emettere le attestazioni sulla catena di Ethereum. Tale attestazione certifica che un individuo ha superato la verifica dei trascorsi personali, senza esporre alcuna informazione personale. +2. XYZ Corp può far sì che l'azienda che esegue i controlli dei precedenti emetta attestazioni on-chain su Ethereum. Questa attestazione certifica che un individuo ha superato il controllo dei precedenti senza esporre alcuna informazione personale. -3. Il contratto intelligente che vende le quote, può verificare il contratto del registro per le identità degli acquirenti verificati, rendendo possibile la determinazione di chi possa acquistare le quote e chi no. +3. Il contratto intelligente che vende le azioni può controllare il contratto di registro per le identità degli acquirenti selezionati, rendendo possibile per il contratto intelligente determinare chi è autorizzato ad acquistare azioni o meno. -### Token vincolati e identità {#soulbound} +### Token Soulbound e identità {#soulbound} -I [token vincolati](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([NFT non trasferibili](/glossary/#nft)) potrebbero essere utilizzati per raccogliere informazioni univoche per un portafoglio specifico. Ciò, effettivamente, crea un'identità univoca sulla catena, vincolata a un indirizzo di Ethereum in particolare, che potrebbe includere i token rappresentanti obiettivi (ad esempio, concludere un certo corso online o superare una soglia di punteggio in un gioco), o la partecipazione della community. +I [token Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([token non fungibili](/glossary/#nft) non trasferibili) potrebbero essere utilizzati per raccogliere informazioni uniche per un portafoglio specifico. Questo crea di fatto un'identità on-chain unica legata a un particolare indirizzo Ethereum che potrebbe includere token che rappresentano risultati (ad es. aver terminato un corso online specifico o aver superato un punteggio soglia in un gioco) o la partecipazione alla comunità. -## Utilizzare l'identità decentralizzata {#use-decentralized-identity} +## Usa l'identità decentralizzata {#use-decentralized-identity} -Esistono molti progetti ambiziosi che utilizzano Ethereum come base per le soluzioni di identità decentralizzata: +Ci sono molti progetti ambiziosi che utilizzano Ethereum come base per soluzioni di identità decentralizzata: -- **[Servizio del Nome di Ethereum (ENS)](https://ens.domains/)**: _Un sistema di denominazione decentralizzato per gli identificativi su catena, leggibili dalle macchine, quali, indirizzi di portafogli di Ethereum, hash dei contenuti e metadati._ -- **[SpruceID](https://www.spruceid.com/)**: _Un progetto di identità decentralizzata che consente agli utenti di controllare l'identità digitale con i conti di Ethereum e i profili di ENS, piuttosto che affidarsi a servizi di terze parti._ -- **[Servizio di Attestazione di Ethereum (EAS)](https://attest.sh/)**: _Un libro mastro e protocollo decentralizzato per effettuare attestazioni sulla catena, o all'esterno di essa, su qualsiasi cosa._ -- **[Prova di Umanità](https://www.proofofhumanity.id)**: _La Prova di Umanità (o PoH), è un sistema di verifica dell'identità sociale, basato su Ethereum._ -- **[BrightID](https://www.brightid.org/)**: _Una rete decentralizzata e open source di identità sociale, ideata per riformare la verifica dell'identità tramite la creazione e analisi di un grafico sociale._ -- **[walt.id](https://walt.id)**: _Infrastruttura open source di identità decentralizzata e portafoglio che consente a sviluppatori e organizzazioni di sfruttare l'identità auto-sovrana e gli NFT/SBT._ -- **[Veramo](https://veramo.io/)**: _Un framework di JavaScript che facilita per tutti l'utilizzo di dati verificabili crittograficamente nelle proprie applicazioni._ +- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _Un sistema di denominazione decentralizzato per identificatori on-chain leggibili dalle macchine, come indirizzi di portafogli Ethereum, hash di contenuti e metadati._ +- **[Sign in with Ethereum (SIWE)](https://siwe.xyz/)** - _Standard aperto per l'autenticazione con account Ethereum._ +- **[SpruceID](https://www.spruceid.com/)** - _Un progetto di identità decentralizzata che consente agli utenti di controllare l'identità digitale con account Ethereum e profili ENS invece di fare affidamento su servizi di terze parti._ +- **[Ethereum Attestation Service (EAS)](https://attest.org/)** - _Un registro/protocollo decentralizzato per fare attestazioni on-chain o fuori catena su qualsiasi cosa._ +- **[Proof of Humanity](https://www.proofofhumanity.id)** - _Proof of Humanity (o PoH) è un sistema di verifica dell'identità sociale costruito su Ethereum._ +- **[BrightID](https://www.brightid.org/)** - _Una rete di identità sociale decentralizzata e open-source che cerca di riformare la verifica dell'identità attraverso la creazione e l'analisi di un grafo sociale._ +- **[walt.id](https://walt.id)** — _Infrastruttura open source per identità decentralizzata e portafogli che consente a sviluppatori e organizzazioni di sfruttare l'identità auto-sovrana e NFT/SBT._ +- **[Veramo](https://veramo.io/)** - _Un framework JavaScript che rende facile per chiunque utilizzare dati verificabili crittograficamente nelle proprie applicazioni._ -## Lettura consigliate {#further-reading} +## Letture consigliate {#further-reading} ### Articoli {#articles} -- [Casi d'Uso della Blockchain: La Blockchain nell'Identità Digitale](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_ -- [Cos'è l'ERC-725 di Ethereum? Gestione dell'Identità Sovrana Personale sulla Blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ -- [Come la Blockchain potrebbe risolvere il problema dell'Identità Digitale](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ -- [Cos'è l'Identità Decentralizzata e Perché Dovrebbe Interessarti?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ -- [Introduzione all'Identità decentralizzata](https://walt.id/white-paper/digital-identity) - _Dominik Beron_ +- [Casi d'uso della blockchain: la blockchain nell'identità digitale](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_ +- [Cos'è l'ERC725 di Ethereum? Gestione dell'identità auto-sovrana sulla blockchain](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ +- [Come la blockchain potrebbe risolvere il problema dell'identità digitale](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ +- [Cos'è l'identità decentralizzata e perché dovrebbe importarti?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [Introduzione all'identità decentralizzata](https://walt.id/white-paper/digital-identity) — _Dominik Beron_ ### Video {#videos} -- [Identità Decentralizzata (Sessione Live Bonus)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Un ottimo video esplicativo sull'identità decentralizzata, di Andreas Antonopolous_ -- [Accedi con Ethereum e l'Identità Decentralizzata con Ceramic, IDX, React e 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Tutorial di YouTube sulla creazione di un sistema di gestione dell'identità, per creare, leggere e aggiornare il profilo di un utente, utilizzandone il portafoglio di Ethereum; di Nader Dabit_ -- [BrightID: Identità Decentralizzata su Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Episodio del podcast "Bankless", incentrato su BrightID, una soluzione di identità decentralizzata per Ethereum_ -- [L'Internet esterno alla Catena: Identità Decentralizzata e Credenziali Verificabili](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Presentazione dell'EthDenver del 2022, di Evin McMullen -- [Credenziali verificabili spiegate](https://www.youtube.com/watch?v=ce1IdSr-Kig): Video esplicativo su YouTube con dimostrazione di Tamino Baumann +- [Identità decentralizzata (Sessione Livestream Bonus)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _Un ottimo video esplicativo sull'identità decentralizzata di Andreas Antonopolous_ +- [Sign In with Ethereum e identità decentralizzata con Ceramic, IDX, React e 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Tutorial su YouTube sulla costruzione di un sistema di gestione dell'identità per creare, leggere e aggiornare il profilo di un utente utilizzando il suo portafoglio Ethereum di Nader Dabit_ +- [BrightID - Identità decentralizzata su Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Episodio del podcast Bankless che discute di BrightID, una soluzione di identità decentralizzata per Ethereum_ +- [L'Internet fuori catena: identità decentralizzata e credenziali verificabili](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Presentazione all'EthDenver 2022 di Evin McMullen +- [Spiegazione delle credenziali verificabili](https://www.youtube.com/watch?v=ce1IdSr-Kig) - Video esplicativo su YouTube con demo di Tamino Baumann -### Community {#communities} +### Comunità {#communities} -- [ERC-725 Alliance su GitHub](https://github.com/erc725alliance) — _Sostenitori dello standard ERC-725 per la gestione dell'identità sulla blockchain di Ethereum_ -- [Server Discord di EthID](https://discord.com/invite/ZUyG3mSXFD) — _Community per appassionati e sviluppatori, al lavoro su "Accedi con Ethereum"_ -- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Una community di sviluppatori, che contribuiscono alla creazione di un quadro per i dati verificabili per le applicazioni_ -- [walt.id](https://discord.com/invite/AW8AgqJthZ) -- _Una comunità di sviluppatori e costruttori che lavorano a casi d'uso dell'identità decentralizzata che coinvolgono diversi settori_ +- [Alleanza ERC-725 su GitHub](https://github.com/erc725alliance) — _Sostenitori dello standard ERC725 per la gestione dell'identità sulla blockchain di Ethereum_ +- [Server Discord di EthID](https://discord.com/invite/ZUyG3mSXFD) — _Comunità per appassionati e sviluppatori che lavorano su Sign-in with Ethereum e sull'Ethereum Follow Protocol_ +- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Una comunità di sviluppatori che contribuiscono alla costruzione di un framework per dati verificabili per le applicazioni_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _Una comunità di sviluppatori e costruttori che lavorano su casi d'uso di identità decentralizzata in vari settori_ \ No newline at end of file diff --git a/public/content/translations/it/defi/index.md b/public/content/translations/it/defi/index.md index 9d2ae0086cd..adaca7f6cfd 100644 --- a/public/content/translations/it/defi/index.md +++ b/public/content/translations/it/defi/index.md @@ -1,209 +1,209 @@ --- title: Finanza decentralizzata (DeFi) -metaTitle: Cos'è la DeFi? | Benefici e utilizzi della finanza decentralizzata -description: Una panoramica sulla DeFi su Ethereum +metaTitle: "Cos'è la DeFi? | Vantaggi e utilizzo della finanza decentralizzata" +description: Una panoramica della DeFi su Ethereum lang: it template: use-cases emoji: ":money_with_wings:" image: /images/use-cases/defi.png -alt: Logo di Eth, composto da mattoncini Lego. -sidebarDepth: 3 -summaryPoint1: Un'alternativa globale e aperta al sistema finanziario odierno. -summaryPoint2: Prodotti che ti consentono di prendere in prestito, risparmiare, investire, scambiare, e molto altro. -summaryPoint3: Basata sulla tecnologia open source, con cui chiunque può programmare. +alt: Un logo di Eth fatto di mattoncini lego. +sidebarDepth: 2 +summaryPoint1: Un'alternativa globale e aperta all'attuale sistema finanziario. +summaryPoint2: Prodotti che ti permettono di prendere in prestito, risparmiare, investire, scambiare e molto altro. +summaryPoint3: "Basata su una tecnologia open-source con cui chiunque può programmare." --- -La DeFi è un sistema finanziario aperto e globale, creato per l'era di Internet: un'alternativa a un sistema opaco, rigidamente controllato e tenuto insieme da infrastrutture e processi vecchi di decenni. Offre il controllo e la visibilità sul proprio denaro. Fornisce esposizione ai mercati globali e alternative alla tua valuta o alle opzioni bancarie locali. I prodotti della DeFi aprono i servizi finanziari a chiunque abbia una connessione a Internet, e sono prevalentemente posseduti e mantenuti dai loro utenti. Finora, decine di miliardi di dollari in criptovalute, sono confluiti per le applicazioni della DeFi, e crescono ogni giorno. +La DeFi è un sistema finanziario aperto e globale costruito per l'era di internet: un'alternativa a un sistema opaco, strettamente controllato e tenuto insieme da infrastrutture e processi vecchi di decenni. Ti dà controllo e visibilità sul tuo denaro. Ti offre esposizione ai mercati globali e alternative alla tua valuta locale o alle opzioni bancarie. I prodotti della DeFi aprono i servizi finanziari a chiunque abbia una connessione a internet e sono in gran parte posseduti e mantenuti dai loro utenti. Finora, decine di miliardi di dollari in criptovaluta sono fluiti attraverso le applicazioni della DeFi e il numero cresce ogni giorno. ## Cos'è la DeFi? {#what-is-defi} -DeFi è un termine collettivo per i prodotti e servizi finanziari accessibili a chiunque possa utilizzare Ethereum: chiunque abbia una connessione a Internet. Con la DeFi, i mercati sono sempre aperti e non esistono autorità centralizzate, che possano bloccare i pagamenti, o negarti l'accesso a qualcosa. I servizi precedentemente lenti e soggetti a errori umani, sono ora automatici e più sicuri, venendo gestiti da codice ispezionabile ed esaminabile da chiunque. +DeFi è un termine collettivo per i prodotti e i servizi finanziari accessibili a chiunque possa usare [Ethereum](/) – chiunque abbia una connessione a internet. Con la DeFi, i mercati sono sempre aperti e non ci sono autorità centralizzate che possono bloccare i pagamenti o negarti l'accesso a qualsiasi cosa. I servizi che prima erano lenti e a rischio di errore umano sono ora automatici e più sicuri, poiché gestiti da codice che chiunque può ispezionare e analizzare. -Là fuori c'è una criptoeconomia in forte espansione, in cui puoi assumere ed erogare prestiti, maturare interessi e molto altro. Gli esperti di criptovalute argentini hanno utilizzato la DeFi per sfuggire alla paralizzante inflazione. Le aziende hanno iniziato a trasmettere ai propri dipendenti, gli stipendi in tempo reale. Alcuni hanno persino estinto e pagato prestiti di milioni di dollari, senza necessità di alcuna informazione personale. +C'è una fiorente cripto-economia là fuori, dove puoi prestare, prendere in prestito, andare long/short, guadagnare interessi e molto altro. Gli argentini esperti di criptovalute hanno usato la DeFi per sfuggire a un'inflazione paralizzante. Le aziende hanno iniziato a trasmettere in streaming gli stipendi ai propri dipendenti in tempo reale. Alcune persone hanno persino contratto e ripagato prestiti per milioni di dollari senza bisogno di alcuna identificazione personale. -## La DeFi e la finanza tradizionale {#defi-vs-tradfi} +## DeFi vs finanza tradizionale {#defi-vs-tradfi} -Uno dei metodi migliori per individuare il potenziale della DeFi, è comprendere i problemi odierni. +Uno dei modi migliori per vedere il potenziale della DeFi è comprendere i problemi che esistono oggi. -- Alcune persone non sono autorizzate a configurare un conto bancario o utilizzare i servizi finanziari. -- La mancanza di accesso ai servizi finanziari può impedire alle persone di essere assunte. -- I servizi finanziari possono impedirti di ricevere pagamenti. -- Un pericolo nascosto dei servizi finanziari, riguarda i tuoi dati personali. -- Governi e istituzioni centralizzate possono chiudere i mercati a proprio piacimento. -- Gli orari di negoziazione sono spesso limitati alle ore lavorative di uno specifico fuso orario. -- I bonifici possono richiedere giorni, a causa dei processi umani interni. -- Esiste un sovrapprezzo sui servizi finanziari, poiché le istituzioni intermediarie hanno diritto alla propria parte. +- Ad alcune persone non è concesso l'accesso per aprire un conto bancario o utilizzare i servizi finanziari. +- La mancanza di accesso ai servizi finanziari può impedire alle persone di essere impiegabili. +- I servizi finanziari possono impedirti di essere pagato. +- Un costo nascosto dei servizi finanziari sono i tuoi dati personali. +- I governi e le istituzioni centralizzate possono chiudere i mercati a piacimento. +- Gli orari di trading sono spesso limitati agli orari di lavoro di un fuso orario specifico. +- I trasferimenti di denaro possono richiedere giorni a causa di processi umani interni. +- C'è un sovrapprezzo sui servizi finanziari perché le istituzioni intermediarie hanno bisogno della loro parte. ### Un confronto {#defi-comparison} -| DeFi | Finanza tradizionale | -| ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| Il titolare del tuo denaro, sei tu. | Il tuo denaro è detenuto dalle aziende. | -| Sei tu a controllare dove va il tuo denaro, e come viene speso. | Devi fidarti del fatto che le aziende non gestiscano male il tuo denaro, come nel caso di prestiti a soggetti a rischio. | -| I trasferimenti di fondi si verificano in pochi minuti. | I pagamenti possono richiedere giorni, a causa dei processi manuali. | -| L'attività di transazione è pseudonimizzata. | L'attività finanziaria è rigidamente associata alla tua identità. | -| La DeFi è aperta a tutti. | Devi fare richiesta per utilizzare i servizi finanziari. | -| I mercati sono sempre aperti. | I mercati chiudono, poiché i dipendenti necessitano di pause. | -| Si basa sulla trasparenza: chiunque può esaminare i dati di un prodotto e ispezionare il funzionamento del sistema. | Gli istituti finanziari sono libri chiusi: non puoi chiedere di visualizzarne lo storico dei prestiti o i registri delle risorse gestite, e così via. | +| DeFi | Finanza tradizionale | +| -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| Tu detieni il tuo denaro. | Il tuo denaro è detenuto da aziende. | +| Tu controlli dove va il tuo denaro e come viene speso. | Devi fidarti che le aziende non gestiscano male il tuo denaro, ad esempio prestandolo a mutuatari a rischio. | +| I trasferimenti di fondi avvengono in pochi minuti. | I pagamenti possono richiedere giorni a causa di processi manuali. | +| L'attività delle transazioni è pseudonima. | L'attività finanziaria è strettamente legata alla tua identità. | +| La DeFi è aperta a chiunque. | Devi fare richiesta per utilizzare i servizi finanziari. | +| I mercati sono sempre aperti. | I mercati chiudono perché i dipendenti hanno bisogno di pause. | +| È basata sulla trasparenza: chiunque può guardare i dati di un prodotto e ispezionare come funziona il sistema. | Le istituzioni finanziarie sono libri chiusi: non puoi chiedere di vedere la loro cronologia dei prestiti, un registro dei loro asset gestiti e così via. | - Esplora le app della DeFi + Esplora le dApp della DeFi -## Tutto è iniziato con Bitcoin... {#bitcoin} +## È iniziato tutto con Bitcoin... {#bitcoin} -Bitcoin è considerabile, sotto molti aspetti, come la prima applicazione di DeFi. Bitcoin ti consente di possedere realmente e di controllare il valore, inviandolo in tutto il mondo. Infatti, fornisce un metodo, per grandi numeri di persone che non si fidano tra loro, di accordarsi su un libro mastro di conti, senza la necessità di un intermediario fidato. Bitcoin è aperto a tutti e nessuno ha l'autorità di modificarne le regole. Le regole di Bitcoin, come la sua scarsità e la sua apertura, sono scritte nella tecnologia. Non è come la finanza tradizionale, dove i governi possono stampare denaro che svaluta i tuoi risparmi e le aziende possono chiudere i mercati. +Bitcoin, per molti versi, è stata la prima applicazione della DeFi. Bitcoin ti permette di possedere e controllare realmente il valore e di inviarlo ovunque nel mondo. Lo fa fornendo un modo a un gran numero di persone, che non si fidano l'una dell'altra, di concordare su un registro di account senza il bisogno di un intermediario fidato. Bitcoin è aperto a chiunque e nessuno ha l'autorità di cambiarne le regole. Le regole di Bitcoin, come la sua scarsità e la sua apertura, sono scritte nella tecnologia. Non è come la finanza tradizionale, dove i governi possono stampare denaro che svaluta i tuoi risparmi e le aziende possono chiudere i mercati. -Ethereum si basa su questo. Come per Bitcoin, le regole non sono modificabili e tutti vi hanno accesso. Inoltre, questo sistema rende il denaro digitale programmabile, utilizzando i [contratti intelligenti](/glossary/#smart-contract), così che tu possa andare oltre l'archiviazione e l'invio di valore. +Ethereum si basa su questo. Come per Bitcoin, le regole non possono cambiare a tuo svantaggio e tutti hanno accesso. Ma rende anche questo denaro digitale programmabile, utilizzando i [contratti intelligenti](/glossary/#smart-contract), così puoi andare oltre la semplice conservazione e l'invio di valore. ## Denaro programmabile {#programmable-money} -Sembra strano... "perché dovrei voler programmare il mio denaro"? Eppure, questa è più che altro una funzionalità predefinita dei token su Ethereum. Chiunque può programmare la logica nei pagamenti. Così, puoi ottenere il controllo e la sicurezza di Bitcoin, insieme ai servizi forniti dalle istituzioni finanziarie. Ciò consente di fare cose con le criptovalute che non potresti fare con Bitcoin, come assumere ed erogare prestiti, pianificare pagamenti, investire in fondi indicizzati, e molto altro. +Suona strano... "perché dovrei voler programmare il mio denaro?". Tuttavia, questa è più di una semplice funzionalità predefinita dei token su Ethereum. Chiunque può programmare la logica nei pagamenti. Quindi puoi ottenere il controllo e la sicurezza di Bitcoin mescolati con i servizi forniti dalle istituzioni finanziarie. Questo ti permette di fare cose con le criptovalute che non puoi fare con Bitcoin, come prestare e prendere in prestito, programmare pagamenti, investire in fondi indicizzati e molto altro. - -
Esplora i nostri suggerimenti per le applicazioni della DeFi da provare, se sei nuovo su Ethereum.
+ +
Esplora i nostri suggerimenti per le applicazioni della DeFi da provare se sei nuovo su Ethereum.
- Esplora le app di DeFi + Esplora le dApp della DeFi
## Cosa puoi fare con la DeFi? {#defi-use-cases} -Esiste un'alternativa decentralizzata a gran parte dei servizi finanziari. Ma Ethereum, inoltre, offre l'opportunità di creare prodotti finanziari completamente nuovi. Questo è un elenco in continu espansione. +Esiste un'alternativa decentralizzata alla maggior parte dei servizi finanziari. Ma Ethereum crea anche opportunità per creare prodotti finanziari completamente nuovi. Questa è una lista in continua crescita. - [Inviare denaro in tutto il mondo](#send-money) -- [Trasmettere denaro in tutto il mondo](#stream-money) +- [Trasmettere denaro in streaming in tutto il mondo](#stream-money) - [Accedere a valute stabili](#stablecoins) -- [Assumere fondi con garanzia](#lending) -- [Erogare fondi senza garanzia](#flash-loans) -- [Creare risparmi di criptovalute](#saving) +- [Prendere in prestito fondi con collaterale](#lending) +- [Prendere in prestito senza collaterale](#flash-loans) +- [Iniziare a risparmiare in criptovalute](#saving) - [Scambiare token](#swaps) -- [Accrescere il proprio portafoglio](#investing) -- [Finanziare le proprie idee](#crowdfunding) -- [Acquistare assicurazioni](#insurance) -- [Gestire il proprio portafoglio](#aggregators) +- [Far crescere il tuo portafoglio](#investing) +- [Finanziare le tue idee](#crowdfunding) +- [Acquistare un'assicurazione](#insurance) +- [Gestire il tuo portafoglio](#aggregators) -### Inviare denaro in tutto il mondo {#send-money} +### Inviare denaro in tutto il mondo rapidamente {#send-money} -Essendo una blockchain, Ethereum è progettato per inviare le transazioni in modo sicuro e globale. Come Bitcoin, anche Ethereum rende l'invio di denaro in tutto il mondo, tanto facile quanto inviare un'email. È sufficiente inserire il [nome ENS](/glossary/#ens) del destinatario (come bob.eth), o l'indirizzo del suo conto, dal tuo portafoglio, e il pagamento gli arriverà direttamente (solitamente) in pochi minuti. Per inviare o ricevere pagamenti, necessiterai di un [portafoglio](/wallets/). +Come blockchain, Ethereum è progettata per inviare transazioni in modo sicuro e globale. Come Bitcoin, Ethereum rende l'invio di denaro in tutto il mondo facile quanto inviare un'e-mail. Basta inserire il nome [ENS](/glossary/#ens) del destinatario (come bob.eth) o l'indirizzo del suo account dal tuo portafoglio e il pagamento andrà direttamente a lui in pochi minuti (di solito). Per inviare o ricevere pagamenti, avrai bisogno di un [portafoglio](/wallets/). [Scopri di più sui pagamenti in criptovaluta](/payments/). - Visualizza le dApp di pagamento + Vedi le dApp di pagamento -#### Trasmettere denaro in tutto il mondo... {#stream-money} +#### Trasmettere denaro in streaming in tutto il mondo... {#stream-money} -Su Ethereum, inoltre, è possibile trasmettere denaro. Ciò ti consente di pagare il salario di qualcuno in pochi secondi, consentendogli di accedere al proprio denaro quando necessario. Oppure, noleggiare qualcosa all'istante, come un magazzino o uno scooter elettrico. +Puoi anche trasmettere denaro in streaming su Ethereum. Questo ti permette di pagare a qualcuno il suo stipendio al secondo, dandogli accesso al suo denaro ogni volta che ne ha bisogno. Oppure affittare qualcosa al secondo, come un armadietto o un monopattino elettrico. -E se non vuoi inviare o trasmettere [ETH](/glossary/#ether) a causa della sua volatilità, su Ethereum puoi trovare delle valute alternative: le [Stablecoin](/glossary/#stablecoin). +E se non vuoi inviare o trasmettere in streaming [ETH](/glossary/#ether) a causa di quanto può cambiare il suo valore, ci sono valute alternative su Ethereum: le [stablecoin](/glossary/#stablecoin). ### Accedere a valute stabili {#stablecoins} -La volatilità delle criptovalute è un problema per molti prodotti finanziari e spese in generale. La community della DeFi lo ha risolto con le Stablecoin. Il loro valore resta ancorato a un'altra risorsa, solitamente, una valuta popolare come il dollaro americano. +La volatilità delle criptovalute è un problema per molti prodotti finanziari e per la spesa in generale. La comunità della DeFi ha risolto questo problema con le stablecoin. Il loro valore rimane ancorato a un altro asset, di solito una valuta popolare come il dollaro. -Monete come DAI o USDC, hanno un valore di pochi centesimi di dollaro. Ciò le rende perfette per guadagnare o per la vendita al dettaglio. In molti, in America Latina, le hanno utilizzate per proteggere i propri risparmi in periodi di grande incertezza per le valute emesse dal loro governo. +Monete come Dai o USDC hanno un valore che rimane entro pochi centesimi di dollaro. Questo le rende perfette per guadagnare o per la vendita al dettaglio. Molte persone in America Latina hanno usato le stablecoin come un modo per proteggere i loro risparmi in un periodo di grande incertezza con le loro valute emesse dal governo. - Altro sulle Stablecoin + Maggiori informazioni sulle stablecoin -### Assunzione di prestiti {#lending} +### Prendere in prestito {#lending} -L'assunzione di prestiti dai fornitori decentralizzati, si presenta in due varietà principali. +Prendere in prestito denaro da fornitori decentralizzati si presenta in due varianti principali. -- Tra pari: un debitore assume un prestito direttamente da un creditore specifico. -- In un gruppo: in cui creditori forniscono fondi (liquidità) a un gruppo, da cui i debitori possono assumere un prestito. +- Peer-to-peer, il che significa che un mutuatario prenderà in prestito direttamente da un prestatore specifico. +- Basato su pool, dove i prestatori forniscono fondi (liquidità) a un pool da cui i mutuatari possono prendere in prestito. - Vedi le dApp di assunzione di prestiti + Vedi le dApp di prestito -Esistono molti vantaggi, derivati dall'utilizzo di un creditore decentralizzato... +Ci sono molti vantaggi nell'usare un prestatore decentralizzato... -#### Assunzione di prestiti nell'anonimato {#borrowing-privacy} +#### Prendere in prestito con privacy {#borrowing-privacy} -Oggi, assumere ed erogare prestiti, dipende esclusivamente dagli individui coinvolti. Prima di erogare un prestito, le banche devono sapere se sarai in grado di rimborsarlo. +Oggi, prestare e prendere in prestito denaro ruota tutto attorno agli individui coinvolti. Le banche hanno bisogno di sapere se sei propenso a ripagare un prestito prima di concederlo. -Il prestito decentraliizzato funziona senza che nessuna delle parti debba identificarsi. Il debitore deve invece produrre garanzie reali, che il creditore riceverà automaticamente se il prestito non viene rimborsato. Alcuni creditori accettano persino [NFT](/glossary/#nft) come garanzia. I NFT sono atti per risorse univoche, come un dipinto. [Di più sui NFT](/nft/) +Il prestito decentralizzato funziona senza che nessuna delle parti debba identificarsi. Invece, il mutuatario deve fornire un collaterale che il prestatore riceverà automaticamente se il prestito non viene ripagato. Alcuni prestatori accettano persino i [token non fungibile (NFT)](/glossary/#nft) come collaterale. Gli NFT sono un atto di proprietà di un asset unico, come un dipinto. [Maggiori informazioni sugli NFT](/nft/) -Questo ti consente di assumere un prestito senza controlli sul credito, o la trasmissione di informazioni private. +Questo ti permette di prendere in prestito denaro senza controlli del credito o senza dover consegnare informazioni private. -#### Accedere a fondi globali {#access-global-funds} +#### Accesso a fondi globali {#access-global-funds} -Ricorrendo a un creditore decentralizzato, hai accesso ai fondi depositati da tutto il mondo, non soltanto a quelli in custodia presso la banca o l'istituzione scelta. Ciò rende i prestiti più accessibili, migliorando i tassi d'interesse. +Quando usi un prestatore decentralizzato hai accesso a fondi depositati da tutto il mondo, non solo ai fondi in custodia presso la tua banca o istituzione scelta. Questo rende i prestiti più accessibili e migliora i tassi di interesse. -#### Vantaggi fiscali {#tax-efficiencies} +#### Efficienze fiscali {#tax-efficiencies} -Assumere un prestito può concederti l'accesso ai fondi necessari, senza dover vendere i tuoi ETH (un evento imponibile). Puoi invece usare ETH come garanzia per un prestito di stablecoin. Così, benefici del flusso di cassa, pur mantenendo i tuoi ETH. Le Stablecoin sono token più adatti a quando necessiti di denaro contante, poiché non fluttuano in valore come gli ETH. [Di più sulle Stablecoin](#stablecoins) +Prendere in prestito può darti accesso ai fondi di cui hai bisogno senza dover vendere i tuoi ETH (un evento tassabile). Invece, puoi usare gli ETH come collaterale per un prestito in stablecoin. Questo ti dà il flusso di cassa di cui hai bisogno e ti permette di mantenere i tuoi ETH. Le stablecoin sono token molto migliori per quando hai bisogno di contanti, poiché non fluttuano di valore come gli ETH. [Maggiori informazioni sulle stablecoin](#stablecoins) -#### Prestiti istantanei {#flash-loans} +#### Prestiti flash {#flash-loans} -I prestiti istantanei sono una forma più sperimentale di erogazione di prestiti decentralizzati, che ti consente di assumere prestiti senza garanzia, e senza fornire alcuna informazione personale. +I prestiti flash sono una forma più sperimentale di prestito decentralizzato che ti permette di prendere in prestito senza collaterale o senza fornire alcuna informazione personale. -Al momento non sono ampiamente accessibili agli utenti non tecnici, ma danno un'idea di cosa potrebbe essere possibile per tutti, in futuro. +Al momento non sono ampiamente accessibili alle persone non tecniche, ma suggeriscono cosa potrebbe essere possibile per tutti in futuro. -Si basano sul fatto che il prestito è assunto e ripagato durante la stessa transazione. Se non può essere restituito, la transazione si ripristina, come se nulla fosse mai successo. +Funziona sulla base del fatto che il prestito viene contratto e ripagato all'interno della stessa transazione. Se non può essere ripagato, la transazione viene annullata come se nulla fosse mai accaduto. -Spesso, i fondi utilizzati sono mantenuti in gruppi di liquidità (grandi gruppi di fondi utilizzati per i prestiti). Se in un dato momento non sono utilizzati, ciò crea un'opportunità per qualcuno, di assumere il prestito di tali fondi, concluervi affari e ripagarli ineramente, letteralmente in contemporanea alla ricezione del prestito. +I fondi che vengono spesso utilizzati sono detenuti in pool di liquidità (grandi pool di fondi utilizzati per i prestiti). Se non vengono utilizzati in un dato momento, questo crea un'opportunità per qualcuno di prendere in prestito questi fondi, condurre affari con essi e ripagarli per intero letteralmente nello stesso momento in cui vengono presi in prestito. -Ciò significa che dev'essere inclusa molta logica, in una transazione ad hoc. Un semplice esempio potrebbe essere l'utilizzo di un prestito istantaneo per assumere il prestito di una risorsa a un prezzo, così da poterla rivendere su una piattaforma di scambio differente, dove il prezzo è maggiore. +Questo significa che molta logica deve essere inclusa in una transazione molto su misura. Un semplice esempio potrebbe essere qualcuno che usa un prestito flash per prendere in prestito la maggior quantità possibile di un asset a un certo prezzo, in modo da poterlo vendere su un exchange diverso dove il prezzo è più alto. -Quindi, in una singola transazione, avviene quanto segue: +Quindi, in una singola transazione, accade quanto segue: -- Assumi il prestito di X $asset a $1,00 dalla piattaforma di scambio A -- Vendi X $asset sulla piattaforma di scambio B per $1,10 -- Ripaghi il prestito sulla piattaforma di scambio A -- Mantieni il profitto, a cui è sottratta la commissione sulla transazione +- Prendi in prestito una quantità X di $asset a 1,00 $ dall'exchange A +- Vendi X $asset sull'exchange B per 1,10 $ +- Ripaghi il prestito all'exchange A +- Tieni il profitto meno la commissione della transazione -Se l'offerta sulla piattaforma di scambio B cala improvvisamente, e l'utente non riesce ad acquistare abbastanza da coprire il prestito originale, la transazione non va semplicemente a buon fine. +Se l'offerta dell'exchange B diminuisse improvvisamente e l'utente non fosse in grado di acquistare abbastanza per coprire il prestito originale, la transazione semplicemente fallirebbe. -Per applicare l'esempio precedente nel mondo finanziario tradizionale, necessiteresti di un ingente importo di denaro. Queste strategie di guadagno sono accessibili soltanto a persone già ricche. I prestiti istantanei sono l'esempio ddi un futuro in cui possedere denaro non è necessariamente un prerequisito per guadagnare. +Per poter fare l'esempio sopra nel mondo della finanza tradizionale, avresti bisogno di un'enorme quantità di denaro. Queste strategie per fare soldi sono accessibili solo a chi ha già ricchezza. I prestiti flash sono un esempio di un futuro in cui avere denaro non è necessariamente un prerequisito per fare denaro. - Di più sui prestiti istantanei + Maggiori informazioni sui prestiti flash ### Iniziare a risparmiare con le criptovalute {#saving} -#### Erogare prestiti {#lending} +#### Prestare {#lending} -Puoi maturare interessi sulle tue criptovalute, erogandole e accrescendo i tuoi fondi in tempo reale. Al momento, i tassi d'interesse sono molto superiori a quelli che potrebbero esserti offerti da una banca locale (se sei abbastanza fortunato da potervi accedere). Ecco un esempio: +Puoi guadagnare interessi sulle tue criptovalute prestandole e vedere i tuoi fondi crescere in tempo reale. In questo momento i tassi di interesse sono molto più alti di quelli che potresti ottenere presso la tua banca locale (se sei abbastanza fortunato da potervi accedere). Ecco un esempio: -- Eroghi 100 DAI, una [Stablecoin](/stablecoins/), a un prodotto come Aave. -- Ricevi 100 Aave Dai (aDai), un token rappresentante le tue DAI erogate. -- Le tue aDai incrementerebbero a seconda dei tassi di interesse, e potresti visualizzare l'accrescimento del tuo saldo nel tuo portafoglio. A seconda dell'[APR](/glossary/#apr), il saldo del tuo portafoglio sarà all'incirca di 100,1234 dopo pochi giorni, o persino dopo poche ore! -- Puoi prelevare un importo di DAI regolare, pari al tuo saldo di aDai, in qualsiasi momento. +- Presti i tuoi 100 Dai, una [stablecoin](/stablecoins/), a un prodotto come Aave. +- Ricevi 100 Aave Dai (aDai), che è un token che rappresenta i tuoi Dai prestati. +- I tuoi aDai aumenteranno in base ai tassi di interesse e potrai vedere il tuo saldo crescere nel tuo portafoglio. A seconda dell'[APR](/glossary/#apr), il saldo del tuo portafoglio indicherà qualcosa come 100,1234 dopo pochi giorni o persino ore! +- Puoi prelevare una quantità di Dai regolari pari al tuo saldo di aDai in qualsiasi momento. - Consulta le dapp di erogazione di prestiti + Vedi le dApp di prestito -#### Lotterie prive di perdita {#no-loss-lotteries} +#### Lotterie senza perdite {#no-loss-lotteries} -Le lotterie prive di perdita, come PoolTogether, sono un nuovo metodo divertente e innovativo, per risparmiare denaro. +Le lotterie senza perdite come PoolTogether sono un modo nuovo, divertente e innovativo per risparmiare denaro. -- Acquisti 100 biglietti, utilizzando 100 token DAI. -- Ricevi 100 plDai, rappresentanti i tuoi 100 biglietti. -- Se uno dei tuoi biglietti è estratto come vincitore, il tuo saldo di plDai incrementa, all'importo del montepremi. -- Se perdi, i tuoi 100 plDai sono aggiunti all'estrazione della settimana successiva. -- Puoi prelevare regolarmente un importo di DAI, pari al tuo saldo di plDai, in qualsiasi momento. +- Compri 100 biglietti usando 100 token Dai. +- Ricevi 100 plDai che rappresentano i tuoi 100 biglietti. +- Se uno dei tuoi biglietti viene estratto come vincitore, il tuo saldo di plDai aumenterà dell'importo del montepremi. +- Se non vinci, i tuoi 100 plDai passano all'estrazione della settimana successiva. +- Puoi prelevare una quantità di Dai regolari pari al tuo saldo di plDai in qualsiasi momento. -Il montepremi si compone di tutti gli interessi generati dall'erogazione dei depositi dei ticket, come nel precedente esempio di erogazione dei prestiti. +Il montepremi è generato da tutti gli interessi prodotti prestando i depositi dei biglietti, come nell'esempio di prestito qui sopra. Prova PoolTogether @@ -213,131 +213,140 @@ Il montepremi si compone di tutti gli interessi generati dall'erogazione dei dep ### Scambiare token {#swaps} -Esistono migliaia di token su Ethereum. Le piattaforme di scambio decentralizzate (DEX), consentono di scambiare token differenti, ogni volta che vuoi. Non rinunci mai al controllo delle tue risorse. Funzionano similmente al cambio di valuta, quando si visita un paese estero. Ma la versione della DeFi non chiude mai. I mercati sono aperti 24/7, 365 giorni l'anno e, la tecnologia, garantisce che ci sia sempre qualcuno che accetti uno scambio. +Ci sono migliaia di token su Ethereum. Gli exchange decentralizzati (DEX) ti permettono di scambiare token diversi quando vuoi. Non rinunci mai al controllo dei tuoi asset. È come usare un cambio valuta quando visiti un paese diverso. Ma la versione della DeFi non chiude mai. I mercati sono aperti 24 ore su 24, 7 giorni su 7, 365 giorni all'anno e la tecnologia garantisce che ci sarà sempre qualcuno ad accettare uno scambio. -Ad esempio, se desideri utilizzare la lotteria priva di perdite di PoolTogheter (descritta sopra), necessiterai di un token come DAI o USDC. Queste DEX ti consentono di scambiare i tuoi ETH per tali token, e viceversa quando hai finito. +Ad esempio, se vuoi usare la lotteria senza perdite PoolTogether (descritta sopra), avrai bisogno di un token come Dai o USDC. Questi DEX ti permettono di scambiare i tuoi ETH per quei token e viceversa quando hai finito. - Visualizza le piattaforme di scambio di token + Vedi gli exchange di token ### Trading avanzato {#trading} -Esistono delle opzioni più avanzate per i trader che preferiscono avere un po' più di controllo. Ordini limitati, scambi perpetui, scambi con margine e molto altro, sono tutti possibili. Con il trading decentralizzato, hai accesso alla liquidità globale, i mercati non chiudono mai e mantieni sempre il controllo sulle tue risorse. +Ci sono opzioni più avanzate per i trader che amano avere un po' più di controllo. Ordini limite, contratti perpetui, trading con margine e molto altro sono tutti possibili. Con il trading decentralizzato hai accesso alla liquidità globale, il mercato non chiude mai e hai sempre il controllo dei tuoi asset. -Se utilizzi una piattaforma di scambio centralizzata, devi depositare le tue risorse prima di scambiarle e affidarti a essa, affinché se ne occupi. Mentre le tue risorse sono depositate, sono a rischio, poiché le piattaforme di scambio centralizzate sono bersagli attraenti per gli hacker. +Quando usi un exchange centralizzato devi depositare i tuoi asset prima dello scambio e fidarti che se ne prendano cura. Mentre i tuoi asset sono depositati, sono a rischio poiché gli exchange centralizzati sono bersagli attraenti per gli hacker. - Consulta le dapp di trading + Vedi le dApp di trading -### Fai crescere il tuo portafoglio {#investing} +### Far crescere il tuo portafoglio {#investing} -Su Ethereum, esistono dei prodotti di gestione dei fondi, che proveranno ad accrescere il tuo portafoglio, a seconda della strategia di tua scelta. Ciò è automatico, aperto a chiunque e non necessita di un responsabile umano, che riceva parte dei tuoi profitti. +Ci sono prodotti di gestione dei fondi su Ethereum che cercheranno di far crescere il tuo portafoglio in base a una strategia di tua scelta. Questo è automatico, aperto a tutti e non ha bisogno di un gestore umano che prenda una percentuale dei tuoi profitti. -Un buon esempio è il [fondo DeFi Pulse Index (DPI)](https://defipulse.com/blog/defi-pulse-index/). Si tratta di un fondo che si ribilancia automaticamente per garantire che il tuo portafoglio includa sempre i migliori token DeFi per capitalizzazione di mercato. Non dovrai mai gestire alcun dettaglio e potrai prelevare dai fondi, in qualsiasi momento. +Ad esempio, ci sono fondi indicizzati tokenizzati che si ribilanciano automaticamente per garantire che il tuo portafoglio includa sempre i migliori token della DeFi per capitalizzazione di mercato. Non devi mai gestire nessuno dei dettagli e puoi prelevare dal fondo quando vuoi. - Consulta le dapp d'investimento + Vedi le dApp di investimento -### Finanzia le tue idee {#crowdfunding} +### Finanziare le tue idee {#crowdfunding} Ethereum è una piattaforma ideale per il crowdfunding: -- I potenziali finanziatori possono provenire da tutto il mondo: Ethereum e i suoi token sono aperti a chiunque, in tutto il mondo. -- È trasparente, così che i finanziatori possano dimostrare quanto denaro è stato raccolto. È persino possibile tracciare quanti fondi sono stati spesi in seguito. -- I finanziatori possono configurare dei rimborsi automatici se, ad esempio, ci sono scadenze specifiche o se un importo minimo non è soddisfatto. +- I potenziali finanziatori possono provenire da ovunque: Ethereum e i suoi token sono aperti a chiunque, in qualsiasi parte del mondo. +- È trasparente, quindi i raccoglitori di fondi possono dimostrare quanto denaro è stato raccolto. Puoi persino tracciare come vengono spesi i fondi in un secondo momento. +- I raccoglitori di fondi possono impostare rimborsi automatici se, ad esempio, c'è una scadenza specifica e un importo minimo che non viene raggiunto. - Consulta le dapp di crowdfunding + Vedi le dApp di crowdfunding #### Finanziamento quadratico {#quadratic-funding} -Ethereum è un software open source e, finora, buona parte del lavoro è stata finanziata dalla community. Ciò ha comportato la crescita di un nuovo interessante modello di finanziamento: il finanziamento quadratico. Questo finanziamento ha il potenziale di migliorare il modo in cui finanzieremo tutti i tipi di beni pubblici in futuro. +Ethereum è un software open-source e gran parte del lavoro finora è stato finanziato dalla comunità. Questo ha portato alla crescita di un nuovo e interessante modello di raccolta fondi: il finanziamento quadratico. Questo ha il potenziale per migliorare il modo in cui finanzieremo tutti i tipi di beni pubblici in futuro. -Il finanziamento quadratico assicura che i progetti che riceveranno più finanziamenti siano quelli con la domanda più unica. In sintesi, i progetti che cercano di migliorare la vita del maggior numero di persone. Ecco come funziona: +Il finanziamento quadratico si assicura che i progetti che ricevono più fondi siano quelli con la domanda più unica. In altre parole, i progetti che mirano a migliorare la vita del maggior numero di persone. Ecco come funziona: -1. È presente un gruppo corrispondente di fondi donati. -2. Una serie di finanziamenti pubblici è avviata. -3. Le persone possono segnalare la propria domanda per un progetto, donando del denaro. -4. Una volta terminata la serie, il gruppo corrisponente è distribuito ai progetti. Quelli con la domanda più unica, ricevono l'importo maggiore dal gruppo corrispondente. +1. C'è un pool di fondi donati per il matching. +2. Inizia un round di finanziamento pubblico. +3. Le persone possono segnalare la loro richiesta per un progetto donando del denaro. +4. Una volta terminato il round, il pool di matching viene distribuito ai progetti. Quelli con la domanda più unica ottengono l'importo più alto dal pool di matching. -Ciò significa che il Progetto A, con le sue 100 donazioni da 1 dollaro, potrebbe ricevere maggiori finanziamenti del Progetto B, con una singola donazione da 10.000 dollari (a seconda delle dimensioni del gruppo corrispondente). +Questo significa che il Progetto A, con le sue 100 donazioni da 1 dollaro, potrebbe finire con più fondi del Progetto B con una singola donazione di 10.000 dollari (a seconda delle dimensioni del pool di matching). - Di più sul finanziamento quadratico + Maggiori informazioni sul finanziamento quadratico ### Assicurazione {#insurance} -Le assicurazioni decentralizzate mirano a rendere le assicurazioni più economiche, veloci da pagare e trasparenti. Con un'automazione maggiore, la copertura è più conveniente e i rimborsi sono molto più rapidi. I dati utilizzati per decidere in merito alle tue richieste, sono completamente trasparenti. +L'assicurazione decentralizzata mira a rendere l'assicurazione più economica, più veloce da pagare e più trasparente. Con una maggiore automazione, la copertura è più accessibile e i pagamenti sono molto più rapidi. I dati utilizzati per decidere sul tuo reclamo sono completamente trasparenti. -I prodotti di Ethereum, come qualsiasi altro software, possono essere soggetti a bug ed exploit. Quindi, al momento, molti prodotti assicurativi nello spazio, si incentrano sulla protezione degli utenti dalla perdita dei fondi. Esistono però progetti che iniziano a proporre coperture contro tutti i possibili eventi che la vita può portare con sé. Un ottimo esempio è la copertura Etherisc's Corp, mirata a [proteggere i piccoli agricoltori in Kenya dalle siccità e le inondazioni](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). L'assicurazione decentralizzata può fornire coperture più economiche per gli agricoltori, spesso tagliati fuori dalle assicurazioni tradizionali. +I prodotti di Ethereum, come qualsiasi software, possono soffrire di bug ed exploit. Quindi, in questo momento, molti prodotti assicurativi nello spazio si concentrano sulla protezione dei loro utenti contro la perdita di fondi. Tuttavia, ci sono progetti che iniziano a costruire coperture per tutto ciò che la vita può riservarci. Un buon esempio di questo è la copertura Crop di Etherisc, che mira a [proteggere i piccoli agricoltori in Kenya contro siccità e inondazioni](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). L'assicurazione decentralizzata può fornire una copertura più economica per gli agricoltori che sono spesso esclusi dall'assicurazione tradizionale a causa dei prezzi. - Consulta le dApp assicurative + Vedi le dApp di assicurazione -### Aggregatori e gestori di portfolio {#aggregators} +### Aggregatori e gestori di portafoglio {#aggregators} -Con così tante cose in ballo, necessiterai di un metodo per monitorare tutti i tuoi investimenti, prestiti e scambi. Esistono molti prodotti che ti consentono di coordinare tutte le tue attività di DeFi, da un singolo posto. È il bello dell'architettura aperta della DeFi. I team possono creare interfacce da cui puoi non soltanto visualizzare i tuoi saldi tra i vari prodotti, ma puoi anche utilizzarne le funzionalità. Potresti trovarlo utile, esplorando di più sulla DeFi. +Con così tante cose in corso, avrai bisogno di un modo per tenere traccia di tutti i tuoi investimenti, prestiti e scambi. Ci sono una serie di prodotti che ti permettono di coordinare tutte le tue attività della DeFi da un unico posto. Questa è la bellezza dell'architettura aperta della DeFi. I team possono costruire interfacce in cui non solo puoi vedere i tuoi saldi tra i vari prodotti, ma puoi anche usare le loro funzionalità. Potresti trovarlo utile man mano che esplori di più la DeFi. - Consulta le dapp del portfolio + Vedi le dApp di portafoglio ## Come funziona la DeFi? {#how-defi-works} -La DeFi utilizza le criptovalute e i contratti intelligenti per fornire servizi che non necessitano di intermediari. Nel mondo finanziario odierno, le istituzioni agiscono da garanti delle transazioni. Ciò dà alle istituzioni un immenso potere, poiché il denaro confluisce attraverso di esse. Inoltre, miliardi di persone in tutto il mondo non possono nemmeno accedere a un conto bancario. +La DeFi usa criptovalute e contratti intelligenti per fornire servizi che non hanno bisogno di intermediari. Nel mondo finanziario di oggi, le istituzioni finanziarie agiscono come garanti delle transazioni. Questo dà a queste istituzioni un potere immenso perché il tuo denaro fluisce attraverso di loro. Inoltre, miliardi di persone in tutto il mondo non possono nemmeno accedere a un conto bancario. -Nella DeFi, un contratto intelligente sostituisce l'istituzione finanziaria nella transazione. Un contratto intelligente è un tipo di conto di Ethereum, capace di detenere fondi e inviarli o rimborsarli, a seconda di certe condizioni. Nessuno può alterare tale contratto intelligente, una volta attivato: sarà eseguito per sempre così com'è stato programmato. +Nella DeFi, un contratto intelligente sostituisce l'istituzione finanziaria nella transazione. Un contratto intelligente è un tipo di account di Ethereum che può detenere fondi e può inviarli/rimborsarli in base a determinate condizioni. Nessuno può alterare quel contratto intelligente quando è attivo: funzionerà sempre come programmato. -Un contratto progettato per recapitare un'indennità o un salario, potrebbe essere programmato per inviare denaro dal Conto A al Conto B, ogni venerdì. E continuerà a farlo finché il Conto A conterrà i fondi necessari. Nessuno può modificare il contratto e aggiungere un Conto C come destinatario, per rubare i fondi. +Un contratto progettato per distribuire una paghetta o del denaro in tasca potrebbe essere programmato per inviare denaro dall'Account A all'Account B ogni venerdì. E lo farà sempre e solo finché l'Account A avrà i fondi necessari. Nessuno può cambiare il contratto e aggiungere l'Account C come destinatario per rubare fondi. -Inoltre, i contratti, sono pubblici per l'ispezione e controllo da parte di chiunque. Ciò significa che i contratti malevoli finiscono sotto esame della community, abbastanza rapidamente. +I contratti sono anche pubblici affinché chiunque possa ispezionarli e controllarli. Questo significa che i contratti dannosi finiranno spesso sotto il controllo della comunità abbastanza rapidamente. -Ciò significa che, al momento, è necessario affidarsi ai membri più tecnici della community di Ethereum, capaci di leggere il codice. La community basata sull'open source aiuta a mantenere sotto controllo gli sviluppatori, ma tale esigenza si ridurrà nel tempo, al semplificarsi della lettura dei contratti intelligenti, nonché allo sviluppo di altri metodi per dimostrare l'affidabilità del codice. +Questo significa che attualmente c'è bisogno di fidarsi dei membri più tecnici della comunità di Ethereum che sanno leggere il codice. La comunità basata sull'open-source aiuta a tenere sotto controllo gli sviluppatori, ma questa necessità diminuirà nel tempo man mano che i contratti intelligenti diventeranno più facili da leggere e verranno sviluppati altri modi per dimostrare l'affidabilità del codice. ## Ethereum e la DeFi {#ethereum-and-defi} -Ethereum è la base perfetta per la DeFi, per diverse ragioni: +Ethereum è la base perfetta per la DeFi per una serie di motivi: -- Nessuno possiede Ethereum o i contratti intelligenti che vi risiedono: ciò dà a tutti l'opportunità di utilizzare la DeFi. Ciò significa inoltre che nessuno può modificare le regole. -- I prodotti della DeFi parlano tutti la stessa lingua, dietro le quinte: Ethereum. Ciò significa che molti prodotti funzionano insieme, senza problemi. Puoi erogare token su una piattaforma e scambiare il token fruttifero di interessi in un altro mercato, su un'applicazione interamente differente. È esattamente come poter incassare punti fedeltà, presso la propria banca. -- I token e le criptovalute si basano su Ethereum, un libro contabile condiviso: tenere traccia delle transazioni e della proprietà è la specialità di Ethereum. -- Ethereum offre la massima libertà finanziaria: gran parte dei prodotti non assumerà mai la custodia sui tuoi fondi, lasciandoti il pieno controllo. +- Nessuno possiede Ethereum o i contratti intelligenti che vi risiedono: questo dà a tutti l'opportunità di usare la DeFi. Questo significa anche che nessuno può cambiare le regole a tuo svantaggio. +- I prodotti della DeFi parlano tutti la stessa lingua dietro le quinte: Ethereum. Questo significa che molti dei prodotti funzionano insieme senza problemi. Puoi prestare token su una piattaforma e scambiare il token fruttifero in un mercato diverso su un'applicazione completamente diversa. È come poter incassare i punti fedeltà presso la tua banca. +- I token e le criptovalute sono integrati in Ethereum, un registro condiviso: tenere traccia delle transazioni e della proprietà è un po' la specialità di Ethereum. +- Ethereum consente una completa libertà finanziaria: la maggior parte dei prodotti non prenderà mai in custodia i tuoi fondi, lasciandoti il controllo. -Puoi pensare alla DeFi in termini di strati: +Puoi pensare alla DeFi a livelli: -1. La blockchain: Ethereum contiene lo storico delle transazioni e lo stato dei conti. -2. Le risorse: gli [ETH](/what-is-ether/) e gli altri token (valute). -3. I protocolli: [contratti intelligenti](/glossary/#smart-contract) che forniscono la funzionalità, ad esempio, un servizio che consente il prestito decentralizzato delle risorse. -4. [Le applicazioni](/apps/): i prodotti che utilizziamo per gestire e accedere ai protocolli. +1. La blockchain: Ethereum contiene la cronologia delle transazioni e lo stato degli account. +2. Gli asset: [ETH](/what-is-ether/) e gli altri token (valute). +3. I protocolli: i [contratti intelligenti](/glossary/#smart-contract) che forniscono la funzionalità, ad esempio, un servizio che consente il prestito decentralizzato di asset. +4. [Le applicazioni](/apps/): i prodotti che usiamo per gestire e accedere ai protocolli. -Nota: la DeFi usa in buona parte lo [standard ERC-20](/glossary/#erc-20). Le applicazioni nella DeFi utilizzano la versione "wrapped" di ETH, chiamata Wrapped Ether (WETH). [Scopri di più sul wrapped ether](/wrapped-eth). +Nota: gran parte della DeFi usa lo [standard ERC-20](/glossary/#erc-20). Le applicazioni nella DeFi usano un wrapper per ETH chiamato Wrapped ether (WETH). [Scopri di più sul wrapped ether](/wrapped-eth). -## Creare DeFi {#build-defi} +## Costruire la DeFi {#build-defi} -La DeFi è un movimento open source. I protocolli e le applicazioni della DeFi sono tutti aperti all'ispezione, biforcazione e innovazione, da parte di chiunque. Per questo stack stratificato (tutti condividono la stessa blockchain di base e le stesse risorse), i protocolli possono essere mescolati e abbinati, per offrire combinazioni e opportunità uniche. +La DeFi è un movimento open-source. I protocolli e le applicazioni della DeFi sono tutti aperti affinché tu possa ispezionarli, farne una biforcazione e innovarli. A causa di questo stack a livelli (condividono tutti la stessa blockchain di base e gli stessi asset), i protocolli possono essere mescolati e abbinati per sbloccare opportunità di combinazioni uniche. - Di più sulla creazione di dapp + Maggiori informazioni sulla costruzione di dApp +## Oltre la DeFi tradizionale {#beyond-traditional-defi} + +L'ecosistema della DeFi continua a espandersi in nuove aree: + +- **[Mercati di previsione](/prediction-markets/)** – Piattaforme decentralizzate in cui puoi scommettere sull'esito di eventi futuri, dalle elezioni agli eventi sportivi, senza intermediari. +- **[Asset del mondo reale (RWA)](/real-world-assets/)** – Tokenizzazione di asset fisici come immobili, materie prime e obbligazioni su Ethereum, portando trilioni di dollari di valore on-chain. +- **[Pagamenti](/payments/)** – Utilizzo di Ethereum e stablecoin per pagamenti globali veloci e a basso costo senza l'infrastruttura bancaria tradizionale. +- **[Agenti IA](/ai-agents/)** – Agenti software autonomi che possono effettuare transazioni su Ethereum, abilitando nuove forme di trading automatizzato, gestione del portafoglio e interazione on-chain. + ## Letture consigliate {#further-reading} ### Dati sulla DeFi {#defi-data} @@ -347,19 +356,19 @@ La DeFi è un movimento open source. I protocolli e le applicazioni della DeFi s ### Articoli sulla DeFi {#defi-articles} -- [Una guida per principianti alla DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6 gennaio 2020_ +- [A beginner's guide to DeFi](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, 6 gennaio 2020_ +- [EEA DeFi Risk Assessment Guidelines](https://entethalliance.org/specs/defi-risks/) – Una panoramica supportata dal settore su come identificare e valutare i rischi chiave nei protocolli della DeFi. ### Video {#videos} -- [Finematics: istruzione finanziaria decentralizzata](https://finematics.com/): _Viddeo sulla DeFi_ -- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq): _Fondamenti di DeFi: Tutto ciò che devi sapere per muovere i primi passi, in questo spazio talvolta sconcertante._ +- [Finematics - decentralized finance education](https://finematics.com/) – _Video sulla DeFi_ +- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _Le basi della DeFi: tutto ciò che devi sapere per iniziare in questo spazio a volte sconcertante._ - [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _Cos'è la DeFi?_ -### Community {#communities} +### Comunità {#communities} -- [Server Discord di DeFi Llama](https://discord.defillama.com/) -- [Server Discord di DeFi Pulse](https://discord.gg/Gx4TCTk) +- [DeFi Llama Discord server](https://discord.defillama.com/) - + \ No newline at end of file diff --git a/public/content/translations/it/desci/index.md b/public/content/translations/it/desci/index.md index 501bf98117b..b6efce59fc4 100644 --- a/public/content/translations/it/desci/index.md +++ b/public/content/translations/it/desci/index.md @@ -1,136 +1,138 @@ --- -title: Scienza Decentralizzata (DeSci) -description: Una panoramica della scienza decentralizzata su Ethereum +title: Scienza decentralizzata (DeSci) +description: Una panoramica sulla scienza decentralizzata su Ethereum lang: it template: use-cases emoji: ":microscope:" sidebarDepth: 2 image: /images/future_transparent.png alt: "" -summaryPoint1: Un'alternativa globale e aperta al sistema scientifico corrente. -summaryPoint2: Una tecnologia che consente agli scienziati di raccogliere fondi, svolgere esperimenti, condividere dati, distribuire conoscenza, e molto altro. -summaryPoint3: Basata sul movimento della scienza aperta. +summaryPoint1: Un'alternativa globale e aperta all'attuale sistema scientifico. +summaryPoint2: Tecnologia che consente agli scienziati di raccogliere fondi, eseguire esperimenti, condividere dati, distribuire approfondimenti e altro ancora. +summaryPoint3: Si basa sul movimento della scienza aperta. --- ## Cos'è la scienza decentralizzata (DeSci)? {#what-is-desci} -La scienza decentralizzata (DeSci) è un movimento che mira alla creazione di un'infrastruttura pubblica per finanziare, creare, revisionare, accreditare, memorizzare e diffondere conoscenze scientifiche in modo giusto ed equo, utilizzando lo stack del [Web3](/glossary/#web3). +La scienza decentralizzata (DeSci) è un movimento che mira a costruire un'infrastruttura pubblica per finanziare, creare, revisionare, accreditare, archiviare e diffondere la conoscenza scientifica in modo equo e imparziale utilizzando lo stack del [Web3](/glossary/#web3). -La DeSci vuole creare un ecosistema in cui gli scienziati siano incentivati alla condivisione aperta delle proprie ricerche, ricevendo credito per il proprio operato, pur consentendo a chiunque di accedere e contribuire facilmente alla ricerca. La DeSci sfrutta l'idea che la conoscenza scientifica dovrebbe essere accessibile a tutti e che il procedimento di ricerca scientifica dovrebbe essere trasparente. La DeSci punta a creare un modello di ricerca scientifica più decentralizzato e distribuito, rendendolo più resistente alla censura e al controllo delle autorità centrali. La DeSci spera di creare un ambiente in cui le idee innovative e non convenzionali, possano prosperare, decentralizzando l'accesso a finanziamenti, strumenti scientifici e canali di comunicazione. +La DeSci mira a creare un ecosistema in cui gli scienziati siano incentivati a condividere apertamente la loro ricerca e a ricevere credito per il loro lavoro, consentendo al contempo a chiunque di accedere e contribuire facilmente alla ricerca. La DeSci si basa sull'idea che la conoscenza scientifica dovrebbe essere accessibile a tutti e che il processo di ricerca scientifica dovrebbe essere trasparente. La DeSci sta creando un modello di ricerca scientifica più decentralizzato e distribuito, rendendolo più resistente alla censura e al controllo da parte delle autorità centrali. La DeSci spera di creare un ambiente in cui idee nuove e non convenzionali possano fiorire decentralizzando l'accesso ai finanziamenti, agli strumenti scientifici e ai canali di comunicazione. -La scienza decentralizzata consente fonti di finanziamento più diversificate (dalle [DAO](/glossary/#dao), alle [donazioni quadratiche](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), al crowdfunding e molto altro), dati e metodi più accessibili, e fornisce incentivi per la riproducibilità. +La scienza decentralizzata consente fonti di finanziamento più diversificate (dalle [DAO](/glossary/#dao), alle [donazioni quadratiche](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) fino al crowdfunding e altro ancora), dati e metodi più accessibili e fornendo incentivi per la riproducibilità. -### Juan Benet: Il Movimento della DeSci +### Juan Benet - Il movimento DeSci -## In che modo la DeSci migliora le scienze? {#desci-improves-science} +## Come la DeSci migliora la scienza {#desci-improves-science} -Un elenco incompleto dei problemi chiave della scienza, e di come la scienza decentralizzata possa aiutare ad affrontarli +Un elenco incompleto dei problemi chiave nella scienza e di come la scienza decentralizzata possa aiutare ad affrontarli -| **Scienza decentralizzata** | **Scienza tradizionale** | -| -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| La distribuzione dei fondi è **determinata dal pubblico** utilizzando meccanismi quali le donazioni quadratiche o le DAO. | Piccoli **gruppi** chiusi e **centralizzati** controllano la distribuzione dei fondi. | -| Collabori con colleghi da **tutto il mondo** all'interno di team dinamici. | Le organizzazioni di finanziamento e le istituzioni nazionali **limitano** le tue collaborazioni. | -| Le decisioni di finanziamento sono prese online e in modo **trasparente**. Vengono esplorati nuovi meccanismi di finanziamento. | Le decisioni di finanziamento richiedono lunghi tempi di risposta e **trasparenza limitata**. Esistono pochi meccanismi di finanziamento. | -| La condivisione di servizi di laboratorio viene semplificata e resa più trasparente attraverso la tecnologia [Web3](/glossary/#web3). | La condivisione delle risorse di laboratorio è spesso **lenta e opaca**. | -| Possono essere sviluppati **nuovi modelli di pubblicazione** che sfruttano i primitivi del Web3 per garantire fiducia, trasparenza e accesso universale. | La pubblicazione avviene tramite percorsi prestabili, spesso ritenuti **inefficienti, parziali e profittatori**. | -| Puoi **guadagnare token e reputazione quando revisioni il lavoro dei colleghi**. | Il tuo **lavoro di revisione non è retribuito**, andando a vantaggio degli editori che operano a scopo di lucro. | -| **Possiedi la proprietà intellettuale (IP)** che generi e la distribuisci secondo condizioni trasparenti. | **La tua istituzione nazionale possiede l'IP** da te generato. L'accesso all'IP non è trasparente. | -| **L'intera ricerca viene condivisa**, inclusi i dati derivanti da tentativi infruttuosi, grazie alla presenza di tutti i passaggi sulla blockchain. | I **pregiudizi editoriali** fanno sì che sia più probabile che i ricercatori condividano gli esperimenti dagli esiti positivi. | +| **Scienza decentralizzata** | **Scienza tradizionale** | +| ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| La distribuzione dei fondi è **determinata dal pubblico** utilizzando meccanismi come le donazioni quadratiche o le DAO. | Piccoli **gruppi centralizzati** e chiusi controllano la distribuzione dei fondi. | +| Collabori con colleghi di **tutto il mondo** in team dinamici. | Le organizzazioni di finanziamento e le istituzioni di appartenenza **limitano** le tue collaborazioni. | +| Le decisioni di finanziamento vengono prese online e in modo **trasparente**. Vengono esplorati nuovi meccanismi di finanziamento. | Le decisioni di finanziamento vengono prese con tempi di risposta lunghi e **trasparenza limitata**. Esistono pochi meccanismi di finanziamento. | +| La condivisionione dei servizi di laboratorio è resa più semplice e trasparente utilizzando la tecnologia del [Web3](/glossary/#web3). | La condivisione delle risorse di laboratorio è spesso **lenta e opaca**. | +| Possono essere sviluppati **nuovi modelli di pubblicazione** che utilizzano le primitive del Web3 per la fiducia, la trasparenza e l'accesso universale. | Pubblichi attraverso percorsi consolidati frequentemente riconosciuti come **inefficienti, distorti e basati sullo sfruttamento**. | +| Puoi **guadagnare token e reputazione per il lavoro di revisione paritaria (peer-review)**. | Il tuo **lavoro di revisione paritaria non è retribuito**, a vantaggio degli editori a scopo di lucro. | +| **Possiedi la proprietà intellettuale (IP)** che generi e la distribuisci secondo termini trasparenti. | **La tua istituzione di appartenenza possiede l'IP** che generi. L'accesso all'IP non è trasparente. | +| **Condivisione di tutta la ricerca**, inclusi i dati degli sforzi infruttuosi, avendo tutti i passaggi on-chain. | Il **bias di pubblicazione** significa che i ricercatori sono più propensi a condividere esperimenti che hanno avuto risultati positivi. | ## Ethereum e la DeSci {#ethereum-and-desci} -Un sistema di scienza decentralizzata necessiterà di una sicurezza robusta, costi finanziari e di transazione minimi, e un ricco ecosistema per lo sviluppo di applicazioni. Ethereum fornisce tutto il necessario per sviluppare una tecnologia di scienza decentralizzata. +Un sistema scientifico decentralizzato richiederà una sicurezza solida, costi monetari e di transazione minimi e un ricco ecosistema per lo sviluppo di applicazioni. [Ethereum](/) fornisce tutto il necessario per costruire una tecnologia scientifica decentralizzata. ## Casi d'uso della DeSci {#use-cases} -La DeSci sta sviluppando degli strumenti scientifici per accogliere il mondo accademico tradizionale nel mondo digitale. Segue un campionamento dei casi d'uso che il Web3 può offrire alla comunità scientifica. +La DeSci sta costruendo il set di strumenti scientifici per integrare il mondo accademico tradizionale nel mondo digitale. Di seguito è riportato un campionario di casi d'uso che il Web3 può offrire alla comunità scientifica. ### Pubblicazione {#publishing} -La pubblicazione scientifica è notoriamente problematica, poiché è gestita da case editrici che si affidano al lavoro gratuito di scienziati, revisori ed editori, per generare i documenti, addebitando poi esorbitanti spese di pubblicazione. Il pubblico, che solitamente paga indirettamente i costi del lavoro e della pubblicazione tramite la tassazione, spesso, non può accedere allo stesso lavoro senza pagare nuovamente l'editore. Le commissioni totali per la pubblicazione di singoli documenti scientifici superano spesso le cinque cifre ($USD), compromettendo l'intero concetto di conoscenza scientifica come un [bene comune](/glossary/#public-goods) e generando enormi profitti per un gruppo ristretto di editori. +L'editoria scientifica è notoriamente problematica perché è gestita da case editrici che si affidano al lavoro gratuito di scienziati, revisori ed editori per generare gli articoli, ma poi addebitano commissioni di pubblicazione esorbitanti. Il pubblico, che di solito ha pagato indirettamente per il lavoro e i costi di pubblicazione attraverso la tassazione, spesso non può accedere a quello stesso lavoro senza pagare nuovamente l'editore. Le commissioni totali per la pubblicazione di singoli articoli scientifici sono spesso a cinque cifre (in dollari USA), minando l'intero concetto di conoscenza scientifica come [bene pubblico](/glossary/#public-goods) e generando al contempo enormi profitti per un piccolo gruppo di editori. -Esistono delle piattaforme libere e ad accesso aperto, nella forma di server pre-stampa, [come ArXiv](https://arxiv.org/). Tuttavia, tali piattaforme mancano del controllo di qualità, di [meccanismi anti-Sybil](/glossary/#anti-sybil) e, in genere, non monitorano i parametri degli articoli; ciò vuol dire che spesso sono utilizzate esclusivamente per pubblicizzare il lavoro prima del suo invio a un editore tradizionale. Anche SciHub rende i documenti pubblicati liberamente accessibili, ma non legalmente, e soltanto dopo che gli editori hanno ricevuto il proprio pagamento, nonché dopo l'applicazione di rigide legislazioni sul diritto d'autore. Ciò crea un'importante lacuna per i documenti e dati scientifici accessibili, dotati di un meccanismo di legittimità e un modello d'incentivazione incorporati. Gli strumenti per creare un simile sistema, esistono nel Web3. +Esistono piattaforme gratuite e ad accesso aperto sotto forma di server di pre-stampa, [come ArXiv](https://arxiv.org/). Tuttavia, queste piattaforme mancano di controllo di qualità, [meccanismi anti-Sybil](/glossary/#anti-sybil) e generalmente non tracciano le metriche a livello di articolo, il che significa che di solito vengono utilizzate solo per pubblicizzare il lavoro prima dell'invio a un editore tradizionale. Anche SciHub rende gli articoli pubblicati di libero accesso, ma non legalmente, e solo dopo che gli editori hanno già preso il loro pagamento e avvolto il lavoro in una rigorosa legislazione sul copyright. Ciò lascia una lacuna critica per articoli e dati scientifici accessibili con un meccanismo di legittimità e un modello di incentivi integrati. Gli strumenti per costruire un tale sistema esistono nel Web3. ### Riproducibilità e replicabilità {#reproducibility-and-replicability} -La riproducibilità e la replicabilità sono alle basi della scoperta scientifica di qualità. +La riproducibilità e la replicabilità sono le basi di una scoperta scientifica di qualità. -- I risultati riproducibili possono essere ottenuti svariate volte di fila dallo stesso team, utilizzando la stessa metodologia. -- I risultati replicabili possono essere ottenuti da un gruppo differente, utilizzando le stesse attrezzature sperimentali. +- I risultati riproducibili possono essere ottenuti più volte di seguito dallo stesso team utilizzando la stessa metodologia. +- I risultati replicabili possono essere ottenuti da un gruppo diverso utilizzando la stessa configurazione sperimentale. -I nuovi strumenti nativi del Web3 possono assicurare che riproducibilità e replicabilità siano alla base della scoperta. Possiamo intessere la scienza di qualità nel tessuto tecnologico accademico. Il Web3 offre la capacità di creare delle [attestazioni](/glossary/#attestation) per ogni componente d'analisi: i dati grezzi, il motore di calcolo e il risultato dell'applicazione. La bellezza dei sistemi di consenso sta nel fatto che, quando una rete affidabile viene creata per mantenere tali componenti, ogni partecipante della rete può essere responsabile della riproduzone del calcolo e della convalida di ogni risultato. +I nuovi strumenti nativi del Web3 possono garantire che la riproducibilità e la replicabilità siano alla base della scoperta. Possiamo intrecciare la scienza di qualità nel tessuto tecnologico del mondo accademico. Il Web3 offre la capacità di creare [attestazioni](/glossary/#attestation) per ogni componente di analisi: i dati grezzi, il motore computazionale e il risultato dell'applicazione. La bellezza dei sistemi di consenso è che quando viene creata una rete fidata per mantenere questi componenti, ogni partecipante alla rete può essere responsabile della riproduzione del calcolo e della convalida di ogni risultato. ### Finanziamento {#funding} -Il modello standard odierno per il finanziamento scientifico, prevede che individui o gruppi di scienziati, presentino richieste scritte a un'agenzia di finanziamento. Un piccolo comitato di individui fidati valuta le richieste e, in seguito, intervista i candidati, prima di concedere fondi a una piccola porzione di richiedenti. Oltre a creare rallentamenti che talvolta comportano **anni d'attesa** tra la richiesta e la ricezione della sovvenzione, questo modello è noto per essere molto **vulnerabile ai pregiudizi, agli interessi personali e alle politiche** del comitato di revisione. +L'attuale modello standard per il finanziamento della scienza prevede che individui o gruppi di scienziati presentino domande scritte a un'agenzia di finanziamento. Un piccolo gruppo di individui fidati valuta le domande e poi intervista i candidati prima di assegnare i fondi a una piccola parte dei richiedenti. Oltre a creare colli di bottiglia che portano a tempi di attesa a volte di **anni** tra la richiesta e la ricezione di una sovvenzione, questo modello è noto per essere altamente **vulnerabile ai pregiudizi, agli interessi personali e alle politiche** del comitato di revisione. -Degli studi hanno dimostrato che i comitati di revisione delle sovvenzioni, svolgono un lavoro mediocre nella selezione di proposte di alta qualità, poiché le stesse proposte, date a diversi comitati, producono risultati ampiamente differenti. Al ridursi dei finanziamenti, questi si concentrano su un gruppo più piccolo di ricercatori più anziani, con progetti intellettualmente più conservatori. L'effetto ha creato un panorama di finanziamento super competitivo, radicando incentivi perversi e asfissiando l'innovazione. +Gli studi hanno dimostrato che i comitati di revisione delle sovvenzioni fanno un pessimo lavoro nel selezionare proposte di alta qualità, poiché le stesse proposte fornite a comitati diversi hanno esiti ampiamente differenti. Poiché i finanziamenti sono diventati più scarsi, si sono concentrati in un gruppo più ristretto di ricercatori più anziani con progetti intellettualmente più conservatori. L'effetto ha creato un panorama di finanziamento iper-competitivo, radicando incentivi perversi e soffocando l'innovazione. -Il Web3 ha il potenziale di sconvolgere tale modello corrotto di finanziamento, sperimentando con svariati modelli d'incentivazione, ampiamente sviluppati dalle DAO e dal Web3. Il [finanziamento retroattivo dei beni pubblici](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), il [finanziamento quadratico](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), la [governance delle DAO](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) e le [strutture di incentivo tokenizzate](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design), sono alcuni degli strumenti del Web3 che potrebbero rivoluzionare il finanziamento scientifico. +Il Web3 ha il potenziale per stravolgere questo modello di finanziamento rotto sperimentando diversi modelli di incentivi sviluppati dalle DAO e dal Web3 in generale. Il [finanziamento retroattivo dei beni pubblici](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), il [finanziamento quadratico](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), la [governance delle DAO](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) e le [strutture di incentivi tokenizzate](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) sono alcuni degli strumenti del Web3 che potrebbero rivoluzionare il finanziamento della scienza. -### Proprietà e sviluppo della IP {#ip-ownership} +### Proprietà e sviluppo dell'IP {#ip-ownership} -La proprietà intellettuale (IP), rappresenta un grosso problema per la scienza tradizionale: dall'essere bloccata nelle università o inutilizzata nelle aziende biotecnologiche, fino all'essere notoriamente difficile da valorizzare. Tuttavia, la proprietà delle risorse digitali (quali dati o articoli scientifici) è qualcosa che il Web3 gestisce eccezionalmente bene, utilizzando i [token non fungibili (NFT)](/glossary/#nft). +La proprietà intellettuale (IP) è un grosso problema nella scienza tradizionale: dall'essere bloccata nelle università o inutilizzata nelle biotecnologie, all'essere notoriamente difficile da valutare. Tuttavia, la proprietà delle risorse digitali (come dati o articoli scientifici) è qualcosa che il Web3 fa eccezionalmente bene utilizzando i [token non fungibili (NFT)](/glossary/#nft). -Allo stesso modo in cui i NFT possono approvare entrate per le transazioni future al creatore originale, puoi stabilire catene di attribuzione del valore trasparenti, per ricompensare i ricercatori, i corpi governativi (come le DAO), o persino i soggetti di cui sono stati raccolti i dati. +Allo stesso modo in cui gli NFT possono trasferire le entrate per le transazioni future al creatore originale, è possibile stabilire catene di attribuzione del valore trasparenti per premiare i ricercatori, gli organi di governo (come le DAO) o persino i soggetti i cui dati vengono raccolti. -Inoltre, gli [IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) possono funzionare come chiavi per accedere a una repository decentralizzata dei dati degli esperimenti di ricerca svolti, nonché collegarsi ai NFT e alla finanziarizzazione della [De-Fi](/glossary/#defi) (dalla frazionalizzazione ai pool di prestiti fino alla perizia del valore). Inoltre, consente nativamente alle entità sulla catena, come le DAO (ad esempio, [VitaDAO](https://www.vitadao.com/)), di condurre le ricerche direttamente sulla catena. L'avvento dei [token "vincolati"](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) non trasferibili potrebbe inoltre rivestire un ruolo importante nella DeSci, consentendo alle persone di dimostrare le proprie esperienze e le credenziali collegate al proprio indirizzo di Ethereum. +Gli [IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) possono anche funzionare come chiave per un archivio dati decentralizzato degli esperimenti di ricerca in corso e collegarsi alla finanziarizzazione degli NFT e della [DeFi](/glossary/#defi) (dalla frazionalizzazione ai pool di prestito e alla valutazione del valore). Consente inoltre a entità nativamente on-chain come le DAO, ad esempio [VitaDAO](https://www.vitadao.com/), di condurre ricerche direttamente on-chain. +L'avvento dei [token "soulbound"](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) non trasferibili potrebbe anche svolgere un ruolo importante nella DeSci consentendo agli individui di dimostrare la propria esperienza e le proprie credenziali collegate al loro indirizzo Ethereum. ### Archiviazione, accesso e architettura dei dati {#data-storage} -I dati scientifici possono essere resi ampiamente più accessibili, utilizzando i modelli del Web3, e l'archiviazione distribuita consente alle ricerche di sopravvivere a eventi catastrofici. +I dati scientifici possono essere resi molto più accessibili utilizzando i modelli del Web3 e l'archiviazione distribuita consente alla ricerca di sopravvivere a eventi cataclismatici. -Il punto di partenza dev'essere un sistema accessibile a qualsiasi identità che possieda delle credenziali verificabili adeguate. Ciò consente alle parti fidate di replicare in sicurezza i dati sensibili, consentendo la resistenza alla ridondanza e alla censura, la riproduzione dei risultati, e persino la capacità di numerose parti di collaborare e aggiungere nuovi dati al dataset. I metodi di calcolo confidenziali, come il "[compute-to-data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol)" (dal calcolo ai dati), forniscono meccanismi d'accesso alternativo alla replicazione dei dati non elaborati, creando Ambienti di Ricerca Attendibili, per i dati più sensibili. Gli Ambienti di Ricerca Attendibili sono stati [citati dal NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) come una soluzion rivolta al futuro, nei confronti dell'anonimato dei dati e della collaborazione, tramite la creazione di un'ecosistema in cui i ricercatori possano lavorare in sicurezza con i dati in loco, utilizzando ambienti standardizzati per la condivisione di codice e pratiche. +Il punto di partenza deve essere un sistema accessibile da qualsiasi identità decentralizzata in possesso delle adeguate credenziali verificabili. Ciò consente ai dati sensibili di essere replicati in modo sicuro da parti fidate, abilitando la ridondanza e la resistenza alla censura, la riproduzione dei risultati e persino la capacità di più parti di collaborare e aggiungere nuovi dati al set di dati. I metodi di calcolo riservato come il [compute-to-data](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) forniscono meccanismi di accesso alternativi alla replica dei dati grezzi, creando Ambienti di Ricerca Fidati (Trusted Research Environments) per i dati più sensibili. Gli Ambienti di Ricerca Fidati sono stati [citati dall'NHS](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) come una soluzione orientata al futuro per la privacy dei dati e la collaborazione, creando un ecosistema in cui i ricercatori possono lavorare in modo sicuro con i dati in loco utilizzando ambienti standardizzati per la condivisione di codice e pratiche. -Le soluzioni di dati flessibili del Web3, supportano gli scenari precedenti, fornendo le basi per una scienza realmente aperta, in cui i ricercatori possono creare beni collettivi, senza autorizzazioni o commissioni d'accesso. Le soluzioni di dati pubblici del Web3, come IPFS, Arweave e Filecoin, sono ottimizzate per la decentralizzazione. dClimate, ad esempio, fornisce l'accesso universale ai dati climatici e meteorologici, inclusi quelli provenienti da stazioni meteorologiche e da modelli climatici previsionali. +Le soluzioni dati flessibili del Web3 supportano gli scenari di cui sopra e forniscono le basi per una vera Scienza Aperta (Open Science), in cui i ricercatori possono creare beni pubblici senza permessi di accesso o commissioni. Le soluzioni di dati pubblici del Web3 come IPFS, Arweave e Filecoin sono ottimizzate per la decentralizzazione. dClimate, ad esempio, fornisce un accesso universale ai dati climatici e meteorologici, inclusi quelli provenienti da stazioni meteorologiche e modelli climatici predittivi. ## Partecipa {#get-involved} -Esplora i progetti e unisciti alla community della DeSci. +Esplora i progetti e unisciti alla comunità DeSci. -- [DeSci.Global: eventi globali e calendario di incontri](https://desci.global) -- [Telegram di "Blockchain for Science"](https://t.me/BlockchainForScience) -- [Molecule: finanzia e ricevi finanziamenti per i tuoi progetti di ricerca](https://www.molecule.xyz/) +- [DeSci.Global: calendario di eventi e meetup globali](https://desci.global) +- [Telegram di Blockchain for Science](https://t.me/BlockchainForScience) +- [Molecule: finanzia e ottieni finanziamenti per i tuoi progetti di ricerca](https://www.molecule.xyz/) - [VitaDAO: ricevi finanziamenti tramite accordi di ricerca sponsorizzati per la ricerca sulla longevità](https://www.vitadao.com/) -- [ResearchHub: pubblica un risultato scientifico e conversa con i colleghi](https://www.researchhub.com/) -- [dClimate API: interroga i dati climatici raccolti da una community decentralizzata](https://www.dclimate.net/) -- [DeSci Foundation: sviluppatore di strumenti di pubblicazione della DeSci](https://descifoundation.org/) -- [DeSci.World: negozio unico per gli utenti per visualizzare e impegnarsi con progetti di scienza decentralizzata](https://desci.world) -- [OceanDAO: finanziamenti governati dalla DAO per la scienza relativa ai dati](https://oceanprotocol.com/) -- [Opscientia: flussi di lavoro scientifici decentralizzati e aperti](https://opsci.io/research/) -- [Bio.xyz: ricevi finanziamenti per la tua DAO biotecnologica o il tuo progetto di DeSci](https://www.bio.xyz/) -- [Istituto di Inferenza Attiva](https://www.activeinference.org/) -- [IdeaMarkets: la credibilità scientifica decentralizzata diventa realtà](https://ideamarket.io/) +- [ResearchHub: pubblica un risultato scientifico e avvia una conversazione con i colleghi](https://www.researchhub.com/) +- [API dClimate: interroga i dati climatici raccolti da una comunità decentralizzata](https://www.dclimate.net/) +- [DeSci Foundation: creatore di strumenti di pubblicazione DeSci](https://descifoundation.org/) +- [DeSci.World: sportello unico per gli utenti per visualizzare e interagire con la scienza decentralizzata](https://desci.world) +- [OceanDAO: finanziamenti governati da DAO per la scienza legata ai dati](https://oceanprotocol.com/) +- [Opscientia: flussi di lavoro aperti per la scienza decentralizzata](https://opsci.io/research/) +- [Bio.xyz: ottieni finanziamenti per la tua DAO biotecnologica o progetto DeSci](https://www.bio.xyz/) +- [Active Inference Institute](https://www.activeinference.org/) +- [IdeaMarkets: abilitare la credibilità scientifica decentralizzata](https://ideamarket.io/) - [DeSci Labs](https://www.desci.com/) -- [ValleyDAO: una community globale e aperta che offre finanziamenti e supporto traslazionale per la ricerca biologica sintetica](https://www.valleydao.bio) -- [Cerebrum DAO: soluzioni di approvvigionamento e cura per far progredire la salute cerebrale e prevenire la neurodegenerazione](https://www.cerebrumdao.com/) -- [CryoDAO: finanziamento della rivoluzionaria ricerca nel campo della crioconservazione](https://www.cryodao.org) +- [ValleyDAO: una comunità aperta e globale che offre finanziamenti e supporto traslazionale per la ricerca in biologia sintetica](https://www.valleydao.bio) +- [Cerebrum DAO: ricerca e sviluppo di soluzioni per far progredire la salute del cervello e prevenire la neurodegenerazione](https://www.cerebrumdao.com/) +- [CryoDAO: finanziamento di ricerche ambiziose nel campo della crioconservazione](https://www.cryodao.org) +- [Elata: la piattaforma in cui il tuo cervello alimenta le app di tutti i giorni](https://www.elata.bio/) -Accogliamo suggerimenti per nuovi progetti da elencare: per iniziare, ti preghiamo di consultare la nostra [politica di inserzione](/contributing/adding-desci-projects/)! +Accogliamo con favore suggerimenti per nuovi progetti da elencare: dai un'occhiata alla nostra [politica di inserimento](/contributing/adding-desci-projects/) per iniziare! -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} -- [Wiki della DeSci, di Jocelynn Pearl e Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) -- [Una guida alle biotecnologie decentralizzate di Jocelynn Pearl, per il futuro a16z](https://future.a16z.com/a-guide-to-decentralized-biotech/) +- [DeSci Wiki di Jocelynn Pearl e Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) +- [Una guida alle biotecnologie decentralizzate di Jocelynn Pearl per a16z future](https://future.a16z.com/a-guide-to-decentralized-biotech/) - [Il caso della DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guida alla DeSci](https://future.com/what-is-decentralized-science-aka-desci/) -- [Risorse scientifiche decentralizzate](https://www.vincentweisser.com/desci) -- [IP-NFT nella Biofarmaceutica di Molecule: una descrizione tecnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) -- [Creare sistemi scientifici attendibili, di Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) -- [Paul Kohlhaas - DeSci: Il Futuro della Scienza Decentralizzata (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) -- [Ontologia di Inferenza Attiva per la Scienza Decentralizzata: dalla Creazione di Senso Situazionale al Populismo Epistemico](https://zenodo.org/record/6320575) -- [DeSci: Il Futuro della Ricerca, di Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) -- [Finanziamento Scientifico (Epilogo: DeSci e nuovi cripto-primitivi), di Nadia](https://nadia.xyz/science-funding) -- [La Decentralizzazione sta Sconvolgendo lo Sviluppo Farmaceutico](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) -- [Cos'è la DeSci, o Scienza Decentralizzata?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/) +- [Risorse sulla scienza decentralizzata](https://www.vincentweisser.com/desci) +- [IP-NFT biofarmaceutici di Molecule - Una descrizione tecnica](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) +- [Costruire sistemi scientifici trustless di Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) +- [Paul Kohlhaas - DeSci: Il futuro della scienza decentralizzata (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) +- [Un'ontologia di inferenza attiva per la scienza decentralizzata: dal sensemaking situato ai beni comuni epistemici](https://zenodo.org/record/6320575) +- [DeSci: Il futuro della ricerca di Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) +- [Finanziamento della scienza (Epilogo: DeSci e nuove primitive crittografiche) di Nadia](https://nadia.xyz/science-funding) +- [La decentralizzazione sta stravolgendo lo sviluppo dei farmaci](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [Cos'è la DeSci – Scienza decentralizzata?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/) ### Video {#videos} -- [Cos'è la Scienza Decentralizzata?](https://www.youtube.com/watch?v=-DeMklVWNdA) -- [Conversazione tra Vitalik Buterin e lo scienziato Aubrey de Grey, sull'intersezione tra ricerca sulla longevità e le criptovalute](https://www.youtube.com/watch?v=x9TSJK1widA) -- [La Pubblicazione Scientifica È Corrotta. Il Web3 Può Correggerla?](https://www.youtube.com/watch?v=WkvzYgCvWj8) -- [Juan Benet - DeSci, Laboratori Indipenenti e Scienza dei Dati su Larga Scala](https://www.youtube.com/watch?v=zkXM9H90g_E) -- [Sebastian Brunemeier: Come la DeSci Può Trasformare la Ricerca Biomedica e il Capitale di Rischio](https://www.youtube.com/watch?v=qB4Tc3FcVbM) -- [Paige Donner: Utilizzare la Scienza Aperta con il Web3 e la Blockchain](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s) +- [Cos'è la scienza decentralizzata?](https://www.youtube.com/watch?v=-DeMklVWNdA) +- [Conversazione tra Vitalik Buterin e lo scienziato Aubrey de Grey sull'intersezione tra ricerca sulla longevità e criptovalute](https://www.youtube.com/watch?v=x9TSJK1widA) +- [L'editoria scientifica è rotta. Il Web3 può aggiustarla?](https://www.youtube.com/watch?v=WkvzYgCvWj8) +- [Juan Benet - DeSci, laboratori indipendenti e scienza dei dati su larga scala](https://www.youtube.com/watch?v=zkXM9H90g_E) +- [Sebastian Brunemeier - Come la DeSci può trasformare la ricerca biomedica e il capitale di rischio](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Paige Donner - Strumenti per la scienza aperta con il Web3 e la blockchain](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/accounts/index.md b/public/content/translations/it/developers/docs/accounts/index.md index a11cf8a2cf5..121a93ab2c6 100644 --- a/public/content/translations/it/developers/docs/accounts/index.md +++ b/public/content/translations/it/developers/docs/accounts/index.md @@ -1,81 +1,82 @@ --- -title: Conti di Ethereum -description: 'Una spiegazione dei conti di Ethereum: loro struttura dei dati e relazioni con la crittografia con coppie di chiavi.' +title: Account di Ethereum +description: "Una spiegazione degli account di Ethereum: le loro strutture dati e la loro relazione con la crittografia a coppie di chiavi." lang: it --- -Un conto di Ethereum è un'entità con un saldo in ether (ETH) che può inviare transazioni su Ethereum. I conti sono controllabili da utenti o distribuibili come contratti intelligenti. +Un account di [Ethereum](/) è un'entità con un saldo in ether (ETH) che può inviare messaggi su Ethereum. Gli account possono essere controllati dagli utenti o distribuiti come contratti intelligenti. ## Prerequisiti {#prerequisites} -Per aiutarti a comprendere meglio questa pagina ti consigliamo prima di leggere l'[introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Per aiutarti a comprendere meglio questa pagina, ti consigliamo di leggere prima la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). -## Tipi di conto {#types-of-account} +## Tipi di account {#types-of-account} -Ethereum ha due tipi di conto: +Ethereum ha due tipi di account: -- Conto posseduto esternamente (EOA): controllato da chiunque possieda le chiavi private -- Conto del contratto: un contratto intelligente distribuito alla rete, controllato dal codice. Impara sui [contratti intelligenti](/developers/docs/smart-contracts/) +- Account controllato esternamente (EOA) – controllato da chiunque possieda le chiavi private +- Account di contratto – un contratto intelligente distribuito sulla rete, controllato dal codice. Scopri di più sui [contratti intelligenti](/developers/docs/smart-contracts/) -Entrambi i tipi di conto hanno l'abilità di: +Entrambi i tipi di account hanno la capacità di: -- Ricevere, conservare e inviare ETH e token +- Ricevere, detenere e inviare ETH e token - Interagire con i contratti intelligenti distribuiti -### Differenze fondamentali {#key-differences} +### Differenze chiave {#key-differences} -**Posseduti esternamente** +**Controllato esternamente** -- Creare un conto non costa nulla +- La creazione di un account non costa nulla - Può avviare transazioni -- Le transazioni tra conti esterni possono riguardare unicamente trasferimenti di ETH/token -- Composto da una coppia di chiavi crittografiche: chiavi pubbliche e private che controllano le attività del conto +- Le transazioni tra account controllati esternamente possono essere solo trasferimenti di ETH/token +- Composto da una coppia di chiavi crittografiche: chiavi pubbliche e private che controllano le attività dell'account -**Contratto** +**Di contratto** -- Creare un contratto ha un costo, poiché l'utente utilizza l'archiviazione di rete -- Può inviare transazioni solo in risposta alla ricezione di una transazione -- Le transazioni da un conto esterno al conto di un contratto possono innescare un codice che può eseguire molte azioni differenti, come trasferire token o persino creare un nuovo contratto -- I conti del contratto non hanno chiavi private. Invece, sono controllati dalla logica del codice del contratto intelligente +- La creazione di un contratto ha un costo perché si utilizza l'archiviazione della rete +- Può inviare messaggi solo in risposta alla ricezione di una transazione +- Le transazioni da un account esterno a un account di contratto possono attivare codice che può eseguire molte azioni diverse, come il trasferimento di token o persino la creazione di un nuovo contratto +- Gli account di contratto non hanno chiavi private. Sono invece controllati dalla logica del codice del contratto intelligente -## Esaminando un conto {#an-account-examined} +## Esame di un account {#an-account-examined} -I conti di Ethereum hanno quattro campi: +Gli account di Ethereum hanno quattro campi: -- `nonce` – Si tratta di un codice che indica il numero di transazioni inviate da un conto posseduto esternamente oppure il numero di contratti creati da un conto. Per ogni conto può essere eseguita una sola transazione con un determinato nonce, il che protegge da attacchi replay in cui le transazioni firmate vengono trasmesse e ri-eseguite ripetutamente. -- `balance`: il numero di wei posseduti da questo indirizzo. Wei è una denominazione di ETH e ci sono 1e+18 wei per ETH. -- `codeHash`: Questo hash si riferisce al _codice_ di un conto sulla Macchina Virtuale di Ethereum (EVM). I conti del contratto contengono frammenti di codice programmati per poter eseguire diverse operazioni. Questo codice dell'EVM viene eseguito se il conto riceve una chiamata di messaggio. Non è modificabile, a differenza degli altri campi del conto. Tutti i frammenti di codice sono conservati nel database di stato sotto gli hash corrispondenti, per riferimento futuro. Questo valore dell'hash è noto come un codeHash. Per i conti esterni, il campo codeHash è l'hash di una stringa vuota. -- `storageRoot`: detto anche hash di archiviazione. Un hash da 256 bit del nodo radice di un albero di Patricia Merkle che codifica i contenuti dell'archiviazione del conto (una mappatura tra i valori interi da 256 bit), codificato nell'albero come una mappatura dall'hash da 256 bit di Keccak delle chiavi intere da 256 bit ai valori interi codificati in RLP da 256 bit. Questo albero codifica l'hash dei contenuti dell'archiviazione di questo conto ed è vuoto di default. +- `nonce` – Un contatore che indica il numero di transazioni inviate da un account controllato esternamente o il numero di contratti creati da un account di contratto. Solo una transazione con un dato nonce può essere eseguita per ogni account, proteggendo dagli attacchi di replay in cui le transazioni firmate vengono ripetutamente trasmesse e rieseguite. +- `balance` – Il numero di wei posseduti da questo indirizzo. Il wei è una denominazione di ETH e ci sono 1e+18 wei per ETH. +- `codeHash` – Questo hash si riferisce al _codice_ di un account sulla macchina virtuale di Ethereum (EVM). Gli account di contratto hanno frammenti di codice programmati al loro interno che possono eseguire diverse operazioni. Questo codice EVM viene eseguito se l'account riceve una chiamata di messaggio. Non può essere modificato, a differenza degli altri campi dell'account. Tutti questi frammenti di codice sono contenuti nel database di stato sotto i loro hash corrispondenti per un recupero successivo. Questo valore hash è noto come codeHash. Per gli account controllati esternamente, il campo codeHash è l'hash di una stringa vuota. +- `storageRoot` – A volte noto come hash di archiviazione. Un hash a 256 bit del nodo radice di un [Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) che codifica i contenuti di archiviazione dell'account (una mappatura tra valori interi a 256 bit), codificato nel trie come una mappatura dall'hash Keccak a 256 bit delle chiavi intere a 256 bit ai valori interi a 256 bit codificati in RLP. Questo trie codifica l'hash dei contenuti di archiviazione di questo account ed è vuoto per impostazione predefinita. -![Un diagramma che mostra la composizione di un conto](./accounts.png) _Diagramma adattato da [Ethereum EVM illustrato](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Un diagramma che mostra la composizione di un account](./accounts.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -## I conti posseduti esternamente e le coppie di chiavi {#externally-owned-accounts-and-key-pairs} +## Account controllati esternamente e coppie di chiavi {#externally-owned-accounts-and-key-pairs} -Un conto si compone di una coppia di chiavi crittografiche: pubblica e privata. Aiutano a provare che una transazione è stata realmente firmata dal mittente e prevenire le falsificazioni. La tua chiave privata è ciò che usi per firmare le transazioni, quindi ti concede la custodia dei fondi associati al tuo conto. Non possiedi mai realmente le criptovalute, possiedi le chiavi private; i fondi sono sempre nel registro mastro di Ethereum. +Un account è composto da una coppia di chiavi crittografiche: pubblica e privata. Aiutano a dimostrare che una transazione è stata effettivamente firmata dal mittente e prevengono le falsificazioni. La tua chiave privata è ciò che usi per firmare le transazioni, quindi ti garantisce la custodia dei fondi associati al tuo account. Non possiedi mai veramente criptovaluta, possiedi chiavi private: i fondi sono sempre sul registro di Ethereum. -Questo impedisce ai malintenzionati di trasmettere false transazioni perché puoi sempre verificare il mittente di una transazione. +Questo impedisce ad attori malintenzionati di trasmettere transazioni false perché puoi sempre verificare il mittente di una transazione. -Se Alice desidera inviare ether dal proprio conto a quello di Bob, deve creare una richiesta di transazione e inviarla alla rete per la verifica. L'uso di Ethereum della crittografia a chiave pubblica assicura che Alice possa provare che abbia originariamente avviato la richiesta di transazione. Senza i meccanismi crittografici, un utente malintenzionato "Eve", potrebbe semplicemente trasmettere pubblicamente una richiesta che somigli a "inviare 5 ETH dal conto di Alice al conto di Eve" e nessuno potrebbe verificare che non fosse provenuta da Alice. +Se Alice vuole inviare ether dal proprio account all'account di Bob, Alice deve creare una richiesta di transazione e inviarla alla rete per la verifica. L'uso della crittografia a chiave pubblica da parte di Ethereum garantisce che Alice possa dimostrare di aver originariamente avviato la richiesta di transazione. Senza meccanismi crittografici, un avversario malintenzionato, Eve, potrebbe semplicemente trasmettere pubblicamente una richiesta simile a "invia 5 ETH dall'account di Alice all'account di Eve" e nessuno sarebbe in grado di verificare che non provenga da Alice. -## Creazione del conto {#account-creation} +## Creazione dell'account {#account-creation} -Quando vuoi creare un conto, la maggior parte delle librerie genererà una chiave privata casuale. +Quando desideri creare un account, la maggior parte delle librerie genererà per te una chiave privata casuale. -Una chiave privata si compone di 64 caratteri hex ed è codificabile con una password. +Una chiave privata è composta da 64 caratteri esadecimali e può essere crittografata con una password. Esempio: `fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f` -La chiave pubblica è generata dalla chiave privata usando [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm). Puoi ottenere un indirizzo pubblico per il tuo conto prendendo gli ultimi 20 byte dell'hash Keccak-256 della chiave pubblica e aggiungendo `0x` all'inizio. +La chiave pubblica viene generata dalla chiave privata utilizzando l'[Algoritmo per la Firma Digitale a Curva Ellittica](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm). Ottieni un indirizzo pubblico per il tuo account prendendo gli ultimi 20 byte dell'hash Keccak-256 della chiave pubblica e aggiungendo `0x` all'inizio. -Questo significa che un Conto posseduto esternamente (EOA) ha un indirizzo di 42 caratteri (con un segmento di 20 byte che significa 40 caratteri esadecimali più il prefisso `0x`). +Ciò significa che un account controllato esternamente (EOA) ha un indirizzo di 42 caratteri (segmento di 20 byte che corrisponde a 40 caratteri esadecimali più il prefisso `0x`). Esempio: `0x5e97870f263700f46aa00d967821199b9bc5a120` -Il seguente esempio mostra come usare uno strumento di firma chiamato [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) per generare un nuovo account. Clef è uno strumento di gestione degli account e di firma che è stato messo in bundle con il client Ethereum, [Geth](https://geth.ethereum.org). Il comando `chiave del nuovo account` crea una nuova coppia di chiavi, e le salva in uno store crittografato. +L'esempio seguente mostra come utilizzare uno strumento di firma chiamato [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) per generare un nuovo account. Clef è uno strumento di gestione e firma degli account fornito in bundle con il client di Ethereum, [Geth](https://geth.ethereum.org). Il comando `clef newaccount` crea una nuova coppia di chiavi e le salva in un keystore crittografato. ``` > clef newaccount --keystore @@ -87,50 +88,50 @@ Please enter a password for the new account to be created: INFO [10-28|16:19:09.156] Your new key was generated address=0x5e97870f263700f46aa00d967821199b9bc5a120 WARN [10-28|16:19:09.306] Please backup your key file path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120 WARN [10-28|16:19:09.306] Please remember your password! -Account generato 0x5e97870f263700f46aa00d967821199b9bc5a120 +Generated account 0x5e97870f263700f46aa00d967821199b9bc5a120 ``` [Documentazione di Geth](https://geth.ethereum.org/docs) -È possibile derivare nuove chiavi pubbliche dalla tua chiave privata ma non puoi derivare una chiave privata dalle chiavi pubbliche. È essenziale mantenere le proprie chiavi private al sicuro e, come suggerito dal nome, **PRIVATE**. +È possibile derivare nuove chiavi pubbliche dalla tua chiave privata, ma non puoi derivare una chiave privata dalle chiavi pubbliche. È vitale mantenere le tue chiavi private al sicuro e, come suggerisce il nome, **PRIVATE**. -Necessiti di una chiave privata per firmare i messaggi e le transazioni che producono una firma. Gli altri possono quindi prendere la firma per derivare la tua chiave pubblica, provando l'autore del messaggio. Nella tua applicazione puoi utilizzare una libreria Javascript per inviare transazioni alla rete. +Hai bisogno di una chiave privata per firmare messaggi e transazioni che producono una firma. Altri possono quindi prendere la firma per derivare la tua chiave pubblica, dimostrando l'autore del messaggio. Nella tua applicazione, puoi utilizzare una libreria JavaScript per inviare transazioni alla rete. -## Conti del contratto {#contract-accounts} +## Account di contratto {#contract-accounts} -Inoltre, i conti del contratto contengono un indirizzo esadecimale da 42 caratteri: +Anche gli account di contratto hanno un indirizzo esadecimale di 42 caratteri: Esempio: `0x06012c8cf97bead5deae237070f9587f8e7a266d` -L'indirizzo del contratto è solitamente dato alla distribuzione di un contratto alla Blockchain di Ethereum. L’indirizzo deriva da quello del creatore e dal numero di transazioni inviate da tale indirizzo (il “nonce”). +L'indirizzo del contratto viene solitamente fornito quando un contratto viene distribuito sulla blockchain di Ethereum. L'indirizzo deriva dall'indirizzo del creatore e dal numero di transazioni inviate da quell'indirizzo (il "nonce"). -## Chiavi del validatore {#validators-keys} +## Chiavi dei validatori {#validators-keys} -Esiste inoltre un altro tipo di chiave su Ethereum, introdotto quando Ethereum è passato dal consenso basato sul proof-of-work al proof-of-stake. Queste sono le chiavi 'BLS' e sono usate per identificare i validatori. Queste chiavi possono esser aggregate efficientemente per ridurre la larghezza di banda necessaria affinché la rete raggiunga il consenso. Senza questa chiave, l'aggregazione della quota minima per un validatore saremme molto maggiore. +C'è anche un altro tipo di chiave in Ethereum, introdotto quando Ethereum è passato dal consenso basato sulla prova di lavoro alla prova di stake. Queste sono le chiavi 'BLS' e vengono utilizzate per identificare i validatori. Queste chiavi possono essere aggregate in modo efficiente per ridurre la larghezza di banda richiesta alla rete per raggiungere il consenso. Senza questa aggregazione di chiavi, lo stake minimo per un validatore sarebbe molto più alto. -[Di più sulle chiavi del validatore](/developers/docs/consensus-mechanisms/pos/keys/). +[Maggiori informazioni sulle chiavi dei validatori](/developers/docs/consensus-mechanisms/pos/keys/). ## Una nota sui portafogli {#a-note-on-wallets} -Un conto non è un portafoglio. Un portafoglio è un'interfaccia o un'applicazione che ti consente di interagire con il tuo conto di Ethereum, sia esso posseduto esternamente o di un contratto. +Un account non è un portafoglio. Un portafoglio è un'interfaccia o un'applicazione che ti consente di interagire con il tuo account di Ethereum, che sia un account controllato esternamente o un account di contratto. -## Dimostrazione visiva {#a-visual-demo} +## Una demo visiva {#a-visual-demo} -Fatti guidare da Austin attraverso le funzionalità di hash e le coppie di chiavi. +Guarda Austin guidarti attraverso le funzioni di hash e le coppie di chiavi. -## Ulteriori letture {#further-reading} +## Letture di approfondimento {#further-reading} -- [Capire i conti di Ethereum](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan +- [Comprendere gli account di Ethereum](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} - [Contratti intelligenti](/developers/docs/smart-contracts/) -- [Transazioni](/developers/docs/transactions/) +- [Transazioni](/developers/docs/transactions/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/apis/backend/index.md b/public/content/translations/it/developers/docs/apis/backend/index.md index 699db34973e..2e442ecffc1 100644 --- a/public/content/translations/it/developers/docs/apis/backend/index.md +++ b/public/content/translations/it/developers/docs/apis/backend/index.md @@ -1,72 +1,75 @@ --- title: Librerie API di backend -description: Introduzione alle API client di Ethereum che permettono l'interazione tra un'applicazione con la blockchain. +description: Un'introduzione alle API dei client di Ethereum che ti consentono di interagire con la blockchain dalla tua applicazione. lang: it --- -Per interagire con la blockchain Ethereum (ad esempio leggere i dati della blockchain e/o inviare transazioni alla rete), un'applicazione software deve connettersi a un nodo Ethereum. +Affinché un'applicazione software possa interagire con la blockchain di [Ethereum](/) (ovvero, leggere i dati della blockchain e/o inviare transazioni alla rete), deve connettersi a un nodo di Ethereum. -A tale scopo, ogni client di Ethereum implementa la specifica [JSON-RPC](/developers/docs/apis/json-rpc/), così che esista una serie uniforme di [metodi](/developers/docs/apis/json-rpc/#json-rpc-methods) a cui le applicazioni possano affidarsi. +A questo scopo, ogni client di Ethereum implementa la specifica [JSON-RPC](/developers/docs/apis/json-rpc/), in modo che ci sia un insieme uniforme di [metodi](/developers/docs/apis/json-rpc/#json-rpc-methods) su cui le applicazioni possono fare affidamento. -Se desideri utilizzare un linguaggio di programmazione specifico per connetterti a un nodo Ethereum, sviluppa una soluzione personalizzata, ma tieni presente che ci sono già molte librerie all'interno dell'ecosistema che possono facilitarti la vita. Con queste librerie, gli sviluppatori possono scrivere metodi a una riga intuitivi per inizializzare le richieste RPC JSON (under the hood) che interagiscono con Ethereum. +Se desideri utilizzare un linguaggio di programmazione specifico per connetterti a un nodo di Ethereum, ci sono molte librerie di utilità all'interno dell'ecosistema che rendono tutto ciò molto più semplice. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una sola riga per inizializzare richieste JSON-RPC (dietro le quinte) che interagiscono con Ethereum. ## Prerequisiti {#prerequisites} -Potrebbe essere utile comprendere meglio lo [stack di Ethereum](/developers/docs/ethereum-stack/) e[i client di Ethereum](/developers/docs/nodes-and-clients/). +Potrebbe essere utile comprendere lo [stack di Ethereum](/developers/docs/ethereum-stack/) e i [client di Ethereum](/developers/docs/nodes-and-clients/). ## Perché usare una libreria? {#why-use-a-library} -Queste librerie eliminano buona parte della complessità legata al dover interagire direttamente con un nodo Ethereum. Forniscono inoltre funzioni di utilità (ad esempio conversione da ETH a Gwei) in modo da ridurre il tempo necessario per districarsi tra le complessità dei client Ethereum e potersi concentrare sulle funzionalità uniche dell'applicazione. +Queste librerie astraggono gran parte della complessità dell'interazione diretta con un nodo di Ethereum. Forniscono anche funzioni di utilità (ad es. la conversione di ETH in Gwei) in modo che, come sviluppatore, tu possa dedicare meno tempo ad affrontare le complessità dei client di Ethereum e più tempo a concentrarti sulle funzionalità uniche della tua applicazione. ## Librerie disponibili {#available-libraries} -### Servizi per infrastrutture e nodi {#infrastructure-and-node-services} +### Infrastruttura e servizi dei nodi {#infrastructure-and-node-services} -**Alchemy -** **_Piattaforma di sviluppo Ethereum_** +**Alchemy -** **_Piattaforma di sviluppo di Ethereum._** - [alchemy.com](https://www.alchemy.com/) -- [Documentazione](https://docs.alchemy.com/) +- [Documentazione](https://www.alchemy.com/docs/) - [GitHub](https://github.com/alchemyplatform) - [Discord](https://discord.com/invite/alchemyplatform) - + **All That Node -** **_Node-as-a-Service._** - [All That Node.com](https://www.allthatnode.com/) - [Documentazione](https://docs.allthatnode.com) - [Discord](https://discord.gg/GmcdVEUbJM) -**Blast by Bware Labs -** **_API decentralizzate per la rete principale e le reti di prova di Ethereum._** +**Blast by Bware Labs -** **_API decentralizzate per la rete principale e le reti di test di Ethereum._** - [blastapi.io](https://blastapi.io/) - [Documentazione](https://docs.blastapi.io) -- [Discord](https://discord.gg/bwarelabs) +- [Discord](https://discord.gg/SaRqmRUjjQ) -**BlockPi -** **_Fornire servizi RPC più efficienti e veloci_** +**BlockPi -** **_Fornisce servizi RPC più efficienti e veloci_** - [blockpi.io](https://blockpi.io/) - [Documentazione](https://docs.blockpi.io/) - [GitHub](https://github.com/BlockPILabs) - [Discord](https://discord.com/invite/xTvGVrGVZv) -**Gateway Ethereum Cloudflare** +**Cloudflare Ethereum Gateway.** - [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/) -**Etherscan - Esploratore di Blocchi e API di transazione** +**Etherscan - Esploratore di blocchi e API per le transazioni** - [Documentazione](https://docs.etherscan.io/) -**GetBlock-** **_Blockchain-as-a-service per lo sviluppo Web3_** +**Blockscout - Esploratore di blocchi open source** +- [Documentazione](https://docs.blockscout.com/) + +**GetBlock-** **_Blockchain-as-a-service per lo sviluppo web3_** - [GetBlock.io](https://getblock.io/) -- [Documentazione](https://getblock.io/docs/) +- [Documentazione](https://docs.getblock.io/) -**Infura -** **_L'API Ethereum come servizio_** +**Infura -** **_L'API di Ethereum come servizio._** - [infura.io](https://infura.io) - [Documentazione](https://docs.infura.io/api) - [GitHub](https://github.com/INFURA) -**Node RPC - _Conveniente fornitore di RPC-JSON dell'EVM_** +**Node RPC - _Provider JSON-RPC EVM conveniente_** - [noderpc.xyz](https://www.noderpc.xyz/) - [Documentazione](https://docs.noderpc.xyz/node-rpc) @@ -74,20 +77,21 @@ Queste librerie eliminano buona parte della complessità legata al dover interag **NOWNodes - _Nodi completi ed esploratori di blocchi._** - [NOWNodes.io](https://nownodes.io/) +- [Documentazione](https://nownodes.gitbook.io/documentation) -**QuickNode -** **_Infrastruttura della Blockchain come servizio._** +**QuickNode -** **_Infrastruttura blockchain come servizio._** - [quicknode.com](https://quicknode.com) - [Documentazione](https://www.quicknode.com/docs/welcome) - [Discord](https://discord.gg/quicknode) -**Rivet -** **_API di Ethereum ed Ethereum Classic come servizio, supportate da software open source._** +**Rivet -** **_API di Ethereum ed Ethereum Classic come servizio basate su software open source._** - [rivet.cloud](https://rivet.cloud) - [Documentazione](https://rivet.cloud/docs/) - [GitHub](https://github.com/openrelayxyz/ethercattle-deployment) -**Zmok -** **_Nodi di Ethereum orientati alla velocità come l'API JSON-RPC/WebSockets._** +**Zmok -** **_Nodi di Ethereum orientati alla velocità come API JSON-RPC/WebSockets._** - [zmok.io](https://zmok.io/) - [GitHub](https://github.com/zmok-io) @@ -96,67 +100,67 @@ Queste librerie eliminano buona parte della complessità legata al dover interag ### Strumenti di sviluppo {#development-tools} -**ethers-kt -** **_Libreria asincrona e ad alte prestazioni per Kotlin/Java/Android per le blockchain basate sull'EVM._** +**ethers-kt -** **_Libreria Kotlin/Java/Android asincrona e ad alte prestazioni per blockchain basate su EVM._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Esempi](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Nethereum -** **_Una libreria di integrazione .NET open source per la blockchain_** +**Nethereum -** **_Una libreria di integrazione .NET open source per la blockchain._** - [GitHub](https://github.com/Nethereum/Nethereum) - [Documentazione](http://docs.nethereum.com/en/latest/) - [Discord](https://discord.com/invite/jQPrR58FxX) -**Strumenti Python -** **_Diverse librerie per interagire con Ethereum tramite Python_** +**Strumenti Python -** **_Varietà di librerie per l'interazione con Ethereum tramite Python._** -- [py.ethereum.org](https://snakecharmers.ethereum.org) +- [py.ethereum.org](https://snakecharmers.ethereum.org/) - [web3.py GitHub](https://github.com/ethereum/web3.py) - [web3.py Chat](https://gitter.im/ethereum/web3.py) -**QuikNode -** **_La piattaforma definitiva per sviluppatori di blockchain_** +**Tatum -** **_La piattaforma di sviluppo blockchain definitiva._** - [Tatum](https://tatum.io/) - [GitHub](https://github.com/tatumio/) - [Documentazione](https://docs.tatum.io/) - [Discord](https://discord.gg/EDmW3kjTC9) -**web3j -** **_Libreria di integrazione di Java/Android/Kotlin/Scala per Ethereum_** +**web3j -** **_Una libreria di integrazione Java/Android/Kotlin/Scala per Ethereum._** - [GitHub](https://github.com/web3j/web3j) -- [Docs](https://docs.web3j.io/) +- [Documentazione](https://docs.web3j.io/) - [Gitter](https://gitter.im/web3j/web3j) -### Servizi della blockchain {#blockchain-services} +### Servizi blockchain {#blockchain-services} -**BlockCypher -** **_API Web Ethereum._** +**BlockCypher -** **_API Web di Ethereum._** - [blockcypher.com](https://www.blockcypher.com/) - [Documentazione](https://www.blockcypher.com/dev/ethereum/) -**Chainbase -** **_Infrastruttura dati web3 tutto in uno per Ethereum._** +**Chainbase -** **_Infrastruttura dati web3 all-in-one per Ethereum._** - [chainbase.com](https://chainbase.com/) - [Documentazione](https://docs.chainbase.com/) - [Discord](https://discord.gg/Wx6qpqz4AF) -**Catainstack -** **_Nodi di Ethereum elastici e dedicati come servizio_** +**Chainstack -** **_Nodi di Ethereum elastici e dedicati come servizio._** - [chainstack.com](https://chainstack.com) -- [Documentazione](https://docs.chainbase.com/docs) -- [Riferimento all'API di Ethereum](https://docs.chainstack.com/reference/ethereum-getting-started) +- [Documentazione](https://docs.chainstack.com/) +- [Riferimento API di Ethereum](https://docs.chainstack.com/reference/ethereum-getting-started) -**Nodo cloud di Coinbase-** **_API per l'infrastruttura della Blockchain._** +**Coinbase Cloud Node -** **_API per l'infrastruttura blockchain._** -- [Nodo in cloud di Coinbase](https://www.coinbase.com/cloud) -- [Documentazione](https://docs.cloud.coinbase.com/) +- [Coinbase Cloud Node](https://www.coinbase.com/developer-platform) +- [Documentazione](https://docs.cdp.coinbase.com/) -**DataHub di Figment -** **_Servizi API Web3 con la Rete principale e le reti di prova di Ethereum._** +**DataHub by Figment -** **_Servizi API web3 con la rete principale e le reti di test di Ethereum._** - [DataHub](https://www.figment.io/) - [Documentazione](https://docs.figment.io/) -**Moralis**: **_Fornitore di API EVM di livello enterprise._** +**Moralis -** **_Provider di API EVM di livello aziendale._** - [moralis.io](https://moralis.io) - [Documentazione](https://docs.moralis.io/) @@ -164,26 +168,34 @@ Queste librerie eliminano buona parte della complessità legata al dover interag - [Discord](https://moralis.io/joindiscord/) - [Forum](https://forum.moralis.io/) -**NFTPort -** **_Dati di Ethereum e API di Mint._** +**NFTPort -** **_API per dati e per coniare su Ethereum._** - [nftport.xyz](https://www.nftport.xyz/) - [Documentazione](https://docs.nftport.xyz/) - [GitHub](https://github.com/nftport/) - [Discord](https://discord.com/invite/K8nNrEgqhE) -**Tokenview -** **_La piattaforma generale per API blockchain multi-criptovaluta._** +**Tokenview -** **_La piattaforma generale di API blockchain multi-criptovaluta._** - [services.tokenview.io](https://services.tokenview.io/) - [Documentazione](https://services.tokenview.io/docs?type=api) - [GitHub](https://github.com/Tokenview) -**Watchdata -** **_Accesso semplice e affidabile delle API alla blockchain di Ethereum._** +**Watchdata -** **_Fornisce un accesso API semplice e affidabile alla blockchain di Ethereum._** - [Watchdata](https://watchdata.io/) - [Documentazione](https://docs.watchdata.io/) - [Discord](https://discord.com/invite/TZRJbZ6bdn) -**Covalent -** **_API della blockchain arricchite per oltre 200 catene._** +**Codex -** **_API di dati blockchain arricchiti in tempo reale su dozzine di catene._** + +- [codex.io](https://www.codex.io/) +- [Documentazione](https://docs.codex.io) +- [Esploratore](https://docs.codex.io/explore) +- [GitHub](https://github.com/Codex-Data) +- [Discord](https://discord.com/invite/mFpUhT3vAq) + +**Covalent -** **_API blockchain arricchite per oltre 200 catene._** - [covalenthq.com](https://www.covalenthq.com/) - [Documentazione](https://www.covalenthq.com/docs/api/) @@ -193,14 +205,14 @@ Queste librerie eliminano buona parte della complessità legata al dover interag ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [ Nodi e client](/developers/docs/nodes-and-clients/) -- [Quadri di sviluppo](/developers/docs/frameworks/) +- [Nodi e client](/developers/docs/nodes-and-clients/) +- [Framework di sviluppo](/developers/docs/frameworks/) ## Tutorial correlati {#related-tutorials} -- [Set up Web3js to use the Ethereum blockchain in JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Istruzioni per impostare web3.js in un progetto._ -- [Calling a Smart Contract from JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Usando il token DAI, impara come funzionano i contratti di chiamata con JavaScript_ +- [Configurare Web3js per usare la blockchain di Ethereum in JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Istruzioni per configurare web3.js nel tuo progetto._ +- [Chiamare un contratto intelligente da JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Usando il token DAI, scopri come chiamare le funzioni dei contratti usando JavaScript._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/apis/javascript/index.md b/public/content/translations/it/developers/docs/apis/javascript/index.md index 8a53b2063f5..30faeba7117 100644 --- a/public/content/translations/it/developers/docs/apis/javascript/index.md +++ b/public/content/translations/it/developers/docs/apis/javascript/index.md @@ -1,83 +1,85 @@ --- title: Librerie API JavaScript -description: Introduzione alle librerie client JavaScript che consentono di interagire con la blockchain da un'applicazione. +description: Un'introduzione alle librerie client JavaScript che ti consentono di interagire con la blockchain dalla tua applicazione. lang: it --- -Per interagire con la blockchain Ethereum (ad esempio leggere i dati della blockchain e/o inviare transazioni alla rete), una web app deve connettersi a un nodo Ethereum. +Affinché un'app web possa interagire con la blockchain di Ethereum (ovvero, leggere i dati della blockchain e/o inviare transazioni alla rete), deve connettersi a un nodo di Ethereum. -Per questo scopo, ogni client di Ethereum implementa la specifica [JSON-RPC](/developers/docs/apis/json-rpc/), quindi esiste una serie uniforme di [metodi](/developers/docs/apis/json-rpc/#json-rpc-methods) su cui possono basarsi le applicazioni. +A questo scopo, ogni client di Ethereum implementa la specifica [JSON-RPC](/developers/docs/apis/json-rpc/), quindi esiste un insieme uniforme di [metodi](/developers/docs/apis/json-rpc/#json-rpc-methods) su cui le applicazioni possono fare affidamento. -Se desideri utilizzare JavaScript per connetterti a un nodo Ethereum, puoi usare Javascript vanilla, ma tieni presente che ci sono già molte librerie all'interno dell'ecosistema che possono facilitarti la vita. Con queste librerie, gli sviluppatori possono scrivere metodi a una riga intuitivi per inizializzare le richieste RPC JSON (under the hood) che interagiscono con Ethereum. +Se desideri utilizzare JavaScript per connetterti a un nodo di Ethereum, è possibile utilizzare JavaScript puro, ma all'interno dell'ecosistema esistono diverse librerie di utilità che rendono l'operazione molto più semplice. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una sola riga per inizializzare richieste JSON-RPC (dietro le quinte) che interagiscono con Ethereum. -Si noti che, a partire da [La Fusione](/roadmap/merge/), per eseguire un nodo occorrono due elementi di software di Ethereum connessi (un client di esecuzione e un client di consenso). Assicurati che il tuo nodo includa sia un client di esecuzione che un client di consenso. Se il tuo nodo non si trova sulla tua macchina locale (ad es. se è in esecuzione su un'istanza AWS), occorrerà aggiornare di conseguenza gli indirizzi IP nel tutorial. Per ulteriori informazioni, consulta la nostra pagina sull'[esecuzione di un nodo](/developers/docs/nodes-and-clients/run-a-node/). +Tieni presente che da [La Fusione (The Merge)](/roadmap/merge/), per eseguire un nodo sono necessari due software di Ethereum connessi: un client di esecuzione e un client di consenso. Assicurati che il tuo nodo includa sia un client di esecuzione che uno di consenso. Se il tuo nodo non si trova sulla tua macchina locale (ad es., il tuo nodo è in esecuzione su un'istanza AWS), aggiorna di conseguenza gli indirizzi IP nel tutorial. Per maggiori informazioni, consulta la nostra pagina su [come eseguire un nodo](/developers/docs/nodes-and-clients/run-a-node/). ## Prerequisiti {#prerequisites} -Potrebbe essere utile conoscere non solo Javascript ma anche lo [stack di Ethereum](/developers/docs/ethereum-stack/) e [i client di Ethereum](/developers/docs/nodes-and-clients/). +Oltre a comprendere JavaScript, potrebbe essere utile comprendere lo [stack di Ethereum](/developers/docs/ethereum-stack/) e i [client di Ethereum](/developers/docs/nodes-and-clients/). ## Perché usare una libreria? {#why-use-a-library} -Queste librerie eliminano buona parte della complessità legata al dover interagire direttamente con un nodo Ethereum. Assicurano inoltre funzioni di utilità (ad esempio la conversione da ETH a Gwei) per fare in modo che gli sviluppatori debbano dedidare meno tempo alle complessità dei client Ethereum e più tempo alle funzionalità specifiche dell'applicazione. +Queste librerie astraggono gran parte della complessità dell'interazione diretta con un nodo di Ethereum. Forniscono anche funzioni di utilità (ad es., la conversione di ETH in Gwei), in modo che, come sviluppatore, tu possa dedicare meno tempo ad affrontare le complessità dei client di Ethereum e più tempo a concentrarti sulle funzionalità uniche della tua applicazione. -## Caratteristiche della libreria {#library-features} +## Funzionalità delle librerie {#library-features} -### Connettersi ai nodi Ethereum {#connect-to-ethereum-nodes} +### Connettersi ai nodi di Ethereum {#connect-to-ethereum-nodes} -Utilizzando i provider, queste librerie consentono di connettersi a Ethereum e leggerne i dati, tramite JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. +Utilizzando i provider, queste librerie ti consentono di connetterti a Ethereum e leggerne i dati, che sia tramite JSON-RPC, INFURA, Etherscan, Alchemy o MetaMask. -**Esempio da Ethers** +> **Attenzione:** Web3.js è stato archiviato il 4 marzo 2025. [Leggi l'annuncio](https://blog.chainsafe.io/web3-js-sunset/). Prendi in considerazione l'utilizzo di librerie alternative come [ethers.js](https://ethers.org) o [viem](https://viem.sh) per i nuovi progetti. + +**Esempio con Ethers** ```js -// Un BrowserProvider avvolge un fornitore Web3 standard, ciò -// che MetaMask inietta come window.ethereum in ogni pagina +// Un BrowserProvider incapsula un provider Web3 standard, che è +// ciò che MetaMask inietta come window.ethereum in ogni pagina const provider = new ethers.BrowserProvider(window.ethereum) -// Anche il plugin di MetaMask consente la firma delle transazioni per -// inviare ether e pagare per cambiare lo stato nella blockchain. +// Il plugin MetaMask consente anche di firmare transazioni per +// inviare ether e pagare per cambiare stato all'interno della blockchain. // Per questo, abbiamo bisogno del firmatario dell'account... const signer = provider.getSigner() ``` -**Esempio da Web3js** +**Esempio con Web3js** ```js var web3 = new Web3("http://localhost:8545") -// o +// oppure var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) -// cambiamento di provider +// cambiare provider web3.setProvider("ws://localhost:8546") -// o +// oppure web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546")) -// Uso del provider IPC in node.js +// Usare il provider IPC in node.js var net = require("net") -var web3 = new Web3("/Users/myuser/Library/Ethereum/geth. pc", net) // mac os path -// o +var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // percorso mac os +// oppure var web3 = new Web3( new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net) -) // percorso MacOS -// in Windows il percorso è: "\\\\.\\pipe\\geth.ipc" -// in Linux il percorso è: "/users/myuser/.ethereum/geth.ipc"Web3 +) // percorso mac os +// su windows il percorso è: "\\\\.\\pipe\\geth.ipc" +// su linux il percorso è: "/users/myuser/.ethereum/geth.ipc" ``` -Una volta eseguita la configurazione, sarà possibile interrogare la blockchain per avere: +Una volta configurato, sarai in grado di interrogare la blockchain per: -- numeri di blocco +- numeri dei blocchi - stime del gas -- eventi del contratto intelligenti -- ID di rete -- e molto altro... +- eventi del contratto intelligente +- id della rete +- e altro ancora... ### Funzionalità del portafoglio {#wallet-functionality} -Queste librerie offrono le funzionalità per creare portafogli, gestire chiavi e firmare transazioni. +Queste librerie ti offrono funzionalità per creare portafogli, gestire chiavi e firmare transazioni. Ecco un esempio da Ethers ```js -// Creazione di un'istanza di portafoglio da un mnemonico... +// Crea un'istanza del portafoglio da una frase mnemonica... mnemonic = "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" walletMnemonic = Wallet.fromPhrase(mnemonic) @@ -88,11 +90,11 @@ walletPrivateKey = new Wallet(walletMnemonic.privateKey) walletMnemonic.address === walletPrivateKey.address // true -// L'indirizzo come una Promise per l'API del Firmatario +// L'indirizzo come Promise secondo l'API del Signer walletMnemonic.getAddress() // { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' } -// L'indirizzo di un Portafoglio è anche disponibile sincronicamente +// Un indirizzo del portafoglio è disponibile anche in modo sincrono walletMnemonic.address // '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' @@ -105,13 +107,13 @@ walletMnemonic.publicKey // La frase mnemonica del portafoglio walletMnemonic.mnemonic // { -// locale: 'en', -// path: 'm/44\'/60\'/0\'/0/0', -// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' +// locale: 'en', +// path: 'm/44\'/60\'/0\'/0/0', +// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' // } // Nota: Un portafoglio creato con una chiave privata non -// dispone di una frase mnemonica (la derivazione la previene) +// ha una frase mnemonica (la derivazione lo impedisce) walletPrivateKey.mnemonic // null @@ -129,7 +131,7 @@ walletMnemonic.signTransaction(tx) // { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' } // Il metodo connect restituisce una nuova istanza del -// Portafoglio connesso a un fornitore +// portafoglio connesso a un provider wallet = walletMnemonic.connect(provider) // Interrogare la rete @@ -142,33 +144,33 @@ wallet.getTransactionCount() wallet.sendTransaction(tx) ``` -[Consulta la documentazione completa](https://docs.ethers.io/v5/api/signer/#Wallet) +[Leggi la documentazione completa](https://docs.ethers.io/v5/api/signer/#Wallet) -Una volta eseguita la configurazione, sarà possibile: +Una volta configurato, sarai in grado di: -- creare conti +- creare account - inviare transazioni - firmare transazioni -- e molto altro... +- e altro ancora... ### Interagire con le funzioni dei contratti intelligenti {#interact-with-smart-contract-functions} -Le librerie del client di JavaScript consentono alla tua applicazione di chiamare le funzioni dei contratti intelligenti, leggendo l'Interfaccia Binaria dell'Applicazione (ABI) di un contratto compilato. +Le librerie client JavaScript consentono alla tua applicazione di chiamare le funzioni dei contratti intelligenti leggendo l'Application Binary Interface (ABI) di un contratto compilato. -L'ABI spiega essenzialmente le funzioni del contratto in un formato JSON e consente di utilizzarlo come un normale oggetto JavaScript. +L'ABI spiega essenzialmente le funzioni del contratto in un formato JSON e ti consente di utilizzarlo come un normale oggetto JavaScript. -Quindi il seguente contratto di Solidity: +Quindi il seguente contratto Solidity: ```solidity contract Test { uint a; address d = 0x12345678901234567890123456789012; - function Test(uint testInt) { a = testInt;} + constructor(uint testInt) { a = testInt;} event Event(uint indexed b, bytes32 c); - evento Event2(uint indexed b, bytes32 c); + event Event2(uint indexed b, bytes32 c); function foo(uint b, bytes32 c) returns(address) { Event(b, c); @@ -177,114 +179,122 @@ contract Test { } ``` -Si tradurrebbe nel seguente JSON: +Risulterebbe nel seguente JSON: ```json [{ "type":"constructor", "payable":false, "stateMutability":"nonpayable" - "inputs":[{"name":"testInt", type":"uint256"}], + "inputs":[{"name":"testInt","type":"uint256"}], },{ "type":"function", "name":"foo", "constant":false, "payable":false, - "stateMutabilità":"non payable", + "stateMutability":"nonpayable", "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}], - "outputs":[{"name":"", type":"address"}] + "outputs":[{"name":"","type":"address"}] },{ "type":"event", "name":"Event", - "inputs":[{"indexed":true, name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}], + "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}], "anonymous":false - }, + },{ "type":"event", "name":"Event2", - "inputs":[{"indexed":true,"name":"b", type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}], + "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}], "anonymous":false }] ``` -Ciò significa che è possibile: +Questo significa che puoi: -- Invia una transazione al contratto intelligente ed eseguine il metodo -- Chiamarla per stimare il gas che l'esecuzione di un metodo richiederà, all'esecuzione nell'EVM +- Inviare una transazione al contratto intelligente ed eseguire il suo metodo +- Chiamare per stimare il gas che richiederà l'esecuzione di un metodo quando eseguito nella EVM - Distribuire un contratto -- E molto altro... +- E altro ancora... ### Funzioni di utilità {#utility-functions} -Le funzioni di utilità forniscono pratiche scorciatoie che rendono la programmazione con Ethereum un po' più semplice. +Le funzioni di utilità ti offrono comode scorciatoie che rendono la costruzione con Ethereum un po' più semplice. -I valori ETH sono in Wei per default. 1 ETH = 1.000.000.000.000.000.000 WEI, un numero di cifre veramente elevato! `web3.utils.toWei` converte ether in Wei. +I valori in ETH sono in Wei per impostazione predefinita. 1 ETH = 1.000.000.000.000.000.000 WEI – questo significa che hai a che fare con molti numeri! `web3.utils.toWei` converte gli ether in Wei per te. -E in ethers funziona così: +E in ethers si presenta così: ```js -// Per ottenere il saldo di un account (per indirizzo o nome ENS) +// Ottenere il saldo di un account (tramite indirizzo o nome ENS) balance = await provider.getBalance("ethers.eth") // { BigNumber: "2337132817842795605" } -// Spesso è necessario formattare l'output per l'utente -// che preferisce vedere i valori in ether anziché in wei +// Spesso sarà necessario formattare l'output per l'utente +// che preferisce vedere i valori in ether (invece che in wei) ethers.utils.formatEther(balance) // '2.337132817842795605' ``` -- [Funzioni di utilità Web3js](https://docs.web3js.org/api/web3-utils) -- [Funzioni utilità ethers](https://docs.ethers.io/v5/api/utils/) +- [Funzioni di utilità di Web3js](https://docs.web3js.org/api/web3-utils) +- [Funzioni di utilità di Ethers](https://docs.ethers.org/v6/api/utils/) ## Librerie disponibili {#available-libraries} -**Web3.js -** **_API JavaScript Ethereum_** +**Web3.js -** **_API JavaScript di Ethereum._** -- [Documentazione](https://docs.web3js.org/) -- [GitHub](https://github.com/ethereum/web3.js/) +- [Documentazione](https://docs.web3js.org) +- [GitHub](https://github.com/ethereum/web3.js) -**Ethers.js -** **_Implementazione completa del portafoglio Ethereum e delle utility in JavaScript e TypeScript_** +**Ethers.js -** **_Implementazione completa del portafoglio Ethereum e utilità in JavaScript e TypeScript._** -- [Documentazione](https://docs.ethers.io/) -- [GitHub](https://github.com/ethers-io/ethers.js/) +- [Home di Ethers.js](https://ethers.org/) +- [Documentazione](https://docs.ethers.io) +- [GitHub](https://github.com/ethers-io/ethers.js) -**The Graph -** **_Protocollo per indicizzare i dati Ethereum e IPFS ed eseguire query con GraphQL_** +**The Graph -** **_Un protocollo per indicizzare i dati di Ethereum e IPFS e interrogarli utilizzando GraphQL._** -- [Graph](https://thegraph.com/) -- [Graph Explorer](https://thegraph.com/explorer/) -- [Documentazione](https://thegraph.com/docs/) -- [GitHub](https://github.com/graphprotocol/) +- [The Graph](https://thegraph.com) +- [Graph Explorer](https://thegraph.com/explorer) +- [Documentazione](https://thegraph.com/docs) +- [GitHub](https://github.com/graphprotocol) - [Discord](https://thegraph.com/discord) -**light.js -** **_Libreria JavaScript reattiva di alto livello, ottimizzata per i light client_** +**Alchemy SDK -** **_Wrapper per Ethers.js con API migliorate._** -- [GitHub](https://github.com/openethereum/js-libs/tree/master/packages/light.js) +- [Documentazione](https://www.alchemy.com/docs) +- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js) -**Alchemyweb3 -** **_Wrapper per Web3.js con nuovi tentativi automatici e API migliorate_** +**viem -** **_Interfaccia TypeScript per Ethereum._** -- [Documentazione](https://docs.alchemy.com/reference/api-overview) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) +- [Documentazione](https://viem.sh) +- [GitHub](https://github.com/wagmi-dev/viem) -**Alchemy NFT API -** **_API per recuperare i dati degli NFT, inclusi proprietà, attributi dei metadati e altro_** +**Codex -** **_API di dati blockchain arricchiti in tempo reale su decine di catene._** -- [Documentazione](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) -- [GitHub](https://github.com/alchemyplatform/alchemy-web3) +- [Documentazione](https://docs.codex.io) +- [Explorer](https://docs.codex.io/explore) +- [GitHub](https://github.com/Codex-Data) +- [Discord](https://discord.com/invite/mFpUhT3vAq) -**viem -** **_Interfaccia TypeScript per Ethereum._** +**Drift -** **_Meta-libreria TypeScript con caching integrato, hook e mock di test._** -- [Documentazione](https://viem.sh) -- [GitHub](https://github.com/wagmi-dev/viem) +- [Documentazione](https://ryangoree.github.io/drift/) +- [GitHub](https://github.com/ryangoree/drift/) -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [ Nodi e client](/developers/docs/nodes-and-clients/) -- [Quadri di sviluppo](/developers/docs/frameworks/) +- [Nodi e client](/developers/docs/nodes-and-clients/) +- [Framework di sviluppo](/developers/docs/frameworks/) ## Tutorial correlati {#related-tutorials} -- [Set up Web3js to use the Ethereum blockchain in JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Istruzioni per impostare web3.js in un progetto._ -- [Calling a Smart Contract from JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Usando il token DAI, impara come funzionano i contratti di chiamata con JavaScript_ -- [Sending transactions using web3 and Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Istruzioni passo passo per l'invio di transazioni dal backend._ +- [Configurare Web3js per usare la blockchain di Ethereum in JavaScript](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Istruzioni per configurare web3.js nel tuo progetto._ +- [Chiamare un contratto intelligente da JavaScript](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– Usando il token DAI, scopri come chiamare le funzioni dei contratti usando JavaScript._ +- [Inviare transazioni usando web3 e Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Guida passo passo per inviare transazioni dal backend._ + +## Tutorial: API JavaScript e WebSocket su Ethereum {#tutorials} + +- [Usare i WebSocket](/developers/tutorials/using-websockets/) _– Come usare i WebSocket con Alchemy per iscriversi agli eventi di Ethereum ed effettuare richieste JSON-RPC in tempo reale._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/apis/json-rpc/index.md b/public/content/translations/it/developers/docs/apis/json-rpc/index.md index 9f2295b0800..3e5735d5bdc 100644 --- a/public/content/translations/it/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/it/developers/docs/apis/json-rpc/index.md @@ -1,66 +1,66 @@ --- -title: API di JSON-RPC -description: Un protocollo di chiamata della procedura remota (RPC) leggero e privo di stato per i client di Ethereum. +title: API JSON-RPC +description: Un protocollo di chiamata di procedura remota (RPC) leggero e senza stato per i client di Ethereum. lang: it --- -Affinché un'applicazione software interagisca con la blockchain di Ethereum, leggendo i dati della blockchain o inviando transazioni alla rete, deve connettersi a un nodo di Ethereum. +Affinché un'applicazione software possa interagire con la blockchain di [Ethereum](/) - sia leggendo i dati della blockchain che inviando transazioni alla rete - deve connettersi a un nodo di Ethereum. -Per questo scopo, ogni [client di Ethereum](/developers/docs/nodes-and-clients/#execution-clients) implementa una [specifica JSON-RPC](https://github.com/ethereum/execution-apis), quindi esiste un insieme uniforme di metodi cui le applicazioni possono affidarsi, indipendentemente dagli specifici nodi o implementazioni del client. +A questo scopo, ogni [client di Ethereum](/developers/docs/nodes-and-clients/#execution-clients) implementa una [specifica JSON-RPC](https://github.com/ethereum/execution-apis), in modo che ci sia un insieme uniforme di metodi su cui le applicazioni possono fare affidamento indipendentemente dalla specifica implementazione del nodo o del client. -[JSON-RPC](https://www.jsonrpc.org/specification) è un protocollo di chiamata a procedura remota (RPC) leggero e privo di stato. Definisce diverse strutture di dati e le regole per la loro elaborazione. È indipendente dal trasporto, poiché i concetti sono utilizzabili entro lo stesso processo, su prese, via HTTP o in svariati ambienti di passaggio dei messaggi. Usa JSON (RFC 4627) come formato dei dati. +[JSON-RPC](https://www.jsonrpc.org/specification) è un protocollo di chiamata di procedura remota (RPC) leggero e senza stato. Definisce diverse strutture di dati e le regole per la loro elaborazione. È indipendente dal trasporto, in quanto i concetti possono essere utilizzati all'interno dello stesso processo, tramite socket, tramite HTTP o in molti ambienti diversi di passaggio di messaggi. Utilizza JSON (RFC 4627) come formato dei dati. -## Implementazioni del client {#client-implementations} +## Implementazioni dei client {#client-implementations} -I client di Ethereum possono usare linguaggi di programmazione diversi per l'implementazione della specifica di JSON-RPC. Visualizza la [documentazione dei singoli client](/developers/docs/nodes-and-clients/#execution-clients) per ulteriori dettagli sui linguaggi di programmazione specifici. Consigliamo di consultare la documentazione di ogni client per le informazioni più aggiornate sul supporto dell'API. +I client di Ethereum possono utilizzare linguaggi di programmazione diversi nell'implementazione della specifica JSON-RPC. Consulta la [documentazione dei singoli client](/developers/docs/nodes-and-clients/#execution-clients) per ulteriori dettagli relativi a specifici linguaggi di programmazione. Consigliamo di controllare la documentazione di ciascun client per le informazioni più recenti sul supporto delle API. -## Librerie utili {#convenience-libraries} +## Librerie di utilità {#convenience-libraries} -Anche se è possibile scegliere di interagire direttamente con i client di Ethereum tramite l'API di JSON-RPC, spesso esistono opzioni più semplici per gli sviluppatori di dApp. Esistono molte librerie di [JavaScript](/developers/docs/apis/javascript/#available-libraries) e dell'[API del backend](/developers/docs/apis/backend/#available-libraries) che forniscono wrapper sull'API di JSON-RPC. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una riga nel linguaggio di programmazione di loro scelta per inizializzare le richieste di JSON-RPC (sottostanti) che interagiscono con Ethereum. +Sebbene tu possa scegliere di interagire direttamente con i client di Ethereum tramite l'API JSON-RPC, ci sono spesso opzioni più semplici per gli sviluppatori di dApp. Esistono molte librerie [JavaScript](/developers/docs/apis/javascript/#available-libraries) e [API di backend](/developers/docs/apis/backend/#available-libraries) che forniscono wrapper sopra l'API JSON-RPC. Con queste librerie, gli sviluppatori possono scrivere metodi intuitivi di una sola riga nel linguaggio di programmazione scelto per inizializzare richieste JSON-RPC (dietro le quinte) che interagiscono con Ethereum. -## API del client di consenso {#consensus-clients} +## API dei client di consenso {#consensus-clients} -Questa pagina tratta principalmente dell'API di JSON-RPC usata dai client di esecuzione di Ethereum. Tuttavia, anche i client del consenso hanno un'API RPC che consente agli utenti di interrogare le informazioni sul nodo, richiedere blocchi della Beacon, lo stato della Beacon e altre informazioni correlate al consenso, direttamente da un nodo. Questa API è documentata sulla [pagina web dell'API Beacon](https://ethereum.github.io/beacon-APIs/#/). +Questa pagina tratta principalmente l'API JSON-RPC utilizzata dai client di esecuzione di Ethereum. Tuttavia, anche i client di consenso dispongono di un'API RPC che consente agli utenti di richiedere informazioni sul nodo, richiedere blocchi Beacon, lo stato Beacon e altre informazioni relative al consenso direttamente da un nodo. Questa API è documentata sulla [pagina web dell'API Beacon](https://ethereum.github.io/beacon-APIs/#/). -Inoltre, un'API interna viene usata per la comunicazione tra client in un nodo, ovvero consente al client di consenso e al client di esecuzione di scambiarsi dati. Questa è detta "Engine API" e le specifiche sono disponibili su [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). +Un'API interna viene utilizzata anche per la comunicazione tra client all'interno di un nodo, ovvero consente al client di consenso e al client di esecuzione di scambiarsi dati. Questa è chiamata 'Engine API' e le specifiche sono disponibili su [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). ## Specifiche del client di esecuzione {#spec} -[Leggi le specifiche complete dell'API JSON-RPC su GitHub](https://github.com/ethereum/execution-apis). Questa API è documentata nella [pagina web dell'API di esecuzione](https://ethereum.github.io/execution-apis/api-documentation/) e include un ispettore per provare tutti i metodi disponibili. +[Leggi le specifiche complete dell'API JSON-RPC su GitHub](https://github.com/ethereum/execution-apis). Questa API è documentata sulla [pagina web dell'API di esecuzione](https://ethereum.github.io/execution-apis/) e include un Inspector per provare tutti i metodi disponibili. ## Convenzioni {#conventions} -### Codifica del valore esadecimale {#hex-encoding} +### Codifica dei valori esadecimali {#hex-encoding} -Su JSON vengono passati due tipi di dati chiave: insiemi di byte non formattati e quantità. Entrambi vengono passati con una codifica esadecimale, ma con requisiti di formattazione differenti. +Due tipi di dati chiave vengono passati tramite JSON: array di byte non formattati e quantità. Entrambi vengono passati con una codifica esadecimale ma con requisiti diversi per la formattazione. #### Quantità {#quantities-encoding} -Per la codifica delle quantità (interi, numeri): codifica come esadecimali, prefisso "0x", la rappresentazione più compatta (lieve eccezione: zero dovrebbe essere rappresentato come "0x0"). +Quando si codificano quantità (interi, numeri): codificare come esadecimale, prefissare con "0x", la rappresentazione più compatta (piccola eccezione: lo zero dovrebbe essere rappresentato come "0x0"). Ecco alcuni esempi: - 0x41 (65 in decimale) - 0x400 (1024 in decimale) -- ERRATO: 0x (dovrebbe sempre avere almeno una cifra: zero è "0x0") -- ERRATO: 0x0400 (nessuno zero iniziale consentito) -- ERRATO: ff (deve avere il prefisso 0x) +- SBAGLIATO: 0x (dovrebbe avere sempre almeno una cifra - lo zero è "0x0") +- SBAGLIATO: 0x0400 (non sono ammessi zeri iniziali) +- SBAGLIATO: ff (deve essere prefissato con 0x) ### Dati non formattati {#unformatted-data-encoding} -Codificando i dati non formattati (insiemi di dati, indirizzi dei conti, hash, insiemi di bytecode): codifica come esadecimali, prefisso "0x", due cifre esadecimali per byte. +Quando si codificano dati non formattati (array di byte, indirizzi di account, hash, array di bytecode): codificare come esadecimale, prefissare con "0x", due cifre esadecimali per byte. Ecco alcuni esempi: - 0x41 (dimensione 1, "A") - 0x004200 (dimensione 3, "0B0") - 0x (dimensione 0, "") -- ERRATO: 0xf0f0f (dev'essere un numero di cifre pari) -- ERRATO: 004200 (deve avere il prefisso 0x) +- SBAGLIATO: 0xf0f0f (deve essere un numero pari di cifre) +- SBAGLIATO: 004200 (deve essere prefissato con 0x) -### Il parametro del blocco predefinito {#default-block} +### Il parametro del blocco {#block-parameter} -I seguenti metodi hanno un parametro del blocco predefinito aggiuntivo: +I seguenti metodi hanno un parametro del blocco: - [eth_getBalance](#eth_getbalance) - [eth_getCode](#eth_getcode) @@ -68,45 +68,45 @@ I seguenti metodi hanno un parametro del blocco predefinito aggiuntivo: - [eth_getStorageAt](#eth_getstorageat) - [eth_call](#eth_call) -Quando sono effettuate richieste che agiscono sullo stato di Ethereum, il parametro dell'ultimo blocco predefinito determina l'altezza del blocco. +Quando vengono fatte richieste che interrogano lo stato di Ethereum, il parametro del blocco fornito determina l'altezza del blocco. -Le seguenti opzioni sono possibili per il parametro defaultBlock: +Le seguenti opzioni sono possibili per il parametro del blocco: -- `HEX String` - un numero intero del blocco -- `String "earliest"` per il primo blocco o quello di genesi -- `String "latest"` - per l'ultimo blocco proposto -- `String "safe"` - per l'ultimo blocco di testa sicuro -- `String "finalized"` - per l'ultimo blocco finalizzato -- `String "pending"` - per lo stato/le transazioni in sospeso +- `Stringa HEX` - un numero di blocco intero +- `Stringa "earliest"` per il primo blocco o blocco genesi +- `Stringa "latest"` - per l'ultimo blocco proposto +- `Stringa "safe"` - per l'ultimo blocco head sicuro +- `Stringa "finalized"` - per l'ultimo blocco finalizzato +- `Stringa "pending"` - per lo stato o le transazioni in sospeso ## Esempi -Su questa pagina forniamo esempi su come usare gli endpoint individuali dell'API JSON_RPC usando lo strumento della riga di comando, [curl](https://curl.se). Questi esempi di endpoint individuali si trovano di seguito nella sezione [esempi di Curl](#curl-examples). In seguito nella pagina, forniamo anche un [esempio completo](#usage-example) per la compilazione e la distribuzione di un contratto intelligente usando un nodo di Geth, l'API JSON_RPC e curl. +In questa pagina forniamo esempi di come utilizzare i singoli endpoint dell'API JSON_RPC usando lo strumento a riga di comando, [curl](https://curl.se). Questi esempi di singoli endpoint si trovano di seguito nella sezione [Esempi di curl](#curl-examples). Più in basso nella pagina, forniamo anche un [esempio end-to-end](#usage-example) per compilare e distribuire un contratto intelligente utilizzando un nodo Geth, l'API JSON_RPC e curl. -## Esempi di Curl {#curl-examples} +## Esempi con curl {#curl-examples} -Di seguito sono riportati esempi dell'uso dell'API di JSON_RPC effettuando richieste di [curl](https://curl.se) a un nodo di Ethereum. Ogni esempio include una descrizione dell'endpoint specifico, i suoi parametri, il tipo di restituzione e un esempio definito di come dovrebbe essere utilizzato. +Di seguito sono forniti esempi di utilizzo dell'API JSON_RPC effettuando richieste [curl](https://curl.se) a un nodo Ethereum. Ogni esempio include una descrizione dell'endpoint specifico, i suoi parametri, il tipo di ritorno e un esempio pratico di come dovrebbe essere utilizzato. -Le richieste di curl potrebbero restituire un messaggio d'errore correlato al tipo di contenuto. Ciò avviene perché l'opzione `--data` imposta il tipo di contenuto su `application/x-www-form-urlencoded`. Se il tuo nodo se ne lamenta, imposta manualmente l'intestazione posizionando `-H "Content-Type: application/json"` all'inizio della chiamata. Gli esempi, inoltre, non includono la combinazione di URL/IP e porta, che deve essere l'ultimo argomento fornito al curl (ad es. `127.0.0.1:8545`). Una richiesta di curl completa, comprensiva di questi dati aggiuntivi, assume la seguente forma: +Le richieste curl potrebbero restituire un messaggio di errore relativo al tipo di contenuto. Questo perché l'opzione `--data` imposta il tipo di contenuto su `application/x-www-form-urlencoded`. Se il tuo nodo segnala un problema al riguardo, imposta manualmente l'intestazione inserendo `-H "Content-Type: application/json"` all'inizio della chiamata. Inoltre, gli esempi non includono la combinazione di URL/IP e porta, che deve essere l'ultimo argomento fornito a curl (es. `127.0.0.1:8545`). Una richiesta curl completa che include questi dati aggiuntivi assume la seguente forma: ```shell curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545 ``` -## Gossip, Stato, Storico {#gossip-state-history} +## Gossip, Stato, Cronologia {#gossip-state-history} -Alcuni metodi base del protocollo JSON-RPC richiedono dati dalla rete di Ethereum e rientrano in tre importanti categorie:_Gossip, Stato e Storico_. Usa i collegamenti in questa sezione per passare da un metodo all'altro oppure usa la tabella di contenuti per esplorare l'intera lista di metodi. +Una manciata di metodi JSON-RPC principali richiede dati dalla rete di Ethereum e rientra ordinatamente in tre categorie principali: _Gossip, Stato e Cronologia_. Usa i link in queste sezioni per passare a ciascun metodo, oppure usa il sommario per esplorare l'intero elenco dei metodi. ### Metodi di Gossip {#gossip-methods} -> Questi metodi tracciano la testa della catena. Ecco come le transazioni si fanno strada all'interno della rete ed entrano nei blocchi e come i Client fanno ricerche sui nuovi blocchi. +> Questi metodi tracciano la testa della catena. È così che le transazioni si fanno strada nella rete, trovano posto nei blocchi e come i client scoprono i nuovi blocchi. - [eth_blockNumber](#eth_blocknumber) - [eth_sendRawTransaction](#eth_sendrawtransaction) ### Metodi di Stato {#state_methods} -> Metodi che indicano lo stato corrente di tutti i dati immagazzinati. Lo "stato" è come una grande porzione di RAM condivisa, che include i saldi dei conti, i dati dei contratti e le stime del gas. +> Metodi che riportano lo stato attuale di tutti i dati memorizzati. Lo "stato" è come un grande pezzo di RAM condivisa e include i saldi degli account, i dati dei contratti e le stime del gas. - [eth_getBalance](#eth_getbalance) - [eth_getStorageAt](#eth_getstorageat) @@ -115,9 +115,9 @@ Alcuni metodi base del protocollo JSON-RPC richiedono dati dalla rete di Ethereu - [eth_call](#eth_call) - [eth_estimateGas](#eth_estimategas) -### Metodi dello Storico {#history_methods} +### Metodi di Cronologia {#history_methods} -> Recupera lo storico dei record di ogni blocco fino alla genesi. Può essere paragonato a un grande file Append-Only contenente tutte le intestazioni del blocco, i corpi del blocco, i blocchi ommer (zio) e le ricevute delle transazioni. +> Recupera i registri storici di ogni blocco fino alla genesi. Questo è come un grande file di sola aggiunta e include tutte le intestazioni dei blocchi, i corpi dei blocchi, i blocchi uncle e le ricevute delle transazioni. - [eth_getBlockTransactionCountByHash](#eth_getblocktransactioncountbyhash) - [eth_getBlockTransactionCountByNumber](#eth_getblocktransactioncountbynumber) @@ -132,15 +132,15 @@ Alcuni metodi base del protocollo JSON-RPC richiedono dati dalla rete di Ethereu - [eth_getUncleByBlockHashAndIndex](#eth_getunclebyblockhashandindex) - [eth_getUncleByBlockNumberAndIndex](#eth_getunclebyblocknumberandindex) -## Playground dell'API di JSON-RPC +## Playground dell'API JSON-RPC -Puoi utilizzare lo [strumento playground](https://ethereum-json-rpc.com) per scoprire e provare i metodi dell'API. Inoltre, ti mostra le reti e i metodi supportati dai vari fornitori di nodi. +Puoi usare lo [strumento playground](https://ethereum-json-rpc.com) per scoprire e provare i metodi dell'API. Ti mostra anche quali metodi e reti sono supportati dai vari provider di nodi. -## I metodi dell'API JSON-RPC {#json-rpc-methods} +## Metodi dell'API JSON-RPC {#json-rpc-methods} ### web3_clientVersion {#web3_clientversion} -Restituisce la versione del client corrente. +Restituisce la versione attuale del client. **Parametri** @@ -148,7 +148,7 @@ Nessuno **Restituisce** -`String` - La versione del client corrente +`String` - La versione attuale del client **Esempio** @@ -165,7 +165,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], ### web3_sha3 {#web3_sha3} -Restituisce Keccak-256 (_non_ lo SHA3-256 standardizzato) dei dati forniti. +Restituisce il Keccak-256 (_non_ lo SHA3-256 standardizzato) dei dati forniti. **Parametri** @@ -177,14 +177,14 @@ params: ["0x68656c6c6f20776f726c64"] **Restituisce** -`DATA` - Il risultato di SHA3 della stringa data. +`DATA` - Il risultato SHA3 della stringa fornita. **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}' -// Result +// Risultato { "id":64, "jsonrpc": "2.0", @@ -194,7 +194,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c ### net_version {#net_version} -Restituisce l'id di rete corrente. +Restituisce l'id attuale della rete. **Parametri** @@ -202,20 +202,20 @@ Nessuno **Restituisce** -`String` - L'id di rete corrente. +`String` - L'id attuale della rete. -L'elenco completo degli ID di rete correnti è disponibile su [chainlist.org](https://chainlist.org). Alcuni ID comuni sono: +L'elenco completo degli ID di rete attuali è disponibile su [chainlist.org](https://chainlist.org). Alcuni tra i più comuni sono: -- `1`: Rete Principale di Ethereum -- `11155111`: rete di prova Sepolia -- `560048`: rete di prova Hoodi +- `1`: Rete principale di Ethereum +- `11155111`: Rete di test di Sepolia +- `560048` : Rete di test di Hoodi **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' -// Result +// Risultato { "id":67, "jsonrpc": "2.0", @@ -225,7 +225,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67 ### net_listening {#net_listening} -Restituisce `true` se il client sta ascoltando attivamente le connessioni di rete. +Restituisce `true` se il client è in ascolto attivo per le connessioni di rete. **Parametri** @@ -238,9 +238,9 @@ Nessuno **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}' -// Result +// Risultato { "id":67, "jsonrpc":"2.0", @@ -250,7 +250,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id": ### net_peerCount {#net_peercount} -Restituisce il numero di pari attualmente connessi al client. +Restituisce il numero di peer attualmente connessi al client. **Parametri** @@ -258,14 +258,14 @@ Nessuno **Restituisce** -`QUANTITY` - intero del numero di pari connessi. +`QUANTITY` - intero del numero di peer connessi. **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' -// Result +// Risultato { "id":74, "jsonrpc": "2.0", @@ -275,7 +275,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id": ### eth_protocolVersion {#eth_protocolversion} -Restituisce la versione corrente del protocollo di Ethereum. Si noti che questo metodo [non è disponibile su Geth](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). +Restituisce la versione attuale del protocollo di Ethereum. Nota che questo metodo [non è disponibile in Geth](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). **Parametri** @@ -283,14 +283,14 @@ Nessuno **Restituisce** -`String` - La versione del protocollo di Ethereum corrente +`String` - La versione attuale del protocollo di Ethereum **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}' -// Result +// Risultato { "id":67, "jsonrpc": "2.0", @@ -300,7 +300,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] ### eth_syncing {#eth_syncing} -Restituisce un oggetto con i dati sullo stato di sincronizzazione o `false`. +Restituisce un oggetto con i dati sullo stato della sincronizzazione o `false`. + + + Prova l'endpoint nel playground + **Parametri** @@ -308,15 +312,15 @@ Nessuno **Restituisce** -I dati restituiti precisi variano a seconda delle implementazioni del client. Tutti i client restituiscono `False` quando il nodo non si sta sincronizzando, e tutti i client restituiscono i seguenti campi. +I dati precisi restituiti variano tra le implementazioni dei client. Tutti i client restituiscono `False` quando il nodo non si sta sincronizzando e tutti i client restituiscono i seguenti campi. -`Object|Boolean`, un oggetto con i dati dello stato di sincronizzazione o `FALSE`, quando non è in sincronizzazione: +`Object|Boolean`, Un oggetto con i dati dello stato di sincronizzazione o `FALSE`, quando non in sincronizzazione: -- `startingBlock`: `QUANTITY` - Il blocco in cui è iniziata l'importazione (si ripristina soltanto dopo che la sincronizzazione ha raggiunto la sua testa) -- `currentBlock`: `QUANTITY` - Il blocco corrente, uguale a eth_blockNumber +- `startingBlock`: `QUANTITY` - Il blocco al quale è iniziata l'importazione (sarà ripristinato solo dopo che la sincronizzazione avrà raggiunto la sua testa) +- `currentBlock`: `QUANTITY` - Il blocco attuale, uguale a eth_blockNumber - `highestBlock`: `QUANTITY` - Il blocco più alto stimato -Tuttavia, i singoli client potrebbero anche fornire ulteriori dati. Ad esempio, Geth, restituisce quanto segue: +Tuttavia, i singoli client possono anche fornire dati aggiuntivi. Ad esempio, Geth restituisce quanto segue: ```json { @@ -357,7 +361,7 @@ Mentre Besu restituisce: } ``` -Si rimanda alla documentazione del client specifico per ulteriori dettagli. +Fai riferimento alla documentazione del tuo client specifico per maggiori dettagli. **Esempio** @@ -374,7 +378,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} highestBlock: '0x454' } } -// O quando non sta sincronizzando +// O quando non è in sincronizzazione { "id":1, "jsonrpc": "2.0", @@ -384,9 +388,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} ### eth_coinbase {#eth_coinbase} -Restituisce l'indirizzo di coinbase del client. +Restituisce l'indirizzo coinbase del client. + + + Prova l'endpoint nel playground + -> **Nota:** Questo metodo è stato deprecato alla **v1.14.0** e non è più supportato. Tentare di utilizzarlo risulterà in un errore "Metodo non supportato". +> **Nota:** Questo metodo è stato deprecato a partire dalla **v1.14.0** e non è più supportato. Il tentativo di utilizzare questo metodo comporterà un errore "Method not supported". **Parametri** @@ -394,7 +402,7 @@ Nessuno **Restituisce** -`DATA`, 20 byte - l'indirizzo di coinbase corrente. +`DATA`, 20 byte - l'indirizzo coinbase attuale. **Esempio** @@ -411,7 +419,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 ### eth_chainId {#eth_chainId} -Restituisce l'ID della catena utilizzato per firmare le transazioni protette da riproduzione. +Restituisce l'ID della catena utilizzato per firmare le transazioni protette da replay. + + + Prova l'endpoint nel playground + **Parametri** @@ -419,7 +431,7 @@ Nessuno **Restituisce** -`chainId`, valore esadecimale come stringa rappresentante l'intero dell'ID della catena corrente. +`chainId`, valore esadecimale come stringa che rappresenta l'intero dell'id della catena attuale. **Esempio** @@ -436,7 +448,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 ### eth_mining {#eth_mining} -Restituisce `true` se il client sta minando attivamente nuovi blocchi. Può restituire `true` soltanto per le reti di proof-of-work e potrebbe non essere disponibile in alcuni client da [La Fusione](/roadmap/merge/). +Restituisce `true` se il client sta attivamente minando nuovi blocchi. Questo può restituire `true` solo per le reti a prova di lavoro e potrebbe non essere disponibile in alcuni client da [La Fusione](/roadmap/merge/). + + + Prova l'endpoint nel playground + **Parametri** @@ -451,7 +467,7 @@ Nessuno ```js // Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}' -// + { "id":71, "jsonrpc": "2.0", @@ -461,7 +477,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} ### eth_hashrate {#eth_hashrate} -Restituisce il numero di hash al secondo con cui il nodo sta minando. Può restituire `true` soltanto per le reti di proof-of-work e potrebbe non essere disponibile in alcuni client da [La Fusione](/roadmap/merge/). +Restituisce il numero di hash al secondo con cui il nodo sta minando. Questo può restituire `true` solo per le reti a prova di lavoro e potrebbe non essere disponibile in alcuni client da [La Fusione](/roadmap/merge/). + + + Prova l'endpoint nel playground + **Parametri** @@ -486,7 +506,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 ### eth_gasPrice {#eth_gasprice} -Restituisce una stima del prezzo corrente per gas, in wei. Ad esempio, il client di Besu esamina gli ultimi 100 blocchi e restituisce il prezzo unitario medio del gas di default. +Restituisce una stima del prezzo del gas attuale in wei. Ad esempio, il client Besu esamina gli ultimi 100 blocchi e restituisce il prezzo unitario mediano del gas per impostazione predefinita. + + + Prova l'endpoint nel playground + **Parametri** @@ -494,7 +518,7 @@ Nessuno **Restituisce** -`QUANTITY` - intero del prezzo corrente del gas in wei. +`QUANTITY` - intero del prezzo del gas attuale in wei. **Esempio** @@ -513,13 +537,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 Restituisce un elenco di indirizzi posseduti dal client. + + Prova l'endpoint nel playground + + **Parametri** Nessuno **Restituisce** -`Array of DATA`, 20 Byte - indirizzi posseduti dal client. +`Array di DATA`, 20 Byte - indirizzi posseduti dal client. **Esempio** @@ -538,13 +566,17 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1 Restituisce il numero del blocco più recente. + + Prova l'endpoint nel playground + + **Parametri** Nessuno **Restituisce** -`QUANTITY` - intero del numero di blocco corrente su cui è attivo il client. +`QUANTITY` - intero del numero di blocco attuale su cui si trova il client. **Esempio** @@ -561,12 +593,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id ### eth_getBalance {#eth_getbalance} -Restituisce il saldo del conto del dato indirizzo. +Restituisce il saldo dell'account a un dato indirizzo. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 20 byte - indirizzo per controllare il saldo. -2. `QUANTITY|TAG` - intero del numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Byte - indirizzo di cui controllare il saldo. +2. `QUANTITY|TAG` - numero di blocco intero, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"`, o `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) ```js params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] @@ -574,7 +610,7 @@ params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] **Restituisce** -`QUANTITY` - intero del saldo corrente in wei. +`QUANTITY` - intero del saldo attuale in wei. **Esempio** @@ -593,23 +629,28 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 Restituisce il valore da una posizione di archiviazione a un dato indirizzo. + + Prova l'endpoint nel playground + + **Parametri** -1. `DATA`, 20 byte - Indirizzo di archiviazione. -2. `QUANTITY` - intero della posizione di archiviazione. -3. `QUANTITY|TAG` - intero del numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Byte - indirizzo dell'archiviazione. +2. `QUANTITY` - intero della posizione nell'archiviazione. +3. `QUANTITY|TAG` - numero di blocco intero, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"`, `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) **Restituisce** `DATA` - il valore in questa posizione di archiviazione. -**Esempio** Il calcolo della posizione corretta dipende dall'archiviazione da recuperare. Considera il seguente contratto distribuito su `0x295a70b2de5e3953354a6a8344e616ed314d7251` dall'indirizzo `0x391694e7e0b0cce554cb130d723a9d27458f9298`. +**Esempio** +Il calcolo della posizione corretta dipende dall'archiviazione da recuperare. Considera il seguente contratto distribuito a `0x295a70b2de5e3953354a6a8344e616ed314d7251` dall'indirizzo `0x391694e7e0b0cce554cb130d723a9d27458f9298`. ``` contract Storage { uint pos0; mapping(address => uint) pos1; - function Storage() { + constructor() { pos0 = 1234; pos1[msg.sender] = 5678; } @@ -629,7 +670,7 @@ Recuperare un elemento della mappa è più difficile. La posizione di un element keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` -Ciò significa che per recuperare l'archiviazione in pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] dobbiamo calcolare la posizione con: +Questo significa che per recuperare l'archiviazione su pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] dobbiamo calcolare la posizione con: ```js keccak( @@ -640,7 +681,7 @@ keccak( ) ``` -La console geth che viene fornita con la libreria web3 può essere utilizzata per effettuare il calcolo: +La console di geth fornita con la libreria web3 può essere utilizzata per effettuare il calcolo: ```js > var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" @@ -649,7 +690,7 @@ undefined "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" ``` -A questo punto, per recuperare l'archiviazione: +Ora per recuperare l'archiviazione: ```js curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 @@ -658,12 +699,16 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ ### eth_getTransactionCount {#eth_gettransactioncount} -Restituisce il numero di transazioni _inviate_da un indirizzo. +Restituisce il numero di transazioni _inviate_ da un indirizzo. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 20 byte - indirizzo. -2. `QUANTITY|TAG` - intero del numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Byte - indirizzo. +2. `QUANTITY|TAG` - numero di blocco intero, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -691,11 +736,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params ### eth_getBlockTransactionCountByHash {#eth_getblocktransactioncountbyhash} -Restituisce il numero di transazioni in un blocco da un blocco corrispondente al dato hash del blocco. +Restituisce il numero di transazioni in un blocco da un blocco che corrisponde all'hash del blocco fornito. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 32 byte - hash di un blocco +1. `DATA`, 32 Byte - hash di un blocco ```js params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"] @@ -708,9 +757,9 @@ params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"] **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}' -// Result +// Risultato { "id":1, "jsonrpc": "2.0", @@ -720,11 +769,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHa ### eth_getBlockTransactionCountByNumber {#eth_getblocktransactioncountbynumber} -Restituisce il numero di transazioni in un blocco corrispondente al numero di blocco specificato. +Restituisce il numero di transazioni in un blocco che corrisponde al numero di blocco fornito. + + + Prova l'endpoint nel playground + **Parametri** -1. `QUANTITY|TAG` - intero del numero di un blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - intero di un numero di blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter). ```js params: [ @@ -739,9 +792,9 @@ params: [ **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}' -// Result +// Risultato { "id":1, "jsonrpc": "2.0", @@ -751,11 +804,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNu ### eth_getUncleCountByBlockHash {#eth_getunclecountbyblockhash} -Restituisce il numero di ommer in un blocco da un blocco che corrisponde all'hash del blocco specificato. +Restituisce il numero di uncle in un blocco da un blocco che corrisponde all'hash del blocco fornito. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 32 Bytes - Hash di un blocco +1. `DATA`, 32 Byte - hash di un blocco ```js params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"] @@ -763,14 +820,14 @@ params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"] **Restituisce** -`QUANTITY` - intero del numero di ommer in questo blocco. +`QUANTITY` - intero del numero di uncle in questo blocco. **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}' -// Result +// Risultato { "id":1, "jsonrpc": "2.0", @@ -780,11 +837,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","p ### eth_getUncleCountByBlockNumber {#eth_getunclecountbyblocknumber} -Restituisce il numero di ommer in un blocco da un blocco che corrisponde all'hash del blocco specificato. +Restituisce il numero di uncle in un blocco da un blocco che corrisponde al numero di blocco fornito. + + + Prova l'endpoint nel playground + **Parametri** -1. `QUANTITY|TAG` - intero del numero di un blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +1. `QUANTITY|TAG` - intero di un numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -794,14 +855,14 @@ params: [ **Restituisce** -`QUANTITY` - intero del numero di ommer in questo blocco. +`QUANTITY` - intero del numero di uncle in questo blocco. **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' -// Result +// Risultato { "id":1, "jsonrpc": "2.0", @@ -811,12 +872,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber", ### eth_getCode {#eth_getcode} -Restituisce il codice ad un dato indirizzo. +Restituisce il codice a un dato indirizzo. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 20 byte - indirizzo -2. `QUANTITY|TAG` - intero del numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +1. `DATA`, 20 Byte - indirizzo +2. `QUANTITY|TAG` - numero di blocco intero, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) ```js params: [ @@ -832,9 +897,9 @@ params: [ **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}' -// Result +// Risultato { "id":1, "jsonrpc": "2.0", @@ -844,16 +909,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA ### eth_sign {#eth_sign} -Il metodo della firma calcola una firma specifica di Ethereum con: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. +Il metodo sign calcola una firma specifica di Ethereum con: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. -Aggiungendo un prefisso al messaggio si rende la firma calcolata riconoscibile come firma specifica di Ethereum. Ciò impedisce l'uso improprio in cui una dapp malevola può firmare i dati arbitrari (es. la transazione) e usare la firma per impersonare la vittima. +L'aggiunta di un prefisso al messaggio rende la firma calcolata riconoscibile come una firma specifica di Ethereum. Questo previene abusi in cui una dApp malevola può firmare dati arbitrari (es. una transazione) e utilizzare la firma per impersonare la vittima. Nota: l'indirizzo con cui firmare deve essere sbloccato. **Parametri** -1. `DATA`, 20 Bytes - indirizzo -2. `DATA`, N byte - messaggio da firmare +1. `DATA`, 20 Byte - indirizzo +2. `DATA`, N Byte - messaggio da firmare **Restituisce** @@ -874,24 +939,24 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d37 ### eth_signTransaction {#eth_signtransaction} -Firma una transazione che può essere inviata alla rete in un secondo momento utilizzando [eth_sendRawTransaction](#eth_sendrawtransaction). +Firma una transazione che può essere inviata alla rete in un momento successivo utilizzando [eth_sendRawTransaction](#eth_sendrawtransaction). **Parametri** 1. `Object` - L'oggetto della transazione - `type`: -- `from`: `DATA`, 20 byte - L'indirizzo da cui viene inviata la transazione. -- `to`: `DATA`, 20 byte - (facoltativo quando si crea un nuovo contratto) L'indirizzo a cui è indirizzata la transazione. -- `gas`: `QUANTITY` - (facoltativo, predefinito: 90000) Intero del carburante fornito per l'esecuzione della transazione. Restituirà il carburante inutilizzato. -- `gasPrice`: `QUANTITY` - (facoltativo, predefinito: To-Be-Determined) Intero del gasPrice usato per ogni unità di carburante pagata, in Wei. -- `value`: `QUANTITY` - (facoltativo) Intero del valore inviato con questa transazione, in Wei. -- `data`: `DATA` - Il codice compilato di un contratto OPPURE l'hash della firma del metodo richiamato e i parametri codificati. -- `nonce`: `QUANTITY` - (facoltativo) Intero di un nonce. Ciò permette di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce. +- `from`: `DATA`, 20 Byte - L'indirizzo da cui viene inviata la transazione. +- `to`: `DATA`, 20 Byte - (opzionale quando si crea un nuovo contratto) L'indirizzo a cui è diretta la transazione. +- `gas`: `QUANTITY` - (opzionale, predefinito: 90000) Intero del gas fornito per l'esecuzione della transazione. Restituirà il gas non utilizzato. +- `gasPrice`: `QUANTITY` - (opzionale, predefinito: Da determinare) Intero del gasPrice utilizzato per ogni gas pagato, in Wei. +- `value`: `QUANTITY` - (opzionale) Intero del valore inviato con questa transazione, in Wei. +- `data`: `DATA` - Il codice compilato di un contratto OPPURE l'hash della firma del metodo invocato e dei parametri codificati. +- `nonce`: `QUANTITY` - (opzionale) Intero di un nonce. Questo consente di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce. **Restituisce** -`DATA`, L'oggetto della transazione codificata in RLP, firmato dal conto specificato. +`DATA`, L'oggetto della transazione codificato in RLP firmato dall'account specificato. **Esempio** @@ -908,19 +973,19 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction"," ### eth_sendTransaction {#eth_sendtransaction} -Crea la transazione di chiamata del nuovo messaggio o la creazione di un contratto, se il campo dei dati contiene del codice, e la firma utilizzando il conto specificato in `from`. +Crea una nuova transazione di chiamata di messaggio o la creazione di un contratto, se il campo dati contiene codice, e la firma utilizzando l'account specificato in `from`. **Parametri** -1. `Oggetto` - L'oggetto della transazione +1. `Object` - L'oggetto della transazione -- `from`: `DATA`, 20 byte - L'indirizzo da cui viene inviata la transazione. -- `to`: `DATA`, 20 byte - (facoltativo quando si crea un nuovo contratto) L'indirizzo a cui è indirizzata la transazione. -- `gas`: `QUANTITY` - (facoltativo, predefinito: 90000) Intero del carburante fornito per l'esecuzione della transazione. Restituirà il carburante inutilizzato. -- `gasPrice`: `QUANTITY` - (facoltativo, predefinito: To-Be-Determined) Intero del gasPrice usato per ogni unità di carburante pagata. -- `value`: `QUANTITY` - (facoltativo) Intero del valore inviato con questa transazione, in Wei. -- `input`: `DATA` - Il codice compilato di un contratto O l'hash della firma del metodo invocato e i parametri codificati. -- `nonce`: `QUANTITY` - (facoltativo) Intero di un nonce. Ciò permette di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce. +- `from`: `DATA`, 20 Byte - L'indirizzo da cui viene inviata la transazione. +- `to`: `DATA`, 20 Byte - (opzionale quando si crea un nuovo contratto) L'indirizzo a cui è diretta la transazione. +- `gas`: `QUANTITY` - (opzionale, predefinito: 90000) Intero del gas fornito per l'esecuzione della transazione. Restituirà il gas non utilizzato. +- `gasPrice`: `QUANTITY` - (opzionale, predefinito: Da determinare) Intero del gasPrice utilizzato per ogni gas pagato. +- `value`: `QUANTITY` - (opzionale) Intero del valore inviato con questa transazione. +- `input`: `DATA` - Il codice compilato di un contratto OPPURE l'hash della firma del metodo invocato e dei parametri codificati. +- `nonce`: `QUANTITY` - (opzionale) Intero di un nonce. Questo consente di sovrascrivere le proprie transazioni in sospeso che utilizzano lo stesso nonce. ```js params: [ @@ -938,9 +1003,9 @@ params: [ **Restituisce** -`DATA`, 32 Bytes - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile. +`DATA`, 32 Byte - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile. -Usa [eth_getTransactionReceipt](#eth_gettransactionreceipt) quando hai creato un contratto per ottenere l'indirizzo del contratto dopo che la transazione è stata proposta in un blocco. +Usa [eth_getTransactionReceipt](#eth_gettransactionreceipt) per ottenere l'indirizzo del contratto, dopo che la transazione è stata proposta in un blocco, quando hai creato un contratto. **Esempio** @@ -957,11 +1022,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{ ### eth_sendRawTransaction {#eth_sendrawtransaction} -Crea una nuova transazione di chiamata di messaggio o la stipula di un contratto, per le transazioni firmate. +Crea una nuova transazione di chiamata di messaggio o la creazione di un contratto per le transazioni firmate. **Parametri** -1. `DATA`, L'oggetto transazione firmato. +1. `DATA`, I dati della transazione firmata. ```js params: [ @@ -971,9 +1036,9 @@ params: [ **Restituisce** -`DATA`, 32 Bytes - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile. +`DATA`, 32 Byte - l'hash della transazione, o l'hash zero se la transazione non è ancora disponibile. -Usa [eth_getTransactionReceipt](#eth_gettransactionreceipt) quando hai creato un contratto per ottenere l'indirizzo del contratto dopo che la transazione è stata proposta in un blocco. +Usa [eth_getTransactionReceipt](#eth_gettransactionreceipt) per ottenere l'indirizzo del contratto, dopo che la transazione è stata proposta in un blocco, quando hai creato un contratto. **Esempio** @@ -990,24 +1055,28 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" ### eth_call {#eth_call} -Esegue immediatamente una nuova chiamata di messaggio senza creare una transazione nella blockchain. Spesso utilizzato per eseguire le funzioni dei contratti intelligenti di sola lettura, ad esempio `balanceOf` per un contratto ERC-20. +Esegue immediatamente una nuova chiamata di messaggio senza creare una transazione sulla blockchain. Spesso utilizzato per eseguire funzioni di contratto intelligente di sola lettura, ad esempio il `balanceOf` per un contratto ERC-20. + + + Prova l'endpoint nel playground + **Parametri** -1. `Object` - L'oggetto della chiamata della transazione +1. `Object` - L'oggetto della chiamata di transazione -- `from`: `DATA`, 20 byte - (facoltativo) L'indirizzo da cui viene inviata la transazione. -- `to`: `DATA`, 20 byte - L'indirizzo a cui è indirizzata la transazione. -- `gas`: `QUANTITY` - (facoltativo) Intero del carburante fornito per l'esecuzione della transazione. eth_call consuma zero carburante, ma questo parametro potrebbe essere necessario per alcune esecuzioni. -- `gasPrice`: `QUANTITY` - (facoltativo) Intero del gasPrice usato per ogni unità di carburante pagata -- `value`: `QUANTITY` - (facoltativo) Intero del valore inviato con questa transazione -- `input`: `DATA` - (facoltativo) Hash della firma del metodo e dei parametri codificati. Per i dettagli, consulta [ABI del Contratto di Ethereum nella documentazione di Solidity](https://docs.soliditylang.org/en/latest/abi-spec.html). +- `from`: `DATA`, 20 Byte - (opzionale) L'indirizzo da cui viene inviata la transazione. +- `to`: `DATA`, 20 Byte - L'indirizzo a cui è diretta la transazione. +- `gas`: `QUANTITY` - (opzionale) Intero del gas fornito per l'esecuzione della transazione. eth_call consuma zero gas, ma questo parametro potrebbe essere necessario per alcune esecuzioni. +- `gasPrice`: `QUANTITY` - (opzionale) Intero del gasPrice utilizzato per ogni gas pagato +- `value`: `QUANTITY` - (opzionale) Intero del valore inviato con questa transazione +- `input`: `DATA` - (opzionale) Hash della firma del metodo e dei parametri codificati. Per i dettagli vedi [Ethereum Contract ABI nella documentazione di Solidity](https://docs.soliditylang.org/en/latest/abi-spec.html). -2. `QUANTITY|TAG` - intero del numero di blocco, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block) +2. `QUANTITY|TAG` - numero di blocco intero, o la stringa `"latest"`, `"earliest"`, `"pending"`, `"safe"` o `"finalized"`, vedi il [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter) **Restituisce** -`DATA` - Il valore di ritorno del contratto eseguito. +`DATA` - il valore restituito dal contratto eseguito. **Esempio** @@ -1024,15 +1093,19 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] ### eth_estimateGas {#eth_estimategas} -Genera e restituisce una stima di quanto gas è necessario per consentire il completamento della transazione. La transazione non verrà aggiunta alla blockchain. Si noti che la stima potrebbe esser significativamente superiore all'importo di gas effettivamente usato dalla transazione, per vari motivi, incluse le meccaniche dell'EVM e le prestazioni del nodo. +Genera e restituisce una stima di quanto gas è necessario per consentire il completamento della transazione. La transazione non verrà aggiunta alla blockchain. Nota che la stima potrebbe essere significativamente superiore alla quantità di gas effettivamente utilizzata dalla transazione, per una serie di motivi tra cui le meccaniche della EVM e le prestazioni del nodo. + + + Prova l'endpoint nel playground + **Parametri** -Vedi i parametri di [eth_call](#eth_call), tranne che tutte le proprietà sono facoltative. Se non è specificato alcun limite di gas, geth usa il limite di gas del blocco dal blocco in sospeso come limite massimo. Di conseguenza, la stima restituita potrebbe non esser sufficiente per eseguire la chiamata/transazione quando l'importo di gas è superiore al limite di gas del blocco. +Vedi i parametri di [eth_call](#eth_call), tranne per il fatto che tutte le proprietà sono opzionali. Se non viene specificato alcun limite del gas, geth utilizza il limite del gas del blocco dal blocco in sospeso come limite superiore. Di conseguenza, la stima restituita potrebbe non essere sufficiente per eseguire la chiamata/transazione quando la quantità di gas è superiore al limite del gas del blocco in sospeso. **Restituisce** -`QUANTITY` - la quantità di gas utilizzato. +`QUANTITY` - la quantità di gas utilizzata. **Esempio** @@ -1051,10 +1124,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see Restituisce informazioni su un blocco tramite hash. + + Prova l'endpoint nel playground + + **Parametri** -1. `DATA`, 32 byte - Hash di un blocco. -2. `Boolean` - Se `true` restituisce gli oggetti di transazione completi, se `falso` solo gli hash delle transazioni. +1. `DATA`, 32 Byte - Hash di un blocco. +2. `Boolean` - Se `true` restituisce gli oggetti completi della transazione, se `false` solo gli hash delle transazioni. ```js params: [ @@ -1065,27 +1142,27 @@ params: [ **Restituisce** -`Object` - Un oggetto blocco, o `null` quando non viene trovato alcun blocco: - -- `number`: `QUANTITY` - il numero di blocco. `null` quando è in attesa del blocco. -- `hash`: `DATA`, 32 byte - hash del blocco. `null` quando è in attesa del blocco. -- `hash`: `DATA`, 32 byte - hash del blocco genitore. -- `nonce`: `DATA`, 8 byte - hash del proof-of-work generato. `null` quando è in attesa del blocco. -- `sha3Uncles`: `DATA`, 32 byte - SHA3 dei dati ommer del blocco. -- `logsBloom`: `DATA`, 256 byte - il filtro bloom per i registri del blocco. `null` quando è in attesa del blocco. -- `transactionsRoot`: `DATA`, 32 byte - la radice dell'albero delle transazioni del blocco. -- `stateRoot`: `DATA`, 32 byte - la radice dell'albero di stato finale del blocco. -- `receiptsRoot`: `DATA`, 32 byte - la radice dell'albero delle ricevute del blocco. -- `miner`: `DATA`, 20 byte - l'indirizzo del beneficiario a cui sono state fornite le ricompense di mining. +`Object` - Un oggetto blocco, o `null` quando non è stato trovato alcun blocco: + +- `number`: `QUANTITY` - il numero del blocco. `null` quando è un blocco in sospeso. +- `hash`: `DATA`, 32 Byte - hash del blocco. `null` quando è un blocco in sospeso. +- `parentHash`: `DATA`, 32 Byte - hash del blocco genitore. +- `nonce`: `DATA`, 8 Byte - hash della prova di lavoro generata. `null` quando è un blocco in sospeso, `0x0` per i blocchi a prova di stake (da La Fusione) +- `sha3Uncles`: `DATA`, 32 Byte - SHA3 dei dati degli uncle nel blocco. +- `logsBloom`: `DATA`, 256 Byte - il filtro bloom per i log del blocco. `null` quando è un blocco in sospeso. +- `transactionsRoot`: `DATA`, 32 Byte - la radice del trie delle transazioni del blocco. +- `stateRoot`: `DATA`, 32 Byte - la radice del trie dello stato finale del blocco. +- `receiptsRoot`: `DATA`, 32 Byte - la radice del trie delle ricevute del blocco. +- `miner`: `DATA`, 20 Byte - l'indirizzo del beneficiario a cui sono state date le ricompense del blocco. - `difficulty`: `QUANTITY` - intero della difficoltà per questo blocco. - `totalDifficulty`: `QUANTITY` - intero della difficoltà totale della catena fino a questo blocco. - `extraData`: `DATA` - il campo "dati extra" di questo blocco. -- `size`: `QUANTITY` - intero in bytes della dimensione di questo blocco. -- `gasLimit`: `QUANTITY` - il carburante massimo consentito in questo blocco. -- `gasUsed`: `QUANTITY` - il carburante totale usato da tutte le transazioni in questo blocco. -- `timestamp`: `QUANTITY` - la marca temporale unix relativa a quando il blocco è stato collazionato. -- `transactions`: `Array` - Array di oggetti transazione, o hash di transazione da 32 byte a seconda dell'ultimo parametro specificato. -- `uncles`: `Array` - Array di hash ommer. +- `size`: `QUANTITY` - intero della dimensione di questo blocco in byte. +- `gasLimit`: `QUANTITY` - il limite del gas massimo consentito in questo blocco. +- `gasUsed`: `QUANTITY` - il gas totale utilizzato da tutte le transazioni in questo blocco. +- `timestamp`: `QUANTITY` - il timestamp unix di quando il blocco è stato collazionato. +- `transactions`: `Array` - Array di oggetti transazione, o hash di transazione di 32 Byte a seconda dell'ultimo parametro fornito. +- `uncles`: `Array` - Array di hash degli uncle. **Esempio** @@ -1094,10 +1171,9 @@ params: [ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}' // Risultato { -{ -"jsonrpc": "2.0", -"id": 1, -"result": { + "jsonrpc": "2.0", + "id": 1, + "result": { "difficulty": "0x4ea3f27bc", "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32", "gasLimit": "0x1388", @@ -1120,18 +1196,22 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0 "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "uncles": [ ] -} + } } ``` ### eth_getBlockByNumber {#eth_getblockbynumber} -Restituisce informazioni su un blocco per numero di blocco. +Restituisce informazioni su un blocco tramite numero di blocco. + + + Prova l'endpoint nel playground + **Parametri** -1. `QUANTITY|TAG` - intero del numero di un blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block). -2. `Boolean` - Se `true` restituisce gli oggetti di transazione completi, se `falso` solo gli hash delle transazioni. +1. `QUANTITY|TAG` - intero di un numero di blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter). +2. `Boolean` - Se `true` restituisce gli oggetti completi della transazione, se `false` solo gli hash delle transazioni. ```js params: [ @@ -1140,7 +1220,8 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getBlockByHash](#eth_getblockbyhash) +**Restituisce** +Vedi [eth_getBlockByHash](#eth_getblockbyhash) **Esempio** @@ -1153,11 +1234,15 @@ Per il risultato vedi [eth_getBlockByHash](#eth_getblockbyhash) ### eth_getTransactionByHash {#eth_gettransactionbyhash} -Restituisce le informazioni su una transazione richiesta dall'hash della transazione. +Restituisce le informazioni su una transazione richiesta tramite hash della transazione. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 32 byte - hash di una transazione +1. `DATA`, 32 Byte - hash di una transazione ```js params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] @@ -1165,22 +1250,22 @@ params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] **Restituisce** -`Object` - Un oggetto transazione, oppure `null` quando non viene trovata alcuna transazione: +`Object` - Un oggetto transazione, o `null` quando non è stata trovata alcuna transazione: -- `blockHash`: `DATA`, 32 byte - hash del blocco in cui si trovava questa transazione. `null` quando è in sospeso. -- `blockNumber`: `QUANTITY` - numero di blocco in cui si trovava questa transazione. `null` quando è in sospeso. -- `from`: `DATA`, 20 byte - indirizzo del mittente. -- `gas`: `QUANTITY` - carburante fornito dal mittente. -- `gasPrice`: `QUANTITY` - prezzo del carburante fornito dal mittente in Wei. -- `hash`: `DATA`, 32 byte - hash della transazione. +- `blockHash`: `DATA`, 32 Byte - hash del blocco in cui si trovava questa transazione. `null` quando è in sospeso. +- `blockNumber`: `QUANTITY` - numero del blocco in cui si trovava questa transazione. `null` quando è in sospeso. +- `from`: `DATA`, 20 Byte - indirizzo del mittente. +- `gas`: `QUANTITY` - gas fornito dal mittente. +- `gasPrice`: `QUANTITY` - prezzo del gas fornito dal mittente in Wei. +- `hash`: `DATA`, 32 Byte - hash della transazione. - `input`: `DATA` - i dati inviati insieme alla transazione. - `nonce`: `QUANTITY` - il numero di transazioni effettuate dal mittente prima di questa. -- `to`: `DATA`, 20 byte - l'indirizzo del destinatario. `null` quando è una transazione di creazione del contratto. -- `transactionIndex`: `QUANTITY` - intero della posizione dell'indice delle transazioni nel blocco. `null` quando è in sospeso. +- `to`: `DATA`, 20 Byte - indirizzo del destinatario. `null` quando è una transazione di creazione di un contratto. +- `transactionIndex`: `QUANTITY` - intero della posizione dell'indice della transazione nel blocco. `null` quando è in sospeso. - `value`: `QUANTITY` - valore trasferito in Wei. -- `v`: `QUANTITY` - ID di recupero ECDSA -- `r`: `QUANTITY` - firma r ECDSA -- `s`: `QUANTITY` - firma s ECDSA +- `v`: `QUANTITY` - id di recupero ECDSA +- `r`: `QUANTITY` - firma ECDSA r +- `s`: `QUANTITY` - firma ECDSA s **Esempio** @@ -1212,11 +1297,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","param ### eth_getTransactionByBlockHashAndIndex {#eth_gettransactionbyblockhashandindex} -Restituisce informazioni su una transazione per hash del blocco e posizione dell'indice della transazione. +Restituisce informazioni su una transazione tramite hash del blocco e posizione dell'indice della transazione. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 32 byte - hash di un blocco. +1. `DATA`, 32 Byte - hash di un blocco. 2. `QUANTITY` - intero della posizione dell'indice della transazione. ```js @@ -1226,24 +1315,29 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Restituisce** +Vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}' ``` -Risultato vedi [eth_getBlockByHash](#eth_gettransactionbyhash) +Per il risultato vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) ### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex} -Restituisce informazioni su una transazione per hash del blocco e posizione dell'indice della transazione. +Restituisce informazioni su una transazione tramite numero di blocco e posizione dell'indice della transazione. + + + Prova l'endpoint nel playground + **Parametri** -1. `QUANTITY|TAG`: il numero di un blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco predefinito](/developers/docs/apis/json-rpc/#default-block). +1. `QUANTITY|TAG` - un numero di blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"` o `"finalized"`, come nel [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter). 2. `QUANTITY` - la posizione dell'indice della transazione. ```js @@ -1253,51 +1347,53 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) +**Restituisce** +Vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}' ``` -Risultato vedi [eth_getBlockByHash](#eth_gettransactionbyhash) +Per il risultato vedi [eth_getTransactionByHash](#eth_gettransactionbyhash) ### eth_getTransactionReceipt {#eth_gettransactionreceipt} -Restituisce la ricevuta di una transazione tramite l'hash di transazione. +Restituisce la ricevuta di una transazione tramite hash della transazione. -**Nota** che la ricevuta non è disponibile per le transazioni in sospeso. +**Nota** Che la ricevuta non è disponibile per le transazioni in sospeso. **Parametri** -1. `DATA`, 32 Bytes - hash di una transazione +1. `DATA`, 32 Byte - hash di una transazione ```js params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] ``` -**Restituisce** `Object` - Un oggetto ricevuta della transazione, o `null` quando non è stata trovata nessuna ricevuta: - -- `transactionHash`: `DATA`, 32 byte - hash della transazione. -- `transactionIndex`: `QUANTITY` - intero della posizione dell'indice delle transazioni nel blocco. -- `blockHash`: `DATA`, 32 byte - hash del blocco in cui si trovava questa transazione. -- `blockNumber`: `QUANTITY` - numero di blocco in cui si trovava questa transazione. -- `from`: `DATA`, 20 byte - indirizzo del mittente. -- `to`: `DATA`, 20 byte - l'indirizzo del destinatario. null quando è una transazione di creazione del contratto. -- `cumulativeGasUsed`: `QUANTITY` - La quantità totale di carburante usato nel blocco per l'esecuzione della transazione. -- `effectiveGasPrice` : `QUANTITY` - La somma della commissione di base e delle mance pagata per unità di carburante. -- `gasUsed`: `QUANTITY` - La quantità di carburante usato solo da questa specifica transazione. -- `contractAddress`: `DATA`, 20 byte - L'indirizzo del contratto creato, se la transazione consisteva nella creazione di un contratto, altrimenti `null`. -- `logs`: `Array` - Array di oggetti di registro generati da questa transazione. -- `logsBloom`: `DATA`, 256 byte - Filtro Bloom per i client leggeri per recuperare rapidamente i registri correlati. -- `type`: `QUANTITY`: intero del tipo di transazione, `0x0` per le transazioni ereditarie, `0x1` per i tipi di elenco d'accesso, `0x2` per le commissioni dinamiche. - -Restituisce anche _in alternativa_: - -- `root` : `DATA` 32 bytes dello stateRoot post-transazione (pre Byzantium) -- `status`: `QUANTITY` o `1` (successo) o `0` (insuccesso) +**Restituisce** +`Object` - Un oggetto ricevuta della transazione, o `null` quando non è stata trovata alcuna ricevuta: + +- `transactionHash `: `DATA`, 32 Byte - hash della transazione. +- `transactionIndex`: `QUANTITY` - intero della posizione dell'indice della transazione nel blocco. +- `blockHash`: `DATA`, 32 Byte - hash del blocco in cui si trovava questa transazione. +- `blockNumber`: `QUANTITY` - numero del blocco in cui si trovava questa transazione. +- `from`: `DATA`, 20 Byte - indirizzo del mittente. +- `to`: `DATA`, 20 Byte - indirizzo del destinatario. null quando è una transazione di creazione di un contratto. +- `cumulativeGasUsed` : `QUANTITY ` - La quantità totale di gas utilizzata quando questa transazione è stata eseguita nel blocco. +- `effectiveGasPrice` : `QUANTITY` - La somma della commissione di base e della mancia pagata per unità di gas. +- `gasUsed `: `QUANTITY ` - La quantità di gas utilizzata solo da questa specifica transazione. +- `contractAddress `: `DATA`, 20 Byte - L'indirizzo del contratto creato, se la transazione era una creazione di un contratto, altrimenti `null`. +- `logs`: `Array` - Array di oggetti log, che questa transazione ha generato. +- `logsBloom`: `DATA`, 256 Byte - Filtro Bloom per i client leggeri per recuperare rapidamente i log correlati. +- `type`: `QUANTITY` - intero del tipo di transazione, `0x0` per le transazioni legacy, `0x1` per i tipi di lista di accesso, `0x2` per le commissioni dinamiche. + +Restituisce anche _uno dei seguenti_ : + +- `root` : `DATA` 32 byte della radice dello stato post-transazione (pre Byzantium) +- `status`: `QUANTITY` o `1` (successo) o `0` (fallimento) **Esempio** @@ -1312,15 +1408,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para "blockHash": "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", "blockNumber": "0xeff35f", - "contractAddress": null, // string of the address if it was created + "contractAddress": null, // stringa dell'indirizzo se è stato creato "cumulativeGasUsed": "0xa12515", "effectiveGasPrice": "0x5a9c688d4", "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7", "gasUsed": "0xb4c8", "logs": [{ - // logs as returned by getFilterLogs, etc. + // log come restituiti da getFilterLogs, ecc. }], - "logsBloom": "0x00...0", // 256 byte bloom filter + "logsBloom": "0x00...0", // filtro bloom di 256 byte "status": "0x1", "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "transactionHash": @@ -1333,12 +1429,16 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","para ### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex} -Restituisce informazioni su un ommer di un blocco in base all'hash e alla posizione dell'indice dell'ommer. +Restituisce informazioni su un uncle di un blocco tramite hash e posizione dell'indice dell'uncle. + + + Prova l'endpoint nel playground + **Parametri** -1. `DATA`, 32 byte - hash di un blocco. -2. `QUANTITY` - La posizione dell'indice dell'ommer. +1. `DATA`, 32 Byte - L'hash di un blocco. +2. `QUANTITY` - La posizione dell'indice dell'uncle. ```js params: [ @@ -1347,27 +1447,32 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getBlockByHash](#eth_getblockbyhash) +**Restituisce** +Vedi [eth_getBlockByHash](#eth_getblockbyhash) **Esempio** ```js -// Request +// Richiesta curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}' ``` Per il risultato vedi [eth_getBlockByHash](#eth_getblockbyhash) -**Nota**: Un ommer non contiene transazioni individuali. +**Nota**: Un uncle non contiene transazioni individuali. ### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex} -Restituisce informazioni su un ommer di un blocco in base al numero e alla posizione dell'indice dell'ommer. +Restituisce informazioni su un uncle di un blocco tramite numero e posizione dell'indice dell'uncle. + + + Prova l'endpoint nel playground + **Parametri** -1. `QUANTITY|TAG` - il numero di un blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, come nel [parametro predefinito del blocco](/developers/docs/apis/json-rpc/#default-block). -2. `QUANTITY` - la posizione dell'indice dell'ommer. +1. `QUANTITY|TAG` - un numero di blocco, o la stringa `"earliest"`, `"latest"`, `"pending"`, `"safe"`, `"finalized"`, come nel [parametro del blocco](/developers/docs/apis/json-rpc/#block-parameter). +2. `QUANTITY` - la posizione dell'indice dell'uncle. ```js params: [ @@ -1376,9 +1481,10 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getBlockByHash](#eth_getblockbyhash) +**Restituisce** +Vedi [eth_getBlockByHash](#eth_getblockbyhash) -**Nota**: Un ommer non contiene transazioni individuali. +**Nota**: Un uncle non contiene transazioni individuali. **Esempio** @@ -1391,23 +1497,25 @@ Per il risultato vedi [eth_getBlockByHash](#eth_getblockbyhash) ### eth_newFilter {#eth_newfilter} -Crea un oggetto filtro, basato sulle opzioni di filtro, per avvertire quando lo stato cambia (registri). Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). +Crea un oggetto filtro, basato sulle opzioni del filtro, per notificare quando lo stato cambia (log). +Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). -**Una nota per specificare i filtri degli argomenti:** Gli argomenti dipendono dall'ordine. Una transazione con un registro con argomenti [A, B] sarà abbinata ai seguenti filtri tematici: +**Una nota sulla specifica dei filtri degli argomenti (topic):** +Gli argomenti dipendono dall'ordine. Una transazione con un log con argomenti [A, B] corrisponderà ai seguenti filtri di argomenti: -- `[]` "qualsiasi" -- `[A]`: "A in prima posizione (e tutto il resto segue)" -- `[null, B]`: "tutto nella prima posizione e B nella seconda (e tutto il resto segue)" -- `[A, B]`: "A in prima posizione e B in seconda (e tutto il resto segue)" -- `[[A, B], [A, B]]`: "(A OR B) in prima posizione e (A OR B) in seconda posizione (e tutto il resto segue)" +- `[]` "qualsiasi cosa" +- `[A]` "A in prima posizione (e qualsiasi cosa dopo)" +- `[null, B]` "qualsiasi cosa in prima posizione E B in seconda posizione (e qualsiasi cosa dopo)" +- `[A, B]` "A in prima posizione E B in seconda posizione (e qualsiasi cosa dopo)" +- `[[A, B], [A, B]]` "(A O B) in prima posizione E (A O B) in seconda posizione (e qualsiasi cosa dopo)" - **Parametri** 1. `Object` - Le opzioni del filtro: -- `fromBlock`: `QUANTITY|TAG` - (facoltativo, predefinito: `"latest"`) Numero intero del blocco, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato o `"pending"`, `"earliest"` per le transazioni non ancora presenti in un blocco. -- `toBlock`: `QUANTITY|TAG` - (facoltativo, predefinito: `"latest"`) Numero intero del blocco, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato o `"pending"`, `"earliest"` per le transazioni non ancora presenti in un blocco. -- `address`: `DATA|Array`, 20 byte - (facoltativo) L'indirizzo del contratto oppure un elenco di indirizzi da cui dovrebbero avere origine i registri. -- `topics`: `Array of DATA`, - (facoltativo) Array di argomenti `DATA` a 32 byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere una matrice di DATA con opzioni "OR". +- `fromBlock`: `QUANTITY|TAG` - (opzionale, predefinito: `"latest"`) Numero di blocco intero, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato, o `"pending"`, `"earliest"` per le transazioni non ancora in un blocco. +- `toBlock`: `QUANTITY|TAG` - (opzionale, predefinito: `"latest"`) Numero di blocco intero, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato, o `"pending"`, `"earliest"` per le transazioni non ancora in un blocco. +- `address`: `DATA|Array`, 20 Byte - (opzionale) Indirizzo del contratto o un elenco di indirizzi da cui dovrebbero originare i log. +- `topics`: `Array di DATA`, - (opzionale) Array di argomenti `DATA` di 32 Byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere un array di DATA con opzioni "o". ```js params: [ @@ -1427,7 +1535,8 @@ params: [ ] ``` -**Restituisce** `QUANTITY` - Un ID filtro. +**Restituisce** +`QUANTITY` - Un id del filtro. **Esempio** @@ -1444,11 +1553,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topic ### eth_newBlockFilter {#eth_newblockfilter} -Crea un filtro nel nodo, per avvisare quando arriva un nuovo blocco. Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). +Crea un filtro nel nodo, per notificare quando arriva un nuovo blocco. +Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). -**Parametri** Nessuno +**Parametri** +Nessuno -**Restituisce** `QUANTITY` - Un ID filtro. +**Restituisce** +`QUANTITY` - Un id del filtro. **Esempio** @@ -1465,11 +1577,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[], ### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} -Crea un filtro nel nodo, per avvisare quando arrivano nuove transazioni in sospeso. Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). +Crea un filtro nel nodo, per notificare quando arrivano nuove transazioni in sospeso. +Per verificare se lo stato è cambiato, chiama [eth_getFilterChanges](#eth_getfilterchanges). -**Parametri** Nessuno +**Parametri** +Nessuno -**Restituisce** `QUANTITY` - Un ID filtro. +**Restituisce** +`QUANTITY` - Un id del filtro. **Esempio** @@ -1486,11 +1601,12 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter" ### eth_uninstallFilter {#eth_uninstallfilter} -Disinstalla un filtro con un dato ID. Dovrebbe essere sempre chiamato quando l'orologio non è più necessario. Inoltre i filtri scadono quando non vengono richiesti con [eth_getFilterChanges](#eth_getfilterchanges) per un periodo di tempo. +Disinstalla un filtro con l'id fornito. Dovrebbe sempre essere chiamato quando l'osservazione non è più necessaria. +Inoltre, i filtri scadono quando non vengono richiesti con [eth_getFilterChanges](#eth_getfilterchanges) per un periodo di tempo. **Parametri** -1. `QUANTITY` - L'ID del filtro. +1. `QUANTITY` - L'id del filtro. ```js params: [ @@ -1498,7 +1614,8 @@ params: [ ] ``` -**Restituisce** `Boolean` - `true` se il filtro è stato disinstallato con successo, altrimenti `false`. +**Restituisce** +`Boolean` - `true` se il filtro è stato disinstallato con successo, altrimenti `false`. **Esempio** @@ -1515,11 +1632,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":[" ### eth_getFilterChanges {#eth_getfilterchanges} -Metodo di sondaggio per un filtro, che restituisce un array di registri che si sono verificati dall'ultimo sondaggio. +Metodo di polling per un filtro, che restituisce un array di log che si sono verificati dall'ultimo polling. **Parametri** -1. `QUANTITY` - L'ID del filtro. +1. `QUANTITY` - l'id del filtro. ```js params: [ @@ -1527,20 +1644,22 @@ params: [ ] ``` -**Restituisce** `Array` - Array di oggetti registro, o un array vuoto se nulla è cambiato dall'ultimo sondaggio. - -- Per i filtri creati con `eth_newBlockFilter` vengono restituiti hash di blocco (`DATA`, 32 byte), ad esempio `["0x3454645634534..."]`. -- Per i filtri creati con `eth_newPendingTransactionFiltro` vengono restituiti hash di transazione (`DATA`, 32 byte), ad esempio `["0x6345343454645..."]`. -- Per i filtri creati con `eth_newFiltro` i registri sono oggetti con i seguenti parametri: - - `removed`: `TAG` - `true` quando il registro è stato rimosso, a causa di una riorganizzazione a catena. `false` se è un registro valido. - - `transactionIndex`: `QUANTITY` - numero intero della posizione dell'indice del registro nel blocco. `null` quando il registro è in sospeso. - - `transactionIndex`: `QUANTITY` - numero intero del registro della posizione dell'indice delle transazioni da cui è stato creato. `null` quando il registro è in sospeso. - - `transactionHash`: `DATA`, 32 byte - hash delle transazioni da cui è stato creato il registro. `null` quando il registro è in sospeso. - - `blockHash`: `DATA`, 32 byte - hash del blocco in cui si trovava questo registro. `null` quando è in sospeso. `null` quando il registro è in sospeso. - - `blockNumber`: `QUANTITY` il numero di blocco in cui si trovava questo registro. `null` quando è in sospeso. `null` quando il registro è in sospeso. - - `address`: `DATI`, 20 byte - indirizzo da cui è nato questo registro. - - `data`: `DATA` - contiene zero o più argomenti non indicizzati da 32 byte del registro. - - `topics`: `Array of DATA` - Array da 0 a 432 byte di `DATA` di argomenti di registro indicizzati. (In _solidity_: il primo argomento è l'_hash_ della firma dell'evento (ad es. `Deposit(address,bytes32,uint256)`), tranne se hai dichiarato l'evento con lo specificatore `anonymous` +**Restituisce** +`Array` - Array di oggetti log, o un array vuoto se nulla è cambiato dall'ultimo polling. + +- Per i filtri creati con `eth_newBlockFilter` il ritorno sono hash di blocco (`DATA`, 32 Byte), es., `["0x3454645634534..."]`. +- Per i filtri creati con `eth_newPendingTransactionFilter ` il ritorno sono hash di transazione (`DATA`, 32 Byte), es., `["0x6345343454645..."]`. +- Per i filtri creati con `eth_newFilter` i log sono oggetti con i seguenti parametri: + - `removed`: `TAG` - `true` quando il log è stato rimosso, a causa di una riorganizzazione della catena. `false` se è un log valido. + - `logIndex`: `QUANTITY` - intero della posizione dell'indice del log nel blocco. `null` quando è un log in sospeso. + - `transactionIndex`: `QUANTITY` - intero della posizione dell'indice della transazione da cui è stato creato il log. `null` quando è un log in sospeso. + - `transactionHash`: `DATA`, 32 Byte - hash delle transazioni da cui è stato creato questo log. `null` quando è un log in sospeso. + - `blockHash`: `DATA`, 32 Byte - hash del blocco in cui si trovava questo log. `null` quando è in sospeso. `null` quando è un log in sospeso. + - `blockNumber`: `QUANTITY` - il numero del blocco in cui si trovava questo log. `null` quando è in sospeso. `null` quando è un log in sospeso. + - `address`: `DATA`, 20 Byte - indirizzo da cui ha avuto origine questo log. + - `data`: `DATA` - dati di log non indicizzati a lunghezza variabile. (In _solidity_: zero o più argomenti di log non indicizzati di 32 Byte.) + - `topics`: `Array di DATA` - Array da 0 a 4 `DATA` di 32 Byte di argomenti di log indicizzati. (In _solidity_: Il primo argomento è l'_hash_ della firma dell'evento (es., `Deposit(address,bytes32,uint256)`), a meno che tu non abbia dichiarato l'evento con lo specificatore `anonymous`.) + - **Esempio** ```js @@ -1567,11 +1686,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":[ ### eth_getFilterLogs {#eth_getfilterlogs} -Restituisce un array di tutti i registri corrispondenti al filtro con un dato ID. +Restituisce un array di tutti i log che corrispondono al filtro con l'id fornito. **Parametri** -1. `QUANTITY` - L'ID del filtro. +1. `QUANTITY` - L'id del filtro. ```js params: [ @@ -1579,7 +1698,8 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getBlockByHash](#eth_getfilterchanges) +**Restituisce** +Vedi [eth_getFilterChanges](#eth_getfilterchanges) **Esempio** @@ -1588,21 +1708,21 @@ params: [ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}' ``` -Risultato vedi [eth_getFilterChanges](#eth_getfilterchanges) +Per il risultato vedi [eth_getFilterChanges](#eth_getfilterchanges) ### eth_getLogs {#eth_getlogs} -Restituisce un array di tutti i registri che corrispondono a un dato oggetto filtro. +Restituisce un array di tutti i log che corrispondono a un dato oggetto filtro. **Parametri** 1. `Object` - Le opzioni del filtro: -- `fromBlock`: `QUANTITY|TAG` - (facoltativo, predefinito: `"latest"`) Numero intero del blocco, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato o `"pending"`, `"earliest"` per le transazioni non ancora presenti in un blocco. -- `toBlock`: `QUANTITY|TAG` - (facoltativo, predefinito: `"latest"`) Numero intero del blocco, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato o `"pending"`, `"earliest"` per le transazioni non ancora presenti in un blocco. -- `address`: `DATA|Array`, 20 byte - (facoltativo) L'indirizzo del contratto oppure un elenco di indirizzi da cui dovrebbero avere origine i registri. -- `topics`: `Array of DATA`, - (facoltativo) Array di argomenti `DATA` a 32 byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere una matrice di DATA con opzioni "OR". -- `blockhash`: `DATI`, 32 byte - (facoltativo , **future**) Con l'aggiunta di EIP-234, `blockHash` sarà una nuova opzione di filtro che limita i registri restituiti al singolo blocco con l'hash `blockHash` da 32 byte. L'utilizzo di `blockHash` equivale a `fromBlock` = `toBlock` = il numero di blocco con hash `blockHash`. Se `blockHash` è presente nei criteri di filtraggio, non sono permessi né `fromBlock` né `toBlock`. +- `fromBlock`: `QUANTITY|TAG` - (opzionale, predefinito: `"latest"`) Numero di blocco intero, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato, o `"pending"`, `"earliest"` per le transazioni non ancora in un blocco. +- `toBlock`: `QUANTITY|TAG` - (opzionale, predefinito: `"latest"`) Numero di blocco intero, o `"latest"` per l'ultimo blocco proposto, `"safe"` per l'ultimo blocco sicuro, `"finalized"` per l'ultimo blocco finalizzato, o `"pending"`, `"earliest"` per le transazioni non ancora in un blocco. +- `address`: `DATA|Array`, 20 Byte - (opzionale) Indirizzo del contratto o un elenco di indirizzi da cui dovrebbero originare i log. +- `topics`: `Array di DATA`, - (opzionale) Array di argomenti `DATA` di 32 Byte. Gli argomenti dipendono dall'ordine. Ogni argomento può anche essere un array di DATA con opzioni "o". +- `blockHash`: `DATA`, 32 Byte - (opzionale, **futuro**) Con l'aggiunta dell'EIP-234, `blockHash` sarà una nuova opzione di filtro che limita i log restituiti al singolo blocco con l'hash di 32 byte `blockHash`. L'utilizzo di `blockHash` equivale a `fromBlock` = `toBlock` = il numero di blocco con hash `blockHash`. Se `blockHash` è presente nei criteri di filtro, non sono consentiti né `fromBlock` né `toBlock`. ```js params: [ @@ -1614,7 +1734,8 @@ params: [ ] ``` -**Restituisce** Vedi [eth_getBlockByHash](#eth_getfilterchanges) +**Restituisce** +Vedi [eth_getFilterChanges](#eth_getfilterchanges) **Esempio** @@ -1623,15 +1744,15 @@ params: [ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}' ``` -Risultato vedi [eth_getFilterChanges](#eth_getfilterchanges) +Per il risultato vedi [eth_getFilterChanges](#eth_getfilterchanges) ## Esempio di utilizzo {#usage-example} -### Distribuire un contratto utilizzando JSON_RPC {#deploying-contract} +### Distribuire un contratto usando JSON_RPC {#deploying-contract} -Questa sezione include una dimostrazione di come distribuire un contratto utilizzando solo l'interfaccia RPC. Esistono vie alternative per la distribuzione di contratti in cui questa complessità viene eliminata tramite astrazione, ad esempio utilizzando librerie costruite partendo dall'interfaccia RPC, come [web3. s](https://web3js.readthedocs.io/) e [web3.py](https://github.com/ethereum/web3.py). Queste astrazioni sono generalmente più facili da capire e meno soggette a errori, ma è comunque utile capire cosa succede dietro le quinte. +Questa sezione include una dimostrazione di come distribuire un contratto usando solo l'interfaccia RPC. Esistono percorsi alternativi per distribuire contratti in cui questa complessità viene astratta, ad esempio, usando librerie costruite sopra l'interfaccia RPC come [web3.js](https://web3js.readthedocs.io/) e [web3.py](https://github.com/ethereum/web3.py). Queste astrazioni sono generalmente più facili da comprendere e meno soggette a errori, ma è comunque utile capire cosa succede dietro le quinte. -Di seguito, trovi un semplice contratto intelligente chiamato `Multiply7`, che sarà distribuito usando l'interfaccia JSON-RPC a un nodo di Ethereum. Questo tutorial presuppone che il lettore stia già eseguendo un nodo Geth. Maggiori informazioni sui nodi e sui client sono disponibili [qui](/developers/docs/nodes-and-clients/run-a-node). Fare riferimento alla documentazione del singolo [client](/developers/docs/nodes-and-clients/) per capire come avviare HTTP JSON-RPC per i client non-Geth. La maggior parte dei client serve di default su `localhost:8545`. +Di seguito è riportato un semplice contratto intelligente chiamato `Multiply7` che verrà distribuito usando l'interfaccia JSON-RPC su un nodo Ethereum. Questo tutorial presuppone che il lettore stia già eseguendo un nodo Geth. Maggiori informazioni su nodi e client sono disponibili [qui](/developers/docs/nodes-and-clients/run-a-node). Si prega di fare riferimento alla documentazione dei singoli [client](/developers/docs/nodes-and-clients/) per vedere come avviare l'HTTP JSON-RPC per i client non Geth. La maggior parte dei client serve per impostazione predefinita su `localhost:8545`. ```javascript contract Multiply7 { @@ -1643,7 +1764,7 @@ contract Multiply7 { } ``` -La prima cosa da fare è assicurarsi che l'interfaccia HTTP RPC sia abilitata. Questo significa che forniamo a Geth il flag `--http` all'avvio. In questo esempio usiamo il nodo Geth su una catena di sviluppo privata. Utilizzando questo approccio non abbiamo bisogno di ether sulla rete reale. +La prima cosa da fare è assicurarsi che l'interfaccia HTTP RPC sia abilitata. Ciò significa che forniamo a Geth il flag `--http` all'avvio. In questo esempio usiamo il nodo Geth su una catena di sviluppo privata. Usando questo approccio non abbiamo bisogno di ether sulla rete reale. ```bash geth --http --dev console 2>>geth.log @@ -1651,26 +1772,26 @@ geth --http --dev console 2>>geth.log Questo avvierà l'interfaccia HTTP RPC su `http://localhost:8545`. -Possiamo verificare l'esecuzione dell'interfaccia recuperando l'indirizzo (ottenendo il primo indirizzo dall'array di conti) e il saldo di coinbase utilizzando [curl](https://curl.se). Si noti che i dati in questi esempi saranno diversi sul nodo locale. Se vuoi provare questi comandi, sostituisci i parametri di richiesta nella seconda richiesta di curl con il risultato restituito dalla prima. +Possiamo verificare che l'interfaccia sia in esecuzione recuperando l'indirizzo coinbase (ottenendo il primo indirizzo dall'array degli account) e il saldo usando [curl](https://curl.se). Si prega di notare che i dati in questi esempi differiranno sul proprio nodo locale. Se si desidera provare questi comandi, sostituire i parametri di richiesta nella seconda richiesta curl con il risultato restituito dalla prima. ```bash -curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[]", "id":1}' -H "Content-Type: application/json" localhost:8545 +curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545 {"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]} curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545 {"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"} ``` -Poiché i numeri sono soggetti a codifica esadecimale, il saldo viene restituito in wei sotto forma di stringa esadecimale. Se vogliamo ottenere il saldo in ether sotto forma di numero possiamo utilizzare web3 dalla console Geth. +Poiché i numeri sono codificati in esadecimale, il saldo viene restituito in wei come stringa esadecimale. Se vogliamo avere il saldo in ether come numero, possiamo usare web3 dalla console di Geth. ```javascript web3.fromWei("0x1639e49bba16280000", "ether") // "410" ``` -Ora che ci sono ether nella nostra catena di sviluppo privata, possiamo distribuire il contratto. Il primo passo è quello di compilare il contratto Multiply7 al codice di byte che può essere inviato all'EVM. Per installare solc, il compilatore Solidity, seguire la [documentazione Solidity](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Potresti voler utilizzare una versione `solc` più vecchia che corrisponda [ alla versione del compilatore utilizzata per il nostro esempio](https://github.com/ethereum/solidity/releases/tag/v0.4.20).) +Ora che c'è un po' di ether sulla nostra catena di sviluppo privata, possiamo distribuire il contratto. Il primo passo è compilare il contratto Multiply7 in byte code che può essere inviato all'EVM. Per installare solc, il compilatore Solidity, seguire la [documentazione di Solidity](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Potresti voler usare una versione precedente di `solc` per farla corrispondere alla [versione del compilatore usata per il nostro esempio](https://github.com/ethereum/solidity/releases/tag/v0.4.20)). -Il passo successivo è quello di compilare il contratto Multiply7 al codice di byte che può essere inviato all'EVM. +Il passo successivo è compilare il contratto Multiply7 in byte code che può essere inviato all'EVM. ```bash echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin @@ -1680,58 +1801,58 @@ Binary: 6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029 ``` -Ora che abbiamo il codice compilato, dobbiamo determinare quanto carburante occorre per distribuirlo. L'interfaccia RPC ha un metodo `eth_estimateGas` che ci darà una stima. +Ora che abbiamo il codice compilato dobbiamo determinare quanto gas costa distribuirlo. L'interfaccia RPC ha un metodo `eth_estimateGas` che ci fornirà una stima. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545 {"jsonrpc":"2.0","id":5,"result":"0x1c31e"} ``` -E infine distribuiamo il contratto. +E infine distribuire il contratto. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545 {"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"} ``` -La transazione è accettata dal nodo e viene restituito un hash di transazione. Questo hash può essere usato per tracciare la transazione. Il passo successivo è quello di determinare l'indirizzo dove il nostro contratto è distribuito. Ogni transazione eseguita creerà una ricevuta. Questa ricevuta contiene varie informazioni sulla transazione, ad esempio, in quale blocco è stata inclusa e quanto carburante è stato usato dall'EVM. Se una transazione crea un contratto, ne conterrà anche l'indirizzo. Possiamo recuperare la ricevuta con il metodo RPC `eth_getTransactionReceipt`. +La transazione viene accettata dal nodo e viene restituito un hash della transazione. Questo hash può essere usato per tracciare la transazione. Il passo successivo è determinare l'indirizzo in cui è distribuito il nostro contratto. Ogni transazione eseguita creerà una ricevuta. Questa ricevuta contiene varie informazioni sulla transazione, come in quale blocco è stata inclusa la transazione e quanto gas è stato usato dall'EVM. Se una transazione crea un contratto, conterrà anche l'indirizzo del contratto. Possiamo recuperare la ricevuta con il metodo RPC `eth_getTransactionReceipt`. ```bash curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545 {"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} ``` -Il nostro contratto è stato creato su `0x4d03d617d700cf81935d7f797f4e2ae719648262`. Un risultato nullo invece di una ricevuta significa che la transazione non è stata ancora inclusa in un blocco. Attendere un attimo e controllare se il proprio client di consenso è in esecuzione, quindi riprovare. +Il nostro contratto è stato creato su `0x4d03d617d700cf81935d7f797f4e2ae719648262`. Un risultato nullo invece di una ricevuta significa che la transazione non è ancora stata inclusa in un blocco. Attendi un momento, controlla se il tuo client di consenso è in esecuzione e riprova. #### Interagire con i contratti intelligenti {#interacting-with-smart-contract} In questo esempio invieremo una transazione usando `eth_sendTransaction` al metodo `multiply` del contratto. -`eth_sendTransaction` richiede diversi argomenti, in particolare `from`, `to` e `data`. `From` è l'indirizzo pubblico del nostro conto, mentre `to` è l'indirizzo del contratto. L'argomento `data` contiene un payload che definisce quale metodo deve essere chiamato e con quali argomenti. È qui che entra in gioco l'[ABI (interfaccia binaria dell'applicazione)](https://docs.soliditylang.org/en/latest/abi-spec.html). L'ABI è un file JSON che determina come definire e codificare i dati per l'EVM. +`eth_sendTransaction` richiede diversi argomenti, in particolare `from`, `to` e `data`. `From` è l'indirizzo pubblico del nostro account e `to` è l'indirizzo del contratto. L'argomento `data` contiene un payload che definisce quale metodo deve essere chiamato e con quali argomenti. È qui che entra in gioco l'[ABI (interfaccia binaria dell'applicazione)](https://docs.soliditylang.org/en/latest/abi-spec.html). L'ABI è un file JSON che definisce come definire e codificare i dati per l'EVM. -I byte del payload definiscono quale metodo viene chiamato nel contratto. Si tratta dei primi 4 byte dall'hash Keccak sul nome della funzione e sui suoi tipi di argomento, con codifica esadecimale. La funzione di moltiplicazione accetta un uint che è un alias per uint256. Ci ritroviamo quindi con: +I byte del payload definiscono quale metodo nel contratto viene chiamato. Si tratta dei primi 4 byte dall'hash Keccak sul nome della funzione e sui tipi dei suoi argomenti, codificati in esadecimale. La funzione multiply accetta un uint che è un alias per uint256. Questo ci lascia con: ```javascript web3.sha3("multiply(uint256)").substring(0, 10) // "0xc6888fa1" ``` -Il passo successivo è codificare gli argomenti. Vi è solo un uint256, ad esempio il valore 6. L'ABI ha una sezione che specifica come codificare i tipi uint256. +Il passo successivo è codificare gli argomenti. C'è solo un uint256, diciamo, il valore 6. L'ABI ha una sezione che specifica come codificare i tipi uint256. -`int: enc(X)` è la codifica big-endian in complemento a due di X, riempita sul lato di ordine superiore (sinistro) con 0xff per X negativo e con zero > byte per X positivo, in modo tale che la lunghezza sia un multiplo di 32 byte. +`int: enc(X)` è la codifica in complemento a due big-endian di X, riempita sul lato di ordine superiore (sinistra) con 0xff per X negativo e con zero byte per X positivo in modo tale che la lunghezza sia un multiplo di 32 byte. -Si ottiene la codifica `0000000000000000000000000000000000000000000000000000000000000006`. +Questo si codifica in `0000000000000000000000000000000000000000000000000000000000000006`. -Combinando il selettore di funzione e l'argomento codificato, otterremo i dati `0xc6888fa100000000000000000000000000000000000000000000000000000000000000000000000000000006`. +Combinando il selettore della funzione e l'argomento codificato, i nostri dati saranno `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`. -A questo punto possiamo inviare al nodo: +Questo può ora essere inviato al nodo: ```bash curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545 {"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"} ``` -Dall'invio di una transazione, è stato restituito un hash di transazione. Recuperando la ricevuta si ottiene: +Poiché è stata inviata una transazione, è stato restituito un hash della transazione. Recuperando la ricevuta si ottiene: ```javascript { @@ -1755,19 +1876,19 @@ Dall'invio di una transazione, è stato restituito un hash di transazione. Recup } ``` -La ricevuta contiene un registro. Questo registro è stato generato da EVM sull'esecuzione della transazione e incluso nella ricevuta. La funzione `multiply` mostra che l'evento `Print` è stato lanciato con i tempi di input 7. Poiché l'argomento per l'evento `Print` era un uint256, possiamo decodificarlo secondo le regole ABI, ottenendo così il decimale 42 previsto. Oltre ai dati, vale la pena notare che gli argomenti possono essere utilizzati per determinare quale evento ha creato il registro: +La ricevuta contiene un log. Questo log è stato generato dall'EVM all'esecuzione della transazione e incluso nella ricevuta. La funzione `multiply` mostra che l'evento `Print` è stato sollevato con l'input moltiplicato per 7. Poiché l'argomento per l'evento `Print` era un uint256, possiamo decodificarlo secondo le regole dell'ABI, il che ci lascerà con il decimale atteso 42. A parte i dati, vale la pena notare che i topic possono essere usati per determinare quale evento ha creato il log: ```javascript web3.sha3("Print(uint256)") // "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da" ``` -Questa è stata solo una breve introduzione su alcuni dei compiti più comuni, dimostrando l'uso diretto del JSON-RPC. +Questa era solo una breve introduzione ad alcune delle attività più comuni, che dimostra l'uso diretto della JSON-RPC. ## Argomenti correlati {#related-topics} -- [Specifiche di JSON-RPC](http://www.jsonrpc.org/specification) -- [ Nodi e client](/developers/docs/nodes-and-clients/) +- [Specifica JSON-RPC](http://www.jsonrpc.org/specification) +- [Nodi e client](/developers/docs/nodes-and-clients/) - [API JavaScript](/developers/docs/apis/javascript/) -- [API del backend](/developers/docs/apis/backend/) -- [Client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) +- [API di backend](/developers/docs/apis/backend/) +- [Client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/blocks/index.md b/public/content/translations/it/developers/docs/blocks/index.md index ff09aa44f91..a482db9c5ad 100644 --- a/public/content/translations/it/developers/docs/blocks/index.md +++ b/public/content/translations/it/developers/docs/blocks/index.md @@ -1,152 +1,153 @@ --- title: Blocchi -description: 'Panoramica dei blocchi nella blockchain Ethereum: struttura dati, a cosa servono e come sono fatti.' +description: "Una panoramica dei blocchi nella blockchain di Ethereum: la loro struttura dei dati, perché sono necessari e come vengono creati." lang: it --- -I blocchi sono un insieme di transazioni che contengono un hash del blocco precedente nella catena. Per questo motivo, sono collegati l'uno all'altro nella catena, perché gli hash vengono calcolati crittograficamente dai dati del blocco. Questi impedisce anche le frodi, perché un cambiamento in qualsiasi blocco nella cronologia invaliderebbe tutti i blocchi successivi, dato che gli hash successivi cambierebbero e tutti coloro che eseguono la blockchain se ne accorgerebbero. +I blocchi sono lotti di transazioni con un hash del blocco precedente nella catena. Questo collega i blocchi insieme (in una catena) perché gli hash sono derivati crittograficamente dai dati del blocco. Ciò previene le frodi, perché una modifica in qualsiasi blocco nella storia invaliderebbe tutti i blocchi successivi, poiché tutti gli hash successivi cambierebbero e chiunque esegua la blockchain se ne accorgerebbe. ## Prerequisiti {#prerequisites} -Quello dei blocchi è un argomento piuttosto basico. Ma, per aiutarti a comprendere meglio questa pagina, ti consigliamo innanzitutto di leggere sui [Conti](/developers/docs/accounts/), sulle [Transazioni](/developers/docs/transactions/) e la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +I blocchi sono un argomento molto accessibile ai principianti. Ma per aiutarti a comprendere meglio questa pagina, ti consigliamo di leggere prima [Account](/developers/docs/accounts/), [Transazioni](/developers/docs/transactions/) e la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). ## Perché i blocchi? {#why-blocks} -Per far sì che tutti i partecipanti della rete Ethereum siano sincronizzati e concordino sulla cronologia esatta delle transazioni, le transazioni vengono raggruppate in blocchi. Significa che decine (o centinaia) di transazioni vengono inviate, approvate e sincronizzate in una volta sola. +Per garantire che tutti i partecipanti sulla rete [Ethereum](/) mantengano uno stato sincronizzato e concordino sulla cronologia precisa delle transazioni, raggruppiamo le transazioni in blocchi. Ciò significa che dozzine (o centinaia) di transazioni vengono confermate, concordate e sincronizzate tutte in una volta. -![Diagramma che mostra una transazione in un blocco che provoca cambiamenti di stato](./tx-block.png) _Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Un diagramma che mostra le transazioni in un blocco che causano cambiamenti di stato](./tx-block.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Scaglionando gli invii, diamo a tutti i partecipanti della rete abbastanza tempo per giungere al consenso: anche se arrivano decine di richieste di transazione al secondo, i blocchi su Ethereum vengono creati e inviati a Ethereum solo più o meno ogni quindici secondi. +Distanziando le conferme, diamo a tutti i partecipanti della rete abbastanza tempo per raggiungere il consenso: anche se le richieste di transazione si verificano dozzine di volte al secondo, i blocchi vengono creati e confermati su Ethereum solo una volta ogni dodici secondi. ## Come funzionano i blocchi {#how-blocks-work} -Per preservare la cronologia delle transazioni, i blocchi sono ordinati in modo rigoroso (ogni nuovo blocco che viene creato contiene un riferimento al blocco padre) e anche le transazioni all'interno del blocco sono ordinate altrettanto rigorosamente. A parte in rari casi, in ogni momento, tutti i partecipanti della rete concordano sul numero e sulla cronologia esatta dei blocchi e lavorano per raggruppare le richieste di transazione live nel blocco successivo. +Per preservare la cronologia delle transazioni, i blocchi sono rigorosamente ordinati (ogni nuovo blocco creato contiene un riferimento al suo blocco genitore) e anche le transazioni all'interno dei blocchi sono rigorosamente ordinate. Tranne in rari casi, in qualsiasi momento, tutti i partecipanti sulla rete concordano sul numero esatto e sulla cronologia dei blocchi e stanno lavorando per raggruppare le attuali richieste di transazione in tempo reale nel blocco successivo. -Dopo essere stato realizzato da un validatore della rete selezionato casualmente, un blocco viene propagato al resto della rete; tutti i nodi vengono aggiunti al blocco alla fine della relativa blockchain e un nuovo validatore viene selezionato per creare il successivo. Il processo esatto di costruzione dei blocchi e il processo di invio/consenso è attualmente specificato nel protocollo "Proof of Stake" di Ethereum. +Una volta che un blocco viene assemblato da un validatore selezionato casualmente sulla rete, viene propagato al resto della rete; tutti i nodi aggiungono questo blocco alla fine della loro blockchain e un nuovo validatore viene selezionato per creare il blocco successivo. L'esatto processo di assemblaggio dei blocchi e il processo di conferma/consenso sono attualmente specificati dal protocollo "prova di stake" di Ethereum. -## Protocollo Proof of Stake {#proof-of-work-protocol} +## Protocollo di prova di stake {#proof-of-stake-protocol} -Proof of Stake significa quanto segue: +La prova di stake significa quanto segue: -- I nodi di convalida devono mettere in staking 32 ETH in un contratto di deposito come garanzia contro i comportamenti malevoli. Questo aiuta a proteggere la rete, poiché le attività palesemente disoneste portano alla distruzione di parte o dell'intero stake. -- In ogni slot (a distanza di dodici secondi), un validatore è selezionato casualmente per essere il propositore del blocco. Questo raggruppa le transazioni, le esegue e determina un nuovo 'stato'. Avvolge queste informazioni in un blocco e lo passa agli altri validatori. -- Gli altri validatori che vengono a conoscenza di un nuovo blocco ri-eseguono le transazioni per assicurare di acconsentire alla modifica proposta allo stato globale. Supponendo che il blocco sia valido, lo aggiungono al proprio database. -- Se un validatore è a conoscenza di due blocchi in conflitto per lo stesso slot, usa il proprio algoritmo di scelta della diramazione per selezionare quello supportato da più ETH in staking. +- I nodi di validazione devono mettere in stake 32 ETH in un contratto di deposito come garanzia contro comportamenti scorretti. Questo aiuta a proteggere la rete perché un'attività palesemente disonesta porta alla distruzione di parte o di tutto quello stake. +- In ogni slot (distanziati di dodici secondi l'uno dall'altro) un validatore viene selezionato casualmente per essere il proponente del blocco. Raggruppa le transazioni, le esegue e determina un nuovo 'stato'. Racchiude queste informazioni in un blocco e lo trasmette agli altri validatori. +- Gli altri validatori che vengono a conoscenza del nuovo blocco rieseguono le transazioni per assicurarsi di concordare con la modifica proposta allo stato globale. Supponendo che il blocco sia valido, lo aggiungono al proprio database. +- Se un validatore viene a conoscenza di due blocchi in conflitto per lo stesso slot, utilizza il proprio algoritmo di scelta della biforcazione per scegliere quello supportato dalla maggior quantità di ETH in stake. -[Maggiori informazioni sul Proof of Stake](/developers/docs/consensus-mechanisms/pos) +[Maggiori informazioni sulla prova di stake](/developers/docs/consensus-mechanisms/pos) ## Cosa c'è in un blocco? {#block-anatomy} -In un blocco sono contenute molte informazioni. Al livello più alto, un blocco contiene i seguenti campi: - -| Campo | Descrizione | -|:------------------- |:--------------------------------------------------------- | -| `slot` | lo slot a cui appartiene il blocco | -| `indice_proponente` | l'ID del validatore che propone il blocco | -| `parent_root` | l'hash del blocco precedente | -| `state_root` | l'hash radice dell'oggetto di stato | -| `corpo` | un oggetto contenente più campi, come definito di seguito | - -Il blocco `body` contiene a sua volta diversi campi: - -| Campo | Descrizione | -|:-------------------- |:---------------------------------------------------------------------- | -| `randao_reveal` | un valore utilizzato per selezionare il prossimo proponente di blocchi | -| `et1_data` | informazioni sul contratto di deposito | -| `graffiti` | dati arbitrari utilizzati per contrassegnare blocchi | -| `proposer_slashings` | elenco di validatori da tagliare | -| `taglio_attestatori` | elenco di attestatori da tagliare | -| `attestazioni` | elenco di attestazioni a favore del blocco corrente | -| `depositi` | elenco dei nuovi depositi nel contratto di deposito | -| `uscite_volontarie` | elenco di validatori che escono dalla rete | -| `sync_aggregate` | sottoinsieme di validatori, utilizzato per servire i client leggeri | -| `execution_payload` | transazioni passate dal client di esecuzione | - -Il campo `attestations` contiene un elenco di tutte le attestazioni nel blocco. Le attestazioni hanno il proprio tipo di dati, contenente diversi pezzi di dati. Ogni attestazione contiene: - -| Campo | Descrizione | -|:------------------ |:-------------------------------------------------------------------- | -| `aggregation_bits` | un elenco dei validatori che hanno partecipato a questa attestazione | -| `dati` | un contenitore con diversi campi secondari | -| `firma` | firma aggregata di tutti i validatori attestanti | +Ci sono molte informazioni contenute all'interno di un blocco. Al livello più alto, un blocco contiene i seguenti campi: + +| Campo | Descrizione | +| :--------------- | :---------------------------------------------------- | +| `slot` | lo slot a cui appartiene il blocco | +| `proposer_index` | l'ID del validatore che propone il blocco | +| `parent_root` | l'hash del blocco precedente | +| `state_root` | l'hash radice dell'oggetto di stato | +| `body` | un oggetto contenente diversi campi, come definito di seguito | + +Il `body` del blocco contiene a sua volta diversi campi: + +| Campo | Descrizione | +| :------------------- | :----------------------------------------------- | +| `randao_reveal` | un valore utilizzato per selezionare il prossimo proponente del blocco | +| `eth1_data` | informazioni sul contratto di deposito | +| `graffiti` | dati arbitrari utilizzati per etichettare i blocchi | +| `proposer_slashings` | elenco di validatori da punire | +| `attester_slashings` | elenco di attestatori da punire | +| `attestations` | elenco di attestazioni fatte contro gli slot precedenti | +| `deposits` | elenco di nuovi depositi al contratto di deposito | +| `voluntary_exits` | elenco di validatori che escono dalla rete | +| `sync_aggregate` | sottoinsieme di validatori utilizzati per servire i client leggeri | +| `execution_payload` | transazioni passate dal client di esecuzione | + +Il campo `attestations` contiene un elenco di tutte le attestazioni nel blocco. Le attestazioni hanno il proprio tipo di dati che contiene diverse informazioni. Ogni attestazione contiene: + +| Campo | Descrizione | +| :----------------- | :------------------------------------------------------------- | +| `aggregation_bits` | un elenco di quali validatori hanno partecipato a questa attestazione | +| `data` | un contenitore con più sottocampi | +| `signature` | firma aggregata di un insieme di validatori rispetto alla parte `data` | Il campo `data` nell'`attestation` contiene quanto segue: -| Campo | Descrizione | -|:------------------- |:--------------------------------------------------------- | -| `slot` | lo slot cui si riferisce l'attestazione | -| `indice` | indici per l'attestazione dei validatori | -| `beacon_block_root` | l'hash radice del blocco Beacon contenente questo oggetto | -| `fonte` | l'ultimo punto di controllo giustificato | -| `obiettivo` | il blocco di confine dell'ultima epoca | +| Campo | Descrizione | +| :------------------ | :-------------------------------------------------------------- | +| `slot` | lo slot a cui si riferisce l'attestazione | +| `index` | indici per i validatori attestanti | +| `beacon_block_root` | l'hash radice del blocco della beacon chain visto come testa della catena | +| `source` | l'ultimo checkpoint giustificato | +| `target` | l'ultimo blocco di confine dell'epoca | -L'esecuzione delle transazioni nell'`execution_payload` aggiorna lo stato globale. Tutti i client ri-eseguono le transazioni nell'`execution_payload` per assicurare che il nuovo stato corrisponda a quello nel campo `state_root` del nuovo blocco. Così, i client, possono dire che un nuovo blocco è valido e sicuro da aggiungere alla loro blockchain. L'`execution payload` stesso è un oggetto composto da diversi campi. Inoltre, esiste un `execution_payload_header`, contenente importanti informazioni sommarie sui dati di esecuzione. Queste strutture di dati sono organizzate come segue: +L'esecuzione delle transazioni nell'`execution_payload` aggiorna lo stato globale. Tutti i client rieseguono le transazioni nell'`execution_payload` per assicurarsi che il nuovo stato corrisponda a quello nel campo `state_root` del nuovo blocco. È così che i client possono stabilire che un nuovo blocco è valido e sicuro da aggiungere alla loro blockchain. L'`execution payload` stesso è un oggetto con diversi campi. C'è anche un `execution_payload_header` che contiene importanti informazioni riassuntive sui dati di esecuzione. Queste strutture di dati sono organizzate come segue: L'`execution_payload_header` contiene i seguenti campi: -| Campo | Descrizione | -|:------------------- |:------------------------------------------------------------------------------------- | -| `parent_hash` | hash del blocco padre | -| `fee_recipient` | indirizzo del conto a cui pagare le commissioni sulla transazione | -| `state_root` | hash radice per lo stato globale dopo l'applicazione delle modifiche in questo blocco | -| `receipts_root` | hash del trie delle ricevute delle transazioni | -| `logs_bloom` | struttura di dati contenente i registri dell'evento | -| `prev_randao` | valore usato nella selezione casuale del validatore | -| `numero_blocco` | numero del blocco corrente | -| `limite_gas` | carburante massimo consentito in questo blocco | -| `gas_utilizzato` | quantità effettiva di carburante usata in questo blocco | -| `marca oraria` | tempo di blocco | -| `dati_extra` | dati aggiuntivi arbitrari come byte grezzi | -| `fee_base_per_gas` | il valore base della commissione | -| `hash_del_blocco` | Hash del blocco di esecuzione | -| `transactions_root` | hash radice delle transazioni nel payload | -| `withdrawal_root` | hash radice del prelievo nel payload | - -Lo stesso `execution_payload` contiene quanto segue (si noti che è identico all'intestazione, tranne per il fatto che, invece dell'hash radice delle transazioni, include l'elenco effettivo delle transazioni e informazioni sui prelievi): - -| Campo | Descrizione | -|:------------------ |:----------------------------------------------------------------------------------- | -| `parent_hash` | hash del blocco genitore | -| `fee_recipient` | indirizzo del conto a cui pagare le commissioni di transazione | -| `stato_del_root` | hash radice per lo stato globale, dopo l'applicazione di modifiche in questo blocco | -| `receipts_root` | hash dell'albero delle ricevute di transazione | -| `logs_bloom` | struttura dei dati contenente registri di eventi | -| `prev_randao` | valore usato in una selezione casuale del validatore | -| `numero_blocco` | numero del blocco corrente | -| `limite_gas` | gas massimo allocato in questo blocco | -| `gas_utilizzato` | l'attuale ammontare di gas utilizzato in questo blocco | -| `marca oraria` | tempo del blocco | -| `dati_extra` | dati arbitrari aggiuntivi, in byte grezzi | -| `fee_base_per_gas` | il valore base della commissione | -| `hash_del_blocco` | Hash dell'esecuzione del blocco | -| `transazioni` | elenco delle transazioni da eseguire | -| `prelievi` | elenco degli oggetti prelievo | - -L'elenco dei `withdrawals` contiene oggetti `withdrawal` strutturati nel modo seguente: - -| Campo | Descrizione | -|:---------------- |:------------------------------------ | -| `address` | indirizzo del conto che ha prelevato | -| `importo` | importo del prelievo | -| `indice` | valore dell'indice di prelievo | -| `validatorIndex` | valore dell'indice del validatore | +| Campo | Descrizione | +| :------------------ | :------------------------------------------------------------------ | +| `parent_hash` | hash del blocco genitore | +| `fee_recipient` | indirizzo dell'account a cui pagare le commissioni della transazione | +| `state_root` | hash radice per lo stato globale dopo aver applicato le modifiche in questo blocco | +| `receipts_root` | hash del trie delle ricevute delle transazioni | +| `logs_bloom` | struttura dati contenente i log degli eventi | +| `prev_randao` | valore utilizzato nella selezione casuale dei validatori | +| `block_number` | il numero del blocco corrente | +| `gas_limit` | limite del gas massimo consentito in questo blocco | +| `gas_used` | la quantità effettiva di gas utilizzata in questo blocco | +| `timestamp` | il tempo del blocco | +| `extra_data` | dati aggiuntivi arbitrari come byte grezzi | +| `base_fee_per_gas` | il valore della commissione di base | +| `block_hash` | Hash del blocco di esecuzione | +| `transactions_root` | hash radice delle transazioni nel payload | +| `withdrawal_root` | hash radice dei prelievi nel payload | + +L'`execution_payload` stesso contiene quanto segue (nota che questo è identico all'intestazione tranne per il fatto che invece dell'hash radice delle transazioni include l'elenco effettivo delle transazioni e le informazioni sui prelievi): + +| Campo | Descrizione | +| :----------------- | :------------------------------------------------------------------ | +| `parent_hash` | hash del blocco genitore | +| `fee_recipient` | indirizzo dell'account a cui pagare le commissioni della transazione | +| `state_root` | hash radice per lo stato globale dopo aver applicato le modifiche in questo blocco | +| `receipts_root` | hash del trie delle ricevute delle transazioni | +| `logs_bloom` | struttura dati contenente i log degli eventi | +| `prev_randao` | valore utilizzato nella selezione casuale dei validatori | +| `block_number` | il numero del blocco corrente | +| `gas_limit` | limite del gas massimo consentito in questo blocco | +| `gas_used` | la quantità effettiva di gas utilizzata in questo blocco | +| `timestamp` | il tempo del blocco | +| `extra_data` | dati aggiuntivi arbitrari come byte grezzi | +| `base_fee_per_gas` | il valore della commissione di base | +| `block_hash` | Hash del blocco di esecuzione | +| `transactions` | elenco di transazioni da eseguire | +| `withdrawals` | elenco di oggetti di prelievo | + +L'elenco `withdrawals` contiene oggetti `withdrawal` strutturati nel seguente modo: + +| Campo | Descrizione | +| :--------------- | :--------------------------------- | +| `address` | indirizzo dell'account che ha prelevato | +| `amount` | importo del prelievo | +| `index` | valore dell'indice di prelievo | +| `validatorIndex` | valore dell'indice del validatore | ## Tempo di blocco {#block-time} -Il tempo di blocco si riferisce al tempo che separa i blocchi. In Ethereum, il tempo è diviso in unità da dodici secondi, dette 'slot'. In ogni slot viene selezionato un singolo validatore per proporre un blocco. Supponendo che tutti i validatori siano online e totalmente operativi, ci sarà un blocco in ogni slot, a significare che il tempo del blocco è 12 secondi. Tuttavia, occasionalmente, i validatori potrebbero essere offline quando chiamati a proporre un blocco, a significare che talvolta gli slot possono rimanere vuoti. +Il tempo di blocco si riferisce al tempo che separa i blocchi. In Ethereum, il tempo è diviso in unità di dodici secondi chiamate 'slot'. In ogni slot viene selezionato un singolo validatore per proporre un blocco. Supponendo che tutti i validatori siano online e perfettamente funzionanti, ci sarà un blocco in ogni slot, il che significa che il tempo di blocco è di 12s. Tuttavia, occasionalmente i validatori potrebbero essere offline quando chiamati a proporre un blocco, il che significa che gli slot a volte possono rimanere vuoti. -Questa implementazione differisce dai sistemi basati sul proof-of-work, in cui i tempi di blocco sono probabilistici e regolati dalla difficoltà di mining target del protocollo. Il [tempo medio di blocco](https://etherscan.io/chart/blocktime) di Ethereum è un esempio perfetto da cui è possibile desumere il passaggio da proof-of-work a proof-of-stake in base alla coerenza del nuovo tempo di blocco da 12 secondi. +Questa implementazione differisce dai sistemi basati sulla prova di lavoro in cui i tempi di blocco sono probabilistici e regolati dalla difficoltà di mining target del protocollo. Il [tempo medio di blocco](https://etherscan.io/chart/blocktime) di Ethereum è un perfetto esempio di ciò, in cui la transizione dalla prova di lavoro alla prova di stake può essere chiaramente dedotta in base alla coerenza del nuovo tempo di blocco di 12s. -## Dimensioni del blocco {#block-size} +## Dimensione del blocco {#block-size} -Un'ultima nota importante: i blocchi stessi sono limitati in termini di dimensioni. Ogni blocco ha una dimensione prevista di 30 milioni di gas, ma la dimensione dei blocchi aumenterà o diminuirà in base alle esigenze della rete, fino al limite di 60 milioni di gas (2x dimensioni del blocco previste). Il limite di gas del blocco è regolabile per eccesso o per difetto con un fattore di 1/1024 rispetto al limite di gas del blocco precedente. Di conseguenza, i validatori possono modificare il limite di gas del blocco tramite il consenso. La quantità totale di carburante usato da tutte le transazioni nel blocco deve essere inferiore al limite di carburante del blocco. Ciò è importante perché evita che i blocchi siano arbitrariamente grandi. Se i blocchi potessero essere arbitrariamente grandi, i nodi completi meno performanti, gradualmente, non riuscirebbero più stare al passo con la rete per via dei requisiti di spazio e velocità. Più grande è il blocco, maggiore sarà la potenza di calcolo richiesta per elaborarlo in tempo per il prossimo slot. Questa è una forza centralizzante, a cui si resiste limitando le dimensioni dei blocchi. +Un'ultima nota importante è che i blocchi stessi hanno dimensioni limitate. Ogni blocco ha una dimensione target di 30 milioni di gas, ma la dimensione dei blocchi aumenterà o diminuirà in base alle richieste della rete, fino al limite del gas del blocco di 60 milioni di gas (2 volte la dimensione target del blocco). Il limite del gas del blocco può essere regolato verso l'alto o verso il basso di un fattore di 1/1024 rispetto al limite del gas del blocco precedente. Di conseguenza, i validatori possono modificare il limite del gas del blocco attraverso il consenso. La quantità totale di gas spesa da tutte le transazioni nel blocco deve essere inferiore al limite del gas del blocco. Questo è importante perché garantisce che i blocchi non possano essere arbitrariamente grandi. Se i blocchi potessero essere arbitrariamente grandi, i nodi completi meno performanti smetterebbero gradualmente di essere in grado di tenere il passo con la rete a causa dei requisiti di spazio e velocità. Più grande è il blocco, maggiore è la potenza di calcolo richiesta per elaborarli in tempo per lo slot successivo. Questa è una forza centralizzante, a cui si resiste limitando le dimensioni dei blocchi. ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} - [Transazioni](/developers/docs/transactions/) - [Gas](/developers/docs/gas/) -- [Proof of Stake](/developers/docs/consensus-mechanisms/pos) +- [Prova di stake](/developers/docs/consensus-mechanisms/pos) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/bridges/index.md b/public/content/translations/it/developers/docs/bridges/index.md index 774262b4f01..4278680dfe7 100644 --- a/public/content/translations/it/developers/docs/bridges/index.md +++ b/public/content/translations/it/developers/docs/bridges/index.md @@ -1,135 +1,137 @@ --- -title: Bridge -description: Una panoramica del bridging per gli sviluppatori +title: Ponti +description: Una panoramica sui ponti per gli sviluppatori lang: it --- -Con la rapida crescita di soluzioni di [ridimensionamento](/developers/docs/scaling/) delle blockchain di L1 e L2, affiancata da un numero sempre maggiore di applicazioni decentralizzate che operano cross-chain, il bisogno di comunicazione e di movimentazione di risorse tra catene sono diventati una parte essenziale nell'infrastruttura della rete. Esistono diverse tipologie di ponti per renderlo possibile. +Con la proliferazione delle blockchain L1 e delle soluzioni di [scalabilità](/developers/docs/scaling/) L2, insieme a un numero sempre crescente di applicazioni decentralizzate che diventano cross-chain, la necessità di comunicazione e movimento di asset tra le catene è diventata una parte essenziale dell'infrastruttura di rete. Esistono diversi tipi di ponti per contribuire a rendere tutto ciò possibile. -## Necessità di ponti {#need-for-bridges} +## Necessità dei ponti {#need-for-bridges} -I ponti esistono per connettere diverse reti blockchain. Essi abilitano la connettività ed interoperabilità tra le diverse blockchain. +I ponti esistono per connettere le reti blockchain. Consentono la connettività e l'interoperabilità tra le blockchain. -Le blockchain esistono in compartimenti stagni, nel senso che non c'è modo per le blockchain di effettuare scambi e comunicare con altre blockchain in maniera naturale. Di conseguenza, anche se potrebbe esserci un'importante attività e innovazione all'interno di un ecosistema, ciò è limitato dalla mancanza di connettività ed interoperabilità con gli altri ecosistemi. +Le blockchain esistono in ambienti isolati, il che significa che non c'è modo per le blockchain di scambiare e comunicare con altre blockchain in modo naturale. Di conseguenza, sebbene possa esserci un'attività e un'innovazione significative all'interno di un ecosistema, questo è limitato dalla mancanza di connettività e interoperabilità con altri ecosistemi. -I ponti offrono una via per connettere tra loro delle blockchain isolate. Stabiliscono un percorso di trasporto tra blockchain dove token, messaggi, dati arbitrari e persino le chiamate a [contratti intelligenti](/developers/docs/smart-contracts/) possono essere trasferite da una catena all'altra. +I ponti offrono un modo agli ambienti blockchain isolati di connettersi tra loro. Stabiliscono un percorso di trasporto tra le blockchain in cui token, messaggi, dati arbitrari e persino chiamate ai [contratti intelligenti](/developers/docs/smart-contracts/) possono essere trasferiti da una catena all'altra. -## Benefici dei ponti {#benefits-of-bridges} +## Vantaggi dei ponti {#benefits-of-bridges} -In parole povere, i ponti permettono di sbloccare numerosi casi d'uso consentendo alle reti di blockchain di scambiare dati e risorse tra loro. +In parole povere, i ponti sbloccano numerosi casi d'uso consentendo alle reti blockchain di scambiare dati e spostare asset tra di loro. -Le blockchain hanno punti forti, punti deboli e approcci unici per costruire applicazioni (velocità, volumi, costi, ecc.). I ponti contribuiscono allo sviluppo generale dell'ecosistema delle criptovalute consentendo alle blockchain di sfruttare le reciproche innovazioni. +Le blockchain hanno punti di forza, debolezze e approcci unici alla creazione di applicazioni (come velocità, produttività, costi, ecc.). I ponti aiutano lo sviluppo dell'ecosistema cripto complessivo consentendo alle blockchain di sfruttare le reciproche innovazioni. Per gli sviluppatori, i ponti consentono quanto segue: -- il trasferimento di qualsiasi dato, informazione e risorsa tra le varie catene. -- sbloccare nuove funzionalità e casi d'uso per i protocolli, in quando i ponti espandono lo spazio di progettazione per ciò che i protocolli possono offrire. Ad esempio, i protocolli per lo yield farming originariamente lanciati sulla Rete principale di Ethereum possono offrire pool di liquidità in tutte le catene compatibili con EVM. -- l'opportunità di sfruttare i punti di forza delle differenti blockchain. Per esempio, gli sviluppatori possono beneficiare delle minori commissioni offerte dalle diverse soluzioni di L2 distribuendo le proprie dapp nei diversi rollup, e le sidechain e gli utenti possono collegarli tra loro. -- collaborazione tra gli sviluppatori provenienti da diversi ecosistemi di blockchain per costruire nuovi prodotti. -- attrarre utenti e community da vari ecosistemi verso le proprie dapp. +- il trasferimento di qualsiasi dato, informazione e asset tra le catene. +- lo sblocco di nuove funzionalità e casi d'uso per i protocolli, poiché i ponti espandono lo spazio di progettazione per ciò che i protocolli possono offrire. Ad esempio, un protocollo per lo yield farming originariamente distribuito sulla [rete principale](/) di Ethereum può offrire pool di liquidità su tutte le catene compatibili con la EVM. +- l'opportunità di sfruttare i punti di forza di diverse blockchain. Ad esempio, gli sviluppatori possono beneficiare delle commissioni più basse offerte dalle diverse soluzioni L2 distribuendo le loro dApp su rollup e catene laterali, e gli utenti possono usare i ponti per spostarsi tra di esse. +- la collaborazione tra sviluppatori di vari ecosistemi blockchain per creare nuovi prodotti. +- l'attrazione di utenti e comunità da vari ecosistemi verso le loro dApp. ## Come funzionano i ponti? {#how-do-bridges-work} -Sebbene esistano molti [tipi di progetti di ponti](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/), spiccano tre modi per facilitare il trasferimento di risorse tra catene: +Sebbene esistano molti [tipi di design per i ponti](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/), spiccano tre modi per facilitare il trasferimento cross-chain di asset: -- **Blocca e conia –** Blocca le risorse sulla catena di origine e conia le risorse nella catena di destinazione. -- **Brucia e Conia –** Brucia le risorse sulla catena di origine e conia le risorse nella catena di destinazione. -- **Scambi atomici –** Scambia le risorse sulla catena di origine con risorse sulla catena di destinazione con un'altra parte. +- **Blocca e conia (Lock and mint) –** Blocca gli asset sulla catena di origine e conia gli asset sulla catena di destinazione. +- **Brucia e conia (Burn and mint) –** Brucia gli asset sulla catena di origine e conia gli asset sulla catena di destinazione. +- **Scambi atomici (Atomic swaps) –** Scambia gli asset sulla catena di origine con asset sulla catena di destinazione con un'altra parte. -## Tipologie di ponte {#bridge-types} +## Tipi di ponti {#bridge-types} -I ponti possono essere solitamente classificati in uno dei seguenti: +I ponti possono solitamente essere classificati in una delle seguenti categorie: -- **Ponti nativi –** Questi ponti sono in genere costruiti per avviare la liquidità su una particolare blockchain, facilitando agli utenti il trasferimento dei fondi verso l'ecosistema. Ad esempio, il [Arbitrum Bridge](https://bridge.arbitrum.io/) è progettato per rendere comodo per gli utenti il collegamento da Ethereum Mainnet a Arbitrum. Altri ponti di questo tipo includono Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge), ecc. -- **Ponti basati su validatori od oracoli –** Questi ponti si affidano ad un insieme esterno di validatori oppure a degli oracoli per validare trasferimenti tra catene. Esempi: Multichain e Across. -- ** Ponti generalizzati di passaggio di messaggi –** Questi ponti possono trasferire risorse, insieme a messaggi e dati arbitrari attraverso le catene. Esempi: Axelar, LayerZero e Nomad. -- **Reti di liquidità –** Questi ponti si concentrano principalmente sul trasferimento di risorse da una catena all'altra tramite scambi atomici. Generalmente non supportano il passaggio di messaggi tra catene. Esempi: Connext e Hop. +- **Ponti nativi –** Questi ponti sono in genere costruiti per avviare la liquidità su una particolare blockchain, rendendo più facile per gli utenti spostare fondi nell'ecosistema. Ad esempio, l'[Arbitrum Bridge](https://bridge.arbitrum.io/) è costruito per rendere conveniente agli utenti l'uso del ponte dalla rete principale di Ethereum ad Arbitrum. Altri ponti di questo tipo includono Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge), ecc. +- **Ponti basati su validatori o oracoli –** Questi ponti si basano su un set di validatori esterni o oracoli per convalidare i trasferimenti cross-chain. Esempi: Multichain e Across. +- **Ponti di passaggio di messaggi generalizzati –** Questi ponti possono trasferire asset, insieme a messaggi e dati arbitrari tra le catene. Esempi: Axelar, LayerZero e Nomad. +- **Reti di liquidità –** Questi ponti si concentrano principalmente sul trasferimento di asset da una catena all'altra tramite scambi atomici. Generalmente, non supportano il passaggio di messaggi cross-chain. Esempi: Connext e Hop. ## Compromessi da considerare {#trade-offs} -Con i ponti, non esistono soluzioni perfette. Piuttosto, ci sono solo compromessi accettati per realizzare uno scopo. Gli sviluppatori e gli utenti possono valutare i diversi ponti in base ai seguenti fattori: +Con i ponti, non esistono soluzioni perfette. Piuttosto, ci sono solo compromessi fatti per raggiungere uno scopo. Sviluppatori e utenti possono valutare i ponti in base ai seguenti fattori: -- **Sicurezza –** Chi verifica il sistema? I ponti messi in sicurezza dai validatori esterni sono tipicamente meno sicuri dei ponti locali o tenuti sicuri in modo nativo dai validatori della blockchain. -- **Comodità–** Quanto tempo ci vuole per completare una transazione e quante transazioni ha dovuto firmare un utente? Per uno sviluppatore, quanto tempo ci vuole per integrare un ponte, e quanto è complesso questo processo? -- **Connettività –** Quali sono le diverse catene di destinazione che un ponte può collegare (ossia rollup, sidechain, altre blockchain di livello 1, ecc.), e quanto è difficile integrare una nuova blockchain? -- **Capacità di passare dati più complessi –** Un ponte può abilitare il trasferimento di messaggi e dati arbitrari più complessi attraverso le catene, o supporta solo i trasferimenti di risorse tra catene? -- **Rapporto costo-efficacia –** Quanto costa trasferire le risorse tra le catene attraverso un ponte? Tipicamente, i ponti addebitano una commissione fissa o variabile a seconda del costo del carburante e dalla liquidità di specifici percorsi. È inoltre fondamentale valutare il rapporto costi-efficacia di un ponte sulla base del capitale necessario per garantirne la sicurezza. +- **Sicurezza –** Chi verifica il sistema? I ponti protetti da validatori esterni sono in genere meno sicuri dei ponti protetti localmente o nativamente dai validatori della blockchain. +- **Convenienza –** Quanto tempo ci vuole per completare una transazione e quante transazioni ha dovuto firmare un utente? Per uno sviluppatore, quanto tempo ci vuole per integrare un ponte e quanto è complesso il processo? +- **Connettività –** Quali sono le diverse catene di destinazione che un ponte può connettere (ad es. rollup, catene laterali, altre blockchain di livello 1, ecc.) e quanto è difficile integrare una nuova blockchain? +- **Capacità di passare dati più complessi –** Un ponte può consentire il trasferimento di messaggi e dati arbitrari più complessi tra le catene, o supporta solo trasferimenti di asset cross-chain? +- **Efficienza dei costi –** Quanto costa trasferire asset tra le catene tramite un ponte? In genere, i ponti addebitano una commissione fissa o variabile a seconda dei costi del gas e della liquidità di percorsi specifici. È anche fondamentale valutare l'efficienza dei costi di un ponte in base al capitale richiesto per garantirne la sicurezza. -Ad un livello elevato, i ponti possono essere classificati come fidati e senza fiducia. +Ad alto livello, i ponti possono essere classificati come fidati (trusted) e senza fiducia (trustless). -- **Fidato –** I ponti fidati sono verificati esternamente. Usano un insieme esterno di verificatori (Federazioni con sistemi di calcolo multifirma, multi-parte, oracolo) per inviare dati attraverso le catene. Di conseguenza, possono offrire una grande connettività e consentire il passaggio di messaggi completamente generalizzati attraverso le catene. Inoltre, tendono a funzionare meglio con la velocità e il rapporto costi-efficacia. Ciò va a scapito della sicurezza, poiché gli utenti devono fare affidamento sulla sicurezza del ponte. -- **Senza fiducia –** Questi ponti si basano sulle blockchain che stanno connettendo e i loro validatori per trasferire messaggi e token. Sono 'senza fiducia' perché non aggiungono nuove ipotesi di fiducia (oltre alle blockchain). Di conseguenza, i ponti senza fiducia sono considerati più sicuri dei ponti fidati. +- **Fidati (Trusted) –** I ponti fidati sono verificati esternamente. Utilizzano un set esterno di verificatori (Federazioni con multifirma, sistemi di calcolo multiparte, reti di oracoli) per inviare dati tra le catene. Di conseguenza, possono offrire un'ottima connettività e consentire il passaggio di messaggi completamente generalizzato tra le catene. Tendono anche a funzionare bene in termini di velocità ed efficienza dei costi. Questo va a scapito della sicurezza, poiché gli utenti devono fare affidamento sulla sicurezza del ponte. +- **Senza fiducia (Trustless) –** Questi ponti si basano sulle blockchain che stanno connettendo e sui loro validatori per trasferire messaggi e token. Sono "senza fiducia" perché non aggiungono nuove ipotesi di fiducia (oltre alle blockchain). Di conseguenza, i ponti senza fiducia sono considerati più sicuri dei ponti fidati. -Per valutare i ponti senza fiducia sulla base di altri fattori, dobbiamo suddividerli in ponti generalizzati di passaggio di messaggi e reti di liquidità. +Per valutare i ponti senza fiducia in base ad altri fattori, dobbiamo suddividerli in ponti di passaggio di messaggi generalizzati e reti di liquidità. -- **Ponti generalizzati di passaggio di messaggio –** Questi ponti eccellono in termini di sicurezza e capacità di trasferire dati più complessi attraverso le catene. In genere, hanno anche buoni rapporti costi-efficacia. Tuttavia, questi punti di forza sono generalmente a scapito della connettività per i ponti client leggeri (es: IBC) e hanno svantaggi di velocità per i ponti ottimistici (es: Nomad) che utilizzano prove di frode. -- **Reti di liquidità –** Questi ponti utilizzano gli scambi atomici per trasferire le risorse e sono sistemi localmente verificati (ossia, utilizzano i validatori delle blockchain sottostanti per verificare le transazioni). Di conseguenza, eccellono in sicurezza e velocità. Inoltre, sono considerati relativamente convenienti e offrono una buona connettività. Tuttavia, il principale compromesso è la loro incapacità di trasmettere dati più complessi, poiché non supportano il passaggio di messaggi tra catene. +- **Ponti di passaggio di messaggi generalizzati –** Questi ponti eccellono in sicurezza e nella capacità di trasferire dati più complessi tra le catene. In genere, sono anche buoni in termini di efficienza dei costi. Tuttavia, questi punti di forza vanno generalmente a scapito della connettività per i ponti client leggeri (es: IBC) e degli svantaggi di velocità per i ponti ottimistici (es: Nomad) che utilizzano prove di frode. +- **Reti di liquidità –** Questi ponti utilizzano scambi atomici per il trasferimento di asset e sono sistemi verificati localmente (ovvero, utilizzano i validatori delle blockchain sottostanti per verificare le transazioni). Di conseguenza, eccellono in sicurezza e velocità. Inoltre, sono considerati comparativamente efficienti in termini di costi e offrono una buona connettività. Tuttavia, il compromesso principale è la loro incapacità di passare dati più complessi, poiché non supportano il passaggio di messaggi cross-chain. -## Rischi nell'uso dei ponti {#risk-with-bridges} +## Rischi con i ponti {#risk-with-bridges} -I ponti rappresentano i primi tre [attacchi principali nella DeFi](https://rekt.news/leaderboard/) e sono ancora nelle prime fasi di sviluppo. L'utilizzo di un ponte comporta i seguenti rischi: +I ponti sono responsabili dei tre [più grandi hack nella DeFi](https://rekt.news/leaderboard/) e sono ancora nelle prime fasi di sviluppo. L'utilizzo di qualsiasi ponte comporta i seguenti rischi: -- **Rischio di contratto intelligente –** Mentre molti ponti hanno superato con successo i controlli, basta un difetto in un contratto intelligente affinché le risorse siano esposte agli attacchi (es: [il ponte Wormhole di Solana](https://rekt.news/wormhole-rekt/)). -- **Rischi finanziari sistemici** – Molti ponti utilizzano risorse impacchettate per coniare le versioni canoniche di risorse originali in una nuova catena. Ciò espone l'ecosistema a un rischio sistemico, poiché abbiamo visto sfruttate le versioni impacchettate dei token. -- **Rischio di controparte –** Alcuni ponti utilizzano un design fidato che richiede agli utenti di fare affidamento sul presupposto che i validatori non collaboreranno per rubare i fondi degli utenti. La necessità per gli utenti di fidarsi di questi attori di terze parti li espone a rischi come rug pull, censura e altre attività malevole. -- **Questioni aperte –** Dato che i ponti sono nelle fasi iniziali del loro sviluppo, ci sono molte domande senza risposta relative a come funzioneranno in diverse condizioni di mercato, come in periodi di congestione della rete e durante eventi imprevisti come attacchi a livello di rete o rollback dello stato. Questa incertezza presenta alcuni rischi, il cui grado è ancora sconosciuto. +- **Rischio dei contratti intelligenti –** Sebbene molti ponti abbiano superato con successo gli audit, basta un solo difetto in un contratto intelligente affinché gli asset siano esposti agli hack (es: [Wormhole Bridge di Solana](https://rekt.news/wormhole-rekt/)). +- **Rischi finanziari sistemici** – Molti ponti utilizzano asset avvolti per coniare versioni canoniche dell'asset originale su una nuova catena. Ciò espone l'ecosistema a un rischio sistemico, poiché abbiamo visto versioni avvolte di token essere sfruttate. +- **Rischio di controparte –** Alcuni ponti utilizzano un design fidato che richiede agli utenti di fare affidamento sul presupposto che i validatori non colluderanno per rubare i fondi degli utenti. La necessità per gli utenti di fidarsi di questi attori di terze parti li espone a rischi come rug pull, censura e altre attività dannose. +- **Problemi aperti –** Dato che i ponti sono nelle fasi nascenti dello sviluppo, ci sono molte domande senza risposta relative a come si comporteranno i ponti in diverse condizioni di mercato, come in tempi di congestione della rete e durante eventi imprevisti come attacchi a livello di rete o rollback dello stato. Questa incertezza pone determinati rischi, il cui grado è ancora sconosciuto. -## In che modo le dapp possono utilizzare i ponti? {#how-can-dapps-use-bridges} +## Come possono le dApp utilizzare i ponti? {#how-can-dapps-use-bridges} -Ecco alcune applicazioni pratiche che gli sviluppatori possono prendere in considerazione sui ponti e sul portare la loro dapp cross-chain: +Ecco alcune applicazioni pratiche che gli sviluppatori possono considerare riguardo ai ponti e al portare la loro dApp cross-chain: ### Integrare i ponti {#integrating-bridges} -Per gli sviluppatori, vi sono diversi modi per aggiungere il supporto per i ponti: +Per gli sviluppatori, ci sono molti modi per aggiungere il supporto per i ponti: -1. **Costruire il proprio ponte –** Costruire un ponte sicuro e affidabile non è facile, soprattutto se si prende un percorso a fiducia minimizzata. Inoltre, servono anni di esperienza e competenze tecniche in materia di scalabilità e interoperabilità. Inoltre, sarebbe necessario un team sul campo per mantenere un ponte e attirare liquidità sufficiente per renderlo fattibile. +1. **Costruire il proprio ponte –** Costruire un ponte sicuro e affidabile non è facile, specialmente se si intraprende un percorso con minimizzazione della fiducia. Inoltre, richiede anni di esperienza e competenza tecnica relative agli studi sulla scalabilità e sull'interoperabilità. In aggiunta, richiederebbe un team pratico per mantenere un ponte e attrarre liquidità sufficiente per renderlo fattibile. -2. **Mostrare agli utenti varie opzioni di ponte –** Molte [dapp](/developers/docs/dapps/) richiedono agli utenti di avere il loro token nativo per interagire con loro. Per consentire agli utenti di accedere ai loro token, offrono diverse opzioni di ponte sul loro sito web. Tuttavia, questo metodo è una soluzione rapida al problema in quanto allontana l'utente dall'interfaccia dapp e richiede comunque che interagisca con altri dapp e ponti. Si tratta di un'esperienza complicata d'ingresso al protocollo, con una maggiore possibilità di commettere errori. +2. **Mostrare agli utenti più opzioni di ponti –** Molte [dApp](/developers/docs/dapps/) richiedono agli utenti di avere il loro token nativo per interagire con esse. Per consentire agli utenti di accedere ai loro token, offrono diverse opzioni di ponti sul loro sito web. Tuttavia, questo metodo è una soluzione rapida al problema in quanto allontana l'utente dall'interfaccia della dApp e richiede comunque di interagire con altre dApp e ponti. Questa è un'esperienza di onboarding macchinosa con una maggiore possibilità di commettere errori. -3. **Integrare un ponte –** Questa soluzione non richiede che la dapp invii utenti a interfacce di ponti o DEX esterne. Consente alle dapp di migliorare l'esperienza d'ingresso dell'utente. Tuttavia, questo approccio ha i suoi limiti: +3. **Integrare un ponte –** Questa soluzione non richiede alla dApp di inviare gli utenti alle interfacce esterne del ponte e del DEX. Consente alle dApp di migliorare l'esperienza di onboarding dell'utente. Tuttavia, questo approccio ha i suoi limiti: + - La valutazione e la manutenzione dei ponti sono difficili e dispendiose in termini di tempo. + - La selezione di un solo ponte crea un singolo punto di guasto e dipendenza. + - La dApp è limitata dalle capacità del ponte. + - I ponti da soli potrebbero non essere sufficienti. Le dApp potrebbero aver bisogno di DEX per offrire maggiori funzionalità come gli scambi cross-chain. - - La valutazione e la manutenzione dei ponti sono difficili e richiedono tempo. - - Selezionare un solo ponte crea un punto di errore unico e dipendenza. - - La dapp è limitata dalla capacità del ponte. - - I ponti da soli potrebbero non bastare. Le dapp potrebbero avere necessità dei DEX per offrire maggiori funzionalità, come gli scambi tra le diverse catene. +4. **Integrare più ponti –** Questa soluzione risolve molti problemi associati all'integrazione di un singolo ponte. Tuttavia, ha anche dei limiti, poiché l'integrazione di più ponti consuma risorse e crea sovraccarichi tecnici e di comunicazione per gli sviluppatori, la risorsa più scarsa nel settore cripto. -4. **Integrare più ponti –** Questa soluzione risolve molti problemi associati all'integrazione di un unico ponte. Tuttavia, anche questa ha dei limiti, poiché l'integrazione di più ponti richiede risorse e crea costi tecnici e comunicativi per gli sviluppatori – la risorsa più scarsa nelle criptovalute. +5. **Integrare un aggregatore di ponti –** Un'altra opzione per le dApp è l'integrazione di una soluzione di aggregazione di ponti che dia loro accesso a più ponti. Gli aggregatori di ponti ereditano i punti di forza di tutti i ponti e quindi non sono limitati dalle capacità di un singolo ponte. In particolare, gli aggregatori di ponti in genere mantengono le integrazioni dei ponti, il che salva la dApp dal fastidio di dover rimanere aggiornata sugli aspetti tecnici e operativi dell'integrazione di un ponte. -5. **Integrare un aggregatore di ponti –** Un'altra opzione per le dapp è l'integrazione di un aggregatore di ponti che dia loro accesso a più ponti simultaneamente. Gli aggregatori di ponti ereditano i punti di forza di tutti i ponti e quindi non sono limitati dalle capacità di un singolo ponte. In particolare, gli aggregatori di ponti mantengono tipicamente le integrazioni dei ponti, il che evita alla dapp la seccatura di stare dietro agli aspetti tecnici e operativi di un'integrazione di ponte. +Detto questo, anche gli aggregatori di ponti hanno i loro limiti. Ad esempio, sebbene possano offrire più opzioni di ponti, sul mercato sono in genere disponibili molti più ponti oltre a quelli offerti sulla piattaforma dell'aggregatore. Inoltre, proprio come i ponti, anche gli aggregatori di ponti sono esposti ai rischi dei contratti intelligenti e della tecnologia (più contratti intelligenti = più rischi). -Detto questo, anche gli aggregatori di ponti hanno i loro limiti. Per esempio, benché possano offrire più opzioni di ponte, molti altri sono tipicamente disponibili sul mercato diversi da quelli offerti dalla piattaforma dell'aggregatore. Inoltre, proprio come i ponti, anche gli aggregatori di ponti sono esposti a rischi di contratti intelligenti e tecnologici (più contratti intelligenti = più rischi). +Se una dApp intraprende la strada dell'integrazione di un ponte o di un aggregatore, ci sono diverse opzioni in base a quanto profonda debba essere l'integrazione. Ad esempio, se si tratta solo di un'integrazione front-end per migliorare l'esperienza di onboarding dell'utente, una dApp integrerebbe il widget. Tuttavia, se l'integrazione serve a esplorare strategie cross-chain più profonde come lo staking, lo yield farming, ecc., la dApp integra l'SDK o l'API. -Se una dapp prosegue lungo il percorso di integrazione di un ponte o di un aggregatore, esistono diverse opzioni in base al grado di profondità dell'integrazione stessa. Per esempio, se si tratta solo di un'integrazione front-end per migliorare l'esperienza d'ingresso dell'utente, una dapp integrerebbe il widget. Tuttavia, se l'integrazione è volta a esplorare strategie cross-chain più profonde come staking, yield farming, ecc., la dAapp integra l'SDK o l'API. +### Distribuire una dApp su più catene {#deploying-a-dapp-on-multiple-chains} -### Distribuire una dapp su diverse catene {#deploying-a-dapp-on-multiple-chains} - -Per distribuire una dApp su più catene, gli sviluppatori possono utilizzare piattaforme di sviluppo come [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/), ecc. In genere, queste piattaforme sono dotate di plugin componibili che possono consentire alle dapp di essere distribuite su diverse catene. Per esempio, gli sviluppatori possono utilizzare un proxy di distribuzione deterministico offerto dal [plugin hardhat-deploy](https://github.com/wighawag/hardhat-deploy). +Per distribuire una dApp su più catene, gli sviluppatori possono utilizzare piattaforme di sviluppo come [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/), ecc. In genere, queste piattaforme sono dotate di plugin componibili che possono consentire alle dApp di diventare cross-chain. Ad esempio, gli sviluppatori possono utilizzare un proxy di distribuzione deterministico offerto dal [plugin hardhat-deploy](https://github.com/wighawag/hardhat-deploy). #### Esempi: -- [Come costruire dapp cross-chain](https://moralis.io/how-to-build-cross-chain-dapps/) +- [Come costruire dApp cross-chain](https://moralis.io/how-to-build-cross-chain-dapps/) - [Costruire un marketplace NFT cross-chain](https://youtu.be/WZWCzsB1xUE) -- [Moralis: costruire una dapp NFT cross-chain](https://www.youtube.com/watch?v=ehv70kE1QYo) +- [Moralis: Costruire dApp NFT cross-chain](https://www.youtube.com/watch?v=ehv70kE1QYo) -### Monitoraggio dell'attività del contratto tra le catene {#monitoring-contract-activity-across-chains} +### Monitorare l'attività dei contratti tra le catene {#monitoring-contract-activity-across-chains} -Per monitorare l'attività del contratto tra le catene, gli sviluppatori possono utilizzare sotto-grafici e piattaforme di sviluppo come Tenderly per osservare i contratti intelligenti in tempo reale. Tali piattaforme dispongono anche di strumenti che offrono maggiori funzionalità di monitoraggio dei dati per le attività cross-chain, ad esempio il controllo di [eventi emessi dai contratti](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events), ecc. +Per monitorare l'attività dei contratti tra le catene, gli sviluppatori possono utilizzare sottografi e piattaforme per sviluppatori come Tenderly per osservare i contratti intelligenti in tempo reale. Tali piattaforme dispongono anche di strumenti che offrono maggiori funzionalità di monitoraggio dei dati per le attività cross-chain, come il controllo degli [eventi emessi dai contratti](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events), ecc. #### Strumenti - [The Graph](https://thegraph.com/en/) - [Tenderly](https://tenderly.co/) -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} -- [Ponti della blockchain](/bridges/) – ethereum.org -- [Ponti della blockchain: creare reti di criptoreti](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) 8 Set 2021 - Dmitriy Berenzon -- [Il trilemma dell'interoperabilità](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) 1 Ott 2021 - Arjun Bhuptani -- [Cluster: come i ponti fidati & a fiducia minimizzata danno forma al paesaggio multi-catena](https://blog.celestia.org/clusters/) 4 Ott 2021 – Mustafa Al-Bassam -- [LI.FI: con i ponti, la fiducia è uno spettro](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) 28 Apr 2022 – Arjun Chand +- [Ponti blockchain](/bridges/) – ethereum.org +- [L2Beat Bridge Risk Framework](https://l2beat.com/bridges/summary) +- [Blockchain Bridges: Building Networks of Cryptonetworks](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - 8 set 2021 – Dmitriy Berenzon +- [The Interoperability Trilemma](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - 1 ott 2021 – Arjun Bhuptani +- [Clusters: How Trusted & Trust-Minimized Bridges Shape the Multi-Chain Landscape](https://blog.celestia.org/clusters/) - 4 ott 2021 – Mustafa Al-Bassam +- [LI.FI: With Bridges, Trust is a Spectrum](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - 28 apr 2022 – Arjun Chand +- [The State Of Rollup Interoperability Solutions](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - 20 giu 2024 – Alex Hook +- [Harnessing Shared Security For Secure Cross-Chain Interoperability: Lagrange State Committees And Beyond](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - 12 giu 2024 – Emmanuel Awosika -Inoltre, ecco alcune presentazioni intuitive di [James Prestwich](https://twitter.com/_prestwich) che possono contribuire a sviluppare una comprensione più profonda dei ponti: +Inoltre, ecco alcune presentazioni interessanti di [James Prestwich](https://twitter.com/_prestwich) che possono aiutare a sviluppare una comprensione più profonda dei ponti: -- [Costruire ponti, giardini non recintati](https://youtu.be/ZQJWMiX4hT0) -- [Rompere i ponti](https://youtu.be/b0mC-ZqN8Oo) -- [Perché i ponti sono roventi](https://youtu.be/c7cm2kd20j8) +- [Building Bridges, Not Walled Gardens](https://youtu.be/ZQJWMiX4hT0) +- [Breaking Down Bridges](https://youtu.be/b0mC-ZqN8Oo) +- [Why are the Bridges Burning](https://youtu.be/c7cm2kd20j8) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/index.md index 386539afe5f..543547f54ed 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/index.md @@ -1,92 +1,92 @@ --- title: Meccanismi di consenso -description: Spiegazione dei protocolli di consenso nei sistemi distribuiti e ruolo che svolgono in Ethereum. +description: Una spiegazione dei protocolli di consenso nei sistemi distribuiti e del ruolo che svolgono in Ethereum. lang: it --- -Il termine 'meccanismo di consenso' è usato spesso in modo colloquiale per far riferimento ai protocolli 'Proof of Stake', 'Proof of Work' o 'proof-of-authority'. Tuttavia, questi sono semplicemente dei componenti nel meccanismo di consenso che proteggono dagli [attacchi Sybil](/glossary/#sybil-attack). I meccanismi di consenso sono l'insieme completo di idee, protocolli e incentivi che consentono a una serie distribuita di nodi di acconsentire sullo stato di una blockchain. +Il termine "meccanismo di consenso" è spesso usato colloquialmente per riferirsi ai protocolli di "prova di stake", "prova di lavoro" o "proof-of-authority". Tuttavia, questi sono solo componenti dei meccanismi di consenso che proteggono dagli [attacchi Sybil](/glossary/#sybil-attack). I meccanismi di consenso sono l'insieme completo di idee, protocolli e incentivi che consentono a un gruppo distribuito di nodi di concordare sullo stato di una blockchain. ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzitutto di legere l'[introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). -## Che cos'è il consenso? {#what-is-consensus} +## Cos'è il consenso? {#what-is-consensus} -Per consenso, intendiamo dire che è stato raggiunto un accordo generale. Consideriamo un gruppo di persone che vanno al cinema. Se non c'è disaccordo sulla proposta del film da scegliere, allora si raggiunge il consenso. Se vi è disaccordo, il gruppo deve avere i mezzi per decidere quale film guardare. Nel caso estremo il gruppo alla fine si dividerà. +Per consenso, intendiamo che è stato raggiunto un accordo generale. Considera un gruppo di persone che va al cinema. Se non c'è disaccordo sulla scelta del film proposta, allora si raggiunge un consenso. Se c'è disaccordo, il gruppo deve avere i mezzi per decidere quale film vedere. In casi estremi, il gruppo alla fine si dividerà. -Per quanto riguarda la blockchain di Ethereum, raggiungere un consenso significa che almeno il 66% dei nodi sulla rete è d'accordo sul prossimo stato globale della rete. +Per quanto riguarda la blockchain di [Ethereum](/), il processo è formalizzato e raggiungere il consenso significa che almeno il 66% dei nodi sulla rete concorda sullo stato globale della rete. -## Che cos'è un meccanismo di consenso? {#what-is-a-consensus-mechanism} +## Cos'è un meccanismo di consenso? {#what-is-a-consensus-mechanism} -Il termine meccanismo di consenso si riferisce all'insieme completo di protocolli, incentivi e idee che consente a una rete di nodi di acconsentire sullo stato di una blockchain. +Il termine meccanismo di consenso si riferisce all'intero insieme di protocolli, incentivi e idee che consentono a una rete di nodi di concordare sullo stato di una blockchain. -Ethereum usa un meccanismo di consenso basato sul Proof of Stake che trae la propria sicurezza cripto-economica da una serie di ricompense e sanzioni applicate al capitale bloccato dagli staker. Questa struttura di incentivi incoraggia i singoli staker a gestire validatori onesti, punisce coloro che non lo fanno, e crea un costo estremamente elevato per attaccare la rete. +Ethereum utilizza un meccanismo di consenso basato sulla prova di stake che deriva la sua sicurezza crittoeconomica da un insieme di ricompense e penalità applicate al capitale bloccato dagli staker. Questa struttura di incentivi incoraggia i singoli staker a operare validatori onesti, punisce coloro che non lo fanno e crea un costo estremamente elevato per attaccare la rete. -Quindi, esiste un protocollo che governa il modo in cui i validatori onesti sono selezionati per proporre o convalidare i blocchi, elaborare le transazioni e votare per la loro vista della testa della catena. Nelle rare situazioni in cui diversi blocchi sono nella stessa posizione vicino alla testa della catena, esiste un meccanismo di scelta della diramazione che seleziona i blocchi che compongono la catena 'più pesante', misurata dal numero di validatori che hanno votato per i blocchi, ponderato dal loro saldo di ether in staking. +Inoltre, c'è un protocollo che governa come i validatori onesti vengono selezionati per proporre o convalidare i blocchi, elaborare le transazioni e votare per la loro visione della testa della catena. Nelle rare situazioni in cui più blocchi si trovano nella stessa posizione vicino alla testa della catena, c'è un meccanismo di scelta della biforcazione che seleziona i blocchi che compongono la catena più "pesante", misurata dal numero di validatori che hanno votato per i blocchi ponderato dal loro saldo di ether in stake. -Alcuni concetti importanti per il consenso non sono definiti esplicitamente nel codice, come la sicurezza aggiuntiva offerta dal potenziale coordinamento sociale fuori banda, come un'ultima linea di difesa contro gli attacchi alla rete. +Alcuni concetti importanti per il consenso non sono esplicitamente definiti nel codice, come la sicurezza aggiuntiva offerta dal potenziale coordinamento sociale fuori banda come ultima linea di difesa contro gli attacchi alla rete. -Questi componenti costituiscono nel loro complesso il meccanismo di consenso. +Questi componenti insieme formano il meccanismo di consenso. ## Tipi di meccanismi di consenso {#types-of-consensus-mechanisms} -### Basato sul Proof of Work {#proof-of-work} +### Basato sulla prova di lavoro {#proof-of-work} -Come Bitcoin, Ethereum in precedenza utilizzava un protocollo di consenso basato sul **Proof of Work (PoW)**. +Come Bitcoin, Ethereum un tempo utilizzava un protocollo di consenso basato sulla **prova di lavoro (PoW)**. -#### Creazione di blocchi {#pow-block-creation} +#### Creazione dei blocchi {#pow-block-creation} -I miner competono per creare nuovi blocchi, riempiti di transazioni elaborate. Il vincitore condivide il nuovo blocco con il resto della rete e guadagna ETH appena coniati. La gara è vinta dal computer che è capace di risolvere più velocemente un rompicapo matematico. Ciò produce il collegamento crittografico tra il blocco corrente e quello precedente. Risolvere questo rompicapo rappresenta il lavoro da svolgere nel modello "proof-of-work". La catena canonica è quindi determinata da una regola di scelta della biforcazione, che seleziona la serie di blocchi che ha richiesto il maggiore lavoro per essere minata. +I miner competono per creare nuovi blocchi pieni di transazioni elaborate. Il vincitore condivide il nuovo blocco con il resto della rete e guadagna alcuni ETH appena coniati. La gara viene vinta dal computer che è in grado di risolvere un enigma matematico più velocemente. Questo produce il collegamento crittografico tra il blocco corrente e il blocco precedente. Risolvere questo enigma è il lavoro nella "prova di lavoro". La catena canonica è quindi determinata da una regola di scelta della biforcazione che seleziona l'insieme di blocchi che hanno richiesto il maggior lavoro per essere estratti. #### Sicurezza {#pow-security} -La sicurezza della rete è garantita dal fatto che occorrerebbe il 51% della potenza totale di elaborazione della rete per frodare la catena. Ciò richiederebbe investimenti ingenti in attrezzature ed energia; con tutta probabilità spenderesti di più del possibile guadagno. +La rete è mantenuta sicura dal fatto che avresti bisogno del 51% della potenza di calcolo della rete per frodare la catena. Ciò richiederebbe investimenti così enormi in attrezzature ed energia; è probabile che spenderesti più di quanto guadagneresti. -Maggiori informazioni sul [Proof of Work](/developers/docs/consensus-mechanisms/pow/) +Maggiori informazioni sulla [prova di lavoro](/developers/docs/consensus-mechanisms/pow/) -### Basato sul Proof of Stake {#proof-of-stake} +### Basato sulla prova di stake {#proof-of-stake} -Ora Ethereum utilizza un protocollo di consenso basato sul **Proof of Stake (PoS)**. +Ethereum ora utilizza un protocollo di consenso basato sulla **prova di stake (PoS)**. -#### Creazione di blocchi {#pos-block-creation} +#### Creazione dei blocchi {#pos-block-creation} -I validatori creano i blocchi. Per ogni slot viene selezionato casualmente un validatore che funge da propositore di blocchi. Il client di consenso dei validatori richiede un pacchetto di transazioni come 'payload di esecuzione' dal client di esecuzione associato. Questo viene avvolto in dati di consenso per formare un blocco, che viene inviato ad altri nodi sulla rete Ethereum. La produzione di questo blocco è ricompensata in ETH. Nei rari casi in cui esistono diversi blocchi possibili per un singolo slot, o in cui i nodi vengono a conoscenza dei blocchi in momenti diversi, l'algoritmo di scelta della diramazione seleziona il blocco che forma la catena con il maggiore peso di attestazioni (dove il peso è il numero di validatori che attestano, scalato per il loro saldo di ETH). +I validatori creano i blocchi. Un validatore viene selezionato casualmente in ogni slot per essere il proponente del blocco. Il loro client di consenso richiede un pacchetto di transazioni come "carico utile di esecuzione" dal loro client di esecuzione associato. Lo avvolgono nei dati di consenso per formare un blocco, che inviano ad altri nodi sulla rete Ethereum. Questa produzione di blocchi è ricompensata in ETH. In rari casi in cui esistono più blocchi possibili per un singolo slot, o i nodi vengono a conoscenza dei blocchi in momenti diversi, l'algoritmo di scelta della biforcazione sceglie il blocco che forma la catena con il maggior peso di attestazioni (dove il peso è il numero di validatori che attestano proporzionato al loro saldo in ETH). #### Sicurezza {#pos-security} -Un sistema di Proof of Stake è cripto-economicamente sicuro poiché un utente malevolo che tenta di prendere il controllo della catena deve distruggere un'enorme quantità di ETH. Un sistema di ricompense incentiva i singoli staker a comportarsi onestamente e le sanzioni disincentivano gli staker dall'agire in modo malevolo. +Un sistema di prova di stake è sicuro dal punto di vista crittoeconomico perché un utente malintenzionato che tenta di prendere il controllo della catena deve distruggere un'enorme quantità di ETH. Un sistema di ricompense incentiva i singoli staker a comportarsi onestamente e le penalità disincentivano gli staker dall'agire in modo dannoso. -Maggiori informazioni sul [Proof of Stake](/developers/docs/consensus-mechanisms/pos/) +Maggiori informazioni sulla [prova di stake](/developers/docs/consensus-mechanisms/pos/) ### Una guida visiva {#types-of-consensus-video} -Scopri altri contenuti sui diversi tipi di meccanismi di consenso usati su Ethereum: +Guarda di più sui diversi tipi di meccanismi di consenso utilizzati su Ethereum: -### Resistenza di Sybil e selezione della catena {#sybil-chain} +### Resistenza Sybil e selezione della catena {#sybil-chain} -Il Proof of Work e il Proof of Stake non sono di per sé protocolli di consenso, ma sono spesso considerati tali per semplicità. Sono in realtà meccanismi di resistenza di Sybil e selettori dell'autore del blocco, ovvero un metodo per decidere chi è l'autore dell'ultimo blocco. Un altro importante componente è l'algoritmo di selezione della catena (anche noto come di scelta della diramazione), che consente ai nodi di selezionare un unico blocco corretto all'inizio della catena, negli scenari in cui esistono più blocchi nella stessa posizione. +La prova di lavoro e la prova di stake da sole non sono protocolli di consenso, ma spesso vengono definite tali per semplicità. In realtà sono meccanismi di resistenza agli attacchi Sybil e selettori dell'autore del blocco; sono un modo per decidere chi è l'autore dell'ultimo blocco. Un altro componente importante è l'algoritmo di selezione della catena (noto anche come scelta della biforcazione) che consente ai nodi di scegliere un singolo blocco corretto alla testa della catena in scenari in cui esistono più blocchi nella stessa posizione. -La **resistenza a Sybil** misura l'efficacia di un protocollo contro un attacco di Sybil. La resistenza a questo tipo di attacco è essenziale per una blockchain decentralizzata e consente ai miner e ai validatori di essere ricompensati equamente in base alle risorse messe in uso. Proof-of-work e Proof of Stake proteggono da questo rischio, facendo consumare agli utenti molta energia o costringendoli a mettere in campo molte garanzie. Queste protezioni sono un deterrente economico contro gli attacchi di Sybil. +La **resistenza Sybil** misura come un protocollo si comporta contro un attacco Sybil. La resistenza a questo tipo di attacco è essenziale per una blockchain decentralizzata e consente ai miner e ai validatori di essere ricompensati equamente in base alle risorse investite. La prova di lavoro e la prova di stake proteggono da questo facendo in modo che gli utenti spendano molta energia o mettano a disposizione molte garanzie. Queste protezioni sono un deterrente economico agli attacchi Sybil. -Per decidere quale catena sia quella "corretta" si usa una **regola di selezione della catena**. Bitcoin usa la regola della "catena più lunga", nel senso che la blockchain più lunga è quella che il resto dei nodi accetta come valida e con cui lavora. Per le catene di Proof of Work, la catena più lunga è determinata dalla difficoltà cumulativa e totale del Proof of Work della catena. Anche Ethereum usava la regola della catena più lunga; tuttavia, ora che Ethereum opera sul Proof of Stake, ha adottato un algoritmo di scelta della diramazione che misura il 'peso' della catena. Il peso è la somma cumulata dei voti dei validatori, ponderata dai saldi di ether in staking dei validatori. +Una **regola di selezione della catena** viene utilizzata per decidere quale catena sia quella "corretta". Bitcoin utilizza la regola della "catena più lunga", il che significa che qualunque blockchain sia la più lunga sarà quella che il resto dei nodi accetterà come valida e con cui lavorerà. Per le catene di prova di lavoro, la catena più lunga è determinata dalla difficoltà totale cumulativa della prova di lavoro della catena. Anche Ethereum utilizzava la regola della catena più lunga; tuttavia, ora che Ethereum funziona con la prova di stake, ha adottato un algoritmo di scelta della biforcazione aggiornato che misura il "peso" della catena. Il peso è la somma accumulata dei voti dei validatori, ponderata dai saldi di ether in stake dei validatori. -Ethereum usa un meccanismo di consenso noto come [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/), che combina il [proof-of-work di Casper FFG](https://arxiv.org/abs/1710.09437) con la [regola di scelta della biforcazione di GHOST](https://arxiv.org/abs/2003.03052). +Ethereum utilizza un meccanismo di consenso noto come [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) che combina la [prova di stake Casper FFG](https://arxiv.org/abs/1710.09437) con la [regola di scelta della biforcazione GHOST](https://arxiv.org/abs/2003.03052). ## Letture consigliate {#further-reading} -- [Cos'è l'algoritmo di consenso della blockchain?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) -- [Cos'è il Consenso di Nakamoto? Guida Completa per Principianti](https://blockonomi.com/nakamoto-consensus/) +- [Cos'è un algoritmo di consenso della blockchain?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) +- [Cos'è il consenso di Nakamoto? Guida completa per principianti](https://blockonomi.com/nakamoto-consensus/) - [Come funziona Casper?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) -- [Sulla sicurezza e le prestazioni delle blockchain di Proof of Work](https://eprint.iacr.org/2016/555.pdf) -- [Guasto Byzantine](https://en.wikipedia.org/wiki/Byzantine_fault) +- [Sulla sicurezza e le prestazioni delle blockchain di prova di lavoro](https://eprint.iacr.org/2016/555.pdf) +- [Guasto bizantino](https://en.wikipedia.org/wiki/Byzantine_fault) _Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [Proof of Work](/developers/docs/consensus-mechanisms/pow/) +- [Prova di lavoro](/developers/docs/consensus-mechanisms/pow/) - [Mining](/developers/docs/consensus-mechanisms/pow/mining/) -- [Proof of Stake](/developers/docs/consensus-mechanisms/pos/) -- [Proof of Authority](/developers/docs/consensus-mechanisms/poa/) +- [Prova di stake](/developers/docs/consensus-mechanisms/pos/) +- [Proof-of-authority](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/poa/index.md index aa10661a7cb..066d70bdc47 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/poa/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/poa/index.md @@ -1,79 +1,79 @@ --- -title: Prova di autorità (PoA) -description: Una spiegazione del protocollo di consenso a prova di autorità e del suo ruolo nell'ecosistema della blockchain. +title: Proof-of-authority (PoA) +description: Una spiegazione del protocollo di consenso proof-of-authority e del suo ruolo nell'ecosistema blockchain. lang: it --- -La **prova di autorità (PoA)** è un algoritmo del consenso basato sulla reputazione, una versione modificata del [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). È utilizzata prevalentemente dalle catene private, di prova e dalle reti di sviluppo locali. La PoA è un algoritmo di consenso basato sulla reputazione che richiede di affidarsi a una serie di firmatari autorizzati per produrre i blocchi, piuttosto che un meccanismo basato sullo staking nel PoS. +La **Proof-of-authority (PoA)** è un algoritmo di consenso basato sulla reputazione che è una versione modificata della [prova di stake](/developers/docs/consensus-mechanisms/pos/). È utilizzata principalmente da catene private, reti di test e reti di sviluppo locali. La PoA è un algoritmo di consenso basato sulla reputazione che richiede di fidarsi di un insieme di firmatari autorizzati per produrre blocchi, invece di un meccanismo basato sullo stake come nella PoS. ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, ti suggeriamo di leggere prima qualcosa sulle [transazioni](/developers/docs/transactions/), sui [blocchi](/developers/docs/blocks/), e i [meccanismi di consenso](/developers/docs/consensus-mechanisms/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima le [transazioni](/developers/docs/transactions/), i [blocchi](/developers/docs/blocks/) e i [meccanismi di consenso](/developers/docs/consensus-mechanisms/). -## Cos'è la prova di autorità (PoA)? {#what-is-poa} +## Cos'è la proof-of-authority (PoA)? {#what-is-poa} -La prova di autorità è una versione modificata del **[proof-of-stake](/developers/docs/consensus-mechanisms/pos/) (PoS)**, un algoritmo di consenso basato sulla reputazione invece che un meccanismo basato sullo staking in PoS. Il termine è stato introdotto per la prima volta nel 2017 da Gavin Wood, e questo algoritmo di consenso è stato utilizzato prevalentemente da catene private e di prova e da reti di sviluppo locali in quanto supera la necessità di risorse di elevata qualità, come nel PoW, e supera i problemi di scalabilità del PoS, disponendo di un piccolo sottoinsieme di nodi che archiviano la blockchain e producono i blocchi. +La proof-of-authority è una versione modificata della **[prova di stake](/developers/docs/consensus-mechanisms/pos/) (PoS)** che è un algoritmo di consenso basato sulla reputazione invece del meccanismo basato sullo stake della PoS. Il termine è stato introdotto per la prima volta nel 2017 da Gavin Wood, e questo algoritmo di consenso è stato utilizzato principalmente da catene private, reti di test e reti di sviluppo locali, poiché supera la necessità di risorse di alta qualità come fa la PoW (prova di lavoro), e supera i problemi di scalabilità della PoS avendo un piccolo sottoinsieme di nodi che memorizzano la blockchain e producono blocchi. -La prova di autorità richiede di fare affidamento su una serie di firmatari autorizzati definita nel [blocco di genesi](/glossary/#genesis-block). In gran parte delle implementazioni correnti, tutti i firmatari autorizzati detengono pari potere e privilegi nel determinare il consenso della catena. L'idea dietro lo staking di reputazione è che ogni validatore autorizzato sia ben noto a tutti, tramite verifiche come conosci il tuo cliente (KYC) o facendo in modo che l'unico validatore sia un'organizzazione nota; in questo modo, se un validatore commette qualcosa di sbagliato, la sua identità è nota. +La proof-of-authority richiede di fidarsi di un insieme di firmatari autorizzati che sono impostati nel [blocco genesi](/glossary/#genesis-block). Nella maggior parte delle implementazioni attuali, tutti i firmatari autorizzati mantengono poteri e privilegi uguali nel determinare il consenso della catena. L'idea alla base dello staking della reputazione è che ogni validatore autorizzato sia ben noto a tutti attraverso procedure come il "know your customer" (KYC), o avendo un'organizzazione ben nota come unico validatore; in questo modo, se un validatore fa qualcosa di sbagliato, la sua identità è nota. -Esistono numerose implementazioni della PoA, ma l'implementazione standard di Ethereum è **clique**, che implementa l'[EIP-225](https://eips.ethereum.org/EIPS/eip-225). Clique è uno standard per sviluppatori facile da implementare, che supporta tutti i tipi di sincronizzazione dei client. Altre implementazioni includono [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) e [Aura](https://openethereum.github.io/Chain-specification). +Esistono diverse implementazioni della PoA, ma l'implementazione standard di Ethereum è **clique**, che implementa l'[EIP-225](https://eips.ethereum.org/EIPS/eip-225). Clique è uno standard facile da implementare e adatto agli sviluppatori, che supporta tutti i tipi di sincronizzazione dei client. Altre implementazioni includono [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) e [Aura](https://openethereum.github.io/Chain-specification). ## Come funziona {#how-it-works} -Nella PoA, una serie di firmatari autorizzati sono selezionati per creare dei nuovi blocchi. I firmatari sono selezionati in base alla loro reputazione, e saranno i soli autorizzati a creare nuovi blocchi. I firmatari sono selezionati secondo il metodo round-robin e ogni firmatario è autorizzato a creare un blocco in un periodo di tempo specifico. Il tempo di creazione del blocco è fisso, e i firmatari devono creare un blocco entro tale periodo di tempo. +Nella PoA, un insieme di firmatari autorizzati viene selezionato per creare nuovi blocchi. I firmatari sono selezionati in base alla loro reputazione e sono gli unici autorizzati a creare nuovi blocchi. I firmatari vengono selezionati in modalità round-robin e a ciascun firmatario è consentito creare un blocco in un intervallo di tempo specifico. Il tempo di creazione del blocco è fisso e ai firmatari è richiesto di creare un blocco entro tale intervallo di tempo. -La reputazione, in questo contesto, non è un aspetto quantificato ma è piuttosto la reputazione di aziende note come Microsoft e Google; dunque, la selezione dei firmatari fidati non è algoritmica, ma piuttosto il normale atto umano di _fiducia_ quando un'entità, come ad esempio Microsoft, crea una rete privata di PoA tra centinaia o migliaia di startup e assume il ruolo di unico firmatario attendibile con la possibilità di aggiungerne altri in futuro. In tal caso le startup si fiderebbero, senza dubbio, del fatto che Microsoft agirà sempre con onestà e utilizzerebbero la rete. Ciò risolve la necessità di effettuare lo staking in diverse reti piccole/private costruite per scopi diversi per mantenerle decentralizzate e funzionanti, insieme alla necessità di minatori, che consumano molta energia e risorse. Alcune reti private utilizzano lo standard PoA, come VeChain, e alcune lo modificano, come Binance, che utilizza la [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa), una versione modificata e personalizzata di PoA e PoS. +La reputazione in questo contesto non è una cosa quantificata, ma piuttosto è la reputazione di aziende ben note come Microsoft e Google, quindi il modo di selezionare i firmatari fidati non è algoritmico ma piuttosto è il normale atto umano di _fiducia_ in cui un'entità, diciamo ad esempio Microsoft, crea una rete privata PoA tra centinaia o migliaia di startup e assume il ruolo di unico firmatario fidato con la possibilità di aggiungere altri firmatari ben noti come Google in futuro; le startup si fiderebbero senza dubbio che Microsoft agisca in modo onesto in ogni momento e utilizzerebbero la rete. Questo risolve la necessità di fare stake in diverse reti piccole/private che sono state costruite per scopi diversi per mantenerle decentralizzate e funzionanti, insieme alla necessità di minatori, che consumano molta energia e risorse. Alcune reti private utilizzano lo standard PoA così com'è, come VeChain, e alcune lo modificano, come Binance che utilizza la [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa), che è una versione personalizzata e modificata di PoA e PoS. -Il processo di voto è eseguito dai firmatari stessi. Ogni firmatario vota per l'aggiunta o la rimozione di un firmatario nel proprio blocco alla creazione di un nuovo blocco. I voti sono conteggiati dai nodi, e i firmatari sono aggiunti o rimossi a seconda del fatto che i voti raggiungano una certa soglia, detta `SIGNER_LIMIT`. +Il processo di voto viene effettuato dai firmatari stessi. Ogni firmatario vota per l'aggiunta o la rimozione di un firmatario nel proprio blocco quando crea un nuovo blocco. I voti vengono conteggiati dai nodi e i firmatari vengono aggiunti o rimossi in base al raggiungimento di una certa soglia di voti `SIGNER_LIMIT`. -Potrebbe verificarsi una situazione in cui si genera una piccola diramazione; la difficoltà di un blocco dipende dal fatto che sia stato firmato in turno o fuori turno. I blocchi "in turno" hanno una difficoltà di 2, quelli "fuori turno" hanno una difficoltà di 1. Nel caso di piccole diramazioni, la catena con la maggior parte dei firmatari che sigillano i blocchi "in turno" accumulerà la difficoltà maggiore e vincerà. +Potrebbe verificarsi una situazione in cui si verificano piccole biforcazioni; la difficoltà di un blocco dipende dal fatto che il blocco sia stato firmato nel proprio turno o fuori turno. I blocchi "nel turno" hanno difficoltà 2 e i blocchi "fuori turno" hanno difficoltà 1. Nel caso di piccole biforcazioni, la catena con la maggior parte dei firmatari che sigillano i blocchi "nel turno" accumulerà la maggiore difficoltà e vincerà. -## Vettori d'attacco {#attack-vectors} +## Vettori di attacco {#attack-vectors} -### Firmatari malevoli {#malicious-signers} +### Firmatari malintenzionati {#malicious-signers} -Un utente malevolo potrebbe essere aggiunto all'elenco dei firmatari, o una chiave/macchina di firma potrebbe essere compromessa. In tale scenario, il protocollo deve potersi difendere dalle riorganizzazioni e dallo spam. La soluzione proposta è che, dato un elenco di N firmatari autorizzati, qualsiasi firmatario possa coniare solo 1 blocco ogni K. Ciò garantisce che il danno sia limitato e il resto dei validatori possa votare per escludere l'utente malintenzionato. +Un utente malintenzionato potrebbe essere aggiunto all'elenco dei firmatari, oppure una chiave/macchina di firma potrebbe essere compromessa. In un simile scenario, il protocollo deve essere in grado di difendersi da riorganizzazioni e spam. La soluzione proposta è che, data una lista di N firmatari autorizzati, qualsiasi firmatario può coniare solo 1 blocco ogni K. Questo assicura che i danni siano limitati e che il resto dei validatori possa votare per escludere l'utente malintenzionato. ### Censura {#censorship-attack} -Un altro interessante vettore d'attacco si verifica se un firmatario, o un gruppo di firmatari, tenta di censurare blocchi che votano per la sua rimozione dall'elenco d'autorizzazione. Per risolvere questo problema, la frequenza di conio consentita ai firmatari è limitata a 1 su N/2. Ciò assicura che i firmatari malevoli debbano controllare almeno il 51% dei conti di firma, diventando così effettivamente la nuova fonte di verità per la catena. +Un altro interessante vettore di attacco si verifica se un firmatario (o un gruppo di firmatari) tenta di censurare i blocchi che votano per la loro rimozione dalla lista di autorizzazione. Per aggirare questo problema, la frequenza di conio consentita ai firmatari è limitata a 1 su N/2. Questo assicura che i firmatari malintenzionati debbano controllare almeno il 51% degli account di firma, punto in cui diventerebbero effettivamente la nuova fonte di verità per la catena. ### Spam {#spam-attack} -Un altro piccolo vettore d'attacco si verifica quando dei firmatari malevoli iniettano nuove proposte di voto in ogni blocco coniato. Poiché i nodi devono conteggiare tutti i voti per creare l'elenco effettivo di firmatari autorizzati, devono registrarli tutti nel corso del tempo. Senza fissare un limite alla finestra di voto, questi crescerebbero lentamente, ma indefinitamente. La soluzione è definire una finestra _mobile_ di blocchi W, scaduta la quale i voti sono considerati obsoleti. _Una finestra ragionevole potrebbe essere di 1-2 epoche._ +Un altro piccolo vettore di attacco è rappresentato dai firmatari malintenzionati che iniettano nuove proposte di voto all'interno di ogni blocco che coniano. Poiché i nodi devono conteggiare tutti i voti per creare l'elenco effettivo dei firmatari autorizzati, devono registrare tutti i voti nel tempo. Senza porre un limite alla finestra di voto, questa potrebbe crescere lentamente, ma senza limiti. La soluzione è quella di inserire una finestra _mobile_ di W blocchi dopo la quale i voti sono considerati obsoleti. _Una finestra ragionevole potrebbe essere di 1-2 epoche._ ### Blocchi concorrenti {#concurrent-blocks} -In una rete di PoA, quando sono presenti N firmatari autorizzati, ogni firmatario può coniare 1 blocco ogni K, il che significa che in un dato momento sono autorizzati coniare N-K+1 validatori. Per evitare che questi validatori gareggino per creare blocchi, ogni firmatario dovrebbe aggiungere un lieve "scostamento" casuale all'ora di rilascio di un nuovo blocco. Sebbene questo processo assicuri che le piccole diramazioni siano rare, delle diramazioni occasionali possono comunque verificarsi, proprio come sulla Rete Principale. Se si scopre che un firmatario abusa del proprio potere e causa disordini, gli altri firmatari possono votare per la sua espulsione. +In una rete PoA, quando ci sono N firmatari autorizzati, a ciascun firmatario è consentito coniare 1 blocco su K, il che significa che N-K+1 validatori sono autorizzati a coniare in qualsiasi momento. Per evitare che questi validatori competano per i blocchi, ogni firmatario dovrebbe aggiungere un piccolo "offset" casuale al momento in cui rilascia un nuovo blocco. Sebbene questo processo assicuri che le piccole biforcazioni siano rare, possono comunque verificarsi biforcazioni occasionali, proprio come sulla rete principale. Se si scopre che un firmatario sta abusando del proprio potere e causando caos, gli altri firmatari possono votare per escluderlo. -Se ad esempio ci sono 10 firmatari autorizzati e a ciascun firmatario è consentito creare 1 blocco su 20, allora in un dato momento 11 validatori possono creare blocchi. Per evitare che gareggino per creare i blocchi, ogni firmatario aggiunge un lieve "scostamento" casuale all'ora di rilascio di un nuovo blocco. Ciò riduce il verificarsi di piccole diramazioni, pur consentendone di occasionali, come avviene sulla Rete Principale di Ethereum. Se un firmatario utilizza erroneamente la propria autorità e causa disordini, può essere espulso dalla rete. +Se ad esempio ci sono 10 firmatari autorizzati e a ciascun firmatario è consentito creare 1 blocco su 20, in qualsiasi momento 11 validatori possono creare blocchi. Per evitare che competano per creare blocchi, ogni firmatario aggiunge un piccolo "offset" casuale al momento in cui rilascia un nuovo blocco. Questo riduce il verificarsi di piccole biforcazioni ma consente comunque biforcazioni occasionali, come si vede sulla rete principale di Ethereum. Se un firmatario abusa della propria autorità e causa interruzioni, può essere escluso dalla rete tramite votazione. ## Pro e contro {#pros-and-cons} -| Pro | Contro | -| --------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Più scalabile di altri meccanismi popolari come il PoS e il PoW, e basata su un numero limitato di firmatari dei blocchi | Le reti di PoA dispongono tipicamente di un numero ridotto di nodi di convalida. Questo rende una rete di PoA più centralizzata. | -| Le blockchain di PoA sono incredibilmente economiche da eseguire e mantenere | Diventare un firmatario autorizzato è solitamente fuori portata per una persona "normale", poiché la blockchain richiede delle entità con una reputazione nota. | -| Le transazioni sono confermate molto rapidamente, fino a meno di 1 secondo, poiché soltanto un numero limitato di firmatari deve validare i nuovi blocchi | I firmatari malevoli potrebbero riorganizzare, spendere doppiamente e censurare le transazioni nella rete. Questi attacchi sono mitigati, seppur ancora possibili | +| Pro | Contro | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Più scalabile rispetto ad altri meccanismi popolari come PoS e PoW, poiché si basa su un numero limitato di firmatari di blocchi | Le reti PoA hanno in genere un numero relativamente piccolo di nodi di validazione. Questo rende una rete PoA più centralizzata. | +| Le blockchain PoA sono incredibilmente economiche da eseguire e mantenere | Diventare un firmatario autorizzato è in genere fuori dalla portata di una persona comune, perché la blockchain richiede entità con una reputazione consolidata. | +| Le transazioni vengono confermate molto rapidamente, potendo impiegare meno di 1 secondo, poiché è richiesto solo un numero limitato di firmatari per validare i nuovi blocchi | I firmatari malintenzionati potrebbero riorganizzare, spendere due volte, censurare le transazioni nella rete; questi attacchi sono mitigati ma ancora possibili | ## Letture consigliate {#further-reading} -- [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Clique standard_ -- [Studio sulla prova di autorità](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Cryptoeconomics_ -- [Cos'è la prova di autorità](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_ -- [Spiegazione della prova di autorità](https://academy.binance.com/en/articles/proof-of-authority-explained) _binance_ -- [PoA nella blockchain](https://medium.com/techskill-brew/proof-of-authority-or-poa-in-blockchain-part-11-blockchain-series-be15b3321cba) -- [Cos'è Clique](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d) -- [PoA deprecata, specifiche di Aura](https://openethereum.github.io/Chain-specification) -- [IBFT 2.0, un'altra implementazione della PoA](https://besu.hyperledger.org/private-networks/concepts/poa) +- [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Standard Clique_ +- [Studio sulla Proof of Authority](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _Criptoeconomia_ +- [Cos'è la Proof of Authority](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_ +- [Spiegazione della Proof of Authority](https://academy.binance.com/en/articles/proof-of-authority-explained) _Binance_ +- [La PoA nella blockchain](https://medium.com/techskill-brew/proof-of-authority-or-poa-in-blockchain-part-11-blockchain-series-be15b3321cba) +- [Spiegazione di Clique](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d) +- [PoA deprecata, specifica Aura](https://openethereum.github.io/Chain-specification) +- [IBFT 2.0, un'altra implementazione PoA](https://besu.hyperledger.org/private-networks/concepts/poa) -### Preferisci un approccio visivo all'apprendimento? {#visual-learner} +### Impari meglio con i video? {#visual-learner} -Guarda una spiegazione visiva della Prova d'Autorità: +Guarda una spiegazione visiva della proof-of-authority: ## Argomenti correlati {#related-topics} -- [Proof-of-work](/developers/docs/consensus-mechanisms/pow/) -- [Proof-of-stake](/developers/docs/consensus-mechanisms/pos/) +- [Prova di lavoro](/developers/docs/consensus-mechanisms/pow/) +- [Prova di stake](/developers/docs/consensus-mechanisms/pos/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md index d2ac43146b4..e5d83baf8db 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -1,166 +1,160 @@ --- -title: "Proof-of-stake Ethereum: attacchi e meccanismi di difesa" -description: Scopri di più sui vettori di attacco noti sul proof-of-stake di Ethereum e come è possibile difendersi da essi. +title: Attacco e difesa della prova di stake di Ethereum +description: Scopri i vettori di attacco noti sulla prova di stake di Ethereum e come vengono difesi. lang: it --- -Ladri e sabotatori sono costantemente alla ricerca di opportunità per attaccare i software client di Ethereum. Questa pagina illustra i vettori di attacco noti sul livello del consenso di Ethereum e come è possibile difendersi da tali attacchi. Il contenuto di questa pagina è adattato da una [versione più lunga](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). +Ladri e sabotatori sono costantemente alla ricerca di opportunità per attaccare il software del client di [Ethereum](/). Questa pagina delinea i vettori di attacco noti sul livello di consenso di Ethereum e illustra come tali attacchi possano essere difesi. Le informazioni in questa pagina sono adattate da una [versione più estesa](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs). ## Prerequisiti {#prerequisites} -Sono necessarie conoscenze minime sul [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). Sarà inoltre utile possedere una comprensione basilare del [livello di incentivo](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) di Ethereum, nonché dell'algoritmo di scelta della biforcazione, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper). +È richiesta una conoscenza di base della [prova di stake](/developers/docs/consensus-mechanisms/pos/). Inoltre, sarà utile avere una comprensione di base del livello degli incentivi di Ethereum e dell'algoritmo di scelta della biforcazione, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper). -## Cosa vogliono gli utenti malevoli? {#what-do-attackers-want} +## Cosa vogliono gli aggressori? {#what-do-attackers-want} -Spesso si crede erroneamente che, in caso di successo, un utente malevolo possa generare nuovo ether o drenarlo da qualsiasi conto desideri. Nessuna delle due cose è possibile, poiché tutte le transazioni sono eseguite da tutti i client di esecuzione sulla rete. Se non soddisfano le condizioni di validità di base (es. sono firmate dalla chiave privata del mittente, il mittente ha un saldo sufficiente ecc.) vengono semplicemente annullate. Esistono tre classi di risultati a cui un utente malevolo può realisticamente mirare: riorganizzazioni, doppia finalità o ritardo di finalità. +Un malinteso comune è che un aggressore di successo possa generare nuovi ether o prosciugare ether da account arbitrari. Nessuna di queste due cose è possibile perché tutte le transazioni vengono eseguite da tutti i client di esecuzione sulla rete. Devono soddisfare le condizioni di base di validità (ad es., le transazioni sono firmate dalla chiave privata del mittente, il mittente ha un saldo sufficiente, ecc.) altrimenti vengono semplicemente annullate. Ci sono tre classi di risultati a cui un aggressore potrebbe realisticamente mirare: reorg, doppia finalità o ritardo della finalità. -Una **"riorganizzazione"** è un rimescolamento dei blocchi in un nuovo ordine, a volte con l'aggiunta o sottrazione di blocchi nella catena canonica. Una riorganizzazione malevola può portare all'inclusione o esclusione di blocchi specifici, consentendo una doppia spesa o l'estrazione di valore da transazioni di front-running e back-running (MEV). Le riorganizzazioni, inoltre, possono essere utilizzate per impedire l'inclusione di determinate transazioni nella catena canonica: una forma di censura. La forma più estrema di riorganizzazione è detta "inversione di finalità", che rimuove o sostituisce dei blocchi precedentemente finalizzati. Essa è possibile soltanto se più di ⅓ dell'ether totale in staking è distrutto dall'utente malevolo; questa garanzia è detta "finalità economica" (argomento che affronteremo in maggior dettaglio più avanti). +Un **"reorg"** (riorganizzazione) è un rimescolamento dei blocchi in un nuovo ordine, forse con qualche aggiunta o sottrazione di blocchi nella catena canonica. Un reorg malevolo potrebbe garantire che blocchi specifici vengano inclusi o esclusi, consentendo la doppia spesa o l'estrazione di valore tramite transazioni di front-running e back-running (MEV - valore massimo estraibile). I reorg potrebbero anche essere utilizzati per impedire che determinate transazioni vengano incluse nella catena canonica: una forma di censura. La forma più estrema di reorg è la "reversione della finalità", che rimuove o sostituisce i blocchi che sono stati precedentemente finalizzati. Questo è possibile solo se più di ⅓ degli ether totali in stake viene distrutto dall'aggressore; questa garanzia è nota come "finalità economica" (ne parleremo più avanti). -La **doppia finalità** è l'improbabile ma grave situazione in cui due biforcazioni riescano a finalizzarsi simultaneamente, creando uno scisma permanente nella catena. Ciò è teoricamente possibile per un utente malevolo disposto a rischiare il 34% dell'ether totale in staking. La community sarebbe costretta a coordinarsi fuori dalla catena e ad accordarsi su quale catena seguire, il che richiederebbe forza al livello sociale. +La **doppia finalità** è la condizione improbabile ma grave in cui due biforcazioni sono in grado di finalizzare simultaneamente, creando uno scisma permanente nella catena. Questo è teoricamente possibile per un aggressore disposto a rischiare il 34% degli ether totali in stake. La comunità sarebbe costretta a coordinarsi fuori catena e a raggiungere un accordo su quale catena seguire, il che richiederebbe forza nel livello sociale. -Un attacco di **ritardo di finalità** impedisce alla rete di raggiungere le condizioni necessarie per finalizzare le sezioni della catena. Senza finalità è difficile fidarsi delle applicazioni finanziarie basate su Ethereum. L'obiettivo di un attacco di ritardo di finalità è in genere semplicemente quello di compromettere il corretto funzionamento di Ethereum piuttosto che di trarne direttamente profitto, a meno che l'utente malevolo non detenga qualche posizione corta strategica. +Un attacco di **ritardo della finalità** impedisce alla rete di raggiungere le condizioni necessarie per finalizzare sezioni della catena. Senza finalità, è difficile fidarsi delle applicazioni finanziarie costruite su Ethereum. Lo scopo di un attacco di ritardo della finalità è probabilmente solo quello di interrompere Ethereum piuttosto che trarne un profitto diretto, a meno che l'aggressore non abbia delle posizioni corte strategiche. -Un attacco al livello sociale potrebbe mirare a minare la fiducia pubblica in Ethereum, svalutare l'ether, ridurne l'adozione o indebolire la community di Ethereum per rendere più difficile il coordinamento fuori banda. +Un attacco al livello sociale potrebbe mirare a minare la fiducia del pubblico in Ethereum, svalutare l'ether, ridurre l'adozione o indebolire la comunità di Ethereum per rendere più difficile il coordinamento fuori banda. -Abbiamo dunque visto perché un utente malevolo potrebbe attaccare Ethereum; le sezioni seguenti esaminano _come_ potrebbero farlo. +Avendo stabilito perché un avversario potrebbe attaccare Ethereum, le sezioni seguenti esaminano _come_ potrebbe farlo. ## Metodi di attacco {#methods-of-attack} -### Attacchi al livello 0 {#layer-0} +### Attacchi di Livello 0 {#layer-0} -Innanzitutto chi non partecipa attivamente a Ethereum (eseguendo un software client) può attaccarlo prendendo di mira il livello sociale (livello 0). Il livello 0 è la base su cui è costruito Ethereum e, come tale, rappresenta una potenziale superficie per gli attacchi, con conseguenze che si propagano sul resto dello stack. Alcuni esempi potrebbero includere: +Prima di tutto, gli individui che non partecipano attivamente a Ethereum (eseguendo il software del client) possono attaccare prendendo di mira il livello sociale (Livello 0). Il Livello 0 è la base su cui è costruito Ethereum e, in quanto tale, rappresenta una potenziale superficie per attacchi con conseguenze che si ripercuotono sul resto dello stack. Alcuni esempi potrebbero includere: -- Una campagna di disinformazione in grado di erodere la fiducia della community nella tabella di marcia di Ethereum, nei team di sviluppatori, nelle app ecc. Questo potrebbe ridurre il numero di persone desiderose di partecipare alla protezione della rete, peggiorando sia la decentralizzazione che la sicurezza cripto-economica. +- Una campagna di disinformazione potrebbe erodere la fiducia che la comunità ha nel piano d'azione di Ethereum, nei team di sviluppatori, nelle app, ecc. Questo potrebbe quindi diminuire il numero di individui disposti a partecipare alla messa in sicurezza della rete, degradando sia la decentralizzazione che la sicurezza criptoeconomica. +- Attacchi mirati e/o intimidazioni dirette alla comunità degli sviluppatori. Questo potrebbe portare all'uscita volontaria degli sviluppatori e rallentare i progressi di Ethereum. -- Attacchi mirati e/o intimidazioni dirette alla community degli sviluppatori. Questo potrebbe indurre all'uscita volontaria degli sviluppatori e rallentare il progresso di Ethereum. +- Anche una regolamentazione eccessivamente zelante potrebbe essere considerata un attacco al Livello 0, poiché potrebbe disincentivare rapidamente la partecipazione e l'adozione. +- Infiltrazione di attori esperti ma malintenzionati nella comunità degli sviluppatori il cui scopo è rallentare i progressi perdendosi in discussioni futili (bike-shedding), ritardando decisioni chiave, creando spam, ecc. +- Tangenti pagate ad attori chiave nell'ecosistema di Ethereum per influenzare il processo decisionale. -- Anche una regolamentazione troppo rigida può essere considerata un attacco al livello 0, dal momento che potrebbe disincentivare rapidamente la partecipazione e l'adozione. +Ciò che rende questi attacchi particolarmente pericolosi è che in molti casi è richiesto pochissimo capitale o know-how tecnico. Un attacco di Livello 0 potrebbe essere un moltiplicatore di un attacco criptoeconomico. Ad esempio, se la censura o la reversione della finalità venissero ottenute da un azionista di maggioranza malintenzionato, minare il livello sociale potrebbe rendere più difficile coordinare una risposta della comunità fuori banda. -- L'infiltrazione di utenti esperti ma malevoli nella community di sviluppatori il cui obiettivo è rallentare il progresso con discussioni futili, ritardare le decisioni fondamentali, creare spam ecc. +Difendersi dagli attacchi di Livello 0 probabilmente non è semplice, ma si possono stabilire alcuni principi di base. Uno è mantenere un rapporto segnale/rumore complessivamente elevato per le informazioni pubbliche su Ethereum, create e propagate da membri onesti della comunità attraverso blog, server Discord, specifiche annotate, libri, podcast e YouTube. Qui su ethereum.org ci impegniamo a fondo per mantenere informazioni accurate e tradurle nel maggior numero di lingue possibile. Inondare uno spazio con informazioni e meme di alta qualità è una difesa efficace contro la disinformazione. -- Tangenti agli attori principali nell'ecosistema di Ethereum per influenzare il processo decisionale. +Un'altra importante fortificazione contro gli attacchi al livello sociale è una chiara dichiarazione di intenti e un protocollo di governance. Ethereum si è posizionato come il campione della decentralizzazione e della sicurezza tra i livelli 1 dei contratti intelligenti, pur valutando molto la scalabilità e la sostenibilità. Qualunque disaccordo sorga nella comunità di Ethereum, questi principi fondamentali sono minimamente compromessi. Valutare una narrazione rispetto a questi principi fondamentali ed esaminarli attraverso successivi cicli di revisione nel processo EIP (proposta di miglioramento di ethereum), potrebbe aiutare la comunità a distinguere i buoni dai cattivi attori e limita il margine di manovra per gli attori malintenzionati di influenzare la direzione futura di Ethereum. -Ciò che rende particolarmente pericolosi questi attacchi è che in molti casi è necessario disporre di pochissimo capitale o conoscenze tecniche. Un attacco al livello 0 potrebbe essere un moltiplicatore di un attacco cripto-economico. Ad esempio, se la censura o l'inversione di finalità fossero ottenute da uno stakeholder di maggioranza malevolo, minare il livello sociale potrebbe rendere più difficile il coordinamento di una risposta fuori banda da parte della community. +Infine, è fondamentale che la comunità di Ethereum rimanga aperta e accogliente per tutti i partecipanti. Una comunità con guardiani (gatekeeper) ed esclusività è particolarmente vulnerabile agli attacchi sociali perché è facile costruire narrazioni del tipo "noi e loro". Il tribalismo e il massimalismo tossico danneggiano la comunità ed erodono la sicurezza del Livello 0. Gli Etherean con un interesse acquisito nella sicurezza della rete dovrebbero considerare la loro condotta online e nel mondo reale (meatspace) come un contributo diretto alla sicurezza del Livello 0 di Ethereum. -Difendersi dagli attacchi al livello 0 probabilmente non è semplice, ma possono essere stabiliti dei principi fondamentali. Uno di questi è mantenere un rapporto complessivamente elevato tra segnale e rumore per le informazioni pubbliche su Ethereum, create e diffuse da membri onesti della community tramite blog, server Discord, specifiche annotate, libri, podcast e YouTube. Qui su ethereum.org ci impegniamo a fondo per far sì che le informazioni restino accurate e per tradurle in quante più lingue possibili. Inondare uno spazio di informazioni e meme di alta qualità è un modo efficace per difendersi dalla disinformazione. +### Attaccare il protocollo {#attacking-the-protocol} -Un'altra protezione importante contro gli attacchi al livello sociale è rappresentata da una chiara espressione della propria mission e da un chiaro protocollo di governance. Ethereum si è posizionato come il campione di decentralizzazione e sicurezza tra i livelli 1 dei contratti intelligenti, attribuendo anche un elevato valore a scalabilità e sostenibilità. A prescindere dall'insorgere di divergenze nella community di Ethereum, questi principi essenziali restano sostanzialmente integri. Elaborare una narrativa basata su tali principi fondamentali ed esaminarli tramite round successivi di revisioni nel processo di EIP (Ethereum Improvement Proposal, proposta di miglioramento di Ethereum) può aiutare la community a distinguere gli utenti buoni da quelli "cattivi" e a limitare i margini di influenza di utenti malevoli nella direzione futura di Ethereum. +Chiunque può eseguire il software del client di Ethereum. Per aggiungere un validatore a un client, a un utente è richiesto di mettere in stake 32 ether nel contratto di deposito. Un validatore consente a un utente di partecipare attivamente alla sicurezza della rete di Ethereum proponendo e attestando nuovi blocchi. Il validatore ora ha una voce che può usare per influenzare i contenuti futuri della blockchain: può farlo onestamente e far crescere la sua scorta di ether tramite ricompense oppure può cercare di manipolare il processo a proprio vantaggio, rischiando il proprio stake. Un modo per sferrare un attacco è accumulare una percentuale maggiore dello stake totale e poi usarla per superare i voti dei validatori onesti. Maggiore è la percentuale dello stake controllata dall'aggressore, maggiore è il suo potere di voto, specialmente in corrispondenza di determinati traguardi economici che esploreremo in seguito. Tuttavia, la maggior parte degli aggressori non sarà in grado di accumulare ether sufficienti per attaccare in questo modo, quindi devono invece usare tecniche subdole per manipolare la maggioranza onesta affinché agisca in un certo modo. -Infine è fondamentale che la community di Ethereum resti aperta e accogliente per tutti i partecipanti. Una community con al suo interno dei "gatekeeper" ed esclusiva è una community particolarmente vulnerabile ad attacchi sociali data la facilità di sviluppare narrative del tipo "noi contro loro". Il tribalismo e il massimalismo tossico fanno male alla community ed erodono la sicurezza del livello 0. Gli utenti di Ethereum interessati personalmente dalla sicurezza della rete dovrebbero vedere la propria condotta online e nel mondo reale come un contributo diretto alla sicurezza del livello 0 di Ethereum. +Fondamentalmente, tutti gli attacchi con piccoli stake sono sottili variazioni di due tipi di comportamento scorretto del validatore: sotto-attività (mancata attestazione/proposta o farlo in ritardo) o sovra-attività (proporre/attestare troppe volte in uno slot). Nelle loro forme più semplici, queste azioni sono facilmente gestite dall'algoritmo di scelta della biforcazione e dal livello degli incentivi, ma ci sono modi intelligenti per aggirare il sistema a vantaggio di un aggressore. -### Attacco del protocollo {#attacking-the-protocol} +### Attacchi utilizzando piccole quantità di ETH {#attacks-by-small-stakeholders} -Chiunque può eseguire un software client di Ethereum. Per aggiungere un validatore a un client, un utente deve mettere 32 ether in staking nel contratto di deposito. Un validatore consente a un utente di partecipare attivamente alla sicurezza della rete di Ethereum proponendo e attestando nuovi blocchi. In tal modo il validatore ha una voce che può usare per influenzare i contenuti futuri della blockchain; può farlo onestamente, accrescendo i propri ether tramite le ricompense, o può provare a manipolare il processo a proprio vantaggio, rischiando il proprio stake. Un metodo per intraprendere un attacco è accumulare una quota maggiore dello stake totale e utilizzarla per superare i voti dei validatori onesti. Maggiore è la quota dello stake controllata dall'utente malevolo, maggiore è il suo potere di voto, specialmente a determinate soglie in termini economici che vedremo più avanti. Tuttavia gran parte degli utenti malevoli non riuscirà ad accumulare abbastanza ether da riuscire ad intraprendere un tale attacco, quindi dovrà utilizzare delle tecniche subdole per manipolare la maggioranza onesta perché agisca in un certo modo. +#### reorg {#reorgs} -Fondamentalmente tutti gli attacchi con pochi ether in staking sono lievi variazioni di due tipi di comportamenti scorretti dei validatori: ipoattività (mancata o ritardata attestazione/proposta) o iperattività (attestazioni/proposte eccessive in uno slot). Nelle loro forme più basilari, queste azioni sono gestite facilmente dall'algoritmo di scelta della biforcazione e dal livello d'incentivazione, ma esistono metodi più intelligenti per imbrogliare il sistema a proprio vantaggio. +Diversi documenti hanno spiegato attacchi a Ethereum che ottengono reorg o ritardi della finalità con solo una piccola percentuale degli ether totali in stake. Questi attacchi si basano generalmente sul fatto che l'aggressore nasconda alcune informazioni agli altri validatori per poi rilasciarle in modo sfumato e/o in un momento opportuno. Di solito mirano a rimuovere alcuni blocchi onesti dalla catena canonica. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hanno mostrato come un validatore aggressore possa creare e attestare un blocco (`B`) per un particolare slot `n+1` ma astenersi dal propagarlo ad altri nodi sulla rete. Invece, trattengono quel blocco attestato fino allo slot successivo `n+2`. Un validatore onesto propone un blocco (`C`) per lo slot `n+2`. Quasi simultaneamente, l'aggressore può rilasciare il blocco trattenuto (`B`) e le relative attestazioni trattenute, e anche attestare che `B` è la testa della catena con i propri voti per lo slot `n+2`, negando di fatto l'esistenza del blocco onesto `C`. Quando viene rilasciato il blocco onesto `D`, l'algoritmo di scelta della biforcazione vede che `D` costruito sopra `B` è più pesante di `D` costruito su `C`. L'aggressore è quindi riuscito a rimuovere il blocco onesto `C` nello slot `n+2` dalla catena canonica utilizzando un reorg ex ante di 1 blocco. [Un aggressore con il 34%](https://www.youtube.com/watch?v=6vzXwwk12ZE) dello stake ha ottime probabilità di riuscire in questo attacco, come spiegato [in questa nota](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair). In teoria, però, questo attacco potrebbe essere tentato con stake inferiori. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) hanno descritto questo attacco funzionante con uno stake del 30%, ma in seguito è stato dimostrato che è fattibile con il [2% dello stake totale](https://arxiv.org/pdf/2009.04987.pdf) e poi di nuovo per un [singolo validatore](https://arxiv.org/abs/2110.10086#) utilizzando tecniche di bilanciamento che esamineremo nella prossima sezione. -### Attacchi che consumano pochi ETH {#attacks-by-small-stakeholders} +![reorg ex-ante](reorg-schematic.png) -#### Riorganizzazioni {#reorgs} +Un diagramma concettuale dell'attacco di reorg di un blocco descritto sopra (adattato da https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) -Svariati articoli hanno illustrato attacchi a Ethereum che hanno ottenuto riorganizzazioni o ritardi di finalità con soltanto una piccola quota dell'ether in staking totale. Questi, generalmente, prevedono che l'utente malevolo si rifiuti di fornire determinate informazioni ad altri validatori per poi fornirle in modo vago e/o al momento opportuno. Solitamente mirano a spostare alcuni blocchi onesti dalla catena canonica. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) ha dimostrato come un validatore malevolo possa creare e attestare un blocco ("B") per uno specifico slot "n+1" impedendogli però di propagarsi ad altri nodi sulla rete e trattenendolo fino allo slot successivo ("n+2"). Un validatore onesto propone un blocco ("C") per lo slot "n+2". Quasi simultaneamente, l'utente malevolo può rilasciare il proprio blocco trattenuto ("B") e le relative attestazioni, nonché attestare "B" come la testa della catena con i propri voti per lo slot "n+2", negando a tutti gli effetti l'esistenza del blocco onesto ("C"). Al rilascio del blocco onesto "D", l'algoritmo di scelta della biforcazione vede la costruzione di "D" su "B" come di maggiore rilevanza rispetto a "D" su "C". L'utente malevolo è dunque riuscito a rimuovere il blocco onesto "C" nello slot "n+2" dalla catena canonica tramite la riorganizzazione ex ante di un blocco. [Un utente malevolo con il 34%](https://www.youtube.com/watch?v=6vzXwwk12ZE) dello stake ha un'alta probabilità di successo tramite questo attacco, come spiegato [in questa nota](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair). In teoria, però, questo attacco potrebbe essere tentato anche con stake inferiori. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) ha descritto il funzionamento di questo attacco con uno stake del 30%, sebbene sia stato poi dimostrato che sia fattibile con il [2% dello stake totale](https://arxiv.org/pdf/2009.04987.pdf) e in seguito per un [solo validatore](https://arxiv.org/abs/2110.10086#) utilizzando tecniche di bilanciamento che esamineremo nella sezione successiva. +Un attacco più sofisticato può dividere l'insieme dei validatori onesti in gruppi discreti che hanno visioni diverse della testa della catena. Questo è noto come **attacco di bilanciamento** (balancing attack). L'aggressore aspetta la sua occasione per proporre un blocco e, quando arriva, equivoca e ne propone due. Invia un blocco a metà dell'insieme dei validatori onesti e l'altro blocco all'altra metà. L'equivoco verrebbe rilevato dall'algoritmo di scelta della biforcazione e il proponente del blocco verrebbe punito (slashed) ed espulso dalla rete, ma i due blocchi esisterebbero ancora e avrebbero circa metà dell'insieme dei validatori che attesta ciascuna biforcazione. Nel frattempo, i restanti validatori malintenzionati trattengono le loro attestazioni. Quindi, rilasciando selettivamente le attestazioni a favore dell'una o dell'altra biforcazione a un numero appena sufficiente di validatori proprio mentre viene eseguito l'algoritmo di scelta della biforcazione, fanno pendere il peso accumulato delle attestazioni a favore dell'una o dell'altra biforcazione. Questo può continuare all'infinito, con i validatori aggressori che mantengono una divisione uniforme dei validatori tra le due biforcazioni. Poiché nessuna delle due biforcazioni può attrarre una supermaggioranza di 2/3, la rete non finalizzerebbe. -![riorganizzazione ex ante](reorg-schematic.png) - -Un diagramma concettuale dell'attacco di riorganizzazione di un blocco descritto sopra (adattato da https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) - -Un attacco più sofisticato può consistere nel dividere l'insieme di validatori onesti in gruppi discreti aventi visioni diverse della testa della catena. Questo è noto come un **attacco di bilanciamento**. L'utente malevolo attende la propria chance di proporre un blocco e, quando arriva, fa finta di niente e ne propone due, inviando un blocco a metà dell'insieme dei validatori onesti e l'altro blocco all'altra metà. L'equivoco sarebbe rilevato dall'algoritmo di scelta della diramazione e il responsabile della proposta verrebbe sottoposto a slashing ed espulso dalla rete, ma i due blocchi continuerebbero a esistere e sarebbero attestati da circa metà dell'insieme dei validatori per ogni biforcazione. Nel frattempo i validatori malevoli rimanenti si rifiuterebbero di fornire le proprie attestazioni. Quindi, rilasciando selettivamente attestazioni a favore dell'una o dell'altra biforcazione al numero sufficiente di validatori man mano che viene eseguito l'algoritmo di scelta della biforcazione, tali validatori portano il peso accumulato delle attestazioni a favore di una o dell'altra biforcazione. Questo processo può proseguire indefinitamente, con i validatori malevoli che mantengono una divisione equa dei validatori tra le due biforcazioni. Poiché nessuna biforcazione è in grado di ottenere una supermaggioranza dei 2/3 del totale, la rete non viene finalizzata. - -Gli **attacchi di rimbalzo** sono simili. Anche in questo caso i voti sono trattenuti dai validatori malevoli. Invece di rilasciarli per mantenere una divisione equa tra le due biforcazioni, questi utilizzano i propri voti al momento opportuno per giustificare punti di controllo che si alternano tra la biforcazione A e la biforcazione B. Questo tira e molla di giustificazioni tra le due biforcazioni impedisce che si arrivi a coppie di punti di controllo di origine e di destinazione giustificati finalizzabili su una delle due catene, interrompendo la finalità. +Gli **attacchi di rimbalzo** (bouncing attacks) sono simili. I voti vengono nuovamente trattenuti dai validatori aggressori. Invece di rilasciare i voti per mantenere una divisione uniforme tra due biforcazioni, usano i loro voti nei momenti opportuni per giustificare i checkpoint che si alternano tra la biforcazione A e la biforcazione B. Questo continuo capovolgimento della giustificazione tra due biforcazioni impedisce che ci siano coppie di checkpoint di origine e di destinazione giustificati che possono essere finalizzati su entrambe le catene, arrestando la finalità. -Sia gli attacchi di rimbalzo che quelli di bilanciamento si basano sul fatto che l'utente malevolo abbia un controllo molto preciso sulle tempistiche dei messaggi attraverso la rete, il che è improbabile. Il protocollo incorpora tuttavia alcune difese sotto forma di ponderazione aggiuntiva attribuita ai messaggi immediati rispetto a quelli lenti. Ciò è noto come [potenziamento del peso del propositore](https://github.com/ethereum/consensus-specs/pull/2730). Per difendersi dagli attacchi di rimbalzo, l'algoritmo di scelta della biforcazione è stato aggiornato affinché l'ultimo punto di controllo giustificato possa passare a quello di una catena alternativa solamente durante il [primo terzo degli slot in ogni epoca](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114). Questa condizione impedisce all'utente malevolo di risparmiare voti da utilizzare in seguito: l'algoritmo di scelta della biforcazione, semplicemente, resta leale al punto di controllo che ha scelto nel primo terzo dell'epoca in cui avrebbero votato i validatori più onesti. +Sia gli attacchi di rimbalzo che quelli di bilanciamento si basano sul fatto che l'aggressore abbia un controllo molto preciso sulla tempistica dei messaggi attraverso la rete, il che è improbabile. Tuttavia, le difese sono integrate nel protocollo sotto forma di ponderazione aggiuntiva data ai messaggi tempestivi rispetto a quelli lenti. Questo è noto come [potenziamento del peso del proponente](https://github.com/ethereum/consensus-specs/pull/2730) (proposer-weight boosting). Per difendersi dagli attacchi di rimbalzo, l'algoritmo di scelta della biforcazione è stato aggiornato in modo che l'ultimo checkpoint giustificato possa passare a quello di una catena alternativa solo durante il [primo 1/3 degli slot in ogni epoca](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114). Questa condizione impedisce all'aggressore di risparmiare voti per distribuirli in seguito: l'algoritmo di scelta della biforcazione rimane semplicemente fedele al checkpoint che ha scelto nel primo 1/3 dell'epoca, durante il quale la maggior parte dei validatori onesti avrebbe votato. -Nel loro insieme queste misure creano uno scenario in cui un propositore di blocchi onesto emette il proprio blocco molto rapidamente dopo l'inizio dello slot e poi c'è un periodo di circa 1/3 di slot (4 secondi) in cui quel nuovo blocco potrebbe causare il passaggio dell'algoritmo di scelta della biforcazione a un'altra catena. Dopo quello stesso termine le attestazioni provenienti dai validatori lenti sono deponderate rispetto a quelle arrivate prima. Ciò favorisce fortemente i propositori e validatori rapidi nel determinare la testa della catena, riducendo significativamente la probabilità di riuscita di un attacco di bilanciamento o di rimbalzo. +Insieme, queste misure creano uno scenario in cui un proponente del blocco onesto emette il proprio blocco molto rapidamente dopo l'inizio dello slot, quindi c'è un periodo di ~1/3 di slot (4 secondi) in cui quel nuovo blocco potrebbe far sì che l'algoritmo di scelta della biforcazione passi a un'altra catena. Dopo la stessa scadenza, le attestazioni che arrivano da validatori lenti vengono declassate rispetto a quelle arrivate prima. Questo favorisce fortemente i proponenti e i validatori tempestivi nel determinare la testa della catena e riduce sostanzialmente la probabilità di un attacco di bilanciamento o di rimbalzo riuscito. -Vale la pena notare che il solo potenziamento del propositore difende solamente dalle "riorganizzazioni a basso costo", cioè quelle tentate da un utente malevolo con uno stake ridotto. Di fatto il potenziamento del propositore è raggirabile da detentori di stake maggiori. Gli autori di [questo post](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) descrivono come un utente malevolo avente il 7% dello stake possa utilizzare i propri voti strategicamente per convincere i validatori onesti a proseguire la sua biforcazione, riorganizzando un blocco onesto. Questo attacco è stato concepito supponendo condizioni di latenza ideali, che sono molto improbabili. Le probabilità sono comunque fortemente a sfavore dell'utente malevolo, e uno stake più elevato comporta anche un maggiore capitale a rischio e un disincentivo economico più forte. +Vale la pena notare che il potenziamento del proponente da solo difende solo dai "reorg economici", ovvero quelli tentati da un aggressore con un piccolo stake. In effetti, il potenziamento del proponente stesso può essere aggirato dagli staker più grandi. Gli autori di [questo post](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) descrivono come un aggressore con il 7% dello stake possa distribuire i propri voti in modo strategico per indurre i validatori onesti a costruire sulla propria biforcazione, rimuovendo un blocco onesto tramite reorg. Questo attacco è stato ideato ipotizzando condizioni di latenza ideali che sono molto improbabili. Le probabilità sono ancora molto basse per l'aggressore e lo stake maggiore significa anche più capitale a rischio e un disincentivo economico più forte. -È stato proposto anche un [attacco di bilanciamento specificamente indirizzato alla regola LMD](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), ritenuto praticabile a prescindere dal potenziamento del propositore. Un utente malevolo configura due catene in competizione equivocando la proposta di blocchi e propagando ogni blocco a circa metà della rete, creando così un bilanciamento approssimativo tra le due biforcazioni. Poi i validatori collusi equivocano i propri voti facendo sì che soltanto metà della rete li riceva prima per la biforcazione "A" mentre l'altra metà riceve prima i loro voti per la biforcazione "B". Poiché la regola LMD scarta la seconda attestazione e mantiene soltanto la prima per ogni validatore, metà della rete visualizza i voti per "A" e nessun voto per "B"; viceversa per l'altra metà della rete. Secondo gli autori la regola LMD fornisce all'avversario un "notevole potere" di effettuare un attacco di bilanciamento. +È stato anche proposto un [attacco di bilanciamento mirato specificamente alla regola LMD](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), che è stato suggerito essere fattibile nonostante il potenziamento del proponente. Un aggressore imposta due catene concorrenti equivocando la propria proposta di blocco e propagando ciascun blocco a circa metà della rete ciascuno, stabilendo un equilibrio approssimativo tra le biforcazioni. Quindi, i validatori collusi equivocano i loro voti, calcolando i tempi in modo che metà della rete riceva prima i loro voti per la Biforcazione `A` e l'altra metà riceva prima i loro voti per la Biforcazione `B`. Poiché la regola LMD scarta la seconda attestazione e mantiene solo la prima per ogni validatore, metà della rete vede i voti per `A` e nessuno per `B`, l'altra metà vede i voti per `B` e nessuno per `A`. Gli autori descrivono la regola LMD come un elemento che conferisce all'avversario un "potere notevole" per sferrare un attacco di bilanciamento. -Questo vettore d'attacco LMD è stato chiuso [aggiornando l'algoritmo di scelta della biforcazione](https://github.com/ethereum/consensus-specs/pull/2845) così che escluda completamente i validatori equivocanti dalla partecipazione alla scelta della biforcazione. L'algoritmo di scelta della biforcazione, inoltre, ignorerà l'influenza futura dei validatori equivocanti. Ciò impedisce l'attacco di bilanciamento delineato sopra mantenendo allo stesso tempo la resilienza contro gli attacchi a valanga. +Questo vettore di attacco LMD è stato chiuso [aggiornando l'algoritmo di scelta della biforcazione](https://github.com/ethereum/consensus-specs/pull/2845) in modo che scarti del tutto i validatori equivocanti dalla considerazione della scelta della biforcazione. I validatori equivocanti vedono anche la loro influenza futura scontata dall'algoritmo di scelta della biforcazione. Questo previene l'attacco di bilanciamento descritto sopra, mantenendo al contempo la resilienza contro gli attacchi a valanga. -Un'altra classe di attacchi, quella degli [**attacchi a valanga**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3) è stata descritta in un [articolo di marzo 2022](https://arxiv.org/pdf/2203.01315.pdf). Per intraprendere quest'attacco l'utente malevolo deve controllare diversi propositori di blocchi consecutivi. In ognuno degli slot di proposta dei blocchi, l'utente malevolo trattiene il proprio blocco, raccogliendo blocchi finché la catena onesta non raggiunge un peso dell'albero secondario equivalente ai blocchi trattenuti. Poi i blocchi trattenuti vengono rilasciati per il massimo effetto equivoco possibile. Gli autori suggeriscono che il potenziamento del propositore (la prima difesa contro gli attacchi di bilanciamento e di rimbalzo) non protegga da alcune varianti dell'attacco valanga. Tuttavia gli autori hanno anche dimostrato l'attacco soltanto su una versione altamente idealizzata dell'algoritmo di scelta della biforcazione di Ethereum (utilizzando GHOST senza LMD). +Un'altra classe di attacchi, chiamata [**attacchi a valanga**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3) (avalanche attacks), è stata descritta in un [documento del marzo 2022](https://arxiv.org/pdf/2203.01315.pdf). Per sferrare un attacco a valanga, l'aggressore deve controllare diversi proponenti del blocco consecutivi. In ciascuno degli slot di proposta del blocco, l'aggressore trattiene il proprio blocco, raccogliendoli fino a quando la catena onesta non raggiunge un peso del sottoalbero uguale a quello dei blocchi trattenuti. Quindi, i blocchi trattenuti vengono rilasciati in modo che equivochino al massimo. Gli autori suggeriscono che il potenziamento del proponente, la difesa principale contro gli attacchi di bilanciamento e di rimbalzo, non protegge da alcune varianti dell'attacco a valanga. Tuttavia, gli autori hanno anche dimostrato l'attacco solo su una versione altamente idealizzata dell'algoritmo di scelta della biforcazione di Ethereum (hanno usato GHOST senza LMD). -L'attacco a valanga è mitigato dalla porzione LMD dell'algoritmo di scelta della biforcazione LMD-GHOST. LMD sta per "latest-message-driven" ("guidato dall'ultimo messaggio") e si riferisce a una tabella tenuta da ogni validatore contenente l'ultimo messaggio ricevuto da altri validatori. Tale campo viene aggiornato soltanto se il nuovo messaggio proviene da uno slot successivo a quello già nella tabella per uno specifico validatore. In pratica, ciò significa che in ogni slot, il primo messaggio ricevuto è quello che ha accettato e qualsiasi altro messaggio è un equivoco da ignorare. In altre parole i client di consenso non contano gli equivoci, bensì utilizzano il primo messaggio in arrivo da ogni validatore e gli equivoci sono semplicemente scartati, impedendo gli attacchi a valanga. +L'attacco a valanga è mitigato dalla porzione LMD dell'algoritmo di scelta della biforcazione LMD-GHOST. LMD significa "latest-message-driven" (guidato dall'ultimo messaggio) e si riferisce a una tabella tenuta da ogni validatore contenente l'ultimo messaggio ricevuto da altri validatori. Quel campo viene aggiornato solo se il nuovo messaggio proviene da uno slot successivo rispetto a quello già presente nella tabella per un particolare validatore. In pratica, questo significa che in ogni slot, il primo messaggio ricevuto è quello che viene accettato e qualsiasi messaggio aggiuntivo è un equivoco da ignorare. In altre parole, i client di consenso non contano gli equivoci: usano il primo messaggio in arrivo da ogni validatore e gli equivoci vengono semplicemente scartati, prevenendo gli attacchi a valanga. -Esistono diversi altri potenziali aggiornamenti futuri alla regola di scelta della biforcazione in grado di rafforzare la sicurezza fornita dal potenziamento del propositore. Uno di essi, detto [visualizzazione-fusione](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), prevede che gli attestatori congelino il proprio punto di vista sulla scelta della biforcazione "n" secondi prima dell'inizio di uno slot, dopo di che il propositore aiuta a sincronizzare il punto di vista sulla catena in tutta la rete. Un altro possibile aggiornamento è la [finalità a slot singolo](https://notes.ethereum.org/@vbuterin/single_slot_finality), che protegge dagli attacchi basati sulle tempistiche dei messaggi, finalizzando la catena dopo solo uno slot. +Ci sono molti altri potenziali aggiornamenti futuri alla regola di scelta della biforcazione che potrebbero aumentare la sicurezza fornita dal potenziamento del proponente. Uno è il [view-merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), in cui gli attestatori congelano la loro visione della scelta della biforcazione `n` secondi prima dell'inizio di uno slot e il proponente aiuta quindi a sincronizzare la visione della catena attraverso la rete. Un altro potenziale aggiornamento è la [finalità a slot singolo](https://notes.ethereum.org/@vbuterin/single_slot_finality), che protegge dagli attacchi basati sulla tempistica dei messaggi finalizzando la catena dopo un solo slot. -#### Ritardo di finalità {#finality-delay} +#### Ritardo della finalità {#finality-delay} -[Lo stesso articolo](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf) che ha descritto per primo l'attacco di riorganizzazione di un singolo blocco a basso costo, descrive anche un attacco di ritardo di finalità (anche noto come "guasto della liveness") che prevede che l'utente malevolo proponga il blocco al confine di un'epoca. Questo è fondamentale perché questi blocchi di confine dell'epoca diventano i punti di controllo che Casper FFG utilizza per finalizzare porzioni della catena. L'utente malevolo, semplicemente, trattiene il blocco finché abbastanza validatori onesti non utilizzano i propri voti FFC a favore del precedente blocco di confine dell'epoca come target di finalizzazione attuale. Quindi rilascia il blocco trattenuto, attestando il proprio blocco così come i validatori onesti rimanenti e creando biforcazioni con punti di controllo target differenti. Se le tempistiche sono corrette l'utente malevolo impedirà la finalità perché non ci sarà una supermaggioranza dei 2/3 che attesti entrambe le biforcazioni. Minore è lo stake, più precisa deve essere la tempistica, poiché l'utente malevolo controlla meno attestazioni direttamente, e minori sono le probabilità che l'utente malevolo controlli il validatore che propone un dato blocco di confine dell'epoca. +[Lo stesso documento](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf) che ha descritto per primo l'attacco di reorg a basso costo di un singolo blocco ha anche descritto un attacco di ritardo della finalità (noto anche come "fallimento della vitalità" o liveness failure) che si basa sul fatto che l'aggressore sia il proponente del blocco per un blocco di confine dell'epoca. Questo è fondamentale perché questi blocchi di confine dell'epoca diventano i checkpoint che Casper FFG utilizza per finalizzare porzioni della catena. L'aggressore trattiene semplicemente il proprio blocco finché un numero sufficiente di validatori onesti non usa i propri voti FFG a favore del precedente blocco di confine dell'epoca come attuale obiettivo di finalizzazione. Quindi rilasciano il blocco trattenuto. Attestano il loro blocco e lo fanno anche i restanti validatori onesti, creando biforcazioni con checkpoint di destinazione diversi. Se hanno calcolato bene i tempi, impediranno la finalità perché non ci sarà una supermaggioranza di 2/3 che attesta nessuna delle due biforcazioni. Più piccolo è lo stake, più precisa deve essere la tempistica perché l'aggressore controlla direttamente meno attestazioni e minori sono le probabilità che l'aggressore controlli il validatore che propone un determinato blocco di confine dell'epoca. -#### Attacchi a lunga portata {#long-range-attacks} +#### Attacchi a lungo raggio {#long-range-attacks} -Esiste inoltre una classe di attacchi specifica delle blockchain proof-of-stake che prevede che un validatore che ha partecipato al blocco di genesi mantenga una biforcazione separata della blockchain insieme a quella onesta, convincendo alla fine il gruppo di validatori onesti a passare ad essa in un dato momento opportuno molto successivo. Questo tipo di attacco non è possibile su Ethereum per via del dispositivo di finalità che assicura che tutti i validatori concordino sullo stato della catena onesta a intervalli regolari ("punti di controllo"). Questo semplice meccanismo neutralizza gli attacchi a lungo raggio poiché i client di Ethereum semplicemente non riorganizzeranno i blocchi finalizzati. I nuovi nodi che si uniscono alla rete lo fanno trovando uno hash dello stato recente affidabile (un "punto di controllo della [soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity)"), utilizzandolo come un blocco di pseudo-genesi per costruire su di esso. Questo crea un "gateway di fiducia" per un nuovo nodo che accede alla rete prima che possa iniziare a verificare le informazioni da solo. +Esiste anche una classe di attacchi specifica per le blockchain prova di stake che coinvolge un validatore che ha partecipato al blocco genesi mantenendo una biforcazione separata della blockchain insieme a quella onesta, convincendo infine l'insieme dei validatori onesti a passare ad essa in un momento opportuno molto più tardi. Questo tipo di attacco non è possibile su Ethereum a causa del gadget di finalità che assicura che tutti i validatori concordino sullo stato della catena onesta a intervalli regolari ("checkpoint"). Questo semplice meccanismo neutralizza gli aggressori a lungo raggio perché i client di Ethereum semplicemente non riorganizzeranno (reorg) i blocchi finalizzati. I nuovi nodi che si uniscono alla rete lo fanno trovando un hash di stato recente e affidabile (un checkpoint di "[soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity)") e usandolo come blocco pseudo-genesi su cui costruire. Questo crea un "gateway di fiducia" per un nuovo nodo che entra nella rete prima che possa iniziare a verificare le informazioni da solo. -#### Negazione del servizio {#denial-of-service} +#### Denial of Service {#denial-of-service} -Il meccanismo di PoS di Ethereum seleziona un unico validatore dall'insieme di validatori totali perché sia un propositore di blocchi in ogni slot. Questo è calcolabile utilizzando una funzione pubblicamente nota ed è possibile, per un avversario, identificare il propositore di blocco successivo lievemente in anticipo rispetto alla sua proposta di blocco. In seguito l'utente malevolo può spammare il propositore del blocco per impedirgli di scambiare informazioni con i suoi pari. Al resto della rete sembrerà che il propositore del blocco sia offline e lo slot resterà semplicemente vuoto. Questa potrebbe essere una forma di censura contro specifici validatori, impedendo loro di aggiungere informazioni alla blockchain. L'implementazione di elezioni segrete di un singolo capo (single secret leader elections, SSLE) o di elezioni segrete di un capo non singolo mitigheranno il rischi di attacchi di negazione del servizio poiché soltanto il propositore del blocco potrà sapere di essere stato selezionato e la selezione non è nota in anticipo. Questo meccanismo non è stato ancora implementato, ma è un'area attiva di [ricerca e sviluppo](https://ethresear.ch/t/secret-non-single-leader-election/11789). +Il meccanismo PoS di Ethereum sceglie un singolo validatore dall'insieme totale dei validatori per essere un proponente del blocco in ogni slot. Questo può essere calcolato utilizzando una funzione nota pubblicamente ed è possibile per un avversario identificare il successivo proponente del blocco con un leggero anticipo rispetto alla sua proposta di blocco. Quindi, l'aggressore può spammare il proponente del blocco per impedirgli di scambiare informazioni con i suoi pari. Al resto della rete, sembrerebbe che il proponente del blocco fosse offline e lo slot rimarrebbe semplicemente vuoto. Questa potrebbe essere una forma di censura contro validatori specifici, impedendo loro di aggiungere informazioni alla blockchain. L'implementazione di elezioni segrete del leader singolo (SSLE) o elezioni segrete del leader non singolo mitigherà i rischi di DoS perché solo il proponente del blocco sa di essere stato selezionato e la selezione non è conoscibile in anticipo. Questo non è ancora implementato, ma è un'area attiva di [ricerca e sviluppo](https://ethresear.ch/t/secret-non-single-leader-election/11789). -Tutto ciò indica come sia davvero difficile attaccare Ethereum con successo con uno stake ridotto. Gli attacchi praticabili qui descritti richiedono un algoritmo di scelta della biforcazione idealizzato, condizioni di rete improbabili, oppure che i vettori d'attacco siano già stati chiusi con correzioni di entità relativamente lieve al software client. Questo, ovviamente, non esclude la possibilità che si verifichino zero day, ma dimostra l'asticella estremamente elevata dal punto di vista di capacità tecniche, conoscenza del livello di consenso e fortuna necessaria perché un utente malevolo con uno stake di minoranza abbia successo. Dalla prospettiva di un utente malevolo, la cosa migliore da fare sarebbe accumulare quanto più ether possibile e tornare armato di una maggiore quota dello stake totale. +Tutto ciò indica il fatto che è molto difficile attaccare con successo Ethereum con un piccolo stake. Gli attacchi fattibili che sono stati descritti qui richiedono un algoritmo di scelta della biforcazione idealizzato, condizioni di rete improbabili, oppure i vettori di attacco sono già stati chiusi con patch relativamente minori al software del client. Questo, ovviamente, non esclude la possibilità che esistano zero-day in circolazione, ma dimostra l'asticella estremamente alta di attitudine tecnica, conoscenza del livello di consenso e fortuna richiesta affinché un aggressore con uno stake di minoranza sia efficace. Dal punto di vista di un aggressore, la scommessa migliore potrebbe essere quella di accumulare quanto più ether possibile e tornare armato con una percentuale maggiore dello stake totale. -### Utenti malevoli che utilizzano una quota dello stake totale pari o superiore al 33% {#attackers-with-33-stake} +### Aggressori che utilizzano >= 33% dello stake totale {#attackers-with-33-stake} -Tutti gli attacchi menzionati precedentemente in questo articolo raggiungono una maggiore probabilità di riuscita quando l'utente malevolo dispone di più ether in staking con cui votare e di più validatori che potrebbero essere scelti per proporre i blocchi in ogni slot. Un validatore malevolo potrebbe dunque mirare a controllare quanto più ether in staking possibile. +Tutti gli attacchi menzionati in precedenza in questo articolo hanno maggiori probabilità di successo quando l'aggressore ha più ether in stake con cui votare e più validatori che potrebbero essere scelti per proporre blocchi in ogni slot. Un validatore malintenzionato potrebbe quindi mirare a controllare quanti più ether in stake possibile. -Il 33% dell'ether in staking rappresenta una soglia di riferimento per un utente malevolo poiché, superando tale soglia, può impedire la finalizzazione della catena senza dover controllare in maniera precisa le azioni di altri validatori. Una volta portato a termine l'attacco l'utente malevolo può semplicemente dileguarsi. Se 1/3 o più dell'ether in staking attesta malevolmente o non riesce ad attestare, allora non può esistere una supermaggioranza dei 2/3 e la catena non può essere finalizzata. La difesa in questo caso è detta "fuoriuscita per inattività". La fuoriuscita per inattività identifica quei validatori che non attestano o che attestano diversamente dalla maggioranza. L'ether in staking posseduto da tali validatori non attestanti è gradualmente disperso finché non rappresenterà complessivamente meno di 1/3 del totale, così che la catena possa nuovamente essere finalizzata. +Il 33% degli ether in stake è un punto di riferimento per un aggressore perché con qualsiasi importo superiore a questo ha la capacità di impedire alla catena di finalizzare senza dover controllare finemente le azioni degli altri validatori. Possono semplicemente scomparire tutti insieme. Se 1/3 o più degli ether in stake attesta in modo malevolo o non attesta, allora non può esistere una supermaggioranza di 2/3 e la catena non può finalizzare. La difesa contro questo è la perdita per inattività (inactivity leak). La perdita per inattività identifica quei validatori che non riescono ad attestare o che attestano contrariamente alla maggioranza. Gli ether in stake di proprietà di questi validatori non attestanti vengono gradualmente prosciugati fino a quando non rappresentano collettivamente meno di 1/3 del totale, in modo che la catena possa finalizzare di nuovo. -Lo scopo della fuoriuscita per inattività è consentire nuovamente la finalizzazione della catena. Tuttavia l'utente malevolo perde anche una porzione del proprio ether in staking. L'inattività persistente tra validatori che rappresentano il 33% dell'ether in staking totale è molto costosa anche se i validatori non vengono sottoposti a slashing. +Lo scopo della perdita per inattività è far sì che la catena finalizzi di nuovo. Tuttavia, l'aggressore perde anche una parte dei propri ether in stake. L'inattività persistente tra i validatori che rappresentano il 33% degli ether totali in stake è molto costosa anche se i validatori non vengono puniti (slashed). -Supponendo che la rete di Ethereum sia asincrona (ovvero che ci siano ritardi tra i messaggi inviati e ricevuti), un utente malevolo che controlli il 34% dello stake totale potrebbe causare una doppia finalità. Ciò è dovuto al fatto che l'utente malevolo può equivocare quando è scelto come propositore di blocchi per poi votare due volte con tutti i suoi validatori. Questo crea una situazione in cui esiste una biforcazione della blockchain, ciascuna votata dal 34% dell'ether in staking. Ogni biforcazione richiede soltanto il 50% dei voti dei validatori rimanenti affinché entrambe le biforcazioni siano sostenute da una supermaggioranza, nel qual caso entrambe le catene possono essere finalizzate (poiché il 34% dei validatori malevoli + metà dei rimanenti 66% = 67% su ogni biforcazione). Ogni blocco concorrente dovrebbe essere ricevuto all'incirca dal 50% dei validatori onesti, quindi questo attacco è praticabile soltanto quando l'utente malevolo ha un certo grado di controllo sulla tempistica dei messaggi che si propagano nella rete così da poter convincere metà dei validatori onesti a proseguire su ogni catena. L'utente malevolo dovrebbe necessariamente distruggere tutto il proprio stake (34% di circa 10 milioni di ether in base all'attuale insieme di validatori) per ottenere tale doppia finalità, poiché il 34% dei validatori voterebbe due volte simultaneamente; un'infrazione punibile con la sanzione di correlazione massima. La difesa contro questo attacco è il costo molto elevato della distruzione del 34% dell'ether in staking totale. Riprendersi da tale attacco richiederebbe alla community di Ethereum di coordinarsi "fuori banda" e di accordarsi sul seguire una delle due biforcazioni ignorando l'altra. +Supponendo che la rete di Ethereum sia asincrona (ovvero, ci sono ritardi tra l'invio e la ricezione dei messaggi), un aggressore che controlla il 34% dello stake totale potrebbe causare una doppia finalità. Questo perché l'aggressore può equivocare quando viene scelto per essere un produttore di blocchi, quindi votare due volte con tutti i suoi validatori. Questo crea una situazione in cui esiste una biforcazione della blockchain, ciascuna con il 34% degli ether in stake che vota per essa. Ogni biforcazione richiede solo che il 50% dei restanti validatori voti a suo favore affinché entrambe le biforcazioni siano supportate da una supermaggioranza, nel qual caso entrambe le catene possono finalizzare (perché il 34% dei validatori degli aggressori + metà del restante 66% = 67% su ogni biforcazione). I blocchi concorrenti dovrebbero essere ricevuti ciascuno da circa il 50% dei validatori onesti, quindi questo attacco è fattibile solo quando l'aggressore ha un certo grado di controllo sulla tempistica dei messaggi che si propagano sulla rete in modo da poter spingere metà dei validatori onesti su ciascuna catena. L'aggressore distruggerebbe necessariamente il suo intero stake (il 34% di ~10 milioni di ether con l'attuale insieme di validatori) per ottenere questa doppia finalità perché il 34% dei suoi validatori voterebbe due volte simultaneamente: un'offesa punibile (slashable) con la massima penalità di correlazione. La difesa contro questo attacco è il costo molto elevato della distruzione del 34% degli ether totali in stake. Il recupero da questo attacco richiederebbe alla comunità di Ethereum di coordinarsi "fuori banda" e concordare di seguire l'una o l'altra delle biforcazioni e ignorare l'altra. -### Utenti malevoli che utilizzano approssimativamente il 50% dello stake totale {#attackers-with-50-stake} +### Aggressori che utilizzano ~50% dello stake totale {#attackers-with-50-stake} -Al 50% dell'ether in staking, un gruppo malevolo di validatori potrebbe teoricamente dividere la catena in due biforcazioni di pari dimensioni e quindi semplicemente utilizzare tutto il proprio 50% dello stake per votare diversamente dal gruppo di validatori onesti, mantenendo così le due biforcazioni e impedendo la finalità. La fuoriuscita per inattività su entrambe le biforcazioni condurrebbe infine alla finalizzazione di entrambe le catene. A questo punto l'unica opzione sarebbe fare affidamento su un recupero sociale. +Al 50% degli ether in stake, un gruppo malintenzionato di validatori potrebbe teoricamente dividere la catena in due biforcazioni di uguali dimensioni e quindi utilizzare semplicemente il proprio intero stake del 50% per votare contrariamente all'insieme dei validatori onesti, mantenendo così le due biforcazioni e impedendo la finalità. La perdita per inattività su entrambe le biforcazioni porterebbe alla fine entrambe le catene a finalizzare. A questo punto, l'unica opzione è ripiegare su un recupero sociale. -È molto improbabile che un gruppo malevolo di validatori possa controllare sistematicamente e con precisione il 50% dello stake totale, grazie al flusso di validatori onesti, alla latenza della rete ecc.; il costo enorme di organizzare un simile attacco, insieme alla sua bassa probabilità di successo, sembrano essere forti deterrenti per un utente malevolo razionale, specialmente quando un piccolo investimento aggiuntivo per ottenere _oltre il_ 50% consentirebbe di ottenere molto più potere. +È molto improbabile che un gruppo avversario di validatori possa controllare costantemente e con precisione il 50% dello stake totale, dato un certo grado di fluttuazione nel numero di validatori onesti, nella latenza di rete, ecc. L'enorme costo per sferrare un simile attacco combinato con la bassa probabilità di successo sembra essere un forte disincentivo per un aggressore razionale, specialmente quando un piccolo investimento aggiuntivo per ottenere _più del_ 50% sblocca molto più potere. -Con più del 50% dello stake totale l'utente malevolo potrebbe dominare l'algoritmo di scelta della biforcazione. In questo caso sarebbe in grado di attestare con il voto di maggioranza, ottenendo controllo sufficiente per effettuare brevi riorganizzazioni senza dover ingannare i client onesti. I validatori onesti farebbero lo stesso perché anche il loro algoritmo di scelta della biforcazione vedrebbe la catena preferita dall'utente malevolo come la più pesante, quindi la catena potrebbe essere finalizzata. Ciò consentirebbe all'utente malevolo di censurare certe transazioni, apportare riorganizzazioni a breve raggio ed estrarre il MEV massimo riordinando i blocchi a proprio favore. La difesa contro tale attacco è l'enorme costo di uno stake di maggioranza (attualmente di poco inferiore a 19 miliardi di USD) messo a rischio da un utente malevolo, poiché il livello sociale potrebbe intervenire e creare una biforcazione di minoranza onesta svalutando drasticamente lo stake dell'utente malevolo. +A >50% dello stake totale l'aggressore potrebbe dominare l'algoritmo di scelta della biforcazione. In questo caso, l'aggressore sarebbe in grado di attestare con il voto di maggioranza, dandogli un controllo sufficiente per fare brevi reorg senza dover ingannare i client onesti. I validatori onesti seguirebbero l'esempio perché anche il loro algoritmo di scelta della biforcazione vedrebbe la catena favorita dall'aggressore come la più pesante, quindi la catena potrebbe finalizzare. Questo consente all'aggressore di censurare determinate transazioni, fare reorg a corto raggio ed estrarre il valore massimo estraibile (MEV) riordinando i blocchi a proprio favore. La difesa contro questo è l'enorme costo di uno stake di maggioranza (attualmente poco meno di 19 miliardi di dollari USA) che viene messo a rischio da un aggressore perché è probabile che il livello sociale intervenga e adotti una biforcazione di minoranza onesta, svalutando drasticamente lo stake dell'aggressore. -### Utenti malevoli che utilizzano una quota dello stake totale pari o superiore al 66% {#attackers-with-66-stake} +### Aggressori che utilizzano >=66% dello stake totale {#attackers-with-66-stake} -Un utente malevolo con il 66% o più dell'ether in staking totale potrebbe finalizzare la propria catena preferita senza dover costringere alcun validatore onesto. L'utente potrebbe semplicemente votare la propria biforcazione preferita per poi finalizzarla, per il semplice fatto che sarebbe in grado di votare con una supermaggioranza disonesta. Come detentore della supermaggioranza, l'utente malevolo controllerebbe sempre i contenuti dei blocchi finalizzati, con il potere di spendere, riavvolgere e rispendere, censurare certe transazioni e riorganizzare a proprio piacimento la catena. Acquistando ulteriore ether per controllarne il 66% invece del 51%, l'utente malevolo acquisisce di fatto l'abilità di effettuare riorganizzazioni a posteriori e inversioni di finalità (cioè modificare il passato e allo stesso tempo controllare il futuro). Le sole vere difese sono il costo enorme del 66% dell'ether in staking totale e la possibilità di fare affidamento sul livello sociale per coordinare l'adozione di una biforcazione alternativa. Affronteremo quest'argomento in maggior dettaglio nella prossima sezione. +Un aggressore con il 66% o più degli ether totali in stake può finalizzare la propria catena preferita senza dover costringere alcun validatore onesto. L'aggressore può semplicemente votare per la sua biforcazione preferita e poi finalizzarla, semplicemente perché può votare con una supermaggioranza disonesta. In qualità di staker di supermaggioranza, l'aggressore controllerebbe sempre i contenuti dei blocchi finalizzati, con il potere di spendere, riavvolgere e spendere di nuovo, censurare determinate transazioni e riorganizzare (reorg) la catena a piacimento. Acquistando ether aggiuntivi per controllare il 66% anziché il 51%, l'aggressore sta effettivamente acquistando la capacità di fare reorg ex post e reversioni della finalità (ovvero, cambiare il passato oltre a controllare il futuro). Le uniche vere difese qui sono l'enorme costo del 66% degli ether totali in stake e l'opzione di ripiegare sul livello sociale per coordinare l'adozione di una biforcazione alternativa. Possiamo esplorare questo aspetto in modo più dettagliato nella prossima sezione. -## L'ultima linea di difesa: le persone {#people-the-last-line-of-defense} +## Le persone: l'ultima linea di difesa {#people-the-last-line-of-defense} -Se i validatori disonesti riuscissero a finalizzare la propria versione preferita della catena, la community di Ethereum si ritroverebbe in una situazione difficile. La catena canonica includerebbe una sezione disonesta fusa nel suo storico, mentre i validatori onesti potrebbero ritrovarsi puniti per aver attestato una catena (onesta) alternativa. Si noti che una catena finalizzata ma errata potrebbe sorgere anche da un bug in un client di maggioranza. In ultima analisi il rimedio è affidarsi al livello sociale, ovvero il livello 0. +Se i validatori disonesti riescono a finalizzare la loro versione preferita della catena, la comunità di Ethereum viene messa in una situazione difficile. La catena canonica include una sezione disonesta integrata nella sua storia, mentre i validatori onesti possono finire per essere puniti per aver attestato una catena alternativa (onesta). Si noti che una catena finalizzata ma errata potrebbe anche derivare da un bug in un client di maggioranza. Alla fine, il ripiego finale è fare affidamento sul livello sociale (Livello 0) per risolvere la situazione. -Uno dei punti di forza del consenso del PoS di Ethereum è che esistono [numerose strategie difensive](https://youtu.be/1m12zgJ42dI?t=1712) che la community può adoperare di fronte a un attacco. Una risposta minima potrebbe essere l'uscita forzata dei validatori malevoli dalla rete senza alcuna sanzione aggiuntiva. Per rientrare nella rete, l'utente malevolo dovrebbe unirsi a una coda di attivazione che assicuri una crescita graduale dell'insieme di validatori. Ad esempio per aggiungere abbastanza validatori da raddoppiare la quantità di ether in staking occorrono circa 200 giorni, dando a tutti i validatori onesti 200 giorni di anticipo prima che l'utente malevolo possa tentare un altro attacco con il 51% dello stake. Tuttavia la community potrebbe anche decidere di penalizzare l'utente malevolo più duramente, revocando le ricompense passate o bruciando una certa porzione (fino al 100%) del suo capitale in staking. +Uno dei punti di forza del consenso PoS di Ethereum è che c'è una [serie di strategie difensive](https://youtu.be/1m12zgJ42dI?t=1712) che la comunità può impiegare di fronte a un attacco. Una risposta minima potrebbe essere quella di far uscire forzatamente i validatori degli aggressori dalla rete senza alcuna penalità aggiuntiva. Per rientrare nella rete, l'aggressore dovrebbe unirsi a una coda di attivazione che assicura che l'insieme dei validatori cresca gradualmente. Ad esempio, aggiungere abbastanza validatori per raddoppiare la quantità di ether in stake richiede circa 200 giorni, facendo guadagnare di fatto ai validatori onesti 200 giorni prima che l'aggressore possa tentare un altro attacco del 51%. Tuttavia, la comunità potrebbe anche decidere di penalizzare l'aggressore più duramente, revocando le ricompense passate o bruciando una parte (fino al 100%) del suo capitale in stake. -Qualsiasi sia la sanzione imposta all'utente malevolo, la community dovrebbe anche decidere se la catena disonesta, pur essendo quella preferita dall'algoritmo di scelta della biforcazione codificato nei client di Ethereum, è di fatto non valida e se proseguire al suo posto la catena onesta. I validatori onesti potrebbero decidere collettivamente di proseguire una biforcazione accettata dalla community della blockchain di Ethereum che potrebbe, ad esempio, essersi separata dalla catena canonica prima dell'inizio dell'attacco o far rimuovere forzatamente i validatori malevoli. I validatori onesti sarebbero incentivati a proseguire tale catena evitando le sanzioni loro applicate per non aver attestato (giustamente) la catena dell'utente malevolo. Le borse, on-ramp e applicazioni basate su Ethereum preferirebbero presumibilmente rimanere sulla catena onesta e seguirebbero i validatori onesti nella blockchain onesta. +Qualunque sia la penalità imposta all'aggressore, la comunità deve anche decidere insieme se la catena disonesta, pur essendo quella favorita dall'algoritmo di scelta della biforcazione codificato nei client di Ethereum, sia di fatto non valida e che la comunità debba invece costruire sulla catena onesta. I validatori onesti potrebbero concordare collettivamente di costruire su una biforcazione della blockchain di Ethereum accettata dalla comunità che potrebbe, ad esempio, essersi biforcata dalla catena canonica prima dell'inizio dell'attacco o aver rimosso forzatamente i validatori degli aggressori. I validatori onesti sarebbero incentivati a costruire su questa catena perché eviterebbero le penalità applicate loro per non aver (giustamente) attestato la catena dell'aggressore. Gli exchange, gli on-ramp e le applicazioni costruite su Ethereum preferirebbero presumibilmente essere sulla catena onesta e seguirebbero i validatori onesti sulla blockchain onesta. -Si tratterebbe tuttavia di una situazione decisamente complessa dal punto di vista della governance. A causa del ritorno alla catena onesta alcuni utenti e validatori andrebbero senza dubbio in perdita, le transazioni nei blocchi convalidati dopo l'attacco potrebbero essere potenzialmente annullate, disturbando il livello d'applicazione, e, semplicemente, l'etica di alcuni utenti che tendono a credere che "il codice è legge" ne risulterebbe minata. Le borse e le applicazioni avrebbero molto probabilmente azioni esterne alla catena collegate alle transazioni sulla catena che ora potrebbero essere ripristinate, creando una cascata di ritrattazioni e revisioni che sarebbero difficili da disfare correttamente, specialmente se mischiate con guadagni disonesti, depositati nella DeFi o altri derivati con effetti secondari per gli utenti onesti. Indubbiamente alcuni utenti, forse persino istituzionali, potrebbero aver già beneficiato dalla catena disonesta, per scaltrezza o fortuna, e opporsi a una biforcazione per proteggere i propri guadagni. La possibilità di simulare la risposta della community a un attacco basato su uno stake superiore al 51% per una mitigazione coordinata, precisa e rapida è già stata proposta in passato. Esistono delle discussioni utili di Vitalik su ethresear.ch [qui](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) e [qui](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363), nonché su X.com qui. L'obiettivo di una risposta sociale coordinata dovrebbe essere molto mirato e concentrarsi sulla punizione dell'utente malevolo e sulla minimizzazione degli effetti per gli altri utenti. +Tuttavia, questa sarebbe una sfida di governance sostanziale. Alcuni utenti e validatori ci rimetterebbero senza dubbio a causa del ritorno alla catena onesta, le transazioni nei blocchi validati dopo l'attacco potrebbero potenzialmente essere annullate (rolled back), interrompendo il livello dell'applicazione, e molto semplicemente mina l'etica di alcuni utenti che tendono a credere che "il codice è legge" (code is law). Gli exchange e le applicazioni avranno molto probabilmente collegato azioni fuori catena a transazioni on-chain che ora potrebbero essere annullate, avviando una cascata di ritrattazioni e revisioni che sarebbe difficile districare in modo equo, specialmente se i guadagni illeciti sono stati mescolati, depositati nella DeFi o in altri derivati con effetti secondari per gli utenti onesti. Indubbiamente alcuni utenti, forse anche istituzionali, avrebbero già beneficiato della catena disonesta per scaltrezza o per serendipità, e potrebbero opporsi a una biforcazione per proteggere i loro guadagni. Ci sono state richieste di provare la risposta della comunità agli attacchi >51% in modo che una mitigazione coordinata e sensata possa essere eseguita rapidamente. C'è un'utile discussione di Vitalik su ethresear.ch [qui](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) e [qui](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) e su Twitter [qui](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw). Lo scopo di una risposta sociale coordinata dovrebbe essere molto mirato e specifico nel punire l'aggressore e ridurre al minimo gli effetti per gli altri utenti. -La governance è di per sé un argomento complicato. Gestire una risposta d'emergenza di livello 0 a una catena in finalizzazione disonesta sarebbe indubbiamente difficoltoso per la community di Ethereum, ma questo scenario [si è già verificato](/ethereum-forks/#dao-fork-summary) ([due volte](/ethereum-forks/#tangerine-whistle)) nella storia di Ethereum. +La governance è già un argomento complicato. Gestire una risposta di emergenza di Livello 0 a una catena finalizzante disonesta sarebbe senza dubbio impegnativo per la comunità di Ethereum, ma [è successo](/ethereum-forks/#dao-fork-summary) ([due volte](/ethereum-forks/#tangerine-whistle)) nella storia di Ethereum. -Tuttavia c'è qualcosa di piuttosto soddisfacente nel fatto che il rimedio finale a un tale attacco chiama in causa il mondo reale. In definitiva, anche con questo fenomenale stack tecnologico sopra di noi, se il peggio dovesse verificarsi le persone in carne ed ossa dovrebbero coordinarsi per uscirne. +Tuttavia, c'è qualcosa di abbastanza soddisfacente nel fatto che il ripiego finale risieda nel mondo reale (meatspace). In definitiva, anche con questo fenomenale stack di tecnologia sopra di noi, se dovesse mai accadere il peggio, persone reali dovrebbero coordinarsi per uscirne. ## Riepilogo {#summary} -In questa pagina abbiamo esplorato alcuni dei metodi con cui gli utenti malevoli potrebbero tentare di sfruttare il protocollo di consenso proof-of-stake di Ethereum. Abbiamo esaminato le riorganizzazioni e i ritardi di finalità ipotizzando che gli utenti malevoli dispongano di una quota crescente dell'ether in staking totale. In generale un utente malevolo più ricco ha maggiori possibilità di successo perché il suo stake si traduce in potere di voto che può utilizzare per influenzare i contenuti dei blocchi futuri. A certi importi soglia di ether in staking il potere dell'utente malevolo aumenta: - -33%: ritardo di finalità - -34%: ritardo di finalità, doppia finalità - -51%: ritardo di finalità, doppia finalità, censura, controllo sul futuro della blockchain +Questa pagina ha esplorato alcuni dei modi in cui gli aggressori potrebbero tentare di sfruttare il protocollo di consenso prova di stake di Ethereum. I reorg e i ritardi della finalità sono stati esplorati per aggressori con proporzioni crescenti degli ether totali in stake. Nel complesso, un aggressore più ricco ha maggiori probabilità di successo perché il suo stake si traduce in potere di voto che può usare per influenzare i contenuti dei blocchi futuri. A determinate soglie di ether in stake, il potere dell'aggressore sale di livello: -66%: ritardo di finalità, doppia finalità, censura, controllo sul futuro e sul passato della blockchain +33%: ritardo della finalità +34%: ritardo della finalità, doppia finalità +51%: ritardo della finalità, doppia finalità, censura, controllo sul futuro della blockchain +66%: ritardo della finalità, doppia finalità, censura, controllo sul futuro e sul passato della blockchain -Esiste anche una serie di attacchi più sofisticati che richiedono piccoli importi di ether in staking ma che si basano sul fatto che l'utente malevolo sia molto sofisticato e abbia pieno controllo sulla tempistica dei messaggi per influenzare l'insieme di validatori a proprio favore. +Esiste anche una serie di attacchi più sofisticati che richiedono piccole quantità di ether in stake ma si basano su un aggressore molto sofisticato che ha un controllo preciso sulla tempistica dei messaggi per influenzare l'insieme dei validatori onesti a proprio favore. -In generale, nonostante questi potenziali vettori d'attacco, il rischio che un attacco abbia successo è basso, certamente inferiore a equivalenti proof-of-work. Questo perché l'elevato costo dell'ether in staking è messo a rischio da un utente malevolo che mira a sopraffare i validatori onesti con il proprio potere di voto. Il livello di incentivazione integrato basato sul concetto di "bastone e carota" protegge contro gran parte degli abusi, specialmente qualora gli utenti malevoli dispongano di uno stake ridotto. Anche i più subdoli attacchi di rimbalzo e di bilanciamento hanno poca probabilità di successo poiché le vere condizioni di rete rendono molto difficile ottenere il pieno controllo della consegna dei messaggi a sottoinsiemi specifici di validatori, e i team dei client hanno rapidamente eliminato i vettori degli attacchi di rimbalzo, bilanciamento e valanga con semplici patch. +Nel complesso, nonostante questi potenziali vettori di attacco, il rischio di un attacco riuscito è basso, certamente inferiore agli equivalenti della prova di lavoro. Questo a causa dell'enorme costo degli ether in stake messi a rischio da un aggressore che mira a sopraffare i validatori onesti con il proprio potere di voto. Il livello degli incentivi integrato "bastone e carota" protegge dalla maggior parte dei comportamenti illeciti, specialmente per gli aggressori con stake bassi. È anche improbabile che attacchi di rimbalzo e di bilanciamento più sottili abbiano successo perché le condizioni reali della rete rendono molto difficile ottenere il controllo preciso della consegna dei messaggi a sottoinsiemi specifici di validatori, e i team dei client hanno rapidamente chiuso i vettori di attacco noti di rimbalzo, bilanciamento e a valanga con semplici patch. -La risoluzione degli attacchi basati sul 34%, 51% o 66% dello stake richiederebbe verosimilmente un coordinamento fuori banda. Benché ciò sarebbe probabilmente doloroso per la community, la capacità di quest'ultima di rispondere fuori banda rappresenta un forte disincentivo per un utente malevolo. Il livello sociale di Ethereum è l'ultima rete di protezione: un attacco tecnicamente riuscito potrebbe comunque essere neutralizzato dalla community accordandosi per adottare una biforcazione onesta. Quella che si verificherebbe è una gara tra l'utente malevolo e la community di Ethereum: i miliardi di dollari spesi per un attacco basato sul 66% dello stake sarebbero probabilmente annientati da un attacco di coordinamento sociale con esito positivo rapido a sufficienza, lasciando all'utente malevolo ingenti importi di ether in staking illiquido su una catena notoriamente disonesta ignorata dalla community di Ethereum. La probabilità che un tale attacco risulti redditizio per l'utente malevolo è sufficientemente bassa da far sì che questo sia un deterrente efficace. Per questo l'investimento nel mantenere un livello sociale coeso con valori strettamente allineati è così importante. +Gli attacchi del 34%, 51% o 66% richiederebbero probabilmente un coordinamento sociale fuori banda per essere risolti. Sebbene questo sarebbe probabilmente doloroso per la comunità, la capacità di una comunità di rispondere fuori banda è un forte disincentivo per un aggressore. Il livello sociale di Ethereum è l'ultimo baluardo: un attacco tecnicamente riuscito potrebbe ancora essere neutralizzato dalla comunità che accetta di adottare una biforcazione onesta. Ci sarebbe una gara tra l'aggressore e la comunità di Ethereum: i miliardi di dollari spesi per un attacco del 66% verrebbero probabilmente annientati da un attacco di coordinamento sociale riuscito se venisse sferrato abbastanza rapidamente, lasciando l'aggressore con pesanti borse di ether in stake illiquidi su una catena disonesta nota ignorata dalla comunità di Ethereum. La probabilità che questo finisca per essere redditizio per l'aggressore è sufficientemente bassa da costituire un deterrente efficace. Ecco perché l'investimento nel mantenimento di un livello sociale coeso con valori strettamente allineati è così importante. -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} - [Versione più dettagliata di questa pagina](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) -- [Vitalik sul carattere definitivo del regolamento](https://blog.ethereum.org/2016/05/09/on-settlement-finality) -- [Documentazione su LMD GHOST](https://arxiv.org/abs/2003.03052) -- [Documento Casper-FFG](https://arxiv.org/abs/1710.09437) -- [Articolo su Gasper](https://arxiv.org/pdf/2003.03052.pdf) -- [Specifiche del consenso basato sul potenziamento del peso del propositore](https://github.com/ethereum/consensus-specs/pull/2730) +- [Vitalik sulla finalità del regolamento](https://blog.ethereum.org/2016/05/09/on-settlement-finality) +- [Documento su LMD GHOST](https://arxiv.org/abs/2003.03052) +- [Documento su Casper-FFG](https://arxiv.org/abs/1710.09437) +- [Documento su Gasper](https://arxiv.org/pdf/2003.03052.pdf) +- [Specifiche di consenso sul potenziamento del peso del proponente](https://github.com/ethereum/consensus-specs/pull/2730) - [Attacchi di rimbalzo su ethresear.ch](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) -- [Articolo sulla SSLE](https://ethresear.ch/t/secret-non-single-leader-election/11789) +- [Ricerca su SSLE](https://ethresear.ch/t/secret-non-single-leader-election/11789) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attestations/index.md index 579599b28a0..b4981b348ec 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attestations/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -1,42 +1,42 @@ --- title: Attestazioni -description: Descrizione delle attestazioni nella proof-of-stake di Ethereum. +description: Una descrizione delle attestazioni su Ethereum basato sulla prova di stake. lang: it --- -Un validatore dovrebbe creare, firmare e trasmettere una attestazione durante ogni epoca. Questa pagina delinea come appaiono queste attestazioni e come sono elaborate e comunicate tra i client di consenso. +Ci si aspetta che un validatore crei, firmi e trasmetta un'attestazione durante ogni epoca. Questa pagina delinea l'aspetto di queste attestazioni e come vengono elaborate e comunicate tra i client di consenso. ## Cos'è un'attestazione? {#what-is-an-attestation} -Ogni [epoca](/glossary/#epoch) (6,4 minuti), un validatore propone un'attestazione alla rete. L'attestazione è per uno slot specifico nell'epoca. Lo scopo dell'attestazione è votare a favore della visione della catena del validatore, in particolare il blocco giustificato più recente e il primo blocco nell'epoca corrente (noti come punti di controllo `source` (origine) e `target` (destinazione)). Queste informazioni sono combinate per tutti i validatori partecipanti, consentendo alla rete di raggiungere il consenso sullo stato della blokchain. +Ogni [epoca](/glossary/#epoch) (6,4 minuti) un validatore propone un'attestazione alla rete. L'attestazione è per uno slot specifico nell'epoca. Lo scopo dell'attestazione è votare a favore della visione della catena del validatore, in particolare il blocco giustificato più recente e il primo blocco nell'epoca corrente (noti come checkpoint `source` e `target`). Queste informazioni vengono combinate per tutti i validatori partecipanti, consentendo alla rete di raggiungere il consenso sullo stato della blockchain. -L'attestazione contiene i componenti seguenti: +L'attestazione contiene i seguenti componenti: -- `aggregation_bits`: un bitlist di validatori in cui la posizione mappa all'indice del validatore nella loro commissione; il valore (0/1) indica se il validatore ha firmato i `data` (cioè, se è attivo ed è d'accordo con il propositore del blocco) -- `data`: dettagli relativi all'attestazione, come definito sotto +- `aggregation_bits`: un elenco di bit dei validatori in cui la posizione corrisponde all'indice del validatore nel proprio comitato; il valore (0/1) indica se il validatore ha firmato i `data` (cioè, se è attivo e concorda con il proponente del blocco) +- `data`: dettagli relativi all'attestazione, come definito di seguito - `signature`: una firma BLS che aggrega le firme dei singoli validatori -La prima mansione per un validatore attestante è costruire `data`. I `data` contengono le seguenti informazioni: +Il primo compito per un validatore attestante è costruire i `data`. I `data` contengono le seguenti informazioni: - `slot`: Il numero di slot a cui si riferisce l'attestazione -- `index`: Un numero che identifica a quale commissione appartiene il validatore in un dato slot -- `beacon_block_root`: Hash radice del blocco che il validatore vede alla testa della catena (il risultato dell'applicazione dell'algoritmo di scelta della diramazione) +- `index`: Un numero che identifica a quale comitato appartiene il validatore in un dato slot +- `beacon_block_root`: L'hash radice del blocco che il validatore vede in cima alla catena (il risultato dell'applicazione dell'algoritmo di scelta della biforcazione) - `source`: Parte del voto di finalità che indica ciò che i validatori vedono come il blocco giustificato più recente -- `target`: Parte del voto di finalità che indica cosa i validatori vedono come il primo blocco nell'epoca corrente +- `target`: Parte del voto di finalità che indica ciò che i validatori vedono come il primo blocco nell'epoca corrente -Una volta costruiti i `data`, il validatore può capovolgere il bit in `aggregation_bits`, corrispondenti al proprio indice del validatore da 0 a 1 per mostrare di aver partecipato. +Una volta costruiti i `data`, il validatore può invertire il bit in `aggregation_bits` corrispondente al proprio indice di validatore da 0 a 1 per mostrare di aver partecipato. -Infine, il validatore firma l'attestazione e la trasmette sulla rete. +Infine, il validatore firma l'attestazione e la trasmette alla rete. ### Attestazione aggregata {#aggregated-attestation} -Le spese aggiuntive associate al trasferimento di questi dati nella rete sono molto elevate per ogni validatore. Di conseguenza, prima ancora che avvenga la trasmissione su larga scala, le attestazioni dei singoli validatori sono aggregate in reti secondarie. Questo include l'aggregazione delle firme in modo che un'attestazione che viene trasmessa includa i `dati` di consenso e un'unica firma creata combinando le firme di tutte i validatori d'accordo con tali `dati`. Ciò è verificabile utilizzando `aggregation_bits`, poiché questi forniscono l'indice di ogni validatore nella propria commissione (i cui ID sono forniti in `data`) che può essere utilizzato per richiedere le singole firme. +C'è un notevole sovraccarico associato al passaggio di questi dati attraverso la rete per ogni validatore. Pertanto, le attestazioni dei singoli validatori vengono aggregate all'interno di sottoreti prima di essere trasmesse più ampiamente. Ciò include l'aggregazione delle firme in modo che un'attestazione trasmessa includa i `data` di consenso e una singola firma formata combinando le firme di tutti i validatori che concordano con quei `data`. Questo può essere verificato utilizzando `aggregation_bits` perché fornisce l'indice di ciascun validatore nel proprio comitato (il cui ID è fornito in `data`), che può essere utilizzato per interrogare le singole firme. -In ogn epoca 16 validatori in ogni rete secondaria sono selezionati per fungere da `aggregatori`. Gli aggregatori raccolgono tutte le attestazioni a loro note sulla rete di gossip aventi `dati` equivalenti ai loro. Il mittente di ogni attestazione corrispondente è registrato negli `aggregation_bits`. Quindi, gli aggregatori trasmettono l'aggregato di attestazioni al resto della rete. +In ogni epoca, 16 validatori in ciascuna sottorete vengono selezionati per essere gli `aggregators` (aggregatori). Gli aggregatori raccolgono tutte le attestazioni di cui vengono a conoscenza sulla rete gossip che hanno `data` equivalenti ai propri. Il mittente di ogni attestazione corrispondente viene registrato in `aggregation_bits`. Gli aggregatori trasmettono quindi l'aggregato di attestazioni alla rete più ampia. -Quando un validatore viene selezionato per essere un propositore di blocchi, impacchetta le attestazioni aggregate dalle reti secondarie fino all'ultimo slot nel nuovo blocco. +Quando un validatore viene selezionato per essere un proponente del blocco, impacchetta le attestazioni aggregate dalle sottoreti fino all'ultimo slot nel nuovo blocco. -### Ciclo di vita di inclusione dell'attestazione {#attestation-inclusion-lifecycle} +### Ciclo di vita dell'inclusione dell'attestazione {#attestation-inclusion-lifecycle} 1. Generazione 2. Propagazione @@ -44,49 +44,49 @@ Quando un validatore viene selezionato per essere un propositore di blocchi, imp 4. Propagazione 5. Inclusione -Il ciclo di vita dell'attestazione è delineato nel seguente schema: +Il ciclo di vita dell'attestazione è delineato nello schema sottostante: ![ciclo di vita dell'attestazione](./attestation_schematic.png) ## Ricompense {#rewards} -I validatori sono ricompensati per l'invio delle attestazioni. La ricompensa d'attestazione dipende dai flag di partecipazione (sorgente, destinazione e testa), dalla ricompensa di base e dal tasso di partecipazione. +I validatori vengono ricompensati per l'invio di attestazioni. La ricompensa dell'attestazione dipende dai flag di partecipazione (source, target e head), dalla ricompensa di base e dal tasso di partecipazione. -Ogni flag di partecipazione può essere vero o falso, a seconda dell'attestazione inviata e del suo ritardo di inclusione. +Ciascuno dei flag di partecipazione può essere vero o falso, a seconda dell'attestazione inviata e del suo ritardo di inclusione. -Lo scenario migliore si verifica quando i tre flag sono tutti veri, nel qual caso un validatore guadagnerà (per flag corretto): +Lo scenario migliore si verifica quando tutti e tre i flag sono veri, nel qual caso un validatore guadagnerebbe (per flag corretto): -`ricompensa += ricompensa di base * peso del flag * tasso di attestazione del flag / 64` +`reward += base reward * flag weight * flag attesting rate / 64` -Il tasso di attestazione del flag si misura utilizzando la somma dei saldi effettivi di tutti i validatori attestanti per il dato flag confrontato al saldo effettivo attivo totale. +Il tasso di attestazione del flag viene misurato utilizzando la somma dei saldi effettivi di tutti i validatori attestanti per il flag dato rispetto al saldo effettivo attivo totale. ### Ricompensa di base {#base-reward} -La ricompensa di base è calcolata secondo il numero di validatori attestanti e i loro saldi effettivi di ether in staking: +La ricompensa di base viene calcolata in base al numero di validatori attestanti e ai loro saldi effettivi di ether in stake: `base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)` -#### Ritardo d'inclusione {#inclusion-delay} +#### Ritardo di inclusione {#inclusion-delay} -Al momento del voto dei validatori sulla testa della catena (`block n`), `block n+1` non era ancora stato proposto. Pertanto, le attestazioni sono incluse naturalmente **un blocco più tardi**, così che tutte le attestazioni che hanno votato sul `block n`, che è la testa della catena, sono incluse in `block n+1` e il **ritardo d'inclusione** è 1. Se il ritardo d'inclusione raddoppia a due slot, la ricompensa di attestazione si dimezza, perché per calcolare la ricompensa di attestazione la ricompensa di base è moltiplicata per il reciproco del ritardo d'inclusione. +Nel momento in cui i validatori hanno votato sulla cima della catena (`block n`), il `block n+1` non era ancora stato proposto. Pertanto, le attestazioni vengono naturalmente incluse **un blocco dopo**, quindi tutte le attestazioni che hanno votato per il `block n` come cima della catena sono state incluse nel `block n+1` e il **ritardo di inclusione** è 1. Se il ritardo di inclusione raddoppia a due slot, la ricompensa dell'attestazione si dimezza, perché per calcolare la ricompensa dell'attestazione la ricompensa di base viene moltiplicata per il reciproco del ritardo di inclusione. ### Scenari di attestazione {#attestation-scenarios} #### Validatore votante mancante {#missing-voting-validator} -I validatori hanno un massimo di 1 epoca per inviare le proprie attestazioni. Se l'attestazione era mancante nell'epoca 0, può essere inviata con un ritardo d'inclusione nell'epoca 1. +I validatori hanno un massimo di 1 epoca per inviare la loro attestazione. Se l'attestazione è stata persa nell'epoca 0, possono inviarla con un ritardo di inclusione nell'epoca 1. #### Aggregatore mancante {#missing-aggregator} -Per ogni epoca ci sono in totale 16 Aggregatori. Inoltre, alcuni validatori casuali si iscrivono a **due reti secondarie per 256 epoche** e servono da backup nel caso in cui gli aggregatori siano mancanti. +Ci sono 16 Aggregatori per epoca in totale. Inoltre, validatori casuali si iscrivono a **due sottoreti per 256 epoche** e fungono da backup nel caso in cui manchino gli aggregatori. -#### Propositore di blocchi mancante {#missing-block-proposer} +#### Proponente del blocco mancante {#missing-block-proposer} -Si noti che in alcuni casi un aggregatore fortunato potrebbe anche diventare il propositore di blocchi. Se l'attestazione non è stata inclusa perché il propositore di blocchi è mancante, sarebbe il propositore successivo a selezionare l'attestazione aggregata e includerla nel blocco successivo. Tuttavia, il **ritardo d'inclusione** aumenterebbe di uno. +Nota che in alcuni casi un aggregatore fortunato può anche diventare il proponente del blocco. Se l'attestazione non è stata inclusa perché il proponente del blocco è scomparso, il proponente del blocco successivo raccoglierà l'attestazione aggregata e la includerà nel blocco successivo. Tuttavia, il **ritardo di inclusione** aumenterà di uno. -## Lettura consigliate {#further-reading} +## Letture consigliate {#further-reading} -- [Le attestazioni nelle specifiche del consenso annotate da Vitalik](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) -- [Le attestazioni su eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) +- [Attestazioni nelle specifiche di consenso annotate di Vitalik](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) +- [Attestazioni in eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/block-proposal/index.md index 43ec2ad31d1..29feea47922 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/block-proposal/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -1,32 +1,32 @@ --- -title: Proposta di blocco -description: Spiegazione di come vengono proposti i blocchi nel proof-of-stake di Ethereum. +title: Proposta del blocco +description: Spiegazione di come vengono proposti i blocchi in Ethereum basato sulla prova di stake. lang: it --- -I blocchi costituiscono le unità fondamentali della blockchain. I blocchi sono unità discrete di informazioni che vengono passate tra i nodi, concordate e aggiunte al database di ciascun nodo. Questa pagina spiega come sono prodotti. +I blocchi sono le unità fondamentali della blockchain. I blocchi sono unità discrete di informazioni che vengono passate tra i nodi, concordate e aggiunte al database di ciascun nodo. Questa pagina spiega come vengono prodotti. ## Prerequisiti {#prerequisites} -L'azione di proporre un blocco fa parte del protocollo di proof-of-stake. Per aiutarti a comprendere questa pagina, ti consigliamo di leggere a riguardo del [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) e dell'[architettura dei blocchi](/developers/docs/blocks/). +La proposta del blocco fa parte del protocollo di prova di stake. Per aiutare a comprendere questa pagina, ti consigliamo di leggere della [prova di stake](/developers/docs/consensus-mechanisms/pos/) e dell'[architettura dei blocchi](/developers/docs/blocks/). ## Chi produce i blocchi? {#who-produces-blocks} -I conti del validatore propongono i blocchi. I conti del validatore sono gestiti dagli operatori dei nodi che eseguono il software del validatore come parte dei propri client di esecuzione e di consenso e hanno depositato almeno 32 ETH nel contratto di deposito. Tuttavia, ogni validatore è responsabile solo occasionalmente della proposta di un blocco. Ethereum misura il tempo in slot ed epoche. Ogni slot è di dodici secondi, e 32 slot (6,4 minuti) compongono un'epoca. Ogni slot è un'opportunità per aggiungere un nuovo blocco a Ethereum. +Gli account dei validatori propongono i blocchi. Gli account dei validatori sono gestiti dagli operatori dei nodi che eseguono il software del validatore come parte dei loro client di esecuzione e client di consenso e hanno depositato almeno 32 ETH nel contratto di deposito. Tuttavia, ogni validatore è responsabile della proposta di un blocco solo occasionalmente. [Ethereum](/) misura il tempo in slot ed epoche. Ogni slot dura dodici secondi e 32 slot (6,4 minuti) costituiscono un'epoca. Ogni slot è un'opportunità per aggiungere un nuovo blocco su Ethereum. ### Selezione casuale {#random-selection} -Un unico validatore è pseudo-casualmente scelto per proporre un blocco per ogni slot. Non esiste una vera casualità in una blockchain, poiché se ogni nodo generasse genuinamente dei numeri casuali non si arriverebbe mai al consenso. Invece, l'obiettivo è di rendere imprevedibile il processo di selezione del validatore. La casualità su Ethereum è ottenuta utilizzando un algoritmo chiamato RANDAO, che combina un hash dal propositore di blocchi con un seed aggiornato a ogni blocco. Questo valore è utilizzato per selezionare un validatore specifico dall'insieme totale di validatori. La selezione del validatore è fissata con due epoche in anticipo come forma di protezione da certi tipi di manipolazione del seed. +Un singolo validatore viene scelto in modo pseudo-casuale per proporre un blocco in ogni slot. Non esiste una vera casualità in una blockchain perché se ogni nodo generasse numeri genuinamente casuali, non potrebbero giungere al consenso. Invece, l'obiettivo è rendere imprevedibile il processo di selezione del validatore. La casualità è ottenuta su Ethereum utilizzando un algoritmo chiamato RANDAO che mescola un hash del proponente del blocco con un seme (seed) che viene aggiornato a ogni blocco. Questo valore viene utilizzato per selezionare un validatore specifico dall'insieme totale dei validatori. La selezione del validatore è fissata con due epoche di anticipo come modo per proteggersi contro certi tipi di manipolazione del seme. -Sebbene i validatori si aggiungano al RANDAO in ogni slot, il valore globale del RANDAO è aggiornato solo una volta per epoca. Per calcolare l'indice del propositore di blocchi successivo, il valore del RANDAO è combinato con il numero di slot per dare un valore univoco a ogni slot. La probabilità che un singolo validatore sia selezionato non è semplicemente `1/N` (dove `N` = validatori attivi totali). Invece, è ponderata per il saldo di ETH effettivo di ogni validatore. Il saldo effettivo massimo è di 32 ETH (ciò significa che `balance < 32 ETH` comporta un peso minore di `balance == 32 ETH`, ma `balance > 32 ETH` non comporta un peso maggiore di `balance == 32 ETH`). +Sebbene i validatori aggiungano a RANDAO in ogni slot, il valore globale di RANDAO viene aggiornato solo una volta per epoca. Per calcolare l'indice del successivo proponente del blocco, il valore RANDAO viene mescolato con il numero dello slot per fornire un valore univoco in ogni slot. La probabilità che un singolo validatore venga selezionato non è semplicemente `1/N` (dove `N` = totale dei validatori attivi). Invece, è ponderata dal saldo effettivo in ETH di ciascun validatore. Il saldo effettivo massimo è di 32 ETH (questo significa che `balance < 32 ETH` porta a un peso inferiore rispetto a `balance == 32 ETH`, ma `balance > 32 ETH` non porta a un peso maggiore rispetto a `balance == 32 ETH`). -Solo un propositore di blocchi è selezionato per ogni slot. In condizioni normali, un singolo produttore di blocchi crea e rilascia un unico blocco nello slot dedicato. Creare due blocchi per lo stesso slot è un’infrazione tagliabile, spesso nota come "equivoco". +Viene selezionato un solo proponente del blocco in ogni slot. In condizioni normali, un singolo produttore di blocchi crea e rilascia un singolo blocco nel proprio slot dedicato. Creare due blocchi per lo stesso slot è un'infrazione punibile, spesso nota come "equivocazione". -## Come è creato il blocco? {#how-is-a-block-created} +## Come viene creato il blocco? {#how-is-a-block-created} -Il propositore di blocchi dovrebbe trasmettere un blocco beacon firmato che si basa sulla testa della catena più recente secondo la vista del proprio algoritmo di scelta della diramazione eseguito localmente. L'algoritmo di scelta della diramazione si applica a qualsiasi attestazione accodata rimanente dallo slot precedente, quindi trova il blocco con il peso accumulato maggiore delle attestazioni nel suo storico. Quel blocco è genitore del nuovo blocco creato dal propositore. +Ci si aspetta che il proponente del blocco trasmetta un blocco della beacon chain firmato che si basa sulla testa più recente della catena secondo la vista del proprio algoritmo di scelta della biforcazione eseguito localmente. L'algoritmo di scelta della biforcazione applica eventuali attestazioni in coda rimaste dallo slot precedente, quindi trova il blocco con il maggior peso accumulato di attestazioni nella sua cronologia. Quel blocco è il genitore del nuovo blocco creato dal proponente. -Il propositore di blocchi crea un blocco raccogliendo i dati dal suo database locale e dalla sua vista della catena. I contenuti del blocco sono mostrati nel frammento seguente: +Il proponente del blocco crea un blocco raccogliendo dati dal proprio database locale e dalla propria vista della catena. I contenuti del blocco sono mostrati nel frammento sottostante: ```rust class BeaconBlockBody(Container): @@ -42,28 +42,28 @@ class BeaconBlockBody(Container): execution_payload: ExecutionPayload ``` -Il campo `randao_reveal` prende un valore casuale verificabile che il propositore di blocchi crea firmando il numero dell'epoca corrente. `eth1_data` è un voto per la vista del contratto di deposito da parte del propositore di blocchi, che include la radice dell'albero di Merkle di deposito e il numero totale di depositi che consentono la verifica dei nuovi depositi. `graffiti` è un campo facoltativo utilizzabile per aggiungere un messaggio al blocco. `proposer_slashings` e `attester_slashings` sono campi contenenti la prova che certi validatori hanno commesso infrazioni tagliabili secondo la vista della catena del propositore. `deposits` è un elenco di nuovi depositi del validatore di cui il propositore di blocchi è consapevole, e `voluntary_exits` è un elenco di validatori che desiderano uscire di cui il propositore di blocchi è venuto a conoscenza sulla rete di gossip del livello di consenso. `sync_aggregate` è un vettore che mostra quali validatori erano precedentemente assegnati a una commissione di sincronizzazione (un sottoinsieme di validatori che servono i dati dei client leggeri) e hanno partecipato alla firma dei dati. +Il campo `randao_reveal` accetta un valore casuale verificabile che il proponente del blocco crea firmando il numero dell'epoca corrente. `eth1_data` è un voto per la vista del proponente del blocco del contratto di deposito, inclusa la radice del trie di Merkle dei depositi e il numero totale di depositi che consentono di verificare i nuovi depositi. `graffiti` è un campo opzionale che può essere utilizzato per aggiungere un messaggio al blocco. `proposer_slashings` e `attester_slashings` sono campi che contengono la prova che determinati validatori hanno commesso infrazioni punibili secondo la vista della catena del proponente. `deposits` è un elenco di nuovi depositi dei validatori di cui il proponente del blocco è a conoscenza, e `voluntary_exits` è un elenco di validatori che desiderano uscire di cui il proponente del blocco ha sentito parlare sulla rete gossip del livello di consenso. Il `sync_aggregate` è un vettore che mostra quali validatori erano stati precedentemente assegnati a un comitato di sincronizzazione (un sottoinsieme di validatori che servono dati per i client leggeri) e hanno partecipato alla firma dei dati. -`execution_payload` consente il passaggio delle informazioni sulle transazioni tra i client di esecuzione e di consenso. `execution_payload` è un blocco di dati di esecuzione che viene nidificato in un blocco beacon. I campi in `execution_payload` riflettono la struttura dei blocchi delineata nello Yellow Paper di Ethereum, tranne che non esistono ommer e che `prev_randao` esiste al posto della `difficulty`. Il client di esecuzione ha accesso a un pool locale di transazioni di cui è venuto a conoscenza sulla propria rete di gossip. Queste transazioni sono eseguite localmente per generare un albero di stato aggiornato, noto come post-stato. Le transazioni sono incluse nell'`execution_payload` come un elenco detto `transactions` e il post-stato è fornito nel campo `state-root`. +L'`execution_payload` consente di passare informazioni sulle transazioni tra i client di esecuzione e i client di consenso. L'`execution_payload` è un blocco di dati di esecuzione che viene annidato all'interno di un blocco della beacon chain. I campi all'interno dell'`execution_payload` riflettono la struttura del blocco delineata nello yellow paper di Ethereum, tranne per il fatto che non ci sono ommer e `prev_randao` esiste al posto di `difficulty`. Il client di esecuzione ha accesso a un pool locale di transazioni di cui ha sentito parlare sulla propria rete gossip. Queste transazioni vengono eseguite localmente per generare un trie di stato aggiornato noto come post-stato. Le transazioni sono incluse nell'`execution_payload` come un elenco chiamato `transactions` e il post-stato è fornito nel campo `state-root`. -Tutti questi dati sono raccolti in un blocco beacon, firmati e trasmessi ai pari del propositore di blocchi, che li distribuiscono ai loro pari, ecc. +Tutti questi dati vengono raccolti in un blocco della beacon chain, firmati e trasmessi ai peer del proponente del blocco, che li propagano ai loro peer, ecc. -Maggiori informazioni più sull'[anatomia dei blocchi](/developers/docs/blocks). +Leggi di più sull'[anatomia dei blocchi](/developers/docs/blocks). ## Cosa succede al blocco? {#what-happens-to-blocks} -Il blocco è aggiunto al database locale del propositore di blocchi e trasmesso ai pari tramite la rete di gossip del livello di consenso. Quando un validatore riceve il blocco, verifica i dati al suo interno, anche controllando che il blocco abbia il genitore corretto, corrisponda allo slot corretto, che l'indice del propositore sia quello previsto, che l'indicazione del RANDAO sia valida e che il propositore non sia tagliato. `execution_payload` è scompattato e il client di esecuzione del validatore ri-esegue le transazioni nell'elenco per verificare il cambiamento di stato proposto. Supponendo che il blocco superi tutti questi controlli, ogni validatore aggiunge il blocco alla propria catena canonica. Il processo quindi ricomincia nello slot successivo. +Il blocco viene aggiunto al database locale del proponente del blocco e trasmesso ai peer sulla rete gossip del livello di consenso. Quando un validatore riceve il blocco, verifica i dati al suo interno, controllando anche che il blocco abbia il genitore corretto, corrisponda allo slot corretto, che l'indice del proponente sia quello previsto, che la rivelazione RANDAO sia valida e che il proponente non sia stato punito. L'`execution_payload` viene separato e il client di esecuzione del validatore riesegue le transazioni nell'elenco per verificare il cambiamento di stato proposto. Supponendo che il blocco superi tutti questi controlli, ogni validatore aggiunge il blocco alla propria catena canonica. Il processo ricomincia quindi nello slot successivo. ## Ricompense del blocco {#block-rewards} -Il propositore del blocco riceve il pagamento per il proprio lavoro. Esiste una `base_reward` calcolata come funzione del numero di validatori attivi e dei loro saldi effettivi. Il propositore del blocco, quindi, riceve una frazione della `base_reward` per ogni attestazione valida inclusa nel blocco; più validatori attestano al blocco, maggiore è la ricompensa del suo propositore. Esiste anche una ricompensa per aver segnalato i validatori che dovrebbero essere tagliati, pari a `1/512 * saldo effettivo` per ogni validatore tagliato. +Il proponente del blocco riceve un pagamento per il proprio lavoro. C'è una `base_reward` calcolata in funzione del numero di validatori attivi e dei loro saldi effettivi. Il proponente del blocco riceve quindi una frazione della `base_reward` per ogni attestazione valida inclusa nel blocco; più validatori attestano il blocco, maggiore è la ricompensa del proponente del blocco. C'è anche una ricompensa per la segnalazione di validatori che dovrebbero essere puniti, pari a `1/512 * effective balance` per ogni validatore punito. -[Maggiori informazioni su ricompense e sanzioni](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) +[Maggiori informazioni su ricompense e penalità](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) ## Letture consigliate {#further-reading} - [Introduzione ai blocchi](/developers/docs/blocks/) -- [Introduzione al proof-of-stake](/developers/docs/consensus-mechanisms/pos/) +- [Introduzione alla prova di stake](/developers/docs/consensus-mechanisms/pos/) - [Specifiche del consenso di Ethereum](https://github.com/ethereum/consensus-specs) -- [Introduzione a Gasper](/developers/docs/consensus-mechanisms/pos/) -- [Aggiornare Ethereum](https://eth2book.info/) +- [Introduzione a Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) +- [Aggiornare Ethereum](https://eth2book.info/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md index d9dffb352e6..19f1eab0f08 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -1,172 +1,172 @@ --- title: Domande frequenti -description: Domande frequenti sull'Ethereum di proof-of-stake. +description: Domande frequenti sulla prova di stake di Ethereum. lang: it --- -## Cos'è il proof-of-stake {#what-is-proof-of-stake} +## Cos'è la prova di stake {#what-is-proof-of-stake} -Il proof-of-stake è una classe di algoritmo che può fornire sicurezza alle blockchain assicurandosi che le risorse di valore siano perse dagli utenti malevoli che agiscono in modo disonesto. I sistemi di proof-of-stake richiedono che una serie di validatori rendano disponibili delle risorse che possono essere distrutte se il validatore adotta certi comportamenti comprovatamente disonesti. Ethereum utilizza il meccanismo di proof-of-stake per proteggere la blockchain. +La prova di stake è una classe di algoritmo che può fornire sicurezza alle blockchain assicurando che gli asset di valore vengano persi dagli aggressori che agiscono in modo disonesto. I sistemi di prova di stake richiedono a un insieme di validatori di rendere disponibile un certo asset che può essere distrutto se il validatore si impegna in un comportamento dimostrabilmente disonesto. Ethereum utilizza un meccanismo di consenso basato sulla prova di stake per proteggere la blockchain. -## Come si distingue il proof-of-stake dal proof-of-work? {#comparison-to-proof-of-work} +## Come si confronta la prova di stake con la prova di lavoro? {#comparison-to-proof-of-work} -Sia il proof-of-work che il proof-of-stake sono meccanismi che disincentivano economicamente gli utenti malevoli dallo spam o da truffe alla rete. In entrambi i casi, i nodi che partecipano attivamente al consenso mettono "nella rete" alcune risorse che perderanno se si comportano scorrettamente. +Sia la prova di lavoro che la prova di stake sono meccanismi che disincentivano economicamente gli attori malintenzionati dallo spammare o frodare la rete. In entrambi i casi, i nodi che partecipano attivamente al consenso mettono un certo asset "nella rete" che perderanno se si comportano male. -Nel proof-of-work, tale risorsa è l'energia. Il nodo, noto come miner, esegue un algoritmo che mira a calcolare un valore più velocemente di ogni altro nodo. Il nodo più veloce ha il diritto di proporre un blocco alla catena. Per modificare lo storico della catena o dominare la proposta dei blocchi, un miner dovrebbe avere tanta potenza di calcolo da vincere sempre la gara. Ciò è costoso in modo proibitivo e difficile da eseguire, il che protegge la catena dagli attacchi. L'energia necessaria a "minare" utilizzando il proof-of-work è una risorsa del mondo reale pagata dai miner. +Nella prova di lavoro, questo asset è l'energia. Il nodo, noto come minatore, esegue un algoritmo che mira a calcolare un valore più velocemente di qualsiasi altro nodo. Il nodo più veloce ha il diritto di proporre un blocco alla catena. Per cambiare la cronologia della catena o dominare la proposta del blocco, un minatore dovrebbe avere così tanta potenza di calcolo da vincere sempre la gara. Questo è proibitivamente costoso e difficile da eseguire, proteggendo la catena dagli attacchi. L'energia richiesta per "estrarre" (mine) utilizzando la prova di lavoro è un asset del mondo reale che i minatori pagano. -Il proof-of-stake richiede che i nodi, noti come validatori, inviino esplicitamente una risorsa di criptovalute a un contratto intelligente. Se un validatore si comporta male, questa criptovaluta può essere distrutta perché sta "mettendo in staking" le sue risorse direttamente nella catena invece che indirettamente tramite il consumo energetico. +La prova di stake richiede ai nodi, noti come validatori, di inviare esplicitamente un asset crittografico a un contratto intelligente. Se un validatore si comporta male, questa criptovaluta può essere distrutta perché stanno mettendo in "staking" i loro asset direttamente nella catena invece che indirettamente tramite il dispendio di energia. -Il proof-of-work consuma molta più energia perché il processo di mining consumata elettricità. Il proof-of-stake, d'altra parte, richiede soltanto una piccola quantità di energia: i validatori di Ethereum possono essere eseguiti persino su un dispositivo a bassa potenza, come un Raspberry Pi. Il meccanismo di proof-of-stake di Ethereum è concepito per essere più sicuro del proof-of-work, perché il costo dell'attacco è maggiore e le conseguenze sono più severe. +La prova di lavoro è molto più affamata di energia perché l'elettricità viene bruciata nel processo di mining. La prova di stake, d'altra parte, richiede solo una piccolissima quantità di energia: i validatori di Ethereum possono persino funzionare su un dispositivo a bassa potenza come un Raspberry Pi. Si ritiene che il meccanismo di prova di stake di Ethereum sia più sicuro della prova di lavoro perché il costo per attaccare è maggiore e le conseguenze per un aggressore sono più gravi. -Il confronto proof-of-work vs. proof-of-stake è un argomento controverso. Il [blog di Vitalik Buterin](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) e il dibattito tra Justin Drake e Lyn Alden offrono una buona sintesi delle argomentazioni. +Il confronto tra prova di lavoro e prova di stake è un argomento controverso. Il [blog di Vitalik Buterin](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) e il dibattito tra Justin Drake e Lyn Alden offrono un buon riassunto delle argomentazioni. -## Il proof-of-stake è efficiente dal punto di vista energetico? {#is-pos-energy-efficient} +## La prova di stake è efficiente dal punto di vista energetico? {#is-pos-energy-efficient} -Sì. I nodi su una rete di proof-of-stake utilizzano una minuscola quantità di energia. Uno studio di terze parti ha concluso che l'intera rete di proof-of-stake di Ethereum consuma circa 0,0026 TWh/anno, circa 13.000 volte in meno del gaming nei soli Stati Uniti. +Sì. I nodi su una rete di prova di stake utilizzano una quantità minuscola di energia. Uno studio di terze parti ha concluso che l'intera rete Ethereum basata sulla prova di stake consuma circa 0,0026 TWh/anno, circa 13.000 volte meno del solo settore dei videogiochi negli Stati Uniti. -[Di più sul consumo energetico di Ethereum](/energy-consumption/). +[Maggiori informazioni sul consumo energetico di Ethereum](/energy-consumption/). -## Il proof-of-stake è sicuro? {#is-pos-secure} +## La prova di stake è sicura? {#is-pos-secure} -Il proof-of-stake di Ethereum è molto sicuro. Il meccanismo è stato studiato, sviluppato e testato rigorosamente per otto anni prima di entrare in funzione. Le garanzie di sicurezza sono differenti dalle blockchain di proof-of-work. Nel proof-of-stake, i validatori malevoli possono essere puniti attivamente ("tagliati") ed espulsi dall'insieme di validatori, costando un sostanziale importo di ETH. Nel proof-of-work, un utente malevolo può continuare a ripetere il proprio attacco fintanto che ha sufficiente potenza di hash. Inoltre, è più costoso compiere attacchi equivalenti sull'Ethereum con proof-of-stake rispetto al proof-of-work. Per influenzare la vitalità della catena, è necessario almeno il 33% dell'ether in staking totale sulla rete (tranne nei casi di attacchi molto sofisticati che hanno una probabilità di successo estremamente ridotta). Per controllare i contenuti dei blocchi futuri, è necessario almeno il 51% degli ETH in staking totali e per riscrivere lo storico serve oltre il 66% dello stake totale. Il protocollo di Ethereum distruggerebbe queste risorse negli scenari di attacco al 33% e 51% e tramite il consenso sociale nello scenario di attacchi del 66%. +La prova di stake di Ethereum è molto sicura. Il meccanismo è stato ricercato, sviluppato e testato rigorosamente per oltre otto anni prima di essere lanciato. Le garanzie di sicurezza sono diverse dalle blockchain basate sulla prova di lavoro. Nella prova di stake, i validatori malintenzionati possono essere attivamente puniti ed espulsi dall'insieme dei validatori, costando loro una notevole quantità di ETH. Con la prova di lavoro, un aggressore può continuare a ripetere il proprio attacco finché dispone di sufficiente potenza di hash. È anche più costoso organizzare attacchi equivalenti su Ethereum con prova di stake rispetto alla prova di lavoro. Per influenzare la vitalità (liveness) della catena, è richiesto almeno il 33% dell'ether totale messo in stake sulla rete (tranne nei casi di attacchi molto sofisticati con una probabilità di successo estremamente bassa). Per controllare i contenuti dei blocchi futuri, è richiesto almeno il 51% dell'ETH totale messo in stake, e per riscrivere la cronologia, è necessario oltre il 66% dello stake totale. Il protocollo di Ethereum distruggerebbe questi asset negli scenari di attacco del 33% o del 51% e tramite consenso sociale nello scenario di attacco del 66%. -- [Maggiori informazioni sulla difesa del proof-of-stake di Ethereum dagli utenti malevoli](/developers/docs/consensus-mechanisms/pos/attack-and-defense) -- [Maggiori informazioni sulla progettazione del proof-of-stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Maggiori informazioni sulla difesa della prova di stake di Ethereum dagli aggressori](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +- [Maggiori informazioni sulla progettazione della prova di stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -## Il proof-of-stake rende Ethereum più economico? {#does-pos-make-ethereum-cheaper} +## La prova di stake rende Ethereum più economico? {#does-pos-make-ethereum-cheaper} -No. Il costo di invio di una transazione (commissione sul carburante) è determinato da un mercato di commissioni dinamico che aumenta all'aumentare della domanda di rete. Il meccanismo di consenso non lo influenza direttamente. +No. Il costo per inviare una transazione (commissione) è determinato da un mercato delle commissioni dinamico che aumenta con la maggiore domanda della rete. Il meccanismo di consenso non influenza direttamente questo aspetto. -[Maggiori informazioni sul carburante](/developers/docs/gas). +[Maggiori informazioni sul gas](/developers/docs/gas). ## Cosa sono i nodi, i client e i validatori? {#what-are-nodes-clients-and-validators} -I nodi sono computer connessi alla rete di Ethereum. I client sono i software che eseguono, che trasformano il computer in un nodo. Esistono due tipi di client: di esecuzione e di consenso. Sono entrambi necessari per creare un nodo. Un validatore è un componente aggiuntivo facoltativo a un client di consenso, che consente al nodo di partecipare al consenso di proof-of-stake. Ciò significa creare e proporre blocchi quando selezionati e attestare i blocchi che sentono sulla rete. Per eseguire un validatore, l'operatore del nodo deve depositare 32 ETH nel contratto di deposito. +I nodi sono computer connessi alla rete Ethereum. I client sono i software che eseguono e che trasformano il computer in un nodo. Esistono due tipi di client: client di esecuzione e client di consenso. Entrambi sono necessari per creare un nodo. Un validatore è un componente aggiuntivo opzionale per un client di consenso che consente al nodo di partecipare al consenso della prova di stake. Ciò significa creare e proporre blocchi quando selezionato e attestare i blocchi di cui viene a conoscenza sulla rete. Per eseguire un validatore, l'operatore del nodo deve depositare 32 ETH nel contratto di deposito. - [Maggiori informazioni su nodi e client](/developers/docs/nodes-and-clients) - [Maggiori informazioni sullo staking](/staking) -## Il proof-of-stake è una idea nuova? {#is-pos-new} +## La prova di stake è un'idea nuova? {#is-pos-new} -No. Un utente su BitcoinTalk [ha proposto l'idea di base del proof-of-stake](https://bitcointalk.org/index.php?topic=27787.0) come un aggiornamento a Bitcoin nel 2011. Erano undici anni prima che fosse pronto all'implementazione sulla Rete Principale di Ethereum. Alcune altre catene hanno implementato il proof-of-stake prima di Ethereum, ma non il meccanismo specifico di Ethereum (noto come Gasper). +No. Un utente su BitcoinTalk [ha proposto l'idea di base della prova di stake](https://bitcointalk.org/index.php?topic=27787.0) come aggiornamento per Bitcoin nel 2011. Sono passati undici anni prima che fosse pronta per essere implementata sulla rete principale di Ethereum. Alcune altre catene hanno implementato la prova di stake prima di Ethereum, ma non il meccanismo specifico di Ethereum (noto come Gasper). -## Cosa rende speciale il proof-of-stake di Ethereum? {#why-is-ethereum-pos-special} +## Cosa c'è di speciale nella prova di stake di Ethereum? {#why-is-ethereum-pos-special} -Il meccanismo di proof-of-stake di Ethereum è unico nella sua progettazione. Non è stato il primo meccanismo di proof-of-stake mai progettato e implementato, ma è il più robusto. Il meccanismo di proof-of-stake è noto come "Casper". Casper definisce come i validatori sono selezionati per proporre i blocchi, come e quando sono effettuate le attestazioni, come sono contate le attestazioni, le ricompense e le sanzioni date ai validatori, le condizioni di taglio, i meccanismi di emergenza come la perdita per inattività e le condizioni per la "finalità". La finalità è la condizione secondo cui per essere considerato una parte permanente della catena canonica, un blocco deve essere votato da almeno il 66% degli ETH in staking totali sulla rete. I ricercatori hanno sviluppato Casper specificamente per Ethereum, ed Ethereum è la prima e unica blockchain ad averlo implementato. +Il meccanismo di prova di stake di Ethereum è unico nel suo design. Non è stato il primo meccanismo di prova di stake a essere progettato e implementato, ma è il più robusto. Il meccanismo di prova di stake è noto come "Casper". Casper definisce come i validatori vengono selezionati per proporre blocchi, come e quando vengono fatte le attestazioni, come vengono contate le attestazioni, le ricompense e le penalità date ai validatori, le condizioni per punire (slashing), i meccanismi di sicurezza come la perdita per inattività (inactivity leak) e le condizioni per la "finalità". La finalità è la condizione per cui, affinché un blocco sia considerato una parte permanente della catena canonica, deve essere stato votato da almeno il 66% dell'ETH totale messo in stake sulla rete. I ricercatori hanno sviluppato Casper specificamente per Ethereum, ed Ethereum è la prima e unica blockchain ad averlo implementato. -Oltre a Casper, il proof-of-stake di Ethereum utilizza un algoritmo di scelta della diramazione chiamato LMD-GHOST. Questo è necessario nel caso in cui sorga una condizione in cui due blocchi esistono per lo stesso slot. Ciò crea due diramazioni della blockchain. LMD-GHOST seleziona quella con il "peso" di attestazioni maggiore. Il peso è il numero di attestazioni ponderate dal saldo effettivo dei validatori. LMD-GHOST è un'esclusiva di Ethereum. +Oltre a Casper, la prova di stake di Ethereum utilizza un algoritmo di scelta della biforcazione chiamato LMD-GHOST. Questo è necessario nel caso in cui si verifichi una condizione in cui esistono due blocchi per lo stesso slot. Ciò crea due biforcazioni della blockchain. LMD-GHOST sceglie quella che ha il "peso" maggiore di attestazioni. Il peso è il numero di attestazioni ponderato in base al saldo effettivo dei validatori. LMD-GHOST è unico per Ethereum. -La combinazione di Casper e LMD-GHOST è nota come Gasper. +La combinazione di Casper e LMD_GHOST è nota come Gasper. [Maggiori informazioni su Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) -## Cos'è il taglio? {#what-is-slashing} +## Cosa significa punire (slashing)? {#what-is-slashing} -Taglio è il termine dato alla distruzione di parte dello stake di un validatore e la sua espulsione dalla rete. L'importo di ETH perduto in un taglio scala con il numero di validatori tagliati; ciò significa che i validatori complici sono puniti più severamente dei singoli. +Punire (slashing) è il termine dato alla distruzione di una parte dello stake di un validatore e all'espulsione del validatore dalla rete. La quantità di ETH persa in una punizione scala con il numero di validatori che vengono puniti: ciò significa che i validatori che colludono vengono puniti più severamente rispetto ai singoli. -[Maggiori informazioni sul taglio](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) +[Maggiori informazioni sulle punizioni](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) -## Perché i validatori necessitano di 32 ETH? {#why-32-eth} +## Perché i validatori hanno bisogno di 32 ETH? {#why-32-eth} -I validatori devono mettere in staking ETH così che abbiano qualcosa da perdere se si comportano male. Il motivo per cui devono specificamente mettere 32 ETH in staking è per consentire di eseguire i nodi su hardware modesti. Se gli ETH minimi per validatore fossero inferiori, il numero di validatori e dunque il numero di messaggi da elaborare in ogni slot aumenterebbe, il che comporta che sarebbe necessario hardware più potente per eseguire un nodo. +I validatori devono mettere in stake ETH in modo da avere qualcosa da perdere se si comportano male. Il motivo per cui devono mettere in stake specificamente 32 ETH è per consentire ai nodi di funzionare su hardware modesto. Se l'ETH minimo per validatore fosse inferiore, il numero di validatori e quindi il numero di messaggi che devono essere elaborati in ogni slot aumenterebbe, il che significa che sarebbe necessario un hardware più potente per eseguire un nodo. -## Come sono selezionati i validatori? {#how-are-validators-selected} +## Come vengono selezionati i validatori? {#how-are-validators-selected} -Un singolo validatore è scelto pseudo-casualmente per proporre un blocco in ogni slot utilizzando un algoritmo detto RANDAO, che combina un hash dal propositore del blocco con un seed aggiornato a ogni blocco. Questo valore è utilizzato per selezionare un validatore specifico dall'insieme totale di validatori. La selezione del validatore è fissata con due epoche di anticipo. +Un singolo validatore viene scelto in modo pseudo-casuale per proporre un blocco in ogni slot utilizzando un algoritmo chiamato RANDAO che mescola un hash dal proponente del blocco con un seme (seed) che viene aggiornato a ogni blocco. Questo valore viene utilizzato per selezionare un validatore specifico dall'insieme totale dei validatori. La selezione del validatore è fissata con due epoche di anticipo. [Maggiori informazioni sulla selezione dei validatori](/developers/docs/consensus-mechanisms/pos/block-proposal) -## Cos'è la frantumazione dello stake? {#what-is-stake-grinding} +## Cos'è lo stake grinding? {#what-is-stake-grinding} -La frantumazione dello stake è una categoria di attacco alle reti di proof-of-stake in cui l'utente malevolo prova a orientare l'algoritmo di selezione del validatore a favore dei propri validatori. Gli attacchi di frantumazione dello stake richiedono all'incirca metà degli ETH totali in staking. +Lo stake grinding è una categoria di attacco alle reti di prova di stake in cui l'aggressore cerca di influenzare l'algoritmo di selezione dei validatori a favore dei propri validatori. Gli attacchi di stake grinding su RANDAO richiedono circa la metà dell'ETH totale messo in stake. -[Maggiori informazioni sulla frantumazione dello stake](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) +[Maggiori informazioni sullo stake grinding](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) -## Cos'è il taglio sociale? {#what-is-social-slashing} +## Cos'è la punizione sociale (social slashing)? {#what-is-social-slashing} -Il taglio sociale è l'abilità della community di coordinare una diramazione blockchain in risposta a un attacco. Consente alla community di riprendersi da un utente malevolo che finalizza una catena disonesta. Il taglio sociale è anche utilizzabile contro gli attacchi di censura. +La punizione sociale (social slashing) è la capacità della comunità di coordinare una biforcazione della blockchain in risposta a un attacco. Consente alla comunità di riprendersi da un aggressore che finalizza una catena disonesta. La punizione sociale può essere utilizzata anche contro gli attacchi di censura. -- [Maggiori informazioni sul taglio sociale](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin sul taglio sociale](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Maggiori informazioni sulla punizione sociale](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) +- [Vitalik Buterin sulla punizione sociale](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) -## Riceverò un taglio? {#will-i-get-slashed} +## Verrò punito (slashed)? {#will-i-get-slashed} -Come validatore, è molto difficile essere tagliato a meno che non si adottino deliberatamente comportamenti malevoli. Il taglio è implementato soltanto in scenari davvero specifici in cui i validatori propongono più blocchi per lo stesso slot o si contraddicono con le proprie attestazioni – situazioni che è davvero improbabile sorgano accidentalmente. +Come validatore, è molto difficile essere puniti a meno che non ci si impegni deliberatamente in comportamenti malintenzionati. La punizione viene implementata solo in scenari molto specifici in cui i validatori propongono più blocchi per lo stesso slot o si contraddicono con le loro attestazioni: è molto improbabile che questi si verifichino accidentalmente. -[Maggiori informazioni sulle condizioni di taglio](https://eth2book.info/altair/part2/incentives/slashing) +[Maggiori informazioni sulle condizioni di punizione](https://eth2book.info/altair/part2/incentives/slashing) -## Cos'è il problema del "nulla in staking"? {#what-is-nothing-at-stake-problem} +## Cos'è il problema del "nulla in gioco" (nothing-at-stake)? {#what-is-nothing-at-stake-problem} -Il problema del "nulla in staking" è un problema concettuale con alcuni meccanismi di proof-of-stake in cui esistono solo ricompense e nessuna sanzione. Se non c'è nulla in staking, un validatore pragmatico è altrettanto felice di attestare qualsiasi, o persino più, diramazioni della blockchain, perché questo aumenta le sue ricompense. Ethereum aggira tale problema utilizzando le condizioni di finalità e il taglio per assicurare una catena canonica. +Il problema del "nulla in gioco" è una questione concettuale con alcuni meccanismi di prova di stake in cui ci sono solo ricompense e nessuna penalità. Se non c'è nulla in gioco (stake), un validatore pragmatico è ugualmente felice di attestare qualsiasi, o anche più, biforcazioni della blockchain, poiché ciò aumenta le sue ricompense. Ethereum aggira questo problema utilizzando condizioni di finalità e punizioni per garantire una singola catena canonica. -[Maggiori informazioni sul problema di "nulla in staking"](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[Maggiori informazioni sul problema del nulla in gioco](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) -## Cos'è un algoritmo di scelta della diramazione? {#what-is-a-fork-choice-algorithm} +## Cos'è un algoritmo di scelta della biforcazione? {#what-is-a-fork-choice-algorithm} -Un algoritmo di scelta della diramazione implementa regole che determinano quale catena sia quella canonica. In condizioni ottimali, una regola di scelta della diramazione non è necessaria poiché esiste un solo propositore di blocchi per slot e un blocco tra cui scegliere. Talvolta, però, più blocchi per lo stesso slot o informazioni in ritardo comportano più opzioni per come sono organizzati i blocchi vicino alla testa della catena. In questi casi, tutti i client devono implementare delle regole in maniera identica per assicurarsi che tutti selezionino la sequenza corretta di blocchi. L'algoritmo di scelta della diramazione codifica tali regole. +Un algoritmo di scelta della biforcazione implementa regole che determinano quale catena sia quella canonica. In condizioni ottimali, non c'è bisogno di una regola di scelta della biforcazione perché c'è solo un proponente del blocco per slot e un blocco tra cui scegliere. Occasionalmente, tuttavia, più blocchi per lo stesso slot o informazioni in arrivo in ritardo portano a più opzioni su come sono organizzati i blocchi vicino alla testa della catena. In questi casi, tutti i client devono implementare alcune regole in modo identico per assicurarsi che scelgano tutti la sequenza corretta di blocchi. L'algoritmo di scelta della biforcazione codifica queste regole. -L'algoritmo di scelta della diramazione di Ethereum si chiama LMD-GHOST. Seleziona la diramazione con il peso di attestazioni maggiore, ossia quello votato da più ETH in staking. +L'algoritmo di scelta della biforcazione di Ethereum si chiama LMD-GHOST. Sceglie la biforcazione con il maggior peso di attestazioni, ovvero quella per cui ha votato la maggior parte dell'ETH messo in stake. [Maggiori informazioni su LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) -## Cos'è la finalità nel proof-of-stake? {#what-is-finality} +## Cos'è la finalità nella prova di stake? {#what-is-finality} -La finalità nel proof-of-stake è la garanzia che un dato blocco sia una parte permanente della catena canonica e non sia annullabile tranne in caso di mancanza del consenso in cui un utente malevolo brucia il 33% dell'ether in staking totale. Questa è la finalità "cripto-economica", contrapposta alla "finalità probabilistica" che riguarda le blockchain di proof-of-work. Nella finalità probabilistica, non esistono stati finalizzati/non finalizzati espliciti per i blocchi; semplicemente, diventa sempre meno probabile che un blocco possa essere rimosso dalla catena più diventa vecchio, e gli utenti determinano da soli quando sono abbastanza certi che un blocco sia "sicuro". Con la finalità cripto-economica, le coppie di blocchi di punti di controllo devono essere votate dal 66% dell'ether in staking. Se tale condizione è soddisfatta, i blocchi tra tali punti di controllo sono esplicitamente "finalizzati". +La finalità nella prova di stake è la garanzia che un dato blocco sia una parte permanente della catena canonica e non possa essere annullato a meno che non vi sia un fallimento del consenso in cui un aggressore brucia il 33% dell'ether totale messo in stake. Questa è la finalità "cripto-economica", in contrapposizione alla "finalità probabilistica" che è rilevante per le blockchain basate sulla prova di lavoro. Nella finalità probabilistica, non ci sono stati espliciti finalizzati/non finalizzati per i blocchi: diventa semplicemente sempre meno probabile che un blocco possa essere rimosso dalla catena man mano che invecchia, e gli utenti determinano da soli quando sono sufficientemente sicuri che un blocco sia "sicuro". Con la finalità cripto-economica, le coppie di blocchi di checkpoint devono essere votate dal 66% dell'ether messo in stake. Se questa condizione è soddisfatta, i blocchi tra quei checkpoint sono esplicitamente "finalizzati". [Maggiori informazioni sulla finalità](/developers/docs/consensus-mechanisms/pos/#finality) ## Cos'è la "soggettività debole"? {#what-is-weak-subjectivity} -La soggettività debole è una funzionalità delle reti di proof-of-stake in cui le informazioni sociali sono utilizzate per confermare lo stato corrente della blockchain. I nuovi nodi, o quelli che si riuniscono alla rete dopo esser stati offline per molto tempo, possono ricevere uno stato recente così che il nodo possa vedere immediatamente se si trovano sulla catena corretta. Questi stati sono noti come "punti di controllo della soggettività debole" e sono ottenibili da altri operatori di nodi fuori banda, o dagli esploratori di blocchi, o da svariati endpoint pubblici. +La soggettività debole è una caratteristica delle reti di prova di stake in cui le informazioni sociali vengono utilizzate per confermare lo stato attuale della blockchain. Ai nuovi nodi o ai nodi che si ricongiungono alla rete dopo essere stati offline per molto tempo può essere fornito uno stato recente in modo che il nodo possa vedere immediatamente se si trova sulla catena corretta. Questi stati sono noti come "checkpoint di soggettività debole" e possono essere ottenuti da altri operatori di nodi fuori banda (out-of-band), o da esploratori di blocchi, o da diversi endpoint pubblici. [Maggiori informazioni sulla soggettività debole](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) -## Il proof-of-stake è resistente alla censura? {#is-pos-censorship-resistant} +## La prova di stake è resistente alla censura? {#is-pos-censorship-resistant} -La resistenza alla censura è attualmente difficile da dimostrare. Tuttavia, a differenza del proof-of-work, il proof-of-stake offre l'opzione di coordinare i tagli per punire i validatori autori di censura. Sono previste delle modifiche al protocollo per separare i costruttori dai propositori di blocchi e implementare elenchi di transazioni che i costruttori devono includere in ogni blocco. Questa proposta è nota come separazione tra propositori e costruttori e aiuta a impedire che i validatori censurino le transazioni. +La resistenza alla censura è attualmente difficile da dimostrare. Tuttavia, a differenza della prova di lavoro, la prova di stake offre l'opzione di coordinare le punizioni per sanzionare i validatori che censurano. Ci sono imminenti modifiche al protocollo che separano i costruttori di blocchi dai proponenti dei blocchi e implementano elenchi di transazioni che i costruttori devono includere in ogni blocco. Questa proposta è nota come separazione tra proponente e costruttore (proposer-builder separation) e aiuta a impedire ai validatori di censurare le transazioni. -[Maggiori informazioni sulla separazione tra propositori e costruttori](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) +[Maggiori informazioni sulla separazione tra proponente e costruttore](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) -## Il sistema di proof-of-stake di Ethereum può subire attacchi al 51%? {#pos-51-attack} +## Il sistema di prova di stake di Ethereum può subire un attacco del 51%? {#pos-51-attack} -Sì. Il proof-of-stake è vulnerabile agli attacchi al 51%, proprio come il proof-of-work. Anziché aver bisogno del 51% della potenza di hash della rete, l'utente malevolo necessita del 51% del totale degli ETH in staking. Un utente malevolo che accumula il 51% dello stake totale ottiene il controllo dell'algoritmo di scelta della diramazione. Ciò gli consente di censurare certe transazioni, effettuare riorganizzazioni a breve raggio ed estrarre MEV riordinando i blocchi a proprio favore. +Sì. La prova di stake è vulnerabile agli attacchi del 51%, proprio come la prova di lavoro. Invece di richiedere il 51% della potenza di hash della rete, l'aggressore richiede il 51% dell'ETH totale messo in stake. Un aggressore che accumula il 51% dello stake totale ottiene il controllo dell'algoritmo di scelta della biforcazione. Ciò consente all'aggressore di censurare determinate transazioni, eseguire riorganizzazioni a corto raggio ed estrarre il valore massimo estraibile (MEV) riordinando i blocchi a proprio favore. -[Maggiori informazioni sugli attacchi al proof-of-stake](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +[Maggiori informazioni sugli attacchi alla prova di stake](/developers/docs/consensus-mechanisms/pos/attack-and-defense) ## Cos'è il coordinamento sociale e perché è necessario? {#what-is-social-coordination} -Il coordinamento sociale è l'ultima linea di difesa di Ethereum, che consentirebbe a una catena onesta di essere recuperata da un attacco che ha finalizzato dei blocchi disonesti. In questo caso, la community di Ethereum dovrebbe coordinarsi "fuori banda" e accordarsi sull'uso di una diramazione onesta di minoranza, tagliando i validatori malevoli nel processo. Ciò richiederebbe anche alle app e alle borse di riconoscere la diramazione onesta. +Il coordinamento sociale è un'ultima linea di difesa per Ethereum che consentirebbe di recuperare una catena onesta da un attacco che ha finalizzato blocchi disonesti. In questo caso, la comunità di Ethereum dovrebbe coordinarsi "fuori banda" e concordare di utilizzare una biforcazione di minoranza onesta, punendo i validatori dell'aggressore nel processo. Ciò richiederebbe che anche le app e gli exchange riconoscano la biforcazione onesta. -[Maggiori informazioni sul coordinamento sociale](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) +[Leggi di più sul coordinamento sociale](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) -## Il ricco si arricchisce con il proof-of-stake? {#do-rich-get-richer} +## I ricchi diventano più ricchi nella prova di stake? {#do-rich-get-richer} -Più ETH qualcuno ha da mettere in staking, più validatori può eseguire e più ricompense può ottenere. Le ricompense scalano linearmente con l'importo di ETH in staking e tutti ottengono in cambio la stessa percentuale. Il proof-of-work arricchisce il ricco più del proof-of-stake, perché i miner più ricchi che acquistano hardware su larga scala beneficiano dalle economie di scala, il che significa che la relazione tra ricchezza e ricompensa non è lineare. +Più ETH qualcuno ha da mettere in stake, più validatori può eseguire e più ricompense può accumulare. Le ricompense scalano linearmente con la quantità di ETH messa in stake e tutti ottengono la stessa percentuale di rendimento. La prova di lavoro arricchisce i ricchi più della prova di stake perché i minatori più ricchi che acquistano hardware su larga scala beneficiano di economie di scala, il che significa che la relazione tra ricchezza e ricompensa non è lineare. -## Il proof-of-stake è più centralizzato del proof-of-work? {#is-pos-decentralized} +## La prova di stake è più centralizzata della prova di lavoro? {#is-pos-decentralized} -No, il proof-of-work tende alla centralizzazione perché i costi di mining aumentano e tagliano fuori gli individui, poi tagliano fuori le piccole aziende e così via. L'attuale problema con il proof-of-stake è l'influenza dei derivati di staking liquidi (LSD). Si tratta di token rappresentanti gli ETH messi in staking da qualche fornitore, che chiunque può scambiare su mercati secondari senza prelevare gli ETH effettivi. Gli LSD consentono agli utenti di mettere in staking meno di 32 ETH, ma creano anche un rischio di centralizzazione in cui poche grandi organizzazioni possono finire per controllare gran parte dello stake. Per questo lo [staking in autonomia](/staking/solo) è l'opzione migliore per Ethereum. +No, la prova di lavoro tende alla centralizzazione perché i costi di mining aumentano ed escludono i singoli individui, poi escludono le piccole aziende e così via. Il problema attuale con la prova di stake è l'influenza dei derivati di staking liquido (LSD). Si tratta di token che rappresentano ETH messi in stake da un fornitore che chiunque può scambiare sui mercati secondari senza che l'ETH effettivo venga rimosso dallo stake. Gli LSD consentono agli utenti di fare staking con meno di 32 ETH, ma creano anche un rischio di centralizzazione in cui poche grandi organizzazioni possono finire per controllare gran parte dello stake. Questo è il motivo per cui lo [staking in solitaria](/staking/solo) è l'opzione migliore per Ethereum. -[Maggiori informazioni sulla centralizzazione dello stake in LSD](https://notes.ethereum.org/@djrtwo/risks-of-lsd) +[Maggiori informazioni sulla centralizzazione dello stake negli LSD](https://notes.ethereum.org/@djrtwo/risks-of-lsd) -## Perché posso mettere soltanto gli ETH in staking? {#why-can-i-only-stake-eth} +## Perché posso mettere in stake solo ETH? {#why-can-i-only-stake-eth} -ETH è la valuta nativa di Ethereum. È essenziale avere una singola valuta in cui sono denominati tutti gli stake, sia per tenere conto dei saldi effettivi che per ponderare i voti e per la sicurezza. Gli stessi ETH sono componenti fondamentali di Ethereum, rispetto a un contratto intelligente. Integrare altre valute aumenterebbe significativamente la complessità, riducendo la sicurezza dello staking. +L'ETH è la valuta nativa di Ethereum. È essenziale avere un'unica valuta in cui sono denominati tutti gli stake, sia per la contabilizzazione dei saldi effettivi per la ponderazione dei voti sia per la sicurezza. L'ETH stesso è un componente fondamentale di Ethereum piuttosto che un contratto intelligente. L'incorporazione di altre valute aumenterebbe significativamente la complessità e diminuirebbe la sicurezza dello staking. -## Ethereum è la sola blockchain di proof-of-stake? {#is-ethereum-the-only-pos-blockchain} +## Ethereum è l'unica blockchain con prova di stake? {#is-ethereum-the-only-pos-blockchain} -No, esistono diverse blockchain di proof-of-stake. Nessuna è identica a Ethereum; il meccanismo di proof-of-stake di Ethereum è unico. +No, ci sono diverse blockchain con prova di stake. Nessuna è identica a Ethereum; il meccanismo di prova di stake di Ethereum è unico. -## In cosa consiste La Fusione? {#what-is-the-merge} +## Cos'è Il Merge? {#what-is-the-merge} -La Fusione è stata il momento in cui Ethereum ha spento il suo meccanismo di consenso basato sul proof-of-work ed è passato a quello di proof-of-stake. La Fusione si è verificata il 15 settembre 2022. +Il Merge è stato il momento in cui Ethereum ha disattivato il suo meccanismo di consenso basato sulla prova di lavoro e ha attivato il suo meccanismo di consenso basato sulla prova di stake. Il Merge è avvenuto il 15 settembre 2022. -[Maggiori informazioni sulla fusione](/roadmap/merge) +[Maggiori informazioni su Il Merge](/roadmap/merge) -## Cosa sono vitalità e sicurezza? {#what-are-liveness-and-safety} +## Cosa sono la vitalità (liveness) e la sicurezza (safety)? {#what-are-liveness-and-safety} -Vitalità e sicurezza sono le due preoccupazioni fondamentali in materia di sicurezza per una blockchain. La vitalità è la disponibilità di una catena che si finalizza. Se la catena smette di finalizzarsi o gli utenti non possono accedervi facilmente, si parla di perdita di vitalità. Anche un costo d'accesso estremamente elevato potrebbe essere considerato una perdita di vitalità. La sicurezza si riferisce alla difficoltà di attacco della catena, ossia finalizzare punti di controllo in conflitto. +La vitalità (liveness) e la sicurezza (safety) sono le due preoccupazioni fondamentali per la sicurezza di una blockchain. La vitalità è la disponibilità di una catena che finalizza. Se la catena smette di finalizzare o gli utenti non sono in grado di accedervi facilmente, si tratta di fallimenti della vitalità. Anche un costo di accesso estremamente elevato potrebbe essere considerato un fallimento della vitalità. La sicurezza si riferisce a quanto sia difficile attaccare la catena, ad esempio finalizzare checkpoint in conflitto. -[Leggi di più nel documento di Casper](https://arxiv.org/pdf/1710.09437.pdf) +[Leggi di più nel documento su Casper](https://arxiv.org/pdf/1710.09437.pdf) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/gasper/index.md index ce62e76c099..e7e81c77283 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/gasper/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/gasper/index.md @@ -1,52 +1,52 @@ --- title: Gasper -description: Una spiegazione del meccanismo di proof-of-stake di Gasper. +description: Una spiegazione del meccanismo di prova di stake Gasper. lang: it --- -Gasper è una combinazione di Casper the Friendly Finality Gadget (Casper-FFG) e dell'algoritmo di scelta della biforcazione LMD-GHOST. Insieme, questi componenti formano il meccanismo di consenso che protegge l'Ethereum proof-of-stake. Casper è il meccanismo che aggiorna certi blocchi a "finalizzati", così che i nuovi entranti nella rete possano essere certi che stanno sincronizzando la catena canonica. L'algoritmo di scelta della biforcazione usa i voti accumulati per assicurare che al sorgere di biforcazioni nella blockchain, i nodi possano facilmente selezionare quella corretta. +Gasper è una combinazione di Casper the Friendly Finality Gadget (Casper-FFG) e dell'algoritmo di scelta della biforcazione LMD-GHOST. Insieme, questi componenti formano il meccanismo di consenso che protegge Ethereum basato sulla prova di stake. Casper è il meccanismo che aggiorna determinati blocchi a "finalizzati" in modo che i nuovi entranti nella rete possano essere sicuri di sincronizzare la catena canonica. L'algoritmo di scelta della biforcazione utilizza i voti accumulati per garantire che i nodi possano selezionare facilmente quella corretta quando si verificano biforcazioni nella blockchain. -**Nota** che la definizione originale di Casper-FFG è stata lievemente aggiornata per essere inclusa in Gasper. In questa pagina consideriamo la versione aggiornata. +**Nota** che la definizione originale di Casper-FFG è stata leggermente aggiornata per l'inclusione in Gasper. In questa pagina consideriamo la versione aggiornata. ## Prerequisiti -Per comprendere questo materiale, è necessario leggere la pagina introduttiva sul [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). +Per comprendere questo materiale è necessario leggere la pagina introduttiva sulla [prova di stake](/developers/docs/consensus-mechanisms/pos/). ## Il ruolo di Gasper {#role-of-gasper} -Gasper si trova in cima a una blockchain di proof-of-stake in cui i nodi forniscono ether come un deposito di sicurezza, che può esser distrutto se sono pigri o disonesti nel proporre o convalidare i blocchi. Gasper è il meccanismo che definisce come i validatori sono ricompensati e puniti, decide quali blocchi accettare e rifiutare e su quale biforcazione della blockchain costruire. +Gasper si basa su una blockchain di prova di stake in cui i nodi forniscono ether come deposito di sicurezza che può essere distrutto se sono pigri o disonesti nel proporre o convalidare i blocchi. Gasper è il meccanismo che definisce come i validatori vengono ricompensati e puniti, decidono quali blocchi accettare e rifiutare e su quale biforcazione della blockchain costruire. ## Cos'è la finalità? {#what-is-finality} -La finalità è una proprietà di certi blocchi tale per cui non possono essere ripristinati, a meno che non si sia verificato un fallimento del consenso critico e che un utente malevolo non abbia distrutto almeno 1/3 dell'ether totale in staking. I blocchi finalizzati possono essere pensati come informazioni su cui la blockchain è certa. Affinché un blocco sia finalizzato, deve passare per una procedura d'aggiornamento in due passaggi: +La finalità è una proprietà di determinati blocchi che significa che non possono essere annullati a meno che non vi sia stato un fallimento critico del consenso e un utente malintenzionato abbia distrutto almeno 1/3 dell'ether totale in stake. I blocchi finalizzati possono essere pensati come informazioni di cui la blockchain è certa. Un blocco deve passare attraverso una procedura di aggiornamento in due fasi per essere finalizzato: -1. Due terzi dell'ether in staking totale deve aver votato a favore dell'inclusione di quel blocco nella catena canonica. Questa condizione porta il blocco nello stato "giustificato". È improbabile che i blocchi giustificati siano ripristinati anche se in alcune condizioni è possibile. -2. Quando un altro blocco è giustificato sopra a un blocco giustificato, questo passa allo stato "finalizzato". Finalizzare un blocco corrisponde all'impegno a includere il blocco nella catena canonica. Non può essere ripristinato a meno che un utente malevolo distrugga milioni di ether (miliardi di $USD). +1. Due terzi dell'ether totale in stake devono aver votato a favore dell'inclusione di quel blocco nella catena canonica. Questa condizione aggiorna il blocco a "giustificato". È improbabile che i blocchi giustificati vengano annullati, ma possono esserlo in determinate condizioni. +2. Quando un altro blocco è giustificato sopra un blocco giustificato, viene aggiornato a "finalizzato". Finalizzare un blocco è un impegno a includere il blocco nella catena canonica. Non può essere annullato a meno che un utente malintenzionato non distrugga milioni di ether (miliardi di dollari USA). -Questi aggiornamenti dei blocchi non si verificano in ogni slot. Al contrario sono giustificabili e finalizzabili solo i blocchi di confine di un'epoca. Questi blocchi sono noti come "punti di controllo" (checkpoint). L'aggiornamento considera coppie di punti di controllo. Per aggiornare il punto di controllo meno recente a finalizzato e il più recente a giustificato deve esistere un "collegamento di super-maggioranza" tra due punti di controllo successivi (es. due terzi dell'ether in staking totale ha votato affinché il punto di controllo B sia il discendente corretto del punto di controllo A). +Questi aggiornamenti dei blocchi non avvengono in ogni slot. Invece, solo i blocchi al confine dell'epoca possono essere giustificati e finalizzati. Questi blocchi sono noti come "checkpoint". L'aggiornamento considera coppie di checkpoint. Deve esistere un "collegamento di supermaggioranza" tra due checkpoint successivi (cioè, due terzi dell'ether totale in stake che votano che il checkpoint B è il discendente corretto del checkpoint A) per aggiornare il checkpoint meno recente a finalizzato e il blocco più recente a giustificato. -Poiché la finalità richiede un accordo di due terzi per rendere un blocco canonico, un utente malevolo non può creare una catena finalizzata alternativa senza: +Poiché la finalità richiede un accordo di due terzi sul fatto che un blocco sia canonico, un utente malintenzionato non può in alcun modo creare una catena finalizzata alternativa senza: -1. Possedere o manipolare due terzi dell'ether in staking totale. -2. Distruggere almeno un terzo dell'ether in staking totale. +1. Possedere o manipolare due terzi dell'ether totale in stake. +2. Distruggere almeno un terzo dell'ether totale in stake. -La prima condizione sorge perché per finalizzare una catena servono due terzi dell'ether in staking. La seconda sorge perché se due terzi dello stake totale ha votato in favore di entrambe le biforcazioni, allora un terzo deve aver votato su entrambe. Il doppio voto è una condizione di slashing che subirebbe la punizione massima, con la distruzione di un terzo dello stake totale. A maggio 2022, questo richiederebbe a un utente malevolo di bruciare ether per un valore di circa $10 miliardi. L'algoritmo che giustifica e finalizza i blocchi in Gasper è una forma lievemente modificata di [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf). +La prima condizione si verifica perché sono necessari due terzi dell'ether in stake per finalizzare una catena. La seconda condizione si verifica perché se due terzi dello stake totale hanno votato a favore di entrambe le biforcazioni, allora un terzo deve aver votato su entrambe. Il doppio voto è una condizione per punire che verrebbe sanzionata al massimo, e un terzo dello stake totale verrebbe distrutto. A partire da maggio 2022, ciò richiede a un utente malintenzionato di bruciare circa 10 miliardi di dollari in ether. L'algoritmo che giustifica e finalizza i blocchi in Gasper è una forma leggermente modificata di [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf). -### Incentivi e slashing {#incentives-and-slashing} +### Incentivi e Punizioni {#incentives-and-slashing} -I validatori sono ricompensati se propongono e convalidano onestamente dei blocchi. La ricompensa avviene sotto forma di Ether aggiunto al loro stake. Per contro, i validatori che sono assenti e non agiscono quando vengono invitati a farlo, perdono queste ricompense, e talvolta perdono una piccola porzione del loro stake esistente. Le sanzioni per essere offline sono comunque modeste e, nella maggior parte dei casi, ammontano al costo opportunità della mancata ricompensa. Tuttavia, è molto improbabile che alcune azioni dei validatori siano compiute accidentalmente e sono quindi indicative di qualche intento dannoso, come proporre più blocchi per lo stesso slot, attestare più blocchi per lo stesso slot o contraddire i voti del punto di controllo precedente. Si tratta di comportamenti sanzionati più duramente: lo slashing comporta la distruzione di una data parte dello stake del validatore e la sua esclusione dalla rete di validatori. Questo processo richiede 36 giorni. Al giorno 1, è prevista una sanzione iniziale di un massimo di 1 ETH. Successivamente, l'ether del validatore sanzionato "diminuisce" lentamente lungo il periodo d'uscita, ma al Giorno 18 riceve una "sanzione di correlazione", tanto maggiore quanti più validatori subiscono contemporaneamente lo slashing. La sanzione massima è rappresentata dall'intero stake. Queste ricompense e sanzioni sono pensate per incentivare i validatori onesti e disincentivare gli attacchi alla rete. +I validatori vengono ricompensati per aver proposto e convalidato onestamente i blocchi. L'ether viene dato in ricompensa e aggiunto al loro stake. D'altra parte, i validatori che sono assenti e non agiscono quando chiamati in causa perdono queste ricompense e a volte perdono una piccola porzione del loro stake esistente. Tuttavia, le penalità per essere offline sono piccole e, nella maggior parte dei casi, ammontano a costi opportunità per le ricompense perse. Tuttavia, alcune azioni dei validatori sono molto difficili da compiere accidentalmente e indicano un intento malevolo, come proporre più blocchi per lo stesso slot, attestare più blocchi per lo stesso slot o contraddire i voti dei checkpoint precedenti. Questi sono comportamenti "punibili" che vengono penalizzati più duramente: punire comporta la distruzione di una parte dello stake del validatore e la rimozione del validatore dalla rete dei validatori. Questo processo richiede 36 giorni. Il Giorno 1, c'è una penalità iniziale fino a 1 ETH. Poi l'ether del validatore punito si esaurisce lentamente durante il periodo di uscita, ma il Giorno 18, riceve una "penalità di correlazione", che è maggiore quando più validatori vengono puniti nello stesso periodo. La penalità massima è l'intero stake. Queste ricompense e penalità sono progettate per incentivare i validatori onesti e disincentivare gli attacchi alla rete. ### Perdita per inattività {#inactivity-leak} -Oltre alla sicurezza, Gasper fornisce anche una "vitalità plausibile". Questa condizione prevede che finché due terzi dell'ether in staking totale vota onestamente e segue il protocollo, la catena potrà finalizzare, indipendentemente da qualsiasi altra attività (come attacchi, problemi di latenza o slashing). In altre parole, un terzo dell'ether in staking totale deve essere in qualche modo compromesso per impedire alla catena di finalizzare. In Gasper, esiste una linea di difesa aggiuntiva contro la perdita di vitalità, nota come "perdita per inattività". Questo meccanismo si attiva quando la catena non è riuscita a finalizzare per più di quattro epoche. I validatori che non stanno attestando attivamente alla catena di maggioranza subiscono una perdita graduale del loro stake finché la maggioranza non ottiene nuovamente i due terzi dello stake totale, garantendo così che la perdita di vitalità sia solo temporanea. +Oltre alla sicurezza, Gasper fornisce anche una "vivacità plausibile" (plausible liveness). Questa è la condizione per cui, finché due terzi dell'ether totale in stake votano onestamente e seguono il protocollo, la catena sarà in grado di finalizzare indipendentemente da qualsiasi altra attività (come attacchi, problemi di latenza o punizioni). Detto in un altro modo, un terzo dell'ether totale in stake deve essere in qualche modo compromesso per impedire alla catena di finalizzare. In Gasper, c'è un'ulteriore linea di difesa contro un fallimento della vivacità, nota come "perdita per inattività" (inactivity leak). Questo meccanismo si attiva quando la catena non è riuscita a finalizzare per più di quattro epoche. Ai validatori che non stanno attestando attivamente la catena di maggioranza viene gradualmente prosciugato il loro stake finché la maggioranza non riacquista i due terzi dello stake totale, garantendo che i fallimenti della vivacità siano solo temporanei. ### Scelta della biforcazione {#fork-choice} -La definizione originale di Casper-FFG prevedeva un algoritmo di scelta della biforcazione che imponeva la regola: `segui la catena contenente il punto di controllo giustificato avente l'altezza maggiore`, dove l'altezza è definita come la massima distanza dal blocco di genesi. In Gasper, la regola di scelta della biforcazione originale è deprecata in favore di un algoritmo più sofisticato, denominato LMD-GHOST. È importante rendersi conto che in condizioni normali non è necessaria una regola di scelta della biforcazione: esiste un propositore del singolo blocco per ogni slot e i validatori onesti lo attestano. Serve un algoritmo di scelta della biforcazione solo quando vi è una grande asincronia della rete o quando un propositore del blocco disonesto ha generato confusione. Tuttavia, quando si presentano questi casi, l'algoritmo di scelta della biforcazione è un’importante difesa che protegge la catena corretta. +La definizione originale di Casper-FFG includeva un algoritmo di scelta della biforcazione che imponeva la regola: `segui la catena contenente il checkpoint giustificato che ha l'altezza maggiore` dove l'altezza è definita come la distanza maggiore dal blocco genesi. In Gasper, la regola originale di scelta della biforcazione è deprecata a favore di un algoritmo più sofisticato chiamato LMD-GHOST. È importante rendersi conto che in condizioni normali, una regola di scelta della biforcazione non è necessaria: c'è un singolo proponente del blocco per ogni slot e i validatori onesti lo attestano. È solo in casi di grande asincronia della rete o quando un proponente del blocco disonesto ha equivocato che è richiesto un algoritmo di scelta della biforcazione. Tuttavia, quando si verificano questi casi, l'algoritmo di scelta della biforcazione è una difesa critica che protegge la catena corretta. -LMD-GHOST sta per "latest message-driven greedy heaviest observed sub-tree". Si tratta di un termine molto gergale per definire un algoritmo che seleziona la biforcazione che presenta il peso di attestazioni accumulate più elevato rispetto a quello canonico (greedy heaviest subtree) e che se vengono ricevuti più messaggi da un validatore, viene considerato solo l’ultimo (latest-message driveno). Prima di aggiungere il blocco più pesante alla sua catena canonica, ogni validatore valuta ogni blocco usando questa regola. +LMD-GHOST sta per "latest message-driven greedy heaviest observed sub-tree" (sotto-albero osservato più pesante avido guidato dall'ultimo messaggio). Questo è un modo pieno di gergo per definire un algoritmo che seleziona la biforcazione con il maggior peso accumulato di attestazioni come quella canonica (sotto-albero più pesante avido) e che se vengono ricevuti più messaggi da un validatore, viene considerato solo l'ultimo (guidato dall'ultimo messaggio). Prima di aggiungere il blocco più pesante alla sua catena canonica, ogni validatore valuta ciascun blocco utilizzando questa regola. ## Letture consigliate {#further-reading} -- [Gasper: combinazione di GHOST e Casper](https://arxiv.org/pdf/2003.03052.pdf) -- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) +- [Gasper: Combinare GHOST e Casper](https://arxiv.org/pdf/2003.03052.pdf) +- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md index 08309f3c77c..f39c5028186 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md @@ -1,99 +1,99 @@ --- -title: Proof-of-stake (PoS) -description: Spiegazione del protocollo di consenso proof-of-stake e del suo ruolo in Ethereum. +title: Prova di stake (PoS) +description: Una spiegazione del protocollo di consenso della prova di stake e del suo ruolo in Ethereum. lang: it --- -La Proof of Stake (PoS) è alla base del [meccanismo di consenso](/developers/docs/consensus-mechanisms/) di Ethereum. Ethereum ha attivato il suo meccanismo di Proof of Stake nel 2022 perché è più sicuro, consuma meno energia ed è migliore per implementare nuove soluzioni di ridimensionamento rispetto all'architettura di [Proof of Work](/developers/docs/consensus-mechanisms/pow) precedente. +La prova di stake (PoS) è alla base del [meccanismo di consenso](/developers/docs/consensus-mechanisms/) di Ethereum. Ethereum ha attivato il suo meccanismo di prova di stake nel 2022 perché è più sicuro, meno dispendioso in termini di energia e migliore per implementare nuove soluzioni di scalabilità rispetto alla precedente architettura di [prova di lavoro](/developers/docs/consensus-mechanisms/pow). ## Prerequisiti {#prerequisites} -Per capire meglio questa pagina ti consigliamo di leggere i [meccanismi di consenso](/developers/docs/consensus-mechanisms/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima i [meccanismi di consenso](/developers/docs/consensus-mechanisms/). -## Cos'è la proof-of-stake (PoS)? {#what-is-pos} +## Cos'è la prova di stake (PoS)? {#what-is-pos} -Proof-of-stake è un modo per dimostrare che i validatori hanno messo qualcosa di valore nella rete che può essere distrutto se agiscono in maniera disonesta. Nel proof-of-stake di Ethereum, i validatori mettono esplicitamente in stakaing il capitale sotto forma di ETH, in un contratto intelligente su Ethereum. Il validatore è poi responsabile di verificare che i nuovi blocchi propagati sulla rete siano validi e, occasionalmente, di creare e propagare nuovi blocchi. Se prova a frodare la rete (ad esempio proponendo blocchi multipli quando dovrebbe inviarne uno o inviando attestazioni conflittuali) alcuni o tutti i suoi ETH in staking possono venire distrutti. +La prova di stake è un modo per dimostrare che i validatori hanno inserito qualcosa di valore nella rete che può essere distrutto se agiscono in modo disonesto. Nella prova di stake di [Ethereum](/), i validatori mettono esplicitamente in stake del capitale sotto forma di ETH in un contratto intelligente su Ethereum. Il validatore è quindi responsabile di verificare che i nuovi blocchi propagati sulla rete siano validi e, occasionalmente, di creare e propagare nuovi blocchi in prima persona. Se cercano di frodare la rete (ad esempio proponendo più blocchi quando dovrebbero inviarne uno o inviando attestazioni in conflitto), parte o tutti i loro ETH in stake possono essere distrutti. ## Validatori {#validators} -Per partecipare come validatore, un utente deve depositare 32 ETH nel contratto di deposito ed eseguire tre software separati: un client di esecuzione, un client di consenso e un client del validatore. Depositando i propri ETH, l'utente si unisce alla coda di attivazione che limita la frequenza di partecipazione alla rete dei nuovi validatori. Una volta attivati, i validatori ricevono nuovi blocchi dai pari sulla rete di Ethereum. Le transazioni inviate nel blocco sono eseguite nuovamente per controllare che i cambiamenti dello stato di Ethereum proposti siano validi e che la firma del blocco sia controllata. Il validatore invia poi nella rete un voto (detto attestazione) a favore di quel blocco. +Per partecipare come validatore, un utente deve depositare 32 ETH nel contratto di deposito ed eseguire tre software separati: un client di esecuzione, un client di consenso e un client validatore. Depositando i propri ETH, l'utente si unisce a una coda di attivazione che limita il tasso di nuovi validatori che si uniscono alla rete. Una volta attivati, i validatori ricevono nuovi blocchi dai peer sulla rete Ethereum. Le transazioni consegnate nel blocco vengono rieseguite per verificare che le modifiche proposte allo stato di Ethereum siano valide e viene controllata la firma del blocco. Il validatore invia quindi un voto (chiamato attestazione) a favore di quel blocco attraverso la rete. -Se con il proof-of-work la tempistica dei blocchi è determinata dalla difficoltà di mining, nel proof-of-stake il ritmo invece è fisso. Il tempo in Ethereum di proof-of-stake è diviso in slot (12 secondi) ed epoche (32 slot). In ogni slot viene selezionato casualmente un validatore come propositore di blocchi. Questo validatore è responsabile della creazione di un nuovo blocco e del suo invio ad altri nodi sulla rete. Inoltre, in ogni slot, è scelto casualmente un comitato di validatori, i cui voti sono usati per determinare la validità del blocco proposto. Dividere le impostazioni del validatore in comitati è importante per mantenere gestibile il carico della rete. I comitati suddividono la serie di validatori affinché ogni validatore attivo attesti in ogni epoca ma non in ogni slot. +Mentre con la prova di lavoro, la tempistica dei blocchi è determinata dalla difficoltà di mining, nella prova di stake, il tempo è fisso. Il tempo in Ethereum con prova di stake è diviso in slot (12 secondi) ed epoche (32 slot). Un validatore viene selezionato casualmente per essere un proponente del blocco in ogni slot. Questo validatore è responsabile della creazione di un nuovo blocco e del suo invio agli altri nodi sulla rete. Inoltre, in ogni slot, viene scelto casualmente un comitato di validatori, i cui voti vengono utilizzati per determinare la validità del blocco proposto. Dividere l'insieme dei validatori in comitati è importante per mantenere gestibile il carico della rete. I comitati dividono l'insieme dei validatori in modo che ogni validatore attivo attesti in ogni epoca, ma non in ogni slot. -## Come viene eseguita una transazione nel PoS di Ethereum {#transaction-execution-ethereum-pos} +## Come viene eseguita una transazione nella PoS di Ethereum {#transaction-execution-ethereum-pos} -Di seguito è fornita una spiegazione completa dell'esecuzione di una transazione nel proof-of-stake di Ethereum. +Di seguito viene fornita una spiegazione end-to-end di come viene eseguita una transazione nella prova di stake di Ethereum. -1. Un utente crea e firma una [transazione](/developers/docs/transactions/) con la propria chiave privata. Questo processo è solitamente gestito da un portafoglio o da una libreria come [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/), ecc., ma in sostanza l'utente sta facendo una richiesta a un nodo utilizzando l'[API JSON-RPC](/developers/docs/apis/json-rpc/) di Ethereum. L'utente definisce l'importo di carburante che è disposto a pagare come mancia a un validatore per incoraggiarlo a includere la transazione in un blocco. Le [mance](/developers/docs/gas/#priority-fee) sono pagate al validatore bruciando la [commissione di base](/developers/docs/gas/#base-fee). -2. La transazione è inviata a un [client di esecuzione](/developers/docs/nodes-and-clients/#execution-client) di Ethereum che ne verifica la validità. Ciò significa assicurarsi che il mittente abbia abbastanza ETH per realizzare la transazione e che l'abbia firmata con la chiave corretta. -3. Se la transazione è valida, il client di esecuzione la aggiunge al proprio mempool locale (elenco di transazioni in sospeso) e inoltre la trasmette agli altri nodi sulla rete di gossip del livello di esecuzione. Quando gli altri nodi ricevono la transazione, la aggiungono anche al proprio mempool locale. Gli utenti avanzati potrebbero astenersi dalla trasmissione della propria transazione, inoltrandola piuttosto a costruttori di blocchi specializzati, come [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Ciò consente loro di organizzare le transazioni nei blocchi successivi per il massimo profitto ([MEV](/developers/docs/mev/#mev-extraction)). -4. Uno dei nodi del validatore sulla rete è il propositore del blocco per lo slot corrente, selezionato precedentemente in modo pseudo-casuale utilizzando RANDAO. Questo nodo è responsabile per la costruzione e trasmissione del blocco successivo da aggiungere alla blockchain di Ethereum e di aggiornare lo stato globale. Il nodo si compone di tre parti: un client di esecuzione, un client di consenso e un client di validazione. Il client di esecuzione raggruppa le transazioni dal mempool locale in un "payload di esecuzione" e le esegue localmente per generare un cambiamento di stato. Questa informazione è passata al client di consenso, dove il payload di esecuzione è impacchettato come parte di un "blocco Beacon" che contiene anche informazioni su ricompense, sanzioni, tagli, attestazioni, ecc., che consentono alla rete di concordare sulla sequenza di blocchi alla testa della catena. La comunicazione tra i client di esecuzione e di consenso è descritta più nel dettaglio in [Connettere i client di consenso e di esecuzione](/developers/docs/networking-layer/#connecting-clients). -5. Gli altri nodi ricevono il nuovo blocco Beacon sulla rete di gossip del livello di consenso. Lo passano al proprio client di esecuzione, dove le transazioni sono rieseguite localmente per garantire che il cambiamento di stato proposto sia valido. Il client di validazione, poi, attesta che il blocco è valido e che è il blocco successivo logico nella sua visione della catena (ossia che si basa sulla catena con il maggior peso di attestazioni, come definito dalle [regole di scelta della diramazione](/developers/docs/consensus-mechanisms/pos/#fork-choice)). Il blocco è aggiunto al database locale in ogni nodo che lo attesta. -6. La transazione è considerabile "finalizzata" se è diventata parte di una catena con un "collegamento di super-maggioranza" tra due punti di controllo. I punti di controllo si trovano all'inizio di ogni epoca ed esistono per rendere conto del fatto che solo un sottoinsieme di validatori attivi attesta in ogni slot, ma tutti i validatori attivi attestano attraverso ogni epoca. Perciò è solo tra epoche che si può dimostrare un "collegamento di super-maggioranza" (è qui che il 66% degli ETH totali in staking sulla rete concorda su due punti di controllo). +1. Un utente crea e firma una [transazione](/developers/docs/transactions/) con la propria chiave privata. Questo è solitamente gestito da un portafoglio o da una libreria come [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) ecc., ma dietro le quinte l'utente sta effettuando una richiesta a un nodo utilizzando l'[API JSON-RPC](/developers/docs/apis/json-rpc/) di Ethereum. L'utente definisce la quantità di gas che è disposto a pagare come mancia a un validatore per incoraggiarlo a includere la transazione in un blocco. Le [mance](/developers/docs/gas/#priority-fee) vengono pagate al validatore mentre la [commissione di base](/developers/docs/gas/#base-fee) viene bruciata. +2. La transazione viene inviata a un [client di esecuzione](/developers/docs/nodes-and-clients/#execution-client) di Ethereum che ne verifica la validità. Ciò significa assicurarsi che il mittente abbia abbastanza ETH per completare la transazione e che l'abbia firmata con la chiave corretta. +3. Se la transazione è valida, il client di esecuzione la aggiunge alla sua mempool locale (elenco delle transazioni in sospeso) e la trasmette anche ad altri nodi sulla rete gossip del livello di esecuzione. Quando altri nodi vengono a conoscenza della transazione, la aggiungono anche alla loro mempool locale. Gli utenti avanzati potrebbero astenersi dal trasmettere la loro transazione e inoltrarla invece a costruttori di blocchi specializzati come [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Questo consente loro di organizzare le transazioni nei blocchi imminenti per il massimo profitto ([MEV](/developers/docs/mev/#mev-extraction)). +4. Uno dei nodi validatori sulla rete è il proponente del blocco per lo slot corrente, essendo stato precedentemente selezionato in modo pseudo-casuale utilizzando RANDAO. Questo nodo è responsabile della costruzione e della trasmissione del blocco successivo da aggiungere alla blockchain di Ethereum e dell'aggiornamento dello stato globale. Il nodo è composto da tre parti: un client di esecuzione, un client di consenso e un client validatore. Il client di esecuzione raggruppa le transazioni dalla mempool locale in un "payload di esecuzione" e le esegue localmente per generare un cambiamento di stato. Queste informazioni vengono passate al client di consenso dove il payload di esecuzione viene avvolto come parte di un "blocco beacon" che contiene anche informazioni su ricompense, penalità, punizioni, attestazioni ecc. che consentono alla rete di concordare sulla sequenza di blocchi in cima alla catena. La comunicazione tra i client di esecuzione e di consenso è descritta in modo più dettagliato in [Connettere i client di consenso e di esecuzione](/developers/docs/networking-layer/#connecting-clients). +5. Altri nodi ricevono il nuovo blocco beacon sulla rete gossip del livello di consenso. Lo passano al loro client di esecuzione dove le transazioni vengono rieseguite localmente per garantire che il cambiamento di stato proposto sia valido. Il client validatore attesta quindi che il blocco è valido ed è il blocco logico successivo nella loro visione della catena (il che significa che si basa sulla catena con il maggior peso di attestazioni come definito nelle [regole di scelta della biforcazione](/developers/docs/consensus-mechanisms/pos/#fork-choice)). Il blocco viene aggiunto al database locale in ogni nodo che lo attesta. +6. La transazione può essere considerata "finalizzata" se è diventata parte di una catena con un "collegamento di supermaggioranza" tra due checkpoint. I checkpoint si verificano all'inizio di ogni epoca ed esistono per tenere conto del fatto che solo un sottoinsieme di validatori attivi attesta in ogni slot, ma tutti i validatori attivi attestano in ogni epoca. Pertanto, è solo tra le epoche che può essere dimostrato un "collegamento di supermaggioranza" (questo avviene quando il 66% degli ETH totali in stake sulla rete concorda su due checkpoint). -Ulteriori dettagli sulla finalità si possono trovare di seguito. +Maggiori dettagli sulla finalità possono essere trovati di seguito. ## Finalità {#finality} -Una transazione ha "finalità" nelle reti distribuite quando fa parte di un blocco che non può cambiare senza bruciare un consistente quantitativo di ETH. Su Ethereum di proof-of-stake, questo è gestito usando i blocchi di "punto di controllo". Il primo blocco in ogni epoca è un punto di controllo. I validatori votano per le coppie di punti di controllo che considerano valide. Se una coppia di punti di controllo attrae voti che rappresentano almeno due terzi degli ETH in staking totali, i punti di controllo sono aggiornati. Il più recente dei due (target), diventa "giustificato". Il primo dei due è già giustificato perché era il "target" nell'epoca precedente. Ora è aggiornato a "finalizzato". +Una transazione ha "finalità" nelle reti distribuite quando fa parte di un blocco che non può cambiare senza che una grande quantità di ETH venga bruciata. Sulla prova di stake di Ethereum, questo viene gestito utilizzando blocchi "checkpoint". Il primo blocco in ogni epoca è un checkpoint. I validatori votano per coppie di checkpoint che considerano valide. Se una coppia di checkpoint attira voti che rappresentano almeno due terzi degli ETH totali in stake, i checkpoint vengono aggiornati. Il più recente dei due (target) diventa "giustificato". Il precedente dei due è già giustificato perché era il "target" nell'epoca precedente. Ora viene aggiornato a "finalizzato". Questo processo di aggiornamento dei checkpoint è gestito da **[Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437)**. Casper-FFG è uno strumento di finalità del blocco per il consenso. Una volta che un blocco è finalizzato, non può essere annullato o modificato senza una punizione della maggioranza degli staker, rendendolo economicamente impraticabile. -Per annullare un blocco finalizzato, un utente malevolo dovrebbe impegnarsi a perdere almeno un terzo dell'offerta totale di ETH in staking. Il motivo esatto di ciò è spiegato in questo [post del blog dell'Ethereum Foundation](https://blog.ethereum.org/2016/05/09/on-settlement-finality). Poiché la finalità richiede una maggioranza di due terzi, un utente malevolo potrebbe impedire alla rete di raggiungere la finalità votando con un terzo dello stake totale. Esiste un meccanismo per difendersi da questa eventualità: la [fuga d'inattività](https://eth2book.info/bellatrix/part2/incentives/inactivity). Questa si attiva ogni volta che la catena non riesce a finalizzare per più di quattro epoche. La fuga d'inattività disperde gli ETH messi in staking dai validatori che votano contro la maggioranza, consentendo a quest'ultima di ottenere nuovamente la maggioranza di due terzi e di finalizzare la catena. +Per annullare un blocco finalizzato, un utente malintenzionato si impegnerebbe a perdere almeno un terzo dell'offerta totale di ETH in stake. Il motivo esatto di ciò è spiegato in questo [post sul blog della Ethereum Foundation](https://blog.ethereum.org/2016/05/09/on-settlement-finality). Poiché la finalità richiede una maggioranza di due terzi, un utente malintenzionato potrebbe impedire alla rete di raggiungere la finalità votando con un terzo dello stake totale. Esiste un meccanismo per difendersi da questo: la [perdita per inattività](https://eth2book.info/bellatrix/part2/incentives/inactivity). Questa si attiva ogni volta che la catena non riesce a finalizzare per più di quattro epoche. La perdita per inattività prosciuga gli ETH in stake dai validatori che votano contro la maggioranza, consentendo alla maggioranza di riconquistare una maggioranza di due terzi e finalizzare la catena. -## Sicurezza cripto-economica {#crypto-economic-security} +## Sicurezza criptoeconomica {#crypto-economic-security} -Gestire un validatore è un impegno. Il validatore deve mantenere hardware e connettività sufficienti per partecipare alla validazione e proposta dei blocchi. In cambio, il validatore è pagato in ETH (il suo saldo di staking aumenta). D'altra parte, la partecipazione come validatore apre anche nuove strade attraverso le quali gli utenti potrebbero attaccare la rete per profitto personale o sabotaggio. Per impedirlo, i validatori perdono le ricompense in ETH se non partecipano quando richiesto e il loro stake esistente può essere distrutto se si comportano in modo disonesto. Due comportamenti principali sono considerabili disonesti: proporre diversi blocchi in uno slot singolo (equivoco) e inviare attestazioni contraddittorie. +Eseguire un validatore è un impegno. Ci si aspetta che il validatore mantenga hardware e connettività sufficienti per partecipare alla validazione e alla proposta dei blocchi. In cambio, il validatore viene pagato in ETH (il suo saldo in stake aumenta). D'altra parte, partecipare come validatore apre anche nuove strade agli utenti per attaccare la rete per guadagno personale o sabotaggio. Per evitare ciò, i validatori perdono le ricompense in ETH se non partecipano quando chiamati in causa, e il loro stake esistente può essere distrutto se si comportano in modo disonesto. Due comportamenti principali possono essere considerati disonesti: proporre più blocchi in un singolo slot (equivocare) e inviare attestazioni contraddittorie. -L'importo di ETH oggetto di slashing dipende da quanti validatori sono oggetto sanzionati in contemporanea. Questa è nota come la ["sanzione di correlazione"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) e può essere minore (circa l'1% dello stake se viene tagliato un singolo validatore) oppure può comportare la distruzione del 100% dello stake del validatore (taglio di massa). Viene imposto a metà di un periodo di uscita forzata che inizia con una sanzione immediata (fino a 1 ETH) al Giorno 1, la sanzione di correlazione al Giorno 18 e, infine, espulsione dalla rete al Giorno 36. Ogni giorno ricevono modeste sanzioni d'attestazione perché sono presenti sulla rete ma non inviano voti. Tutto questo significa che un attacco coordinato sarebbe molto costoso per un utente malevolo. +La quantità di ETH punita dipende da quanti validatori vengono puniti nello stesso periodo. Questa è nota come ["penalità di correlazione"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty), e può essere minore (\~1% dello stake per un singolo validatore punito da solo) o può comportare la distruzione del 100% dello stake del validatore (evento di punizione di massa). Viene imposta a metà di un periodo di uscita forzata che inizia con una penalità immediata (fino a 1 ETH) il Giorno 1, la penalità di correlazione il Giorno 18 e, infine, l'espulsione dalla rete il Giorno 36. Ricevono penalità di attestazione minori ogni giorno perché sono presenti sulla rete ma non inviano voti. Tutto ciò significa che un attacco coordinato sarebbe molto costoso per l'utente malintenzionato. ## Scelta della biforcazione {#fork-choice} -Quando la rete opera in modo ottimale ed onesto, c'è sempre e solo un nuovo blocco alla testa della catena e tutti i validatori attestano quel blocco. È però possibile che i validatori abbiano una visione differente della testa della catena, a causa della latenza della rete o perché un propositore di blocchi ha equivocato. I client di consenso necessitano quindi di un algoritmo per decidere quale favorire. L'algoritmo usato in Ethereum di proof-of-stake è detto [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf) e funziona identificando la biforcazione avente il peso di attestazioni maggiore nella sua storia. +Quando la rete funziona in modo ottimale e onesto, c'è sempre e solo un nuovo blocco in cima alla catena e tutti i validatori lo attestano. Tuttavia, è possibile che i validatori abbiano visioni diverse della cima della catena a causa della latenza della rete o perché un proponente del blocco ha equivocato. Pertanto, i client di consenso richiedono un algoritmo per decidere quale favorire. L'algoritmo utilizzato nella prova di stake di Ethereum si chiama [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf) e funziona identificando la biforcazione che ha il maggior peso di attestazioni nella sua storia. -## Proof-of-stake e sicurezza {#pos-and-security} +## Prova di stake e sicurezza {#pos-and-security} -La minaccia di un [attacco 51%](https://www.investopedia.com/terms/1/51-attack.asp) esiste ancora sul proof-of-stake, come già nel proof-of-work, ma è ancora più rischiosa per gli utenti malevoli. Un utente malevolo necessiterebbe del 51% degli ETH in staking. Potrebbe poi usare le proprie attestazioni per garantire che la propria biforcazione preferita sia quella con le maggiori attestazioni accumulate. Il 'peso' delle attestazioni accumulate è ciò che i client di consenso usano per determinare la catena corretta, così l'utente malevolo potrebbe rendere canonica la propria biforcazione. Tuttavia, un punto di forza del proof-of-stake rispetto al proof-of-work è che la community gode di una flessibilità nel preparare un contrattacco. Ad esempio, i validatori onesti potrebbero decidere di continuare a costruire sulla catena di minoranza e ignorare la biforcazione dell'utente malevolo, incoraggiando app, borse e pool a fare lo stesso. Potrebbero anche decidere di rimuovere forzatamente l'utente malevolo dalla rete e di distruggerne gli ETH in staking. Si tratta di difese economiche forti contro un attacco 51%. +La minaccia di un [attacco del 51%](https://www.investopedia.com/terms/1/51-attack.asp) esiste ancora sulla prova di stake come sulla prova di lavoro, ma è ancora più rischiosa per gli aggressori. Un utente malintenzionato avrebbe bisogno del 51% degli ETH in stake. Potrebbe quindi utilizzare le proprie attestazioni per assicurarsi che la sua biforcazione preferita sia quella con il maggior numero di attestazioni accumulate. Il "peso" delle attestazioni accumulate è ciò che i client di consenso utilizzano per determinare la catena corretta, quindi questo utente malintenzionato sarebbe in grado di rendere la sua biforcazione quella canonica. Tuttavia, un punto di forza della prova di stake rispetto alla prova di lavoro è che la comunità ha flessibilità nel montare un contrattacco. Ad esempio, i validatori onesti potrebbero decidere di continuare a costruire sulla catena di minoranza e ignorare la biforcazione dell'aggressore, incoraggiando app, exchange e pool a fare lo stesso. Potrebbero anche decidere di rimuovere forzatamente l'aggressore dalla rete e distruggere i suoi ETH in stake. Queste sono forti difese economiche contro un attacco del 51%. -Oltre agli attacchi del 51%, i malintenzionati potrebbero anche tentare altri tipi di attività malevole, come: +Oltre agli attacchi del 51%, i malintenzionati potrebbero anche tentare altri tipi di attività dannose, come: - attacchi a lungo raggio (sebbene il gadget di finalità neutralizzi questo vettore di attacco) -- "reorg" a corto raggio (sebbene il potenziamento del propositore e le scadenze dell'attestazione lo mitighino) -- attacchi di rimbalzo e bilanciamento (anch'essi mitigati dal potenziamento del propositore, fermo restando comunque che sono stati dimostrati solo in condizioni di rete idealizzate) -- attacchi valanga (neutralizzati dalla regola degli algoritmi di scelta della biforcazione, di considerare solo l'ultimo messaggio) +- "riorganizzazioni" a corto raggio (sebbene il potenziamento del proponente e le scadenze delle attestazioni mitighino questo problema) +- attacchi di rimbalzo e bilanciamento (anch'essi mitigati dal potenziamento del proponente, e questi attacchi sono stati comunque dimostrati solo in condizioni di rete idealizzate) +- attacchi a valanga (neutralizzati dalla regola degli algoritmi di scelta della biforcazione di considerare solo l'ultimo messaggio) -In generale è stato dimostrato che il proof-of-stake, come implementato su Ethereum, è più sicuro economicamente rispetto al proof-of-work. +Nel complesso, la prova di stake, così come è implementata su Ethereum, ha dimostrato di essere economicamente più sicura della prova di lavoro. ## Pro e contro {#pros-and-cons} -| Pro | Contro | -| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| Lo staking rende più semplice per le persone partecipare alla protezione della rete, promuovendo la decentralizzazione. Il nodo del validatore può essere eseguito su un normale laptop. I pool di staking consentono agli utenti di mettere in staking senza avere 32 ETH. | Il proof-of-stake è più giovane e meno testato rispetto al proof-of-work | -| Lo staking è più decentralizzato. Non valgono le stesse economie di scala del mining proof-of-work. | Il proof-of-stake è più complesso da implementare del proof-of-work | -| Il proof-of-stake offre una maggiore sicurezza cripto-economica rispetto al proof-of-work | Gli utenti devono far funzionare tre parti di software per partecipare al proof-of-stake di Ethereum. | -| È richiesta una minore emissione di nuovi ETH per incentivare i partecipanti alla rete | | +| Pro | Contro | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| Lo staking rende più facile per gli individui partecipare alla sicurezza della rete, promuovendo la decentralizzazione. Il nodo validatore può essere eseguito su un normale laptop. Le pool di staking consentono agli utenti di fare staking senza avere 32 ETH. | La prova di stake è più giovane e meno collaudata rispetto alla prova di lavoro | +| Lo staking è più decentralizzato. Le economie di scala non si applicano allo stesso modo in cui si applicano al mining PoW. | La prova di stake è più complessa da implementare rispetto alla prova di lavoro | +| La prova di stake offre una maggiore sicurezza criptoeconomica rispetto alla prova di lavoro | Gli utenti devono eseguire tre software per partecipare alla prova di stake di Ethereum. | +| È richiesta una minore emissione di nuovi ETH per incentivare i partecipanti alla rete | | -### Confronto con proof-of-work {#comparison-to-proof-of-work} +### Confronto con la prova di lavoro {#comparison-to-proof-of-work} -Originariamente Ethereum utilizzava il proof-of-work, ma è passata al proof-of-stake nel settembre 2022. Il PoS offre svariati vantaggi rispetto al PoW, come ad esempio: +Ethereum originariamente utilizzava la prova di lavoro, ma è passato alla prova di stake a settembre 2022. La PoS offre diversi vantaggi rispetto alla PoW, come: -- migliore efficienza energetica, non serve consumare molta energia sui calcoli di proof-of-work -- minori barriere d'accesso, requisiti hardware ridotti: non serve hardware di alto livello per avere la possibilità di creare nuovi blocchi -- minore rischio di centralizzazione: il proof-of-stake dovrebbe portare un maggior numero di nodi alla rete -- a causa del basso requisito energetico è necessaria una minore emissione di ETH per incentivare la partecipazione -- le sanzioni economiche per comportamenti scorretti rendono gli attacchi di tipo 51% più costosi per un utente malevolo, rispetto al proof-of-work -- la community può ricorrere al recupero sociale di una catena onesta, qualora un attacco 51% dovesse superare le difese cripto-economiche. +- migliore efficienza energetica: non è necessario utilizzare molta energia per i calcoli della prova di lavoro +- minori barriere all'ingresso, requisiti hardware ridotti: non c'è bisogno di hardware d'élite per avere la possibilità di creare nuovi blocchi +- ridotto rischio di centralizzazione: la prova di stake dovrebbe portare a un maggior numero di nodi che proteggono la rete +- a causa del basso fabbisogno energetico, è richiesta una minore emissione di ETH per incentivare la partecipazione +- le penalità economiche per comportamenti scorretti rendono gli attacchi in stile 51% più costosi per un utente malintenzionato rispetto alla prova di lavoro +- la comunità può ricorrere al recupero sociale di una catena onesta se un attacco del 51% dovesse superare le difese criptoeconomiche. ## Letture consigliate {#further-reading} -- [Domande Frequenti sul Proof-of-Stake](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ -- [Cos'è il Proof of Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ -- [Cos'è il Proof of Stake e perché è importante](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [Perché il Proof of Stake (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ -- [Proof of Stake: come ho imparato ad amare la soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) _Vitalik Buterin_ -- [Attacco e difesa del proof-of-stake di Ethereum](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) -- [Una filosofia di progettazione di Proof of Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ -- [Video: Vitalik Buterin spiega il proof-of-stake a Lex Fridman](https://www.youtube.com/watch?v=3yrqBG-7EVE) +- [FAQ sulla prova di stake](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Cos'è la prova di stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ +- [Cos'è la prova di stake e perché è importante](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ +- [Perché la prova di stake (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Prova di stake: come ho imparato ad amare la soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) _Vitalik Buterin_ +- [Attacco e difesa di Ethereum con prova di stake](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [Una filosofia di progettazione della prova di stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ +- [Video: Vitalik Buterin spiega la prova di stake a Lex Fridman](https://www.youtube.com/watch?v=3yrqBG-7EVE) ## Argomenti correlati {#related-topics} -- [Proof of Work](/developers/docs/consensus-mechanisms/pow/) -- [Proof of Authority](/developers/docs/consensus-mechanisms/poa/) +- [Prova di lavoro](/developers/docs/consensus-mechanisms/pow/) +- [Prova di autorità](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/keys/index.md index 67cd5a3f5da..b5656841e12 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/keys/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -1,80 +1,84 @@ --- -title: Le chiavi nel proof-of-stake di Ethereum -description: Una spiegazione delle chiavi utilizzate nel meccanismo di consenso di proof-of-stake di Ethereum +title: Chiavi nella prova di stake di Ethereum +description: Una spiegazione delle chiavi utilizzate nel meccanismo di consenso della prova di stake di Ethereum lang: it --- -Ethereum protegge le risorse degli utenti utilizzando la crittografia a chiave pubblica-privata. La chiave pubblica è utilizzata come base per un indirizzo di Ethereum, ossia, è visibile al pubblico generale ed è utilizzata come un identificativo univoco. La chiave privata (o 'segreta') dovrebbe essere accessibile soltanto al proprietario di un conto. La chiave privata è utilizzata per 'firmare' le transazioni e i dati, così che la crittografia possa provare che il detentore approva determinate azioni di una chiave privata specifica. +Ethereum protegge gli asset degli utenti utilizzando la crittografia a chiave pubblica-privata. La chiave pubblica è utilizzata come base per un indirizzo Ethereum, ovvero è visibile al pubblico generale e utilizzata come identificatore univoco. La chiave privata (o 'segreta') dovrebbe essere accessibile solo al proprietario di un account. La chiave privata è utilizzata per 'firmare' le transazioni e i dati in modo che la crittografia possa dimostrare che il titolare approva una determinata azione di una specifica chiave privata. Le chiavi di Ethereum sono generate utilizzando la [crittografia a curva ellittica](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography). -Tuttavia, quando Ethereum è passato dal [proof-of-work](/developers/docs/consensus-mechanisms/pow) al [proof-of-stake](/developers/docs/consensus-mechanisms/pos), è stato aggiunto un nuovo tipo di chiave. Le chiavi originali funzionano esattamente come prima, non ci sono state modifiche alle chiavi basate sulla curva ellittica che proteggono i conti. Tuttavia, gli utenti necessitavano di un nuovo tipo di chiave per partecipare al proof-of-stake mettendo gli ETH in staking ed eseguire i validatori. Questa esigenza è sorta dalle sfide di scalabilità associate al passaggio di molti messaggi tra grandi quantità di validatori, il che richiede un metodo crittografico facilmente aggregabile per ridurre la quantità di comunicazioni necessarie perché la rete raggiunga il consenso. +Tuttavia, quando Ethereum è passato dalla [prova di lavoro](/developers/docs/consensus-mechanisms/pow) alla [prova di stake](/developers/docs/consensus-mechanisms/pos), è stato aggiunto un nuovo tipo di chiave a Ethereum. Le chiavi originali funzionano ancora esattamente come prima: non ci sono state modifiche alle chiavi basate su curve ellittiche che proteggono gli account. Tuttavia, gli utenti avevano bisogno di un nuovo tipo di chiave per partecipare alla prova di stake facendo staking di ETH ed eseguendo i validatori. Questa necessità è nata dalle sfide di scalabilità associate ai molti messaggi scambiati tra un gran numero di validatori, che richiedevano un metodo crittografico facilmente aggregabile per ridurre la quantità di comunicazione necessaria affinché la rete raggiungesse il consenso. -Questo nuovo tipo di chiave utilizza lo [schema di firma **Boneh-Lynn-Shacham (BLS)**](https://wikipedia.org/wiki/BLS_digital_signature). BLS consente un'aggregazione molto efficiente delle firme, ma consente anche di sottoporre a ingegneria inversa le chiavi dei singoli validatori aggregati ed è ideale per gestire le azioni tra validatori. +Questo nuovo tipo di chiave utilizza lo [schema di firma **Boneh-Lynn-Shacham (BLS)**](https://wikipedia.org/wiki/BLS_digital_signature). BLS consente un'aggregazione molto efficiente delle firme, ma permette anche il reverse engineering delle chiavi aggregate dei singoli validatori ed è ideale per gestire le azioni tra i validatori. ## I due tipi di chiavi del validatore {#two-types-of-keys} -Prima del passaggio al proof-of-stake, gli utenti di Ethereum avevano soltanto una chiave privata basata sulla curva ellittica per accedere ai propri fondi. Con l'introduzione del proof-of-stake, gli utenti che desideravano essere staker in autonomia necessitavano anche di una **chiave del validatore** e di una **chiave di prelievo**. +Prima del passaggio alla prova di stake, gli utenti di Ethereum avevano solo una singola chiave privata basata su curve ellittiche per accedere ai propri fondi. Con l'introduzione della prova di stake, gli utenti che desideravano essere staker solitari richiedevano anche una **chiave del validatore** e una **chiave di prelievo**. ### La chiave del validatore {#validator-key} -La chiave di firma del validatore consiste in due elementi: +La chiave di firma del validatore è composta da due elementi: - Chiave **privata** del validatore - Chiave **pubblica** del validatore -Lo scopo della chiave privata del validatore è firmare le operazioni sulla catena, quali proposte e attestazioni dei blocchi. Per questo, queste chiavi devono essere tenute in un portafoglio "caldo". +Lo scopo della chiave privata del validatore è firmare le operazioni on-chain come le proposte di blocco e le attestazioni. Per questo motivo, queste chiavi devono essere conservate in un portafoglio caldo. -Questa flessibilità ha il vantaggio di spostare molto rapidamente le chiavi di firma del validatore da un dispositivo a un altro, però se vengono perse o rubate un ladro potrebbe **agire malevolmente** in alcuni modi: +Questa flessibilità ha il vantaggio di spostare le chiavi di firma del validatore molto rapidamente da un dispositivo all'altro; tuttavia, se vengono perse o rubate, un ladro potrebbe essere in grado di **agire in modo malevolo** in alcuni modi: -- Far tagliare il validatore: - - Facendo il propositore e firmando due blocchi Beacon differenti per lo stesso slot - - Facendo l'attestatore e firmando un'attestazione che ne "circonda" un'altra - - Facendo l'attestatore e firmando due attestazioni differenti aventi la stessa destinazione -- Forzare un'uscita volontaria, che impedisce al validatore di mettere in staking e concede l'accesso al suo saldo di ETH al proprietario della chiave di prelievo +- Far punire il validatore: + - Essendo un proponente del blocco e firmando due blocchi della beacon chain diversi per lo stesso slot + - Essendo un attestatore e firmando un'attestazione che ne "circonda" un'altra + - Essendo un attestatore e firmando due attestazioni diverse con lo stesso bersaglio +- Forzare un'uscita volontaria, che impedisce al validatore di fare staking e concede l'accesso al suo saldo in ETH al proprietario della chiave di prelievo -La **chiave pubblica del validatore** è inclusa nei dati della transazione quando un utente deposita gli ETH al contratto di deposito di staking. Questi sono noti come _dati di deposito_ e consentono a Ethereum di identificare il validatore. +La **chiave pubblica del validatore** è inclusa nei dati della transazione quando un utente deposita ETH nel contratto di deposito per lo staking. Questi sono noti come _dati di deposito_ e consentono a Ethereum di identificare il validatore. ### Credenziali di prelievo {#withdrawal-credentials} -Ogni validatore ha una proprietà nota come _credenziali di prelievo_. Questo campo di 32 byte inizia con uno `0x00`, che rappresenta le credenziali di prelievo BLS, o uno `0x01`, che rappresenta le credenziali che puntano a un indirizzo di esecuzione. +Ogni validatore ha una proprietà nota come _credenziali di prelievo_. Il primo byte di questo campo a 32 byte identifica il tipo di account: `0x00` rappresenta le credenziali BLS originali (pre-Shapella, non prelevabili), `0x01` rappresenta le credenziali legacy che puntano a un indirizzo di esecuzione e `0x02` rappresenta il moderno tipo di credenziale composta. -I validatori con le chiavi BLS `0x00` devono aggiornare tali credenziali affinché puntino a un indirizzo di esecuzione per poter attivare i pagamenti del saldo in eccesso o il prelievo completo dallo staking. Ciò può essere fatto fornendo un indirizzo di esecuzione nei dati di deposito durante la generazione iniziale della chiave, _O_ utilizzando la chiave di prelievo in un momento successivo per firmare e trasmettere un messaggio `BLSToExecutionChange`. +I validatori con chiavi BLS `0x00` devono aggiornare queste credenziali per puntare a un indirizzo di esecuzione al fine di attivare i pagamenti del saldo in eccesso o il prelievo completo dallo staking. Questo può essere fatto fornendo un indirizzo di esecuzione nei dati di deposito durante la generazione iniziale della chiave, _OPPURE_ utilizzando la chiave di prelievo in un momento successivo per firmare e trasmettere un messaggio `BLSToExecutionChange`. + +[Maggiori informazioni sulle credenziali di prelievo del validatore](/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/) ### La chiave di prelievo {#withdrawal-key} -La chiave di prelievo sarà necessaria per aggiornare le credenziali di prelievo affinché puntino a un indirizzo di esecuzione, se non impostato durante il deposito iniziale. Questo consentirà di iniziare a elaborare i pagamenti del saldo in eccesso, nonché di prelevare interamente i propri ETH in staking. +La chiave di prelievo sarà necessaria per aggiornare le credenziali di prelievo in modo che puntino a un indirizzo di esecuzione, se non impostato durante il deposito iniziale. Ciò consentirà di iniziare a elaborare i pagamenti del saldo in eccesso e permetterà inoltre agli utenti di prelevare completamente i propri ETH in staking. -Proprio come le chiavi del validatore, le chiavi di prelievo consistono in due componenti: +Proprio come le chiavi del validatore, anche le chiavi di prelievo sono composte da due componenti: -- Chiave di prelievo **privata** -- Chiave di prelievo **pubblica** +- Chiave **privata** di prelievo +- Chiave **pubblica** di prelievo -Perdere questa chiave prima di aggiornare le credenziali di prelievo al tipo `0x01` significa perdere l'accesso al saldo del validatore. Il validatore può ancora firmare le attestazioni e i blocchi poiché queste azioni richiedono la chiave privata del validatore, tuttavia vi è poco o nessun incentivo se le chiavi di prelievo vengono perse. +Perdere questa chiave prima di aggiornare le credenziali di prelievo al tipo `0x01` significa perdere l'accesso al saldo del validatore. Il validatore può ancora firmare attestazioni e blocchi poiché queste azioni richiedono la chiave privata del validatore, tuttavia c'è poco o nessun incentivo se le chiavi di prelievo vengono perse. -Separare le chiavi del validatore dalle chiavi del conto di Ethereum consente a più validatori di essere eseguiti da un singolo utente. +Separare le chiavi del validatore dalle chiavi dell'account Ethereum consente a un singolo utente di eseguire più validatori. ![schema della chiave del validatore](validator-key-schematic.png) -## Derivare le chiavi da una frase di seed {#deriving-keys-from-seed} +**Nota**: Uscire dai compiti di staking e prelevare il saldo di un validatore richiede attualmente la firma di un [messaggio di uscita volontaria (VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1) con la chiave del validatore. Tuttavia, l'[EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) è una proposta che consentirà a un utente di innescare l'uscita di un validatore e prelevare il suo saldo firmando messaggi di uscita con la chiave di prelievo in futuro. Ciò ridurrà le assunzioni di fiducia consentendo agli staker che delegano ETH ai [fornitori di staking-as-a-service](/staking/saas/#what-is-staking-as-a-service) di mantenere il controllo dei propri fondi. + +## Derivare le chiavi da una frase di recupero {#deriving-keys-from-seed} -Se ogni 32 ETH in staking richiedessero una nuova serie di 2 chiavi completamente indipendenti, la gestione delle chiavi diverrebbe rapidamente scomoda, specialmente per gli utenti che eseguono più validatori. Invece, più chiavi del validatore sono derivabili da un'unica frase segreta comune e memorizzare tale singola frase segreta consente l'accesso a più chiavi del validatore. +Se ogni 32 ETH in staking richiedesse un nuovo set di 2 chiavi completamente indipendenti, la gestione delle chiavi diventerebbe rapidamente ingestibile, specialmente per gli utenti che eseguono più validatori. Invece, più chiavi del validatore possono essere derivate da un singolo segreto comune e la memorizzazione di quel singolo segreto consente l'accesso a più chiavi del validatore. -Le [frasi mnemoniche](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) e i percorsi sono funzionalità prominenti che gli utenti incontrano spesso quando [accedono](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) ai propri portafogli. La frase mnemonica è una sequenza di parole che agisce da seed iniziale per una chiave privata. Combinandola con dei dati aggiuntivi, la frase mnemonica genera un hash noto come la 'chiave principale'. Questa può essere vista come la radice di un albero. I rami da questo albero sono derivabili utilizzando un percorso gerarchico così che i nodi figli possano esistere come combinazioni dell'hash del loro nodo genitore e del loro indice nell'albero. Leggi informazioni sugli standard [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) e [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) per la generazione di chiavi basate sulla frase mnemonica. +Le [frasi mnemoniche](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) e i percorsi sono funzionalità importanti che gli utenti incontrano spesso quando [accedono](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) ai loro portafogli. La frase mnemonica è una sequenza di parole che funge da seme iniziale per una chiave privata. Se combinata con dati aggiuntivi, la frase mnemonica genera un hash noto come 'chiave principale'. Questo può essere pensato come la radice di un albero. I rami da questa radice possono quindi essere derivati utilizzando un percorso gerarchico in modo che i nodi figli possano esistere come combinazioni dell'hash del loro nodo genitore e del loro indice nell'albero. Leggi gli standard [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) e [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) per la generazione di chiavi basata su frasi mnemoniche. -Questi percorsi hanno la seguente struttura, che risulterà familiare agli utenti che hanno interagito con portafogli hardware: +Questi percorsi hanno la seguente struttura, che sarà familiare agli utenti che hanno interagito con i portafogli hardware: ``` m/44'/60'/0'/0` ``` -Gli slash in questo percorso separano i componenti della chiave privata come segue: +Le barre in questo percorso separano i componenti della chiave privata come segue: ``` master_key / purpose / coin_type / account / change / address_index ``` -Questa logica consente agli utenti di collegare quanti più validatori possibili a una singola **frase mnemonica**, poiché la radice dell'albero può essere comune e la differenziazione può verificarsi a livello dei rami. L'utente può **derivare qualsiasi numero di chiavi** dalla frase mnemonica. +Questa logica consente agli utenti di collegare il maggior numero possibile di validatori a una singola **frase mnemonica** perché la radice dell'albero può essere comune e la differenziazione può avvenire nei rami. L'utente può **derivare un numero qualsiasi di chiavi** dalla frase mnemonica. ``` [m / 0] @@ -86,11 +90,13 @@ Questa logica consente agli utenti di collegare quanti più validatori possibili [m / 2] ``` -Ogni ramo è separato da uno `/`, quindi `m/2` significa iniziare con la chiave principale e seguire il ramo 2. Nello schema seguente, una singola frase mnemonica è utilizzata per memorizzare tre chiavi di prelievo, ognuna con due validatori associati. +Ogni ramo è separato da un `/`, quindi `m/2` significa iniziare con la chiave principale e seguire il ramo 2. Nello schema sottostante, una singola frase mnemonica viene utilizzata per memorizzare tre chiavi di prelievo, ciascuna con due validatori associati. ![logica della chiave del validatore](multiple-keys.png) -## Lettura consigliate {#further-reading} +## Letture consigliate {#further-reading} -- [Post del blog della Ethereum Foundation di Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys) -- [Generazione delle chiavi BLS12-381 dell'EIP-2333](https://eips.ethereum.org/EIPS/eip-2333) +- [Post sul blog della Ethereum Foundation di Carl Beekhuizen](https://blog.ethereum.org/2020/05/21/keys) +- [Generazione di chiavi EIP-2333 BLS12-381](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-7002: Uscite innescate dal livello di esecuzione](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge) +- [Gestione delle chiavi su larga scala](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 1899d384e07..71edb2c5cd7 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -1,69 +1,69 @@ --- -title: Proof of stake e proof of work a confronto -description: Un confronto tra il meccanismo di consenso di Ethereum basato sul proof-of-stake e sul proof-of-work +title: Prova di stake vs prova di lavoro +description: Un confronto tra il meccanismo di consenso basato sulla prova di stake e quello basato sulla prova di lavoro di Ethereum lang: it --- -Al lancio di Ethereum, il proof-of-stake necessitava ancora di molta ricerca e sviluppo prima che potesse essere affidabile per proteggere Ethereum. Il proof-of-work era un meccanismo più semplice già collaudato da Bitcoin, il che significava che gli sviluppatori principali potevano implementarlo subito per lanciare Ethereum. Ci sono voluti altri otto anni per sviluppare il proof-of-stake al punto in cui fosse possibile implementarlo. +Quando [Ethereum](/) è stato lanciato, la prova di stake necessitava ancora di molta ricerca e sviluppo prima che le si potesse affidare la sicurezza di Ethereum. La prova di lavoro era un meccanismo più semplice che era già stato collaudato da Bitcoin, il che significava che gli sviluppatori principali potevano implementarlo immediatamente per lanciare Ethereum. Ci sono voluti altri otto anni per sviluppare la prova di stake al punto in cui potesse essere implementata. -Questa pagina spiega la logica dietro il passaggio di Ethereum al proof-of-stake dal proof-of-work e i compromessi che ne derivano. +Questa pagina spiega la logica alla base del passaggio di Ethereum dalla prova di lavoro alla prova di stake e i compromessi coinvolti. ## Sicurezza {#security} -I ricercatori di Ethereum considerano il proof-of-stake più sicuro del proof-of-work. Tuttavia, è stato implementato soltanto di recente per la vera rete principale di Ethereum ed è meno collaudato del proof-of-work. Le seguenti sezioni discutono dei pro e contro del modello di sicurezza del proof-of-stake rispetto al proof-of-work. +I ricercatori di Ethereum considerano la prova di stake più sicura della prova di lavoro. Tuttavia, è stata implementata solo di recente per la vera rete principale di Ethereum ed è meno collaudata nel tempo rispetto alla prova di lavoro. Le sezioni seguenti discutono i pro e i contro del modello di sicurezza della prova di stake rispetto alla prova di lavoro. -### Costo di attacco {#cost-to-attack} +### Costo per attaccare {#cost-to-attack} -Nel proof-of-stake, i validatori devono mettere in garanzia (in "staking") almeno 32 ETH in un contratto intelligente. Ethereum può distruggere l'ether in staking, per punire i validatori che si comportano in maniera errata. Per raggiungere il consenso, almeno il 66% dell'ether in staking totale deve votare in favore di una serie particolare di blocchi. I blocchi votati dal >=66% dello stake diventano "finalizzati", a significare che non possono essere rimossi o riorganizzati. +Nella prova di stake, ai validatori è richiesto di depositare in garanzia ("stake") almeno 32 ETH in un contratto intelligente. Ethereum può distruggere gli ether in stake per punire i validatori che si comportano in modo scorretto. Per raggiungere il consenso, almeno il 66% degli ether totali in stake deve votare a favore di un particolare insieme di blocchi. I blocchi votati da >=66% dello stake diventano "finalizzati", il che significa che non possono essere rimossi o riorganizzati. -Attaccare la rete può significare impedire alla catena di finalizzarsi, o assicurare una certa organizzazione di blocchi nella catena canonica tale che avvantaggi un utente malevolo. Ciò richiede all'utente malevolo di deviare il percorso del consenso onesto, accumulando una grande quantità di ether e votando direttamente con essa, o ingannando i validatori onesti nel votare in un modo in particolare. A parte gli attacchi sofisticati e a bassa probabilità che ingannano i validatori onesti, il costo di attacco di Ethereum è il costo dello stake che un utente malevolo deve accumulare per influenzare il consenso a proprio favore. +Attaccare la rete può significare impedire alla catena di finalizzarsi o garantire una certa organizzazione dei blocchi nella catena canonica che in qualche modo avvantaggi un utente malintenzionato. Ciò richiede che l'attaccante devii il percorso del consenso onesto accumulando una grande quantità di ether e votando direttamente con essa, oppure ingannando i validatori onesti affinché votino in un modo particolare. A parte gli attacchi sofisticati e a bassa probabilità che ingannano i validatori onesti, il costo per attaccare Ethereum è il costo dello stake che un attaccante deve accumulare per influenzare il consenso a proprio favore. -Il costo minimo di attacco è il >33% dello stake totale. Un utente malevolo che possiede il >33% dello stake totale può causare un ritardo di finalità semplicemente andando offline. Questo è un problema relativamente minore per la rete, esistendo un meccanismo, noto come "perdita d'inattività", che fa trapelare lo stake dai validatori offline finché la maggioranza online non rappresenta il 66% dello stake e può nuovamente finalizzare la catena. Inoltre, è teoricamente possibile, per un utente malevolo, causare la doppia finalità con poco più del 33% dello stake totale, creando due blocchi invece di uno, quando gli viene chiesto di essere produttore di blocchi e quindi di votare due volte con tutti i validatori. Ogni biforcazione richiede che soltanto il 50% dei validatori onesti rimanenti visualizzi ogni blocco per primo, quindi, se riescono a sincronizzare i propri messaggi nel modo giusto, potrebbero riuscire a finalizzare entrambe le biforcazioni. Ciò ha una bassa probabilità di successo, ma se un utente malevolo è riuscito a causare una doppia finalità, la comunità di Ethereum dovrebbe decidere di seguire una biforcazione, nel qual caso i validatori dell'utente malevolo verrebbero necessariamente frammentati nell'altra. +Il costo di attacco più basso è >33% dello stake totale. Un attaccante che detiene >33% dello stake totale può causare un ritardo nella finalità semplicemente andando offline. Questo è un problema relativamente minore per la rete poiché esiste un meccanismo noto come "perdita per inattività" che sottrae stake ai validatori offline finché la maggioranza online non rappresenta il 66% dello stake e può finalizzare nuovamente la catena. È anche teoricamente possibile per un attaccante causare una doppia finalità con poco più del 33% dello stake totale creando due blocchi invece di uno quando gli viene chiesto di essere un produttore di blocchi e poi votando due volte con tutti i propri validatori. Ogni biforcazione richiede solo che il 50% dei restanti validatori onesti veda prima ogni blocco, quindi se riescono a tempizzare i loro messaggi nel modo giusto, potrebbero essere in grado di finalizzare entrambe le biforcazioni. Questo ha una bassa probabilità di successo, ma se un attaccante fosse in grado di causare una doppia finalità, la comunità di Ethereum dovrebbe decidere di seguire una biforcazione, nel qual caso i validatori dell'attaccante verrebbero necessariamente puniti sull'altra. -Con il >33% dello stake totale, un utente malevolo ha una possibilità di avere un effetto minore (ritardo di finalità) o più grave (doppia finalità) sulla rete di Ethereum. Con più di 14.000.000 ETH in staking sulla rete e un prezzo rappresentativo di $1000/ETH, il costo minimo per eseguire questi attacchi è di `1000 x 14.000.000 x 0,33 = $4.620.000.000`. L'utente malevolo perderebbe tale denaro tramite il frazionamento e verrebbe espulso dalla rete. Per ripetere l'attacco, dovrebbe accumulare il >33% dello stake (nuovamente) e bruciarlo (di nuovo). Ogni tentativo di attaccare la rete costerebbe >$4,6 miliardi (a $1000/ETH e 14M di ETH in staking). L'utente malevolo, inoltre, viene espulso dalla rete quando è frazionato e dovrà aggiungersi alla coda d'attivazione per unirsi nuovamente. Ciò significa che il tasso di un attacco ripetuto è limitato non soltanto alla velocità a cui l'utente malevolo può accumulare il >33% dello stake totale, ma anche al tempo necessario per far accedere tutti i validatori alla rete. Ogni volta che l'utente malevolo attacca diventa molto più povero e il resto della comunità si arricchisce grazie allo shock di approvvigionamento risultante. +Con >33% dello stake totale, un attaccante ha la possibilità di avere un effetto minore (ritardo della finalità) o più grave (doppia finalità) sulla rete Ethereum. Con oltre 14.000.000 di ETH in stake sulla rete e un prezzo rappresentativo di 1000 $/ETH, il costo minimo per montare questi attacchi è `1000 x 14,000,000 x 0.33 = $4,620,000,000`. L'attaccante perderebbe questo denaro venendo punito e verrebbe espulso dalla rete. Per attaccare di nuovo, dovrebbe accumulare >33% dello stake (di nuovo) e bruciarlo (di nuovo). Ogni tentativo di attaccare la rete costerebbe >4,6 miliardi di dollari (a 1000 $/ETH e 14 milioni di ETH in stake). L'attaccante viene anche espulso dalla rete quando viene punito, e deve unirsi a una coda di attivazione per rientrare. Ciò significa che la frequenza di un attacco ripetuto è limitata non solo dalla velocità con cui l'attaccante può accumulare >33% dello stake totale, ma anche dal tempo necessario per integrare tutti i propri validatori nella rete. Ogni volta che l'attaccante attacca, diventa molto più povero e il resto della comunità diventa più ricco, grazie al conseguente shock dell'offerta. -Altri attacchi, come gli attacchi al 51% o l'inversione di finalità con il 66% dello stake totale, richiedono sostanzialmente più ETH e sono molto più costosi per l'utente malevolo. +Altri attacchi, come gli attacchi del 51% o l'inversione della finalità con il 66% dello stake totale, richiedono sostanzialmente più ETH e sono molto più costosi per l'attaccante. -Confrontalo con il proof-of-work. Il costo di lanciare un attacco al proof-of-work di Ethereum era il costo di possedere costantemente il >50% del tasso di hash di rete totale. Ciò corrispondeva ai costi del hardware e di gestione della potenza di calcolo sufficiente per superare la concorrenza degli altri miner e calcolare coerentemente le soluzioni di proof-of-work. Ethereum era per lo più minato utilizzando le GPU piuttosto che l'ASIC, il che ha mantenuto i costi bassi (tuttavia, se Ethereum fosse rimasto sul proof-of-work, il mining con ASIC sarebbe potuto divenire più popolare). Un concorrente avrebbe dovuto acquistare molto hardware e pagare per l'elettricità per eseguirlo per attaccare una rete di Ethereum in proof-of-work, ma il costo totale sarebbe stato inferiore a quello richiesto per accumulare abbastanza ETH e attaccare Ethereum. Un attacco del 51% è circa [20 volte meno](https://youtu.be/1m12zgJ42dI?t=1562) costoso sul proof-of-work che sul proof-of-stake. Se l'attacco è stato rilevato e la catena è stata biforcata duramente per rimuovere le modifiche, l'utente malevolo potrebbe utilizzare ripetutamente lo stesso hardware per attaccare la nuova biforcazione. +Confrontalo con la prova di lavoro. Il costo per lanciare un attacco su Ethereum basato sulla prova di lavoro era il costo di possedere costantemente >50% del tasso di hash totale della rete. Ciò ammontava ai costi hardware e operativi di una potenza di calcolo sufficiente per superare gli altri minatori nel calcolare costantemente le soluzioni della prova di lavoro. Ethereum veniva minato principalmente utilizzando GPU piuttosto che ASIC, il che manteneva bassi i costi (sebbene se Ethereum fosse rimasto sulla prova di lavoro, il mining con ASIC sarebbe potuto diventare più popolare). Un avversario dovrebbe acquistare molto hardware e pagare l'elettricità per farlo funzionare per attaccare una rete Ethereum basata sulla prova di lavoro, ma il costo totale sarebbe inferiore al costo richiesto per accumulare abbastanza ETH per lanciare un attacco. Un attacco del 51% è ~[20 volte meno](https://youtu.be/1m12zgJ42dI?t=1562) costoso sulla prova di lavoro rispetto alla prova di stake. Se l'attacco venisse rilevato e la catena subisse una biforcazione hard per rimuovere le loro modifiche, l'attaccante potrebbe utilizzare ripetutamente lo stesso hardware per attaccare la nuova biforcazione. ### Complessità {#complexity} -Il proof-of-stake è molto più complesso del proof-of-work. Questo potrebbe essere un punto a favore del proof-of-work, poiché è più complesso introdurre accidentalmente bug o effetti indesiderati a dei protocolli più semplici. Tuttavia, la complessità è stata domata da anni di ricerca e sviluppo, simulazioni e implementazioni della rete di prova. Il protocollo di proof-of-stake è stato implementato indipendentemente da cinque team separati (su ogni livello d'esecuzione e del consenso), in cinque linguaggi di programmazione, fornendo resilienza contro i bug dei client. +La prova di stake è molto più complessa della prova di lavoro. Questo potrebbe essere un punto a favore della prova di lavoro poiché è più difficile introdurre accidentalmente bug o effetti indesiderati in protocolli più semplici. Tuttavia, la complessità è stata domata da anni di ricerca e sviluppo, simulazioni e implementazioni su rete di test. Il protocollo della prova di stake è stato implementato in modo indipendente da cinque team separati (su ciascuno dei livelli, livello di esecuzione e livello di consenso) in cinque linguaggi di programmazione, fornendo resilienza contro i bug dei client. -Per sviluppare e testare in sicurezza la logica di consenso del proof-of-stake, la Beacon Chain è stata lanciata due anni prima dell'implementazione del proof-of-stake sulla rete principale di Ethereum. La Beacon Chain ha agito da sandbox per il test del proof-of-stake, essendo una blockchain attiva che implementava la logica di consenso del proof-of-stake senza toccare le transazioni reali di Ethereum, in modo efficace, arrivando al consenso soltanto su se stessa. Una volta che questa è diventata stabile e priva di bug per un periodo sufficiente, la Beacon Chain è stata "fusa" con la rete principale di Ethereum. Tutto ciò ha contribuito a "domare" la complessità del proof-of-stake al punto che i rischi di conseguenze impreviste o bug del client sono stati ridotti al minimo. +Per sviluppare e testare in sicurezza la logica di consenso della prova di stake, la beacon chain è stata lanciata due anni prima che la prova di stake fosse implementata sulla rete principale di Ethereum. La beacon chain ha agito come un ambiente di prova per i test della prova di stake, poiché era una blockchain attiva che implementava la logica di consenso della prova di stake ma senza toccare le vere transazioni di Ethereum - di fatto raggiungendo il consenso solo su se stessa. Una volta che questa è stata stabile e priva di bug per un tempo sufficiente, la beacon chain è stata "fusa" con la rete principale di Ethereum. Tutto ciò ha contribuito a domare la complessità della prova di stake al punto che il rischio di conseguenze indesiderate o bug dei client era molto basso. -### Superficie d'attacco {#attack-surface} +### Superficie di attacco {#attack-surface} -Il proof-of-stake è più complesso del proof-of-work, il che significa che esistono più vettori d'attacco potenziali da gestire. Invece di una rete tra pari che connette i client, ne esistono due, ognuna delle quali implementa un protocollo separato. Avere un validatore specifico e preselezionato per proporre un blocco in ogni spazio crea il potenziale per la negazione del servizio, laddove grandi quantità di traffico di rete portano tale validatore specifico ad andare offline. +La prova di stake è più complessa della prova di lavoro, il che significa che ci sono più potenziali vettori di attacco da gestire. Invece di una rete peer-to-peer che collega i client, ce ne sono due, ciascuna delle quali implementa un protocollo separato. Avere un validatore specifico preselezionato per proporre un blocco in ogni slot crea il potenziale per attacchi denial-of-service in cui grandi quantità di traffico di rete mettono offline quel validatore specifico. -Esistono inoltre dei modi in cui gli utenti malevoli possono sincronizzare attentamente il rilascio dei propri blocchi o delle proprie attestazioni, così che siano ricevuti da una certa percentuale della rete onesta influenzandola a votare in certi modi. Infine, un utente malevolo potrebbe semplicemente accumulare abbastanza ETH da mettere in staking, dominando il meccanismo di consenso. Ognuno di questi [vettori d'attacco ha delle difese associate](/developers/docs/consensus-mechanisms/pos/attack-and-defense), ma non esistono per la difesa sotto il proof-of-work. +Ci sono anche modi in cui gli attaccanti possono tempizzare attentamente il rilascio dei loro blocchi o attestazioni in modo che vengano ricevuti da una certa proporzione della rete onesta, influenzandoli a votare in determinati modi. Infine, un attaccante può semplicemente accumulare ETH sufficienti per fare stake e dominare il meccanismo di consenso. Ciascuno di questi [vettori di attacco ha difese associate](/developers/docs/consensus-mechanisms/pos/attack-and-defense), ma non esistono per essere difesi sotto la prova di lavoro. ## Decentralizzazione {#decentralization} -Il proof-of-stake è più decentralizzato del proof-of-work perché la "corsa agli armamenti" nell'hardware di mining tende a deprezzare gli individui e le piccole organizzazioni. Mentre chiunque può tecnicamente iniziare il mining con hardware modesto, la probabilità che riceva qualsiasi ricompensa è incredibilmente piccola rispetto alle operazioni istituzionali di mining. Con il proof-of-stake, il costo dello staking e il rendimento percentuale su tale stake sono gli stessi per tutti. Al momento, l'operazione di un validatore costa 32 ETH. +La prova di stake è più decentralizzata della prova di lavoro perché le corse agli armamenti per l'hardware di mining tendono a escludere dal mercato individui e piccole organizzazioni. Sebbene chiunque possa tecnicamente iniziare a minare con hardware modesto, la probabilità di ricevere una ricompensa è incredibilmente piccola rispetto alle operazioni di mining istituzionali. Con la prova di stake, il costo dello staking e il rendimento percentuale su quello stake sono gli stessi per tutti. Attualmente costa 32 ETH eseguire un validatore. -D'altra parte, l'invenzione dei derivati di staking liquidi ha portato a preoccupazioni sulla centralizzazione, poiché alcuni grandi fornitori gestiscono grandi importi di ETH in staking. Ciò è problematico e dev'essere corretto il prima possibile, ma è anche più sfumato di quanto sembri. I fornitori di staking centralizzati non hanno necessariamente il controllo centralizzato dei validatori; spesso è soltanto un modo per creare un gruppo di ETH centrale, che molti operatori di nodi indipendenti possono mettere in staking, senza che siano richiesti 32 ETH a ogni partecipante. +D'altra parte, l'invenzione dei derivati di staking liquido ha portato a preoccupazioni di centralizzazione perché alcuni grandi fornitori gestiscono grandi quantità di ETH in stake. Questo è problematico e deve essere corretto il prima possibile, ma è anche più sfumato di quanto sembri. I fornitori di staking centralizzati non hanno necessariamente il controllo centralizzato dei validatori: spesso è solo un modo per creare un pool centrale di ETH che molti operatori di nodi indipendenti possono mettere in stake senza che ogni partecipante richieda 32 ETH propri. -La migliore opzione per Ethereum è che i validatori siano operati localmente sui computer domestici, massimizzando la decentralizzazione. Ecco perché Ethereum resiste alle modifiche che incrementano i requisiti hardware per l'operazione di un nodo/validatore. +L'opzione migliore per Ethereum è che i validatori vengano eseguiti localmente sui computer di casa, massimizzando la decentralizzazione. Questo è il motivo per cui Ethereum resiste ai cambiamenti che aumentano i requisiti hardware per l'esecuzione di un nodo/validatore. ## Sostenibilità {#sustainability} -Il proof-of-stake è un metodo a basso costo carbonico per proteggere la blockchain. Sotto il proof-of-work, i miner competono per il diritto di minare un blocco. I miner hanno più successo quando possono eseguire i calcoli più velocemente, incentivando l'investimento in hardware e il consumo energetico. Ciò è stato osservato per Ethereum prima che passasse al proof-of-stake. Poco dopo la transizione al proof-of-stake, Ethereum consumava approssimativamente 78 TWh/anno; tanto quanto un piccolo paese. Tuttavia, il passaggio al proof-of-stake ha ridotto il consumo energetico di circa il 99,98%. Il proof-of-stake ha reso Ethereum una piattaforma a basso tenore carbonico, nonché efficiente a livello energetico. +La prova di stake è un modo a basse emissioni di carbonio per proteggere la blockchain. Sotto la prova di lavoro i minatori competono per il diritto di minare un blocco. I minatori hanno più successo quando possono eseguire calcoli più velocemente, incentivando gli investimenti in hardware e il consumo di energia. Questo è stato osservato per Ethereum prima che passasse alla prova di stake. Poco prima della transizione alla prova di stake, Ethereum consumava circa 78 TWh/anno, quanto un piccolo paese. Tuttavia, il passaggio alla prova di stake ha ridotto questo dispendio energetico di circa il 99,98%. La prova di stake ha reso Ethereum una piattaforma efficiente dal punto di vista energetico e a basse emissioni di carbonio. -[Di più sul consumo energetico di Ethereum](/energy-consumption) +[Maggiori informazioni sul consumo energetico di Ethereum](/energy-consumption) ## Emissione {#issuance} -Il proof-of-stake di Ethereum può pagare per la sua sicurezza, emettendo molte meno monete del proof-of-work, poiché i validatori non devono pagare costi d'elettricità elevati. Di conseguenza, gli ETH possono ridurre l'inflazione o persino deflazionarsi, quando sono bruciati grandi importi di ETH. Livelli d'inflazione inferiori significano che la sicurezza di Ethereum è più economica rispetto al proof-of-work. +L'Ethereum basato sulla prova di stake può pagare per la sua sicurezza emettendo molte meno monete rispetto all'Ethereum basato sulla prova di lavoro perché i validatori non devono pagare alti costi per l'elettricità. Di conseguenza, l'ETH può ridurre la sua inflazione o persino diventare deflazionistico quando vengono bruciate grandi quantità di ETH. Livelli di inflazione più bassi significano che la sicurezza di Ethereum è più economica rispetto a quando era sotto la prova di lavoro. -## Preferisci un approccio visivo all'apprendimento? {#visual-learner} +## Preferisci imparare visivamente? {#visual-learner} -Guarda Justin Drake spiegare i benefici del proof-of-stake rispetto al proof-of-work: +Guarda Justin Drake spiegare i vantaggi della prova di stake rispetto alla prova di lavoro: ## Letture consigliate {#further-reading} -- [Filosofia di design del proof-of-stake di Vitalik](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [FAQ sul proof-of-stake di Vitalik](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) -- [Video di "Spiegazione semplice" su PoS e PoW a confronto](https://www.youtube.com/watch?v=M3EFi_POhps) +- [Filosofia di progettazione della prova di stake di Vitalik](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [FAQ sulla prova di stake di Vitalik](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Video "Simply Explained" su pos vs pow](https://www.youtube.com/watch?v=M3EFi_POhps) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md index eaa4f0a1f01..1098534a455 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -1,90 +1,91 @@ --- -title: Ricompense e sanzioni del proof-of-stake -description: Scopri di più sugli incentivi del protocollo nel proof-of-stake di Ethereum. +title: "Ricompense e penalità della prova di stake" +description: Scopri gli incentivi interni al protocollo nella prova di stake di Ethereum. lang: it --- -Ethereum è protetta utilizzando la sua criptovaluta nativa, ether (ETH). Gli operatori del nodo che desiderano partecipare alla convalida dei blocchi e all'identificazione della testa della catena, depositano dell'ether nel [contratto di deposito](/staking/deposit-contract/) su Ethereum. Quindi sono pagati in ether per eseguire il software del validatore, che verifica la validità dei nuovi blocchi ricevuti tramite la rete peer-to-peer e applica l'algoritmo di scelta della diramazione per identificare la testa della catena. +[Ethereum](/) è protetto utilizzando la sua criptovaluta nativa, l'ether (ETH). Gli operatori dei nodi che desiderano partecipare alla convalida dei blocchi e all'identificazione della testa della catena, depositano ether nel [contratto di deposito](/staking/deposit-contract/) su Ethereum. Vengono quindi pagati in ether per eseguire il software del validatore che controlla la validità dei nuovi blocchi ricevuti sulla rete peer-to-peer e applicano l'algoritmo di scelta della biforcazione per identificare la testa della catena. -Esistono due ruoli principali per un validatore: 1) controllare i nuovi blocchi e "attestarne" la validità, 2) proporre nuovi blocchi quando selezionati casualmente dal gruppo totale di validatori. Se il validatore non riesce a svolgere una di queste mansioni quando richiesto, perde un pagamento di ether. Talvolta, inoltre, i validatori sono incaricati di aggregare le firme e partecipare alle commissioni di sincronizzazione. +Ci sono due ruoli principali per un validatore: 1) controllare i nuovi blocchi e "attestarli" se sono validi, 2) proporre nuovi blocchi quando selezionato casualmente dal pool totale dei validatori. Se il validatore non riesce a svolgere nessuno di questi compiti quando richiesto, perde un pagamento in ether. A volte ai validatori viene anche assegnato il compito di aggregare le firme e partecipare ai comitati di sincronizzazione. -Esistono poi delle azioni molto difficili da compiere per errore e che denotano un intento malevolo, come proporre diversi blocchi per lo stesso slot o attestare più blocchi per lo stesso slot. Questi sono comportamenti "tagliabili" che risultano nel bruciare alcuni importi di ether (fino a 1 ETH) prima che il validatore venga rimosso dalla rete, il che richiede 36 giorni. L'ether del validatore sanzionato si riduce lentamente durante il periodo d'uscita, ma al diciottesimo giorno riceve una "sanzione di correlazione", maggiore quando più validatori sono sanzionati contemporaneamente. La struttura di incentivazione del meccanismo di consenso, dunque, paga per l'onestà, punendo gli utenti malevoli. +Ci sono anche alcune azioni che sono molto difficili da compiere accidentalmente e indicano un intento malevolo, come proporre più blocchi per lo stesso slot o attestare più blocchi per lo stesso slot. Questi sono comportamenti "punibili" che comportano per il validatore il bruciare di una certa quantità di ether (fino a 1 ETH) prima che il validatore venga rimosso dalla rete, il che richiede 36 giorni. L'ether del validatore punito si esaurisce lentamente durante il periodo di uscita, ma il 18° giorno riceve una "penalità di correlazione" che è maggiore quando più validatori vengono puniti nello stesso periodo. La struttura degli incentivi del meccanismo di consenso paga quindi per l'onestà e punisce i cattivi attori. -Tutte le ricompense e le sanzioni sono applicate una volta all'epoca. +Tutte le ricompense e le penalità vengono applicate una volta per epoca. -Continua a leggere per ulteriori dettagli... +Continua a leggere per maggiori dettagli... -## Ricompense e sanzioni {#rewards} +## Ricompense e penalità {#rewards} ### Ricompense {#rewards} -I validatori ricevono ricompense quando effettuano voti coerenti con la maggioranza degli altri validatori, quando propongono blocchi e quando partecipano alle commissioni di sincronizzazione. Il valore delle ricompense in ogni epoca è calcolato a partire da una `base_reward` (ricompensa di base). Questa unità fornisce le basi per il calcolo delle ricompense. La`base_reward` rappresenta la ricompensa media ricevuta da un validatore in condizioni ottimali per ogni epoca. Questa è calcolata in base al saldo effettivo del validatore e al numero totale di validatori attivi, come segue: +I validatori ricevono ricompense quando esprimono voti coerenti con la maggioranza degli altri validatori, quando propongono blocchi e quando partecipano ai comitati di sincronizzazione. Il valore delle ricompense in ogni epoca è calcolato da una `base_reward`. Questa è l'unità di base da cui vengono calcolate le altre ricompense. La `base_reward` rappresenta la ricompensa media ricevuta da un validatore in condizioni ottimali per epoca. Questa viene calcolata dal saldo effettivo del validatore e dal numero totale di validatori attivi come segue: ``` base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance)))) ``` -dove `base_reward_factor` è 64, `base_rewards_per_epoch` è 4 e `sum(active balance)` è l'ether totale in staking tra tutti i validatori attivi. +dove `base_reward_factor` è 64, `base_rewards_per_epoch` è 4 e `sum(active balance)` è l'ether totale messo in stake tra tutti i validatori attivi. -Ciò significa che la ricompensa di base è proporzionale al saldo effettivo del validatore ed è inversamente proporzionale al numero di validatori sulla rete. Più validatori ci sono, maggiore sarà l'emissione complessiva (poiché `sqrt(N)`), ma minore sarà la `base_reward` per validatore (come `1/sqrt(N)`). Questi fattori influenzano l'APR per un nodo di staking. Leggi la logica alla base nelle [note di Vitalik](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards). +Questo significa che la ricompensa di base è proporzionale al saldo effettivo del validatore e inversamente proporzionale al numero di validatori sulla rete. Più validatori ci sono, maggiore è l'emissione complessiva (come `sqrt(N)`) ma minore è la `base_reward` per validatore (come `1/sqrt(N)`). Questi fattori influenzano l'APR per un nodo di staking. Leggi la logica di questo negli [appunti di Vitalik](https://notes.ethereum.org/@vbuterin/serenity_design_rationale?type=view#Base-rewards). -La ricompensa totale è quindi calcolata come la somma di cinque componenti, ognuno avente un peso che determina quanto ogni componente aggiunge alla ricompensa totale. I componenti sono: +La ricompensa totale viene quindi calcolata come la somma di cinque componenti, ognuna delle quali ha un peso che determina quanto ciascuna componente aggiunge alla ricompensa totale. Le componenti sono: ``` -1. voto sull'origine: il validatore ha effettuato un voto tempestivo per il punto di controllo di origine corretto -2. voto sulla destinazione: il validatore ha effettuato un voto tempestivo per il punto di controllo di destinazione corretto -3. voto sulla testa: il validatore ha effettuato un voto tempestivo per il blocco di testa corretto -4. ricompensa della commissione di sincronizzazione: il validatore ha partecipato a una commissione di sincronizzazione -5. ricompensa del propositore: il validatore ha proposto un blocco nello slot corretto +1. source vote: the validator has made a timely vote for the correct source checkpoint +2. target vote: the validator has made a timely vote for the correct target checkpoint +3. head vote: the validator has made a timely vote for the correct head block +4. sync committee reward: the validator has participated in a sync committee +5. proposer reward: the validator has proposed a block in the correct slot ``` -Le ponderazioni per ciascun componente sono le seguenti: +I pesi per ciascuna componente sono i seguenti: ``` -TIMELY_SOURCE_WEIGHT uint64(14) -TIMELY_TARGET_WEIGHT uint64(26) -TIMELY_HEAD_WEIGHT uint64(14) -SYNC_REWARD_WEIGHT uint64(2) -PROPOSER_WEIGHT uint64(8) +TIMELY_SOURCE_WEIGHT uint64(14) +TIMELY_TARGET_WEIGHT uint64(26) +TIMELY_HEAD_WEIGHT uint64(14) +SYNC_REWARD_WEIGHT uint64(2) +PROPOSER_WEIGHT uint64(8) ``` -Questi pesi ammontano a 64. La ricompensa è calcolata come la somma dei pesi applicabili, divisa per 64. Un validatore che ha effettuato tempestivi voti sull'origine, sula destinazione e sulla testa, ha proposto un blocco e ha partecipato a una commissione di sincronizzazione, potrebbe ricevere `64/64 * base_reward == base_reward`. Tuttavia, solitamente un validatore non è un propositore di blocchi, quindi la sua ricompensa massima è `64-8 /64 * base_reward == 7/8 * base_reward`. I validatori che non sono propositori di blocchi né partecipano a una commissione di sincronizzazione possono ricevere `64-8-2 / 64 * base_reward == 6.75/8 * base_reward`. +Questi pesi sommano a 64. La ricompensa è calcolata come la somma dei pesi applicabili divisa per 64. Un validatore che ha effettuato voti tempestivi di origine, destinazione e testa, ha proposto un blocco e ha partecipato a un comitato di sincronizzazione potrebbe ricevere `64/64 * base_reward == base_reward`. Tuttavia, un validatore di solito non è un proponente del blocco, quindi la sua ricompensa massima è `64-8 /64 * base_reward == 7/8 * base_reward`. I validatori che non sono né proponenti del blocco né in un comitato di sincronizzazione possono ricevere `64-8-2 / 64 * base_reward == 6.75/8 * base_reward`. -È prevista una ricompensa aggiuntiva per incentivare attestazioni rapide. Questa è la `inclusion_delay_reward`. Ha un valore pari alla `base_reward`, moltiplicata per `1/delay`, dove `delay` è il numero di slot che separano la proposta e l'attestazione del blocco. Ad esempio, se l'attestazione è inviata entro uno slot della proposta del blocco, l'attestatore riceve `base_reward * 1/1 == base_reward`. Se l'attestazione arriva nello slot successivo, l'attestatore riceve `base_reward * 1/2`, e così via. +Viene aggiunta un'ulteriore ricompensa per incentivare le attestazioni rapide. Questa è la `inclusion_delay_reward`. Ha un valore pari alla `base_reward` moltiplicata per `1/delay` dove `delay` è il numero di slot che separano la proposta del blocco e l'attestazione. Ad esempio, se l'attestazione viene inviata entro uno slot dalla proposta del blocco, l'attestatore riceve `base_reward * 1/1 == base_reward`. Se l'attestazione arriva nello slot successivo, l'attestatore riceve `base_reward * 1/2` e così via. -I propositori di blocchi ricevono `8 / 64 * base_reward` per **ogni attestazione valida** inclusa nel blocco, quindi il valore effettivo della ricompensa scala con il numero di validatori attestanti. I propositori di blocchi, inoltre, possono incrementare la propria ricompensa includendo prova del comportamento scorretto di altri validatori nel loro blocco proposto. Queste ricompense sono le "carote" che incoraggiano l'onestà del validatore. Un propositore di blocchi che include il taglio sarà ricompensato con `slashed_validators_effective_balance / 512`. +I proponenti del blocco ricevono `8 / 64 * base_reward` per **ogni attestazione valida** inclusa nel blocco, quindi il valore effettivo della ricompensa scala con il numero di validatori attestanti. I proponenti del blocco possono anche aumentare la loro ricompensa includendo prove di comportamento scorretto da parte di altri validatori nel blocco proposto. Queste ricompense sono le "carote" che incoraggiano l'onestà del validatore. Un proponente del blocco che include il punire verrà ricompensato con il `slashed_validators_effective_balance / 512`. -### Sanzioni {#penalties} +### Penalità {#penalties} -Finora abbiamo considerato validatori che si comportano in modo impeccabile, ma quali sono le sanzioni per i validatori che non effettuano tempestivi voti sull'origine, sulla destinazione e sulla testa o lo fanno lentamente? +Finora abbiamo considerato validatori dal comportamento perfetto, ma che dire dei validatori che non effettuano voti tempestivi di testa, origine e destinazione o lo fanno lentamente? -Le sanzioni per la mancanza di voti sull'origine e sulla destinazione equivalgono alle ricompense che l'attestatore avrebbe ricevuto se li avesse inviati. Ciò significa che, invece di aggiungere la ricompensa al loro saldo, si vedono rimuovere un valore equivalente dal proprio saldo. Non è presente alcuna sanzione per il mancato voto sulla testa (ossia, i voti di testa sono solo ricompensati, mai sanzionati). Non esiste alcuna sanzione associata all'`inclusion_delay`; la ricompensa, semplicemente, non sarà aggiunta al saldo del validatore. Inoltre, non esiste alcuna sanzione per la mancata proposizione di un blocco. +Le penalità per aver mancato i voti di destinazione e origine sono pari alle ricompense che l'attestatore avrebbe ricevuto se li avesse inviati. Questo significa che invece di avere la ricompensa aggiunta al proprio saldo, viene rimosso un valore uguale dal proprio saldo. Non c'è alcuna penalità per aver mancato il voto di testa (cioè, i voti di testa vengono solo ricompensati, mai penalizzati). Non c'è alcuna penalità associata all'`inclusion_delay` - la ricompensa semplicemente non verrà aggiunta al saldo del validatore. Non c'è inoltre alcuna penalità per non aver proposto un blocco. -Leggi di più sulle ricompense e le sanzioni nelle [specifiche del consenso](https://github.com/ethereum/consensus-specs/blob/master/specs/altair/beacon-chain.md). Ricompense e sanzioni sono state adeguate nell'aggiornamento di Bellatrix; guarda Danny Ryan e Vitalik discuterne in questo [Video Peep an EIP](https://www.youtube.com/watch?v=iaAEGs1DMgQ). +Leggi di più su ricompense e penalità nelle [specifiche del consenso](https://github.com/ethereum/consensus-specs/blob/master/specs/altair/beacon-chain.md). Le ricompense e le penalità sono state modificate nell'aggiornamento Bellatrix - guarda Danny Ryan e Vitalik discuterne in questo [video Peep an EIP](https://www.youtube.com/watch?v=iaAEGs1DMgQ). -## Taglio {#slashing} +## Punire {#slashing} -Il taglio è un'azione più grave che risulta nella rimozione forzata di un validatore dalla rete e nella perdita associata del suo ether in staking. Esistono tre modi in cui un validatore può essere tagliato, tutti equivalenti alla proposta o attestazione disonesta dei blocchi: +Punire è un'azione più severa che comporta la rimozione forzata di un validatore dalla rete e una perdita associata del suo ether messo in stake. Ci sono tre modi in cui un validatore può essere punito, tutti riconducibili alla proposta disonesta o all'attestazione di blocchi: - Proponendo e firmando due blocchi diversi per lo stesso slot -- Attestando un blocco che ne "circonda" un altro (modificando di fatto lo storico) -- Eseguendo un "doppio voto", attestando due candidati per lo stesso blocco +- Attestando un blocco che "circonda" un altro (cambiando di fatto la cronologia) +- Con il "doppio voto", attestando due candidati per lo stesso blocco -Se queste azioni sono rilevate, il validatore viene tagliato. Ciò significa che 1/32 del suo ether in staking (fino a un massimo di 1 ether) viene immediatamente bruciato, poi inizia un periodo di rimozione di 36 giorni. Durante tale periodo di rimozione, lo stake del validatore si riduce gradualmente. Al punto intermedio (Giorno 18), è applicata una sanzione aggiuntiva la cui portata scala con il totale di ether in staking di tutti i validatori tagliati nei 36 giorni precedenti all'evento di taglio. Ciò significa che più validatori sono tagliati, maggiore è l'entità del taglio. Il taglio massimo è il saldo effettivo di tutti i validatori tagliati (cioè, se molti validatori sono tagliati, potrebbero perdere il proprio intero stake). D'altra parte, un evento di taglio singolo e isolato brucia soltanto una piccola porzione dello stake del validatore. Questa sanzione intermedia che scala con il numero di validatori tagliati è detta "sanzione di correlazione". +Se queste azioni vengono rilevate, il validatore viene punito. Questo significa che 0,0078125 ETH vengono immediatamente bruciati per un validatore da 32 ETH (scalato linearmente con il saldo attivo), quindi inizia un periodo di rimozione di 36 giorni. Durante questo periodo di rimozione, lo stake del validatore si esaurisce gradualmente. A metà del periodo (Giorno 18) viene applicata una penalità aggiuntiva la cui entità scala con l'ether totale messo in stake di tutti i validatori puniti nei 36 giorni precedenti all'evento di punizione. Questo significa che quando più validatori vengono puniti, l'entità della punizione aumenta. La punizione massima è l'intero saldo effettivo di tutti i validatori puniti (cioè, se ci sono molti validatori che vengono puniti, potrebbero perdere l'intero stake). D'altra parte, un singolo evento di punizione isolato brucia solo una piccola porzione dello stake del validatore. Questa penalità intermedia che scala con il numero di validatori puniti è chiamata "penalità di correlazione". ## Perdita per inattività {#inactivity-leak} -Se il livello del consenso ha superato più di quattro epoche senza finalizzare, un protocollo di emergenza detto "perdita di inattività" viene attivato. Lo scopo ultimo della perdita per inattività è creare le condizioni necessarie perché la catena recuperi la finalità. Come spiegato sopra, la finalità richiede una maggioranza dei 2/3 dell'ether in staking totale per accordarsi sui punti di controllo di origine e di destinazione. Se validatori che rappresentano oltre 1/3 dei validatori totali vanno offline o non riescono a inviare le attestazioni corrette, non è possibile che una supermaggioranza dei 2/3 finalizzi i punti di controllo. La perdita per inattività consente allo stake appartenente ai validatori inattivi di disperdersi gradualmente finché non controllano meno di 1/3 dello stake totale, consentendo ai validatori attivi rimanenti di finalizzare la catena. Indipendentemente da quanto sia grande il gruppo di validatori inattivi, i rimanenti validatori attivi alla fine controlleranno più di 2/3 dello stake. La perdita di stake è un forte incentivo per i validatori inattivi a riattivarsi appena possibile! Uno scenario di perdita per inattività è stato riscontrato sulla rete di prova Medalla quando \<66% di validatori attivi è riuscito ad arrivare al consenso sulla testa corrente della blockchain. La perdita per inattività è stata attivata e la finalità è stata infine recuperata! +Se il livello di consenso è trascorso per più di quattro epoche senza finalizzare, viene attivato un protocollo di emergenza chiamato "perdita per inattività" (inactivity leak). Lo scopo ultimo della perdita per inattività è creare le condizioni necessarie affinché la catena recuperi la finalità. Come spiegato sopra, la finalità richiede una maggioranza di 2/3 dell'ether totale messo in stake per concordare sui checkpoint di origine e destinazione. Se i validatori che rappresentano più di 1/3 dei validatori totali vanno offline o non riescono a inviare attestazioni corrette, non è possibile per una supermaggioranza di 2/3 finalizzare i checkpoint. La perdita per inattività lascia che lo stake appartenente ai validatori inattivi si esaurisca gradualmente finché non controllano meno di 1/3 dello stake totale, consentendo ai restanti validatori attivi di finalizzare la catena. Per quanto grande sia il pool di validatori inattivi, i restanti validatori attivi finiranno per controllare >2/3 dello stake. La perdita di stake è un forte incentivo per i validatori inattivi a riattivarsi il prima possibile! Uno scenario di perdita per inattività è stato riscontrato sulla rete di test Medalla quando < 66% dei validatori attivi è riuscito a raggiungere il consenso sull'attuale testa della blockchain. La perdita per inattività è stata attivata e la finalità è stata infine recuperata! -Il design di ricompense, sanzioni e frazionamenti del meccanismo di consenso incoraggia i singoli validatori a comportarsi correttamente. Tuttavia, da tali scelte di progettazione emerge un sistema che incentiva fortemente la distribuzione equa dei validatori tra i vari client e dovrebbe disincentivare fortemente il dominio di un singolo client. +Il design delle ricompense, delle penalità e del punire del meccanismo di consenso incoraggia i singoli validatori a comportarsi correttamente. Tuttavia, da queste scelte di progettazione emerge un sistema che incentiva fortemente un'equa distribuzione dei validatori su più client e dovrebbe disincentivare fortemente il predominio di un singolo client. -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} -- [Aggiornare Ethereum: Il livello d'incentivazione](https://eth2book.info/altair/part2/incentives) +- [Aggiornare Ethereum: Il livello degli incentivi](https://eth2book.info/altair/part2/incentives) - [Incentivi nel protocollo ibrido Casper di Ethereum](https://arxiv.org/pdf/1903.04205.pdf) - [Specifiche annotate di Vitalik](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) -- [Suggerimenti di prevenzione del taglio di Eth2](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [Suggerimenti per la prevenzione del punire in Eth2](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [Analisi delle penalità del punire sotto l'EIP-7251](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509) _Fonti_ -- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ +- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md index f0ae1fa1311..4fc6809e85e 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md @@ -1,39 +1,39 @@ --- -title: Soggettività debole -description: Una spiegazione della soggettività debole e del suo ruolo nell'Ethereum PoS. +title: "Soggettività debole" +description: "Una spiegazione della soggettività debole e del suo ruolo nella prova di stake di Ethereum." lang: it --- -Per soggettività nelle blockchain si intende l'affidamento alle informazioni sociali per acconsentire allo stato corrente. Potrebbero esistere diverse biforcazioni valide, tra le quali si sceglie basandosi sulle informazioni raccolte da altri peer sulla rete. Il contrario è l'oggettività, che si riferisce alle catene in cui è possibile solo una catena valida, su cui tutti i nodi acconsentiranno necessariamente, applicando delle proprie regole codificate. Esiste anche un terzo stato, noto come soggettività debole. Esso indica una catena che può progredire oggettivamente dopo aver recuperato socialmente parte del seed iniziale di informazioni. +La soggettività nelle blockchain si riferisce all'affidamento alle informazioni sociali per concordare sullo stato attuale. Potrebbero esserci molteplici biforcazioni valide tra cui scegliere in base alle informazioni raccolte da altri peer sulla rete. Il contrario è l'oggettività, che si riferisce alle catene in cui esiste una sola catena valida possibile su cui tutti i nodi concorderanno necessariamente applicando le loro regole codificate. Esiste anche un terzo stato, noto come soggettività debole. Questo si riferisce a una catena che può progredire oggettivamente dopo che un seme iniziale di informazioni è stato recuperato socialmente. ## Prerequisiti {#prerequisites} -Per comprendere questa pagina è necessario prima capire i fondamenti del [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). +Per comprendere questa pagina è necessario prima comprendere i fondamenti della [prova di stake](/developers/docs/consensus-mechanisms/pos/). ## Quali problemi risolve la soggettività debole? {#problems-ws-solves} -La soggettività è intrinseca nelle blockchain proof-of-stake perché la selezione della catena corretta tra diverse biforcazioni avviene contando i voti storici. Questo espone la blockchain a diversi vettori d'attacco, tra cui gli attacchi a lunga portata, in cui i nodi che hanno partecipato nelle primissime fasi alla catena mantengono una biforcazione alternativa che rilasciano molto più tardi a proprio vantaggio. In alternativa, se il 33% dei validatori preleva il proprio stake, ma continua ad attestare e produrre blocchi, potrebbe generare una biforcazione alternativa che entra in conflitto con la catena canonica. I nuovi nodi o nodi che sono stati offline per molto tempo potrebbero non essere consapevoli che questi validatori attaccanti hanno prelevato i propri fondi, quindi, gli utenti malevoli potrebbero ingannarli nel seguire una catena errata. Ethereum può risolvere questi vettori d'attacco imponendo vincoli che riducono al minimo gli aspetti soggettivi del meccanismo e dunque l'affidamento sulla fiducia. +La soggettività è intrinseca alle blockchain basate sulla prova di stake perché la selezione della catena corretta tra molteplici biforcazioni viene effettuata contando i voti storici. Questo espone la blockchain a diversi vettori di attacco, inclusi gli attacchi a lungo raggio in cui i nodi che hanno partecipato molto presto alla catena mantengono una biforcazione alternativa che rilasciano molto più tardi a proprio vantaggio. In alternativa, se il 33% dei validatori ritira il proprio stake ma continua ad attestare e produrre blocchi, potrebbe generare una biforcazione alternativa in conflitto con la catena canonica. I nuovi nodi o i nodi che sono stati offline per molto tempo potrebbero non essere consapevoli che questi validatori attaccanti hanno ritirato i loro fondi, quindi gli aggressori potrebbero ingannarli facendogli seguire una catena errata. [Ethereum](/) può risolvere questi vettori di attacco imponendo vincoli che riducono al minimo indispensabile gli aspetti soggettivi del meccanismo, e quindi le ipotesi di fiducia. -## Punti di controllo della soggettività debole {#ws-checkpoints} +## Checkpoint di soggettività debole {#ws-checkpoints} -La soggettività debole è implementata in Ethereum proof-of-stake usando i "punti di controllo della soggettività debole". Si tratta di radici di stato che secondo tutti i nodi della rete consensualmente appartengano alla catena canonica. Hanno la stessa funzione di "verità universale" dei blocchi di genesi, con la differenza che non si trovano nella posizione di genesi nella blockchain. L'algoritmo di scelta della biforcazione confida nel fatto che la blockchain definita in quel punto di controllo sia corretta e che, indipendentemente e oggettivamente verifichi la catena a partire da quel punto. I punti di controllo fungono da "limiti di ripristino", poiché i blocchi situati prima dei punti di controllo della soggettività debole non sono modificabili. Questo previene gli attacchi a lunga portata semplicemente definendo come non valide, nell’impostazione del meccanismo, le biforcazioni di lunga portata. Garantire che i punti di controllo della soggettività debole siano separati da una minima distanza rispetto al periodo di prelievo del validatore assicura che un validatore che biforca la catena subisca un taglio (slashing) almeno a un qualche valore di soglia prima che possa prelevare il proprio stake e che i nuovi entranti non possano essere ingannati a entrare in biforcazioni errate dai validatori che hanno prelevato il proprio stake. +La soggettività debole è implementata nella prova di stake di Ethereum utilizzando i "checkpoint di soggettività debole". Si tratta di radici di stato che tutti i nodi sulla rete concordano appartengano alla catena canonica. Servono allo stesso scopo di "verità universale" dei blocchi di genesi, tranne per il fatto che non si trovano nella posizione di genesi nella blockchain. L'algoritmo di scelta della biforcazione confida che lo stato della blockchain definito in quel checkpoint sia corretto e che verifichi in modo indipendente e oggettivo la catena da quel punto in poi. I checkpoint agiscono come "limiti di ripristino" perché i blocchi situati prima dei checkpoint di soggettività debole non possono essere modificati. Questo mina gli attacchi a lungo raggio semplicemente definendo le biforcazioni a lungo raggio come non valide come parte della progettazione del meccanismo. Garantire che i checkpoint di soggettività debole siano separati da una distanza inferiore al periodo di prelievo del validatore assicura che un validatore che crea una biforcazione della catena venga punito di almeno un certo importo di soglia prima di poter ritirare il proprio stake e che i nuovi entranti non possano essere ingannati su biforcazioni errate da validatori il cui stake è stato ritirato. -## Differenza tra punti di controllo della soggettività debole e blocchi finalizzati {#difference-between-ws-and-finalized-blocks} +## Differenza tra checkpoint di soggettività debole e blocchi finalizzati {#difference-between-ws-and-finalized-blocks} -I nodi di Ethereum trattano diversamente i blocchi finalizzati e i punti di controllo della soggettività debole. Se un nodo viene a conoscenza di due blocchi finalizzati concorrenti, è diviso tra i due e non ha modo di identificare automaticamente quale sia la biforcazione canonica. Questa condizione indica un fallimento del consenso. Per contro, un nodo rifiuta semplicemente qualsiasi blocco che sia in conflitto con il suo punto di controllo della soggettività debole. Dal punto di vista del nodo, il punto di controllo della soggettività debole rappresenta una verità assoluta, che non può essere sovvertita dalla nuova conoscenza dai suoi peer. +I blocchi finalizzati e i checkpoint di soggettività debole sono trattati in modo diverso dai nodi di Ethereum. Se un nodo viene a conoscenza di due blocchi finalizzati in competizione, allora è combattuto tra i due: non ha modo di identificare automaticamente quale sia la biforcazione canonica. Questo è sintomatico di un fallimento del consenso. Al contrario, un nodo rifiuta semplicemente qualsiasi blocco in conflitto con il suo checkpoint di soggettività debole. Dal punto di vista del nodo, il checkpoint di soggettività debole rappresenta una verità assoluta che non può essere minata da nuove conoscenze provenienti dai suoi peer. -## Quanto debole è debole? {#how-weak-is-weak} +## Quanto è debole? {#how-weak-is-weak} -L'aspetto soggettivo del proof-of-stake di Ethereum è la necessità di uno stato recente (punto di controllo della soggettività debole) da una fonte fidata da cui sincronizzare. Il rischio di ottenere un punto di controllo della soggettività debole non corretto è molto basso perché è possibile effettuare un riscontro con diverse fonti pubbliche indipendenti, come gli esploratori di blocchi o vari nodi. Tuttavia, per eseguire qualsiasi applicazione software serve sempre un certo grado di fiducia, ad esempio, fidandosi del fatto che gli sviluppatori del software abbiano prodotto un software onesto. +L'aspetto soggettivo della prova di stake di Ethereum è il requisito di uno stato recente (checkpoint di soggettività debole) da una fonte attendibile da cui sincronizzarsi. Il rischio di ottenere un checkpoint di soggettività debole errato è molto basso perché possono essere verificati rispetto a diverse fonti pubbliche indipendenti come gli esploratori di blocchi o molteplici nodi. Tuttavia, è sempre richiesto un certo grado di fiducia per eseguire qualsiasi applicazione software, ad esempio, confidare che gli sviluppatori del software abbiano prodotto un software onesto. -Un punto di controllo della soggettività debole potrebbe persino essere inserito nel software del client. Probabilmente, un utente malevolo potrebbe corrompere un punto di controllo nel software e con la stessa facilità corrompere il software stesso. Non esiste alcun percorso cripto-economico reale che eviti questo problema, ma in Ethereum l'impatto di eventuali sviluppatori non affidabili è minimizzato con la presenza di diversi team di client indipendenti, ognuno impiegato nella costruzione di software equivalenti in diversi linguaggi, il tutto con l'interesse a mantenere una catena onesta. Gli esploratori di blocchi potrebbero fornire anche dei punti di controllo della soggettività debole o un modo per eseguire un controllo incrociato dei punti di controllo ottenuti da altre parti, rispetto a un'ulteriore fonte. +Un checkpoint di soggettività debole potrebbe persino far parte del software del client. Si potrebbe sostenere che un utente malintenzionato possa corrompere il checkpoint nel software e possa altrettanto facilmente corrompere il software stesso. Non esiste una vera via d'uscita criptoeconomica a questo problema, ma l'impatto di sviluppatori inaffidabili è ridotto al minimo in Ethereum avendo molteplici team di client indipendenti, ognuno dei quali crea software equivalente in linguaggi diversi, tutti con un interesse acquisito nel mantenere una catena onesta. Anche gli esploratori di blocchi possono fornire checkpoint di soggettività debole o un modo per incrociare i checkpoint ottenuti altrove con una fonte aggiuntiva. -Infine, i punti di controllo possono essere richiesti da altri nodi; ad es. un altro utente di Ethereum che esegue un nodo completo può fornire un punto di controllo che i validatori possono poi verificare rispetto ai dati ricevuti da un esploratore del blocco. In generale, fidarsi del fornitore di un punto di controllo della soggettività debole può essere considerato come problematico tanto quanto fidarsi degli sviluppatori del client. La fiducia generale richiesta è bassa. È importante osservare che queste considerazioni diventano importanti solo nell'improbabile evento che una maggioranza di validatori cospiri per generare una biforcazione alternativa della blockchain. In qualsiasi altra circostanza, esiste solo una catena di Ethereum da cui scegliere. +Infine, i checkpoint possono essere richiesti ad altri nodi; forse un altro utente di Ethereum che esegue un nodo completo può fornire un checkpoint che i validatori possono poi verificare rispetto ai dati di un esploratore di blocchi. Nel complesso, fidarsi del fornitore di un checkpoint di soggettività debole può essere considerato problematico quanto fidarsi degli sviluppatori del client. La fiducia complessiva richiesta è bassa. È importante notare che queste considerazioni diventano importanti solo nell'evento molto improbabile in cui la maggioranza dei validatori cospiri per produrre una biforcazione alternativa della blockchain. In qualsiasi altra circostanza, c'è solo una catena di Ethereum tra cui scegliere. ## Letture consigliate {#further-reading} - [Soggettività debole in Eth2](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) -- [Vitalik: come ho imparato ad amare la soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) -- [Soggettività debole (documentazione di Teku)](https://docs.teku.consensys.net/en/latest/Concepts/Weak-Subjectivity/) -- [Fase 0 della guida alla soggettività debole](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/weak-subjectivity.md) -- [Analisi della soggettività debole in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) +- [Vitalik: Come ho imparato ad amare la soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity) +- [Soggettività debole (documentazione di Teku)](https://docs.teku.consensys.io/concepts/weak-subjectivity) +- [Guida alla soggettività debole della Fase 0](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/weak-subjectivity.md) +- [Analisi della soggettività debole in Ethereum 2.0](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md new file mode 100644 index 00000000000..05228cb24af --- /dev/null +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md @@ -0,0 +1,64 @@ +--- +title: Credenziali di prelievo +description: Una spiegazione dei tipi di credenziali di prelievo dei validatori (0x00, 0x01, 0x02) e delle loro implicazioni per gli staker di Ethereum. +lang: it +--- + +Ogni validatore ha una **credenziale di prelievo** che determina come e dove possono essere prelevati i propri ETH in staking e le ricompense. Il tipo di credenziale è indicato dal primo byte: `0x00`, `0x01` o `0x02`. Comprendere questi tipi è importante per i validatori che gestiscono il proprio stake. + +## 0x00: Credenziali pre-Shapella {#0x00-credentials} + +Il tipo `0x00` è il formato originale delle credenziali di prelievo precedente all'aggiornamento Shapella (aprile 2023). I validatori con questo tipo di credenziale non hanno impostato alcun indirizzo di prelievo sul livello di esecuzione, il che significa che i loro fondi rimangono bloccati sul livello di consenso. Se hai ancora credenziali `0x00`, devi aggiornarle a `0x01` o `0x02` prima di poter ricevere qualsiasi prelievo. + +## 0x01: Credenziali di prelievo legacy {#0x01-credentials} + +Il tipo `0x01` è stato introdotto con l'aggiornamento Shapella ed è diventato lo standard per i validatori che desideravano impostare un indirizzo di prelievo sul livello di esecuzione. Con le credenziali `0x01`: + +- Qualsiasi saldo superiore a 32 ETH viene **trasferito automaticamente** al tuo indirizzo di prelievo +- Le uscite complete passano attraverso la coda di uscita standard +- Le ricompense superiori a 32 ETH non possono accumularsi (compound): vengono periodicamente trasferite all'esterno + +**Perché alcuni validatori usano ancora 0x01:** È più semplice e familiare. Molti validatori hanno depositato dopo Shapella e hanno già questo tipo, e funziona bene per coloro che desiderano prelievi automatici del saldo in eccesso. + +**Perché non è raccomandato:** Con `0x01`, perdi la capacità di accumulare le ricompense superiori a 32 ETH. Ogni minima parte in eccesso viene trasferita via automaticamente, il che limita il potenziale di guadagno del tuo validatore e richiede di gestire separatamente i fondi prelevati. + +## 0x02: Credenziali di prelievo ad accumulo (compounding) {#0x02-credentials} + +Il tipo `0x02` è stato introdotto con l'aggiornamento Pectra ed è la **scelta raccomandata** per i validatori di oggi. I validatori con credenziali `0x02` sono talvolta chiamati "validatori ad accumulo" (compounding validators). + +Con le credenziali `0x02`: + +- Le ricompense superiori a 32 ETH **si accumulano** con incrementi di 1 ETH fino a un saldo effettivo massimo di 2048 ETH +- I prelievi parziali devono essere richiesti manualmente (i trasferimenti automatici avvengono solo oltre la soglia dei 2048 ETH) +- I validatori possono consolidare più validatori da 32 ETH in un singolo validatore con saldo più elevato +- Le uscite complete sono ancora supportate attraverso la coda di uscita standard + +Sia i prelievi parziali che i consolidamenti possono essere eseguiti tramite le [Azioni del Validatore del Launchpad](https://launchpad.ethereum.org/en/validator-actions). + +**Perché i validatori dovrebbero preferire 0x02:** Offre una migliore efficienza del capitale attraverso l'accumulo, un maggiore controllo su quando avvengono i prelievi e supporta il consolidamento dei validatori. Per gli staker solitari che accumulano ricompense nel tempo, questo significa che il loro saldo effettivo, e quindi le loro ricompense, può crescere oltre i 32 ETH senza intervento manuale. + +**Importante:** Una volta convertito da `0x01` a `0x02`, non è possibile tornare indietro. + +Per una guida dettagliata sulla conversione alle credenziali di Tipo 2 e sulla funzionalità MaxEB, consulta la [pagina esplicativa su MaxEB](/roadmap/pectra/maxeb/). + +## Cosa dovrei scegliere? {#what-should-i-pick} + +- **Nuovi validatori:** Scegli `0x02`. È lo standard moderno con migliore accumulo e flessibilità. +- **Validatori 0x01 esistenti:** Prendi in considerazione la conversione a `0x02` se desideri che le ricompense si accumulino oltre i 32 ETH o se prevedi di consolidare i validatori. +- **Validatori 0x00 esistenti:** Aggiorna immediatamente: non puoi prelevare senza aggiornare le tue credenziali. Devi prima convertire a `0x01`, dopodiché potrai convertire a `0x02`. + +## Strumenti per la gestione delle credenziali di prelievo {#withdrawal-credential-tools} + +Diversi strumenti supportano la scelta o la conversione tra i tipi di credenziali: + +- **[Ethereum Staking Launchpad](https://launchpad.ethereum.org/en/validator-actions)** - Lo strumento ufficiale per i depositi e la gestione dei validatori, incluse le conversioni delle credenziali e i consolidamenti +- **[Pectra Staking Manager](https://pectrastaking.com)** - Interfaccia web con supporto per la connessione del portafoglio per conversioni e consolidamento +- **[Pectra Validator Ops CLI Tool](https://github.com/Luganodes/Pectra-Batch-Contract)** - Strumento a riga di comando per conversioni in blocco +- **[Ethereal](https://github.com/wealdtech/ethereal)** - Strumento CLI per le operazioni di Ethereum, inclusa la gestione dei validatori + +Per un elenco completo degli strumenti di consolidamento e istruzioni dettagliate sulla conversione, consulta gli [strumenti di consolidamento MaxEB](/roadmap/pectra/maxeb/#consolidation-tooling). + +## Letture consigliate {#further-reading} + +- [Chiavi nella prova di stake di Ethereum](/developers/docs/consensus-mechanisms/pos/keys/) - Scopri di più sulle chiavi dei validatori e su come si relazionano alle credenziali di prelievo +- [MaxEB](/roadmap/pectra/maxeb/) - Guida dettagliata sull'aggiornamento Pectra e sulla funzionalità del saldo effettivo massimo \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/index.md index 53525f1662a..80aef2ecdcb 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/index.md @@ -1,114 +1,114 @@ --- -title: Proof of Work (PoW) -description: Spiegazione del consenso con il protocollo Proof of Work e il suo ruolo in Ethereum. +title: Prova di lavoro (PoW) +description: Una spiegazione del protocollo di consenso della prova di lavoro e del suo ruolo in Ethereum. lang: it --- -La rete Ethereum venne avviata usando un meccanismo di consenso che utilizzava il **[Proof of Work (PoW)](/developers/docs/consensus-mechanisms/pow)** che consentiva ai nodi della rete Ethereum di concordare sullo stato di tutte le informazioni registrate sulla blockchain Ethereum e impediva alcuni tipi di attacchi economici. Tuttavia, Ethereum ha disattivato il Proof of Work nel 2022 e ha iniziato, invece, a usare il [Proof of Stake](/developers/docs/consensus-mechanisms/pos). +La rete [Ethereum](/) ha iniziato utilizzando un meccanismo di consenso che prevedeva la **[prova di lavoro (PoW)](/developers/docs/consensus-mechanisms/pow)**. Questo ha permesso ai nodi della rete Ethereum di concordare sullo stato di tutte le informazioni registrate sulla blockchain di Ethereum e ha prevenuto determinati tipi di attacchi economici. Tuttavia, Ethereum ha disattivato la prova di lavoro nel 2022 e ha iniziato a utilizzare invece la [prova di stake](/developers/docs/consensus-mechanisms/pos). - Il Proof of Work è diventato ormai obsoleto. Ethereum non usa più il Proof of Work come parte del suo meccanismo di consenso, e usa invece il Proof of Stake. Leggi di più sul [Proof of Stake](/developers/docs/consensus-mechanisms/pos/) e sullo [staking](/staking/). + La prova di lavoro è stata ora deprecata. Ethereum non utilizza più la prova di lavoro come parte del suo meccanismo di consenso. Utilizza invece la prova di stake. Maggiori informazioni sulla [prova di stake](/developers/docs/consensus-mechanisms/pos/) e sullo [staking](/staking/). ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere il materiale relativo alle [transazioni](/developers/docs/transactions/), [ai blocchi](/developers/docs/blocks/), e [ai meccanismi di consenso](/developers/docs/consensus-mechanisms/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima le [transazioni](/developers/docs/transactions/), i [blocchi](/developers/docs/blocks/) e i [meccanismi di consenso](/developers/docs/consensus-mechanisms/). -## Cos'è la Proof of Work (PoW)? {#what-is-pow} +## Cos'è la prova di lavoro (PoW)? {#what-is-pow} -Il consenso di Nakamoto, che utilizza il proof-of-work, è il meccanismo che un tempo consentiva alla rete decentralizzata di Ethereum di raggiungere il consenso (ossia, l'accordo di tutti i nodi) su aspetti come i saldi dei conti e l'ordine delle transazioni. Questo impediva che gli utenti spendessero due volte le loro monete e assicurava che la catena Ethereum fosse estremamente difficile da attaccare o manipolare. Ora, invece, queste proprietà di sicurezza provengono dal proof-of-stake, usando il meccanismo di consenso noto come [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). +Il consenso di Nakamoto, che utilizza la prova di lavoro, è il meccanismo che un tempo consentiva alla rete decentralizzata di Ethereum di raggiungere il consenso (ovvero, tutti i nodi concordano) su cose come i saldi degli account e l'ordine delle transazioni. Questo impediva agli utenti di "spendere due volte" le loro monete e garantiva che la catena di Ethereum fosse tremendamente difficile da attaccare o manipolare. Queste proprietà di sicurezza ora derivano invece dalla prova di stake utilizzando il meccanismo di consenso noto come [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/). -## Proof of Work e mining {#pow-and-mining} +## Prova di lavoro e mining {#pow-and-mining} -Il Proof of Work è l'algoritmo sottostante che imposta la difficoltà e le regole per il lavoro che i miner devono svolgere su blockchain di Proof of Work. Il mining è il "lavoro" da svolgere. Si tratta dell'atto di aggiungere blocchi validi alla catena. Questo è importante perché la lunghezza della catena aiuta le rete a seguire la corretta diramazione della blockchain. Più "lavoro" viene svolto, più è lunga la catena e maggiore è il numero di blocchi, e più la rete può essere certa dello stato attuale delle cose. +La prova di lavoro è l'algoritmo sottostante che imposta la difficoltà e le regole per il lavoro che i minatori svolgono sulle blockchain basate sulla prova di lavoro. Il mining è il "lavoro" stesso. È l'atto di aggiungere blocchi validi alla catena. Questo è importante perché la lunghezza della catena aiuta la rete a seguire la biforcazione corretta della blockchain. Più "lavoro" viene svolto, più lunga è la catena e maggiore è il numero del blocco, più la rete può essere certa dello stato attuale delle cose. [Maggiori informazioni sul mining](/developers/docs/consensus-mechanisms/pow/mining/) -## Come funzionava il Proof of Work di Ethereum? {#how-it-works} +## Come funzionava la prova di lavoro di Ethereum? {#how-it-works} -Le transazioni di Ethereum vengono elaborate in blocchi. Nell'Ethereum Proof of Work ora obsoleto, ogni blocco conteneva: +Le transazioni di Ethereum vengono elaborate in blocchi. Nell'ormai deprecato Ethereum basato sulla prova di lavoro, ogni blocco conteneva: -- difficoltà del blocco, ad esempio: 3.324.092.183.262.715 -- un mixHash, ad esempio: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` -- nonce, ad esempio: `0xd3ee432b4fb3d26b` +- difficoltà del blocco – ad esempio: 3,324,092,183,262,715 +- mixHash – ad esempio: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` +- nonce – ad esempio: `0xd3ee432b4fb3d26b` -Questi dati del blocco erano correlati direttamente alla al Proof of Work +Questi dati del blocco erano direttamente correlati alla prova di lavoro. -### Il lavoro nel Proof of Work {#the-work} +### Il lavoro nella prova di lavoro {#the-work} -Il protocollo di Proof of Work, detto Ethash, richiedeva che i miner competessero tramite processi di tentativo ed errore per trovare il nonce di un blocco. Solo i blocchi con un nonce valido potevano essere aggiunti alla catena. +Il protocollo di prova di lavoro, Ethash, richiedeva ai minatori di affrontare un'intensa corsa per tentativi ed errori per trovare il nonce per un blocco. Solo i blocchi con un nonce valido potevano essere aggiunti alla catena. -Quando competeva per creare un blocco, un miner inseriva ripetutamente un set di dati, che si poteva ottenere solo tramite il download e l'esecuzione dell'intera catena (che è quello che fa il miner), attraverso una funzione matematica. Il set di dati veniva utilizzato per generare un mixHash al di sotto di un target dettato dalla difficoltà del blocco. Il miglior modo per farlo era tramite un processo di ripetuti tentativi ed errori. +Durante la corsa per creare un blocco, un minatore inseriva ripetutamente un set di dati, che poteva essere ottenuto solo scaricando ed eseguendo l'intera catena (come fa un minatore), attraverso una funzione matematica. Il set di dati veniva utilizzato per generare un mixHash al di sotto di un obiettivo dettato dalla difficoltà del blocco. Il modo migliore per farlo è per tentativi ed errori. -La difficoltà determinava il target per l'hash. Più basso era il target, più piccolo era il set di hash validi. Una volta generato, era incredibilmente facile per gli altri miner e client verificarne la bontà. Anche se una transazione fosse cambiata, l'hash sarebbe stato completamente diverso, segnalando una potenziale frode. +La difficoltà determinava l'obiettivo per l'hash. Più basso era l'obiettivo, più piccolo era l'insieme di hash validi. Una volta generato, questo era incredibilmente facile da verificare per altri minatori e client. Anche se una sola transazione fosse cambiata, l'hash sarebbe stato completamente diverso, segnalando una frode. -L'hashing rende le frodi facili da individuare. Ma il processo del Proof of Work era anche un grande deterrente contro gli attacchi alla catena. +L'hashing rende le frodi facili da individuare. Ma la prova di lavoro come processo era anche un grande deterrente contro gli attacchi alla catena. -### Proof of Work e sicurezza {#security} +### Prova di lavoro e sicurezza {#security} -I miner erano incentivati a fare questo lavoro sulla catena principale di Ethereum. L'incentivo a iniziare una catena propria era molto ridotto per i miner, perché avrebbe compromesso il sistema. Le blockchain fanno affidamento sul fatto di avere un solo stato di riferimento, che è considerato l'unica fonte di verità. +I minatori erano incentivati a svolgere questo lavoro sulla catena principale di Ethereum. C'era poco incentivo per un sottoinsieme di minatori a iniziare la propria catena: mina il sistema. Le blockchain si basano sull'avere un singolo stato come fonte di verità. -L'obiettivo del Proof of Work era di estendere la catena. La catena più lunga era quella più credibile in termini di validità, perché era quella che racchiudeva in sé la maggior parte del lavoro computazionale eseguito. Nel sistema PoW di Ethereum era praticamente impossibile creare nuovi blocchi che cancellassero transazioni o che ne creassero di false, o mantenere una seconda catena. Questo perché un miner malevolo avrebbe dovuto sempre risolvere il nonce del blocco più velocemente di chiunque altro. +L'obiettivo della prova di lavoro era estendere la catena. La catena più lunga era la più credibile come quella valida perché aveva la maggior quantità di lavoro computazionale svolto per generarla. All'interno del sistema PoW di Ethereum, era quasi impossibile creare nuovi blocchi che cancellassero transazioni, ne creassero di false o mantenessero una seconda catena. Questo perché un minatore malintenzionato avrebbe dovuto risolvere sempre il nonce del blocco più velocemente di tutti gli altri. -Per creare costantemente blocchi malevoli ma validi, un miner malevolo avrebbe dovuto avere più del 51% della potenza di mining della rete, per poter battere tutti gli altri. Tale quantità di "lavoro" richiede un grande quantità di costosa potenza di calcolo e l'energia consumata avrebbe potuto persino superare i guadagni derivanti dall'attacco. +Per creare costantemente blocchi malintenzionati ma validi, un minatore malintenzionato avrebbe avuto bisogno di oltre il 51% della potenza di mining della rete per battere tutti gli altri. Quella quantità di "lavoro" richiede molta potenza di calcolo costosa e l'energia spesa avrebbe potuto persino superare i guadagni ottenuti in un attacco. -### L'economia della Proof of Work {#economics} +### Economia della prova di lavoro {#economics} -Il Proof of Work era anche responsabile del rilascio di nuova valuta nel sistema e dell'incentivazione dei miner a fare il proprio lavoro. +La prova di lavoro era anche responsabile dell'emissione di nuova valuta nel sistema e dell'incentivazione dei minatori a svolgere il lavoro. -Dall'[aggiornamento di Costantinopoli](/ethereum-forks/#constantinople), i miner che creavano correttamente un blocco erano ricompensati con due ETH appena coniati e parte delle commissioni di transazione. Anche i blocchi ommer erano ricompensati con 1,75 ETH. I blocchi ommer erano blocchi validi, creati da un miner praticamente contestualmente alla creazione del blocco canonico da parte di un altro miner, determinati in ultima analisi dalla catena su cui la creazione era avvenuta prima. I blocchi ommer si verificavano in genere a causa della latenza della rete. +A partire dall'aggiornamento [Constantinople](/ethereum-forks/#constantinople), i minatori che creavano con successo un blocco venivano ricompensati con due ETH appena coniati e parte delle commissioni della transazione. I blocchi ommer compensavano anche 1,75 ETH. I blocchi ommer erano blocchi validi creati da un minatore praticamente nello stesso momento in cui un altro minatore creava il blocco canonico, che alla fine veniva determinato da quale catena veniva costruita per prima. I blocchi ommer di solito si verificavano a causa della latenza della rete. ## Finalità {#finality} -Una transazione ha una "finalità" su Ethereum quando fa parte di un blocco che non può cambiare. +Una transazione ha "finalità" su Ethereum quando fa parte di un blocco che non può cambiare. -Dato che i miner lavoravano in modo decentralizzato, era possibile che avvenisse il mining di due blocchi validi nello stesso momento. In questo caso, si crea una diramazione temporanea. Alla fine veniva accettata una sola catena (quella più lunga), creata quando venivano eseguiti il mining e l'aggiunta di blocchi successivi. +Poiché i minatori lavoravano in modo decentralizzato, due blocchi validi potevano essere minati contemporaneamente. Questo crea una biforcazione temporanea. Alla fine, una di queste catene diventava la catena accettata dopo che i blocchi successivi venivano minati e aggiunti ad essa, rendendola più lunga. -Per complicare ulteriormente le cose, le transazioni che erano state rifiutate sulla diramazione temporanea potevano non essere state aggiunte alla catena accettata. Questo significa che la catena poteva essere annullata. Quindi la finalità si riferisce al tempo per cui era necessario attendere prima di considerare una transazione irreversibile. Con il precedente Ethereum di Proof of Work, più blocchi erano minati su uno specifico blocco `N`, maggiore sarebbe stata la certezza che le transazioni in `N` riuscissero e non fossero annullate. Ora, con il Proof of Stake, la finalizzazione è una proprietà esplicita, piuttosto che probabilistica, di un blocco. +A complicare ulteriormente le cose, le transazioni rifiutate sulla biforcazione temporanea potrebbero non essere state incluse nella catena accettata. Ciò significa che potrebbero essere annullate. Quindi la finalità si riferisce al tempo che dovresti aspettare prima di considerare una transazione irreversibile. Nel precedente Ethereum basato sulla prova di lavoro, più blocchi venivano minati sopra un blocco specifico `N`, maggiore era la sicurezza che le transazioni in `N` avessero avuto successo e non sarebbero state annullate. Ora, con la prova di stake, la finalizzazione è una proprietà esplicita, piuttosto che probabilistica, di un blocco. -## Consumo energetico del Proof of Work {#energy} +## Consumo energetico della prova di lavoro {#energy} -Una delle principali critiche mosse al Proof of Work riguarda la quantità di energia necessaria per mantenere la rete sicura. Per mantenere la sicurezza e la decentralizzazione, Ethereum sul Proof of Work consumava elevate quantità di energia. Poco prima di passare al Proof of Stake, i miner di Ethereum consumavano collettivamente circa 70 TWh/anno (quasi quanto la Repubblica ceca, secondo [digiconomist](https://digiconomist.net/), il 18 luglio 2022). +Una delle principali critiche alla prova di lavoro è la quantità di energia richiesta per mantenere la rete sicura. Per mantenere la sicurezza e la decentralizzazione, Ethereum basato sulla prova di lavoro consumava grandi quantità di energia. Poco prima di passare alla prova di stake, i minatori di Ethereum consumavano collettivamente circa 70 TWh/anno (più o meno come la Repubblica Ceca - secondo [digiconomist](https://digiconomist.net/) il 18 luglio 2022). ## Pro e contro {#pros-and-cons} -| Pro | Contro | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Il Proof of Work è neutrale. Non servono ETH per iniziare e le ricompense per i blocchi consentono di passare da 0 ETH a un saldo positivo. Con il [ Proof of Stake](/developers/docs/consensus-mechanisms/pos/) occorrono ETH per iniziare. | Il Proof of Work utilizza così tanta energia da risultare dannoso per l'ambiente. | -| Il PoW è un meccanismo di consenso testato e ben collaudato che mantiene Bitcoin ed Ethereum sicure e decentralizzate da molti anni. | Chi desidera occuparsi di mining deve avere apparecchiature specializzate, con un conseguente notevole investimento iniziale. | -| Rispetto alla Proof of Stake è relativamente facile da implementare. | A causa della crescente richiesta di potenza di calcolo, alcuni i gruppi di mining potrebbero potenzialmente dominare l'attività di mining, portando così alla centralizzazione e a rischi di sicurezza. | +| Pro | Contro | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| La prova di lavoro è neutrale. Non hai bisogno di ETH per iniziare e le ricompense del blocco ti consentono di passare da 0 ETH a un saldo positivo. Con la [prova di stake](/developers/docs/consensus-mechanisms/pos/) hai bisogno di ETH per iniziare. | La prova di lavoro consuma così tanta energia da essere dannosa per l'ambiente. | +| La prova di lavoro è un meccanismo di consenso collaudato che ha mantenuto Bitcoin ed Ethereum sicuri e decentralizzati per molti anni. | Se vuoi minare, hai bisogno di attrezzature così specializzate che rappresenta un grande investimento per iniziare. | +| Rispetto alla prova di stake è relativamente facile da implementare. | A causa del crescente calcolo necessario, le pool di mining potrebbero potenzialmente dominare il gioco del mining, portando a centralizzazione e rischi per la sicurezza. | -## Confronto con il Proof of Stake {#compared-to-pos} +## Confronto con la prova di stake {#compared-to-pos} -Ad alto livello, il Proof of Stake ha lo stesso obiettivo del Proof of Work: permettere a una rete decentralizzata di raggiungere il consenso in totale sicurezza. Ma ci sono alcune differenze nei processi e nel personale: +Ad alto livello, la prova di stake ha lo stesso obiettivo finale della prova di lavoro: aiutare la rete decentralizzata a raggiungere il consenso in modo sicuro. Ma presenta alcune differenze nel processo e nel personale: -- Il PoS scambia l'importanza della potenza di calcolo con gli ETH in staking. -- Il PoS sostituisce i miner con i validatori. I validatori fanno staking con i loro ETH per avere la possibilità di creare nuovi blocchi. -- I validatori non competono per creare blocchi, sono invece scelti casualmente da un algoritmo. -- La finalità è più chiara: in alcuni checkpoint, se i 2/3 dei validatori concordano sullo stato del blocco, questo è considerato definitivo. I validatori devono scommettere il loro intero stake su questo, per cui se dovessero provare a cospirare in seguito, perderebbero il loro intero stake. +- La prova di stake sostituisce l'importanza della potenza di calcolo con gli ETH in staking. +- La prova di stake sostituisce i minatori con i validatori. I validatori mettono in staking i loro ETH per attivare la capacità di creare nuovi blocchi. +- I validatori non competono per creare blocchi, ma vengono scelti casualmente da un algoritmo. +- La finalità è più chiara: a determinati checkpoint, se 2/3 dei validatori concordano sullo stato del blocco, questo è considerato finale. I validatori devono scommettere il loro intero stake su questo, quindi se cercano di colludere in seguito, perderanno il loro intero stake. -[Maggiori informazioni sul Proof of Stake](/developers/docs/consensus-mechanisms/pos/) +[Maggiori informazioni sulla prova di stake](/developers/docs/consensus-mechanisms/pos/) -## Preferisci un approccio visivo all'apprendimento? {#visual-learner} +## Impari meglio visivamente? {#visual-learner} ## Letture consigliate {#further-reading} -- [Majority attack](https://en.bitcoin.it/wiki/Majority_attack) -- [On settlement finality](https://blog.ethereum.org/2016/05/09/on-settlement-finality) +- [Attacco di maggioranza](https://en.bitcoin.it/wiki/Majority_attack) +- [Sulla finalità del regolamento](https://blog.ethereum.org/2016/05/09/on-settlement-finality) ### Video {#videos} -- [Una spiegazione tecnica dei protocolli proof-of-work](https://youtu.be/9V1bipPkCTU) +- [Una spiegazione tecnica dei protocolli di prova di lavoro](https://youtu.be/9V1bipPkCTU) ## Argomenti correlati {#related-topics} - [Mining](/developers/docs/consensus-mechanisms/pow/mining/) -- [Proof of Stake](/developers/docs/consensus-mechanisms/pos/) -- [Proof of Authority](/developers/docs/consensus-mechanisms/poa/) +- [Prova di stake](/developers/docs/consensus-mechanisms/pos/) +- [Prova di autorità](/developers/docs/consensus-mechanisms/poa/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/index.md index 4836bc6c326..e0fd8073ef2 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -8,74 +8,74 @@ lang: it -Il Proof of Work non è più il meccanismo di consenso alla base di Ethereum, il che significa che il mining è stato disattivato. Invece, Ethereum è protetto dai validatori che mettono ETH in staking. Puoi iniziare fin da subito a mettere in staking i tuoi ETH. Leggi di più su La Fusione, il proof-of-stake e lo staking. Questa pagina è solo per interesse storico. +La prova di lavoro non è più alla base del meccanismo di consenso di Ethereum, il che significa che il mining è stato disattivato. Invece, [Ethereum](/) è protetto da validatori che mettono in stake ETH. Puoi iniziare a fare staking dei tuoi ETH oggi stesso. Maggiori informazioni su La Fusione (The Merge), prova di stake e staking. Questa pagina è solo di interesse storico. ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere [transazioni](/developers/docs/transactions/), [blocchi](/developers/docs/blocks/) e [Proof of Work](/developers/docs/consensus-mechanisms/pow/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima le [transazioni](/developers/docs/transactions/), i [blocchi](/developers/docs/blocks/) e la [prova di lavoro](/developers/docs/consensus-mechanisms/pow/). -## Cos'è il mining in Ethereum? {#what-is-ethereum-mining} +## Cos'è il mining di Ethereum? {#what-is-ethereum-mining} -Il mining è il processo di creazione di un blocco di transazioni, da aggiungere alla blockchain Ethereum nell'architettura ormai obsoleta di Proof of Work. +Il mining è il processo di creazione di un blocco di transazioni da aggiungere alla blockchain di Ethereum nell'architettura di prova di lavoro di Ethereum, ora deprecata. -La parola mining origina nel contesto dell'analogia dell'oro per le criptovalute. L'oro e i metalli preziosi sono scarsi, così come i token digitali, e l'unico modo per aumentarne il volume totale in un sistema di Proof of Work attraverso il mining. Nell'Ethereum Proof of Work, l'unico metodo di emissione era tramite il mining. A differenza dell'oro e dei metalli preziosi, però, il mining di Ethereum era anche il metodo per proteggere la rete, creando, verificando, pubblicando e propagando i blocchi nella blockchain. +La parola mining ha origine nel contesto dell'analogia dell'oro per le criptovalute. L'oro o i metalli preziosi sono scarsi, così come i token digitali, e l'unico modo per aumentare il volume totale in un sistema di prova di lavoro è attraverso il mining. In Ethereum basato sulla prova di lavoro, l'unica modalità di emissione era tramite il mining. A differenza dell'oro o dei metalli preziosi, tuttavia, il mining di Ethereum era anche il modo per proteggere la rete creando, verificando, pubblicando e propagando blocchi nella blockchain. Minare ether = Proteggere la Rete -Il mining è la linfa vitale di qualsiasi blockchain basata sul Proof of Work. Prima della transizione al Proof of Stake, i miner di Ethereum (computer che eseguono software) usavano il loro tempo e la loro capacità di calcolo per elaborare transazioni e produrre blocchi. +Il mining è la linfa vitale di qualsiasi blockchain basata sulla prova di lavoro. I minatori di Ethereum - computer che eseguono software - usavano il loro tempo e la loro potenza di calcolo per elaborare transazioni e produrre blocchi prima della transizione alla prova di stake. -## Perché esistono i miner? {#why-do-miners-exist} +## Perché esistono i minatori? {#why-do-miners-exist} -Nei sistemi decentralizzati come Ethereum, dobbiamo assicurarci che tutti concordino sull'ordine delle transazioni. In questo i miner aiutavano risolvendo complessi enigmi di calcolo con lo scopo di produrre blocchi, tenendo la rete al sicuro dagli attacchi. +Nei sistemi decentralizzati come Ethereum, dobbiamo assicurarci che tutti siano d'accordo sull'ordine delle transazioni. I minatori aiutavano a far sì che ciò accadesse risolvendo enigmi computazionalmente difficili per produrre blocchi, proteggendo la rete dagli attacchi. -[Maggiori informazioni sul Proof of Work](/developers/docs/consensus-mechanisms/pow/) +[Maggiori informazioni sulla prova di lavoro](/developers/docs/consensus-mechanisms/pow/) -In precedenza, chiunque poteva minare sulla rete Ethereum usando il proprio computer. Tuttavia, non tutti potevano estrarre ether (ETH) in modo redditizio. In gran parte dei casi, i miner dovevano acquistare hardware dedicato e avere accesso a fonti energetiche convenienti. Per il computer medio, era improbabile guadagnare abbastanza ricompense dei blocchi da coprire i costi associati al mining. +In precedenza, chiunque era in grado di minare sulla rete di Ethereum usando il proprio computer. Tuttavia, non tutti potevano minare ether (ETH) in modo redditizio. Nella maggior parte dei casi, i minatori dovevano acquistare hardware informatico dedicato e avere accesso a fonti di energia economiche. Era improbabile che il computer medio guadagnasse abbastanza ricompense del blocco per coprire i costi associati al mining. -### Costi del mining {#cost-of-mining} +### Costo del mining {#cost-of-mining} -- I costi potenziali dell'hardware necessario per costruire e mantenere una piattaforma di mining -- I costi elettrici per alimentarla -- Se si effettuava il mining all'interno di un gruppo, questi gruppi di mining addebitavano generalmente una commissione forfettaria percentuale su ciascun blocco generato dal gruppo -- I costi potenziali delle attrezzature per supportare la piattaforma di mining (ventilazione, monitoraggio energetico, cablaggio, etc.) +- Costi potenziali dell'hardware necessario per costruire e mantenere un impianto di mining (mining rig) +- Costo elettrico per alimentare l'impianto di mining +- Se stavi minando in una pool, queste pool in genere addebitavano una commissione percentuale fissa su ogni blocco generato dalla pool +- Costo potenziale delle attrezzature per supportare l'impianto di mining (ventilazione, monitoraggio dell'energia, cablaggio elettrico, ecc.) -Per approfondire ulteriormente la redditività del mining, usa un apposito calcolatore, come quello messo a disposizione da [Etherscan](https://etherscan.io/ether-mining-calculator). +Per esplorare ulteriormente la redditività del mining, usa un calcolatore di mining, come quello fornito da [Etherscan](https://etherscan.io/ether-mining-calculator). -## Come avveniva il mining delle transazioni Ethereum {#how-ethereum-transactions-were-mined} +## Come venivano minate le transazioni di Ethereum {#how-ethereum-transactions-were-mined} -Quanto segue fornisce una panoramica di come erano minate le transazioni, nel proof-of-work di Ethereum. Una descrizione analoga di questo processo per il proof-of-stake di Ethereum, si può trovare [qui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). +Di seguito viene fornita una panoramica di come le transazioni venivano minate nella prova di lavoro di Ethereum. Una descrizione analoga di questo processo per la prova di stake di Ethereum può essere trovata [qui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Un utente scrive e firma una richiesta di [transazione](/developers/docs/transactions/) con la chiave privata di un [conto](/developers/docs/accounts/). -2. L'utente trasmette la richiesta di transazione all'intera rete Ethereum attraverso un [nodo](/developers/docs/nodes-and-clients/). -3. Dopo aver recepito la richiesta della nuova transazione, ogni nodo nella rete Ethereum aggiunge la richiesta alla propria mempool locale, un elenco di tutte le richieste di transazioni delle quali è venuto a conoscenza e che non sono ancora state inviate alla blockchain in un blocco. -4. A un certo punto, un nodo di mining aggrega diverse dozzine o centinaia di richieste di transazione in un [blocco](/developers/docs/blocks/) potenziale, così da massimizzare le [commissioni di transazione](/developers/docs/gas/) che saranno guadagnate, entro il limite di gas del blocco. A questo punto, il nodo di mining: - 1. Verifica la validità di ogni richiesta di transazione (cioè, che nessuno stia provando a trasferire ether da un conto per cui non ha prodotto una firma, la richiesta non è malformata, etc.) e, poi, esegue il codice della richiesta, alterando lo stato della loro copia locale dell'EVM. Il miner assegna la commissione sulla transazione per ogni simile richiesta di transazione, al proprio conto. - 2. Inizia il processo di produzione del "certificato di legittimità" Proof of Work per il blocco potenziale, una volta che tutte le richieste di transazione nel blocco sono state verificate ed eseguite nella copia dell'EVM locale. -5. Infine un miner concluderà la produzione di un certificato per un blocco che include la nostra richiesta di transazione specifica. Il miner trasmetterà quindi il blocco completato, che include il certificato e una checksum del nuovo stato dell'EVM dichiarato. -6. Gli altri nodi vengono a conoscenza del nuovo blocco. Verificano il certificato, eseguono tutte le transazioni sul blocco (includendo la transazione originalmente inviata dal nostro utente) e verificano che la checksum del nuovo stato dell'EVM dopo l'esecuzione di tutte le transazioni combaci quella dello stato dichiarato dal blocco del miner. Solo a questo punto allora questi nodi aggiungeranno il blocco alla coda della blockchain e accetteranno il nuovo stato dell'EVM come canonico. -7. Ogni nodo rimuove tutte le transazioni nel nuovo blocco dalla propria mempool locale di richieste di transazioni non eseguite. -8. I nuovi nodi che si aggiungono alla rete scaricano tutti i blocchi in sequenza, incluso il blocco che contiene la transazione della quale stiamo parlando. Inizializzano la propria copia locale dell'EVM (che partirà come EVM con stato vuoto) e si avvieranno al processo di esecuzione di ogni transazione contenuta in ogni blocco aggiungendola alla propria copia dell'EVM locale e verificando le checksum dello stato ad ogni blocco che esamineranno. +1. Un utente scrive e firma una richiesta di [transazione](/developers/docs/transactions/) con la chiave privata di un [account](/developers/docs/accounts/). +2. L'utente trasmette la richiesta di transazione all'intera rete di Ethereum da un [nodo](/developers/docs/nodes-and-clients/). +3. Dopo aver appreso della nuova richiesta di transazione, ogni nodo nella rete di Ethereum aggiunge la richiesta alla propria mempool locale, un elenco di tutte le richieste di transazione di cui sono venuti a conoscenza e che non sono ancora state confermate nella blockchain in un blocco. +4. A un certo punto, un nodo di mining aggrega diverse dozzine o centinaia di richieste di transazione in un potenziale [blocco](/developers/docs/blocks/), in un modo che massimizza le [commissioni della transazione](/developers/docs/gas/) che guadagnano pur rimanendo al di sotto del limite del gas del blocco. Il nodo di mining quindi: + 1. Verifica la validità di ogni richiesta di transazione (ad es., nessuno sta cercando di trasferire ether da un account per cui non ha prodotto una firma, la richiesta non è malformata, ecc.), e poi esegue il codice della richiesta, alterando lo stato della propria copia locale della EVM. Il minatore assegna la commissione della transazione per ciascuna di queste richieste di transazione al proprio account. + 2. Inizia il processo di produzione del "certificato di legittimità" della prova di lavoro per il potenziale blocco, una volta che tutte le richieste di transazione nel blocco sono state verificate ed eseguite sulla copia locale della EVM. +5. Alla fine, un minatore finirà di produrre un certificato per un blocco che include la nostra specifica richiesta di transazione. Il minatore trasmette quindi il blocco completato, che include il certificato e un checksum del nuovo stato della EVM dichiarato. +6. Altri nodi vengono a conoscenza del nuovo blocco. Verificano il certificato, eseguono loro stessi tutte le transazioni sul blocco (inclusa la transazione originariamente trasmessa dal nostro utente) e verificano che il checksum del loro nuovo stato della EVM dopo l'esecuzione di tutte le transazioni corrisponda al checksum dello stato dichiarato dal blocco del minatore. Solo allora questi nodi aggiungono questo blocco alla fine della loro blockchain e accettano il nuovo stato della EVM come stato canonico. +7. Ogni nodo rimuove tutte le transazioni nel nuovo blocco dalla propria mempool locale di richieste di transazione non soddisfatte. +8. I nuovi nodi che si uniscono alla rete scaricano tutti i blocchi in sequenza, incluso il blocco contenente la nostra transazione di interesse. Inizializzano una copia locale della EVM (che inizia come una EVM a stato vuoto), e poi passano attraverso il processo di esecuzione di ogni transazione in ogni blocco sopra la loro copia locale della EVM, verificando i checksum dello stato ad ogni blocco lungo il percorso. -Il mining di ogni transazione (cioè l'inclusione in un nuovo blocco e la prima propagazione) avviene una volta sola, ma la transazione viene eseguita e verificata da ogni partecipante nel processo di avanzamento dello stato canonico dell'EVM. Questa è una delle regole fondamentali della blockchain: **non ti fidare, verifica**. +Ogni transazione viene minata (inclusa in un nuovo blocco e propagata per la prima volta) una volta, ma eseguita e verificata da ogni partecipante nel processo di avanzamento dello stato canonico della EVM. Questo evidenzia uno dei mantra centrali della blockchain: **Non fidarti, verifica**. -## Blocchi ommer (zio) {#ommer-blocks} +## Blocchi ommer (uncle) {#ommer-blocks} -L'estrazione di blocchi basata sul proof-of-work era solo probabilistica, il che significa che a volte due blocchi validi venivano pubblicati simultaneamente a causa della latenza della rete. In questo caso, il protocollo doveva determinare la catena più lunga (e quindi più "valida") garantendo al tempo stesso un trattamento equo dei miner, ricompensando parzialmente il blocco valido proposto non incluso. Ciò incoraggiava l'ulteriore decentralizzazione della rete in quanto i piccoli miner, che potevano trovarsi ad affrontare una latenza più elevata, potevano comunque generare rendimenti tramite ricompense per blocchi [ommer](/glossary/#ommer). +Il mining dei blocchi sulla prova di lavoro era probabilistico, il che significa che a volte due blocchi validi venivano pubblicati contemporaneamente a causa della latenza della rete. In questo caso, il protocollo doveva determinare la catena più lunga (e quindi più "valida") garantendo al contempo equità verso i minatori ricompensando parzialmente il blocco valido proposto non incluso. Questo incoraggiava un'ulteriore decentralizzazione della rete poiché i minatori più piccoli, che potevano affrontare una maggiore latenza, potevano comunque generare rendimenti tramite le ricompense del blocco [ommer](/glossary/#ommer). -"Ommer" è il termine preferito, neutro dal punto di vista del genere, per lo stesso livello di un blocco genitore, ma a volte viene anche indicato come "zio". **Da quando Ethereum è passato alla proof-of-stake, i blocchi ommer non vengono più estratti** poiché in ogni slot viene eletto solo un proponente. Questo cambiamento può essere osservato nel [grafico storico](https://ycharts.com/indicators/ethereum_uncle_rate) dei blocchi ommer estratti. +Il termine "ommer" è il termine neutro preferito per il fratello di un blocco genitore, ma a volte viene anche chiamato "uncle" (zio). **Dal passaggio di Ethereum alla prova di stake, i blocchi ommer non vengono più minati** poiché viene eletto un solo proponente in ogni slot. Puoi vedere questo cambiamento visualizzando il [grafico storico](https://ycharts.com/indicators/ethereum_uncle_rate) dei blocchi ommer minati. -## Demo visiva {#a-visual-demo} +## Una demo visiva {#a-visual-demo} -Austin ti guiderà attraverso il mining e la blockchain basata sul proof-of-work. +Guarda Austin guidarti attraverso il mining e la blockchain basata sulla prova di lavoro. ## L'algoritmo di mining {#mining-algorithm} -La Rete principale di Ethereum ha sempre e solo usato un algoritmo di mining: ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash è stato il successore di un algoritmo R&D originale noto come ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/). +La rete principale di Ethereum ha utilizzato un solo algoritmo di mining: ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/). Ethash era il successore di un algoritmo originale di ricerca e sviluppo noto come ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/). [Maggiori informazioni sugli algoritmi di mining](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/). @@ -83,4 +83,4 @@ La Rete principale di Ethereum ha sempre e solo usato un algoritmo di mining: [' - [Gas](/developers/docs/gas/) - [EVM](/developers/docs/evm/) -- [Proof of Work](/developers/docs/consensus-mechanisms/pow/) +- [Prova di lavoro](/developers/docs/consensus-mechanisms/pow/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index b7e06e4f117..788154314f7 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -1,29 +1,29 @@ --- title: Dagger-Hashimoto -description: Uno sguardo dettagliato all'algoritmo di Dagger-Hashimoto. +description: Uno sguardo dettagliato all'algoritmo Dagger-Hashimoto. lang: it --- -Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il mining è stato disattivato completamente con [La Fusione](/roadmap/merge/), il 15 settembre 2022. Da allora, Ethereum è stato assicurato utilizzando un meccanismo [proof-of-of-stake](/developers/docs/consensus-mechanisms/pos). Questa pagina è di interesse storico - le informazioni qui non sono più rilevanti per post-Merge Ethereum. +Dagger-Hashimoto è stata l'implementazione di ricerca e la specifica originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il mining è stato completamente disattivato con [Il Merge](/roadmap/merge/) il 15 settembre 2022. Da allora, Ethereum è stato messo in sicurezza utilizzando invece un meccanismo di [prova di stake](/developers/docs/consensus-mechanisms/pos). Questa pagina è di interesse storico: le informazioni qui contenute non sono più rilevanti per l'Ethereum post-Merge. ## Prerequisiti {#prerequisites} -Per meglio comprendere questa pagina, ti consigliamo prima di informarti sul [consenso proof-of-work](/developers/docs/consensus-mechanisms/pow), sul [mining](/developers/docs/consensus-mechanisms/pow/mining) e sugli [algoritmi di mining](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima il [consenso basato sulla prova di lavoro](/developers/docs/consensus-mechanisms/pow), il [mining](/developers/docs/consensus-mechanisms/pow/mining) e gli [algoritmi di mining](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms). ## Dagger-Hashimoto {#dagger-hashimoto} -Dagger-Hashimoto punta a soddisfare due obiettivi: +Dagger-Hashimoto mira a soddisfare due obiettivi: -1. **Resistenza ASIC**: la creazione di hardware specializzato per l'algoritmo dovrebbe apportare un beneficio minimo -2. **Verificabilità da un client leggero**: un blocco dovrebbe essere efficientemente verificabile da un client leggero. +1. **Resistenza agli ASIC**: il vantaggio derivante dalla creazione di hardware specializzato per l'algoritmo dovrebbe essere il più piccolo possibile +2. **Verificabilità del client leggero**: un blocco dovrebbe essere verificabile in modo efficiente da un client leggero. -Con una modifica aggiuntiva, specifichiamo anche come raggiungere un terzo obiettivo se desiderato, ma al costo di una maggiore complessità: +Con un'ulteriore modifica, specifichiamo anche come soddisfare un terzo obiettivo, se lo si desidera, ma al costo di una maggiore complessità: -**Archiviazione della catena completa**: il mining dovrebbe richiedere l'archiviazione dello stato completo della blockchain (a causa della struttura irregolare dell'albero di stato di Ethereum, prevediamo la possibilità di alcune potature (pruning), soprattutto dopo alcuni contratti usati spesso, che vogliamo comunque mantenere al minimo). +**Archiviazione dell'intera catena**: il mining dovrebbe richiedere l'archiviazione dello stato completo della blockchain (a causa della struttura irregolare del trie dello stato di Ethereum, prevediamo che sarà possibile una certa potatura, in particolare di alcuni contratti usati di frequente, ma vogliamo ridurla al minimo). ## Generazione del DAG {#dag-generation} -Il codice per l'algoritmo sarà definito in Python, di seguito. Per prima cosa, diamo `encode_int` per il marshaling in stringhe di interi non firmati con una precisione specificata. È dato anche il suo opposto: +Il codice per l'algoritmo verrà definito in Python di seguito. Innanzitutto, forniamo `encode_int` per il marshalling di interi senza segno di precisione specificata in stringhe. Viene fornito anche il suo inverso: ```python NUM_BITS = 512 @@ -45,7 +45,7 @@ def decode_int(s): return x ``` -Poi supponiamo che `sha3` sia una funzione che prende un intero e produce un intero e che `dbl_sha3` sia una funzione double-sha3; se vogliamo convertire questo codice di riferimento in un uso d'implementazione: +Supponiamo poi che `sha3` sia una funzione che accetta un intero e restituisce un intero, e `dbl_sha3` sia una funzione double-sha3; se si converte questo codice di riferimento in un'implementazione, utilizzare: ```python from pyethereum import utils @@ -62,31 +62,31 @@ def dbl_sha3(x): ### Parametri {#parameters} -I parametri usati per l'algoritmo sono: +I parametri utilizzati per l'algoritmo sono: ```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 2**512 +SAFE_PRIME_512 = 2**512 - 38117 # Il più grande numero primo sicuro minore di 2**512 params = { - "n": 4000055296 * 8 // NUM_BITS, # Size of the dataset (4 Gigabytes); MUST BE MULTIPLE OF 65536 - "n_inc": 65536, # Increment in value of n per period; MUST BE MULTIPLE OF 65536 - # with epochtime=20000 gives 882 MB growth per year - "cache_size": 2500, # Size of the light client's cache (can be chosen by light - # client; not part of the algo spec) - "diff": 2**14, # Difficulty (adjusted during block evaluation) - "epochtime": 100000, # Length of an epoch in blocks (how often the dataset is updated) - "k": 1, # Number of parents of a node - "w": w, # Used for modular exponentiation hashing - "accesses": 200, # Number of dataset accesses during hashimoto - "P": SAFE_PRIME_512 # Safe Prime for hashing and random number generation + "n": 4000055296 * 8 // NUM_BITS, # Dimensione del dataset (4 Gigabyte); DEVE ESSERE UN MULTIPLO DI 65536 + "n_inc": 65536, # Incremento del valore di n per periodo; DEVE ESSERE UN MULTIPLO DI 65536 + # con epochtime=20000 dà una crescita di 882 MB all'anno + "cache_size": 2500, # Dimensione della cache del light client (può essere scelta dal light + # client; non fa parte delle specifiche dell'algoritmo) + "diff": 2**14, # Difficoltà (regolata durante la valutazione del blocco) + "epochtime": 100000, # Lunghezza di un'epoca in blocchi (con quale frequenza viene aggiornato il dataset) + "k": 1, # Numero di genitori di un nodo + "w": w, # Usato per l'hash dell'esponenziazione modulare + "accesses": 200, # Numero di accessi al dataset durante hashimoto + "P": SAFE_PRIME_512 # Numero primo sicuro per l'hash e la generazione di numeri casuali } ``` -`P` in questo caso è un numero primo scelto in modo che `log₂(P)` sia solo di poco inferiore a 512, che corrisponde ai 512 bit che abbiamo usato per rappresentare i nostri numeri. Nota che in realtà deve essere memorizzata solo la seconda metà del DAG, quindi il requisito de-facto di RAM parte da 1 GB e cresce di 441 MB l'anno. +In questo caso `P` è un numero primo scelto in modo tale che `log₂(P)` sia solo leggermente inferiore a 512, il che corrisponde ai 512 bit che abbiamo utilizzato per rappresentare i nostri numeri. Nota che solo l'ultima metà del DAG deve essere effettivamente archiviata, quindi il requisito di RAM de facto parte da 1 GB e cresce di 441 MB all'anno. -### Costruzione del grafico dagger {#dagger-graph-building} +### Costruzione del grafo Dagger {#dagger-graph-building} -Il primitivo di costruzione del grafico dagger è definito come segue: +La primitiva di costruzione del grafo Dagger è definita come segue: ```python def produce_dag(params, seed, length): @@ -101,15 +101,15 @@ def produce_dag(params, seed, length): return o ``` -Essenzialmente, avvia un grafico come un singolo nodo, `sha3(seed)` e da lì si inizia ad aggiungere sequenzialmente gli altri nodi, a seconda dei nodi casuali precedenti. Quando viene creato un nuovo nodo, è calcolata una potenza modulare del seed per selezionare casualmente degli indici inferiori a `i` (usando il suddetto `x % i`) e i valori dei nodi a questi indici sono usati all'interno di un calcolo per generare un nuovo valore per `x`, che viene poi passato a una piccola funzione di proof-of-work (basata su XOR) per generare, infine, il valore del grafico all'indice `i`. La logica dietro questa costruzione particolare è forzare l'accesso sequenziale del DAG; il valore successivo del DAG che sarà accessibile non è determinabile finché non sia noto il valore corrente. Infine, l'esponenziazione modulare genera ulteriormente un hashing del risultato. +Essenzialmente, inizia un grafo come un singolo nodo, `sha3(seed)`, e da lì inizia ad aggiungere sequenzialmente altri nodi basati su nodi precedenti casuali. Quando viene creato un nuovo nodo, viene calcolata una potenza modulare del seme per selezionare casualmente alcuni indici minori di `i` (usando `x % i` sopra), e i valori dei nodi a quegli indici vengono utilizzati in un calcolo per generare un nuovo valore per `x`, che viene poi inserito in una piccola funzione di prova di lavoro (basata su XOR) per generare infine il valore del grafo all'indice `i`. La logica alla base di questo particolare design è forzare l'accesso sequenziale del DAG; il valore successivo del DAG a cui si accederà non può essere determinato finché non si conosce il valore corrente. Infine, l'esponenziazione modulare esegue ulteriormente l'hash del risultato. -Questo algoritmo si basa su diversi risultati dalla teoria dei numeri. Vedere l'appendice più avanti per una discussione. +Questo algoritmo si basa su diversi risultati della teoria dei numeri. Consulta l'appendice di seguito per una discussione. -## Valutazione da client leggero {#light-client-evaluation} +## Valutazione del client leggero {#light-client-evaluation} -Questa costruzione del grafico intende consentire a ogni nodo nel grafico di essere ricostruito calcolando solamente l'albero secondario di un piccolo numero di nodi, in modo da richiedere solo una piccola quantità di memoria ausiliaria. Nota che, con k=1, l'albero secondario è solo una catena di valori che cresce al primo elemento nel DAG. +La costruzione del grafo di cui sopra intende consentire la ricostruzione di ciascun nodo nel grafo calcolando un sottoalbero di un piccolo numero di nodi e richiedendo solo una piccola quantità di memoria ausiliaria. Nota che con k=1, il sottoalbero è solo una catena di valori che arriva fino al primo elemento nel DAG. -La funzione di calcolo del client leggero per il DAG funziona così: +La funzione di calcolo del client leggero per il DAG funziona come segue: ```python def quick_calc(params, seed, p): @@ -131,13 +131,13 @@ def quick_calc(params, seed, p): return quick_calc_cached(p) ``` -essenzialmente, è semplicemente una riscrittura dell'algoritmo di cui sopra, che elimina il ciclo di calcolo dei valori per l'intero DAG e sostituisce la ricerca del nodo precedente con una chiamata ricorsiva o una ricerca della cache. Nota che per `k=1`, la cache non è necessaria, anche se in realtà un'ulteriore ottimizzazione pre-calcola le prime migliaia di valori del DAG e li mantiene come una cache statica per i calcoli; vedi l'appendice per l'implementazione di un codice a riguardo. +Essenzialmente, è semplicemente una riscrittura dell'algoritmo di cui sopra che rimuove il ciclo di calcolo dei valori per l'intero DAG e sostituisce la precedente ricerca del nodo con una chiamata ricorsiva o una ricerca nella cache. Nota che per `k=1` la cache non è necessaria, sebbene un'ulteriore ottimizzazione precalcoli effettivamente le prime migliaia di valori del DAG e li mantenga come cache statica per i calcoli; consulta l'appendice per un'implementazione del codice di questo. ## Doppio buffer di DAG {#double-buffer} -In un client completo, è usato un [_doppio buffer_](https://wikipedia.org/wiki/Multiple_buffering) di 2 DAG prodotti dalla suddetta formula. L'idea è che i DAG siano prodotti ogni `epochtime` numero di blocchi, secondo i parametri indicati sopra. Il client non usa l'ultimo DAG prodotto, ma quello precedente. Il beneficio è che consente ai DAG di essere sostituiti nel tempo senza dover prevedere un passaggio in cui i miner devono improvvisamente ricalcolare tutti i dati. In caso contrario vi sarebbe il rischio, a intervalli regolari, di un brusco rallentamento temporaneo nell'elaborazione della catena e l'aumento drastico della centralizzazione. In quei pochi minuti prima che tutti i dati siano ricalcolati sussiste quindi il rischio di un attacco 51%. +In un client completo, viene utilizzato un [_doppio buffer_](https://wikipedia.org/wiki/Multiple_buffering) di 2 DAG prodotti dalla formula precedente. L'idea è che i DAG vengano prodotti ogni numero `epochtime` di blocchi in base ai parametri di cui sopra. Invece di utilizzare l'ultimo DAG prodotto, il client utilizza quello precedente. Il vantaggio di questo è che consente di sostituire i DAG nel tempo senza dover incorporare un passaggio in cui i minatori devono ricalcolare improvvisamente tutti i dati. Altrimenti, c'è il potenziale per un brusco rallentamento temporaneo nell'elaborazione della catena a intervalli regolari e un aumento drammatico della centralizzazione. Di conseguenza, rischi di attacco del 51% in quei pochi minuti prima che tutti i dati vengano ricalcolati. -L'algoritmo usato per generare la serie di DAG usati per calcolare il lavoro per un blocco è il seguente: +L'algoritmo utilizzato per generare l'insieme di DAG utilizzati per calcolare il lavoro per un blocco è il seguente: ```python def get_prevhash(n): @@ -164,7 +164,7 @@ def get_daggerset(params, block): dagsz = get_dagsize(params, block) seedset = get_seedset(params, block) if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer + # Nessun back buffer è possibile, crea solo il front buffer return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), "block_number": 0}} else: @@ -176,7 +176,7 @@ def get_daggerset(params, block): ## Hashimoto {#hashimoto} -L'idea dietro all'Hashimoto originale è usare la blockchain come dataset, eseguendo un calcolo che selezioni N indici dalla blockchain, raccolga le transazioni a quegli indici, esegua uno XOR di questi dati e restituisca l'hash del risultato. L'algoritmo originale di Thaddeus Dryja, tradotto in Python per coerenza, è il seguente: +L'idea alla base dell'Hashimoto originale è quella di utilizzare la blockchain come set di dati, eseguendo un calcolo che seleziona N indici dalla blockchain, raccoglie le transazioni a quegli indici, esegue uno XOR di questi dati e restituisce l'hash del risultato. L'algoritmo originale di Thaddeus Dryja, tradotto in Python per coerenza, è il seguente: ```python def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): @@ -189,7 +189,7 @@ def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): return txid_mix ^ (nonce << 192) ``` -Sfortunatamente, anche se Hashimoto è considerato gravoso per la RAM, si affida a un'aritmetica a 256 bit, che richiede molti calcoli. Per risolvere questo problema, Dagger-Hashimoto usa comunque solo i 64 bit meno significativi, indicizzando il proprio dataset. +Sfortunatamente, sebbene Hashimoto sia considerato intensivo per la RAM, si basa sull'aritmetica a 256 bit, che ha un notevole sovraccarico computazionale. Tuttavia, Dagger-Hashimoto utilizza solo i 64 bit meno significativi durante l'indicizzazione del suo set di dati per risolvere questo problema. ```python def hashimoto(dag, dagsize, params, header, nonce): @@ -200,7 +200,7 @@ def hashimoto(dag, dagsize, params, header, nonce): return dbl_sha3(mix) ``` -L'uso di SHA3 doppi consente una forma di dati zero, una pre-verifica quasi istantanea, che verifica solo che sia stato fornito un valore intermedio corretto. Questo livello esterno di proof-of-work è altamente pro-ASIC e abbastanza debole, ma è pensato per rendere ancora più complicati gli attacchi DDoS, poiché per produrre un blocco che non sarà immediatamente scartato deve essere eseguito un po’ di lavoro. Ecco la versione del client leggero: +L'uso del doppio SHA3 consente una forma di pre-verifica quasi istantanea a zero dati, verificando solo che sia stato fornito un valore intermedio corretto. Questo livello esterno di prova di lavoro è altamente compatibile con gli ASIC e piuttosto debole, ma esiste per rendere gli attacchi DDoS ancora più difficili poiché quella piccola quantità di lavoro deve essere svolta per produrre un blocco che non verrà rifiutato immediatamente. Ecco la versione per client leggero: ```python def quick_hashimoto(seed, dagsize, params, header, nonce): @@ -213,7 +213,7 @@ def quick_hashimoto(seed, dagsize, params, header, nonce): ## Mining e verifica {#mining-and-verifying} -Mettiamo ora tutto insieme nell'algoritmo di mining: +Ora, mettiamo tutto insieme nell'algoritmo di mining: ```python def mine(daggerset, params, block): @@ -239,7 +239,7 @@ def verify(daggerset, params, block, nonce): return result * params["diff"] < 2**256 ``` -Verifica adatta a un client leggero: +Verifica compatibile con il client leggero: ```python def light_verify(params, header, nonce): @@ -249,10 +249,10 @@ def light_verify(params, header, nonce): return result * params["diff"] < 2**256 ``` -Inoltre, nota che Dagger-Hashimoto impone anche altri requisiti sull'intestazione del blocco: +Inoltre, nota che Dagger-Hashimoto impone requisiti aggiuntivi sull'intestazione del blocco: -- Perché la verifica a due livelli funzioni, l'intestazione di un blocco deve avere sia il nonce che il valore medio di pre-sha3 -- Da qualche parte, l'intestazione di un blocco deve memorizzare la sha3 del set di seed corrente +- Affinché la verifica a due livelli funzioni, un'intestazione del blocco deve avere sia il nonce che il valore intermedio pre-sha3 +- Da qualche parte, un'intestazione del blocco deve memorizzare lo sha3 del seedset corrente ## Letture consigliate {#further-reading} @@ -260,50 +260,46 @@ _Conosci una risorsa della community che ti è stata utile? Modifica questa pagi ## Appendice {#appendix} -Come notato sopra, l'RNG usato per la generazione del DAG si affida ad alcuni risultati dalla teoria dei numeri. Per prima cosa, accertiamoci che l'RNG di Lehmer che è la base per la variabile `picker` abbia un periodo ampio. In secondo luogo, mostriamo che `pow(x,3,P)` non mapperà `x` a `1` o `P-1`, a condizione che all’inizio `x ∈ [2,P-2]`. Infine, mostriamo che `pow(x,3,P)` ha un basso tasso di collisione se trattato come funzione di hashing. +Come notato sopra, l'RNG utilizzato per la generazione del DAG si basa su alcuni risultati della teoria dei numeri. In primo luogo, forniamo la garanzia che l'RNG di Lehmer che è alla base della variabile `picker` abbia un periodo ampio. In secondo luogo, mostriamo che `pow(x,3,P)` non mapperà `x` a `1` o `P-1` a condizione che `x ∈ [2,P-2]` per iniziare. Infine, mostriamo che `pow(x,3,P)` ha un basso tasso di collisione quando trattato come una funzione di hashing. ### Generatore di numeri casuali di Lehmer {#lehmer-random-number} -Sebbene la funzione `produce_dag` non necessiti di produrre numeri casuali imparziali, un possibile rischio è dato dal fatto che `seed**i % P` prende solo una manciata di valori. Questo potrebbe fornire un vantaggio ai miner che riconoscono lo schema, rispetto a quelli che non lo conoscono. +Sebbene la funzione `produce_dag` non debba produrre numeri casuali non distorti, una potenziale minaccia è che `seed**i % P` assuma solo una manciata di valori. Ciò potrebbe fornire un vantaggio ai minatori che riconoscono il modello rispetto a quelli che non lo fanno. -Per evitarlo, si è fatto ricorso a un risultato dalla teoria dei numeri. Un [_Numero primo sicuro_](https://en.wikipedia.org/wiki/Safe_prime) si definisce come numero primo `P` tale per cui anche `(P-1)/2` è un numero primo. L'_ordine_ di un membro `x` del [gruppo moltiplicativo](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` è definito come il valore minimo di `m` tale per cui
xᵐ mod P ≡ 1
+Per evitare ciò, si fa appello a un risultato della teoria dei numeri. Un [_Numero primo sicuro_](https://en.wikipedia.org/wiki/Safe_prime) è definito come un numero primo `P` tale che anche `(P-1)/2` sia primo. L'_ordine_ di un membro `x` del [gruppo moltiplicativo](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` è definito come il minimo `m` tale che
xᵐ mod P ≡ 1
Date queste definizioni, abbiamo: -> Osservazione 1. Ipotizziamo che `x` sia un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, allora l'ordine di `x` è `P-1` o `(P-1)/2`. +> Osservazione 1. Sia `x` un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, allora l'ordine di `x` è `P-1` o `(P-1)/2`. -_Dimostrazione_. Poiché `P` è un numero primo sicuro, allora per il \[Teorema di Lagrange\]\[lagrange\], l'ordine di `x` è `1`, `2`, `(P-1)/2` o `P-1`. +_Dimostrazione_. Poiché `P` è un numero primo sicuro, allora per il [Teorema di Lagrange][lagrange] abbiamo che l'ordine di `x` è `1`, `2`, `(P-1)/2` o `P-1`. -L'ordine di `x` non può essere `1`, poiché secondo il Piccolo teorema di Fermat: +L'ordine di `x` non può essere `1`, poiché per il Piccolo Teorema di Fermat abbiamo:
xP-1 mod P ≡ 1
-Quindi, `x`, deve essere un'identità moltiplicativa di `ℤ/nℤ`, che è univoca. Poiché abbiamo presupposto che `x ≠ 1`, ciò è impossibile. +Quindi `x` deve essere un'identità moltiplicativa di `ℤ/nℤ`, che è unica. Poiché abbiamo supposto che `x ≠ 1` per ipotesi, questo non è possibile. -L'ordine di `x` non può essere `2` a meno che `x = P-1`, poiché ciò violerebbe il fatto che `P` sia un numero primo. +L'ordine di `x` non può essere `2` a meno che `x = P-1`, poiché ciò violerebbe il fatto che `P` sia primo. -Dalla suddetta proposizione possiamo capire che iterando `(picker * init) % P`, avrà una lunghezza del ciclo di almeno `(P-1)/2`. Questo perché abbiamo selezionato `P` come un numero primo sicuro, approssimativamente pari a una potenza superiore di due e che `init` è nell'intervallo `[2,2**256+1]`. Data la portata di `P`, non dovremmo mai aspettarci un ciclo dall'elevamento a potenza modulare. +Dalla proposizione precedente, possiamo riconoscere che l'iterazione di `(picker * init) % P` avrà una lunghezza del ciclo di almeno `(P-1)/2`. Questo perché abbiamo selezionato `P` in modo che sia un numero primo sicuro approssimativamente uguale a una potenza superiore di due, e `init` è nell'intervallo `[2,2**256+1]`. Data la grandezza di `P`, non dovremmo mai aspettarci un ciclo dall'esponenziazione modulare. -Quando assegniamo la prima cella nel DAG (la variabile etichettata come `init`), calcoliamo `pow(sha3(seed) + 2, 3, P)`. A prima vista, questo non garantisce che il risultato sia `1` né `P-1`. Tuttavia, poiché `P-1` è un numero primo sicuro, abbiamo la seguente garanzia aggiuntiva, che è un corollario dell'Osservazione 1: +Quando assegniamo la prima cella nel DAG (la variabile etichettata `init`), calcoliamo `pow(sha3(seed) + 2, 3, P)`. A prima vista, questo non garantisce che il risultato non sia né `1` né `P-1`. Tuttavia, poiché `P-1` è un numero primo sicuro, abbiamo la seguente garanzia aggiuntiva, che è un corollario dell'Osservazione 1: -> Osservazione 2. Ipotizziamo che `x` sia un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`, e prendiamo `w` come numero naturale. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, nonché `w mod P ≠ P-1 mod P` e `w mod P ≠ 0 mod P`, allora `xʷ mod P ≠ 1 mod P` e `xʷ mod P ≠ P-1 mod P` +> Osservazione 2. Sia `x` un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`, e sia `w` un numero naturale. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, così come `w mod P ≠ P-1 mod P` e `w mod P ≠ 0 mod P`, allora `xʷ mod P ≠ 1 mod P` e `xʷ mod P ≠ P-1 mod P` ### Esponenziazione modulare come funzione di hash {#modular-exponentiation} -Per certi valori di `P` e `w`, la funzione `pow(x, w, P)` potrebbe avere molte collisioni. Ad esempio, `pow(x,9,19)` prende solo i valori `{1,18}`. +Per determinati valori di `P` e `w`, la funzione `pow(x, w, P)` potrebbe avere molte collisioni. Ad esempio, `pow(x,9,19)` assume solo i valori `{1,18}`. -Dato che `P` è primo, allora è possibile scegliere un'appropriata `w` per una funzione di hashing di esponenziazione modulare usando il seguente risultato: +Dato che `P` è primo, allora un `w` appropriato per una funzione di hashing di esponenziazione modulare può essere scelto utilizzando il seguente risultato: -> Osservazione 3. Prendiamo `P` come numero primo; `w` e `P-1` sono coprimi se e solo se per ogni `a` e `b` in `ℤ/Pℤ`: -> ->
-> `aʷ mod P ≡ bʷ mod P` se e solo se `a mod P ≡ b mod P` ->
+> Osservazione 3. Sia `P` un numero primo; `w` e `P-1` sono coprimi se e solo se per tutti gli `a` e `b` in `ℤ/Pℤ`:
`aʷ mod P ≡ bʷ mod P` se e solo se `a mod P ≡ b mod P`
-Dunque, dato che `P` è primo e `w` è coprimo rispetto a `P-1`, abbiamo che `|{pow(x, w, P) : x ∈ ℤ}| = P`, e questo implica che la funzione di hashing ha la frequenza di collisione minima possibile. +Pertanto, dato che `P` è primo e `w` è coprimo rispetto a `P-1`, abbiamo che `|{pow(x, w, P) : x ∈ ℤ}| = P`, il che implica che la funzione di hashing ha il tasso di collisione minimo possibile. -Nel caso speciale in cui `P` sia un numero primo sicuro, come da noi selezionato, allora `P-1` ha solo i fattori 1, 2, `(P-1)/2` e `P-1`. Poiché `P` > 7, sappiamo che 3 è primo rispetto a `P-1`, quindi `w=3` soddisfa la proposizione precedente. +Nel caso speciale in cui `P` sia un numero primo sicuro come abbiamo selezionato, allora `P-1` ha solo i fattori 1, 2, `(P-1)/2` e `P-1`. Poiché `P` > 7, sappiamo che 3 è coprimo rispetto a `P-1`, quindi `w=3` soddisfa la proposizione precedente. -## Algoritmo di valutazione più efficiente basato sulla cache {#cache-based-evaluation} +## Algoritmo di valutazione basato su cache più efficiente {#cache-based-evaluation} ```python def quick_calc(params, seed, p): @@ -331,4 +327,4 @@ def quick_hashimoto_cached(cache, dagsize, params, header, nonce): for _ in range(params["accesses"]): mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) return dbl_sha3(mix) -``` +``` \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index cee1f041f73..0277d91f341 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -1,6 +1,6 @@ --- title: Ethash -description: Uno sguardo dettagliato all'algoritmo Ethash. +description: Un'occhiata dettagliata all'algoritmo Ethash. lang: it --- @@ -8,29 +8,29 @@ lang: it - Ethash era l'algoritmo di mining di proof-of-work di Ethereum. Il proof-of-work è ora stato **disattivato interamente** e, invece, Ethereum è ora protetto utilizzando il [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). Leggi di più su [La Fusione](/roadmap/merge/), sul [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) e sullo [staking](/staking/). Questa pagina è per interesse storico! + Ethash era l'algoritmo di mining di prova di lavoro di Ethereum. La prova di lavoro è stata ora **completamente disattivata** ed Ethereum è ora protetto utilizzando invece la [prova di stake](/developers/docs/consensus-mechanisms/pos/). Scopri di più su [The Merge](/roadmap/merge/), la [prova di stake](/developers/docs/consensus-mechanisms/pos/) e lo [staking](/staking/). Questa pagina è di interesse storico! -Ethash è una versione modificata dell'algoritmo di [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). Il proof-of-work di Ethash è [a elevato consumo di memoria](https://wikipedia.org/wiki/Memory-hard_function), cosa pensata per rendere l'algoritmo resistente agli ASIC. Gli ASIC di Ethash sono infine stati sviluppati, ma il mining della GPU è stata un'opzione ancora valida fino alla disattivazione del proof-of-work. Ethash è ancora usato per minare altre valute su altre reti di proof-of-work non di Ethereum. +Ethash è una versione modificata dell'algoritmo [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). La prova di lavoro di Ethash è [memory hard](https://wikipedia.org/wiki/Memory-hard_function) (difficile per la memoria), il che si pensava rendesse l'algoritmo resistente agli ASIC. Alla fine sono stati sviluppati ASIC per Ethash, ma il mining con GPU è rimasto un'opzione praticabile fino a quando la prova di lavoro non è stata disattivata. Ethash è ancora utilizzato per minare altre monete su altre reti di prova di lavoro non di Ethereum. ## Come funziona Ethash? {#how-does-ethash-work} -La gravosità sulla memoria è ottenuta con un algoritmo di proof-of-work che richiede la scelta di sotto-serie di una risorsa fissa, dipendente dal nonce e dall'intestazione del blocco. Questa risorsa (di pochi gigabyte di dimensioni) è detta DAG. Il DAG è modificato ogni 30.000 blocchi, una finestra di circa 125 ore detta un'epoca (circa 5,2 giorni) e richiede un po' di tempo per generarsi. Poiché il DAG dipende solo dall'altezza del blocco, può esser pre-generato, ma se non è il client, deve attendere fino alla fine di questo processo per produrre un blocco. Se i client non si pre-generano e salvano anticipatamente nella cache i DAG, la rete potrebbe subire un enorme ritardo dei blocchi a ogni transizione d'epoca. Il DAG non deve necessariamente essere generato per verificare il proof-of-work, perché è essenzialmente possibile eseguire la verifica con poca CPU e poca memoria. +La difficoltà per la memoria è ottenuta con un algoritmo di prova di lavoro che richiede la scelta di sottoinsiemi di una risorsa fissa dipendente dal nonce e dall'intestazione del blocco. Questa risorsa (della dimensione di alcuni gigabyte) è chiamata DAG. Il DAG viene modificato ogni 30000 blocchi, una finestra di circa 125 ore chiamata epoca (circa 5,2 giorni) e richiede un po' di tempo per essere generato. Poiché il DAG dipende solo dall'altezza del blocco, può essere pre-generato, ma se non lo è, il client deve attendere la fine di questo processo per produrre un blocco. Se i client non pre-generano e memorizzano nella cache i DAG in anticipo, la rete potrebbe subire un massiccio ritardo dei blocchi a ogni transizione di epoca. Si noti che il DAG non deve essere generato per verificare la prova di lavoro, consentendo essenzialmente la verifica con CPU e memoria ridotte. -Il percorso generale intrapreso dall'algoritmo è il seguente: +Il percorso generale seguito dall'algoritmo è il seguente: -1. Esiste un **seed**, calcolabile per ogni blocco scansionando fino a quel punto le intestazioni dei blocchi. -2. Dal seed, si può calcolare una **cache pseudo-casuale di 16 MB**. I client leggeri memorizzano la cache. -3. Dalla cache, possiamo generare un **dataset di 1 GB**, caratterizzato dal fatto che ogni elemento nel dataset dipende solo da una piccola quantità di elementi dalla cache. I client completi e i miner memorizzano il dataset. Il dataset cresce linearmente col tempo. -4. Durante il mining vengono prese delle fette (slice) casuali del dataset, eseguendone l'hashing. La verifica può essere effettuata con poca memoria usando la cache per rigenerare le parti specifiche del dataset necessarie, così da dover solo memorizzare la cache. +1. Esiste un **seme** (seed) che può essere calcolato per ogni blocco scansionando le intestazioni dei blocchi fino a quel punto. +2. Dal seme, si può calcolare una **cache pseudocasuale di 16 MB**. I client leggeri memorizzano la cache. +3. Dalla cache, possiamo generare un **set di dati di 1 GB**, con la proprietà che ogni elemento nel set di dati dipende solo da un piccolo numero di elementi della cache. I client completi e i minatori memorizzano il set di dati. Il set di dati cresce linearmente nel tempo. +4. Il mining comporta il prelievo di porzioni casuali del set di dati e il loro hashing insieme. La verifica può essere eseguita con poca memoria utilizzando la cache per rigenerare i pezzi specifici del set di dati di cui si ha bisogno, quindi è necessario memorizzare solo la cache. -Il grande dataset è aggiornato una volta ogni 30.000 blocchi, in questo modo l'impegno di un miner sarà per lo più quello di leggere il dataset, non effettuare modifiche a esso. +Il grande set di dati viene aggiornato una volta ogni 30000 blocchi, quindi la stragrande maggioranza dello sforzo di un minatore consisterà nel leggere il set di dati, non nell'apportarvi modifiche. ## Definizioni {#definitions} -Adottiamo le seguenti definizioni: +Impieghiamo le seguenti definizioni: ``` WORD_BYTES = 4 # bytes in word @@ -47,15 +47,15 @@ CACHE_ROUNDS = 3 # number of rounds in cache production ACCESSES = 64 # number of accesses in hashimoto loop ``` -### L'uso di "SHA3" {#sha3} +### L'uso di 'SHA3' {#sha3} -Lo sviluppo di Ethereum è coinciso con lo sviluppo dello standard SHA3 e il processo standard ha effettuato una modifica tardiva al padding dell'algoritmo di hash finalizzato, quindi, gli hash "sha3_256" e "sha3_512" di Ethereum non sono hash dello standard sha3, ma una variante, spesso definita "Keccak-256" e "Keccak-512" in altri contesti. Vedi la discussione, ad esempio [qui](https://eips.ethereum.org/EIPS/eip-1803), [qui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) o [qui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Lo sviluppo di Ethereum ha coinciso con lo sviluppo dello standard SHA3 e il processo di standardizzazione ha apportato una modifica tardiva al riempimento (padding) dell'algoritmo di hash finalizzato, in modo che gli hash "sha3_256" e "sha3_512" di Ethereum non siano hash sha3 standard, ma una variante spesso indicata come "Keccak-256" e "Keccak-512" in altri contesti. Vedi la discussione, ad es., [qui](https://eips.ethereum.org/EIPS/eip-1803), [qui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) o [qui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). -Si ricorda che gli hash "sha3" siano presentati nella descrizione dell'algoritmo più avanti. +Tienilo a mente poiché gli hash "sha3" sono menzionati nella descrizione dell'algoritmo di seguito. ## Parametri {#parameters} -I parametri della cache e del dataset di Ethash dipendono dal numero del blocco. Le dimensioni della cache e del dataset crescono entrambe linearmente; tuttavia, prendiamo sempre il numero primo maggiore successivo alla soglia di crescita lineare, per ridurre il rischio di regolarità accidentali che determinano un comportamento ciclico. +I parametri per la cache e il set di dati di Ethash dipendono dal numero del blocco. La dimensione della cache e la dimensione del set di dati crescono entrambe linearmente; tuttavia, prendiamo sempre il numero primo più alto al di sotto della soglia di crescita lineare per ridurre il rischio di regolarità accidentali che portano a comportamenti ciclici. ```python def get_cache_size(block_number): @@ -73,22 +73,22 @@ def get_full_size(block_number): return sz ``` -Nell'appendice sono presentate tabelle delle dimensioni del dataset e della cache. +Le tabelle dei valori delle dimensioni del set di dati e della cache sono fornite nell'appendice. ## Generazione della cache {#cache-generation} -Specifichiamo ora la funzione per produrre una cache: +Ora, specifichiamo la funzione per produrre una cache: ```python def mkcache(cache_size, seed): n = cache_size // HASH_BYTES - # Sequentially produce the initial dataset + # Produci sequenzialmente il dataset iniziale o = [sha3_512(seed)] for i in range(1, n): o.append(sha3_512(o[-1])) - # Use a low-round version of randmemohash + # Usa una versione con pochi round di randmemohash for _ in range(CACHE_ROUNDS): for i in range(n): v = o[i][0] % n @@ -97,11 +97,11 @@ def mkcache(cache_size, seed): return o ``` -Il processo di produzione della cache richiede dapprima il riempimento sequenziale di 32 MB di memoria, poi l'esecuzione di due passaggi dell'algoritmo _RandMemoHash_ di Sergio Demian Lerner da [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). L'output è una serie di valori a 64 byte 524288. +Il processo di produzione della cache prevede prima il riempimento sequenziale di 32 MB di memoria, quindi l'esecuzione di due passaggi dell'algoritmo _RandMemoHash_ di Sergio Demian Lerner da [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). L'output è un insieme di 524288 valori da 64 byte. ## Funzione di aggregazione dei dati {#date-aggregation-function} -Usiamo un algoritmo ispirato dall'[hash FNV](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) in alcuni casi come un sostituto non associativo per XOR. Nota che moltiplichiamo il numero primo con l'intero input a 32 bit, a differenza della specifica FNV-1, che moltiplica invece il numero primo con un byte (ottetto). +Utilizziamo un algoritmo ispirato all'hash [FNV](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) in alcuni casi come sostituto non associativo per lo XOR. Si noti che moltiplichiamo il numero primo con l'intero input a 32 bit, in contrasto con le specifiche FNV-1 che moltiplicano il numero primo con un byte (ottetto) alla volta. ```python FNV_PRIME = 0x01000193 @@ -110,28 +110,28 @@ def fnv(v1, v2): return ((v1 * FNV_PRIME) ^ v2) % 2**32 ``` -Anche lo yellow paper specifica fnv come v1\*(FNV_PRIME ^ v2), tutte le implementazioni correnti usano attualmente la suddetta definizione. +Si prega di notare che, sebbene lo yellow paper specifichi fnv come v1\*(FNV_PRIME ^ v2), tutte le implementazioni attuali utilizzano coerentemente la definizione di cui sopra. -## Calcolo dell'intero dataset {#full-dataset-calculation} +## Calcolo del set di dati completo {#full-dataset-calculation} -Ogni elemento da 64 byte nell'intero dataset da 1 GB è calcolato come segue: +Ogni elemento da 64 byte nel set di dati completo da 1 GB viene calcolato come segue: ```python def calc_dataset_item(cache, i): n = len(cache) r = HASH_BYTES // WORD_BYTES - # initialize the mix + # inizializza il mix mix = copy.copy(cache[i % n]) mix[0] ^= i mix = sha3_512(mix) - # fnv it with a lot of random cache nodes based on i + # applica fnv con molti nodi di cache casuali basati su i for j in range(DATASET_PARENTS): cache_index = fnv(i ^ j, mix[j % r]) mix = map(fnv, mix, cache[cache_index % n]) return sha3_512(mix) ``` -Essenzialmente, combiniamo i dati da 256 nodi della cache selezionati pseudo-casualmente e ne eseguiamo l'hash per calcolare il nodo del dataset. L'intero dataset è quindi generato da: +Essenzialmente, combiniamo i dati da 256 nodi della cache selezionati in modo pseudocasuale e ne facciamo l'hash per calcolare il nodo del set di dati. L'intero set di dati viene quindi generato da: ```python def calc_dataset(full_size, cache): @@ -140,27 +140,27 @@ def calc_dataset(full_size, cache): ## Ciclo principale {#main-loop} -Ora, specifichiamo il ciclo principale in stile "hashimoto", dove aggreghiamo i dati dal dataset completo per poter produrre il valore finale per un'intestazione e nonce in particolare. Nel codice seguente, `header` rappresenta l'_hash_ SHA3-256 della rappresentazione RLP di un'intestazione del blocco _troncata_, ovvero, di un'intestazione che esclude i campi **mixHash** e **nonce**. Un `nonce` si compone degli otto byte di un intero non firmato da 64 bit, con ordinamento big-endian. Quindi `nonce[::-1]` è la rappresentazione little-endian di otto byte di quel valore: +Ora, specifichiamo il ciclo principale in stile "hashimoto", in cui aggreghiamo i dati dal set di dati completo per produrre il nostro valore finale per una particolare intestazione e nonce. Nel codice sottostante, `header` rappresenta l'_hash_ SHA3-256 della rappresentazione RLP di un'intestazione di blocco _troncata_, ovvero di un'intestazione che esclude i campi **mixHash** e **nonce**. `nonce` sono gli otto byte di un intero senza segno a 64 bit in ordine big-endian. Quindi `nonce[::-1]` è la rappresentazione little-endian a otto byte di quel valore: ```python def hashimoto(header, nonce, full_size, dataset_lookup): n = full_size / HASH_BYTES w = MIX_BYTES // WORD_BYTES mixhashes = MIX_BYTES / HASH_BYTES - # combine header+nonce into a 64 byte seed + # combina header+nonce in un seed da 64 byte s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s + # inizia il mix con s replicato mix = [] for _ in range(MIX_BYTES / HASH_BYTES): mix.extend(s) - # mix in random dataset nodes + # mescola nodi casuali del dataset for i in range(ACCESSES): p = fnv(i ^ s[0], mix[i % w]) % (n // mixhashes) * mixhashes newdata = [] for j in range(MIX_BYTES / HASH_BYTES): newdata.extend(dataset_lookup(p + j)) mix = map(fnv, mix, newdata) - # compress mix + # comprimi il mix cmix = [] for i in range(0, len(mix), 4): cmix.append(fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3])) @@ -176,9 +176,9 @@ def hashimoto_full(full_size, dataset, header, nonce): return hashimoto(header, nonce, full_size, lambda x: dataset[x]) ``` -Essenzialmente, manteniamo un mix di 128 byte e recuperiamo sequenzialmente e ripetutamente 128 byte dal dataset completo e usiamo la funzione `fnv` per combinarli col mix. Vengono usati 128 byte di accesso sequenziale così che ogni ciclo dell'algoritmo recuperi sempre una pagina intera dalla RAM, minimizzando le ricerche a vuoto nel lookaside buffer che gli ASIC dovrebbero teoricamente poter evitare. +Essenzialmente, manteniamo un "mix" largo 128 byte e recuperiamo ripetutamente in modo sequenziale 128 byte dal set di dati completo e utilizziamo la funzione `fnv` per combinarlo con il mix. Vengono utilizzati 128 byte di accesso sequenziale in modo che ogni round dell'algoritmo recuperi sempre un'intera pagina dalla RAM, riducendo al minimo i mancati riscontri nel translation lookaside buffer (TLB) che gli ASIC sarebbero teoricamente in grado di evitare. -Se l'output di questo algoritmo è inferiore all'obiettivo desiderato, allora il nonce è valido. Nota che l'applicazione aggiuntiva di `sha3_256` alla fine assicura che esista un nonce intermedio, che può essere fornito per provare che almeno una piccola quantità di lavoro è stata eseguita; questa rapida verifica di PoW esterna è utilizzabile per scopi anti-DDoS. Serve anche a fornire la garanzia statistica che il risultato sia un numero a 256 bit imparziale. +Se l'output di questo algoritmo è inferiore all'obiettivo desiderato, allora il nonce è valido. Si noti che l'applicazione aggiuntiva di `sha3_256` alla fine garantisce l'esistenza di un nonce intermedio che può essere fornito per dimostrare che è stata eseguita almeno una piccola quantità di lavoro; questa rapida verifica esterna della prova di lavoro (PoW) può essere utilizzata per scopi anti-DDoS. Serve anche a fornire la garanzia statistica che il risultato sia un numero a 256 bit non distorto. ## Mining {#mining} @@ -186,7 +186,7 @@ L'algoritmo di mining è definito come segue: ```python def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit + # riempi di zeri il target per confrontarlo con l'hash sulla stessa cifra target = zpad(encode_int(2**256 // difficulty), 64)[::-1] from random import randint nonce = randint(0, 2**64) @@ -195,9 +195,9 @@ def mine(full_size, dataset, header, difficulty): return nonce ``` -## Definire l'hash del seed {#seed-hash} +## Definizione dell'hash del seme {#seed-hash} -Per poter calcolare l'hash del seed da usare per fare mining su un dato blocco, usiamo il seguente algoritmo: +Per calcolare l'hash del seme che verrebbe utilizzato per minare sopra un dato blocco, utilizziamo il seguente algoritmo: ```python def get_seedhash(block): @@ -207,7 +207,7 @@ Per poter calcolare l'hash del seed da usare per fare mining su un dato blocco, return s ``` -Nota che per la fluidità delle attività di mining e verifica, consigliamo di pre-calcolare gli hash dei seed futuri e i dataset in un thread separato. +Si noti che per un mining e una verifica fluidi, si consiglia di pre-calcolare i futuri hash dei semi e i set di dati in un thread separato. ## Letture consigliate {#further-reading} @@ -215,12 +215,12 @@ _Conosci una risorsa della community che ti è stata utile? Modifica questa pagi ## Appendice {#appendix} -Il seguente codice dovrebbe essere anteposto se sei interessato all'esecuzione della suddetta specifica di Python come codice. +Il seguente codice dovrebbe essere anteposto se sei interessato a eseguire le specifiche python di cui sopra come codice. ```python import sha3, copy -# Assumes little endian bit ordering (same as Intel architectures) +# Presume un ordinamento dei bit little endian (lo stesso delle architetture Intel) def decode_int(s): return int(s[::-1].encode('hex'), 16) if s else 0 @@ -248,7 +248,7 @@ def serialize_cache(ds): serialize_dataset = serialize_cache -# sha3 hash function, outputs 64 bytes +# funzione di hash sha3, restituisce 64 byte def sha3_512(x): return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) @@ -267,7 +267,7 @@ def isprime(x): ### Dimensioni dei dati {#data-sizes} -Le seguenti tabelle di ricerca forniscono approssimativamente 2048 epoche tabulate di dimensioni dei dati e della cache. +Le seguenti tabelle di ricerca forniscono circa 2048 epoche tabulate di dimensioni dei dati e dimensioni della cache. ```python def get_datasize(block_number): @@ -1016,4 +1016,4 @@ cache_sizes = [ 283377344, 283508416, 283639744, 283770304, 283901504, 284032576, 284163136, 284294848, 284426176, 284556992, 284687296, 284819264, 284950208, 285081536] -``` +``` \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md index 374f5830ef7..2a0bd5d0e31 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -1,6 +1,6 @@ --- title: Algoritmi di mining -description: Uno sguardo dettagliato agli algoritmi usati per il mining di Ethereum. +description: Uno sguardo dettagliato agli algoritmi utilizzati per il mining di Ethereum. lang: it --- @@ -8,35 +8,35 @@ lang: it -Il proof-of-work non è più alla base del meccanismo di consenso di Ethereum, a significare che il mining è stato disattivato. Invece, Ethereum, è protetto dai validatori che mettono ETH in staking. Puoi iniziare oggi a mettere i tuoi ETH in staking. Leggi di più su La Fusione, il proof-of-stake e lo staking. Questa pagina è per solo interesse storico. +La prova di lavoro non è più alla base del meccanismo di consenso di Ethereum, il che significa che il mining è stato disattivato. Invece, Ethereum è protetto dai validatori che mettono in stake i propri ETH. Puoi iniziare a fare staking dei tuoi ETH oggi stesso. Scopri di più su The Merge, sulla prova di stake e sullo staking. Questa pagina è solo di interesse storico. -Il mining di Ethereum usava un algoritmo noto come Ethash. L'idea fondamentale dell'algoritmo è che un miner prova a trovare l'input di un nonce usando il calcolo di forza bruta, così che l'hash risultante sia inferiore a una soglia determinata dalla difficoltà calcolata. Questo livello di difficoltà può esser regolato dinamicamente, consentendo alla produzione dei blocchi di verificarsi a un intervallo regolare. +Il mining di Ethereum utilizzava un algoritmo noto come Ethash. L'idea fondamentale dell'algoritmo è che un minatore cerca di trovare un input nonce utilizzando il calcolo a forza bruta in modo che l'hash risultante sia inferiore a una soglia determinata dalla difficoltà calcolata. Questo livello di difficoltà può essere regolato dinamicamente, consentendo alla produzione del blocco di avvenire a intervalli regolari. ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, ti consigliamo prima di leggere sul [consenso proof-of-work](/developers/docs/consensus-mechanisms/pow) e sul [mining](/developers/docs/consensus-mechanisms/pow/mining). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima il [consenso basato sulla prova di lavoro](/developers/docs/consensus-mechanisms/pow) e il [mining](/developers/docs/consensus-mechanisms/pow/mining). ## Dagger Hashimoto {#dagger-hashimoto} -Dagger Hashimoto era un algoritmo di ricerca precursore del mining di Ethereum, sostituito da Ethash. Era un amalgama di due algoritmi differenti: Dagger e Hashimoto. È sempre e solo stato un'implementazione di ricerca e fu superato da Ethash prima del lancio della Rete Principale di Ethereum. +Dagger Hashimoto era un algoritmo di ricerca precursore per il mining di Ethereum che è stato sostituito da Ethash. Era una fusione di due diversi algoritmi: Dagger e Hashimoto. È stato solo un'implementazione di ricerca ed è stato sostituito da Ethash al momento del lancio della rete principale di Ethereum. -[Dagger](http://www.hashcash.org/papers/dagger.html) prevede la generazione di un [Grafico Aciclico Diretto](https://en.wikipedia.org/wiki/Directed_acyclic_graph), porzioni casuali del quale ricevono un hashing insieme. Il principio fondamentale è che ogni nonce richiede solo una piccola porzione di un grande albero di dati totali. Ricalcolare l'albero secondario per ogni nonce è proibitivo per il mining, da cui l'esigenza di memorizzare l'albero, invece, va bene per verificare un singolo nonce. Dagger è stato progettato per essere un'alternativa agli algoritmi esistenti come Scrypt, che sono gravosi per la memoria (memory-hard) ma difficili da verificare all'aumentare dell'uso della memoria verso livelli veramente sicuri. Dagger era però vulnerabile all'accelerazione dell'hardware con memoria condiviso ed è stato abbandonato a favore di altre vie di ricerca. +[Dagger](http://www.hashcash.org/papers/dagger.html) prevede la generazione di un [Grafo Aciclico Diretto (DAG)](https://en.wikipedia.org/wiki/Directed_acyclic_graph), le cui porzioni casuali vengono sottoposte ad hash insieme. Il principio fondamentale è che ogni nonce richiede solo una piccola porzione di un grande albero di dati totale. Ricalcolare il sottoalbero per ogni nonce è proibitivo per il mining - da qui la necessità di memorizzare l'albero - ma va bene per la verifica del valore di un singolo nonce. Dagger è stato progettato per essere un'alternativa agli algoritmi esistenti come Scrypt, che sono intensivi in termini di memoria (memory-hard) ma difficili da verificare quando la loro intensità di memoria aumenta a livelli genuinamente sicuri. Tuttavia, Dagger era vulnerabile all'accelerazione hardware della memoria condivisa ed è stato abbandonato a favore di altre vie di ricerca. -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) è un algoritmo che aggiunge resistenza ASIC, essendo vincolato da aspetti I/O (cioè le letture di memoria rappresentano il fattore limitante nel processo di mining). La teoria è che vi sia più disponibilità di RAM che di calcolo: sono già stati usati miliardi di dollari in ricerca per l'ottimizzazione della RAM per diversi scenari d'uso, che spesso coinvolgono schemi d'accesso semi-casuale (da cui "memoria d'accesso casuale", Random Access Memory). Di conseguenza, è probabile che la RAM esistente sia abbastanza vicina all'ottimale per valutare l'algoritmo. Hashimoto usa la blockchain come una fonte di dati, perché soddisfa simultaneamente i punti (1) e (3) di cui sopra. +[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) è un algoritmo che aggiunge resistenza agli ASIC essendo limitato dall'I/O (cioè, le letture della memoria sono il fattore limitante nel processo di mining). La teoria è che la RAM sia più disponibile del calcolo; miliardi di dollari di ricerca hanno già studiato l'ottimizzazione della RAM per diversi casi d'uso, che spesso comportano modelli di accesso quasi casuali (da cui "memoria ad accesso casuale"). Di conseguenza, è probabile che la RAM esistente sia moderatamente vicina all'ottimale per la valutazione dell'algoritmo. Hashimoto utilizza la blockchain come fonte di dati, soddisfacendo contemporaneamente i punti (1) e (3) di cui sopra. -Dagger-Hashimoto usava delle versioni modificate degli algoritmi di Dagger e Hashimoto. La differenza tra Dagger Hashimoto e Hashimoto è che, anziché usare la blockchain come una fonte di dati, Dagger Hashimoto usa una serie di dati generata e personalizzata, che si aggiorna a seconda dei dati del blocco ogni N blocchi. La serie di dati è generata usando l'algoritmo di Dagger, che consente di calcolare efficientemente una sotto-serie specifica a ogni nonce per l'algoritmo di verifica del client leggero. La differenza tra Dagger Hashimoto e Dagger è che, a differenza del Dagger originale, il dataset usato per interrogare il blocco è semi-permanente, in quanto viene aggiornato solo occasionalmente (es. una volta a settimana). Questo significa che la porzione dello sforzo per generare il dataset è prossima allo zero, e diventano quindi trascurabili gli argomenti di Sergio Lerner riguardanti le velocizzazioni della memoria condivisa. +Dagger-Hashimoto utilizzava versioni modificate degli algoritmi Dagger e Hashimoto. La differenza tra Dagger Hashimoto e Hashimoto è che, invece di utilizzare la blockchain come fonte di dati, Dagger Hashimoto utilizza un set di dati generato su misura, che si aggiorna in base ai dati del blocco ogni N blocchi. Il set di dati viene generato utilizzando l'algoritmo Dagger, consentendo di calcolare in modo efficiente un sottoinsieme specifico per ogni nonce per l'algoritmo di verifica del client leggero. La differenza tra Dagger Hashimoto e Dagger è che, a differenza del Dagger originale, il set di dati utilizzato per interrogare il blocco è semi-permanente, venendo aggiornato solo a intervalli occasionali (ad es., una volta alla settimana). Ciò significa che la porzione di sforzo per generare il set di dati è vicina allo zero, quindi le argomentazioni di Sergio Lerner riguardo ai miglioramenti di velocità della memoria condivisa diventano trascurabili. Maggiori informazioni su [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto). ## Ethash {#ethash} -Ethash era l'algoritmo di mining che era effettiamente usato sulla vera Rete Principale di Ethereum sotto l'ora deprecata architettura del proof-of-work. Ethash in realtà è un nuovo nome assegnato a una versione specifica di Dagger-Hashimoto dopo un aggiornamento significativo dell'algoritmo, che comunque eredita i principi fondamentali del suo predecessore. La Rete Principale di Ethereum ha sempre e solo usato Ethash; Dagger Hashimoto era una versione R&D dell'algoritmo di mining che fu superata prima che il mining fosse avviato sulla Rete Principale di Ethereum. +Ethash era l'algoritmo di mining effettivamente utilizzato sulla vera rete principale di Ethereum sotto l'architettura basata sulla prova di lavoro, ora deprecata. Ethash era di fatto un nuovo nome dato a una versione specifica di Dagger-Hashimoto dopo che l'algoritmo è stato significativamente aggiornato, pur ereditando i principi fondamentali del suo predecessore. La rete principale di Ethereum ha utilizzato solo Ethash: Dagger Hashimoto era una versione di ricerca e sviluppo dell'algoritmo di mining che è stata sostituita prima dell'inizio del mining sulla rete principale di Ethereum. -[Di più su Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). +[Maggiori informazioni su Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash). ## Letture consigliate {#further-reading} -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/dapps/index.md b/public/content/translations/it/developers/docs/dapps/index.md index f53b9af7416..9f13daaab93 100644 --- a/public/content/translations/it/developers/docs/dapps/index.md +++ b/public/content/translations/it/developers/docs/dapps/index.md @@ -1,96 +1,104 @@ --- -title: Introduzione alle dapp +title: Introduzione tecnica alle dApp description: lang: it --- -Un'applicazione decentralizzata (dapp) è un'applicazione costruita su una rete decentralizzata che combina un [contratto intelligente](/developers/docs/smart-contracts/) e l'interfaccia utente di un frontend. Su Ethereum, i contratti intelligenti sono accessibili e trasparenti (come le API aperte), quindi la tua dapp può persino includere un contratto intelligente, già scritto da qualcun altro. +Un'applicazione decentralizzata (dApp) è un'applicazione creata su una rete decentralizzata che combina un [contratto intelligente](/developers/docs/smart-contracts/) e un'interfaccia utente frontend. Su [Ethereum](/), i contratti intelligenti sono accessibili e trasparenti, come delle API aperte, quindi la tua dApp può persino includere un contratto intelligente scritto da qualcun altro. ## Prerequisiti {#prerequisites} -Prima di approfondire le dapp, è consigliabile conoscere le [basi della blockchain](/developers/docs/intro-to-ethereum/) e informarsi sulla rete Ethereum e sul perché è decentralizzata. +Prima di imparare a conoscere le dApp, dovresti coprire le [basi della blockchain](/developers/docs/intro-to-ethereum/) e leggere della rete di Ethereum e di come sia decentralizzata. -## Definizione di dapp {#definition-of-a-dapp} +## Definizione di una dApp {#definition-of-a-dapp} -Il codice backend di una dapp viene eseguito su una rete decentralizzata peer-to-peer. L'opposto di quello che succede con una app il cui codice backend gira su server centralizzati. +Una dApp ha il suo codice di backend in esecuzione su una rete peer-to-peer decentralizzata. Confrontalo con un'app in cui il codice di backend è in esecuzione su server centralizzati. -Una dapp può avere codice frontend e interfacce utente scritti in qualsiasi linguaggio (come qualsiasi app) che possono fare chiamate al backend. Inoltre, il frontend può essere ospitato su uno storage decentralizzato come [IPFS](https://ipfs.io/). +Una dApp può avere codice frontend e interfacce utente scritte in qualsiasi linguaggio (proprio come un'app) per effettuare chiamate al suo backend. Inoltre, il suo frontend può essere ospitato su un'archiviazione decentralizzata come [IPFS](https://ipfs.io/). -- **Decentralizzate** - Le dApp operano su Ethereum, una piattaforma pubblica decentralizzata dove nessun individuo o gruppo detiene il controllo -- **Deterministiche**: eseguono la stessa funzione a prescindere dall'ambiente dove vengono eseguite. -- **Turing complete** - Le dApp possono eseguire qualsiasi azione una volta fornite le risorse necessarie -- **Isolate** - Le dApp sono eseguite in un ambiente virtuale, noto come la Macchina Virtuale di Ethereum, così che se il contratto intelligente contiene un bug, non ostacolerà il normale funzionamento della rete della blockchain +- **Decentralizzata**: le dApp operano su Ethereum, una piattaforma decentralizzata pubblica e aperta in cui nessuna persona o gruppo ha il controllo. +- **Deterministica**: le dApp svolgono la stessa funzione indipendentemente dall'ambiente in cui vengono eseguite. +- **Turing completa**: le dApp possono eseguire qualsiasi azione date le risorse necessarie. +- **Isolata**: le dApp vengono eseguite in un ambiente virtuale noto come macchina virtuale di Ethereum, in modo che se il contratto intelligente ha un bug, non ostacolerà il normale funzionamento della rete blockchain. ### Sui contratti intelligenti {#on-smart-contracts} -Per introdurre le dapp, dobbiamo introdurre i contratti intelligenti: la backend di una dapp, in mancanza di un termine migliore. Per una panoramica dettagliata, consulta la nostra sezione sui [contratti intelligenti](/developers/docs/smart-contracts/). +Per introdurre le dApp, dobbiamo introdurre i contratti intelligenti: il backend di una dApp, in mancanza di un termine migliore. Per una panoramica dettagliata, vai alla nostra sezione sui [contratti intelligenti](/developers/docs/smart-contracts/). -Un contratto intelligente è codice che risiede sulla blockchain di Ethereum e opera esattamente come programmato. Una volta distribuiti i contratti intelligenti sulla rete, non puoi modificarli. Le dapp possono essere decentralizzate perché sono controllate della logica scritta nel contratto, non da un individuo o da un'azienda. Questo significa anche che devi progettare i tuoi contratti molto attenteamente e testarli accuratamente. +Un contratto intelligente è un codice che risiede sulla blockchain di Ethereum e viene eseguito esattamente come programmato. Una volta che i contratti intelligenti sono distribuiti sulla rete, non puoi modificarli. Le dApp possono essere decentralizzate perché sono controllate dalla logica scritta nel contratto, non da un individuo o da un'azienda. Questo significa anche che devi progettare i tuoi contratti con molta attenzione e testarli a fondo. -## Vantaggi dello sviluppo delle dapp {#benefits-of-dapp-development} +## Vantaggi dello sviluppo di dApp {#benefits-of-dapp-development} -- **Nessun tempo di inattività** – Una volta distribuito il contratto intelligente sulla blockchain, l'intera rete potrà sempre servire i clienti che cercano di interagire con il contratto. Gli attori malevoli quindi non possono lanciare attacchi denial-of-service verso dapp singole. -- **Privacy**: non è necessario fornire un'identità reale per distribuire una dapp o interagirvi. -- **Resistenza alla censura**: nessuna entità sulla rete può impedire agli utenti di inviare transazioni, distribuire dapp o leggere dati dalla blockchain. -- **Completa integrità dei dati**: i dati conservati sulla blockchain sono immutabili e indiscutibili, grazie alle primitive crittografiche. Attori malevoli non possono falsificare transazioni o altri dati che sono già stati resi pubblici. -- **Calcolo senza fiducia/comportamento verificabile** – I contratti intelligenti sono analizzabili e, l'esecuzione in modi prevedibili è garantita, senza il bisogno di affidarsi a un'autorità centrale. Questo non accade nei modelli tradizionali. Per esempio, quando usiamo l'online banking dobbiamo fidarci del fatto che gli istituti finanziari non abusino dei nostri dati finanziari, non manomettano record e non vengano attaccati da hacker. +- **Zero tempi di inattività**: una volta che il contratto intelligente è distribuito sulla blockchain, la rete nel suo complesso sarà sempre in grado di servire i client che cercano di interagire con il contratto. Gli attori malintenzionati, pertanto, non possono lanciare attacchi denial-of-service mirati a singole dApp. +- **Privacy**: non è necessario fornire un'identità del mondo reale per distribuire o interagire con una dApp. +- **Resistenza alla censura**: nessuna singola entità sulla rete può impedire agli utenti di inviare transazioni, distribuire dApp o leggere dati dalla blockchain. +- **Integrità completa dei dati**: i dati archiviati sulla blockchain sono immutabili e indiscutibili, grazie alle primitive crittografiche. Gli attori malintenzionati non possono falsificare transazioni o altri dati che sono già stati resi pubblici. +- **Calcolo senza fiducia/comportamento verificabile**: i contratti intelligenti possono essere analizzati e sono garantiti per essere eseguiti in modi prevedibili, senza la necessità di fidarsi di un'autorità centrale. Questo non è vero nei modelli tradizionali; ad esempio, quando utilizziamo i sistemi bancari online, dobbiamo fidarci che le istituzioni finanziarie non abusino dei nostri dati finanziari, non manomettano i registri o non vengano hackerate. ## Svantaggi dello sviluppo di dApp {#drawbacks-of-dapp-development} -- **Manutenzione**: le dapp possono essere impegnative da mantenere perché il codice e i dati pubblicati sulla blockchain sono più difficili da modificare. Per gli sviluppatori, è difficile apportare degli aggiornamenti alle loro dApp (o ai dati sottostanti, memorizzati da una dApp) una volta distribuite, anche se vengono individuati dei bug o rischi di sicurezza in una versione precedente. -- **Overhead delle prestazioni**: l'overhead delle prestazioni è enorme e scalare è davvero difficile. Per raggiungere il livello di sicurezza, integrità, trasparenza e affidabilità al quale aspira Ethereum, ogni nodo esegue e memorizza ogni transazione. Oltre a ciò, anche il consenso di proof-of-stake richiede tempo. -- **Congestione della rete**: quando una dApp utilizza troppe risorse di calcolo, l'intera rete viene sostenuta. Attualmente, la rete è in grado di elaborare circa 10 transazioni al secondo; se le transazioni vengono inviate a un ritmo più alto, l'insieme di transazioni non confermate può "gonfiarsi" e accumularsi. -- **Esperienza utente**: potrebbe essere difficile creare esperienze intuitive. L'utente medio potrebbe trovare troppo difficile configurare la serie di strumenti necessaria a interagire con la blockchain in modo veramente sicuro. -- **Centralizzazione**: soluzioni facili da utilizzare e compatibili con gli sviluppatori costruite sullo strato base di Ethereum potrebbero finire per assomigliare comunque a servizi centralizzati. Ad esempio, tali servizi potrebbero memorizzare le chiavi o altre informazioni sensibili sul lato del server, servire un frontend utilizzando un server centralizzato oppure utilizzare un'importante logica commerciale su un server centralizzato prima di scrivere sulla blockchain. La centralizzazione annulla molti (se non tutti) i vantaggi della blockchain rispetto al modello tradizionale. +- **Manutenzione**: le dApp possono essere più difficili da mantenere perché il codice e i dati pubblicati sulla blockchain sono più difficili da modificare. È difficile per gli sviluppatori apportare aggiornamenti alle loro dApp (o ai dati sottostanti archiviati da una dApp) una volta distribuite, anche se vengono identificati bug o rischi per la sicurezza in una vecchia versione. +- **Sovraccarico delle prestazioni**: c'è un enorme sovraccarico delle prestazioni e la scalabilità è davvero difficile. Per raggiungere il livello di sicurezza, integrità, trasparenza e affidabilità a cui aspira Ethereum, ogni nodo esegue e archivia ogni transazione. Oltre a questo, anche il consenso della prova di stake richiede tempo. +- **Congestione della rete**: quando una dApp utilizza troppe risorse computazionali, l'intera rete si blocca. Attualmente, la rete può elaborare solo circa 10-15 transazioni al secondo; se le transazioni vengono inviate più velocemente di così, il pool di transazioni non confermate può gonfiarsi rapidamente. +- **Esperienza utente**: potrebbe essere più difficile progettare esperienze user-friendly perché l'utente finale medio potrebbe trovare troppo difficile configurare uno stack di strumenti necessario per interagire con la blockchain in modo veramente sicuro. +- **Centralizzazione**: le soluzioni user-friendly e developer-friendly costruite sopra il livello di base di Ethereum potrebbero finire per sembrare comunque servizi centralizzati. Ad esempio, tali servizi potrebbero archiviare chiavi o altre informazioni sensibili lato server, servire un frontend utilizzando un server centralizzato o eseguire importanti logiche aziendali su un server centralizzato prima di scrivere sulla blockchain. La centralizzazione elimina molti (se non tutti) i vantaggi della blockchain rispetto al modello tradizionale. -## Preferisci un approccio visivo all'apprendimento? {#visual-learner} +## Preferisci imparare visivamente? {#visual-learner} -## Strumenti per creare le dApp {#dapp-tools} +## Strumenti per creare dApp {#dapp-tools} -**Scaffold-ETH _ Sperimenta rapidamente con Solidity utilizzando un frontend che si adatta al tuo contratto intelligente._** +**Scaffold-ETH _- Sperimenta rapidamente con Solidity utilizzando un frontend che si adatta al tuo contratto intelligente._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) -- [Esempio di dApp](https://punkwallet.io/) +- [dApp di esempio](https://punkwallet.io/) -**Crea Eth App_- Crea app basate su Ethereum con un comando._** +**Create Eth App _- Crea app basate su Ethereum con un solo comando._** - [GitHub](https://github.com/paulrberg/create-eth-app) -**One Click Dapp _- Strumento di FOSS per generare frontend di dapp da un'[ABI](/glossary/#abi)._** +**One Click Dapp _- Strumento FOSS per generare frontend di dApp da un' [ABI](/glossary/#abi)._** - [oneclickdapp.com](https://oneclickdapp.com) - [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) -**Etherflow _- Strumento di FOSS per sviluppatori di Ethereum per testarne il nodo e comporre ed eseguire chiamate RPC di debug dal browser._** +**Etherflow _- Strumento FOSS per gli sviluppatori di Ethereum per testare il loro nodo e comporre ed eseguire il debug delle chiamate RPC dal browser._** - [etherflow.quiknode.io](https://etherflow.quiknode.io/) - [GitHub](https://github.com/abunsen/etherflow) **thirdweb _- SDK in ogni linguaggio, contratti intelligenti, strumenti e infrastruttura per lo sviluppo web3._** -- [Home page](https://thirdweb.com/) +- [Homepage](https://thirdweb.com/) - [Documentazione](https://portal.thirdweb.com/) - [GitHub](https://github.com/thirdweb-dev/) -**Crossmint: _piattaforma di sviluppo Web3 per imprese per distribuire i contratti intelligenti, abilitare i pagamenti con carta di credito e tra catene e utilizzare le API per creare, distribuire, vendere, memorizzare e modificare i NFT._** +**Crossmint _- Piattaforma di sviluppo web3 di livello aziendale per distribuire contratti intelligenti, abilitare pagamenti con carta di credito e cross-chain e utilizzare API per creare, distribuire, vendere, archiviare e modificare NFT._** - [crossmint.com](https://www.crossmint.com) - [Documentazione](https://docs.crossmint.com) - [Discord](https://discord.com/invite/crossmint) -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} -- [Esplora le dapp](/apps) -- [L'Architettura di un'applicazione Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [Esplora le dApp](/apps) +- [L'architettura di un'applicazione Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ - [Una guida del 2021 alle applicazioni decentralizzate](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) - _LimeChain_ -- [Cosa sono le App Decentralizzate?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) - _Gemini_ -- [Dapp popolari](https://www.alchemy.com/dapps) - _Alchemy_ +- [Cosa sono le app decentralizzate?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) - _Gemini_ +- [dApp popolari](https://www.alchemy.com/dapps) - _Alchemy_ -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti ha aiutato? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} - [Introduzione allo stack di Ethereum](/developers/docs/ethereum-stack/) -- [Quadri di sviluppo](/developers/docs/frameworks/) +- [Framework di sviluppo](/developers/docs/frameworks/) + +## Tutorial: Creare app e frontend su Ethereum {#tutorials} + +- [Guida ai contratti di Uniswap-v2](/developers/tutorials/uniswap-v2-annotated-code/) _– Una guida annotata dei contratti principali di Uniswap v2 che spiega come funziona l'AMM._ +- [Creare un'interfaccia utente per il tuo contratto](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) _– Come creare un frontend moderno React + wagmi che si connette al tuo contratto intelligente._ +- [Contratto intelligente Hello World per principianti – Fullstack](/developers/tutorials/hello-world-smart-contract-fullstack/) _– Tutorial end-to-end: scrivi, distribuisci e crea un frontend per un semplice contratto intelligente._ +- [Componenti server e agenti per app web3](/developers/tutorials/server-components/) _– Come scrivere componenti server TypeScript che ascoltano gli eventi della blockchain e rispondono con transazioni._ +- [IPFS per interfacce utente decentralizzate](/developers/tutorials/ipfs-decentralized-ui/) _– Come ospitare il frontend della tua dApp su IPFS per la resistenza alla censura._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/it/developers/docs/data-and-analytics/block-explorers/index.md index fd3b872c6ab..cc1faee3de8 100644 --- a/public/content/translations/it/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/translations/it/developers/docs/data-and-analytics/block-explorers/index.md @@ -1,259 +1,245 @@ --- -title: Esploratori dei blocchi -description: Un'introduzione agli esploratori di blocchi, il tuo portale al mondo dei dati della blockchain, dove puoi richiedere informazioni sulle transazioni, i conti, i contratti e altro. +title: Esploratori di blocchi +description: Un'introduzione agli esploratori di blocchi, il tuo portale nel mondo dei dati della blockchain, dove puoi interrogare informazioni su transazioni, account, contratti e altro ancora. lang: it sidebarDepth: 3 --- -I block explorer sono il tuo portale sui dati di Ethereum. Puoi usarli per vedere in tempo reale dati su blocchi, transazioni, validatori, conti e altre attività on-chain. +Gli esploratori di blocchi sono il tuo portale per i dati di Ethereum. Puoi usarli per visualizzare dati in tempo reale su blocchi, transazioni, validatori, account e altre attività on-chain. ## Prerequisiti {#prerequisites} -È consigliabile conoscere i concetti base di Ethereum in modo da capire quali dati si possono consultare in un block explorer. Inizia con [un'introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Dovresti comprendere i concetti di base di Ethereum per poter dare un senso ai dati che un esploratore di blocchi ti fornisce. Inizia con [un'introduzione a Ethereum](/developers/docs/intro-to-ethereum/). -## Servizi {#services} +## Strumenti open source {#open-source-tools} -- [Etherscan](https://etherscan.io/): _disponibile anche in cinese, coreano, russo e giapponese_ -- [3xpl](https://3xpl.com/ethereum) +- [3xpl](https://3xpl.com/ethereum) - Un esploratore di Ethereum senza pubblicità che consente di scaricare i suoi set di dati (open-core: i moduli principali sono open source) - [Beaconcha.in](https://beaconcha.in/) -- [Blockchair](https://blockchair.com/ethereum): _disponibile anche in spagnolo, francese, italiano, olandese, portoghese, russo, cinese e farsi_ - [Blockscout](https://eth.blockscout.com/) +- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan) +- [Otterscan](https://otterscan.io/) + +## Servizi {#services} + +- [Blockchair](https://blockchair.com/ethereum) - Esploratore privato di Ethereum. Utile anche per ordinare e filtrare i dati (mempool). Disponibile in spagnolo, francese, italiano, olandese, portoghese, russo, cinese e farsi - [Chainlens](https://www.chainlens.com/) - [DexGuru Block Explorer](https://ethereum.dex.guru/) - [Etherchain](https://www.etherchain.org/) -- [Ethernow](https://www.ethernow.xyz/) -- [Ethplorer](https://ethplorer.io/): _disponibile anche in cinese, spagnolo, francese, turco, russo, coreano e vietnamita_ +- [Etherscan](https://etherscan.io/) - Disponibile anche in cinese, coreano, russo e giapponese +- [Ethplorer](https://ethplorer.io/) - Un esploratore di blocchi con un focus sui token. Disponibile anche in cinese, spagnolo, francese, turco, russo, coreano e vietnamita +- [Ethseer](https://ethseer.io) - [EthVM](https://www.ethvm.com/) - [OKLink](https://www.oklink.com/eth) -- [Rantom](https://rantom.app/) -- [Ethseer](https://ethseer.io) - -## Strumenti open source {#open-source-tools} - -- [Otterscan](https://otterscan.io/) -- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan) ## Dati {#data} -Ethereum è trasparente per definizione, quindi tutto è verificabile. I block explorer offrono un'interfaccia per ottenere queste informazioni. Questo vale sia per la rete Ethereum principale che per le reti di prova, nel caso servissero questi tipi di dati. I dati sono divisi in dati d'esecuzione e di consenso. I dati d'esecuzione si riferiscono alle transazioni eseguite in un blocco specifico. I dati di consenso si riferiscono ai blocchi stessi e ai validatori che li hanno proposti. +Ethereum è trasparente per concezione, quindi tutto è verificabile. Gli esploratori di blocchi forniscono un'interfaccia per ottenere queste informazioni. E questo vale sia per la rete principale di Ethereum che per le reti di test, nel caso in cui avessi bisogno di quei dati. I dati sono divisi in dati di esecuzione e dati di consenso. I dati di esecuzione si riferiscono alle transazioni che sono state eseguite in un blocco specifico. I dati di consenso si riferiscono ai blocchi stessi e ai validatori che li hanno proposti. -Ecco un riepilogo dei tipi di dati ottenibili da un block explorer. +Ecco un riepilogo dei tipi di dati che puoi ottenere da un esploratore di blocchi. -### Dati d'esecuzione {#execution-data} +### Dati di esecuzione {#execution-data} -Ogni 12 secondi vengono aggiunti nuovi blocchi a Ethereum (a meno che un propositore del blocco salti il proprio turno), quindi un flusso di dati quasi costante viene aggiunto agli esploratori di blocchi. I blocchi contengono molti dati importanti che potrebbero risultare utili: +Nuovi blocchi vengono aggiunti a Ethereum ogni 12 secondi (a meno che un proponente del blocco non salti il suo turno), quindi un flusso quasi costante di dati viene aggiunto agli esploratori di blocchi. I blocchi contengono molti dati importanti che potresti trovare utili: **Dati standard** -- Altezza del blocco - Il numero del blocco e la lunghezza della blockchain (in blocchi) alla creazione del blocco corrente -- Marca oraria - L'ora in cui è stato proposto un blocco -- Transazioni - Il numero di transazioni incluse nel blocco -- Destinatario della commissione: L'indirizzo che ha ricevuto le mance della commissione del gas dalle transazioni -- Ricompensa del blocco - L'importo di ETH elargito al validatore che ha proposto il blocco -- Dimensione - Le dimensioni dei dati nel blocco (misurate in byte) -- Gas usato: Le unità di gas totali usate dalle transazioni nel blocco -- Limite di gas: I limiti totali di gas impostati dalle transazioni nel blocco -- Commissione di base per il gas: Il moltiplicatore minimo necessario perché una transazione sia inclusa in un blocco -- Commissioni bruciate - La quantità di ETH bruciati nel blocco -- Dati aggiuntivi - Eventuali dati aggiuntivi che il costruttore ha incluso nel blocco +- Altezza del blocco (Block height) - Il numero del blocco e la lunghezza della blockchain (in blocchi) alla creazione del blocco corrente +- Marca temporale (Timestamp) - Il momento in cui un blocco è stato proposto +- Transazioni (Transactions) - Il numero di transazioni incluse all'interno del blocco +- Destinatario delle commissioni (Fee recipient) - L'indirizzo che ha ricevuto le mance delle commissioni del gas dalle transazioni +- Ricompensa del blocco (Block Reward) - La quantità di ETH assegnata al validatore che ha proposto il blocco +- Dimensione (Size) - La dimensione dei dati all'interno del blocco (misurata in byte) +- Gas utilizzato (Gas used) - Le unità totali di gas utilizzate dalle transazioni nel blocco +- Limite del gas (Gas limit) - I limiti totali del gas impostati dalle transazioni nel blocco +- Commissione di base per gas (Base fee per gas) - Il moltiplicatore minimo richiesto affinché una transazione sia inclusa in un blocco +- Commissioni bruciate (Burnt fees) - Quanto ETH viene bruciato nel blocco +- Dati extra (Extra data) - Qualsiasi dato extra che il costruttore ha incluso nel blocco **Dati avanzati** -- Hash - L'hash crittografico rappresentante l'intestazione del blocco (l'identificativo univoco del blocco) -- Hash padre - L'hash del blocco che precedeva quello corrente -- StateRoot - L'hash di root dell'albero di Merkle che memorizza l'intero stato del sistema +- Hash - L'hash crittografico che rappresenta l'intestazione del blocco (l'identificatore univoco del blocco) +- Hash genitore (Parent hash) - L'hash del blocco precedente al blocco corrente +- Radice dello stato (StateRoot) - L'hash radice del trie di Merkle che memorizza l'intero stato del sistema ### Gas {#gas} -Non solo gli esploratori dei blocchi ti forniranno i dati sull'utilizzo del Gas nelle transazioni e nei blocchi, ma alcuni ti forniranno informazioni anche sui prezzi correnti del gas nella rete. Ciò ti aiuterà a comprendere l'utilizzo della rete, a inviare transazioni sicuri e a non spendere troppo in gas. Cerca le API che possono aiutarti a ottenere queste informazioni nell'interfaccia del tuo prodotto. I dati specifici sul gas coprono: +Non solo gli esploratori di blocchi ti forniranno dati sull'utilizzo del gas nelle transazioni e nei blocchi, ma alcuni ti daranno informazioni sui prezzi del gas attuali della rete. Questo ti aiuterà a comprendere l'utilizzo della rete, a inviare transazioni sicure e a non spendere troppo in gas. Cerca le API che possono aiutarti a integrare queste informazioni nell'interfaccia del tuo prodotto. I dati specifici del gas coprono: -- Le unità stimate di gas necessarie per una transazione sicura ma lenta (+ prezzo stimato e durata) -- Le unità stimate di gas necessarie per una transazione media (+ prezzo stimato e durata) -- Le unità stimate di gas necessarie per una transazione veloce (+ prezzo stimato e durata) +- Unità stimate di gas necessarie per una transazione sicura ma lenta (+ prezzo e durata stimati) +- Unità stimate di gas necessarie per una transazione media (+ prezzo e durata stimati) +- Unità stimate di gas necessarie per una transazione veloce (+ prezzo e durata stimati) - Tempo medio di conferma basato sul prezzo del gas -- Contratti che consumano gas: in altre parole, i prodotti popolari e più utilizzati sulla rete -- Conti che consumano gas: in altre parole, gli utenti frequenti della rete +- Contratti che stanno consumando gas - in altre parole, prodotti popolari che stanno registrando un grande utilizzo sulla rete +- Account che stanno spendendo gas - in altre parole, utenti frequenti della rete ### Transazioni {#transactions} -Gli esploratori di blocchi sono diventati un punto di riferimento comune per tracciare l'andamento delle transazioni. Questo perché il livello di dettaglio che si può ottenere offre maggior certezza. I dati delle transazioni includono: +Gli esploratori di blocchi sono diventati un luogo comune per le persone per tracciare l'avanzamento delle loro transazioni. Questo perché il livello di dettaglio che puoi ottenere fornisce una maggiore certezza. I dati delle transazioni includono: **Dati standard** -- Hash di transazione - Un hash generato all'invio della transazione -- Stato - Un'indicazione del fatto che la transazione sia in sospeso, fallita o riuscita -- Blocco - Il blocco in cui è stata inclusa la transazione -- Timestamp - Il momento in cui una transazione è stata inclusa in un blocco proposto da un validatore -- Mittente: L'indirizzo del conto che ha inviato la transazione -- A - L'indirizzo del destinatario o del contratto intelligente con cui interagisce la transazione -- Token trasferiti - Un elenco dei token trasferiti nell'ambito della transazione -- Valore - Il valore totale degli ETH trasferiti -- Commissione sulla transazione - L'importo pagato al validatore per elaborare la transazione (calcolato come prezzo del gas\*gas utilizzato). +- Hash della transazione (Transaction hash) - Un hash generato quando la transazione viene inviata +- Stato (Status) - Un'indicazione se la transazione è in sospeso, fallita o riuscita +- Blocco (Block) - Il blocco in cui è stata inclusa la transazione +- Marca temporale (Timestamp) - Il momento in cui una transazione è stata inclusa in un blocco proposto da un validatore +- Da (From) - L'indirizzo dell'account che ha inviato la transazione +- A (To) - L'indirizzo del destinatario o del contratto intelligente con cui la transazione interagisce +- Token trasferiti (Tokens transferred) - Un elenco di token che sono stati trasferiti come parte della transazione +- Valore (Value) - Il valore totale in ETH che viene trasferito +- Commissione della transazione (Transaction fee) - L'importo pagato al validatore per elaborare la transazione (calcolato da prezzo del gas\*gas utilizzato) **Dati avanzati** -- Limite di gas: I numeri massimi di unità di gas che questa transazione può consumare -- Gas usato: L'importo effettivo di unità di gas che la transazione ha consumato -- Prezzo del gas: Il prezzo fissato per unità di gas -- Nonce: Il numero della transazione per l'indirizzo `from` (tieni a mente che inizia a 0, quindi un nonce di `100`, sarebbe in realtà la 101° transazione inviata da questo conto -- Dati di input - Ogni informazione aggiuntiva richiesta dalla transazione +- Limite del gas (Gas limit) - Il numero massimo di unità di gas che questa transazione può consumare +- Gas utilizzato (Gas used) - La quantità effettiva di unità di gas consumate dalla transazione +- Prezzo del gas (Gas price) - Il prezzo impostato per unità di gas +- Nonce - Il numero della transazione per l'indirizzo `from` (tieni presente che inizia da 0, quindi un nonce di `100` sarebbe in realtà la 101esima transazione inviata da questo account) +- Dati di input (Input data) - Qualsiasi informazione extra richiesta dalla transazione -### Conti {#accounts} +### Account {#accounts} -Esistono molti dati relativi a un conto a cui puoi accedere. Ecco perché, spesso, è consigliato usare più conti, così che le tue risorse e il tuo valore non siano facili da tracciare. Sono in oltre in corso di sviluppo alcune soluzioni per rendere le transazioni e l'attività del conto, più private. Ma ecco i dati disponibili per i conti: +Ci sono molti dati a cui puoi accedere riguardo a un account. Questo è il motivo per cui spesso si consiglia di utilizzare più account in modo che i tuoi asset e il tuo valore non possano essere facilmente tracciati. Ci sono anche alcune soluzioni in fase di sviluppo per rendere le transazioni e l'attività dell'account più private. Ma ecco i dati disponibili per gli account: -**Conti dell'utente** +**Account utente** -- Indirizzo del conto: L'indirizzo pubblico che puoi usare per l'invio dei fondi -- Saldo di ETH: L'importo di ETH associato a quel conto -- Valore totale di ETH - Il valore degli ETH -- Token: I token associati al conto e il loro valore -- Storico delle transazioni: Un elenco di tutte le transazioni in cui questo conto era il mittente o il destinatario +- Indirizzo dell'account (Account address) - L'indirizzo pubblico che puoi utilizzare per inviare fondi +- Saldo in ETH (ETH balance) - La quantità di ETH associata a quell'account +- Valore totale in ETH (Total ETH value) - Il valore degli ETH +- Token - I token associati all'account e il loro valore +- Cronologia delle transazioni (Transaction history) - Un elenco di tutte le transazioni in cui questo account è stato il mittente o il destinatario -**Contratto intelligente** +**Contratti intelligenti** -I conti del contratto intelligente contengono tutti i dati che avrà il conto di un utente, ma alcuni esploratori del blocco mostreranno persino delle informazioni del codice. Ad esempio: +Gli account dei contratti intelligenti hanno tutti i dati che avrà un account utente, ma alcuni esploratori di blocchi mostreranno persino alcune informazioni sul codice. Gli esempi includono: -- Creatore del contratto - L'indirizzo che ha distribuito il contratto sulla rete principale -- Transazione di creazione - La transazione che ha incluso la distribuzione alla rete principale -- Codice sorgente: Il codice in Solidity o Vyper del contratto intelligente -- ABI del contratto - L'interfaccia binaria dell'applicazione del contratto; le chiamate che il contratto effettua e i dati ricevuti -- Codice di creazione del contratto: Il bytecode compilato del contratto intelligente, creato quando compili un contratto intelligente scritto in Solidity o Vyper, etc. -- Eventi del contratto: Uno storico dei metodi chiamati nel contratto intelligente, fondamentalmente, un modo per vedere come e quanto spesso è usato il contratto +- Creatore del contratto (Contract creator) - L'indirizzo che ha distribuito il contratto sulla rete principale +- Transazione di creazione (Creation transaction) - La transazione che ha incluso la distribuzione sulla rete principale +- Codice sorgente (Source code) - Il codice Solidity o Vyper del contratto intelligente +- ABI del contratto (Contract ABI) - L'Application Binary Interface del contratto: le chiamate che il contratto effettua e i dati ricevuti +- Codice di creazione del contratto (Contract creation code) - Il bytecode compilato del contratto intelligente, creato quando compili un contratto intelligente scritto in Solidity o Vyper, ecc. +- Eventi del contratto (Contract events) - Una cronologia dei metodi chiamati nel contratto intelligente: fondamentalmente un modo per vedere come viene utilizzato il contratto e con quale frequenza ### Token {#tokens} -I token sono un tipo di contratto, quindi conterranno dati simili a un contratto intelligente. Ma siccome hanno un valore e possono essere scambiati, contengono dati aggiuntivi: +I token sono un tipo di contratto, quindi avranno dati simili a un contratto intelligente. Ma poiché hanno un valore e possono essere scambiati, hanno punti dati aggiuntivi: -- Tipo - Se si tratta di un ERC-20, un ERC-721 o un altro standard di token -- Prezzo - Se si tratta di un ERC-20, avrà il valore di mercato corrente -- Limite di mercato - Se si tratta di un ERC-20, avrà un limite di mercato (calcolato come prezzo\*offerta totale) -- Offerta totale - Il numero di token in circolazione -- Titolari - Il numero di indirizzi contenenti il token -- Trasferimenti: Il numero di volte che il token è stato trasferito tra i conti -- Storico delle transazioni - Uno storico di tutte le transazioni che includono il token -- Indirizzo del contratto - L'indirizzo del token distribuito sulla rete principale -- Decimali - I token ERC-20 sono divisibili e hanno cifre decimali +- Tipo (Type) - Se sono un ERC-20, ERC-721 o un altro standard di token +- Prezzo (Price) - Se sono un ERC-20 avranno un valore di mercato attuale +- Capitalizzazione di mercato (Market cap) - Se sono un ERC-20 avranno una capitalizzazione di mercato (calcolata da prezzo\*offerta totale) +- Offerta totale (Total supply) - Il numero di token in circolazione +- Titolari (Holders) - Il numero di indirizzi che detengono il token +- Trasferimenti (Transfers) - Il numero di volte in cui il token è stato trasferito tra gli account +- Cronologia delle transazioni (Transaction history) - Una cronologia di tutte le transazioni che includono il token +- Indirizzo del contratto (Contract address) - L'indirizzo del token che è stato distribuito sulla rete principale +- Decimali (Decimals) - I token ERC-20 sono divisibili e hanno posizioni decimali ### Rete {#network} -Alcuni dati del blocco si preoccupano della salute di Ethereum in modo più olistico. +Alcuni dati dei blocchi riguardano la salute di Ethereum in modo più olistico. -- Transazioni totali - Il numero di transazioni dalla creazione di Ethereum -- Transazioni al secondo - Il numero di transazioni elaborabili in un secondo -- Prezzo di ETH - Le quotazioni correnti di 1 ETH -- Offerta totale di ETH - Numero di ETH in circolazione, ricorda che i nuovi ETH sono creati alla creazione di ogni blocco sotto forma di ricompense del blocco -- Limite di mercato - Calcolo di prezzo\*offerta +- Transazioni totali (Total transactions) - Il numero di transazioni da quando è stato creato Ethereum +- Transazioni al secondo (Transactions per second) - Il numero di transazioni elaborabili in un secondo +- Prezzo di ETH (ETH price) - Le valutazioni attuali di 1 ETH +- Offerta totale di ETH (Total ETH supply) - Numero di ETH in circolazione: ricorda che nuovi ETH vengono creati con la creazione di ogni blocco sotto forma di ricompense del blocco +- Capitalizzazione di mercato (Market cap) - Calcolo di prezzo\*offerta ## Dati del livello di consenso {#consensus-layer-data} -### Epoche {#epoch} +### Epoca {#epoch} -Per motivi di sicurezza, vengono creati commissioni randomizzate di validatori alla fine di ogni epoca (ogni 6,4 minuti). I dati relativi alle epoche includono: +Per motivi di sicurezza, comitati randomizzati di validatori vengono creati alla fine di ogni epoca (ogni 6,4 minuti). I dati dell'epoca includono: -- Numero dell'epoca -- Stato finalizzato - Se l'epoca è stata finalizzata (Sì/No) -- Ora - L'ora in cui è terminata l'epoca -- Attestazioni - Il numero di attestazioni nell'epoca (voti per i blocchi negli slot) -- Depositi - Il numero di depositi di ETH inclusi nell'epoca (per diventare validatori, occorre mettere ETH in staking) -- Tagli - Numero di sanzioni date ai propositori di blocchi o agli attestatori -- Partecipazione al voto - L'importo di ETH in staking usato per attestare i blocchi -- Validatori - Numero di validatori attivi per ogni epoca -- Saldo medio del validatore - Saldo medio per i validatori attivi -- Slot - Numero di slot inclusi nell'epoca (gli slot includono un blocco valido) +- Numero dell'epoca (Epoch number) +- Stato finalizzato (Finalized status) - Se l'epoca è stata finalizzata (Sì/No) +- Tempo (Time) - Il momento in cui è terminata l'epoca +- Attestazioni (Attestations) - Il numero di attestazioni nell'epoca (voti per i blocchi all'interno degli slot) +- Depositi (Deposits) - Il numero di depositi di ETH inclusi nell'epoca (i validatori devono mettere in stake ETH per diventare validatori) +- Punizioni (Slashings) - Numero di penalità inflitte ai proponenti dei blocchi o agli attestatori +- Partecipazione al voto (Voting participation) - La quantità di ETH in stake utilizzata per attestare i blocchi +- Validatori (Validators) - Numero di validatori attivi per l'epoca +- Saldo medio del validatore (Average Validator balance) - Saldo medio per i validatori attivi +- Slot (Slots) - Numero di slot inclusi nell'epoca (gli slot includono un blocco valido) ### Slot {#slot} -Gli slot sono opportunità per la creazione di un blocco e i dati disponibili per ogni slot includono: - -- Epoca - L'epoca in cui è valido lo slot -- Numero dello slot -- Stato - Lo stato dello slot (Proposto/Mancato) -- Ora - La marca oraria dello slot -- Propositore - Il validatore che ha proposto il blocco per lo slot -- Radice del blocco - La radice dell'albero dell'hash del BeaconBlock -- Radice madre - L'hash del blocco precedente -- Radice di stato - La radice dell'albero dell'hash del BeaconState -- Firma -- Randao reveal -- Graffiti - Il propositore di un blocco può includere un messaggio di 32 byte alla proposta relativa al blocco -- Dati d'esecuzione - - Hash del blocco - - Numero di depositi - - Radice del deposito -- Attestazioni - Numero di attestazioni per il blocco in questo slot -- Depositi - Il numero di depositi durante questo slot -- Uscite volontarie - Il numero di validatori che hanno abbandonato durante lo slot -- Tagli - Numero di sanzioni date ai propositori di blocchi o attestatori -- Voti - I validatori che hanno votato per il blocco in questo slot +Gli slot sono opportunità per la creazione di blocchi, i dati disponibili per ogni slot includono: + +- Epoca (Epoch) - L'epoca in cui lo slot è valido +- Numero dello slot (Slot number) +- Stato (Status) - Lo stato dello slot (Proposto/Mancato) +- Tempo (Time) - La marca temporale dello slot +- Proponente (Proposer) - Il validatore che ha proposto il blocco per lo slot +- Radice del blocco (Block root) - L'hash-tree-root del BeaconBlock +- Radice genitore (Parent root) - L'hash del blocco precedente +- Radice dello stato (State root) - L'hash-tree-root del BeaconState +- Firma (Signature) +- Rivelazione Randao (Randao reveal) +- Graffiti - Un proponente del blocco può includere un messaggio lungo 32 byte alla sua proposta di blocco +- Dati di esecuzione (Execution Data) + - Hash del blocco (Block hash) + - Conteggio dei depositi (Deposit count) + - Radice dei depositi (Deposit root) +- Attestazioni (Attestations) - Numero di attestazioni per il blocco in questo slot +- Depositi (Deposits) - Il numero di depositi durante questo slot +- Uscite volontarie (Voluntary exits) - Il numero di validatori che hanno lasciato durante lo slot +- Punizioni (Slashings) - Numero di penalità inflitte ai proponenti dei blocchi o agli attestatori +- Voti (Votes) - I validatori che hanno votato per il blocco in questo slot ### Blocchi {#blocks-1} -Il proof-of-stake divide il tempo in slot ed epoche, il che significa nuovi dati! +La prova di stake divide il tempo in slot ed epoche. Quindi questo significa nuovi dati! -- Propositore - Il validatore scelto dall'algoritmo per proporre il nuovo blocco -- Epoca - L'epoca in cui è stato proposto il blocco +- Proponente (Proposer) - Il validatore che è stato scelto algoritmicamente per proporre il nuovo blocco +- Epoca (Epoch) - L'epoca in cui è stato proposto il blocco - Slot - Lo slot in cui è stato proposto il blocco -- Attestazioni - Il numero di attestazioni incluse nello slot; le attestazioni sono come i voti che indicano che il blocco è pronto per andare alla beacon chain +- Attestazioni (Attestations) - Il numero di attestazioni incluse nello slot: le attestazioni sono come voti che indicano che il blocco è pronto per andare sulla Beacon Chain ### Validatori {#validators} -I validatori sono responsabili per proporre blocchi e attestarli all'interno degli slot. +I validatori sono responsabili della proposta dei blocchi e della loro attestazione all'interno degli slot. -- Numero del validatore - Numero univoco rappresentante il validatore -- Saldo corrente - Il saldo del validatore che include le ricompense -- Saldo effettivo - Il saldo del validatore usato per lo staking -- Reddito - Le ricompense o sanzioni ricevute dal validatore -- Stato - Se il validatore è attualmente online e se è attivo o meno -- Efficienza dell'attestazione - Il tempo medio impiegato per le attestazioni del validatore affinché fossero incluse nella catena -- Idoneità all'attivazione - Data (ed epoca) in cui il validatore è divenuto disponibile a validare -- Attivo dal - Data (ed epoca) in cui il validatore è divenuto attivo -- Blocchi proposti - Il blocco proposto dal validatore -- Attestazioni - Le attestazioni fornite dal validatore -- Depositi - L'indirizzo di provenienza, l'hash della transazione, il numero del blocco, la marca oraria, l'importo e lo stato del deposito di staking effettuato dal validatore +- Numero del validatore (Validator number) - Numero univoco che rappresenta il validatore +- Saldo attuale (Current balance) - Il saldo del validatore incluse le ricompense +- Saldo effettivo (Effective balance) - Il saldo del validatore che viene utilizzato per lo staking +- Reddito (Income) - Le ricompense o le penalità ricevute dal validatore +- Stato (Status) - Se il validatore è attualmente online e attivo o meno +- Efficacia dell'attestazione (Attestation effectiveness) - Il tempo medio impiegato affinché le attestazioni del validatore vengano incluse nella catena +- Idoneità per l'attivazione (Eligibility for activation) - Data (ed epoca) in cui il validatore è diventato disponibile per validare +- Attivo dal (Active since) - Data (ed epoca) in cui il validatore è diventato attivo +- Blocchi proposti (Proposed blocks) - Il blocco che il validatore ha proposto +- Attestazioni (Attestations) - Le attestazioni che il validatore ha fornito +- Depositi (Deposits) - L'indirizzo di provenienza, l'hash della transazione, il numero del blocco, la marca temporale, l'importo e lo stato del deposito di staking effettuato dal validatore ### Attestazioni {#attestations} -Le attestazioni sono voti positivi per l'inclusione dei blocchi nella catena. I loro dati si riferiscono a un record dell'attestazione e ai validatori che hanno attestato +Le attestazioni sono voti "sì" per includere i blocchi nella catena. I loro dati si riferiscono a un registro dell'attestazione e ai validatori che hanno attestato -- Slot - Lo slot in cui è avvenuta l'attestazione -- Indice della commissione - L'indice della commissione allo slot dato -- Bit di aggregazione - Rappresenta l'attestazione aggregata di tutti i validatori partecipanti nell'attestazione -- Validatori - I validatori che hanno fornito le attestazioni -- Radice del blocco della Beacon - Punta al blocco su cui i validatori stanno attestando -- Sorgente - Punta all'ultima epoca giustificata -- Destinazione - Punta al confine dell'ultima epoca -- Firma +- Slot - Lo slot in cui ha avuto luogo l'attestazione +- Indice del comitato (Committee index) - L'indice del comitato nello slot specificato +- Bit di aggregazione (Aggregation bits) - Rappresenta l'attestazione aggregata di tutti i validatori partecipanti all'attestazione +- Validatori (Validators) - I validatori che hanno fornito attestazioni +- Radice del blocco beacon (Beacon block root) - Punta al blocco a cui i validatori stanno attestando +- Origine (Source) - Punta all'ultima epoca giustificata +- Destinazione (Target) - Punta all'ultimo confine dell'epoca +- Firma (Signature) ### Rete {#network-1} -I dati di livello superiore del livello di consenso includono quanto segue: - -- Epoca attuale -- Slot attuale -- Validatori attivi - Numero di validatori attivi -- Validatori in sospeso - Numero di validatori in attesa di essere resi attivi -- ETH in staking - Importo di ETH in staking nella rete -- Saldo medio - Saldo medio di ETH dei validatori - -## Block explorer {#block-explorers} +I dati di primo livello del livello di consenso includono quanto segue: -- [Etherscan](https://etherscan.io/) - un esploratore di blocchi che puoi usare per recuperare i dati per la Rete Principale di Ethereum e la rete di prova Sepolia -- [3xpl](https://3xpl.com/ethereum) - un esploratore di Ethereum open source e privo di inserzioni che consente di scaricare i propri dataset -- [Beaconcha.in](https://beaconcha.in/) - un esploratore di blocchi open source per la Rete Principale di Ethereum e la rete di prova di Sepolia -- [Blockchair](https://blockchair.com/ethereum): l'esploratore di Ethereum più privato. Anche per ordinare e filtrare i dati (mempool) -- [Etherchain](https://www.etherchain.org/) - un esploratore di blocchi per la rete principale di Ethereum -- [Ethplorer](https://ethplorer.io/) - un esploratore di blocchi incentrato sui token per la Rete Principale di Ethereum e la rete di prova di Sepolia -- [Rantom](https://rantom.app/): Un visualizzatore di transazioni NFT e DeFi open source e intuitivo per gli utenti, per una visione dettagliata -- [Ethernow](https://www.ethernow.xyz/): un esploratore in tempo reale delle transazioni che ti consente di visualizzare il livello pre-catena della Rete Principale di Ethereum -- [Otterscan](https://otterscan.io/) - un esploratore di blocchi open source alternativo per Ethereum +- Epoca attuale (Current epoch) +- Slot attuale (Current slot) +- Validatori attivi (Active validators) - Numero di validatori attivi +- Validatori in attesa (Pending validators) - Numero di validatori in attesa di essere resi attivi +- ETH in stake (Staked ETH) - Quantità di ETH in stake nella rete +- Saldo medio (Average balance) - Saldo medio in ETH dei validatori -## Approfondimenti {#further-reading} +## Letture consigliate {#further-reading} -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} - [Transazioni](/developers/docs/transactions/) -- [Conti](/developers/docs/accounts/) -- [Reti](/developers/docs/networks/) +- [Account](/developers/docs/accounts/) +- [Reti](/developers/docs/networks/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-and-analytics/index.md b/public/content/translations/it/developers/docs/data-and-analytics/index.md index 326c2658b65..0e54da512af 100644 --- a/public/content/translations/it/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/it/developers/docs/data-and-analytics/index.md @@ -1,55 +1,82 @@ --- title: Dati e analisi -description: Come ottenere analisi e dati sulla catena da utilizzare nelle dapp +description: Come ottenere analisi e dati on-chain da utilizzare nelle tue dApp lang: it --- ## Introduzione {#Introduction} -Mentre l'utilizzo della rete continua a crescere, una quantità crescente di informazioni preziose esisterà nei dati on-chain. Al rapido aumentare del volume di dati, il calcolo e l'aggregazione di queste informazioni a scopo di segnalazione o per guidare una dapp possono richiedere notevoli sforzi in termini di tempo e processi. +Poiché l'utilizzo della rete continua a crescere, una quantità sempre maggiore di informazioni preziose sarà presente nei dati on-chain. Con il rapido aumento del volume dei dati, calcolare e aggregare queste informazioni per creare report o gestire una dApp può diventare un'attività dispendiosa in termini di tempo e processi. -Sfruttare i fornitori di dati esistenti può accelerare lo sviluppo, produrre risultati più precisi e ridurre gli sforzi di manutenzione in corso. Ciò permetterà al team di concentrarsi sulla funzionalità principale che il loro progetto si prefigge di fornire. +Sfruttare i fornitori di dati esistenti può accelerare lo sviluppo, produrre risultati più accurati e ridurre gli sforzi di manutenzione continua. Ciò consentirà a un team di concentrarsi sulle funzionalità principali che il proprio progetto sta cercando di offrire. ## Prerequisiti {#prerequisites} -Occorre comprendere il concetto base di [Block Explorers](/developers/docs/data-and-analytics/block-explorers/) per capire meglio come usarli nell'ambito dell'analisi dei dati. Inoltre, è bene familiarizzare con il concetto di [indice](/glossary/#index) per comprendere i vantaggi che offrono per un design di sistema. +Dovresti comprendere il concetto di base degli [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers/) per capire meglio come utilizzarli nel contesto dell'analisi dei dati. Inoltre, familiarizza con il concetto di [indice](/glossary/#index) per comprendere i vantaggi che aggiungono alla progettazione di un sistema. -In termini di fondamenti architettonici, occorre comprendere che cosa sono le [API](https://www.wikipedia.org/wiki/API) e [REST](https://www.wikipedia.org/wiki/Representational_state_transfer), anche a livello teorico. +In termini di fondamenti architettonici, è utile capire cosa siano un'[API](https://www.wikipedia.org/wiki/API) e [REST](https://www.wikipedia.org/wiki/Representational_state_transfer), anche solo a livello teorico. -## Esploratori dei blocchi {#block-explorers} +## Esploratori di blocchi {#block-explorers} -Molti [Esploratori di Blocchi](/developers/docs/data-and-analytics/block-explorers/) offrono gateway dell'[API](https://www.wikipedia.org/wiki/API) di [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer), che forniranno visibilità agli sviluppatori in dati in tempo reale sui blocchi, le transazioni, i validatori, i conti e altre attività on-chain. +Molti [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers/) offrono gateway [API](https://www.wikipedia.org/wiki/API) [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) che forniranno agli sviluppatori visibilità sui dati in tempo reale relativi a blocchi, transazioni, validatori, account e altre attività on-chain. -Gli sviluppatori possono quindi elaborare e trasformare questi dati per fornire agli utenti informazioni e interazioni uniche con la [blockchain](/glossary/#blockchain). Ad esempio, [Etherscan](https://etherscan.io) fornisce i dati d'esecuzione e consenso per ogni slot di 12 secondi. +Gli sviluppatori possono quindi elaborare e trasformare questi dati per offrire ai propri utenti approfondimenti e interazioni uniche con la [blockchain](/glossary/#blockchain). Ad esempio, [Etherscan](https://etherscan.io) e [Blockscout](https://eth.blockscout.com) forniscono dati di esecuzione e consenso per ogni slot di 12 secondi. ## The Graph {#the-graph} -La [rete Graph](https://thegraph.com/) è un protocollo di indicizzazione decentralizzato per l'organizzazione dei dati della blockchain. Invece di costruire e gestire archivi di dati off-chain e centralizzati per aggregare dati on-chain, con The Graph gli sviluppatori possono creare applicazioni senza server che vengono eseguite interamente su infrastrutture pubbliche. +[The Graph](https://thegraph.com/) è un protocollo di indicizzazione che fornisce un modo semplice per interrogare i dati della blockchain tramite API aperte note come sottografi (subgraph). -Usando [GraphQL](https://graphql.org/), gli sviluppatori possono interrogare una qualsiasi delle API aperte curate, note come grafici secondari, per acquisire le informazioni necessarie a guidare la propria dapp. Interrogando questi grafici secondari indicizzati, i Rapporti e le dapp non solo ricevono benefici di prestazioni e scalabilità, ma anche l'accuratezza integrata, fornita dal consenso della rete. Con l'aggiunta di nuovi miglioramenti e/o sotto-grafici alla rete, i vostri progetti possono iterare rapidamente per sfruttare questi miglioramenti. +Con The Graph, gli sviluppatori possono beneficiare di: -## Diversità dei client +- Indicizzazione decentralizzata: consente di indicizzare i dati della blockchain tramite più indicizzatori, eliminando così qualsiasi singolo punto di guasto. +- Query GraphQL: fornisce una potente interfaccia GraphQL per interrogare i dati indicizzati, rendendo il recupero dei dati estremamente semplice. +- Personalizzazione: definisci la tua logica per trasformare e archiviare i dati della blockchain e riutilizza i sottografi pubblicati da altri sviluppatori su The Graph Network. -La [diversità dei client](/developers/docs/nodes-and-clients/client-diversity/) è importante per la salute complessiva della rete di Ethereum, poiché fornisce resilienza a bug ed exploit. Attualmente esistono vari pannelli di controllo della diversità del client, tra cui [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) ed [Ethernodes](https://ethernodes.org/). +Segui questa [guida rapida](https://thegraph.com/docs/en/quick-start/) per creare, distribuire e interrogare un sottografo in 5 minuti. + +## Diversità dei client {#client-diversity} + +La [diversità dei client](/developers/docs/nodes-and-clients/client-diversity/) è importante per la salute generale della rete Ethereum perché fornisce resilienza a bug ed exploit. Esistono ora diverse dashboard per la diversità dei client, tra cui [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) ed [Ethernodes](https://ethernodes.org/). ## Dune Analytics {#dune-analytics} -[Dune Analytics](https://dune.com/) pre-elabora i dati della blockchain nelle tabelle del database relazionale (DuneSQL), consente agli utenti di richiedere i dati della blockchain utilizzando SQL e crea pannelli di controllo basati sui risultati della richiesta. I dati sulla catena sono organizzati in 4 tabelle grezze: `blocks`, `transactions`, `logs` (di eventi) e `traces` (di chiamate). I contratti e protocolli popolari sono stati decodificati e ognuno ha la propria serie di tabelle di eventi e chiamate. Queste tabelle di eventi e chiamate sono ulteriormente elaborate e organizzate in tabelle di astrazione secondo il tipo di protocolli, ad esempio dex, lending, stablecoins, ecc. +[Dune Analytics](https://dune.com/) pre-elabora i dati della blockchain in tabelle di database relazionali (DuneSQL), consente agli utenti di interrogare i dati della blockchain utilizzando SQL e di creare dashboard basate sui risultati delle query. I dati on-chain sono organizzati in 4 tabelle grezze: `blocks`, `transactions`, `logs` (di eventi) e `traces` (di chiamate). I contratti e i protocolli più popolari sono stati decodificati e ognuno ha il proprio set di tabelle di eventi e chiamate. Queste tabelle di eventi e chiamate vengono ulteriormente elaborate e organizzate in tabelle di astrazione in base al tipo di protocollo, ad esempio dex, prestiti, stablecoin, ecc. + +## SQD {#sqd} + +[SQD](https://sqd.dev/) è una piattaforma di dati iper-scalabile e decentralizzata, ottimizzata per fornire un accesso efficiente e senza permessi a grandi volumi di dati. Attualmente fornisce dati on-chain storici, inclusi registri degli eventi, ricevute delle transazioni, tracce e differenze di stato per transazione. SQD offre un potente kit di strumenti per creare pipeline personalizzate di estrazione ed elaborazione dei dati, raggiungendo una velocità di indicizzazione fino a 150.000 blocchi al secondo. + +Per iniziare, visita la [documentazione](https://docs.sqd.dev/) o guarda gli [esempi EVM](https://github.com/subsquid-labs/squid-evm-examples) di ciò che puoi costruire con SQD. + +## SubQuery Network {#subquery-network} -## Rete di SubQuery {#subquery-network} +[SubQuery](https://subquery.network/) è un indicizzatore di dati leader che offre agli sviluppatori API veloci, affidabili, decentralizzate e personalizzate per i loro progetti web3. SubQuery fornisce agli sviluppatori di oltre 165 ecosistemi (incluso Ethereum) ricchi dati indicizzati per creare esperienze intuitive e coinvolgenti per i loro utenti. La rete SubQuery alimenta le tue app inarrestabili con una rete infrastrutturale resiliente e decentralizzata. Usa il kit di strumenti per sviluppatori blockchain di SubQuery per creare le applicazioni web3 del futuro, senza perdere tempo a costruire un backend personalizzato per le attività di elaborazione dei dati. -[SubQuery](https://subquery.network/) è un indicizzatore di dati leader del settore, che fornisce agli sviluppatori API veloci, affidabili, decentralizzate e personalizzate per i loro progetti in Web3. SubQuery emancipa gli sviluppatori da oltre 165 ecosistemi (incluso Ethereum) con dati indicizzati ricchi, per creare esperienze intuitive e immersive per i propri utenti. La Rete di SubQuery alimenta le tue inarrestabili app con una rete resiliente e un'infrastruttura decentralizzata. Utilizza gli strumenti per sviluppatori di blockchain di SubQuery per creare le applicazioni Web3 del futuro, senza dover dedicare tempo a sviluppare un backend personalizzato per le attività di elaborazione dei dati. +Per iniziare, visita la [guida rapida di Ethereum](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) per iniziare a indicizzare i dati della blockchain di Ethereum in pochi minuti in un ambiente Docker locale per i test, prima di passare alla produzione su un [servizio gestito di SubQuery](https://managedservice.subquery.network/) o sulla [rete decentralizzata di SubQuery](https://app.subquery.network/dashboard). -Per iniziare, visita la [guida rapida per principianti di Ethereum](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) per iniziare a indicizzare i dati della blockchain di Ethereum in pochi minuti in un ambiente locale di Docker per i test prima di distribuire il tuo progetto su un [servizio gestito da SubQuery](https://managedservice.subquery.network/) o su una [rete decentralizzata di SubQuery](https://app.subquery.network/dashboard). +## Codex {#codex} -## Ethernow - Programma dei dati del Mempool {#ethernow} -[Blocknative](https://www.blocknative.com/) fornisce l'accesso aperto al suo [archivio dei dati del mempool](https://www.ethernow.xyz/mempool-data-archive) storico di Ethereum. Questo consente ai ricercatori e ai progetti della community di esplorare il livello pre-catena della Rete Principale di Ethereum. La serie di dati è mantenuta attivamente e rappresenta il registro storico più completo degli eventi di transazione del mempool nell'ecosistema di Ethereum. Maggiori informazioni su [Ethernow](https://www.ethernow.xyz/). +[Codex](https://www.codex.io/) è un'API di dati blockchain in tempo reale che fornisce dati arricchiti per oltre 70 milioni di token su più di 80 reti. Gli sviluppatori possono accedere a prezzi strutturati dei token, saldi dei portafogli, cronologia delle transazioni e analisi aggregate (volume, liquidità, portafogli unici) senza dover mantenere un'infrastruttura di indicizzazione personalizzata. Codex supporta la consegna dei dati in frazioni di secondo tramite integrazioni WebSocket e webhook. + +Per iniziare, visita la [documentazione](https://docs.codex.io), prova l'[Explorer](https://docs.codex.io/explore) o registrati sulla [dashboard](https://dashboard.codex.io/signup). + +## EVM Query Language {#evm-query-language} + +EVM Query Language (EQL) è un linguaggio simile a SQL progettato per interrogare le catene EVM (macchina virtuale di Ethereum). L'obiettivo finale di EQL è supportare query relazionali complesse sugli elementi di prima classe della catena EVM (blocchi, account e transazioni) fornendo al contempo a sviluppatori e ricercatori una sintassi ergonomica per l'uso quotidiano. Con EQL, gli sviluppatori possono recuperare i dati della blockchain utilizzando una sintassi familiare simile a SQL ed eliminare la necessità di codice boilerplate complesso. EQL supporta le richieste standard di dati della blockchain (ad es. il recupero del nonce e del saldo di un account su Ethereum o il recupero della dimensione e del timestamp del blocco corrente) e aggiunge continuamente supporto per richieste e set di funzionalità più complessi. ## Letture consigliate {#further-reading} -- [Panoramica della rete Graph](https://thegraph.com/docs/en/about/) -- [GraphQL Playground](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) +- [Esplorazione dei dati crypto I: Architetture del flusso di dati](https://web.archive.org/web/20250125012042/https://research.2077.xyz/exploring-crypto-data-1-data-flow-architectures) +- [Panoramica di Graph Network](https://thegraph.com/docs/en/about/) +- [Playground per le query di Graph](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) - [Esempi di codice API su EtherScan](https://etherscan.io/apis#contracts) -- [Esploratore della Beacon Chain di Beaconcha.in](https://beaconcha.in) -- [Fondamenti di Dune](https://docs.dune.com/#dune-basics) -- [Guida iniziale rapida di Ethereum su SubQuery](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [Documentazione API su Blockscout](https://docs.blockscout.com/devs/apis) +- [Esploratore della beacon chain Beaconcha.in](https://beaconcha.in) +- [Basi di Dune](https://docs.dune.com/#dune-basics) +- [Guida rapida a Ethereum di SubQuery](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [Panoramica della rete SQD](https://docs.sqd.dev/) +- [EVM Query Language](https://eql.sh/blog/alpha-release-notes) + +## Tutorial: Dati e analisi / SQL su Ethereum {#tutorials} + +- [Impara gli argomenti fondamentali di Ethereum con SQL](/developers/tutorials/learn-foundational-ethereum-topics-with-sql/) _– Interroga i dati on-chain di Ethereum con SQL per comprendere i fondamenti di transazioni, blocchi e gas._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-availability/blockchain-data-storage-strategies/index.md b/public/content/translations/it/developers/docs/data-availability/blockchain-data-storage-strategies/index.md index 99477d53e7c..3db06b344c8 100644 --- a/public/content/translations/it/developers/docs/data-availability/blockchain-data-storage-strategies/index.md +++ b/public/content/translations/it/developers/docs/data-availability/blockchain-data-storage-strategies/index.md @@ -1,57 +1,57 @@ --- title: Strategie di archiviazione dei dati della blockchain -description: Esistono diversi modi per archiviare i dati utilizzando la blockchain. Questo articolo confronta le varie strategie, i loro costi e compromessi oltre ai requisiti per utilizzarle in maniera sicura. +description: "Esistono diversi modi per archiviare i dati utilizzando la blockchain. Questo articolo confronterà le diverse strategie, i loro costi e compromessi, nonché i requisiti per utilizzarle in modo sicuro." lang: it --- -Esistono diversi modi per archiviare le informazioni, sia direttamente sulla blockchain che in modo che siano protette dalla blockchain: +Esistono diversi modi per archiviare le informazioni direttamente sulla blockchain, o in un modo che sia protetto dalla blockchain: -- Blob di EIP-4844 +- Blob EIP-4844 - Calldata -- Offchain con meccanismi del L1 +- Fuori catena con meccanismi di L1 - "Codice" del contratto - Eventi -- Archivio EVM +- Archiviazione dell'EVM -La scelta del metodo da utilizzare si basa su vari criteri: +La scelta del metodo da utilizzare si basa su diversi criteri: -- La fonte delle informazioni. Le informazioni in calldata non possono arrivare direttamente dalla blockchain stessa. -- La destinazione delle informazioni. Calldata è disponibile solo nelle transazioni che ha avviato. Gli eventi non sono affatto accessibili onchain. -- Che livello di seccatura è accettabile? I computer che eseguono nodi completi possono eseguire più elaborazioni dei client leggeri in un'applicazione eseguita nel browser. -- È necessario favorire un facile accesso alle informazioni da ogni nodo? +- La fonte delle informazioni. Le informazioni nei calldata non possono provenire direttamente dalla blockchain stessa. +- La destinazione delle informazioni. I calldata sono disponibili solo nella transazione che li include. Gli eventi non sono affatto accessibili on-chain. +- Quanta complessità è accettabile? I computer che eseguono un nodo completo possono eseguire più elaborazioni rispetto a un client leggero in un'applicazione in esecuzione in un browser. +- È necessario facilitare un facile accesso alle informazioni da ogni nodo? - I requisiti di sicurezza. ## I requisiti di sicurezza {#security-requirements} -In generale la sicurezza delle informazioni consiste in tre attributi: +In generale, la sicurezza delle informazioni è costituita da tre attributi: -- _Riservatezza_, alle entità non autorizzate non è permesso leggere le informazioni. Questo è importante in molti casi, ma non qui. _Non ci sono segreti sulla blockchain_. Le blockchain funzionano perché chiunque può verificare lo stato delle transazioni, quindi è impossibile utilizzarle per conservare segreti direttamente. Ci sono vari modi per conservare informazioni riservate sulla blockchain, ma fanno tutti affidamento su delle componenti offchain per conservare almeno una chiave. +- _Riservatezza_, alle entità non autorizzate non è consentito leggere le informazioni. Questo è importante in molti casi, ma non qui. _Non ci sono segreti sulla blockchain_. Le blockchain funzionano perché chiunque può verificare le transizioni di stato, quindi è impossibile utilizzarle per archiviare segreti direttamente. Esistono modi per archiviare informazioni riservate sulla blockchain, ma si basano tutti su qualche componente fuori catena per archiviare almeno una chiave. -- _Integrità_, l'informazione è corretta, non può essere modificata da entità non autorizzate o in modalità non autorizzate (ad esempio, trasferendo [token ERC-20](https://eips.ethereum.org/EIPS/eip-20#events) senza un evento `Transfer`). Sulla blockchain ogni nodo verifica ogni modifica di stato, e ciò ne assicura l'integrità. +- _Integrità_, le informazioni sono corrette, non possono essere modificate da entità non autorizzate o in modi non autorizzati (ad esempio, trasferendo [token ERC-20](https://eips.ethereum.org/EIPS/eip-20#events) senza un evento `Transfer`). Sulla blockchain, ogni nodo verifica ogni cambiamento di stato, il che garantisce l'integrità. -- _Disponibilità_, le informazioni sono disponibili per ogni entità autorizzata. Sulla blockchain questo di solito è possibile mantenendo le informazioni disponibili in ogni [nodo completo](https://ethereum.org/developers/docs/nodes-and-clients/#full-node). +- _Disponibilità_, le informazioni sono disponibili per qualsiasi entità autorizzata. Sulla blockchain, questo si ottiene solitamente rendendo le informazioni disponibili su ogni [nodo completo](https://ethereum.org/developers/docs/nodes-and-clients/#full-node). -Le varie soluzioni qui presentate hanno tutte un'integrità eccellente perché gli hash sono pubblicati sul L1. Tuttavia, hanno diverse garanzie di disponibilità. +Le diverse soluzioni qui presentate hanno tutte un'eccellente integrità, perché gli hash vengono pubblicati su L1. Tuttavia, hanno diverse garanzie di disponibilità. ## Prerequisiti {#prerequisites} -Dovresti avere una buona conoscenza dei [fondamenti della blockchain](/developers/docs/intro-to-ethereum/). Questa pagina presuppone che il lettore abbia familiarità con i [blocchi](/developers/docs/blocks/), le [transazioni](/developers/docs/transactions/) e altri argomenti rilevanti. +Dovresti avere una buona comprensione dei [fondamenti della blockchain](/developers/docs/intro-to-ethereum/). Questa pagina presuppone inoltre che il lettore abbia familiarità con i [blocchi](/developers/docs/blocks/), le [transazioni](/developers/docs/transactions/) e altri argomenti pertinenti. -## Blob di EIP-4844 {#eip-4844-blobs} +## Blob EIP-4844 {#eip-4844-blobs} -A partire dalla [biforcazione Dencun](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/beacon-chain.md) la blockchain di Ethereum include [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), che si aggiunge ai blob di dati di Ethereum con una vita limitata (inizialmente circa [18 giorni](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration)). Questi blob sono stimati separatamente dal [gas di esecuzione](/developers/docs/gas), sebbene utilizzino un meccanismo simile. Sono un modo economico per pubblicare dati temporanei. +A partire dalla [biforcazione hard Dencun](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/beacon-chain.md), la blockchain di Ethereum include l'[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), che aggiunge a Ethereum blob di dati con una durata limitata (inizialmente circa [18 giorni](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration)). Questi blob hanno un prezzo separato dal [gas di esecuzione](/developers/docs/gas), sebbene utilizzino un meccanismo simile. Sono un modo economico per pubblicare dati temporanei. -Il caso d'uso principale per i blob EIP-4844 riguarda la pubblicazione delle transazioni da parte dei rollup. [I rollup ottimistici](/developers/docs/scaling/optimistic-rollups) hanno bisogno di pubblicare le transazioni sulle proprie blockchain. Queste transazioni devono essere disponibili per chiunque durante il [periodo di contestazione](https://docs.optimism.io/connect/resources/glossary#challenge-period) per permettere ai [validatori](https://docs.optimism.io/connect/resources/glossary#validator) di aggiustare eventuali errori se i [sequenziatori](https://docs.optimism.io/connect/resources/glossary#sequencer) dei rollup pubblicano una radice di stato errata. +Il caso d'uso principale per i blob EIP-4844 è per i rollup per pubblicare le loro transazioni. I [rollup ottimistici](/developers/docs/scaling/optimistic-rollups) devono pubblicare le transazioni sulle loro blockchain. Tali transazioni devono essere disponibili a chiunque durante il [periodo di sfida](https://docs.optimism.io/connect/resources/glossary#challenge-period) per consentire ai [validatori](https://docs.optimism.io/connect/resources/glossary#validator) di correggere l'errore se il [sequenziatore](https://docs.optimism.io/connect/resources/glossary#sequencer) del rollup pubblica una radice di stato errata. -A ogni modo, una volta che il periodo di contestazione è passato e la radice di stato è finalizzata, lo scopo rimanente per conoscere queste transazioni è di replicare lo stato corrente della catena. Questo stato è disponibile anche dai nodi della catena, il che richiede uno sforzo di elaborazione molto inferiore. Quindi le informazioni sulla transazione dovrebbero essere comunque conservate in alcuni posti, come ad esempio gli [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers), ma non c'è bisogno di pagare il livello di resistenza alla censura fornito da Ethereum. +Tuttavia, una volta trascorso il periodo di sfida e finalizzata la radice di stato, lo scopo rimanente per conoscere queste transazioni è replicare lo stato attuale della catena. Questo stato è disponibile anche dai nodi della catena, richiedendo molta meno elaborazione. Pertanto, le informazioni sulle transazioni dovrebbero comunque essere conservate in alcuni luoghi, come gli [esploratori di blocchi](/developers/docs/data-and-analytics/block-explorers), ma non c'è bisogno di pagare per il livello di resistenza alla censura fornito da Ethereum. -Anche i [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/#data-availability) pubblicano i dati delle transazioni in modo da permettere ad altri nodi di replicare lo stato esistente e verificare le prove di validità, ma anche in questo caso si tratta di un requisito a breve termine. +Anche i [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/#data-availability) pubblicano i dati delle loro transazioni per consentire ad altri nodi di replicare lo stato esistente e verificare le prove di validità, ma ancora una volta si tratta di un requisito a breve termine. -Al momento, pubblicare su EIP-4844 costa un wei (10-18 ETH) per byte, il che è trascurabile rispetto alle [21.000 unità di gas di esecuzione che costa ogni transazione, incluse quelle che pubblicano blob](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index). Puoi vedere il prezzo attuale di EIP-4844 su [blobscan.com](https://blobscan.com/blocks). +Al momento della stesura, la pubblicazione su EIP-4844 costa un wei (10-18 ETH) per byte, che è trascurabile rispetto ai [21.000 gas di esecuzione che costa qualsiasi transazione, inclusa una che pubblica blob](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index). Puoi vedere il prezzo attuale dell'EIP-4844 su [blobscan.com](https://blobscan.com/blocks). -Ecco gli indirizzi per vedere i blob pubblicati da alcuni rollup famosi. +Ecco gli indirizzi per vedere i blob pubblicati da alcuni famosi rollup. -| Rollup | Indirizzo di posta | +| Rollup | Indirizzo della casella di posta | | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | | [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) | | [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | @@ -59,60 +59,60 @@ Ecco gli indirizzi per vedere i blob pubblicati da alcuni rollup famosi. ## Calldata {#calldata} -Calldata si riferisce ai byte inviati come parte della transazione. È archiviato nel registro permanente della blockchain nel blocco che include quella transazione. +I calldata si riferiscono ai byte inviati come parte della transazione. Vengono archiviati come parte del registro permanente della blockchain nel blocco che include tale transazione. -Questo è il metodo più economico per mettere dati permanentemente nella blockchain. Il costo per byte è di 4 unità di gas di esecuzione (se il byte è zero) o 16 unità di gas (per ogni altro valore). Se i dati sono compressi, il che è una pratica standard, allora ogni valore di byte è ugualmente probabile, quindi il costo medio è di circa 15,95 unità di gas per byte. +Questo è il metodo più economico per inserire permanentemente i dati nella blockchain. Il costo per byte è di 4 gas di esecuzione (se il byte è zero) o 16 gas (qualsiasi altro valore). Se i dati sono compressi, il che è una pratica standard, allora ogni valore di byte è ugualmente probabile, quindi il costo medio è di circa 15,95 gas per byte. -Al momento i prezzi sono di 12 gwei/gas e 2300 $/ETH, il che significa che il costo è circa di 45 cent al kilobyte. Siccome questo era il metodo più economico prima di EIP-4844, questo è anche il metodo che i rollup utilizzavano per archiviare le informazioni sulle transazioni, che devono essere disponibili per le [contestazioni di errori](https://docs.optimism.io/stack/protocol/overview#fault-proofs), ma non devono necessariamente essere accessibili direttamente onchain. +Al momento della stesura, i prezzi sono 12 gwei/gas e 2300 $/ETH, il che significa che il costo è di circa 45 centesimi per kilobyte. Poiché questo era il metodo più economico prima dell'EIP-4844, questo è il metodo utilizzato dai rollup per archiviare le informazioni sulle transazioni, che devono essere disponibili per le [sfide di errore](https://docs.optimism.io/stack/protocol/overview#fault-proofs), ma non devono essere accessibili direttamente on-chain. -Ecco gli indirizzi per vedere le transazioni pubblicate da alcuni rollup famosi. +Ecco gli indirizzi per vedere le transazioni pubblicate da alcuni famosi rollup. -| Rollup | Indirizzo di posta | +| Rollup | Indirizzo della casella di posta | | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | | [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) | | [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | | [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) | -## Offchain con meccanismi del L1 {#offchain-with-l1-mechs} +## Fuori catena con meccanismi di L1 {#offchain-with-l1-mechs} -A seconda dei propri compromessi per la sicurezza, potrebbe essere accettabile mettere le informazioni altrove e utilizzare un meccanismo che garantisca che i dati siano disponibili quando ce n'è bisogno. Ci sono due requisiti affinché questo funzioni: +A seconda dei tuoi compromessi in materia di sicurezza, potrebbe essere accettabile inserire le informazioni altrove e utilizzare un meccanismo che garantisca che i dati siano disponibili quando necessario. Ci sono due requisiti affinché questo funzioni: -1. Pubblicare un [hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) dei dati sulla blockchain, chiamato _input commitment_. Questo può essere una singola parola di 32 byte, quindi non è costoso. Fintanto che l'impegno di input è disponibile l'integrità è assicurata, perché non è possibile trovare nessun altro dato che abbia un hash sullo stesso valore. Quindi se i dati forniti sono errati, è possibile rilevarlo. +1. Pubblicare un [hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) dei dati sulla blockchain, chiamato _impegno di input_. Questa può essere una singola parola di 32 byte, quindi non è costosa. Finché l'impegno di input è disponibile, l'integrità è assicurata perché non è fattibile trovare altri dati che produrrebbero lo stesso valore di hash. Quindi, se vengono forniti dati errati, possono essere rilevati. -2. Avere un meccanismo che garantisca la disponibilità. Per esempio, in [Redstone](https://redstone.xyz/docs/what-is-redstone) qualsiasi nodo può inviare una contestazione di disponibilità. Se il sequenziatore non risponde onchain entro la scadenza, l'impegno di input è scartato, quindi l'informazione è considerata come se non fosse mai stata pubblicata. +2. Avere un meccanismo che garantisca la disponibilità. Ad esempio, in [Redstone](https://redstone.xyz/docs/what-is-redstone) qualsiasi nodo può inviare una sfida di disponibilità. Se il sequenziatore non risponde on-chain entro la scadenza, l'impegno di input viene scartato, quindi le informazioni sono considerate come mai pubblicate. -Questo è accettabile per un rollup ottimistico perché facciamo già affidamento sul fatto di avere almeno un verificatore onesto della radice di stato. Questo verificatore onesto si assicurerà anche di avere dati per elaborare il blocco, ed emettere una contestazione di disponibilità se le informazioni non sono disponibili offchain. Questo tipo di rollup ottimistico è chiamato [plasma](/developers/docs/scaling/plasma/). +Questo è accettabile per un rollup ottimistico perché ci stiamo già affidando ad avere almeno un verificatore onesto per la radice di stato. Tale verificatore onesto si assicurerà anche di avere i dati per elaborare i blocchi e lancerà una sfida di disponibilità se le informazioni non sono disponibili fuori catena. Questo tipo di rollup ottimistico è chiamato [plasma](/developers/docs/scaling/plasma/). ## Codice del contratto {#contract-code} -Le informazioni che devono essere scritte solo una volta, che non vengono mai sovrascritte e che devono essere disponibili onchain, possono essere archiviate come codice del contratto. Questo significa che creiamo un "contratto intelligente" con i dati e poi utilizziamo [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) per leggere le informazioni. Il vantaggio è che copiare il codice è relativamente economico. +Le informazioni che devono essere scritte solo una volta, non vengono mai sovrascritte e devono essere disponibili on-chain possono essere archiviate come codice del contratto. Ciò significa che creiamo un "contratto intelligente" con i dati e poi utilizziamo [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) per leggere le informazioni. Il vantaggio è che copiare il codice è relativamente economico. -Oltre al costo di espansione della memoria, `EXTCODECOPY` costa 2600 unità di gas per il primo accesso a un contratto (quando è "freddo") e 100 unità di gas per le copie successive dallo stesso contratto più 3 unità gas per parola di 32 byte. Rispetto a calldata, che costa 15,95 al byte, questo risulta più economico a partire da circa 200 byte. In base alla [formula per i costi di espansione della memoria](https://www.evm.codes/about#memoryexpansion), a meno che non si abbia bisogno di più di 4MB di memoria, il costo di espansione della memoria è minore del costo per aggiungere calldata. +Oltre al costo dell'espansione della memoria, `EXTCODECOPY` costa 2600 gas per il primo accesso a un contratto (quando è "freddo") e 100 gas per le copie successive dallo stesso contratto più 3 gas per parola di 32 byte. Rispetto ai calldata, che costano 15,95 per byte, questo è più economico a partire da circa 200 byte. In base alla [formula per i costi di espansione della memoria](https://www.evm.codes/about#memoryexpansion), finché non hai bisogno di più di 4 MB di memoria, il costo di espansione della memoria è inferiore al costo dell'aggiunta di calldata. -Di certo questo è solo il costo per _leggere_ i dati. Creare il contratto costa circa 32.000 unità di gas + 200 unità di gas/byte. Questo metodo è economico solo quando le stesse informazioni devono essere lette molte volte in transazioni diverse. +Naturalmente, questo è solo il costo per _leggere_ i dati. Creare il contratto costa circa 32.000 gas + 200 gas/byte. Questo metodo è economico solo quando le stesse informazioni devono essere lette molte volte in diverse transazioni. -Il codice del contratto può essere senza senso fintanto che non inizia con `0xEF`. I contratti che iniziano con `0xEF` sono interpretati come [formato oggetto di ethereum](https://notes.ethereum.org/@ipsilon/evm-object-format-overview), che ha dei requisiti molto più restrittivi. +Il codice del contratto può essere privo di senso, purché non inizi con `0xEF`. I contratti che iniziano con `0xEF` vengono interpretati come [formato oggetto di ethereum](https://notes.ethereum.org/@ipsilon/evm-object-format-overview), che ha requisiti molto più severi. ## Eventi {#events} -Gli [eventi](https://docs.alchemy.com/docs/solidity-events) sono emessi da contratti intelligenti e letti da software offchain. -Il loro vantaggio è che il codice offchain può rimanere in ascolto per gli eventi. Il costo è [gas](https://www.evm.codes/#a0?fork=cancun), 375 più 8 unità di gas per byte di dati. A 12 gwei/gas e 2300 $/ETH, questo si traduce in un cent più 22 cent al kilobyte. +Gli [eventi](https://docs.alchemy.com/docs/solidity-events) vengono emessi dai contratti intelligenti e letti dal software fuori catena. +Il loro vantaggio è che il codice fuori catena può rimanere in ascolto degli eventi. Il costo è in [gas](https://www.evm.codes/#a0?fork=cancun), 375 più 8 gas per byte di dati. A 12 gwei/gas e 2300 $/ETH, questo si traduce in un centesimo più 22 centesimi per kilobyte. -## Archivio {#storage} +## Archiviazione {#storage} -I contratti intelligenti hanno accesso a un [archivio persistente](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory). Tuttavia è molto costoso. Scrivere una parola di 32 byte in uno slot di archiviazione precendentemente vuoto può [costare 22.100 unità di gas](https://www.evm.codes/#55?fork=cancun). A 12 gwei/gas e 2300 $/ETH, si tratta di circa 61 cent per operazione di scrittura, o $19,5 al kilobyte. +I contratti intelligenti hanno accesso all'[archiviazione persistente](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory). Tuttavia, è molto costosa. Scrivere una parola di 32 byte in uno slot di archiviazione precedentemente vuoto può [costare 22.100 gas](https://www.evm.codes/#55?fork=cancun). A 12 gwei/gas e 2300 $/ETH, si tratta di circa 61 centesimi per operazione di scrittura, o 19,5 $ per kilobyte. -Questa è la forma più costosa di archiviazione su Ethereum. +Questa è la forma di archiviazione più costosa in Ethereum. ## Riepilogo {#summary} Questa tabella riassume le diverse opzioni, i loro vantaggi e svantaggi. -| Tipo di archiviazione | Fonte dei dati | Garanzia di disponibilità | Disponibilità onchain | Ulteriori limitazioni | -| ------------------------------ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | -| Blob di EIP-4844 | Offchain | Garanzia di Ethereum per [~18 giorni](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration) | Solo l'hash è disponibile | | -| Calldata | Offchain | Garanzia di Ethereum per sempre (parte della blockchain) | Disponibile solo se scritto in un contratto, e a quella transazione | | -| Offchain con meccanismi del L1 | Offchain | Garanzia di "un verificatore onesto" durante il periodo di contestazione | Solo hash | Garantito dal meccanismo di contestazione, solo durante il periodo di contestazione | -| Codice del contratto | Onchain o offchain | Garanzia di Ethereum per sempre (parte della blockchain) | Sì | Scritto in un indirizzo "casuale", non può iniziare con `0xEF` | -| Eventi | Onchain | Garanzia di Ethereum per sempre (parte della blockchain) | No | | -| Storage | Onchain | Garanzia di Ethereum per sempre (parte della blockchain e lo stato corrente fino a quando è sovrascritto) | Sì | | +| Tipo di archiviazione | Fonte dei dati | Garanzia di disponibilità | Disponibilità on-chain | Limitazioni aggiuntive | +| --------------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------- | +| Blob EIP-4844 | Fuori catena | Garanzia di Ethereum per [\~18 giorni](https://github.com/ethereum/consensus-specs/blob/master/specs/deneb/p2p-interface.md#configuration) | È disponibile solo l'hash | | +| Calldata | Fuori catena | Garanzia di Ethereum per sempre (parte della blockchain) | Disponibile solo se scritto in un contratto e in quella transazione | +| Fuori catena con meccanismi di L1 | Fuori catena | Garanzia di "un verificatore onesto" durante il periodo di sfida | Solo hash | Garantito dal meccanismo di sfida, solo durante il periodo di sfida | +| Codice del contratto | On-chain o fuori catena | Garanzia di Ethereum per sempre (parte della blockchain) | Sì | Scritto a un indirizzo "casuale", non può iniziare con `0xEF` | +| Eventi | On-chain | Garanzia di Ethereum per sempre (parte della blockchain) | No | +| Archiviazione | On-chain | Garanzia di Ethereum per sempre (parte della blockchain e dello stato attuale fino a sovrascrittura) | Sì | \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-availability/index.md b/public/content/translations/it/developers/docs/data-availability/index.md index 7b1bb070581..a36141faf2d 100644 --- a/public/content/translations/it/developers/docs/data-availability/index.md +++ b/public/content/translations/it/developers/docs/data-availability/index.md @@ -1,84 +1,84 @@ --- -title: Disponibilità dei dati -description: Una panoramica dei problemi e delle soluzioni relative alla disponibilità dei dati in Ethereum +title: "Disponibilità dei dati" +description: "Una panoramica dei problemi e delle soluzioni relativi alla disponibilità dei dati su Ethereum" lang: it --- -"Non fidarti, verifica" è una massima comune su Ethereum. L'idea è che il tuo nodo possa verificare in modo indipendente che le informazioni che riceve siano corrette eseguendo tutte le transazioni nei blocchi che ricevono dai pari per assicurarsi che le modifiche proposte corrispondano precisamente a quelle calcolate indipendentemente dal nodo. Ciò significa che i nodi non devono fidarsi del fatto che i mittenti del blocco siano onesti. Ciò è impossibile se i dati sono mancanti. +"Non fidarti, verifica" è una massima comune in Ethereum. L'idea è che il tuo nodo possa verificare in modo indipendente che le informazioni che riceve siano corrette eseguendo tutte le transazioni nei blocchi che riceve dai peer per assicurarsi che le modifiche proposte corrispondano esattamente a quelle calcolate in modo indipendente dal nodo. Ciò significa che i nodi non devono fidarsi che i mittenti del blocco siano onesti. Questo non è possibile se mancano dei dati. -La **disponibilità dei dati** si riferisce alla sicurezza che un utente può avere del fatto che i dati necessari per verificare un blocco siano realmente disponibili a tutti i partecipanti alla rete. Per i nodi completi sul livello 1 di Ethereum è relativamente semplice; il nodo completo scarica una copia di tutti i dati in ogni blocco; i dati _devono_ essere disponibili per essere scaricati affinché ciò sia possibile. Un blocco con dati mancanti sarebbe scartato piuttosto che aggiunto alla blockchain. Questa è la "disponibilità dei dati sulla catena" ed è una caratteristica delle blockchain monolitiche. I nodi completi non possono essere indotti ad 'accettare le transazioni non valide poiché scaricano ed eseguono ogni transazione per conto proprio. Tuttavia, per le blockchain modulari, i rollup di livello 2 e i client leggeri, il panorama della disponibilità dei dati è più complesso e richiede procedure di verifica più sofisticate. +La **disponibilità dei dati** si riferisce alla sicurezza che un utente può avere che i dati necessari per verificare un blocco siano realmente disponibili per tutti i partecipanti alla rete. Per i nodi completi sul livello 1 di [Ethereum](/) questo è relativamente semplice; il nodo completo scarica una copia di tutti i dati in ogni blocco: i dati _devono_ essere disponibili affinché il download sia possibile. Un blocco con dati mancanti verrebbe scartato anziché essere aggiunto alla blockchain. Questa è la "disponibilità dei dati on-chain" ed è una caratteristica delle blockchain monolitiche. I nodi completi non possono essere ingannati per accettare transazioni non valide perché scaricano ed eseguono ogni transazione da soli. Tuttavia, per le blockchain modulari, i rollup di livello 2 e i client leggeri, il panorama della disponibilità dei dati è più complesso e richiede procedure di verifica più sofisticate. ## Prerequisiti {#prerequisites} -Dovresti avere una buona comprensione dei [fondamenti della blockchain](/developers/docs/intro-to-ethereum/), specialmente dei [meccanismi di consenso](/developers/docs/consensus-mechanisms/). Questa pagina presuppone anche che il lettore abbia familiarità con i [blocchi](/developers/docs/blocks/), le [transazioni](/developers/docs/transactions/), i [nodi](/developers/docs/nodes-and-clients/), le [soluzioni di ridimensionamento](/developers/docs/scaling/) e altri argomenti pertinenti. +Dovresti avere una buona comprensione dei [fondamenti della blockchain](/developers/docs/intro-to-ethereum/), specialmente dei [meccanismi di consenso](/developers/docs/consensus-mechanisms/). Questa pagina presuppone inoltre che il lettore abbia familiarità con i [blocchi](/developers/docs/blocks/), le [transazioni](/developers/docs/transactions/), i [nodi](/developers/docs/nodes-and-clients/), le [soluzioni di scalabilità](/developers/docs/scaling/) e altri argomenti pertinenti. ## Il problema della disponibilità dei dati {#the-data-availability-problem} -Il problema della disponibilità dei dati è la necessità di dimostrare all'intera rete che la forma riassunta di alcuni dati della transazione aggiunti alla blockchain rappresenta realmente una serie di transazioni valide, ma farlo senza richiedere a tutti i nodi di scaricare tutti i dati. I dati completi della transazione sono necessari per verificare i blocchi in modo indipendenti, ma richiedere a tutti i nodi di scaricare tutti i dati della transazione è un limite al ridimensionamento. Le soluzioni al problema della disponibilità dei dati mirano a fornire sufficienti garanzie che i dati completi della transazione siano stati resi disponibili per la verifica ai partecipanti alla rete che non scaricano e memorizzano i dati da soli. +Il problema della disponibilità dei dati è la necessità di dimostrare all'intera rete che la forma riassunta di alcuni dati di transazione che vengono aggiunti alla blockchain rappresenta realmente un insieme di transazioni valide, ma facendolo senza richiedere a tutti i nodi di scaricare tutti i dati. I dati completi della transazione sono necessari per verificare i blocchi in modo indipendente, ma richiedere a tutti i nodi di scaricare tutti i dati della transazione è un ostacolo alla scalabilità. Le soluzioni al problema della disponibilità dei dati mirano a fornire garanzie sufficienti che i dati completi della transazione siano stati resi disponibili per la verifica ai partecipanti alla rete che non scaricano e archiviano i dati per se stessi. -I [nodi leggeri](/developers/docs/nodes-and-clients/light-clients) e i [rollup di Livello 2](/developers/docs/scaling) sono esempi importanti di partecipanti alla rete che richiedono forti garanzie di disponibilità dei dati ma non possono scaricare ed elaborare da soli i dati delle transazioni. Evitare di scaricare i dati delle transazioni è ciò che rende i nodi leggeri e permette ai rollup di essere soluzioni di ridimensionamento efficaci. +I [client leggeri](/developers/docs/nodes-and-clients/light-clients) e i [rollup di livello 2](/developers/docs/scaling) sono esempi importanti di partecipanti alla rete che richiedono forti garanzie di disponibilità dei dati ma non possono scaricare ed elaborare i dati delle transazioni da soli. Evitare di scaricare i dati delle transazioni è ciò che rende leggeri i nodi leggeri e consente ai rollup di essere soluzioni di scalabilità efficaci. -La disponibilità dei dati è anche un problema critico per i futuri client Ethereum ["senza stato"](/roadmap/statelessness) che non hanno bisogno di scaricare e memorizzare i dati di stato per verificare i blocchi. I client senza stato devono ancora essere certi che i dati siano disponibili _da qualche parte_ e sono stati elaborati correttamente. +La disponibilità dei dati è anche una preoccupazione fondamentale per i futuri client Ethereum ["senza stato"](/roadmap/statelessness) che non hanno bisogno di scaricare e archiviare i dati di stato per verificare i blocchi. I client senza stato devono comunque avere la certezza che i dati siano disponibili _da qualche parte_ e che siano stati elaborati correttamente. -## Soluzioni di disponibilità dei dati {#data-availability-solutions} +## Soluzioni per la disponibilità dei dati {#data-availability-solutions} -### Campionamento della disponibilità dei dati (CDD) {#data-availability-sampling} +### Campionamento della disponibilità dei dati (DAS) {#data-availability-sampling} -Il Campionamento della disponibilità dei dati (DAS) è un modo per la rete di verificare la disponibilità dei dati senza gravare troppo sui singoli nodi. Ogni nodo (compresi i nodi non di staking) scarica un piccolo sottoinsieme selezionato in modo casuale dei dati totali. Scaricare con successo i campioni conferma con elevata certezza che tutti i dati sono disponibili. Ciò si basa sulla codifica di cancellazione dei dati, che espande un dato set di dati con informazioni ridondanti (il modo in cui ciò avviene è di adattare una funzione nota come _polinomiale_ sui dati e di valutare tale polinomiale in punti aggiuntivi). In questo modo è possibile recuperare i dati originali da quelli ridondanti, se necessario. Una conseguenza di questa creazione di dati è che se _qualsiasi_ dei dati originali non è disponibile, la _metà_ dei dati espansi sarà mancante! La quantità di campioni di dati scaricati da ciascun nodo può essere regolata in modo che sia _estremamente_ probabile che almeno uno dei frammenti di dati campionati da ciascun client sia mancante _se_ meno della metà dei dati è realmente disponibile. +Il campionamento della disponibilità dei dati (DAS, Data Availability Sampling) è un modo per la rete di verificare che i dati siano disponibili senza mettere troppa pressione su un singolo nodo. Ogni nodo (inclusi i nodi non di staking) scarica un piccolo sottoinsieme selezionato casualmente dei dati totali. Il download corretto dei campioni conferma con elevata sicurezza che tutti i dati sono disponibili. Questo si basa sulla codifica di cancellazione dei dati (erasure coding), che espande un determinato set di dati con informazioni ridondanti (il modo in cui viene fatto è adattare una funzione nota come _polinomio_ sui dati e valutare quel polinomio in punti aggiuntivi). Ciò consente di recuperare i dati originali dai dati ridondanti quando necessario. Una conseguenza di questa creazione di dati è che se _qualsiasi_ dei dati originali non è disponibile, mancherà _metà_ dei dati espansi! La quantità di campioni di dati scaricati da ciascun nodo può essere regolata in modo che sia _estremamente_ probabile che manchi almeno uno dei frammenti di dati campionati da ciascun client _se_ meno della metà dei dati è realmente disponibile. -Il DAS sarà utilizzato per assicurarsi che gli operatori di rollup rendano disponibili i dati della propria transazione in seguito all'implementazione del [Danksharding completo](/roadmap/danksharding/#what-is-danksharding). I nodi Ethereum campioneranno in modo casuale i dati delle transazioni forniti in blob utilizzando lo schema di ridondanza spiegato sopra per garantire che tutti i dati esistano. La stessa tecnica potrebbe essere utilizzata anche per garantire che i produttori di blocchi rendano disponibili tutti i loro dati ai client leggeri sicuri. Allo stesso modo, nell'ambito della [separazione propositore-costruttore](/roadmap/pbs), solo il costruttore di blocchi sarebbe tenuto a elaborare un intero blocco - gli altri validatori verificherebbero utilizzando il campionamento della disponibilità dei dati. +Il DAS verrà utilizzato per garantire che gli operatori dei rollup rendano disponibili i dati delle loro transazioni dopo l'implementazione del [Danksharding completo](/roadmap/danksharding/#what-is-danksharding). I nodi di Ethereum campioneranno casualmente i dati delle transazioni forniti nei blob utilizzando lo schema di ridondanza spiegato sopra per garantire che tutti i dati esistano. La stessa tecnica potrebbe anche essere impiegata per garantire che i produttori di blocchi rendano disponibili tutti i loro dati per proteggere i client leggeri. Allo stesso modo, con la [separazione tra proponente e costruttore](/roadmap/pbs), solo il costruttore del blocco sarebbe tenuto a elaborare un intero blocco: gli altri validatori verificherebbero utilizzando il campionamento della disponibilità dei dati. -### Commissioni di disponibilità dei dati {#data-availability-committees} +### Comitati per la disponibilità dei dati {#data-availability-committees} -Le commissioni di disponibilità dei dati (DAC) sono parti fidate che forniscono, o attestano, la disponibilità dei dati. Le DAC sono utilizzabili al posto di [o in combinazione delle](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) DAS. Le garanzie fornite dalle commissioni in termini di sicurezza dipendono dalla loro composizione specifica. Ethereum utilizza sottoinsiemi di validatori a campione per attestare la disponibilità di dati per i nodi leggeri, ad esempio. +I comitati per la disponibilità dei dati (DAC, Data Availability Committees) sono parti fidate che forniscono, o attestano, la disponibilità dei dati. I DAC possono essere utilizzati al posto di, [o in combinazione con](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) il DAS. Le garanzie di sicurezza che derivano dai comitati dipendono dalla configurazione specifica. Ethereum utilizza sottoinsiemi di validatori campionati casualmente per attestare la disponibilità dei dati per i nodi leggeri, ad esempio. -Le DAC sono utilizzate anche da alcuni Validium. La DAC è un insieme di nodi fidati che memorizzano copie di dati offline. La DAC è necessaria per rendere i dati disponibili in caso di controversia. I membri della DAC pubblicano anche attestazioni on-chain per dimostrare la reale disponibilità di tali dati. Alcuni Validium sostituiscono le DAC con un sistema di validatori di proof of stake (PoS). Qui chiunque può diventare un validatore e memorizzare dati off-chain. Tuttavia, devono fornire una "cauzione", depositata in un contratto intelligente. Nel caso di comportamenti malevoli, come nel caso in cui il validatore trattenga dati, la cauzione può essere decurtata. Le commissioni per la disponibilità dei dati di proof-of-stake sono molto più sicure delle normali DAC perché incentivano direttamente il comportamento onesto. +I DAC sono utilizzati anche da alcuni validium. Il DAC è un insieme fidato di nodi che archivia copie di dati offline. Il DAC è tenuto a rendere disponibili i dati in caso di controversia. I membri del DAC pubblicano anche attestazioni on-chain per dimostrare che i suddetti dati sono effettivamente disponibili. Alcuni validium sostituiscono i DAC con un sistema di validatori basato sulla prova di stake (PoS). Qui, chiunque può diventare un validatore e archiviare dati fuori catena. Tuttavia, devono fornire una "cauzione", che viene depositata in un contratto intelligente. In caso di comportamento dannoso, come il validatore che trattiene i dati, la cauzione può essere punita. I comitati per la disponibilità dei dati basati sulla prova di stake sono notevolmente più sicuri dei normali DAC perché incentivano direttamente un comportamento onesto. ## Disponibilità dei dati e nodi leggeri {#data-availability-and-light-nodes} -I [ nodi leggeri](/developers/docs/nodes-and-clients/light-clients) devono convalidare la correttezza delle intestazioni dei blocchi che ricevono senza scaricare i dati dei blocchi. Questa leggerezza ha un costo: l'impossibilità di verificare in modo indipendente le intestazioni dei blocchi ri-eseguendo le transazioni a livello locale come fanno i nodi completi. +I [client leggeri](/developers/docs/nodes-and-clients/light-clients) devono convalidare la correttezza delle intestazioni dei blocchi che ricevono senza scaricare i dati del blocco. Il costo di questa leggerezza è l'incapacità di verificare in modo indipendente le intestazioni dei blocchi rieseguendo le transazioni localmente nel modo in cui fanno i nodi completi. -I nodi leggeri di Ethereum si affidano a un insieme casuale di 512 validatori assegnati a una _commissione di sincronizzazione_. La commissione di sincronizzazione che agisce come una DAC che segnala ai client leggero che i dati nell'intestazione sono corretti utilizzando una firma crittografica. La commissione di sincronizzazione aggiorna quotidianamente i dati. Ogni intestazione del blocco avverte i nodi leggeri dei validatori che si prevede autorizzino il blocco _successivo_; in questo modo non saranno indotti a fidarsi di un gruppo malintenzionato che finge di essere la vera commissione di sincronizzazione. +I nodi leggeri di Ethereum si fidano di insiemi casuali di 512 validatori che sono stati assegnati a un _comitato di sincronizzazione_ (sync committee). Il comitato di sincronizzazione agisce come un DAC che segnala ai client leggeri che i dati nell'intestazione sono corretti utilizzando una firma digitale crittografica. Ogni giorno, il comitato di sincronizzazione si aggiorna. Ogni intestazione di blocco avvisa i nodi leggeri su quali validatori aspettarsi che firmino il blocco _successivo_, in modo che non possano essere ingannati a fidarsi di un gruppo dannoso che finge di essere il vero comitato di sincronizzazione. -Tuttavia, cosa succede se un utente malevolo _riuscisse _in qualche modo a passare l'intestazione del blocco malevola ai client leggeri e a convincerli che è stata autorizzata da una commissione di sincronizzazione onesta? In questo caso, l'utente malevolo potrebbe includere transazioni non valide e il client leggero le accetterebbe ciecamente, dato che non è in grado di controllare in modo indipendente tutte le modifiche di stato riassunte nell'intestazione del blocco. Per proteggersi da questa eventualità, il client leggero potrebbe utilizzare le prove di frode. +Tuttavia, cosa succede se un utente malintenzionato in qualche modo _riesce_ a passare un'intestazione di blocco dannosa ai client leggeri e a convincerli che è stata firmata da un comitato di sincronizzazione onesto? In tal caso, l'attaccante potrebbe includere transazioni non valide e il client leggero le accetterebbe ciecamente, poiché non controlla in modo indipendente tutte le modifiche di stato riassunte nell'intestazione del blocco. Per proteggersi da questo, il client leggero potrebbe utilizzare le prove di frode. -Il modo in cui funzionano queste prove di frode è che un nodo completo, vedendo una transizione di stato non valida oggetto di gossip nella rete, potrebbe generare rapidamente un piccolo pezzo di dati che dimostri che la transizione di stato proposta non può derivare da un determinato insieme di transazioni e trasmettere tali dati ai pari. I nodi leggeri potrebbero raccogliere queste prove di frode e usarle per scartare le intestazioni dei blocchi malevole, assicurando così di rimanere sulla stessa catena onesta dei nodi completi. +Il modo in cui funzionano queste prove di frode è che un nodo completo, vedendo una transizione di stato non valida diffusa nella rete, potrebbe generare rapidamente un piccolo pezzo di dati che dimostra che una transizione di stato proposta non potrebbe in alcun modo derivare da un determinato insieme di transazioni e trasmettere quei dati ai peer. I nodi leggeri potrebbero raccogliere quelle prove di frode e usarle per scartare le intestazioni di blocco errate, assicurandosi di rimanere sulla stessa catena onesta dei nodi completi. -Ciò si basa sul fatto che i nodi completi abbiano accesso ai dati completi delle transazioni. Un utente malevolo che trasmette un'intestazione di blocco malevola e non rende disponibili i dati della transazione sarebbe in grado di impedire ai nodi completi di generare prove di frode. I nodi completi potrebbero essere in grado di segnalare un avvertimento su un blocco malevolo, ma non potrebbero sostenere il loro avvertimento con una prova, perché i dati non sono stati resi disponibili per generare la prova! +Questo si basa sul fatto che i nodi completi abbiano accesso ai dati completi delle transazioni. Un attaccante che trasmette un'intestazione di blocco errata e non riesce a rendere disponibili i dati della transazione sarebbe in grado di impedire ai nodi completi di generare prove di frode. I nodi completi potrebbero essere in grado di segnalare un avviso su un blocco errato, ma non potrebbero supportare il loro avviso con una prova, perché i dati non sono stati resi disponibili per generare la prova! -La soluzione al problema della disponibilità dei dati è il DAS. I nodi leggeri scaricano piccole porzioni casuali dei dati di stato completi e utilizzano i campioni per verificare che l'intero set di dati sia disponibile. È possibile calcolare la probabilità effettiva di ipotizzare erroneamente la piena disponibilità dei dati dopo aver scaricato N porzioni a caso ([per 100 porzioni la probabilità è 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), cioè incredibilmente improbabile). +La soluzione a questo problema di disponibilità dei dati è il DAS. I nodi leggeri scaricano frammenti casuali molto piccoli dei dati di stato completi e utilizzano i campioni per verificare che l'intero set di dati sia disponibile. L'effettiva probabilità di presumere erroneamente la piena disponibilità dei dati dopo aver scaricato N frammenti casuali può essere calcolata ([per 100 frammenti la probabilità è 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), ovvero incredibilmente improbabile). -Anche in questo scenario, gli attacchi che trattengono solo pochi byte potrebbero passare inosservati ai client che effettuano richieste di dati casuali. La codifica di cancellazione risolve tale problema ricostruendo piccoli pezzi mancanti di dati utilizzabili per verificare i cambiamenti di stato proposti. Una prova di frode, poi, potrebbe essere costruita utilizzando i dati ricostruiti, impedendo ai nodi leggeri di accettare le intestazioni malevole. +Anche in questo scenario, gli attacchi che trattengono solo pochi byte potrebbero plausibilmente passare inosservati dai client che effettuano richieste di dati casuali. La codifica di cancellazione risolve questo problema ricostruendo piccoli pezzi di dati mancanti che possono essere utilizzati per controllare le modifiche di stato proposte. Una prova di frode potrebbe quindi essere costruita utilizzando i dati ricostruiti, impedendo ai nodi leggeri di accettare intestazioni errate. -**Nota:** DAS e prove di frode non sono ancora state implementate per i client leggeri di Ethereum in proof-of-stake, ma sono sulla tabella di marcia e prenderanno molto probabilmente la forma di prove basate su ZK-SNARK. I client leggeri odierni si affidano a una forma di DAC: verificano le identità della commissione di sincronizzazione, quindi si fidano delle intestazioni dei blocchi firmate che ricevono. +**Nota:** Il DAS e le prove di frode non sono ancora stati implementati per i client leggeri di Ethereum basati sulla prova di stake, ma sono nel piano d'azione, molto probabilmente assumendo la forma di prove basate su ZK-SNARK. I client leggeri di oggi si basano su una forma di DAC: verificano le identità del comitato di sincronizzazione e quindi si fidano delle intestazioni dei blocchi firmate che ricevono. ## Disponibilità dei dati e rollup di livello 2 {#data-availability-and-layer-2-rollups} -Le [soluzioni di ridimensionamento del Livello 2](/layer-2/), come i [rollup](/glossary/#rollups), riducono i costi di transazione e aumentano il volume di Ethereum, elaborando le transazioni all'esterno della catena. Le transazioni di rollup sono compresse e pubblicate in batch su Ethereum. I batch rappresentano migliaia di singole transazioni esterne alla catena in un'unica transazione su Ethereum. Ciò riduce la congestione al livello di base, riducendo le commissioni per gli utenti. +Le [soluzioni di scalabilità di livello 2](/layer-2/), come i [rollup](/glossary/#rollups), riducono i costi delle transazioni e aumentano il throughput di Ethereum elaborando le transazioni fuori catena. Le transazioni dei rollup vengono compresse e pubblicate su Ethereum in lotti. I lotti rappresentano migliaia di singole transazioni fuori catena in un'unica transazione su Ethereum. Ciò riduce la congestione sul livello di base e riduce le commissioni per gli utenti. -Tuttavia, è possibile fidarsi delle transazioni 'sintetiche' pubblicate su Ethereum solo se il cambiamento di stato proposto è verificabile in modo indipendente ed è confermato come il risultato dell'applicazione di tutte le singole transazioni esterne alla catena. Se gli operatori dei rollup non rendono disponibili i dati della transazione per tale verifica, potrebbero inviare dati errati a Ethereum. +Tuttavia, è possibile fidarsi delle transazioni "riassuntive" pubblicate su Ethereum solo se la modifica di stato proposta può essere verificata in modo indipendente e confermata come il risultato dell'applicazione di tutte le singole transazioni fuori catena. Se gli operatori dei rollup non rendono disponibili i dati delle transazioni per questa verifica, potrebbero inviare dati errati a Ethereum. -I [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/) pubblicano i dati compressi delle transazioni su Ethereum e attendono un po' di tempo (tipicamente 7 giorni) per consentire ai verificatori indipendenti di verificare i dati. Se qualcuno identifica un problema, possono generare una prova di frode e utilizzarla per contestare il rollup. Questo causerebbe il ripristino della catena e l'omissione del blocco non valido. Ciò è possibile esclusivamente se i dati sono disponibili. Al momento esistono due modi in cui i rollup ottimistici pubblicano i dati delle transazioni sul L1. Alcuni rollup rendono i dati permanentemente disponibili come `CALLDATA`, che risiede permanentemente sulla catena. Con l'implementazione dell'EIP-4844, alcuni rollup, invece, pubblicano i dati delle proprie transazioni in una più economica archiviazione a blob. Questa non è permanente. I verificatori indipendenti devono interrogare i blob e presentare le proprie contestazioni entro circa 18 giorni prima che i dati siano eliminati dal livello 1 di Ethereum. La disponibilità dei dati è garantita soltanto dal protocollo di Ethereum per tale breve finestra fissa. Dopodiché, diventa la responsabilità di altre entità nell'ecosistema di Ethereum. Ogni nodo può verificare la disponibilità dei dati utilizzando il DAS, cioè scaricando piccoli campioni casuali dei dati del blob. +I [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/) pubblicano i dati compressi delle transazioni su Ethereum e attendono un certo periodo di tempo (in genere 7 giorni) per consentire a verificatori indipendenti di controllare i dati. Se qualcuno identifica un problema, può generare una prova di frode e usarla per contestare il rollup. Ciò causerebbe il rollback della catena e l'omissione del blocco non valido. Questo è possibile solo se i dati sono disponibili. Attualmente, ci sono due modi in cui i rollup ottimistici pubblicano i dati delle transazioni sul livello 1. Alcuni rollup rendono i dati permanentemente disponibili come `CALLDATA` che risiede permanentemente on-chain. Con l'implementazione dell'EIP-4844, alcuni rollup pubblicano invece i dati delle loro transazioni in un'archiviazione blob più economica. Questa non è un'archiviazione permanente. I verificatori indipendenti devono interrogare i blob e sollevare le loro contestazioni entro circa 18 giorni prima che i dati vengano eliminati dal livello 1 di Ethereum. La disponibilità dei dati è garantita dal protocollo Ethereum solo per quella breve finestra fissa. Dopodiché, diventa responsabilità di altre entità nell'ecosistema Ethereum. Qualsiasi nodo può verificare la disponibilità dei dati utilizzando il DAS, ovvero scaricando piccoli campioni casuali dei dati del blob. -I [rollup a conoscenza zero (ZK)](/developers/docs/scaling/zk-rollups) non necessitano di pubblicare i dati della transazione, poiché le [prove di validità a conoscenza zero](/glossary/#zk-proof) garantiscono la correttezza delle transizioni di stato. Tuttavia, la disponibilità dei dati è ancora un problema, poiché non possiamo garantire la funzionalità del rollup ZK (o interagirci) senza l'accesso ai suoi dati di stato. Ad esempio, gli utenti non possono conoscere i propri saldi se un operatore trattiene dettagli sullo stato del rollup. Inoltre, non possono eseguire gli aggiornamenti di stato utilizzando informazioni contenute in un blocco appena aggiunto. +I [rollup a conoscenza zero (ZK)](/developers/docs/scaling/zk-rollups) non hanno bisogno di pubblicare i dati delle transazioni poiché le [prove di validità a conoscenza-zero](/glossary/#zk-proof) garantiscono la correttezza delle transizioni di stato. Tuttavia, la disponibilità dei dati è ancora un problema perché non possiamo garantire la funzionalità del rollup ZK (o interagire con esso) senza accedere ai suoi dati di stato. Ad esempio, gli utenti non possono conoscere i propri saldi se un operatore trattiene i dettagli sullo stato del rollup. Inoltre, non possono eseguire aggiornamenti di stato utilizzando le informazioni contenute in un blocco appena aggiunto. ## Disponibilità dei dati vs. recuperabilità dei dati {#data-availability-vs-data-retrievability} -La disponibilità dei dati è diversa dalla reperibilità dei dati. La disponibilità dei dati è la garanzia che i nodi completi siano stati capaci di accedere e verificare l'intera serie di transazioni associate a un blocco specifico. Non ne consegue necessariamente che i dati siano accessibili per sempre. +La disponibilità dei dati è diversa dalla recuperabilità dei dati. La disponibilità dei dati è la garanzia che i nodi completi siano stati in grado di accedere e verificare l'intero set di transazioni associate a un blocco specifico. Non ne consegue necessariamente che i dati siano accessibili per sempre. -La reperibilità dei dati è la capacità dei nodi di recuperare lo _storico_ dalla blockchain. Questi dati storici non sono necessari per verificare i nuovi blocchi, sono solo necessari per sincronizzare i nodi completi dal blocco di genesi o per servire le richieste storiche. +La recuperabilità dei dati è la capacità dei nodi di recuperare _informazioni storiche_ dalla blockchain. Questi dati storici non sono necessari per verificare nuovi blocchi, sono richiesti solo per sincronizzare i nodi completi dal blocco genesi o per soddisfare specifiche richieste storiche. -Il protocollo principale di Ethereum riguarda principalmente la disponibilità dei dati, non la loro reperibilità. La recuperabilità dei dati può essere fornita da una piccola popolazione di nodi di archivio, operata da terze parti, o è distribuibile per la rete utilizzando l'archiviazione decentralizzata di file, come [Portal Network](https://www.ethportal.net/). +Il protocollo principale di Ethereum si occupa principalmente della disponibilità dei dati, non della recuperabilità dei dati. La recuperabilità dei dati può essere fornita da una piccola popolazione di nodi di archivio gestiti da terze parti, oppure può essere distribuita attraverso la rete utilizzando l'archiviazione di file decentralizzata come la [Portal Network](https://www.ethportal.net/). -## Lettura consigliate {#further-reading} +## Letture consigliate {#further-reading} -- [Che diamine è la disponibilità dei dati?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) -- [Cos'è la disponibilità dei dati?](https://coinmarketcap.com/alexandria/article/what-is-data-availability) -- [Il panorama della disponibilità dei dati esterni alla catena di Ethereum](https://blog.celestia.org/ethereum-off-chain-data-availability-landscape/) -- [Le nozioni di base sui controlli di disponibilità dei dati](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) -- [Una spiegazione dello sharding + proposta DAS](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [Che cos'è la disponibilità dei dati? (WTF is Data Availability?)](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) +- [Cos'è la disponibilità dei dati?](https://coinmarketcap.com/academy/article/what-is-data-availability) +- [Un'introduzione ai controlli sulla disponibilità dei dati](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) +- [Una spiegazione della proposta frammentazione + DAS](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) - [Una nota sulla disponibilità dei dati e la codifica di cancellazione](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding#can-an-attacker-not-circumvent-this-scheme-by-releasing-a-full-unavailable-block-but-then-only-releasing-individual-bits-of-data-as-clients-query-for-them) -- [Commissioni di disponibilità dei dati.](https://medium.com/starkware/data-availability-e5564c416424) -- [Commissioni di disponibilità dei dati di proof-of-stake.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [Comitati per la disponibilità dei dati.](https://medium.com/starkware/data-availability-e5564c416424) +- [Comitati per la disponibilità dei dati basati sulla prova di stake.](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) - [Soluzioni al problema della recuperabilità dei dati](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) -- [Disponibilità dei dati, ovvero come i rollup hanno imparato a smettere di preoccuparsi e ad amare Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) +- [Disponibilità dei dati o: come i rollup hanno imparato a non preoccuparsi e ad amare Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [EIP-7623: Aumento del costo dei Calldata](https://web.archive.org/web/20250515194659/https://research.2077.xyz/eip-7623-increase-calldata-cost) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/it/developers/docs/data-structures-and-encoding/index.md index 741d0a5b654..0a376fb51a7 100644 --- a/public/content/translations/it/developers/docs/data-structures-and-encoding/index.md +++ b/public/content/translations/it/developers/docs/data-structures-and-encoding/index.md @@ -1,32 +1,32 @@ --- -title: Strutture di dati e codifica -description: Una panoramica delle strutture di dati fondamentali di Ethereum. +title: Strutture dati e codifica +description: Una panoramica delle strutture dati fondamentali di Ethereum. lang: it sidebarDepth: 2 --- -Ethereum crea, memorizza e trasferisce grandi volumi di dati. Questi dati devono essere formattati in modi standardizzati ed efficienti a livello di memoria per consentire a chiunque di [eseguire un nodo](/run-a-node/) su hardware relativamente modesto di tipo consumer. Per riuscirci, sono usate diverse strutture di dati specifiche sullo stack di Ethereum. +Ethereum crea, archivia e trasferisce grandi volumi di dati. Questi dati devono essere formattati in modi standardizzati ed efficienti in termini di memoria per consentire a chiunque di [eseguire un nodo](/run-a-node/) su hardware di livello consumer relativamente modesto. Per ottenere ciò, vengono utilizzate diverse strutture dati specifiche nello stack di Ethereum. ## Prerequisiti {#prerequisites} -È utile comprendere i fondamenti di Ethereum e del [software del client](/developers/docs/nodes-and-clients/). È consigliabile avere familiarità con il livello di rete e il [whitepaper di Ethereum](/whitepaper/). +Dovresti comprendere i fondamenti di Ethereum e del [software client](/developers/docs/nodes-and-clients/). Si consiglia di avere familiarità con il livello di rete e con [il whitepaper di Ethereum](/whitepaper/). -## Strutture di dati {#data-structures} +## Strutture dati {#data-structures} -### Trie di Patricia Merkle {#patricia-merkle-tries} +### Trie di Merkle Patricia {#patricia-merkle-tries} -I trie di Patricia Merkle sono strutture che codificano coppie chiave-valore in una prova autenticata crittograficamente e deterministica. Sono usate ampiamente nel livello d'esecuzione di Ethereum. +I Trie di Merkle Patricia sono strutture che codificano coppie chiave-valore in un trie deterministico e autenticato crittograficamente. Questi sono ampiamente utilizzati in tutto il livello di esecuzione di Ethereum. -[Maggiori informazioni sui trie di Patricia Merkle](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) +[Maggiori informazioni sui Trie di Merkle Patricia](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) -### Prefisso di Lunghezza Ricorsiva {#recursive-length-prefix} +### Recursive Length Prefix {#recursive-length-prefix} -Il Prefisso di Lunghezza Ricorsiva (RLP) è un metodo di serializzazione usato ampiamente nel livello d'esecuzione di Ethereum. +Il Recursive Length Prefix (RLP) è un metodo di serializzazione ampiamente utilizzato in tutto il livello di esecuzione di Ethereum. [Maggiori informazioni su RLP](/developers/docs/data-structures-and-encoding/rlp) ### Simple Serialize {#simple-serialize} -Simple Serialize (SSZ) è il formato di serializzazione dominante sul livello di consenso di Ethereum, per la sua compatibilità alla Merkle-zzazione. +Simple Serialize (SSZ) è il formato di serializzazione dominante sul livello di consenso di Ethereum a causa della sua compatibilità con la merkleizzazione. -[Maggiori informazioni su SSZ](/developers/docs/data-structures-and-encoding/ssz) +[Maggiori informazioni su SSZ](/developers/docs/data-structures-and-encoding/ssz) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/it/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index 7f042b9a192..c7e9d77e918 100644 --- a/public/content/translations/it/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/translations/it/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -1,170 +1,173 @@ --- -title: Trie di Patricia Merkle -description: Introduzione al Trie di Patricia Merkle. +title: Merkle Patricia Trie +description: Introduzione al Merkle Patricia Trie. lang: it sidebarDepth: 2 --- -Lo stato di Ethereum (la totalità di tutti i conti, i saldi e i contratti intelligenti) è codificato in una versione speciale della struttura dei dati, nota generalmente in informatica come un Albero di Merkle. Questa struttura è utile per molte applicazioni crittografiche, poiché crea una relazione verificabile tra tutti le singole parti di dati facenti parte dell'albero, dando come risultato un singolo valore di **radice** utilizzabile per provare delle cose sui dati. +Lo stato di [Ethereum](/) (la totalità di tutti gli account, i saldi e i contratti intelligenti) è codificato in una versione speciale della struttura dati nota generalmente in informatica come Albero di Merkle (Merkle Tree). Questa struttura è utile per molte applicazioni nella crittografia perché crea una relazione verificabile tra tutti i singoli pezzi di dati intrecciati nell'albero, risultando in un singolo valore **radice** (root) che può essere utilizzato per dimostrare cose sui dati. -La struttura dei dati di Ethereum è un 'Trie di Merkle-Patricia modificato', così detto perché prende in prestito alcune funzionalità di PATRICIA (l'Algoritmo Pratico Per Recuperare Informazioni Codificate in Alfanumerico), e poiché è progetttato per il **recupero** efficiente dei dati che costituiscono lo stato di Ethereum. +La struttura dati di Ethereum è un 'Merkle-Patricia Trie modificato', chiamato così perché prende in prestito alcune caratteristiche di PATRICIA (Practical Algorithm To Retrieve Information Coded in Alphanumeric), e perché è progettato per un efficiente recupero (re**trie**val) dei dati degli elementi che compongono lo stato di Ethereum. -Un trie di Merkle-Patricia è deterministico e verificabile crittograficamente: il solo modo per generare una radice di stato è calcolandola da ogni singola parte dello stato, e due stati identici sono facilmente dimostrabili confrontando l'hash di radice e gli hash che hanno portato a esso (_una prova di Merkle_). Per contro, non esiste alcun modo per creare due stati differenti con lo stesso hash di radice, e qualsiasi tentativo di modificare lo stato con valori differenti risulterà in un hash della radice di stato differente. Teoricamente, questa struttura rappresenta il 'Sacro Graal' dell'efficienza di `O(log(n))` per inserimenti, ricerche ed eliminazioni. +Un trie Merkle-Patricia è deterministico e crittograficamente verificabile: l'unico modo per generare una radice di stato è calcolarla da ogni singolo pezzo dello stato, e due stati identici possono essere facilmente dimostrati tali confrontando l'hash radice e gli hash che vi hanno portato (_una prova di Merkle_). Al contrario, non c'è modo di creare due stati diversi con lo stesso hash radice, e qualsiasi tentativo di modificare lo stato con valori diversi risulterà in un hash radice di stato diverso. Teoricamente, questa struttura fornisce il 'Santo Graal' dell'efficienza `O(log(n))` per inserimenti, ricerche ed eliminazioni. -Nel prossimo futuro, Ethereum prevede di migrare a una struttura ad [Albero di Verkle](/roadmap/verkle-trees), che aprirà le porte a molte nuove possibilità per le future migliorie al protocollo. +Nel prossimo futuro, Ethereum prevede di migrare a una struttura [Verkle Tree](/roadmap/verkle-trees), che aprirà molte nuove possibilità per futuri miglioramenti del protocollo. ## Prerequisiti {#prerequisites} -Per meglio comprendere questa pagina, sarebbe utile avere una conoscenza di base di [hash](https://en.wikipedia.org/wiki/Hash_function), [alberi di Merkle](https://en.wikipedia.org/wiki/Merkle_tree), [trie](https://en.wikipedia.org/wiki/Trie) e [serializzazione](https://en.wikipedia.org/wiki/Serialization). Questo articolo si apre con una descrizione di un [albero radicato](https://en.wikipedia.org/wiki/Radix_tree) di base, introducendo poi gradualmente alle modifiche necessarie per la struttura di dati più ottimizzata di Ethereum. +Per comprendere meglio questa pagina, sarebbe utile avere una conoscenza di base di [hash](https://en.wikipedia.org/wiki/Hash_function), [alberi di Merkle](https://en.wikipedia.org/wiki/Merkle_tree), [trie](https://en.wikipedia.org/wiki/Trie) e [serializzazione](https://en.wikipedia.org/wiki/Serialization). Questo articolo inizia con una descrizione di un [albero radix](https://en.wikipedia.org/wiki/Radix_tree) di base, per poi introdurre gradualmente le modifiche necessarie per la struttura dati più ottimizzata di Ethereum. -## Trie della radice di base {#basic-radix-tries} +## Trie radix di base {#basic-radix-tries} -In un trie della radice di base, ogni nodo si presenta così: +In un trie radix di base, ogni nodo si presenta come segue: ``` [i_0, i_1 ... i_n, value] ``` -Dove `i_0 ... i_n` rappresenta i simboli dell'alfabeto (spesso binari o esadecimali), `value` è il valore terminale al nodo e i valori negli spazi `i_0, i_1 ... i_n` sono `NULL` o puntano ad (nel nostro caso, a hash di) altri nodi. Questo forma un'archiviazione di base `(chiave, valore)`. +Dove `i_0 ... i_n` rappresentano i simboli dell'alfabeto (spesso binario o esadecimale), `value` è il valore terminale nel nodo, e i valori negli slot `i_0, i_1 ... i_n` sono `NULL` o puntatori a (nel nostro caso, hash di) altri nodi. Questo forma un archivio `(chiave, valore)` di base. -Ipotizziamo che si voglia utilizzare una struttura dei dati ad albero radicato per perdurare un ordine su una serie di coppie chiave-valore. Per trovare il valore attualmente mappato alla chiave `dog` nell'albero, occorre convertire prima `dog` in lettere dell'alfabeto (restituendo `64 6f 67`) e poi discendere l'albero seguendo tale percorso, fino a trovare il valore. Quindi, iniziare guardando l'hash radice in un database chiave/valore piatto per trovare il nodo radice dell'albero. È rappresentato come un insieme di chiavi che puntano ad altri nodi. Occorre utilizzare il valore all'indice `6` come una chiave e cercarlo nel database chiave/valore piatto per ottenere il nodo al livello inferiore. Poi si deve scegliere l'indice `4` per cercare il valore successivo, quindi, l'indice `6` e così via, finché, una volta seguito il percorso: `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7` si cerca il valore del nodo e si trova il risultato. +Supponiamo di voler utilizzare una struttura dati ad albero radix per persistere un ordine su un insieme di coppie chiave-valore. Per trovare il valore attualmente mappato alla chiave `dog` nel trie, dovresti prima convertire `dog` in lettere dell'alfabeto (ottenendo `64 6f 67`), e poi scendere nel trie seguendo quel percorso fino a trovare il valore. Ovvero, inizi cercando l'hash radice in un DB chiave/valore piatto per trovare il nodo radice del trie. È rappresentato come un array di chiavi che puntano ad altri nodi. Useresti il valore all'indice `6` come chiave e lo cercheresti nel DB chiave/valore piatto per ottenere il nodo di un livello inferiore. Poi sceglieresti l'indice `4` per cercare il valore successivo, poi l'indice `6`, e così via, finché, una volta seguito il percorso: `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, cercheresti il valore del nodo e restituiresti il risultato. -Esiste una differenza tra cercare qualcosa nel 'trie' e nel 'DB' flat chiave/valore sottostante. Entrambi definiscono degli schemi chiave/valore, ma il DB sottostante può effettuare una tradizionale ricerca di una chiave in 1 passaggio. Cercare una chiave nel trie richiede diverse ricerche DB sottostanti, per ottenere il valore finale descritto sopra. Facciamo riferimento a quest'ultimo come `path`, per eliminare ogni ambiguità. +C'è una differenza tra cercare qualcosa nel 'trie' e nel 'DB' chiave/valore piatto sottostante. Entrambi definiscono disposizioni chiave/valore, ma il DB sottostante può eseguire una tradizionale ricerca in 1 passaggio di una chiave. Cercare una chiave nel trie richiede molteplici ricerche nel DB sottostante per arrivare al valore finale descritto sopra. Riferiamoci a quest'ultimo come a un `percorso` (`path`) per eliminare l'ambiguità. -Le operazioni di aggiornamento ed eliminazione per gli alberi radicati sono definibili come segue: +Le operazioni di aggiornamento ed eliminazione per i trie radix possono essere definite come segue: -``` - def update(node,path,value): - curnode = db.get(node) if node else [ NULL ] * 17 +```python + def update(node_hash, path, value): + curnode = db.get(node_hash) if node_hash else [NULL] * 17 newnode = curnode.copy() - if path == '': + if path == "": newnode[-1] = value else: - newindex = update(curnode[path[0]],path[1:],value) + newindex = update(curnode[path[0]], path[1:], value) newnode[path[0]] = newindex - db.put(hash(newnode),newnode) + db.put(hash(newnode), newnode) return hash(newnode) - def delete(node,path): - if node is NULL: + def delete(node_hash, path): + if node_hash is NULL: return NULL else: - curnode = db.get(node) + curnode = db.get(node_hash) newnode = curnode.copy() - if path == '': + if path == "": newnode[-1] = NULL else: - newindex = delete(curnode[path[0]],path[1:]) + newindex = delete(curnode[path[0]], path[1:]) newnode[path[0]] = newindex if all(x is NULL for x in newnode): return NULL else: - db.put(hash(newnode),newnode) + db.put(hash(newnode), newnode) return hash(newnode) ``` -Un albero Radicato di "Merkle" è costruito collegando i nodi utilizzando sinossi di hash crittografici generati deterministicamente. Questo indirizzamento del contenuto (nel DB chiave/valore `key == keccak256(rlp(value))`) fornisce una garanzia dell'integrità crittografica dei dati memorizzati. Se l'hash radice di un dato albero è noto pubblicamente, allora chiunque abbia accesso ai dati delle foglie sottostanti può costruire una prova che l'albero include un dato valore a un percorso specifico, fornendo gli hash di ogni nodo che unisce un valore specifico alla radice dell'albero. +Un albero Radix "Merkle" è costruito collegando i nodi utilizzando digest di hash crittografici generati in modo deterministico. Questo indirizzamento basato sul contenuto (nel DB chiave/valore `key == keccak256(rlp(value))`) fornisce una garanzia di integrità crittografica dei dati memorizzati. Se l'hash radice di un dato trie è noto pubblicamente, chiunque abbia accesso ai dati foglia sottostanti può costruire una prova che il trie include un dato valore in un percorso specifico fornendo gli hash di ciascun nodo che unisce un valore specifico alla radice dell'albero. -È impossibile, per un utente malevolo, fornire una prova di una coppia `(percorso, valore)` che non esiste, poiché l'hash radice in definitiva si basa su tutti gli hash inferiori. Qualsiasi modifica sottostante modificherebbe l'hash radice. Si può pensare all'hash come una rappresentazione compressa delle informazioni strutturali sui dati, assicurata da una protezione pre-immagine della funzione di hashing. +È impossibile per un utente malintenzionato fornire una prova di una coppia `(percorso, valore)` che non esiste poiché l'hash radice si basa in ultima analisi su tutti gli hash sottostanti. Qualsiasi modifica sottostante cambierebbe l'hash radice. Puoi pensare all'hash come a una rappresentazione compressa delle informazioni strutturali sui dati, protetta dalla protezione della pre-immagine della funzione di hashing. -Chiameremo "nibble" l'unità atomica di un albero radicato (es., un singolo carattere esadecimale o un numero binario a 4 bit). Attraversando un percorso un "nibble" per volta, come descritto sopra, i nodi possono fare riferimento massimale a 16 figli, ma includono un elemento `value`. Dunque, li rappresentiamo come un insieme di lunghezza 17. Chiamiamo questi insiemi da 17 elementi "nodi ramo". +Ci riferiremo a un'unità atomica di un albero radix (ad es., un singolo carattere esadecimale o un numero binario a 4 bit) come a un "nibble". Durante l'attraversamento di un percorso un nibble alla volta, come descritto sopra, i nodi possono riferirsi al massimo a 16 figli ma includono un elemento `value`. Pertanto, li rappresentiamo come un array di lunghezza 17. Chiamiamo questi array di 17 elementi "nodi ramo" (branch nodes). -## Trie di Patricia Merkle {#merkle-patricia-trees} +## Merkle Patricia Trie {#merkle-patricia-trees} -Gli alberi radicati hanno una grande limitazione: non sono efficienti. Se si desidera memorizzare una coppia `(percorso, valore)` dove il percorso, come in Ethereum, è lungo 64 caratteri (il numero di "nibble" in `bytes32`), servirà oltre un kilobyte di spazio aggiuntivo per memorizzare un livello per carattere e, ogni ricerca o eliminazione, richiederebbe tutti e 64 i passaggi. L'albero di Patricia introdotto di seguito risolve tale problema. +I trie radix hanno una limitazione principale: sono inefficienti. Se si desidera memorizzare un'associazione `(percorso, valore)` in cui il percorso, come in Ethereum, è lungo 64 caratteri (il numero di nibble in `bytes32`), avremo bisogno di oltre un kilobyte di spazio extra per memorizzare un livello per carattere, e ogni ricerca o eliminazione richiederà tutti i 64 passaggi. Il trie Patricia introdotto di seguito risolve questo problema. ### Ottimizzazione {#optimization} -Un nodo in un trie di Patricia Merkle è uno dei seguenti: +Un nodo in un Merkle Patricia trie è uno dei seguenti: -1. `NULL` (rappresentato come la stringa vuota) -2. `branch` Un nodo da 17 elementi `[ v0 ... v15, vt ]` -3. `leaf` Un nodo da 2 elementi `[ encodedPath, value ]` -4. `extension` Un nodo da 2 elementi `[ encodedPath, key ]` +1. `NULL` (rappresentato come stringa vuota) +2. `branch` (ramo) Un nodo di 17 elementi `[ v0 ... v15, vt ]` +3. `leaf` (foglia) Un nodo di 2 elementi `[ encodedPath, value ]` +4. `extension` (estensione) Un nodo di 2 elementi `[ encodedPath, key ]` -Con i percorsi da 64 caratteri è inevitabile che dopo aver attraversato i primi pochi livelli del trie, si raggiunge un nodo privo di alcun percorso divergente per almeno parte del percorso. Per evitare di dover creare 15 nodi `NULL` sparsi lungo il percorso, abbreviamo la discesa configurando un nodo `extension` della forma `[ encodedPath, key ]`, in cui `encodedPath` contiene il "percorso parziale" a cui saltare (utilizzando una codifica compatta spiegata di seguito) e `key` è per la prossima ricerca sul database. +Con percorsi di 64 caratteri è inevitabile che, dopo aver attraversato i primi livelli del trie, si raggiunga un nodo in cui non esiste alcun percorso divergente per almeno una parte della discesa. Per evitare di dover creare fino a 15 nodi `NULL` sparsi lungo il percorso, abbreviamo la discesa impostando un nodo `extension` della forma `[ encodedPath, key ]`, dove `encodedPath` contiene il "percorso parziale" per saltare in avanti (utilizzando una codifica compatta descritta di seguito), e la `key` serve per la successiva ricerca nel DB. -Per un nodo `leaf`, contrassegnabile da un flag nel primo nibble del `encodedPath`, il percorso codifica tutti i frammenti precedenti del percorso del nodo e possiamo cercare direttamente il `value`. +Per un nodo `leaf`, che può essere contrassegnato da un flag nel primo nibble dell'`encodedPath`, il percorso codifica tutti i frammenti di percorso del nodo precedente e possiamo cercare direttamente il `value`. -Tale suddetta ottimizzazione, tuttavia, introduce delle ambiguità. +Questa ottimizzazione, tuttavia, introduce ambiguità. -Attraversando i percorsi in "nibble", potremmo finire con un numero dispari di nibble da attraversare; questo perché tutti i dati sono memorizzati nel fromato `bytes`. Non è possibile differenziare tra, ad esempio, il nibble `1` e i nibble `01` (entrambi devono essere memorizzati come `<01>`). Per specificare una lunghezza dispari, il percorso parziale è prefissato con un flag. +Quando si attraversano percorsi in nibble, potremmo ritrovarci con un numero dispari di nibble da attraversare, ma poiché tutti i dati sono memorizzati in formato `bytes`, non è possibile distinguere tra, ad esempio, il nibble `1` e i nibble `01` (entrambi devono essere memorizzati come `<01>`). Per specificare la lunghezza dispari, il percorso parziale è preceduto da un flag. -### Specifica: codifica compatta della sequenza esadecimale con terminatore facoltativo {#specification} +### Specifica: Codifica compatta di sequenza esadecimale con terminatore opzionale {#specification} -Il flagging sia _della lunghezza del percorso parziale rimanente, dispari o pari,_ sia del _nodo leaf o estensione_, come descritto sopra, risiede nel primo nibble del percorso parziale di qualsiasi nodo di 2 elementi. Il risultato è il seguente: +La segnalazione sia della _lunghezza del percorso parziale rimanente dispari vs. pari_ sia del _nodo foglia vs. estensione_ come descritto sopra risiede nel primo nibble del percorso parziale di qualsiasi nodo a 2 elementi. Risultano in quanto segue: - char hex bit | parziale tipo nodo lungh percorso - ---------------------------------------------------------- - 0 0000 | estensione pari - 1 0001 | estensione dispari - 2 0010 | terminazione (leaf) pari - 3 0011 | terminazione (leaf) dispari +| carattere esadecimale | bit | tipo di nodo parziale | lunghezza del percorso | +| -------- | ---- | ------------------ | ----------- | +| 0 | 0000 | estensione | pari | +| 1 | 0001 | estensione | dispari | +| 2 | 0010 | terminante (foglia)| pari | +| 3 | 0011 | terminante (foglia)| dispari | -per la lunghezza del percorso rimanente pari (`0` or `2`), seguirà sempre un altro nibble di "padding" `0`. +Per la lunghezza del percorso rimanente pari (`0` o `2`), seguirà sempre un altro nibble di "riempimento" (padding) `0`. -``` +```python def compact_encode(hexarray): term = 1 if hexarray[-1] == 16 else 0 - if term: hexarray = hexarray[:-1] + if term: + hexarray = hexarray[:-1] oddlen = len(hexarray) % 2 flags = 2 * term + oddlen if oddlen: hexarray = [flags] + hexarray else: hexarray = [flags] + [0] + hexarray - // hexarray ha ora una lunghezza pari, il cui primo nibble si compone dei flag. - o = '' - for i in range(0,len(hexarray),2): - o += chr(16 * hexarray[i] + hexarray[i+1]) + # hexarray ora ha una lunghezza pari il cui primo nibble rappresenta i flag. + o = "" + for i in range(0, len(hexarray), 2): + o += chr(16 * hexarray[i] + hexarray[i + 1]) return o ``` Esempi: -``` - > [ 1, 2, 3, 4, 5, ...] +```python + > [1, 2, 3, 4, 5, ...] '11 23 45' - > [ 0, 1, 2, 3, 4, 5, ...] + > [0, 1, 2, 3, 4, 5, ...] '00 01 23 45' - > [ 0, f, 1, c, b, 8, 10] + > [0, f, 1, c, b, 8, 10] '20 0f 1c b8' - > [ f, 1, c, b, 8, 10] + > [f, 1, c, b, 8, 10] '3f 1c b8' ``` -Ecco il codice esteso per ottenere un nodo nel trie di Patricia Merkle: +Ecco il codice esteso per ottenere un nodo nel Merkle Patricia trie: -``` - def get_helper(node,path): - if path == []: return node - if node = '': return '' - curnode = rlp.decode(node if len(node) < 32 else db.get(node)) +```python + def get_helper(node_hash, path): + if path == []: + return node_hash + if node_hash == "": + return "" + curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash)) if len(curnode) == 2: (k2, v2) = curnode k2 = compact_decode(k2) - if k2 == path[:len(k2)]: - return get(v2, path[len(k2):]) + if k2 == path[: len(k2)]: + return get(v2, path[len(k2) :]) else: - return '' + return "" elif len(curnode) == 17: - return get_helper(curnode[path[0]],path[1:]) + return get_helper(curnode[path[0]], path[1:]) - def get(node,path): + def get(node_hash, path): path2 = [] for i in range(len(path)): path2.push(int(ord(path[i]) / 16)) path2.push(ord(path[i]) % 16) path2.push(16) - return get_helper(node,path2) + return get_helper(node_hash, path2) ``` ### Esempio di Trie {#example-trie} -Supponiamo di volere un trie che contenga quattro coppie percorso/valore `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`. +Supponiamo di volere un trie contenente quattro coppie percorso/valore `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`. -Per prima cosa, convertiamo sia i percorsi che i valori in `bytes`. Di seguito, le rappresentazioni reali dei byte per i _percorsi_ sono denotate da `<>`, sebbene i _valori_ siano mostrati ancora come stringhe, denotate da `"`, per maggiore facilità di comprensione (anch'essi, sarebbero in realtà `bytes`): +Per prima cosa, convertiamo sia i percorsi che i valori in `bytes`. Di seguito, le rappresentazioni effettive in byte per i _percorsi_ sono indicate da `<>`, sebbene i _valori_ siano ancora mostrati come stringhe, indicati da `''`, per una più facile comprensione (anche loro, in realtà, sarebbero `bytes`): ``` <64 6f> : 'verb' @@ -173,7 +176,7 @@ Per prima cosa, convertiamo sia i percorsi che i valori in `bytes`. Di seguito, <68 6f 72 73 65> : 'stallion' ``` -Ora, costruiamo un trie di questo tipo con le seguenti coppie chiave/valore nel DB sottostante: +Ora, costruiamo un tale trie con le seguenti coppie chiave/valore nel DB sottostante: ``` rootHash: [ <16>, hashA ] @@ -183,15 +186,15 @@ Ora, costruiamo un trie di questo tipo con le seguenti coppie chiave/valore nel hashD: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coins' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] ``` -Quando in un nodo si fa riferimento a un altro nodo, viene inserito `H(rlp.encode(node))`, dove `H(x) = keccak256(x) if len(x) >= 32 else x` e `rlp.encode` è la funzione di codifica [RLP](/developers/docs/data-structures-and-encoding/rlp). +Quando un nodo è referenziato all'interno di un altro nodo, ciò che viene incluso è `keccak256(rlp.encode(node))`, se `len(rlp.encode(node)) >= 32` altrimenti `node` dove `rlp.encode` è la funzione di codifica [RLP](/developers/docs/data-structures-and-encoding/rlp). -Nota che, aggiornando un trie, si deve memorizzare la coppia chiave/valore `(keccak256(x), x)` in una tabella di ricerca persistente _se_ il nodo appena creato ha una lunghezza >= 32. Se invece il nodo è inferiore a questo valore, non è necessario memorizzare nulla, poiché la funzione f(x) = x è reversibile. +Nota che quando si aggiorna un trie, è necessario memorizzare la coppia chiave/valore `(keccak256(x), x)` in una tabella di ricerca persistente _se_ il nodo appena creato ha una lunghezza >= 32. Tuttavia, se il nodo è più corto, non è necessario memorizzare nulla, poiché la funzione f(x) = x è reversibile. ## Trie in Ethereum {#tries-in-ethereum} -Tutti i trie di Merkle nel livello d'esecuzione di Ethereum usano un Trie di Patricia Merkle. +Tutti i trie di Merkle nel livello di esecuzione di Ethereum utilizzano un Merkle Patricia Trie. -Dall'intestazione di un blocco ci sono 3 radici provenienti da 3 di questi trie. +Dall'intestazione di un blocco ci sono 3 radici da 3 di questi trie. 1. stateRoot 2. transactionsRoot @@ -199,26 +202,26 @@ Dall'intestazione di un blocco ci sono 3 radici provenienti da 3 di questi trie. ### Trie di Stato {#state-trie} -Esiste un albero di stato globale ed è aggiornato ogni volta che un client elabora un blocco. In esso, un `path` è sempre: `keccak256(ethereumAddress)` e un `value` è sempre: `rlp(ethereumAccount)`. Più nello specifico, un `account` di Ethereum è un insieme di 4 elementi di `[nonce,balance,storageRoot,codeHash]`. A questo punto, vale la pena di notare che tale `storageRoot` è la radice di un altro albero di Patricia: +Esiste un trie di stato globale, e viene aggiornato ogni volta che un client elabora un blocco. In esso, un `percorso` è sempre: `keccak256(ethereumAddress)` e un `valore` è sempre: `rlp(ethereumAccount)`. Più specificamente, un `account` Ethereum è un array di 4 elementi di `[nonce,balance,storageRoot,codeHash]`. A questo punto, vale la pena notare che questo `storageRoot` è la radice di un altro trie patricia: -### Trie d'archiviazione {#storage-trie} +### Trie di Archiviazione {#storage-trie} -Il trie d'archiviazione è dove risiedono _tutti_ i dati del contratto. Esiste un albero d'archiviazione separato per ogni conto. Per recuperare i valori a posizioni d'archiviazione specifiche a un dato indirizzo, servono l'indirizzo d'archiviazione, la posizione intera dei dati memorizzati in archiviazione e l'ID del blocco. Questi possono essere passati come argomenti al `eth_getStorageAt`, definito nell'APi di JSON-RPC, es., per recuperare i dati nello slot 0 d'archiviazione per l'indirizzo `0x295a70b2de5e3953354a6a8344e616ed314d7251`: +Il trie di archiviazione è dove risiedono _tutti_ i dati del contratto. Esiste un trie di archiviazione separato per ogni account. Per recuperare i valori in posizioni di archiviazione specifiche a un dato indirizzo, sono richiesti l'indirizzo di archiviazione, la posizione intera dei dati memorizzati nell'archiviazione e l'ID del blocco. Questi possono poi essere passati come argomenti a `eth_getStorageAt` definito nell'API JSON-RPC, ad es., per recuperare i dati nello slot di archiviazione 0 per l'indirizzo `0x295a70b2de5e3953354a6a8344e616ed314d7251`: -``` +```bash curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 {"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} ``` -Il recupero di altri elementi in archiviazione è lievemente più impegnativo, poiché deve essere calcolata prima la posizione nel trie d'archiviazione. La posizione è calcolata come l'hash `keccak256` dell'indirizzo e della posizione d'archiviazione, entrambi con padding di zeri a sinistra, fino a una lunghezza di 32 byte. Ad esempio, la posizione dei dati nello slot d'archiviazione 1 per l'indirizzo `0x391694e7e0b0cce554cb130d723a9d27458f9298` è: +Il recupero di altri elementi nell'archiviazione è leggermente più complesso perché la posizione nel trie di archiviazione deve prima essere calcolata. La posizione è calcolata come l'hash `keccak256` dell'indirizzo e della posizione di archiviazione, entrambi riempiti a sinistra con zeri fino a una lunghezza di 32 byte. Ad esempio, la posizione per i dati nello slot di archiviazione 1 per l'indirizzo `0x391694e7e0b0cce554cb130d723a9d27458f9298` è: -``` +```python keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) ``` -In una console Geth, si può calcolare in questo modo: +In una console Geth, questo può essere calcolato come segue: ``` > var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" @@ -227,37 +230,37 @@ undefined "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" ``` -Il `path` è dunque `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Questo è ora utilizzabile per recuperare i dati dal trie d'archiviazione come sopra: +Il `percorso` è quindi `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Questo può ora essere utilizzato per recuperare i dati dal trie di archiviazione come prima: -``` +```bash curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 {"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} ``` -Nota: la `storageRoot` per un account di Ethereum è vuota per impostazione predefinita se non è l'account di un contratto. +Nota: lo `storageRoot` per un account Ethereum è vuoto per impostazione predefinita se non è un account di contratto. -### Trie delle transazioni {#transaction-trie} +### Trie delle Transazioni {#transaction-trie} -Esiste un albero di transazioni separato per ogni blocco, anch'esso che memorizza coppie `(key, value)`. Qui, un percorso è: `rlp(transactionIndex)`, rappresentante la chiave corrispondente a un valore determinato da: +Esiste un trie delle transazioni separato per ogni blocco, che memorizza nuovamente coppie `(chiave, valore)`. Un percorso qui è: `rlp(transactionIndex)` che rappresenta la chiave che corrisponde a un valore determinato da: -``` +```python if legacyTx: value = rlp(tx) else: value = TxType | encode(tx) ``` -Maggiori informazioni a riguardo si possono trovare nella documentazione [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). +Maggiori informazioni su questo possono essere trovate nella documentazione dell'[EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). -### Trie delle ricevute {#receipts-trie} +### Trie delle Ricevute {#receipts-trie} -Ogni blocco ha il proprio trie delle ricevute. Qui, un `path` è: `rlp(transactionIndex)`. `transactionIndex` è il suo indice all'interno del blocco in cui è stato incluso. L'albero delle ricevute non è mai aggiornato. Analogamento all'albero delle Transazioni, esistono ricevute correnti e legacy. Per interrogare una ricevuta specifica nell'albero delle Ricevute, l'indice della transazione nel suo blocco, il carico utile di ricevute e il tipo di transazione sono necessari. La ricevuta Restituita può essere di tipo `Receipt`, definita come la concatenazione di `TransactionType` e `ReceiptPayload` o di tipo `LegacyReceipt`, definibile come `rlp([status, cumulativeGasUsed, logsBloom, logs])`. +Ogni blocco ha il proprio trie delle Ricevute. Un `percorso` qui è: `rlp(transactionIndex)`. `transactionIndex` è il suo indice all'interno del blocco in cui è stato incluso. Il trie delle ricevute non viene mai aggiornato. Similmente al trie delle Transazioni, ci sono ricevute attuali e legacy. Per interrogare una ricevuta specifica nel trie delle Ricevute, sono richiesti l'indice della transazione nel suo blocco, il payload della ricevuta e il tipo di transazione. La ricevuta restituita può essere di tipo `Receipt` che è definita come la concatenazione di `TransactionType` e `ReceiptPayload` o può essere di tipo `LegacyReceipt` che è definita come `rlp([status, cumulativeGasUsed, logsBloom, logs])`. -Maggiori informazioni a riguardo si possono trovare nella documentazione [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). +Maggiori informazioni su questo possono essere trovate nella documentazione dell'[EIP 2718](https://eips.ethereum.org/EIPS/eip-2718). ## Letture consigliate {#further-reading} -- [Albero di Patricia Merkle Modificato - Come Ethereum risparmia uno stato](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) -- ["Merkling" su Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum) -- [Comprendere l'albero di Ethereum](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) +- [Merkle Patricia Trie modificato — Come Ethereum salva uno stato](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) +- [Merkling in Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum) +- [Comprendere il trie di Ethereum](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/it/developers/docs/data-structures-and-encoding/rlp/index.md index 621017f90f4..db30de3e204 100644 --- a/public/content/translations/it/developers/docs/data-structures-and-encoding/rlp/index.md +++ b/public/content/translations/it/developers/docs/data-structures-and-encoding/rlp/index.md @@ -1,48 +1,62 @@ --- title: Serializzazione a prefisso di lunghezza ricorsiva (RLP) -description: Una definizione della codifica rlp nel livello d'esecuzione di Ethereum. +description: Una definizione della codifica rlp nel livello di esecuzione di Ethereum. lang: it sidebarDepth: 2 --- -La serializzazione a prefisso di lunghezza ricorsiva (RLP) è usata ampiamente nei client d'esecuzione di Ethereum. L’RLP standardizza il trasferimento di dati tra nodi in un formato efficiente a livello di spazio. Lo scopo dell’RLP è codificare arbitrariamente gli insiemi di dati binari nidificati e l’RLP è il metodo di codifica principale usato per serializzare gli oggetti nel livello d'esecuzione di Ethereum. Lo scopo principale dell'RLP è codificare la struttura; con l'eccezione degli interi positivi, l'RLP delega la codifica dei tipi di dati specifici (es.,stringhe, virgola mobile) a protocolli di ordine superiore. Gli interi positivi devono essere rappresentati in forma binaria big-endian senza zeri iniziali (rendendo il valore intero zero equivalente all'array di byte vuoto). Gli interi positivi deserializzati con zero iniziali devono essere trattati come non validi da qualsiasi protocollo di ordine superiore che utilizzi l'RLP. +La serializzazione a prefisso di lunghezza ricorsiva (RLP) è ampiamente utilizzata nei client di esecuzione di Ethereum. L'RLP standardizza il trasferimento di dati tra i nodi in un formato efficiente in termini di spazio. Lo scopo dell'RLP è codificare array di dati binari nidificati in modo arbitrario, ed è il metodo di codifica principale utilizzato per serializzare gli oggetti nel livello di esecuzione di Ethereum. Lo scopo principale dell'RLP è codificare la struttura; a eccezione degli interi positivi, l'RLP delega la codifica di tipi di dati specifici (es. stringhe, float) a protocolli di ordine superiore. Gli interi positivi devono essere rappresentati in formato binario big-endian senza zeri iniziali (rendendo così il valore intero zero equivalente all'array di byte vuoto). Gli interi positivi deserializzati con zeri iniziali devono essere trattati come non validi da qualsiasi protocollo di ordine superiore che utilizzi l'RLP. -Per maggiori informazioni, consultare lo [yellowpaper di Ethereum (Appendice B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19). +Maggiori informazioni nel [Yellow Paper di Ethereum (Appendice B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19). -Per usare l’RLP per codificare un dizionario, le due forme canoniche suggerite sono: +Per utilizzare l'RLP per codificare un dizionario, le due forme canoniche suggerite sono: -- usare `[[k1,v1],[k2,v2]...]` con i tasti in ordine lessicografico -- usare la codifica dell'Albero di Patricia di livello superiore come fa Ethereum +- usare `[[k1,v1],[k2,v2]...]` con le chiavi in ordine lessicografico +- usare la codifica di livello superiore Patricia Tree come fa [Ethereum](/) ## Definizione {#definition} -La codifica RLP prende un elemento. Un elemento è definito come segue: +La funzione di codifica RLP accetta un elemento. Un elemento è definito come segue: -- una stringa (ovvero insieme di byte) è un elemento +- una stringa (ovvero, un array di byte) è un elemento - un elenco di elementi è un elemento -- un intero posiitivo è un elemento +- un intero positivo è un elemento Ad esempio, tutti i seguenti sono elementi: - una stringa vuota; -- la stringa contenente la parola "gatto"; -- un elenco contenente qualsiasi numero di stringhe; -- e strutture di dati più complesse come `["gatto", ["cucciolo", "vacca"], "cavallo", [[]], "maiale", [""], "pecora"]`. +- la stringa contenente la parola "cat"; +- un elenco contenente un numero qualsiasi di stringhe; +- e strutture dati più complesse come `["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]`. - il numero `100` -Nota che, nel contesto del resto di questa pagina, 'stringa' significa "un certo numero di byte di dati binari"; non è utilizzata alcuna codifica speciale, e non è implicata alcuna conoscenza sul contenuto delle stringhe (tranne come richiesto dalla regola contro gli interi positivi non minimali). +Nota che nel contesto del resto di questa pagina, per 'stringa' si intende "un certo numero di byte di dati binari"; non vengono utilizzate codifiche speciali e non è implicita alcuna conoscenza del contenuto delle stringhe (salvo quanto richiesto dalla regola contro gli interi positivi non minimi). La codifica RLP è definita come segue: -- Per un intero positivo, è convertito al più breve array di byte la cui interpretazione big-endian sia l'intero, quindi, e quindi codificato come una stringa secondo le seguenti regole. -- Per un singolo byte il cui valore è nell'intervallo `[0x00, 0x7f]` (decimale `[0, 127]`), quel byte è la propria codifica RLP. -- Altrimenti, se una stringa è lunga da 0 a 55 byte, la codifica RLP consiste in un singolo byte con valore **0x80** (dec. 128) più la lunghezza della stringa seguita dalla stringa. L'intervallo del primo byte è dunque `[0x80, 0xb7]` (dec. `[128, 183]`). -- Se una stringa è più lunga di 55 byte, la codifica RLP consiste in un singolo byte con valore **0xb7** (dec. 183) più la lunghezza in byte della lunghezza della stringa in forma binaria, seguita dalla lunghezza della stringa, seguita dalla stringa. Ad esempio, una stringa lunga 1024 byte sarebbe codificata come `\xb9\x04\x00` (dec. `185, 4, 0`), seguita dalla stringa. Qui, `0xb9` (183 + 2 = 185) come primo byte, seguito dai 2 byte `0x0400` (dec. 1024) che denotano la lunghezza della stringa effettiva. L'intervallo del primo byte è dunque `[0xb8, 0xbf]` (dec. `[184, 191]`). -- Se una stringa è lunga 2^64 byte o più, potrebbe non essere codificata. -- Se il payload totale di un elenco (cioè la lunghezza combinata di tutti i suoi elementi codificati in RLP) è lunga da 0 a 55 byte, la codifica RLP consiste in un singolo byte dal valore **0xc0**, più la lunghezza del payload, seguita dalla concatenazione delle codifiche RLP degli elementi. L'intervallo del primo byte è dunque `[0xc0, 0xf7]` (dec. `[192, 247]`). -- Se il carico utile totale di un elenco è più lungo di 55 byte, la codifica RLP consiste in un singolo byte con valore **oxf7**, più la lunghezza in byte della lunghezza del payload in forma binaria, seguita dalla lunghezza del carico utile, seguita dalla concatenazione delle codifiche RLP degli elementi. L'intervallo del primo byte è dunque `[0xf8, 0xff]` (dec. `[248, 255]`). +- Per un intero positivo, viene convertito nell'array di byte più corto la cui interpretazione big-endian è l'intero, e poi codificato come stringa secondo le regole sottostanti. +- Per un singolo byte il cui valore è nell'intervallo `[0x00, 0x7f]` (decimale `[0, 127]`), quel byte è la sua stessa codifica RLP. +- Altrimenti, se una stringa è lunga 0-55 byte, la codifica RLP consiste in un singolo byte con valore **0x80** (dec. 128) più la lunghezza della stringa, seguito dalla stringa. L'intervallo del primo byte è quindi `[0x80, 0xb7]` (dec. `[128, 183]`). +- Se una stringa è lunga più di 55 byte, la codifica RLP consiste in un singolo byte con valore **0xb7** (dec. 183) più la lunghezza in byte della lunghezza della stringa in formato binario, seguito dalla lunghezza della stringa, seguito dalla stringa. Ad esempio, una stringa lunga 1024 byte verrebbe codificata come `\xb9\x04\x00` (dec. `185, 4, 0`) seguita dalla stringa. Qui, `0xb9` (183 + 2 = 185) è il primo byte, seguito dai 2 byte `0x0400` (dec. 1024) che denotano la lunghezza della stringa effettiva. L'intervallo del primo byte è quindi `[0xb8, 0xbf]` (dec. `[184, 191]`). +- Se una stringa è lunga 2^64 byte, o più, potrebbe non essere codificata. +- Se il payload totale di un elenco (ovvero, la lunghezza combinata di tutti i suoi elementi codificati in RLP) è lungo 0-55 byte, la codifica RLP consiste in un singolo byte con valore **0xc0** più la lunghezza del payload, seguito dalla concatenazione delle codifiche RLP degli elementi. L'intervallo del primo byte è quindi `[0xc0, 0xf7]` (dec. `[192, 247]`). +- Se il payload totale di un elenco è lungo più di 55 byte, la codifica RLP consiste in un singolo byte con valore **0xf7** più la lunghezza in byte della lunghezza del payload in formato binario, seguito dalla lunghezza del payload, seguito dalla concatenazione delle codifiche RLP degli elementi. L'intervallo del primo byte è quindi `[0xf8, 0xff]` (dec. `[248, 255]`). -In codice è: +In forma sintetica: + +| Intervallo | Byte 1 | Byte 2 | ... | Byte 9 | Byte 10 | Significato | +| ----------- | ---------- | ---------- | ---------- | --------------------- | ---------- | ----------------------------------------- | +| `0x00-0x7f` | `0ppppppp` | | | | | stringa a byte singolo | +| `0x80-0xb7` | `10nnnnnn` | `pppppppp` | `...` | | | stringa corta (0-55 byte) | +| `0xb8-0xbf` | `10111NNN` | `nnnnnnnn` | `...` | `nnnnnnnn`/`pppppppp` | `pppppppp` | stringa lunga, N+1 byte per la lunghezza, poi il payload | +| `0xc0-0xf7` | `11nnnnnn` | `pppppppp` | `...` | | | elenco corto (0-55 byte) | +| `0xf8-0xff` | `11111NNN` | `nnnnnnnn` | `...` | `nnnnnnnn`/`pppppppp` | `pppppppp` | elenco lungo, N+1 byte per la lunghezza, poi il payload | + +- `p` = payload +- `n` = lunghezza (numero di byte del payload) +- `N` = offset della lunghezza della lunghezza (seguono N+1 byte `n`) + +Nel codice, questo è: ```python def rlp_encode(input): @@ -62,7 +76,7 @@ def encode_length(L, offset): elif L < 256**8: BL = to_binary(L) return chr(len(BL) + offset + 55) + BL - raise Exception("input too long") + raise Exception("input too long") def to_binary(x): if x == 0: @@ -74,38 +88,38 @@ def to_binary(x): - la stringa "dog" = [ 0x83, 'd', 'o', 'g' ] - l'elenco [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` -- la stringa vuota (“null”) = `[ 0x80 ]` +- la stringa vuota ('null') = `[ 0x80 ]` - l'elenco vuoto = `[ 0xc0 ]` - l'intero 0 = `[ 0x80 ]` - il byte '\\x00' = `[ 0x00 ]` - il byte '\\x0f' = `[ 0x0f ]` - i byte '\\x04\\x00' = `[ 0x82, 0x04, 0x00 ]` -- la [data rappresentazione teorica](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) di tre, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- la [rappresentazione teorica degli insiemi](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) di tre, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` - la stringa "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]` ## Decodifica RLP {#rlp-decoding} Secondo le regole e il processo della codifica RLP, l'input della decodifica RLP è considerato come un array di dati binari. Il processo di decodifica RLP è il seguente: -1. a seconda del primo byte (ovvero il prefisso) dei dati di input e decodificando il tipo di dati, la lunghezza dei dati effettivi e l'offset; +1. in base al primo byte (ovvero, il prefisso) dei dati di input e decodificando il tipo di dati, la lunghezza dei dati effettivi e l'offset; -2. secondo il tipo e lo scostamento dei dati, decodificali di conseguenza, rispettando la regola di codifica minimale per gli interi positivi; +2. in base al tipo e all'offset dei dati, decodificare i dati in modo corrispondente, rispettando la regola di codifica minima per gli interi positivi; -3. continua a decodificare il resto dell'input; +3. continuare a decodificare il resto dell'input; -Tra loro, le regole per decodificare i tipi di dati e offset sono le seguenti: +Tra queste, le regole di decodifica dei tipi di dati e dell'offset sono le seguenti: -1. i dati sono una stringa se l'intervallo del primo byte (prefisso) è [0x00, 0x7f] e la stringa corrisponde esattamente al primo byte; +1. i dati sono una stringa se l'intervallo del primo byte (ovvero, il prefisso) è [0x00, 0x7f], e la stringa è esattamente il primo byte stesso; -2. i dati sono una stringa se l'intervallo del primo byte è [0x80, 0xb7] e la stringa la cui lunghezza è pari al primo byte meno 0x80 segue il primo byte; +2. i dati sono una stringa se l'intervallo del primo byte è [0x80, 0xb7], e la stringa la cui lunghezza è uguale al primo byte meno 0x80 segue il primo byte; -3. i dati sono una stringa se l'intervallo del primo byte è [0xb8, 0xbf] e la lunghezza della stringa la cui lunghezza in byte è pari al primo byte meno 0xb7 segue il primo byte, e la stringa segue la lunghezza della stringa; +3. i dati sono una stringa se l'intervallo del primo byte è [0xb8, 0xbf], e la lunghezza della stringa la cui lunghezza in byte è uguale al primo byte meno 0xb7 segue il primo byte, e la stringa segue la lunghezza della stringa; -4. i dati sono una lista se l'intervallo del primo byte è [0xc0, 0xf7] e la concatenazione delle codifiche RLP di tutti gli elementi della lista in cui il payload totale è uguale al primo byte meno 0xc0 segue il primo byte; +4. i dati sono un elenco se l'intervallo del primo byte è [0xc0, 0xf7], e la concatenazione delle codifiche RLP di tutti gli elementi dell'elenco il cui payload totale è uguale al primo byte meno 0xc0 segue il primo byte; -5. i dati sono una lista se l'intervallo del primo byte è [0xf8, 0xff] e il payload totale dell'elenco la cui lunghezza equivale al primo byte meno 0xf7 segue il primo byte e la concatenazione delle codifiche RLP di tutti gli elementi dell'elenco segue il payload totale dell'elenco; +5. i dati sono un elenco se l'intervallo del primo byte è [0xf8, 0xff], e il payload totale dell'elenco la cui lunghezza è uguale al primo byte meno 0xf7 segue il primo byte, e la concatenazione delle codifiche RLP di tutti gli elementi dell'elenco segue il payload totale dell'elenco; -In codice è: +Nel codice, questo è: ```python def rlp_decode(input): @@ -155,9 +169,9 @@ def to_integer(b): ## Letture consigliate {#further-reading} - [RLP in Ethereum](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) -- [Dietro le quinte di Ethereum: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) -- [Coglio, A. (2020). Prefisso di Lunghezza Ricorsiva di Ethereum in ACL2. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) +- [Ethereum under the hood: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) +- [Coglio, A. (2020). Ethereum's Recursive Length Prefix in ACL2. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) ## Argomenti correlati {#related-topics} -- [Trie di Patricia Merkle](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) +- [Trie di Merkle Patricia](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/it/developers/docs/data-structures-and-encoding/ssz/index.md index f5f356c2bc1..05f30cf7de4 100644 --- a/public/content/translations/it/developers/docs/data-structures-and-encoding/ssz/index.md +++ b/public/content/translations/it/developers/docs/data-structures-and-encoding/ssz/index.md @@ -5,24 +5,24 @@ lang: it sidebarDepth: 2 --- -**Simple serialize ** è il metodo di serializzazione usato sulla Beacon Chain. Sostituisce la serializzazione RLP usata sul livello d'esecuzione ovunque nel livello del consenso, tranne che per il protocollo di scoperta dei peer. SSZ è progettata per essere deterministica e anche efficiente nell'attività di Merkle-zzazione. SSZ può essere pensato come diviso in due componenti: uno schema di serializzazione e uno schema di Merkle-zzazione, progettato per funzionare efficientemente con la struttura di dati serializzati. +**Simple serialize (SSZ)** è il metodo di serializzazione utilizzato sulla beacon chain. Sostituisce la serializzazione RLP utilizzata sul livello di esecuzione ovunque nel livello di consenso, tranne che nel protocollo di scoperta dei peer. Per saperne di più sulla serializzazione RLP, consulta [Prefisso di lunghezza ricorsiva (RLP)](/developers/docs/data-structures-and-encoding/rlp/). SSZ è progettato per essere deterministico e anche per essere merkleizzato in modo efficiente. Si può pensare a SSZ come composto da due componenti: uno schema di serializzazione e uno schema di merkleizzazione progettato per funzionare in modo efficiente con la struttura dei dati serializzata. ## Come funziona SSZ? {#how-does-ssz-work} ### Serializzazione {#serialization} -SSZ è uno schema di serializzazione non auto-descrivente; al contrario si affida a uno schema che deve essere noto in anticipo. L'obiettivo della serializzazione SSZ è rappresentare gli oggetti di complessità arbitraria come stringhe di byte. Questo è un processo molto semplice per i "tipi di base". L'elemento è semplicemente convertito in byte esadecimali. I tipi di base includono: +SSZ è uno schema di serializzazione che non è auto-descrittivo, ma si basa piuttosto su uno schema che deve essere noto in anticipo. L'obiettivo della serializzazione SSZ è rappresentare oggetti di complessità arbitraria come stringhe di byte. Questo è un processo molto semplice per i "tipi di base". L'elemento viene semplicemente convertito in byte esadecimali. I tipi di base includono: -- interi non firmati -- Booleani +- interi senza segno +- booleani -Per tipi "compositi" complessi, la serializzazione è più complicata perché il tipo composito contiene diversi elementi che potrebbero avere tipi o dimensioni o entrambi, differenti. Quando questi oggetti hanno tutti lunghezze fisse (ovvero la dimensione degli elementi è sempre costante, indipendentemente dai valori reali), la serializzazione è semplicemente una conversione di ogni elemento nel tipo composito ordinato in stringhe di byte little-endian. Queste stringhe di byte sono unite tra loro. L'oggetto serializzato ha la rappresentazione della serie di byte degli elementi a lunghezza fissa nello stesso ordine in cui appaiono nell'oggetto deserializzato. +Per i tipi "compositi" complessi, la serializzazione è più complicata perché il tipo composito contiene più elementi che potrebbero avere tipi o dimensioni diverse, o entrambi. Laddove questi oggetti hanno tutti lunghezze fisse (cioè, la dimensione degli elementi sarà sempre costante indipendentemente dai loro valori effettivi), la serializzazione è semplicemente una conversione di ogni elemento nel tipo composito ordinato in stringhe di byte little-endian. Queste stringhe di byte vengono unite insieme. L'oggetto serializzato ha la rappresentazione in lista di byte degli elementi a lunghezza fissa nello stesso ordine in cui appaiono nell'oggetto deserializzato. -Per i tipi con lunghezze variabili, nell'oggetto serializzato i dati reali sono sostituiti da un valore di "offset" nella posizione di quell'elemento. I dati reali sono aggiunti alla fine dell'oggetto serializzato. Il valore di offset è l'indice per l'inizio dei dati reali nello heap, che serve da puntatore ai byte rilevanti. +Per i tipi con lunghezze variabili, i dati effettivi vengono sostituiti da un valore di "offset" nella posizione di quell'elemento nell'oggetto serializzato. I dati effettivi vengono aggiunti a un heap alla fine dell'oggetto serializzato. Il valore di offset è l'indice per l'inizio dei dati effettivi nell'heap, agendo come un puntatore ai byte rilevanti. -L'esempio seguente illustra come funziona l'offset per un contenitore con elementi di lunghezza sia fissa che variabile: +L'esempio seguente illustra come funziona l'offset per un contenitore con elementi sia a lunghezza fissa che variabile: -```Rust +```rust struct Dummy { @@ -44,76 +44,76 @@ L'esempio seguente illustra come funziona l'offset per un contenitore con elemen ``` -`serialized` avrebbe la seguente struttura (padding solo a 4 bit qui, padding a 32 bit nella realtà e mantenendo la rappresentazione di `int` per chiarezza): +`serialized` avrebbe la seguente struttura (qui riempita solo a 4 bit, riempita a 32 bit nella realtà, e mantenendo la rappresentazione `int` per chiarezza): ``` [37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] ------------ ----------- ----------- ----------- ---------- | | | | | - number1 number2 offset per number 3 valore per - vettore vettore + number1 number2 offset for number 3 value for + vector vector ``` -diviso su righe per chiarezza: +diviso su più righe per chiarezza: ``` [ - 37, 0, 0, 0, # codifica endiana piccola di `number1`. - 55, 0, 0, 0, # codifica endiana piccola di `number2`. - 16, 0, 0, 0, # Lo "offset" che indica dove inizia il valore di `vector` (16 endiano piccolo). - 22, 0, 0, 0, # codifica endiana piccola di `number3`. - 1, 2, 3, 4, # I valori reali in `vector`. + 37, 0, 0, 0, # little-endian encoding of `number1`. + 55, 0, 0, 0, # little-endian encoding of `number2`. + 16, 0, 0, 0, # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 22, 0, 0, 0, # little-endian encoding of `number3`. + 1, 2, 3, 4, # The actual values in `vector`. ] ``` -Questa è comunque una semplificazione: gli interi e gli zeri negli schemi di cui sopra sarebbero in realtà elenchi di byte memorizzati, come questi: +Questa è ancora una semplificazione: gli interi e gli zeri negli schemi precedenti sarebbero in realtà liste di byte memorizzate, in questo modo: ``` [ - 10100101000000000000000000000000 # codifica endiana piccola di `number1` - 10110111000000000000000000000000 # codifica endiana piccola di `number2`. - 10010000000000000000000000000000 # Lo "offset" che indica dove inizia il valore di `vector` (16 endiano piccolo). - 10010110000000000000000000000000 # codifica endiana piccola di `number3`. - 10000001100000101000001110000100 # Il valore reale del campo `bytes`. + 10100101000000000000000000000000 # little-endian encoding of `number1` + 10110111000000000000000000000000 # little-endian encoding of `number2`. + 10010000000000000000000000000000 # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 10010110000000000000000000000000 # little-endian encoding of `number3`. + 10000001100000101000001110000100 # The actual value of the `bytes` field. ] ``` -Quindi i valori reali per i tipi di lunghezza variabile sono memorizzati in uno heap alla fine dell'oggetto serializzato, con i propri offset memorizzati nelle posizioni corrette nell'elenco di campi ordinato. +Quindi i valori effettivi per i tipi a lunghezza variabile sono memorizzati in un heap alla fine dell'oggetto serializzato con i loro offset memorizzati nelle loro posizioni corrette nella lista ordinata dei campi. -Esistono anche dei casi speciali che richiedono un trattamento specifico, come il tipo `BitList` che richiede che sia aggiunto un limite di lunghezza durante la serializzazione, e poi eliminato durante la deserializzazione. I dettagli completi sono disponibili nella [specifica SSZ](https://github.com/ethereum/consensus-specs/blob/master/ssz/simple-serialize.md). +Ci sono anche alcuni casi speciali che richiedono un trattamento specifico, come il tipo `BitList` che richiede l'aggiunta di un limite di lunghezza durante la serializzazione e la sua rimozione durante la deserializzazione. I dettagli completi sono disponibili nelle [specifiche SSZ](https://github.com/ethereum/consensus-specs/blob/master/ssz/simple-serialize.md). ### Deserializzazione {#deserialization} -Per deserializzare questo oggetto serve lo schema. Lo schema definisce la disposizione precisa dei dati serializzati, così che ogni elemento specifico sia deserializzabile a partire da un blob di byte in un oggetto significativo con gli elementi aventi il tipo, valore, dimensione e posizione giusti. È lo schema che dice al deserializzatore quali valori sono valori reali e quali sono offset. Tutti i nomi del campo scompaiono quando un oggetto è serializzato, ma sono reistanziati al momento della deserializzazione secondo lo schema. +Per deserializzare questo oggetto è necessario lo schema. Lo schema definisce il layout preciso dei dati serializzati in modo che ogni elemento specifico possa essere deserializzato da un blob di byte in un oggetto significativo con gli elementi che hanno il tipo, il valore, la dimensione e la posizione corretti. È lo schema che dice al deserializzatore quali valori sono valori effettivi e quali sono offset. Tutti i nomi dei campi scompaiono quando un oggetto viene serializzato, ma vengono reistanziati durante la deserializzazione in base allo schema. -Vedi [ssz.dev](https://www.ssz.dev/overview) per una spiegazione interattiva a riguardo. +Consulta [ssz.dev](https://www.ssz.dev/overview) per una spiegazione interattiva al riguardo. -## Merkle-zzazione {#merkleization} +## Merkleizzazione {#merkleization} -L’oggetto serializzato SSZ può essere poi merkle-zzato, ovvero trasformato in una rappresentazione dell'albero di Merkle di alcuni dati. Per prima cosa, è determinato il numero di blocchi da 32 byte nell'oggetto serializzato. Queste sono le "foglie" dell'albero. Il numero totale di foglie deve essere una potenza di 2, così che l'hashing delle foglie produca infine un albero-radice con un unico hash. Se questo non avviene naturalmente, sono aggiunte delle foglie aggiuntive contenenti 32 byte di zeri. In diagramma: +Questo oggetto serializzato SSZ può quindi essere merkleizzato, ovvero trasformato in una rappresentazione ad albero di Merkle degli stessi dati. Innanzitutto, viene determinato il numero di blocchi da 32 byte nell'oggetto serializzato. Queste sono le "foglie" dell'albero. Il numero totale di foglie deve essere una potenza di 2 in modo che l'hashing delle foglie produca alla fine una singola radice dell'albero di hash (hash-tree-root). Se questo non è naturalmente il caso, vengono aggiunte foglie aggiuntive contenenti 32 byte di zeri. Schematicamente: ``` - hash albero radice + hash tree root / \ / \ / \ / \ - hash delle foglie hash delle foglie - 1 e 2 3 e 4 + hash of leaves hash of leaves + 1 and 2 3 and 4 / \ / \ / \ / \ / \ / \ leaf1 leaf2 leaf3 leaf4 ``` -Ci sono anche casi in cui le foglie dell'albero non si distribuiscono naturalmente e uniformemente come nell'esempio di cui sopra. Ad esempio, la foglia 4 potrebbe essere un contenitore con diversi elementi che richiedono che sia aggiunta ulteriore "profondità" all'albero di Merkle, creando un albero non equilibrato. +Ci sono anche casi in cui le foglie dell'albero non si distribuiscono naturalmente in modo uniforme come nell'esempio precedente. Ad esempio, la foglia 4 potrebbe essere un contenitore con più elementi che richiedono l'aggiunta di ulteriore "profondità" all'albero di Merkle, creando un albero irregolare. -Invece di far riferimento a questi elementi dell'albero come foglia X, nodo X, ecc., possiamo dare loro indici generalizzati che iniziano con radice = 1, contando da sinistra a destra per ogni livello. Questo è l'indice generalizzato spiegato sopra. Ogni elemento nell'elenco serializzato ha un indice generalizzato pari a `2**depth + idx`, dove idx è la posizione indicizzata a zero nell'oggetto serializzato e "depth" è il numero di livelli nell'albero di Merkle, determinabile come il logaritmo a base due del numero di elementi (foglie). +Invece di riferirci a questi elementi dell'albero come foglia X, nodo X ecc., possiamo assegnare loro indici generalizzati, iniziando con radice = 1 e contando da sinistra a destra lungo ogni livello. Questo è l'indice generalizzato spiegato sopra. Ogni elemento nella lista serializzata ha un indice generalizzato uguale a `2**depth + idx` dove idx è la sua posizione indicizzata a zero nell'oggetto serializzato e la profondità (depth) è il numero di livelli nell'albero di Merkle, che può essere determinato come il logaritmo in base due del numero di elementi (foglie). ## Indici generalizzati {#generalized-indices} -Un indice generalizzato è un intero rappresentante un nodo in un albero di Merkle binario, in cui ogni nodo ha un indice generalizzato `2 ** depth + index in row`. +Un indice generalizzato è un intero che rappresenta un nodo in un albero di Merkle binario in cui ogni nodo ha un indice generalizzato `2 ** depth + index in row`. ``` 1 --depth = 0 2**0 + 0 = 1 @@ -122,16 +122,17 @@ Un indice generalizzato è un intero rappresentante un nodo in un albero di Merk ``` -Questa rappresentazione produce un indice del nodo per ogni dato nell'albero di Merkle. +Questa rappresentazione produce un indice di nodo per ogni pezzo di dati nell'albero di Merkle. -## Prove multiple {#multiproofs} +## Multiprove {#multiproofs} -Fornire l'elenco di indici generalizzati rappresentanti un elemento specifico ci consente di verificarlo rispetto all'hash albero-radice. Questa radice è la nostra versione accettata della realtà. Ogni dato che ci è fornito è verificabile rispetto a quella realtà inserendolo al posto giusto nell'albero di Merkle (determinato dal suo indice generalizzato) e osservando che la radice rimane costante. Ci sono delle funzioni nelle specifiche, [qui](https://github.com/ethereum/consensus-specs/blob/master/ssz/merkle-proofs.md#merkle-multiproofs), che mostrano come calcolare la serie minima di nodi necessari a verificare i contenuti di una serie particolare di indici generalizzati. +Fornire la lista di indici generalizzati che rappresentano un elemento specifico ci consente di verificarlo rispetto alla radice dell'albero di hash (hash-tree-root). Questa radice è la nostra versione accettata della realtà. Qualsiasi dato ci venga fornito può essere verificato rispetto a quella realtà inserendolo nel posto giusto nell'albero di Merkle (determinato dal suo indice generalizzato) e osservando che la radice rimane costante. Ci sono funzioni nelle specifiche [qui](https://github.com/ethereum/consensus-specs/blob/master/ssz/merkle-proofs.md#merkle-multiproofs) che mostrano come calcolare l'insieme minimo di nodi necessari per verificare i contenuti di un particolare insieme di indici generalizzati. -Ad esempio, per verificare i dati nell'indice 9 nell'albero seguente, abbiamo bisogno dell'hash dei dati agli indici 8, 9, 5, 3, 1. L'hash di (8,9) dovrebbe equivalere all'hash (4), il cui hash con 5 produce 2, il cui hash con 3 produce la radice dell'albero 1. Se venissero forniti dei dati errati per 9, la radice cambierebbe: lo rileveremmo e renderemmo impossibile verificare il ramo. +Ad esempio, per verificare i dati nell'indice 9 nell'albero sottostante, abbiamo bisogno dell'hash dei dati agli indici 8, 9, 5, 3, 1. +L'hash di (8,9) dovrebbe essere uguale all'hash (4), che esegue l'hashing con 5 per produrre 2, che esegue l'hashing con 3 per produrre la radice dell'albero 1. Se venissero forniti dati errati per 9, la radice cambierebbe: lo rileveremmo e non riusciremmo a verificare il ramo. ``` -* = dati necessari per generare la prova +* = data required to generate proof 1* 2 3* @@ -143,7 +144,7 @@ Ad esempio, per verificare i dati nell'indice 9 nell'albero seguente, abbiamo bi ## Letture consigliate {#further-reading} - [Aggiornare Ethereum: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) -- [Aggiornare Ethereum: Merkle-zzazione](https://eth2book.info/altair/part2/building_blocks/merkleization) -- [Implementazioni di SSZ](https://github.com/ethereum/consensus-specs/issues/2138) -- [Calcolatrice SSZ](https://simpleserialize.com/) -- [SSZ.dev](https://www.ssz.dev/) +- [Aggiornare Ethereum: Merkleizzazione](https://eth2book.info/altair/part2/building_blocks/merkleization) +- [Implementazioni SSZ](https://github.com/ethereum/consensus-specs/issues/2138) +- [Calcolatore SSZ](https://simpleserialize.com/) +- [SSZ.dev](https://www.ssz.dev/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md b/public/content/translations/it/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md new file mode 100644 index 00000000000..983afc3358f --- /dev/null +++ b/public/content/translations/it/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md @@ -0,0 +1,199 @@ +--- +title: Definizione dell'archiviazione dei segreti di Web3 +description: Definizione formale per l'archiviazione dei segreti di web3 +lang: it +sidebarDepth: 2 +--- + +Per far funzionare la tua app su Ethereum, puoi usare l'oggetto web3 fornito dalla libreria web3.js. Dietro le quinte comunica con un nodo locale tramite chiamate RPC. [web3](https://github.com/ethereum/web3.js/) funziona con qualsiasi nodo Ethereum che espone un livello RPC. + +`web3` contiene l'oggetto `eth` - web3.eth. + +```js +var fs = require("fs") +var recognizer = require("ethereum-keyfile-recognizer") + +fs.readFile("keyfile.json", (err, data) => { + var json = JSON.parse(data) + var result = recognizer(json) +}) + +/* * risultato + * [ 'web3', 3 ] keyfile web3 (v3) + * [ 'ethersale', undefined ] keyfile Ethersale + * null keyfile non valido */ + + + + + +``` + +Questo documento descrive la **versione 3** della Definizione dell'Archiviazione dei Segreti di Web3 (Web3 Secret Storage Definition). + +## Definizione {#definition} + +L'effettiva codifica e decodifica del file rimane in gran parte invariata rispetto alla versione 1, tranne per il fatto che l'algoritmo crittografico non è più fisso su AES-128-CBC (AES-128-CTR è ora il requisito minimo). La maggior parte dei significati/algoritmi sono simili alla versione 1, tranne `mac`, che è fornito come SHA3 (keccak-256) delle concatenazioni dei secondi 16 byte da sinistra della chiave derivata insieme all'intero `ciphertext`. + +I file delle chiavi segrete sono archiviati direttamente in `~/.web3/keystore` (per i sistemi Unix-like) e `~/AppData/Web3/keystore` (per Windows). Possono avere qualsiasi nome, ma una buona convenzione è `.json`, dove `` è l'UUID a 128 bit assegnato alla chiave segreta (un proxy che preserva la privacy per l'indirizzo della chiave segreta). + +Tutti questi file hanno una password associata. Per derivare la chiave segreta di un dato file `.json`, prima deriva la chiave di crittografia del file; questo viene fatto prendendo la password del file e passandola attraverso una funzione di derivazione della chiave come descritto dalla chiave `kdf`. I parametri statici e dinamici dipendenti dalla KDF per la funzione KDF sono descritti nella chiave `kdfparams`. + +PBKDF2 deve essere supportato da tutte le implementazioni minimamente conformi, indicato tramite: + +- `kdf`: `pbkdf2` + +Per PBKDF2, i kdfparams includono: + +- `prf`: Deve essere `hmac-sha256` (potrebbe essere esteso in futuro); +- `c`: numero di iterazioni; +- `salt`: salt passato a PBKDF; +- `dklen`: lunghezza per la chiave derivata. Deve essere >= 32. + +Una volta derivata la chiave del file, dovrebbe essere verificata attraverso la derivazione del MAC. Il MAC dovrebbe essere calcolato come l'hash SHA3 (keccak-256) dell'array di byte formato come le concatenazioni dei secondi 16 byte da sinistra della chiave derivata con i contenuti della chiave `ciphertext`, ovvero: + +```js +KECCAK(DK[16..31] ++ ) +``` + +(dove `++` è l'operatore di concatenazione) + +Questo valore dovrebbe essere confrontato con i contenuti della chiave `mac`; se sono diversi, dovrebbe essere richiesta una password alternativa (o l'operazione annullata). + +Dopo che la chiave del file è stata verificata, il testo cifrato (la chiave `ciphertext` nel file) può essere decrittografato utilizzando l'algoritmo di crittografia simmetrica specificato dalla chiave `cipher` e parametrizzato tramite la chiave `cipherparams`. Se la dimensione della chiave derivata e la dimensione della chiave dell'algoritmo non corrispondono, i byte più a destra, riempiti di zeri, della chiave derivata dovrebbero essere usati come chiave per l'algoritmo. + +Tutte le implementazioni minimamente conformi devono supportare l'algoritmo AES-128-CTR, indicato tramite: + +- `cipher: aes-128-ctr` + +Questo cifrario accetta i seguenti parametri, forniti come chiavi alla chiave cipherparams: + +- `iv`: vettore di inizializzazione a 128 bit per il cifrario. + +La chiave per il cifrario sono i 16 byte più a sinistra della chiave derivata, ovvero `DK[0..15]` + +La creazione/crittografia di una chiave segreta dovrebbe essere essenzialmente l'inverso di queste istruzioni. Assicurati che `uuid`, `salt` e `iv` siano effettivamente casuali. + +Oltre al campo `version`, che dovrebbe fungere da identificatore "rigido" della versione, le implementazioni possono anche utilizzare `minorversion` per tracciare modifiche più piccole e non bloccanti al formato. + +## Vettori di Test {#test-vectors} + +Dettagli: + +- `Indirizzo`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b` +- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67` +- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6` +- `Password`: `testpassword` +- `Segreto`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d` + +### PBKDF2-SHA-256 {#PBKDF2-SHA-256} + +Vettore di test che utilizza `AES-128-CTR` e `PBKDF2-SHA-256`: + +Contenuti del file `~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json`: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6087dab2f9fdbbfaddc31a909735c1e6" + }, + "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", + "kdf": "pbkdf2", + "kdfparams": { + "c": 262144, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" + }, + "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Intermedi**: + +`Chiave derivata`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551` +`Corpo del MAC`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46` +`MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2` +`Chiave del cifrario`: `f06d69cdc7da0faffb1008270bca38f5` + +### Scrypt {#scrypt} + +Vettore di test che utilizza AES-128-CTR e Scrypt: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "740770fce12ce862af21264dab25f1da" + }, + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" + }, + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**Intermedi**: + +`Chiave derivata`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` +`Corpo del MAC`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` +`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` +`Chiave del cifrario`: `7446f59ecc301d2d79bc3302650d8a5c` + +## Modifiche dalla Versione 1 {#alterations-from-v2} + +Questa versione corregge diverse incongruenze con la versione 1 pubblicata [qui](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst). In breve queste sono: + +- L'uso delle maiuscole è ingiustificato e incoerente (scrypt minuscolo, Kdf misto, MAC maiuscolo). +- L'indirizzo non è necessario e compromette la privacy. +- `Salt` è intrinsecamente un parametro della funzione di derivazione della chiave e merita di esservi associato, non alla crittografia in generale. +- _SaltLen_ non è necessario (basta derivarlo da Salt). +- La funzione di derivazione della chiave è fornita, eppure l'algoritmo crittografico è fissato rigidamente. +- `Version` è intrinsecamente numerico eppure è una stringa (il controllo delle versioni strutturato sarebbe possibile con una stringa, ma può essere considerato fuori ambito per un formato di file di configurazione che cambia raramente). +- `KDF` e `cipher` sono concettualmente concetti fratelli eppure sono organizzati in modo diverso. +- `MAC` è calcolato attraverso un dato indipendente dagli spazi vuoti(!) + +Sono state apportate modifiche al formato per fornire il seguente file, funzionalmente equivalente all'esempio fornito nella pagina precedentemente collegata: + +```json +{ + "crypto": { + "cipher": "aes-128-cbc", + "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b", + "cipherparams": { + "iv": "16d67ba0ce5a339ff2f07951253e6ba8" + }, + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91" + }, + "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd", + "version": 1 + }, + "id": "0498f19a-59db-4d54-ac95-33901b4f1870", + "version": 2 +} +``` + +## Modifiche dalla Versione 2 {#alterations-from-v2} + +La versione 2 era una prima implementazione in C++ con una serie di bug. Tutti gli elementi essenziali rimangono invariati rispetto ad essa. \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/it/developers/docs/design-and-ux/dex-design-best-practice/index.md index c63da6300fd..3b046faed45 100644 --- a/public/content/translations/it/developers/docs/design-and-ux/dex-design-best-practice/index.md +++ b/public/content/translations/it/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -1,220 +1,216 @@ --- -title: Buone pratiche di progettazione di borse decentralizzate (DEX) +title: Migliori pratiche di progettazione per gli exchange decentralizzati (DEX) description: Una guida che spiega le decisioni UX/UI per lo scambio di token. lang: it --- -Dal lancio di Uniswap nel 2018, sono state lanciate centinaia di borse decentralizzate in decine di catene differenti. -Molte di queste hanno introdotto nuovi elementi o aggiunto i propri tocchi, ma l'interfaccia è rimasta per lo più la stessa. +Dal lancio di Uniswap nel 2018, sono stati lanciati centinaia di exchange decentralizzati su dozzine di catene diverse. +Molti di questi hanno introdotto nuovi elementi o aggiunto il proprio tocco personale, ma l'interfaccia è rimasta generalmente la stessa. -Una delle ragioni è la [Legge di Jakob](https://lawsofux.com/jakobs-law/): +Una ragione di ciò è la [Legge di Jakob](https://lawsofux.com/jakobs-law/): -> Gli utenti trascorrono la maggior parte del tempo su altri siti. Ciò significa che gli utenti preferiscono che il tuo sito funzioni proprio come gli altri che già conoscono. +> Gli utenti trascorrono la maggior parte del loro tempo su altri siti. Ciò significa che gli utenti preferiscono che il tuo sito funzioni allo stesso modo di tutti gli altri siti che già conoscono. -Grazie ai primi innovatori come Uniswap, Pancakeswap e Sushiswap, gli utenti della DeFi hanno un'idea collettiva dell'aspetto di una DEX. -Per questo motivo adesso sta emergendo qualcosa di simile alle "buone pratiche". Osserviamo una sempre maggiore standardizzazione delle decisioni di progettazione nei vari siti. L'evoluzione delle DEX può essere visto come un grande esempio di test in corso d'opera. Le cose che hanno funzionato rimangono, mentre quelle che non hanno funzionato vengono scartate. C'è ancora spazio per la personalità, ma ci sono alcuni standard a cui una DEX si deve conformare. - -Questo articolo è il riassunto di: +Grazie ai primi innovatori come Uniswap, Pancakeswap e Sushiswap, gli utenti della DeFi hanno un'idea collettiva di come sia fatto un DEX. +Per questo motivo, sta ora emergendo qualcosa di simile a una "migliore pratica". Vediamo sempre più decisioni di progettazione standardizzate tra i siti. Puoi vedere l'evoluzione dei DEX come un gigantesco esempio di test dal vivo. Le cose che hanno funzionato sono rimaste, quelle che non hanno funzionato sono state scartate. C'è ancora spazio per la personalità, ma ci sono determinati standard a cui un DEX dovrebbe conformarsi. +Questo articolo è un riassunto di: - cosa includere -- come renderlo utilizzabile e possibile -- i modi principali di personalizzare la progettazione - -Tutti i wireframe di esempio sono stati realizzati specificatamente per questo articolo, anche se si basano su progetti reali. +- come renderlo il più utilizzabile possibile +- i modi principali per personalizzare il design -In fondo è incluso anche il kit di Figma: puoi usarlo liberamente per velocizzare i tuoi wireframe! +Tutti i wireframe di esempio sono stati realizzati specificamente per questo articolo, sebbene siano tutti basati su progetti reali. -## Anatomia di base di uan DEX {#basic-anatomy-of-a-dex} +Il kit Figma è incluso anche in fondo: sentiti libero di usarlo e velocizzare i tuoi wireframe! -L'interfaccia utente (UI) in genere contiene tre elementi: +## Anatomia di base di un DEX {#basic-anatomy-of-a-dex} +L'interfaccia utente (UI) contiene generalmente tre elementi: 1. Modulo principale 2. Pulsante 3. Pannello dei dettagli -![UI di DEX generica, che mostra i tre elementi principali](./1.png) - -## Varianti {#variations} +![UI generica di un DEX, che mostra i tre elementi principali](./1.png) -Questo sarà un tema ricorrente in questo articolo, ma ci sono modi diversi con i quali questi elementi possono essere organizzati. I "pannello dei dettagli" può essere: +## Variazioni {#variations} +Questo sarà un tema comune in questo articolo, ma ci sono vari modi diversi in cui questi elementi possono essere organizzati. Il "pannello dei dettagli" può essere: - Sopra il pulsante - Sotto il pulsante -- Nascosto in un pannello accordion -- E/o in una finestra modale “anteprima” - -N.B. Una finestra modale "anteprima" è facoltativa ma diventa essenziale se si stanno mostrando pochissimi dettagli sull'UI principale. +- Nascosto in un pannello a fisarmonica +- E/o su un modale di "anteprima" + +N.B. Un modale di "anteprima" è opzionale, ma se stai mostrando pochissimi dettagli sull'UI principale, diventa essenziale. ## Struttura del modulo principale {#structure-of-the-main-form} -Questo è il riquadro dove si sceglie di fatto quale token scambiare. Il componente consiste in un campo di input e un piccolo pulsante sulla stessa riga. +Questo è il riquadro in cui scegli effettivamente quale token vuoi scambiare. Il componente è costituito da un campo di input e da un piccolo pulsante in una riga. -Le DEX di solito mostrano ulteriori dettagli su una riga sopra e una sotto, anche se questo può essere configurato diversamente. +I DEX in genere mostrano dettagli aggiuntivi in una riga sopra e una riga sotto, sebbene ciò possa essere configurato diversamente. -![Riga di input, con una riga di dettaglio sopra e una sotto](./2.png) +![Riga di input, con una riga di dettagli sopra e sotto](./2.png) -## Varianti {#variations2} +## Variazioni {#variations2} -Qui sono mostrate due varianti della UI: una senza bordi, creando un design molto aperto, e una dove la riga di input ha un bordo, creando un focus su quell'elemento. +Qui sono mostrate due variazioni dell'UI; una senza alcun bordo, creando un design molto aperto, e una in cui la riga di input ha un bordo, creando un focus su quell'elemento. -![Due varianti della UI del modulo principale](./3.png) +![Due variazioni dell'UI del modulo principale](./3.png) -Questa struttura di base permette di visualizzare **quattro informazioni chiave** nel design: una in ogni angolo. Se c'è solo una riga sopra/sotto, allora ci sono solo due punti focali. +Questa struttura di base consente di mostrare **quattro informazioni chiave** nel design: una in ogni angolo. Se c'è solo una riga superiore/inferiore, allora ci sono solo due posti. -Durante l'evoluzione della DeFi, qui sono stati inclusi molti elementi diversi. +Durante l'evoluzione della DeFi, qui sono state incluse molte cose diverse. ## Informazioni chiave da includere {#key-info-to-include} - Saldo nel portafoglio -- Pulsante max -- Equivalente in valuta legale -- Impatto del prezzo sull'importo "ricevuto" - -Agli albori della DeFi, l'equivalente in valuta legale era spesso mancante. Se si sta costruendo qualsiasi progetto Web3, è essenziale che sia mostrato un equivalente in valuta legale. Gli utenti pensano ancora in termini di valuta locale, quindi questo dato dovrebbe essere incluso per adeguarsi ai modelli mentali del mondo reale. +- Pulsante Max +- Equivalente in valuta fiat +- Impatto sul prezzo dell'importo "ricevuto" -Nel secondo campo (quello dove si sceglie il token per il quale effettuare lo scambio), vicino all'importo in valuta legale è possibile includere anche l'impatto del prezzo, calcolando la differenza tra l'importo dell'input e la stima dell'importo dell'output. Questo è un dettaglio piuttosto utile da includere. +Agli albori della DeFi, l'equivalente in valuta fiat era spesso assente. Se stai costruendo qualsiasi tipo di progetto web3, è essenziale che venga mostrato un equivalente in valuta fiat. Gli utenti pensano ancora in termini di valute locali, quindi per corrispondere ai modelli mentali del mondo reale, questo dovrebbe essere incluso. -I pulsanti di percentuale (ad es. 25%, 50%, 75%) possono essere una funzione utile, ma occupano più spazio, aggiungono più chiamate all'azione e aumentano il carico mentale. Lo stesso vale per i cursori percentuali. Alcune di queste decisioni sulla UI dipendono dal proprio brand e dal proprio tipo di utente. +Nel secondo campo (quello in cui scegli il token verso cui stai scambiando) puoi anche includere l'impatto sul prezzo accanto all'importo in valuta fiat, calcolando la differenza tra l'importo di input e gli importi di output stimati. Questo è un dettaglio piuttosto utile da includere. -Sotto il modulo principale possono essere visualizzati dettagli extra. Dato che questo tipo di informazione è soprattutto per gli utenti avanzati, ha senso: +I pulsanti percentuali (ad es. 25%, 50%, 75%) possono essere una funzionalità utile, ma occupano più spazio, aggiungono più inviti all'azione e aumentano il carico mentale. Lo stesso vale per i cursori percentuali. Alcune di queste decisioni sull'UI dipenderanno dal tuo marchio e dal tuo tipo di utente. -- tenerli il più minimali possibile, oppure; -- nasconderli nel pannello accordion +Dettagli extra possono essere mostrati sotto il modulo principale. Poiché questo tipo di informazioni è principalmente per utenti professionisti, ha senso: +- mantenerlo il più minimale possibile, oppure; +- nasconderlo in un pannello a fisarmonica -![Dettagli visualizzati negli angoli del modulo principale](./4.png) +![Dettagli mostrati negli angoli di quel modulo principale](./4.png) ## Informazioni extra da includere {#extra-info-to-include} -- Prezzo dei token -- Scivolamento +- Prezzo del token +- Slippage - Minimo ricevuto - Output previsto -- Impatto del prezzo +- Impatto sul prezzo - Stima del costo del gas - Altre commissioni -- Instradamento degli ordini +- Instradamento dell'ordine -Probabilmente alcuni di questi dettagli potrebbero essere facoltativi. +Probabilmente, alcuni di questi dettagli potrebbero essere opzionali. -L'instradamento degli ordini è interessante, ma non fa molta differenza per la maggior parte degli utenti. +L'instradamento dell'ordine è interessante, ma non fa molta differenza per la maggior parte degli utenti. -Altri dettagli ripetono semplicemente la stessa cosa in modi diversi. Per esempio "minimo ricevuto" e "scivolamento" sono due facce della stessa medaglia. Se si ha lo scivolamento fissato all'1%, allora il minimo che ci si può aspettare di ricevere = output previsto -1%. Alcune UI visualizzeranno la quantità prevista, la quantità minima e lo scivolamento… Il che è utile ma forse eccessivo. +Alcuni altri dettagli stanno semplicemente ribadendo la stessa cosa in modi diversi. Ad esempio "minimo ricevuto" e "slippage" sono due facce della stessa medaglia. Se hai lo slippage impostato all'1%, allora il minimo che puoi aspettarti di ricevere = output previsto-1%. Alcune UI mostreranno l'importo previsto, l'importo minimo e lo slippage... Il che è utile ma forse eccessivo. -Molti utenti lasceranno in ogni caso lo scivolamento predefinito. +La maggior parte degli utenti lascerà comunque lo slippage predefinito. -L'"impatto del prezzo" è spesso visualizzato tra parentesi vicino all'equivalente in valuta legale nel campo "a". Questo è un fantastico dettaglio UX da aggiungere – ma se viene visualizzato qui, occorre davvero che sia mostrato di nuovo anche sotto? E poi ancora una volta su una schermata di anteprima? +L'"impatto sul prezzo" è spesso mostrato tra parentesi accanto all'equivalente in valuta fiat nel campo "verso". Questo è un ottimo dettaglio UX da aggiungere, ma se viene mostrato qui, ha davvero bisogno di essere mostrato di nuovo sotto? E poi di nuovo in una schermata di anteprima? -A molti utenti (specialmente quelli che scambiano piccole cifre) non interessano questi dettagli; vogliono semplicemente immettere un numero e cliccare su scambia. +A molti utenti (specialmente quelli che scambiano piccole somme) non importerà di questi dettagli; inseriranno semplicemente un numero e premeranno scambia. ![Alcuni dettagli mostrano la stessa cosa](./5.png) -I dettagli precisi che saranno visualizzati dipenderà dal proprio pubblico e dall'impatto che si vuole abbia la propria applicazione. +Esattamente quali dettagli vengono mostrati dipenderà dal tuo pubblico e dall'atmosfera che vuoi che l'app abbia. -Se si decide di includere la tolleranza di scivolamento nel pannello dei dettagli, dovrebbe anche essere resa modificabile direttamente da lì. Questo è un buon esempio di "acceleratore"; un trucco per una UX pulita che può velocizzare il flusso degli utenti esperti senza inficiare l'usabilità generale dell'applicazione. +Se includi la tolleranza allo slippage nel pannello dei dettagli, dovresti anche renderla modificabile direttamente da qui. Questo è un buon esempio di "acceleratore"; un trucco UX pulito che può velocizzare i flussi degli utenti esperti, senza influire sull'usabilità generale dell'app. -![Lo scivolamento può essere controllato dal pannello dei dettagli](./6.png) +![Lo slippage può essere controllato dal pannello dei dettagli](./6.png) -È una buona idea pensare attentamente non solo a un'informazione specifica in una schermata, ma all'intero flusso come segue: -Immettere numeri nel Modulo principale → Rivedere i dettagli → Fare clic sulla Schermata di anteprima (se prevista). -Il pannello dei dettagli dev'essere sempre visibile o l'utente deve cliccare per ampliarlo? -Andrebbe creata frizione aggiungendo una schermata di anteprima? Questo obbliga l'utente a rallentare e valutare lo scambio, il che può essere utile. Ma desidera vedere di nuovo le stesse informazioni? Qual è la più importante a questo punto? +È una buona idea pensare attentamente non solo a una specifica informazione su una schermata, ma all'intero flusso: +Inserimento dei numeri nel Modulo Principale → Scansione dei Dettagli → Clic sulla Schermata di Anteprima (se hai una schermata di anteprima). +Il pannello dei dettagli dovrebbe essere sempre visibile o l'utente deve cliccarlo per espanderlo? +Dovresti creare attrito aggiungendo una schermata di anteprima? Questo costringe l'utente a rallentare e considerare il proprio scambio, il che può essere utile. Ma vogliono vedere di nuovo tutte le stesse informazioni? Cosa è più utile per loro a questo punto? -## Opzioni di progettazione {#design-options} +## Opzioni di design {#design-options} -Come detto, molto di tutto ciò dipende dal proprio stile personale -Chi è il proprio utente? -Qual è il proprio marchio? -Si desidera un'interfaccia avanzata che visualizzi ogni dettaglio o qualcosa di minimalista? -Anche se si mira agli utenti avanzati che vogliono tutte le informazioni possibili, non bisogna dimenticare le parole sagge di Alan Cooper: +Come accennato, molto di questo si riduce al tuo stile personale +Chi è il tuo utente? +Qual è il tuo marchio? +Vuoi un'interfaccia "pro" che mostri ogni dettaglio o vuoi essere minimalista? +Anche se punti agli utenti pro che vogliono tutte le informazioni possibili, dovresti comunque ricordare le sagge parole di Alan Cooper: -> Non importa quanto bella o di tendenza sia la tua interfaccia, sarebbe ancora più bella se fosse ridotta. +> Non importa quanto sia bella, non importa quanto sia fantastica la tua interfaccia, sarebbe meglio se ce ne fosse di meno. ### Struttura {#structure} -- token sulla sinistra, o token sulla destra +- token a sinistra o token a destra - 2 righe o 3 - dettagli sopra o sotto il pulsante -- dettagli ampliati, ridotti a icona o non visualizzati +- dettagli espansi, ridotti a icona o non mostrati -### Stile dei componenti {#component-style} +### Stile del componente {#component-style} - vuoto -- bordato -- pieno +- contornato +- riempito -Da un punto di vista puramente UX, lo stile della UI è meno importante di quanto si pensi. Le tendenze vanno e vengono ciclicamente e molte preferenze sono soggettive. +Da un punto di vista puramente UX, lo stile dell'UI conta meno di quanto pensi. Le tendenze visive vanno e vengono in cicli e gran parte delle preferenze è soggettiva. -Il modo più facile per farsi un'idea – e pensare alle varie configurazioni diverse – è dare un'occhiata ad alcuni esempi e poi sperimentare. +Il modo più semplice per farsi un'idea di questo - e pensare alle varie configurazioni diverse - è dare un'occhiata ad alcuni esempi e poi fare qualche esperimento da soli. -Il kit di Figma incluso contiene componenti vuoti, bordati e pieni. +Il kit Figma incluso contiene componenti vuoti, contornati e riempiti. -Dai un'occhiata ai seguenti esempi per vedere modi diversi per combinarli: +Dai un'occhiata agli esempi seguenti per vedere i diversi modi in cui puoi mettere tutto insieme: -![3 righe in uno stile pieno](./7.png) +![3 righe in uno stile riempito](./7.png) -![3 righe in uno stile bordato](./8.png) +![3 righe in uno stile contornato](./8.png) ![2 righe in uno stile vuoto](./9.png) -![3 righe in uno stile bordato, con un pannello dei dettagli](./10.png) +![3 righe in uno stile contornato, con un pannello dei dettagli](./10.png) -![3 righe con la riga di input in uno stile bordato](./11.png) +![3 righe con la riga di input in uno stile contornato](./11.png) -![2 righe in uno stile pieno](./12.png) +![2 righe in uno stile riempito](./12.png) -## Ma da quale parte dovrebbe andare il token? {#but-which-side-should-the-token-go-on} +## Ma da che parte dovrebbe andare il token? {#but-which-side-should-the-token-go-on} -Il punto è che probabilmente non farà molta differenza in quanto a usabilità. Ci sono alcune cose da tenere comunque presenti che potrebbero influenzarti in un modo o nell'altro. +Il punto fondamentale è che probabilmente non fa un'enorme differenza per l'usabilità. Ci sono alcune cose da tenere a mente, tuttavia, che potrebbero farti propendere da una parte o dall'altra. -È abbastanza interessante vedere come la moda cambia con il tempo. Uniswap inizialmente aveva il token sulla sinistra ma lo ha poi spostato sulla destra. Anche Sushiswap fece questo cambiamento durante un aggiornamento di design. Molti ma non tutti i protocolli hanno fatto altrettanto. +È stato moderatamente interessante vedere la moda cambiare nel tempo. Uniswap inizialmente aveva il token a sinistra, ma da allora lo ha spostato a destra. Anche Sushiswap ha apportato questa modifica durante un aggiornamento del design. La maggior parte dei protocolli, ma non tutti, ha seguito l'esempio. -La convenzione finanziaria mette tradizionalmente il simbolo della valuta prima del numero, ad es. $50, €50, £50, ma _diciamo_ 50 dollari, 50 euro, 50 sterline. +La convenzione finanziaria tradizionalmente mette il simbolo della valuta prima del numero, ad es. $50, €50, £50, ma noi *diciamo* 50 dollari, 50 euro, 50 sterline. -Per l'utente generico – specialmente qualcuno che legge da sinistra a destra, dall'alto al basso – il token sulla destra risulta probabilmente più naturale. +Per l'utente generico - specialmente qualcuno che legge da sinistra a destra, dall'alto verso il basso - il token a destra probabilmente sembra più naturale. -![Una UI con i token sulla sinistra](./13.png) +![Un'UI con i token a sinistra](./13.png) -Mettere il token sulla sinistra e tutti i numeri sulla destra dà un aspetto piacevolmente simmetrico, il che è un vantaggio, ma c'è un altro lato negativo in questa disposizione. +Mettere il token a sinistra e tutti i numeri a destra sembra piacevolmente simmetrico, il che è un vantaggio, ma c'è un altro svantaggio in questo layout. -La legge della prossimità dice che gli elementi vicini sono percepiti come correlati. Di conseguenza vogliamo mettere gli elementi correlati gli uni vicini agli altri. Il saldo del token è direttamente correlato al token stesso e cambierà ogni volta che viene selezionato un nuovo token. Ha quindi più senso che il saldo dei token sia vicino al pulsante per selezionare il token. Potrebbe essere spostato sotto il token, ma in questo modo si romperebbe la simmetria della disposizione. +La legge della prossimità afferma che gli elementi vicini tra loro sono percepiti come correlati. Di conseguenza, vogliamo posizionare gli elementi correlati uno accanto all'altro. Il saldo del token è direttamente correlato al token stesso e cambierà ogni volta che viene selezionato un nuovo token. Ha quindi leggermente più senso che il saldo del token si trovi accanto al pulsante di selezione del token. Potrebbe essere spostato sotto il token, ma ciò rompe la simmetria del layout. -In definitiva ci sono pro e contro in entrambe le opzioni, ma è interessante come il trend sembri andare verso il token sulla destra. +In definitiva, ci sono pro e contro per entrambe le opzioni, ma è interessante come la tendenza sembri essere verso il token a destra. ## Comportamento del pulsante {#button-behavior} -Non inserire un pulsante separato per Approva. Inoltre, non prevedere clic separati per Approva. L'utente vuole Scambiare, quindi basta indicare "scambia" sul pulsante e avviare l'approvazione come primo passaggio. Una finestra modale può mostrare il progresso con uno stepper o con una semplice notifica che dica "tx 1 di 2 - approvazione in corso". +Non avere un pulsante separato per Approva. Inoltre, non avere un clic separato per Approva. L'utente vuole Scambiare, quindi scrivi semplicemente "scambia" sul pulsante e avvia l'approvazione come primo passo. Un modale può mostrare i progressi con un indicatore di passaggi, o una semplice notifica "tx 1 di 2 - approvazione in corso". -![Una UI con pulsanti separati per approvare e scambiare](./14.png) +![Un'UI con pulsanti separati per approva e scambia](./14.png) -![Una UI con un pulsante che indica approva](./15.png) +![Un'UI con un pulsante che dice approva](./15.png) -### Pulsanti come aiuto contestuale {#button-as-contextual-help} +### Pulsante come aiuto contestuale {#button-as-contextual-help} -Il pulsante può svolgere il doppio compito di avviso! +Il pulsante può svolgere una doppia funzione come avviso! -Questo è infatti un modello di progettazione abbastanza insolito fuori dal Web3, ma è diventato la norma al suo interno. Si tratta di un'ottima innovazione che fa risparmiare spazio e tiene focalizzata l'attenzione. +Questo è in realtà un modello di progettazione piuttosto insolito al di fuori del web3, ma è diventato standard al suo interno. Questa è una buona innovazione in quanto fa risparmiare spazio e mantiene l'attenzione focalizzata. -Se l'azione principale – SCAMBIO – non è disponibile a causa di un errore, la ragione può essere spiegata attraverso il pulsante, ad es.: +Se l'azione principale - SCAMBIA - non è disponibile a causa di un errore, il motivo può essere spiegato con il pulsante, ad es.: - cambia rete - connetti portafoglio -- errori vari +- vari errori -Il pulsante può anche venire **mappato all'azione** che deve essere eseguita. Per esempio, se un utente non può effettuare lo scambio perché è nella rete sbagliata, il pulsante dovrebbe dire "passa a Ethereum", e quando l'utente clicca sul pulsante la rete dovrebbe passare a Ethereum. Questo velocizza il flusso dell'utente in maniera significativa. +Il pulsante può anche essere **mappato all'azione** che deve essere eseguita. Ad esempio, se l'utente non può scambiare perché si trova sulla rete sbagliata, il pulsante dovrebbe dire "passa a Ethereum" e, quando l'utente fa clic sul pulsante, dovrebbe cambiare la rete in Ethereum. Questo accelera notevolmente il flusso dell'utente. ![Azioni chiave avviate dalla CTA principale](./16.png) -![Messaggio di errore visualizzato nella CTA principale](./17.png) +![Messaggio di errore mostrato all'interno della CTA principale](./17.png) -### Costruisci la tua con questo file di Figma {#build-your-own-with-this-figma-file} +## Costruisci il tuo con questo file Figma {#build-your-own-with-this-figma-file} -Grazie al duro lavoro di vari protocolli, la progettazione delle DEX è migliorata parecchio. Sappiamo di quali informazioni ha bisogno l'utente, come dobbiamo visualizzarle e come far andare più liscio possibile il flusso. -Speriamo che questo articolo ti abbia dato una solida panoramica dei principi UX. +Grazie al duro lavoro di molteplici protocolli, il design dei DEX è migliorato molto. Sappiamo di quali informazioni ha bisogno l'utente, come dovremmo mostrarle e come rendere il flusso il più fluido possibile. +Speriamo che questo articolo fornisca una solida panoramica dei principi UX. -Se desideri sperimentare, sentiti libero di utilizzare il kit wireframe di Figma. È tenuto il più semplice possibile ma ha abbastanza flessibilità per costruire la struttura di base in vari modi. +Se vuoi sperimentare, sentiti libero di usare il kit wireframe di Figma. È mantenuto il più semplice possibile, ma ha abbastanza flessibilità per costruire la struttura di base in vari modi. [Kit wireframe di Figma](https://www.figma.com/community/file/1393606680816807382/dex-wireframes-kit) -La DeFi continuerà a evolversi e ci sarà sempre margine di miglioramento. +La DeFi continuerà a evolversi e c'è sempre spazio per miglioramenti. -Buona fortuna! +Buona fortuna! \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/design-and-ux/heuristics-for-web3/index.md b/public/content/translations/it/developers/docs/design-and-ux/heuristics-for-web3/index.md index 2f0aaa2df51..d27bcfef1bc 100644 --- a/public/content/translations/it/developers/docs/design-and-ux/heuristics-for-web3/index.md +++ b/public/content/translations/it/developers/docs/design-and-ux/heuristics-for-web3/index.md @@ -1,138 +1,131 @@ --- title: 7 euristiche per la progettazione di interfacce Web3 -description: Principi per migliorare l'usabilità del Web3 +description: "Principi per migliorare l'usabilità del Web3" lang: it --- -Le euristiche di usabilità sono “regole pratiche” generali che puoi utilizzare per misurare l'usabilità del tuo sito. -Le 7 euristiche sono specificamente su misura per il Web3 e dovrebbero essere utilizzate insieme ai [10 principi generali per la progettazione dell'interazione](https://www.nngroup.com/articles/ten-usability-heuristics/) di Jakob Nielsen. +Le euristiche di usabilità sono "regole pratiche" generali che puoi utilizzare per misurare l'usabilità del tuo sito. +Le 7 euristiche qui presentate sono specificamente adattate per il Web3 e dovrebbero essere utilizzate insieme ai [10 principi generali per la progettazione dell'interazione](https://www.nngroup.com/articles/ten-usability-heuristics/) di Jakob Nielsen. ## Sette euristiche di usabilità per il web3 {#seven-usability-heuristics-for-web3} -1. I feedback seguono l'azione +1. Il feedback segue l'azione 2. Sicurezza e fiducia -3. L'informazione più importante è ovvia +3. Le informazioni più importanti sono ovvie 4. Terminologia comprensibile -5. Le azioni sono le più brevi possibili +5. Le azioni sono il più brevi possibile 6. Le connessioni di rete sono visibili e flessibili -7. Controllo dall'applicazione non dal portafoglio +7. Controllo dall'app, non dal portafoglio ## Definizioni ed esempi {#definitions-and-examples} ### 1. Il feedback segue l'azione {#feedback-follows-action} -**Dovrebbe essere ovvio quando qualcosa è successo o sta succedendo** +**Dovrebbe essere ovvio quando qualcosa è successo o sta succedendo.** -Gli utenti decidono i loro passi successivi basandosi sul risultato delle azioni precedenti. Perciò è essenziale che rimangano informati sullo stato del sistema. Questo è specialmente importante nel Web3 perché a volte le transazioni possono metterci poco tempo a impegnarsi sulla blockchain. Se non c'è un feedback che li informi di aspettare, gli utenti non sanno se è successo qualcosa o meno. +Gli utenti decidono i loro passi successivi in base al risultato dei passi precedenti. Pertanto è essenziale che rimangano informati sullo stato del sistema. Questo è particolarmente importante nel Web3 poiché le transazioni a volte possono richiedere un po' di tempo per essere registrate sulla blockchain. Se non c'è alcun feedback che li informi di aspettare, gli utenti non sono sicuri che sia successo qualcosa. -**Suggerimenti:** - -- Informare gli utenti con messaggi, notifiche o altri avvisi. -- Comunicare chiaramente i tempi di attesa. -- Se un'azione impiegherà più di qualche secondo, rassicurare l'utente con un timer o un'animazione per fargli capire che sta accadendo qualcosa. -- Se ci sono vari passaggi in un processo, mostrare ogni passaggio. +**Suggerimenti:** +- Informa l'utente tramite messaggi, notifiche e altri avvisi. +- Comunica chiaramente i tempi di attesa. +- Se un'azione richiederà più di qualche secondo, rassicura l'utente con un timer o un'animazione per fargli capire che sta succedendo qualcosa. +- Se ci sono più passaggi in un processo, mostra ogni passaggio. **Esempio:** -Mostrare ogni passaggio previsto in una transazione aiuta gli utenti a sapere a che punto si trovano nel processo. Icone appropriate fanno sapere all'utente lo stato delle sue azioni. +Mostrare ogni passaggio coinvolto in una transazione aiuta gli utenti a sapere a che punto del processo si trovano. Icone appropriate fanno conoscere all'utente lo stato delle sue azioni. -![Informare l'utente di ogni passaggio quando scambia token](./Image1.png) +![Informare l'utente su ogni passaggio durante lo scambio di token](./Image1.png) -### 2. Sicurezza e fiducia sono integrati {#security-and-trust-are-backed-in} +### 2. Sicurezza e fiducia sono integrate {#security-and-trust-are-backed-in} -La sicurezza dovrebbe essere prioritaria e questo deve essere enfatizzato per l'utente. -Le persone tengono moltissimo ai loro dati. La sicurezza è spesso una preoccupazione primaria per gli utenti e quindi deve essere considerata a tutti i livelli di progettazione. Si dovrebbe sempre cercare di guadagnare la fiducia dei propri utenti, ma il modo in cui lo si fa può avere implicazioni diverse su applicazioni differenti. Non dovrebbe essere inclusa in un secondo momento, ma dovrebbe essere progettata consapevolmente in ogni fase. Costruire la fiducia attraverso l'esperienza dell'utente, anche attraverso canali social e documentazione, oltre alla UI finale. Aspetti come il livello di decentralizzazione, lo stato multi-firma del patrimonio e se il team è doxato, avranno un effetto sulla fiducia dell'utente +La sicurezza dovrebbe avere la priorità, e questo dovrebbe essere enfatizzato per l'utente. +Le persone tengono molto ai propri dati. La sicurezza è spesso una preoccupazione primaria per gli utenti, quindi dovrebbe essere considerata a tutti i livelli della progettazione. Dovresti sempre cercare di guadagnare la fiducia dei tuoi utenti, ma il modo in cui lo fai può significare cose diverse su app diverse. Non dovrebbe essere un ripensamento, ma dovrebbe essere progettato consapevolmente in ogni sua parte. Costruisci la fiducia attraverso l'intera esperienza utente, inclusi i canali social e la documentazione, così come l'interfaccia utente finale. Cose come il livello di decentralizzazione, lo stato multifirma della tesoreria e se il team è pubblico (doxxed), influenzano tutte la fiducia degli utenti. **Suggerimenti:** +- Elenca con orgoglio i tuoi audit +- Ottieni più audit +- Pubblicizza qualsiasi funzionalità di sicurezza che hai progettato +- Evidenzia i possibili rischi, incluse le integrazioni sottostanti +- Comunica la complessità delle strategie +- Considera i problemi non legati all'interfaccia utente che potrebbero influenzare la percezione di sicurezza dei tuoi utenti -- Elencare fieramente i propri controlli -- Ottenere molteplici controlli -- Pubblicizzare tutte le funzionalità di sicurezza progettate -- Evidenziare i possibili rischi, comprese le integrazioni sottostanti -- Comunicare la complessità delle strategie -- Considerare le problematiche non-UI che potrebbero influire sulla percezione della sicurezza da parte degli utenti +**Esempio:** +Includi i tuoi audit nel piè di pagina, in dimensioni ben visibili. -**Esempio:** -Includere i propri controlli a piè pagina, ad una dimensione ben visibile. +![Audit citati nel piè di pagina del sito web](./Image2.png) -![Controlli citati a piè pagina nel sito](./Image2.png) +### 3. Le informazioni più importanti sono ovvie {#the-most-important-info-is-obvious} -### 3. L'informazione più importante è ovvia {#the-most-important-info-is-obvious} - -Per sistemi complessi, mostrare solo i dati più rilevanti. Determinare ciò che è più importante e poi darvi priorità nella visualizzazione. -Troppe informazioni diventano opprimenti e gli utenti tipicamente si basano su una sola informazione quando devono prendere una decisione. Nella DeFi questa sarà probabilmente l'APR sulle app di rendimento e il LTV sulle app di prestito. +Per i sistemi complessi, mostra solo i dati più rilevanti. Determina cosa è più importante e dai priorità alla sua visualizzazione. +Troppe informazioni sono opprimenti e gli utenti in genere si ancorano a una singola informazione quando prendono decisioni. Nella DeFi, questo sarà probabilmente l'APR sulle app di rendimento e l'LTV sulle app di prestito. **Suggerimenti:** +- La ricerca sugli utenti scoprirà la metrica più importante +- Rendi grandi le informazioni chiave e piccoli e discreti gli altri dettagli +- Le persone non leggono, scorrono; assicurati che il tuo design sia facilmente scansionabile visivamente -- La ricerca sugli utenti farà chiarezza sulle metriche più importanti -- Mostrare le informazioni chiave in grande e gli altri dettagli in piccolo e in maniera discreta -- Le persone non leggono, scansionano; assicurati che il tuo design sia scansionabile - -**Esempio:** I grandi token in colori pieni sono facili da trovare quando si scansiona. L'APR è grande ed evidenziato in un colore che risalta. +**Esempio:** I token grandi a colori sono facili da trovare durante lo scorrimento visivo. L'APR è grande ed evidenziato in un colore d'accento. ![Il token e l'APR sono facili da trovare](./Image3.png) ### 4. Terminologia chiara {#clear-terminology} La terminologia dovrebbe essere comprensibile e appropriata. -Il gergo tecnico può essere un blocco notevole perché richiede la costruzione di un modello mentale completamente nuovo. Gli utenti non sono in grado di correlare il design alle parole, alle frasi e ai concetti che già conoscono. Tutto sembra confuso e poco familiare e c'è una curva di apprendimento ripida prima che possano anche tentare di utilizzarlo. Un utente potrebbe approcciarsi alla DeFi con l'intento di risparmiare un po' di denaro e quello che trova è: minare, farmare, staking, emissioni, tangenti, caveau, locker, veToken, vesting, epoche, algoritmi decentralizzati, liquidità di proprietà del protocollo… -Provare ad utilizzare termini semplici che possano essere compresi da un ampio gruppo di persone. Non inventarsi un nuovo termine di sana pianta per il proprio progetto. +Il gergo tecnico può essere un enorme ostacolo, perché richiede la costruzione di un modello mentale completamente nuovo. Gli utenti non sono in grado di mettere in relazione il design con parole, frasi e concetti che già conoscono. Tutto sembra confuso e non familiare, e c'è una ripida curva di apprendimento prima ancora che possano tentare di usarlo. Un utente potrebbe avvicinarsi alla DeFi volendo risparmiare un po' di denaro, e quello che trova è: Mining, farming, staking, emissioni, tangenti (bribes), caveau (vaults), armadietti (lockers), veToken, maturazione (vesting), epoche, algoritmi decentralizzati, liquidità di proprietà del protocollo... +Cerca di usare termini semplici che saranno compresi dal gruppo più ampio di persone. Non inventare termini completamente nuovi solo per il tuo progetto. **Suggerimenti:** - -- Utilizzare terminologia semplice e coerente -- Utilizzare il linguaggio esistente il più possibile -- Non inventarsi dei termini nuovi -- Seguire le conversazioni come appaiono -- Educare gli utenti il più possibile +- Usa una terminologia semplice e coerente +- Usa il più possibile il linguaggio esistente +- Non inventare i tuoi termini +- Segui le convenzioni man mano che appaiono +- Educa gli utenti il più possibile **Esempio:** -“Le tue ricompense” è un termine neutrale e ampiamente comprensibile, non una parola nuova inventata per questo progetto. Le ricompense sono denominate in USD per riflettere i modelli mentali del mondo reale, anche quando le ricompense stesse sono in un altro token. +"Le tue ricompense" è un termine neutro e ampiamente compreso; non una nuova parola inventata per questo progetto. Le ricompense sono denominate in USD per corrispondere ai modelli mentali del mondo reale, anche se le ricompense stesse sono in un altro token. -![Ricompense dei token, visualizzate in dollari statunitensi](./Image4.png) +![Ricompense in token, visualizzate in dollari statunitensi](./Image4.png) -### 5. Le azioni sono le più brevi possibili {#actions-are-as-short-as-possible} +### 5. Le azioni sono il più brevi possibile {#actions-are-as-short-as-possible} -Velocizzare le interazioni dell'utente raggruppando le azioni secondarie. -Questo può essere fatto anche a livello di contratto intelligente o della UI. L'utente non dovrebbe essere obbligato a muoversi da una parte all'altra del sistema – o lasciare completamente il sistema – per completare delle azioni comuni. +Velocizza le interazioni dell'utente raggruppando le sotto-azioni. +Questo può essere fatto a livello di contratto intelligente, così come nell'interfaccia utente. L'utente non dovrebbe doversi spostare da una parte all'altra del sistema – o lasciare del tutto il sistema – per completare un'azione comune. **Suggerimenti:** +- Combina "Approva" con altre azioni dove possibile +- Raggruppa i passaggi di firma il più vicino possibile -- Combinare "Approva" con altre azioni quando possibile -- Raggruppa i passaggi che richiedono una firma il più vicino possibile - -**Esempio:** Combinare "aggiungi liquidità" e "metti in staking" è un semplice esempio di un passaggio veloce che fa risparmiare all'utente sia tempo che gas. +**Esempio:** Combinare "aggiungi liquidità" e "stake" è un semplice esempio di acceleratore che fa risparmiare all'utente sia tempo che gas. -![Finestra modale che visualizza un interruttore per combinare le azioni di deposito e staking](./Image5.png) +![Modale che mostra un interruttore per combinare le azioni di deposito e stake](./Image5.png) ### 6. Le connessioni di rete sono visibili e flessibili {#network-connections-are-visible-and-flexible} -Informare l'utente della rete alla quale è connesso e fornire scorciatoie chiare per cambiare rete. -Questo è particolarmente importante nelle applicazioni multi-catena. Le funzioni principali dell'applicazione dovrebbero essere sempre visibili mentre si è disconnessi o connessi a reti non supportate. +Informa l'utente su quale rete è connesso e fornisci scorciatoie chiare per cambiare rete. +Questo è particolarmente importante sulle app multi-catena. Le funzioni principali dell'app dovrebbero essere ancora visibili mentre si è disconnessi o connessi a una rete non supportata. **Suggerimenti:** +- Mostra il più possibile dell'app mentre si è disconnessi +- Mostra a quale rete l'utente è attualmente connesso +- Non costringere l'utente ad andare sul portafoglio per cambiare rete +- Se l'app richiede all'utente di cambiare rete, richiedi l'azione dalla chiamata all'azione (CTA) principale +- Se l'app contiene mercati o caveau per più reti, indica chiaramente quale set l'utente sta attualmente guardando -- Visualizzare il più possibile dell'applicazione anche quando si è disconnessi -- Mostrare la rete alla quale l'utente è collegato in quel momento -- Non costringere l'utente ad andare nel portafoglio per poter cambiare rete -- Se l'applicazione richiede all'utente di cambiare rete, richiediere l'azione dalla chiamata all'azione principale -- Se l'applicazione contiene mercati o casseforti di più reti, dichiarare in maniera chiara quale set l'utente ha davanti in quel momento - -**Esempio:** Mostrare all'utente a quale rete è collegato e permettergli di cambiarla nella barra dell'applicazione. +**Esempio:** Mostra all'utente a quale rete è connesso e consentigli di cambiarla, nella barra dell'app. ![Pulsante a discesa che mostra la rete connessa](./Image6.png) -### 7. Controllare dall'applicazione non dal portafoglio {#control-from-the-app-not-the-wallet} +### 7. Controllo dall'app, non dal portafoglio {#control-from-the-app-not-the-wallet} -La UI dovrebbe dire all'utente tutto ciò che deve sapere e dargli il controllo su tutto quello che deve fare. -Nel Web3 ci sono azioni che si fanno nella UI e azioni che si fanno nel portafoglio. Generalmente si inizia con un'azione nella UI e poi si conferma nel portafoglio. Gli utenti potrebbe sentirsi a disagio se queste due parti non sono attentamente integrate. +L'interfaccia utente dovrebbe dire all'utente tutto ciò che ha bisogno di sapere e dargli il controllo su tutto ciò che deve fare. +Nel Web3, ci sono azioni che intraprendi nell'interfaccia utente e azioni che intraprendi nel portafoglio. Generalmente, avvii un'azione nell'interfaccia utente e poi la confermi nel portafoglio. Gli utenti possono sentirsi a disagio se questi due filoni non sono integrati con attenzione. **Suggerimenti:** +- Comunica lo stato del sistema tramite feedback nell'interfaccia utente +- Tieni un registro della loro cronologia +- Fornisci collegamenti agli esploratori di blocchi per le vecchie transazioni +- Fornisci scorciatoie per cambiare rete. -- Comunicare lo stato del sistema attraverso un feedback nella UI -- Tenere un registro dello storico -- Fornire i link agli esploratori di blocchi per le vecchie transazioni -- Fornire scorciatoie per cambiare rete. - -**Esempio:** Un contenitore discreto mostra all'utente quali token rilevanti ha nel proprio portafoglio e la CTA principale fornisce una scorciatoia per cambiare rete. +**Esempio:** Un contenitore discreto mostra all'utente quali token rilevanti ha nel proprio portafoglio, e la CTA principale fornisce una scorciatoia per cambiare la rete. -![La CTA principale sta chiedendo all'utente di cambiare rete](./Image7.png) +![La CTA principale chiede all'utente di cambiare rete](./Image7.png) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/design-and-ux/index.md b/public/content/translations/it/developers/docs/design-and-ux/index.md index 688fd7cefd5..0686144b6fd 100644 --- a/public/content/translations/it/developers/docs/design-and-ux/index.md +++ b/public/content/translations/it/developers/docs/design-and-ux/index.md @@ -1,90 +1,87 @@ --- -title: Progettazione e UX nel Web3 -description: Introduzione alla progettazione e alla ricerca di UX nello spazio web3 e in Ethereum +title: Design e UX nel web3 +description: Introduzione al design e alla ricerca UX nello spazio web3 e in Ethereum lang: it --- -Sei nuovo alla progettazione con Ethereum? Questo è il posto giusto per te. La community di Ethereum ha scritto le risorse per introdurti alle basi della progettazione e della ricerca web3. Imparerai i concetti fondamentali che potrebbero differire da altri progetti di applicazioni con cui hai familiarità. +Sei nuovo nel design con Ethereum? Questo è il posto giusto per te. La community di Ethereum ha scritto delle risorse per introdurti alle basi del design e della ricerca nel web3. Imparerai i concetti fondamentali che potrebbero differire da altri design di app con cui hai familiarità. -Hai prima bisogno di una conoscenza più di base del web3? Dai un'occhiata al [**Learn Hub**](/learn/). +Hai prima bisogno di una comprensione più basilare del web3? Dai un'occhiata all'[**Hub di apprendimento**](/learn/). -## Inizia con la ricerca utente {#start-with-user-research} +## Inizia con la ricerca sugli utenti {#start-with-user-research} -La progettazione efficace va oltre la creazione di interfacce utente accattivanti a livello visivo. Si tratta di comprendere a fondo i bisogni, gli obiettivi e i fattori trainanti dell'utente. Pertanto, consigliamo fortemente che tutti i progettisti adottino un processo di progettazione come il [**processo del doppio diamante**](https://en.wikipedia.org/wiki/Double_Diamond_(design_process_model)), per assicurare che il loro lavoro sia consapevole e intenzionale. +Un design efficace va oltre la creazione di interfacce utente visivamente accattivanti. Implica l'acquisizione di una profonda comprensione delle esigenze, degli obiettivi e dei fattori trainanti dell'utente. Pertanto, raccomandiamo vivamente a tutti i designer di adottare un processo di design, come il [**processo del doppio diamante**](), per garantire che il loro lavoro sia ponderato e intenzionale. -- [Il Web3 necessita di più ricercatori e progettisti di UX](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) - Una panoramica dell'attuale maturità della progettazione -- [Una guida semplice alla ricerca UX](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) - Una semplice guida su come fare ricerca -- [Come affrontare le decisioni di UX nel Web3](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) - Una breve panoramica di ricerca quantitativa e qualitativa e le differenze tra queste due (video, 6 minuti) -- [Essere un ricercatore ux nel web3](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) - Un punto di vista personale su cosa significhi essere un ricercatore UX nel web3 +- [Il Web3 ha bisogno di più Ricercatori e Designer UX](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) - Una panoramica dell'attuale maturità del design +- [Una guida semplice alla Ricerca UX nel web3](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) - Guida semplice su come fare ricerca +- [Come affrontare le decisioni UX nel Web3](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) - Una breve panoramica della ricerca quantitativa e qualitativa e le differenze tra le due (video, 6 min) +- [Essere un ricercatore UX nel web3](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) - Una visione personale su come sia essere un ricercatore UX nel web3 ## Studi di ricerca nel web3 {#research-in-web3} -Questo è un elenco curato di ricerche utente fatte nel web3 che potrebbero esserti utili nelle decisioni di progettazione e prodotto o potrebbero inspirarti a condurre nuovi studi. - -| Area di interesse | Nome | -|:--------------------------------------------------------------------- |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Integrazione delle criptovalute | [WalletConnect Pulse 2024: Opinione e utilizzo del cripto-consumatore](https://www.businesswire.com/news/home/20240229407983/en/WalletConnect-Uncovers-Major-Crypto-Consumer-Findings-in-Inaugural-Pulse-Report) | -| Integrazione delle criptovalute | [CRADL: la UX nelle criptovalute](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | -| Integrazione delle criptovalute | [CRADL: ingresso nelle criptovalute](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | -| Integrazione delle criptovalute | [Report sulla UX Bitcoin](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | -| Integrazione delle criptovalute | [ConSensys: lo stato della percezione del Web3 nel mondo nel 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | -| Integrazione delle criptovalute | [NEAR: accelerare il percorso di adozione](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) | -| Staking | [OpenUX: UX dell'operatore del nodo in pool di Rocket](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) | -| Staking | [Staking: Tendenze fondamentali, risultati e previsioni - Eth Staker](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | -| Staking | [Staking a Più App](https://github.com/threshold-network/UX-User-Research/blob/main/Multi-App%20Staking%20(MAS)/iterative-user-study/MAS%20Iterative%20User%20Study.pdf) | -| OAD | [Aggiornamento 2022 sulla ricerca delle DAO: di cosa hanno bisogno i costruttori di DAO?](https://blog.aragon.org/2022-dao-research-update/) | -| DeFi | [Gruppi di copertura](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | -| DeFi | [ConSensys: rapporto di ricerca sugli utenti DeFI 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | -| Metaverso | [Metaverso: report di ricerca sugli utenti](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | -| Metaverso | [Andare ad un Safari: ricerca sugli utenti nel Metaverso](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (video, 27 minuti) | -| Statistiche dell'UX di Ethereum.org | [Pannello di controllo del sondaggio sull'utilizzabilità e soddisfazione degli utenti - Ethereum.org](https://lookerstudio.google.com/reporting/0a189a7c-a890-40db-a5c6-009db52c81c9) | - -## Progettazione per il web3 {#design-for-web3} - -- [Web3 UX Design Handbook](https://web3ux.design/) - Guida pratica alla progettazione di applicazioni Web3 -- [Principi di progettazione Web3](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) - Un framework di regole di UX per le dapp basate su blockchain -- [Principi di progettazione blockchain](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) - Lezioni apprese dal team di progettazione blockchain di IBM -- [Modello di progettazione Web3](https://www.web3designpatterns.io/)- Una libreria curata di modelli di progettazione di prodotti Web3 reali -- [W3design.io](https://w3design.io/) - Una libreria curata di flussi di UI di vari progetti nell'ecosistema -- [Neueux.com](https://neueux.com/apps) - Una libreria UI di flussi di utenti con diversi opzioni di filtro -- [Web3's Usability Crisis: What You NEED to Know!](https://www.youtube.com/watch?v=oBSXT_6YDzg) - Una tavola rotonda sulle insidie della creazione di progetti incentrati sugli sviluppatori (video, 34 minuti) - -## Primi passi {#getting-started} - -- [Euristiche per il Web3](/developers/docs/design-and-ux/heuristics-for-web3/): 7 euristiche per la progettazione dell'interfaccia di Web3 -- [Migliori pratiche di progettazione delle DEX](/developers/docs/design-and-ux/dex-design-best-practice/): Una guida alla progettazione di borse decentralizzate - -## Casi di studio di progettazione Web3 {#design-case-studies} - -- [Deep Work Studio](https://deepwork.studio/case-studies/) -- [Manuale di UX cripto](https://www.cryptouxhandbook.com/) +Questa è una lista curata di ricerche sugli utenti effettuate nel web3 che possono aiutare nelle decisioni di design e di prodotto o fungere da ispirazione per condurre il proprio studio. + +| Area di interesse | Nome | +| :------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Onboarding crypto | [The Reown Pulse 2024: Crypto Consumer Sentiment & Usage](https://reown.com/blog/unveiling-walletconnects-consumer-crypto-report) | +| Onboarding crypto | [CRADL: UX in Cryptocurrency](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | +| Onboarding crypto | [CRADL: Onboarding to Cryptocurrency](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | +| Onboarding crypto | [Bitcoin UX report](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | +| Onboarding crypto | [ConSensys: The State of Web3 perception around the world 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | +| Onboarding crypto | [NEAR: Accelerating the journey towards adoption](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) | +| Staking | [OpenUX: Rocket Pool Node Operator UX](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) | +| Staking | [Staking: Key trends, takeaways, and predictions - Eth Staker](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | +| Staking | [Multi App Staking]() | +| DAO | [2022 DAO Research Update: What do DAO Builders Need?](https://blog.aragon.org/2022-dao-research-update/) | +| DeFi | [Coverage pools](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | +| DeFi | [ConSensys: DeFi User Research Report 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | +| Metaverso | [Metaverse: User Research Report](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | +| Metaverso | [Going on Safari: Researching Users in the Metaverse](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (video, 27 min) | + +## Design per il web3 {#design-for-web3} + +- [Web3 Design Playbook](https://learnweb3.design/) - Una raccolta completa di framework e note sui principi UX del Web3, pattern DeFi, design della governance, UX dei portafogli e pensiero a livello di protocollo per designer e fondatori +- [Web3 UX Design Handbook](https://web3ux.design/) - Guida pratica alla progettazione di app Web3 +- [Web3 Design Principles](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) - Un framework di regole UX per dApp basate su blockchain +- [Blockchain Design Principles](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) - Lezioni apprese dal team di design blockchain di IBM +- [Neueux.com](https://neueux.com/apps) - Libreria UI di flussi utente con diverse opzioni di filtraggio +- [Web3's Usability Crisis: What You NEED to Know!](https://www.youtube.com/watch?v=oBSXT_6YDzg) - Una tavola rotonda sulle insidie della costruzione di progetti incentrati sugli sviluppatori (video, 34 min) + +## Per Iniziare {#getting-started} + +- [Euristiche per il Web3](/developers/docs/design-and-ux/heuristics-for-web3/) - 7 euristiche per il design delle interfacce Web3 +- [Migliori Pratiche di Design per DEX](/developers/docs/design-and-ux/dex-design-best-practice/) - Una guida alla progettazione di exchange decentralizzati + +## Casi di Studio di Design nel Web3 {#design-case-studies} + +- [Deep Work Studio](https://www.deepwork.studio/case-studies) - [Vendere un NFT su OpenSea](https://builtformars.com/case-studies/opensea) -- [UX del portafoglio: un'analisi di come i portafogli devono cambiare](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (video, 20 min) +- [Analisi della UX dei portafogli: come devono cambiare i portafogli](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (video, 20 min) -## Ricompense di progettazione {#bounties} +## Taglie di Design {#bounties} - [Dework](https://app.dework.xyz/bounties) -- [Hackathon di Buildbox](https://app.buidlbox.io/) -- [Hackathon di ETHGlobal](https://ethglobal.com/) +- [Buildbox hackathons](https://app.buidlbox.io/) +- [ETHGlobal hackathons](https://ethglobal.com/) -## Progettazione di DAO e di community {#design-daos-and-communities} +## DAO e community di design {#design-daos-and-communities} -Partecipate ad organizzazioni professionali guidate dalla community o unitevi a gruppi di progettazione per discutere argomenti e tendenze legati a progetti e alla ricerca con altri membri. +Partecipa a organizzazioni professionali guidate dalla community o unisciti a gruppi di design per discutere di argomenti e tendenze legati al design e alla ricerca con altri membri. - [Vectordao.com](https://vectordao.com/) - [Deepwork.studio](https://www.deepwork.studio/) -- [Designer-dao.xyz](https://www.designer-dao.xyz/) - [We3.co](https://we3.co/) - [Openux.xyz](https://openux.xyz/) -## Sistemi di progettazione {#design-systems} +## Design System e altre risorse di design {#design-systems-and-resources} -- [Progettazione di Optimism](https://www.figma.com/@optimism) (Figma) -- [Sistema di progettazione di Ethereum.org](https://www.figma.com/@ethdotorg) (Figma) -- [Finity, un sistema di progettazione di Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) -- [Sistema di progettazione Kleros](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) -- [Sistema di progettazione Sicuro](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) -- [Sistema di progettazione ENS](https://thorin.ens.domains/) -- [Sistema di progettazione Mirror](https://degen-xyz.vercel.app/) +- [Optimism Design](https://www.figma.com/@optimism) (Figma) +- [Ethereum.org Design system](https://www.figma.com/@ethdotorg) (Figma) +- [Finity, un design system di Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) +- [Kleros Design System](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) +- [Safe Design System](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) +- [ENS Design system](https://thorin.ens.domains/) +- [Mirror Design System](https://degen-xyz.vercel.app/) -**Gli articoli e i progetti elencati in questa pagina non costituiscono sponsorizzazioni ufficiali** e sono forniti solo a scopo informativo. Aggiungiamo i collegamenti a questa pagina in base ai criteri della nostra [politica di inserimento](/contributing/design/adding-design-resources). Se vorresti che aggiungessimo un progetto/articolo, modifica questa pagina su [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md). +**Gli articoli e i progetti elencati in questa pagina non sono approvazioni ufficiali** e sono forniti solo a scopo informativo. +Aggiungiamo link a questa pagina in base ai criteri della nostra [politica di inserimento](/contributing/design/adding-design-resources). Se desideri che aggiungiamo un progetto/articolo, modifica questa pagina su [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md). \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/development-networks/index.md b/public/content/translations/it/developers/docs/development-networks/index.md index 2d4dde81e5a..1aa1d23e7d1 100644 --- a/public/content/translations/it/developers/docs/development-networks/index.md +++ b/public/content/translations/it/developers/docs/development-networks/index.md @@ -1,73 +1,75 @@ --- title: Reti di sviluppo -description: Panoramica delle reti di sviluppo e degli strumenti disponibili per creare applicazioni Ethereum. +description: Una panoramica delle reti di sviluppo e degli strumenti disponibili per aiutare a creare applicazioni su Ethereum. lang: it --- -Creando un'applicazione di Ethereum con i contratti intelligenti, vorrai eseguirlo su una rete locale per vedere come funziona, prima di distribuirla. +Quando si crea un'applicazione [Ethereum](/) con contratti intelligenti, è consigliabile eseguirla su una rete locale per vederne il funzionamento prima di distribuirla. -Come è possibile eseguire un server locale sul computer per lo sviluppo web, allo stesso modo è possibile usare una rete di sviluppo per creare un'istanza di blockchain locale per testare una dapp. Queste reti di sviluppo Ethereum offrono funzionalità che permettono un'iterazione molto più veloce rispetto a una rete di prova pubblica (ad esempio, non è necessario acquisire ETH da un faucet di una rete di prova). +Similmente a come si potrebbe eseguire un server locale sul proprio computer per lo sviluppo web, è possibile utilizzare una rete di sviluppo per creare un'istanza locale della blockchain per testare la propria dApp. Queste reti di sviluppo di Ethereum forniscono funzionalità che consentono un'iterazione molto più rapida rispetto a una rete di test pubblica (ad esempio, non è necessario preoccuparsi di acquisire ETH da un rubinetto della rete di test). ## Prerequisiti {#prerequisites} -È necessario conoscere le [basi dello stack Ethereum](/developers/docs/ethereum-stack/) e delle [reti Ethereum](/developers/docs/networks/) prima di iniziare ad utilizzare le reti di sviluppo. +Dovresti comprendere le [basi dello stack di Ethereum](/developers/docs/ethereum-stack/) e le [reti di Ethereum](/developers/docs/networks/) prima di immergerti nelle reti di sviluppo. ## Cos'è una rete di sviluppo? {#what-is-a-development-network} -Si tratta essenzialmente di client Ethereum (implementazioni di Ethereum) progettate in modo specifico per lo sviluppo locale. +Le reti di sviluppo sono essenzialmente client di Ethereum (implementazioni di Ethereum) progettati specificamente per lo sviluppo locale. -**Perché allora non eseguire semplicemente un nodo Ethereum locale?** +**Perché non eseguire semplicemente un nodo standard di Ethereum localmente?** -_Potresti_ [eseguire un nodo](/developers/docs/nodes-and-clients/#running-your-own-node), ma poiché le reti di sviluppo sono costruite per lo sviluppo, spesso includono funzionalità pratiche come: +_Potresti_ [eseguire un nodo](/developers/docs/nodes-and-clients/#running-your-own-node) ma, poiché le reti di sviluppo sono create appositamente per lo sviluppo, spesso sono dotate di comode funzionalità come: -- Inserimento deterministico dei dati nella tua blockchain locale (es. conti con saldi di ETH) -- Produzione istantanea di blocchi a ogni transazione ricevuta, in ordine e senza ritardi -- Funzionalità di debugging e registrazione avanzate +- Popolamento deterministico della blockchain locale con dati (es. account con saldi in ETH) +- Produzione istantanea di blocchi con ogni transazione che riceve, in ordine e senza ritardi +- Funzionalità avanzate di debug e registrazione (logging) ## Strumenti disponibili {#available-projects} -**Nota**: la maggior parte dei [framework di sviluppo](/developers/docs/frameworks/) include una rete di sviluppo incorporata. Raccomandiamo di iniziare con un framework per [impostare l'ambiente di sviluppo locale](/developers/local-environment/). +**Nota**: La maggior parte dei [framework di sviluppo](/developers/docs/frameworks/) include una rete di sviluppo integrata. Consigliamo di iniziare con un framework per [configurare il tuo ambiente di sviluppo locale](/developers/local-environment/). -### Rete Hardhat {#hardhat-network} +### Hardhat Network {#hardhat-network} -Rete Ethereum locale progettata per lo sviluppo. Permette di distribuire contratti, eseguire test e il debug del codice. +Una rete Ethereum locale progettata per lo sviluppo. Ti consente di distribuire i tuoi contratti, eseguire i tuoi test ed effettuare il debug del tuo codice. -La rete Hardhat è incorporata in Hardhat, un ambiente di sviluppo Ethereum professionale. +Hardhat Network è integrata in Hardhat, un ambiente di sviluppo Ethereum per professionisti. -- [Sito Web](https://hardhat.org/) -- [GitHub](https://github.com/nomiclabs/hardhat) +- [Sito web](https://hardhat.org/) +- [GitHub](https://github.com/NomicFoundation/hardhat) -### Beacon Chain Locali {#local-beacon-chains} +### Beacon chain locali {#local-beacon-chains} -Alcuni client del consenso sono dotati di strumenti integrati per avviare Beacon Chain locali per scopi di test. Sono disponibili le istruzioni per Lighthouse, Nimbus e Lodestar: +Alcuni client di consenso dispongono di strumenti integrati per avviare beacon chain locali a scopo di test. Sono disponibili le istruzioni per Lighthouse, Nimbus e Lodestar: -- [Testnet locale usando Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) -- [Testnet locale usando Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) +- [Rete di test locale usando Lodestar](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) +- [Rete di test locale usando Lighthouse](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) -### Catene di prova pubbliche di Ethereum {#public-beacon-testchains} +### Catene di test pubbliche di Ethereum {#public-beacon-testchains} -Esistono anche due implementazioni di prova pubbliche e mantenute di Ethereum: Sepolia e Hoodi. Sepolia è la rete di prova standard consigliata per lo sviluppo di applicazioni, con un insieme di validatori chiuso per una sincronizzazione rapida. Hoodi è una rete di prova per la validazione e lo staking, che utilizza un insieme di validatori aperto e permette potenzialmente a chiunque di validare. +Esistono anche due implementazioni di test pubbliche mantenute di Ethereum: Sepolia e Hoodi. La rete di test consigliata con supporto a lungo termine è Hoodi, su cui chiunque è libero di validare. Sepolia utilizza un set di validatori autorizzati, il che significa che non c'è accesso generale per nuovi validatori su questa rete di test. -- [Launchpad di staking di Hoodi](https://hoodi.launchpad.ethereum.org/en/) -- [Sito Web di Sepolia](https://sepolia.dev/) -- [Sito Web di Hoodi](https://hoodi.ethpandaops.io/) +- [Launchpad di staking di Hoodi](https://hoodi.launchpad.ethereum.org/) -### Pacchetto Ethereum di Kurtosis {#kurtosis} +### Pacchetto Ethereum Kurtosis {#kurtosis} -Kurtosis è un sistema di produzione per ambienti di prova multi-contenitore che consente agli sviluppatori di avviare localmente istanze riproducibili di reti blockchain. +Kurtosis è un sistema di compilazione per ambienti di test multi-container che consente agli sviluppatori di avviare localmente istanze riproducibili di reti blockchain. -Il pacchetto Kurtosis di Ethereum è utilizzabile per istanziare rapidamente una rete di prova di Ethereum parametrizzabile, altamente scalabile e privata, su Docker o Kubernetes. Il pacchetto supporta tutti i clienti principali dei Livelli d'Esecuzione (EL) e del Consenso (CL). Kurtosis gestisce comodamente tutte le mappature delle porte locali e le connessioni del servizio per una rete rappresentativa da utilizzare nei flussi di lavoro di convalida e test, relativamente all'infrastruttura principale di Ethereum. +Il pacchetto Ethereum Kurtosis può essere utilizzato per istanziare rapidamente una rete di test di Ethereum parametrizzabile, altamente scalabile e privata su Docker o Kubernetes. Il pacchetto supporta tutti i principali client del livello di esecuzione (EL) e del livello di consenso (CL). Kurtosis gestisce in modo elegante tutte le mappature delle porte locali e le connessioni ai servizi per una rete rappresentativa da utilizzare nei flussi di lavoro di validazione e test relativi all'infrastruttura principale di Ethereum. -- [Pacchetto rete Ethereum](https://github.com/kurtosis-tech/ethereum-package) -- [Sito Web](https://www.kurtosis.com/) +- [Pacchetto di rete Ethereum](https://github.com/kurtosis-tech/ethereum-package) +- [Sito web](https://www.kurtosis.com/) - [GitHub](https://github.com/kurtosis-tech/kurtosis) - [Documentazione](https://docs.kurtosis.com/) ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [Quadri di sviluppo](/developers/docs/frameworks/) -- [Configura un ambiente di sviluppo locale](/developers/local-environment/) +- [Framework di sviluppo](/developers/docs/frameworks/) +- [Configurare un ambiente di sviluppo locale](/developers/local-environment/) + +## Tutorial: Reti di sviluppo e ambienti di test su Ethereum {#tutorials} + +- [Sviluppare e testare dApp con una rete di test locale multi-client di Ethereum](/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/) _– Come avviare una rete di test locale multi-client di Ethereum con Kurtosis per lo sviluppo e il test di dApp._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/ethereum-stack/index.md b/public/content/translations/it/developers/docs/ethereum-stack/index.md index e1296df03d0..4dc7685fa37 100644 --- a/public/content/translations/it/developers/docs/ethereum-stack/index.md +++ b/public/content/translations/it/developers/docs/ethereum-stack/index.md @@ -1,61 +1,61 @@ --- title: Introduzione allo stack di Ethereum -description: Percorso all'interno dei vari livelli dello stack di Ethereum che indica anche come interagiscono. +description: Una panoramica dei diversi livelli dello stack di Ethereum e di come si integrano tra loro. lang: it --- -Come ogni stack di software, lo "stack di Ethereum" completo varia da progetto a progetto in base ai propri obiettivi. +Come per qualsiasi stack software, lo "stack di Ethereum" completo varierà da progetto a progetto a seconda dei tuoi obiettivi. -Sono comunque disponibili tecnologie base di Ethereum che aiutano a fornire un modello mentale di come le applicazioni software interagiscono con la blockchain Ethereum. Comprendere i livelli dello stack aiuterà anche a comprendere i molti modi in cui Ethereum può essere integrato all'interno di progetti software. +Ci sono, tuttavia, componenti principali di Ethereum che aiutano a fornire un modello mentale di come le applicazioni software interagiscono con la blockchain di Ethereum. Comprendere i livelli dello stack ti aiuterà a capire i diversi modi in cui Ethereum può essere integrato nei progetti software. -## Livello 1: macchina virtuale Ethereum {#ethereum-virtual-machine} +## Livello 1: Macchina Virtuale di Ethereum {#ethereum-virtual-machine} -La [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/) è l'ambiente di esecuzione per i contratti intelligenti su Ethereum. Tutti i contratti intelligenti e i cambiamenti di stato sulle blockchain di Ethereum sono eseguiti dalle [transazioni](/developers/docs/transactions/). La EVM gestisce l'elaborazione di tutte le transazioni sulla rete Ethereum. +La [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/) è l'ambiente di esecuzione per i contratti intelligenti su Ethereum. Tutti i contratti intelligenti e le modifiche di stato sulla blockchain di Ethereum sono eseguiti tramite [transazioni](/developers/docs/transactions/). L'EVM gestisce tutta l'elaborazione delle transazioni sulla rete di Ethereum. -Come avviene con ogni macchina virtuale, la EVM crea un livello di astrazione fra il codice in esecuzione e la macchina che esegue tale codice (il nodo Ethereum). Al momento la EVM è in esecuzione su migliaia di nodi distribuiti in tutto il mondo. +Come per qualsiasi macchina virtuale, l'EVM crea un livello di astrazione tra il codice in esecuzione e la macchina esecutrice (un nodo di Ethereum). Attualmente, l'EVM è in esecuzione su migliaia di nodi distribuiti in tutto il mondo. -La EVM utilizza un insieme di istruzioni opcode per eseguire attività specifiche. Questi (140) opcode (univoci) consentono all'EVM di essere [Turing-completa](https://en.wikipedia.org/wiki/Turing_completeness), cioè in grado di calcolare praticamente tutto, se sono presenti risorse sufficienti. +Dietro le quinte, l'EVM utilizza un set di istruzioni opcode per eseguire compiti specifici. Questi opcode (140 unici) consentono all'EVM di essere [Turing-completa](https://en.wikipedia.org/wiki/Turing_completeness), il che significa che l'EVM è in grado di calcolare quasi tutto, date risorse sufficienti. -A uno sviluppatore di dapp non serve conoscere a fondo la EVM, gli basta sapere che esiste e fa funzionare in modo affidabile tutte le applicazioni su Ethereum senza interruzioni. +Come sviluppatore di dApp, non hai bisogno di sapere molto sull'EVM, se non che esiste e che alimenta in modo affidabile tutte le applicazioni su Ethereum senza tempi di inattività. ## Livello 2: Contratti intelligenti {#smart-contracts} -I [contratti intelligenti](/developers/docs/smart-contracts/) sono i programmi eseguiti sulla blockchain di Ethereum. +I [contratti intelligenti](/developers/docs/smart-contracts/) sono i programmi eseguibili che girano sulla blockchain di Ethereum. -I contratti intelligenti sono scritti usando [linguaggi di programmazione](/developers/docs/smart-contracts/languages/) specifici, compilati al bytecode dell'EVM (istruzioni della macchina di basso livello, dette opcode). +I contratti intelligenti sono scritti utilizzando specifici [linguaggi di programmazione](/developers/docs/smart-contracts/languages/) che vengono compilati in bytecode EVM (istruzioni macchina di basso livello chiamate opcode). -Non solo i contratti intelligenti servono da librerie open source, ma sono essenzialmente servizi API aperti in continua esecuzione e non disattivabili. I contratti intelligenti forniscono funzioni pubbliche con cui gli utenti e le applicazioni ([dapp](/developers/docs/dapps/)) potrebbero interagire, senza necessitare di permessi. Qualsiasi applicazione potrebbe integrarsi con i contratti intelligenti distribuiti per comporre la funzionalità, come aggiungere [feed di dati](/developers/docs/oracles/) o supportare gli scambi di token. Inoltre, chiunque può distribuire nuovi contratti intelligenti a Ethereum per aggiungere funzionalità personalizzate che soddisfino le esigenze della loro applicazione. +I contratti intelligenti non fungono solo da librerie open source, ma sono essenzialmente servizi API aperti sempre in esecuzione e che non possono essere disattivati. I contratti intelligenti forniscono funzioni pubbliche con cui gli utenti e le applicazioni ([dApp](/developers/docs/dapps/)) possono interagire, senza bisogno di permessi. Qualsiasi applicazione può integrarsi con i contratti intelligenti distribuiti per comporre funzionalità, come l'aggiunta di [feed di dati](/developers/docs/oracles/) o per supportare lo scambio di token. Inoltre, chiunque può distribuire nuovi contratti intelligenti su Ethereum al fine di aggiungere funzionalità personalizzate per soddisfare le esigenze della propria applicazione. -Come sviluppatore di dapp, dovrvai scrivere i contratti intelligenti solo se desideri aggiungere funzionalità personalizzate alla blockchain di Ethereum. Potresti renderti conto di poter soddisfare gran parte o tutte le esigenze del tuo progetto, semplicemente integrando con contratti intelligenti esistenti, ad esempio, se desideri supportare pagamenti in stablecoin o consentire lo scambio decentralizzato di token. +Come sviluppatore di dApp, dovrai scrivere contratti intelligenti solo se desideri aggiungere funzionalità personalizzate sulla blockchain di Ethereum. Potresti scoprire di poter soddisfare la maggior parte o tutte le esigenze del tuo progetto semplicemente integrandoti con i contratti intelligenti esistenti, ad esempio se desideri supportare i pagamenti in stablecoin o abilitare un exchange decentralizzato di token. -## Livello 3: nodi Ethereum {#ethereum-nodes} +## Livello 3: Nodi di Ethereum {#ethereum-nodes} -Affinché un'applicazione interagisca con la blockchain di Ethereum, deve connettersi a un [nodo di Ethereum](/developers/docs/nodes-and-clients/). Connettersi a un nodo permette di leggere i dati della blockchain e/o inviare transazioni alla rete. +Affinché un'applicazione possa interagire con la blockchain di Ethereum, deve connettersi a un [nodo di Ethereum](/developers/docs/nodes-and-clients/). Connettersi a un nodo ti consente di leggere i dati della blockchain e/o inviare transazioni alla rete. -I nodi Ethereum sono computer che eseguono software, ovvero un client Ethereum. Un client è una implementazione di Ethereum che verifica tutte le transazioni presenti in un blocco, facendo in modo che la rete rimanga sicura e i dati siano accurati. **I nodi di Ethereum sono la blockchain di Ethereum**. Memorizzano in maniera collettiva lo stato della blockchain Ethereum e raggiungono il consenso sulle transazioni per modificare lo stato della blockchain. +I nodi di Ethereum sono computer che eseguono un software: un client di Ethereum. Un client è un'implementazione di Ethereum che verifica tutte le transazioni in ogni blocco, mantenendo la rete sicura e i dati accurati. **I nodi di Ethereum sono la blockchain di Ethereum**. Essi memorizzano collettivamente lo stato della blockchain di Ethereum e raggiungono il consenso sulle transazioni per mutare lo stato della blockchain. -Connettendo la tua applicazione a un nodo di Ethereum (tramite l'[API JSON-RPC](/developers/docs/apis/json-rpc/)), la tua applicazione può leggere i dati dalla blockchain (come i saldi dei conti degli utenti), nonché trasmettere le nuove transazioni alla rete (come trasferire ETH tra conti degli utenti o eseguire funzioni dei contratti intelligenti). +Connettendo la tua applicazione a un nodo di Ethereum (tramite l'[API JSON-RPC](/developers/docs/apis/json-rpc/)), la tua applicazione è in grado di leggere i dati dalla blockchain (come i saldi degli account degli utenti) e di trasmettere nuove transazioni alla rete (come il trasferimento di ETH tra gli account degli utenti o l'esecuzione di funzioni dei contratti intelligenti). -## Livello 4: API client Ethereum {#ethereum-client-apis} +## Livello 4: API dei client di Ethereum {#ethereum-client-apis} -Molte librerie (create e gestite dalla community open source di Ethereum) consentono alle applicazioni per gli utenti finali di connettersi e comunicare con la blockchain Ethereum. +Molte librerie di utilità (create e mantenute dalla community open source di Ethereum) consentono alle tue applicazioni di connettersi e comunicare con la blockchain di Ethereum. -Se un'applicazione per gli utenti è una Wweb app, è possibile decidere di installare tramite `npm install` un'[API JavaScript](/developers/docs/apis/javascript/) direttamente sul frontend. In alternativa, è possibile implementare questa funzionalità sul lato server, usando un'API [Python](/developers/docs/programming-languages/python/) o [Java](/developers/docs/programming-languages/java/). +Se la tua applicazione rivolta all'utente è un'app web, potresti scegliere di eseguire `npm install` di un'[API JavaScript](/developers/docs/apis/javascript/) direttamente nel tuo frontend. O forse sceglierai di implementare questa funzionalità lato server, utilizzando un'API [Python](/developers/docs/programming-languages/python/) o [Java](/developers/docs/programming-languages/java/). -Pur non essendo necessariamente parte dello stack, queste API eliminano gran parte della complessità necessaria per interagire direttamente con un nodo Ethereum. Assicurano inoltre funzioni di utilità (ad esempio la conversione da ETH ain Gwei) per fare in modo che gli sviluppatori dedichino meno tempo alle complessità dei client Ethereum e più tempo alle funzionalità specifiche dell'applicazione. +Sebbene queste API non siano un pezzo necessario dello stack, astraggono gran parte della complessità dell'interazione diretta con un nodo di Ethereum. Forniscono anche funzioni di utilità (ad es. la conversione di ETH in Gwei) in modo che, come sviluppatore, tu possa dedicare meno tempo ad affrontare le complessità dei client di Ethereum e più tempo a concentrarti sulle funzionalità specifiche della tua applicazione. -## Livello 5: applicazioni per gli utenti finali {#end-user-applications} +## Livello 5: Applicazioni per l'utente finale {#end-user-applications} -Al livello più alto dello stack ci sono le applicazioni rivolte agli utenti. Si tratta delle applicazioni standard utilizzate e create normalmente oggi, principalmente Web app ed applicazioni mobili. +Al livello più alto dello stack ci sono le applicazioni rivolte all'utente. Queste sono le applicazioni standard che usi e crei regolarmente oggi: principalmente app web e mobili. -Il modo di progettare queste interfacce utente rimane essenzialmente invariato. Spesso gli utenti non hanno bisogno di sapere che l'applicazione che stanno usando è stata creata usando una blockchain. +Il modo in cui sviluppi queste interfacce utente rimane essenzialmente invariato. Spesso gli utenti non avranno bisogno di sapere che l'applicazione che stanno utilizzando è costruita usando una blockchain. -## Vuoi scegliere il tuo stack ora? {#ready-to-choose-your-stack} +## Pronto a scegliere il tuo stack? {#ready-to-choose-your-stack} -Consulta la nostra guida per [configurare un ambiente di sviluppo locale](/developers/local-environment/) per un'applicazione Ethereum. +Dai un'occhiata alla nostra guida per [configurare un ambiente di sviluppo locale](/developers/local-environment/) per la tua applicazione Ethereum. ## Letture consigliate {#further-reading} -- [L'Architettura di un'applicazione Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [L'architettura di un'applicazione Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/evm/index.md b/public/content/translations/it/developers/docs/evm/index.md index c1ae60e919f..5c89b6cb642 100644 --- a/public/content/translations/it/developers/docs/evm/index.md +++ b/public/content/translations/it/developers/docs/evm/index.md @@ -1,78 +1,93 @@ --- -title: Macchina virtuale Ethereum (EVM) -description: Un'introduzione alla Macchina Virtuale di Ethereum e a come si relaziona allo stato, alle transazioni e ai contratti intelligenti. +title: Macchina Virtuale di Ethereum (EVM) +description: Un'introduzione alla macchina virtuale di Ethereum e a come si relaziona con lo stato, le transazioni e i contratti intelligenti. lang: it --- -La Macchina Virtuale di Ethereum (EVM) è un ambiente virtuale decentralizzato che esegue il codice con coerenza e sicurezza su tutti i nodi di Ethereum. I nodi eseguono l'EVM per eseguire i contratti intelligenti, utilizzando il "[gas](/gas/)" per misurare lo sforzo di calcolo necessario per le [operazioni](/developers/docs/evm/opcodes/), assicurando un'efficace allocazione delle risorse e la sicurezza della rete. +La Macchina Virtuale di Ethereum (EVM) è un ambiente virtuale decentralizzato che esegue codice in modo coerente e sicuro su tutti i nodi [Ethereum](/). I nodi eseguono l'EVM per eseguire i contratti intelligenti, utilizzando il "[gas](/developers/docs/gas/)" per misurare lo sforzo computazionale richiesto per le [operazioni](/developers/docs/evm/opcodes/), garantendo un'allocazione efficiente delle risorse e la sicurezza della rete. ## Prerequisiti {#prerequisites} -Per comprendere l'EVM, è richiesta una conoscenza di base dei termini comuni dell'informatica, come ad esempio [byte](https://wikipedia.org/wiki/Byte), [memoria](https://wikipedia.org/wiki/Computer_memory) e [stack](https://wikipedia.org/wiki/Stack_(abstract_data_type)). Sarebbe inoltre utile esser a conoscenza dei concetti crittografici e della blockchain come le [funzioni di hash](https://wikipedia.org/wiki/Cryptographic_hash_function) e l'[albero di Merkle](https://wikipedia.org/wiki/Merkle_tree). +Per comprendere l'EVM è necessaria una certa familiarità di base con la terminologia comune dell'informatica, come [byte](https://wikipedia.org/wiki/Byte), [memoria](https://wikipedia.org/wiki/Computer_memory) e [stack](). Sarebbe inoltre utile avere dimestichezza con i concetti di crittografia/blockchain come le [funzioni di hash](https://wikipedia.org/wiki/Cryptographic_hash_function) e l'[albero di Merkle](https://wikipedia.org/wiki/Merkle_tree). -## Dal libro mastro alla macchina a stati {#from-ledger-to-state-machine} +## Dal registro alla macchina a stati {#from-ledger-to-state-machine} -Per descrivere blockchain come Bitcoin, viene spesso utilizzata l'analogia con un "libro mastro distribuito", che permette l'esistenza di una valuta decentralizzata utilizzando strumenti base della crittografia. Il libro mastro mantiene un registro delle attività che deve aderire a una serie di regole che governano ciò che qualcuno può e non può fare per modificarlo. Ad esempio, un indirizzo Bitcoin non può spendere più Bitcoin di quanti ne abbia ricevuti in precedenza. Queste regole sono alla base di tutte le transazioni su Bitcoin e di molte altre blockchain. +L'analogia di un "registro distribuito" è spesso usata per descrivere blockchain come Bitcoin, che abilitano una valuta decentralizzata utilizzando strumenti fondamentali di crittografia. Il registro mantiene uno storico delle attività che deve aderire a un insieme di regole che governano ciò che qualcuno può e non può fare per modificare il registro. Ad esempio, un indirizzo Bitcoin non può spendere più Bitcoin di quanti ne abbia ricevuti in precedenza. Queste regole sono alla base di tutte le transazioni su Bitcoin e su molte altre blockchain. -Mentre Ethereum ha la propria criptovaluta nativa (Ether) che segue quasi esattamente le stesse regole intuitive, consente anche una funzione molto più potente: i [contratti intelligenti](/developers/docs/smart-contracts/). Per questa caratteristica più complessa, è necessaria un'analogia più complessa. Invece di essere un libro mastro distribuito, Ethereum è una [macchina di stato distribuita](https://wikipedia.org/wiki/Finite-state_machine). Lo stato di Ethereum è una grande struttura di dati che contiene non solo tutti i conti e i saldi, ma uno _stato della macchina_, che può cambiare da blocco a blocco secondo una serie predefinita di regole e che può eseguire il codice arbitrario della macchina. Le regole specifiche di cambio stato da blocco a blocco sono definite dall'EVM. +Sebbene Ethereum abbia la propria criptovaluta nativa (ether) che segue quasi esattamente le stesse regole intuitive, abilita anche una funzione molto più potente: i [contratti intelligenti](/developers/docs/smart-contracts/). Per questa funzionalità più complessa, è necessaria un'analogia più sofisticata. Invece di un registro distribuito, Ethereum è una [macchina a stati](https://wikipedia.org/wiki/Finite-state_machine) distribuita. Lo stato di Ethereum è una grande struttura dati che contiene non solo tutti gli account e i saldi, ma uno _stato della macchina_, che può cambiare da blocco a blocco secondo un insieme predefinito di regole e che può eseguire codice macchina arbitrario. Le regole specifiche per il cambiamento di stato da blocco a blocco sono definite dall'EVM. -![Ddiagramma che mostra la composizione dell'EVM](./evm.png) _Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Un diagramma che mostra la composizione dell'EVM](./evm.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## La funzione di transizione di stato di Ethereum {#the-ethereum-state-transition-function} -L'EVM si comporta come una funzione matematica: dato un input, produce un output deterministico. Quindi è più utile descrivere formalmente Ethereum come avente una **funzione di transizione di stato**: +L'EVM si comporta come farebbe una funzione matematica: dato un input, produce un output deterministico. È quindi piuttosto utile descrivere più formalmente Ethereum come avente una **funzione di transizione di stato**: ``` Y(S, T)= S' ``` -Dato un vecchio stato valido `(S)` e un nuovo set di transazioni valide `(T)`, la funzione di transizione di stato di Ethereum `Y(S, T)` produce un nuovo stato di output valido `S'` +Dato un vecchio stato valido `(S)` e un nuovo insieme di transazioni valide `(T)`, la funzione di transizione di stato di Ethereum `Y(S, T)` produce un nuovo stato di output valido `S'` ### Stato {#state} -Nel contesto di Ethereum, lo stato è un'enorme struttura di dati detta un [albero di Patricia Merkle modificato](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), che contiene tutti i [conti](/developers/docs/accounts/) collegati da hash e riducibili a un singolo hash di radice, archiviato sulla blockchain. +Nel contesto di Ethereum, lo stato è un'enorme struttura dati chiamata [Trie di Merkle Patricia modificato](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), che mantiene tutti gli [account](/developers/docs/accounts/) collegati da hash e riducibili a un singolo hash radice memorizzato sulla blockchain. ### Transazioni {#transactions} -Le transazioni sono istruzioni firmate crittograficamente, provenienti dai conti. Esistono due tipi di transazioni: quelle che danno luogo a chiamate di messaggio e quelle che invece danno luogo alla creazione di contratti. +Le transazioni sono istruzioni firmate crittograficamente dagli account. Esistono due tipi di transazioni: quelle che risultano in chiamate di messaggi e quelle che risultano nella creazione di contratti. -La creazione del contratto risulta nella creazione di un nuovo conto del contratto, contenente bytecode compilato del [contratto intelligente](/developers/docs/smart-contracts/anatomy/). Ogni volta che un altro conto effettua una chiamata di messaggio a quel contratto, esegue il suo bytecode. +La creazione di un contratto risulta nella creazione di un nuovo account del contratto contenente il bytecode compilato del [contratto intelligente](/developers/docs/smart-contracts/anatomy/). Ogni volta che un altro account effettua una chiamata di messaggio a quel contratto, ne esegue il bytecode. ## Istruzioni dell'EVM {#evm-instructions} -L'EVM viene eseguita come una [macchina a stack](https://wikipedia.org/wiki/Stack_machine) con una profondità di 1024 elementi. Ogni elemento è una parola di 256 bit, scelta per la facilità d'uso con la crittografia a 256 bit (come gli hash Keccak-256 o le firme secp256k1). +L'EVM viene eseguita come una [macchina a stack](https://wikipedia.org/wiki/Stack_machine) con una profondità di 1024 elementi. Ogni elemento è una parola a 256 bit, scelta per la facilità d'uso con la crittografia a 256 bit (come gli hash Keccak-256 o le firme secp256k1). -Durante l'esecuzione, l'EVM mantiene una _memoria_ transitoria (sotto forma di array di byte con indirizzamento a parola), che non rimane persistente tra le transazioni. +Durante l'esecuzione, l'EVM mantiene una _memoria_ transitoria (come un array di byte indirizzato a parole), che non persiste tra le transazioni. -I contratti, comunque, contengono un albero d'_archiviazione_ di Merkle Patricia (come un insieme indirizzabile alle parole contenute), associato al conto in questione e parte dello stato globale. +### Archiviazione transitoria -Il bytecode compilato del contratto intelligente è eseguito come un numero degli [opcode](/developers/docs/evm/opcodes) dell'EVM, che eseguono operazioni standard dello stack come `XOR`, `AND`, `ADD`, `SUB`, etc. L'EVM implementa anche una serie di operazioni di stack specifiche della blockchain, come `INDIRIZZO`, `SALDO`, `BLOCKHASH`, etc. +L'archiviazione transitoria è un archivio chiave-valore per transazione a cui si accede tramite gli opcode `TSTORE` e `TLOAD`. Persiste attraverso tutte le chiamate interne durante la stessa transazione, ma viene cancellata alla fine della transazione. A differenza della memoria, l'archiviazione transitoria è modellata come parte dello stato dell'EVM piuttosto che del frame di esecuzione, eppure non viene confermata nello stato globale. L'archiviazione transitoria consente la condivisione temporanea dello stato in modo efficiente in termini di gas tra le chiamate interne durante una transazione. -![Un diagramma che mostra dove è necessario il gas per le operazioni dell'EVM](../gas/gas.png) _Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +### Archiviazione + +I contratti contengono un trie di _archiviazione_ di Merkle Patricia (come un array di parole indirizzabile a parole), associato all'account in questione e parte dello stato globale. Questa archiviazione persistente differisce dall'archiviazione transitoria, che è disponibile solo per la durata di una singola transazione e non fa parte del trie di archiviazione persistente dell'account. + +### Opcode + +Il bytecode compilato del contratto intelligente viene eseguito come una serie di [opcode](/developers/docs/evm/opcodes) dell'EVM, che eseguono operazioni standard di stack come `XOR`, `AND`, `ADD`, `SUB`, ecc. L'EVM implementa anche una serie di operazioni di stack specifiche per la blockchain, come `ADDRESS`, `BALANCE`, `BLOCKHASH`, ecc. Il set di opcode include anche `TSTORE` e `TLOAD`, che forniscono l'accesso all'archiviazione transitoria. + +![Un diagramma che mostra dove è necessario il gas per le operazioni dell'EVM](../gas/gas.png) +_Diagrammi adattati da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## Implementazioni dell'EVM {#evm-implementations} -Tutte le implementazioni dell'EVM devono rispettare le specifiche descritte nello Yellowpaper di Ethereum. +Tutte le implementazioni dell'EVM devono aderire alle specifiche descritte nell'Ethereum Yellowpaper. -Nei nove anni di storia di Ethereum, l'EVM ha subito diverse revisioni, ed esistono diverse implementazioni dell'EVM in vari linguaggi di programmazione. +Nel corso dei dieci anni di storia di Ethereum, l'EVM ha subito diverse revisioni e ci sono diverse implementazioni dell'EVM in vari linguaggi di programmazione. -Tutti i [client Ethereum](/developers/docs/nodes-and-clients/#execution-clients) includono un'implementazione dell'EVM. Inoltre, esistono diverse implementazioni standalone, tra cui: +I [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) di Ethereum includono un'implementazione dell'EVM. Inoltre, ci sono molteplici implementazioni indipendenti, tra cui: - [Py-EVM](https://github.com/ethereum/py-evm) - _Python_ - [evmone](https://github.com/ethereum/evmone) - _C++_ - [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ - [revm](https://github.com/bluealloy/revm) - _Rust_ -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} - [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf) -- [Jellopaper o KEVM: Semantica di EVM in K](https://jellopaper.org/) +- [Jellopaper aka KEVM: Semantics of EVM in K](https://jellopaper.org/) - [The Beigepaper](https://github.com/chronaeon/beigepaper) -- [Ethereum Virtual Machine Opcodes](https://www.ethervm.io/) -- [Documentazione di riferimento del codice operativo della macchina virtuale di Ethereum](https://www.evm.codes/) -- [Una breve introduzione alla documentazione di Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) -- [Padroneggiare Ethereum - La Macchina Virtuale di Ethereum](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) +- [Opcode della Macchina Virtuale di Ethereum](https://www.ethervm.io/) +- [Riferimento interattivo agli opcode della Macchina Virtuale di Ethereum](https://www.evm.codes/) +- [Una breve introduzione nella documentazione di Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) +- [Mastering Ethereum - The Ethereum Virtual Machine](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) ## Argomenti correlati {#related-topics} - [Gas](/developers/docs/gas/) + +## Tutorial: Macchina Virtuale di Ethereum (EVM) / Opcode su Ethereum {#tutorials} + +- [Comprendere le specifiche dell'EVM dello Yellow Paper](/developers/tutorials/yellow-paper-evm/) _– Una guida passo passo alle specifiche formali dell'EVM tratte dall'Ethereum Yellow Paper._ +- [Ingegneria inversa di un contratto](/developers/tutorials/reverse-engineering-a-contract/) _– Come fare ingegneria inversa di un contratto intelligente compilato utilizzando gli opcode dell'EVM._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/evm/opcodes/index.md b/public/content/translations/it/developers/docs/evm/opcodes/index.md index 3bc11b514ee..aee9910a2ee 100644 --- a/public/content/translations/it/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/it/developers/docs/evm/opcodes/index.md @@ -6,169 +6,172 @@ lang: it ## Panoramica {#overview} -Questa è una versione aggiornata della pagina di riferimento dell'EVM a [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). Tratta anche dallo [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), dal [Jello Paper](https://jellopaper.org/evm/) e dall'implementazione di [geth](https://github.com/ethereum/go-ethereum). Si tratta di un riferimento accessibile, ma non particolarmente rigoroso. Se vuoi essere certo della correttezza e consapevole di ogni caso limite, è consigliabile utilizzare lo Jello Paper o un'implementazione del client. +Questa è una versione aggiornata della pagina di riferimento dell'EVM su [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes). +Tratta anche dallo [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf), dal [Jello Paper](https://jellopaper.org/evm/) e dall'implementazione di [geth](https://github.com/ethereum/go-ethereum). +Vuole essere un riferimento accessibile, ma non è particolarmente rigoroso. +Se si vuole avere la certezza della correttezza e conoscere ogni caso limite, è consigliabile utilizzare il Jello Paper o un'implementazione del client. -Cerchi un riferimento interattivo? Dai un'occhiata su [evm.codes](https://www.evm.codes/). +Cerchi un riferimento interattivo? Dai un'occhiata a [evm.codes](https://www.evm.codes/). -Per le operazioni con costi del carburante dinamici, consulta [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). +Per le operazioni con costi del gas dinamici, vedi [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). -💡 Consiglio rapido: per visualizzare le righe intere, usa `[shift] + scorrimento` per scorrere orizzontalmente su desktop. +💡 Suggerimento rapido: per visualizzare le righe intere, usa `[shift] + scroll` per scorrere orizzontalmente su desktop. -| Stack | Nome | Gas | Stack Iniziale | Stack Risultante | Mem / Archiviazione | Note | -|:-----:|:-------------- |:------------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 00 | STOP | 0 | | | | halt execution | -| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 addition modulo 2\*\*256 | -| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 multiplication modulo 2\*\*256 | -| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 addition modulo 2\*\*256 | -| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 division | -| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 division | -| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 modulus | -| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 modulus | -| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 addition modulo N | -| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 multiplication modulo N | -| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 exponentiation modulo 2\*\*256 | -| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x` from `(b+1)` bytes to 32 bytes | -| 0C-0F | _invalid_ | | | | | | -| 10 | LT | 3 | `a, b` | `a < b` | | uint256 less-than | -| 11 | GT | 3 | `a, b` | `a > b` | | uint256 greater-than | -| 12 | SLT | 3 | `a, b` | `a < b` | | int256 less-than | -| 13 | SGT | 3 | `a, b` | `a > b` | | int256 greater-than | -| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 equality | -| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | -| 16 | AND | 3 | `a, b` | `a && b` | | bitwise AND | -| 17 | OR | 3 | `a, b` | `a \|\| b` | | bitwise OR | -| 18 | XOR | 3 | `a, b` | `a ^ b` | | bitwise XOR | -| 19 | NOT | 3 | `a` | `~a` | | bitwise NOT | -| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`th byte of (u)int256 `x`, from the left | -| 1B | SHL | 3 | `shift, val` | `val << shift` | | shift left | -| 1C | SHR | 3 | `shift, val` | `val >> shift` | | logical shift right | -| 1D | SAR | 3 | `shift, val` | `val >> shift` | | arithmetic shift right | -| 1E-1F | _invalid_ | | | | | | -| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | -| 21-2F | _invalid_ | | | | | | -| 30 | ADDRESS | 2 | `.` | `address(this)` | | address of executing contract | -| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | balance, in wei | -| 32 | ORIGIN | 2 | `.` | `tx.origin` | | address that originated the tx | -| 33 | CALLER | 2 | `.` | `msg.sender` | | address of msg sender | -| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg value, in wei | -| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | read word from msg data at index `idx` | -| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | length of msg data, in bytes | -| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copy msg data | -| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | length of executing contract's code, in bytes | -| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copy executing contract's bytecode | -| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | gas price of tx, in wei per unit gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | -| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | size of code at addr, in bytes | -| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copy code from `addr` | -| 3D | RETURNDATASIZE | 2 | `.` | `size` | | size of returned data from last external call, in bytes | -| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copy returned data from last external call | -| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | indirizzo del propositore del blocco corrente | -| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp of current block | -| 43 | NUMBER | 2 | `.` | `block.number` | | number of current block | -| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | randomness beacon | -| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | gas limit of current block | -| 46 | CHAINID | 2 | `.` | `chain_id` | | push current [chain id](https://eips.ethereum.org/EIPS/eip-155) onto stack | -| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | balance of executing contract, in wei | -| 48 | BASEFEE | 2 | `.` | `block.basefee` | | base fee of current block | -| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | -| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | commissione di base del blob del blocco corrente ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | -| 4B-4F | _invalid_ | | | | | | -| 50 | POP | 2 | `_anon` | `.` | | remove item from top of stack and discard it | -| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | read word from memory at offset `ost` | -| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | write a word to memory | -| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | write a single byte to memory | -| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | read word from storage | -| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | write word to storage | -| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` mark that `pc` is only assigned if `dst` is a valid jumpdest | -| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | -| 58 | PC | 2 | `.` | `$pc` | | program counter | -| 59 | MSIZE | 2 | `.` | `len(mem)` | | size of memory in current execution context, in bytes | -| 5A | GAS | 2 | `.` | `gasRemaining` | | | -| 5B | JUMPDEST | 1 | | | mark valid jump destination | a valid jump destination for example a jump destination not inside the push data | -| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | legge la parola dall'archiviazione transiente ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | scrive la parola all'archiviazione transiente ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | -| 5E | MCOPY | 3+3\*parole+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | copia la memoria da un'area a un'altra ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | -| 5F | PUSH0 | 2 | `.` | `uint8` | | spinge il valore costante 0 allo stack | -| 60 | PUSH1 | 3 | `.` | `uint8` | | push 1-byte value onto stack | -| 61 | PUSH2 | 3 | `.` | `uint16` | | push 2-byte value onto stack | -| 62 | PUSH3 | 3 | `.` | `uint24` | | push 3-byte value onto stack | -| 63 | PUSH4 | 3 | `.` | `uint32` | | push 4-byte value onto stack | -| 64 | PUSH5 | 3 | `.` | `uint40` | | push 5-byte value onto stack | -| 65 | PUSH6 | 3 | `.` | `uint48` | | push 6-byte value onto stack | -| 66 | PUSH7 | 3 | `.` | `uint56` | | push 7-byte value onto stack | -| 67 | PUSH8 | 3 | `.` | `uint64` | | push 8-byte value onto stack | -| 68 | PUSH9 | 3 | `.` | `uint72` | | push 9-byte value onto stack | -| 69 | PUSH10 | 3 | `.` | `uint80` | | push 10-byte value onto stack | -| 6A | PUSH11 | 3 | `.` | `uint88` | | push 11-byte value onto stack | -| 6B | PUSH12 | 3 | `.` | `uint96` | | push 12-byte value onto stack | -| 6C | PUSH13 | 3 | `.` | `uint104` | | push 13-byte value onto stack | -| 6D | PUSH14 | 3 | `.` | `uint112` | | push 14-byte value onto stack | -| 6E | PUSH15 | 3 | `.` | `uint120` | | push 15-byte value onto stack | -| 6F | PUSH16 | 3 | `.` | `uint128` | | push 16-byte value onto stack | -| 70 | PUSH17 | 3 | `.` | `uint136` | | push 17-byte value onto stack | -| 71 | PUSH18 | 3 | `.` | `uint144` | | push 18-byte value onto stack | -| 72 | PUSH19 | 3 | `.` | `uint152` | | push 19-byte value onto stack | -| 73 | PUSH20 | 3 | `.` | `uint160` | | push 20-byte value onto stack | -| 74 | PUSH21 | 3 | `.` | `uint168` | | push 21-byte value onto stack | -| 75 | PUSH22 | 3 | `.` | `uint176` | | push 22-byte value onto stack | -| 76 | PUSH23 | 3 | `.` | `uint184` | | push 23-byte value onto stack | -| 77 | PUSH24 | 3 | `.` | `uint192` | | push 24-byte value onto stack | -| 78 | PUSH25 | 3 | `.` | `uint200` | | push 25-byte value onto stack | -| 79 | PUSH26 | 3 | `.` | `uint208` | | push 26-byte value onto stack | -| 7A | PUSH27 | 3 | `.` | `uint216` | | push 27-byte value onto stack | -| 7B | PUSH28 | 3 | `.` | `uint224` | | push 28-byte value onto stack | -| 7C | PUSH29 | 3 | `.` | `uint232` | | push 29-byte value onto stack | -| 7D | PUSH30 | 3 | `.` | `uint240` | | push 30-byte value onto stack | -| 7E | PUSH31 | 3 | `.` | `uint248` | | push 31-byte value onto stack | -| 7F | PUSH32 | 3 | `.` | `uint256` | | push 32-byte value onto stack | -| 80 | DUP1 | 3 | `a` | `a, a` | | clone 1st value on stack | -| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clone 2nd value on stack | -| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clone 3rd value on stack | -| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clone 4th value on stack | -| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clone 5th value on stack | -| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clone 6th value on stack | -| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clone 7th value on stack | -| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clone 8th value on stack | -| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clone 9th value on stack | -| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clone 10th value on stack | -| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clone 11th value on stack | -| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clone 12th value on stack | -| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clone 13th value on stack | -| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clone 14th value on stack | -| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clone 15th value on stack | -| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clone 16th value on stack | -| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | -| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | -| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | -| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | -| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | -| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | -| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | -| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | -| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | -| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | -| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | -| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | -| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | -| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | -| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | -| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | -| A5-EF | _invalid_ | | | | | | -| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | -| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | same as DELEGATECALL, but does not propagate original msg.sender and msg.value | -| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | return mem[ost:ost+len-1] | -| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | -| F6-F9 | _invalid_ | | | | | | -| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | -| FB-FC | _invalid_ | | | | | | -| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | -| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | designated invalid opcode - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | -| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | invia tutti gli ETH ad `addr`; se eseguito nella stessa transazione in cui un contratto è stato creato, lo distrugge | +| Stack | Name | Gas | Initial Stack | Resulting Stack | Mem / Storage | Notes | +| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | +| 00 | STOP | 0 | | | | interrompe l'esecuzione | +| 01 | ADD | 3 | `a, b` | `a + b` | | addizione (u)int256 modulo 2\*\*256 | +| 02 | MUL | 5 | `a, b` | `a * b` | | moltiplicazione (u)int256 modulo 2\*\*256 | +| 03 | SUB | 3 | `a, b` | `a - b` | | sottrazione (u)int256 modulo 2\*\*256 | +| 04 | DIV | 5 | `a, b` | `a // b` | | divisione uint256 | +| 05 | SDIV | 5 | `a, b` | `a // b` | | divisione int256 | +| 06 | MOD | 5 | `a, b` | `a % b` | | modulo uint256 | +| 07 | SMOD | 5 | `a, b` | `a % b` | | modulo int256 | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | addizione (u)int256 modulo N | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | moltiplicazione (u)int256 modulo N | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | esponenziazione uint256 modulo 2\*\*256 | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [estensione del segno](https://wikipedia.org/wiki/Sign_extension) di `x` da `(b+1)` byte a 32 byte | +| 0C-0F | _non valido_ | +| 10 | LT | 3 | `a, b` | `a < b` | | minore di uint256 | +| 11 | GT | 3 | `a, b` | `a > b` | | maggiore di uint256 | +| 12 | SLT | 3 | `a, b` | `a < b` | | minore di int256 | +| 13 | SGT | 3 | `a, b` | `a > b` | | maggiore di int256 | +| 14 | EQ | 3 | `a, b` | `a == b` | | uguaglianza (u)int256 | +| 15 | ISZERO | 3 | `a` | `a == 0` | | iszero (u)int256 | +| 16 | AND | 3 | `a, b` | `a && b` | | AND bit a bit | +| 17 | OR | 3 | `a, b` | `a \|\| b` | | OR bit a bit | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | XOR bit a bit | +| 19 | NOT | 3 | `a` | `~a` | | NOT bit a bit | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | `i`-esimo byte di (u)int256 `x`, da sinistra | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | scorrimento a sinistra | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | scorrimento logico a destra | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | scorrimento aritmetico a destra | +| 1E-1F | _non valido_ | +| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | +| 21-2F | _non valido_ | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | indirizzo del contratto in esecuzione | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | saldo, in wei | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | indirizzo che ha originato la transazione | +| 33 | CALLER | 2 | `.` | `msg.sender` | | indirizzo del mittente del msg | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | valore del msg, in wei | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | legge una parola dai dati del msg all'indice `idx` | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | lunghezza dei dati del msg, in byte | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | copia i dati del msg | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | lunghezza del codice del contratto in esecuzione, in byte | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | copia il bytecode del contratto in esecuzione | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | prezzo del gas della transazione, in wei per unità di gas [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | dimensione del codice all'indirizzo addr, in byte | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | copia il codice da `addr` | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | dimensione dei dati restituiti dall'ultima chiamata esterna, in byte | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | copia i dati restituiti dall'ultima chiamata esterna | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `hash` | | hash = addr.exists ? keccak256(addr.code) : 0 | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | indirizzo del proponente del blocco corrente | +| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | timestamp del blocco corrente | +| 43 | NUMBER | 2 | `.` | `block.number` | | numero del blocco corrente | +| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | beacon di casualità | +| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | limite del gas del blocco corrente | +| 46 | CHAINID | 2 | `.` | `chain_id` | | inserisce l'[ID della catena](https://eips.ethereum.org/EIPS/eip-155) corrente nello stack | +| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | saldo del contratto in esecuzione, in wei | +| 48 | BASEFEE | 2 | `.` | `block.basefee` | | commissione di base del blocco corrente | +| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | +| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | commissione di base del blob del blocco corrente ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | +| 4B-4F | _non valido_ | +| 50 | POP | 2 | `_anon` | `.` | | rimuove l'elemento dalla cima dello stack e lo scarta | +| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | legge una parola dalla memoria all'offset `ost` | +| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | scrive una parola in memoria | +| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | scrive un singolo byte in memoria | +| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `storage[key]` | | legge una parola dallo storage | +| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | storage[key] := val | scrive una parola nello storage | +| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` segna che `pc` viene assegnato solo se `dst` è un jumpdest valido | +| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ? dst : $pc + 1` | +| 58 | PC | 2 | `.` | `$pc` | | contatore di programma | +| 59 | MSIZE | 2 | `.` | `len(mem)` | | dimensione della memoria nel contesto di esecuzione corrente, in byte | +| 5A | GAS | 2 | `.` | `gasRemaining` | | +| 5B | JUMPDEST | 1 | | | segna una destinazione di salto valida | una destinazione di salto valida, ad esempio una destinazione di salto non all'interno dei dati di push | +| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | legge una parola dallo storage transitorio ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | +| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | scrive una parola nello storage transitorio ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | +| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | copia la memoria da un'area all'altra ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | +| 5F | PUSH0 | 2 | `.` | `uint8` | | inserisce il valore costante 0 nello stack | +| 60 | PUSH1 | 3 | `.` | `uint8` | | inserisce un valore di 1 byte nello stack | +| 61 | PUSH2 | 3 | `.` | `uint16` | | inserisce un valore di 2 byte nello stack | +| 62 | PUSH3 | 3 | `.` | `uint24` | | inserisce un valore di 3 byte nello stack | +| 63 | PUSH4 | 3 | `.` | `uint32` | | inserisce un valore di 4 byte nello stack | +| 64 | PUSH5 | 3 | `.` | `uint40` | | inserisce un valore di 5 byte nello stack | +| 65 | PUSH6 | 3 | `.` | `uint48` | | inserisce un valore di 6 byte nello stack | +| 66 | PUSH7 | 3 | `.` | `uint56` | | inserisce un valore di 7 byte nello stack | +| 67 | PUSH8 | 3 | `.` | `uint64` | | inserisce un valore di 8 byte nello stack | +| 68 | PUSH9 | 3 | `.` | `uint72` | | inserisce un valore di 9 byte nello stack | +| 69 | PUSH10 | 3 | `.` | `uint80` | | inserisce un valore di 10 byte nello stack | +| 6A | PUSH11 | 3 | `.` | `uint88` | | inserisce un valore di 11 byte nello stack | +| 6B | PUSH12 | 3 | `.` | `uint96` | | inserisce un valore di 12 byte nello stack | +| 6C | PUSH13 | 3 | `.` | `uint104` | | inserisce un valore di 13 byte nello stack | +| 6D | PUSH14 | 3 | `.` | `uint112` | | inserisce un valore di 14 byte nello stack | +| 6E | PUSH15 | 3 | `.` | `uint120` | | inserisce un valore di 15 byte nello stack | +| 6F | PUSH16 | 3 | `.` | `uint128` | | inserisce un valore di 16 byte nello stack | +| 70 | PUSH17 | 3 | `.` | `uint136` | | inserisce un valore di 17 byte nello stack | +| 71 | PUSH18 | 3 | `.` | `uint144` | | inserisce un valore di 18 byte nello stack | +| 72 | PUSH19 | 3 | `.` | `uint152` | | inserisce un valore di 19 byte nello stack | +| 73 | PUSH20 | 3 | `.` | `uint160` | | inserisce un valore di 20 byte nello stack | +| 74 | PUSH21 | 3 | `.` | `uint168` | | inserisce un valore di 21 byte nello stack | +| 75 | PUSH22 | 3 | `.` | `uint176` | | inserisce un valore di 22 byte nello stack | +| 76 | PUSH23 | 3 | `.` | `uint184` | | inserisce un valore di 23 byte nello stack | +| 77 | PUSH24 | 3 | `.` | `uint192` | | inserisce un valore di 24 byte nello stack | +| 78 | PUSH25 | 3 | `.` | `uint200` | | inserisce un valore di 25 byte nello stack | +| 79 | PUSH26 | 3 | `.` | `uint208` | | inserisce un valore di 26 byte nello stack | +| 7A | PUSH27 | 3 | `.` | `uint216` | | inserisce un valore di 27 byte nello stack | +| 7B | PUSH28 | 3 | `.` | `uint224` | | inserisce un valore di 28 byte nello stack | +| 7C | PUSH29 | 3 | `.` | `uint232` | | inserisce un valore di 29 byte nello stack | +| 7D | PUSH30 | 3 | `.` | `uint240` | | inserisce un valore di 30 byte nello stack | +| 7E | PUSH31 | 3 | `.` | `uint248` | | inserisce un valore di 31 byte nello stack | +| 7F | PUSH32 | 3 | `.` | `uint256` | | inserisce un valore di 32 byte nello stack | +| 80 | DUP1 | 3 | `a` | `a, a` | | clona il 1° valore nello stack | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | clona il 2° valore nello stack | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | clona il 3° valore nello stack | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | clona il 4° valore nello stack | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | clona il 5° valore nello stack | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | clona il 6° valore nello stack | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | clona il 7° valore nello stack | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | clona l'8° valore nello stack | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | clona il 9° valore nello stack | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | clona il 10° valore nello stack | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | clona l'11° valore nello stack | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | clona il 12° valore nello stack | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | clona il 13° valore nello stack | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | clona il 14° valore nello stack | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | clona il 15° valore nello stack | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | clona il 16° valore nello stack | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | +| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | +| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | +| A5-EF | _non valido_ | +| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | +| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | gas, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | +| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | uguale a DELEGATECALL, ma non propaga il msg.sender e il msg.value originali | +| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | restituisce mem[ost:ost+len-1] | +| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | +| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | +| F6-F9 | _non valido_ | +| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `gas, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | +| FB-FC | _non valido_ | +| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | +| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | opcode non valido designato - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | +| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | invia tutti gli ETH a `addr`; se eseguito nella stessa transazione in cui è stato creato un contratto, distrugge il contratto | \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/frameworks/index.md b/public/content/translations/it/developers/docs/frameworks/index.md index 050f0852693..cdf12809f6c 100644 --- a/public/content/translations/it/developers/docs/frameworks/index.md +++ b/public/content/translations/it/developers/docs/frameworks/index.md @@ -1,138 +1,138 @@ --- -title: Framework di sviluppo delle dapp -description: Scopri Esplora i vantaggi dei framework e confronta le opzioni disponibili. +title: Framework di sviluppo per dApp +description: Esplora i vantaggi dei framework e confronta le opzioni disponibili. lang: it --- ## Introduzione ai framework {#introduction-to-frameworks} -Sviluppare una dapp completa richiede diverse tecnologie. I framework software includono molte delle funzionalità necessarie oppure offrono semplici plugin per scegliere gli strumenti richiesti. +Costruire una dApp a tutti gli effetti richiede diversi elementi tecnologici. I framework software includono molte delle funzionalità necessarie o forniscono semplici sistemi di plugin per scegliere gli strumenti desiderati. -I framework sono già dotati di molte funzionalità, come: +I framework sono dotati di molte funzionalità pronte all'uso, come: -- Funzionalità per avviare un'istanza di blockchain locale. +- Funzionalità per avviare un'istanza locale della blockchain. - Utilità per compilare e testare i tuoi contratti intelligenti. -- Componenti aggiuntivi di sviluppo client per creare un'applicazione rivolta all'utente all'interno dello stesso progetto/repository. -- Configurazione per connettersi a reti Ethereum e distribuire contratti, a un'istanza locale o a una delle reti pubbliche di Ethereum. -- Distribuzione di app decentralizzate - integrazioni con opzioni di archiviazione come IPFS. +- Componenti aggiuntivi per lo sviluppo del client per creare la tua applicazione rivolta all'utente all'interno dello stesso progetto/repository. +- Configurazione per connettersi alle reti di Ethereum e distribuire contratti, sia su un'istanza in esecuzione locale, sia su una delle reti pubbliche di Ethereum. +- Distribuzione di app decentralizzate: integrazioni con opzioni di archiviazione come IPFS. ## Prerequisiti {#prerequisites} -Prima di iniziare a studiare i framework, raccomandiamo la lettura della nostra introduzione alle [dApp](/developers/docs/dapps/) e allo [stack di Ethereum](/developers/docs/ethereum-stack/). +Prima di immergerti nei framework, ti consigliamo di leggere la nostra introduzione alle [dApp](/developers/docs/dapps/) e allo [stack di Ethereum](/developers/docs/ethereum-stack/). ## Framework disponibili {#available-frameworks} -**Foundry** - **_Foundry è un toolkit dalla straordinaria velocità, portatile e modulare per lo sviluppo di applicazioni di Ethereum._** +**Foundry** - **_Foundry è un toolkit incredibilmente veloce, portatile e modulare per lo sviluppo di applicazioni su Ethereum_** - [Installa Foundry](https://book.getfoundry.sh/) -- [Guida a Foundry](https://book.getfoundry.sh/) +- [Libro di Foundry](https://book.getfoundry.sh/) - [Chat della community di Foundry su Telegram](https://t.me/foundry_support) - [Awesome Foundry](https://github.com/crisgarner/awesome-foundry) -**Hardhat:** **_ ambiente di sviluppo Ethereum per professionisti_** +**Hardhat -** **_Ambiente di sviluppo su Ethereum per professionisti._** - [hardhat.org](https://hardhat.org) - [GitHub](https://github.com/nomiclabs/hardhat) -**Ape**: **_Lo strumento di sviluppo di contratti intelligenti per utilizzatori di Python, Data Scientist e Professionisti della Sicurezza._** +**Ape -** **_Lo strumento di sviluppo di contratti intelligenti per programmatori Python, scienziati dei dati e professionisti della sicurezza._** - [Documentazione](https://docs.apeworx.io/ape/stable/) - [GitHub](https://github.com/ApeWorX/ape) -**Web3j -** **_Una piattaforma per sviluppare applicazioni della blockchain sulla JVM_** +**Web3j -** **_Una piattaforma per lo sviluppo di applicazioni blockchain sulla JVM._** -- [Home page](https://www.web3labs.com/web3j-sdk) +- [Homepage](https://www.web3labs.com/web3j-sdk) - [Documentazione](https://docs.web3j.io) - [GitHub](https://github.com/web3j/web3j) -**ethers-kt -** **_Libreria asincrona e ad alte prestazioni per Kotlin/Java/Android per le blockchain basate sull'EVM._** +**ethers-kt -** **_Libreria asincrona e ad alte prestazioni in Kotlin/Java/Android per blockchain basate su EVM._** - [GitHub](https://github.com/Kr1ptal/ethers-kt) - [Esempi](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) - [Discord](https://discord.gg/rx35NzQGSb) -**Create Eth App -** **_Crea app per Ethereum con un comando. Offre una vasta scelta di framework per l'interfaccia utente e modelli DeFI tra cui scegliere._** +**Create Eth App -** **_Crea app basate su Ethereum con un solo comando. Viene fornito con un'ampia offerta di framework per l'interfaccia utente e modelli DeFi tra cui scegliere._** - [GitHub](https://github.com/paulrberg/create-eth-app) - [Modelli](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) -**Scaffold-Eth -** **_I componenti Ethers.js + Hardhat + React e gli hook per web3: tutto ciò che ti serve per iniziare a creare applicazioni decentralizzate alimentate da contratti intelligenti._** +**Scaffold-Eth -** **_Ethers.js + Hardhat + componenti e hook React per il web3: tutto ciò di cui hai bisogno per iniziare a creare applicazioni decentralizzate basate su contratti intelligenti._** - [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) -**Tenderly -** **_Piattaforma di sviluppo di Web3 che consente agli sviluppatori della blockchain di costruire, testare, eseguire il debug, monitorare e gestire i contratti intelligenti, nonché di migliorare l'UX della dapp._** +**Tenderly -** **_Piattaforma di sviluppo web3 che consente agli sviluppatori blockchain di creare, testare, eseguire il debug, monitorare e gestire contratti intelligenti e migliorare l'UX delle dApp._** -- [Sito Web](https://tenderly.co/) +- [Sito web](https://tenderly.co/) - [Documentazione](https://docs.tenderly.co/) -**The Graph -** **_ The Graph per interrogare efficientemente i dati della blockchain_** +**The Graph -** **_The Graph per interrogare i dati della blockchain in modo efficiente._** -- [Sito Web](https://thegraph.com/) +- [Sito web](https://thegraph.com/) - [Tutorial](/developers/tutorials/the-graph-fixing-web3-data-querying/) -**Alchemy -** **_Piattaforma di sviluppo Ethereum_** +**Alchemy -** **_Piattaforma di sviluppo su Ethereum._** - [alchemy.com](https://www.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) - [Discord](https://discord.com/invite/alchemyplatform) -**NodeReal -** **_Piattaforma di sviluppo per Ethereum._** +**NodeReal -** **_Piattaforma di sviluppo su Ethereum._** - [Nodereal.io](https://nodereal.io/) - [GitHub](https://github.com/node-real) - [Discord](https://discord.gg/V5k5gsuE) -**thirdweb SDK -** **_Sviluppa applicazioni web3 che possono interagire con i tuoi contratti intelligenti usando i nostri potenti SDK e CLI._** +**thirdweb SDK -** **_Crea applicazioni web3 che possono interagire con i tuoi contratti intelligenti utilizzando i nostri potenti SDK e CLI._** - [Documentazione](https://portal.thirdweb.com/sdk/) - [GitHub](https://github.com/thirdweb-dev/) -**Chainstack -** **_Piattaforma di sviluppo Web3 (Ethereum e altri)._** +**Chainstack -** **_Piattaforma di sviluppo Web3 (Ethereum e altro)._** - [chainstack.com](https://www.chainstack.com/) - [GitHub](https://github.com/chainstack) - [Discord](https://discord.gg/BSb5zfp9AT) -**Crossmint -** **_Piattaforma di sviluppo Web3 per imprese che ti consente di creare applicazioni NFT su tutte le principali catene EVM (e non solo)._** +**Crossmint -** **_Piattaforma di sviluppo web3 di livello aziendale, che ti consente di creare applicazioni NFT su tutte le principali catene EVM (e altre)._** -- [Sito Web](https://www.crossmint.com) +- [Sito web](https://www.crossmint.com) - [Documentazione](https://docs.crossmint.com) - [Discord](https://discord.com/invite/crossmint) -**Brownie -** **_ Ambiente di sviluppo e framework per il test basati su Python _** +**Brownie -** **_Ambiente di sviluppo e framework di test basato su Python._** - [Documentazione](https://eth-brownie.readthedocs.io/en/latest/) - [GitHub](https://github.com/eth-brownie/brownie) -- **Brownie non è al momento mantenuto** +- **Brownie non è attualmente mantenuto** -**OpenZeppelin SDK -** **_Il kit di strumenti definitivo per i contratti intelligenti: una suite di strumenti per aiutarti a sviluppare, compilare, aggiornare, distribuire e interagire con i contratti intelligenti_** +**OpenZeppelin SDK -** **_Il toolkit definitivo per i contratti intelligenti: una suite di strumenti per aiutarti a sviluppare, compilare, aggiornare, distribuire e interagire con i contratti intelligenti._** -- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) +- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) - [Forum della community](https://forum.openzeppelin.com/c/support/17) - **Lo sviluppo di OpenZeppelin SDK è terminato** -**Catapulta -** **_Strumento di distribuzione di contratti intelligenti multi-catena, automatizza le verifiche negli esploratori dei blocchi, tiene traccia dei contratti intelligenti distribuiti e condivide i rapporti di distribuzione; pronto all'uso per i progetti di Foundry e Hardhat._** +**Catapulta -** **_Strumento di distribuzione di contratti intelligenti multi-catena, automatizza le verifiche negli esploratori di blocchi, tiene traccia dei contratti intelligenti distribuiti e condivide i report di distribuzione, plug-n-play per progetti Foundry e Hardhat._** -- [Github](https://github.com/catapulta-sh) +- [GitHub](https://github.com/catapulta-sh) -**Covalent -** **_API della blockchain arricchite per oltre 200 catene._** +**GoldRush (basato su Covalent) -** **_GoldRush offre la suite di API di dati blockchain più completa per sviluppatori, analisti e aziende. Che tu stia costruendo una dashboard DeFi, un portafoglio, un bot di trading, un agente IA o una piattaforma di conformità, le API di dati forniscono un accesso rapido, accurato e intuitivo per gli sviluppatori ai dati on-chain essenziali di cui hai bisogno_** -- [covalenthq.com](https://www.covalenthq.com/) -- [Documentazione](https://www.covalenthq.com/docs/api/) +- [Sito web](https://goldrush.dev/) +- [Documentazione](https://goldrush.dev/docs/chains/ethereum) - [GitHub](https://github.com/covalenthq) - [Discord](https://www.covalenthq.com/discord/) -**Wake -** **_Assetto completo di Python per testare i contratti, fuzzing, distribuzione, scansione delle vulnerabilità e navigazione del codice_** +**Wake -** **_Framework Python all-in-one per test dei contratti, fuzzing, distribuzione, scansione delle vulnerabilità e navigazione del codice._** -- [Home page](https://getwake.io/) +- [Homepage](https://getwake.io/) - [Documentazione](https://ackeeblockchain.com/wake/docs/latest/) - [GitHub](https://github.com/Ackee-Blockchain/wake) -- [Estensione del codice VS](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) +- [Estensione per VS Code](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) -**Veramo**: **_Framework open source, modulare e agnostico che semplifica la creazione di identità decentralizzate e credenziali verificabili per gli sviluppatori di applicazioni decentralizzate nelle proprie applicazioni._** +**Veramo -** **_Framework open source, modulare e agnostico che semplifica agli sviluppatori di applicazioni decentralizzate la creazione di identità decentralizzate e credenziali verificabili nelle loro applicazioni._** -- [Home page](https://veramo.io/) +- [Homepage](https://veramo.io/) - [Documentazione](https://veramo.io/docs/basics/introduction) - [GitHub](https://github.com/uport-project/veramo) - [Discord](https://discord.com/invite/FRRBdjemHV) @@ -140,8 +140,12 @@ Prima di iniziare a studiare i framework, raccomandiamo la lettura della nostra ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [Configura un ambiente di sviluppo locale](/developers/local-environment/) +- [Configurare un ambiente di sviluppo locale](/developers/local-environment/) + +## Tutorial: Framework di sviluppo su Ethereum {#tutorials} + +- [Contratto intelligente Hello World per principianti – Fullstack](/developers/tutorials/hello-world-smart-contract-fullstack/) _– Crea e distribuisci un contratto intelligente hello world usando Hardhat, quindi connettilo a un frontend._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/gas/index.md b/public/content/translations/it/developers/docs/gas/index.md index b095fdcf0ba..e4aae111000 100644 --- a/public/content/translations/it/developers/docs/gas/index.md +++ b/public/content/translations/it/developers/docs/gas/index.md @@ -1,140 +1,151 @@ --- title: Gas e commissioni -metaTitle: "Gas e commissioni Ethereum: panoramica tecnica" -description: +metaTitle: "Gas e commissioni di Ethereum: panoramica tecnica" +description: Scopri le commissioni del gas di Ethereum, come vengono calcolate e il loro ruolo nella sicurezza della rete e nell'elaborazione delle transazioni. lang: it --- -Il gas è essenziale per la rete di Ethereum. È il carburante che gli consente di operare, proprio come un'automobile lo necessita per funzionare. +Il gas è essenziale per la rete [Ethereum](/). È il carburante che le permette di funzionare, allo stesso modo in cui un'auto ha bisogno di benzina per muoversi. ## Prerequisiti {#prerequisites} -Per capire meglio questa pagina, consigliamo innanzi tutto di leggere gli argomenti su [transazioni](/developers/docs/transactions/) ed [EVM](/developers/docs/evm/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima le [transazioni](/developers/docs/transactions/) e la [EVM](/developers/docs/evm/). ## Cos'è il gas? {#what-is-gas} -Gas fa riferimento all'unità che misura la quantità di sforzo di calcolo necessario per eseguire operazioni specifiche sulla rete di Ethereum. +Il gas si riferisce all'unità che misura la quantità di sforzo computazionale richiesto per eseguire operazioni specifiche sulla rete Ethereum. -Poiché ogni transazione di Ethereum richiede risorse computazionali per essere eseguita, queste risorse devono essere pagate per assicurare che Ethereum non sia vulnerabile a spam e che non si blocchi in cicli computazionali infiniti. Il pagamento per il calcolo è fatto sotto forma di commissioni di carburante (comunemente chiamato gas). +Poiché ogni transazione di Ethereum richiede risorse computazionali per essere eseguita, tali risorse devono essere pagate per garantire che Ethereum non sia vulnerabile allo spam e non possa bloccarsi in cicli computazionali infiniti. Il pagamento per il calcolo viene effettuato sotto forma di commissione del gas. -La commissione del gas è **la quantità di gas usato per eseguire alcune operazioni, moltiplicato per il costo di una unità di gas**. La commissione viene pagata indipendentemente dal fatto che la transazione abbia successo o fallisca. +La commissione del gas è **la quantità di gas utilizzata per eseguire un'operazione, moltiplicata per il costo per unità di gas**. La commissione viene pagata indipendentemente dal fatto che una transazione abbia successo o fallisca. -![Un diagramma che mostra dov'è necessario il gas nelle operazioni dell'EVM](./gas.png) _Diagramma adattato da [Ethereum EVM illustrato](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Un diagramma che mostra dove è necessario il gas nelle operazioni della EVM](./gas.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Le commissioni del gas devono essere pagate nella valuta nativa di Ethereum, l'ether (ETH). I prezzi del gas sono solitamente riportati in gwei, che è una sottounità di ETH. Ogni gwei equivale ad un miliardesimo di ETH (0,000000001 ETH or 10-9 ETH). +Le commissioni del gas devono essere pagate nella valuta nativa di Ethereum, l'ether (ETH). I prezzi del gas sono solitamente quotati in gwei, che è una denominazione di ETH. Ogni gwei è pari a un miliardesimo di ETH (0,000000001 ETH o 10-9 ETH). -Per esempio, invece di dire che il gas costa 0,000000001 ether, puoi dire che costa 1 gwei. +Ad esempio, invece di dire che il tuo gas costa 0,000000001 ether, puoi dire che il tuo gas costa 1 gwei. -La parola 'gwei' è l'abbreviazione di 'giga-wei', che significa 'miliardo di wei'. Un gwei equivale ad un miliardo di wei. Il wei (dal nome di [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), creatore di [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) è l'unità più piccola di ETH. +La parola 'gwei' è una contrazione di 'giga-wei', che significa 'un miliardo di wei'. Un gwei è uguale a un miliardo di wei. Il wei stesso (che prende il nome da [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), creatore di [b-money](https://www.investopedia.com/terms/b/bmoney.asp)) è l'unità più piccola di ETH. -## Come sono calcolate le commissioni del gas? {#how-are-gas-fees-calculated} +## Come vengono calcolate le commissioni del gas? {#how-are-gas-fees-calculated} -Quando invii una transazione, puoi impostare la quantità di gas che sei disposto a pagare. Offrendo una certa quantità di gas, stai facendo un'offerta per includere la tua transazione nel prossimo blocco. Se offri troppo poco, i validatori saranno meno disposti a scegliere la tua transazione per includerla, il che significa che la tua transazione potrebbe essere eseguita in ritardo o non essere eseguita affatto. Se offri troppo, potresti rischiare di sprecare un po' di ETH. Quindi, come si fa a capire quanto pagare? +Puoi impostare la quantità di gas che sei disposto a pagare quando invii una transazione. Offrendo una certa quantità di gas, fai un'offerta affinché la tua transazione venga inclusa nel blocco successivo. Se offri troppo poco, è meno probabile che i validatori scelgano la tua transazione per l'inclusione, il che significa che la tua transazione potrebbe essere eseguita in ritardo o non essere eseguita affatto. Se offri troppo, potresti sprecare degli ETH. Quindi, come fai a sapere quanto pagare? -Il gas totale che paghi è diviso in due componenti: la `base fee` e la `priority fee` (mancia). +Il gas totale che paghi è diviso in due componenti: la `commissione di base` e la `commissione di priorità` (mancia). -La `base fee` è stabilita dal protocollo - è necessario pagare almeno questo importo affinché la tua transazione sia considerata valida. La `priority fee` è una mancia che si aggiunge alla commissione base per rendere la tua transazione accattivante per i validatori in modo che la scelgano per includerla nel blocco successivo. +La `commissione di base` è impostata dal protocollo: devi pagare almeno questo importo affinché la tua transazione sia considerata valida. La `commissione di priorità` è una mancia che aggiungi alla commissione di base per rendere la tua transazione attraente per i validatori, in modo che la scelgano per l'inclusione nel blocco successivo. -Una transazione che paga solo la `base fee` è tecnicamente valida ma è improbabile (che venga inclusa) perché non offre incentivi ai validatori per sceglierla rispetto ad altre transazioni. La commissione `priority` 'corretta' è determinata dall'utilizzo della rete nel momento in cui invii la transazione - se c'è molta richiesta, è possibile che tu debba impostare una commissione `priority` più alta, mentre se c'è meno domanda potrai pagare meno. +Una transazione che paga solo la `commissione di base` è tecnicamente valida ma è improbabile che venga inclusa perché non offre alcun incentivo ai validatori per sceglierla rispetto a qualsiasi altra transazione. La commissione di `priorità` 'corretta' è determinata dall'utilizzo della rete nel momento in cui invii la tua transazione: se c'è molta domanda potresti dover impostare la tua commissione di `priorità` più alta, ma quando c'è meno domanda puoi pagare di meno. -Ad esempio, ipotizziamo che Jordan debba pagare 1 ETH a Taylor. Il trasferimento di ETH richiede 21.000 unità di gas, e la commissione base è di 10 gwei. Jordan include una mancia di 2 gwei. +Ad esempio, supponiamo che Jordan debba pagare a Taylor 1 ETH. Un trasferimento di ETH richiede 21.000 unità di gas e la commissione di base è di 10 gwei. Jordan include una mancia di 2 gwei. La commissione totale sarebbe ora pari a: -`unità di gas usato * (commissione base + commissione prioritaria)` +`unità di gas utilizzate * (commissione di base + commissione di priorità)` -dove la `base fee` è il valore impostato dal protocollo e la `priority fee` è il valore impostato dall'utente come mancia per il validatore. +dove la `commissione di base` è un valore impostato dal protocollo e la `commissione di priorità` è un valore impostato dall'utente come mancia per il validatore. -ovvero `21,000 * (10 + 2) = 252,000 gwei` (0,000252 ETH). +es., `21.000 * (10 + 2) = 252.000 gwei` (0,000252 ETH). -Quando Jordan invia il denaro, dal suo conto sono sottratti 1,000252 ETH. Taylor riceve un accredito di 1,0000 ETH. Il validatore riceve la mancia di 0,000042 ETH. La `base fee` di 0,00021 ETH viene bruciata. +Quando Jordan invia il denaro, 1,000252 ETH verranno detratti dall'account di Jordan. A Taylor verrà accreditato 1,0000 ETH. Il validatore riceve la mancia di 0,000042 ETH. La `commissione di base` di 0,00021 ETH viene bruciata. -### Commissione base {#base-fee} +### Commissione di base {#base-fee} -Ogni blocco ha una commissione base che funge da prezzo di riserva. Per poter essere inseriti in un blocco, il prezzo offerto per il gas deve essere pari almeno alla commissione base. La commissione base è calcolata indipendentemente dal blocco corrente ed è invece determinata dai blocchi che lo precedono, il che rende le commissioni sulle transazioni più prevedibili per gli utenti. Quando il blocco viene creato questa **commissione base viene "bruciata"**, ovvero rimossa dalla circolazione. +Ogni blocco ha una commissione di base che funge da prezzo di riserva. Per essere idoneo all'inclusione in un blocco, il prezzo offerto per il gas deve essere almeno pari alla commissione di base. La commissione di base è calcolata indipendentemente dal blocco corrente ed è invece determinata dai blocchi precedenti, rendendo le commissioni della transazione più prevedibili per gli utenti. Quando il blocco viene creato, questa **commissione di base viene "bruciata"**, rimuovendola dalla circolazione. -La commissione di base è calcolata con una formula che confronta le dimensioni del blocco precedente (la quantità di gas usata per tutte le transazioni) con le dimensioni di quello corrente. La commissione base aumenta di un massimo del 12,5% per blocco se la dimensione prevista del blocco viene superata. Questa crescita esponenziale rende economicamente impensabile che la dimensione del blocco resti elevata per un tempo indefinito. +La commissione di base è calcolata da una formula che confronta la dimensione del blocco precedente (la quantità di gas utilizzata per tutte le transazioni) con la dimensione di destinazione (metà del limite del gas). La commissione di base aumenterà o diminuirà di un massimo del 12,5% per blocco se la dimensione del blocco di destinazione è rispettivamente superiore o inferiore alla destinazione. Questa crescita esponenziale rende economicamente non redditizio che la dimensione del blocco rimanga elevata a tempo indeterminato. -| Numero del blocco | Gas Incluso | Aumento della commissione | Tariffa base corrente | -| ----------------- | -----------:| -------------------------:| ---------------------:| -| 1 | 15M | 0% | 100 gwei | -| 2 | 30M | 0% | 100 gwei | -| 3 | 30M | 12,5% | 112,5 gwei | -| 4 | 30M | 12,5% | 126,6 gwei | -| 5 | 30M | 12,5% | 142,4 gwei | -| 6 | 30M | 12,5% | 160,2 gwei | -| 7 | 30M | 12,5% | 180,2 gwei | -| 8 | 30M | 12,5% | 202,7 gwei | +| Numero del Blocco | Gas Incluso | Aumento della Commissione | Commissione di Base Corrente | +| ----------------- | ----------: | ------------------------: | ---------------------------: | +| 1 | 18M | 0% | 100 gwei | +| 2 | 36M | 0% | 100 gwei | +| 3 | 36M | 12,5% | 112,5 gwei | +| 4 | 36M | 12,5% | 126,6 gwei | +| 5 | 36M | 12,5% | 142,4 gwei | +| 6 | 36M | 12,5% | 160,2 gwei | +| 7 | 36M | 12,5% | 180,2 gwei | +| 8 | 36M | 12,5% | 202,7 gwei | -Secondo la tabella che precede, per creare una transazione sul blocco numero 9, un portafoglio indica all'utente con certezza che la **commissione base massima** da aggiungere al blocco successivo è `current base fee * 112.5%` o `202.7 gwei * 112.5% = 228.1 gwei`. +Nella tabella sopra, viene dimostrato un esempio utilizzando 36 milioni come limite del gas. Seguendo questo esempio, per creare una transazione sul blocco numero 9, un portafoglio farà sapere all'utente con certezza che la **commissione di base massima** da aggiungere al blocco successivo è `commissione di base corrente * 112,5%` o `202,7 gwei * 112,5% = 228,1 gwei`. -Inoltre, è importante notare che, vista la velocità con cui la commissione base aumenta mentre si avanza verso un blocco completo, è improbabile assistere a picchi prolungati di blocchi completi. +È anche importante notare che è improbabile che vedremo picchi prolungati di blocchi pieni a causa della velocità con cui la commissione di base aumenta prima di un blocco pieno. -| Numero del blocco | Gas Incluso | Aumento della commissione | Tariffa base corrente | -| ----------------- | -----------:| -------------------------:| ---------------------:| -| 30 | 30M | 12,5% | 2.705,6 gwei | -| ... | ... | 12,5% | ... | -| 50 | 30M | 12,5% | 28.531,3 gwei | -| ... | ... | 12,5% | ... | -| 100 | 30M | 12,5% | 10.302.608,6 gwei | +| Numero del Blocco | Gas Incluso | Aumento della Commissione | Commissione di Base Corrente | +| ----------------- | ----------: | ------------------------: | ---------------------------: | +| 30 | 36M | 12,5% | 2705,6 gwei | +| ... | ... | 12,5% | ... | +| 50 | 36M | 12,5% | 28531,3 gwei | +| ... | ... | 12,5% | ... | +| 100 | 36M | 12,5% | 10302608,6 gwei | -### Commissione prioritaria (mance) {#priority-fee} +### Commissione di priorità (mance) {#priority-fee} -La commissione prioritaria (mancia) incentiva i validatori ad includere una transazione nel blocco. Senza la mancia, i validatori troverebbero economicamente redditizio minare blocchi vuoti, poiché riceverebbero la stessa ricompensa per i blocchi. Mance basse offrono ai validatori un incentivo minimo ad includere una transazione. Affinché le transazioni vengano eseguite in via preferenziale prima di altre transazioni nello stesso blocco, è possibile aggiungere una mancia più alta per cercare di superare le transazioni concorrenti. +La commissione di priorità (mancia) incentiva i validatori a massimizzare il numero di transazioni in un blocco, limitato solo dal limite del gas del blocco. Senza mance, un validatore razionale potrebbe includere meno transazioni, o persino zero, senza alcuna penalità diretta a livello di esecuzione o a livello di consenso, poiché le ricompense di staking sono indipendenti da quante transazioni ci sono in un blocco. Inoltre, le mance consentono agli utenti di superare le offerte di altri per la priorità all'interno dello stesso blocco, segnalando di fatto l'urgenza. ### Commissione massima {#maxfee} -Per eseguire una transazione sulla rete, gli utenti possono specificare un limite massimo che sono disposti a pagare affinché la loro transazione venga eseguita. Questo parametro facoltativo è noto come `maxFeePerGas`. Affinché una transazione venga eseguita, la commissione massima deve essere maggiore della somma della commissione base e della mancia. Il mittente della transazione riceve il rimborso della differenza tra la commissione massima e la somma della commissione base e della mancia. +Per eseguire una transazione sulla rete, gli utenti possono specificare un limite massimo che sono disposti a pagare affinché la loro transazione venga eseguita. Questo parametro opzionale è noto come `maxFeePerGas`. Affinché una transazione venga eseguita, la commissione massima deve superare la somma della commissione di base e della mancia. Al mittente della transazione viene rimborsata la differenza tra la commissione massima e la somma della commissione di base e della mancia. ### Dimensione del blocco {#block-size} -Ogni blocco ha una dimensione prevista di 30 milioni di gas, ma la dimensione dei blocchi aumenta o diminuisce in base alla domanda della rete, fino al limite massimo di 60 milioni di gas per blocco (2 volte la dimensione prevista del blocco). Il protocollo raggiunge una dimensione del blocco equilibrata di 30 milioni in media tramite il processo di _tâtonnement_. Significa che se la dimensione del blocco supera quella prevista, il protocollo aumenta la commissione base per il blocco successivo. Analogamente, il protocollo riduce la commissione base se la dimensione del blocco è inferiore a quella prevista. L'importo della commissione base si adatta proporzionalmente alla distanza della dimensione del blocco corrente rispetto a quella prevista. [Maggiori informazioni sui blocchi](/developers/docs/blocks/). +Ogni blocco ha una dimensione di destinazione pari alla metà dell'attuale limite del gas, ma la dimensione dei blocchi aumenterà o diminuirà in base alla domanda della rete, fino al raggiungimento del limite del blocco (2 volte la dimensione del blocco di destinazione). Il protocollo raggiunge una dimensione media del blocco di equilibrio in corrispondenza della destinazione attraverso il processo di _tâtonnement_. Ciò significa che se la dimensione del blocco è maggiore della dimensione del blocco di destinazione, il protocollo aumenterà la commissione di base per il blocco successivo. Allo stesso modo, il protocollo diminuirà la commissione di base se la dimensione del blocco è inferiore alla dimensione del blocco di destinazione. -### Calcolo delle commissioni del gas in pratica {#calculating-fees-in-practice} +L'importo di cui viene adeguata la commissione di base è proporzionale a quanto la dimensione del blocco corrente si discosta dalla destinazione. Si tratta di un calcolo lineare dal -12,5% per un blocco vuoto, allo 0% alla dimensione di destinazione, fino al +12,5% per un blocco che raggiunge il limite del gas. Il limite del gas può fluttuare nel tempo in base alle segnalazioni dei validatori, nonché tramite gli aggiornamenti della rete. Puoi [visualizzare le modifiche al limite del gas nel tempo qui](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths). -Puoi indicare esplicitamente quanto sei disposto a pagare per far eseguire la tua transazione. Tuttavia, la maggior parte dei fornitori di portafogli imposterà automaticamente una commissione sulla transazione consigliata (commissione base + commissione prioritaria consigliata) per ridurre la complessità che grava sui propri utenti. +[Maggiori informazioni sui blocchi](/developers/docs/blocks/) + +### Calcolare le commissioni del gas in pratica {#calculating-fees-in-practice} + +Puoi dichiarare esplicitamente quanto sei disposto a pagare per far eseguire la tua transazione. Tuttavia, la maggior parte dei fornitori di portafogli imposterà automaticamente una commissione della transazione consigliata (commissione di base + commissione di priorità consigliata) per ridurre la quantità di complessità a carico dei propri utenti. ## Perché esistono le commissioni del gas? {#why-do-gas-fees-exist} -In breve, le commissioni del gas aiutano a proteggere la rete di Ethereum. Richiedendo una commissione per ogni calcolo eseguito sulla rete, impediamo agli utenti malevoli di compiere spam sulla rete. Per evitare cicli infiniti accidentali od ostili oppure altri sprechi di calcolo nel codice, ogni transazione deve definire un limite al numero di passaggi di calcolo dell'esecuzione del codice che può utilizzare. L'unità fondamentale di calcolo è il "gas". +In breve, le commissioni del gas aiutano a mantenere sicura la rete Ethereum. Richiedendo una commissione per ogni calcolo eseguito sulla rete, impediamo ai malintenzionati di inviare spam sulla rete. Al fine di evitare cicli infiniti accidentali o ostili o altri sprechi computazionali nel codice, a ogni transazione è richiesto di impostare un limite a quanti passaggi computazionali di esecuzione del codice può utilizzare. L'unità fondamentale di calcolo è il "gas". -Sebbene una transazione preveda un limite, tutto il gas non utilizzato in una transazione viene rimborsato all'utente (ciò che viene restituito è: `max fee - (base fee + tip)`). +Sebbene una transazione includa un limite, qualsiasi gas non utilizzato in una transazione viene restituito all'utente (es., viene restituita la `commissione massima - (commissione di base + mancia)`). -![Diagramma che mostra come è rimborsato il gas inutilizzato](../transactions/gas-tx.png) _Diagramma adattato da [Ethereum EVM illustrato](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramma che mostra come viene rimborsato il gas non utilizzato](../transactions/gas-tx.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -## Cosa è il limite del gas? {#what-is-gas-limit} +## Cos'è il limite del gas? {#what-is-gas-limit} -Il limite di gas si riferisce all'importo massimo di gas che sei disposto a consumare in una transazione. Le transazioni più complicate che coinvolgono i [contratti intelligenti](/developers/docs/smart-contracts/), richiedono un maggiore lavoro di calcolo e quindi un limite di gas maggiore rispetto a un semplice pagamento. Un trasferimento standard di ETH richiede un limite di gas di 21.000 unità di gas. +Il limite del gas si riferisce alla quantità massima di gas che sei disposto a consumare in una transazione. Le transazioni più complicate che coinvolgono [contratti intelligenti](/developers/docs/smart-contracts/) richiedono più lavoro computazionale, quindi richiedono un limite del gas più elevato rispetto a un semplice pagamento. Un trasferimento standard di ETH richiede un limite del gas di 21.000 unità di gas. -Ad esempio, se imposti un limite di gas di 50.000 per un semplice trasferimento di ETH, l'EVM ne consumerebbe 21.000 unità e restituirebbe le 29.000 rimanenti. Tuttavia, se specifichi troppo poco gas, ad esempio un limite di gas di 20.000 per un semplice trasferimento di ETH, l'EVM consumerà le tue 20.000 unità di gas tentando di soddisfare la transazione, ma non la completerà. A quel punto l'EVM annulla ogni modifica, ma dato che il validatore ha già eseguito un lavoro pari a 20.000 unità di gas, questo gas viene consumato. +Ad esempio, se inserisci un limite del gas di 50.000 per un semplice trasferimento di ETH, la EVM ne consumerebbe 21.000 e ti verrebbero restituiti i restanti 29.000. Tuttavia, se specifichi troppo poco gas, ad esempio un limite del gas di 20.000 per un semplice trasferimento di ETH, la transazione fallirà durante la fase di convalida. Verrà rifiutata prima di essere inclusa in un blocco e non verrà consumato alcun gas. D'altra parte, se una transazione esaurisce il gas durante l'esecuzione (es., un contratto intelligente esaurisce tutto il gas a metà), la EVM annullerà qualsiasi modifica, ma tutto il gas fornito verrà comunque consumato per il lavoro svolto. -## Perché le commissioni del gas possono essere così elevate? {#why-can-gas-fees-get-so-high} +## Perché le commissioni del gas possono diventare così alte? {#why-can-gas-fees-get-so-high} -Le commissioni del gas elevate sono dovute alla popolarità di Ethereum. Se c'è troppa domanda, gli utenti devono offrire mance più alte per cercare di superare le transazioni degli altri utenti. Una mancia più cospicua può rendere più probabile che la tua transazione troverà posto nel blocco successivo. Inoltre, le applicazioni di contratti intelligenti più complessi potrebbero dover eseguire molte operazioni per supportare le loro funzioni, consumando molto gas. +Le elevate commissioni del gas sono dovute alla popolarità di Ethereum. Se c'è troppa domanda, gli utenti devono offrire importi di mancia più elevati per cercare di superare le transazioni degli altri utenti. Una mancia più alta può rendere più probabile che la tua transazione entri nel blocco successivo. Inoltre, le app di contratti intelligenti più complesse potrebbero eseguire molte operazioni per supportare le loro funzioni, facendole consumare molto gas. ## Iniziative per ridurre i costi del gas {#initiatives-to-reduce-gas-costs} -Gli [aggiornamenti di scalabilità](/roadmap/) di Ethereum dovrebbero infine risolvere alcuni problemi delle commissioni del gas, che, a loro volta, consentiranno alla piattaforma di elaborare migliaia di transazioni al secondo e di scalare globalmente. +Gli aggiornamenti per la [scalabilità](/roadmap/) di Ethereum dovrebbero in definitiva risolvere alcuni dei problemi relativi alle commissioni del gas, il che, a sua volta, consentirà alla piattaforma di elaborare migliaia di transazioni al secondo e di scalare a livello globale. + +La scalabilità di livello 2 è un'iniziativa primaria per migliorare notevolmente i costi del gas, l'esperienza utente e la scalabilità. -Il ridimensionamento del Livello 2 è un'iniziativa fondamentale per migliorare notevolmente i costi del gas, l'esperienza utente e il ridimensionamento. [Maggiori informazioni sul ridimensionamento del Livello 2](/developers/docs/scaling/#layer-2-scaling). +[Maggiori informazioni sulla scalabilità di livello 2](/developers/docs/scaling/#layer-2-scaling) -## Monitoraggio delle commissioni del gas {#monitoring-gas-fees} +## Monitorare le commissioni del gas {#monitoring-gas-fees} -Se desideri monitorare i prezzi del gas, così da poter inviare i tuoi ETH a un costo inferiore, puoi usare molti strumenti differenti, come: +Se vuoi monitorare i prezzi del gas, in modo da poter inviare i tuoi ETH a un costo inferiore, puoi utilizzare molti strumenti diversi come: -- [Etherscan](https://etherscan.io/gastracker): _Strumento di stima del prezzo del gas delle transazioni_ -- [ETH Gas Tracker](https://www.ethgastracker.com/): _Monitora e traccia i prezzi di Ethereum e del L2 per ridurre le commissioni sulle transazioni e risparmiare denaro_ -- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm): _Estensione di stima del gas di Chrome che supporta sia transazioni ereditarie di Tipo 0 che transazioni EIP-1559 di Tipo 2._ -- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Calcola le commissioni del gas nella tua valuta locale per diversi tipi di transazione sulla rete principale, su Arbitrum e su Polygon._ +- [Etherscan](https://etherscan.io/gastracker) _Stimatore del prezzo del gas delle transazioni_ +- [Blockscout](https://eth.blockscout.com/gas-tracker) _Stimatore open source del prezzo del gas delle transazioni_ +- [ETH Gas Tracker](https://www.ethgastracker.com/) _Monitora e traccia i prezzi del gas di Ethereum e dei L2 per ridurre le commissioni delle transazioni e risparmiare denaro_ +- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Estensione di Chrome per la stima del gas che supporta sia le transazioni legacy di Tipo 0 che le transazioni EIP-1559 di Tipo 2._ +- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _Calcola le commissioni del gas nella tua valuta locale per diversi tipi di transazioni sulla rete principale, Arbitrum e Polygon._ ## Strumenti correlati {#related-tools} -- [Blocknative's Gas Platform](https://www.blocknative.com/gas): _API di stima del gas sviluppata dalla piattaforma di dati della mempool globale di Blocknative_ +- [Piattaforma Gas di Blocknative](https://www.blocknative.com/gas) _API di stima del gas basata sulla piattaforma globale di dati mempool di Blocknative_ +- [Gas Network](https://gas.network) Oracoli del gas on-chain. Supporto per oltre 35 catene. ## Letture consigliate {#further-reading} -- [Spiegazione del Gas di Ethereum](https://defiprime.com/gas) -- [Ridurre il consumo di gas dei tuoi Contratti Intelligenti](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) -- [Strategie di ottimizzazione del carburante per sviluppatori](https://www.alchemy.com/overviews/solidity-gas-optimization) -- [Documenti di EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). -- [Risorse dell'EIP-1559 di Tim Beiko](https://hackmd.io/@timbeiko/1559-resources). +- [Spiegazione del gas di Ethereum](https://defiprime.com/gas) +- [Ridurre il consumo di gas dei tuoi contratti intelligenti](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) +- [Strategie di ottimizzazione del gas per gli sviluppatori](https://www.alchemy.com/overviews/solidity-gas-optimization) +- [Documentazione EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). +- [Risorse EIP-1559 di Tim Beiko](https://hackmd.io/@timbeiko/1559-resources) +- [EIP-1559: Separare i meccanismi dai meme](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/ides/index.md b/public/content/translations/it/developers/docs/ides/index.md index e0185be02fd..ca39b5bf7b8 100644 --- a/public/content/translations/it/developers/docs/ides/index.md +++ b/public/content/translations/it/developers/docs/ides/index.md @@ -1,38 +1,38 @@ --- -title: Ambienti di sviluppo integrati (IDE) -description: +title: Ambienti di Sviluppo Integrati (IDE) +description: "Scopri gli IDE basati sul web e desktop per lo sviluppo su Ethereum, inclusi Remix, VS Code e i plugin più popolari." lang: it --- -Quando si tratta di configurare un [ambiente di sviluppo integrato (IDE)](https://wikipedia.org/wiki/Integrated_development_environment), la programmazione delle applicazioni su Ethereum è simile alla programmazione di qualsiasi altro progetto software. Ci sono molte opzioni tra cui scegliere, quindi in fin dei conti, seleziona l'IDE o l'editor di codice che più si adegua alle tue preferenze. Più probabilmente, la migliore scelta di IDE per il tuo sviluppo in Ethereum è l'IDE che usi già per lo sviluppo software tradizionale. +Quando si tratta di configurare un [ambiente di sviluppo integrato (IDE)](https://wikipedia.org/wiki/Integrated_development_environment), programmare applicazioni su Ethereum è simile a programmare qualsiasi altro progetto software. Ci sono molte opzioni tra cui scegliere, quindi, alla fine, scegli l'IDE o l'editor di codice che meglio si adatta alle tue preferenze. Molto probabilmente la scelta migliore di un IDE per il tuo sviluppo su Ethereum è l'IDE che usi già per lo sviluppo software tradizionale. -## IDE basato su Web {#web-based-ides} +## IDE basati sul web {#web-based-ides} -Se desideri provare a scrivere del codice prima di [configurare un ambiente di sviluppo locale](/developers/local-environment/), queste app web sono personalizzate per lo sviluppo di contratti intelligenti di Ethereum. +Se stai cercando di armeggiare con il codice prima di [configurare un ambiente di sviluppo locale](/developers/local-environment/), queste app web sono create appositamente per lo sviluppo di contratti intelligenti su Ethereum. -**[Remix](https://remix.ethereum.org/)**: **_IDE basato sul web che integra analisi statica e una macchina virtuale per una blockchain di prova_** +**[Remix](https://remix.ethereum.org/)** - **_IDE basato sul web con analisi statica integrata e una macchina virtuale blockchain di test_** - [Documentazione](https://remix-ide.readthedocs.io/en/latest/#) - [Gitter](https://gitter.im/ethereum/remix) -**[ChainIDE](https://chainide.com/)**: **_un IDE multi-catena basato su cloud_** +**[ChainIDE](https://chainide.com/)** - **_Un IDE multi-chain basato sul cloud_** - [Documentazione](https://chainide.gitbook.io/chainide-english-1/) - [Forum di supporto](https://forum.chainide.com/) -**[Replit (Solidity Starter - Beta) ](https://replit.com/@replit/Solidity-starter-beta)** - **_Un ambiente di sviluppo personalizzabile per Ethereum con ricarica rapida, controllo degli errori e supporto della rete di prova di prima classe_** +**[Replit (Solidity Starter - Beta)](https://replit.com/@replit/Solidity-starter-beta)** - **_Un ambiente di sviluppo personalizzabile per Ethereum con ricaricamento a caldo, controllo degli errori e supporto di prim'ordine per le reti di test_** -- [Docs](https://docs.replit.com/) +- [Documentazione](https://docs.replit.com/) -**[Tenderly Sandbox](https://sandbox.tenderly.co/)**: **_un ambiente di prototipazione veloce è possibile scrivere, eseguire ed effettuare il debug dei contratti intelligenti nel browser usando Solidity e JavaScript_** +**[Tenderly Sandbox](https://sandbox.tenderly.co/)** - **_Un ambiente di prototipazione rapida in cui puoi scrivere, eseguire ed effettuare il debug di contratti intelligenti nel browser usando Solidity e JavaScript_** -**[EthFiddle](https://ethfiddle.com/)**: **_IDE basato sul web che consente di scrivere, compilare ed eseguire il debug del tuo contratto intelligente_** +**[EthFiddle](https://ethfiddle.com/)** - **_IDE basato sul web che ti consente di scrivere, compilare ed effettuare il debug del tuo contratto intelligente_** - [Gitter](https://gitter.im/loomnetwork/ethfiddle) ## IDE desktop {#desktop-ides} -Gli IDE più diffusi hanno plugin integrati che migliorano l'esperienza di sviluppo per Ethereum. Come minimo, offrono l'evidenziazione della sintassi per i [linguaggi dei contratti intelligenti](/developers/docs/smart-contracts/languages/). +La maggior parte degli IDE consolidati ha creato plugin per migliorare l'esperienza di sviluppo su Ethereum. Come minimo, forniscono l'evidenziazione della sintassi per i [linguaggi dei contratti intelligenti](/developers/docs/smart-contracts/languages/). **Visual Studio Code -** **_IDE multipiattaforma professionale con supporto ufficiale per Ethereum_** @@ -40,25 +40,25 @@ Gli IDE più diffusi hanno plugin integrati che migliorano l'esperienza di svilu - [Esempi di codice](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) - [GitHub](https://github.com/microsoft/vscode) -**JetBrains IDEs (IntelliJ IDEA, ecc.) -** **_Strumenti essenziali per sviluppatori di software e team_** +**IDE JetBrains (IntelliJ IDEA, ecc.) -** **_Strumenti essenziali per sviluppatori di software e team_** - [JetBrains](https://www.jetbrains.com/) - [GitHub](https://github.com/JetBrains) - [IntelliJ Solidity](https://github.com/intellij-solidity/intellij-solidity/) -**Remix Desktop -** **_Sperimenta Remix IDE sulla tua macchina locale_** +**Remix Desktop -** **_Prova l'IDE Remix sulla tua macchina locale_** - [Download](https://github.com/ethereum/remix-desktop/releases) - [GitHub](https://github.com/ethereum/remix-desktop) ## Plugin ed estensioni {#plugins-extensions} -- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Ethereum Solidity Language per Visual Studio Code -- [Solidity + Hardhat per VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Supporto Solidity e Hardhat fornito da Hardhat team -- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Formattatore di codice basato su Prettier +- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - Linguaggio Solidity di Ethereum per Visual Studio Code +- [Solidity + Hardhat per VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - Supporto per Solidity e Hardhat dal team di Hardhat +- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - Formattatore di codice che utilizza prettier ## Letture consigliate {#further-reading} -- [IDE di Ethereum](https://www.alchemy.com/list-of/web3-ides-on-ethereum)_- Lista degli IDE di Ethereum di Alchemy_ +- [IDE per Ethereum](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- L'elenco di Alchemy degli IDE per Ethereum_ -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/index.md b/public/content/translations/it/developers/docs/index.md index c96dd311f44..1a66430000d 100644 --- a/public/content/translations/it/developers/docs/index.md +++ b/public/content/translations/it/developers/docs/index.md @@ -1,16 +1,16 @@ --- -title: Documentazione sullo sviluppo di Ethereum -description: Presentazione della documentazione di sviluppo per ethereum.org. +title: Documentazione per lo sviluppo su Ethereum +description: Introduzione alla documentazione per sviluppatori di ethereum.org. lang: it --- -Questa documentazione è progettata per aiutarti a creare con Ethereum. Tratta Ethereum come un concetto, spiega lo stack tecnologico di Ethereum e documenta argomenti avanzati per applicazioni e casi d'uso più complessi. +Questa documentazione è progettata per aiutarti a sviluppare con [Ethereum](/). Tratta Ethereum come concetto, spiega lo stack tecnologico di Ethereum e documenta argomenti avanzati per applicazioni e casi d'uso più complessi. -Questa è uno sforzo della community open source, quindi sentiti libero di suggerire nuovi argomenti, aggiungere contenuti e fornire esempi laddove pensi potrebbero essere utili. Tutta la documentazione è modificabile tramite GitHub – se se insicuro su come fare, [segui queste istruzioni](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). +Questo è uno sforzo open-source della community, quindi sentiti libero di suggerire nuovi argomenti, aggiungere nuovi contenuti e fornire esempi ovunque pensi possa essere utile. Tutta la documentazione può essere modificata tramite GitHub: se non sei sicuro di come fare, [segui queste istruzioni](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). ## Moduli di sviluppo {#development-modules} -Se questo è il tuo primo tentativo di sviluppo su Ethereum, consigliamo di cominciare dall'inizio e farsi strada come fosse un libro. +Se questo è il tuo primo tentativo di sviluppo su Ethereum, ti consigliamo di iniziare dall'inizio e procedere come se stessi leggendo un libro. ### Argomenti fondamentali {#foundational-topics} @@ -22,4 +22,4 @@ Se questo è il tuo primo tentativo di sviluppo su Ethereum, consigliamo di comi ### Avanzato {#advanced} - + \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/intro-to-ether/index.md b/public/content/translations/it/developers/docs/intro-to-ether/index.md index f729fddb1c1..dfe2a8eeb9c 100644 --- a/public/content/translations/it/developers/docs/intro-to-ether/index.md +++ b/public/content/translations/it/developers/docs/intro-to-ether/index.md @@ -1,78 +1,78 @@ --- -title: Intro agli ether -description: Introduzione di uno sviluppatore alla criptovaluta ether. +title: Introduzione tecnica a ether +description: Un'introduzione per sviluppatori alla criptovaluta ether. lang: it --- ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere l'[Introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Per aiutarti a comprendere meglio questa pagina, ti consigliamo di leggere prima l'[Introduzione a Ethereum](/developers/docs/intro-to-ethereum/). ## Cos'è una criptovaluta? {#what-is-a-cryptocurrency} Una criptovaluta è un mezzo di scambio protetto da un registro basato su blockchain. -Con mezzo di scambio si intende qualsiasi forma di pagamento ampiamente accettata per beni e servizi, mentre con registro si intende un archivio di dati che tiene traccia delle transazioni. La tecnologia Blockchain consente agli utenti di effettuare transazioni sul registro senza fare affidamento su una terza parte fidata per mantenere il registro. +Un mezzo di scambio è qualsiasi cosa ampiamente accettata come pagamento per beni e servizi, e un registro è un archivio di dati che tiene traccia delle transazioni. La tecnologia blockchain consente agli utenti di effettuare transazioni sul registro senza fare affidamento su una terza parte fidata per mantenere il registro. -La prima criptovaluta è stata Bitcoin, creata da Satoshi Nakamoto. Dal rilascio di Bitcoin nel 2009, sono state create migliaia di criptovalute su molte blockchain diverse. +La prima criptovaluta è stata Bitcoin, creata da Satoshi Nakamoto. Dal rilascio di Bitcoin nel 2009, le persone hanno creato migliaia di criptovalute su molte blockchain diverse. -## Cos'è un ether? {#what-is-ether} +## Cos'è ether? {#what-is-ether} -**Ether (ETH)** è la criptovaluta impiegata per molti scopi sulla rete Ethereum. Fondamentalmente è l'unica forma di pagamento accettabile per le commissioni sulle transazioni, e dopo [La Fusione](/roadmap/merge) serviranno ether per convalidare e proporre blocchi sulla Rete Principale. L'ether è anche usato come una forma principale di garanzia nei mercati di prestito della [DeFi](/defi), come un'unità di conto nei mercati di NFT, come pagamento guadagnato per l'esecuzione di servizi o della vendita di beni del mondo reale e molto altro. +**Ether (ETH)** è la criptovaluta utilizzata per molte cose sulla rete di Ethereum. Fondamentalmente, è l'unica forma di pagamento accettabile per le commissioni della transazione e, dopo [The Merge](/roadmap/merge), ether è necessario per validare e proporre blocchi sulla rete principale. Ether è anche utilizzato come forma primaria di garanzia nei mercati di prestito della [DeFi](/defi), come unità di conto nei mercati di NFT, come pagamento guadagnato per l'esecuzione di servizi o la vendita di beni del mondo reale, e altro ancora. -Ethereum consente agli sviluppatori di creare [**applicazioni decentralizzate (dapp)**](/developers/docs/dapps), che condividono tutte un pool di potenza di elaborazione. Questo pool condiviso è limitato, quindi Ethereum necessita di un meccanismo per determinare chi lo usa. In caso contrario, una dApp potrebbe consumare accidentalmente o malevolmente tutte le risorse della rete, impedendo ad altri di accedervi. +Ethereum consente agli sviluppatori di creare [**applicazioni decentralizzate (dApp)**](/developers/docs/dapps), che condividono tutte un pool di potenza di calcolo. Questo pool condiviso è finito, quindi Ethereum ha bisogno di un meccanismo per determinare chi può utilizzarlo. Altrimenti, una dApp potrebbe consumare accidentalmente o maliziosamente tutte le risorse della rete, il che impedirebbe ad altri di accedervi. -La criptovaluta ether supporta un meccanismo di determinazione dei prezzi per la potenza di calcolo di Ethereum. Quando vogliono effettuare una transazione, gli utenti devono pagare ether per far riconoscere la propria transazione sulla blockchain. Questi costi d'uso sono noti come [commissioni sul gas](/developers/docs/gas/), derivate dalla quantità di potenza di calcolo necessaria per eseguire la transazione e dalla domanda della rete per la potenza di calcolo in quel momento. +La criptovaluta ether supporta un meccanismo di determinazione dei prezzi per la potenza di calcolo di Ethereum. Quando gli utenti vogliono effettuare una transazione, devono pagare ether per far sì che la loro transazione venga riconosciuta sulla blockchain. Questi costi di utilizzo sono noti come [commissioni](/developers/docs/gas/), e la commissione dipende dalla quantità di potenza di calcolo richiesta per eseguire la transazione e dalla domanda di potenza di calcolo a livello di rete in quel momento. -Pertanto, anche se una dApp malevola inviasse un ciclo infinito, a un certo punto la transazione terminerebbe gli ether e si arresterebbe, consentendo alla rete di tornare alla normalità. +Pertanto, anche se una dApp malevola inviasse un ciclo infinito, la transazione alla fine esaurirebbe gli ether e terminerebbe, consentendo alla rete di tornare alla normalità. -È [comune confondere](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) Ethereum e gli ether: quando le persone si riferiscono al "prezzo di Ethereum", stanno descrivendo il prezzo degli ether. +È [comune confondere](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) Ethereum ed ether: quando le persone fanno riferimento al "prezzo di Ethereum", stanno descrivendo il prezzo di ether. ## Coniare ether {#minting-ether} -La coniazione è il processo con vengono creati nuovi ether sul registro di Ethereum. Il protocollo sottostante di Ethereum crea i nuovi ether, cosa impossibile da fare per un utente. +Coniare è il processo in cui nuovi ether vengono creati sul registro di Ethereum. Il protocollo Ethereum sottostante crea i nuovi ether, e non è possibile per un utente creare ether. -L'ether è coniato come una ricompensa per ogni blocco proposto e al punto di controllo di ogni epoca per altre attività correlate al validatore per raggiungere il consenso. L'importo totale emesso dipende dal numero di validatori e da quanto ether hanno in staking. Quest'emissione totale è divisa equamente tra i validatori nel caso ideale in cui tutti i validatori siano onesti e online ma, in realtà, varia a seconda delle prestazioni del validatore. Circa 1/8 dell'emissione totale va al propositore del blocco; il resto è distribuito tra gli altri validatori. I propositori di blocchi, inoltre, ricevono mance dalle commissioni di transazione e dal reddito correlato alla MEV, ma provengono da ether riciclati, non appena emessi. +Ether viene coniato come ricompensa per ogni blocco proposto e ad ogni checkpoint dell'epoca per altre attività del validatore relative al raggiungimento del consenso. L'importo totale emesso dipende dal numero di validatori e da quanti ether hanno in staking. Questa emissione totale è divisa equamente tra i validatori nel caso ideale in cui tutti i validatori siano onesti e online, ma in realtà varia in base alle prestazioni del validatore. Circa 1/8 dell'emissione totale va al proponente del blocco; il resto è distribuito tra gli altri validatori. I proponenti del blocco ricevono anche mance dalle commissioni della transazione e dai redditi relativi al MEV, ma questi provengono da ether riciclati, non da nuove emissioni. ## Bruciare ether {#burning-ether} -Oltre a creare ether tramite le ricompense del blocco, l'ether può essere distrutto tramite un processo detto 'bruciatura'. L'ether bruciato viene rimosso dalla circolazione in via permanente. +Oltre a creare ether attraverso le ricompense del blocco, ether può essere distrutto attraverso un processo chiamato 'combustione' (burning). Quando ether viene bruciato, viene rimosso permanentemente dalla circolazione. -La bruciatura di ether ha luogo in ogni transazione su Ethereum. Quando gli utenti pagano per le proprie transazioni, una commissione di base sul gas, impostata dalla rete secondo la domanda di transazioni, viene distrutta. Questo, insieme a dimensioni variabili dei blocchi e una commissione sul gas massima, semplifica la stima della commissione della transazione su Ethereum. Quando la domanda della rete è elevata, i [blocchi](https://etherscan.io/block/12965263) possono bruciare più ether di quanto ne sia coniato, compensando efficacemente l'emissione di ether. +La combustione di ether si verifica in ogni transazione su Ethereum. Quando gli utenti pagano per le loro transazioni, una commissione di base del gas, impostata dalla rete in base alla domanda transazionale, viene distrutta. Questo, unito a dimensioni variabili dei blocchi e a una commissione massima, semplifica la stima della commissione della transazione su Ethereum. Quando la domanda della rete è alta, i [blocchi](https://eth.blockscout.com/block/22580057) possono bruciare più ether di quanti ne coniano, compensando efficacemente l'emissione di ether. -Bruciare la commissione di base ostacola la capacità dei produttori di blocchi di manipolare le transazioni. Ad esempio, se i produttori del blocco hanno ricevuto la commissione di base, potrebbero includere le proprie transazioni gratuitamente e aumentare la commissione di base per tutti gli altri. In caso contrario, potrebbero rimborsare la commissione di base ad alcuni utenti al di fuori della catena, creando così un mercato delle commissioni sulle transazioni più opaco e complesso. +Bruciare la commissione di base ostacola la capacità di un produttore di blocchi di manipolare le transazioni. Ad esempio, se i produttori di blocchi ricevessero la commissione di base, potrebbero includere le proprie transazioni gratuitamente e aumentare la commissione di base per tutti gli altri. In alternativa, potrebbero rimborsare la commissione di base ad alcuni utenti fuori catena, portando a un mercato delle commissioni della transazione più opaco e complesso. -## Denominazioni dell'ether {#denominations} +## Denominazioni di ether {#denominations} -Poiché il valore di molte transazioni su Ethereum è ridotto, l'ether ha svariate denominazioni che possono essere utilizzate per fare riferimento a unità di conto inferiori. Tra queste denominazioni, Wei e gwei sono particolarmente importanti. +Poiché il valore di molte transazioni su Ethereum è piccolo, ether ha diverse denominazioni che possono essere indicate come unità di conto più piccole. Di queste denominazioni, Wei e gwei sono particolarmente importanti. -Wei è la quantità più piccola possibile di ether. Di conseguenza, molte implementazioni tecniche, come l'[Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), effettuano tutti i loro calcoli in Wei. +Wei è la quantità più piccola possibile di ether e, di conseguenza, molte implementazioni tecniche, come l'[Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), baseranno tutti i calcoli in Wei. Gwei, abbreviazione di giga-wei, è spesso usato per descrivere i costi del gas su Ethereum. -| Denominazione | Valore in ether | Uso comune | -| ------------- | ---------------- | --------------------------------------- | -| Wei | 10-18 | Implementazioni tecniche | -| Gwei | 10-9 | Commissioni sul gas leggibili dall'uomo | +| Denominazione | Valore in ether | Uso comune | +| ------------- | ---------------- | ----------------------------- | +| Wei | 10-18 | Implementazioni tecniche | +| Gwei | 10-9 | Commissioni del gas leggibili | ## Trasferire ether {#transferring-ether} -Ogni transazione su Ethereum contiene un campo di `valore`, che specifica l'importo di ether da trasferire, denominato in wei, e da inviare dall'indirizzo del mittente all'indirizzo del destinatario. +Ogni transazione su Ethereum contiene un campo `value`, che specifica la quantità di ether da trasferire, denominata in wei, da inviare dall'indirizzo del mittente all'indirizzo del destinatario. -Quando l'indirizzo del destinatario è un [contratto intelligente](/developers/docs/smart-contracts/), questo ether trasferito potrebbe essere usato per pagare il gas quando il contratto intelligente esegue il proprio codice. +Quando l'indirizzo del destinatario è un [contratto intelligente](/developers/docs/smart-contracts/), questo ether trasferito può essere utilizzato per pagare il gas quando il contratto intelligente esegue il suo codice. [Maggiori informazioni sulle transazioni](/developers/docs/transactions/) -## Interrogare l'ether {#querying-ether} +## Interrogare ether {#querying-ether} -Gli utenti possono interrogare il saldo di ether di qualsiasi [conto](/developers/docs/accounts/), ispezionando il campo `balance` del conto, che mostra le posizioni in ether, denominate in wei. +Gli utenti possono interrogare il saldo in ether di qualsiasi [account](/developers/docs/accounts/) ispezionando il campo `balance` dell'account, che mostra le disponibilità di ether denominate in wei. -[Etherscan](https://etherscan.io) è uno strumento popolare per consultare i saldi dell'indirizzo attraverso un'applicazione basata sul web. Per esempio, [questa pagina di Etherscan](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae) mostra il saldo per la Ethereum Foundation. I saldi dei conti possono esser interrogati anche utilizzando i portafogli, o direttamente, effettuando richieste ai nodi. +[Etherscan](https://etherscan.io) e [Blockscout](https://eth.blockscout.com) sono strumenti popolari per ispezionare i saldi degli indirizzi tramite applicazioni basate sul web. Ad esempio, [questa pagina di Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) mostra il saldo della Ethereum Foundation. I saldi degli account possono anche essere interrogati utilizzando i portafogli o direttamente effettuando richieste ai nodi. ## Letture consigliate {#further-reading} -- [Definire Ether ed Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ -- [Ethereum Whitepaper](/whitepaper/): La proposta originale per Ethereum. Questo documento include una descrizione dell'ether e le motivazioni dietro alla sua creazione. -- [Gwei Calculator](https://www.alchemy.com/gwei-calculator): Usa questa calcolatrice di gwei per convertire facilmente wei, gwei ed ether. Basta inserire qualsiasi importo di wei, gwei o ETH e calcolare automaticamente la conversione. +- [Definire ether ed Ethereum](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ +- [Whitepaper di Ethereum](/whitepaper/): La proposta originale per Ethereum. Questo documento include una descrizione di ether e le motivazioni alla base della sua creazione. +- [Calcolatore di Gwei](https://www.alchemy.com/gwei-calculator): Usa questo calcolatore di gwei per convertire facilmente wei, gwei ed ether. Inserisci semplicemente qualsiasi importo di wei, gwei o ETH e calcola automaticamente la conversione. -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/intro-to-ethereum/index.md b/public/content/translations/it/developers/docs/intro-to-ethereum/index.md index 26d4c9ffb8e..2a2f86f331b 100644 --- a/public/content/translations/it/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/it/developers/docs/intro-to-ethereum/index.md @@ -1,116 +1,124 @@ --- -title: Introduzione a Ethereum -description: Introduzione ai concetti fondamentali di Ethereum per sviluppatori di dapp. +title: Introduzione tecnica a Ethereum +description: Un'introduzione per sviluppatori di dApp ai concetti fondamentali di Ethereum. lang: it --- ## Cos'è una blockchain? {#what-is-a-blockchain} -Una blockchain si può descrivere come un database pubblico che viene aggiornato e condiviso fra molti computer in una rete. +Una blockchain è un database pubblico che viene aggiornato e condiviso tra molti computer in una rete. -"Blocco" si riferisce al fatto che i dati e lo stato vengono memorizzati in batch sequenziali o "blocchi". Se invii ETH a un altro utente, i dati della transazione devono essere aggiunti a un blocco affinché l'operazione riesca. +"Blocco" si riferisce ai dati e allo stato archiviati in gruppi consecutivi noti come "blocchi". Se invii ETH a qualcun altro, i dati della transazione devono essere aggiunti a un blocco affinché vada a buon fine. -"Catena" si riferisce al fatto che ogni blocco fa riferimento crittograficamente al suo padre. In altre parole, i blocchi si incatenano tra loro. I dati in un blocco non possono cambiare senza modificare tutti i blocchi successivi, il che richiederebbe il consenso dell'intera rete. +"Catena" si riferisce al fatto che ogni blocco fa riferimento crittograficamente al suo genitore. In altre parole, i blocchi vengono incatenati insieme. I dati in un blocco non possono cambiare senza modificare tutti i blocchi successivi, il che richiederebbe il consenso dell'intera rete. -Ogni computer nella rete deve acconsentire a ogni nuovo blocco e alla catena nel complesso. Questi computer sono noti come "nodi". I nodi assicurano che tutti coloro che interagiscono con la blockchain dispongono degli stessi dati. Per compiere questo accordo distribuito, le blockchain necessitano di un meccanismo di consenso. +Ogni computer nella rete deve concordare su ogni nuovo blocco e sulla catena nel suo insieme. Questi computer sono noti come "nodi". I nodi assicurano che chiunque interagisca con la blockchain abbia gli stessi dati. Per raggiungere questo accordo distribuito, le blockchain necessitano di un meccanismo di consenso. -Ethereum usa un [meccanismo di consenso basato sul Proof of Stake](/developers/docs/consensus-mechanisms/pos/). Chiunque voglia aggiungere nuovi blocchi alla catena deve mettere ETH – la valuta nativa di Ethereum – in staking a titolo di garanzia ed eseguire il software del validatore. Questi "validatori" possono quindi essere selezionati casualmente per proporre i blocchi che gli altri validatori verificano e aggiungono alla blockchain. Esiste un sistema di ricompense e sanzioni che incentiva fortemente i partecipanti a essere onesti e il più possibile disponibili online. +[Ethereum](/) utilizza un [meccanismo di consenso basato sulla prova di stake](/developers/docs/consensus-mechanisms/pos/). Chiunque voglia aggiungere nuovi blocchi alla catena deve mettere in stake ETH - la valuta nativa di Ethereum - come garanzia ed eseguire il software del validatore. Questi "validatori" possono quindi essere selezionati casualmente per proporre blocchi che altri validatori controllano e aggiungono alla blockchain. Esiste un sistema di ricompense e penalità che incentiva fortemente i partecipanti a essere onesti e disponibili online il più possibile. -Se desideri vedere come avviene l'hashing dei dati della blockchain e la loro successiva aggiunta alla storia dei riferimenti dei blocchi, assicurati di consultare [questa demo](https://andersbrownworth.com/blockchain/blockchain) di Anders Brownworth e di guardare il video d'accompagnamento seguente. +Se desideri vedere come i dati della blockchain vengono sottoposti a hash e successivamente aggiunti alla cronologia dei riferimenti dei blocchi, assicurati di dare un'occhiata a [questa demo](https://andersbrownworth.com/blockchain/blockchain) di Anders Brownworth e guarda il video di accompagnamento qui sotto. -Guarda Anders che spiega gli hash nelle blockchain: +Guarda Anders spiegare gli hash nelle blockchain: ## Cos'è Ethereum? {#what-is-ethereum} -Ethereum è una blockchain con un computer incorporato. È la base per la creazione di app e organizzazioni in un modo decentralizzato, senza autorizzazioni e resistente alla censura. +Ethereum è una blockchain con un computer incorporato. È la base per creare app e organizzazioni in modo decentralizzato, senza permessi e resistente alla censura. -Nell'universo di Ethereum c'è un unico computer canonico (chiamato macchina virtuale Ethereum o EVM) sul cui stato è d'accordo tutta la rete Ethereum. Chiunque partecipi alla rete Ethereum (ogni nodo Ethereum) ha una copia dello stato di questo computer. In più, ogni partecipante può trasmettere una richiesta affinché questo computer esegua calcoli arbitrari. Ogni volta che viene trasmessa una richiesta di questo tipo, gli altri partecipanti sulla rete verificano, convalidano e svolgono ("eseguono") il calcolo. Quest'esecuzione innesca un cambio di stato nell'EVM, che viene salvato e propagato su tutta la rete. +Nell'universo di Ethereum, esiste un singolo computer canonico (chiamato macchina virtuale di Ethereum, o EVM) sul cui stato tutti nella rete Ethereum concordano. Chiunque partecipi alla rete Ethereum (ogni nodo Ethereum) conserva una copia dello stato di questo computer. Inoltre, qualsiasi partecipante può trasmettere una richiesta affinché questo computer esegua calcoli arbitrari. Ogni volta che una tale richiesta viene trasmessa, gli altri partecipanti alla rete verificano, convalidano ed eseguono il calcolo. Questa esecuzione causa un cambiamento di stato nell'EVM, che viene confermato e propagato in tutta la rete. -Le richieste di calcolo sono dette richieste di transazione; il registro di tutte le transazioni e dello stato presente dell'EVM viene memorizzato sulla blockchain, che a sua volta è memorizzata e concordata da tutti i nodi. +Le richieste di calcolo sono chiamate richieste di transazione; il registro di tutte le transazioni e lo stato attuale dell'EVM vengono archiviati sulla blockchain, che a sua volta viene archiviata e concordata da tutti i nodi. -I meccanismi crittografici assicurano che una volta verificate come valide e aggiunte alla blockchain, le transazioni non possano essere successivamente manomesse. Inoltre, gli stessi meccanismi assicurano che tutte le transazioni siano firmate ed eseguite con "permessi" appropriati (nessuno dovrebbe poter inviare risorse digitali dal conto di Alice, tranne la stessa Alice). +I meccanismi crittografici assicurano che, una volta che le transazioni sono verificate come valide e aggiunte alla blockchain, non possano essere manomesse in seguito. Gli stessi meccanismi assicurano inoltre che tutte le transazioni siano firmate ed eseguite con i "permessi" appropriati (nessuno dovrebbe essere in grado di inviare risorse digitali dall'account di Alice, tranne Alice stessa). -## Cos'è un ether? {#what-is-ether} +## Cos'è l'ether? {#what-is-ether} -**Ether (ETH)** è la criptovaluta nativa di Ethereum. Lo scopo di ETH è consentire un mercato per il calcolo. Un mercato di questo tipo fornisce un incentivo economico affinché i partecipanti verifichino ed eseguano le richieste di transazione e forniscano risorse di calcolo alla rete. +L'**Ether (ETH)** è la criptovaluta nativa di Ethereum. Lo scopo dell'ETH è consentire un mercato per il calcolo. Tale mercato fornisce un incentivo economico ai partecipanti per verificare ed eseguire le richieste di transazione e fornire risorse computazionali alla rete. -Ogni partecipante che trasmette una richiesta di transazione deve anche offrire un certo importo di ETH alla rete a titolo di ricompensa. La rete brucerà parte della ricompensa, elargendo il resto a chiunque alla fine svolgerà il lavoro di verifica, esecuzione, invio alla blockchain e trasmissione della transazione alla rete. +Qualsiasi partecipante che trasmette una richiesta di transazione deve anche offrire una certa quantità di ETH alla rete come ricompensa. La rete brucerà parte della ricompensa e assegnerà il resto a chiunque alla fine svolga il lavoro di verificare la transazione, eseguirla, confermarla sulla blockchain e trasmetterla alla rete. -L'importo di ETH pagato corrisponde alle risorse necessarie a eseguire il calcolo. Queste ricompense impediscono ai partecipanti malevoli di intasare intenzionalmente la rete, richiedendo l'esecuzione di calcoli infiniti o di altri script ad alta intensità di risorse, poiché tali partecipanti devono pagare per le risorse di calcolo. +La quantità di ETH pagata corrisponde alle risorse necessarie per eseguire il calcolo. Queste ricompense impediscono inoltre ai partecipanti malintenzionati di intasare intenzionalmente la rete richiedendo l'esecuzione di calcoli infiniti o altri script ad alta intensità di risorse, poiché questi partecipanti devono pagare per le risorse di calcolo. -L'ETH è inoltre usato per fornire sicurezza cripto-economica alla rete in tre modi principali: 1) è usato come un mezzo per ricompensare i validatori che propongono i blocchi o segnalano i comportamenti disonesti degli altri validatori; 2) è messo in staking dai validatori, fungendo da garanzia contro i comportamenti disonesti: se i validatori tentano di comportarsi in modo malevolo, i loro ETH possono esser distrutti; 3) è usato per ponderare i 'voti' per i blocchi appena proposti, alimentando la parte di scelta della diramazione del meccanismo di consenso. +L'ETH viene utilizzato anche per fornire sicurezza cripto-economica alla rete in tre modi principali: 1) è utilizzato come mezzo per ricompensare i validatori che propongono blocchi o denunciano comportamenti disonesti da parte di altri validatori; 2) Viene messo in stake dai validatori, fungendo da garanzia contro comportamenti disonesti: se i validatori tentano di comportarsi male, i loro ETH possono essere distrutti; 3) è utilizzato per pesare i 'voti' per i nuovi blocchi proposti, alimentando la parte di scelta della biforcazione del meccanismo di consenso. ## Cosa sono i contratti intelligenti? {#what-are-smart-contracts} -In pratica, i partecipanti non scrivono nuovo codice ogni volta che desiderano richiedere un calcolo sull'EVM. Piuttosto, gli sviluppatori dell'applicazione caricano i programmi (frammenti di codice riutilizzabili) nello stato EVM e gli utenti richiedono di eseguire questi frammenti di codice con parametri variabili. Chiamiamo i programmi caricati a ed eseguiti dai contratti intelligenti della rete. +In pratica, i partecipanti non scrivono nuovo codice ogni volta che vogliono richiedere un calcolo sull'EVM. Piuttosto, gli sviluppatori di applicazioni caricano programmi (frammenti di codice riutilizzabili) nello stato dell'EVM e gli utenti effettuano richieste per eseguire questi frammenti di codice con parametri variabili. Chiamiamo i programmi caricati ed eseguiti dalla rete "contratti intelligenti". -A un livello molto basilare, puoi pensare a un contratto intelligente come una sorta di distributore automatico: uno script che, quando chiamato entro certi parametri, esegue delle azioni o dei calcoli, se certe condizioni sono soddisfatte. Ad esempio, il semplice contratto intelligente del fornitore potrebbe creare e assegnare la proprietà di una risorsa digitale se il chiamante invia ETH a un destinatario specifico. +A un livello molto basilare, puoi pensare a un contratto intelligente come a una sorta di distributore automatico: uno script che, quando chiamato con determinati parametri, esegue alcune azioni o calcoli se vengono soddisfatte determinate condizioni. Ad esempio, un semplice contratto intelligente di vendita potrebbe creare e assegnare la proprietà di una risorsa digitale se il chiamante invia ETH a un destinatario specifico. -Qualsiasi sviluppatore può creare un contratto intelligente e renderlo pubblico sulla rete, usando la blockchain come suo livello dei dati, per una commissione pagata alla rete. Qualsiasi utente può, quindi, chiamare il contratto intelligente a eseguire il proprio codice, anche in questo caso per una commissione pagata alla rete. +Qualsiasi sviluppatore può creare un contratto intelligente e renderlo pubblico sulla rete, utilizzando la blockchain come livello dati, a fronte di una commissione pagata alla rete. Qualsiasi utente può quindi chiamare il contratto intelligente per eseguire il suo codice, sempre a fronte di una commissione pagata alla rete. -Dunque, con i contratti intelligenti, gli sviluppatori possono creare e distribuire arbitrariamente app e servizi rivolti agli utenti, come: mercati, strumenti finanziari, giochi, etc. +Pertanto, con i contratti intelligenti, gli sviluppatori possono creare e distribuire app e servizi rivolti agli utenti arbitrariamente complessi come: mercati, strumenti finanziari, giochi, ecc. ## Terminologia {#terminology} ### Blockchain {#blockchain} -La sequenza di tutti i blocchi che sono stati salvati nella rete Ethereum in tutta la sua storia. È chiamata in questo modo perché ciascun blocco contiene un riferimento a quello precedente, il che aiuta a mantenere un ordine tra tutti i blocchi (e quindi a livello della storia precisa). +La sequenza di tutti i blocchi che sono stati confermati sulla rete Ethereum nella storia della rete. Chiamata così perché ogni blocco contiene un riferimento al blocco precedente, il che ci aiuta a mantenere un ordine su tutti i blocchi (e quindi sulla cronologia precisa). ### ETH {#eth} -**Ether (ETH)** è la criptovaluta nativa di Ethereum. Gli utenti pagano ETH ad altri utenti perché le loro richieste di esecuzione di codice vengano soddisfatte. +L'**Ether (ETH)** è la criptovaluta nativa di Ethereum. Gli utenti pagano ETH ad altri utenti per far soddisfare le loro richieste di esecuzione del codice. -[Maggiori informazioni su ETH](/developers/docs/intro-to-ether/) +[Maggiori informazioni sull'ETH](/developers/docs/intro-to-ether/) ### EVM {#evm} -La Macchina Virtuale di Ethereum è il computer virtuale globale il cui stato è concordato e memorizzato da ogni partecipante alla rete Ethereum. Ogni partecipante può richiedere l'esecuzione di codice arbitrario all'EVM; l'esecuzione di codice cambia lo stato dell'EVM. +La macchina virtuale di Ethereum è il computer virtuale globale il cui stato ogni partecipante alla rete Ethereum archivia e concorda. Qualsiasi partecipante può richiedere l'esecuzione di codice arbitrario sull'EVM; l'esecuzione del codice cambia lo stato dell'EVM. [Maggiori informazioni sull'EVM](/developers/docs/evm/) ### Nodi {#nodes} -Le macchine fisiche reali che conservano lo stato dell'EVM. I nodi comunicano tra di loro per propagare informazioni sullo stato dell'EVM e sui cambiamenti di stato. Ogni utente può inoltre richiedere l'esecuzione del codice trasmettendo una richiesta di esecuzione di codice da un nodo. La rete Ethereum è l'insieme di tutti i nodi Ethereum e delle loro comunicazioni. +Le macchine reali che archiviano lo stato dell'EVM. I nodi comunicano tra loro per propagare informazioni sullo stato dell'EVM e sui nuovi cambiamenti di stato. Qualsiasi utente può anche richiedere l'esecuzione di codice trasmettendo una richiesta di esecuzione del codice da un nodo. La rete Ethereum stessa è l'aggregato di tutti i nodi Ethereum e delle loro comunicazioni. [Maggiori informazioni sui nodi](/developers/docs/nodes-and-clients/) -### Conti {#accounts} +### Account {#accounts} -Dove sono conservati gli ETH. Gli utenti possono inizializzare i conti, depositare ETH nei conti e trasferire ETH dai propri conti ad altri utenti. I conti e i loro saldi sono archiviati in una grande tabella nell'EVM; sono parte dello stato complessivo dell'EVM. +Dove viene archiviato l'ETH. Gli utenti possono inizializzare account, depositare ETH negli account e trasferire ETH dai loro account ad altri utenti. Gli account e i saldi degli account sono archiviati in una grande tabella nell'EVM; fanno parte dello stato complessivo dell'EVM. -[Di più sui conti](/developers/docs/accounts/) +[Maggiori informazioni sugli account](/developers/docs/accounts/) ### Transazioni {#transactions} -"Richiesta di transazione" è il termine formale per indicare una richiesta di esecuzione del codice sull'EVM, mentre una "transazione" è una richiesta di transazione portata a termine e il cambiamento associato nello stato dell'EVM. Qualunque utente può trasmettere una richiesta di transazione alla rete da un nodo. Affinché la richiesta di transazione influenzi lo stato dell'EVM concordato, deve essere convalidata, eseguita e "inviata alla rete" da un altro nodo. L'esecuzione di codice innesca un cambiamento di stato dell'EVM; al salvataggio della transazione, questo cambiamento di stato viene trasmesso a tutti i nodi della rete. Alcuni esempi di transazione: +Una "richiesta di transazione" è il termine formale per una richiesta di esecuzione del codice sull'EVM, e una "transazione" è una richiesta di transazione soddisfatta e il cambiamento associato nello stato dell'EVM. Qualsiasi utente può trasmettere una richiesta di transazione alla rete da un nodo. Affinché la richiesta di transazione influisca sullo stato concordato dell'EVM, deve essere convalidata, eseguita e "confermata sulla rete" da un altro nodo. L'esecuzione di qualsiasi codice causa un cambiamento di stato nell'EVM; al momento della conferma, questo cambiamento di stato viene trasmesso a tutti i nodi della rete. Alcuni esempi di transazioni: -- Inviare X ETH dal mio conto a quello di Alice. -- Pubblicare il codice di un contratto intelligente nello stato dell'EVM. +- Inviare X ETH dal mio account all'account di Alice. +- Pubblicare del codice di un contratto intelligente nello stato dell'EVM. - Eseguire il codice del contratto intelligente all'indirizzo X nell'EVM, con gli argomenti Y. [Maggiori informazioni sulle transazioni](/developers/docs/transactions/) ### Blocchi {#blocks} -Il volume di transazioni è molto alto, quindi le transazioni sono "salvate" in lotti, o blocchi. I blocchi generalmente contengono da decine a centinaia di transazioni. +Il volume delle transazioni è molto alto, quindi le transazioni vengono "confermate" in lotti, o blocchi. I blocchi contengono generalmente da dozzine a centinaia di transazioni. [Maggiori informazioni sui blocchi](/developers/docs/blocks/) ### Contratti intelligenti {#smart-contracts} -Uno snippet di codice riutilizzabile (programma) che uno sviluppatore pubblica nello stato dell'EVM. Chiunque può richiedere che il codice del contratto intelligente sia eseguito effettuando una richiesta di transazione. Poiché gli sviluppatori possono scrivere applicazioni arbitrarie eseguibili nell'EVM (giochi, mercati, strumenti finanziari, etc.) pubblicando i contratti intelligenti, questi sono anche spesso detti [dapp, o App Decentralizzate](/developers/docs/dapps/). +Un frammento di codice riutilizzabile (un programma) che uno sviluppatore pubblica nello stato dell'EVM. Chiunque può richiedere che il codice del contratto intelligente venga eseguito effettuando una richiesta di transazione. Poiché gli sviluppatori possono scrivere applicazioni eseguibili arbitrarie nell'EVM (giochi, mercati, strumenti finanziari, ecc.) pubblicando contratti intelligenti, queste sono spesso chiamate anche [dApp, o Applicazioni Decentralizzate](/developers/docs/dapps/). -[Di più sui contratti intelligenti](/developers/docs/smart-contracts/) +[Maggiori informazioni sui contratti intelligenti](/developers/docs/smart-contracts/) ## Letture consigliate {#further-reading} -- [Ethereum Whitepaper](/whitepaper/) -- [How does Ethereum work, anyway?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**NB**: questa risorsa è ancora preziosa, ma sappiate che è precedente a [La Fusione](/roadmap/merge) e pertanto si riferisce ancora al meccanismo di proof-of-work di Ethereum; di fatto Ethereum è ormai protetta utilizzando il [proof-of-stake](/developers/docs/consensus-mechanisms/pos)) +- [Whitepaper di Ethereum](/whitepaper/) +- [Come funziona Ethereum, in ogni caso?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _Preethi Kasireddy_ (**NB** questa risorsa è ancora valida ma tieni presente che precede [Il Merge](/roadmap/merge) e quindi si riferisce ancora al meccanismo di prova di lavoro di Ethereum - Ethereum è in realtà ora protetto utilizzando la [prova di stake](/developers/docs/consensus-mechanisms/pos)) -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ +### Preferisci l'apprendimento visivo? {#visual-learner} + +Questa serie di video offre un'esplorazione approfondita degli argomenti fondamentali: + + + +[Playlist delle basi di Ethereum](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) + +_Conosci una risorsa della community che ti ha aiutato? Modifica questa pagina e aggiungila!_ ## Tutorial correlati {#related-tutorials} -- [Una guida per sviluppatori a Ethereum, parte 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Un'esplorazione di Ethereum pensata per i principianti usando Python e web3.py_ +- [Una guida a Ethereum per sviluppatori, parte 1](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Un'esplorazione di Ethereum molto adatta ai principianti utilizzando Python e web3.py_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/mev/index.md b/public/content/translations/it/developers/docs/mev/index.md index 898954be802..b3ce4732e35 100644 --- a/public/content/translations/it/developers/docs/mev/index.md +++ b/public/content/translations/it/developers/docs/mev/index.md @@ -1,210 +1,211 @@ --- -title: Valore estraibile massimo (MEV) -description: Un'introduzione al valore estraibile massimo (MEV) +title: Valore massimo estraibile (MEV) +description: Un'introduzione al valore massimo estraibile (MEV) lang: it --- -Il valore estraibile massimo (MEV) si riferisce al valore massimo che può esser estratto dalla produzione del blocco, oltre alla ricompensa standard del blocco e alle commissioni sul gas, includendo, escludendo e cambiando l'ordine delle transazioni in un blocco. +Il valore massimo estraibile (MEV) si riferisce al valore massimo che può essere estratto dalla produzione di un blocco in eccesso rispetto alla ricompensa del blocco standard e alle commissioni del gas includendo, escludendo e modificando l'ordine delle transazioni in un blocco. -## Valore estraibile massimo {#maximal-extractable-value} +## Valore massimo estraibile {#maximal-extractable-value} -Il valore estraibile massimo fu applicato per la prima volta nel contesto del [proof-of-work](/developers/docs/consensus-mechanisms/pow/) e fu inizialmente definito come "valore estraibile dal miner". Questo perché nel Proof of Work i miner controllano l'inclusione, l'esclusione e l'ordinamento della transazione. Tuttavia, a partire dalla transizione al proof-of-stake tramite [La Fusione](/roadmap/merge), i validatori sono responsabili di tali ruoli e il mining non fa più parte del protocollo di Ethereum. I metodi d'estrazione del valore però esistono ancora, quindi il termine usato adesso è invece "Valore estraibile massimo". +Il valore massimo estraibile è stato applicato per la prima volta nel contesto della [prova di lavoro](/developers/docs/consensus-mechanisms/pow/) ed era inizialmente definito come "valore estraibile dal miner". Questo perché nella prova di lavoro, i miner controllano l'inclusione, l'esclusione e l'ordinamento delle transazioni. Tuttavia, dalla transizione alla prova di stake tramite [Il Merge](/roadmap/merge), i validatori sono diventati responsabili di questi ruoli e il mining non fa più parte del protocollo di [Ethereum](/). I metodi di estrazione del valore esistono ancora, tuttavia, quindi ora viene utilizzato il termine "Valore massimo estraibile". ## Prerequisiti {#prerequisites} -Assicurati di essere familiare con le [transazioni](/developers/docs/transactions/), i [blocchi](/developers/docs/blocks/), il [proof-of-stake](/developers/docs/consensus-mechanisms/pos) e il [gas](/developers/docs/gas/). Anche la familiarità con [dApp](/apps/) e [DeFi](/defi/) è utile. +Assicurati di avere familiarità con le [transazioni](/developers/docs/transactions/), i [blocchi](/developers/docs/blocks/), la [prova di stake](/developers/docs/consensus-mechanisms/pos) e il [gas](/developers/docs/gas/). È utile anche avere familiarità con le [dApp](/apps/) e la [DeFi](/defi/). ## Estrazione del MEV {#mev-extraction} -In teoria, il MEV proviene interamente dai validatori poiché sono l'unica parte in grado di garantire l'esecuzione di un'opportunità di MEV redditizia. Nella pratica, tuttavia, una grande porzione del MEV è estratta da partecipanti indipendenti della rete, chiamati "ricercatori". I ricercatori eseguono algoritmi complessi sui dati della blockchain per rilevare opportunità di MEV redditizie e si servono di bot per inviare automaticamente tali transazioni redditizie alla rete. +In teoria, il MEV matura interamente a favore dei validatori perché sono l'unica parte che può garantire l'esecuzione di un'opportunità di MEV redditizia. In pratica, tuttavia, gran parte del MEV viene estratto da partecipanti indipendenti della rete definiti "cercatori" (searcher). I cercatori eseguono algoritmi complessi sui dati della blockchain per rilevare opportunità di MEV redditizie e dispongono di bot per inviare automaticamente tali transazioni redditizie alla rete. -I validatori ottengono comunque una porzione dell'intero importo del MEV, poiché i ricercatori sono disposti a pagare commissioni sul gas maggiori (che vanno al validatore), in cambio di una maggiore probabilità d'inclusione delle loro transazioni profittevoli in un blocco. Supponendo che i ricercatori siano economicamente razionari, la commissione sul gas che un ricercatore è disposto a pagare sarà un importo fino al 100% del MEV del ricercatore (poiché se la commissione sul gas fosse stata maggiore, il ricercatore avrebbe perso denaro). +I validatori ottengono comunque una parte dell'intero importo del MEV perché i cercatori sono disposti a pagare commissioni del gas elevate (che vanno al validatore) in cambio di una maggiore probabilità di inclusione delle loro transazioni redditizie in un blocco. Supponendo che i cercatori siano economicamente razionali, la commissione del gas che un cercatore è disposto a pagare sarà un importo fino al 100% del MEV del cercatore (perché se la commissione del gas fosse più alta, il cercatore perderebbe denaro). -Così, per alcune opportunità di MEV molto competitive, come l'[arbitraggio della DEX](#mev-examples-dex-arbitrage), i ricercatori potrebbero dover pagare il 90%, se non più, delle loro entrate totali del MEV in commissioni sul gas al validatore, poiché così tante persone vogliono eseguire lo stesso scambio d'arbitraggio profittevole. Questo è perché il solo modo per garantire che la loro transazione d'arbitraggio sia eseguita se inviano la transazione con il prezzo sul gas maggiore. +Detto questo, per alcune opportunità di MEV altamente competitive, come l'[arbitraggio sui DEX](#mev-examples-dex-arbitrage), i cercatori potrebbero dover pagare il 90% o anche più delle loro entrate totali di MEV in commissioni del gas al validatore, perché moltissime persone vogliono eseguire la stessa operazione di arbitraggio redditizia. Questo perché l'unico modo per garantire l'esecuzione della loro transazione di arbitraggio è inviare la transazione con il prezzo del gas più alto. -### Golfing del gas {#mev-extraction-gas-golfing} +### Gas golfing {#mev-extraction-gas-golfing} -Questa dinamica ha reso esser bravi al "golf del gas", la programmazione delle transazioni così che usino l'importo minimo di gas, un vantaggio competitivo, poiché consente ai ricercatori di impostare un prezzo del gas maggiore, mantenendo costanti le proprie commissioni sul gas totali (poiché, commissioni sul gas = prezzo del gas \* gas usato). +Questa dinamica ha reso l'essere bravi nel "gas golfing" — programmare le transazioni in modo che utilizzino la minor quantità di gas possibile — un vantaggio competitivo, perché consente ai cercatori di impostare un prezzo del gas più alto mantenendo costanti le commissioni del gas totali (poiché commissioni del gas = prezzo del gas \* gas utilizzato). -Alcune tecniche di golf del gas ben note includono: usare indirizzi che iniziano con una lunga stringa di zeri (es. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://etherscan.io/address/0x0000000000c521824eaff97eac7b73b084ef9306)) poiché richiedono meno spazio (e quindi gas) da archiviare; e lasciando piccoli saldi del token [ERC-20](/developers/docs/standards/tokens/erc-20/) nei contratti, poiché costa più gas inizializzare uno slot d'archiviazione (se il saldo è 0), piuttosto che aggiornarne uno. Individuare altre tecniche per ridurre il consumo di gas è un'area di ricerca attiva tra i ricercatori. +Alcune tecniche ben note di gas golfing includono: l'utilizzo di indirizzi che iniziano con una lunga stringa di zeri (es. [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://eth.blockscout.com/address/0x0000000000C521824EaFf97Eac7B73B084ef9306)) poiché occupano meno spazio (e quindi gas) per essere memorizzati; e lasciare piccoli saldi di token [ERC-20](/developers/docs/standards/tokens/erc-20/) nei contratti, poiché costa più gas inizializzare uno slot di archiviazione (il caso in cui il saldo è 0) rispetto all'aggiornamento di uno slot di archiviazione. Trovare ulteriori tecniche per ridurre l'utilizzo di gas è un'area di ricerca attiva tra i cercatori. ### Frontrunner generalizzati {#mev-extraction-generalized-frontrunners} -Anziché programmare algoritmi complessi per rilevare opportunità di MEV redditizie, alcuni ricercatori eseguono frontrunner generalizzati. I frontrunner generalizzati sono bot che tengono d'occhio il mempool per individuare le transazioni redditizie. Il frontrunner copierà il codice della transazione potenzialmente redditizia, sostituirà gli indirizzi con il proprio ed eseguirà la transazione localmente per verificare due volte che la transazione modificata risulti in un profitto all'indirizzo del frontrunner. Se la transazione è effettivamente redditizia, il precursore invierà la transazione modificata con l'indirizzo sostituito e un prezzo del gas maggiore, "precorrendo" la transazione originale e ottenendo il MEV originale del ricercatore. +Invece di programmare algoritmi complessi per rilevare opportunità di MEV redditizie, alcuni cercatori eseguono frontrunner generalizzati. I frontrunner generalizzati sono bot che osservano la mempool per rilevare transazioni redditizie. Il frontrunner copierà il codice della transazione potenzialmente redditizia, sostituirà gli indirizzi con l'indirizzo del frontrunner ed eseguirà la transazione localmente per verificare che la transazione modificata si traduca in un profitto per l'indirizzo del frontrunner. Se la transazione è effettivamente redditizia, il frontrunner invierà la transazione modificata con l'indirizzo sostituito e un prezzo del gas più alto, facendo "frontrunning" sulla transazione originale e ottenendo il MEV del cercatore originale. -### Flashbot {#mev-extraction-flashbots} +### Flashbots {#mev-extraction-flashbots} -I flashbot sono un progetto indipendente che estende i client di esecuzione con un servizio che consente ai ricercatori di inviare le transazioni del MEV ai validatori senza rivelarle al mempool pubblico. Questo impedisce ai frontrunner generalizzati di eseguire frontrun sulle transazioni. +Flashbots è un progetto indipendente che estende i client di esecuzione con un servizio che consente ai cercatori di inviare transazioni MEV ai validatori senza rivelarle alla mempool pubblica. Questo impedisce che le transazioni subiscano il frontrunning da parte di frontrunner generalizzati. ## Esempi di MEV {#mev-examples} Il MEV emerge sulla blockchain in diversi modi. -### Arbitraggio DEX {#mev-examples-dex-arbitrage} +### Arbitraggio sui DEX {#mev-examples-dex-arbitrage} -L'arbitraggio dello [scambio decentralizzato](/glossary/#dex) (DEX) è l'opportunità di MEV più semplice e più diffusa. Di conseguenza è anche la più competitiva. +L'arbitraggio sugli [exchange decentralizzati](/glossary/#dex) (DEX) è l'opportunità di MEV più semplice e conosciuta. Di conseguenza, è anche la più competitiva. -Funziona come segue: se due DEX offrono un token a due prezzi diversi, qualcuno può acquistare il token sul DEX al prezzo minore e rivenderlo sul DEX al prezzo maggiore in un'unica transazione atomica. Grazie ai meccanismi della blockchain, questo è vero e proprio arbitraggio privo di rischi. +Funziona così: se due DEX offrono un token a due prezzi diversi, qualcuno può acquistare il token sul DEX con il prezzo più basso e venderlo sul DEX con il prezzo più alto in una singola transazione atomica. Grazie ai meccanismi della blockchain, questo è un vero e proprio arbitraggio privo di rischi. -[Ecco un esempio](https://etherscan.io/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) di una transazione di arbitraggio redditizia in cui un ricercatore ha trasformato 1.000 ETH in 1.045 ETH sfruttando i diversi prezzi della coppia ETH/DAI su Uniswap vs. Sushiswap. +[Ecco un esempio](https://eth.blockscout.com/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) di una transazione di arbitraggio redditizia in cui un cercatore ha trasformato 1.000 ETH in 1.045 ETH sfruttando i diversi prezzi della coppia ETH/DAI su Uniswap rispetto a Sushiswap. ### Liquidazioni {#mev-examples-liquidations} -Le liquidazioni del protocollo di prestito presentano un'altra opportunità di MEV ben nota. +Le liquidazioni dei protocolli di prestito rappresentano un'altra ben nota opportunità di MEV. -I protocolli di prestito come Maker e Aave richiedono agli utenti di depositare un qualche tipo di garanzia (es. ETH). Questa garanzia depositata è quindi utilizzata per concedere prestiti ad altri utenti. +I protocolli di prestito come Maker e Aave richiedono agli utenti di depositare una garanzia (es. ETH). Questa garanzia depositata viene poi utilizzata per concedere prestiti ad altri utenti. -Gli utenti possono quindi prendere in prestito risorse e token dagli altri, a seconda delle loro esigenze (ad es. potresti prendere in prestito MKR se desideri votare in una proposta di governance di MakerDAO), fino a una certa percentuale della loro garanzia depositata. Ad esempio, se l'importo preso in prestito è un massimo del 30%, un utente che deposita 100 DAI nel protocollo può prendere in prestito fino all'equivalente di 30 DAI di un'altra risorsa. Il protocollo determina l'esatta percentuale di potenza presa in prestito. +Gli utenti possono quindi prendere in prestito asset e token da altri a seconda di ciò di cui hanno bisogno (es. potresti prendere in prestito MKR se vuoi votare in una proposta di governance di MakerDAO) fino a una certa percentuale della loro garanzia depositata. Ad esempio, se l'importo del prestito è al massimo del 30%, un utente che deposita 100 DAI nel protocollo può prendere in prestito fino a 30 DAI di un altro asset. Il protocollo determina l'esatta percentuale del potere di prestito. -Al fluttuare del valore della garanzia di un debitore, fluttua anche la capacità di prestito. Se, a causa delle fluttuazioni del mercato, il valore degli attivi presi in presi in prestito supera, ad esempio, il 30% del valore della loro garanzia (anche in questo caso l'esatta percentuale è determinata dal protocollo), il protocollo consente tipicamente a chiunque di liquidare la garanzia, pagando istantaneamente i creditori (in modo simile al funzionamento dei [margini aggiuntivi](https://www.investopedia.com/terms/m/margincall.asp) nella finanza tradizionale). In caso di liquidazione, il debitore deve solitamente pagare una cospicua commissione di liquidazione, parte della quale va al liquidatore; ed è qui che risiede l'opportunità di MEV. +Poiché il valore della garanzia di un mutuatario fluttua, fluttua anche il suo potere di prestito. Se, a causa delle fluttuazioni del mercato, il valore degli asset presi in prestito supera, ad esempio, il 30% del valore della loro garanzia (di nuovo, la percentuale esatta è determinata dal protocollo), il protocollo in genere consente a chiunque di liquidare la garanzia, ripagando istantaneamente i prestatori (questo è simile a come funzionano le [richieste di margine](https://www.investopedia.com/terms/m/margincall.asp) nella finanza tradizionale). Se liquidato, il mutuatario di solito deve pagare una pesante commissione di liquidazione, parte della quale va al liquidatore — ed è qui che entra in gioco l'opportunità di MEV. -I ricercatori competono per analizzare i dati della blockchain il più velocemente possibile per determinare quali debitori sono liquidabili ed essere i primi a inviare una transazione di liquidazione e raccogliere la commissione di liquidazione per se stessi. +I cercatori competono per analizzare i dati della blockchain il più velocemente possibile per determinare quali mutuatari possono essere liquidati ed essere i primi a inviare una transazione di liquidazione e riscuotere la commissione di liquidazione per se stessi. ### Sandwich trading {#mev-examples-sandwich-trading} Il sandwich trading è un altro metodo comune di estrazione del MEV. -Per eseguirlo, un ricercatore osserverà il mempool alla ricerca di scambi di DEX di notevole entità. Per esempio, supponiamo che qualcuno voglia comprare 10.000 UNI con DAI su Uniswap. Uno scambio di tale portata avrà un effetto significativo sulla coppia UNI/DAI, aumentando in modo potenzialmente importante il prezzo di UNI rispetto al DAI. +Per fare un "sandwich", un cercatore osserverà la mempool alla ricerca di grandi scambi sui DEX. Ad esempio, supponiamo che qualcuno voglia acquistare 10.000 UNI con DAI su Uniswap. Uno scambio di questa portata avrà un effetto significativo sulla coppia UNI/DAI, aumentando potenzialmente in modo significativo il prezzo di UNI rispetto a DAI. -Un ricercatore può calcolare l'effetto approssimativo del prezzo di questo scambio di ampia portata sulla coppia UNI/DAI ed eseguire un acquisto ottimale immediatamente _prima_ di esso, acquistando UNI a basso costo per poi eseguire l'ordine di vendita immediatamente _dopo_ lo scambio, vendendolo a un prezzo superiore, causato dallo stesso ordine. +Un cercatore può calcolare l'effetto approssimativo sul prezzo di questo grande scambio sulla coppia UNI/DAI ed eseguire un ordine di acquisto ottimale immediatamente _prima_ del grande scambio, acquistando UNI a basso costo, per poi eseguire un ordine di vendita immediatamente _dopo_ il grande scambio, vendendolo al prezzo più alto causato dal grande ordine. -Il sandwiching, tuttavia, è più rischioso non essendo atomico (a differenza dell'arbitraggio di DEX, come descritto sopra) ed è soggetto a un [attacco di salmonella](https://github.com/Defi-Cartel/salmonella). +Il sandwiching, tuttavia, è più rischioso in quanto non è atomico (a differenza dell'arbitraggio sui DEX, come descritto sopra) ed è soggetto a un [attacco salmonella](https://github.com/Defi-Cartel/salmonella). -### MEV dei NFT {#mev-examples-nfts} +### MEV degli NFT {#mev-examples-nfts} -Nel mondo dei NFT, il MEV è un fenomeno emergente e non necessariamente redditizio. +Il MEV nello spazio degli NFT è un fenomeno emergente e non è necessariamente redditizio. -Tuttavia, poiché le transazioni di NFT hanno luogo sulla stessa blockchain condivisa da tutte le transazioni di Ethereum, i ricercatori possono usare tecniche simili a quelle usate per le opportunità di MEV tradizionali anche nel mercato dei NFT. +Tuttavia, poiché le transazioni di NFT avvengono sulla stessa blockchain condivisa da tutte le altre transazioni di Ethereum, i cercatori possono utilizzare tecniche simili a quelle utilizzate nelle tradizionali opportunità di MEV anche nel mercato degli NFT. -Per esempio, se si verifica un calo a livello di un NFT popolare e un ricercatore vuole un certo NFT o una serie di NFT, può programmare una transazione in modo tale da essere il primo ad acquistare il NFT o l'intera serie di NFT in una sola transazione. Oppure, se un NFT viene [erroneamente elencato a un prezzo basso](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), un ricercatore può scavalcare gli altri acquirenti e ottenerlo a buon mercato. +Ad esempio, se c'è un drop di NFT popolare e un cercatore desidera un certo NFT o un set di NFT, può programmare una transazione in modo da essere il primo della fila ad acquistare l'NFT, oppure può acquistare l'intero set di NFT in una singola transazione. O se un NFT viene [erroneamente messo in vendita a un prezzo basso](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), un cercatore può fare frontrunning sugli altri acquirenti e accaparrarselo a poco prezzo. -Un esempio eloquente di MEV nel mondo dei NFT si è verificato quando un ricercatore ha speso $7 milioni per [comprare](https://etherscan.io/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5) ogni singolo Cryptopunk al prezzo di base. Un ricercatore della blockchain [ha spiegato su Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538) come l'acquirente avesse lavorato con un fornitore di MEV per mantenere segreto l'acquisto. +Un esempio lampante di MEV degli NFT si è verificato quando un cercatore ha speso 7 milioni di dollari per [acquistare](https://eth.blockscout.com/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5?tab=txs) ogni singolo Cryptopunk al prezzo minimo (price floor). Un ricercatore blockchain [ha spiegato su Twitter](https://twitter.com/IvanBogatyy/status/1422232184493121538) come l'acquirente ha collaborato con un fornitore di MEV per mantenere segreto il proprio acquisto. -### La lunga coda {#mev-examples-long-tail} +### La coda lunga {#mev-examples-long-tail} -L'arbitraggio di DEX, le liquidazioni e il sandwich trading sono tutte opportunità di MEV ben note e difficilmente saranno redditizie per i nuovi ricercatori. Tuttavia, esiste una lunga coda di opportunità di MEV meno note (il MEV nel mondo dei NFT è probabilmente una di esse). +L'arbitraggio sui DEX, le liquidazioni e il sandwich trading sono tutte opportunità di MEV molto note ed è improbabile che siano redditizie per i nuovi cercatori. Tuttavia, esiste una coda lunga di opportunità di MEV meno note (il MEV degli NFT è probabilmente una di queste opportunità). -I ricercatori che stanno muovendo i primi passi potrebbero avere maggiore successo ricercando MEV in questa lunga coda. La [MEV job board](https://github.com/flashbots/mev-job-board) del flashbot elenca alcune opportunità emergenti. +I cercatori alle prime armi potrebbero avere più successo cercando il MEV in questa coda più lunga. La [bacheca degli annunci di lavoro MEV](https://github.com/flashbots/mev-job-board) di Flashbots elenca alcune opportunità emergenti. ## Effetti del MEV {#effects-of-mev} -Il MEV non è una cosa negativa: su Ethereum ci sono conseguenze sia positive che negative connesse al MEV. +Il MEV non è del tutto negativo — ci sono conseguenze sia positive che negative per il MEV su Ethereum. -### Aspetti positivi {#effects-of-mev-the-good} +### I lati positivi {#effects-of-mev-the-good} -Molti progetti di DeFi si basano su attori economicamente razionali per assicurare l'utilità e stabilità dei loro protocolli. Per esempio, l'arbitraggio di DEX assicura che gli utenti ottengano i prezzi migliori e più corretti per i loro token, mentre i protocolli di prestito si basano su liquidazioni rapide quando i debitori scendono al di sotto dei coefficienti di garanzia per garantire il rimborso dei creditori. +Molti progetti DeFi si affidano ad attori economicamente razionali per garantire l'utilità e la stabilità dei loro protocolli. Ad esempio, l'arbitraggio sui DEX garantisce che gli utenti ottengano i prezzi migliori e più corretti per i loro token, e i protocolli di prestito si affidano a liquidazioni rapide quando i mutuatari scendono al di sotto dei rapporti di garanzia per assicurare che i prestatori vengano rimborsati. -Senza ricercatori razionali che cercano e correggono le inefficienze economiche e sfruttano gli incentivi economici dei protocolli, i protocolli DeFi e le dApp in generale potrebbero perdere la robustezza che esibiscono oggi. +Senza cercatori razionali che cercano e correggono le inefficienze economiche e sfruttano gli incentivi economici dei protocolli, i protocolli DeFi e le dApp in generale potrebbero non essere così robusti come lo sono oggi. -### Aspetti negativi {#effects-of-mev-the-bad} +### I lati negativi {#effects-of-mev-the-bad} -A livello di applicazione, alcune forme di MEV, come il sandwich trading, si traducono in un'esperienza inequivocabilmente peggiore per gli utenti. Gli utenti che ricevono il sandwich subiscono un maggiore slittamento e una peggiore esecuzione delle loro operazioni. +A livello di applicazione, alcune forme di MEV, come il sandwich trading, si traducono in un'esperienza inequivocabilmente peggiore per gli utenti. Gli utenti che subiscono un sandwich affrontano uno slippage maggiore e un'esecuzione peggiore delle loro operazioni. -Al livello della rete, i precursori generalizzati e le aste del prezzo del gas, che spesso intraprendono (quando due o più precursori competono perché la propria transazione sia inclusa nel blocco successivo, aumentando progressivamente il prezzo del gas della loro transazione), risultano in congestione della rete e prezzi del gas elevati per chiunque altro sia provando a eseguire transazioni regolari. +A livello di rete, i frontrunner generalizzati e le aste sul prezzo del gas in cui spesso si impegnano (quando due o più frontrunner competono affinché la loro transazione venga inclusa nel blocco successivo aumentando progressivamente il prezzo del gas delle proprie transazioni) causano congestione della rete e prezzi del gas elevati per tutti gli altri che cercano di eseguire transazioni regolari. -Oltre a ciò che si verifica _all'interno_ dei blocchi, il MEV può avere effetti deleteri _tra_ i blocchi. Se il MEV disponibile in un blocco supera significativamente la ricompensa standard del blocco, i validatori potrebbero essere incentivati a riorganizzare i blocchi e catturare da soli il MEV, causando la riorganizzazione della blockchain e l'instabilità del consenso. +Oltre a ciò che accade _all'interno_ dei blocchi, il MEV può avere effetti deleteri _tra_ i blocchi. Se il MEV disponibile in un blocco supera significativamente la ricompensa del blocco standard, i validatori potrebbero essere incentivati a riorganizzare i blocchi e catturare il MEV per se stessi, causando la riorganizzazione della blockchain e l'instabilità del consenso. -Questa possibile riorganizzazione della blockchain è stata [precedentemente esplorata sulla blockchain di Bitcoin](https://dl.acm.org/doi/10.1145/2976749.2978408). Poiché le metà delle ricompense del blocco e le commissioni di transazione di Bitcoin costituiscono una porzione sempre più consistente della ricompensa del blocco, si presentano situazioni in cui diventa economicamente razionale per i miner rinunciare alla ricompensa del blocco successivo e ri-minare invece i blocchi passati con commissioni maggiori. Con la crescita del MEV, la stessa tipologia di situazione potrebbe verificarsi in Ethereum, minacciando l'integrità della blockchain. +Questa possibilità di riorganizzazione della blockchain è stata [precedentemente esplorata sulla blockchain di Bitcoin](https://dl.acm.org/doi/10.1145/2976749.2978408). Man mano che la ricompensa del blocco di Bitcoin si dimezza e le commissioni della transazione costituiscono una porzione sempre maggiore della ricompensa del blocco, si presentano situazioni in cui diventa economicamente razionale per i miner rinunciare alla ricompensa del blocco successivo e invece minare nuovamente i blocchi passati con commissioni più elevate. Con la crescita del MEV, lo stesso tipo di situazione potrebbe verificarsi in Ethereum, minacciando l'integrità della blockchain. ## Stato del MEV {#state-of-mev} -L'estrazione del MEV è aumentata a dismisura agli inizi del 2021, risultando in prezzi del gas estremamente elevati nei primi mesi dell'anno. L'emergere della trasmissione del MEV dei Flashbot ha ridotto l'efficienza dei precursori generalizzati e ha portato le aste del prezzo del gas al di fuori della catena, riducendo i prezzi del gas per gli utenti ordinari. +L'estrazione del MEV è esplosa all'inizio del 2021, portando a prezzi del gas estremamente elevati nei primi mesi dell'anno. L'emergere del relay MEV di Flashbots ha ridotto l'efficacia dei frontrunner generalizzati e ha portato le aste sul prezzo del gas fuori catena, abbassando i prezzi del gas per gli utenti comuni. -Mentre molti ricercatori guadagnano ancora molto dal MEV, con il diffondersi delle opportunità e la competizione di sempre più ricercatori per la stessa opportunità, i validatori cattureranno sempre più ricavi totali del MEV (poiché lo stesso tipo di aste del gas originariamente descritte in precedenza, si verificano anche nei Flashbot, seppur privatamente, e i validatori cattureranno i ricavi di gas risultanti). Inoltre, il MEV non è un'esclusiva di Ethereum e, man mano che le opportunità su Ethereum diventano più competitive, i ricercatori si spostano su blockchain alternative come Binance Smart Chain, dove esistono opportunità di MEV simili a quelle di Ethereum ma con minore competizione. +Sebbene molti cercatori stiano ancora guadagnando bene dal MEV, man mano che le opportunità diventano più note e sempre più cercatori competono per la stessa opportunità, i validatori cattureranno sempre più entrate totali dal MEV (perché lo stesso tipo di aste del gas originariamente descritte sopra si verificano anche in Flashbots, sebbene privatamente, e i validatori cattureranno le entrate del gas risultanti). Il MEV non è inoltre un'esclusiva di Ethereum e, man mano che le opportunità diventano più competitive su Ethereum, i cercatori si stanno spostando su blockchain alternative come Binance Smart Chain, dove esistono opportunità di MEV simili a quelle su Ethereum con meno concorrenza. -D'altra parte, la transizione dal proof-of-work al proof-of-stake e lo sforzo di ridimensionamento di Ethereum in corso usando i rollup stanno modificando il panorama del MEV in modi ancora piuttosto nebulosi. Non è ancora noto come il fatto di conoscere i propositori di blocchi garantiti lievemente in anticipo modifichi le dinamiche di estrazione del MEV rispetto al modello probabilistico nel proof-of-work, o come questo sarà sconvolto quando l'[elezione segreta di un singolo capo ](https://ethresear.ch/t/secret-non-single-leader-election/11789) e la [tecnologia distribuita del validatore](/staking/dvt/) saranno implementate. Similmente, resta da vedere quali opportunità del MEV esistono quando gran parte dell'attività degli utenti è portata via da Ethereum e sui suoi rollup e shard di livello 2. +D'altra parte, la transizione dalla prova di lavoro alla prova di stake e lo sforzo continuo per la scalabilità di Ethereum utilizzando i rollup cambiano tutti il panorama del MEV in modi che sono ancora in qualche modo poco chiari. Non è ancora ben noto come avere proponenti del blocco garantiti e noti con un po' di anticipo cambi le dinamiche dell'estrazione del MEV rispetto al modello probabilistico nella prova di lavoro o come questo verrà stravolto quando verranno implementate l'[elezione del leader segreto singolo](https://ethresear.ch/t/secret-non-single-leader-election/11789) e la [tecnologia del validatore distribuito](/staking/dvt/). Allo stesso modo, resta da vedere quali opportunità di MEV esisteranno quando la maggior parte dell'attività degli utenti verrà trasferita da Ethereum ai suoi rollup di livello 2 e ai frammenti. -## MEV nel Proof-of-Stake (PoS) di Ethereum {#mev-in-ethereum-proof-of-stake} +## Il MEV nella Prova di Stake (PoS) di Ethereum {#mev-in-ethereum-proof-of-stake} -Come spiegato, il MEV ha implicazioni negative per l’esperienza complessiva degli utenti e per la sicurezza al livello di consenso. Ma la transizione di Ethereum al protocollo di consenso proof-of-stake (soprannominato “La Fusione”) introduce potenzialmente nuovi rischi legati al MEV: +Come spiegato, il MEV ha implicazioni negative per l'esperienza utente complessiva e la sicurezza del livello di consenso. Ma la transizione di Ethereum a un consenso di prova di stake (soprannominata "Il Merge") introduce potenzialmente nuovi rischi legati al MEV: ### Centralizzazione dei validatori {#validator-centralization} -Dopo La Fusione di Ethereum, i validatori (dopo aver effettuato depositi di sicurezza di 32 ETH) raggiungono il consenso sulla validità dei blocchi aggiunti alla Beacon Chain. Dal momento che 32 ETH possono essere fuori dalla portata di molti, [unirsi a un pool di staking](/staking/pools/) può essere un'opzione più fattibile. Ciò nonostante, una sana distribuzione di [staker autonomi](/staking/solo/) è ideale, in quanto attenua la centralizzazione dei validatori e migliora la sicurezza di Ethereum. +Nell'Ethereum post-Merge, i validatori (avendo effettuato depositi di sicurezza di 32 ETH) raggiungono il consenso sulla validità dei blocchi aggiunti alla Beacon Chain. Poiché 32 ETH potrebbero essere fuori dalla portata di molti, [unirsi a una pool di staking](/staking/pools/) potrebbe essere un'opzione più fattibile. Tuttavia, una sana distribuzione di [staker solitari](/staking/solo/) è l'ideale, in quanto mitiga la centralizzazione dei validatori e migliora la sicurezza di Ethereum. -Tuttavia, si ritiene che l'estrazione del MEV sia in grado di accelerare la centralizzazione dei validatori. Ciò è in parte dovuto al fatto che, poiché i validatori [guadagnano meno per proporre blocchi](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply) rispetto a quanto facessero i minatori in precedenza, l'estrazione del MEV ha notevolmente [influenzato i guadagni dei validatori](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb) da quando c'é stata [La Fusione](/roadmap/merge/). +Tuttavia, si ritiene che l'estrazione del MEV sia in grado di accelerare la centralizzazione dei validatori. Questo in parte perché, poiché i validatori [guadagnano meno per proporre blocchi](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply) rispetto a quanto facevano in precedenza i miner, l'estrazione del MEV ha fortemente [influenzato i guadagni dei validatori](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb) da [Il Merge](/roadmap/merge/). -I pool di staking più grandi avranno probabilmente più risorse da investire nelle ottimizzazioni necessarie per cogliere le opportunità del MEV. Quanto più MEV questi pool estraggono, tanto più risorse avranno per migliorare le loro capacità di estrazione del MEV (e aumentare le entrate complessive), creando essenzialmente [economie di scala](https://www.investopedia.com/terms/e/economiesofscale.asp#). +Le pool di staking più grandi avranno probabilmente più risorse da investire nelle ottimizzazioni necessarie per catturare le opportunità di MEV. Più MEV estraggono queste pool, più risorse hanno per migliorare le loro capacità di estrazione del MEV (e aumentare le entrate complessive), creando essenzialmente [economie di scala](https://www.investopedia.com/terms/e/economiesofscale.asp#). -Con un minor numero di risorse a loro disposizione, gli staker autonomi potrebbero non essere in grado di trarre profitto dalle opportunità offerte dal MEV. Questo potrebbe aumentare la pressione sui validatori autonomi per unire potenti pool di staking per aumentare i loro guadagni, riducendo la decentralizzazione in Ethereum. +Con meno risorse a loro disposizione, gli staker solitari potrebbero non essere in grado di trarre profitto dalle opportunità di MEV. Ciò potrebbe aumentare la pressione sui validatori indipendenti affinché si uniscano a potenti pool di staking per aumentare i loro guadagni, riducendo la decentralizzazione in Ethereum. ### Mempool con permessi {#permissioned-mempools} -In risposta agli attacchi di sandwiching e di frontrunning, i trader possono iniziare a condurre operazioni off-chain con validatori per la privacy delle transazioni. Invece di inviare una potenziale transazione MEV al mempool pubblico, il trader la invia direttamente al validatore, che la include in un blocco e divide i profitti con il trader. +In risposta agli attacchi di sandwiching e frontrunning, i trader potrebbero iniziare a condurre accordi fuori catena con i validatori per la privacy delle transazioni. Invece di inviare una potenziale transazione MEV alla mempool pubblica, il trader la invia direttamente al validatore, che la include in un blocco e divide i profitti con il trader. -I “dark pool” sono una versione più ampia di questo accordo e funzionano come mempool di solo accesso, con permessi, aperti agli utenti disposti a pagare determinate commissioni. Questa tendenza diminuirebbe la mancanza di permessi e la mancanza di fiducia di Ethereum e trasformerebbe potenzialmente la blockchain in un meccanismo “pay-to-play” che favorisce il miglior offerente. +Le "dark pool" sono una versione più ampia di questo accordo e funzionano come mempool con permessi, a solo accesso, aperte agli utenti disposti a pagare determinate commissioni. Questa tendenza diminuirebbe la natura senza permessi e trustless di Ethereum e trasformerebbe potenzialmente la blockchain in un meccanismo "pay-to-play" che favorisce il miglior offerente. -I mempool con permessi accelererebbero anche i rischi di centralizzazione descritti nella sezione precedente. I grandi pool che eseguono più validatori trarranno probabilmente vantaggio dall'offrire la privacy delle transazioni ai trader e agli utenti, aumentando i loro ricavi in MEV. +Le mempool con permessi accelererebbero anche i rischi di centralizzazione descritti nella sezione precedente. Le grandi pool che gestiscono più validatori trarranno probabilmente vantaggio dall'offrire la privacy delle transazioni a trader e utenti, aumentando le loro entrate dal MEV. -La lotta a questi problemi legati al MEV successivamente alla Fusione di Ethereum è un ambito centrale di ricerca. Finora le due soluzioni proposte per ridurre l'impatto negativo del MEV sulla decentralizzazione e la sicurezza di Ethereum dopo La Fusione sono la [**Separazione propositore-costruttore (PBS)**](/roadmap/pbs/) e l'[**API del costruttore**](https://github.com/ethereum/builder-specs). +Combattere questi problemi legati al MEV nell'Ethereum post-Merge è un'area di ricerca fondamentale. Ad oggi, due soluzioni proposte per ridurre l'impatto negativo del MEV sulla decentralizzazione e sulla sicurezza di Ethereum dopo Il Merge sono la [**Separazione tra Proponente e Costruttore (PBS)**](/roadmap/pbs/) e la [**Builder API**](https://github.com/ethereum/builder-specs). -### Separazione del Propositore e del Costruttore {#proposer-builder-separation} +### Separazione tra Proponente e Costruttore {#proposer-builder-separation} -Sia nel proof-of-of-work che nel proof-of-stake, un nodo che costruisce un blocco propone di aggiungerlo alla catena ad altri nodi che partecipano al consenso. Un nuovo blocco diventa parte della catena canonica dopo che un altro minatore vi ha costruito sopra (in PoW) o ha ricevuto attestazioni dalla maggior parte dei validatori (in PoS). +Sia nella prova di lavoro che nella prova di stake, un nodo che costruisce un blocco lo propone per l'aggiunta alla catena agli altri nodi che partecipano al consenso. Un nuovo blocco diventa parte della catena canonica dopo che un altro miner ci costruisce sopra (nella PoW) o riceve attestazioni dalla maggioranza dei validatori (nella PoS). -La combinazione dei ruoli del produttore di blocchi e del propositore di blocchi è ciò che introduce la maggior parte dei problemi relativi al MEV descritti in precedenza. Ad esempio, i nodi di consenso sono incentivati a innescare le riorganizzazioni della catena negli [attacchi time-bandit](https://www.mev.wiki/attack-examples/time-bandit-attack) per massimizzare i guadagni di MEV. +La combinazione dei ruoli di produttore del blocco e proponente del blocco è ciò che introduce la maggior parte dei problemi legati al MEV descritti in precedenza. Ad esempio, i nodi di consenso sono incentivati a innescare riorganizzazioni della catena in [attacchi time-bandit](https://www.mev.wiki/attack-examples/time-bandit-attack) per massimizzare i guadagni dal MEV. -La [Separazione propositore-costruttore](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) è concepita per mitigare l'impatto del MEV, soprattutto al livello di consenso. La caratteristica principale della PBS è la separazione dei produttori di blocchi e le regole del propositore di blocchi. I validatori sono ancora responsabili di proporre e votare i blocchi, ma una nuova classe di entità specializzate, chiamati **costruttori di blocchi**, sono incaricati di ordinare transazioni e costruire i blocchi. +La [separazione tra proponente e costruttore](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) è progettata per mitigare l'impatto del MEV, specialmente al livello di consenso. La caratteristica principale della PBS è la separazione dei ruoli di produttore del blocco e proponente del blocco. I validatori sono ancora responsabili della proposta e della votazione sui blocchi, ma a una nuova classe di entità specializzate, chiamate **costruttori di blocchi** (block builders), è affidato il compito di ordinare le transazioni e costruire i blocchi. -Nella PBS, un costruttore di blocchi crea un pacchetto di transazioni e mette un'offerta per la sua inclusione in un blocco della Beacon Chain (come il “payload di esecuzione”). Il validatore selezionato per proporre il blocco successivo quindi controlla le diverse offerte e sceglie il pacchetto con la commissione più alta. La PBS crea essenzialmente un mercato d'asta, dove i costruttori negoziano con validatori che vendono lo spazio del blocco. +Con la PBS, un costruttore di blocchi crea un pacchetto di transazioni e fa un'offerta per la sua inclusione in un blocco della Beacon Chain (come "payload di esecuzione"). Il validatore selezionato per proporre il blocco successivo controlla quindi le diverse offerte e sceglie il pacchetto con la commissione più alta. La PBS crea essenzialmente un mercato d'asta, in cui i costruttori negoziano con i validatori che vendono spazio nei blocchi. -Gli attuali progetti PBS utilizzano uno [schema commit-reveal](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/) in cui i costruttori pubblicano solo un impegno crittografico per i contenuti di un blocco (intestazione del blocco) insieme alle loro offerte. Dopo aver accettato l'offerta vincente, il propositore crea una proposta di blocco firmata che include l'intestazione del blocco. Il costruttore di blocchi dovrebbe pubblicare il corpo completo del blocco dopo aver visualizzato la proposta del blocco firmata e, inoltre, deve ricevere abbastanza [attestazioni](/glossary/#attestation) dai validatori prima che sia finalizzata. +Gli attuali design della PBS utilizzano uno [schema commit-reveal](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/) in cui i costruttori pubblicano solo un impegno crittografico ai contenuti di un blocco (intestazione del blocco) insieme alle loro offerte. Dopo aver accettato l'offerta vincente, il proponente crea una proposta di blocco firmata che include l'intestazione del blocco. Ci si aspetta che il costruttore del blocco pubblichi l'intero corpo del blocco dopo aver visto la proposta di blocco firmata, e deve anche ricevere abbastanza [attestazioni](/glossary/#attestation) dai validatori prima che venga finalizzato. -#### In che modo la separazione propositore-costruttore riduce l’impatto del MEV? {#how-does-pbs-curb-mev-impact} +#### In che modo la separazione tra proponente e costruttore mitiga l'impatto del MEV? {#how-does-pbs-curb-mev-impact} -La separazione del propositore e del costruttore riduce l’effetto del MEV sul consenso eliminando l’estrazione del MEV dal campo di applicazione dei validatori. Invece, da ora in poi saranno i costruttori di blocchi che eseguono hardware specializzato a cogliere le opportunità di MEV. +La separazione tra proponente e costruttore all'interno del protocollo riduce l'effetto del MEV sul consenso rimuovendo l'estrazione del MEV dalle competenze dei validatori. Invece, i costruttori di blocchi che eseguono hardware specializzato cattureranno le opportunità di MEV in futuro. -Ciò, però, non esclude del tutto i validatori dal reddito relativo al MEV, poiché i costruttori devono offrire alti pagamenti per far accettare i propri blocchi dai validatori. Tuttavia, con i validatori non più direttamente focalizzati sull'ottimizzazione del reddito da MEV, la minaccia di attacchi di time-bandit si riduce. +Questo non esclude totalmente i validatori dalle entrate legate al MEV, tuttavia, poiché i costruttori devono fare offerte alte per far accettare i loro blocchi dai validatori. Ciononostante, con i validatori non più direttamente concentrati sull'ottimizzazione delle entrate dal MEV, la minaccia degli attacchi time-bandit si riduce. -La separazione propositore-costruttore riduce anche i rischi di centralizzazione del MEV. Per esempio, l'uso di uno schema commit-reveal elimina la necessità per i costruttori di fidarsi del fatto che i validatori non ruberanno l'opportunità di MEV o non la esporranno ad altri costruttori. In questo modo si riduce la barriera per gli operatori autonomi di beneficiare del MEV, altrimenti i costruttori tenderebbero a favorire grandi pool con buona reputazione off-chain e a condurre delle trattative off-chain con loro. +La separazione tra proponente e costruttore riduce anche i rischi di centralizzazione del MEV. Ad esempio, l'uso di uno schema commit-reveal elimina la necessità per i costruttori di fidarsi che i validatori non rubino l'opportunità di MEV o la espongano ad altri costruttori. Questo abbassa la barriera per gli staker solitari per beneficiare del MEV, altrimenti i costruttori tenderebbero a favorire le grandi pool con reputazione fuori catena e a condurre accordi fuori catena con loro. -Allo stesso modo, i validatori non devono fidarsi del fatto che i costruttori non tratterranno i corpi dei blocchi o non pubblicheranno blocchi non validi perché il pagamento è incondizionato. La commissione del validatore continua a essere elaborata anche se il blocco proposto non è disponibile o è dichiarato non valido da altri validatori. In quest'ultimo caso, il blocco viene semplicemente scartato, costringendo il costruttore di blocchi a perdere tutte le commissioni di transazione e i ricavi di MEV. +Allo stesso modo, i validatori non devono fidarsi che i costruttori non trattengano i corpi dei blocchi o pubblichino blocchi non validi perché il pagamento è incondizionato. La commissione del validatore viene comunque elaborata anche se il blocco proposto non è disponibile o viene dichiarato non valido da altri validatori. In quest'ultimo caso, il blocco viene semplicemente scartato, costringendo il costruttore del blocco a perdere tutte le commissioni della transazione e le entrate dal MEV. -### API del Costruttore {#builder-api} +### Builder API {#builder-api} -Mentre la separazione tra propositori e creatori promette di ridurre gli effetti dell'estrazione del MEV, la sua attuazione richiede modifiche al protocollo di consenso. In particolare, la regola [scelta della diramazione](/developers/docs/consensus-mechanisms/pos/#fork-choice) sulla Beacon Chain dovrebbe essere aggiornata. L'API [Builder](https://github.com/ethereum/builder-specs) è una soluzione temporanea volta a fornire un'implementazione funzionante della separazione propositore-costruttore, anche se con presupposti di fiducia più elevati. +Sebbene la separazione tra proponente e costruttore prometta di ridurre gli effetti dell'estrazione del MEV, la sua implementazione richiede modifiche al protocollo di consenso. Nello specifico, la regola di [scelta della biforcazione](/developers/docs/consensus-mechanisms/pos/#fork-choice) (fork choice) sulla Beacon Chain dovrebbe essere aggiornata. La [Builder API](https://github.com/ethereum/builder-specs) è una soluzione temporanea volta a fornire un'implementazione funzionante della separazione tra proponente e costruttore, sebbene con presupposti di fiducia più elevati. -L'API Builder è una versione modificata dell'[API Engine](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) utilizzata dai client del livello di consenso per richiedere payload di esecuzione dai client del livello di esecuzione. Come indicato nella [specifica del validatore onesto](https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/validator.md), i validatori selezionati per i compiti di proposta dei blocchi richiedono un pacchetto di transazioni da un client di esecuzione connesso, che includono nel blocco della Beacon Chain proposto. +La Builder API è una versione modificata dell'[Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) utilizzata dai client di consenso per richiedere payload di esecuzione dai client di esecuzione. Come delineato nelle [specifiche del validatore onesto](https://github.com/ethereum/consensus-specs/blob/master/specs/bellatrix/validator.md), i validatori selezionati per i compiti di proposta dei blocchi richiedono un pacchetto di transazioni da un client di esecuzione connesso, che includono nel blocco proposto della Beacon Chain. -L'API Builder funge anche da middleware tra validatori e client al livello di esecuzione, ma è diverso perché permette ai validatori sulla Beacon Chain di procurarsi blocchi da entità esterne (invece di costruire un blocco localmente utilizzando un client di esecuzione). +La Builder API funge anche da middleware tra i validatori e i client di esecuzione; ma è diversa perché consente ai validatori sulla Beacon Chain di reperire blocchi da entità esterne (invece di costruire un blocco localmente utilizzando un client di esecuzione). -Di seguito una panoramica di come funziona l'API Builder: +Di seguito è riportata una panoramica di come funziona la Builder API: -1. L'API Builder collega il validatore a una rete di costruttori di blocchi che eseguono client del livello di esecuzione. Come nella PBS, i costruttori sono parti specializzate che investono nella costruzione di blocchi ad alta intensità di risorse e utilizzano diverse strategie per massimizzare i ricavi guadagnati dai MEV + mance di priorità. +1. La Builder API connette il validatore a una rete di costruttori di blocchi che eseguono client di esecuzione. Come nella PBS, i costruttori sono parti specializzate che investono nella costruzione di blocchi ad alta intensità di risorse e utilizzano diverse strategie per massimizzare le entrate guadagnate dal MEV + le mance di priorità. -2. Un validatore (che esegue un client del livello di consenso) richiede payload di esecuzione insieme alle offerte dalla rete di costruttori. Le offerte dei costruttori conterranno l'intestazione del payload di esecuzione – un impegno crittografico per i contenuti del payload – e una commissione da pagare al validatore. +2. Un validatore (che esegue un client di consenso) richiede payload di esecuzione insieme alle offerte dalla rete di costruttori. Le offerte dei costruttori conterranno l'intestazione del payload di esecuzione — un impegno crittografico ai contenuti del payload — e una commissione da pagare al validatore. -3. Il validatore esamina le offerte in arrivo e sceglie il payload di esecuzione con la commissione più alta. Usando l'API Builder, il validatore crea una proposta di blocco Beacon "alla cieca" che include solo la sua firma e l'intestazione del payload di esecuzione e la invia al costruttore. +3. Il validatore esamina le offerte in arrivo e sceglie il payload di esecuzione con la commissione più alta. Utilizzando la Builder API, il validatore crea una proposta di blocco Beacon "cieca" (blinded) che include solo la propria firma e l'intestazione del payload di esecuzione e la invia al costruttore. -4. Il costruttore che esegue l'API Builder dovrebbe rispondere con il payload di esecuzione completo quando si vede la proposta di blocco alla cieca. Questo permette al validatore di creare un blocco Beacon "firmato", che propaga in tutta la rete. +4. Ci si aspetta che il costruttore che esegue la Builder API risponda con l'intero payload di esecuzione dopo aver visto la proposta di blocco cieca. Questo consente al validatore di creare un blocco Beacon "firmato", che propaga attraverso la rete. -5. Un validatore che utilizza l'API Builder dovrebbe ancora costruire un blocco localmente nel caso in cui il costruttore del blocco non risponda tempestivamente, in modo da non perdere le ricompense della proposta di blocco. Tuttavia, il validatore non può creare un altro blocco utilizzando le transazioni ormai rivelate o un altro set, in quanto equivarrebbe a un _equivoco_ (firmare due blocchi all'interno dello stesso slot), che è un illecito tagliabile. +5. Ci si aspetta comunque che un validatore che utilizza la Builder API costruisca un blocco localmente nel caso in cui il costruttore del blocco non risponda prontamente, in modo da non perdere le ricompense per la proposta del blocco. Tuttavia, il validatore non può creare un altro blocco utilizzando le transazioni ora rivelate o un altro set, poiché equivarrebbe a un'_equivocazione_ (firmare due blocchi all'interno dello stesso slot), che è un'infrazione da punire. -Un esempio di implementazione dell'API Builder è [MEV Boost](https://github.com/flashbots/mev-boost), un miglioramento rispetto al [meccanismo di asta di Flashbots](https://docs.flashbots.net/flashbots-auction/overview/) progettato per frenare le esternalità negative del MEV su Ethereum. L'asta di Flashbots consente ai validatori in proof-of-stake di esternalizzare il lavoro di creazione di blocchi redditizi a soggetti specializzati chiamati **ricercatori**. ![Un diagramma che mostra nel dettaglio il flusso del MEV](./mev.png) +Un'implementazione di esempio della Builder API è [MEV Boost](https://github.com/flashbots/mev-boost), un miglioramento del [meccanismo d'asta di Flashbots](https://docs.flashbots.net/flashbots-auction/overview) progettato per frenare le esternalità negative del MEV su Ethereum. L'asta di Flashbots consente ai validatori nella prova di stake di esternalizzare il lavoro di costruzione di blocchi redditizi a parti specializzate chiamate **cercatori** (searchers). +![Un diagramma che mostra il flusso del MEV in dettaglio](./mev.png) -I ricercatori cercano opportunità di MEV redditizie e inviano pacchetti di transazioni ai propositori dei blocchi insieme a un'[offerta in busta chiusa](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) per l'inclusione nel blocco. Il validatore che esegue mev-geth, una versione biforcata del client go-ethereum (Geth), deve solo scegliere il pacchetto con il maggior profitto e includerlo come parte del nuovo blocco. Per proteggere i propositori del blocco (validatori) dalle truffe e dalle transazioni non valide, i pacchetti di transazioni passano attraverso i **relayer** per la convalida prima di arrivare al propositore. +I cercatori cercano opportunità di MEV redditizie e inviano pacchetti di transazioni ai proponenti del blocco insieme a un'[offerta a busta chiusa](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) per l'inclusione nel blocco. Il validatore che esegue mev-geth, una versione biforcata del client go-ethereum (Geth), deve solo scegliere il pacchetto con il maggior profitto e includerlo come parte del nuovo blocco. Per proteggere i proponenti del blocco (validatori) dallo spam e dalle transazioni non valide, i pacchetti di transazioni passano attraverso i **relayer** per la convalida prima di arrivare al proponente. -MEV Boost mantiene lo stesso funzionamento dell’asta originale di Flashbots, anche se con nuove funzionalità progettate per il passaggio di Ethereum al proof-of-stake. I ricercatori trovano ancora transazioni MEV redditizie per l'inclusione nei blocchi, ma una nuova classe di soggetti specializzati, chiamati **costruttori**, sono responsabili dell'aggregazione delle transazioni e dei pacchetti nei blocchi. Un costruttore accetta offerte in busta chiusa dai ricercatori ed esegue ottimizzazioni per trovare l'ordine più redditizio. +MEV Boost mantiene lo stesso funzionamento dell'asta originale di Flashbots, sebbene con nuove funzionalità progettate per il passaggio di Ethereum alla prova di stake. I cercatori trovano ancora transazioni MEV redditizie per l'inclusione nei blocchi, ma una nuova classe di parti specializzate, chiamate **costruttori** (builders), è responsabile dell'aggregazione di transazioni e pacchetti in blocchi. Un costruttore accetta offerte a busta chiusa dai cercatori ed esegue ottimizzazioni per trovare l'ordinamento più redditizio. -Il relayer è ancora responsabile della convalida dei pacchetti di transazioni prima di trasmetterli al propositore. Tuttavia, MEV Boost introduce **escrow ** responsabili di fornire la [disponibilità di dati](/developers/docs/data-availability/) memorizzando i corpi dei blocchi inviati dai costruttori e le intestazioni dei blocchi inviati dai validatori. Qui, un validatore collegato a un relay chiede i payload di esecuzione disponibili e utilizza l'algoritmo di ordinamento di MEV Boost per selezionare l'intestazione del payload con l'offerta più alta + mance in MEV. +Il relayer è ancora responsabile della convalida dei pacchetti di transazioni prima di passarli al proponente. Tuttavia, MEV Boost introduce degli **escrow** responsabili di fornire la [disponibilità dei dati](/developers/docs/data-availability/) memorizzando i corpi dei blocchi inviati dai costruttori e le intestazioni dei blocchi inviate dai validatori. Qui, un validatore connesso a un relay richiede i payload di esecuzione disponibili e utilizza l'algoritmo di ordinamento di MEV Boost per selezionare l'intestazione del payload con l'offerta più alta + le mance del MEV. -#### Come fa l'API Builder a mitigare l'impatto del MEV? {#how-does-builder-api-curb-mev-impact} +#### In che modo la Builder API mitiga l'impatto del MEV? {#how-does-builder-api-curb-mev-impact} -Il vantaggio principale dell'API Builder è il suo potenziale per democratizzare l'accesso alle opportunità del MEV. Il ricorso a sistemi di commit-reveal elimina le ipotesi di fiducia e riduce le barriere all’ingresso per i validatori che cercano di trarre vantaggio dai MEV. Ciò dovrebbe ridurre la pressione sugli staker autonomi per integrarsi con grandi pool di staking al fine di aumentare i profitti in MEV. +Il vantaggio principale della Builder API è il suo potenziale di democratizzare l'accesso alle opportunità di MEV. L'utilizzo di schemi commit-reveal elimina i presupposti di fiducia e riduce le barriere all'ingresso per i validatori che cercano di beneficiare del MEV. Questo dovrebbe ridurre la pressione sugli staker solitari affinché si integrino con grandi pool di staking al fine di aumentare i profitti dal MEV. -L'implementazione generalizzata dell'API Builder incoraggerà una maggiore concorrenza tra i costruttori di blocchi, il che aumenta la resistenza alla censura. Dato che i validatori selezionano le offerte da più costruttori, un costruttore intenzionato a censurare una o più transazioni deve superare tutti gli altri costruttori senza censura per avere successo. Ciò aumenta drasticamente il costo della censura degli utenti e ne scoraggia la pratica. +L'implementazione diffusa della Builder API incoraggerà una maggiore concorrenza tra i costruttori di blocchi, il che aumenta la resistenza alla censura. Poiché i validatori esaminano le offerte di più costruttori, un costruttore intento a censurare una o più transazioni degli utenti deve superare l'offerta di tutti gli altri costruttori non censuranti per avere successo. Questo aumenta drasticamente il costo della censura degli utenti e scoraggia la pratica. -Alcuni progetti, come MEV Boost, utilizzano l'API Builder come parte di una struttura generale progettata per fornire privacy delle transazioni a determinate parti, come i trader che cercano di evitare attacchi frontrunning/sandwiching. Questo obiettivo è conseguito fornendo un canale di comunicazione privato tra gli utenti e i costruttori di blocchi. A differenza dei mempool con permessi (permissioned) descritti in precedenza, questo approccio è vantaggioso per i seguenti motivi: +Alcuni progetti, come MEV Boost, utilizzano la Builder API come parte di una struttura complessiva progettata per fornire la privacy delle transazioni a determinate parti, come i trader che cercano di evitare attacchi di frontrunning/sandwiching. Ciò si ottiene fornendo un canale di comunicazione privato tra utenti e costruttori di blocchi. A differenza delle mempool con permessi descritte in precedenza, questo approccio è vantaggioso per i seguenti motivi: -1. L'esistenza di più costruttori sul mercato rende la censura impraticabile, il che va a vantaggio degli utenti. Al contrario, l'esistenza di pool centralizzati e basati sulla fiducia concentrerebbe il potere nelle mani di pochi costruttori di blocchi e aumenterebbe la possibilità di censura. +1. L'esistenza di più costruttori sul mercato rende la censura poco pratica, il che va a vantaggio degli utenti. Al contrario, l'esistenza di dark pool centralizzate e basate sulla fiducia concentrerebbe il potere nelle mani di pochi costruttori di blocchi e aumenterebbe la possibilità di censura. -2. Il software API Builder è open-source e consente a chiunque di offrire servizi di costruttore di blocchi. Ciò significa che gli utenti non sono obbligati a utilizzare un particolare costruttore di blocca, migliorando la neutralità e la mancanza di permessi di Ethereum. Inoltre, i trader in cerca di MEV non contribuiranno inavvertitamente alla centralizzazione utilizzando canali di transazione privati. +2. Il software della Builder API è open-source, il che consente a chiunque di offrire servizi di costruzione di blocchi. Ciò significa che gli utenti non sono costretti a utilizzare un particolare costruttore di blocchi e migliora la neutralità e la natura senza permessi di Ethereum. Inoltre, i trader in cerca di MEV non contribuiranno inavvertitamente alla centralizzazione utilizzando canali di transazione privati. ## Risorse correlate {#related-resources} -- [Documentazione dei Flashbot](https://docs.flashbots.net/) -- [Flashbots GitHub](https://github.com/flashbots/pm) -- [mevboost.org](https://www.mevboost.org/) - _Tracker con statistiche in tempo reale per relay e costruttori di blocchi di MEV Boost_ +- [Documentazione di Flashbots](https://docs.flashbots.net/) +- [GitHub di Flashbots](https://github.com/flashbots/pm) +- [mevboost.org](https://www.mevboost.org/) - _Tracker con statistiche in tempo reale per i relay e i costruttori di blocchi di MEV-Boost_ ## Letture consigliate {#further-reading} @@ -214,7 +215,7 @@ Alcuni progetti, come MEV Boost, utilizzano l'API Builder come parte di una stru - [Escaping the Dark Forest](https://samczsun.com/escaping-the-dark-forest/) - [Flashbots: Frontrunning the MEV Crisis](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) - [@bertcmiller's MEV Threads](https://twitter.com/bertcmiller/status/1402665992422047747) -- [MEV-Boost: architettura Flashbots pronta per la Fusione](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) -- [Che cos'è MEV Boost?](https://www.alchemy.com/overviews/mev-boost) -- [Perché eseguire mev-boost?](https://writings.flashbots.net/writings/why-run-mevboost/) -- [La guida per autostoppisti a Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) +- [MEV-Boost: Merge ready Flashbots Architecture](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) +- [What Is MEV Boost](https://www.alchemy.com/overviews/mev-boost) +- [Why run mev-boost?](https://writings.flashbots.net/writings/why-run-mevboost/) +- [The Hitchhikers Guide To Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/networking-layer/index.md b/public/content/translations/it/developers/docs/networking-layer/index.md index 95bf3c901df..68e72095450 100644 --- a/public/content/translations/it/developers/docs/networking-layer/index.md +++ b/public/content/translations/it/developers/docs/networking-layer/index.md @@ -5,151 +5,159 @@ lang: it sidebarDepth: 2 --- -Ethereum è una rete in peer-to-peer con migliaia di nodi che devono poter comunicare gli uni con gli altri, usando dei protocolli standardizzati. Il "livello di rete" è lo stack di protocolli che consentono a quei nodi di trovarsi reciprocamente e scambiare informazioni. Questo comprende l'attività di "gossip” di informazioni (comunicazione da uno a molti) sulla rete, oltre alle richieste di scambio e le risposte tra nodi specifici (comunicazione uno a uno). Ogni nodo deve aderire a specifiche regole di rete per essere certo di inviare e ricevere le informazioni corrette. +[Ethereum](/) è una rete peer-to-peer con migliaia di nodi che devono essere in grado di comunicare tra loro utilizzando protocolli standardizzati. Il "livello di rete" è lo stack di protocolli che consente a questi nodi di trovarsi a vicenda e scambiare informazioni. Ciò include il "gossiping" (pettegolezzo) di informazioni (comunicazione uno-a-molti) sulla rete, nonché lo scambio di richieste e risposte tra nodi specifici (comunicazione uno-a-uno). Ogni nodo deve aderire a regole di rete specifiche per garantire l'invio e la ricezione delle informazioni corrette. -Il software del client si compone di due parti (i client d'esecuzione e di consenso), ognuna con il proprio distinto stack di rete. Oltre a comunicare con altri nodi di Ethereum, i client d'esecuzione e di consenso devono comunicare tra loro. Questa pagina presenta una spiegazione introduttiva ai protocolli che consentono questa comunicazione. +Ci sono due parti nel software del client (client di esecuzione e client di consenso), ciascuna con il proprio stack di rete distinto. Oltre a comunicare con altri nodi di Ethereum, i client di esecuzione e di consenso devono comunicare tra loro. Questa pagina fornisce una spiegazione introduttiva dei protocolli che abilitano questa comunicazione. -I client d'esecuzione compiono gossip sulle transazioni sulla rete tra pari del livello d'esecuzione. Questo richiede la comunicazione crittografata tra i pari autenticati. Quando un validatore è selezionato per proporre un blocco, le transazioni dal pool di transazione locale del nodo saranno passate ai client del consenso tramite una connessione RPC locale, che sarà impacchettata in blocchi della Beacon. I client di consenso eseguiranno poi il gossip dei blocchi della Beacon Chain per la propria rete p2p. Questo richiede due reti p2p separate: una connessa ai client d'esecuzione per il gossip della transazione e una connessa ai client del consenso per il gossip del blocco. +I client di esecuzione diffondono (gossip) le transazioni sulla rete peer-to-peer del livello di esecuzione. Ciò richiede una comunicazione crittografata tra peer autenticati. Quando un validatore viene selezionato per proporre un blocco, le transazioni dal pool di transazioni locale del nodo verranno passate ai client di consenso tramite una connessione RPC locale, che verranno impacchettate in blocchi della Beacon chain. I client di consenso diffonderanno poi i blocchi della Beacon chain attraverso la loro rete p2p. Ciò richiede due reti p2p separate: una che collega i client di esecuzione per la diffusione delle transazioni e una che collega i client di consenso per la diffusione dei blocchi. ## Prerequisiti {#prerequisites} -Per comprendere questa pagina è utile avere alcune nozioni di [nodi e client](/developers/docs/nodes-and-clients/) di Ethereum. +Una certa conoscenza dei [nodi e client](/developers/docs/nodes-and-clients/) di Ethereum sarà utile per comprendere questa pagina. -## Il livello d'esecuzione {#execution-layer} +## Il livello di esecuzione {#execution-layer} -I protocolli di rete del livello d'esecuzione sono divisi in due stack: +I protocolli di rete del livello di esecuzione sono divisi in due stack: -- lo stack di scoperta: basato su UDP, consente a un nuovo nodo di trovare i peer a cui connettersi +- lo stack di scoperta (discovery): costruito su UDP e consente a un nuovo nodo di trovare peer a cui connettersi -- lo stack DevP2P: basato su TCP, consente ai nodi di scambiarsi informazioni +- lo stack DevP2P: si basa su TCP e consente ai nodi di scambiare informazioni -Entrambi gli stack operano in parallelo. Lo stack di scoperta alimenta la nuova rete di partecipanti alla rete e lo stack DevP2P ne consente le interazioni. +Entrambi gli stack funzionano in parallelo. Lo stack di scoperta inserisce nuovi partecipanti nella rete e lo stack DevP2P ne abilita le interazioni. -### Scoperta {#discovery} +### Scoperta (Discovery) {#discovery} -La scoperta è il processo con cui si trovano altri nodi nella rete. Questo processo è avviato usando una piccola serie di nodi d'avvio (nodi i cui indirizzi sono [codificati in modo fisso (hardcoded)](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) nel client, così che siano immediatamente trovabili e connettano il client ai peer). Questi nodi di avvio esistono solo per introdurre un nuovo nodo a una serie di peer, questo è il loro solo obiettivo, non partecipano alle normali attività del client, come la sincronizzazione della catena, e sono usati solo la primissima volta in cui il client è avviato. +La scoperta è il processo di individuazione di altri nodi nella rete. Questo viene avviato utilizzando un piccolo set di bootnode (nodi i cui indirizzi sono [hardcoded](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) nel client in modo che possano essere trovati immediatamente e connettere il client ai peer). Questi bootnode esistono solo per presentare un nuovo nodo a un set di peer: questo è il loro unico scopo, non partecipano alle normali attività del client come la sincronizzazione della catena e vengono utilizzati solo la primissima volta che un client viene avviato. -Il protocollo usato per le interazioni tra nodo e nodo d'avvio è una forma modificata di [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f), che usa una [tabella di hash distribuita](https://en.wikipedia.org/wiki/Distributed_hash_table) per condividere elenchi di nodi. Ogni nodo ha una versione di questa tabella, contenente le informazioni necessarie per connettersi ai propri peer più vicini. Questa “vicinanza” non è geografica: la distanza è definita dalla somiglianza dell'ID del nodo. Come funzionalità di sicurezza, ogni tabella del nodo è aggiornata regolarmente. Ad esempio, nel [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5), i nodi del protocollo di scoperta sono anche capaci di inviare “annunci” che indicano i protocolli secondari supportati dal client, consentendo ai peer di negoziare i protocolli che usano entrambi per comunicare. +Il protocollo utilizzato per le interazioni nodo-bootnode è una forma modificata di [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f) che utilizza una [tabella di hash distribuita](https://en.wikipedia.org/wiki/Distributed_hash_table) per condividere elenchi di nodi. Ogni nodo ha una versione di questa tabella contenente le informazioni necessarie per connettersi ai suoi peer più vicini. Questa "vicinanza" non è geografica: la distanza è definita dalla somiglianza dell'ID del nodo. La tabella di ogni nodo viene regolarmente aggiornata come funzione di sicurezza. Ad esempio, in [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5), i nodi del protocollo di scoperta sono anche in grado di inviare "annunci" che mostrano i sottocolli supportati dal client, consentendo ai peer di negoziare sui protocolli che entrambi possono utilizzare per comunicare. -La scoperta inizia con una partita di PING-PONG. Un PING-PONG di successo "lega" il nuovo nodo a un nodo d'avvio. Il messaggio iniziale che avvisa un nodo d'avvio dell'esistenza di un nuovo nodo che sta accedendo alla rete è un `PING`. Questo `PING` include le informazioni in hash sul nuovo nodo, il nodo d'avvio e una marca temporale di scadenza. Il nodo d'avvio riceve il PING e restituisce un `PONG` contenente l'hash del `PING`. Se gli hash del `PING` e del `PONG` corrispondono, allora la connessione tra il nuovo nodo e il nodo d'avvio è avvenuta e i due sono "legati". +La scoperta inizia con una partita a PING-PONG. Un PING-PONG riuscito "lega" (bond) il nuovo nodo a un bootnode. Il messaggio iniziale che avvisa un bootnode dell'esistenza di un nuovo nodo che entra nella rete è un `PING`. Questo `PING` include informazioni sottoposte a hash sul nuovo nodo, sul bootnode e su un timestamp di scadenza. Il bootnode riceve il `PING` e restituisce un `PONG` contenente l'hash del `PING`. Se gli hash di `PING` e `PONG` corrispondono, la connessione tra il nuovo nodo e il bootnode è verificata e si dice che si sono "legati". -Una volta legato, il nuovo nodo può inviare una richiesta `FIND-NEIGHBOURS` al nodo d'avvio. I dati restituiti dal nodo d'avvio includono un elenco di peer a cui il nuovo nodo può connettersi. Se i nodi non sono legati, la richiesta `FIND-NEIGHBOURS` non andrà a buon fine, quindi il nuovo nodo non potrà accedere alla rete. +Una volta legato, il nuovo nodo può inviare una richiesta `FIND-NEIGHBOURS` al bootnode. I dati restituiti dal bootnode includono un elenco di peer a cui il nuovo nodo può connettersi. Se i nodi non sono legati, la richiesta `FIND-NEIGHBOURS` fallirà, quindi il nuovo nodo non sarà in grado di entrare nella rete. -Una volta che il nodo riceve un elenco di vicini dal nodo d'avvio, inizia con ognuno di essi, uno scambio di PING-PONG. I PING-PONG riusciti legano il nuovo nodo ai suoi vicini, consentendo lo scambio di messaggi. +Una volta che il nuovo nodo riceve un elenco di vicini dal bootnode, inizia uno scambio di PING-PONG con ciascuno di essi. I PING-PONG riusciti legano il nuovo nodo ai suoi vicini, consentendo lo scambio di messaggi. ``` start client --> connect to bootnode --> bond to bootnode --> find neighbours --> bond to neighbours ``` -I client di esecuzione stanno attualmente utilizzando il protocollo di ricerca [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) e c'è uno sforzo attivo per migrare al protocollo [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5). +I client di esecuzione stanno attualmente utilizzando il protocollo di scoperta [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) ed è in corso uno sforzo attivo per migrare al protocollo [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5). -#### ENR: Ethereum Node Records {#enr} +#### ENR: Record dei Nodi di Ethereum {#enr} -L’[Ethereum Node Records (ENR)](/developers/docs/networking-layer/network-addresses/) è un oggetto contenente tre elementi fondamentali: una firma (hash dei contenuti del registro creato secondo qualche schema d'identità acconsentito), una sequenza numerica che monitora le modifiche al registro e un elenco arbitrario di coppie chiave-valore. Questo è un formato a prova di futuro che consente uno scambio più facile di informazioni identificative tra nuovi peer ed è preferibile rispetto al formato dell'[indirizzo di rete](/developers/docs/networking-layer/network-addresses) per i nodi di Ethereum. +L'[Ethereum Node Record (ENR)](/developers/docs/networking-layer/network-addresses/) è un oggetto che contiene tre elementi di base: una firma (hash dei contenuti del record creato in base a uno schema di identità concordato), un numero di sequenza che tiene traccia delle modifiche al record e un elenco arbitrario di coppie chiave:valore. Questo è un formato a prova di futuro che consente uno scambio più semplice di informazioni identificative tra nuovi peer ed è il formato di [indirizzo di rete](/developers/docs/networking-layer/network-addresses) preferito per i nodi di Ethereum. #### Perché la scoperta è basata su UDP? {#why-udp} -UDP non supporta le funzioni di controllo degli errori, reinvio di pacchetti non giunti a destinazione o apertura e chiusura dinamica delle connessioni, al contrario si limita a mandare un flusso continuo di informazioni a un destinatario, indipendentemente dal fatto che queste siano state correttamente ricevute. Questa funzionalità minima si traduce anche in overhead minimi, che rendono molto veloce questo tipo di connessione. Per la scoperta, in cui un nodo vuole solo comunicare la propria presenza per poter poi stabilire una connessione formale con un peer, UDP è sufficiente. Per il resto dello stack di rete, invece, UDP non è adatto. Lo scambio informativo tra nodi è abbastanza complesso e necessita dunque di un protocollo più completo di funzionalità, che possa supportare il reinvio, la verifica degli errori, etc. L’overhead aggiuntivo associato a TCP vale le maggiori funzionalità. Dunque, la maggioranza dello stack P2P opera su TCP. +UDP non supporta alcun controllo degli errori, il reinvio di pacchetti non riusciti o l'apertura e la chiusura dinamica delle connessioni: spara semplicemente un flusso continuo di informazioni verso un bersaglio, indipendentemente dal fatto che venga ricevuto con successo. Questa funzionalità minima si traduce anche in un overhead minimo, rendendo questo tipo di connessione molto veloce. Per la scoperta, in cui un nodo vuole semplicemente far conoscere la propria presenza per poi stabilire una connessione formale con un peer, UDP è sufficiente. Tuttavia, per il resto dello stack di rete, UDP non è adatto allo scopo. Lo scambio di informazioni tra i nodi è piuttosto complesso e necessita quindi di un protocollo più completo che possa supportare il reinvio, il controllo degli errori, ecc. L'overhead aggiuntivo associato a TCP vale la funzionalità aggiuntiva. Pertanto, la maggior parte dello stack P2P opera su TCP. ### DevP2P {#devp2p} -DevP2P è esso stesso un intero stack di protocolli che Ethereum implementa per stabilire e mantenere la rete tra peer-to-peer. Dopo che i nuovi nodi accedono alla rete, le loro interazioni sono governate dai protocolli nello stack [DevP2P](https://github.com/ethereum/devp2p). Questi si basano tutti su TCP e includono il protocollo di trasporto RLPx, il protocollo via cavo e diversi protocolli secondari. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) è il protocollo che governa iniziazione, autenticazione e manutenzione delle sessioni tra nodi. RLPx codifica i messaggi usando il RLP (Recursive Length Prefix), un metodo molto efficiente in termini di spazio che codifica i dati in una struttura minimale per l'invio tra nodi. +DevP2P è di per sé un intero stack di protocolli che Ethereum implementa per stabilire e mantenere la rete peer-to-peer. Dopo che i nuovi nodi entrano nella rete, le loro interazioni sono regolate dai protocolli nello stack [DevP2P](https://github.com/ethereum/devp2p). Questi si basano tutti su TCP e includono il protocollo di trasporto RLPx, il protocollo wire e diversi sottocolli. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) è il protocollo che regola l'avvio, l'autenticazione e il mantenimento delle sessioni tra i nodi. RLPx codifica i messaggi utilizzando RLP (Recursive Length Prefix), che è un metodo molto efficiente in termini di spazio per codificare i dati in una struttura minima per l'invio tra i nodi. -Una sessione di RLPx tra due nodi inizia con un "handshaking" crittografico iniziale, in cui il nodo invia un messaggio d'autenticazione, poi verificato dal peer. Se la verifica va a buon fine, il peer genera un messaggio di riconoscimento dell'autenticazione da restituire al nodo iniziatore. Si tratta di un processo di scambio di chiavi che consente ai nodi di comunicare privatamente e in sicurezza. Un "handshaking" crittografico andato a buon fine attiva poi entrambi i nodi spingendoli a inviare un messaggio "hello" all'altro "on the wire". Il protocollo via cavo è avviato da uno scambio di messaggi di saluto andato a buon fine. +Una sessione RLPx tra due nodi inizia con un handshake crittografico iniziale. Ciò comporta che il nodo invii un messaggio di autenticazione che viene poi verificato dal peer. In caso di verifica riuscita, il peer genera un messaggio di conferma dell'autenticazione da restituire al nodo iniziatore. Questo è un processo di scambio di chiavi che consente ai nodi di comunicare in modo privato e sicuro. Un handshake crittografico riuscito innesca quindi l'invio da parte di entrambi i nodi di un messaggio "hello" l'uno all'altro "on the wire" (sul cavo). Il protocollo wire viene avviato da uno scambio riuscito di messaggi hello. -Il messaggio di saluto contiene: +I messaggi hello contengono: - versione del protocollo - ID del client - porta - ID del nodo -- elenco di protocolli secondari supportati +- elenco dei sottocolli supportati -Queste sono le informazioni necessarie affinché l'interazione vada a buon fine, poiché definiscono quali capacità sono condivise tra entrambi i nodi e configurano la comunicazione. Esiste un processo di negoziazione secondario in cui vengono confrontati gli elenchi di protocolli secondari supportati da ogni nodo, potendo utilizzare nella sessione quelli comuni ad entrambi i nodi. +Queste sono le informazioni necessarie per un'interazione di successo perché definiscono quali capacità sono condivise tra entrambi i nodi e configurano la comunicazione. Esiste un processo di negoziazione dei sottocolli in cui gli elenchi dei sottocolli supportati da ciascun nodo vengono confrontati e quelli comuni a entrambi i nodi possono essere utilizzati nella sessione. -Insieme ai messaggi di saluto, il protocollo via cavo può anche inviare un messaggio "disconnect" che avvisa un peer che la connessione sarà chiusa. Il protocollo via cavo prevede anche messaggi PING e PONG, inviati periodicamente per mantenere aperta una sessione. Gli scambi dei protocolli RLPx e via cavo stabiliscono dunque le fondamenta della comunicazione tra i nodi, fornendo l'impalcatura per le informazioni utili da scambiare secondo un protocollo secondario specifico. +Insieme ai messaggi hello, il protocollo wire può anche inviare un messaggio di "disconnessione" che avvisa un peer che la connessione verrà chiusa. Il protocollo wire include anche messaggi PING e PONG che vengono inviati periodicamente per mantenere aperta una sessione. Gli scambi RLPx e del protocollo wire stabiliscono quindi le basi della comunicazione tra i nodi, fornendo l'impalcatura per lo scambio di informazioni utili in base a uno specifico sottocollo. -### Protocolli secondari {#sub-protocols} +### Sottocolli {#sub-protocols} -#### Protocollo via cavo {#wire-protocol} +#### Protocollo wire {#wire-protocol} -Una volta che i pari sono connessi e che una sessione RLPx è stata avviata, il protocollo via cavo definisce come comunicano i pari. Inizialmente, il protocollo via cavo definiva tre mansioni principali: la sincronizzazione della catena, la propagazione del blocco e lo scambio di transazioni. Tuttavia, una volta che Ethereum è passato al proof-of-stake, la propagazione dei blocchi e la sincronizzazione della catena sono divenuti parte del livello di consenso. Lo scambio di transazioni è ancora di competenza dei client d'esecuzione. Lo scambio di transazioni si riferisce allo scambio di transazioni in sospeso tra nodi in modo che i costruttori di blocchi possano selezionarne alcune per includerle nel blocco successivo. Le informazioni dettagliate su queste attività sono disponibili [qui](https://github.com/ethereum/devp2p/blob/master/caps/eth.md). I client che supportano questi protocolli secondari, li espongono tramite [JSON-RPC](/developers/docs/apis/json-rpc/). +Una volta che i peer sono connessi e una sessione RLPx è stata avviata, il protocollo wire definisce come comunicano i peer. Inizialmente, il protocollo wire definiva tre compiti principali: sincronizzazione della catena, propagazione dei blocchi e scambio di transazioni. Tuttavia, una volta che Ethereum è passato alla prova di stake, la propagazione dei blocchi e la sincronizzazione della catena sono diventate parte del livello di consenso. Lo scambio di transazioni è ancora di competenza dei client di esecuzione. Lo scambio di transazioni si riferisce allo scambio di transazioni in sospeso tra i nodi in modo che i costruttori di blocchi possano selezionarne alcune per l'inclusione nel blocco successivo. Informazioni dettagliate su questi compiti sono disponibili [qui](https://github.com/ethereum/devp2p/blob/master/caps/eth.md). I client che supportano questi sottocolli li espongono tramite la [JSON-RPC](/developers/docs/apis/json-rpc/). -#### les (light ethereum subprotocol) {#les} +#### les (sottocollo leggero di Ethereum) {#les} -Si tratta di un protocollo minimale per sincronizzare i client leggeri. Tradizionalmente, questo protocollo è stato raramente usato perché i nodi completi devono servire i dati ai client leggeri senza esser incentivati. Il comportamento predefinito dei client d'esecuzione prevede di non servire i dati al client leggero tramite les. Maggiori informazioni sono disponibili nelle [specifiche](https://github.com/ethereum/devp2p/blob/master/caps/les.md) di les. +Questo è un protocollo minimo per la sincronizzazione dei client leggeri. Tradizionalmente questo protocollo è stato usato raramente perché i nodi completi sono tenuti a servire dati ai client leggeri senza essere incentivati. Il comportamento predefinito dei client di esecuzione è di non servire i dati dei client leggeri tramite les. Maggiori informazioni sono disponibili nelle [specifiche](https://github.com/ethereum/devp2p/blob/master/caps/les.md) di les. #### Snap {#snap} -Il [protocollo snap](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) è un'estensione ottica che consente ai pari di scambiare istantanee degli stati recenti, consentendo ai pari di verificare i dati del conto e dell'archiviazione senza dover scaricare nodi intermedi dell'albero di Merkle. +Il [protocollo snap](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) è un'estensione opzionale che consente ai peer di scambiare istantanee degli stati recenti, permettendo ai peer di verificare i dati dell'account e di archiviazione senza dover scaricare i nodi intermedi del trie di Merkle. -#### Wit (witness protocol) {#wit} +#### Wit (protocollo witness) {#wit} -Il [witness protocol](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) è un'estensione facoltativa che consente lo scambio di testimoni di stato tra peer, aiutando a sincronizzare i client in cima alla catena. +Il [protocollo witness](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) è un'estensione opzionale che consente lo scambio di testimoni (witness) di stato tra i peer, aiutando a sincronizzare i client con la punta della catena. #### Whisper {#whisper} -Whisper era un protocollo che mirava a consegnare messaggistica sicura tra peer senza scrivere alcuna informazione nella blockchain. Faceva parte del protocollo via cavo DevP2P, ma è ora considerato obsoleto. Esistono altri [progetti correlati](https://wakunetwork.com/) con obiettivi simili. +Whisper era un protocollo che mirava a fornire messaggistica sicura tra i peer senza scrivere alcuna informazione sulla blockchain. Faceva parte del protocollo wire DevP2P ma ora è deprecato. Esistono altri [progetti correlati](https://wakunetwork.com/) con obiettivi simili. ## Il livello di consenso {#consensus-layer} -I client di consenso partecipano a una rete peer-to-peer distinta, con specifiche differenti. I client di consenso devono partecipare al gossip dei blocchi, in modo da poter ricevere nuovi blocchi dai peer e trasmetterli quando tocca a loro proporre dei blocchi. Analogamente al livello d'esecuzione, questo richiede innanzitutto un protocollo di scoperta, così che un nodo possa trovare dei peer e stabilire sessioni sicure per lo scambio di blocchi, attestazioni, etc. +I client di consenso partecipano a una rete peer-to-peer separata con una specifica diversa. I client di consenso devono partecipare alla diffusione dei blocchi in modo da poter ricevere nuovi blocchi dai peer e trasmetterli quando è il loro turno di essere il proponente del blocco. Similmente al livello di esecuzione, questo richiede prima un protocollo di scoperta in modo che un nodo possa trovare peer e stabilire sessioni sicure per lo scambio di blocchi, attestazioni, ecc. -### Scoperta {#consensus-discovery} +### Scoperta (Discovery) {#consensus-discovery} -Analogamente ai client d'esecuzione, i client di consenso usano [discv5](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) su UDP per trovare i peer. L'implementazione del livello di consenso di discv5 differisce da quella dei client d'esecuzione solo perché include un adattatore che connette discv5 a uno stack [libP2P](https://libp2p.io/), deprecando DevP2P. Le sessioni di RLPx del livello d'esecuzione sono deprecate in favore dell’"handshaking" protetto del canale Noise di libP2P. +Similmente ai client di esecuzione, i client di consenso utilizzano [discv5](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) su UDP per trovare i peer. L'implementazione del livello di consenso di discv5 differisce da quella dei client di esecuzione solo in quanto include un adattatore che collega discv5 a uno stack [libP2P](https://libp2p.io/), deprecando DevP2P. Le sessioni RLPx del livello di esecuzione sono deprecate a favore dell'handshake del canale sicuro noise di libP2P. ### ENR {#consensus-enr} -L'ENR dei nodi del consenso include la chiave pubblica del nodo, l'indirizzo IP, le porte UDP e TCP e due campi specifici per il consenso: il campo di bit della subnet d'attestazione e la chiave `eth2`. Il primo rende più semplice ai nodi trovare dei peer, partecipando a reti secondarie di gossip d'attestazione specifiche. La chiave `eth2` contiene le informazioni su quale versione della biforcazione di Ethereum il nodo sta usando, garantendo che i peer si connettano all'Ethereum giusto. +L'ENR per i nodi di consenso include la chiave pubblica del nodo, l'indirizzo IP, le porte UDP e TCP e due campi specifici del consenso: il campo di bit della sottorete di attestazione e la chiave `eth2`. Il primo rende più facile per i nodi trovare peer che partecipano a specifiche sottoreti di diffusione delle attestazioni. La chiave `eth2` contiene informazioni su quale versione della biforcazione (fork) di Ethereum sta utilizzando il nodo, assicurando che i peer si connettano all'Ethereum corretto. ### libP2P {#libp2p} -Lo stack libP2P supporta tutte le comunicazioni dopo la scoperta. I client possono chiamare e ascoltare su IPv4 e/o IPv6, come definito nel loro EVR. I protocolli sul livello di libP2P sono suddivisibili nei domini di gossip e di req/resp. +Lo stack libP2P supporta tutte le comunicazioni dopo la scoperta. I client possono comporre e ascoltare su IPv4 e/o IPv6 come definito nel loro ENR. I protocolli sul livello libP2P possono essere suddivisi nei domini gossip e req/resp (richiesta/risposta). ### Gossip {#gossip} -Il dominio di gossip include tutte le informazioni che devono essere diffuse rapidamente tramite la rete. Questo include i blocchi Beacon, le prove, le attestazioni, le uscite e i tagli (slashing). La trasmissione avviene tramite libP2P gossipsub v1 e si affida a vari metadati memorizzati localmente in ogni nodo, tra cui la dimensione massima dei carichi utili di gossip da ricevere e trasmettere. Le informazioni dettagliate sul dominio del gossip sono disponibili [qui](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub). +Il dominio gossip include tutte le informazioni che devono diffondersi rapidamente in tutta la rete. Questo include blocchi della beacon chain, prove, attestazioni, uscite e punizioni (slashings). Questo viene trasmesso utilizzando libP2P gossipsub v1 e si basa su vari metadati archiviati localmente in ciascun nodo, inclusa la dimensione massima dei payload di gossip da ricevere e trasmettere. Informazioni dettagliate sul dominio gossip sono disponibili [qui](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub). ### Richiesta-risposta {#request-response} -Il dominio di richiesta-risposta contiene i protocolli per i client che richiedono informazioni specifiche dai propri peer. Gli esempi includono la richiesta di blocchi Beacon specifici, corrispondenti a certi hash radice o entro un intervallo di slot. Le risposte sono sempre restituite come byte codificati SSZ con compressione Snappy. +Il dominio richiesta-risposta contiene protocolli per i client che richiedono informazioni specifiche ai loro peer. Gli esempi includono la richiesta di blocchi specifici della Beacon chain che corrispondono a determinati hash radice o all'interno di un intervallo di slot. Le risposte vengono sempre restituite come byte codificati SSZ compressi con snappy. ## Perché il client di consenso preferisce SSZ a RLP? {#ssz-vs-rlp} -SSZ sta per simple serialization (serializzazione semplice). Usa offset fissi che semplificano la decodifica di singole parti di un messaggio codificato senza dover decodificare l'intera struttura, funzione molto utile per il client di consenso, che può quindi estrarre efficientemente specifiche informazioni dai messaggi codificati. È anche progettato specificamente per integrarsi ai protocolli di Merkle, con i relativi guadagni in termini di efficienza per la Merkle-zzazione. Poiché tutti gli hash nel livello di consenso sono radici di Merkle, si ottiene un miglioramento complessivo significativo. SSZ garantisce anche rappresentazioni univoche dei valori. +SSZ sta per serializzazione semplice (simple serialization). Utilizza offset fissi che semplificano la decodifica di singole parti di un messaggio codificato senza dover decodificare l'intera struttura, il che è molto utile per il client di consenso in quanto può acquisire in modo efficiente parti specifiche di informazioni dai messaggi codificati. È inoltre progettato specificamente per integrarsi con i protocolli di Merkle, con i relativi guadagni di efficienza per la Merkleizzazione. Poiché tutti gli hash nel livello di consenso sono radici di Merkle, ciò si traduce in un miglioramento significativo. SSZ garantisce inoltre rappresentazioni univoche dei valori. -## Connettere i client d'esecuzione e di consenso {#connecting-clients} +## Connessione dei client di esecuzione e di consenso {#connecting-clients} -I client del consenso e d'esecuzione, operano in parallelo. Devono esser connessi, così che il client del consenso possa fornire istruzioni al client d'esecuzione e che il client d'esecuzione possa passare pacchetti di transazioni al client del consenso per includerli nei blocchi della Beacon. La comunicazione tra i due client è ottenibile usando una connessione RPC locale. Un'API nota come [“Engine-API”](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) definisce le istruzioni inviate tra i due client. Poiché entrambi i client risiedono dietro un'identità di rete singola, condividono un ENR (Registro del Nodo di Ethereum), contenente una chiave separata per ogni client (chiave eth1 e chiave eth2). +Sia i client di consenso che quelli di esecuzione funzionano in parallelo. Devono essere connessi in modo che il client di consenso possa fornire istruzioni al client di esecuzione e il client di esecuzione possa passare pacchetti di transazioni al client di consenso da includere nei blocchi della Beacon chain. La comunicazione tra i due client può essere ottenuta utilizzando una connessione RPC locale. Un'API nota come ['Engine-API'](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) definisce le istruzioni inviate tra i due client. Poiché entrambi i client si trovano dietro una singola identità di rete, condividono un ENR (Ethereum node record) che contiene una chiave separata per ciascun client (chiave eth1 e chiave eth2). -Un sommario del flusso di controllo è mostrato di seguito, con indicazione tra parentesi dello stack di rete rilevante. +Di seguito è mostrato un riepilogo del flusso di controllo, con il relativo stack di rete tra parentesi. -### Quando il client del consenso non è un produttore di blocchi: {#when-consensus-client-is-not-block-producer} +### Quando il client di consenso non è il produttore del blocco: {#when-consensus-client-is-not-block-producer} -- Il client di consenso riceve un blocco tramite il protocollo di gossip dei blocchi (consenso p2p) -- Il client di consenso convalida preventivamente il blocco, ovvero si assicura che provenga da un mittente valido con i metadati corretti -- Le transazioni nel blocco sono inviate al livello d'esecuzione come un payload d'esecuzione (connessione RPC locale) -- Il livello d'esecuzione esegue le transazioni e convalida lo stato nell'intestazione del blocco (ovvero verifica la corrispondenza degli hash) -- Il livello d'esecuzione ripassa i dati di convalida al livello di consenso, blocco ora considerato da convalidare (connessione RPC locale) -- Il livello di consenso aggiunge il blocco alla testa della propria blockchain e lo attesta, trasmettendo l'attestazione via rete (consenso p2p) +- Il client di consenso riceve un blocco tramite il protocollo di diffusione dei blocchi (p2p di consenso) +- Il client di consenso convalida preventivamente il blocco, ovvero si assicura che sia arrivato da un mittente valido con i metadati corretti +- Le transazioni nel blocco vengono inviate al livello di esecuzione come payload di esecuzione (connessione RPC locale) +- Il livello di esecuzione esegue le transazioni e convalida lo stato nell'intestazione del blocco (ovvero, controlla che gli hash corrispondano) +- Il livello di esecuzione passa i dati di convalida al livello di consenso, il blocco è ora considerato convalidato (connessione RPC locale) +- Il livello di consenso aggiunge il blocco alla testa della propria blockchain e lo attesta, trasmettendo l'attestazione sulla rete (p2p di consenso) -### Quando il client del consenso è un produttore di blocchi: {#when-consensus-client-is-block-producer} +### Quando il client di consenso è il produttore del blocco: {#when-consensus-client-is-block-producer} -- Il client di consenso riceve notifica che è il prossimo produttore di blocchi (consenso p2p) -- Il livello di consenso chiama il metodo `create block` nel client d'esecuzione (RPC locale) -- Il livello d'esecuzione accede al mempool delle transazioni, popolato dal protocollo di gossip della transazione (esecuzione p2p) -- Il client d'esecuzione impacchetta le transazioni in un blocco, esegue le transazioni e genera l'hash di un blocco -- Il client del consenso prende le transazioni e l'hash del blocco dal client d'esecuzione e li aggiunge al blocco della beacon (RPC locale) -- Il client di consenso trasmette il blocco al protocollo di gossip dei blocchi (consenso p2p) -- Gli altri client ricevono il blocco proposto tramite il protocollo di gossip dei blocchi e lo convalidano come descritto sopra (consenso p2p) +- Il client di consenso riceve l'avviso di essere il prossimo produttore del blocco (p2p di consenso) +- Il livello di consenso chiama il metodo `create block` nel client di esecuzione (RPC locale) +- Il livello di esecuzione accede alla mempool delle transazioni che è stata popolata dal protocollo di diffusione delle transazioni (p2p di esecuzione) +- Il client di esecuzione raggruppa le transazioni in un blocco, esegue le transazioni e genera un hash del blocco +- Il client di consenso preleva le transazioni e l'hash del blocco dal client di esecuzione e li aggiunge al blocco della beacon chain (RPC locale) +- Il client di consenso trasmette il blocco tramite il protocollo di diffusione dei blocchi (p2p di consenso) +- Gli altri client ricevono il blocco proposto tramite il protocollo di diffusione dei blocchi e lo convalidano come descritto sopra (p2p di consenso) -Una volta che il blocco è stato attestato da sufficienti validatori, è aggiunto alla testa della catena, giustificato e, infine, finalizzato. +Una volta che il blocco è stato attestato da un numero sufficiente di validatori, viene aggiunto alla testa della catena, giustificato e infine finalizzato. -![Diagramma del livello di rete del client di consenso di Ethereum](cons_client_net_layer.png) ![Diagramma del livello di rete del client di esecuzione di Ethereum](exe_client_net_layer.png) +![Diagramma del livello di rete del client di consenso di Ethereum](cons_client_net_layer.png) +![Diagramma del livello di rete del client di esecuzione di Ethereum](exe_client_net_layer.png) -Schematica del livello di rete per i client del consenso e d'esecuzione, da [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) +Schema del livello di rete per i client di consenso e di esecuzione, da [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) ## Letture consigliate {#further-reading} -[DevP2P](https://github.com/ethereum/devp2p) [LibP2p](https://github.com/libp2p/specs) [Specifiche di rete del livello di consenso](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure) [da kademlia a discv5](https://vac.dev/kademlia-to-discv5) [documentazione di kademlia](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) [intro al p2p di Ethereum](https://p2p.paris/en/talks/intro-ethereum-networking/) [rapporto eth1/eth2](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) [fusione e video dei dettagli del client di eth2](https://www.youtube.com/watch?v=zNIrIninMgg) +[DevP2P](https://github.com/ethereum/devp2p) +[LibP2p](https://github.com/libp2p/specs) +[Specifiche di rete del livello di consenso](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure) +[Da kademlia a discv5](https://vac.dev/kademlia-to-discv5) +[Documento su kademlia](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) +[Introduzione al p2p di Ethereum](https://p2p.paris/en/talks/intro-ethereum-networking/) +[Relazione eth1/eth2](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) +[Video sui dettagli del client eth2 e della fusione (merge)](https://www.youtube.com/watch?v=zNIrIninMgg) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/it/developers/docs/networking-layer/network-addresses/index.md index 383d5517281..eadef1870d1 100644 --- a/public/content/translations/it/developers/docs/networking-layer/network-addresses/index.md +++ b/public/content/translations/it/developers/docs/networking-layer/network-addresses/index.md @@ -5,15 +5,15 @@ lang: it sidebarDepth: 2 --- -Per connettersi ai peer i nodi di Ethereum devono identificarsi con alcune informazioni di base. Per assicurarsi che ogni potenziale peer possa interpretare queste informazioni, esse sono trasmesse in uno dei tre formati standardizzati che ogni nodo di Ethereum può comprendere: multiaddr, enode o Ethereum Node Records (ENR). Gli ENR sono lo standard corrente per gli indirizzi di rete di Ethereum. +I nodi di [Ethereum](/) devono identificarsi con alcune informazioni di base per connettersi ai peer. Per garantire che qualsiasi potenziale peer possa interpretare queste informazioni, vengono trasmesse in uno dei tre formati standardizzati che qualsiasi nodo di Ethereum può comprendere: multiaddr, enode o Ethereum Node Records (ENR). Gli ENR sono lo standard attuale per gli indirizzi di rete di Ethereum. ## Prerequisiti {#prerequisites} -Per comprendere questa pagina è necessaria qualche nozione del [livello di rete di Ethereum](/developers/docs/networking-layer/). +È necessaria una certa comprensione del [livello di rete](/developers/docs/networking-layer/) di Ethereum per comprendere questa pagina. ## Multiaddr {#multiaddr} -Il formato originale dell'indirizzo del nodo di Ethereum era “multiaddr” (abbreviazione per “multi-addresses”). Multiaddr è un formato universale progettato per le reti peer-to-peer. Gli indirizzi sono rappresentati come coppie chiave-valore, con chiavi e valori separati da una barra obliqua. Ad esempio, il multiaddr per un nodo con indirizzo IPv4 `192.168.22.27` in ascolto alla porta TCP `33000` si presenta così: +Il formato originale dell'indirizzo del nodo di Ethereum era il 'multiaddr' (abbreviazione di 'multi-addresses'). Multiaddr è un formato universale progettato per le reti peer-to-peer. Gli indirizzi sono rappresentati come coppie chiave-valore con chiavi e valori separati da una barra (slash). Ad esempio, il multiaddr per un nodo con indirizzo IPv4 `192.168.22.27` in ascolto sulla porta TCP `33000` si presenta così: `/ip4/192.168.22.27/tcp/33000` @@ -23,17 +23,17 @@ Per un nodo di Ethereum, il multiaddr contiene l'ID del nodo (un hash della sua ## Enode {#enode} -L’enode è un modo per identificare un nodo di Ethereum usando un formato come indirizzo URL. L'ID del nodo esadecimale è codificato nella porzione del nome utente dell'URL, separato dall'host con il simbolo @. Il nome dell'host può essere dato solo come indirizzo IP; non sono consentiti i nomi DNS. La porta nella sezione del nome del host è la porta d'ascolto TCP. Se le porte TCP e UDP (scoperta) sono differenti, la porta UDP è specificata come parametro di query "discport". +Un enode è un modo per identificare un nodo di Ethereum utilizzando un formato di indirizzo URL. L'ID esadecimale del nodo è codificato nella porzione dell'username dell'URL, separato dall'host tramite un segno @. L'hostname può essere fornito solo come indirizzo IP; i nomi DNS non sono consentiti. La porta nella sezione dell'hostname è la porta di ascolto TCP. Se le porte TCP e UDP (discovery) differiscono, la porta UDP viene specificata come parametro di query "discport". -Nel seguente esempio, l'URL del nodo descrive un nodo con indirizzo IP `10.3.58.6`, porta TCP `30303` e porta di scoperta UDP `30301`. +Nel seguente esempio, l'URL del nodo descrive un nodo con indirizzo IP `10.3.58.6`, porta TCP `30303` e porta di discovery UDP `30301`. `enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301` ## Ethereum Node Records (ENR) {#enr} -Ethereum Node Records (ENR) è un formato standardizzato per gli indirizzi di rete su Ethereum. Sostituisce i multiaddr e gli enode. Sono specialmente utili perché consentono un maggiore scambio di informazioni tra nodi. L'ENR contiene una firma, un numero di sequenza e campi che dettagliano lo schema d'identità usato per generare e convalidare le firme. L'ENR può anche essere popolato da dati arbitrari organizzati in coppie chiave-valore. Queste coppie chiave-valore contengono l'indirizzo IP del nodo e le informazioni sui sotto-protocolli che il nodo può usare. I client di consenso usano una [struttura ENR specifica](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure) per identificare i nodi di avvio e prevedono anche un campo `eth2` contenente le informazioni sulla biforcazione corrente di Ethereum e la subnet di gossip dell'attestazione (questa connette il nodo a una serie particolare di coppie le cui attestazioni sono aggregate tra loro). +Gli Ethereum Node Records (ENR) sono un formato standardizzato per gli indirizzi di rete su Ethereum. Sostituiscono i multiaddr e gli enode. Sono particolarmente utili perché consentono un maggiore scambio di informazioni tra i nodi. L'ENR contiene una firma, un numero di sequenza e campi che dettagliano lo schema di identità utilizzato per generare e convalidare le firme. L'ENR può anche essere popolato con dati arbitrari organizzati come coppie chiave-valore. Queste coppie chiave-valore contengono l'indirizzo IP del nodo e informazioni sui sotto-protocolli che il nodo è in grado di utilizzare. I client di consenso utilizzano una [struttura ENR specifica](https://github.com/ethereum/consensus-specs/blob/master/specs/phase0/p2p-interface.md#enr-structure) per identificare i nodi di avvio e includono anche un campo `eth2` contenente informazioni sull'attuale biforcazione di Ethereum e sulla sottorete di gossip dell'attestazione (questo connette il nodo a un particolare insieme di peer le cui attestazioni vengono aggregate insieme). ## Letture consigliate {#further-reading} -- [EIP-778: i registri dei nodi di Ethereum (Ethereum Node Records, ENR)](https://eips.ethereum.org/EIPS/eip-778) -- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) +- [EIP-778: Ethereum Node Records (ENR)](https://eips.ethereum.org/EIPS/eip-778) +- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/it/developers/docs/networking-layer/portal-network/index.md index 114400531ff..c00ac71d5d9 100644 --- a/public/content/translations/it/developers/docs/networking-layer/portal-network/index.md +++ b/public/content/translations/it/developers/docs/networking-layer/portal-network/index.md @@ -1,89 +1,89 @@ --- -title: La Rete Portal -description: Una panoramica della Rete Portal, una rete in fase di sviluppo progettata per supportare i client con risorse limitate. +title: La Portal Network +description: Una panoramica della Portal Network - una rete in fase di sviluppo progettata per supportare i client con poche risorse. lang: it --- -Ethereum è una rete composta da computer che eseguono il software client di Ethereum. Ciascuno di questi computer è chiamato "nodo". Il software client consente a un nodo di inviare e ricevere dati sulla rete Ethereum e verifica i dati in base alle regole del protocollo Ethereum. I nodi conservano molti dati storici nella loro memoria di archiviazione su disco e li aggiungono quando ricevono nuovi pacchetti di informazioni, noti come blocchi, da altri nodi della rete. Questo è necessario per verificare sempre che un nodo abbia informazioni coerenti con il resto della rete. Ciò significa che l'esecuzione di un nodo può richiedere molto spazio su disco. Alcune operazioni dei nodi possono richiedere anche molta RAM. +[Ethereum](/) è una rete composta da computer che eseguono il software del client di Ethereum. Ognuno di questi computer è chiamato "nodo". Il software del client consente a un nodo di inviare e ricevere dati sulla rete di Ethereum e verifica i dati in base alle regole del protocollo di Ethereum. I nodi conservano molti dati storici nella memoria del proprio disco e vi aggiungono dati quando ricevono nuovi pacchetti di informazioni, noti come blocchi, da altri nodi sulla rete. Ciò è necessario per verificare sempre che un nodo disponga di informazioni coerenti con il resto della rete. Questo significa che l'esecuzione di un nodo può richiedere molto spazio su disco. Anche alcune operazioni del nodo possono richiedere molta RAM. -Per ovviare al problema dell'archiviazione su disco, sono stati sviluppati nodi "leggeri" che richiedono informazioni ai nodi completi invece di memorizzare tutto da soli. Tuttavia, ciò significa che il nodo leggero non sta verificando in modo indipendente le informazioni e si sta invece fidando di un altro nodo. Ciò significa anche che i nodi completi devono svolgere del lavoro aggiuntivo per servire i nodi leggeri. +Per aggirare questo problema di archiviazione su disco, sono stati sviluppati nodi "leggeri" che richiedono informazioni ai nodi completi invece di archiviarle tutte da soli. Tuttavia, questo significa che il nodo leggero non verifica le informazioni in modo indipendente e si fida invece di un altro nodo. Significa anche che i nodi completi sono tenuti a farsi carico di lavoro extra per servire quei nodi leggeri. -La Rete Portal è un nuovo progetto di rete per Ethereum che mira a risolvere il problema della disponibilità dei dati per i nodi "leggeri" senza dover fare affidamento o sottoporre a ulteriori sforzi i nodi completi, condividendo i dati necessari in piccole porzioni attraverso la rete. +La Portal Network è un nuovo design di rete per Ethereum che mira a risolvere il problema della disponibilità dei dati per i nodi "leggeri" senza dover fare affidamento o mettere a dura prova i nodi completi, condividendo i dati necessari in piccoli frammenti attraverso la rete. Maggiori informazioni su [nodi e client](/developers/docs/nodes-and-clients/) -## Perché abbiamo bisogno della Rete Portal {#why-do-we-need-portal-network} +## Perché abbiamo bisogno della Portal Network {#why-do-we-need-portal-network} -I nodi di Ethereum memorizzano la propria copia completa o parziale della blockchain di Ethereum. Questa copia locale viene utilizzata per convalidare le transazioni e garantire che il nodo stia seguendo la catena corretta. Questi dati memorizzati localmente consentono ai nodi di verificare in modo indipendente che i dati in arrivo siano validi e corretti, senza doversi fidare di altre entità. +I nodi di Ethereum archiviano la propria copia completa o parziale della blockchain di Ethereum. Questa copia locale viene utilizzata per convalidare le transazioni e garantire che il nodo stia seguendo la catena corretta. Questi dati archiviati localmente consentono ai nodi di verificare in modo indipendente che i dati in entrata siano validi e corretti senza dover fare affidamento su nessun'altra entità. -Questa copia locale della blockchain e dei dati di stato e di ricezione associati occupa molto spazio sul disco rigido del nodo. Ad esempio, si consiglia un disco rigido da 2 TB per l'esecuzione di un nodo che utilizza [Geth](https://geth.ethereum.org) accoppiato a un client di consenso. Utilizzando la sincronizzazione snap, che memorizza solo i dati della catena da un insieme relativamente recente di blocchi, Geth occupa tipicamente circa 650 GB di spazio su disco, ma cresce di circa 14 GB a settimana (è possibile ridurre nuovamente il nodo a 650 GB periodicamente). +Questa copia locale della blockchain e i dati associati allo stato e alle ricevute occupano molto spazio sul disco rigido del nodo. Ad esempio, si consiglia un disco rigido da 2 TB per eseguire un nodo utilizzando [Geth](https://geth.ethereum.org) associato a un client di consenso. Utilizzando la sincronizzazione snap, che archivia solo i dati della catena da un insieme di blocchi relativamente recente, Geth occupa in genere circa 650 GB di spazio su disco, ma cresce di circa 14 GB a settimana (è possibile sfoltire periodicamente il nodo per riportarlo a 650 GB). -Ciò significa che la gestione dei nodi può essere costosa, perché una grande quantità di spazio su disco deve essere dedicata a Ethereum. Ci sono diverse soluzioni a questo problema nella tabella di marcia di Ethereum, tra cui la [scadenza dello storico](/roadmap/statelessness/#history-expiry), la [scadenza dello stato](/roadmap/statelessness/#state-expiry) e l'[assenza di stato](/roadmap/statelessness/). Tuttavia, è probabile che passino diversi anni prima che queste misure vengano implementate. Esistono anche [nodi leggeri](/developers/docs/nodes-and-clients/light-clients/) che non salvano la propria copia dei dati della catena, ma richiedono i dati di cui hanno bisogno ai nodi completi. Tuttavia, ciò significa che i nodi leggeri devono fidarsi del fatto che i nodi completi forniscano dati onesti e inoltre aumenta il carico di lavoro per i nodi completi, che devono fornire ai nodi leggeri i dati di cui hanno bisogno. +Ciò significa che l'esecuzione dei nodi può essere costosa, perché una grande quantità di spazio su disco deve essere dedicata a Ethereum. Ci sono diverse soluzioni a questo problema nel piano d'azione di Ethereum, tra cui la [scadenza della cronologia](/roadmap/statelessness/#history-expiry), la [scadenza dello stato](/roadmap/statelessness/#state-expiry) e l'[assenza di stato](/roadmap/statelessness/). Tuttavia, è probabile che manchino ancora diversi anni alla loro implementazione. Ci sono anche [nodi leggeri](/developers/docs/nodes-and-clients/light-clients/) che non salvano la propria copia dei dati della catena, ma richiedono i dati di cui hanno bisogno ai nodi completi. Tuttavia, questo significa che i nodi leggeri devono fidarsi dei nodi completi affinché forniscano dati onesti e inoltre stressa i nodi completi che devono servire i dati di cui i nodi leggeri hanno bisogno. -La Rete Portal mira a fornire un modo alternativo per i nodi leggeri di ottenere i loro dati che non richieda il fare affidamento sui nodi completi o l'aumento significativo del carico di lavoro di questi ultimi. Il modo in cui ciò avverrà consiste nell'introdurre un nuovo modo per i nodi di Ethereum di condividere i dati attraverso la rete. +La Portal Network mira a fornire un modo alternativo per i nodi leggeri di ottenere i propri dati che non richieda di fidarsi o di aggiungere in modo significativo al lavoro che deve essere svolto dai nodi completi. Il modo in cui ciò verrà fatto è introdurre un nuovo modo per i nodi di Ethereum di condividere i dati attraverso la rete. -## Come funziona la Rete Portal? {#how-does-portal-network-work} +## Come funziona la Portal Network? {#how-does-portal-network-work} -I nodi di Ethereum hanno protocolli rigorosi che definiscono come devono comunicare tra loro. I client di esecuzione comunicano utilizzando un insieme di sottoprotocolli noti come [DevP2P](/developers/docs/networking-layer/#devp2p), mentre i nodi di consenso utilizzano uno stack di sottoprotocolli differente chiamato [libP2P](/developers/docs/networking-layer/#libp2p). Questi definiscono i tipi di dati che possono essere trasferiti tra i nodi. +I nodi di Ethereum hanno protocolli rigorosi che definiscono come comunicano tra loro. I client di esecuzione comunicano utilizzando un insieme di sottoprotocolli noti come [DevP2P](/developers/docs/networking-layer/#devp2p), mentre i client di consenso utilizzano uno stack diverso di sottoprotocolli chiamato [libP2P](/developers/docs/networking-layer/#libp2p). Questi definiscono i tipi di dati che possono essere passati tra i nodi. -![devP2P and libP2P](portal-network-devp2p-libp2p.png) +![devP2P e libP2P](portal-network-devp2p-libp2p.png) -I nodi possono anche offrire dati specifici attraverso l'[API JSON-RPC](/developers/docs/apis/json-rpc/), che è la modalità utilizzata dalle applicazioni e dai portafogli per scambiare le informazioni con i nodi di Ethereum. Tuttavia, nessuno di questi protocolli è ideale per offrire dati ai client leggeri. +I nodi possono anche servire dati specifici tramite l'[API JSON-RPC](/developers/docs/apis/json-rpc/), che è il modo in cui le app e i portafogli scambiano informazioni con i nodi di Ethereum. Tuttavia, nessuno di questi è un protocollo ideale per servire dati ai client leggeri. -Attualmente i client leggeri non possono richiedere specifici pezzi di dati della catena tramite DevP2P o libP2p perché questi protocolli sono progettati solo per abilitare la sincronizzazione della catena, il gossip dei blocchi e le transazioni. I client leggeri non vogliono scaricare questa informazione perché questo impedirebbe loro di essere "leggeri". +Attualmente i client leggeri non possono richiedere parti specifiche di dati della catena tramite DevP2P o libP2p perché tali protocolli sono progettati solo per consentire la sincronizzazione della catena e il gossip di blocchi e transazioni. I client leggeri non vogliono scaricare queste informazioni perché ciò impedirebbe loro di essere "leggeri". -Nemmeno l'API JSON-RPC è la scelta ideale per le richieste dei dati da parte del client leggero, perché si basa su una connessione ad uno specifico nodo completo o ad un fornitore RPC centralizzato in grado di offrire i dati. Questo significa che il nodo leggero deve fidarsi dell'onestà dello specifico nodo/fornitore, e che il nodo completo potrebbe dover gestire molte richieste da molti client leggeri, aumentando i suoi requisiti di larghezza di banda. +Anche l'API JSON-RPC non è una scelta ideale per le richieste di dati dei client leggeri, perché si basa su una connessione a un nodo completo specifico o a un fornitore RPC centralizzato che può servire i dati. Ciò significa che il client leggero deve fidarsi che quel nodo/fornitore specifico sia onesto, e inoltre il nodo completo potrebbe dover gestire molte richieste da molti client leggeri, aumentando i propri requisiti di larghezza di banda. -L'obiettivo della Rete Portal è di ripensare l'intera progettazione, costruendola specificatamente per la leggerezza, fuori dai vincoli di progettazione dei client di Ethereum esistenti. +Lo scopo della Portal Network è ripensare l'intero design, costruendo specificamente per la leggerezza, al di fuori dei vincoli di progettazione dei client di Ethereum esistenti. -L'idea di base della Rete Portal è quella di prendere il meglio dell'attuale stack di rete consentendo di fornire le informazioni necessarie ai client leggeri, come i dati storici e l'identità dell'attuale testa della catena, attraverso una rete decentralizzata peer-to-peer leggera in stile DevP2P che utilizza un [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (simile a Bittorrent). +L'idea centrale della Portal Network è prendere le parti migliori dell'attuale stack di rete consentendo alle informazioni necessarie ai client leggeri, come i dati storici e l'identità dell'attuale testa della catena, di essere servite attraverso una rete decentralizzata peer-to-peer leggera in stile DevP2P utilizzando una [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (simile a Bittorrent). -L'idea è di aggiungere a ogni nodo piccole parti dei dati storici totali di Ethereum e alcune responsabilità specifiche per ciascun nodo. Quindi, le richieste vengono soddisfatte cercando i nodi che memorizzano i dati specifici richiesti e recuperandoli da essi. +L'idea è di aggiungere piccole parti dei dati storici totali di Ethereum e alcune responsabilità specifiche del nodo a ciascun nodo. Quindi, le richieste vengono servite cercando i nodi che archiviano i dati specifici richiesti e recuperandoli da essi. -In questo modo si inverte il modello normale in cui i nodi leggeri trovano un singolo nodo e gli chiedono di filtrare e servire grandi volumi di dati; invece, essi filtrano rapidamente una grande rete di nodi che gestiscono ciascuno piccole quantità di dati. +Questo inverte il normale modello dei nodi leggeri che trovano un singolo nodo e gli richiedono di filtrare e servire grandi volumi di dati; invece, filtrano rapidamente una grande rete di nodi che gestiscono ciascuno piccole quantità di dati. -L'obiettivo è quello di consentire a una rete decentralizzata di client Portal leggeri di: +L'obiettivo è consentire a una rete decentralizzata di client Portal leggeri di: -- tracciare della testa della catena +- tracciare la testa della catena - sincronizzare i dati recenti e storici della catena -- recuperare i dati dello stato +- recuperare i dati di stato - trasmettere le transazioni -- eseguire le transazioni utilizzando l'[EVM](/developers/docs/evm/) +- eseguire le transazioni utilizzando la [EVM](/developers/docs/evm/) -I vantaggi di questa progettazione della rete sono: +I vantaggi di questo design di rete sono: -- Ridurre la dipendenza da fornitori centralizzati -- Ridurre l'utilizzo della larghezza di banda di Internet -- Sincronizzazione ridotta o nulla -- Accessibile a dispositivi con risorse limitate (\<1 GB di RAM, \<100 MB di spazio su disco, 1 CPU) +- ridurre la dipendenza dai fornitori centralizzati +- ridurre l'utilizzo della larghezza di banda di Internet +- sincronizzazione ridotta al minimo o nulla +- accessibile a dispositivi con risorse limitate (\<1 GB di RAM, \<100 MB di spazio su disco, 1 CPU) -Il diagramma seguente mostra le funzioni dei client esistenti che possono essere fornite dalla Rete Portal, consentendo agli utenti di accedere a tali funzioni su dispositivi con risorse molto limitate. +La tabella seguente mostra le funzioni dei client esistenti che possono essere fornite dalla Portal Network, consentendo agli utenti di accedere a queste funzioni su dispositivi con risorse molto limitate. ### Le Reti Portal -| Client leggero della Beacon | Rete dello stato | Gossip della transazione | Rete dello storico | -| --------------------------- | ----------------------------------- | ------------------------ | ------------------ | -| Beacon chain leggera | Conto e archiviazione del contratto | Mempool leggero | Intestazioni | -| Dati del protocollo | | | Corpi del blocco | -| | | | Ricevute | +| Client leggero Beacon | Rete di stato | Gossip delle transazioni | Rete storica | +| ------------------- | ---------------------------- | ------------------- | --------------- | +| Beacon chain leggera | Archiviazione di account e contratti | Mempool leggera | Intestazioni | +| Dati del protocollo | | | Corpi dei blocchi | +| | | | Ricevute | ## Diversità dei client per impostazione predefinita {#client-diversity-as-default} -Nella loro progettazione, gli sviluppatori della Rete Portal hanno deciso di creare anche tre diversi client della Rete Portal fin dal primo giorno. +Gli sviluppatori della Portal Network hanno anche fatto la scelta progettuale di costruire quattro client separati per la Portal Network fin dal primo giorno. -I client della Rete Portal sono: +I client della Portal Network sono: - [Trin](https://github.com/ethereum/trin): scritto in Rust -- [Fluffy](https://nimbus.team/docs/fluffy.html): scritto in Nim +- [Fluffy](https://fluffy.guide): scritto in Nim - [Ultralight](https://github.com/ethereumjs/ultralight): scritto in Typescript -- [Shisui](https://github.com/optimism-java/shisui): scritto in Go +- [Shisui](https://github.com/zen-eth/shisui): scritto in Go -La presenza di più implementazioni client indipendenti aumenta la resilienza e la decentralizzazione della rete Ethereum. +Avere più implementazioni di client indipendenti migliora la resilienza e la decentralizzazione della rete di Ethereum. -Se un client presenta problemi o vulnerabilità, gli altri client possono continuare a funzionare senza problemi, evitando un punto di errore singolo. Inoltre, le diverse implementazioni dei clienti favoriscono l'innovazione e la concorrenza, promuovendo miglioramenti e riducendo il rischio di monopolio all'interno dell'ecosistema. +Se un client riscontra problemi o vulnerabilità, gli altri client possono continuare a funzionare senza problemi, prevenendo un singolo punto di guasto. Inoltre, le diverse implementazioni dei client favoriscono l'innovazione e la concorrenza, guidando i miglioramenti e riducendo il rischio di monocoltura all'interno dell'ecosistema. -## Letture consigliate {#futher-reading} +## Letture consigliate {#further-reading} -- [La Rete Portal (Piper Merriam al Devcon di Bogotà)](https://www.youtube.com/watch?v=0stc9jnQLXA). -- [Discord della Rete Portal](https://discord.gg/CFFnmE7Hbs) -- [Sito web della Rete Portal](https://www.ethportal.net/) +- [La Portal Network (Piper Merriam alla Devcon Bogotà)](https://www.youtube.com/watch?v=0stc9jnQLXA). +- [Il Discord della Portal Network](https://discord.gg/CFFnmE7Hbs) +- [Il sito web della Portal Network](https://www.ethportal.net/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/networks/index.md b/public/content/translations/it/developers/docs/networks/index.md index 08b89ae21e4..f1ba99a2cf0 100644 --- a/public/content/translations/it/developers/docs/networks/index.md +++ b/public/content/translations/it/developers/docs/networks/index.md @@ -1,141 +1,216 @@ --- title: Reti -description: Panoramica delle reti Ethereum e indicazioni su dove ottenere ether (ETH) per le reti di prova per testare le applicazioni. +description: Una panoramica delle reti di Ethereum e dove ottenere ether (ETH) della rete di test per testare la tua applicazione. lang: it --- -Le reti di Ethereum sono gruppi di computer interconnessi che comunicano usando il protocollo di Ethereum. Esiste solo una Rete Principale di Ethereum, ma possono essere create delle reti indipendenti conformi alle stesse regole di protocollo per scopi di test e sviluppo. Esistono molte "reti" indipendenti conformi al protocollo che non interagiscono tra loro. Puoi perfino avviare una rete localmente sul tuo computer per testare i tuoi contratti intelligenti e le tue applicazioni web3. +Le reti di [Ethereum](/) sono gruppi di computer connessi che comunicano utilizzando il protocollo di Ethereum. Esiste una sola rete principale (Mainnet) di Ethereum, ma possono essere create reti indipendenti conformi alle stesse regole del protocollo per scopi di test e sviluppo. Esistono molte "reti" indipendenti che si conformano al protocollo senza interagire tra loro. Puoi persino avviarne una localmente sul tuo computer per testare i tuoi contratti intelligenti e le tue app web3. -Il tuo conto di Ethereum opererà su reti diverse, ma il saldo del tuo conto e lo storico delle transazioni non saranno riportati dalla Rete Principale di Ethereum. Per utilizzi di prova è utile sapere quali reti sono disponibili e come ottenere ETH per le reti di prova per poter sperimentare. In generale, per considerazioni di sicurezza, è sconsigliato riutilizzare i conti della rete principale sulle reti di prova e viceversa. +Il tuo account di Ethereum funzionerà su diverse reti, ma il saldo del tuo account e la cronologia delle transazioni non verranno trasferiti dalla rete principale di Ethereum. A scopo di test, è utile sapere quali reti sono disponibili e come ottenere ETH della rete di test per fare delle prove. In generale, per motivi di sicurezza, non è consigliato riutilizzare gli account della rete principale sulle reti di test o viceversa. ## Prerequisiti {#prerequisites} -È consigliabile conoscere [le basi di Ethereum](/developers/docs/intro-to-ethereum/) prima di informarsi sulle diverse reti. Le reti di prova rappresentano una versione semplificata e sicura di Ethereum nella quale è possibile sperimentare. +Dovresti comprendere le [basi di Ethereum](/developers/docs/intro-to-ethereum/) prima di informarti sulle diverse reti, poiché le reti di test ti forniranno una versione economica e sicura di Ethereum con cui fare delle prove. ## Reti pubbliche {#public-networks} -Le reti pubbliche sono accessibili da chiunque nel mondo abbia una connessione internet. Chiunque può leggere o creare transazioni su una blockchain pubblica e convalidare le transazioni che vengono eseguite. Il consenso tra peer decide sull'inclusione delle transazioni e lo stato della rete. +Le reti pubbliche sono accessibili a chiunque nel mondo disponga di una connessione internet. Chiunque può leggere o creare transazioni su una blockchain pubblica e validare le transazioni in esecuzione. Il consenso tra i pari decide sull'inclusione delle transazioni e sullo stato della rete. ### Rete principale di Ethereum {#ethereum-mainnet} -La rete principale è la blockchain di produzione Ethereum pubblica primaria, dove le transazioni con valore reale vengono eseguite sul libro mastro distribuito. +La rete principale è la blockchain di produzione pubblica primaria di Ethereum, dove avvengono transazioni di valore reale sul registro distribuito. -Quando le persone e le piattaforme centralizzate parlano dei prezzi di ETH, essi parlano di ETH della rete principale. +Quando le persone e gli exchange discutono dei prezzi dell'ETH, parlano dell'ETH della rete principale. -### Reti di prova di Ethereum {#ethereum-testnets} +### Reti di test di Ethereum {#ethereum-testnets} -Oltre alla rete principale, sono disponibili reti di prova pubbliche. Queste, sono reti usate dagli sviluppatori di protocolli o contratti intelligenti per testare sia gli aggiornamenti del protocollo che i potenziali contratti intelligenti, in un ambiente simile a quello di produzione prima della distribuzione alla Rete Principale. In pratica, è analogo ad ambiente di produzione rispetto a server di staging. +Oltre alla rete principale, esistono reti di test pubbliche. Queste sono reti utilizzate dagli sviluppatori del protocollo o dagli sviluppatori di contratti intelligenti per testare sia gli aggiornamenti del protocollo sia i potenziali contratti intelligenti in un ambiente simile a quello di produzione prima della distribuzione sulla rete principale. Pensalo come un analogo dei server di produzione rispetto a quelli di staging. -Dovresti testare il codice di ogni contratto che scrivi su una rete di prova prima di distribuirlo alla rete principale. Tra le dApp che si integrano con contratti intelligenti esistenti, gran parte dei progetti hanno copie distribuite alle reti di prova. +Dovresti testare qualsiasi codice di contratto che scrivi su una rete di test prima di distribuirlo sulla rete principale. Tra le dApp che si integrano con i contratti intelligenti esistenti, la maggior parte dei progetti ha copie distribuite sulle reti di test. -La maggior parte delle reti di prova è partita utilizzando un meccanismo di consenso proof-of-authority autorizzato. Significa che viene scelto un ristretto numero di nodi per convalidare le transazioni e creare nuovi blocchi, e questi fanno staking con la propria identità in questo processo. In alternativa, alcune reti di prova presentano un meccanismo di consenso proof-of-stake aperto, in cui tutti possono fare prove di esecuzione di un validatore, proprio come sulla Rete Principale di Ethereum. +La maggior parte delle reti di test è iniziata utilizzando un meccanismo di consenso proof-of-authority autorizzato. Ciò significa che un piccolo numero di nodi viene scelto per validare le transazioni e creare nuovi blocchi, mettendo in staking la propria identità nel processo. In alternativa, alcune reti di test presentano un meccanismo di consenso di prova di stake aperto in cui tutti possono testare l'esecuzione di un validatore, proprio come nella rete principale di Ethereum. -Si presuppone che gli ETH sulla rete di prova non abbiano valore; tuttavia sono stati creati dei mercati per alcuni tipi di ETH su rete di prova che sono divenuti scarsi o difficili da ottenere. Poiché per interagire su Ethereum (anche sulle reti di prova) hai bisogno di ETH, la maggior parte delle persone prende gli ETH gratuitamente dai faucet. La maggior parte dei faucet sono webapp dove è possibile inserire un indirizzo al quale verranno inviati gli ETH. +Si suppone che l'ETH sulle reti di test non abbia alcun valore reale; tuttavia, sono stati creati mercati per alcuni tipi di ETH della rete di test che sono diventati scarsi o difficili da ottenere. Poiché hai bisogno di ETH per interagire effettivamente con Ethereum (anche sulle reti di test), la maggior parte delle persone ottiene gratuitamente ETH della rete di test dai rubinetti. La maggior parte dei rubinetti sono app web in cui puoi inserire un indirizzo a cui richiedere l'invio di ETH. -#### Quale rete di prova dovrei usare? +#### Quale rete di test dovrei usare? -Le due reti di prova pubbliche che gli sviluppatori di client stanno mantenendo al momento sono Sepolia e Hoodi. Sepolia è una rete per gli sviluppatori di contratti e applicazioni per testare le proprie applicazioni. La rete Hoodi consente agli sviluppatori di protocolli di testare gli aggiornamenti della rete e agli staker di fare prove di esecuzione dei validatori. +Le due reti di test pubbliche che gli sviluppatori di client stanno attualmente mantenendo sono Sepolia e Hoodi. Sepolia è una rete per gli sviluppatori di contratti e applicazioni per testare le loro applicazioni. La rete Hoodi consente agli sviluppatori del protocollo di testare gli aggiornamenti della rete e agli staker di testare l'esecuzione dei validatori. #### Sepolia {#sepolia} -**Sepolia è la rete di prova predefinita consigliata per lo sviluppo di applicazioni**. La rete Sepolia utilizza una serie di validatori autorizzata. È abbastanza nuova, il che significa che sia il suo stato che la sua storia sono molto ridotti. Ciò significa che la rete è rapida da sincronizzare e che eseguire un nodo su di essa richiede una minore quantità d'archiviazione. Ciò è utile per gli utenti che desiderano avviare rapidamente un nodo e interagire direttamente con la rete. - -- Serie di validatori chiusa, controllata dai team del client e di test -- Nuova rete di prova, meno applicazioni distribuite rispetto ad altre reti di prova -- Veloce da sincronizzare e l'esecuzione di un nodo richiede uno spazio minimo su disco +**Sepolia è la rete di test predefinita consigliata per lo sviluppo di applicazioni**. La rete Sepolia utilizza un set di validatori autorizzato controllato dai team di client e di test. ##### Risorse -- [Sito Web](https://sepolia.dev/) +- [Sito web](https://sepolia.dev/) - [GitHub](https://github.com/eth-clients/sepolia) - [Otterscan](https://sepolia.otterscan.io/) - [Etherscan](https://sepolia.etherscan.io) - [Blockscout](https://eth-sepolia.blockscout.com/) -##### Faucet +##### Rubinetti -- [Faucet Sepolia QuickNode](https://faucet.quicknode.com/drip) +- [Rubinetto Sepolia di Alchemy](https://www.alchemy.com/faucets/ethereum-sepolia) +- [Rubinetto Sepolia di Chain Platform](https://faucet.chainplatform.co/faucets/ethereum-sepolia/) +- [Rubinetto Sepolia di Chainstack](https://faucet.chainstack.com/sepolia-testnet-faucet) +- [Rubinetto dell'Ecosistema Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [Rubinetto Sepolia di ethfaucet.com](https://ethfaucet.com/networks/ethereum) +- [Rubinetto Sepolia Web3 di Google Cloud](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) - [Grabteeth](https://grabteeth.xyz/) -- [Faucet PoW](https://sepolia-faucet.pk910.de/) -- [Faucet Coinbase Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) -- [Faucet Alchemy Sepolia](https://sepoliafaucet.com/) -- [Faucet Infura Sepolia](https://www.infura.io/faucet) -- [Faucet Chainstack Sepolia](https://faucet.chainstack.com/sepolia-testnet-faucet) -- [Faucet dell'ecosistema di Ethereum](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [Rubinetto Sepolia di Infura](https://www.infura.io/faucet) +- [Rubinetto PoW](https://sepolia-faucet.pk910.de/) +- [Rubinetto Sepolia di QuickNode](https://faucet.quicknode.com/ethereum/sepolia) #### Hoodi {#hoodi} -Hoodi è una rete di prova per testare la convalida e lo staking. La rete Hoodi è aperta per gli utenti che vogliono eseguire un validatore della rete di prova. Gli staker che desiderano testare gli aggiornamenti del protocollo prima che siano distribuiti sulla rete principale dovrebbero quindi utilizzare Hoodi. +Hoodi è una rete di test per testare la validazione e lo staking. La rete Hoodi è aperta agli utenti che desiderano eseguire un validatore della rete di test. Gli staker che desiderano testare gli aggiornamenti del protocollo prima che vengano distribuiti sulla rete principale dovrebbero quindi utilizzare Hoodi. -- Insieme di validatori aperto, gli staker possono testare gli aggiornamenti di rete -- Grandi dimensioni di stato, utile per testare complesse interazioni tra contratti intelligenti -- Più tempo per la sincronizzazione e richiede maggiore archiviazione per eseguire un nodo +- Set di validatori aperto, gli staker possono testare gli aggiornamenti della rete +- Stato di grandi dimensioni, utile per testare interazioni complesse di contratti intelligenti +- Più lungo da sincronizzare e richiede più spazio di archiviazione per eseguire un nodo ##### Risorse - [Sito web](https://hoodi.ethpandaops.io/) - [GitHub](https://github.com/eth-clients/hoodi) -- [Explorer](https://explorer.hoodi.ethpandaops.io/) -- [Checkpoint Sync](https://checkpoint-sync.hoodi.ethpandaops.io/) +- [Esploratore](https://explorer.hoodi.ethpandaops.io/) +- [Sincronizzazione Checkpoint](https://checkpoint-sync.hoodi.ethpandaops.io/) +- [Otterscan](https://hoodi.otterscan.io/) +- [Etherscan](https://hoodi.etherscan.io/) + +##### Rubinetti + +- [Rubinetto Hoodi di Chain Platform](https://faucet.chainplatform.co/faucets/ethereum-hoodi/) +- [Rubinetto Hoodi](https://hoodi.ethpandaops.io/) +- [Rubinetto PoW](https://hoodi-faucet.pk910.de/) + +#### Ephemery {#ephemery} + +Ephemery è un tipo unico di rete di test che si ripristina completamente ogni mese. Lo stato di esecuzione e di consenso ritorna alla genesi ogni 28 giorni, il che significa che tutto ciò che accade sulla rete di test è effimero. Questo la rende ideale per test a breve termine, avvio rapido dei nodi e applicazioni di tipo 'hello world' che non necessitano di permanenza. + +- Stato sempre nuovo, test a breve termine di validatori e app +- Include solo un set di base di contratti +- Set di validatori aperto e facile accesso a grandi quantità di fondi +- Requisiti del nodo minimi e sincronizzazione più rapida, <5GB in media + +##### Risorse + +- [Sito web](https://ephemery.dev/) +- [GitHub](https://github.com/ephemery-testnet/ephemery-resources) +- [Chat della community](https://matrix.to/#/#staker-testnet:matrix.org) +- [Blockscout](https://explorer.ephemery.dev/) +- [Otterscan](https://otter.bordel.wtf/) +- [Esploratore Beacon](https://beaconlight.ephemery.dev/) +- [Sincronizzazione Checkpoint](https://checkpoint-sync.ephemery.ethpandaops.io) +- [Launchpad](https://launchpad.ephemery.dev/) + +#### Rubinetti + +- [Rubinetto Bordel](https://faucet.bordel.wtf/) +- [Rubinetto PoW Pk910](https://ephemery-faucet.pk910.de/) -##### Faucet +#### Holesky (deprecata) {#holesky} -- [Faucet Hoodi](https://hoodi.ethpandaops.io/) +La rete di test Holesky è deprecata a partire da settembre 2025. Gli operatori di staking e i fornitori di infrastrutture dovrebbero invece utilizzare Hoodi per i test dei validatori. -Per lanciare un Validatore sulla rete di prova Hoodi, usa il [launchpad di Hoodi](https://hoodi.launchpad.ethereum.org/en/). +- [Annuncio della chiusura della rete di test Holesky](https://blog.ethereum.org/2025/09/01/holesky-shutdown-announcement) - _Blog EF, 1 settembre 2025_ +- [Aggiornamenti sulle reti di test Holesky e Hoodi](https://blog.ethereum.org/2025/03/18/hoodi-holesky) - _Blog EF, 18 marzo 2025_ -### Rete di prova del livello 2 {#layer-2-testnets} +### Reti di test di livello 2 {#layer-2-testnets} -[Livello 2 (L2)](/layer-2/) è un termine collettivo per descrivere un insieme specifico di soluzioni di ridimensionamento di Ethereum. Un livello 2 è una blockchain separata che estende Ethereum ed eredita le garanzie di sicurezza di Ethereum. Solitamente le reti di prova di Livello 2 sono strettamente accoppiate alle reti di prova pubbliche di Ethereum. +[Livello 2 (L2)](/layer-2/) è un termine collettivo per descrivere un insieme specifico di soluzioni di scalabilità di Ethereum. Un livello 2 è una blockchain separata che estende Ethereum e ne eredita le garanzie di sicurezza. Le reti di test di livello 2 sono solitamente strettamente accoppiate alle reti di test pubbliche di Ethereum. #### Arbitrum Sepolia {#arbitrum-sepolia} -Una rete di prova per [Arbitrum](https://arbitrum.io/). +Una rete di test per [Arbitrum](https://arbitrum.io/). + +##### Risorse + +- [Etherscan](https://sepolia.arbiscan.io/) +- [Blockscout](https://sepolia-explorer.arbitrum.io/) -##### Faucet +##### Rubinetti -- [Faucet Chainlink](https://faucets.chain.link/arbitrum-sepolia) -- [Faucet Alchemy](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Rubinetto Arbitrum Sepolia di Alchemy](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [Rubinetto Arbitrum Sepolia di Chainlink](https://faucets.chain.link/arbitrum-sepolia) +- [Rubinetto Arbitrum Sepolia di ethfaucet.com](https://ethfaucet.com/networks/arbitrum) +- [Rubinetto Arbitrum Sepolia di QuickNode](https://faucet.quicknode.com/arbitrum/sepolia) #### Optimistic Sepolia {#optimistic-sepolia} -Una rete di prova per [Optimism](https://www.optimism.io/). +Una rete di test per [Optimism](https://www.optimism.io/). -##### Faucet +##### Risorse + +- [Etherscan](https://sepolia-optimistic.etherscan.io/) +- [Blockscout](https://optimism-sepolia.blockscout.com/) -- [Faucet Chainlink](https://faucets.chain.link/optimism-sepolia) -- [Faucet Alchemy](https://www.alchemy.com/faucets/optimism-sepolia) +##### Rubinetti + +- [Rubinetto di Alchemy](https://www.alchemy.com/faucets/optimism-sepolia) +- [Rubinetto di Chainlink](https://faucets.chain.link/optimism-sepolia) +- [Rubinetto Optimism Sepolia di ethfaucet.com](https://ethfaucet.com/networks/optimism) +- [Rubinetto della rete di test](https://docs.optimism.io/builders/tools/build/faucets) #### Starknet Sepolia {#starknet-sepolia} -Una rete di prova per [Starknet](https://www.starknet.io). +Una rete di test per [Starknet](https://www.starknet.io). -##### Faucet +##### Risorse -- [Faucet Alchemy](https://www.alchemy.com/faucets/starknet-sepolia) +- [Voyager Sepolia Scan](https://sepolia.voyager.online/) + +##### Rubinetti + +- [Rubinetto di Alchemy](https://www.alchemy.com/faucets/starknet-sepolia) +- [Rubinetto Starknet Sepolia di Blast](https://blastapi.io/faucets/starknet-sepolia-eth) +- [Rubinetto di Starknet](https://starknet-faucet.vercel.app/) ## Reti private {#private-networks} -Una rete Ethereum è una rete privata se i relativi nodi non sono connessi a una rete pubblica (ossia Rete principale o una rete di prova). In questo contesto, privato significa solo riservato o isolato, e non protetto o sicuro. +Una rete di Ethereum è una rete privata se i suoi nodi non sono connessi a una rete pubblica (ovvero, la rete principale o una rete di test). In questo contesto, privato significa solo riservato o isolato, piuttosto che protetto o sicuro. ### Reti di sviluppo {#development-networks} -Per sviluppare un'applicazione Ethereum, è consigliabile eseguirla prima su una rete privata per vedere come funziona prima di distribuirla. Come quando si crea un server locale sul computer per lo sviluppo web, è possibile creare un'istanza locale della blockchain per testare una dapp. Questo offre un'iterazione molto più veloce rispetto a una rete di prova pubblica. +Per sviluppare un'applicazione di Ethereum, vorrai eseguirla su una rete privata per vedere come funziona prima di distribuirla. Similmente a come crei un server locale sul tuo computer per lo sviluppo web, puoi creare un'istanza locale della blockchain per testare la tua dApp. Questo consente un'iterazione molto più rapida rispetto a una rete di test pubblica. -Ci sono progetti e strumenti dedicati a questo scopo. Scopri di più sulle [reti di sviluppo](/developers/docs/development-networks/). +Ci sono progetti e strumenti dedicati per assistere in questo. Scopri di più sulle [reti di sviluppo](/developers/docs/development-networks/). ### Reti di consorzio {#consortium-networks} -Il processo di consenso è controllato da una serie predefinita di nodi considerati attendibili. Un esempio può essere una rete privata di istituti accademici noti, dove ogni istituto controlla un singolo nodo e i blocchi vengono convalidati da una soglia di firmatari all'interno della rete. +Il processo di consenso è controllato da un set predefinito di nodi considerati attendibili. Ad esempio, una rete privata di istituzioni accademiche note che governano ciascuna un singolo nodo, e i blocchi vengono validati da una soglia di firmatari all'interno della rete. + +Se una rete pubblica di Ethereum è come l'internet pubblico, una rete di consorzio è come un'intranet privata. + +## Perché le reti di test di Ethereum prendono il nome dalle stazioni della metropolitana? {#why-naming} + +Molte reti di test di Ethereum prendono il nome da stazioni della metropolitana o dei treni del mondo reale. Questa tradizione di denominazione è iniziata presto e riflette le città globali in cui i contributori hanno vissuto o lavorato. È simbolica, memorabile e pratica. Proprio come le reti di test sono isolate dalla rete principale di Ethereum, le linee della metropolitana corrono separatamente dal traffico di superficie. + +### Reti di test comunemente usate e legacy {#common-and-legacy-testnets} + +- **Sepolia** - Un quartiere collegato alla metropolitana ad Atene, in Grecia. Attualmente utilizzata per i test di contratti intelligenti e dApp. +- **Hoodi** - Prende il nome dalla stazione della metropolitana Hoodi a Bengaluru, in India. Utilizzata per i test dei validatori e degli aggiornamenti del protocollo. +- **Goerli** _(deprecata)_ - Prende il nome dalla Görlitzer Bahnhof a Berlino, in Germania. +- **Rinkeby** _(deprecata)_ - Prende il nome da un sobborgo di Stoccolma con una stazione della metropolitana. +- **Ropsten** _(deprecata)_ - Si riferisce a un'area e a un ex terminal di traghetti/metropolitana a Stoccolma. +- **Kovan** _(deprecata)_ - Prende il nome da una stazione MRT di Singapore. +- **Morden** _(deprecata)_ - Prende il nome da una stazione della metropolitana di Londra. La prima rete di test pubblica di Ethereum. + +### Altre reti di test specializzate {#other-testnets} + +Alcune reti di test sono state create per test a breve termine o specifici per gli aggiornamenti e non sono necessariamente a tema metropolitana: + +- **Holesky** _(deprecata)_ - Prende il nome dalla stazione di Holešovice a Praga. Utilizzata per i test dei validatori; deprecata nel 2025. +- **Kiln**, **Zhejiang**, **Shandong**, **Prater**, **Pyrmont**, **Olympic** _(tutte deprecate)_ ed **Ephemery** - Costruite appositamente per simulazioni di aggiornamenti come The Merge, Shanghai o esperimenti sui validatori. Alcuni nomi sono regionali o tematici piuttosto che basati sulla metropolitana. -Se una rete Ethereum pubblica è come la rete Internet pubblica, una rete di consorzio è come una Intranet privata. +L'uso dei nomi delle stazioni della metropolitana aiuta gli sviluppatori a identificare e ricordare rapidamente le reti di test senza dover fare affidamento su ID di catena numerici. Riflette anche la cultura di Ethereum: pratica, globale e incentrata sull'uomo. ## Strumenti correlati {#related-tools} -- [Chainlist](https://chainlist.org/) _Elenco di reti EVM per connettere portafogli e fornitori all'ID della Catena e ID di Rete appropriati._ -- [Catene basate su EVM](https://github.com/ethereum-lists/chains) _Repository di GitHub di metadati della catena che alimentano Chainlist._ +- [Chainlist](https://chainlist.org/) _elenco di reti EVM per connettere portafogli e provider all'ID di catena e all'ID di rete appropriati_ +- [Catene basate su EVM](https://github.com/ethereum-lists/chains) _repository GitHub di metadati delle catene che alimenta Chainlist_ ## Letture consigliate {#further-reading} -- [Proposta: ciclo di vita prevedibile delle reti di prova di Ethereum](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) -- [L'evoluzione delle reti di prova di Ethereum](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) +- [Proposta: Ciclo di vita prevedibile delle reti di test di Ethereum](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [L'evoluzione delle reti di test di Ethereum](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/archive-nodes/index.md index c75f46ec32e..15ee8deea36 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -1,80 +1,81 @@ --- -title: Nodo archivio di Ethereum -description: Una panoramica dei nodi archivio +title: Nodo di archivio di Ethereum +description: Una panoramica sui nodi di archivio lang: it sidebarDepth: 2 --- -Un nodo archivio è un'istanza di un client di Ethereum configurata per creare un archivio di tutti gli stati storici. È uno strumento utile per certi casi d'uso ma potrebbe essere più complicato da eseguire di un nodo completo. +Un nodo di archivio è un'istanza di un client [Ethereum](/) configurato per creare un archivio di tutti gli stati storici. È uno strumento utile per determinati casi d'uso, ma potrebbe essere più complesso da eseguire rispetto a un nodo completo. ## Prerequisiti {#prerequisites} -Dovresti comprendere il concetto di [nodo di Ethereum](/developers/docs/nodes-and-clients/), [la sua architettura](/developers/docs/nodes-and-clients/node-architecture/), le [strategie di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes) e le pratiche della sua [esecuzione](/developers/docs/nodes-and-clients/run-a-node/) e [utilizzo](/developers/docs/apis/json-rpc/). +Dovresti comprendere il concetto di [nodo Ethereum](/developers/docs/nodes-and-clients/), [la sua architettura](/developers/docs/nodes-and-clients/node-architecture/), [le strategie di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes), le pratiche per [eseguirli](/developers/docs/nodes-and-clients/run-a-node/) e [utilizzarli](/developers/docs/apis/json-rpc/). -## Cos'è un nodo archivio +## Cos'è un nodo di archivio -Per cogliere l'importanza di un nodo archivio, chiariamo il concetto di "stato". Ethereum è definibile come una _macchina di stato basata sulle transazioni_. Consiste in conti e applicazioni che eseguono transazioni, i cui stati cambiano. I dati globali con informazioni su ogni conto e contratto sono memorizzati in un database ad albero, detto stato. Questo è gestito dal client del livello di esecuzione (EL) e include: +Per cogliere l'importanza di un nodo di archivio, chiariamo il concetto di "stato". Ethereum può essere definito come una _macchina a stati basata sulle transazioni_. È composto da account e applicazioni che eseguono transazioni che ne modificano lo stato. I dati globali con le informazioni su ogni account e contratto sono archiviati in un database trie chiamato stato. Questo è gestito dal client del livello di esecuzione (EL) e include: -- Saldi e nonce dei conti -- Codice del contratto e archiviazione -- Dati correlati al consenso, es. il Contratto di deposito di staking +- Saldi degli account e nonce +- Codice e archiviazione dei contratti +- Dati relativi al consenso, ad es. il contratto di deposito per lo staking -Per interagire con la rete, verificare e produrre nuovi blocchi, i client di Ethereum devono tenere il passo con i cambiamenti più recenti (la punta della catena) e, dunque, con lo stato corrente. Un client del livello di esecuzione configurato come un nodo completo verifica e segue l'ultimo stato della rete, memorizzando nella cache solo gli ultimi stati, ad esempio quello associato agli ultimi 128 blocchi, così che possa gestire le riorganizzazioni della catena e fornire accesso rapido ai dati recenti. Lo stato recente è ciò che tutti i client necessitano per verificare le transazioni in entrata e per utilizzare la rete. +Per interagire con la rete, verificare e produrre nuovi blocchi, i client di Ethereum devono tenersi al passo con le modifiche più recenti (la punta della catena) e quindi con lo stato attuale. Un client del livello di esecuzione configurato come nodo completo verifica e segue l'ultimo stato della rete, ma memorizza nella cache solo gli ultimi stati, ad es. lo stato associato agli ultimi 128 blocchi, in modo da poter gestire le riorganizzazioni della catena e fornire un rapido accesso ai dati recenti. Lo stato recente è ciò di cui tutti i client hanno bisogno per verificare le transazioni in entrata e utilizzare la rete. -Puoi immaginare lo stato come un'istantanea momentanea della rete a un dato blocco e l'archivio come una riproduzione dello storico. +Puoi immaginare lo stato come un'istantanea momentanea della rete in un dato blocco e l'archivio come una riproduzione della cronologia. -Gli stati storici possono essere rimossi in sicurezza, poiché non sono necessari per l'operatività della rete e sarebbe inutilmente ridondante per il client mantenere tutti i dati obsoleti. Gli stati esistenti prima di qualche blocco recente (es. i 128 blocchi prima della testa) sono di fatto gettati via. I nodi completi mantengono soltanto i dati storici della blockchain (blocchi e transazioni) e istantanee storiche occasionali utilizzabili per rigenerare i vecchi stati su richiesta. Lo fanno eseguendo nuovamente le vecchie transazioni nell'EVM, il che può essere impegnativo a livello computazionale quando lo stato desiderato è distante dall'istantanea più vicina. +Gli stati storici possono essere tranquillamente eliminati (pruned) perché non sono necessari per il funzionamento della rete e sarebbe inutilmente ridondante per il client conservare tutti i dati obsoleti. Gli stati esistenti prima di un blocco recente (ad es. 128 blocchi prima della testa) vengono di fatto scartati. I nodi completi conservano solo i dati storici della blockchain (blocchi e transazioni) e occasionali istantanee storiche che possono utilizzare per rigenerare stati più vecchi su richiesta. Lo fanno rieseguendo le transazioni passate nell'EVM, il che può essere computazionalmente impegnativo quando lo stato desiderato è lontano dall'istantanea più vicina. -Tuttavia, ciò significa che accedere a uno stato storico su un nodo completo produce numerosi calcoli. Il client potrebbe dover eseguire tutte le transazioni precedenti e calcolare uno stato storico dalla genesi. I nodi archivio risolvono tale problema, memorizzando non solo gli stati più recenti ma ogni stato storico creato dopo ogni blocco. Fondamentalmente raggiungono un compromesso con maggiori requisiti di spazio su disco. +Tuttavia, ciò significa che l'accesso a uno stato storico su un nodo completo consuma molta potenza di calcolo. Il client potrebbe dover eseguire tutte le transazioni passate e calcolare uno stato storico dalla genesi. I nodi di archivio risolvono questo problema archiviando non solo gli stati più recenti, ma ogni stato storico creato dopo ogni blocco. Fondamentalmente, si tratta di un compromesso con un maggiore requisito di spazio su disco. -È importante notare che la rete non dipende dal fatto che i nodi archivio mantengano e forniscano tutti i dati storici. Come detto sopra, tutti gli stati intermedi storici sono derivabili su un nodo completo. Le transazioni sono memorizzate da qualsiasi nodo completo (attualmente meno di 400G) e riproducibili per costruire l'intero archivio. +È importante notare che la rete non dipende dai nodi di archivio per conservare e fornire tutti i dati storici. Come accennato in precedenza, tutti gli stati intermedi storici possono essere derivati su un nodo completo. Le transazioni sono archiviate da qualsiasi nodo completo (attualmente meno di 400 GB) e possono essere riprodotte per costruire l'intero archivio. ### Casi d'uso -L'utilizzo regolare di Ethereum, come inviare transazioni, distribuire contratti, verificare il consenso, ecc., non richiede l'accesso agli stati storici. Gli utenti non necessitano mai di un nodo archivio per un'interazione standard con la rete. +L'uso regolare di Ethereum, come l'invio di transazioni, la distribuzione di contratti, la verifica del consenso, ecc., non richiede l'accesso agli stati storici. Gli utenti non hanno mai bisogno di un nodo di archivio per un'interazione standard con la rete. -Il principale vantaggio dell'archivio di stato è un accesso rapido alle richieste sugli stati storici. Ad esempio, il nodo archivio restituirà prontamente risultati come: +Il vantaggio principale dell'archivio di stato è un rapido accesso alle query sugli stati storici. Ad esempio, un nodo di archivio restituirebbe prontamente risultati come: -- _Qual era il saldo di ETH del conto 0x1337... al blocco 15537393?_ -- _Qual era il saldo del token 0x nel contratto 0x al blocco 1920000?_ +- _Qual era il saldo in ETH dell'account 0x1337... al blocco 15537393?_ +- _Qual è il saldo del token 0x nel contratto 0x al blocco 1920000?_ -Come spiegato sopra, un nodo completo dovrebbe generare questi dati dall'esecuzione dell'EVM, utilizzando CPU e richiedendo tempo. I nodi archivio vi accedono sul disco e servono immediatamente le risposte. Questa è un'utile funzionalità per certe parti dell'infrastruttura, ad esempio: +Come spiegato sopra, un nodo completo dovrebbe generare questi dati tramite l'esecuzione dell'EVM, che utilizza la CPU e richiede tempo. I nodi di archivio vi accedono sul disco e forniscono le risposte immediatamente. Questa è una funzionalità utile per alcune parti dell'infrastruttura, ad esempio: -- Fornitori di servizi come i block explorer +- Fornitori di servizi come gli esploratori di blocchi - Ricercatori -- Analisti della sicurezza -- Sviluppatori di Dapp -- Controllo e conformità +- Analisti di sicurezza +- Sviluppatori di dApp +- Revisione e conformità -Esistono anche vari [servizi](/developers/docs/nodes-and-clients/nodes-as-a-service/) gratuiti che consentono l'accesso a dati storici. Essendo più impegnativo eseguire un nodo archivio, questo accesso è per lo più limitato e funziona soltanto per l'accesso occasionale. Se il tuo progetto richiede l'accesso costante ai dati storici, dovresti considerare di eseguirne uno tu stesso. +Esistono vari [servizi](/developers/docs/nodes-and-clients/nodes-as-a-service/) gratuiti che consentono anche l'accesso ai dati storici. Poiché è più impegnativo eseguire un nodo di archivio, questo accesso è per lo più limitato e funziona solo per accessi occasionali. Se il tuo progetto richiede un accesso costante ai dati storici, dovresti prendere in considerazione l'idea di eseguirne uno tu stesso. -## Implementazioni e utilizzi +## Implementazioni e utilizzo -Il nodo archivio, in questo contesto, indica i dati serviti dai client del livello di esecuzione rivolti agli utenti mentre gestiscono il database di stato e forniscono gli endpoint JSON-RPC. Opzioni di configurazione, tempi di sincronizzazione e dimensioni del database potrebbero variare a seconda del client. Per i dettagli, sei pregato di fare riferimento alla documentazione fornita dal tuo client. +Nodo di archivio in questo contesto significa dati forniti dai client del livello di esecuzione rivolti all'utente, poiché gestiscono il database di stato e forniscono endpoint JSON-RPC. Le opzioni di configurazione, il tempo di sincronizzazione e le dimensioni del database possono variare a seconda del client. Per i dettagli, fai riferimento alla documentazione fornita dal tuo client. -Prima di avviare il tuo nodo archivio, scopri le differenze tra i client e, in particolare, i vari [requisiti hardware](/developers/docs/nodes-and-clients/run-a-node/#requirements). Gran parte dei client non è ottimizzata per questa funzionalità e i loro archivi richiedono oltre 12TB di spazio. Per contro, le implementazioni come Erigon possono memorizzare gli stessi dati in meno di 3TB, il che li rende il metodo più efficace per eseguire un nodo archivio. +Prima di avviare il tuo nodo di archivio, informati sulle differenze tra i client e in particolare sui vari [requisiti hardware](/developers/docs/nodes-and-clients/run-a-node/#requirements). La maggior parte dei client non è ottimizzata per questa funzionalità e i loro archivi richiedono più di 12 TB di spazio. Al contrario, implementazioni come Erigon possono archiviare gli stessi dati in meno di 3 TB, il che le rende il modo più efficace per eseguire un nodo di archivio. ## Pratiche consigliate -Oltre ai [consigli generali per eseguire un nodo](/developers/docs/nodes-and-clients/run-a-node/), un nodo archivio potrebbe avere requisiti maggiori in termini di hardware e manutenzione. Considerando le [funzionalità chiave](https://github.com/ledgerwatch/erigon#key-features) di Erigon, l'approccio più pratico è utilizzare l'implementazione del client di [Erigon](/developers/docs/nodes-and-clients/#erigon). +Oltre alle [raccomandazioni generali per l'esecuzione di un nodo](/developers/docs/nodes-and-clients/run-a-node/), un nodo di archivio può essere più esigente in termini di hardware e manutenzione. Considerando le [funzionalità chiave](https://github.com/ledgerwatch/erigon#key-features) di Erigon, l'approccio più pratico è utilizzare l'implementazione del client [Erigon](/developers/docs/nodes-and-clients/#erigon). ### Hardware -Assicurati sempre di verificare i requisiti hardware per una data modalità nella documentazione di un client. Il principale requisito per i nodi archivio è lo spazio su disco. A seconda del client, varia da 3TB a 12TB. Anche se gli HDD potrebbero essere considerati la migliore soluzione per grandi quantità di dati, sincronizzare e aggiornare costantemente la testa della catena richiederà dischi SSD. I dischi [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html) sono abbastanza buoni ma dovrebbero essere di una qualità affidabile, almeno [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences). I dischi possono esser montati in un computer fisso o un server dotato di un numero sufficiente di slot. Tali dispositivi dedicati sono ideali per eseguire nodi con tempi di disponibilità elevati. È assolutamente possibile eseguirli su un laptop, ma la portabilità comporterà un costo aggiuntivo. +Assicurati sempre di verificare i requisiti hardware per una determinata modalità nella documentazione di un client. +Il requisito principale per i nodi di archivio è lo spazio su disco. A seconda del client, varia da 3 TB a 12 TB. Anche se gli HDD potrebbero essere considerati una soluzione migliore per grandi quantità di dati, la loro sincronizzazione e il costante aggiornamento della testa della catena richiederanno unità SSD. Le unità [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html) sono sufficienti, ma dovrebbero essere di qualità affidabile, almeno [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences). I dischi possono essere inseriti in un computer desktop o in un server con slot sufficienti. Tali dispositivi dedicati sono ideali per eseguire un nodo con un tempo di attività elevato. È assolutamente possibile eseguirlo su un laptop, ma la portabilità comporterà un costo aggiuntivo. -Tutti i dati devono entrare in un volume, dunque i dischi devono essere uniti, ad esempio con [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) o LVM. Inoltre, potrebbe valere la pena di considerare l'utilizzo di [ZFS](https://en.wikipedia.org/wiki/ZFS) poiché supporta la "Copy-on-write", che assicura che i dati siano scritti correttamente senza alcun errore di basso livello. +Tutti i dati devono risiedere in un unico volume, pertanto i dischi devono essere uniti, ad es. con [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) o LVM. Potrebbe valere la pena prendere in considerazione anche l'utilizzo di [ZFS](https://en.wikipedia.org/wiki/ZFS) in quanto supporta il "Copy-on-write", che garantisce che i dati vengano scritti correttamente sul disco senza errori di basso livello. -Per una maggiore stabilità e sicurezza nel prevenire la corruzione accidentale del database, specialmente in una configurazione professionale, prendi in considerazione di utilizzare la [memoria ECC](https://en.wikipedia.org/wiki/ECC_memory), se il tuo sistema la supporta. Generalmente si consiglia che le dimensioni della RAM siano le stesse richieste per un nodo completo, ma maggiori quantità di RAM possono aiutare a velocizzare la sincronizzazione. +Per maggiore stabilità e sicurezza nella prevenzione della corruzione accidentale del database, specialmente in una configurazione professionale, considera l'utilizzo della [memoria ECC](https://en.wikipedia.org/wiki/ECC_memory) se il tuo sistema la supporta. In genere si consiglia che la dimensione della RAM sia la stessa di un nodo completo, ma una maggiore quantità di RAM può aiutare a velocizzare la sincronizzazione. -Durante la sincronizzazione iniziale, i client in modalità archivio eseguiranno ogni transazione dalla genesi. La velocità di esecuzione è per lo più limitata dalla CPU, quindi una CPU più veloce può aiutare con i tempi della sincronizzazione iniziale. Sul computer del consumatore medio, la sincronizzazione iniziale può richiedere fino a un mese. +Durante la sincronizzazione iniziale, i client in modalità archivio eseguiranno ogni transazione dalla genesi. La velocità di esecuzione è per lo più limitata dalla CPU, quindi una CPU più veloce può aiutare con il tempo di sincronizzazione iniziale. Su un computer consumer medio, la sincronizzazione iniziale può richiedere fino a un mese. -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} -- [Nodo completo vs nodo archivio di Ethereum](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _QuickNode, settembre 2022_ -- [Costruire il proprio nodo archivio di Ethereum](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, agosto 2021_ -- [Come configurare Erigon, RPC di Erigon e TrueBlocks (scrape e API) come servizi](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aggiornato a settembre 2022_ +- [Ethereum Full Node vs Archive Node](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _QuickNode, settembre 2022_ +- [Building Your Own Ethereum Archive Node](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _Thomas Jay Rush, agosto 2021_ +- [How to set up Erigon, Erigon’s RPC and TrueBlocks (scrape and API) as services](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, aggiornato a settembre 2022_ ## Argomenti correlati {#related-topics} -- [ Nodi e client](/developers/docs/nodes-and-clients/) -- [Eseguire un nodo](/developers/docs/nodes-and-clients/run-a-node/) +- [Nodi e client](/developers/docs/nodes-and-clients/) +- [Eseguire un nodo](/developers/docs/nodes-and-clients/run-a-node/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/bootnodes/index.md index 04cdf481b43..f205c59b084 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/bootnodes/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/bootnodes/index.md @@ -1,31 +1,31 @@ --- -title: Introduzione ai nodi d'avvio di Ethereum -description: Le informazioni di base necessarie per comprendere i nodi d'avvio +title: Introduzione ai bootnode di Ethereum +description: Le informazioni di base necessarie per comprendere i bootnode lang: it --- -Quando un nuovo nodo si unisce alla rete di Ethereum, deve connettersi ai nodi già sulla rete per poter poi scoprire nuovi pari. Questi punti d'accesso alla rete di Ethereum sono detti nodi d'avvio. I client ne contengono solitamente un elenco a codifica fissa. Questi nodi d'avvio sono tipicamente eseguiti dal team delle operazioni di sviluppo della Ethereum Foundation o dai team degli stessi client. Nota che i nodi d'avvio non equivalgono ai nodi statici. I nodi statici sono chiamati ripetutamente, mentre i nodi d'avvio sono chiamati soltanto se non esistono abbastanza pari a cui connettersi e se un nodo necessita di avviare qualche nuova connessione. +Quando un nuovo nodo si unisce alla rete di Ethereum, deve connettersi ai nodi che sono già sulla rete per poter poi scoprire nuovi peer. Questi punti di ingresso nella rete di Ethereum sono chiamati bootnode. I client di solito hanno un elenco di bootnode codificato al loro interno. Questi bootnode sono in genere gestiti dal team devops della Ethereum Foundation o dai team dei client stessi. Nota che i bootnode non sono la stessa cosa dei nodi statici. I nodi statici vengono richiamati ripetutamente, mentre i bootnode vengono interpellati solo se non ci sono abbastanza peer a cui connettersi e un nodo ha bisogno di inizializzare alcune nuove connessioni. -## Connettersi a un nodo d'avvio {#connect-to-a-bootnode} +## Connettersi a un bootnode {#connect-to-a-bootnode} -Gran parte dei client contiene un elenco integrato di nodi d'avvio, ma potresti voler anche eseguire il tuo o utilizzarne uno che non appartenga all'elenco a codifica fissa del client. In questo caso, puoi specificarli all'avvio del tuo client come segue (l'esempio è per Geth, consulta la documentazione del tuo client): +La maggior parte dei client ha un elenco di bootnode integrato, ma potresti anche voler eseguire il tuo bootnode o usarne uno che non fa parte dell'elenco codificato del client. In questo caso, puoi specificarli all'avvio del tuo client, come segue (l'esempio è per Geth, controlla la documentazione del tuo client): ``` geth --bootnodes "enode://@:" ``` -## Eseguire un nodo d'avvio {#run-a-bootnode} +## Eseguire un bootnode {#run-a-bootnode} -I nodi d'avvio sono nodi completi non posti dietro una NAT ([Traduzione dell'indirizzo di rete](https://www.geeksforgeeks.org/network-address-translation-nat/)). Ogni nodo completo può agire da nodo d'avvio a condizione che sia pubblicamente disponibile. +I bootnode sono nodi completi che non si trovano dietro a un NAT ([Network Address Translation](https://www.geeksforgeeks.org/network-address-translation-nat/)). Ogni nodo completo può fungere da bootnode purché sia disponibile pubblicamente. -Quando avvii un nodo, dovrebbe registrare il tuo [enode](/developers/docs/networking-layer/network-addresses/#enode), un identificativo pubblico utilizzabile dagli altri per connettersi al tuo nodo. +Quando avvii un nodo, dovrebbe registrare il tuo [enode](/developers/docs/networking-layer/network-addresses/#enode), che è un identificatore pubblico che altri possono usare per connettersi al tuo nodo. -L'enode è solitamente rigenerato a ogni riavvio, quindi assicurati di consultare la documentazione del tuo client su come generare un enode persistente per il tuo nodo d'avvio. +L'enode viene solitamente rigenerato a ogni riavvio, quindi assicurati di consultare la documentazione del tuo client su come generare un enode persistente per il tuo bootnode. -Per poter essere un buon nodo d'avvio è una buona idea incrementare il numero massimo di pari che possono connettersi a esso. L'esecuzione di un nodo d'avvio con molti peer aumenterà in modo significativo i requisiti di larghezza di banda. +Per essere un buon bootnode, è una buona idea aumentare il numero massimo di peer che possono connettersi ad esso. Eseguire un bootnode con molti peer aumenterà significativamente il requisito di larghezza di banda. -## Nodi d'avvio disponibili {#available-bootnodes} +## Bootnode disponibili {#available-bootnodes} -Un elenco di nodi d'avvio integrati in go-ethereum si può trovare [qui](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Questi nodi d'avvio sono mantenuti dalla Ethereum Foundation e dal team di go-ethereum. +Un elenco di bootnode integrati in go-ethereum può essere trovato [qui](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23). Questi bootnode sono mantenuti dalla Ethereum Foundation e dal team di go-ethereum. -Sono disponibili altri elenchi di nodi d'avvio tenuti da volontari. Assicurati di includere sempre almeno un nodo d'avvio ufficiale, altrimenti potresti subire un attacco eclipse. +Sono disponibili altri elenchi di bootnode mantenuti da volontari. Assicurati di includere sempre almeno un bootnode ufficiale, altrimenti potresti subire un attacco eclipse. \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/client-diversity/index.md index 06dc895256d..5740950f22b 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/client-diversity/index.md @@ -1,96 +1,117 @@ --- -title: Diversità dei client -description: Una spiegazione generica dell'importanza della diversità di client di Ethereum. +title: "Diversità dei client" +description: "Una spiegazione ad alto livello dell'importanza della diversità dei client di Ethereum." lang: it sidebarDepth: 2 --- -Il comportamento di un nodo di Ethereum è controllato dal software del client che esegue. Esistono diversi client di Ethereum di livello di produzione, ognuno sviluppato e mantenuto in diversi linguaggi da team distinti. I client sono costruiti su specifiche comuni che assicurano che i client comunichino senza problemi tra loro e abbiano le stesse funzionalità, fornendo un'esperienza utente equivalente. Tuttavia, al momento, la distribuzione dei client tra i nodi non è abbastanza equilibrata da realizzare in tutta la sua potenzialità questa fortificazione della rete. Idealmente, gli utenti dovrebbero dividersi approssimativamente in modo equo tra i vari client, per portare quanta più diversità dei client possibile alla rete. +Il comportamento di un nodo di [Ethereum](/) è controllato dal software del client che esegue. Esistono diversi client di Ethereum a livello di produzione, ognuno sviluppato e mantenuto in linguaggi diversi da team separati. I client sono costruiti secondo una specifica comune che garantisce che comunichino tra loro senza problemi, abbiano le stesse funzionalità e forniscano un'esperienza utente equivalente. Tuttavia, al momento la distribuzione dei client tra i nodi non è abbastanza equa da realizzare questa fortificazione della rete al suo pieno potenziale. Idealmente, gli utenti si dividono in modo approssimativamente uguale tra i vari client per portare quanta più diversità dei client possibile alla rete. ## Prerequisiti {#prerequisites} -Se ancora non sai cosa sono i nodi e i client, dai un'occhiata a [nodi e client](/developers/docs/nodes-and-clients/). I livelli di [esecuzione](/glossary/#execution-layer) e [consenso](/glossary/#consensus-layer) sono definiti nel glossario. +Se non capisci ancora cosa siano i nodi e i client, dai un'occhiata a [nodi e client](/developers/docs/nodes-and-clients/). I livelli di [esecuzione](/glossary/#execution-layer) e [consenso](/glossary/#consensus-layer) sono definiti nel glossario. -## Perché esistono diversi client? {#why-multiple-clients} +## Perché ci sono più client? {#why-multiple-clients} -Esistono diversi client sviluppati e mantenuti indipendentemente perché la diversità dei client rende la rete più resistente ad attacchi e bug. Diversi client sono una forza unica per Ethereum, mentre altre blockchain si affidano all'infallibilità di un singolo client. Tuttavia, non basta avere semplicemente diversi client disponibili, devono essere adottati dalla community e i nodi attivi totali devono essere distribuiti in modo relativamente uniforme tra loro. +Esistono più client sviluppati e mantenuti in modo indipendente perché la diversità dei client rende la rete più resiliente ad attacchi e bug. Avere più client è un punto di forza unico di Ethereum: altre blockchain si affidano all'infallibilità di un singolo client. Tuttavia, non è sufficiente avere semplicemente più client disponibili, devono essere adottati dalla community e i nodi attivi totali devono essere distribuiti in modo relativamente uniforme tra di essi. ## Perché la diversità dei client è importante? {#client-diversity-importance} -Avere molti client sviluppati e mantenuti indipendentemente è vitale per l'integrità di una rete decentralizzata. Vediamo perché. +Avere molti client sviluppati e mantenuti in modo indipendente è vitale per la salute di una rete decentralizzata. Esploriamone i motivi. ### Bug {#bugs} -Un bug in un singolo client rappresenta un pericolo minore per la rete se rappresenta una minoranza di nodi di Ethereum. Con una distribuzione approssimativamente uniforme dei nodi tra molti client, la probabilità che gran parte dei client soffra di un problema comune è minima e, di conseguenza, la rete è più robusta. +Un bug in un singolo client rappresenta un rischio minore per la rete quando rappresenta una minoranza dei nodi di Ethereum. Con una distribuzione approssimativamente uniforme dei nodi tra molti client, la probabilità che la maggior parte dei client soffra di un problema condiviso è piccola e, di conseguenza, la rete è più robusta. -### Resistenza agli attacchi {#resilience} +### Resilienza agli attacchi {#resilience} -La diversità dei client offre anche resistenza agli attacchi. Ad esempio, un attacco che [inganna un client specifico](https://twitter.com/vdWijden/status/1437712249926393858) su un ramo particolare della catena, difficilmente riuscirà nel suo intento perché non è probabile che anche gli altri client siano vulnerabili allo stesso modo, e la catena canonica non viene quindi corrotta. Una bassa diversità dei client aumenta i rischi associati a un attacco sul client dominante. È stato dimostrato che la diversità dei client è una difesa importante contro gli attacchi malevoli sulla rete, ad esempio, l'attacco di denial of service di Shanghai nel 2016 è stato possibile perché gli utenti malevoli sono riusciti a ingannare il client dominante (Geth) facendogli eseguire un'operazione lenta di I/O su disco decine di migliaia di volte per blocco. Poiché online erano presenti anche altri client alternativi che non avevano la stessa vulnerabilità, Ethereum è riuscita a resistere all'attacco e a continuare a funzionare mentre veniva risolta la vulnerabilità di Geth. +La diversità dei client offre anche resilienza agli attacchi. Ad esempio, un attacco che [inganna un particolare client](https://twitter.com/vdWijden/status/1437712249926393858) su un particolare ramo della catena è improbabile che abbia successo perché è improbabile che altri client siano sfruttabili allo stesso modo e la catena canonica rimane incorrotta. Una bassa diversità dei client aumenta il rischio associato a un hack sul client dominante. La diversità dei client si è già dimostrata un'importante difesa contro gli attacchi dannosi alla rete, ad esempio l'attacco denial-of-service di Shanghai nel 2016 è stato possibile perché gli aggressori sono stati in grado di ingannare il client dominante (Geth) facendogli eseguire una lenta operazione di I/O su disco decine di migliaia di volte per blocco. Poiché erano online anche client alternativi che non condividevano la vulnerabilità, Ethereum è stato in grado di resistere all'attacco e continuare a operare mentre la vulnerabilità in Geth veniva risolta. -### Finalità del proof-of-stake {#finality} +### Finalità della prova di stake {#finality} -Un bug in un client di consenso con oltre il 33% dei nodi di Ethereum potrebbe impedire la finalizzazione del livello di consenso, il che significa che gli utenti non possono essere sicuri che le transazioni non vengano annullate o modificate ad un certo punto. Questo sarebbe molto problematico per molte delle app basate su Ethereum, in particolare, le DeFi. +Un bug in un client di consenso con oltre il 33% dei nodi di Ethereum potrebbe impedire al livello di consenso di raggiungere la finalità, il che significa che gli utenti non potrebbero fidarsi del fatto che le transazioni non vengano annullate o modificate a un certo punto. Questo sarebbe molto problematico per molte delle app costruite su Ethereum, in particolare per la DeFi. - Ancora peggio, un bug critico in un client con una maggioranza di due terzi potrebbe causare la una divisione e finalizzazione errata della catena, bloccando un gran numero di validatori su una catena non valida. Se vogliono rientrare nella catena corretta, quei validatori devo sottoporsi a tagli (slashing) o a un prelievo volontario, costoso e lento, e alla riattivazione. L'ammontare del taglio (slashing) aumenta col numero di nodi colpevoli, potendo interessare al massimo una maggioranza di due terzi (32 ETH). + Peggio ancora, un bug critico in un client con una maggioranza di due terzi potrebbe causare alla catena di dividersi e finalizzarsi in modo errato, portando un ampio gruppo di validatori a rimanere bloccati su una catena non valida. Se vogliono ricongiungersi alla catena corretta, questi validatori rischiano di essere puniti o di dover affrontare un ritiro volontario e una riattivazione lenti e costosi. L'entità della punizione scala con il numero di nodi colpevoli, con una maggioranza di due terzi punita al massimo (32 ETH). -Sebbene questi siano scenari improbabili, l'ecosistema di Ethereum può mitigarne il rischio equilibrando la distribuzione dei client tra i nodi attivi. Idealmente, nessun client del consenso dovrebbe mai raggiungere una quota del 33% dei nodi totali. +Sebbene questi siano scenari improbabili, l'ecosistema di Ethereum può mitigarne il rischio uniformando la distribuzione dei client tra i nodi attivi. Idealmente, nessun client di consenso dovrebbe mai raggiungere una quota del 33% dei nodi totali. ### Responsabilità condivisa {#responsibility} -Esiste anche un costo umano associato alla presenza di client di maggioranza. Essa comporta un eccesso di lavoro e responsabilità su un team di sviluppo di piccole dimensioni. Minore è la diversità dei client, maggiore l'onere di responsabilità per gli sviluppatori che mantengono il client di maggioranza. Distribuire la responsabilità tra diversi team è un bene sia per la salute della rete di nodi di Ethereum che per la sua rete di persone. +C'è anche un costo umano nell'avere client di maggioranza. Pone uno sforzo e una responsabilità eccessivi su un piccolo team di sviluppo. Minore è la diversità dei client, maggiore è il peso della responsabilità per gli sviluppatori che mantengono il client di maggioranza. Distribuire questa responsabilità su più team è positivo sia per la salute della rete di nodi di Ethereum sia per la sua rete di persone. ## Attuale diversità dei client {#current-client-diversity} -![Grafico a torta che mostra la diversità dei client](./client-diversity.png) _Dati del diagramma provenienti da [ethernodes.org](https://ethernodes.org) e [clientdiversity.org](https://clientdiversity.org/)_ +### Client di esecuzione {#execution-clients-breakdown} -I due grafici a torta di cui sopra mostrano le istantanee dell'attuale diversità dei client per i livelli d'esecuzione e del consenso (al momento della scrittura di questo testo, gennaio 2022). Il livello d'esecuzione è prevalentemente dominato da[Geth](https://geth.ethereum.org/), con distacco sul secondo, [Open Ethereum](https://openethereum.github.io/), [Erigon](https://github.com/ledgerwatch/erigon) in terza posizione e [Nethermind](https://nethermind.io/) quarto, con altri client che rappresentano meno dell'1% della rete. Il client più diffuso sul livello del consenso, [Prysm](https://prysmaticlabs.com/#projects), non è tanto dominante quanto Geth, ma rappresenta comunque oltre il 60% della rete. [Lighthouse](https://lighthouse.sigmaprime.io/) e [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) rappresentano rispettivamente circa il 20% e circa il 14%, e gli altri client sono poco usati. + -I dati del livello di esecuzione sono stati ottenuti da [Ethernodes](https://ethernodes.org) il 23 Gen 2023. I dati per i client di consenso sono stati ottenuti da [Michael Sproul](https://github.com/sigp/blockprint). I dati del client di consenso sono più difficili da ottenere, perché i client del livello di consenso non sempre hanno tracce univoche che possono essere utilizzate per individuarli. I dati sono stati generati usando un algoritmo di classificazione che talvolta confonde alcuni dei client di minoranza (vedi [qui](https://twitter.com/sproulM_/status/1440512518242197516) per ulteriori dettagli). Nel diagramma precedente, queste classificazioni ambigue sono trattate classificate come alternative multiple (es. Nimbus/Teku). È comunque chiaro che la maggioranza della rete sta eseguendo Prysm. I dati sono un'istantanea su una serie fissa di blocchi (in questo caso i blocchi della Beacon Chain dallo slot 2048001 al 2164916) e in alcuni momenti la dominanza di Prysm è stata anche maggiore, superando il 68%. Nonostante siano solo istantanee, i valori nel diagramma forniscono una buona indicazione generale dello stato corrente della diversità dei client. +### Client di consenso {#consensus-clients-breakdown} -I dati di diversità dei client aggiornati per il livello del consenso sono ora disponibili su [clientdiversity.org](https://clientdiversity.org/). + -## Livello di esecuzione {#execution-layer} - -Finora, la conversazione sulla diversità dei client si è concentrata sul livello del consenso. Tuttavia, il client d'esecuzione [Geth](https://geth.ethereum.org) rappresenta correntemente circa l'85% di tutti i nodi. Questa percentuale è problematica per gli stessi motivi dei client di consenso. Ad esempio, un bug su Geth che influenzi la gestione delle transazioni o la costruzione dei carichi utili d'esecuzione potrebbe condurre alla finalizzazione da parte dei client di consenso di transazioni problematiche o contenenti bug. Ethereum sarebbe più quindi più robusto con una distribuzione più equa dei client d'esecuzione, idealmente senza alcun client che rappresenti oltre il 33% della rete. - -## Usare un client di minoranza {#use-minority-client} - -Per "indirizzare" la diversità dei client non basta che i singoli utenti scelgano i client di minoranza, richiede che anche i pool di mining/validatori e le istituzioni come le dApp principali e gli scambi cambino client. Tuttavia, tutti gli utenti possono fare la propria parte nel correggere l'attuale disequilibrio e normalizzare l'uso di tutti i software di Ethereum disponibili. Dopo La Fusione, tutti gli operatori di nodi dovranno eseguire un client d'esecuzione e un client di consenso. Scegliere le combinazioni dei client suggerite di seguito aiuterà ad aumentare la diversità dei client. - -### Client di esecuzione {#execution-clients} +Questo diagramma potrebbe essere obsoleto: vai su [ethernodes.org](https://ethernodes.org) e [clientdiversity.org](https://clientdiversity.org) per informazioni aggiornate. -[Besu](https://www.hyperledger.org/use/besu) +I due grafici a torta qui sopra mostrano istantanee dell'attuale diversità dei client per i livelli di esecuzione e di consenso (al momento della stesura, a ottobre 2025). La diversità dei client è migliorata nel corso degli anni e il livello di esecuzione ha visto una riduzione del dominio da parte di [Geth](https://geth.ethereum.org/), con [Nethermind](https://www.nethermind.io/nethermind-client) al secondo posto a breve distanza, [Besu](https://besu.hyperledger.org/) al terzo ed [Erigon](https://github.com/ledgerwatch/erigon) al quarto, con altri client che costituiscono meno del 3% della rete. Il client più comunemente utilizzato sul livello di consenso, [Lighthouse](https://lighthouse.sigmaprime.io/), è molto vicino al secondo più utilizzato. [Prysm](https://prysmaticlabs.com/#projects) e [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) costituiscono rispettivamente circa il 31% e il 14%, e gli altri client sono usati raramente. -[Nethermind](https://downloads.nethermind.io/) +I dati del livello di esecuzione sono stati ottenuti da [supermajority.info](https://supermajority.info/) il 26 ottobre 2025. I dati per i client di consenso sono stati ottenuti da [Michael Sproul](https://github.com/sigp/blockprint). I dati dei client di consenso sono più difficili da ottenere perché i client del livello di consenso non hanno sempre tracce inequivocabili che possono essere utilizzate per identificarli. I dati sono stati generati utilizzando un algoritmo di classificazione che a volte confonde alcuni dei client di minoranza (vedi [qui](https://twitter.com/sproulM_/status/1440512518242197516) per maggiori dettagli). Nel diagramma sopra, queste classificazioni ambigue sono trattate con un'etichetta o/o (es. Nimbus/Teku). Tuttavia, è chiaro che la maggior parte della rete esegue Prysm. Nonostante siano solo istantanee, i valori nel diagramma forniscono un buon senso generale dello stato attuale della diversità dei client. -[Erigon](https://github.com/ledgerwatch/erigon) +I dati aggiornati sulla diversità dei client per il livello di consenso sono ora disponibili su [clientdiversity.org](https://clientdiversity.org/). -[Go-Ethereum](https://geth.ethereum.org/) +## Livello di esecuzione {#execution-layer} -### Client di consenso {#consensus-clients} +Fino ad ora, la conversazione sulla diversità dei client si è concentrata principalmente sul livello di consenso. Tuttavia, il client di esecuzione [Geth](https://geth.ethereum.org) rappresenta attualmente circa l'85% di tutti i nodi. Questa percentuale è problematica per gli stessi motivi dei client di consenso. Ad esempio, un bug in Geth che influisce sulla gestione delle transazioni o sulla costruzione dei payload di esecuzione potrebbe portare i client di consenso a finalizzare transazioni problematiche o con bug. Pertanto, Ethereum sarebbe più sano con una distribuzione più uniforme dei client di esecuzione, idealmente senza alcun client che rappresenti più del 33% della rete. -[Nimbus](https://nimbus.team/) +## Usa un client di minoranza {#use-minority-client} -[Lighthouse](https://github.com/sigp/lighthouse) +Affrontare la diversità dei client richiede più che i singoli utenti scelgano client di minoranza: richiede che anche le pool di validatori e le istituzioni come le principali dApp e gli exchange cambino client. Tuttavia, tutti gli utenti possono fare la loro parte per correggere l'attuale squilibrio e normalizzare l'uso di tutto il software di Ethereum disponibile. Dopo Il Merge, a tutti gli operatori di nodi sarà richiesto di eseguire un client di esecuzione e un client di consenso. Scegliere combinazioni dei client suggeriti di seguito aiuterà ad aumentare la diversità dei client. -[Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) +### Client di esecuzione {#execution-clients} -[Lodestar](https://github.com/ChainSafe/lodestar) +- [Besu](https://www.hyperledger.org/use/besu) +- [Nethermind](https://downloads.nethermind.io/) +- [Erigon](https://github.com/ledgerwatch/erigon) +- [Go-Ethereum](https://geth.ethereum.org/) +- [Reth](https://reth.rs/) -[Prysm](https://prysm.offchainlabs.com/docs/) +### Client di consenso {#consensus-clients} -[Grandine](https://docs.grandine.io/) +- [Nimbus](https://nimbus.team/) +- [Lighthouse](https://github.com/sigp/lighthouse) +- [Teku](https://consensys.io/teku) +- [Lodestar](https://github.com/ChainSafe/lodestar) +- [Prysm](https://prysm.offchainlabs.com/docs/) +- [Grandine](https://docs.grandine.io/) -Gli utenti tecnici possono aiutare ad accelerare questo processo scrivendo più tutorial e documentazioni per i client di minoranza e incoraggiando i propri peer che eseguono dei nodi a migrare dai client dominanti. Le guide per passare a un client di consenso di minoranza sono disponibili su [clientdiversity.org](https://clientdiversity.org/). +Gli utenti tecnici possono aiutare ad accelerare questo processo scrivendo più tutorial e documentazione per i client di minoranza e incoraggiando i loro colleghi operatori di nodi a migrare dai client dominanti. Le guide per passare a un client di consenso di minoranza sono disponibili su [clientdiversity.org](https://clientdiversity.org/). -## Pannelli di controllo sulla diversità dei client {#client-diversity-dashboards} +## Dashboard sulla diversità dei client {#client-diversity-dashboards} -Diversi pannelli di controllo forniscono statistiche sulla diversità dei client in tempo reale per il livello d'esecuzione e di consenso. +Diverse dashboard forniscono statistiche in tempo reale sulla diversità dei client per il livello di esecuzione e di consenso. **Livello di consenso:** - [Rated.network](https://www.rated.network/) -- [clientdiversity.org](https://clientdiversity.org/) **Livello di esecuzione:** +- [clientdiversity.org](https://clientdiversity.org/) + +**Livello di esecuzione:** - [supermajority.info](https://supermajority.info//) - [Ethernodes](https://ethernodes.org/) @@ -98,14 +119,14 @@ Diversi pannelli di controllo forniscono statistiche sulla diversità dei client ## Letture consigliate {#further-reading} - [Diversità dei client sul livello di consenso di Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) -- [Fusione di Ethereum: esegui il client di maggioranza a tuo rischio!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24 marzo 2022_ -- [Importanza della diversità dei client](https://our.status.im/the-importance-of-client-diversity/) -- [Elenco di servizi di nodi Ethereum](https://ethereumnodes.com/) +- [Il Merge di Ethereum: Esegui il client di maggioranza a tuo rischio e pericolo!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _Dankrad Fiest, 24 marzo 2022_ +- [L'importanza della diversità dei client](https://our.status.im/the-importance-of-client-diversity/) +- [Elenco dei servizi di nodi di Ethereum](https://ethereumnodes.com/) - [I "Cinque Perché" del problema della diversità dei client](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) -- [Diversità di Ethereum e come risolverla (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) +- [La diversità di Ethereum e come risolverla (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) - [clientdiversity.org](https://clientdiversity.org/) ## Argomenti correlati {#related-topics} -- [Eseguire un nodo di Ethereum](/run-a-node/) -- [Nodi e client](/developers/docs/nodes-and-clients/) +- [Esegui un nodo di Ethereum](/run-a-node/) +- [Nodi e client](/developers/docs/nodes-and-clients/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/index.md index 48394a33505..1d1b75ffaca 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/index.md @@ -1,286 +1,290 @@ --- title: Nodi e client -description: Panoramica dei nodi Ethereum e del software client, come configurare un nodo e perché farlo. +description: "Una panoramica dei nodi e dei software client di Ethereum, oltre a come configurare un nodo e perché dovresti farlo." lang: it sidebarDepth: 2 --- -Ethereum è una rete distribuita di computer (noti come nodi) che eseguono software che possono verificare i blocchi e i dati delle transazioni. Il software deve essere eseguito sul tuo computer per trasformarlo in un nodo Ethereum. Ci sono due pezzi di software separati (chiamati "client") necessari per formare un nodo. +[Ethereum](/) è una rete distribuita di computer (noti come nodi) che eseguono software in grado di verificare i blocchi e i dati delle transazioni. Il software deve essere eseguito sul tuo computer per trasformarlo in un nodo di Ethereum. Sono necessari due software separati (noti come 'client') per formare un nodo. ## Prerequisiti {#prerequisites} -Prima di approfondire ed eseguire la tua istanza di un client Ethereum dovresti comprendere il concetto di rete peer-to-peer e le [basi dell'EVM](/developers/docs/evm/). Consulta la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Dovresti comprendere il concetto di rete peer-to-peer e le [basi dell'EVM](/developers/docs/evm/) prima di approfondire ed eseguire la tua istanza di un client di Ethereum. Dai un'occhiata alla nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). -Se sei nuovo al tema dei nodi, consigliamo di leggere prima la nostra introduzione user-friendly su come [eseguire un nodo di Ethereum](/run-a-node). +Se sei nuovo all'argomento dei nodi, ti consigliamo di dare prima un'occhiata alla nostra introduzione intuitiva sull'[eseguire un nodo di Ethereum](/run-a-node). -## Che cosa sono i nodi e i client? {#what-are-nodes-and-clients} +## Cosa sono i nodi e i client? {#what-are-nodes-and-clients} -Un "nodo" è qualsiasi istanza del software del client di Ethereum connessa ad altri computer che stanno anch'essi eseguendo il software di Ethereum, così da formare una rete. Un client è un'implementazione di Ethereum che verifica i dati rispetto alle regole del protocollo e mantiene sicura la rete. Un nodo deve eseguire due client: un client di consenso e un client di esecuzione. +Un "nodo" è qualsiasi istanza del software client di Ethereum connessa ad altri computer che eseguono a loro volta il software di Ethereum, formando una rete. Un client è un'implementazione di Ethereum che verifica i dati rispetto alle regole del protocollo e mantiene sicura la rete. Un nodo deve eseguire due client: un client di consenso e un client di esecuzione. -- Il client di esecuzione (noto anche come il Motore di Esecuzione, client EL o, precedentemente, client di Eth1) attende le nuove transazioni trasmesse nella rete, le esegue nell'EVM e detiene l'ultimo stato e database di tutti i dati correnti di Ethereum. -- Il client di consenso (noto anche come il Nodo Beacon, client CL o, precedentemente, client di Eth2) implementa l'algoritmo di consenso di proof-of-stake, che consente alla rete di raggiungere l'accordo secondo i dati validati dal client di esecuzione. C'è inoltre un terzo pezzo di software, chiamato "validatore" che può essere aggiunto al client di consenso, permettendo al nodo di partecipare alla messa in sicurezza della rete. +- Il client di esecuzione (noto anche come Motore di Esecuzione, client EL o precedentemente client Eth1) ascolta le nuove transazioni trasmesse nella rete, le esegue nell'EVM e conserva l'ultimo stato e il database di tutti i dati attuali di Ethereum. +- Il client di consenso (noto anche come Nodo Beacon, client CL o precedentemente client Eth2) implementa l'algoritmo di consenso proof-of-stake, che consente alla rete di raggiungere un accordo basato sui dati convalidati dal client di esecuzione. Esiste anche un terzo software, noto come 'validatore', che può essere aggiunto al client di consenso, consentendo a un nodo di partecipare alla messa in sicurezza della rete. -I client lavorano assieme per tenere traccia della testa della blockchain Ethereum e permettere agli utenti di interagire con la rete Ethereum. Il design modulare con molte parti di software che cooperano è detto [complessità incapsulata](https://vitalik.eth.limo/general/2022/02/28/complexity.html). Questo approccio ha semplificato l'esecuzione de [La Fusione](/roadmap/merge) senza problemi, permette di mantenere e sviluppare più facilmente il software client, e consente il riutilizzo di client individuali ad esempio nell'[ecosistema di livello 2](/layer-2/). +Questi client lavorano insieme per tenere traccia della testa della catena di Ethereum e consentire agli utenti di interagire con la rete di Ethereum. Il design modulare con più software che lavorano insieme è chiamato [complessità incapsulata](https://vitalik.eth.limo/general/2022/02/28/complexity.html). Questo approccio ha reso più facile eseguire [La Fusione (The Merge)](/roadmap/merge) senza interruzioni, rende il software client più facile da mantenere e sviluppare e consente il riutilizzo dei singoli client, ad esempio, nell'[ecosistema di livello 2](/layer-2/). -![Client di esecuzione e consenso accoppiati](./eth1eth2client.png) Diagramma semplificato di un client di esecuzione e uno di consenso accoppiati. +![Client di esecuzione e di consenso accoppiati](./eth1eth2client.png) +Diagramma semplificato di un client di esecuzione e di consenso accoppiati. ### Diversità dei client {#client-diversity} -Sia i [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) che i [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) esistono in numerosi linguaggi di programmazione sviluppati da diversi team. +Sia i [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) che i [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) esistono in una varietà di linguaggi di programmazione sviluppati da team diversi. -Diverse implementazioni del client possono rafforzare la rete, riducendone la dipendenza da un'unica base di codice. L'obiettivo ideale è raggiungere la diversità senza che nessun client domini la rete, eliminando così eventuali un potenziale punto di errore singolo. La varietà di linguaggi invita inoltre una community di sviluppatori più ampia e consente loro di creare integrazioni nel loro linguaggio preferito. +Molteplici implementazioni di client possono rendere la rete più forte riducendo la sua dipendenza da una singola base di codice. L'obiettivo ideale è raggiungere la diversità senza che alcun client domini la rete, eliminando così un potenziale singolo punto di guasto. +La varietà di linguaggi invita anche una più ampia comunità di sviluppatori e consente loro di creare integrazioni nel loro linguaggio preferito. -Scopri di più sulla [diversità del client](/developers/docs/nodes-and-clients/client-diversity/). +Scopri di più sulla [diversità dei client](/developers/docs/nodes-and-clients/client-diversity/). -Queste implementazioni hanno in comune il fatto di seguire una specifica unica che determina come funziona la rete Ethereum e la blockchain. Ogni dettaglio tecnico è definito e le specifiche si possono trovare come: +Ciò che queste implementazioni hanno in comune è che seguono tutte una singola specifica. Le specifiche dettano il funzionamento della rete e della blockchain di Ethereum. Ogni dettaglio tecnico è definito e le specifiche possono essere trovate come: -- In origine, lo [Yellow Paper di Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf) +- Originariamente, l'[Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) - [Specifiche di esecuzione](https://github.com/ethereum/execution-specs/) - [Specifiche di consenso](https://github.com/ethereum/consensus-specs) -- [EIP](https://eips.ethereum.org/) implementati in vari [aggiornamenti di rete](/ethereum-forks/) +- [EIP](https://eips.ethereum.org/) implementate in vari [aggiornamenti della rete](/ethereum-forks/) -### Monitorare i nodi nella rete {#network-overview} +### Tracciare i nodi nella rete {#network-overview} -Diversi tracker offrono una panoramica in tempo reale dei nodi nella rete Ethereum. Si noti che a causa della natura delle reti decentralizzate, questi crawler possono fornire solo una vista limitata della rete e potrebbero riportare risultati differenti. +Molteplici tracker offrono una panoramica in tempo reale dei nodi nella rete di Ethereum. Nota che, a causa della natura delle reti decentralizzate, questi crawler possono fornire solo una visione limitata della rete e potrebbero riportare risultati diversi. - [Mappa dei nodi](https://etherscan.io/nodetracker) di Etherscan - [Ethernodes](https://ethernodes.org/) di Bitfly -- [Nodewatch](https://www.nodewatch.io/) di Chainsafe, crawling dei nodi di consenso -- [Monitoreth](https://monitoreth.io/), di MigaLabs, uno strumento di monitoraggio della rete distribuito +- [Nodewatch](https://www.nodewatch.io/) di Chainsafe, che scansiona i nodi di consenso +- [Monitoreth](https://monitoreth.io/) - di MigaLabs, uno strumento di monitoraggio della rete distribuita +- [Report settimanali sulla salute della rete](https://probelab.io) - di ProbeLab, che utilizza il [crawler Nebula](https://github.com/dennis-tra/nebula) e altri strumenti -## Tipologie di nodo {#node-types} +## Tipi di nodo {#node-types} -Se desideri [eseguire il tuo nodo](/developers/docs/nodes-and-clients/run-a-node/), dovresti capire che ne esistono di diversi tipi che consumano i dati in maniera diversa. I client possono eseguire tre diversi tipi di nodi: leggero, completo e archivio. Esistono anche diverse strategie di sincronizzazione per velocizzare i tempi. La sincronizzazione è la velocità con cui si ottengono le informazioni più aggiornate sullo stato di Ethereum. +Se desideri [eseguire il tuo nodo](/developers/docs/nodes-and-clients/run-a-node/), dovresti comprendere che esistono diversi tipi di nodo che consumano i dati in modo diverso. Infatti, i client possono eseguire tre diversi tipi di nodi: leggeri (light), completi (full) e di archivio (archive). Ci sono anche opzioni per diverse strategie di sincronizzazione che consentono tempi di sincronizzazione più rapidi. La sincronizzazione si riferisce alla rapidità con cui può ottenere le informazioni più aggiornate sullo stato di Ethereum. ### Nodo completo {#full-node} -I nodi completi fanno una validazione blocco per blocco della blockchain, incluso il download e la verifica del corpo del blocco e i dati di stato per ogni blocco. Ci sono classi differenti di nodo completo - alcune iniziano dal blocco genesi e verificano ogni singolo blocco nell'intera cronologia della blockchain. Altre iniziano la loro verifica da un blocco più recente di cui confidano essere valido (ad es. "sincronizzazione snap" di Geth). Indipendentemente da dove parta la verifica, i nodi completi tengono solo una copia locale di dati relativamente recenti (tipicamente i 128 blocchi più recenti), permettendo di eliminare i dati più vecchi per risparmiare spazio sul disco. I dati più vecchi possono essere rigenerati quando è necessario. +I nodi completi eseguono una convalida blocco per blocco della blockchain, includendo il download e la verifica del corpo del blocco e dei dati di stato per ogni blocco. Esistono diverse classi di nodi completi: alcuni partono dal blocco genesi e verificano ogni singolo blocco nell'intera cronologia della blockchain. Altri iniziano la loro verifica da un blocco più recente che ritengono valido (ad es. la 'snap sync' di Geth). Indipendentemente da dove inizia la verifica, i nodi completi conservano solo una copia locale di dati relativamente recenti (in genere i 128 blocchi più recenti), consentendo l'eliminazione dei dati più vecchi per risparmiare spazio su disco. I dati più vecchi possono essere rigenerati quando necessario. -- Memorizza i dati completi della blockchain (sebbene siano periodicamente ridotti così che un nodo completo non memorizzi tutti i dati dalla genesi) +- Archivia i dati completi della blockchain (sebbene questi vengano periodicamente potati, in modo che un nodo completo non archivi tutti i dati di stato fino alla genesi). - Partecipa alla convalida dei blocchi, verifica tutti i blocchi e gli stati. -- Tutti gli stati possono essere recuperati dalla memoria locale o rigenerati da "istantanee" da un nodo completo. -- È al servizio della rete e fornisce dati su richiesta. +- Tutti gli stati possono essere recuperati dall'archiviazione locale o rigenerati da 'snapshot' (istantanee) da un nodo completo. +- Serve la rete e fornisce dati su richiesta. -### Nodo archivio {#archive-node} +### Nodo di archivio {#archive-node} -I nodi archivio sono nodi completi che verificano ogni blocco da quello genesi e non eliminano mai nessuno dei dati scaricati. +I nodi di archivio sono nodi completi che verificano ogni blocco dalla genesi e non eliminano mai nessuno dei dati scaricati. -- Memorizza tutto ciò che è presente nel nodo completo e crea un archivio degli stati storici. È necessario se desideri consultare qualcosa come il saldo di un conto al blocco #4.000.000 o testare in modo semplice e affidabile le tue serie di transazioni, senza minarle usando il tracciamento. -- Si tratta di terabyte e terabyte di dati, che rendono i nodi archivio meno attraenti per gli utenti medi, ma possono essere utili per servizi come block explorer, fornitori di portafogli e analisi della catena. +- Archivia tutto ciò che è conservato nel nodo completo e costruisce un archivio degli stati storici. È necessario se si desidera interrogare qualcosa come il saldo di un account al blocco #4.000.000, o semplicemente testare in modo affidabile il proprio set di transazioni senza convalidarle utilizzando il tracciamento. +- Questi dati rappresentano unità di terabyte, il che rende i nodi di archivio meno attraenti per gli utenti medi, ma possono essere utili per servizi come esploratori di blocchi, fornitori di portafogli e analisi della catena. -La sincronizzazione dei client in qualsiasi modalità diversa dall'archivio comporterà l'eliminazione dei dati della blockchain. Significa che non rimarrà un archivio di tutti gli stati storici, ma il nodo completo è in grado di ricostruirli su richiesta. +La sincronizzazione dei client in qualsiasi modalità diversa dall'archivio comporterà la potatura dei dati della blockchain. Ciò significa che non esiste un archivio di tutti gli stati storici, ma il nodo completo è in grado di costruirli su richiesta. -Scopri di più sui [Nodi archivio](/developers/docs/nodes-and-clients/archive-nodes). +Scopri di più sui [Nodi di archivio](/developers/docs/nodes-and-clients/archive-nodes). ### Nodo leggero {#light-node} -Invece di scaricare ogni blocco, i nodi leggeri scaricano solo le intestazioni dei blocchi. Queste contengono le informazioni sommarie sui contenuti dei blocchi. Ogni altra informazione di cui i nodi leggeri hanno bisogno viene richiesta a un nodo completo. Il nodo leggero può quindi verificare in modo indipendente i dati che riceve rispetto alle radici di stato nelle intestazioni dei blocchi. I nodi leggeri consentono agli utenti di partecipare alla rete Ethereum senza l'hardware potente o l'elevata larghezza di banda necessari per eseguire i nodi completi. Infine, i nodi leggeri potrebbero funzionare su telefoni cellulari o dispositivi embedded. I nodi leggeri non partecipano al consenso (es. non possono essere validatori/miner), ma possono accedere alla blockchain di Ethereum con la stessa sicurezza e avendo le stesse funzioni garantite ai nodi completi. +Invece di scaricare ogni blocco, i nodi leggeri scaricano solo le intestazioni dei blocchi. Queste intestazioni contengono informazioni riassuntive sul contenuto dei blocchi. Qualsiasi altra informazione richiesta dal nodo leggero viene richiesta a un nodo completo. Il nodo leggero può quindi verificare in modo indipendente i dati che riceve rispetto alle radici di stato nelle intestazioni dei blocchi. I nodi leggeri consentono agli utenti di partecipare alla rete di Ethereum senza il potente hardware o l'elevata larghezza di banda richiesti per eseguire i nodi completi. In futuro, i nodi leggeri potrebbero essere eseguiti su telefoni cellulari o dispositivi integrati. I nodi leggeri non partecipano al consenso (cioè, non possono essere validatori), ma possono accedere alla blockchain di Ethereum con le stesse funzionalità e garanzie di sicurezza di un nodo completo. -I client leggeri sono un'area di sviluppo attivo per Ethereum, e ci aspettiamo presto di vedere nuovi client leggeri per i livelli di consenso e i livelli di esecuzione. Esistono anche dei percorsi potenziali per fornire i dati dei client leggeri sulla [rete di gossip](https://www.ethportal.net/). Questi sono vantaggiosi perché la rete di gossip potrebbe supportare una rete di nodi leggeri senza richiedere ai nodi completi di rispondere alle richieste. +I client leggeri sono un'area di sviluppo attivo per Ethereum e ci aspettiamo di vedere presto nuovi client leggeri per il livello di consenso e il livello di esecuzione. +Ci sono anche percorsi potenziali per fornire dati ai client leggeri attraverso la [rete gossip](https://www.ethportal.net/). Questo è vantaggioso perché la rete gossip potrebbe supportare una rete di nodi leggeri senza richiedere ai nodi completi di servire le richieste. -Ethereum non supporta ancora una grande popolazione di nodi leggeri, ma il supporto dei nodi leggeri è un'area in cui si prevede uno sviluppo rapido nel futuro più prossimo. In particolare, client come [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios), and [LodeStar](https://lodestar.chainsafe.io/) sono attualmente fortemente focalizzati sui nodi leggeri. +Ethereum non supporta ancora una vasta popolazione di nodi leggeri, ma il supporto per i nodi leggeri è un'area che si prevede si svilupperà rapidamente nel prossimo futuro. In particolare, client come [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios) e [LodeStar](https://lodestar.chainsafe.io/) sono attualmente fortemente concentrati sui nodi leggeri. -## Perché si dovrebbe eseguire un nodo Ethereum? {#why-should-i-run-an-ethereum-node} +## Perché dovrei eseguire un nodo di Ethereum? {#why-should-i-run-an-ethereum-node} -L'esecuzione di un nodo consente di utilizzare Ethereum in modo diretto, affidabile e privato, supportando la rete tenendola più solida e decentralizzata. +L'esecuzione di un nodo ti consente di utilizzare Ethereum in modo diretto, senza fiducia (trustless) e privato, supportando al contempo la rete mantenendola più robusta e decentralizzata. -### Vantaggi per lo sviluppatore {#benefits-to-you} +### Vantaggi per te {#benefits-to-you} -Eseguire un nodo permette di utilizzare Ethereum in modo privato, autosufficiente e senza fiducia. Non devi fidarti della rete, perché puoi verificare i dati da solo col tuo client. "Non fidarti, verifica" è un popolare mantra della blockchain. +Eseguire il tuo nodo ti consente di utilizzare Ethereum in modo privato, autosufficiente e senza fiducia. Non hai bisogno di fidarti della rete perché puoi verificare i dati tu stesso con il tuo client. "Non fidarti, verifica" è un popolare mantra della blockchain. -- Il nodo verifica in autonomia tutte le transazioni e i blocchi in base alle regole del consenso. Significa che non si deve fare affidamento su altri nodi della rete né fidarti completamente di loro. -- Puoi usare un portafoglio Ethereum col tuo nodo. Puoi usare le dapp con maggiore sicurezza e privacy, perché non dovrai comunicare i tuoi indirizzi e saldi a intermediari. Tutto può essere controllato con il tuo client. [MetaMask](https://metamask.io), [Frame](https://frame.sh/)e [molti altri portafogli](/wallets/find-wallet/) offrono l'importazione RPC, consentendo loro di usare il tuo nodo. -- Puoi eseguire e hostare tu stesso altri servizi che dipendono dai dati provenienti da Ethereum. Ad esempio, questi potrebbero essere un validatore della Beacon Chain, software come il livello 2, infrastruttura, block explorer, società di servizi di pagamento, ecc. -- Puoi fornire i tuoi [endpoint RPC](/developers/docs/apis/json-rpc/) personalizzati. Potresti anche offrire questi endpoint pubblicamente alla community per aiutarli a evitare i grandi provider centralizzati. -- Puoi connetterti al tuo nodo usando le **Comunicazioni interprecessuali (IPC)** o riscrivere il nodo per caricare il tuo programma come plugin. Ciò conferisce una bassa latenza, il che aiuta molto ad esempio quando si elaborano molti dati usando le librerie web3 o quando ti serve sostituire le tue transazioni il più velocemente possibile (frontrunning). -- Puoi mettere ETH direttamente in staking per proteggere la rete e guadagnare ricompense. Per iniziare, vedi lo [staking in autonomia](/staking/solo/). +- Il tuo nodo verifica da solo tutte le transazioni e i blocchi rispetto alle regole di consenso. Ciò significa che non devi fare affidamento su nessun altro nodo nella rete o fidarti completamente di loro. +- Puoi utilizzare un portafoglio di Ethereum con il tuo nodo. Puoi utilizzare le dApp in modo più sicuro e privato perché non dovrai far trapelare i tuoi indirizzi e saldi agli intermediari. Tutto può essere controllato con il tuo client. [MetaMask](https://metamask.io), [Frame](https://frame.sh/) e [molti altri portafogli](/wallets/find-wallet/) offrono l'importazione RPC, consentendo loro di utilizzare il tuo nodo. +- Puoi eseguire e auto-ospitare altri servizi che dipendono dai dati di Ethereum. Ad esempio, potrebbe trattarsi di un validatore della Beacon Chain, software come il livello 2, infrastrutture, esploratori di blocchi, processori di pagamento, ecc. +- Puoi fornire i tuoi [endpoint RPC](/developers/docs/apis/json-rpc/) personalizzati. Potresti persino offrire questi endpoint pubblicamente alla comunità per aiutarli a evitare i grandi fornitori centralizzati. +- Puoi connetterti al tuo nodo utilizzando le **Comunicazioni Inter-processo (IPC)** o riscrivere il nodo per caricare il tuo programma come plugin. Questo garantisce una bassa latenza, che aiuta molto, ad es., quando si elaborano molti dati utilizzando le librerie web3 o quando è necessario sostituire le transazioni il più velocemente possibile (cioè, frontrunning). +- Puoi fare staking di ETH direttamente per proteggere la rete e guadagnare ricompense. Consulta lo [staking in solitaria](/staking/solo/) per iniziare. -![Come accedere a Ethereum tramite un'applicazione e i nodi](./nodes.png) +![Come accedi a Ethereum tramite la tua applicazione e i nodi](./nodes.png) ### Vantaggi per la rete {#network-benefits} -Avere una serie diversificata di nodi è importante per l'integrità, la sicurezza e la resilienza operativa di Ethereum. +Un insieme diversificato di nodi è importante per la salute, la sicurezza e la resilienza operativa di Ethereum. -- I nodi completi applicano le regole di consenso e quindi non possono essere ingannati ad accettare blocchi che non li seguono. Questo fornisce ulteriore sicurezza nella rete, perché se tutti i nodi fossero leggeri, cioè non effettuassero una verifica completa, i validatori potrebbero attaccare la rete. -- Nel caso di un attacco che superi le difese cripto-economiche del [Proof of Stake](/developers/docs/consensus-mechanisms/pos/#what-is-pos), può essere eseguito un recupero sociale dai nodi completi che scelgono di seguire la catena onesta. -- Più nodi sulla rete risultano in una rete più diversificata e robusta, l'obiettivo ultimo della decentralizzazione, che consente un sistema resistente alla censura e affidabile. -- I nodi completi forniscono accesso ai dati della blockchain per i client leggeri che dipendono da essa. I nodi leggeri non memorizzano l'intera blockchain, bensì verificano i dati attraverso le [radici di stato nelle intestazioni dei blocchi](/developers/docs/blocks/#block-anatomy). Se ne hanno bisogno, possono richiedere ulteriori informazioni ai nodi completi. +- I nodi completi applicano le regole di consenso in modo da non poter essere ingannati ad accettare blocchi che non le seguono. Questo fornisce ulteriore sicurezza nella rete perché se tutti i nodi fossero nodi leggeri, che non eseguono una verifica completa, i validatori potrebbero attaccare la rete. +- In caso di un attacco che superi le difese cripto-economiche della [prova di stake (proof-of-stake)](/developers/docs/consensus-mechanisms/pos/#what-is-pos), un recupero sociale può essere eseguito dai nodi completi che scelgono di seguire la catena onesta. +- Più nodi nella rete si traducono in una rete più diversificata e robusta, l'obiettivo finale della decentralizzazione, che consente un sistema resistente alla censura e affidabile. +- I nodi completi forniscono l'accesso ai dati della blockchain per i client leggeri che ne dipendono. I nodi leggeri non archiviano l'intera blockchain, ma verificano i dati tramite le [radici di stato nelle intestazioni dei blocchi](/developers/docs/blocks/#block-anatomy). Possono richiedere maggiori informazioni ai nodi completi se ne hanno bisogno. -Se si esegue un nodo completo, l'intera rete Ethereum ne beneficia, anche se non si esegue un validatore. +Se esegui un nodo completo, l'intera rete di Ethereum ne trae vantaggio, anche se non esegui un validatore. -## Esecuzione di un nodo proprio {#running-your-own-node} +## Eseguire il tuo nodo {#running-your-own-node} -Vorresti eseguire il tuo client di Ethereum? +Ti interessa eseguire il tuo client di Ethereum? -Per un'introduzione per principianti, visita la nostra pagina [eseguire un nodo](/run-a-node) per saperne di più. +Per un'introduzione adatta ai principianti, visita la nostra pagina [eseguire un nodo](/run-a-node) per saperne di più. Se sei un utente più tecnico, approfondisci i dettagli e le opzioni su come [avviare il tuo nodo](/developers/docs/nodes-and-clients/run-a-node/). ## Alternative {#alternatives} -Configurare un nodo può richiedere tempo e risorse e non sempre è necessario eseguire un'istanza propria. In questo caso, puoi usare un provider di API terzo. Per una panoramica sull'uso di questi servizi, dai un'occhiata a [nodi come servizi](/developers/docs/nodes-and-clients/nodes-as-a-service/). +Configurare il tuo nodo può costarti tempo e risorse, ma non hai sempre bisogno di eseguire la tua istanza. In questo caso, puoi utilizzare un fornitore di API di terze parti. Per una panoramica sull'utilizzo di questi servizi, dai un'occhiata ai [nodi come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service/). -Se qualcuno esegue un nodo Ethereum con un'API pubblica nella tua community, puoi puntare i tuoi portafogli a un nodo della community tramite RPC personalizzato e ottenere più privacy rispetto a terze parti casuali affidabili. +Se qualcuno esegue un nodo di Ethereum con un'API pubblica nella tua comunità, puoi puntare i tuoi portafogli a un nodo della comunità tramite RPC personalizzato e ottenere maggiore privacy rispetto a una terza parte fidata casuale. -D'altro canto, se esegui un client, puoi condividerlo con i amici che potrebbero averne bisogno. +D'altra parte, se esegui un client, puoi condividerlo con i tuoi amici che potrebbero averne bisogno. ## Client di esecuzione {#execution-clients} -La community di Ethereum mantiene numerosi client di esecuzione open source (precedentemente noti come 'client di Eth1' o semplicemente 'client di Ethereum'), sviluppati da diversi team usando diversi linguaggi di programmazione. Questo rafforza la rete e la rende più [diversificata](/developers/docs/nodes-and-clients/client-diversity/). L'obiettivo ideale è raggiungere la diversità senza che nessun client prevalga, per ridurre eventuali punti di errore singoli. +La comunità di Ethereum mantiene molteplici client di esecuzione open source (precedentemente noti come 'client Eth1', o semplicemente 'client di Ethereum'), sviluppati da team diversi utilizzando linguaggi di programmazione diversi. Questo rende la rete più forte e più [diversificata](/developers/docs/nodes-and-clients/client-diversity/). L'obiettivo ideale è raggiungere la diversità senza che alcun client domini per ridurre eventuali singoli punti di guasto. -Questa tabella riepiloga i diversi client. Tutti superano i [test dei client](https://github.com/ethereum/tests) e sono mantenuti attivamente per rimanere al passo con gli aggiornamenti di rete. +Questa tabella riassume i diversi client. Tutti superano i [test dei client](https://github.com/ethereum/tests) e sono attivamente mantenuti per rimanere aggiornati con gli aggiornamenti della rete. -| Client | Linguaggio | Sistemi operativi | Reti | Strategie di sincronizzazione | Cancellazione dello stato | -| ------------------------------------------------------------------------ | ---------- | --------------------- | --------------------------------- | ------------------------------------------------------------------- | ------------------------- | -| [Geth](https://geth.ethereum.org/) | Vai | Linux, Windows, macOS | Rete Principale, Sepolia, Holesky | [Snap](#snap-sync), [Completa](#full-sync) | Archiviata, Tagliata | -| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, macOS | Rete Principale, Sepolia, Holesky | [Snap](#snap-sync) (senza servizio), Veloce, [Completa](#full-sync) | Archiviata, Tagliata | -| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, macOS | Rete Principale, Sepolia, Holesky | [Snap](#snap-sync), [Veloce](#fast-sync), [Completa](#full-sync) | Archiviata, Tagliata | -| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, macOS | Rete Principale, Sepolia, Holesky | [Completa](#full-sync) | Archiviata, Tagliata | -| [Reth](https://reth.rs/) | Rust | Linux, Windows, macOS | Rete Principale, Sepolia, Holesky | [Completa](#full-sync) | Archiviata, Tagliata | -| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(beta)_ | TypeScript | Linux, Windows, macOS | Sepolia, Holesky | [Completa](#full-sync) | Tagliata | +| Client | Linguaggio | Sistemi operativi | Reti | Strategie di sincronizzazione | Potatura dello stato | +| ------------------------------------------------------------------------ | ---------- | --------------------- | ------------------------- | -------------------------------------------------------------- | -------------------- | +| [Geth](https://geth.ethereum.org/) | Go | Linux, Windows, macOS | Rete principale, Sepolia, Hoodi | [Snap](#snap-sync), [Completa](#full-sync) | Archivio, Potato | +| [Nethermind](https://www.nethermind.io/) | C#, .NET | Linux, Windows, macOS | Rete principale, Sepolia, Hoodi | [Snap](#snap-sync) (senza servire), Veloce, [Completa](#full-sync) | Archivio, Potato | +| [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, macOS | Rete principale, Sepolia, Hoodi | [Snap](#snap-sync), [Veloce](#fast-sync), [Completa](#full-sync) | Archivio, Potato | +| [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, macOS | Rete principale, Sepolia, Hoodi | [Completa](#full-sync) | Archivio, Potato | +| [Reth](https://reth.rs/) | Rust | Linux, Windows, macOS | Rete principale, Sepolia, Hoodi | [Completa](#full-sync) | Archivio, Potato | +| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(beta)_ | TypeScript | Linux, Windows, macOS | Sepolia, Hoodi | [Completa](#full-sync) | Potato | -Per ulteriori informazioni sulle reti supportate, consulta [reti Ethereum](/developers/docs/networks/). +Per ulteriori informazioni sulle reti supportate, leggi le [reti di Ethereum](/developers/docs/networks/). -Ogni client ha vantaggi e casi d'uso differenti, quindi è necessario sceglierne uno in base alle proprie preferenze. La diversità consente implementazioni in base alle diverse caratteristiche e al pubblico di utenti. È consigliabile scegliere un client in base a funzionalità, supporto, linguaggio di programmazione o licenze. +Ogni client ha casi d'uso e vantaggi unici, quindi dovresti sceglierne uno in base alle tue preferenze. La diversità consente alle implementazioni di concentrarsi su diverse funzionalità e segmenti di pubblico. Potresti voler scegliere un client in base a funzionalità, supporto, linguaggio di programmazione o licenze. ### Besu {#besu} -Hyperledger Besu è un client Ethereum di livello aziendale per le reti pubbliche e autorizzate. Esegue tutte le funzionalità della Rete principale di Ethereum, dal monitoraggio a GraphQL, ha un monitoraggio avanzato ed è supportato da ConsensSys, entrambi in canali aperti della community e tramite SLA commerciali per le imprese. È scritto in Java con licenza Apache 2.0. +Hyperledger Besu è un client di Ethereum di livello aziendale per reti pubbliche e autorizzate. Esegue tutte le funzionalità della rete principale di Ethereum, dal tracciamento a GraphQL, dispone di un monitoraggio esteso ed è supportato da ConsenSys, sia nei canali aperti della comunità che tramite SLA commerciali per le imprese. È scritto in Java ed è concesso in licenza Apache 2.0. -L'ampia [documentazione](https://besu.hyperledger.org/en/stable/) di Besu ti guiderà verso tutti i dettagli delle sue funzioni e configurazioni. +L'ampia [documentazione](https://besu.hyperledger.org/en/stable/) di Besu ti guiderà attraverso tutti i dettagli sulle sue funzionalità e configurazioni. ### Erigon {#erigon} -Erigon, precedentemente noto come Turbo-Geth, è nato come una diramazione di Go Ethereum orientata alla velocità e all'efficienza dello spazio su disco. Erigon è un'implementazione completamente riprogettata di Ethereum, correntemente scritta in Go, ma con implementazioni in altri linguaggi in via di sviluppo. L'obiettivo di Erigon è fornire un'implementazione più veloce, modulare e ottimizzata di Ethereum. Può eseguire una sincronizzazione completa del nodo archivio usando circa 2TB di spazio su disco, in meno di 3 giorni. +Erigon, precedentemente noto come Turbo-Geth, è iniziato come una biforcazione (fork) di Go Ethereum orientata alla velocità e all'efficienza dello spazio su disco. Erigon è un'implementazione di Ethereum completamente riprogettata, attualmente scritta in Go ma con implementazioni in altri linguaggi in fase di sviluppo. L'obiettivo di Erigon è fornire un'implementazione di Ethereum più veloce, più modulare e più ottimizzata. Può eseguire una sincronizzazione completa del nodo di archivio utilizzando circa 2 TB di spazio su disco, in meno di 3 giorni. ### Go Ethereum {#geth} -Go Ethereum (abbreviato Geth) è una delle implementazioni originali del protocollo Ethereum. Attualmente, è il client più diffuso con la più grande base di utenti e varietà di strumenti per utenti e sviluppatori. È scritto in Go, completamente open source e concesso in licenza con GNU LGPL v3. +Go Ethereum (Geth in breve) è una delle implementazioni originali del protocollo di Ethereum. Attualmente, è il client più diffuso con la più grande base di utenti e varietà di strumenti per utenti e sviluppatori. È scritto in Go, completamente open source e concesso in licenza sotto la GNU LGPL v3. -Scopri di più su Geth nella sua [documentazione](https://geth.ethereum.org/docs/). +Scopri di più su Geth nella sua [documentazione](https://geth.ethereum.org/docs). ### Nethermind {#nethermind} -Nethermind è un'implementazione di Ethereum creata con lo stack tecnologico C # .NET, concessa in licenza con LGPL-3.0, in esecuzione su tutte le principali piattaforme, incluso ARM. Offre prestazioni eccellenti con: +Nethermind è un'implementazione di Ethereum creata con lo stack tecnologico C# .NET, con licenza LGPL-3.0, in esecuzione su tutte le principali piattaforme incluso ARM. Offre ottime prestazioni con: - una macchina virtuale ottimizzata - accesso allo stato -- networking e funzionalità avanzate come pannelli di controllo Prometheus/Graphana, supporto per la registrazione aziendale seq, tracciamento RPC-JSON e plug-in di analisi. +- rete e ricche funzionalità come dashboard Prometheus/Grafana, supporto per la registrazione aziendale seq, tracciamento JSON-RPC e plugin di analisi. -Inoltre, Nethermind vanta una [documentazione dettagliata](https://docs.nethermind.io), un efficace supporto per gli sviluppatori, una community online e un supporto disponibile 24 ore al giorno, 7 giorni su 7 per gli utenti premium. +Nethermind ha anche una [documentazione dettagliata](https://docs.nethermind.io), un forte supporto per gli sviluppatori, una comunità online e supporto 24/7 disponibile per gli utenti premium. ### Reth {#reth} -Reth (abbreviazione di Rust Ethereum) è un'implementazione a nodo completo su Ethereum incentrata sull'essere facile da utilizzare, altamente modulare, veloce ed efficiente. Originariamente Reth era stata costruita e portata avanti da Paradigm, ed è concessa in licenza sotto licenze Apache e MIT. +Reth (abbreviazione di Rust Ethereum) è un'implementazione di nodo completo di Ethereum incentrata sull'essere facile da usare, altamente modulare, veloce ed efficiente. Reth è stato originariamente costruito e portato avanti da Paradigm ed è concesso in licenza con le licenze Apache e MIT. -Reth è pronta per la produzione e adatta per l'utilizzo in ambienti di importanza critica come staking o servizi con tempi di attività elevati. Funziona bene nei casi d'uso in cui sono richieste prestazioni elevate con ampi margini come RPC, MEV, indicizzazione, simulazioni e attività P2P. +Reth è pronto per la produzione e adatto all'uso in ambienti mission-critical come lo staking o i servizi ad alto tempo di attività. Si comporta bene nei casi d'uso in cui sono richieste prestazioni elevate con ampi margini come RPC, MEV, indicizzazione, simulazioni e attività P2P. -Scopri di più consultando il [Reth Book](https://reth.rs/) o la [repository Reth in GitHub](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth). +Scopri di più consultando il [Reth Book](https://reth.rs/) o il [repository GitHub di Reth](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth). ### In fase di sviluppo {#execution-in-development} -Questi client sono ancora nelle prime fasi di sviluppo e non sono ancora consigliate per l'utilizzo in produzione. +Questi client sono ancora nelle prime fasi di sviluppo e non sono ancora raccomandati per l'uso in produzione. #### EthereumJS {#ethereumjs} -Il client di esecuzione di EthereumJS è scritto in TypeScript e composto da svariati pacchetti, inclusi i primitivi essenziali di Ethereum rappresentati dalle classi Blocco, Transazione e Albero di Merkle-Patricia, e i componenti essenziali dei client, inclusa un'implementazione della Macchina Virtuale di Ethereum (EVM), una classe della blockchain e lo stack di rete di DevP2P. +Il client di esecuzione EthereumJS (EthereumJS) è scritto in TypeScript ed è composto da una serie di pacchetti, tra cui le primitive principali di Ethereum rappresentate dalle classi Block, Transaction e Merkle-Patricia Trie e i componenti principali del client, tra cui un'implementazione della macchina virtuale di Ethereum (EVM), una classe blockchain e lo stack di rete DevP2P. Scopri di più leggendo la sua [documentazione](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) ## Client di consenso {#consensus-clients} -Esistono diversi client di consenso (precedentemente noti come client di "Eth2") per supportare gli [aggiornamenti del consenso](/roadmap/beacon-chain/). Sono responsabili per tutta la logica collegata al consenso, incluso l'algoritmo di scelta della diramazione, l'elaborazione di attestazioni e la gestione di ricompense e sanzioni [proof-of-stake](/developers/docs/consensus-mechanisms/pos). +Esistono molteplici client di consenso (precedentemente noti come client 'Eth2') per supportare gli [aggiornamenti del consenso](/roadmap/beacon-chain/). Sono responsabili di tutta la logica relativa al consenso, incluso l'algoritmo di scelta della biforcazione, l'elaborazione delle attestazioni e la gestione delle ricompense e delle penalità della [prova di stake (proof-of-stake)](/developers/docs/consensus-mechanisms/pos). -| Client | Lingua | Sistemi operativi | Reti | -| ------------------------------------------------------------- | ---------- | --------------------- | --------------------------------------------------------------- | -| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Goerli, Pyrmont, Sepolia, Ropsten e altre | -| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, Ropsten e altre | -| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia, Ropsten e altre | -| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, macOS | Beacon Chain, Gnosis, Goerli, Pyrmont, Sepolia, Ropsten e altre | -| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, macOS | Beacon Chain, Gnosis, Goerli, Sepolia, Ropsten e altre | -| [Grandine](https://docs.grandine.io/) (beta) | Rust | Linux, Windows, macOS | Beacon Chain, Goerli, Sepolia e altre | +| Client | Linguaggio | Sistemi operativi | Reti | +| ------------------------------------------------------------- | ---------- | --------------------- | --------------------------------------------------------- | +| [Lighthouse](https://lighthouse.sigmaprime.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Hoodi, Pyrmont, Sepolia e altre | +| [Lodestar](https://lodestar.chainsafe.io/) | TypeScript | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia e altre | +| [Nimbus](https://nimbus.team/) | Nim | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia e altre | +| [Prysm](https://prysm.offchainlabs.com/docs/) | Go | Linux, Windows, macOS | Beacon Chain, Gnosis, Hoodi, Pyrmont, Sepolia e altre | +| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | Java | Linux, Windows, macOS | Beacon Chain, Gnosis, Hoodi, Sepolia e altre | +| [Grandine](https://docs.grandine.io/) | Rust | Linux, Windows, macOS | Beacon Chain, Hoodi, Sepolia e altre | ### Lighthouse {#lighthouse} -Lighthouse è un'implementazione del client di consenso scritta in Rust sotto la licenza Apache-2.0. È mantenuta da Sigma Prime ed è stabile e pronta alla produzione sin dalla genesi della Beacon Chain. È affidata a varie imprese, pool di staking e singoli individui. Mira a essere sicura, performante e interoperabile in una vasta gamma di ambienti, da PC desktop a distribuzioni automatizzate sofisticate. +Lighthouse è un'implementazione di client di consenso scritta in Rust sotto la licenza Apache-2.0. È mantenuta da Sigma Prime ed è stabile e pronta per la produzione fin dalla genesi della Beacon Chain. È utilizzata da varie imprese, pool di staking e individui. Mira a essere sicura, performante e interoperabile in un'ampia gamma di ambienti, dai PC desktop a sofisticate distribuzioni automatizzate. -La documentazione è consultabile nel [Libro su Lighthouse](https://lighthouse-book.sigmaprime.io/) +La documentazione può essere trovata nel [Lighthouse Book](https://lighthouse-book.sigmaprime.io/) ### Lodestar {#lodestar} -Lodestar è un'implementazione del client di consenso pronta alla produzione, scritta in Typescript sotto la licenza LGPL-3.0. È mantenuta da ChainSafe Systems ed è il più nuovo dei client di consenso per gli staker in autonomia, gli sviluppatori e i ricercatori. Lodestar consiste in un nodo beacon e un client del validatore, alimentato dalle implementazioni in JavaScript dei protocolli di Ethereum. Lodestar mira a migliorare l'utilizzabilità di Ethereum con client leggeri, espandere l'accessibilità a un gruppo più ampio di sviluppatori e contribuire ulteriormente alla diversità dell'ecosistema. +Lodestar è un'implementazione di client di consenso pronta per la produzione scritta in Typescript sotto la licenza LGPL-3.0. È mantenuta da ChainSafe Systems ed è il più recente dei client di consenso per staker in solitaria, sviluppatori e ricercatori. Lodestar è costituito da un nodo beacon e da un client validatore alimentati da implementazioni JavaScript dei protocolli di Ethereum. Lodestar mira a migliorare l'usabilità di Ethereum con i client leggeri, espandere l'accessibilità a un gruppo più ampio di sviluppatori e contribuire ulteriormente alla diversità dell'ecosistema. -Maggiori informazioni si possono trovare sul nostro [sito web di Lodestar](https://lodestar.chainsafe.io/) +Maggiori informazioni possono essere trovate sul [sito web di Lodestar](https://lodestar.chainsafe.io/) ### Nimbus {#nimbus} -Nimbus è un'implementazione del client di consenso scritta in Nim sotto la licenza Apache-2.0. È un client pronto alla produzione in uso dagli staker in autonomia e dai pool di staking. Nimbus è progettato per l'efficienza delle risorse, rendendo facile l'esecuzione sui dispositivi con risorse limitate e le infrastrutture aziendali con uguale facilità, senza compromettere la stabilità o ricompensare le prestazioni. Un'impronta di risorse più leggera fa sì che il client abbia un maggiore margine di sicurezza quando la rete è sotto stress. +Nimbus è un'implementazione di client di consenso scritta in Nim sotto la licenza Apache-2.0. È un client pronto per la produzione in uso da staker in solitaria e pool di staking. Nimbus è progettato per l'efficienza delle risorse, rendendo facile l'esecuzione su dispositivi con risorse limitate e infrastrutture aziendali con la stessa facilità, senza compromettere la stabilità o le prestazioni delle ricompense. Un'impronta di risorse più leggera significa che il client ha un maggiore margine di sicurezza quando la rete è sotto stress. Scopri di più nella [documentazione di Nimbus](https://nimbus.guide/) ### Prysm {#prysm} -Prysm è un client di consenso completo e open source scritto in Go sotto la licenza GPL-3.0. Dispone di un'UI webapp facoltativa e da' priorità all'esperienza dell'utente, alla documentazione e alla configurabilità sia per gli utenti di staking domestico che per quelli istituzionali. +Prysm è un client di consenso open source completo scritto in Go sotto la licenza GPL-3.0. Dispone di un'interfaccia utente webapp opzionale e dà priorità all'esperienza utente, alla documentazione e alla configurabilità sia per gli utenti che fanno staking da casa sia per quelli istituzionali. -Visita la [documentazione di Prysm](https://prysm.offchainlabs.com/docs/) per maggiori informazioni. +Visita la [documentazione di Prysm](https://prysm.offchainlabs.com/docs/) per saperne di più. ### Teku {#teku} -Teku è uno dei client di genesi originali della Beacon Chain. Insieme ai soliti obiettivi (sicurezza, robustezza, stabilità, utilizzabilità, prestazioni), Teku mira specificamente a conformarsi completamente a tutti i vari standard dei client di consenso. +Teku è uno dei client originali della genesi della Beacon Chain. Oltre ai soliti obiettivi (sicurezza, robustezza, stabilità, usabilità, prestazioni), Teku mira specificamente a conformarsi pienamente a tutti i vari standard dei client di consenso. -Teku offre opzioni di sviluppo molto flessibili. Il nodo beacon e il client del validatore possono operare insieme come un singolo processo, il che è estremamente conveniente per gli staker in autonomia, o i nodi possono operare separatamente per le operazioni di staking sofisticate. Inoltre, Teku è completamente interoperabile con [Web3Signer](https://github.com/ConsenSys/web3signer/) per firmare la sicurezza della chiave e la protezione dallo slashing. +Teku offre opzioni di distribuzione molto flessibili. Il nodo beacon e il client validatore possono essere eseguiti insieme come un singolo processo, il che è estremamente conveniente per gli staker in solitaria, oppure i nodi possono essere eseguiti separatamente per operazioni di staking sofisticate. Inoltre, Teku è completamente interoperabile con [Web3Signer](https://github.com/ConsenSys/web3signer/) per la sicurezza delle chiavi di firma e la protezione dal punire (slashing). -Teku è scritto in Java ed è sotto licenza Apache 2.0. È sviluppato dal team Protocols di ConsenSys, responsabile anche di Besu e Web3Signer. Scopri di più nella [documentazione di Teku](https://docs.teku.consensys.net/en/latest/). +Teku è scritto in Java ed è concesso in licenza Apache 2.0. È sviluppato dal team Protocols di ConsenSys che è anche responsabile di Besu e Web3Signer. Scopri di più nella [documentazione di Teku](https://docs.teku.consensys.net/en/latest/). ### Grandine {#grandine} -Grandine è un'implementazione del client di consenso scritta in Rust sotto la licenza GPL-3.0. Mantenuta dal Team principale di Grandine, è veloce, leggera e ad alte prestazioni. È adatta a un'ampia gamma di staker, da quelli in solo su dispositivi a bassa potenza, come il Raspberry Pi, ai grandi staker istituzionali che eseguono decine di migliaia di validatori. +Grandine è un'implementazione di client di consenso, scritta in Rust sotto la licenza GPL-3.0. È mantenuta dal Grandine Core Team ed è veloce, ad alte prestazioni e leggera. Si adatta a un'ampia gamma di staker, dagli staker in solitaria che eseguono su dispositivi a basse risorse come Raspberry Pi ai grandi staker istituzionali che eseguono decine di migliaia di validatori. -La documentazione è consultabile sul [Manuale di Grandine](https://docs.grandine.io/) +La documentazione può essere trovata nel [Grandine Book](https://docs.grandine.io/) ## Modalità di sincronizzazione {#sync-modes} -Per seguire e verificare i dati correnti nella rete, il client di Ethereum deve essere sincronizzato con l'ultimo stato della rete. Ciò avviene scaricando i dati dai pari, verificandone crittograficamente l'integrità e creando un database locale della blockchain. +Per seguire e verificare i dati attuali nella rete, il client di Ethereum deve sincronizzarsi con l'ultimo stato della rete. Questo viene fatto scaricando i dati dai peer, verificandone crittograficamente l'integrità e costruendo un database blockchain locale. -Le modalità di sincronizzazione rappresentano diversi approcci a questo processo, con vari compromessi. I client variano anche nella loro implementazione degli algoritmi di sincronizzazione. Fai sempre riferimento alla documentazione ufficiale del client scelto per le specifiche sull'implementazione. +Le modalità di sincronizzazione rappresentano diversi approcci a questo processo con vari compromessi. I client variano anche nella loro implementazione degli algoritmi di sincronizzazione. Fai sempre riferimento alla documentazione ufficiale del client scelto per le specifiche sull'implementazione. ### Modalità di sincronizzazione del livello di esecuzione {#execution-layer-sync-modes} -Il livello di esecuzione potrebbe essere eseguito in modi diversi per adeguarsi a casi d'uso differenti, dalla ri-esecuzione dello stato globale della blockchain alla sola sincronizzazione con la testa della catena da un punto di controllo affidabile. +Il livello di esecuzione può essere eseguito in diverse modalità per adattarsi a diversi casi d'uso, dalla riesecuzione dello stato mondiale della blockchain alla sola sincronizzazione con la punta della catena da un checkpoint fidato. #### Sincronizzazione completa {#full-sync} Una sincronizzazione completa scarica tutti i blocchi (incluse le intestazioni e i corpi dei blocchi) e rigenera lo stato della blockchain in modo incrementale eseguendo ogni blocco dalla genesi. - Riduce al minimo la fiducia e offre la massima sicurezza verificando ogni transazione. -- Al crescere del numero di transazioni, possono volerci giorni o persino settimane per elaborare tutte le transazioni. +- Con un numero crescente di transazioni, possono essere necessari da giorni a settimane per elaborare tutte le transazioni. -I [nodi Archivio](#archive-node) eseguono una sincronizzazione completa per costruire (e conservare) uno storico completo delle modifiche apportate allo stato da ogni transazione in ogni blocco. +I [nodi di archivio](#archive-node) eseguono una sincronizzazione completa per costruire (e conservare) una cronologia completa delle modifiche di stato apportate da ogni transazione in ogni blocco. #### Sincronizzazione veloce {#fast-sync} -Come in una sincronizzazione completa, una sincronizzazione veloce scarica tutti i blocchi (intestazioni, transazioni e ricevute incluse). Tuttavia, invece di rielaborare le transazioni storiche, una sincronizzazione veloce si affida alle ricevute fino al raggiungimento di una testa recente, quando passa all'importazione ed elaborazione dei blocchi per fornire un nodo completo. +Come una sincronizzazione completa, una sincronizzazione veloce scarica tutti i blocchi (incluse intestazioni, transazioni e ricevute). Tuttavia, invece di rielaborare le transazioni storiche, una sincronizzazione veloce si affida alle ricevute fino a raggiungere una testa recente, quando passa all'importazione e all'elaborazione dei blocchi per fornire un nodo completo. - Strategia di sincronizzazione veloce. -- Riduce la domanda di elaborazione, in favore dell'utilizzo della larghezza di banda. +- Riduce la domanda di elaborazione a favore dell'utilizzo della larghezza di banda. #### Sincronizzazione snap {#snap-sync} -Anche le sincronizzazioni snap verificano la catena blocco per blocco. Tuttavia, invece di iniziare dal blocco di genesi, una sincronizzazione snap si avvia da un punto di controllo 'affidabile' più recente che è noto faccia parte della vera blockchain. Il nodo salva punti di controllo periodici mentre elimina dati più vecchi di un certo periodo. Queste istantanee sono utilizzate per rigenerare i dati di stato necessari, piuttosto che per memorizzarli per sempre. +Anche le sincronizzazioni snap verificano la catena blocco per blocco. Tuttavia, invece di iniziare dal blocco genesi, una sincronizzazione snap inizia da un checkpoint 'fidato' più recente che è noto per far parte della vera blockchain. Il nodo salva checkpoint periodici eliminando i dati più vecchi di una certa età. Queste istantanee (snapshot) vengono utilizzate per rigenerare i dati di stato secondo necessità, piuttosto che archiviarli per sempre. -- È la strategia di sincronizzazione più veloce, attualmente quella predefinita nella Rete Principale di Ethereum. -- Risparmia molto spazio su disco e larghezza di banda di rete senza sacrificare la sicurezza. +- Strategia di sincronizzazione più veloce, attualmente predefinita nella rete principale di Ethereum. +- Risparmia molto utilizzo del disco e larghezza di banda della rete senza sacrificare la sicurezza. [Maggiori informazioni sulla sincronizzazione snap](https://github.com/ethereum/devp2p/blob/master/caps/snap.md). #### Sincronizzazione leggera {#light-sync} -La modalità leggera del client scarica tutte le intestazioni e i dati del blocco e ne verifica alcuni casualmente. Sincronizza solo la punta della catena dal punto di controllo attendibile. +La modalità client leggero scarica tutte le intestazioni dei blocchi, i dati dei blocchi e ne verifica alcuni in modo casuale. Sincronizza solo la punta della catena dal checkpoint fidato. -- Ottiene solo l'ultimo stato basandosi sulla fiducia negli sviluppatori e nel meccanismo di consenso. -- Client pronto all'uso con lo stato corrente della rete in pochi minuti. +- Ottiene solo l'ultimo stato affidandosi alla fiducia negli sviluppatori e nel meccanismo di consenso. +- Client pronto all'uso con lo stato attuale della rete in pochi minuti. -**NB** La sincronizzazione leggera non funziona ancora con Ethereum proof-of-stake - una nuova versione verrà rilasciata presto! +**NB** La sincronizzazione leggera non funziona ancora con la prova di stake (proof-of-stake) di Ethereum: le nuove versioni della sincronizzazione leggera dovrebbero essere rilasciate presto! [Maggiori informazioni sui client leggeri](/developers/docs/nodes-and-clients/light-clients/) @@ -288,22 +292,22 @@ La modalità leggera del client scarica tutte le intestazioni e i dati del blocc #### Sincronizzazione ottimistica {#optimistic-sync} -La sincronizzazione ottimistica è una strategia di sincronizzazione successiva alla Fusione, progettata per essere ad accettazione e retrocompatibile, consentendo ai nodi di esecuzione di sincronizzarsi tramite metodi stabiliti. Il motore di esecuzione può importare _ottimisticamente_ i blocchi beacon senza verificarli completamente, trovare l'ultima testa e, poi, avviare la sincronizzazione della catena coi suddetti metodi. Poi, dopo essersi rimesso in pari, il client di esecuzione informerà il client di consenso della validità delle transazioni nella Beacon Chain. +La sincronizzazione ottimistica è una strategia di sincronizzazione post-fusione progettata per essere facoltativa e retrocompatibile, consentendo ai nodi di esecuzione di sincronizzarsi tramite metodi consolidati. Il motore di esecuzione può importare _ottimisticamente_ i blocchi beacon senza verificarli completamente, trovare l'ultima testa e quindi iniziare a sincronizzare la catena con i metodi sopra indicati. Quindi, dopo che il client di esecuzione si è aggiornato, informerà il client di consenso della validità delle transazioni nella Beacon Chain. [Maggiori informazioni sulla sincronizzazione ottimistica](https://github.com/ethereum/consensus-specs/blob/master/sync/optimistic.md) -#### Sincronizzazione del punto di controllo {#checkpoint-sync} +#### Sincronizzazione checkpoint {#checkpoint-sync} -Una sincronizzazione dal punto di controllo, anche nota come sincronizzazione a soggettività debole, crea un'esperienza utente superiore per la sincronizzazione di un Nodo Beacon. Si basa sulle ipotesi di [soggettività debole](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/), che consentono la sincronizzazione della Beacon Chain da un punto di controllo a soggettività debole recente invece che dalla genesi. Le sincronizzazioni dai punti di controllo rendono significativamente più veloce la sincronizzazione iniziale, con ipotesi di fiducia simili alla sincronizzazione dalla [genesi](/glossary/#genesis-block). +Una sincronizzazione checkpoint, nota anche come sincronizzazione a soggettività debole, crea un'esperienza utente superiore per la sincronizzazione di un Nodo Beacon. Si basa su presupposti di [soggettività debole](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/) che consentono di sincronizzare la Beacon Chain da un recente checkpoint di soggettività debole invece che dalla genesi. Le sincronizzazioni checkpoint rendono il tempo di sincronizzazione iniziale significativamente più veloce con presupposti di fiducia simili alla sincronizzazione dalla [genesi](/glossary/#genesis-block). -In pratica, ciò significa che il tuo nodo si connette a un servizio remoto per scaricare gli stati finalizzati di recente e continua a verificare i dati da quel punto. La terza parte che fornisce i dati è affidabile e dovrebbe essere selezionata attentamente. +In pratica, ciò significa che il tuo nodo si connette a un servizio remoto per scaricare i recenti stati finalizzati e continua a verificare i dati da quel punto. La terza parte che fornisce i dati è fidata e dovrebbe essere scelta con attenzione. -Maggiori informazioni sulla [sincronizzazione del punto di controllo](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) +Maggiori informazioni sulla [sincronizzazione checkpoint](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) ## Letture consigliate {#further-reading} - [Ethereum 101 - Parte 2 - Comprendere i nodi](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– Wil Barnes, 13 febbraio 2019_ -- [Eseguire i nodi completi di Ethereum: una guida per i poco motivati](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7 novembre 2019_ +- [Eseguire nodi completi di Ethereum: una guida per i poco motivati](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7 novembre 2019_ ## Argomenti correlati {#related-topics} @@ -312,4 +316,4 @@ Maggiori informazioni sulla [sincronizzazione del punto di controllo](https://no ## Tutorial correlati {#related-tutorials} -- [Trasforma il tuo Raspberry Pi 4 in un nodo validatore semplicemente eseguendo il flash della scheda MicroSD - Guida d'installazione](/developers/tutorials/run-node-raspberry-pi/) _ - Esegui il flash del tuo Raspberry Pi 4, collega un cavo Ethernet, connetti il disco SSD e alimenta il dispositivo per trasformare il Raspberry Pi 4 in un nodo completo di Ethereum eseguendo il livello di esecuzione (Rete principale) e/o il livello di consenso (Beacon Chain / validatore)._ +- [Trasforma il tuo Raspberry Pi 4 in un nodo validatore semplicemente flashando la scheda MicroSD – Guida all'installazione](/developers/tutorials/run-node-raspberry-pi/) _– Flasha il tuo Raspberry Pi 4, collega un cavo ethernet, connetti il disco SSD e accendi il dispositivo per trasformare il Raspberry Pi 4 in un nodo completo di Ethereum che esegue il livello di esecuzione (Rete principale) e/o il livello di consenso (Beacon Chain / validatore)._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/light-clients/index.md index 995de26dab2..d03b523e968 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/light-clients/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/light-clients/index.md @@ -4,58 +4,58 @@ description: Introduzione ai client leggeri di Ethereum. lang: it --- -Eseguire un nodo completo è il metodo più privato, decentralizzato, senza fiducia e resistente alle censura per interagire con Ethereum. Con un nodo completo mantieni la tua copia della blockchain che può essere interrogata istantaneamente e ottieni l'accesso diretto alla rete peer-to-peer di Ethereum. Tuttavia, eseguire un nodo completo richiede una significativa quantità di memoria, archiviazione e CPU. Ciò significa che non è fattibile per tutti eseguire il proprio nodo. Esistono diverse soluzioni sulla tabella di marcia di Ethereum, inclusa l'assenza di stato, ma mancano diversi anni alla loro implementazione. La risposta nel breve termine è barattare alcuni dei vantaggi dell'esecuzione di un nodo completo per grandi miglioramenti delle prestazioni che consentono l'esecuzione di nodi con requisiti hardware molto ridotti. I nodi che permettono tale compromesso sono noti come nodi leggeri. +Eseguire un nodo completo è il modo più trustless (senza bisogno di fiducia), privato, decentralizzato e resistente alla censura per interagire con [Ethereum](/). Con un nodo completo mantieni la tua copia della blockchain che puoi interrogare istantaneamente e ottieni accesso diretto alla rete peer-to-peer di Ethereum. Tuttavia, eseguire un nodo completo richiede una quantità significativa di memoria, spazio di archiviazione e CPU. Ciò significa che non è fattibile per tutti eseguire il proprio nodo. Ci sono diverse soluzioni a questo nel piano d'azione di Ethereum, inclusa l'assenza di stato (statelessness), ma mancano ancora diversi anni alla loro implementazione. La risposta a breve termine è scendere a compromessi su alcuni dei vantaggi dell'esecuzione di un nodo completo in cambio di grandi miglioramenti delle prestazioni che consentono ai nodi di funzionare con requisiti hardware molto bassi. I nodi che accettano questo compromesso sono noti come nodi leggeri (light node). ## Cos'è un client leggero {#what-is-a-light-client} -Un nodo leggero è un nodo che esegue il software di un client leggero. Invece di mantenere copie locali dei dati della blockchain e verificare in modo indipendente tutte le modifiche, richiedono i dati necessari a qualche fornitore. Il fornitore potrebbe essere una connessione diretta a un nodo completo o tramite qualche server RPC centralizzato. I dati sono quindi verificati dal nodo leggero, consentendogli di tenere il passo con la testa della catena. Il nodo leggero elabora soltanto le intestazioni del blocco, scaricando solo occasionalmente i contenuti effettivi del blocco. I nodi possono variare nella propria leggerezza, a seconda delle combinazioni di software del client leggero e completo che eseguono. Ad esempio, la configurazione più leggera sarebbe eseguire un client di esecuzione leggero e un client di consenso leggero. È inoltre probabile che molti nodi sceglieranno di eseguire client di consenso leggeri con client di esecuzione completi, o viceversa. +Un nodo leggero è un nodo che esegue un software client leggero. Invece di mantenere copie locali dei dati della blockchain e verificare in modo indipendente tutte le modifiche, richiedono i dati necessari a un fornitore. Il fornitore potrebbe essere una connessione diretta a un nodo completo o tramite un server RPC centralizzato. I dati vengono poi verificati dal nodo leggero, consentendogli di stare al passo con la testa della catena. Il nodo leggero elabora solo le intestazioni dei blocchi, scaricando solo occasionalmente i contenuti effettivi del blocco. I nodi possono variare nella loro leggerezza, a seconda delle combinazioni di software client leggero e completo che eseguono. Ad esempio, la configurazione più leggera consisterebbe nell'eseguire un client di esecuzione leggero e un client di consenso leggero. È anche probabile che molti nodi sceglieranno di eseguire client di consenso leggeri con client di esecuzione completi, o viceversa. ## Come funzionano i client leggeri? {#how-do-light-clients-work} -Quando Ethereum ha iniziato a utilizzare il meccanismo di consenso basato sul proof-of-stake, è stata introdotta una nuova struttura specificamente per supportare i client leggeri. Opera selezionando casualmente un sottoinsieme di 512 validatori ogni 1,1 giorni affinché agisca da **commissione di sincronizzazione**. La commissione di sincronizzazione firma l'intestazione dei blocchi recenti. L'intestazione di ogni blocco contiene la firma aggregata dei validatori nella commissione di sincronizzazione e un "bitfield" che mostra quali validatori hanno firmato e quali no. Ogni intestazione, inoltre, include un elenco dei validatori che si prevede parteciperanno alla firma del blocco successivo. Ciò significa che un client leggero può vedere rapidamente se la commissione di sincronizzazione abbia autorizzato i dati ricevuti, nonché verificare che la commissione di sincronizzazione sia quella autentica confrontando quella da cui riceve l'autorizzazione con quella che avrebbe dovuto aspettarsi secondo il blocco precedente. Così, il client leggero può continuare ad aggiornare la propria conoscenza dell'ultimo blocco di Ethereum senza scaricare effettivamente il blocco, ma soltanto l'intestazione contenente le informazioni sintetiche. +Quando Ethereum ha iniziato a utilizzare un meccanismo di consenso basato sulla prova di stake, è stata introdotta una nuova infrastruttura specificamente per supportare i client leggeri. Il modo in cui funziona è selezionando casualmente un sottoinsieme di 512 validatori ogni 1,1 giorni per agire come **comitato di sincronizzazione** (sync committee). Il comitato di sincronizzazione firma l'intestazione dei blocchi recenti. Ogni intestazione del blocco contiene la firma aggregata dei validatori nel comitato di sincronizzazione e un "bitfield" che mostra quali validatori hanno firmato e quali no. Ogni intestazione include anche un elenco di validatori che dovrebbero partecipare alla firma del blocco successivo. Ciò significa che un client leggero può vedere rapidamente che il comitato di sincronizzazione ha approvato i dati che riceve, e può anche verificare che il comitato di sincronizzazione sia quello autentico confrontando quello che riceve con quello che gli era stato detto di aspettarsi nel blocco precedente. In questo modo, il client leggero può continuare ad aggiornare la sua conoscenza dell'ultimo blocco di Ethereum senza scaricare effettivamente il blocco stesso, ma solo l'intestazione che contiene informazioni riassuntive. -Sul livello di esecuzione non esiste un'unica specifica per un client di esecuzione leggero. La portata di un client di esecuzione leggero può variare da una "modalità leggera" di un client di esecuzione completo, dotato di tutte le funzionalità di rete e dell'EVM di un nodo completo ma che verifica soltanto le intestazioni del blocco, senza scaricare i dati associati, o può essere un client più ridotto che fa fortemente affidamento sull'inoltro delle richieste a un fornitore RPC per interagire con Ethereum. +Sul livello di esecuzione non esiste una singola specifica per un client di esecuzione leggero. L'ambito di un client di esecuzione leggero può variare da una "modalità leggera" di un client di esecuzione completo che ha tutte le funzionalità EVM e di rete di un nodo completo ma verifica solo le intestazioni dei blocchi, senza scaricare i dati associati, oppure può essere un client più ridotto che si affida pesantemente all'inoltro delle richieste a un fornitore RPC per interagire con Ethereum. ## Perché i client leggeri sono importanti? {#why-are-light-clients-important} -I client leggeri sono importanti perché consentono agli utenti di verificare i dati in entrata piuttosto che fidarsi ciecamente del fatto che il fornitore dei dati sia corretto e onesto, utilizzando soltanto una minuscola frazione delle risorse di calcolo di un nodo completo. I dati ricevuti dai client leggeri sono controllabili rispetto alle intestazioni dei blocchi che sanno essere stati firmati da almeno 2/3 di un insieme casuale di 512 validatori di Ethereum. Questa è una prova molto forte del fatto che i dati siano corretti. +I client leggeri sono importanti perché consentono agli utenti di verificare i dati in entrata piuttosto che fidarsi ciecamente che il loro fornitore di dati sia corretto e onesto, pur utilizzando solo una minima frazione delle risorse computazionali di un nodo completo. I dati che i client leggeri ricevono possono essere verificati rispetto alle intestazioni dei blocchi che sanno essere state firmate da almeno 2/3 di un insieme casuale di 512 validatori di Ethereum. Questa è una prova molto forte che i dati sono corretti. -Il client leggero utilizza soltanto una minuscola quantità di potenza di calcolo, memoria e archiviazione, così che sia eseguibile su uno smartphone, incorporato in un'app o come parte di un browser. I client leggeri sono un modo per rendere l'accesso a fiducia minimizzata a Ethereum tanto privo di attrito quanto lo sarebbe fidandosi di un fornitore terzo. +Il client leggero utilizza solo una minima quantità di potenza di calcolo, memoria e spazio di archiviazione, quindi può essere eseguito su un telefono cellulare, incorporato in un'app o come parte di un browser. I client leggeri sono un modo per rendere l'accesso a Ethereum con minimizzazione della fiducia (trust-minimized) altrettanto privo di attriti quanto fidarsi di un fornitore di terze parti. -Facciamo un semplice esempio. Immagina di voler controllare il saldo del tuo conto. Per farlo, devi effettuare una richiesta a un nodo di Ethereum. Quel nodo controllerà la propria copia locale dello stato di Ethereum in cerca del tuo saldo, e te lo restituirà. Se non hai accesso diretto a un nodo, esistono degli operatori centralizzati che forniscono tali dati come servizio. Puoi inviare loro una richiesta, loro controllano il proprio nodo e ti inviano i risultati. Il problema, in questo caso, è che devi fidarti del fatto che il fornitore ti restituisca le informazioni corrette. Non puoi mai sapere davvero se le informazioni siano corrette se non puoi verificarle da solo. +Facciamo un semplice esempio. Immagina di voler controllare il saldo del tuo account. Per farlo devi fare una richiesta a un nodo di Ethereum. Quel nodo controllerà la sua copia locale dello stato di Ethereum per il tuo saldo e te lo restituirà. Se non hai accesso diretto a un nodo, ci sono operatori centralizzati che forniscono questi dati come servizio. Puoi inviare loro una richiesta, loro controllano il loro nodo e ti inviano il risultato. Il problema è che poi devi fidarti che il fornitore ti stia dando le informazioni corrette. Non puoi mai sapere veramente se le informazioni sono corrette se non puoi verificarle da solo. -Un client leggero affronta tale problema. Anche in questo caso richiedi i dati a qualche fornitore esterno, ma quando li ricevi sono dotati di una prova che il tuo nodo leggero può verificare rispetto alle informazioni ricevute nell'intestazione del blocco. Ciò significa che Ethereum sta verificando la correttezza dei tuoi dati invece di quelli di qualche operatore fidato. +Un client leggero affronta questo problema. Richiedi ancora i dati a un fornitore esterno, ma quando ricevi i dati indietro, questi sono accompagnati da una prova che il tuo nodo leggero può verificare rispetto alle informazioni che ha ricevuto nell'intestazione del blocco. Ciò significa che Ethereum sta verificando la correttezza dei tuoi dati invece di un operatore fidato. -## Quali innovazioni sono consentite dai client leggeri? {#what-innovations-do-light-clients-enable} +## Quali innovazioni abilitano i client leggeri? {#what-innovations-do-light-clients-enable} -Il principale vantaggio dei client leggeri è che consentono a più persone di accedere a Ethereum in modo indipendente, con requisiti di hardware trascurabili e minima dipendenza da terze parti. Ciò è un bene per gli utenti, poiché possono verificare i propri dati, ed è un bene per la rete poiché aumenta il numero e la diversità dei nodi che verificano la catena. +Il vantaggio principale dei client leggeri è consentire a più persone di accedere a Ethereum in modo indipendente con requisiti hardware trascurabili e una dipendenza minima da terze parti. Questo è un bene per gli utenti perché possono verificare i propri dati ed è un bene per la rete perché aumenta il numero e la diversità dei nodi che stanno verificando la catena. -La capacità di eseguire nodi di Ethereum su dispositivi con archiviazione, memoria e potenza di elaborazione molto ridotte è una delle aree principali d'innovazione sbloccate dai client leggeri. Laddove i nodi odierni di Ethereum richiedono molte risorse di calcolo, i client leggeri potrebbero essere incorporati nei browser, essere eseguiti su smartphone e forse persino su dispositivi più piccoli come smartwatch. Ciò significa che i portafogli di Ethereum con client incorporati potrebbero essere eseguiti su uno smartphone. Ciò significa che i portafogli mobili potrebbero essere molto più decentralizzati, non dovendosi fidare di fornitori di dati centralizzati per i propri dati. +La capacità di eseguire nodi di Ethereum su dispositivi con spazio di archiviazione, memoria e potenza di elaborazione molto ridotti è una delle principali aree di innovazione sbloccate dai client leggeri. Mentre oggi i nodi di Ethereum richiedono molte risorse di calcolo, i client leggeri potrebbero essere incorporati nei browser, eseguiti su telefoni cellulari e forse anche su dispositivi più piccoli come gli smartwatch. Ciò significa che i portafogli di Ethereum con client incorporati potrebbero funzionare su un telefono cellulare. Ciò significa che i portafogli mobili potrebbero essere molto più decentralizzati in quanto non dovrebbero fidarsi di fornitori di dati centralizzati per i loro dati. -Un'estensione di ciò è abilitare i dispositivi **IoT (Internet delle Cose)**. Un client leggero potrebbe essere utilizzato per provare rapidamente la proprietà del saldo di qualche token o NFT, con tutte le garanzie di sicurezza fornite dalle commissioni di sincronizzazione, innescando qualche azione su una rete IoT. Immagina un [servizio di noleggio di biciclette](https://youtu.be/ZHNrAXf3RDE?t=929) che utilizza un'app con un client leggero incorporato per verificare rapidamente che tu possieda l'NFT del servizio di noleggio e, in tal caso, sblocca una bici che tu possa utilizzare subito! +Un'estensione di questo è l'abilitazione dei dispositivi dell'**internet delle cose (IoT)**. Un client leggero potrebbe essere utilizzato per dimostrare rapidamente la proprietà di un saldo di token o di un NFT, con tutte le garanzie di sicurezza fornite dai comitati di sincronizzazione, innescando qualche azione su una rete IoT. Immagina un [servizio di noleggio biciclette](https://youtu.be/ZHNrAXf3RDE?t=929) che utilizza un'app con un client leggero incorporato per verificare rapidamente che possiedi l'NFT del servizio di noleggio e, in tal caso, sblocca una bicicletta per farti fare un giro! -Anche i rollup di Ethereum beneficerebbero dei client leggeri. Uno dei grandi problemi dei rollup sono state le hack mirate ai ponti che consentono il trasferimento di fondi dalla Rete Principale di Ethereum a un rollup. Una vulnerabilità è data dagli oracoli utilizzati dai rollup per rilevare che un utente ha effettuato un deposito nel ponte. Se un oracolo alimenta dati malevoli, potrebbe indurre il rollup a pensare che si sia verificato un deposito al ponte e a rilasciare erroneamente dei fondi. Un client leggero incorporato nel rollup potrebbe essere utilizzato per proteggere dagli oracoli corrotti, poiché il deposito nel ponte potrebbe essere dotato di una prova verificabile dal rollup prima del rilascio di qualsiasi token. Lo stesso concetto potrebbe anche applicarsi ad altri ponti inter-catena. +Anche i rollup di Ethereum trarrebbero vantaggio dai client leggeri. Uno dei grandi problemi per i rollup sono stati gli attacchi informatici mirati ai ponti che consentono il trasferimento di fondi dalla rete principale di Ethereum a un rollup. Una vulnerabilità sono gli oracoli che i rollup utilizzano per rilevare che un utente ha effettuato un deposito nel ponte. Se un oracolo fornisce dati errati, potrebbe ingannare il rollup facendogli credere che ci sia stato un deposito nel ponte e rilasciare fondi in modo errato. Un client leggero incorporato nel rollup potrebbe essere utilizzato per proteggersi da oracoli corrotti perché il deposito nel ponte potrebbe essere accompagnato da una prova che può essere verificata dal rollup prima di rilasciare qualsiasi token. Lo stesso concetto potrebbe essere applicato anche ad altri ponti inter-catena. -I client leggeri potrebbero essere anche utilizzati per aggiornare i portafogli di Ethereum. Invece di fidarsi dei dati forniti da un fornitore RPC, il tuo portafoglio potrebbe verificare direttamente i dati presentati a te utilizzando un client leggero incorporato. Ciò aggiungerebbe sicurezza al tuo portafoglio. Se il tuo fornitore RPC è stato disonesto e ti ha fornito dei dati errati, il client leggero incorporato potrebbe dirtelo! +I client leggeri potrebbero anche essere utilizzati per aggiornare i portafogli di Ethereum. Invece di fidarsi dei dati forniti da un fornitore RPC, il tuo portafoglio potrebbe verificare direttamente i dati che ti vengono presentati utilizzando un client leggero incorporato. Questo aggiungerebbe sicurezza al tuo portafoglio. Se il tuo fornitore RPC fosse disonesto e ti fornisse dati errati, il client leggero incorporato potrebbe dirtelo! ## Qual è lo stato attuale dello sviluppo dei client leggeri? {#current-state-of-development} -Esistono vari client leggeri in via di sviluppo, tra cui client leggeri di esecuzione, di consenso e combinati di esecuzione/consenso. Queste sono le implementazioni di client leggeri note nel momento in cui viene scritta questa pagina: +Ci sono diversi client leggeri in fase di sviluppo, inclusi client leggeri di esecuzione, di consenso e combinati di esecuzione/consenso. Queste sono le implementazioni di client leggeri di cui siamo a conoscenza al momento della stesura di questa pagina: -- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): client leggero di consenso in TypeScript +- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): client di consenso leggero in TypeScript - [Helios](https://github.com/a16z/helios): client leggero combinato di esecuzione e consenso in Rust -- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): modalità leggera per il client di esecuzione (in via di sviluppo) in Go -- [Nimbus](https://nimbus.guide/el-light-client.html): client leggero di consenso in Nim +- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): modalità leggera per il client di esecuzione (in sviluppo) in Go +- [Nimbus](https://nimbus.guide/el-light-client.html): client di consenso leggero in Nim -Per quanto ne sappiamo, nessuno è ancora considerato pronto alla produzione. +Per quanto ne sappiamo, nessuno di questi è ancora considerato pronto per la produzione. -Inoltre, c'è molto lavoro da fare per migliorare il modo in cui i client leggeri possono accedere ai dati di Ethereum. Al momento, i client leggeri si affidano alle richieste RPC ai nodi completi utilizzando un modello client/server, ma in futuro i dati potrebbero essere richiesti in un modo più decentralizzato utilizzando una rete dedicata come la [Portal Network](https://www.ethportal.net/), che potrebbe servire i dati ai client leggeri utilizzando un protocollo di gossip peer-to-peer. +Si sta anche lavorando molto per migliorare i modi in cui i client leggeri possono accedere ai dati di Ethereum. Attualmente, i client leggeri si affidano a richieste RPC ai nodi completi utilizzando un modello client/server, ma in futuro i dati potrebbero essere richiesti in modo più decentralizzato utilizzando una rete dedicata come la [Portal Network](https://www.ethportal.net/) che potrebbe servire i dati ai client leggeri utilizzando un protocollo di gossip peer-to-peer. -Altri punti della [tabella di marcia](/roadmap/) come gli [alberi di Verkle](/roadmap/verkle-trees/) e l'[assenza di stato](/roadmap/statelessness/) renderanno infine le garanzie di sicurezza dei client leggeri equivalenti a quelle dei client completi. +Altri elementi del [piano d'azione](/roadmap/) come gli [alberi di Verkle](/roadmap/verkle-trees/) e l'[assenza di stato](/roadmap/statelessness/) porteranno infine le garanzie di sicurezza dei client leggeri a essere pari a quelle dei client completi. ## Letture consigliate {#further-reading} - [Zsolt Felfodhi sui client leggeri di Geth](https://www.youtube.com/watch?v=EPZeFXau-RE) -- [Etan Kissling sull'interconnessione dei client leggeri](https://www.youtube.com/watch?v=85MeiMA4dD8) -- [Etan Kissling sui client leggeri dopo La Fusione](https://www.youtube.com/watch?v=ZHNrAXf3RDE) -- [Piper Merriam: La strada tortuosa verso i client leggeri funzionali](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) +- [Etan Kissling sul networking dei client leggeri](https://www.youtube.com/watch?v=85MeiMA4dD8) +- [Etan Kissling sui client leggeri dopo Il Merge](https://www.youtube.com/watch?v=ZHNrAXf3RDE) +- [Piper Merriam: La strada tortuosa verso client leggeri funzionali](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/node-architecture/index.md index e96348e52f7..16fc968c799 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/node-architecture/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/node-architecture/index.md @@ -1,57 +1,59 @@ --- -title: Architettura del nodo -description: Introduzione all'organizzazione dei nodi di Ethereum. +title: Architettura dei nodi +description: Introduzione a come sono organizzati i nodi di Ethereum. lang: it --- -Un nodo di Ethereum si compone di due client: un [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e un [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients). +Un nodo di Ethereum è composto da due client: un [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e un [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients). Affinché un nodo possa proporre un nuovo blocco, deve anche eseguire un [client validatore](#validators). -Quando Ethereum utilizzava il [proof-of-work](/developers/docs/consensus-mechanisms/pow/), un client di esecuzione era sufficiente per eseguire un intero nodo di Ethereum. Tuttavia, dall'implementazione del [proof-of-stake](/developers/docs/consensus-mechanisms/pow/), il client di esecuzione dev'essere utilizzato insieme a un altro pezzo di software detto ["client di consenso"](/developers/docs/nodes-and-clients/#consensus-clients). +Quando Ethereum utilizzava la [prova di lavoro](/developers/docs/consensus-mechanisms/pow/), un client di esecuzione era sufficiente per eseguire un nodo completo di Ethereum. Tuttavia, dall'implementazione della [prova di stake](/developers/docs/consensus-mechanisms/pow/), il client di esecuzione deve essere utilizzato insieme a un altro software chiamato [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients). -Il diagramma seguente mostra la relazione tra i due client di Ethereum. I due client si connettono alle rispettive reti peer-to-peer (P2P). Sono necessarie reti P2P separate poiché i client di esecuzione eseguono il gossip delle transazioni sulla propria rete P2P, consentendo loro di gestire il proprio pool locale di transazione, mentre i client di consenso eseguono il gossip dei blocchi sulla propria rete P2P, consentendo la crescita del consenso e della catena. +Il diagramma sottostante mostra la relazione tra i due client di Ethereum. I due client si connettono alle rispettive reti peer-to-peer (P2P). Sono necessarie reti P2P separate poiché i client di esecuzione diffondono le transazioni sulla loro rete P2P, consentendo loro di gestire il proprio pool di transazioni locale, mentre i client di consenso diffondono i blocchi sulla loro rete P2P, consentendo il consenso e la crescita della catena. -![Diagramma dell'architettura del nodo Ethereum che mostra i livelli di esecuzione e consenso](node-architecture-text-background.png) +![Diagramma dell'architettura del nodo di Ethereum che mostra i livelli di esecuzione e di consenso](node-architecture-text-background.png) -Perché questa struttura a due client funzioni, i client di consenso devono poter passare i pacchetti di transazioni al client di esecuzione. Eseguire le transazioni localmente è la modalità in cui il client convalida che le transazioni non violano alcuna regola di Ethereum e che l'aggiornamento proposto allo stato di Ethereum sia corretto. Similmente, quando il nodo è selezionato come produttore di un blocco, il client di consenso deve poter richiedere i pacchetti di transazioni da Geth da includere nel nuovo blocco ed eseguirli per aggiornare lo stato globale. Questa comunicazione tra client è gestita da una connessione RPC locale utilizzando l'[API del motore](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). +_Ci sono diverse opzioni per il client di esecuzione, tra cui Erigon, Nethermind e Besu_. + +Affinché questa struttura a due client funzioni, i client di consenso devono passare pacchetti di transazioni al client di esecuzione. Il client di esecuzione esegue le transazioni localmente per convalidare che non violino alcuna regola di Ethereum e che l'aggiornamento proposto allo stato di Ethereum sia corretto. Quando un nodo viene selezionato per essere un produttore di blocchi, la sua istanza del client di consenso richiede pacchetti di transazioni dal client di esecuzione per includerli nel nuovo blocco ed eseguirli per aggiornare lo stato globale. Il client di consenso guida il client di esecuzione tramite una connessione RPC locale utilizzando l'[Engine API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md). ## Cosa fa il client di esecuzione? {#execution-client} -Il client di esecuzione è responsabile della gestione e del gossip delle transazioni, della gestione dello stato e del supporto alla Macchina Virtuale di Ethereum ([EVM](/developers/docs/evm/)). Tuttavia, **non** è responsabile della costruzione e del gossip dei blocchi, o della gestione della logica di consenso. Questi sono di competenza del client di consenso. +Il client di esecuzione è responsabile della convalida, della gestione e della diffusione delle transazioni, insieme alla gestione dello stato e al supporto della macchina virtuale di Ethereum ([EVM](/developers/docs/evm/)). **Non** è responsabile della costruzione dei blocchi, della diffusione dei blocchi o della gestione della logica di consenso. Questi compiti rientrano nelle competenze del client di consenso. -Il client di esecuzione crea carichi utili di esecuzione: l'elenco di transazioni, l'albero di stato aggiornato e altri dati correlati all'esecuzione. I client di consenso includono il carico utile di esecuzione in ogni blocco. Il client di esecuzione è inoltre responsabile per la ri-esecuzione delle transazioni nei nuovi blocchi per assicurarsi che siano validi. L'esecuzione delle transazioni avviene sul computer incorporato del client di esecuzione, noto come [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm). +Il client di esecuzione crea i payload di esecuzione: l'elenco delle transazioni, il trie dello stato aggiornato e altri dati relativi all'esecuzione. I client di consenso includono il payload di esecuzione in ogni blocco. Il client di esecuzione è anche responsabile della riesecuzione delle transazioni nei nuovi blocchi per assicurarsi che siano valide. L'esecuzione delle transazioni avviene sul computer integrato del client di esecuzione, noto come [macchina virtuale di Ethereum (EVM)](/developers/docs/evm). -Inoltre, il client di esecuzione offre un'interfaccia utente a Ethereum tramite i [metodi RPC](/developers/docs/apis/json-rpc) che consentono agli utenti di interrogare la blockchain di Ethereum, inviare transazioni e distribuire contratti intelligenti. È comune che le chiamate RPC siano gestite da una libreria come [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) o da un'interfaccia utente come un portafoglio su browser. +Il client di esecuzione offre anche un'interfaccia utente per Ethereum attraverso i [metodi RPC](/developers/docs/apis/json-rpc) che consentono agli utenti di interrogare la blockchain di Ethereum, inviare transazioni e distribuire contratti intelligenti. È comune che le chiamate RPC vengano gestite da una libreria come [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) o da un'interfaccia utente come un portafoglio del browser. In sintesi, il client di esecuzione è: -- una porta dell'utente a Ethereum -- la casa della Macchina Virtuale di Ethereum, dello stato di Ethereum e del pool di transazione. +- un gateway utente per Ethereum +- la sede della macchina virtuale di Ethereum, dello stato di Ethereum e del pool di transazioni. ## Cosa fa il client di consenso? {#consensus-client} -Il client di consenso affronta tutta la logica che consente a un nodo di rimanere sincronizzato con la rete di Ethereum. Ciò include la ricezione dei blocchi dai pari e l'esecuzione di un algoritmo di scelta della diramazione per assicurare che il nodo segua sempre la catena con la massima accumulazione di attestazioni (ponderata dai saldi effettivi del validatore). Similmente al client di esecuzione, i client di consenso hanno la propria rete P2P tramite cui condividono i blocchi e le attestazioni. +Il client di consenso si occupa di tutta la logica che consente a un nodo di rimanere sincronizzato con la rete di Ethereum. Ciò include la ricezione di blocchi dai peer e l'esecuzione di un algoritmo di scelta della biforcazione per garantire che il nodo segua sempre la catena con il maggior accumulo di attestazioni (ponderate in base ai saldi effettivi dei validatori). Similmente al client di esecuzione, i client di consenso hanno la propria rete P2P attraverso la quale condividono blocchi e attestazioni. -Il client di consenso non partecipa all'attestazione o alla proposta di blocco; ciò è eseguito da un validatore, un componente aggiuntivo e facoltativo di un client di consenso. Un client di consenso senza un validatore tiene il passo soltanto con la testa della catena, consentendo al nodo di rimanere sincronizzato. Ciò consente a un utente di effettuare transazioni con Ethereum usando il proprio client di esecuzione, sicuro che si trovi sulla catena corretta. +Il client di consenso non partecipa all'attestazione o alla proposta di blocchi: questo viene fatto da un validatore, un componente aggiuntivo opzionale per un client di consenso. Un client di consenso senza un validatore si limita a tenere il passo con la testa della catena, consentendo al nodo di rimanere sincronizzato. Ciò consente a un utente di effettuare transazioni con Ethereum utilizzando il proprio client di esecuzione, con la certezza di trovarsi sulla catena corretta. ## Validatori {#validators} -Gli operatori di nodi possono aggiungere un validatore ai propri client di consenso depositando 32 ETH nel contratto di deposito. Il client del validatore è raggruppato con il client di consenso e può esser aggiunto a un nodo in qualsiasi momento. Il validatore gestisce le attestazioni e le proposte dei blocchi. Consente a un nodo di maturare ricompense o perdere ETH tramite sanzioni o tagli. Eseguire un software del validatore, inoltre, rende un nodo idoneo alla selezione per proporre un nuovo blocco. +Fare staking ed eseguire il software del validatore rende un nodo idoneo a essere selezionato per proporre un nuovo blocco. Gli operatori dei nodi possono aggiungere un validatore ai loro client di consenso depositando 32 ETH nel contratto di deposito. Il client validatore viene fornito in bundle con il client di consenso e può essere aggiunto a un nodo in qualsiasi momento. Il validatore gestisce le attestazioni e le proposte di blocchi. Consente inoltre a un nodo di accumulare ricompense o perdere ETH tramite penalità o venendo punito. [Maggiori informazioni sullo staking](/staking/). -## Componenti di confronto di un nodo {#node-comparison} +## Confronto tra i componenti di un nodo {#node-comparison} -| Client di esecuzione | Client di consenso | Validatore | -| -------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------- | -| Esegue il gossip delle transazioni tramite la propria rete P2P | Esegue il gossip di blocchi e attestazioni tramite la propria rete P2P | Propone blocchi | -| Esegue e ri-esegue le transazioni | Esegue l'algoritmo di scelta della diramazione | Matura ricompense/sanzioni | -| Verifica i cambiamenti di stato in entrata | Tiene traccia della testa della catena | Effettua le attestazioni | -| Gestisce gli alberi di stato e delle ricevute | Gestisce lo stato della Beacon (contenente le informazioni di consenso ed esecuzione) | Richiede lo staking di 32 ETH | -| Crea carico utile di esecuzione | Tiene traccia della casualità accumulata in RANDAO | Può essere tagliato | -| Espone l'API JSON-RPC per interagire con Ethereum | Tiene traccia di giustificazione e finalizzazione | | +| Client di esecuzione | Client di consenso | Validatore | +| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | +| Diffonde le transazioni sulla sua rete P2P | Diffonde blocchi e attestazioni sulla sua rete P2P | Propone blocchi | +| Esegue/riesegue le transazioni | Esegue l'algoritmo di scelta della biforcazione | Accumula ricompense/penalità | +| Verifica le modifiche di stato in entrata | Tiene traccia della testa della catena | Crea attestazioni | +| Gestisce i trie dello stato e delle ricevute | Gestisce lo stato della Beacon (contiene informazioni sul consenso e sull'esecuzione) | Richiede lo staking di 32 ETH| +| Crea il payload di esecuzione | Tiene traccia della casualità accumulata in RANDAO (un algoritmo che fornisce casualità verificabile per la selezione dei validatori e altre operazioni di consenso) | Può essere punito | +| Espone l'API JSON-RPC per interagire con Ethereum | Tiene traccia della giustificazione e della finalizzazione | | ## Letture consigliate {#further-reading} -- [Proof of Stake](/developers/docs/consensus-mechanisms/pos) -- [Proposta di blocco](/developers/docs/consensus-mechanisms/pos/block-proposal) -- [Ricompense e sanzioni del validatore](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) +- [Prova di stake](/developers/docs/consensus-mechanisms/pos) +- [Proposta del blocco](/developers/docs/consensus-mechanisms/pos/block-proposal) +- [Ricompense e penalità dei validatori](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index 82b185404e2..b3c99ac0100 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -1,404 +1,417 @@ --- title: Nodi come servizio -description: Panoramica entry-level dei servizi dei nodi, dei pro e dei contro, e dei fornitori più diffusi. +description: Una panoramica di base sui servizi dei nodi, i pro e i contro e i fornitori popolari. lang: it sidebarDepth: 2 --- ## Introduzione {#Introduction} -Eseguire un [nodo Ethereum](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) può essere impegnativo, specialmente quando si è alle prime armi o in caso di ridimensionamento veloce. Ci sono [alcuni servizi](#popular-node-services) che eseguono infrastrutture di nodo ottimizzate, in modo che gli sviluppatori si possano concentrare sullo sviluppo di un'applicazione o di un prodotto. Se vuoi muovere i primi passi, ti spiegheremo come funzionano i servizi di nodo, i pro e i contro del loro utilizzo ed elencheremo i fornitori. +Eseguire il proprio [nodo di Ethereum](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) può essere impegnativo, specialmente quando si è agli inizi o durante una rapida scalabilità. Esistono [diversi servizi](#popular-node-services) che eseguono infrastrutture di nodi ottimizzate per te, in modo che tu possa concentrarti sullo sviluppo della tua applicazione o prodotto. Spiegheremo come funzionano i servizi dei nodi, i pro e i contro del loro utilizzo ed elencheremo i fornitori se sei interessato a iniziare. ## Prerequisiti {#prerequisites} -Se non hai ancora chiaro cosa siano nodi e client, consulta [Nodi e client](/developers/docs/nodes-and-clients/). +Se non hai già compreso cosa siano i nodi e i client, dai un'occhiata a [Nodi e client](/developers/docs/nodes-and-clients/). ## Staker {#stakoooooooooooooors} -Gli staker in autonomia devono gestire la propria infrastruttura piuttosto che affidarsi a fornitori terzi. Ciò significa eseguire un client di esecuzione associato a un client di consenso. Prima de [La Fusione](/roadmap/merge), era possibile eseguire solo un client di consenso e usare un fornitore centralizzato per i dati di esecuzione; questo non è più possibile: uno staker in autonomia deve eseguire entrambi i client. Tuttavia, sono disponibili dei servizi per semplificare questo processo. +Gli staker solitari devono eseguire la propria infrastruttura piuttosto che affidarsi a fornitori di terze parti. Ciò significa eseguire un client di esecuzione accoppiato a un client di consenso. Prima de [La Fusione (The Merge)](/roadmap/merge), era possibile eseguire solo un client di consenso e utilizzare un fornitore centralizzato per i dati di esecuzione; questo non è più possibile: uno staker solitario deve eseguire entrambi i client. Tuttavia, sono disponibili servizi per facilitare questo processo. [Maggiori informazioni sull'esecuzione di un nodo](/developers/docs/nodes-and-clients/run-a-node/). -I servizi descritti in questa pagina sono per i nodi non di staking. +I servizi descritti in questa pagina sono per nodi non di staking. -## Come funzionano i servizi di nodo? {#how-do-node-services-work} +## Come funzionano i servizi dei nodi? {#how-do-node-services-work} -I fornitori di servizi di nodo eseguono client di nodo distribuiti, così che non debba farlo l'utente. +I fornitori di servizi dei nodi eseguono client di nodi distribuiti dietro le quinte per te, così non devi farlo tu. -Questi servizi in genere forniscono una chiave API utilizzabile per scrivere e leggere sulla blockchain. Spesso includono l'accesso a [reti di test Ethereum](/developers/docs/networks/#ethereum-testnets) in aggiunta alla Rete principale. +Questi servizi in genere forniscono una chiave API che puoi utilizzare per scrivere e leggere dalla blockchain. Spesso includono l'accesso alle [reti di test di Ethereum](/developers/docs/networks/#ethereum-testnets) oltre alla rete principale. -Alcuni servizi offrono un nodo personale dedicato e lo gestiscono per l'utente, mentre altri usano bilanciatori del carico per distribuire l'attività tra i nodi. +Alcuni servizi ti offrono il tuo nodo dedicato che gestiscono per te, mentre altri utilizzano bilanciatori di carico per distribuire l'attività tra i nodi. -Quasi tutti i servizi di nodo sono estremamente facili da integrare, richiedono modifiche di una sola riga di codice per sostituire il nodo originale o persino per passare da un servizio all'altro. +Quasi tutti i servizi dei nodi sono estremamente facili da integrare, comportando modifiche di una sola riga nel tuo codice per sostituire il tuo nodo auto-ospitato, o persino per passare da un servizio all'altro. -Spesso i servizi di nodo eseguono una varietà di [ client](/developers/docs/nodes-and-clients/#execution-clients) e [tipi di nodo](/developers/docs/nodes-and-clients/#node-types), che consentono di accedere a nodi completi e di archivio, oltre a metodi specifici del client in un'unica API. +Spesso i servizi dei nodi eseguiranno una varietà di [client di nodi](/developers/docs/nodes-and-clients/#execution-clients) e [tipi](/developers/docs/nodes-and-clients/#node-types), consentendoti di accedere a nodi completi e di archivio oltre a metodi specifici del client in un'unica API. -È importante notare che i servizi di nodo non memorizzano le chiavi né le informazioni private, e non lo devono fare. +È importante notare che i servizi dei nodi non memorizzano e non dovrebbero memorizzare le tue chiavi private o informazioni. -## Quali sono i vantaggi legati all'utilizzo di un servizio di nodo? {#benefits-of-using-a-node-service} +## Quali sono i vantaggi dell'utilizzo di un servizio di nodi? {#benefits-of-using-a-node-service} -Il vantaggio principale dell'utilizzo di un servizio di nodo è non dover dedicare il proprio tempo alla progettazione, alla manutenzione e alla gestione del nodo. Questo permette di concentrarsi sulla realizzazione del prodotto anziché sulla manutenzione dell'infrastruttura. +Il vantaggio principale dell'utilizzo di un servizio di nodi è non dover dedicare tempo ingegneristico alla manutenzione e alla gestione dei nodi da soli. Ciò ti consente di concentrarti sulla creazione del tuo prodotto piuttosto che doverti preoccupare della manutenzione dell'infrastruttura. -L'esecuzione di nodi può essere molto costosa in termini di spazio di archiviazione e larghezza di banda, per non parlare del tempo di progettazione. Aspetti come l'aggiunta di nodi durante il ridimensionamento, l'aggiornamento dei nodi alle versioni più recenti e la garanzia della coerenza dello stato possono togliere tempo e risorse alla creazione del prodotto web3 che si desidera realizzare. +Eseguire i propri nodi può essere molto costoso, dallo spazio di archiviazione alla larghezza di banda, fino al prezioso tempo ingegneristico. Cose come l'avvio di più nodi durante la scalabilità, l'aggiornamento dei nodi alle versioni più recenti e la garanzia della coerenza dello stato, possono distrarre dalla creazione e dall'impiego di risorse sul prodotto web3 desiderato. -## Quali sono gli svantaggi legati all'utilizzo di un servizio di nodo? {#cons-of-using-a-node-service} +## Quali sono gli svantaggi dell'utilizzo di un servizio di nodi? {#cons-of-using-a-node-service} -Utilizzando un servizio di nodo si centralizza l'aspetto dell'infrastruttura del prodotto. Per questo motivo, i progetti per cui la decentralizzazione ha la massima importanza potrebbero preferire nodi propri anziché un outsourcing a terzi. +Utilizzando un servizio di nodi stai centralizzando l'aspetto infrastrutturale del tuo prodotto. Per questo motivo, i progetti che ritengono la decentralizzazione di massima importanza potrebbero preferire l'auto-hosting dei nodi piuttosto che l'esternalizzazione a terzi. -Consulta i [vantaggi legati all'esecuzione di un nodo proprio](/developers/docs/nodes-and-clients/#benefits-to-you). +Maggiori informazioni sui [vantaggi dell'esecuzione del proprio nodo](/developers/docs/nodes-and-clients/#benefits-to-you). -## Servizi di nodo più popolari {#popular-node-services} +## Servizi di nodi popolari {#popular-node-services} -Ecco una lista di alcuni dei più popolari fornitori di nodi Ethereum. Aggiungine pure altri, se li conosci! Ogni servizio di nodo offre diversi vantaggi e funzionalità in aggiunta ai livelli gratuiti o a pagamento. Verifica quali corrispondono alle tue esigenze prima di prendere una decisione. +Ecco un elenco di alcuni dei fornitori di nodi di Ethereum più popolari, sentiti libero di aggiungere quelli mancanti! Ogni servizio di nodi offre vantaggi e funzionalità diversi oltre a livelli gratuiti o a pagamento, dovresti indagare su quali si adattano meglio alle tue esigenze prima di prendere una decisione. - [**Alchemy**](https://alchemy.com/) - - [Documentazione](https://docs.alchemyapi.io/) - - Caratteristiche - - Il più grande livello gratuito con 300M unità di calcolo al mese (circa 30M richieste di getLatestBlock) + - [Documentazione](https://www.alchemy.com/docs/) + - Funzionalità + - Il livello gratuito più ampio con 300 milioni di unità di calcolo al mese (\~30 milioni di richieste getLatestBlock) - Supporto multi-catena per Polygon, Starknet, Optimism, Arbitrum - - Alimenta circa il 70% delle maggiori dApp di Ethereum e del volume delle transazioni della DeFi + - Alimenta circa il 70% delle più grandi dApp di Ethereum e del volume delle transazioni DeFi - Avvisi webhook in tempo reale tramite Alchemy Notify - - Migliore supporto e affidabilità / stabilità + - Supporto e affidabilità/stabilità ai vertici della categoria - API NFT di Alchemy - - Pannello di Controllo con Request Explorer, Mempool Watcher, e Composer - - Accesso integrato al faucet della rete di prova - - Community Discord attiva di creatori con 18k utenti + - Dashboard con Request Explorer, Mempool Watcher e Composer + - Accesso integrato al rubinetto della rete di test + - Comunità attiva di sviluppatori su Discord con 18.000 utenti + +- [**Allnodes**](https://www.allnodes.com/) + - [Documentazione](https://docs.allnodes.com/) + - Funzionalità + - Nessun limite di frequenza con il token PublicNode creato nella pagina del portafoglio di Allnodes. + - Endpoint RPC gratuiti incentrati sulla privacy (oltre 100 blockchain) su [PublicNode](https://www.publicnode.com) + - Nodi dedicati senza limiti di frequenza per oltre 90 blockchain + - Nodi di archivio dedicati per oltre 30 blockchain + - Disponibile in 3 regioni (Stati Uniti, UE, Asia) + - Snapshot per oltre 100 blockchain su [PublicNode](https://www.publicnode.com/snapshots) + - Supporto tecnico 24/7 con SLA di uptime del 99,90%-99,98% (a seconda del piano). + - Prezzi con pagamento orario + - Pagamento con carta di credito, PayPal o criptovaluta - [**All That Node**](https://allthatnode.com/) - [Documentazione](https://docs.allthatnode.com/) - - Caratteristiche + - Funzionalità - 50.000 richieste al giorno con il livello gratuito - Supporto per oltre 40 protocolli - - API di JSON-RPC (EVM, Tendermint), REST e Websocket supportate - - Accesso illimitato per archiviare dati - - Supporto tecnico 24/7 e 99,9% di tempo d'attività - - Faucet disponibile su diverse chain - - Accesso illimitato all'endpoint con un numero illimitato di chiavi API - - API Traccia/Debug supportata + - API JSON-RPC (EVM, Tendermint), REST e Websocket supportate + - Accesso illimitato ai dati di archivio + - Supporto tecnico 24/7 e uptime superiore al 99,9% + - Rubinetto disponibile su più catene + - Accesso illimitato agli endpoint con un numero illimitato di chiavi API + - API Trace/Debug supportate - Aggiornamenti automatizzati -- [**Blockchain gestita da Amazon**](https://aws.amazon.com/managed-blockchain/) +- [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/) - [Documentazione](https://aws.amazon.com/managed-blockchain/resources/) - - Caratteristiche - - Nodi di Ethereum gestiti interamente + - Funzionalità + - Nodi di Ethereum completamente gestiti - Disponibile in sei regioni - - JSON-RPC su HTTP e WebSocket sicure + - JSON-RPC su HTTP e WebSocket sicuri - Supporta 3 catene - - SLA, Supporto ad AWS 24/7 + - SLA, supporto AWS 24/7 - Go-ethereum e Lighthouse - [**Ankr**](https://www.ankr.com/) - [Documentazione](https://docs.ankr.com/) - - Caratteristiche - - Protocollo Ankr - accesso aperto agli endpoint API RPC pubblici per oltre 8 catene - - Bilanciamento del carico e monitoraggio della salute del nodo per un gateway veloce e affidabile al più vicino nodo disponibile - - Livello premium che consente l'endpoint WSS e limite di velocità illimitato - - Distribuzione completa in un click del nodo e del suo validatore per oltre 40 catene - - Ridimensionamento secondo le esigenze + - Funzionalità + - Protocollo Ankr: accesso aperto agli endpoint API RPC pubblici per oltre 8 catene + - Bilanciamento del carico e monitoraggio della salute dei nodi per un gateway veloce e affidabile verso il nodo disponibile più vicino + - Livello Premium che abilita l'endpoint WSS e un limite di frequenza illimitato + - Distribuzione di nodi completi e nodi validatori con un clic per oltre 40 catene + - Scala in base alle tue esigenze - Strumenti di analisi - - Pannello di controllo + - Dashboard - Endpoint RPC, HTTPS e WSS - - Assistenza diretta + - Supporto diretto - [**Blast**](https://blastapi.io/) - [Documentazione](https://docs.blastapi.io/) - - Caratteristiche + - Funzionalità - Supporto RPC e WSS - - Hosting multiregionale dei nodi + - Hosting di nodi multi-regione - Infrastruttura decentralizzata - - API pubblica + - API pubbliche - Piano gratuito dedicato - - Supporto multicatena (oltre 17 blockchain) - - Nodi archivio - - Supporto su Discord 24/7 + - Supporto multi-catena (oltre 17 blockchain) + - Nodi di archivio + - Supporto Discord 24/7 - Monitoraggio e avvisi 24/7 - Uno SLA complessivo del 99,9% - - Pagamento in criptovalute + - Pagamento in criptovaluta - [**BlockDaemon**](https://blockdaemon.com/) - [Documentazione](https://ubiquity.docs.blockdaemon.com/) - Vantaggi - - Pannello di gestione - - In base al nodo + - Dashboard + - Su base per nodo - Analisi - [**BlockPI**](https://blockpi.io/) - [Documentazione](https://docs.blockpi.io/) - - Caratteristiche - - Struttura del nodo robusta e distribuita + - Funzionalità + - Struttura dei nodi robusta e distribuita - Fino a 40 endpoint HTTPS e WSS - Pacchetto di iscrizione gratuito e pacchetto mensile - - Metodo di tracciamento + Supporto ai dati d'archivio + - Metodo Trace + supporto per i dati di archivio - Pacchetti con validità fino a 90 giorni - Piano personalizzato e pagamento a consumo - - Pagamento in criptovalute + - Pagamento in criptovaluta - Supporto diretto e supporto tecnico - [**Chainbase**](https://www.chainbase.com/) - [Documentazione](https://docs.chainbase.com) - - Caratteristiche - - Servizi RPC altamente disponibili, veloci e scalabili + - Funzionalità + - Servizio RPC altamente disponibile, veloce e scalabile - Supporto multi-catena - Tariffe gratuite - - Pannelli di controllo facili da usare + - Dashboard intuitiva - Fornisce servizi di dati blockchain oltre a RPC - [**Chainstack**](https://chainstack.com/) - [Documentazione](https://docs.chainstack.com/) - - Caratteristiche + - Funzionalità - Nodi condivisi gratuiti - - Nodi d'archivio condivisi - - Supporto a GraphQL + - Nodi di archivio condivisi + - Supporto GraphQL - Endpoint RPC e WSS - - Nodi completi e d'archivio dedicati - - Tempo di sincronizzazione veloce per distribuzioni dedicate - - Bring your cloud - - Tariffe orarie - - Assistenza diretta 24 ore su 24, 7 giorni su 7 - -- [**DRPC**](https://drpc.org/) - - [Documentazione](https://docs.drpc.org/) - - Caratteristiche - - Nodi RPC decentralizzati - - Oltre 15 fornitori di nodi - - Bilanciamento dei nodi - - Unità di calcolo illimitate al mese con il livello gratuito - - Verifica dei dati - - Endpoint personalizzati - - Endpoint HTTP e WSS - - Chiavi illimitate (livello gratuito e a pagamento) - - Opzioni di fallback flessibili - - [Endpoint pubblico](https://eth.drpc.org) - - Nodi archivio condivisi gratuiti + - Nodi completi e di archivio dedicati + - Tempi di sincronizzazione rapidi per distribuzioni dedicate + - Porta il tuo cloud + - Prezzi con pagamento orario + - Supporto diretto 24/7 + +- [**dRPC**](https://drpc.org/) + - [Documentazione](https://drpc.org/docs) + - NodeCloud: infrastruttura RPC plug-n-play a partire da $10 (USD) — massima velocità, nessun limite + - Funzionalità di NodeCloud: + - Supporto API per 185 reti + - Pool distribuito di oltre 40 fornitori + - Copertura globale con nove (9) geo-cluster + - Sistema di bilanciamento del carico basato sull'intelligenza artificiale + - Prezzi forfettari a consumo: nessun aumento, nessuna scadenza, nessun vincolo + - Chiavi illimitate, modifiche granulari delle chiavi, ruoli del team, protezione front-end + - Tariffa fissa per i metodi a 20 unità di calcolo (CU) per metodo + - [Elenco delle catene di endpoint pubblici](https://drpc.org/chainlist) + - [Calcolatore dei prezzi](https://drpc.org/pricing#calculator) + - NodeCore: stack open source per le organizzazioni che desiderano il pieno controllo - [**GetBlock**](https://getblock.io/) - - [Documenti](https://getblock.io/docs/get-started/authentication-with-api-key/) - - Caratteristiche - - Accesso a oltre 40 nodi della blockchain + - [Documentazione](https://getblock.io/docs/get-started/authentication-with-api-key/) + - Funzionalità + - Accesso a oltre 40 nodi blockchain - 40.000 richieste giornaliere gratuite - Numero illimitato di chiavi API - - Elevata velocità di connessione a 1GB/sec - - Traccia+Archivio + - Alta velocità di connessione a 1 GB/sec + - Trace+Archive - Analisi avanzate - Aggiornamenti automatizzati - Supporto tecnico - [**InfStones**](https://infstones.com/) - - Caratteristiche - - Opzione livello gratuito - - Ridimensionamento secondo le esigenze + - Funzionalità + - Opzione di livello gratuito + - Scala in base alle tue esigenze - Analisi - - Pannello di controllo - - Endpoint API univoci + - Dashboard + - Endpoint API unici - Nodi completi dedicati - - Tempo di sincronizzazione veloce per distribuzioni dedicate - - Assistenza diretta 24 ore su 24, 7 giorni su 7 - - Accesso a oltre 50 nodi della blockchain + - Tempi di sincronizzazione rapidi per distribuzioni dedicate + - Supporto diretto 24/7 + - Accesso a oltre 50 nodi blockchain - [**Infura**](https://infura.io/) - - [Documenti](https://infura.io/docs) - - Caratteristiche - - Opzione livello gratuito - - Ridimensionamento secondo le esigenze - - Dati di archiviazione a pagamento - - Assistenza diretta - - Pannello di controllo + - [Documentazione](https://infura.io/docs) + - Funzionalità + - Opzione di livello gratuito + - Scala in base alle tue esigenze + - Dati di archivio a pagamento + - Supporto diretto + - Dashboard - [**Kaleido**](https://kaleido.io/) - [Documentazione](https://docs.kaleido.io/) - - Caratteristiche + - Funzionalità - Livello iniziale gratuito - - Distribuzione del nodo di Ethereum in un clic + - Distribuzione del nodo di Ethereum con un clic - Client e algoritmi personalizzabili (Geth, Quorum e Besu || PoA, IBFT e Raft) - Oltre 500 API amministrative e di servizio - Interfaccia RESTful per l'invio di transazioni di Ethereum (supportata da Apache Kafka) - Flussi in uscita per la consegna degli eventi (supportati da Apache Kafka) - - Raccolta approfondita di servizi "off-chain" e ausiliari (es. trasporto bilaterale di messaggistica crittografata) - - Semplice integrazione di rete con governance e controllo dell'accesso basato sul ruolo - - Sofisticata gestione dell'utente per amministratori e utenti finali - - Infrastruttura altamente scalabile, resiliente e di livello enterprise - - Gestione delle chiavi private HSM del cloud - - Tethering della Rete Principale di Ethereum - - Certificazioni ISO 27k e SOC 2, di Tipo 2 - - Configurazione di runtime dinamica (es. aggiungere integrazioni del cloud, alterare gli ingressi del nodo, ecc.) - - Supporto per orchestrazioni multi-cloud, multiregionali e con distribuzione ibrida - - Tariffe orarie semplici basate su Saas - - Supporto SLA e 24x7 + - Ampia raccolta di servizi "fuori catena" e ausiliari (ad es. trasporto di messaggistica crittografata bilaterale) + - Onboarding di rete semplice con governance e controllo degli accessi basato sui ruoli + - Gestione sofisticata degli utenti sia per gli amministratori che per gli utenti finali + - Infrastruttura di livello aziendale altamente scalabile e resiliente + - Gestione delle chiavi private Cloud HSM + - Tethering alla rete principale di Ethereum + - Certificazioni ISO 27k e SOC 2, Tipo 2 + - Configurazione dinamica a runtime (ad es. aggiunta di integrazioni cloud, modifica degli ingressi dei nodi, ecc.) + - Supporto per orchestrazioni di distribuzione multi-cloud, multi-regione e ibride + - Prezzi SaaS orari semplici + - SLA e supporto 24x7 - [**Lava Network**](https://www.lavanet.xyz/) - [Documentazione](https://docs.lavanet.xyz/) - - Caratteristiche - - Utilizzo gratuito di Testnet - - Ridondanza decentralizzata per un elevato tempo di attività. - - Open-source + - Funzionalità + - Uso gratuito della rete di test + - Ridondanza decentralizzata per un elevato uptime + - Open source - SDK completamente decentralizzato - - Integrazione di Ethers.js - - Interfaccia di gestione del progetto intuitiva + - Integrazione con Ethers.js + - Interfaccia intuitiva per la gestione dei progetti - Integrità dei dati basata sul consenso - Supporto multi-catena - [**Moralis**](https://moralis.io/) - [Documentazione](https://docs.moralis.io/) - - Caratteristiche + - Funzionalità - Nodi condivisi gratuiti - - Nodi archivio condivisi gratuiti - - Incentrato sulla privacy (nessuna politica sui registri) - - Supporto tra catene - - Ridimensionamento secondo le esigenze - - Pannello di controllo - - SDK Ethereum univoco - - Endpoint API univoci + - Nodi di archivio condivisi gratuiti + - Incentrato sulla privacy (politica no-log) + - Supporto cross-chain + - Scala in base alle tue esigenze + - Dashboard + - SDK di Ethereum unico + - Endpoint API unici - Supporto tecnico diretto - [**NodeReal MegaNode**](https://nodereal.io/) - [Documentazione](https://docs.nodereal.io/docs/introduction) - - Caratteristiche + - Funzionalità - Servizi API RPC affidabili, veloci e scalabili - - API migliorata per sviluppatori web3 + - API migliorate per gli sviluppatori web3 - Supporto multi-catena - Inizia gratuitamente - [**NOWNodes**](https://nownodes.io/) - - Caratteristiche - - Accesso a oltre 50 nodi della blockchain + - Funzionalità + - Accesso a oltre 50 nodi blockchain - Chiave API gratuita - Esploratori di blocchi - - Tempo di risposta dell'API ⩽ 1 sec - - Team di assistenza 24 ore su 24/7 giorni su 7 - - Gestore personale dell'account + - Tempo di risposta API ⩽ 1 sec + - Team di supporto 24/7 + - Account manager personale - Nodi condivisi, di archivio, di backup e dedicati - [**Pocket Network**](https://www.pokt.network/) - - [Docs](https://docs.pokt.network/) - - Caratteristiche - - Protocollo RPC e mercato decentralizzati - - Livello con 1 milione di richieste giornaliere gratuite (per endpoint, max. 2) - - Programma Pre-Stake+ (se servono più di 1 milione di richieste al giorno) - - Più di 15 blockchain supportate - - Più di 6.400 nodi che guadagnano POKT a servizio delle applicazioni - - Nodo d'archiviazione, nodo d'archiviazione con tracciamento e supporto ai nodi di Testnet + - [Documentazione](https://docs.pokt.network/) + - Funzionalità + - Protocollo RPC decentralizzato e marketplace + - Livello gratuito di 1 milione di richieste al giorno (per endpoint, max 2) + - Programma Pre-Stake+ (se hai bisogno di più di 1 milione di richieste al giorno) + - Oltre 15 blockchain supportate + - Oltre 6400 nodi che guadagnano POKT per servire le applicazioni + - Supporto per nodi di archivio, nodi di archivio con tracciamento e nodi della rete di test - Diversità dei client dei nodi della rete principale di Ethereum - - Nessun punto di errore unico - - Nessun tempo d'inattività - - Tokenomic a bassissimo costo (esegui lo staking di POKT una volta per la larghezza di banda di rete) - - Nessun costo mensile irrecuperabile, trasforma la tua infrastruttura in una risorsa - - Bilanciamento di carico integrato nel protocollo - - Ridimensiona illimitatamente il numero di richieste giornaliere e nodi orari in base alle esigenze + - Nessun singolo punto di guasto + - Zero tempi di inattività + - Tokenomics conveniente quasi a zero (metti in staking POKT una volta per la larghezza di banda della rete) + - Nessun costo irrecuperabile mensile, trasforma la tua infrastruttura in un asset + - Bilanciamento del carico integrato nel protocollo + - Scala all'infinito il numero di richieste al giorno e di nodi all'ora in base alle tue esigenze - L'opzione più privata e resistente alla censura - - Supporto pratico per sviluppatori + - Supporto pratico per gli sviluppatori - Dashboard e analisi di [Pocket Portal](https://bit.ly/ETHorg_POKTportal) - [**QuickNode**](https://www.quicknode.com) - - [Docs](https://www.quicknode.com/docs/) - - Caratteristiche - - Supporto tecnico 24/7 e community Discord di sviluppatori - - Bilanciamento geografico, multi-cloud/metal, rete a bassa latenza - - Supporto multi-catena (Optimism, Arbitrum, Polygon e altri 11) - - Livelli intermedi per velocità e stabilità (indirizzamento di chiamata, cache, indicizzazione) - - Monitoraggio del contratto intelligente tramite Webhook - - Pannello di controllo intuitivo, suite di analisi, RPC composer - - Funzionalità di sicurezza avanzate (JWT, mascheratura, whitelist) - - API di dati e analisi NFT - - [Certificazione SOC2](https://www.quicknode.com/security) - - Adatto agli sviluppatori per imprese + - [Documentazione](https://www.quicknode.com/docs/) + - Funzionalità + - Supporto tecnico 24/7 e comunità di sviluppatori su Discord + - Rete geo-bilanciata, multi-cloud/metal, a bassa latenza + - Supporto multi-catena (Optimism, Arbitrum, Polygon + altre 11) + - Livelli intermedi per velocità e stabilità (instradamento delle chiamate, cache, indicizzazione) + - Monitoraggio dei contratti intelligenti tramite Webhook + - Dashboard intuitiva, suite di analisi, compositore RPC + - Funzionalità di sicurezza avanzate (JWT, mascheramento, whitelisting) + - API per dati e analisi NFT + - [Certificato SOC2](https://www.quicknode.com/security) + - Adatto da sviluppatori ad aziende - [**Rivet**](https://rivet.cloud/) - - [Docs](https://rivet.readthedocs.io/en/latest/) - - Caratteristiche - - Opzione livello gratuito - - Ridimensionamento secondo le esigenze + - [Documentazione](https://rivet.readthedocs.io/en/latest/) + - Funzionalità + - Opzione di livello gratuito + - Scala in base alle tue esigenze - [**SenseiNode**](https://senseinode.com) - - [Docs](https://docs.senseinode.com/) - - Caratteristiche + - [Documentazione](https://docs.senseinode.com/) + - Funzionalità - Nodi dedicati e condivisi - - Pannello di controllo - - Hosting di AWS su più fornitori di hosting in diversi luoghi in America Latina - - Client di Prysm e Lighthouse + - Dashboard + - Hosting fuori da AWS su più fornitori di hosting in diverse località dell'America Latina + - Client Prysm e Lighthouse - [**SettleMint**](https://console.settlemint.com/) - - [Documenti](https://docs.settlemint.com/) - - Caratteristiche + - [Documentazione](https://docs.settlemint.com/) + - Funzionalità - Prova gratuita - - Ridimensionamento secondo le esigenze - - Supporto a GraphQL + - Scala in base alle tue esigenze + - Supporto GraphQL - Endpoint RPC e WSS - Nodi completi dedicati - - Bring your cloud + - Porta il tuo cloud - Strumenti di analisi - - Pannello di controllo - - Tariffe orarie - - Assistenza diretta + - Dashboard + - Prezzi con pagamento orario + - Supporto diretto - [**Tenderly**](https://tenderly.co/web3-gateway) - - [Documenti](https://docs.tenderly.co/web3-gateway/web3-gateway) - - Caratteristiche - - Livello gratuito con 25 milioni di unità di Tenderly al mese + - [Documentazione](https://docs.tenderly.co/web3-gateway/web3-gateway) + - Funzionalità + - Livello gratuito che include 25 milioni di Tenderly Unit al mese - Accesso gratuito ai dati storici - - Carichi di lavoro gravosi in lettura fino a 8 volte più veloci - - Accesso di lettura coerente al 100% + - Carichi di lavoro ad alta intensità di lettura fino a 8 volte più veloci + - Accesso in lettura coerente al 100% - Endpoint JSON-RPC - - Generatore di richieste RPC e anteprima delle richieste basati sull'interfaccia utente - - Completamente integrato con gli strumenti di sviluppo, debug e test di Tenderly - - Simulazioni delle transazioni - - Analisi di utilizzo e filtraggio - - Facile gestione delle chiavi d'accesso + - Generatore di richieste RPC basato su interfaccia utente e anteprima delle richieste + - Strettamente integrato con gli strumenti di sviluppo, debug e test di Tenderly + - Simulazioni di transazioni + - Analisi e filtraggio dell'utilizzo + - Gestione delle chiavi di accesso semplificata - Supporto ingegneristico dedicato tramite chat, e-mail e Discord - [**Tokenview**](https://services.tokenview.io/) - - [Documenti](https://services.tokenview.io/docs?type=nodeService) - - Caratteristiche - - Supporto tecnico 24/7 & comunità di sviluppatori su Telegram - - Supporto di più blockchain (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) - - Sia gli endpoint RPC che WSS sono aperti all'uso - - Accesso illimitato ad API di dati d'archivio - - Pannello di controllo con Request Explorer e Mempool Watcher - - API per dati NFT e notifiche per Webhook - - Paga in criptovalute - - Supporto esterno per ulteriori requisiti di funzionalità + - [Documentazione](https://services.tokenview.io/docs?type=nodeService) + - Funzionalità + - Supporto tecnico 24/7 e comunità di sviluppatori su Telegram + - Supporto multi-catena (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) + - Entrambi gli endpoint RPC e WSS sono aperti all'uso + - Accesso illimitato all'API dei dati di archivio + - Dashboard con Request Explorer e Mempool Watcher + - API per dati NFT e notifiche Webhook + - Pagamento in criptovaluta + - Supporto esterno per requisiti di comportamento aggiuntivi - [**Watchdata**](https://watchdata.io/) - - [Documenti](https://docs.watchdata.io/) - - Caratteristiche - - Attendibilità dei dati + - [Documentazione](https://docs.watchdata.io/) + - Funzionalità + - Affidabilità dei dati - Connessione ininterrotta senza tempi di inattività - - Automazione di processo + - Automazione dei processi - Tariffe gratuite - - Limiti elevati che si adattano a qualsiasi utente + - Limiti elevati adatti a qualsiasi utente - Supporto per vari nodi - - Ridimensionamento delle risorse - - Velocità d'elaborazione elevate + - Scalabilità delle risorse + - Elevate velocità di elaborazione - [**ZMOK**](https://zmok.io/) - - [Documenti](https://docs.zmok.io/) - - Caratteristiche + - [Documentazione](https://docs.zmok.io/) + - Funzionalità - Front-running come servizio - - Mempool di transazioni globale con metodi di ricerca/filtraggio - - Commissione TX illimitata e carburante infinito per inviare le transazioni - - Ottenimento più veloce del nuovo blocco e lettura della blockchain - - Il miglior prezzo per garanzia di chiamata dell'API + - Mempool di transazioni globali con metodi di ricerca/filtraggio + - Commissione di transazione illimitata e gas infinito per l'invio di transazioni + - Ottenimento più rapido del nuovo blocco e lettura della blockchain + - Garanzia del miglior prezzo per chiamata API - [**Zeeve**](https://www.zeeve.io/) - - [Documenti](https://www.zeeve.io/docs/) - - Caratteristiche - - Piattaforma di automazione senza codice di livello enterprise che fornisce la distribuzione, il monitoraggio e la gestione dei nodi e delle reti Blockchain - - Oltre 30 protocolli e integrazioni supportati, e altri in arrivo - - Servizi dell'infrastruttura web3 dal valore aggiunto, quali archiviazione decentralizzata, identità decentralizzata e API dei dati del Libro Mastro della Blockchain per casi d'uso del mondo reale - - Supporto 24/7 e monitoraggio proattivo assicurano la costante salute dei nodi. - - Gli endpoint RPC offrono l'accesso autenticato alle API, la gestione semplice con intuitivi pannelli di controllo e statistiche. - - Offre opzioni di cloud gestito e di bring your own cloud tra cui scegliere e supporta tutti i principali fornitori di cloud come AWS, Azure, Google Cloud, Digital Ocean e on-premise. - - Utilizziamo l'instradamento intelligente per colpire sempre il nodo più vicino al tuo utente + - [Documentazione](https://www.zeeve.io/docs/) + - Funzionalità + - Piattaforma di automazione no-code di livello aziendale che fornisce distribuzione, monitoraggio e gestione di nodi e reti blockchain + - Oltre 30 protocolli e integrazioni supportati, in continuo aumento + - Servizi di infrastruttura web3 a valore aggiunto come archiviazione decentralizzata, identità decentralizzata e API di dati del registro blockchain per casi d'uso reali + - Supporto 24/7 e monitoraggio proattivo garantiscono la salute dei nodi in ogni momento. + - Gli endpoint RPC offrono accesso autenticato alle API, gestione senza problemi con dashboard intuitiva e analisi. + - Fornisce opzioni di cloud gestito e "porta il tuo cloud" tra cui scegliere e supporta tutti i principali fornitori di cloud come AWS, Azure, Google Cloud, Digital Ocean e on-premise. + - Utilizziamo l'instradamento intelligente per raggiungere ogni volta il nodo più vicino al tuo utente ## Letture consigliate {#further-reading} -- [Elenco di servizi di nodi Ethereum](https://ethereumnodes.com/) +- [Elenco dei servizi di nodi di Ethereum](https://ethereumnodes.com/) ## Argomenti correlati {#related-topics} -- [ Nodi e client](/developers/docs/nodes-and-clients/) +- [Nodi e client](/developers/docs/nodes-and-clients/) ## Tutorial correlati {#related-tutorials} -- [Primi passi nello sviluppo di Ethereum usando Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) -- [Guida all'invio di transazioni tramite web3 e Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +- [Iniziare con lo sviluppo su Ethereum usando Alchemy](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) +- [Guida all'invio di transazioni usando web3 e Alchemy](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md index 8b40abd446b..3aa3f338aaf 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/run-a-node/index.md @@ -1,182 +1,184 @@ --- title: Avvia il tuo nodo di Ethereum -description: Introduzione generale all'esecuzione della propria istanza di un client di Ethereum. +description: Introduzione generale all'esecuzione della tua istanza di un client di Ethereum. lang: it sidebarDepth: 2 --- -Eseguire il tuo nodo ti offre vari benefici, apre nuove possibilità e aiuta a supportare l'ecosistema. Questa pagina ti guiderà verso l'avvio del tuo nodo e la partecipazione alla convalida delle transazioni di Ethereum. +Eseguire il tuo nodo ti offre vari vantaggi, apre nuove possibilità e aiuta a supportare l'ecosistema. Questa pagina ti guiderà nell'avvio del tuo nodo e nella partecipazione alla convalida delle transazioni di [Ethereum](/). -Si noti che, dopo [La Fusione](/roadmap/merge), sono necessari due client per eseguire un nodo di Ethereum; un client del **livello di esecuzione (EL)** e un client del **livello di consenso (CL)**. Questa pagina mostrerà come installare, configurare e connettere questi due client per eseguire un nodo di Ethereum. +Nota che dopo [Il Merge](/roadmap/merge), sono necessari due client per eseguire un nodo di Ethereum; un client del **livello di esecuzione (EL)** e un client del **livello di consenso (CL)**. Questa pagina mostrerà come installare, configurare e connettere questi due client per eseguire un nodo di Ethereum. ## Prerequisiti {#prerequisites} -Dovresti sapere cos'è un nodo di Ethereum e per quali motivi potresti voler eseguire un client. Questo aspetto è trattato in [Nodi e client](/developers/docs/nodes-and-clients/). +Dovresti capire cos'è un nodo di Ethereum e perché potresti voler eseguire un client. Questo argomento è trattato in [Nodi e client](/developers/docs/nodes-and-clients/). -Se sei nuovo al tema dell'esecuzione di un nodo, o stai cercando un percorso meno tecnico, ti consigliamo prima di dare un'occhiata alla nostra introduzione user-friendly su come [Eseguire un nodo di Ethereum](/run-a-node). +Se sei nuovo all'argomento dell'esecuzione di un nodo, o cerchi un percorso meno tecnico, ti consigliamo di dare prima un'occhiata alla nostra introduzione intuitiva sull'[eseguire un nodo di Ethereum](/run-a-node). ## Scegliere un approccio {#choosing-approach} -Il primo passo nell'avvio del tuo nodo è scegliere l’approccio che vuoi seguire. A seconda dei requisiti e delle varie possibilità, devi selezionare l'implementazione del client (sia di esecuzione che di consenso), l'ambiente (hardware, sistema) e i parametri per le impostazioni del client. +Il primo passo per avviare il tuo nodo è scegliere il tuo approccio. In base ai requisiti e alle varie possibilità, devi selezionare l'implementazione del client (sia dei client di esecuzione che di consenso), l'ambiente (hardware, sistema) e i parametri per le impostazioni del client. -Questa pagina ti guiderà per queste decisioni e ti aiuterà a trovare il modo più adatto per eseguire la tua istanza di Ethereum. +Questa pagina ti guiderà attraverso queste decisioni e ti aiuterà a trovare il modo più adatto per eseguire la tua istanza di Ethereum. -Per scegliere tra le implementazioni del client, visualizza tutti i [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e i [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) pronti e disponibili della Rete Principale e scopri di più sulla [diversità dei client](/developers/docs/nodes-and-clients/client-diversity). +Per scegliere tra le implementazioni dei client, vedi tutti i [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e i [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) pronti per la rete principale disponibili e scopri di più sulla [diversità dei client](/developers/docs/nodes-and-clients/client-diversity). Decidi se eseguire il software sul tuo [hardware o nel cloud](#local-vs-cloud), considerando i [requisiti](#requirements) dei client. -Dopo aver preparato l'ambiente, installa i client scelti con l'[interfaccia per principianti](#automatized-setup) o [manualmente](#manual-setup), usando un terminale con le opzioni avanzate. +Dopo aver preparato l'ambiente, installa i client scelti con un'[interfaccia adatta ai principianti](#automatized-setup) o [manualmente](#manual-setup) usando un terminale con opzioni avanzate. -Quando il nodo è in esecuzione e sincronizzazione, sei pronto a [usarlo](#using-the-node), ma assicurati di tenerne d'occhio la [manutenzione](#operating-the-node). +Quando il nodo è in esecuzione e in sincronizzazione, sei pronto per [usarlo](#using-the-node), ma assicurati di tenere d'occhio la sua [manutenzione](#operating-the-node). ![Configurazione del client](./diagram.png) -### Ambiente e Hardware {#environment-and-hardware} +### Ambiente e hardware {#environment-and-hardware} -#### Locale o su cloud {#local-vs-cloud} +#### Locale o cloud {#local-vs-cloud} -I client di Ethereum possono funzionare su computer di livelo consumer e non richiedono alcun hardware speciale, come ad esempio per le macchine di mining. Dunque, hai varie opzioni per distribuire il nodo a seconda delle tue esigenze. Per semplificare, pensiamo all'esecuzione di un nodo sia su una macchina fisica locale che su un server cloud: +I client di Ethereum sono in grado di funzionare su computer di livello consumer e non richiedono alcun hardware speciale, come ad esempio le macchine per il mining. Pertanto, hai varie opzioni per distribuire il nodo in base alle tue esigenze. +Per semplificare, pensiamo all'esecuzione di un nodo sia su una macchina fisica locale che su un server cloud: - Cloud - - I fornitori offrono tempi di disponibilità elevati del server e indirizzi IP pubblici statici - - Ottenere un server dedicato o virtuale può esser più comodo che creare il proprio - - Il compromesso è doversi affidare a una terza parte: il fornitore del server - - A causa della dimensione d'archiviazione richiesta per il nodo completo, il prezzo di un server affittato potrebbe essere alto -- Hardware proprio - - Approccio più autonomo e senza fiducia + - I provider offrono un elevato tempo di attività del server e indirizzi IP pubblici statici + - Ottenere un server dedicato o virtuale può essere più comodo che costruirne uno proprio + - Il compromesso è fidarsi di una terza parte: il fornitore del server + - A causa delle dimensioni di archiviazione richieste per un nodo completo, il prezzo di un server a noleggio potrebbe diventare alto +- Proprio hardware + - Approccio più sovrano e senza bisogno di fiducia (trustless) - Investimento una tantum - - Possibilità di acquistare macchine pre-configurate - - Devi preparare, mantenere e potenzialmente risolvere i problemi della macchina e di rete, fisicamente + - Un'opzione per acquistare macchine preconfigurate + - Devi preparare fisicamente, mantenere e potenzialmente risolvere i problemi della macchina e della rete -Le due opzioni presentano vantaggi differenti, sopra riassunti. Se cerchi una soluzione su cloud, oltre a molti fornitori informatici di cloud tradizionali, esistono anche servizi incentrati sulla distribuzione dei nodi. Dai anche un'occhiata a [nodi come servizi](/developers/docs/nodes-and-clients/nodes-as-a-service/) per ulteriori opzioni sui nodi ospitati. +Entrambe le opzioni presentano diversi vantaggi riassunti sopra. Se stai cercando una soluzione cloud, oltre a molti fornitori tradizionali di cloud computing, ci sono anche servizi focalizzati sulla distribuzione di nodi. Dai un'occhiata ai [nodi come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service/) per ulteriori opzioni sui nodi ospitati. #### Hardware {#hardware} -Tuttavia, una rete decentralizzata e resistente alla censura non dovrebbe affidarsi ai fornitori cloud. Invece, eseguire il tuo nodo sul tuo hardware locale è più sano per l'ecosistema. Le [stime](https://www.ethernodes.org/network-types) mostrano una grande quantità di nodi eseguiti sul cloud, che potrebbero diventare un punto di errore unico. +Tuttavia, una rete decentralizzata e resistente alla censura non dovrebbe fare affidamento sui fornitori di cloud. Invece, eseguire il tuo nodo sul tuo hardware locale è più salutare per l'ecosistema. Le [stime](https://www.ethernodes.org/networkType/cl/Hosting) mostrano che un'ampia quota di nodi viene eseguita sul cloud, il che potrebbe diventare un singolo punto di guasto. -I client di Ethereum possono essere eseguiti sul tuo computer, laptop, server, o persino su un computer a scheda singola. Benché eseguire i client sul tuo computer fisso sia possibile, avere una macchina dedicata solo per il tuo nodo può migliorarne significativamente le prestazioni e la sicurezza, minimizzando l'impatto sul tuo computer principale. +I client di Ethereum possono essere eseguiti sul tuo computer, laptop, server o persino su un computer a scheda singola. Sebbene sia possibile eseguire i client sul tuo personal computer, avere una macchina dedicata solo per il tuo nodo può migliorarne significativamente le prestazioni e la sicurezza, riducendo al minimo l'impatto sul tuo computer principale. -Usare il tuo hardware può essere molto facile. Esistono molte opzioni semplici, nonché configurazioni avanzate per gli utenti più tecnici. Quindi, diamo un'occhiata ai requisiti e ai mezzi per eseguire i client di Ethereum sulla tua macchina. +Usare il proprio hardware può essere molto semplice. Ci sono molte opzioni semplici così come configurazioni avanzate per persone più tecniche. Quindi esaminiamo i requisiti e i mezzi per eseguire i client di Ethereum sulla tua macchina. #### Requisiti {#requirements} -I requisiti hardware differiscono in base al client, ma in genere non sono così elevati dal momento che il nodo deve solo rimanere sincronizzato. Non va confuso con il mining, che invece richiede molta più potenza di calcolo. Il tempo di sincronizzazione e le prestazioni naturalmente migliorano con hardware più potente. +I requisiti hardware differiscono in base al client, ma in genere non sono così elevati poiché il nodo deve solo rimanere sincronizzato. Non confonderlo con il mining, che richiede molta più potenza di calcolo. Il tempo di sincronizzazione e le prestazioni migliorano tuttavia con un hardware più potente. -Prima di installare qualsiasi client, assicurati che il tuo computer abbia abbastanza risorse per eseguirlo. Puoi trovare i requisiti minimi e consigliati di seguito. +Prima di installare qualsiasi client, assicurati che il tuo computer abbia risorse sufficienti per eseguirlo. Puoi trovare i requisiti minimi e consigliati di seguito. -L'ostacolo per il tuo hardware è principalmente lo spazio su disco. Sincronizzare la blockchain Ethereum richiede molte risorse in ingresso/uscita e richiede molto spazio. È meglio avere un **disco a stato solido (SSD)**, con centinaia di GB di spazio libero risparmiati anche dopo la sincronizzazione. +Il collo di bottiglia per il tuo hardware è principalmente lo spazio su disco. La sincronizzazione della blockchain di Ethereum è molto intensiva in termini di input/output e richiede molto spazio. È meglio avere un'**unità a stato solido (SSD)** con centinaia di GB di spazio libero a disposizione anche dopo la sincronizzazione. -Le dimensioni del database e la velocità della sincronizzazione iniziale dipendono dal client scelto, dalla sua configurazione e dalla [strategia di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes). +La dimensione del database e la velocità della sincronizzazione iniziale dipendono dal client scelto, dalla sua configurazione e dalla [strategia di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes). -Assicurati anche che la tua connessione a internet non sia limitata da un [limite di larghezza di banda](https://wikipedia.org/wiki/Data_cap). Si consiglia di non usare una connessione a consumo poiché la sincronizzazione iniziale e i dati trasmessi alla rete potrebbero superare il limite di traffico. +Assicurati inoltre che la tua connessione Internet non sia limitata da un [limite di larghezza di banda](https://wikipedia.org/wiki/Data_cap). Si consiglia di utilizzare una connessione a consumo illimitato poiché la sincronizzazione iniziale e i dati trasmessi alla rete potrebbero superare il tuo limite. ##### Sistema operativo -Tutti i client supportano i principali sistemi operativi: Linux, MacOS, Windows. Questo significa che puoi eseguire i nodi su macchine desktop o server ordinarie con il sistema operativo (OS) più adatto alle tue esigenze. Assicurati che il tuo OS sia aggiornato per evitare possibili problemi e vulnerabilità di sicurezza. +Tutti i client supportano i principali sistemi operativi: Linux, MacOS, Windows. Ciò significa che puoi eseguire nodi su normali macchine desktop o server con il sistema operativo (OS) più adatto a te. Assicurati che il tuo sistema operativo sia aggiornato per evitare potenziali problemi e vulnerabilità di sicurezza. ##### Requisiti minimi - CPU con 2+ core - 8 GB di RAM -- 2TB di SSD -- Larghezza di banda 10+ MBit/s +- SSD da 2TB +- Larghezza di banda di 10+ MBit/s -##### Specifiche raccomandate +##### Specifiche consigliate - CPU veloce con 4+ core - 16 GB+ di RAM -- SSD veloce con 2+ TB -- Larghezza di banda 25+ MBit/s +- SSD veloce con 2+TB +- Larghezza di banda di 25+ MBit/s -La modalità di sincronizzazione e il client che scegli influenzeranno i requisiti di spazio ma abbiamo stimato lo spazio su disco che ti servirà per ogni client di seguito. +La modalità di sincronizzazione e il client scelti influenzeranno i requisiti di spazio, ma abbiamo stimato lo spazio su disco di cui avrai bisogno per ciascun client di seguito. -| Client | Dimensioni disco (sincronizzazione snap) | Dimensione disco (archivio completo) | -| ---------- | ---------------------------------------- | ------------------------------------ | -| Besu | 800GB+ | 12TB+ | -| Erigon | N/A | 2,5TB+ | -| Geth | Oltre 500GB | 12TB+ | -| Nethermind | Oltre 500GB | 12TB+ | -| Reth | N/A | Oltre 2,2TB | +| Client | Dimensione del disco (sincronizzazione snap) | Dimensione del disco (archivio completo) | +| ---------- | --------------------- | ------------------------ | +| Besu | 800GB+ | 12TB+ | +| Erigon | N/A | 2.5TB+ | +| Geth | 500GB+ | 12TB+ | +| Nethermind | 500GB+ | 12TB+ | +| Reth | N/A | 2.2TB+ | -- Nota: Erigon e Reth non offrono la sincronizzazione snap, ma è possibile la potatura completa (circa 2TB per Erigon, circa 1,2TB per Reth) +- Nota: Erigon e Reth non offrono la sincronizzazione snap, ma è possibile il Pruning Completo (\~2TB per Erigon, ~1.2TB per Reth) -Per i client di consenso, i requisiti di spazio dipendono anche dall'implementazione del client e dalle funzionalità abilitate (es. slasher del validatore), ma tengono generalmente conto di altri 200GB necessari per i dati della Beacon. Con un gran numero di validatori, cresce anche il carico della larghezza di banda. Puoi trovare i [dettagli sui requisiti del client di consenso in quest'analisi](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). +Per i client di consenso, il requisito di spazio dipende anche dall'implementazione del client e dalle funzionalità abilitate (ad es. lo slasher del validatore), ma in genere calcola altri 200GB necessari per i dati della beacon chain. Con un gran numero di validatori, cresce anche il carico della larghezza di banda. Puoi trovare [dettagli sui requisiti dei client di consenso in questa analisi](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc). -#### Soluzioni plug and play {#plug-and-play} +#### Soluzioni plug-and-play {#plug-and-play} -L'opzione più facile per eseguire un nodo con il tuo hardware è usando soluzioni plug and play. Le macchine preconfigurate dai fornitori offrono l'esperienza più semplice: ordina, connetti, esegui. Tutto è preconfigurato e funziona automaticamente con una guida e un pannello di controllo intuitivi per il monitoraggio e il controllo del software. +L'opzione più semplice per eseguire un nodo con il proprio hardware è utilizzare box plug-and-play. Le macchine preconfigurate dai fornitori offrono l'esperienza più semplice: ordina, connetti, esegui. Tutto è preconfigurato e funziona automaticamente con una guida intuitiva e una dashboard per il monitoraggio e il controllo del software. - [DappNode](https://dappnode.io/) - [Avado](https://ava.do/) #### Ethereum su un computer a scheda singola {#ethereum-on-a-single-board-computer} -Un modo facile ed economico per eseguire un nodo Ethereum è quello di utilizzare un computer a scheda singola con architettura ARM come Raspberry Pi. [Ethereum su ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) fornisce immagini facili da eseguire di diversi client di esecuzione e di consenso per Raspberry Pi e altri circuiti ARM. +Un modo semplice ed economico per eseguire un nodo di Ethereum è utilizzare un computer a scheda singola, anche con un'architettura ARM come il Raspberry Pi. [Ethereum su ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) fornisce immagini facili da eseguire di più client di esecuzione e di consenso per Raspberry Pi e altre schede ARM. -Dispositivi piccoli, convenienti ed efficienti come questi sono ideali per eseguire un nodo a casa, ma tieni conto delle loro prestazioni limitate. +Dispositivi piccoli, convenienti ed efficienti come questi sono ideali per eseguire un nodo a casa, ma tieni presente le loro prestazioni limitate. ## Avviare il nodo {#spinning-up-node} -La configurazione effettiva del client è eseguibile con launcher automatizzati o manualmente, configurando direttamente il software del client. +La configurazione effettiva del client può essere eseguita con launcher automatizzati o manualmente, configurando direttamente il software del client. -Per gli utenti meno avanzati, l'approccio consigliato è usare un launcher, un software che ti guida nell'installazione e automatizza il processo di configurazione del client. Tuttavia, se hai qualche esperienza nell'uso di un terminale, i passaggi per la configurazione manuale dovrebbero essere più semplici da seguire. +Per gli utenti meno avanzati, l'approccio consigliato è utilizzare un launcher, un software che ti guida attraverso l'installazione e automatizza il processo di configurazione del client. Tuttavia, se hai una certa esperienza nell'uso di un terminale, i passaggi per la configurazione manuale dovrebbero essere semplici da seguire. ### Configurazione guidata {#automatized-setup} -Diversi progetti intuitivi mirano a migliorare l'esperienza di configurazione di un client. Questi launcher forniscono l'installazione e configurazione automatica del client, alcuni offrono persino un'interfaccia grafica per la configurazione guidata e il monitoraggio dei client. +Diversi progetti intuitivi mirano a migliorare l'esperienza di configurazione di un client. Questi launcher forniscono l'installazione e la configurazione automatica del client, e alcuni offrono persino un'interfaccia grafica per la configurazione guidata e il monitoraggio dei client. -Di seguito trovi alcuni progetti che possono aiutarti a installare e controllare i client in pochi click: +Di seguito sono riportati alcuni progetti che possono aiutarti a installare e controllare i client con pochi clic: -- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path): DappNode non è fornito soltanto con una macchina da un venditore. Il software, il launcher del nodo vero e proprio e il centro di controllo con molte funzionalità, sono utilizzabili su hardware arbitrario. -- [eth-docker](https://eth-docker.net/) - La configurazione automatizzata usando Docker, incentrata sullo staking facile e sicuro, richiede una conoscenza di base del terminale e di Docker, consigliata per gli utenti un po' più avanzati. -- [Stereum](https://stereum.net/ethereum-node-setup/) - Launcher per installare i client su un server remoto tramite connessione SSH con una guida di configurazione con GUI, un centro di controllo e molte altre funzionalità. -- [Sedge](https://docs.sedge.nethermind.io/docs/intro): Strumento di configurazione del nodo che genera automaticamente la configurazione di un Docker utilizzando la procedura guidata della CLI. Scritta in Go da Nethermind. +- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) - DappNode non viene fornito solo con una macchina di un fornitore. Il software, il launcher del nodo vero e proprio e il centro di controllo con molte funzionalità possono essere utilizzati su hardware arbitrario. +- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) - Il modo più rapido e semplice per configurare un nodo completo. Strumento di configurazione a riga singola e TUI per la gestione del nodo. Gratuito. Open source. Beni pubblici per Ethereum da parte di staker solitari. Supporto ARM64 e AMD64. +- [eth-docker](https://eth-docker.net/) - Configurazione automatizzata tramite Docker focalizzata su uno staking facile e sicuro, richiede conoscenze di base del terminale e di Docker, consigliato per utenti un po' più avanzati. +- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) - Launcher per l'installazione di client su un server remoto tramite connessione SSH con una guida di configurazione GUI, centro di controllo e molte altre funzionalità. +- [Sedge](https://docs.sedge.nethermind.io/docs/intro) - Strumento di configurazione del nodo che genera automaticamente una configurazione Docker utilizzando una procedura guidata CLI. Scritto in Go da Nethermind. ### Configurazione manuale dei client {#manual-setup} -L'altra opzione è scaricare, verificare e configurare manualmente il software del client. Anche se alcuni client offrono un'interfaccia grafica, una configurazione manuale richiede comunque abilità essenziali col terminale, ma offre una versatilità molto maggiore. +L'altra opzione è scaricare, verificare e configurare manualmente il software del client. Anche se alcuni client offrono un'interfaccia grafica, una configurazione manuale richiede comunque competenze di base con il terminale ma offre molta più versatilità. -Come spiegato prima, configurare il tuo nodo di Ethereum richiederà l'esecuzione di una coppia di client di consenso e di esecuzione. Alcuni client potrebbero includere un client leggero dell'altro tipo e sincronizzarsi senza che sia necessario altro software. Tuttavia, la verifica senza fiducia e completa richiede entrambe le implementazioni. +Come spiegato in precedenza, la configurazione del tuo nodo di Ethereum richiederà l'esecuzione di una coppia di client di consenso e di esecuzione. Alcuni client potrebbero includere un client leggero dell'altro tipo e sincronizzarsi senza bisogno di alcun altro software. Tuttavia, la verifica completa senza bisogno di fiducia (trustless) richiede entrambe le implementazioni. #### Ottenere il software del client {#getting-the-client} -Prima di tutto devi ottenere il software dei tuoi [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) preferiti. +Per prima cosa, devi ottenere il software del tuo [client di esecuzione](/developers/docs/nodes-and-clients/#execution-clients) e [client di consenso](/developers/docs/nodes-and-clients/#consensus-clients) preferito. -Puoi semplicemente scaricare un'applicazione eseguibile o pacchetto d'installazione più adatto al tuo sistema operativo e alla tua architettura. Verifica sempre le firme e le checksum dei pacchetti scaricati. Alcuni client offrono anche repository o immagini Docker per facilitare l’installazione e gli aggiornamenti. Tutti i client sono open source, quindi puoi anche compilarli da sorgente. Questo è un metodo più avanzato ma, in alcuni casi, potrebbe esser richiesto. +Puoi semplicemente scaricare un'applicazione eseguibile o un pacchetto di installazione adatto al tuo sistema operativo e alla tua architettura. Verifica sempre le firme e i checksum dei pacchetti scaricati. Alcuni client offrono anche repository o immagini Docker per un'installazione e aggiornamenti più semplici. Tutti i client sono open source, quindi puoi anche compilarli dal codice sorgente. Questo è un metodo più avanzato, ma in alcuni casi potrebbe essere necessario. -Le istruzioni per installare ogni client sono fornite nella documentazione collegata nei suddetti elenchi di client. +Le istruzioni per l'installazione di ciascun client sono fornite nella documentazione collegata negli elenchi dei client sopra. -Ecco le pagine delle release dei client, in cui puoi trovare i loro binari precompilati o le istruzioni d'installazione: +Ecco le pagine di rilascio dei client dove puoi trovare i loro binari precompilati o le istruzioni sull'installazione: ##### Client di esecuzione - [Besu](https://github.com/hyperledger/besu/releases) - [Erigon](https://github.com/ledgerwatch/erigon/releases) -- [Geth](https://geth.ethereum.org/downloads/) +- [Geth](https://geth.ethereum.org/downloads) - [Nethermind](https://downloads.nethermind.io/) - [Reth](https://reth.rs/installation/installation.html) -Vale anche la pena notare che la diversità dei client è un [problema sul livello di esecuzione](/developers/docs/nodes-and-clients/client-diversity/#execution-layer). Si consiglia ai lettori di considerare l'esecuzione di un client di esecuzione di minoranza. +Vale anche la pena notare che la diversità dei client è un [problema sul livello di esecuzione](/developers/docs/nodes-and-clients/client-diversity/#execution-layer). Si consiglia ai lettori di prendere in considerazione l'esecuzione di un client di esecuzione di minoranza. ##### Client di consenso - [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) -- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare da sorgente) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (Non fornisce un binario precompilato, solo un'immagine Docker o da compilare dal codice sorgente) - [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) - [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) - [Teku](https://github.com/ConsenSys/teku/releases) -La [diversità del client](/developers/docs/nodes-and-clients/client-diversity/) è cruciale per i nodi di consenso che eseguono validatori. Se la maggioranza dei validatori sta operando un'implementazione singola del client, la sicurezza di rete è a rischio. Si consiglia dunque di considerare la scelta di un client di minoranza. +La [diversità dei client](/developers/docs/nodes-and-clients/client-diversity/) è fondamentale per i nodi di consenso che eseguono validatori. Se la maggior parte dei validatori esegue una singola implementazione del client, la sicurezza della rete è a rischio. Si consiglia pertanto di prendere in considerazione la scelta di un client di minoranza. -[Visualizza l'uso più recente del client della rete](https://clientdiversity.org/) e scopri di più sulla [diversità dei client](/developers/docs/nodes-and-clients/client-diversity). +[Vedi l'ultimo utilizzo dei client di rete](https://clientdiversity.org/) e scopri di più sulla [diversità dei client](/developers/docs/nodes-and-clients/client-diversity). ##### Verificare il software -Quando si scarica il software da Internet, si consiglia di verificarne l'integrità. Questo passaggio è facoltativo, ma specialmente con parti di infrastruttura essenziali come il client di Ethereum, è importante esser consapevoli dei potenziali vettori d'attacco ed evitarli. Se hai scaricato un binario precompilato, devi fidartene e rischiare che un utente malevolo possa scambiare l'eseguibile con un file malevolo. +Quando si scarica software da Internet, si consiglia di verificarne l'integrità. Questo passaggio è facoltativo ma, specialmente con un pezzo di infrastruttura cruciale come il client di Ethereum, è importante essere consapevoli dei potenziali vettori di attacco ed evitarli. Se hai scaricato un binario precompilato, devi fidarti di esso e rischiare che un utente malintenzionato possa scambiare l'eseguibile con uno dannoso. -Gli sviluppatori firmano i binari rilasciati con le loro chiavi PGP, così che tu possa verificare crittograficamente che stai eseguendo esattamente il software che hanno creato. Devi solo ottenere le chiavi pubbliche usate dagli sviluppatori, che si possono trovare sulle pagine di rilascio del client o nella documentazione. Dopo aver scaricato la release del client e la sua firma, puoi usare un'implementazione di PGP, es. [GnuPG](https://gnupg.org/download/index.html) per verificarli facilmente. Dai un'occhiata a un tutorial sulla verifica del software open source usando `gpg` su [linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) o su [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/). +Gli sviluppatori firmano i binari rilasciati con le loro chiavi PGP in modo da poter verificare crittograficamente che stai eseguendo esattamente il software che hanno creato. Devi solo ottenere le chiavi pubbliche utilizzate dagli sviluppatori, che possono essere trovate nelle pagine di rilascio del client o nella documentazione. Dopo aver scaricato la versione del client e la sua firma, puoi utilizzare un'implementazione PGP, ad es. [GnuPG](https://gnupg.org/download/index.html) per verificarli facilmente. Dai un'occhiata a un tutorial sulla verifica del software open source utilizzando `gpg` su [linux](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) o [Windows/MacOS](https://freedom.press/training/verifying-open-source-software/). -Un'altra forma di verifica è assicurarsi che l'hash, un'impronta digitale crittografica univoca, del software scaricato corrisponda a quello fornito dagli sviluppatori. Ciò è persino più facile che usare PGP, e alcuni client offrono solo quest'opzione. Basta eseguire la funzione di hash sul software scaricato e confrontarla con quella dalla pagina di rilascio. Ad esempio: +Un'altra forma di verifica è assicurarsi che l'hash, un'impronta digitale crittografica univoca, del software scaricato corrisponda a quello fornito dagli sviluppatori. Questo è ancora più semplice dell'utilizzo di PGP e alcuni client offrono solo questa opzione. Basta eseguire la funzione di hash sul software scaricato e confrontarla con quella della pagina di rilascio. Ad esempio: ```sh sha256sum teku-22.6.1.tar.gz @@ -186,33 +188,33 @@ sha256sum teku-22.6.1.tar.gz #### Configurazione del client {#client-setup} -Dopo aver installato, scaricato o compilato il software del client, sei pronto a eseguirlo. Questo significa semplicemente che deve essere eseguito con la configurazione corretta. I client offrono svariate opzioni di configurazione, che possono abilitare varie funzionalità. +Dopo aver installato, scaricato o compilato il software del client, sei pronto per eseguirlo. Questo significa solo che deve essere eseguito con la configurazione corretta. I client offrono ricche opzioni di configurazione, che possono abilitare varie funzionalità. -Iniziamo con le opzioni che possono influenzare significativamente le prestazioni del client e l'uso dei dati. Le [modalità di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes) rappresentano metodi diversi per scaricare e convalidare i dati della blockchain. Prima di avviare il nodo, dovresti decidere quale rete e che modalità di sincronizzazione usare. Le cose più importanti da considerare sono lo spazio su disco e il tempo di sincronizzazione di cui il client avrà bisogno. Presta attenzione alla documentazione del client per stabilire quale modalità di sincronizzazione è quella predefinita. Se non è adatta a te, selezionane un'altra a seconda del livello di sicurezza, dei dati disponibili e dei costi. Oltre all'algoritmo di sincronizzazione, puoi anche impostare la potatura di vari tipi di dati ormai datati. La potatura consente l'eliminazione di dati obsoleti, ad es. la rimozione i nodi trie di stato irraggiungibili dai blocchi recenti. +Iniziamo con le opzioni che possono influenzare in modo significativo le prestazioni del client e l'utilizzo dei dati. Le [modalità di sincronizzazione](/developers/docs/nodes-and-clients/#sync-modes) rappresentano diversi metodi di download e convalida dei dati della blockchain. Prima di avviare il nodo, dovresti decidere quale rete e modalità di sincronizzazione utilizzare. Le cose più importanti da considerare sono lo spazio su disco e il tempo di sincronizzazione di cui il client avrà bisogno. Presta attenzione alla documentazione del client per determinare quale modalità di sincronizzazione è quella predefinita. Se non ti soddisfa, scegline un'altra in base al livello di sicurezza, ai dati disponibili e ai costi. Oltre all'algoritmo di sincronizzazione, puoi anche impostare il pruning (potatura) di diversi tipi di vecchi dati. Il pruning consente di eliminare i dati obsoleti, ovvero rimuovere i nodi del trie di stato che non sono raggiungibili dai blocchi recenti. -Altre opzioni di configurazione di base sono, ad esempio, scegliere una rete: Rete principale o reti di prova, abilitare l'endpoint HTTP per RPC o WebSocket, ecc. Puoi trovare tutte le funzionalità e opzioni nella documentazione del client. È possibile impostare varie configurazioni del client eseguendo il client con i corrispondenti flag, direttamente nella CLI o nel file di configurazione. Ogni client è un po' diverso; fai sempre riferimento alla sua documentazione ufficiale o pagina di supporto per i dettagli sulle opzioni di configurazione. +Altre opzioni di configurazione di base sono, ad es., la scelta di una rete: rete principale o reti di test, l'abilitazione dell'endpoint HTTP per RPC o WebSocket, ecc. Puoi trovare tutte le funzionalità e le opzioni nella documentazione del client. Varie configurazioni del client possono essere impostate eseguendo il client con i flag corrispondenti direttamente nella CLI o nel file di configurazione. Ogni client è un po' diverso; fai sempre riferimento alla sua documentazione ufficiale o alla pagina di aiuto per i dettagli sulle opzioni di configurazione. -Per scopi di prova, potrebbe essere preferibile eseguire un client su una delle reti di prova. [Visualizza la panoramica delle reti supportate](/developers/docs/nodes-and-clients/#execution-clients). +A scopo di test, potresti preferire eseguire un client su una delle reti di test. [Vedi la panoramica delle reti supportate](/developers/docs/nodes-and-clients/#execution-clients). -Nella prossima sezione sono riportati esempi di esecuzione dei client di esecuzione con la configurazione di base. +Esempi di esecuzione di client di esecuzione con configurazione di base possono essere trovati nella sezione successiva. #### Avviare il client di esecuzione {#starting-the-execution-client} -Prima di avviare il software del client di Ethereum, verifica un'ultima volta che il tuo ambiente sia pronto. Ad esempio, assicurati che: +Prima di avviare il software del client di Ethereum, esegui un ultimo controllo per assicurarti che il tuo ambiente sia pronto. Ad esempio, assicurati che: -- Ci sia abbastanza spazio su disco considerando la rete e la modalità di sincronizzazione scelta. -- Memoria e CPU non siano bloccate da altri programmi. +- Ci sia spazio su disco sufficiente considerando la rete e la modalità di sincronizzazione scelte. +- La memoria e la CPU non siano bloccate da altri programmi. - Il sistema operativo sia aggiornato all'ultima versione. -- Il sistema abbia la data e l'ora corrette. -- Il tuo router e firewall accettino le connessioni sulle porte di ascolto. Di default, i client di Ethereum usano una porta di ascolto (TCP) e una porta di scoperta (UDP), entrambe di default su 30303. +- Il sistema abbia l'ora e la data corrette. +- Il tuo router e firewall accettino connessioni sulle porte in ascolto. Per impostazione predefinita, i client di Ethereum utilizzano una porta di ascolto (TCP) e una porta di rilevamento (UDP), entrambe sulla 30303 per impostazione predefinita. -Esegui prima il tuo client su una rete di prova per assicurarti che tutto funzioni correttamente. +Esegui prima il tuo client su una rete di test per assicurarti che tutto funzioni correttamente. -All'avvio devi dichiarare qualsiasi impostazione del client che non sia predefinita. Puoi usare i flag o il file di configurazione per dichiarare la tua configurazione preferita. L'insieme di funzionalità e sintassi di configurazione di ogni client è diversa. Dai un'occhiata alla documentazione del tuo client per le specifiche. +Devi dichiarare all'avvio tutte le impostazioni del client che non sono predefinite. Puoi utilizzare i flag o il file di configurazione per dichiarare la tua configurazione preferita. L'insieme di funzionalità e la sintassi di configurazione di ciascun client differiscono. Consulta la documentazione del tuo client per i dettagli. -I client di esecuzione e di consenso comunicano tramite un endpoint autenticato specificato nell'[API Engine](https://github.com/ethereum/execution-apis/tree/main/src/engine). Per potersi connettere a un client di consenso, il client di esecuzione deve generare un [`jwtsecret`](https://jwt.io/) a un percorso noto. Per motivi di sicurezza e stabilità, i client dovrebbero essere eseguiti sulla stessa macchina ed entrambi i client devono conoscere tale percorso, essendo usato per autenticare una connessione RPC locale tra di essi. Il client di esecuzione deve anche definire una porta di ascolto per le API autenticate. +I client di esecuzione e di consenso comunicano tramite un endpoint autenticato specificato nell'[API Engine](https://github.com/ethereum/execution-apis/tree/main/src/engine). Per connettersi a un client di consenso, il client di esecuzione deve generare un [`jwtsecret`](https://jwt.io/) in un percorso noto. Per motivi di sicurezza e stabilità, i client dovrebbero essere eseguiti sulla stessa macchina ed entrambi i client devono conoscere questo percorso poiché viene utilizzato per autenticare una connessione RPC locale tra di loro. Il client di esecuzione deve anche definire una porta in ascolto per le API autenticate. -Questo token è generato automaticamente dal software del client ma, in alcuni casi, potresti doverlo generare tu stesso. Puoi generarlo utilizzando [OpenSSL](https://www.openssl.org/): +Questo token viene generato automaticamente dal software del client, ma in alcuni casi potresti doverlo fare tu stesso. Puoi generarlo utilizzando [OpenSSL](https://www.openssl.org/): ```sh openssl rand -hex 32 > jwtsecret @@ -220,24 +222,24 @@ openssl rand -hex 32 > jwtsecret #### Eseguire un client di esecuzione {#running-an-execution-client} -Questa sezione ti guiderà nell'avvio dei client di esecuzione. Serve solo da esempio per una configurazione di base, che avvierà il client con le seguenti impostazioni: +Questa sezione ti guiderà nell'avvio dei client di esecuzione. Serve solo come esempio di una configurazione di base, che avvierà il client con queste impostazioni: -- Specifica la rete a cui connettersi, la Rete Principale nei nostri esempi - - Puoi invece scegliere [una delle reti di prova](/developers/docs/networks/) per le prove preliminari della tua configurazione -- Definisce la cartella dei dati in cui saranno memorizzati tutti i dati, inclusa la blockchain - - Assicurati di sostituire il percorso con quello reale, es. puntando alla tua unità esterna -- Abilita le interfacce per comunicare col client - - Include le API di JSON-RPC ed Engine per la comunicazione con il client del consenso +- Specifica la rete a cui connettersi, la rete principale nei nostri esempi + - Puoi invece scegliere [una delle reti di test](/developers/docs/networks/) per test preliminari della tua configurazione +- Definisce la directory dei dati, dove verranno archiviati tutti i dati inclusa la blockchain + - Assicurati di sostituire il percorso con uno reale, ad es. puntando al tuo disco esterno +- Abilita le interfacce per comunicare con il client + - Inclusi JSON-RPC e API Engine per la comunicazione con il client di consenso - Definisce il percorso a `jwtsecret` per l'API autenticata - - Assicurati di sostituire il percorso d'esempio con quello reale accessibile dai client, es. `/tmp/jwtsecret` + - Assicurati di sostituire il percorso di esempio con uno reale a cui i client possano accedere, ad es. `/tmp/jwtsecret` -Ricordati che questo è solo un esempio di base, tutte le altre impostazioni saranno predefinite. Presta attenzione alla documentazione di ogni client per conoscere i valori predefiniti, le impostazioni e le funzionalità. Per ulteriori funzionalità, ad esempio per eseguire i validatori, per il monitoraggio, ecc., fai riferimento alla documentazione del client specifico. +Tieni presente che questo è solo un esempio di base, tutte le altre impostazioni verranno impostate sui valori predefiniti. Presta attenzione alla documentazione di ciascun client per conoscere i valori predefiniti, le impostazioni e le funzionalità. Per ulteriori funzionalità, ad esempio per l'esecuzione di validatori, il monitoraggio, ecc., fai riferimento alla documentazione del client specifico. -> Nota che i backslash `\` negli esempi servono solo a scopi di formattazione; i flag di configurazione sono definibili in una singola riga. +> Nota che le barre rovesciate `` negli esempi servono solo a scopo di formattazione; i flag di configurazione possono essere definiti in una singola riga. ##### Eseguire Besu -Questo esempio avvia Besu sulla Rete Principale, memorizza i dati della blockchain nel formato predefinito su `/data/ethereum`, abilita JSON-RPC e Engine RPC per la connessione del client di consenso. L'API Engine è autenticata con il token `jwtsecret` e solo le chiamate da `localhost` sono consentite. +Questo esempio avvia Besu sulla rete principale, archivia i dati della blockchain nel formato predefinito in `/data/ethereum`, abilita JSON-RPC e Engine RPC per la connessione del client di consenso. L'API Engine è autenticata con il token `jwtsecret` e sono consentite solo le chiamate da `localhost`. ```sh besu --network=mainnet \ @@ -249,17 +251,17 @@ besu --network=mainnet \ --engine-jwt-secret=/path/to/jwtsecret ``` -Besu presenta inoltre un'opzione del launcher che porrà una serie di domande e genererà il file di configurazione. Esegui il launcher interattivo usando: +Besu include anche un'opzione launcher che farà una serie di domande e genererà il file di configurazione. Esegui il launcher interattivo utilizzando: ```sh besu --Xlauncher ``` -La [documentazione di Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contiene le opzioni aggiuntive e i dettagli di configurazione. +La [documentazione di Besu](https://besu.hyperledger.org/public-networks/get-started/start-node/) contiene opzioni aggiuntive e dettagli di configurazione. ##### Eseguire Erigon -Questo esempio avvia Erigon sulla Rete Principale, memorizza i dati della blockchain su `/data/ethereum`, abilita JSON-RPC, definisce quali spazi dei nomi sono consentiti e abilita l'autenticazione per la connessione del client di consenso definito dal percorso `jwtsecret`. +Questo esempio avvia Erigon sulla rete principale, archivia i dati della blockchain in `/data/ethereum`, abilita JSON-RPC, definisce quali namespace sono consentiti e abilita l'autenticazione per la connessione del client di consenso che è definita dal percorso `jwtsecret`. ```sh erigon --chain mainnet \ @@ -268,11 +270,11 @@ erigon --chain mainnet \ --authrpc.jwtsecret=/path/to/jwtsecret ``` -Erigon esegue di default una sincronizzazione completa con 8GB di HDD, che risulterà in oltre 2TB di dati d'archivio. Assicurati che `datadir` stia puntando al disco con abbastanza spazio libero o prendi in considerazione il flag `--prune`, che può tagliare diversi tipi di dati. Dai un'occhiata all'`--help` di Erigon per scoprire di più. +Erigon per impostazione predefinita esegue una sincronizzazione completa con 8GB di HDD che si tradurrà in oltre 2TB di dati di archivio. Assicurati che `datadir` punti a un disco con spazio libero sufficiente o esamina il flag `--prune` che può tagliare diversi tipi di dati. Controlla l'`--help` di Erigon per saperne di più. ##### Eseguire Geth -Questo esempio avvia Geth sulla Rete Principale, memorizza i dati della blockchain su `/data/ethereum`, abilita JSON-RPC e definisce quali spazi dei nomi sono consentiti. Inoltre, consente l'autenticazione per connettere il client di consenso, che richiede il percorso a `jwtsecret` e, inoltre, l'opzione che definisce quali connessioni sono consentite, nel nostro esempio solo da `localhost`. +Questo esempio avvia Geth sulla rete principale, archivia i dati della blockchain in `/data/ethereum`, abilita JSON-RPC e definisce quali namespace sono consentiti. Abilita anche l'autenticazione per la connessione del client di consenso che richiede il percorso a `jwtsecret` e anche l'opzione che definisce quali connessioni sono consentite, nel nostro esempio solo da `localhost`. ```sh geth --mainnet \ @@ -287,7 +289,7 @@ Controlla la [documentazione per tutte le opzioni di configurazione](https://get ##### Eseguire Nethermind -Nethermind offre varie [opzioni d'installazione](https://docs.nethermind.io/get-started/installing-nethermind). Il pacchetto presenta vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa trovi Runner, che è l'eseguibile stesso, e puoi eseguirlo coi flag di configurazione. JSON-RPC è abilitato di default. +Nethermind offre varie [opzioni di installazione](https://docs.nethermind.io/get-started/installing-nethermind). Il pacchetto viene fornito con vari binari, incluso un Launcher con una configurazione guidata, che ti aiuterà a creare la configurazione in modo interattivo. In alternativa, trovi Runner che è l'eseguibile stesso e puoi semplicemente eseguirlo con i flag di configurazione. JSON-RPC è abilitato per impostazione predefinita. ```sh Nethermind.Runner --config mainnet \ @@ -295,13 +297,13 @@ Nethermind.Runner --config mainnet \ --JsonRpc.JwtSecretFile=/path/to/jwtsecret ``` -La documentazione di Nethermind offre una [guida completa](https://docs.nethermind.io/get-started/running-node/) all'esecuzione di Nethermind con il client di consenso. +La documentazione di Nethermind offre una [guida completa](https://docs.nethermind.io/get-started/running-node/) sull'esecuzione di Nethermind con il client di consenso. -Il client di esecuzione avvierà le sue funzioni principali, gli endpoint scelti e inizierà a cercare i pari. Dopo aver scoperto correttamente i pari, il client avvia la sincronizzazione. Il client di esecuzione attenderà una connessione dal client di consenso. I dati correnti della blockchain saranno disponibili una volta che il client è sincronizzato correttamente allo stato corrente. +Un client di esecuzione avvierà le sue funzioni principali, gli endpoint scelti e inizierà a cercare peer. Dopo aver scoperto con successo i peer, il client avvia la sincronizzazione. Il client di esecuzione attenderà una connessione dal client di consenso. I dati correnti della blockchain saranno disponibili una volta che il client sarà sincronizzato con successo allo stato corrente. -##### Eseguire Geth +##### Eseguire Reth -Questo esempio avvia Reth sulla Rete Principale, utilizzando la posizione dei dati predefinita. Abilita l'autenticazione JSON-RPC e Engine RPC per la connessione del client di consenso definito dal percorso `jwtsecret`, con solo chiamate da `localhost` consentite. +Questo esempio avvia Reth sulla rete principale, utilizzando la posizione dei dati predefinita. Abilita l'autenticazione JSON-RPC e Engine RPC per la connessione del client di consenso che è definita dal percorso `jwtsecret`, con solo le chiamate da `localhost` consentite. ```sh reth node \ @@ -310,23 +312,23 @@ reth node \ --authrpc.port 8551 ``` -Visita [Configurare Reth](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth) per scoprire di più sulle directory di dati predefinite. La [documentazione di Reth](https://reth.rs/run/mainnet.html) contiene opzioni aggiuntive e dettagli di configurazione. +Vedi [Configurazione di Reth](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth) per saperne di più sulle directory dei dati predefinite. La [documentazione di Reth](https://reth.rs/run/mainnet.html) contiene opzioni aggiuntive e dettagli di configurazione. #### Avviare il client di consenso {#starting-the-consensus-client} -Il client di consenso deve essere avviato con la configurazione della porta corretta, per stabilire una connessione RPC locale al client di esecuzione. I client di consenso devono essere eseguiti con la porta del client di esecuzione esposta come argomento di configurazione. +Il client di consenso deve essere avviato con la corretta configurazione della porta per stabilire una connessione RPC locale al client di esecuzione. I client di consenso devono essere eseguiti con la porta esposta del client di esecuzione come argomento di configurazione. -Inoltre, il client di consenso necessita del percorso al `jwt-secret` del client di esecuzione per poter autenticare la connessione RPC tra di essi. Analogamente agli esempi di esecuzione che precedono, ogni client di consenso ha un flag di configurazione che considera il percorso del file del token jwt come un argomento. Questo deve essere coerente con il percorso `jwtsecret` fornito al client di esecuzione. +Il client di consenso ha anche bisogno del percorso al `jwt-secret` del client di esecuzione per autenticare la connessione RPC tra di loro. Similmente agli esempi di esecuzione sopra, ogni client di consenso ha un flag di configurazione che accetta il percorso del file del token jwt come argomento. Questo deve essere coerente con il percorso `jwtsecret` fornito al client di esecuzione. -Se pianifichi di eseguire un validatore, assicurati di aggiungere un flag di configurazione che specifichi l'indirizzo di Ethereum del destinatario della commissione. È qui che sono accumulate le ricompense in ether per il tuo validatore. Ogni client di consenso ha un'opzione come `--suggested-fee-recipient=0xabcd1` che considera un indirizzo di Ethereum come un argomento. +Se hai intenzione di eseguire un validatore, assicurati di aggiungere un flag di configurazione che specifichi l'indirizzo Ethereum del destinatario delle commissioni. È qui che si accumulano le ricompense in ether per il tuo validatore. Ogni client di consenso ha un'opzione, ad es. `--suggested-fee-recipient=0xabcd1`, che accetta un indirizzo Ethereum come argomento. -Avviando il Nodo Beacon sulla rete di prova, puoi risparmiare parecchio tempo di sincronizzazione usando l'endpoint pubblico per la [Sincronizzazione del punto di controllo](https://notes.ethereum.org/@launchpad/checkpoint-sync). +Quando si avvia un Nodo Beacon su una rete di test, è possibile risparmiare molto tempo di sincronizzazione utilizzando un endpoint pubblico per la [Sincronizzazione dei checkpoint](https://notes.ethereum.org/@launchpad/checkpoint-sync). #### Eseguire un client di consenso {#running-a-consensus-client} ##### Eseguire Lighthouse -Prima di eseguire Lighthouse, scopri di più su come installarlo e configurarlo nel [Libro su Lighthouse](https://lighthouse-book.sigmaprime.io/installation.html). +Prima di eseguire Lighthouse, scopri di più su come installarlo e configurarlo nel [Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html). ```sh lighthouse beacon_node \ @@ -339,11 +341,11 @@ lighthouse beacon_node \ ##### Eseguire Lodestar -Installa il software di Lodestar compilandolo o scaricando l'immagine Docker. Scopri di più nella [documentazione](https://chainsafe.github.io/lodestar/) e nella più completa [guida di configurazione](https://hackmd.io/@philknows/rk5cDvKmK). +Installa il software Lodestar compilandolo o scaricando l'immagine Docker. Scopri di più nella [documentazione](https://chainsafe.github.io/lodestar/) e nella [guida di configurazione](https://hackmd.io/@philknows/rk5cDvKmK) più completa. ```sh lodestar beacon \ - --rootDir="/data/ethereum" \ + --dataDir="/data/ethereum" \ --network=mainnet \ --eth1.enabled=true \ --execution.urls="http://127.0.0.1:8551" \ @@ -352,7 +354,8 @@ lodestar beacon \ ##### Eseguire Nimbus -Nimbus include sia il client di consenso che quello di esecuzione. Può essere eseguito su vari dispositivi con una potenza di calcolo molto modesta. Dopo aver [installato le dipendenze e Nimbus stesso](https://nimbus.guide/quick-start.html), puoi eseguirne il client di consenso: +Nimbus viene fornito con client sia di consenso che di esecuzione. Può essere eseguito su vari dispositivi anche con una potenza di calcolo molto modesta. +Dopo aver [installato le dipendenze e Nimbus stesso](https://nimbus.guide/quick-start.html), puoi eseguire il suo client di consenso: ```sh nimbus_beacon_node \ @@ -364,7 +367,7 @@ nimbus_beacon_node \ ##### Eseguire Prysm -Prysm è dotato di uno script che consente una facile installazione automatica. I dettagli sono riportati nella [documentazione di Prysm](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/). +Prysm viene fornito con uno script che consente una facile installazione automatica. I dettagli possono essere trovati nella [documentazione di Prysm](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/). ```sh ./prysm.sh beacon-chain \ @@ -383,97 +386,98 @@ teku --network mainnet \ --ee-jwt-secret-file "/path/to/jwtsecret" ``` -Quando un client di consenso si connette al client di esecuzione per leggere il contratto di deposito e identificare i validatori, si connette anche ad altri pari del Nodo Beacon e avvia la sincronizzazione degli slot di consenso dalla genesi. Una volta che il Nodo Beacon raggiunge l'epoca corrente, l'API Beacon diventa utilizzabile per i tuoi validatori. Scopri di più sulle [API del Nodo Beacon](https://eth2docs.vercel.app/). +Quando un client di consenso si connette al client di esecuzione per leggere il contratto di deposito e identificare i validatori, si connette anche ad altri peer del Nodo Beacon e inizia a sincronizzare gli slot di consenso dalla genesi. Una volta che il Nodo Beacon raggiunge l'epoca corrente, l'API Beacon diventa utilizzabile per i tuoi validatori. Scopri di più sulle [API del Nodo Beacon](https://eth2docs.vercel.app/). ### Aggiungere Validatori {#adding-validators} -Un client di consenso funge da Nodo Beacon a cui si connettono i validatori. Ogni client di consenso ha il proprio software del validatore, descritto nei dettagli nella rispettiva documentazione. +Un client di consenso funge da Nodo Beacon a cui i validatori possono connettersi. Ogni client di consenso ha il proprio software per validatori descritto in dettaglio nella rispettiva documentazione. -Eseguire il proprio validatore consente lo [staking in autonomia](/staking/solo/), il metodo più d'impatto e senza fiducia per supportare la rete di Ethereum. Tuttavia, ciò richiede un deposito di 32 ETH. Per eseguire un validatore sul tuo nodo con un importo inferiore, potrebbe interessarti un pool decentralizzato con operatori del nodo privi di autorizzazioni, come [Rocket Pool](https://rocketpool.net/node-operators). +L'esecuzione del proprio validatore consente lo [staking in solitaria](/staking/solo/), il metodo più d'impatto e senza bisogno di fiducia (trustless) per supportare la rete Ethereum. Tuttavia, questo richiede un deposito di 32 ETH. Per eseguire un validatore sul tuo nodo con un importo inferiore, potrebbe interessarti una pool decentralizzata con operatori di nodi senza permessi, come [Rocket Pool](https://rocketpool.net/node-operators). -Il modo più semplice per iniziare con lo staking e la generazione delle chiavi di validazione è utilizzare il [Launchpad di staking della rete di prova Holesky](https://holesky.launchpad.ethereum.org/), che ti consente di testare la tua configurazione [eseguendo i nodi su Holesky](https://notes.ethereum.org/@launchpad/holesky). Quando sei pronto per la Rete Principale, puoi ripetere questi passaggi usando il [Launchpad di Staking della Rete Principale](https://launchpad.ethereum.org/). +Il modo più semplice per iniziare con lo staking e la generazione delle chiavi del validatore è utilizzare l'[Hoodi Testnet Staking Launchpad](https://hoodi.launchpad.ethereum.org/), che ti consente di testare la tua configurazione [eseguendo nodi su Hoodi](https://notes.ethereum.org/@launchpad/hoodi). Quando sei pronto per la rete principale, puoi ripetere questi passaggi utilizzando il [Mainnet Staking Launchpad](https://launchpad.ethereum.org/). -Dai un'occhiata alla [pagina sullo staking](/staking) per una panoramica sulle opzioni di staking. +Consulta la [pagina dello staking](/staking) per una panoramica sulle opzioni di staking. ### Usare il nodo {#using-the-node} -I client di esecuzione offrono gli [endpoint dell'API RPC](/developers/docs/apis/json-rpc/) che puoi usare per inviare le transazioni, interagire con o distribuire i contratti intelligenti sulla rete Ethereum in vari modi: +I client di esecuzione offrono [endpoint API RPC](/developers/docs/apis/json-rpc/) che puoi utilizzare per inviare transazioni, interagire con o distribuire contratti intelligenti sulla rete Ethereum in vari modi: -- Effettuare una chiamata manuale con un protocollo adatto (es. usando `curl`) -- Collegare una console fornita (es. `geth attach`) -- Implementarli nelle applicazioni usando le librerie web3, es. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) +- Chiamandoli manualmente con un protocollo adatto (ad es. usando `curl`) +- Collegando una console fornita (ad es. `geth attach`) +- Implementandoli in applicazioni utilizzando librerie web3, ad es. [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) -Client diversi hanno implementazioni diverse degli endpoint RPC. Ma esiste uno standard JSON-RPC che puoi utilizzare con ogni client. Per una panoramica, [leggi la documentazione di JSON-RPC](/developers/docs/apis/json-rpc/). Le applicazioni che necessitano di informazioni dalla rete Ethereum possono usare questa RPC. Ad esempio, il popolare portafoglio MetaMask ti consente di [connetterti al tuo endpoint RPC](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node), con forti vantaggi in termini di privacy e la sicurezza. +Client diversi hanno implementazioni diverse degli endpoint RPC. Ma esiste un JSON-RPC standard che puoi utilizzare con ogni client. Per una panoramica [leggi la documentazione JSON-RPC](/developers/docs/apis/json-rpc/). Le applicazioni che necessitano di informazioni dalla rete Ethereum possono utilizzare questa RPC. Ad esempio, il popolare portafoglio MetaMask ti consente di [connetterti al tuo endpoint RPC](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node) che offre forti vantaggi in termini di privacy e sicurezza. -I client di consenso espongono tutti l'[API Beacon](https://ethereum.github.io/beacon-APIs) utilizzabile per verificare lo stato del client di consenso o per scaricare blocchi e dati di consenso, inviando richieste usando strumenti come [Curl](https://curl.se). Maggiori informazioni a riguardo si possono trovare nella documentazione di ogni client di consenso. +I client di consenso espongono tutti un'[API Beacon](https://ethereum.github.io/beacon-APIs) che può essere utilizzata per controllare lo stato del client di consenso o scaricare blocchi e dati di consenso inviando richieste utilizzando strumenti come [Curl](https://curl.se). Maggiori informazioni su questo possono essere trovate nella documentazione di ciascun client di consenso. -#### Raggiungere le RPC {#reaching-rpc} +#### Raggiungere l'RPC {#reaching-rpc} -La porta predefinita per il client di esecuzione JSON-RPC è `8545`, ma puoi modificare le porte degli endpoint locali nella configurazione. Di default, l'interfaccia RPC è raggiungibile solo sul localhost del tuo computer. Per renderla accessibile da remoto, dovresti esporla al pubblico cambiando l'indirizzo in `0.0.0.0`. Ciò la renderà raggiungibile sugli indirizzi IP pubblici e della rete locale. In gran parte dei casi, dovrai anche configurare il port forwarding sul router. +La porta predefinita per il JSON-RPC del client di esecuzione è `8545` ma puoi modificare le porte degli endpoint locali nella configurazione. Per impostazione predefinita, l'interfaccia RPC è raggiungibile solo sul localhost del tuo computer. Per renderla accessibile da remoto, potresti volerla esporre al pubblico modificando l'indirizzo in `0.0.0.0`. Questo la renderà raggiungibile sulla rete locale e sugli indirizzi IP pubblici. Nella maggior parte dei casi dovrai anche impostare il port forwarding sul tuo router. -Approccia con cautela l'esposizione delle porte su Internet, poiché questo consentirà a chiunque su Internet di controllare il tuo nodo. Gli utenti malevoli potrebbero accedere al tuo nodo per abbattere il tuo sistema o rubare i tuoi fondi se stai usando il tuo client come un portafoglio. +Affronta l'esposizione delle porte a Internet con cautela poiché ciò consentirà a chiunque su Internet di controllare il tuo nodo. Attori malintenzionati potrebbero accedere al tuo nodo per abbattere il tuo sistema o rubare i tuoi fondi se stai utilizzando il tuo client come portafoglio. -Un modo per aggirare questo problema è impedire che i metodi RPC potenzialmente dannosi siano modificabili. Ad esempio, con Geth puoi dichiarare i metodi modificabili con un flag: `--http.api web3,eth,txpool`. +Un modo per aggirare questo problema è impedire che metodi RPC potenzialmente dannosi siano modificabili. Ad esempio, con Geth, puoi dichiarare metodi modificabili con un flag: `--http.api web3,eth,txpool`. -L'accesso all'interfaccia RPC può essere esteso tramite lo sviluppo di API del livello limite o applicazioni del server web, come Nginx, e connettendoli all'indirizzo locale e alla porta del tuo client. Sfruttare un livello centrale può inoltre consentire agli sviluppatori di configurare un certificato per connessioni `https` sicure all'interfaccia RPC. +L'accesso all'interfaccia RPC può essere esteso attraverso lo sviluppo di API del livello edge o applicazioni server web, come Nginx, e collegandole all'indirizzo e alla porta locali del tuo client. Sfruttare un livello intermedio può anche consentire agli sviluppatori la possibilità di configurare un certificato per connessioni `https` sicure all'interfaccia RPC. -Configurare un server web, un proxy o l'API Rest rivolta all'esterno non è il solo modo per fornire accesso all'endpoint RPC del tuo nodo. Un altro metodo a tutela della privacy per configurare un endpoint raggiungibile pubblicamente è ospitare il nodo sul tuo servizio onion di [Tor](https://www.torproject.org/). Questo ti consentirà di raggiungere l'RPC al di fuori della tua rete locale senza un indirizzo IP pubblico statico o aprire le porte. Tuttavia, utilizzare questa configurazione potrebbe rendere l'endpoint RPC accessibile solo tramite la rete di Tor, che non è supportata da tutte le applicazioni e potrebbe risultare in problemi di connessione. +Configurare un server web, un proxy o un'API Rest rivolta all'esterno non è l'unico modo per fornire accesso all'endpoint RPC del tuo nodo. Un altro modo per preservare la privacy per configurare un endpoint raggiungibile pubblicamente è ospitare il nodo sul tuo servizio onion [Tor](https://www.torproject.org/). Questo ti consentirà di raggiungere l'RPC al di fuori della tua rete locale senza un indirizzo IP pubblico statico o porte aperte. Tuttavia, l'utilizzo di questa configurazione potrebbe consentire l'accesso all'endpoint RPC solo tramite la rete Tor, che non è supportata da tutte le applicazioni e potrebbe causare problemi di connessione. -Per farlo, devi creare il tuo [servizio di onion](https://community.torproject.org/onion-services/). Dai un'occhiata [alla documentazione](https://community.torproject.org/onion-services/setup/) sulla configurazione del servizio onion per ospitare il tuo. Puoi puntarlo a un server web con proxy alla porta RPC o, semplicemente, direttamente all'RPC. +Per fare ciò, devi creare il tuo [servizio onion](https://community.torproject.org/onion-services/). Dai un'occhiata alla [documentazione](https://community.torproject.org/onion-services/setup/) sulla configurazione del servizio onion per ospitare il tuo. Puoi puntarlo a un server web con proxy alla porta RPC o semplicemente direttamente all'RPC. -Infine, uno dei metodi più popolari per fornire accesso alle reti interne è tramite una connessione VPN. A seconda del tuo caso d'uso e della quantità di utenti che devono poter accedere al tuo nodo, una connessione VPN potrebbe essere un'opzione. [OpenVPN](https://openvpn.net/) è una VPN SSL completa che implementa l'estensione di rete sicura di livello 2 o 3 OSI, utilizzando il protocollo standard SSL/TLS, supporta metodi di autenticazione flessibili del client basati su certificati, smart card e/o credenziali nome utente/password e consente politiche di controllo dell'accesso specifiche per utente o gruppo utilizzando le regole del firewall applicate all'interfaccia virtuale della VPN. +Infine, e uno dei modi più popolari per fornire accesso alle reti interne è attraverso una connessione VPN. A seconda del tuo caso d'uso e della quantità di utenti che necessitano di accedere al tuo nodo, una connessione VPN sicura potrebbe essere un'opzione. [OpenVPN](https://openvpn.net/) è una VPN SSL completa che implementa l'estensione di rete sicura di livello OSI 2 o 3 utilizzando il protocollo SSL/TLS standard del settore, supporta metodi di autenticazione client flessibili basati su certificati, smart card e/o credenziali nome utente/password e consente criteri di controllo degli accessi specifici per utente o gruppo utilizzando regole firewall applicate all'interfaccia virtuale VPN. ### Gestire il nodo {#operating-the-node} -Dovresti monitorare regolarmente il tuo nodo per accertarti che funzioni correttamente. Potresti dover eseguire una manutenzione occasionale. +Dovresti monitorare regolarmente il tuo nodo per assicurarti che funzioni correttamente. Potrebbe essere necessario eseguire una manutenzione occasionale. -#### Mantenere online un nodo {#keeping-node-online} +#### Mantenere un nodo online {#keeping-node-online} -Il tuo nodo non deve necessariamente essere sempre online, ma dovresti mantenerlo online il più possibile per mantenerlo sincronizzato con la rete. Puoi arrestarlo per poi riavviarlo, ma tieni a mente che: +Il tuo nodo non deve essere online tutto il tempo, ma dovresti mantenerlo online il più possibile per mantenerlo sincronizzato con la rete. Puoi spegnerlo per riavviarlo, ma tieni presente che: -- L'arresto può richiedere diversi minuti se lo stato recente è ancora in fase di scrittura su disco. -- Gli arresti forzati possono danneggiare il database, obbligandoti a sincronizzare nuovamente l'intero nodo. -- Il tuo client perderà la sincronizzazione con la rete e dovrà risincronizzarsi al riavvio. Sebbene il nodo possa iniziare la sincronizzazione da dove si trovava all'ultimo arresto, il processo può richiedere tempo a seconda di quanto è stato offline. +- Lo spegnimento può richiedere alcuni minuti se lo stato recente è ancora in fase di scrittura su disco. +- Gli spegnimenti forzati possono danneggiare il database richiedendoti di risincronizzare l'intero nodo. +- Il tuo client non sarà più sincronizzato con la rete e dovrà risincronizzarsi quando lo riavvierai. Sebbene il nodo possa iniziare la sincronizzazione da dove era stato spento l'ultima volta, il processo può richiedere tempo a seconda di quanto tempo è stato offline. -_Ciò non si applica ai nodi del validatore del livello di consenso._ Mettere offline il tuo nodo influenzerà tutti i servizi che ne dipendono. Se stai eseguendo un nodo per scopi di _staking_, dovresti cercare di ridurre al minimo i tempi di inattività. +_Questo non si applica ai nodi validatori del livello di consenso._ Portare il tuo nodo offline influenzerà tutti i servizi che dipendono da esso. Se stai eseguendo un nodo per scopi di _staking_ dovresti cercare di ridurre al minimo i tempi di inattività il più possibile. -#### Creare i servizi del client {#creating-client-services} +#### Creare servizi client {#creating-client-services} -Valuta la possibilità di creare un servizio per eseguire automaticamente il tuo client all'avvio. Ad esempio, sui server Linux, è buona prassi creare un servizio, ad esempio con `systemd`, che esegua il client con la configurazione corretta, sotto un utente con privilegi limitati e si riavvii automaticamente. +Prendi in considerazione la creazione di un servizio per eseguire i tuoi client automaticamente all'avvio. Ad esempio, sui server Linux, una buona pratica sarebbe creare un servizio, ad es. con `systemd`, che esegue il client con la configurazione corretta, sotto un utente con privilegi limitati e si riavvia automaticamente. #### Aggiornare i client {#updating-clients} -Devi mantenere aggiornato il software del tuo client con le patch di sicurezza, funzionalità ed [EIP](/eips/) più recenti. Specialmente prima di [diramazioni permanenti](/ethereum-forks/), assicurati che stai eseguendo la versione del client corretta. +Devi mantenere aggiornato il software del tuo client con le ultime patch di sicurezza, funzionalità ed [EIP](/eips/). Soprattutto prima delle [biforcazioni hard](/ethereum-forks/), assicurati di eseguire le versioni corrette del client. -> Prima di importanti aggiornamenti di rete, la EF pubblica un post sul suo [blog](https://blog.ethereum.org). Puoi [iscriverti a questi annunci](https://blog.ethereum.org/category/protocol#subscribe) per ricevere una notifica nella tua mail quando il tuo nodo necessita di un aggiornamento. +> Prima di importanti aggiornamenti di rete, la EF pubblica un post sul suo [blog](https://blog.ethereum.org). Puoi [iscriverti a questi annunci](https://blog.ethereum.org/category/protocol#subscribe) per ricevere una notifica via e-mail quando il tuo nodo necessita di un aggiornamento. -Aggiornare i client è molto semplice. Ogni client ha istruzioni specifiche nella propria documentazione, ma il processo consiste generalmente solo nello scaricare l'ultima versione e riavviare il client con il nuovo eseguibile. Il client dovrebbe riprendere da dove si è fermato, ma con gli aggiornamenti applicati. +Aggiornare i client è molto semplice. Ogni client ha istruzioni specifiche nella propria documentazione, ma il processo consiste generalmente nel scaricare l'ultima versione e riavviare il client con il nuovo eseguibile. Il client dovrebbe riprendere da dove si era interrotto, ma con gli aggiornamenti applicati. -Ogni implementazione del client ha una stringa di versione leggibile dall'uomo usata nel protocollo in pari, ma è anche accessibile dalla riga di comando. Questa stringa di versione consente agli utenti di verificare che sia in esecuzione la versione corretta e consente ai block explorer e ad altri strumenti analitici interessati di quantificare la distribuzione di client specifici sulla rete. Si rimanda alla documentazione del singolo client per maggiori informazioni sulle stringhe di versione. +Ogni implementazione del client ha una stringa di versione leggibile dall'uomo utilizzata nel protocollo peer-to-peer ma è anche accessibile dalla riga di comando. Questa stringa di versione consente agli utenti di verificare che stiano eseguendo la versione corretta e consente agli esploratori di blocchi e ad altri strumenti analitici interessati di quantificare la distribuzione di client specifici sulla rete. Fai riferimento alla documentazione del singolo client per ulteriori informazioni sulle stringhe di versione. #### Eseguire servizi aggiuntivi {#running-additional-services} -Eseguire il tuo nodo ti consente di usare servizi che richiedono l'accesso diretto all'RPC del client di Ethereum. Questi sono servizi basati su Etherreum, come le [soluzioni di livello 2](/developers/docs/scaling/#layer-2-scaling), backend per i portafogli, block explorer, strumenti per gli sviluppatori e altre infrastrutture di Ethereum. +L'esecuzione del tuo nodo ti consente di utilizzare servizi che richiedono l'accesso diretto all'RPC del client di Ethereum. Questi sono servizi costruitti su Ethereum come [soluzioni di livello 2](/developers/docs/scaling/#layer-2-scaling), backend per portafogli, esploratori di blocchi, strumenti per sviluppatori e altre infrastrutture di Ethereum. #### Monitorare il nodo {#monitoring-the-node} -Per monitorare correttamente il tuo nodo, valuta di raccogliere delle metriche. I client forniscono endpoint delle metriche, così che tu possa ottenere dati completi sul tuo nodo. Usa strumenti come [InfluxDB](https://www.influxdata.com/get-influxdb/) o [Prometheus](https://prometheus.io/) per creare database che puoi trasformare in visualizzazioni e grafici nel software come [Grafana](https://grafana.com/). Esistono molte configurazioni per utilizzare questo software e diversi pannelli di controllo di Grafana con cui puoi visualizzare il tuo nodo e la rete per intero. Ad esempio, dai un'occhiata al [tutorial sul monitoraggio di Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/). +Per monitorare correttamente il tuo nodo, prendi in considerazione la raccolta di metriche. I client forniscono endpoint di metriche in modo da poter ottenere dati completi sul tuo nodo. Usa strumenti come [InfluxDB](https://www.influxdata.com/get-influxdb/) o [Prometheus](https://prometheus.io/) per creare database che puoi trasformare in visualizzazioni e grafici in software come [Grafana](https://grafana.com/). Ci sono molte configurazioni per l'utilizzo di questo software e diverse dashboard Grafana per visualizzare il tuo nodo e la rete nel suo insieme. Ad esempio, dai un'occhiata al [tutorial sul monitoraggio di Geth](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/). -Nell'ambito del monitoraggio, assicurati di tenere d'occhio le prestazioni della tua macchina. Durante la sincronizzazione iniziale del tuo nodo, il software del client potrebbe gravare molto su CPU e RAM. Oltre a Grafana, per farlo puoi usare gli strumenti che offre il tuo OS, come `htop` o `uptime`. +Come parte del tuo monitoraggio, assicurati di tenere d'occhio le prestazioni della tua macchina. Durante la sincronizzazione iniziale del tuo nodo, il software del client potrebbe essere molto pesante per CPU e RAM. Oltre a Grafana, puoi utilizzare gli strumenti offerti dal tuo sistema operativo come `htop` o `uptime` per farlo. ## Letture consigliate {#further-reading} -- [Guide allo staking di Ethereum](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, aggiornato spesso_ -- [Guida | Come configurare un validatore per lo staking di Ethereum sulla Rete Principale](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, aggiornato regolarmente_ -- [Guide di ETHStaker all'esecuzione dei validatori sulle reti di prova](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, aggiornato regolarmente_ -- [Domande frequenti sulla Fusione per gli operatori di nodi](https://notes.ethereum.org/@launchpad/node-faq-merge) - _Luglio 2022_ -- [Analizzare i requisiti hardware per essere un nodo completo e validato di Ethereum](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 settembre 2018_ -- [Eseguire i nodi completi di Ethereum: una guida per i poco motivati](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7 novembre 2019_ -- [Eseguire un nodo di Besu Hyperledger sulla Rete Principale di Ethereum: benefici, requisiti e configurazione](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7 maggio 2020_ -- [Distribuire il client di Ethereum di Nethermind con lo stack di monitoraggio](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8 luglio 2020_ +- [Guide allo staking di Ethereum](https://github.com/SomerEsat/ethereum-staking-guides) - _Somer Esat, aggiornato di frequente_ +- [Guida | Come configurare un validatore per lo staking di Ethereum sulla rete principale](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, aggiornato di frequente_ +- [Guide di ETHStaker sull'esecuzione di validatori su reti di test](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, aggiornato regolarmente_ +- [App di esempio AWS Blockchain Node Runner per nodi Ethereum](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, aggiornato di frequente_ +- [FAQ sul Merge per gli operatori dei nodi](https://notes.ethereum.org/@launchpad/node-faq-merge) - _Luglio 2022_ +- [Analisi dei requisiti hardware per essere un nodo validato completo di Ethereum](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– Albert Palau, 24 settembre 2018_ +- [Esecuzione di nodi completi di Ethereum: una guida per i poco motivati](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– Justin Leroux, 7 novembre 2019_ +- [Esecuzione di un nodo Hyperledger Besu sulla rete principale di Ethereum: vantaggi, requisiti e configurazione](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– Felipe Faraggi, 7 maggio 2020_ +- [Distribuzione del client Ethereum Nethermind con stack di monitoraggio](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, 8 luglio 2020_ ## Argomenti correlati {#related-topics} -- [ Nodi e client](/developers/docs/nodes-and-clients/) +- [Nodi e client](/developers/docs/nodes-and-clients/) - [Blocchi](/developers/docs/blocks/) -- [Reti](/developers/docs/networks/) +- [Reti](/developers/docs/networks/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/oracles/index.md b/public/content/translations/it/developers/docs/oracles/index.md index 792e3e4d989..5685dd71673 100644 --- a/public/content/translations/it/developers/docs/oracles/index.md +++ b/public/content/translations/it/developers/docs/oracles/index.md @@ -1,116 +1,116 @@ --- title: Oracoli -description: Gli oracoli forniscono ai contratti intelligenti di Ethereum l'accesso ai dati del mondo reale, sbloccando più casi d'uso e maggiore valore per gli utenti. +description: "Gli oracoli forniscono ai contratti intelligenti di Ethereum l'accesso ai dati del mondo reale, sbloccando più casi d'uso e un maggior valore per gli utenti." lang: it --- -Gli oracoli sono applicazioni che producono feed di dati che rendono disponibili le fonti di dati esterne alla catena alla blockchain per i contratti intelligenti. Ciò è necessario perché i contratti intelligenti basati su Ethereum non possono, di default, accedere alle informazioni memorizzate al di fuori della rete della blockchain. +Gli oracoli sono applicazioni che producono feed di dati che rendono le fonti di dati fuori catena disponibili alla blockchain per i contratti intelligenti. Ciò è necessario perché i contratti intelligenti basati su Ethereum non possono, per impostazione predefinita, accedere alle informazioni archiviate all'esterno della rete blockchain. -Dare ai contratti intelligenti la capacità di eseguirsi utilizzando i dati off-chain estende l'utilità e il valore delle applicazioni decentralizzate. Per esempio, i mercati predittivi su catena si basano sugli oracoli per fornire informazioni sui risultati, che utilizzano per convalidare le previsioni degli utenti. Supponiamo che Alice scommetta 20 ETH su chi diventerà il prossimo presidente degli Stati Uniti . In tal caso, la dapp del mercato predittivo ha bisogno di un oracolo per confermare i risultati delle elezioni e determinare se Alice abbia diritto o meno alla "vincita". +Dare ai contratti intelligenti la capacità di essere eseguiti utilizzando dati fuori catena estende l'utilità e il valore delle applicazioni decentralizzate. Ad esempio, i mercati di previsione on-chain si affidano agli oracoli per fornire informazioni sui risultati che utilizzano per convalidare le previsioni degli utenti. Supponiamo che Alice scommetta 20 ETH su chi diventerà il prossimo Presidente degli Stati Uniti. In tal caso, la dApp del mercato di previsione ha bisogno di un oracolo per confermare i risultati elettorali e determinare se Alice è idonea a ricevere un pagamento. ## Prerequisiti {#prerequisites} -Questa pagina presuppone che il lettore abbia familiarità con i fondamentali di Ethereum, inclusi [nodi](/developers/docs/nodes-and-clients/), [meccanismi di consenso](/developers/docs/consensus-mechanisms/)e la tecnologia [EVM](/developers/docs/evm/). Dovresti anche avere una buona comprensione dei [contratti intelligenti](/developers/docs/smart-contracts/) e dell'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/), in particolare gli [eventi](/glossary/#events). +Questa pagina presuppone che il lettore abbia familiarità con i fondamenti di [Ethereum](/), inclusi i [nodi](/developers/docs/nodes-and-clients/), i [meccanismi di consenso](/developers/docs/consensus-mechanisms/) e la [EVM](/developers/docs/evm/). Dovresti anche avere una buona comprensione dei [contratti intelligenti](/developers/docs/smart-contracts/) e dell'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/), specialmente degli [eventi](/glossary/#events). -## Cos'è un oracolo della blockchain? {#what-is-a-blockchain-oracle} +## Cos'è un oracolo blockchain? {#what-is-a-blockchain-oracle} -Gli oracoli sono applicazioni che agiscono da fonti, verificatori e trasmettitori di informazioni esterne (ossia informazioni archiviate off-chain) ai contratti intelligenti in esecuzione sulla blockchain. Oltre a “estrarre” i dati off-chain e trasmetterli su Ethereum, gli oracoli possono anche “immettere” le informazioni prese dalla blockchain in sistemi esterni, ad esempio sbloccando uno "smart lock" (serratura intelligente) all'invio, da parte dell'utente, di una commissione tramite una transazione di Ethereum. +Gli oracoli sono applicazioni che reperiscono, verificano e trasmettono informazioni esterne (ovvero, informazioni archiviate fuori catena) ai contratti intelligenti in esecuzione sulla blockchain. Oltre a "estrarre" dati fuori catena e trasmetterli su Ethereum, gli oracoli possono anche "inviare" informazioni dalla blockchain a sistemi esterni, ad es. sbloccando una serratura intelligente una volta che l'utente invia una commissione tramite una transazione di Ethereum. -Senza un oracolo, un contratto intelligente sarebbe limitato interamente ai dati sulla catena. +Senza un oracolo, un contratto intelligente sarebbe limitato interamente ai dati on-chain. -Gli oracoli differiscono in base alla fonte di dati (una o più fonti), ai modelli di fiducia (centralizzati o decentralizzati) e all'architettura di sistema (immediate-read, publish-subscribe e request-response). Possiamo anche distinguere gli oracoli in base al fatto che recuperino dati esterni per l'uso da parte di contratti on-chain (oracoli di input), inviino informazioni dalla blockchain alle applicazioni off-chain (oracoli di output), o svolgano attività di calcolo off-chain (oracoli di calcolo). +Gli oracoli differiscono in base alla fonte dei dati (una o più fonti), ai modelli di fiducia (centralizzati o decentralizzati) e all'architettura di sistema (lettura immediata, pubblicazione-sottoscrizione e richiesta-risposta). Possiamo anche distinguere tra gli oracoli in base al fatto che recuperino dati esterni per l'uso da parte di contratti on-chain (oracoli di input), inviino informazioni dalla blockchain alle applicazioni fuori catena (oracoli di output) o eseguano compiti computazionali fuori catena (oracoli computazionali). ## Perché i contratti intelligenti hanno bisogno degli oracoli? {#why-do-smart-contracts-need-oracles} -Molti sviluppatori vedono i contratti intelligenti come del codice in esecuzione in determinati indirizzi sulla blockchain. Tuttavia, una [visione più generale dei contratti intelligenti](/smart-contracts/) è che siano programmi software autoeseguibili in grado di far rispettare gli accordi tra le parti una volta soddisfatte determinate condizioni, da qui il termine “contratti intelligenti”. +Molti sviluppatori vedono i contratti intelligenti come codice in esecuzione a indirizzi specifici sulla blockchain. Tuttavia, una [visione più generale dei contratti intelligenti](/smart-contracts/) è che sono programmi software auto-eseguibili in grado di far rispettare gli accordi tra le parti una volta soddisfatte condizioni specifiche - da qui il termine "contratti intelligenti". -Ma utilizzare contratti intelligenti per far rispettare gli accordi tra le persone non è semplice, dato che Ethereum è deterministico. Un [sistema deterministico](https://en.wikipedia.org/wiki/Deterministic_algorithm) è un sistema che produce sempre gli stessi risultati dato uno stato iniziale ed un input specifico, il che significa che non c'è casualità o variazione nel processo di calcolo degli output dagli input. +Ma usare i contratti intelligenti per far rispettare gli accordi tra le persone non è semplice, dato che Ethereum è deterministico. Un [sistema deterministico](https://en.wikipedia.org/wiki/Deterministic_algorithm) è quello che produce sempre gli stessi risultati dato uno stato iniziale e un particolare input, il che significa che non c'è casualità o variazione nel processo di calcolo degli output dagli input. -Per ottenere un'esecuzione deterministica, le blockchain limitano i nodi al raggiungimento del consenso su semplici domande binarie (vero/falso) utilizzando _solo_ dati memorizzati sulla blockchain stessa. Alcuni esempi sono: +Per ottenere un'esecuzione deterministica, le blockchain limitano i nodi a raggiungere il consenso su semplici domande binarie (vero/falso) utilizzando _solo_ i dati archiviati sulla blockchain stessa. Esempi di tali domande includono: -- “Il proprietario del conto (identificato da una chiave pubblica) ha firmato questa transazione con la sua chiave privata associata?” -- “Questo conto ha abbastanza fondi per coprire la transazione?” -- “Questa transazione è valida nel contesto di questo contratto intelligente?”, ecc. +- "Il proprietario dell'account (identificato da una chiave pubblica) ha firmato questa transazione con la chiave privata associata?" +- "Questo account ha fondi sufficienti per coprire la transazione?" +- "Questa transazione è valida nel contesto di questo contratto intelligente?", ecc. -Se le blockchain ricevessero informazioni da fonti esterne (ossia dal mondo reale), il determinismo sarebbe impossibile da raggiungere, impedendo ai nodi di concordare la validità dei cambiamenti dello stato della blockchain. Prendiamo ad esempio un contratto intelligente che esegue una transazione basata sull'attuale tasso di cambio ETH-USD ottenuto da un'API di prezzo tradizionale. Questa cifra probabilmente cambierebbe frequentemente (per non parlare del fatto che l'API potrebbe diventare obsoleta o essere hackerata), il che significa che i nodi che eseguono lo stesso codice del contratto arriverebbero a risultati diversi. +Se le blockchain ricevessero informazioni da fonti esterne (ovvero, dal mondo reale), il determinismo sarebbe impossibile da raggiungere, impedendo ai nodi di concordare sulla validità delle modifiche allo stato della blockchain. Prendi ad esempio un contratto intelligente che esegue una transazione in base all'attuale tasso di cambio ETH-USD ottenuto da una tradizionale API di prezzo. È probabile che questa cifra cambi frequentemente (per non parlare del fatto che l'API potrebbe essere deprecata o hackerata), il che significa che i nodi che eseguono lo stesso codice del contratto arriverebbero a risultati diversi. -Per una blockchain pubblica, come Ethereum, con migliaia di nodi in tutto il mondo che elaborano transazioni, essere deterministica è essenziale. Senza alcuna autorità centrale che funga da fonte di verità, i nodi necessitano di meccanismi per arrivare allo stesso stato dopo aver applicato le stesse transazioni. Un caso in cui il nodo A esegue il codice di un contratto intelligente e ottiene "3" come risultato mentre il nodo B ottiene "7" dopo aver eseguito la stessa transazione comporterebbe la perdita del consenso e l'eliminazione del valore di Ethereum come piattaforma di calcolo decentralizzata. +Per una blockchain pubblica come Ethereum, con migliaia di nodi in tutto il mondo che elaborano transazioni, il determinismo è fondamentale. Senza un'autorità centrale che funga da fonte di verità, i nodi hanno bisogno di meccanismi per arrivare allo stesso stato dopo aver applicato le stesse transazioni. Un caso in cui il nodo A esegue il codice di un contratto intelligente e ottiene "3" come risultato, mentre il nodo B ottiene "7" dopo aver eseguito la stessa transazione, causerebbe la rottura del consenso ed eliminerebbe il valore di Ethereum come piattaforma di calcolo decentralizzata. -Questo scenario evidenzia anche il problema della progettazione di blockchain per estrapolare informazioni da fonti esterne. Gli oracoli, tuttavia, risolvono questo problema prendendo informazioni da fonti off-chain e memorizzandole sulla blockchain, pronte per essere usate dai contratti intelligenti. Poiché le informazioni memorizzate sulla catena sono inalterabili e disponibili pubblicamente, i nodi di Ethereum possono utilizzare in sicurezza i dati dell'oracolo importati all'esterno della catena per calcolare i cambiamenti di stato senza infrangere il consenso. +Questo scenario evidenzia anche il problema della progettazione di blockchain per estrarre informazioni da fonti esterne. Gli oracoli, tuttavia, risolvono questo problema prendendo informazioni da fonti fuori catena e archiviandole sulla blockchain affinché i contratti intelligenti le consumino. Poiché le informazioni archiviate on-chain sono inalterabili e pubblicamente disponibili, i nodi di Ethereum possono utilizzare in sicurezza i dati fuori catena importati dall'oracolo per calcolare i cambiamenti di stato senza interrompere il consenso. -Per fare questo, un oracolo è tipicamente costituito da un contratto intelligente in esecuzione on-chain con alcuni componenti off-chain. Il contratto on-chain riceve richieste di dati da altri contratti intelligenti, che passa al componente off-chain (chiamato nodo oracolo). Questo nodo oracolo può interrogare le fonti di dati – utilizzando interfacce di programmazione dell'applicazione (API), ad esempio – e inviare transazioni per memorizzare i dati richiesti nell'archivio del contratto intelligente. +Per fare ciò, un oracolo è tipicamente costituito da un contratto intelligente in esecuzione on-chain e da alcuni componenti fuori catena. Il contratto on-chain riceve richieste di dati da altri contratti intelligenti, che passa al componente fuori catena (chiamato nodo oracolo). Questo nodo oracolo può interrogare le fonti di dati — utilizzando interfacce di programmazione delle applicazioni (API), ad esempio — e inviare transazioni per archiviare i dati richiesti nell'archiviazione del contratto intelligente. -Essenzialmente, un oracolo della blockchain colma il divario informativo tra la blockchain ed il mondo esterno, creando “contratti intelligenti ibridi”. Un contratto intelligente ibrido funziona sulla base di una combinazione di codice on-chain e infrastruttura off-chain. I mercati predittivi decentralizzati sono un ottimo esempio di contratto intelligente ibrido. Altri esempi potrebbero essere i contratti intelligenti di assicurazione agricole che pagano quando una serie di oracoli determina che hanno avuto luogo alcuni fenomeni meteorologici. +Essenzialmente, un oracolo blockchain colma il divario informativo tra la blockchain e l'ambiente esterno, creando "contratti intelligenti ibridi". Un contratto intelligente ibrido è quello che funziona in base a una combinazione di codice del contratto on-chain e infrastruttura fuori catena. I mercati di previsione decentralizzati sono un eccellente esempio di contratti intelligenti ibridi. Altri esempi potrebbero includere contratti intelligenti di assicurazione del raccolto che pagano quando un insieme di oracoli determina che si sono verificati determinati fenomeni meteorologici. ## Qual è il problema dell'oracolo? {#the-oracle-problem} -Gli oracoli risolvono un problema importante, ma introducono anche delle complicazioni, ad esempio: +Gli oracoli risolvono un problema importante, ma introducono anche alcune complicazioni, ad es.: -- Come possiamo verificare che le informazioni iniettate siano state estratte dalla fonte corretta o non siano state manomesse? +- Come verifichiamo che le informazioni iniettate siano state estratte dalla fonte corretta o non siano state manomesse? -- Come possiamo garantire che questi dati siano sempre disponibili e aggiornati regolarmente? +- Come garantiamo che questi dati siano sempre disponibili e aggiornati regolarmente? -Il cosiddetto “problema dell'oracolo” dimostra i problemi che provengono dall'utilizzo di oracoli della blockchain per inviare input ai contratti intelligenti. I dati di un oracolo devono essere corretti affinché un contratto intelligente sia eseguito correttamente. Inoltre, doversi "affidare" al fatto che gli operatori dell'oracolo forniscano informazioni accurate, compromette l'aspetto di "assenza di fiducia" dei contratti intelligenti. +Il cosiddetto "problema dell'oracolo" dimostra i problemi che derivano dall'utilizzo degli oracoli blockchain per inviare input ai contratti intelligenti. I dati provenienti da un oracolo devono essere corretti affinché un contratto intelligente venga eseguito correttamente. Inoltre, dover 'fidarsi' degli operatori degli oracoli per fornire informazioni accurate mina l'aspetto 'senza fiducia' (trustless) dei contratti intelligenti. -Oracoli differenti offrono soluzioni differenti al problema dell'oracolo, che esamineremo in seguito. Tipicamente, gli oracoli sono valutati sulla base di quanto siano in grado di gestire le seguenti sfide: +Diversi oracoli offrono diverse soluzioni al problema dell'oracolo, che esploreremo in seguito. Gli oracoli sono tipicamente valutati in base a quanto bene riescono a gestire le seguenti sfide: -1. **Correttezza**: un oracolo non dovrebbe far sì che i contratti intelligenti attivino cambiamenti di stato basati su dati off-chain non validi. Un oracolo deve garantire l'_autenticità_ e l'_integrità_ dei dati. Autenticità significa che i dati sono stati ricevuti dalla fonte corretta, mente integrità significa che i dati restano intatti (cioè non sono alterati), prima dell'invio alla catena. +1. **Correttezza**: Un oracolo non dovrebbe far sì che i contratti intelligenti inneschino cambiamenti di stato basati su dati fuori catena non validi. Un oracolo deve garantire l'_autenticità_ e l'_integrità_ dei dati. Autenticità significa che i dati sono stati ottenuti dalla fonte corretta, mentre integrità significa che i dati sono rimasti intatti (ovvero, non sono stati alterati) prima di essere inviati on-chain. -2. **Disponibilità**: un oracolo non dovrebbe ritardare o impedire ai contratti intelligenti di eseguire azioni e attivare cambiamenti di stato. Ciò significa che i dati di un oracolo devono essere _disponibili su richiesta_ senza interruzioni. +2. **Disponibilità**: Un oracolo non dovrebbe ritardare o impedire ai contratti intelligenti di eseguire azioni e innescare cambiamenti di stato. Ciò significa che i dati provenienti da un oracolo devono essere _disponibili su richiesta_ senza interruzioni. -3. **Compatibilità con gli incentivi**: un oracolo dovrebbe incentivare i fornitori di dati off-chain ad inviare informazioni corrette ai contratti intelligenti. Incentivare la compatibilità comporta _attribuibilità_ e _responsabilità_. L'attribuibilità consente di correlare un'informazione esterna al suo fornitore, mentre la responsabilità lega i fornitori di dati alle informazioni che forniscono, così che possano essere ricompensati o sanzionati a seconda della qualità delle informazioni ricevute. +3. **Compatibilità degli incentivi**: Un oracolo dovrebbe incentivare i fornitori di dati fuori catena a inviare informazioni corrette ai contratti intelligenti. La compatibilità degli incentivi implica _attribuibilità_ e _responsabilità_. L'attribuibilità consente di collegare un'informazione esterna al suo fornitore, mentre la responsabilità vincola i fornitori di dati alle informazioni che forniscono, in modo che possano essere ricompensati o penalizzati in base alla qualità delle informazioni fornite. -## Come funziona un servizio oracolo della blockchain? {#how-does-a-blockchain-oracle-service-work} +## Come funziona un servizio di oracolo blockchain? {#how-does-a-blockchain-oracle-service-work} ### Utenti {#users} -Gli utenti sono entità (ossia contratti intelligenti) che hanno bisogno di informazioni esterne alla blockchain per completare azioni specifiche. Il flusso di lavoro di base di un servizio oracolo inizia con l'invio da parte dell'utente di una richiesta di dati al contratto oracolo. Le richieste di dati solitamente rispondono ad alcune o a tutte le seguenti domande: +Gli utenti sono entità (ovvero, contratti intelligenti) che necessitano di informazioni esterne alla blockchain per completare azioni specifiche. Il flusso di lavoro di base di un servizio di oracolo inizia con l'utente che invia una richiesta di dati al contratto dell'oracolo. Le richieste di dati di solito risponderanno ad alcune o a tutte le seguenti domande: -1. Quali fonti possono consultare i nodi off-chain per le informazioni richieste? +1. Quali fonti possono consultare i nodi fuori catena per le informazioni richieste? -2. Come fanno i segnalatori a elaborare le informazioni dalle fonti di dati e a estrarre punti di dati utili? +2. Come elaborano i reporter le informazioni dalle fonti di dati e ne estraggono punti dati utili? 3. Quanti nodi oracolo possono partecipare al recupero dei dati? 4. Come dovrebbero essere gestite le discrepanze nei report degli oracoli? -5. Quale metodo dovrebbe essere implementato per filtrare gli invii e aggregare i report in un unico valore? +5. Quale metodo dovrebbe essere implementato nel filtrare gli invii e aggregare i report in un singolo valore? -### Contratto oracolo {#oracle-contract} +### Contratto dell'oracolo {#oracle-contract} -Il contratto dell'oracolo è il componente on-chain per il servizio dell'oracolo. Ascolta le richieste di dati da parte di altri contratti, inoltra le richieste di dati ai nodi oracolo e trasmette i dati restituiti ai contratti client. Questo contratto, inoltre, potrebbe eseguire dei calcoli sui punti di dati restituiti per produrre un valore aggregato da inviare al contratto richiedente. +Il contratto dell'oracolo è il componente on-chain per il servizio di oracolo. Ascolta le richieste di dati da altri contratti, inoltra le query di dati ai nodi oracolo e trasmette i dati restituiti ai contratti client. Questo contratto può anche eseguire alcuni calcoli sui punti dati restituiti per produrre un valore aggregato da inviare al contratto richiedente. -Il contratto dell'oracolo espone delle funzioni che i contratti del client chiamano, effettuando una richiesta di dati. Alla ricezione di una nuova richiesta, il contratto intelligente emetterà un [evento di registrazione](/developers/docs/smart-contracts/anatomy/#events-and-logs) con i dettagli della richiesta di dati. Ciò notifica i nodi esterni alla catena iscritti al registro (soltamente utilizzando qualcosa di simile al comando `eth_subscribe` di JSON-RPC), che procedono a recuperare i dati definiti nell'evento di registrazione. +Il contratto dell'oracolo espone alcune funzioni che i contratti client chiamano quando effettuano una richiesta di dati. Alla ricezione di una nuova query, il contratto intelligente emetterà un [evento di log](/developers/docs/smart-contracts/anatomy/#events-and-logs) con i dettagli della richiesta di dati. Questo notifica i nodi fuori catena iscritti al log (di solito utilizzando qualcosa come il comando JSON-RPC `eth_subscribe`), che procedono a recuperare i dati definiti nell'evento di log. -Segue un [esempio di contratto dell'oracolo](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) di Pedro Costa. Si tratta di un semplice servizio di oracolo che può interrogare le API esterne alla catena su richiesta da altri contratti intelligenti, e memorizzare le informazioni richieste sulla blockchain: +Di seguito è riportato un [esempio di contratto oracolo](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) di Pedro Costa. Questo è un semplice servizio di oracolo che può interrogare API fuori catena su richiesta di altri contratti intelligenti e archiviare le informazioni richieste sulla blockchain: ```solidity pragma solidity >=0.4.21 <0.6.0; contract Oracle { - Request[] requests; //list of requests made to the contract - uint currentId = 0; //increasing request id - uint minQuorum = 2; //minimum number of responses to receive before declaring final result - uint totalOracleCount = 3; // Hardcoded oracle count + Request[] requests; // lista delle richieste effettuate al contratto + uint currentId = 0; // id di richiesta crescente + uint minQuorum = 2; // numero minimo di risposte da ricevere prima di dichiarare il risultato finale + uint totalOracleCount = 3; // conteggio degli oracoli hardcoded - // defines a general api request + // definisce una richiesta api generale struct Request { - uint id; //request id - string urlToQuery; //API url - string attributeToFetch; //json attribute (key) to retrieve in the response - string agreedValue; //value from key - mapping(uint => string) answers; //answers provided by the oracles - mapping(address => uint) quorum; //oracles which will query the answer (1=oracle hasn't voted, 2=oracle has voted) + uint id; // id della richiesta + string urlToQuery; // url dell'API + string attributeToFetch; // attributo json (chiave) da recuperare nella risposta + string agreedValue; // valore dalla chiave + mapping(uint => string) answers; // risposte fornite dagli oracoli + mapping(address => uint) quorum; // oracoli che interrogheranno la risposta (1=l'oracolo non ha votato, 2=l'oracolo ha votato) } - //event that triggers oracle outside of the blockchain + // evento che innesca l'oracolo al di fuori della blockchain event NewRequest ( uint id, string urlToQuery, string attributeToFetch ); - //triggered when there's a consensus on the final result + // innescato quando c'è un consenso sul risultato finale event UpdatedRequest ( uint id, string urlToQuery, @@ -127,23 +127,23 @@ contract Oracle { uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, "")); Request storage r = requests[length-1]; - // Hardcoded oracles address + // indirizzo degli oracoli hardcoded r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1; r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1; r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1; - // launch an event to be detected by oracle outside of blockchain + // lancia un evento per essere rilevato dall'oracolo al di fuori della blockchain emit NewRequest ( currentId, _urlToQuery, _attributeToFetch ); - // increase request id + // incrementa l'id della richiesta currentId++; } - //called by the oracle to record its answer + // chiamato dall'oracolo per registrare la sua risposta function updateRequest ( uint _id, string memory _valueRetrieved @@ -151,18 +151,18 @@ contract Oracle { Request storage currRequest = requests[_id]; - //check if oracle is in the list of trusted oracles - //and if the oracle hasn't voted yet + // controlla se l'oracolo è nella lista degli oracoli fidati + // e se l'oracolo non ha ancora votato if(currRequest.quorum[address(msg.sender)] == 1){ - //marking that this address has voted + // segna che questo indirizzo ha votato currRequest.quorum[msg.sender] = 2; - //iterate through "array" of answers until a position if free and save the retrieved value + // itera attraverso l'"array" delle risposte finché una posizione è libera e salva il valore recuperato uint tmpI = 0; bool found = false; while(!found) { - //find first empty slot + // trova il primo slot vuoto if(bytes(currRequest.answers[tmpI]).length == 0){ found = true; currRequest.answers[tmpI] = _valueRetrieved; @@ -172,8 +172,8 @@ contract Oracle { uint currentQuorum = 0; - //iterate through oracle list and check if enough oracles(minimum quorum) - //have voted the same answer as the current one + // itera attraverso la lista degli oracoli e controlla se ci sono abbastanza oracoli (quorum minimo) + // hanno votato la stessa risposta di quella attuale for(uint i = 0; i < totalOracleCount; i++){ bytes memory a = bytes(currRequest.answers[i]); bytes memory b = bytes(_valueRetrieved); @@ -196,129 +196,129 @@ contract Oracle { } ``` -### Nodi dell'oracolo {#oracle-nodes} +### Nodi oracolo {#oracle-nodes} -Il nodo dell'oracolo è il componente off-chain del servizio dell'oracolo. Estrae informazioni da fonti esterne, come API ospitate su server di terze parti, e le inserisce nella catena per essere utilizzate dai contratti intelligenti. I nodi dell'oracolo ascoltano gli eventi dal contratto oracolo on-chain e procedono a completare l'attività descritta nel log. +Il nodo oracolo è il componente fuori catena del servizio di oracolo. Estrae informazioni da fonti esterne, come le API ospitate su server di terze parti, e le inserisce on-chain per il consumo da parte dei contratti intelligenti. I nodi oracolo ascoltano gli eventi dal contratto dell'oracolo on-chain e procedono a completare il compito descritto nel log. -Un'attività comune per i nodi dell'oracolo è l'invio di una richiesta [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp) a un servizio API, l'analisi della risposta per estrarre i dati rilevanti, la formattazione in un risultato leggibile dalla blockchain e il suo invio sulla catena, includendolo in una transazione al contratto dell'oracolo. Inoltre, al nodo dell'oracolo, potrebbe essere richiesto di attestare la validità e l'integrità delle informazioni inviate utilizzando le "prove di autenticità", che esploreremo in seguito. +Un compito comune per i nodi oracolo è inviare una richiesta [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp) a un servizio API, analizzare la risposta per estrarre i dati rilevanti, formattarli in un output leggibile dalla blockchain e inviarli on-chain includendoli in una transazione verso il contratto dell'oracolo. Al nodo oracolo potrebbe anche essere richiesto di attestare la validità e l'integrità delle informazioni inviate utilizzando "prove di autenticità", che esploreremo in seguito. -Anche gli oracoli di calcolo si affidano a nodi off-chain per eseguire compiti di calcolo che non sarebbe pratico eseguire on-chain dati i costi del carburante e i limiti di dimensione dei blocchi. Ad esempio, il nodo dell'oracolo potrebbe essere incaricato della generazone di una cifra casuale verificabile (es., per i giochi basati sulla blockchain). +Gli oracoli computazionali si affidano anche a nodi fuori catena per eseguire compiti computazionali che sarebbero poco pratici da eseguire on-chain, dati i costi del gas e i limiti di dimensione del blocco. Ad esempio, il nodo oracolo potrebbe essere incaricato di generare una cifra verificabilmente casuale (ad es., per i giochi basati su blockchain). ## Modelli di progettazione degli oracoli {#oracle-design-patterns} -Esistono diverse tipologie di oracoli, tra cui: _immediate-read_, _publish-subscribe_ e _request-response_, di cui gli ultimi due sono i più popolari tra i contratti intelligenti di Ethereum. Qui descriviamo brevemente i modelli publish-subscribe e request-response. +Gli oracoli sono di diversi tipi, tra cui _lettura immediata_, _pubblicazione-sottoscrizione_ e _richiesta-risposta_, con gli ultimi due che sono i più popolari tra i contratti intelligenti di Ethereum. Qui descriviamo brevemente i modelli di pubblicazione-sottoscrizione e richiesta-risposta. -### Oracoli publish-subscribe {#publish-subscribe-oracles} +### Oracoli di pubblicazione-sottoscrizione {#publish-subscribe-oracles} -Questo tipo di oracolo espone un "feed di dati" che gli altri contratti possono leggere regolarmente per le informazioni. In questo caso, i dati, dovrebbero cambiare frequentemente, quindi i contratti del client devono ascoltare gli aggiornamenti dei dati, nell'archiviazione dell'oracolo. Un esempio è un oracolo che fornisce le più recenti informazioni sui prezzi ETH-USD agli utenti. +Questo tipo di oracolo espone un "feed di dati" che altri contratti possono leggere regolarmente per ottenere informazioni. In questo caso ci si aspetta che i dati cambino frequentemente, quindi i contratti client devono ascoltare gli aggiornamenti dei dati nell'archiviazione dell'oracolo. Un esempio è un oracolo che fornisce agli utenti le ultime informazioni sul prezzo ETH-USD. -### Oracoli request-response {#request-response-oracles} +### Oracoli di richiesta-risposta {#request-response-oracles} -Una configurazione request-response consente al contratto del client di richiedere dei dati arbitrari diversi da quelli forniti da un oracolo publish-subscribe. Gli oracoli request-response sono ideali quando il set di dati è troppo grande per essere archiviato in un contratto intelligente e/o quando gli utenti hanno bisogno solo di una piccola parte dei dati in qualsiasi momento. +Una configurazione di richiesta-risposta consente al contratto client di richiedere dati arbitrari diversi da quelli forniti da un oracolo di pubblicazione-sottoscrizione. Gli oracoli di richiesta-risposta sono ideali quando il set di dati è troppo grande per essere archiviato nell'archiviazione di un contratto intelligente e/o gli utenti avranno bisogno solo di una piccola parte dei dati in un dato momento. -Sebbene siano più complessi dei modelli publish-subscribe, gli oracoli request-response sono fondamentalmente quanto descritto nella sezione precedente. L'oracolo avrà un componente su catena che riceve una richiesta di dati e la passa a un nodo esterno all catena, per l'elaborazione. +Sebbene più complessi dei modelli di pubblicazione-sottoscrizione, gli oracoli di richiesta-risposta sono fondamentalmente ciò che abbiamo descritto nella sezione precedente. L'oracolo avrà un componente on-chain che riceve una richiesta di dati e la passa a un nodo fuori catena per l'elaborazione. -Gli utenti che avviano le richieste di dati devono coprire i costi di recupero delle informazioni dalla fonte esterna alla catena. Il contratto del client, inoltre, deve fornire i fondi per coprire i costi del gas sostenuti dal contratto dell'oracolo nel restituire la risposta tramite la funzione di richiamata, specificata nella richiesta. +Gli utenti che avviano query di dati devono coprire il costo del recupero delle informazioni dalla fonte fuori catena. Il contratto client deve anche fornire fondi per coprire i costi del gas sostenuti dal contratto dell'oracolo nel restituire la risposta tramite la funzione di callback specificata nella richiesta. ## Oracoli centralizzati vs. decentralizzati {#types-of-oracles} ### Oracoli centralizzati {#centralized-oracles} -Un oracolo centralizzato è controllato da un'unica entità, responsabile dell'aggregazione delle informazioni esterne alla catena e dell'aggiornamento dei dati del contratto dell'oracolo, quando richiesto. Gli oracoli centralizzati sono efficienti perché si basano su un'unica fonte di verità. Potrebbero funzionare meglio nei casi in cui i set di dati proprietari siano pubblicati direttamente dal proprietario con una firma ampiamente accettata. Tuttavia, comportano anche degli svantaggi: +Un oracolo centralizzato è controllato da una singola entità responsabile dell'aggregazione delle informazioni fuori catena e dell'aggiornamento dei dati del contratto dell'oracolo come richiesto. Gli oracoli centralizzati sono efficienti poiché si affidano a un'unica fonte di verità. Possono funzionare meglio nei casi in cui i set di dati proprietari vengono pubblicati direttamente dal proprietario con una firma ampiamente accettata. Tuttavia, portano anche degli svantaggi: #### Basse garanzie di correttezza {#low-correctness-guarantees} -Con gli oracoli centralizzati, non c'è modo di confermare se le informazioni siano sono corrette o meno. Anche i fornitori con una "buona reputazione" possono comportarsi modo sleale o subire attacchi hacker. Se l'oracolo è corrotto, i contratti intelligenti verranno eseguiti sulla base di dati errati. +Con gli oracoli centralizzati, non c'è modo di confermare se le informazioni fornite siano corrette o meno. Anche i fornitori "rispettabili" possono diventare disonesti o essere hackerati. Se l'oracolo viene corrotto, i contratti intelligenti verranno eseguiti in base a dati errati. #### Scarsa disponibilità {#poor-availability} -Gli oracoli centralizzati non garantiscono che i dati off-chain siano sempre disponibili per gli altri contratti intelligenti. Se il fornitore decide di disattivare il servizio o un hacker sabota il componente off-chain dell'oracolo, il vostro contratto intelligente è a rischio di un attacco denial of service (DoS). +Gli oracoli centralizzati non garantiscono di rendere sempre disponibili i dati fuori catena ad altri contratti intelligenti. Se il fornitore decide di disattivare il servizio o un hacker dirotta il componente fuori catena dell'oracolo, il tuo contratto intelligente è a rischio di un attacco di negazione del servizio (DoS). -#### Scarsa compatibilità con gli incentivi {#poor-incentive-compatibility} +#### Scarsa compatibilità degli incentivi {#poor-incentive-compatibility} -Gli oracoli centralizzati hanno spesso incentivi mal concepiti o inesistenti per indurre il fornitore di dati a inviare informazioni precise/inalterate. Pagare un oracolo per la correttezza non ne garantisce l'onestà. Questo problema è maggiore all'aumentare del valore controllato dai contratti intelligenti. +Gli oracoli centralizzati hanno spesso incentivi mal progettati o inesistenti affinché il fornitore di dati invii informazioni accurate/inalterate. Pagare un oracolo per la correttezza non garantisce l'onestà. Questo problema diventa più grande man mano che aumenta la quantità di valore controllata dai contratti intelligenti. ### Oracoli decentralizzati {#decentralized-oracles} -Gli oracoli decentralizzati sono progettati per superare le limitazioni degli oracoli centralizzati eliminando punti di errori unici. Un servizio di oracolo decentralizzato comprende più partecipanti in una rete peer-to-peer che formano un consenso sui dati off-chain prima di inviarli ad un contratto intelligente. +Gli oracoli decentralizzati sono progettati per superare i limiti degli oracoli centralizzati eliminando i singoli punti di guasto. Un servizio di oracolo decentralizzato comprende più partecipanti in una rete peer-to-peer che formano il consenso sui dati fuori catena prima di inviarli a un contratto intelligente. -Un oracolo decentralizzato dovrebbe (idealmente) essere senza permessi, senza fiducia e libero dall'amministrazione di una parte centrale; in realtà, la decentralizzazione tra gli oracoli è su uno spettro. Ci sono reti di oracoli semi-decentralizzati dove chiunque può partecipare, ma con un “proprietario” che approva e rimuove i nodi in base alle prestazioni storiche. Esistono anche reti di oracoli completamente decentralizzati: queste solitamente funzionano come blockchain standalone e hanno definito meccanismi di consenso per coordinare i nodi e punire i comportamenti scorretti. +Un oracolo decentralizzato dovrebbe (idealmente) essere senza permessi, senza fiducia (trustless) e libero dall'amministrazione da parte di una parte centrale; in realtà, la decentralizzazione tra gli oracoli è su uno spettro. Esistono reti di oracoli semi-decentralizzate a cui chiunque può partecipare, ma con un "proprietario" che approva e rimuove i nodi in base alle prestazioni storiche. Esistono anche reti di oracoli completamente decentralizzate: queste di solito funzionano come blockchain autonome e hanno meccanismi di consenso definiti per coordinare i nodi e punire i comportamenti scorretti. -L'utilizzo di oracoli decentralizzati ha i seguenti vantaggi: +L'utilizzo di oracoli decentralizzati comporta i seguenti vantaggi: -### Alte garanzie di correttezza {#high-correctness-guarantees} +### Elevate garanzie di correttezza {#high-correctness-guarantees} -Gli oracoli decentralizzati tentano di ottenere la correttezza dei dati utilizzando approcci diversi. Ciò include l'uso di prove che attestino l'autenticità e l'integrità delle informazioni restituite e che impongano a più entità di concordare collettivamente la validità dei dati off-chain. +Gli oracoli decentralizzati tentano di ottenere la correttezza dei dati utilizzando approcci diversi. Ciò include l'utilizzo di prove che attestano l'autenticità e l'integrità delle informazioni restituite e la richiesta a più entità di concordare collettivamente sulla validità dei dati fuori catena. #### Prove di autenticità {#authenticity-proofs} -Le prove di autenticità sono meccanismi crittografici che consentono la verifica indipendente delle informazioni recuperate da fonti esterne. Queste prove possono convalidare la fonte delle informazioni e rilevare eventuali modifiche ai dati dopo il recupero. +Le prove di autenticità sono meccanismi crittografici che consentono la verifica indipendente delle informazioni recuperate da fonti esterne. Queste prove possono convalidare la fonte delle informazioni e rilevare possibili alterazioni ai dati dopo il recupero. Esempi di prove di autenticità includono: -**Prove di Transport Layer Security (TLS)**: i nodi oracolo spesso recuperano dati da fonti esterne utilizzando una connessione HTTP sicura basata sul protocollo Transport Layer Security (TLS). Alcuni oracoli decentralizzati utilizzano prove di autenticità per verificare le sessioni TLS (ossia, confermano lo scambio di informazioni tra un nodo e un server specifico) e confermare che il contenuto della sessione non è stato alterato. +**Prove Transport Layer Security (TLS)**: I nodi oracolo spesso recuperano dati da fonti esterne utilizzando una connessione HTTP sicura basata sul protocollo Transport Layer Security (TLS). Alcuni oracoli decentralizzati utilizzano prove di autenticità per verificare le sessioni TLS (ovvero, confermare lo scambio di informazioni tra un nodo e un server specifico) e confermare che i contenuti della sessione non siano stati alterati. -**Attestazioni Trusted Execution Environment (TEE)**: un [ambiente di esecuzione affidabile](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) è un ambiente computazionale sandbox isolato dai processi operativi del suo sistema host. I TEE garantiscono che qualunque codice applicativo o dato memorizzato/utilizzato nell'ambiente di calcolo conservi integrità, riservatezza e immutabilità. Gli utenti possono anche generare un attestato per dimostrare che un'istanza di applicazione è in esecuzione all'interno dell'ambiente di esecuzione affidabile. +**Attestazioni Trusted Execution Environment (TEE)**: Un [ambiente di esecuzione affidabile](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) è un ambiente computazionale in sandbox isolato dai processi operativi del suo sistema host. I TEE garantiscono che qualsiasi codice applicativo o dato archiviato/utilizzato nell'ambiente di calcolo mantenga integrità, riservatezza e immutabilità. Gli utenti possono anche generare un'attestazione per dimostrare che un'istanza dell'applicazione è in esecuzione all'interno dell'ambiente di esecuzione affidabile. -Alcune classi di oracoli decentralizzati richiedono agli operatori dei nodi oracolo di fornire attestazioni TEE. Questo conferma ad un utente che l'operatore del nodo sta eseguendo un'istanza del client oracolo in un ambiente di esecuzione affidabile. I TEE impediscono ai processi esterni di modificare o leggere il codice e i dati di un’applicazione, pertanto, le attestazioni dimostrano che il nodo oracolo ha mantenuto intatte e riservate le informazioni. +Alcune classi di oracoli decentralizzati richiedono agli operatori dei nodi oracolo di fornire attestazioni TEE. Ciò conferma a un utente che l'operatore del nodo sta eseguendo un'istanza del client dell'oracolo in un ambiente di esecuzione affidabile. I TEE impediscono ai processi esterni di alterare o leggere il codice e i dati di un'applicazione, quindi, tali attestazioni dimostrano che il nodo oracolo ha mantenuto le informazioni intatte e riservate. #### Convalida delle informazioni basata sul consenso {#consensus-based-validation-of-information} -Gli oracoli centralizzati si affidano a un'unica fonte di verità quando forniscono dati ai contratti intelligenti, il che introduce la possibilità di pubblicare informazioni imprecise. Gli oracoli decentralizzati risolvono questo problema affidandosi a più nodi oracolo per interrogare le informazioni off-chain. Confrontando i dati provenienti da più fonti, gli oracoli decentralizzati riducono il rischio di trasmettere informazioni non valide ai contratti on-chain. +Gli oracoli centralizzati si affidano a un'unica fonte di verità quando forniscono dati ai contratti intelligenti, il che introduce la possibilità di pubblicare informazioni inaccurate. Gli oracoli decentralizzati risolvono questo problema affidandosi a più nodi oracolo per interrogare le informazioni fuori catena. Confrontando i dati provenienti da più fonti, gli oracoli decentralizzati riducono il rischio di passare informazioni non valide ai contratti on-chain. -Gli oracoli decentralizzati, tuttavia, devono gestire le discrepanze nelle informazioni recuperate da più fonti off-chain. Per ridurre al minimo le differenze di informazione e garantire che i dati passati al contratto oracolo riflettano l'opinione collettiva dei nodi oracolo, gli oracoli decentralizzati utilizzano i seguenti meccanismi: +Gli oracoli decentralizzati, tuttavia, devono affrontare le discrepanze nelle informazioni recuperate da più fonti fuori catena. Per ridurre al minimo le differenze nelle informazioni e garantire che i dati passati al contratto dell'oracolo riflettano l'opinione collettiva dei nodi oracolo, gli oracoli decentralizzati utilizzano i seguenti meccanismi: -##### Votazione/staking sulla precisione dei dati +##### Votazione/staking sull'accuratezza dei dati -Alcune reti di oracoli decentralizzati richiedono ai partecipanti di votare o mettere in staking token sulla precisione delle risposte alle interrogazioni di dati (ad esempio, "Chi ha vinto le elezioni negli Stati Uniti del 2020?") utilizzando il token nativo della rete. Un protocollo di aggregazione aggrega quindi i voti e gli stake e prende come valida la risposta sostenuta dalla maggioranza. +Alcune reti di oracoli decentralizzate richiedono ai partecipanti di votare o fare staking sull'accuratezza delle risposte alle query di dati (ad es., "Chi ha vinto le elezioni statunitensi del 2020?") utilizzando il token nativo della rete. Un protocollo di aggregazione aggrega quindi i voti e gli stake e prende come valida la risposta supportata dalla maggioranza. -I nodi le cui risposte si discostano dalla risposta maggioritaria vengono penalizzati con la distribuzione dei loro token ad altri che forniscono valori più corretti. Obbligare i nodi a fornire una garanzia prima di fornire i dati incentiva le risposte oneste, poiché si presume che siano attori economici razionali intenti a massimizzare i rendimenti. +I nodi le cui risposte si discostano dalla risposta della maggioranza vengono penalizzati distribuendo i loro token ad altri che forniscono valori più corretti. Costringere i nodi a fornire una cauzione prima di fornire dati incentiva risposte oneste poiché si presume che siano attori economici razionali intenti a massimizzare i rendimenti. -Inoltre, lo staking e il voto proteggono gli oracoli decentralizzati dagli [attacchi Sybil](/glossary/#sybil-attack), in cui gli utenti malevoli creano svariate identità per prendersi gioco del sistema del consenso. Tuttavia, lo staking non può impedire il "freeloading" (nodi oracolo che copiano informazioni da altri) e la "convalida pigra" (nodi oracolo che seguono la maggioranza senza verificare le informazioni stesse). +Lo staking/votazione protegge anche gli oracoli decentralizzati dagli [attacchi Sybil](/glossary/#sybil-attack) in cui attori malintenzionati creano più identità per manipolare il sistema di consenso. Tuttavia, lo staking non può impedire lo "scrocco" (freeloading, nodi oracolo che copiano informazioni da altri) e la "convalida pigra" (lazy validation, nodi oracolo che seguono la maggioranza senza verificare le informazioni da soli). ##### Meccanismi del punto di Schelling -Il [punto di Schelling](https://en.wikipedia.org/wiki/Focal_point_(game_theory)) è un concetto della teoria dei giochi che presuppone che più entità, in assenza di qualsiasi comunicazione, sceglieranno sempre una soluzione comune a un problema. I meccanismi del punto di Schelling sono spesso utilizzati nelle reti di oracoli decentralizzati per consentire ai nodi di raggiungere un consenso sulle risposte alle richieste di dati. +Il [punto di Schelling]() è un concetto della teoria dei giochi che presuppone che più entità adotteranno sempre una soluzione comune a un problema in assenza di qualsiasi comunicazione. I meccanismi del punto di Schelling sono spesso utilizzati nelle reti di oracoli decentralizzate per consentire ai nodi di raggiungere il consenso sulle risposte alle richieste di dati. -Una prima idea a riguardo è stato [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed) un feed di dati proposto in cui i partecipanti inviano risposte a domande "scalari" (domande le cui risposte sono descritte da una grandezza, ad esempio "qual è il prezzo di ETH?"), insieme a un deposito. Gli utenti che forniscono valori compresi tra il 25° e il 75° [percentile](https://en.wikipedia.org/wiki/Percentile) vengono premiati, mentre quelli i cui valori si discostano ampiamente dal valore mediano vengono penalizzati. +Una prima idea per questo è stata [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed), un feed di dati proposto in cui i partecipanti inviano risposte a domande "scalari" (domande le cui risposte sono descritte da una grandezza, ad es., "qual è il prezzo di ETH?"), insieme a un deposito. Gli utenti che forniscono valori compresi tra il 25° e il 75° [percentile](https://en.wikipedia.org/wiki/Percentile) vengono ricompensati, mentre quelli i cui valori si discostano ampiamente dal valore mediano vengono penalizzati. -Sebbene SchellingCoin oggi non esista, alcuni oracoli decentralizzati, diversi oracoli decentralizzati – in particolare gli [oracoli del Protocollo Maker](https://docs.makerdao.com/smart-contract-modules/oracle-module) – utilizzano il meccanismo del punto di Schelling per migliorare la precisione dei dati dell'oracolo. Ogni Oracolo Maker consiste in una rete P2P off-chain di nodi ("relayer" e "feed") che inviano i prezzi di mercato per le risorse collaterali e un contratto "Medianizer" on-chain che calcola la mediana di tutti i valori forniti. Una volta terminato il periodo di ritardo specificato, questo valore mediano diventa il nuovo prezzo di riferimento per la risorsa associata. +Sebbene SchellingCoin non esista oggi, un certo numero di oracoli decentralizzati — in particolare gli [Oracoli del Protocollo Maker](https://docs.makerdao.com/smart-contract-modules/oracle-module) — utilizzano il meccanismo del punto di Schelling per migliorare l'accuratezza dei dati dell'oracolo. Ogni Oracolo Maker è costituito da una rete P2P fuori catena di nodi ("relayer" e "feed") che inviano i prezzi di mercato per gli asset collaterali e da un contratto "Medianizer" on-chain che calcola la mediana di tutti i valori forniti. Una volta terminato il periodo di ritardo specificato, questo valore mediano diventa il nuovo prezzo di riferimento per l'asset associato. -Altri esempi di oracoli che utilizzano meccanismi del punto di Schelling sono [Chainlink Off-Chain Reporting](https://docs.chain.link/docs/off-chain-reporting/) e [Witnet](https://witnet.io/). In entrambi i sistemi, le risposte dei nodi oracolo nella rete peer-to-peer vengono aggregate in un unico valore, come la media o la mediana. I nodi vengono premiati o sanzionati in base alla misura in cui le loro risposte si allineano o si discostano dal valore aggregato. +Altri esempi di oracoli che utilizzano meccanismi del punto di Schelling includono [Chainlink Offchain Reporting](https://docs.chain.link/architecture-overview/off-chain-reporting) e [Witnet](https://witnet.io/). In entrambi i sistemi, le risposte dei nodi oracolo nella rete peer-to-peer vengono aggregate in un singolo valore aggregato, come una media o una mediana. I nodi vengono ricompensati o puniti in base alla misura in cui le loro risposte si allineano o si discostano dal valore aggregato. -I meccanismi del punto di Schelling sono interessanti perché riducono al minimo lo spazio occupato on-chain (è necessario inviare una sola transazione) garantendo al contempo la decentralizzazione. Questa è possibile perché i nodi devono approvare l'elenco delle risposte inviate prima che questo venga inserito nell'algoritmo che produce il valore medio/mediano. +I meccanismi del punto di Schelling sono attraenti perché riducono al minimo l'impronta on-chain (deve essere inviata solo una transazione) garantendo al contempo la decentralizzazione. Quest'ultima è possibile perché i nodi devono firmare l'elenco delle risposte inviate prima che venga inserito nell'algoritmo che produce il valore medio/mediano. ### Disponibilità {#availability} -I servizi oracolo decentralizzati garantiscono un'elevata disponibilità di dati off-chain per i contratti intelligenti. Ciò si ottiene decentralizzando sia la fonte delle informazioni off-chain sia i nodi responsabili del trasferimento delle informazioni on-chain. +I servizi di oracolo decentralizzati garantiscono un'elevata disponibilità di dati fuori catena ai contratti intelligenti. Ciò si ottiene decentralizzando sia la fonte delle informazioni fuori catena sia i nodi responsabili del trasferimento delle informazioni on-chain. -Questo garantisce la tolleranza ai guasti, perché il contratto oracolo può affidarsi a più nodi (che si affidano anche a più fonti di dati) per eseguire interrogazioni da altri contratti. La decentralizzazione a livello sorgente _e_ di operatore del nodo è fondamentale: una rete di nodi oracolo che servono informazioni recuperate dalla stessa fonte incorrerà nello stesso problema di un oracolo centralizzato. +Ciò garantisce la tolleranza ai guasti poiché il contratto dell'oracolo può fare affidamento su più nodi (che a loro volta si affidano a più fonti di dati) per eseguire query da altri contratti. La decentralizzazione alla fonte _e_ a livello di operatore del nodo è cruciale: una rete di nodi oracolo che serve informazioni recuperate dalla stessa fonte incorrerà nello stesso problema di un oracolo centralizzato. -È anche possibile che gli oracoli basati sullo staking possano tagliare gli operatori dei nodi che non rispondono rapidamente alle richieste di dati. Questo incentiva in modo significativo i nodi oracolo a investire nell'infrastruttura tollerante ai guasti e a fornire i dati in modo tempestivo. +È anche possibile per gli oracoli basati sullo staking punire gli operatori dei nodi che non rispondono rapidamente alle richieste di dati. Ciò incentiva in modo significativo i nodi oracolo a investire in infrastrutture tolleranti ai guasti e a fornire dati in modo tempestivo. -### Buona compatibilità con gli incentivi {#good-incentive-compatibility} +### Buona compatibilità degli incentivi {#good-incentive-compatibility} -Gli oracoli decentralizzati implementano svariati modelli di incentivi per prevenire il comportamento [bizantino](https://en.wikipedia.org/wiki/Byzantine_fault) tra i nodi dell'oracolo. In particolare, ottengono _attribuibilità_ e _responsabilità_: +Gli oracoli decentralizzati implementano vari modelli di incentivi per prevenire comportamenti [bizantini](https://en.wikipedia.org/wiki/Byzantine_fault) tra i nodi oracolo. Nello specifico, ottengono _attribuibilità_ e _responsabilità_: -1. Ai nodi oracolo decentralizzati viene spesso richiesto di firmare i dati che forniscono in risposta alle richieste di dati. Queste informazioni aiutano a valutare le prestazioni storiche dei nodi oracolo, in modo che gli utenti possano filtrare i nodi oracolo inaffidabili quando effettuano richieste di dati. Un esempio è il [sistema algoritmico di reputazione](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) di Witnet. +1. Ai nodi oracolo decentralizzati è spesso richiesto di firmare i dati che forniscono in risposta alle richieste di dati. Queste informazioni aiutano a valutare le prestazioni storiche dei nodi oracolo, in modo che gli utenti possano filtrare i nodi oracolo inaffidabili quando effettuano richieste di dati. Un esempio è il [Sistema di Reputazione Algoritmica](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system) di Witnet. -2. Gli oracoli decentralizzati, come spiegato in precedenza, possono richiedere ai nodi di mettere token in staking per garantire la veridicità dei dati inviati. Se i dati vengono confermati, lo stake può essere restituito insieme ai premi per il servizio onesto. Ma può anche essere tagliato nel caso in cui le informazioni non siano corrette, il che fornisce un certo grado di responsabilità. +2. Gli oracoli decentralizzati — come spiegato in precedenza — possono richiedere ai nodi di piazzare uno stake sulla loro fiducia nella veridicità dei dati che inviano. Se l'affermazione risulta corretta, questo stake può essere restituito insieme a ricompense per il servizio onesto. Ma può anche essere punito nel caso in cui le informazioni siano errate, il che fornisce una certa misura di responsabilità. ## Applicazioni degli oracoli nei contratti intelligenti {#applications-of-oracles-in-smart-contracts} I seguenti sono casi d'uso comuni per gli oracoli in Ethereum: -### Recupero dei dati finanziari {#retrieving-financial-data} +### Recupero di dati finanziari {#retrieving-financial-data} -Le applicazioni di [finanza decentralizzata](/defi/) (DeFi) consentono di concedere e ricevere prestiti e scambiare risorse peer-to-peer. Questo spesso impone di ottenere diverse informazioni finanziarie, tra cui i dati sui tassi di cambio (per calcolare il valore in moneta legale delle criptovalute o per confrontare i prezzi dei token) e i dati sui mercati dei capitali (per calcolare il valore delle risorse tokenizzate, come l'oro o il dollaro USA). +Le applicazioni di [finanza decentralizzata](/defi/) (DeFi) consentono il prestito, l'indebitamento e il trading di asset peer-to-peer. Ciò richiede spesso l'ottenimento di diverse informazioni finanziarie, inclusi i dati sui tassi di cambio (per calcolare il valore fiat delle criptovalute o confrontare i prezzi dei token) e i dati dei mercati dei capitali (per calcolare il valore degli asset tokenizzati, come l'oro o il dollaro USA). -Un protocollo di prestito DeFi, ad esempio, deve poter interrogare i prezzi di mercato correnti per le risorse (es. ETH) depositate come garanzia. Ciò consente al contratto di determinare il valore delle risorse collaterali e di determinare quanto può prendere in prestito dal sistema. +Un protocollo di prestito DeFi, ad esempio, deve interrogare i prezzi di mercato attuali per gli asset (ad es., ETH) depositati come garanzia. Ciò consente al contratto di determinare il valore degli asset collaterali e determinare quanto può prendere in prestito dal sistema. -Gli “oracoli di prezzo” popolari (come sono spesso chiamati) nella DeFi includono Chainlink Price Feeds, [Open Price Feed](https://compound.finance/docs/prices) di Compound Protocol, [Time-Weighted Average Prices (TWAP)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) di Uniswap e [Oracoli Maker](https://docs.makerdao.com/smart-contract-modules/oracle-module). +I popolari "oracoli di prezzo" (come vengono spesso chiamati) nella DeFi includono i Chainlink Price Feeds, l'[Open Price Feed](https://compound.finance/docs/prices) del Protocollo Compound, i [Time-Weighted Average Prices (TWAP)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) di Uniswap e i [Maker Oracles](https://docs.makerdao.com/smart-contract-modules/oracle-module). -I costruttori dovrebbero comprendere le avvertenze che accompagnano questi oracoli dei prezzi prima di integrarli nel proprio progetto. Questo [articolo](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) fornisce un'analisi dettagliata degli aspetti da considerare quando si intende utilizzare uno degli oracoli di prezzo citati. +I costruttori dovrebbero comprendere le avvertenze che derivano da questi oracoli di prezzo prima di integrarli nel loro progetto. Questo [articolo](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) fornisce un'analisi dettagliata di cosa considerare quando si pianifica di utilizzare uno qualsiasi degli oracoli di prezzo menzionati. -Di seguito è riportato un esempio di come recuperare l'ultimo prezzo dell'ETH nel proprio contratto intelligente utilizzando un feed di prezzo di Chainlink: +Di seguito è riportato un esempio di come puoi recuperare l'ultimo prezzo di ETH nel tuo contratto intelligente utilizzando un feed di prezzo Chainlink: ```solidity pragma solidity ^0.6.7; @@ -329,18 +329,24 @@ contract PriceConsumerV3 { AggregatorV3Interface internal priceFeed; - /** - * Network: Kovan - * Aggregator: ETH/USD - * Address: 0x9326BFA02ADD2366b30bacB125260Af641031331 - */ + /* * + * Rete: Kovan + * Aggregatore: ETH/USD + * Indirizzo: 0x9326BFA02ADD2366b30bacB125260Af641031331 */ + + + + + constructor() public { priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); } - /** - * Returns the latest price - */ + /* * + * Restituisce l'ultimo prezzo */ + + + function getLatestPrice() public view returns (int) { ( uint80 roundID, @@ -354,77 +360,84 @@ contract PriceConsumerV3 { } ``` -### Generare casualità verificabile {#generating-verifiable-randomness} +### Generazione di casualità verificabile {#generating-verifiable-randomness} -Alcune applicazioni della blockchain, come i giochi o le lotterie basate su blockchain, richiedono un alto livello di imprevedibilità e casualità per funzionare efficacemente. Tuttavia, l'esecuzione deterministica delle blockchain elimina la casualità. +Alcune applicazioni blockchain, come i giochi basati su blockchain o i sistemi di lotteria, richiedono un alto livello di imprevedibilità e casualità per funzionare in modo efficace. Tuttavia, l'esecuzione deterministica delle blockchain elimina la casualità. -L'approcio originale consisteva nell'utilizzare una funzione crittografica pseudocasuale, come ad esempio `blockhash`, ma questa era suscettibile di [manipolazioni da parte dei minatori](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.) che risolvevano l'algoritmo di proof-of-work. Inoltre il [passaggio al proof-of-stake](/roadmap/merge/) di Ethereum fa sì che gli sviluppatori non possano più affidarsi al `blockhash` per la casualità on-chain. Il [meccanismo RANDAO](https://eth2book.info/altair/part2/building_blocks/randomness) della Beacon Chain fornisce invece una fonte alternativa di casualità. +L'approccio originale era quello di utilizzare funzioni crittografiche pseudocasuali, come `blockhash`, ma queste potevano essere [manipolate dai miner](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.) che risolvevano l'algoritmo di prova di lavoro. Inoltre, il [passaggio di Ethereum alla prova di stake](/roadmap/merge/) significa che gli sviluppatori non possono più fare affidamento su `blockhash` per la casualità on-chain. Il [meccanismo RANDAO](https://eth2book.info/altair/part2/building_blocks/randomness) della beacon chain fornisce invece una fonte alternativa di casualità. -È possibile generare il valore casuale off-chain e inviarlo sulla catena, ma ciò impone agli utenti requisiti di fiducia elevati. Devono credere che il valore sia stato realmente generato attraverso meccanismi imprevedibili e non sia stato alterato in transito. +È possibile generare il valore casuale fuori catena e inviarlo on-chain, ma farlo impone elevati requisiti di fiducia agli utenti. Devono credere che il valore sia stato veramente generato tramite meccanismi imprevedibili e non sia stato alterato durante il transito. -Gli oracoli progettati per il calcolo off-chain risolvono questo problema generando in modo sicuro risultati casuali fuori catena che trasmettono sulla catena insieme a prove crittografiche che attestano l'imprevedibilità del processo. Un esempio è [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), che è un generatore di numeri casuali (RNG) dimostrabilmente equo e a prova di manomissione, utile per costruire contratti intelligenti affidabili per applicazioni che si basano su risultati imprevedibili. +Gli oracoli progettati per il calcolo fuori catena risolvono questo problema generando in modo sicuro risultati casuali fuori catena che trasmettono on-chain insieme a prove crittografiche che attestano l'imprevedibilità del processo. Un esempio è [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/) (Verifiable Random Function), che è un generatore di numeri casuali (RNG) dimostrabilmente equo e a prova di manomissione utile per costruire contratti intelligenti affidabili per applicazioni che si basano su risultati imprevedibili. ### Ottenere risultati per gli eventi {#getting-outcomes-for-events} -Con gli oracoli, la creazione di contratti intelligenti che rispondono a eventi del mondo reale è facile. I servizi oracolo lo rendono possibile consentendo ai contratti di connettersi ad API esterne attraverso componenti off-chain e di consumare informazioni da tali fonti di dati. Ad esempio, la dapp predittiva menzionata in precedenza può richiedere a un oracolo di restituire i risultati delle elezioni da una fonte fidata off-chain (ad esempio l'Associated Press). +Con gli oracoli, creare contratti intelligenti che rispondono a eventi del mondo reale è facile. I servizi di oracolo lo rendono possibile consentendo ai contratti di connettersi ad API esterne tramite componenti fuori catena e consumare informazioni da quelle fonti di dati. Ad esempio, la dApp di previsione menzionata in precedenza potrebbe richiedere a un oracolo di restituire i risultati elettorali da una fonte fuori catena affidabile (ad es., l'Associated Press). + +L'utilizzo di oracoli per recuperare dati basati su risultati del mondo reale abilita altri nuovi casi d'uso; ad esempio, un prodotto assicurativo decentralizzato ha bisogno di informazioni accurate su meteo, disastri, ecc. per funzionare in modo efficace. -L'utilizzo degli oracoli per recuperare i dati secondo i risultati del mondo reale consente altri nuovi casi d'uso; ad esempio, un prodotto assicurativo decentralizzato necessita di informazioni accurate su meteo, disastri, ecc., per funzionare efficientemente. +### Automazione dei contratti intelligenti {#automating-smart-contracts} -### Automatizzare i contratti intelligenti {#automating-smart-contracts} +I contratti intelligenti non vengono eseguiti automaticamente; piuttosto, un account controllato esternamente (EOA), o un altro account di contratto, deve innescare le funzioni giuste per eseguire il codice del contratto. Nella maggior parte dei casi, la maggior parte delle funzioni del contratto sono pubbliche e possono essere invocate da EOA e altri contratti. -I contratti intelligenti non si eseguono automaticamente; piuttosto, un conto posseduto esternamente (EOA), o un altro conto di contratto, deve attivare le funzioni giuste per eseguire il codice del contratto. Nella maggior parte dei casi, la maggior parte delle funzioni del contratto è pubblica e può essere invocata da EOA e altri contratti. +Ma ci sono anche _funzioni private_ all'interno di un contratto che sono inaccessibili ad altri, ma che sono fondamentali per la funzionalità complessiva di una dApp. Esempi includono una funzione `mintERC721Token()` che conia periodicamente nuovi NFT per gli utenti, una funzione per l'assegnazione di pagamenti in un mercato di previsione o una funzione per sbloccare i token in staking in un DEX. -Ma in un contratto esistono anche _funzioni private_ che non sono accessibili ad altri, ma critiche per la funzionalità complessiva della dApp. Alcuni esempi sono una funzione `mintERC721Token()` che conia periodicamente nuovi NFT per gli utenti, una funzione per assegnare le vincite in un mercato predittivo, o una funzione per sbloccare i token messi in staking in un DEX. +Gli sviluppatori dovranno innescare tali funzioni a intervalli per mantenere l'applicazione in esecuzione senza intoppi. Tuttavia, ciò potrebbe portare a più ore perse in compiti banali per gli sviluppatori, motivo per cui l'automazione dell'esecuzione dei contratti intelligenti è attraente. -Gli sviluppatori dovranno attivare tali funzioni a intervalli per mantenere il corretto funzionamento dell'applicazione. Tuttavia, ciò potrebbe comportare un aumento delle ore perse in attività banali per gli sviluppatori, motivo per cui l'automazione dell'esecuzione dei contratti intelligenti è accattivante. +Alcune reti di oracoli decentralizzate offrono servizi di automazione, che consentono ai nodi oracolo fuori catena di innescare le funzioni dei contratti intelligenti in base a parametri definiti dall'utente. In genere, ciò richiede la "registrazione" del contratto di destinazione con il servizio di oracolo, fornendo fondi per pagare l'operatore dell'oracolo e specificando le condizioni o i tempi per innescare il contratto. -Alcune reti di oracoli decentralizzati offrono servizi di automazione, che consentono ai nodi oracolo off-chain di attivare funzioni di contratti intelligenti in base a parametri definiti dall'utente. In genere, ciò richiede la "registrazione" del contratto interessato al servizio oracolo, la fornitura di fondi per pagare l'operatore dell'oracolo e la specificazione delle condizioni o dei tempi di attivazione del contratto. +La [Keeper Network](https://chain.link/keepers) di Chainlink fornisce opzioni per i contratti intelligenti per esternalizzare le normali attività di manutenzione in modo decentralizzato e con fiducia ridotta al minimo. Leggi la [documentazione ufficiale di Keeper](https://docs.chain.link/docs/chainlink-keepers/introduction/) per informazioni su come rendere il tuo contratto compatibile con Keeper e utilizzare il servizio Upkeep. -[Keeper Network](https://chain.link/keepers) di Chainlink fornisce opzioni per i contratti intelligenti per esternalizzare le attività di manutenzione ordinaria in modo decentralizzato e con il minimo di fiducia. Leggi la [documentazione ufficiale di Keeper](https://docs.chain.link/docs/chainlink-keepers/introduction/) per le informazioni su come rendere il tuo contratto compatibile con Keeper e utilizzare il servizio Upkeep. +## Come usare gli oracoli blockchain {#use-blockchain-oracles} -## Come utilizzare gli oracoli della blockchain {#use-blockchain-oracles} +Ci sono diverse applicazioni di oracoli che puoi integrare nella tua dApp di Ethereum: -Ci sono più applicazioni di oracoli che puoi integrare nella tua dapp su Ethereum: +**[Chainlink](https://chain.link/)** - _Le reti di oracoli decentralizzate Chainlink forniscono input, output e calcoli a prova di manomissione per supportare contratti intelligenti avanzati su qualsiasi blockchain._ -**[Chainlink](https://chain.link/)** - _ Le reti di oracoli decentralizzati di Chainlink forniscono input a prova di manomissione, output e calcoli per supportare contratti intelligenti avanzati su qualsiasi blockchain._ +**[RedStone Oracles](https://redstone.finance/)** - _RedStone è un oracolo modulare decentralizzato che fornisce feed di dati ottimizzati per il gas. È specializzato nell'offrire feed di prezzo per asset emergenti, come i token di liquid staking (LST), i token di liquid restaking (LRT) e i derivati di staking di Bitcoin._ -**[Chronicle](https://chroniclelabs.org/)** - _Chronicle supera le attuali limitazioni del trasferimento dei dati sulla catena sviluppando oracoli veramente scalabili, economici, decentralizzati e verificabili._ +**[Chronicle](https://chroniclelabs.org/)** - _Chronicle supera gli attuali limiti del trasferimento di dati on-chain sviluppando oracoli veramente scalabili, efficienti in termini di costi, decentralizzati e verificabili._ **[Witnet](https://witnet.io/)** - _Witnet è un oracolo senza permessi, decentralizzato e resistente alla censura che aiuta i contratti intelligenti a reagire agli eventi del mondo reale con forti garanzie cripto-economiche._ -**[UMA Oracle](https://uma.xyz)** - _L'oracolo ottimistico di UMA consente ai contratti intelligenti di ricevere rapidamente qualsiasi tipo di dati per diverse applicazioni, tra cui assicurazioni, derivati finanziari e mercati predittivi._ +**[UMA Oracle](https://uma.xyz)** - _L'oracolo ottimistico di UMA consente ai contratti intelligenti di ricevere rapidamente qualsiasi tipo di dato per diverse applicazioni, tra cui assicurazioni, derivati finanziari e mercati di previsione._ + +**[Tellor](https://tellor.io/)** - _Tellor è un protocollo oracolo trasparente e senza permessi per il tuo contratto intelligente per ottenere facilmente qualsiasi dato ogni volta che ne ha bisogno._ + +**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol è una piattaforma di oracoli di dati cross-chain che aggrega e connette dati del mondo reale e API ai contratti intelligenti._ + +**[Pyth Network](https://pyth.network/)** - _La rete Pyth è una rete di oracoli finanziari di prima parte progettata per pubblicare dati continui del mondo reale on-chain in un ambiente a prova di manomissione, decentralizzato e autosostenibile._ -**[Tellor](https://tellor.io/)** - _Tellor è un protocollo di oracolo trasparente e senza permessi per i tuoi contratti intelligenti al fine di ottenere facilmente tutti i dati ogni volta che ne hanno bisogno._ +**[API3 DAO](https://www.api3.org/)** - _API3 DAO sta fornendo soluzioni di oracoli di prima parte che offrono maggiore trasparenza delle fonti, sicurezza e scalabilità in una soluzione decentralizzata per i contratti intelligenti_ -**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol è una piattaforma di oracolo di dati tra catene che aggrega e collega dati reali e API ai contratti intelligenti._ +**[Supra](https://supra.com/)** - Un toolkit integrato verticalmente di soluzioni cross-chain che interconnettono tutte le blockchain, pubbliche (L1 e L2) o private (aziende), fornendo feed di prezzo di oracoli decentralizzati che possono essere utilizzati per casi d'uso on-chain e fuori catena. -**[Pyth Network](https://pyth.network/)** - _La rete Pyth è una rete di oracoli finanziari di prima parte progettata per pubblicare dati continui del mondo reale sulla catena in un ambiente resistente alle manomissioni, decentralizzato e autosostenibile._ +**[Gas Network](https://gas.network/)** - Una piattaforma di oracoli distribuita che fornisce dati sui prezzi del gas in tempo reale attraverso la blockchain. Portando on-chain i dati dei principali fornitori di dati sui prezzi del gas, Gas Network sta aiutando a guidare l'interoperabilità. Gas Network supporta i dati per oltre 35 catene, tra cui la rete principale di Ethereum e molti dei principali L2. -**[DAO di API3](https://www.api3.org/)**: _la DAO di API3 distribuisce soluzioni di oracolo di prima parte che offrono una maggiore trasparenza della fonte, sicurezza e scalabilità in una soluzione decentralizzata per i contratti intelligenti_ +**[DIA](https://www.diadata.org/)** - Una rete di oracoli cross-chain che fornisce feed di dati verificabili per oltre 20.000 asset in tutte le principali classi di asset. DIA ricava i dati grezzi di trading direttamente da oltre 100 mercati primari e li calcola on-chain, garantendo completa trasparenza e verificabilità dei dati con configurazioni personalizzate per qualsiasi caso d'uso. -**[Supra](https://supra.com/)**: un kit di strumenti integrato verticalmente di soluzioni tra catene che interconnettono tutte le blockchain, pubbliche (L1 e L2) o private (aziendali), fornendo feed sui prezzi degli oracoli decentralizzati utilizzabili per i casi d'uso interni ed esterni alla catena. +**[Stork](https://stork.network)** - Stork fornisce dati sui prezzi a latenza ultra-bassa, supportando un'ampia gamma di casi d'uso tra cui mercati perpetui, protocolli di prestito ed ecosistemi DeFi, con nuovi asset supportati rapidamente al momento della quotazione. -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} **Articoli** -- [What Is a Blockchain Oracle?](https://chain.link/education/blockchain-oracles) — _Chainlink_ -- [What is a Blockchain Oracle?](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72) — _Patrick Collins_ -- [Decentralised Oracles: a comprehensive overview](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) — _Julien Thevenard_ -- [Implementing a Blockchain Oracle on Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ -- [Why can't smart contracts make API calls?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_ -- [So you want to use a price oracle](https://samczsun.com/so-you-want-to-use-a-price-oracle/) — _samczsun_ +- [Cos'è un oracolo blockchain?](https://chain.link/education/blockchain-oracles) — _Chainlink_ +- [Cos'è un oracolo blockchain?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) — _Patrick Collins_ +- [Oracoli decentralizzati: una panoramica completa](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) — _Julien Thevenard_ +- [Implementazione di un oracolo blockchain su Ethereum](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ +- [Perché i contratti intelligenti non possono effettuare chiamate API?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_ +- [Quindi vuoi usare un oracolo di prezzo](https://samczsun.com/so-you-want-to-use-a-price-oracle/) — _samczsun_ **Video** -- [Oracoli ed espansione dell'utilità della blockchain](https://youtu.be/BVUZpWa8vpw) - _Real Vision Finance_ -- [Le differenze gli oracoli di prime e di terze parti](https://blockchainoraclesummit.io/first-party-vs-third-party-oracles/): _Blockchain Oracle Summit_ +- [Gli oracoli e l'espansione dell'utilità della blockchain](https://youtu.be/BVUZpWa8vpw) — _Real Vision Finance_ **Tutorial** -- [Come recuperare il prezzo corrente di Ethereum in Solidity](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) - _Chainlink_ -- [Consuming Oracle Data](https://docs.chroniclelabs.org/Developers/tutorials/Remix) — _Chronicle_ +- [Come recuperare il prezzo attuale di Ethereum in Solidity](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — _Chainlink_ +- [Consumare i dati dell'oracolo](https://docs.chroniclelabs.org/Developers/tutorials/Remix) — _Chronicle_ **Progetti di esempio** -- [Progetto iniziale e completo di Chainlink per Ethereum in Solidity](https://github.com/hackbg/chainlink-fullstack) - _HackBG_ +- [Progetto iniziale completo Chainlink per Ethereum in Solidity](https://github.com/hackbg/chainlink-fullstack) — _HackBG_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/dart/index.md b/public/content/translations/it/developers/docs/programming-languages/dart/index.md index ba1069144fa..bada7d07fb3 100644 --- a/public/content/translations/it/developers/docs/programming-languages/dart/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/dart/index.md @@ -1,28 +1,31 @@ --- -title: Ethereum per sviluppatori Dart -description: Impara a sviluppare per Ethereum usando il linguaggio Dart +title: Ethereum per gli sviluppatori Dart +description: Scopri come sviluppare per Ethereum usando il linguaggio Dart lang: it incomplete: true --- -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} ## Tutorial {#tutorials} -- [Flutter e Blockchain – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) è una guida passo dopo passo per chi inizia da zero: +- [Flutter and Blockchain – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) ti guida attraverso tutti i passaggi per iniziare: 1. Scrivere un contratto intelligente in [Solidity](https://soliditylang.org/) - 2. Scrivere un'interfaccia utente su Dart -- [Creare una dapp Mobile con Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) è molto più breve, il che potrebbe esser meglio se conosci già le basi -- Se preferisci imparare guardando un video, puoi guardare [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA), lungo all'incirca un'ora -- Se sei impaziente, questo potrebbe fare al caso tuo [Building a Blockchain Decentralized-app with Flutter and Dart on Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s) (Creare un'app decentralizzata sulla Blockchain con Flutter e Dart su Ethereum), che dura solo circa venti minuti -- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) - questo breve video ti guida nei passaggi dell'integrazione di MetaMask nelle tue applicazioni di Flutter con la libreria [Web3Modal](https://pub.dev/packages/web3modal_flutter) di WalletConnect -- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) - playlist del corso per sviluppatori di blockchain mobili full stack + 2. Scrivere un'interfaccia utente in Dart +- [Building a Mobile dapp with Flutter](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) è molto più breve, il che potrebbe essere meglio se conosci già le basi +- Se preferisci imparare guardando un video, puoi guardare [Build Your First Blockchain Flutter App](https://www.youtube.com/watch?v=3Eeh3pJ6PeA), che dura circa un'ora +- Se sei impaziente, potresti preferire [Building a Blockchain Decentralized-app with Flutter and Dart on Ethereum](https://www.youtube.com/watch?v=jaMFEOCq_1s), che dura solo una ventina di minuti +- [Integrating MetaMask in Flutter application with Web3Modal by WalletConnect](https://www.youtube.com/watch?v=v_M2buHCpc4) - questo breve video ti guida attraverso i passaggi per integrare MetaMask nelle tue applicazioni Flutter con la libreria [Web3Modal](https://pub.dev/packages/web3modal_flutter) di WalletConnect +- [Mobile Blockchain Developer Bootcamp Course With Solidity & Flutter](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) - playlist del corso per sviluppatori blockchain mobile full stack ## Lavorare con i client di Ethereum {#working-with-ethereum-clients} -Puoi usare Ethereum per creare applicazioni decentralizzate (o "dapp") che utilizzano i benefici delle criptovalute e la tecnologia della blockchain. Esistono almeno due librerie attualmente mantenute per Dart per utilizzare l'[API di JSON-RPC](/developers/docs/apis/json-rpc/) per Ethereum. +Puoi usare Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. +Ci sono almeno due librerie attualmente mantenute per Dart per usare l'[API JSON-RPC](/developers/docs/apis/json-rpc/) per Ethereum. -1. [Web3dart da simonbutler.eu](https://pub.dev/packages/web3dart) -1. [Ethereum 5.0.0 da darticulate.com](https://pub.dev/packages/ethereum) +1. [Web3dart di pwa.ir](https://pub.dev/packages/web3dart) +1. [Ethereum 5.0.0 di darticulate.com](https://pub.dev/packages/ethereum) -Esistono anche librerie aggiuntive che ti consentono di manipolare indirizzi specifici di Ethereum o che ti consentono di recuperare i prezzi di varie criptovalute. [Qui puoi visualizzare l'elenco completo](https://pub.dev/dart/packages?q=ethereum). +Ci sono anche librerie aggiuntive che ti permettono di manipolare specifici indirizzi Ethereum, +o che ti consentono di recuperare i prezzi di varie criptovalute. +[Puoi vedere l'elenco completo qui](https://pub.dev/dart/packages?q=ethereum). \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/delphi/index.md b/public/content/translations/it/developers/docs/programming-languages/delphi/index.md index 69ddee82a10..b60e656d3ce 100644 --- a/public/content/translations/it/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/delphi/index.md @@ -1,56 +1,56 @@ --- -title: Ethereum per sviluppatori Delphi -description: Impara a sviluppare per Ethereum utilizzando il linguaggio di programmazione Delphi +title: Ethereum per gli sviluppatori Delphi +description: Scopri come sviluppare per Ethereum usando il linguaggio di programmazione Delphi lang: it incomplete: true --- -Impara a sviluppare per Ethereum utilizzando il linguaggio di programmazione Delphi +Scopri come sviluppare per Ethereum usando il linguaggio di programmazione Delphi -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -Creare applicazioni decentralizzate su Ethereum e interagire con i contratti intelligenti usando il linguaggio di programmazione Delphi! +Crea applicazioni decentralizzate su Ethereum e interagisci con i contratti intelligenti usando il linguaggio di programmazione Delphi! -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} -**Inizia a integrare Delphi con Ethereum** +**Fai i tuoi primi passi per integrare Delphi con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Riferimenti e link per principianti {#beginner-references-and-links} **Introduzione alla libreria Delphereum** -- [What is Delphereum?](https://github.com/svanas/delphereum/blob/master/README.md) -- [Connecting Delphi to a local (in-memory) blockchain](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) +- [Cos'è Delphereum?](https://github.com/svanas/delphereum/blob/master/README.md) +- [Connettere Delphi a una blockchain locale (in memoria)](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) - [Connettere Delphi alla rete principale di Ethereum](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) -- [Connettere Delphi ai Contratti Intelligenti](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) +- [Connettere Delphi ai contratti intelligenti](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) -**Vuoi lasciare stare la configurazione per ora e passare direttamente agli esempi?** +**Vuoi saltare la configurazione per ora e passare direttamente agli esempi?** -- [Un Contratto Intelligente di 3 minuti e Delphi - Parte 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) -- [Un Contratto Intelligente di 3 minuti e Delphi - Parte 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) +- [Un contratto intelligente in 3 minuti e Delphi - Parte 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) +- [Un contratto intelligente in 3 minuti e Delphi - Parte 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) ## Articoli di livello intermedio {#intermediate-articles} -- [Generating an Ethereum-signed message signature in Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) -- [Transferring ether with Delphi](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) -- [Transferring ERC-20 tokens with Delphi](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) +- [Generare una firma di messaggio firmata da Ethereum in Delphi](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) +- [Trasferire ether con Delphi](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) +- [Trasferire token ERC-20 con Delphi](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) -## Modelli d'uso avanzati {#advanced-use-patterns} +## Modelli di utilizzo avanzati {#advanced-use-patterns} -- [Delphi and Ethereum Name Service (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7) -- [QuikNode, Ethereum and Delphi](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23) -- [Delphi e la Dark Forest di Ethereum](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) -- [Scambia un token per un altro su Delphi](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) +- [Delphi ed Ethereum Name Service (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7) +- [QuikNode, Ethereum e Delphi](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23) +- [Delphi e la Foresta Oscura di Ethereum](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) +- [Scambiare un token per un altro in Delphi](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) -Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers](/developers/). +Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers](/developers/). \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/it/developers/docs/programming-languages/dot-net/index.md index 5e6db2a11f0..545c7a68f1d 100644 --- a/public/content/translations/it/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/dot-net/index.md @@ -1,86 +1,86 @@ --- -title: Ethereum per sviluppatori .NET -description: Impara a sviluppare per Ethereum usando progetti e strumenti basati su .NET +title: Ethereum per gli sviluppatori .NET +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su .NET lang: it incomplete: true --- -Impara a sviluppare per Ethereum usando progetti e strumenti basati su .NET +Scopri come sviluppare per Ethereum usando progetti e strumenti basati su .NET -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -Crea applicazioni decentralizzate basate su Ethereum e interagisci con i contratti intelligenti utilizzando strumenti e linguaggi dallo stack della tecnologia di Microsoft: Supporto C#. # Visual Basic .NET, F#, con strumenti come VSCode e Visual Studio, su .NET Framework/.NET Core/.NET Standard. Distribuisci una blockchain Ethereum su Azure usando Microsoft Azure Blockchain in pochi minuti. Porta .NET su Ethereum! +Crea applicazioni decentralizzate su Ethereum e interagisci con i contratti intelligenti usando strumenti e linguaggi dello stack tecnologico Microsoft - Supportando C#, # Visual Basic .NET, F#, su strumenti come VSCode e Visual Studio, attraverso .NET Framework/.NET Core/.NET Standard. Distribuisci una blockchain di Ethereum su Azure usando Microsoft Azure Blockchain in pochi minuti. Porta l'amore per .NET su Ethereum! -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-the-solidity-language} -**Operazioni di base per integrare .NET con Ethereum** +**Fai i tuoi primi passi per integrare .NET con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Riferimenti e link per principianti {#beginner-references-and-links} -**Introduzione alla libreria Nethereum e VS Code Solidity** +**Introduzione alla libreria Nethereum e a VS Code Solidity** -- [Nethereum, Getting Started](https://docs.nethereum.com/en/latest/getting-started/) -- [Installing VS Code Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) -- [Il Flusso di Lavoro di uno Sviluppatore .NET per Creare e Chiamare i Contratti Intelligenti di Ethereum](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) +- [Nethereum, per iniziare](https://docs.nethereum.com/en/latest/getting-started/) +- [Installazione di VS Code Solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) +- [Il flusso di lavoro di uno sviluppatore .NET per creare e chiamare contratti intelligenti di Ethereum](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) - [Integrazione dei contratti intelligenti con Nethereum](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) -- [Interfacciare .NET e i Contratti Intelligenti della Blockchain di Ethereum con Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), anche in [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) -- [Nethereum - An open source .NET integration library for blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) -- [Writing Ethereum Transactions to SQL Database Using Nethereum](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) +- [Interfacciare .NET e i contratti intelligenti della blockchain di Ethereum con Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), anche in [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) +- [Nethereum - Una libreria di integrazione .NET open source per la blockchain](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) +- [Scrivere transazioni di Ethereum su database SQL usando Nethereum](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) - [Scopri come distribuire facilmente i contratti intelligenti di Ethereum usando C# e VisualStudio](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) -**Vuoi lasciar stare temporaneamente la configurazione e passare direttamente agli esempi?** +**Vuoi saltare la configurazione per ora e passare direttamente agli esempi?** -- [Playground](http://playground.nethereum.com/) - Interagire con Ethereum e imparare a utilizzare Nethereum con il browser. - - Interroga il saldo del conto [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) - - Interroga il Saldo di ERC20 del Contratto Intelligente [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) - - Trasferisci Ether in un Conto [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) - - ... e molto altro! +- [Playground](http://playground.nethereum.com/) - Interagisci con Ethereum e impara a usare Nethereum tramite il browser. + - Interroga il saldo dell'account [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) + - Interroga il saldo del contratto intelligente ERC20 [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) + - Trasferisci ether a un account [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) + - ... E molto altro! ## Articoli di livello intermedio {#intermediate-articles} -- [Nethereum Workbook/Sample List](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) -- [Deploy Your Own Development Testchains](https://github.com/Nethereum/Testchains) -- [VSCode Codegen Plugin for Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) -- [Unity and Ethereum: Why and How](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) -- [Create ASP.NET Core Web API for Ethereum dapps](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) -- [Using Nethereum Web3 to Implement a Supply Chain Tracking System](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) -- [Nethereum Block Processing](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), with [C# Playground sample](http://playground.nethereum.com/csharp/id/1025) -- [Nethereum Websocket Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) -- [Kaleido and Nethereum](https://kaleido.io/kaleido-and-nethereum/) -- [Quorum and Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) +- [Cartella di lavoro/Elenco di esempi di Nethereum](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) +- [Distribuisci le tue catene di test di sviluppo](https://github.com/Nethereum/Testchains) +- [Plugin Codegen di VSCode per Solidity](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) +- [Unity ed Ethereum: perché e come](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) +- [Creare un'API Web ASP.NET Core per le dApp di Ethereum](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) +- [Usare Nethereum Web3 per implementare un sistema di tracciamento della catena di approvvigionamento](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) +- [Elaborazione dei blocchi di Nethereum](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), con [esempio in C# su Playground](http://playground.nethereum.com/csharp/id/1025) +- [Streaming Websocket di Nethereum](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) +- [Kaleido e Nethereum](https://kaleido.io/kaleido-and-nethereum/) +- [Quorum e Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) -## Modelli d'uso avanzati {#advanced-use-patterns} +## Modelli di utilizzo avanzati {#advanced-use-patterns} -- [Azure Key Vault And Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) +- [Azure Key Vault e Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) - [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid) -- [Ujo Nethereum backend reference architecture](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) +- [Architettura di riferimento del backend Ujo Nethereum](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) -## Progetti .NET, strumenti e altre risorse interessanti {#dot-net-projects-tools-and-other-fun-stuff} +## Progetti .NET, strumenti e altre cose divertenti {#dot-net-projects-tools-and-other-fun-stuff} -- [Playground Nethereum](http://playground.nethereum.com/) - _Compila, crea ed esegui frammenti di codice Nethereum nel browser_ -- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Codegen Nethereum con interfaccia utente in Blazor_ -- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _Navigatore della blockchain leggero e semplice portafoglio in .NET Wasm SPA_ -- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _Motore di regole aziendali (per la piattaforma .NET e per quella di Ethereum) intrinsecamente guidato da metadati_ -- [Nethermind](https://github.com/NethermindEth/nethermind): _Un client di Ethereum di .NET Core per Linux, Windows, MacOS_ -- [eth-utils](https://github.com/ethereum/eth-utils/) - _Funzioni di utilità per lavorare con basi di codice relative a Ethereum_ -- [TestChains](https://github.com/Nethereum/TestChains) - _Catene di sviluppo .NET preconfigurate per risposte veloci (PoA)_ +- [Nethereum Playground](http://playground.nethereum.com/) - _Compila, crea ed esegui frammenti di codice Nethereum nel browser_ +- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Codegen di Nethereum con interfaccia utente in Blazor_ +- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _Un esploratore di blockchain leggero e portafoglio semplice SPA Wasm .NET_ +- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _Un motore di regole aziendali (sia per la piattaforma .NET che per la piattaforma Ethereum) intrinsecamente guidato dai metadati_ +- [Nethermind](https://github.com/NethermindEth/nethermind) - _Un client di Ethereum in .NET Core per Linux, Windows, MacOS_ +- [eth-utils](https://github.com/ethereum/eth-utils/) - _funzioni di utilità per lavorare con basi di codice relative a Ethereum_ +- [TestChains](https://github.com/Nethereum/TestChains) - _Catene di sviluppo .NET preconfigurate per una risposta rapida (PoA)_ Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers](/developers/). ## Collaboratori della community .NET {#dot-net-community-contributors} -Per Nethereum, scambiamo opinioni per lo più su [Gitter](https://gitter.im/Nethereum/Nethereum), dove tutti possono chiedere o rispondere a domande, cercare aiuto o semplicemente consultare informazioni. Sentiti libero di effettuare una PR o di aprire una segnalazione sul [repository di GitHub di Nethereum](https://github.com/Nethereum) o, semplicemente, di sfogliare i molti progetti secondari/di esempio disponibili. Ci trovi anche su [Discord](https://discord.gg/jQPrR58FxX)! +In Nethereum, ci ritroviamo principalmente su [Gitter](https://gitter.im/Nethereum/Nethereum) dove tutti sono i benvenuti per fare/rispondere a domande, ricevere aiuto o semplicemente rilassarsi. Sentiti libero di fare una PR o aprire un problema sul [repository GitHub di Nethereum](https://github.com/Nethereum), o semplicemente sfogliare i numerosi progetti secondari/di esempio che abbiamo. Puoi trovarci anche su [Discord](https://discord.gg/jQPrR58FxX)! -Se sei nuovo su Nethermind e necessiti d'aiuto per iniziare, unisciti al nostro [Discord](http://discord.gg/PaCMRFdvWT). I nostri sviluppatori sono a disposizione per rispondere alle tue domande. Non esitare ad aprire una PR o a sollevare qualsiasi dubbio sulla [repository di GitHub di Nethermind](https://github.com/NethermindEth/nethermind). +Se sei nuovo su Nethermind e hai bisogno di aiuto per iniziare, unisciti al nostro [Discord](http://discord.gg/PaCMRFdvWT). I nostri sviluppatori sono a disposizione per rispondere alle tue domande. Non esitare ad aprire una PR o a segnalare eventuali problemi sul [repository GitHub di Nethermind](https://github.com/NethermindEth/nethermind). ## Altri elenchi aggregati {#other-aggregated-lists} -[Official Nethereum Site](https://nethereum.com/) -[Official Nethermind Site](https://nethermind.io/) +[Sito ufficiale di Nethereum](https://nethereum.com/) +[Sito ufficiale di Nethermind](https://nethermind.io/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/elixir/index.md b/public/content/translations/it/developers/docs/programming-languages/elixir/index.md index cac80dd116e..a5c756bb5e6 100644 --- a/public/content/translations/it/developers/docs/programming-languages/elixir/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/elixir/index.md @@ -1,55 +1,55 @@ --- title: Ethereum per gli sviluppatori Elixir -description: Scopri come sviluppare per Ethereum utilizzando progetti e strumenti basati su Elixir. +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Elixir. lang: it incomplete: false --- -Scopri come sviluppare per Ethereum utilizzando progetti e strumenti basati su Elixir. +Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Elixir. -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp possono essere senza fiducia, a significare che una volta distribuite su Ethereum, saranno sempre eseguite come programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere "trustless" (senza bisogno di fiducia), il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali per creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. ## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} **Fai i tuoi primi passi per integrare Elixir con Ethereum** -Hai prima bisogno di nozioni di base? Consulta [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain spiegate](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [Impara a compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## Articoli per principianti {#beginner-articles} -- [Comprendere finalmente i conti di Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) -- [Ethers: Una libreria Web3 di Ethereum di prima classe per Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) +- [Comprendere finalmente gli account di Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Ethers — Una libreria Web3 di Ethereum di prim'ordine per Elixir](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) -## Articoli intermedi {#intermediate-articles} +## Articoli di livello intermedio {#intermediate-articles} -- [Come firmare le transazioni grezze del contratto di Ethereum con Elixir](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) -- [I contratti intelligenti di Ethereum ed Elixir](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4) +- [Come firmare transazioni grezze di contratti Ethereum con Elixir](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) +- [Contratti intelligenti di Ethereum ed Elixir](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4) -## Progetti e strumenti di Elixir {#elixir-projects-and-tools} +## Progetti e strumenti Elixir {#elixir-projects-and-tools} ### Attivi {#active} -- [block_keys](https://github.com/ExWeb3/block_keys): _Implentazione di BIP32 e BIP44 in Elixir (Gerarchia di più conti per i portafogli deterministici)_ -- [ethereumex](https://github.com/mana-ethereum/ethereumex): _Client JSON-RPC di Elixir per la blockchain di Ethereum_ -- [ethers](https://github.com/ExWeb3/elixir_ethers): _Una libreria Web3 completa per interagire con i contratti intelligenti su Ethereum utilizzando Elixir_ -- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms): _Una libreria del firmatario di KMS per Ethers (firma le transazioni con KMS di AWS)_ -- [ex_abi](https://github.com/poanetwork/ex_abi): _Implementazione dell'analizzatore/decodificatore/codificatore dell'ABI di Ethereum in Elixir_ -- [ex_keccak](https://github.com/ExWeb3/ex_keccak): _Libreria di Elixir per calcolare gli hash Keccak SHA3-256 utilizzando una minuscola crate di Rust Keccac, creata da NIF_ -- [ex_rlp](https://github.com/mana-ethereum/ex_rlp): _Implementazione di Elixir della codifica RLP (prefisso a lunghezza ricorsiva) di Ethereum_ +- [block_keys](https://github.com/ExWeb3/block_keys) - _Implementazione di BIP32 e BIP44 in Elixir (Gerarchia multi-account per portafogli deterministici)_ +- [ethereumex](https://github.com/mana-ethereum/ethereumex) - _Client JSON-RPC in Elixir per la blockchain di Ethereum_ +- [ethers](https://github.com/ExWeb3/elixir_ethers) - _Una libreria Web3 completa per interagire con i contratti intelligenti su Ethereum usando Elixir_ +- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) - _Una libreria di firma KMS per Ethers (firma le transazioni con AWS KMS)_ +- [ex_abi](https://github.com/poanetwork/ex_abi) - _Implementazione di parser/decodificatore/codificatore ABI di Ethereum in Elixir_ +- [ex_keccak](https://github.com/ExWeb3/ex_keccak) - _Libreria Elixir per calcolare gli hash Keccak SHA3-256 usando un crate Rust tiny-keccak integrato con NIF_ +- [ex_rlp](https://github.com/mana-ethereum/ex_rlp) - _Implementazione in Elixir della codifica RLP (Recursive Length Prefix) di Ethereum_ ### Archiviati / Non più mantenuti {#archived--no-longer-maintained} -- [eth](https://hex.pm/packages/eth): _Utilità di Ethereum per Elixir_ -- [exw3](https://github.com/hswick/exw3): _Client RPC di Ethereum di alto livello per Elixir_ -- [mana](https://github.com/mana-ethereum/mana): _Implementazione del nodo completo di Ethereum scritta in Elixir_ +- [eth](https://hex.pm/packages/eth) - _Utilità di Ethereum per Elixir_ +- [exw3](https://github.com/hswick/exw3) - _Client RPC di Ethereum di alto livello per Elixir_ +- [mana](https://github.com/mana-ethereum/mana) - _Implementazione di un nodo completo di Ethereum scritta in Elixir_ -Cerchi altre risorse? Consulta la nostra [home degli Sviluppatori](/developers/). +Cerchi altre risorse? Dai un'occhiata alla [nostra pagina per sviluppatori](/developers/). ## Collaboratori della community di Elixir {#elixir-community-contributors} -Il [canale di Slack #ethereum di Elixir](https://elixir-lang.slack.com/archives/C5RPZ3RJL) ospita una community in rapida crescita ed è la risorsa dedicata per le discussioni su qualsiasi dei suddetti progetti e argomenti correlati. +Il [canale #ethereum sullo Slack di Elixir](https://elixir-lang.slack.com/archives/C5RPZ3RJL) ospita una community in rapida crescita ed è la risorsa dedicata per le discussioni su qualsiasi dei progetti sopra citati e argomenti correlati. \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/golang/index.md b/public/content/translations/it/developers/docs/programming-languages/golang/index.md index 87694a4fc17..c3a5395ad6e 100644 --- a/public/content/translations/it/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/golang/index.md @@ -1,5 +1,5 @@ --- -title: Ethereum per sviluppatori Go +title: Ethereum per gli sviluppatori Go description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Go lang: it incomplete: true @@ -7,78 +7,78 @@ incomplete: true Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Go -Usa Ethereum per creare applicazioni decentralizzate (o "dapp"). Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Sono decentralizzate, significa che sono eseguite su una rete peer-to-peer e non esiste un punto di errore singolo. Nessun ente o persona le controlla e sono quasi impossibili da censurare. Possono controllare risorse digitali in modo da creare nuovi tipi di applicazioni. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp"). Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Sono decentralizzate, il che significa che vengono eseguite su una rete peer-to-peer e non c'è un singolo punto di guasto. Nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni. -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} -**Operazioni di base per integrare Go con Ethereum** +**Fai i tuoi primi passi per integrare Go con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -- [Contract Tutorial](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Impara a compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Tutorial sui contratti](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) ## Articoli e libri per principianti {#beginner-articles-and-books} -- [Getting Started with Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) -- [Use Golang to Connect to Ethereum](https://www.youtube.com/watch?v=-7uChuO_VzM) -- [Distribuisci i Contratti Intelligenti di Ethereum Usando Golang](https://www.youtube.com/watch?v=pytGqQmDslE) -- [Una Guida Passo dopo Passo per Testare e Distribuire i Contratti Intelligenti di Ethereum in Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) -- [eBook: Ethereum Development with Go](https://goethereumbook.org/) - _Sviluppare applicazioni Ethereum con Go_ +- [Iniziare con Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) +- [Usare Golang per connettersi a Ethereum](https://www.youtube.com/watch?v=-7uChuO_VzM) +- [Distribuire contratti intelligenti di Ethereum usando Golang](https://www.youtube.com/watch?v=pytGqQmDslE) +- [Una guida passo passo per testare e distribuire contratti intelligenti di Ethereum in Go](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) +- [eBook: Sviluppo su Ethereum con Go](https://goethereumbook.org/) - _Sviluppa applicazioni Ethereum con Go_ ## Articoli e documentazione di livello intermedio {#intermediate-articles-and-docs} -- [Go Ethereum Documentation](https://geth.ethereum.org/docs/) - _La documentazione per il Golang ufficiale di Ethereum_ -- [Guida per Programmatori a Erigon](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Guida illustrata con l'albero di stato, prove multiple ed elaborazione delle transazioni_ -- [Erigon ed Ethereum senza Stato](https://youtu.be/3-Mn7OckSus?t=394) - _Conferenza della Community di Ethereum 2020 (EthCC 3)_ -- [Erigon: ottimizzare i client di Ethereum](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _2018 Devcon 4_ -- [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum) -- [Creare una dapp in Go con Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) -- [Work with Ethereum Private Network with Golang and Geth](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) -- [Unit testing Solidity contracts on Ethereum with Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) -- [Quick reference for using Geth as a library](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) - -## Modelli d'uso avanzati {#advanced-use-patterns} - -- [The GETH Simulated Backend](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) -- [Blockchain-as-a-Service Apps Using Ethereum and Quorum](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) -- [Distributed Storage IPFS and Swarm in Ethereum Blockchain Applications](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) -- [Mobile Clients: Libraries and Inproc Ethereum Nodes](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) -- [Dapp native: Collegamenti di Go ai contratti di Ethereum](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) - -## Progetti e strumenti di Go {#go-projects-and-tools} - -- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Implementazione ufficiale di Go del protocollo di Ethereum_ -- [Go Ethereum Code Analysis](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Controllo e analisi del codice sorgente di Go Ethereum_ -- [Erigon](https://github.com/ledgerwatch/erigon) - _Derivato più veloce di Go Ethereum, incentrato sull'archiviazione dei nodi_ +- [Documentazione di Go Ethereum](https://geth.ethereum.org/docs) - _La documentazione per il Golang ufficiale di Ethereum_ +- [Guida del programmatore di Erigon](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Guida illustrata che include l'albero dello stato, le multi-prove e l'elaborazione delle transazioni_ +- [Erigon ed Ethereum senza stato](https://youtu.be/3-Mn7OckSus?t=394) - _Conferenza della community di Ethereum 2020 (EthCC 3)_ +- [Erigon: ottimizzare i client di Ethereum](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _Devcon 4 del 2018_ +- [GoDoc di Go Ethereum](https://godoc.org/github.com/ethereum/go-ethereum) +- [Creare una dApp in Go con Geth](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) +- [Lavorare con una rete privata di Ethereum con Golang e Geth](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) +- [Test unitari dei contratti Solidity su Ethereum con Go](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) +- [Riferimento rapido per l'uso di Geth come libreria](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) + +## Modelli di utilizzo avanzati {#advanced-use-patterns} + +- [Il backend simulato di GETH](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) +- [App Blockchain-as-a-Service usando Ethereum e Quorum](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) +- [Archiviazione distribuita IPFS e Swarm nelle applicazioni blockchain di Ethereum](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) +- [Client mobili: librerie e nodi Ethereum Inproc](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) +- [dApp native: binding Go per i contratti di Ethereum](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) + +## Progetti e strumenti Go {#go-projects-and-tools} + +- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Implementazione ufficiale in Go del protocollo Ethereum_ +- [Analisi del codice di Go Ethereum](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Revisione e analisi del codice sorgente di Go Ethereum_ +- [Erigon](https://github.com/ledgerwatch/erigon) - _Derivato più veloce di Go Ethereum, con un focus sui nodi di archivio_ - [Golem](https://github.com/golemfactory/golem) - _Golem sta creando un mercato globale per la potenza di calcolo_ -- [Quorum](https://github.com/jpmorganchase/quorum) - _Implementazione con permessi di Ethereum a supporto della privacy dei dati_ -- [Prysm](https://github.com/prysmaticlabs/prysm) - _Implementazione Go di 'Serenity' 2.0 per Ethereum_ -- [Eth Tweet](https://github.com/yep/eth-tweet) - _Twitter decentralizzato: un servizio di microblogging sulla blockchain di Ethereum_ -- [Plasma MVP Golang](https://github.com/kyokan/plasma) - _Implementazione di Golang ed estensione della specifica Minimum Viable Plasma_- -- [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _Pool di mining open source di Ethereum_ -- [Ethereum HD Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) - _Derivazioni del portafoglio HD di Ethereum in Go_ -- [Multi Geth](https://github.com/multi-geth/multi-geth) - _Supporto per molti tipi di reti Ethereum_ -- [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _Implementazione Geth del protocollo secondario Ethereum leggero_ -- [Ethereum Golang SDK](https://github.com/everFinance/goether) - _Una semplice implementazione del portafoglio e utilità in Golang_ -- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) - _Accesso efficiente ai dati della blockchain tramite la SDK di Go per oltre 200 blockchain_ +- [Quorum](https://github.com/jpmorganchase/quorum) - _Un'implementazione autorizzata di Ethereum che supporta la privacy dei dati_ +- [Prysm](https://github.com/prysmaticlabs/prysm) - _Implementazione in Go di Ethereum 'Serenity' 2.0_ +- [Eth Tweet](https://github.com/yep/eth-tweet) - _Twitter decentralizzato: un servizio di microblogging in esecuzione sulla blockchain di Ethereum_ +- [Plasma MVP Golang](https://github.com/kyokan/plasma) — _Implementazione in Golang ed estensione della specifica Minimum Viable Plasma_ +- [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _Una pool di mining di Ethereum open source_ +- [Portafoglio HD di Ethereum](https://github.com/miguelmota/go-ethereum-hdwallet) - _Derivazioni del portafoglio HD di Ethereum in Go_ +- [Multi Geth](https://github.com/multi-geth/multi-geth) - _Supporto per molte specie di reti Ethereum_ +- [Client leggero di Geth](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _Implementazione in Geth del sottocollo leggero di Ethereum_ +- [SDK Golang di Ethereum](https://github.com/everFinance/goether) - _Una semplice implementazione di portafoglio Ethereum e utilità in Golang_ +- [SDK Golang di Covalent](https://github.com/covalenthq/covalent-api-sdk-go) - _Accesso efficiente ai dati della blockchain tramite l'SDK Go per oltre 200 blockchain_ Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers](/developers/) -## Collaboratori della community di Go {#go-community-contributors} +## Collaboratori della community Go {#go-community-contributors} -- [Geth Discord](https://discordapp.com/invite/nthXNEv) -- [Geth Sgist](https://gitter.im/ethereum/go-ethereum) -- [Gophers Slack](https://invite.slack.golangbridge.org/) - [Canale #ethereum](https://gophers.slack.com/messages/C9HP1S9V2) +- [Discord di Geth](https://discordapp.com/invite/nthXNEv) +- [Gist di Geth](https://gitter.im/ethereum/go-ethereum) +- [Slack di Gophers](https://invite.slack.golangbridge.org/) - [canale #ethereum](https://gophers.slack.com/messages/C9HP1S9V2) - [StackExchange - Ethereum](https://ethereum.stackexchange.com/) -- [Multi Geth Gitter](https://gitter.im/ethoxy/multi-geth) -- [Ethereum Gitter](https://gitter.im/ethereum/home) -- [Geth light Client Gitter](https://gitter.im/ethereum/light-client) +- [Gitter di Multi Geth](https://gitter.im/ethoxy/multi-geth) +- [Gitter di Ethereum](https://gitter.im/ethereum/home) +- [Gitter del client leggero di Geth](https://gitter.im/ethereum/light-client) ## Altri elenchi aggregati {#other-aggregated-lists} - [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum) -- [Consensys: A Definitive List of Ethereum Developer Tools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [Fonte GitHub](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [Consensys: un elenco definitivo di strumenti per sviluppatori di Ethereum](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [Sorgente GitHub](https://github.com/ConsenSys/ethereum-developer-tools-list) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/index.md b/public/content/translations/it/developers/docs/programming-languages/index.md index 957682e4bb3..336afa647b1 100644 --- a/public/content/translations/it/developers/docs/programming-languages/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/index.md @@ -1,21 +1,22 @@ --- title: Linguaggi di programmazione -description: +description: Scopri le risorse di sviluppo di Ethereum per vari linguaggi di programmazione, tra cui JavaScript, Python, Go, Rust e altri. lang: it --- -Spesso, si crede erroneamente che gli sviluppatori debbano scrivere i [contratti intelligenti](/developers/docs/smart-contracts/) per poter sviluppare su Ethereum. Non è vero. Uno degli aspetti positivi della rete e della community Ethereum è che si può [partecipare](/community/) usando praticamente qualsiasi linguaggio di programmazione. +Un malinteso comune è che gli sviluppatori debbano scrivere [contratti intelligenti](/developers/docs/smart-contracts/) per poter sviluppare su Ethereum. Questo è falso. +Una delle bellezze della rete e della community di Ethereum è che puoi [partecipare](/community/) in quasi tutti i linguaggi di programmazione. -Ethereum e la sua community adottano l'open source. È possibile trovare progetti della community, cioè implementazioni di client, API, framework di sviluppo, strumenti di test, in un'ampia gamma di linguaggi. +Ethereum e la sua community abbracciano l'open source. Puoi trovare progetti della community - implementazioni di client, API, framework di sviluppo, strumenti di test - in un'ampia varietà di linguaggi. -## Scegli il linguaggio che preferisci {#data} +## Scegli il tuo linguaggio {#data} -Seleziona il linguaggio di programmazione che preferisci per trovare progetti, risorse e community virtuali: +Seleziona il tuo linguaggio di programmazione preferito per trovare progetti, risorse e community virtuali: - [Ethereum per sviluppatori Dart](/developers/docs/programming-languages/dart/) - [Ethereum per sviluppatori Delphi](/developers/docs/programming-languages/delphi/) - [Ethereum per sviluppatori .NET](/developers/docs/programming-languages/dot-net/) -- [Ethereum per gli sviluppatori Elixir](/developers/docs/programming-languages/elixir/) +- [Ethereum per sviluppatori Elixir](/developers/docs/programming-languages/elixir/) - [Ethereum per sviluppatori Go](/developers/docs/programming-languages/golang/) - [Ethereum per sviluppatori Java](/developers/docs/programming-languages/java/) - [Ethereum per sviluppatori JavaScript](/developers/docs/programming-languages/javascript/) @@ -23,8 +24,8 @@ Seleziona il linguaggio di programmazione che preferisci per trovare progetti, r - [Ethereum per sviluppatori Ruby](/developers/docs/programming-languages/ruby/) - [Ethereum per sviluppatori Rust](/developers/docs/programming-languages/rust/) -### Cosa succede se il mio linguaggio non è supportato {#other-lang} +### E se il mio linguaggio non fosse supportato? {#other-lang} -Se vuoi collegarti alle risorse o puntare a una community virtuale per un linguaggio di programmazione aggiuntivo, puoi richiedere una nuova pagina [aprendo una segnalazione](https://github.com/ethereum/ethereum-org-website/issues/new/choose). +Se desideri collegare risorse o indicare una community virtuale per un linguaggio di programmazione aggiuntivo, puoi richiedere una nuova pagina [aprendo una issue](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -Se vuoi solo scrivere il codice sull'interfaccia con la blockchain usando un linguaggio attualmente non supportato, puoi usare l'[interfaccia JSON-RPC](/developers/docs/apis/json-rpc/) per connetterti alla rete di Ethereum. Ogni linguaggio di programmazione che può usare TCP/IP può usare quest'interfaccia. +Se vuoi solo scrivere codice per interfacciarti con la blockchain usando un linguaggio attualmente non supportato, puoi usare l'[interfaccia JSON-RPC](/developers/docs/apis/json-rpc/) per connetterti alla rete di Ethereum. Qualsiasi linguaggio di programmazione in grado di usare TCP/IP può usare questa interfaccia. \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/java/index.md b/public/content/translations/it/developers/docs/programming-languages/java/index.md index c8e79bc762f..0f2518633f3 100644 --- a/public/content/translations/it/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/java/index.md @@ -1,5 +1,5 @@ --- -title: Ethereum per sviluppatori Java +title: Ethereum per gli sviluppatori Java description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Java lang: it incomplete: true @@ -7,57 +7,57 @@ incomplete: true Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Java -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} -**Operazioni di base per integrare Java con Ethereum** +**Fai i tuoi primi passi per integrare Java con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers.](/developers/) +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers.](/developers/) -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Lavorare con client Ethereum {#working-with-ethereum-clients} +## Lavorare con i client di Ethereum {#working-with-ethereum-clients} -Scopri come utilizzare [Web3J](https://github.com/web3j/web3j) e Hyperledger Besu, due dei principali client Java Ethereum +Scopri come usare [Web3J](https://github.com/web3j/web3j) e Hyperledger Besu, due dei principali client di Ethereum in Java -- [Connecting to an Ethereum client with Java, Eclipse, and Web3J](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) -- [Gestire un conto di Ethereum con Java e Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) -- [Genera un Java Wrapper dal tuo Contratto Intelligente](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) -- [Interagire con un Contratto Intelligente di Ethereum](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) -- [Ascoltare per Eventi del Contratto Intelligente di Ethereum](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) -- [Using Besu (Pantheon), the Java Ethereum Client with Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) -- [Running a Hyperledger Besu (Pantheon) Node in Java Integration Tests](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) -- [Web3j Cheat Sheet](https://kauri.io/web3j-cheat-sheet-(java-ethereum)/5dfa1ea941ac3d0001ce1d90/c) +- [Connettersi a un client di Ethereum con Java, Eclipse e Web3J](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) +- [Gestire un account di Ethereum con Java e Web3j](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) +- [Generare un Wrapper Java dal tuo contratto intelligente](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) +- [Interagire con un contratto intelligente di Ethereum](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) +- [Ascoltare gli eventi del contratto intelligente di Ethereum](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) +- [Usare Besu (Pantheon), il client di Ethereum in Java con Linux](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) +- [Eseguire un nodo Hyperledger Besu (Pantheon) nei test di integrazione Java](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) +- [Cheat Sheet di Web3j]() -Scopri come utilizzare [ethers-kt](https://github.com/Kr1ptal/ethers-kt), una libreria Kotlin asincrona e ad alte prestazioni per interagire con le blockchain basate sull'EVM. Si occupando delle piattaforme JVM e Android. -- [Transfer ERC20 tokens](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) -- [UniswapV2 swap with event listening](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) -- [ETH / ERC20 balance tracker](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) +Scopri come usare [ethers-kt](https://github.com/Kr1ptal/ethers-kt), una libreria Kotlin asincrona e ad alte prestazioni per interagire con le blockchain basate su EVM. Destinata alle piattaforme JVM e Android. +- [Trasferire token ERC20](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) +- [Scambio su UniswapV2 con ascolto degli eventi](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) +- [Tracciatore di saldo ETH / ERC20](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) -## Articoli di livello intermedio {#intermediate-articles} +## Articoli intermedi {#intermediate-articles} -- [Managing storage in a Java application with IPFS](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) -- [Manage ERC20 tokens in Java with Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) -- [Web3j Transaction Managers](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) +- [Gestire l'archiviazione in un'applicazione Java con IPFS](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) +- [Gestire i token ERC20 in Java con Web3j](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) +- [Gestori delle transazioni di Web3j](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) -## Modelli d'uso avanzati {#advanced-use-patterns} +## Modelli di utilizzo avanzati {#advanced-use-patterns} -- [Usare Eventum per costruire la cache dei dati di un contratto intelligente in Java](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) +- [Usare Eventeum per creare una cache di dati del contratto intelligente in Java](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) -## Progetti e strumenti di Java {#java-projects-and-tools} +## Progetti e strumenti Java {#java-projects-and-tools} -- [Web3J (Library for Interacting with Ethereum Clients)](https://github.com/web3j/web3j) -- [ethers-kt (Async, high-performance Kotlin/Java/Android library for EVM-based blockchains.)](https://github.com/Kr1ptal/ethers-kt) -- [Eventeum (Event Listener)](https://github.com/ConsenSys/eventeum) -- [Mahuta (IPFS Dev Tools)](https://github.com/ConsenSys/mahuta) +- [Web3J (Libreria per interagire con i client di Ethereum)](https://github.com/web3j/web3j) +- [ethers-kt (Libreria Kotlin/Java/Android asincrona e ad alte prestazioni per blockchain basate su EVM.)](https://github.com/Kr1ptal/ethers-kt) +- [Eventeum (Ascoltatore di eventi)](https://github.com/ConsenSys/eventeum) +- [Mahuta (Strumenti di sviluppo IPFS)](https://github.com/ConsenSys/mahuta) Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers.](/developers/) -## Collaboratori della community di Java {#java-community-contributors} +## Collaboratori della community Java {#java-community-contributors} - [IO Builders](https://io.builders) -- [Kauri](https://kauri.io) +- [Kauri](https://kauri.io) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/javascript/index.md b/public/content/translations/it/developers/docs/programming-languages/javascript/index.md index 81a821658c4..4d8b00b1110 100644 --- a/public/content/translations/it/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/javascript/index.md @@ -1,73 +1,72 @@ --- -title: Ethereum per sviluppatori JavaScript -description: Impara a sviluppare per Ethereum usando progetti e strumenti basati su JavaScript. +title: Ethereum per gli sviluppatori JavaScript +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su JavaScript. lang: it --- -JavaScript è tra i linguaggi più popolari nell'ecosistema Ethereum. C'è persino un [team](https://github.com/ethereumjs) che si occupa di trasferire Ethereum il più possibile in JavaScript. +JavaScript è tra i linguaggi più popolari nell'ecosistema di Ethereum. Infatti, c'è un [team](https://github.com/ethereumjs) dedicato a portare quanto più possibile di Ethereum su JavaScript. -Esistono opportunità per scrivere in JavaScript (o simile) a [tutti i livelli dello stack](/developers/docs/ethereum-stack/). +Ci sono opportunità per scrivere in JavaScript (o qualcosa di simile) a [tutti i livelli dello stack](/developers/docs/ethereum-stack/). ## Interagire con Ethereum {#interact-with-ethereum} -### Librerie API JavaScript {#javascript-api-libraries} +### Librerie di API JavaScript {#javascript-api-libraries} -Se vuoi scrivere in JavaScript per interrogare la blockchain, inviare transazioni e altro ancora, il modo più comodo per farlo è utilizzare una [libreria API JavaScript](/developers/docs/apis/javascript/). Queste API consentono agli sviluppatori di interagire facilmente con i [nodi della rete Ethereum](/developers/docs/nodes-and-clients/). +Se desideri scrivere in JavaScript per interrogare la blockchain, inviare transazioni e altro ancora, il modo più conveniente per farlo è usare una [libreria di API JavaScript](/developers/docs/apis/javascript/). Queste API consentono agli sviluppatori di interagire facilmente con i [nodi nella rete di Ethereum](/developers/docs/nodes-and-clients/). -Puoi utilizzare queste librerie per interagire con i contratti intelligenti su Ethereum, quindi è possibile creare una dapp in cui, semplicemente, utilizzi JavaScript per interagire con i contratti pre-esistenti. +Puoi usare queste librerie per interagire con i contratti intelligenti su Ethereum, in modo che sia possibile creare una dApp in cui usi semplicemente JavaScript per interagire con contratti preesistenti. -**Dai un'occhiata a:** +**Dai un'occhiata a** -- [Web3.js](https://web3js.readthedocs.io/) -- [Ethers.js](https://docs.ethers.io/) _– Contiene l'implementazione del portafoglio di Ethereum e le utility in JavaScript e TypeScript._ -- [viem](https://viem.sh): un'interfaccia TypeScript per Ethereum che fornisce primitivi con assenza di stato di basso livello per interagire con Ethereum. +- [Web3.js](https://web3js.readthedocs.io) +- [Ethers.js](https://ethers.org) – _include l'implementazione di un portafoglio Ethereum e utilità in JavaScript e TypeScript._ +- [viem](https://viem.sh) – _un'interfaccia TypeScript per Ethereum che fornisce primitive senza stato di basso livello per interagire con Ethereum._ +- [Drift](https://ryangoree.github.io/drift/) – _una meta-libreria TypeScript con caching integrato, hook e mock di test per uno sviluppo su Ethereum senza sforzo attraverso le librerie web3._ ### Contratti intelligenti {#smart-contracts} -Se sei uno sviluppatore JavaScript e vorresti scrivere il tuo contratto intelligente, consigliamo di familiarizzare con [Solidity](https://solidity.readthedocs.io). Questo è il linguaggio di contratti intelligenti più popolare ed è sintatticamente simile a JavaScript, che lo rende più facile da imparare. +Se sei uno sviluppatore JavaScript e vuoi scrivere il tuo contratto intelligente, potresti voler familiarizzare con [Solidity](https://solidity.readthedocs.io). Questo è il linguaggio per contratti intelligenti più popolare ed è sintatticamente simile a JavaScript, il che potrebbe renderlo più facile da imparare. -Di più sui [contratti intelligenti](/developers/docs/smart-contracts/). +Maggiori informazioni sui [contratti intelligenti](/developers/docs/smart-contracts/). ## Comprendere il protocollo {#understand-the-protocol} -### La macchina virtuale Ethereum {#the-ethereum-virtual-machine} +### La macchina virtuale di Ethereum {#the-ethereum-virtual-machine} -Esiste un'implementazione JavaScript della [macchina virtuale di Ethereum](/developers/docs/evm/), che supporta le regole più recenti relative alle diramazioni della rete. Le regole relative alle diramazioni si riferiscono alle modifiche apportate alla macchina virtuale di Ethereum (EVM) a seguito di upgrade pianificati. +Esiste un'implementazione in JavaScript della [macchina virtuale di Ethereum](/developers/docs/evm/). Supporta le ultime regole di biforcazione. Le regole di biforcazione si riferiscono alle modifiche apportate all'EVM a seguito di aggiornamenti pianificati. -È suddivisa in vari pacchetti JavaScript che puoi leggere per comprendere meglio: +È suddivisa in vari pacchetti JavaScript che puoi consultare per comprendere meglio: -- Conti +- Account - Blocchi - La blockchain stessa - Transazioni -- E molto altro... +- E altro ancora... -Ciò ti aiuterà a comprendere cose come "cos'è la struttura dei dati di un conto?". +Questo ti aiuterà a capire cose come "qual è la struttura dei dati di un account?". -Se preferisci invece leggere codice, questo codice JavaScript può essere un'alternativa interessante alla lettura della nostra documentazione. +Se preferisci leggere il codice, questo JavaScript potrebbe essere un'ottima alternativa alla lettura della nostra documentazione. -**Guarda il monorepo** -[`ethereumjs`](https://github.com/ethereumjs/ethereumjs-vm) +**Dai un'occhiata all'EVM** +[`@ethereumjs/evm`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm) ### Nodi e client {#nodes-and-clients} -Un client di Ethereumjs è in sviluppo attivo e ti consentirà di approfondire il funzionamento dei client di Ethereum in un linguaggio che comprendi: JavaScript! +Un client Ethereumjs è in fase di sviluppo attivo e ti consente di approfondire il funzionamento dei client di Ethereum in un linguaggio che comprendi: JavaScript! -Era ospitato in una [`repository`](https://github.com/ethereumjs/ethereumjs-client) indipendente, tuttavia, è stato in seguito unito nella repository singola di EthereumVM come pacchetto. - -**Guarda il client** -[`ethereumjs-client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) +**Dai un'occhiata al client** +[`@ethereumjs/client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) ## Altri progetti {#other-projects} -Ci sono molte altre novità nel mondo di JavaScript per Ethereum, tra cui: +Ci sono anche molte altre cose in corso nel mondo di Ethereum JavaScript, tra cui: -- librerie di utilità per i portafogli. -- strumenti per generare, importare ed esportare chiavi Ethereum. -- un'implementazione di `merkle-patricia-tree`, una struttura di dati delineata nel yellow paper di Ethereum. +- librerie di utilità per portafogli. +- strumenti per generare, importare ed esportare chiavi di Ethereum. +- un'implementazione del `merkle-patricia-tree` – una struttura dati delineata nello yellow paper di Ethereum. -Approfondisci ciò che ti interessa maggiormente sulla [repository EthereumJS](https://github.com/ethereumjs) +Approfondisci ciò che ti interessa di più nella [repository di EthereumJS](https://github.com/ethereumjs) ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/python/index.md b/public/content/translations/it/developers/docs/programming-languages/python/index.md index 9fbcda44cbc..25d8b92451c 100644 --- a/public/content/translations/it/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/python/index.md @@ -1,90 +1,99 @@ --- -title: Ethereum per sviluppatori Python -description: Impara a sviluppare per Ethereum usando progetti e strumenti basati su Python +title: Ethereum per gli sviluppatori Python +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Python lang: it incomplete: true --- -Impara a sviluppare per Ehereum, utilizzando progetti e strumenti basati su Python +Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Python -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} -**Operazioni di base per integrare Python con Ethereum** +**Fai i tuoi primi passi per integrare Python con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione più basilare? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Rapporto sullo stato di Python nella blockchain nel 2023](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) -## Articoli per chi inizia ora {#beginner-articles} +## Articoli per principianti {#beginner-articles} -- [Guida di uno sviluppatore (Python) a Ethereum](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) -- [Report 2023 sullo stato di Python in blockchain](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) -- [Introduzione agli Smart Contract con Vyper (in inglese)](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) -- [Distribuisci il tuo Token ERC20 con Python e Brownie](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) -- [Come sviluppare un contratto Ethereum usando Python Flask (in inglese)](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) -- [Introduzione a Web3.py · Ethereum per sviluppatori Python (in inglese)](https://www.dappuniversity.com/articles/web3-py-intro) -- [Come chiamare la funzione di uno Smart Contract usando Python e web3.py (in inglese)](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) +- [Panoramica di web3.py](https://web3py.readthedocs.io/en/latest/overview.html) +- [Tour dell'ecosistema Python di Ethereum](https://snakecharmers.ethereum.org/python-ecosystem/) +- [Guida a Ethereum per sviluppatori (Python)](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) +- [Prize-Worthy: una guida agli hackathon Python di Ethereum](https://snakecharmers.ethereum.org/prize-worthy/) +- [Un'introduzione ai contratti intelligenti con Vyper](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) +- [Come sviluppare un contratto Ethereum usando Python Flask?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) +- [Introduzione a Web3.py · Ethereum per sviluppatori Python](https://www.dappuniversity.com/articles/web3-py-intro) +- [Come chiamare una funzione di un contratto intelligente usando Python e web3.py](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) ## Articoli di livello intermedio {#intermediate-articles} -- [Dapp Development for Python Programmers](https://www.youtube.com/watch?v=tE-8bG35VNw) -- [Creating a Python Ethereum Interface: Part 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) -- [Contratti Intelligenti di Ethereum su Python: una guida (quasi) completa](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) -- [Usare Brownie e Python per distribuire i Contratti Intelligenti](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) -- [Creare NFT su OpenSea con Brownie](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) +- [Amici di web3.py: introduzione ad Ape](https://snakecharmers.ethereum.org/intro-to-ape/) +- [Sviluppo di dApp per programmatori Python](https://www.youtube.com/watch?v=tE-8bG35VNw) +- [Creare un'interfaccia Ethereum in Python: Parte 1](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) +- [Contratti intelligenti di Ethereum in Python: una guida (quasi) completa](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) ## Modelli d'uso avanzati {#advanced-use-patterns} -- [Compilazione, distribuzione e chiamata del contratto intelligente di Ethereum usando Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) -- [Analizzare i Contratti Intelligenti in Solidity con Slither](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) -- [Blockchain Fintech Tutorial: Lending and Borrowing With Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) +- [Modelli di web3.py: iscrizioni agli eventi in tempo reale](https://snakecharmers.ethereum.org/subscriptions/) +- [Modelli di web3.py: WebSocketProvider](https://snakecharmers.ethereum.org/websocketprovider/) +- [Compilare, distribuire e chiamare un contratto intelligente di Ethereum usando Python](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) +- [Analizzare i contratti intelligenti in Solidity con Slither](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) +- [Tutorial Fintech sulla Blockchain: prestare e prendere in prestito con Python](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) + +## Articoli archiviati + +- [Distribuisci il tuo token ERC20 con Python e Brownie](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) +- [Usare Brownie e Python per distribuire contratti intelligenti](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) +- [Creare NFT su OpenSea con Brownie](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) -## Progetti e strumenti di Python {#python-projects-and-tools} +## Progetti e strumenti Python {#python-projects-and-tools} ### Attivi: {#active} - [Web3.py](https://github.com/ethereum/web3.py) - _Libreria Python per interagire con Ethereum_ -- [Vyper](https://github.com/ethereum/vyper/) - _Linguaggio dei Contratti Intelligenti di Python per l'EVM_ -- [Ape](https://github.com/ApeWorX/ape) - _Lo strumento di sviluppo di contratti intelligenti per utilizzatori di Python, Scienziati dei Dati e Professionisti della Sicurezza_ -- [py-evm](https://github.com/ethereum/py-evm) - _Implementazione della macchina virtuale Ethereum_ -- [eth-tester](https://github.com/ethereum/eth-tester) - _Strumenti per testare le applicazioni basate su Ethereum_ -- [eth-utils](https://github.com/ethereum/eth-utils/) - _Funzioni di utilità per lavorare con le basi di codice legate a Ethereum_ +- [Vyper](https://github.com/ethereum/vyper/) - _Linguaggio per contratti intelligenti in stile Python per la EVM_ +- [Ape](https://github.com/ApeWorX/ape) - _Lo strumento di sviluppo di contratti intelligenti per programmatori Python, scienziati dei dati e professionisti della sicurezza_ +- [py-evm](https://github.com/ethereum/py-evm) - _implementazione della macchina virtuale di Ethereum_ +- [eth-tester](https://github.com/ethereum/eth-tester) - _strumenti per testare applicazioni basate su Ethereum_ +- [eth-utils](https://github.com/ethereum/eth-utils/) - _funzioni di utilità per lavorare con basi di codice relative a Ethereum_ - [py-solc-x](https://pypi.org/project/py-solc-x/) - _Wrapper Python per il compilatore Solidity solc con supporto per 0.5.x_ - [pymaker](https://github.com/makerdao/pymaker) - _API Python per i contratti Maker_ -- [siwe](https://github.com/signinwithethereum/siwe-py) - _Accesso con Ethereum (siwe) per Python_ -- [DeFi di Web3 per le integrazioni di Ethereum](https://github.com/tradingstrategy-ai/web3-ethereum-defi) - _Un pacchetto di Python con integrazioni pronte per l'ERC-20, Uniswap e altri progetti popolari_ -- [Wake](https://getwake.io) - _Assetto completo di Python per testare i contratti, fuzzing, distribuzione, scansione delle vulnerabilità e navigazione del codice (server del linguaggio: [Tools for Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ +- [siwe](https://github.com/signinwithethereum/siwe-py) - _Accedi con Ethereum (siwe) per Python_ +- [Web3 DeFi per integrazioni Ethereum](https://github.com/tradingstrategy-ai/web3-ethereum-defi) - _Un pacchetto Python con integrazioni pronte per ERC-20, Uniswap e altri progetti popolari_ +- [Wake](https://getwake.io) - _Framework Python all-in-one per test dei contratti, fuzzing, distribuzione, scansione delle vulnerabilità e navigazione del codice (server di linguaggio - [Strumenti per Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ -### Archiviato / Non più mantenuto: {#archived--no-longer-maintained} +### Archiviati / Non più mantenuti: {#archived--no-longer-maintained} -- [Trinity](https://github.com/ethereum/trinity) - _Il client Python di Ethereum_ -- [Mamba](https://github.com/arjunaskykok/mamba) - _Framework per scrivere, compilare e distribuire contratti intelligenti scritti nel linguaggio Vyper_ -- [Brownie](https://github.com/eth-brownie/brownie) - _Framework di Python per distribuire, testare e interagire con i contratti intelligenti di Ethereum_ -- [pydevp2p](https://github.com/ethereum/pydevp2p) - _implementazione dello stack di Ethereum P2P_ -- [py-wasm](https://github.com/ethereum/py-wasm) - _Implementazione Python dell'interprete di web assembly_ +- [Trinity](https://github.com/ethereum/trinity) - _Client Python per Ethereum_ +- [Mamba](https://github.com/arjunaskykok/mamba) - _framework per scrivere, compilare e distribuire contratti intelligenti scritti nel linguaggio Vyper_ +- [Brownie](https://github.com/eth-brownie/brownie) - _Framework Python per distribuire, testare e interagire con i contratti intelligenti di Ethereum_ +- [pydevp2p](https://github.com/ethereum/pydevp2p) - _implementazione dello stack P2P di Ethereum_ +- [py-wasm](https://github.com/ethereum/py-wasm) - _Implementazione Python dell'interprete WebAssembly_ Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers](/developers/). -## Progetti che utilizzano gli strumenti Python {#projects-using-python-tooling} +## Progetti che usano strumenti Python {#projects-using-python-tooling} -I seguenti progetti basati su Ethereum usano strumenti menzionati su questa pagina. Le repository open source correlate fungono da riferimento utile per il codice d'esempio e le migliori pratiche. +I seguenti progetti basati su Ethereum usano gli strumenti menzionati in questa pagina. I relativi repository open-source fungono da buon riferimento per codice di esempio e migliori pratiche. -- [Yearn Finance](https://yearn.finance/) e [Repository di Yearn Vault Contracts](https://github.com/yearn/yearn-vaults) -- [Curve](https://curve.fi/) e la [repository dei contratti intelligenti di Curve](https://github.com/curvefi/curve-contract) +- [Yearn Finance](https://yearn.finance/) e il [repository dei contratti Yearn Vault](https://github.com/yearn/yearn-vaults) +- [Curve](https://www.curve.finance/) e il [repository dei contratti intelligenti di Curve](https://github.com/curvefi/curve-contract) - [BadgerDAO](https://badger.com/) e i [contratti intelligenti che usano la toolchain di Brownie](https://github.com/Badger-Finance/badger-system) -- [Sushi](https://sushi.com/) usa [Python nella gestione e distribuzione dei suoi vesting contract](https://github.com/sushiswap/sushi-vesting-protocols) -- [Alpha Venture DAO](https://alphaventuredao.io/), di Alpha Homora, usa [Brownie per testare e distribuire i contratti intelligenti](https://github.com/AlphaFinanceLab/alpha-staking-contract) +- [Sushi](https://sushi.com/) usa [Python per gestire e distribuire i propri contratti di maturazione (vesting)](https://github.com/sushiswap/sushi-vesting-protocols) +- [Alpha Finance](https://alphaventuredao.io/), famoso per Alpha Homora, usa [Brownie per testare e distribuire contratti intelligenti](https://github.com/AlphaFinanceLab/alpha-staking-contract) -## Discussione della Community di Python {#python-community-contributors} +## Discussioni della community Python {#python-community-contributors} -- [Discor dell'Ethereum Python Community](https://discord.gg/9zk7snTfWe) per Web3.py e altre discussioni del quadro di Python -- [Discord di Vyper](https://discord.gg/SdvKC79cJk) per la discussione sulla programmazione dei contratti intelligenti in Vyper +- [Discord della community Python di Ethereum](https://discord.gg/9zk7snTfWe) per discussioni su Web3.py e altri framework Python +- [Discord di Vyper](https://discord.gg/SdvKC79cJk) per discussioni sulla programmazione di contratti intelligenti in Vyper ## Altri elenchi aggregati {#other-aggregated-lists} -La wiki di Vyper contiene un [incredibile elenco di risorse per Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) \ No newline at end of file +La wiki di Vyper ha un'[incredibile lista di risorse per Vyper](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/ruby/index.md b/public/content/translations/it/developers/docs/programming-languages/ruby/index.md index 78b485b302f..bc688e2a44b 100644 --- a/public/content/translations/it/developers/docs/programming-languages/ruby/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/ruby/index.md @@ -1,60 +1,60 @@ --- title: Ethereum per gli sviluppatori Ruby -description: Impara a sviluppare per Ethereum usando progetti e strumenti basati su Ruby. +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Ruby. lang: it incomplete: false --- -Impara a sviluppare per Ethereum usando progetti e strumenti basati su Ruby. +Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Ruby. -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp possono essere senza fiducia, a significare che una volta distribuite su Ethereum, saranno sempre eseguite come programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, pertanto nessuna entità singola o individuo le controlla e sono quasi impossibili da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere trustless (senza bisogno di fiducia), il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmato. Possono controllare asset digitali per creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} -**Inizia a integrare Ruby con Ethereum** +**Muovi i primi passi per integrare Ruby con Ethereum** -Ti servono prima le nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Impara Come Compilare e Distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Articoli per chi inizia ora {#beginner-articles} +## Articoli per principianti {#beginner-articles} -- [Comprendere definitivamente i conti di Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) -- [Autenticare definitivamente gli utenti di Rails con Metamask](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) +- [Comprendere finalmente gli account di Ethereum](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Autenticare finalmente gli utenti Rails con MetaMask](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) - [Come connettersi alla rete di Ethereum usando Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) -- [Come generare un nuovo indirizzo di Ethereum in Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) +- [Come generare un nuovo indirizzo Ethereum in Ruby](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) ## Articoli di livello intermedio {#intermediate-articles} -- [App della Blockchain con Ruby](https://www.nopio.com/blog/blockchain-app-ruby/) -- [Usa Ruby, connesso a Ethereum, per eseguire il Contratto Intelligente](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) +- [App blockchain con Ruby](https://www.nopio.com/blog/blockchain-app-ruby/) +- [Usare Ruby, connesso a Ethereum, per eseguire il contratto intelligente](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) ## Progetti e strumenti Ruby {#ruby-projects-and-tools} ### Attivi {#active} -- [eth.rb](https://github.com/q9f/eth.rb): _Libreria di Ruby e client RPC per gestire conti, messaggi e transazioni di Ethereum_ -- [keccak.rb](https://github.com/q9f/keccak.rb) - _L'hash di The Keccak (SHA3) usato da Ethereum_ -- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) - _Implementazione in Ruby dell'Accesso con Ethereum_ -- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) - _Gemma di Rails che aggiunge la firma locale SIWE nei percorsi_ -- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) - _Esempio di SIWE usando Ruby on Rails con un controller personalizzato_ -- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) - _Strategia di OmniAuth per l’Accesso con Ethereum (SIWE)_ -- [omniauth-nft](https://github.com/valthon/omniauth-nft) - _Strategia di OmniAuth per autenticarsi tramite il possesso di NFT_ -- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) - _Modello di Ethereum on Rails che consente di connettere MetaMask a Ruby on Rails_ +- [eth.rb](https://github.com/q9f/eth.rb) - _Libreria Ruby e client RPC per gestire account, messaggi e transazioni di Ethereum_ +- [keccak.rb](https://github.com/q9f/keccak.rb) - _L'hash Keccak (SHA3) usato da Ethereum_ +- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) - _Implementazione Ruby di Sign-In with Ethereum_ +- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) - _Gemma Rails che aggiunge percorsi di accesso locale SIWE_ +- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) - _Esempio SIWE che usa Ruby on Rails con controller personalizzato_ +- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) - _Strategia OmniAuth per Sign In With Ethereum (SIWE)_ +- [omniauth-nft](https://github.com/valthon/omniauth-nft) - _Strategia OmniAuth per l'autenticazione tramite la proprietà di NFT_ +- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) - _Modello Ethereum on Rails che consente di connettere MetaMask a Ruby on Rails_ -### Archiviato / Non più mantenuto {#archived--no-longer-maintained} +### Archiviati / Non più mantenuti {#archived--no-longer-maintained} -- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) - _Metodi di chiamata RPC del nodo di Ethereum con Ruby_ -- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) - _Libreria di Ruby per generare indirizzi ETH da un portafoglio Deterministico Gerarchico secondo lo standard BIP32_ +- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) - _Chiamare metodi RPC del nodo Ethereum con Ruby_ +- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) - _Libreria Ruby per generare indirizzi ETH da un portafoglio deterministico gerarchico secondo lo standard BIP32_ - [etherlite](https://github.com/budacom/etherlite) - _Integrazione di Ethereum per Ruby on Rails_ -- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) - _Client di Ethereum in Ruby che usa l'interfaccia JSON-RPC per inviare transazioni, creare e interagire coi contratti, nonché utili toolkit per lavorare coi nodi di Ethereum_ +- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) - _Client Ethereum in Ruby che usa l'interfaccia JSON-RPC per inviare transazioni, creare e interagire con i contratti, oltre a un utile kit di strumenti per lavorare con il nodo Ethereum_ - [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) - _Implementa la strategia del provider Ethereum per OmniAuth_ -Cerchi altre risorse? Dai un'occhiata alla [nostra home dello Sviluppatore](/developers/). +Cerchi altre risorse? Dai un'occhiata alla [nostra pagina per sviluppatori](/developers/). ## Collaboratori della community Ruby {#ruby-community-contributors} -Il [Gruppo Ethereum Ruby Telegram](https://t.me/ruby_eth) ospita una community in rapida crescita ed è la risorsa dedicata alle discussioni su ognuno dei suddetti progetti e argomenti correlati. +Il [gruppo Telegram Ethereum Ruby](https://t.me/ruby_eth) ospita una community in rapida crescita ed è la risorsa dedicata per le discussioni su uno qualsiasi dei progetti sopra indicati e sugli argomenti correlati. \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/programming-languages/rust/index.md b/public/content/translations/it/developers/docs/programming-languages/rust/index.md index 15a16b6bfa9..f474db03556 100644 --- a/public/content/translations/it/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/rust/index.md @@ -1,57 +1,57 @@ --- -title: Ethereum per sviluppatori Rust -description: Impara a sviluppare per Ethereum usando progetti e strumenti basati su Rust +title: Ethereum per gli sviluppatori Rust +description: Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Rust lang: it incomplete: true --- -Impara a sviluppare per Ehereum, utilizzando progetti e strumenti basati su Rust +Scopri come sviluppare per Ethereum usando progetti e strumenti basati su Rust -Usa Ethereum per creare applicazioni decentralizzate (dette "dapp") che sfruttano i vantaggi delle criptovalute e della tecnologia blockchain. Queste dapp sono attendibili perché, una volta "caricate" su Ethereum, vengono eseguite sempre come sono state programmate. Possono controllare risorse digitali per creare nuove tipologie di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibile da censurare. +Usa Ethereum per creare applicazioni decentralizzate (o "dApp") che sfruttano i vantaggi della criptovaluta e della tecnologia blockchain. Queste dApp possono essere affidabili, il che significa che una volta distribuite su Ethereum, verranno sempre eseguite come programmate. Possono controllare risorse digitali al fine di creare nuovi tipi di applicazioni finanziarie. Possono essere decentralizzate, il che significa che nessuna singola entità o persona le controlla e sono quasi impossibili da censurare. -## Primi passi con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} +## Iniziare con i contratti intelligenti e il linguaggio Solidity {#getting-started-with-smart-contracts-and-solidity} -**Operazioni di base per integrare Rust con Ethereum** +**Fai i tuoi primi passi per integrare Rust con Ethereum** -Hai prima bisogno di nozioni di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). +Hai prima bisogno di un'introduzione di base? Dai un'occhiata a [ethereum.org/learn](/learn/) o [ethereum.org/developers](/developers/). -- [Blockchain Explained](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) -- [Comprendere i Contratti Intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Scrivi il tuo Primo Contratto Intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Learn How to Compile and Deploy Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Spiegazione della Blockchain](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Comprendere i contratti intelligenti](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Scrivi il tuo primo contratto intelligente](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Scopri come compilare e distribuire Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Articoli per chi inizia ora {#beginner-articles} +## Articoli per principianti {#beginner-articles} -- [The Rust Ethereum Client](https://openethereum.github.io/) \* **Notare che OpenEthereum [è ormai superato](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) e non viene più mantenuto.** Usalo con cautela e preferibilmente passa a un'altra implementazione client. -- [Sending Transaction to Ethereum Using Rust](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) -- [Tutorial passo-passo per scrivere contratti in rust Wasm per Kovan (in inglese)](https://github.com/paritytech/pwasm-tutorial) +- [Il client Ethereum in Rust](https://openethereum.github.io/) \* **Nota che OpenEthereum [è stato deprecato](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) e non è più mantenuto.** Usalo con cautela e preferibilmente passa a un'altra implementazione del client. +- [Inviare una transazione a Ethereum usando Rust](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) +- [Un tutorial passo-passo su come scrivere contratti in Rust Wasm per Kovan](https://github.com/paritytech/pwasm-tutorial) ## Articoli di livello intermedio {#intermediate-articles} ## Modelli d'uso avanzati {#advanced-use-patterns} -- [Libreria pwasm_ethereum esterna per interagire con reti di tipo Ethereum (in inglese)](https://github.com/openethereum/pwasm-ethereum) -- [Creare una chat decentralizzata usando JavaScript e Rust (in inglese)](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) -- [Creare un'app decentralizzata Todo usando Vue.js e Rust (in inglese)](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) +- [Libreria di extern pwasm_ethereum per interagire con una rete simile a Ethereum](https://github.com/openethereum/pwasm-ethereum) +- [Costruire una chat decentralizzata usando JavaScript e Rust](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) +- [Costruire un'app Todo decentralizzata usando Vue.js e Rust](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -- [Costruisci una blockchain in Rust](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) +- [Costruire una blockchain in Rust](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) -## Progetti e strumenti di Rust {#rust-projects-and-tools} +## Progetti e strumenti in Rust {#rust-projects-and-tools} -- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _Raccolta di esterni per interagire con reti simili a Ethereum_ -- [Lighthouse](https://github.com/sigp/lighthouse) - _Client veloce del livello di consenso di Ethereum_ -- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) - _Rivisitazione proposta del livello di esecuzione del contratto intelligente di Ethereum, utilizzando un sottoinsieme deterministico di WebAssembly_ -- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _Riferimento API di OASIS_ -- [Solaris](https://github.com/paritytech/sol-rs) - _Test unitario dei contratti intelligenti in Solidity che sfrutta l'utilizzo dell'EVM nativa del Client di Parity._ -- [SputnikVM](https://github.com/rust-blockchain/evm) - _Implementazione della Macchina Virtuale di Ethereum in Rust_ -- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Smart Contract Wavelet in Rust_ -- [Foundry](https://github.com/foundry-rs/foundry) - _Kit di strumenti per lo sviluppo di applicazioni Ethereum_ +- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _Collezione di extern per interagire con una rete simile a Ethereum_ +- [Lighthouse](https://github.com/sigp/lighthouse) - _Client veloce per il livello di consenso di Ethereum_ +- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) - _Proposta di riprogettazione del livello di esecuzione dei contratti intelligenti di Ethereum usando un sottoinsieme deterministico di WebAssembly_ +- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _Riferimento API OASIS_ +- [Solaris](https://github.com/paritytech/sol-rs) - _Strumento di unit test per i contratti intelligenti in Solidity usando l'EVM nativa del client Parity._ +- [SputnikVM](https://github.com/rust-blockchain/evm) - _Implementazione in Rust della macchina virtuale di Ethereum_ +- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Contratto intelligente Wavelet in Rust_ +- [Foundry](https://github.com/foundry-rs/foundry) - _Toolkit per lo sviluppo di applicazioni Ethereum_ - [Alloy](https://alloy.rs) - _Librerie ad alte prestazioni, ben testate e documentate per interagire con Ethereum e altre catene basate su EVM._ -- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _Libreria di Ethereum e implementazione di portafogli_ -- [SewUp](https://github.com/second-state/SewUp) - _Una libreria per aiutarti a creare il tuo contratto webassembly di Ethereum con Rust e sviluppare in un backend comune_ -- [Substreams](https://github.com/streamingfast/substreams): _tecnologia d'indicizzazione parallelizzata dei dati della blockchain_ -- [Reth](https://github.com/paradigmxyz/reth) Reth (abbreviazione di Rust Ethereum) è una nuova implementazione a nodo completo su Ethereum -- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust): _Una raccolta curata di progetti nell'ecosistema di Ethereum, scritta in Rust_ +- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _Libreria Ethereum e implementazione di portafoglio_ +- [SewUp](https://github.com/second-state/SewUp) - _Una libreria per aiutarti a costruire il tuo contratto webassembly per Ethereum con Rust, proprio come se sviluppassi in un backend comune_ +- [Substreams](https://github.com/streamingfast/substreams) - _Tecnologia parallelizzata di indicizzazione dei dati della blockchain_ +- [Reth](https://github.com/paradigmxyz/reth) Reth (abbreviazione di Rust Ethereum) è una nuova implementazione di nodo completo di Ethereum +- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) - _Una raccolta curata di progetti nell'ecosistema Ethereum scritti in Rust_ Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers.](/developers/) @@ -60,4 +60,4 @@ Cerchi altre risorse? Dai un'occhiata a [ethereum.org/developers.](/developers/) - [Ethereum WebAssembly](https://gitter.im/ewasm/Lobby) - [Oasis Gitter](https://gitter.im/Oasis-official/Lobby) - [Parity Gitter](https://gitter.im/paritytech/parity) -- [Enigma](https://discord.gg/SJK32GY) +- [Enigma](https://discord.gg/SJK32GY) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/index.md b/public/content/translations/it/developers/docs/scaling/index.md index 86a141a6caf..e408af261cf 100644 --- a/public/content/translations/it/developers/docs/scaling/index.md +++ b/public/content/translations/it/developers/docs/scaling/index.md @@ -1,112 +1,118 @@ --- -title: Scalabilità -description: Introduzione alle diverse opzioni di scalabilità attualmente in fase di sviluppo da parte della community Ethereum. +title: "Scalabilità" +description: "Un'introduzione alle diverse opzioni di scalabilità attualmente in fase di sviluppo da parte della comunità di Ethereum." lang: it sidebarDepth: 3 --- -## Panoramica della scalabilità {#scaling-overview} +## Panoramica sulla scalabilità {#scaling-overview} -Poiché il numero di persone che usano Ethereum è aumentato, la blockchain ha raggiunto determinati limiti di capacità. Ciò ha aumentato il costo di utilizzo della rete, creando la necessità di "soluzioni di scalabilità". Ci sono molteplici soluzioni in fase di ricerca, sperimentazione e implementazione, che adottano approcci diversi per raggiungere obiettivi simili. +Man mano che il numero di persone che utilizzano [Ethereum](/) è cresciuto, la blockchain ha raggiunto determinati limiti di capacità. Ciò ha fatto aumentare il costo di utilizzo della rete, creando la necessità di "soluzioni di scalabilità". Ci sono molteplici soluzioni in fase di ricerca, test e implementazione che adottano approcci diversi per raggiungere obiettivi simili. -L'obiettivo principale della scalabilità è incrementare la velocità (finalità più veloce) e il volume delle transazioni (maggior numero al secondo), senza sacrificare la decentralizzazione o la sicurezza. Sulla blockchain di livello 1 di Ethereum, l'elevata domanda comporta transazioni più lente e [prezzi del gas](/developers/docs/gas/) impraticabili. L'aumento della capacità della rete in termini di velocità e produttività è fondamentale per una significativa adozione di massa di Ethereum. +L'obiettivo principale della scalabilità è aumentare la velocità delle transazioni (finalità più rapida) e il throughput delle transazioni (maggior numero di transazioni al secondo) senza sacrificare la decentralizzazione o la sicurezza. Sulla blockchain di Ethereum di livello 1, l'elevata domanda porta a transazioni più lente e a [prezzi del gas](/developers/docs/gas/) non sostenibili. Aumentare la capacità della rete in termini di velocità e throughput è fondamentale per un'adozione significativa e di massa di Ethereum. -Anche se velocità e produttività sono aspetti importanti, è essenziale che le soluzioni di scalabilità che rendono possibili questi obiettivi rimangano decentralizzate e sicure. Mantenere una barriera all'ingresso bassa per gli operatori dei nodi è fondamentale per scongiurare una progressione verso una potenza di calcolo centralizzata e insicura. +Sebbene la velocità e il throughput siano importanti, è essenziale che le soluzioni di scalabilità che consentono di raggiungere questi obiettivi rimangano decentralizzate e sicure. Mantenere bassa la barriera all'ingresso per gli operatori dei nodi è fondamentale per prevenire una progressione verso una potenza di calcolo centralizzata e insicura. -A livello concettuale, per prima cosa occorre distinguere tra scalabilità on-chain o off-chain. +Concettualmente, classifichiamo innanzitutto la scalabilità come scalabilità on-chain o scalabilità fuori catena. ## Prerequisiti {#prerequisites} -Dovresti avere una buona conoscenza di tutti gli argomenti fondamentali. L'implementazione di soluzioni di scalabilità è un argomento avanzato, in quanto la tecnologia è meno testata sul campo e continua ad essere oggetto di ricerca e sviluppo. +Dovresti avere una buona comprensione di tutti gli argomenti fondamentali. L'implementazione di soluzioni di scalabilità è un argomento avanzato poiché la tecnologia è meno collaudata e continua a essere ricercata e sviluppata. -## Scalabilità on-chain {#on-chain-scaling} +## Scalabilità on-chain {#onchain-scaling} -La scalabilità on-chain richiede modifiche al protocollo Ethereum ([rete principale](/glossary/#mainnet) di livello 1). Per molto tempo si è pensato che lo sharding della blockchain avrebbe ridimensionato Ethereum. Questo avrebbe coinvolto la divisione della blockchain in pezzi discreti (shard), che sarebbero stati verificati da sottoinsiemi dei validatori. Tuttavia, il ridimensionamento dai rollup di livello 2 ha preso il controllo come la tecnica di ridimensionamento principale. Questa è supportata dall'aggiunta di una nuova e più economica forma di dati connessi ai blocchi di Ethereum, progettati specificamente per rendere i rollup economici per gli utenti. +La scalabilità on-chain richiede modifiche al protocollo di Ethereum (la [rete principale](/glossary/#mainnet) di livello 1). Per molto tempo, ci si aspettava che la frammentazione della blockchain avrebbe scalato Ethereum. Ciò avrebbe comportato la divisione della blockchain in pezzi discreti (frammenti) da far verificare a sottoinsiemi di validatori. Tuttavia, la scalabilità tramite i rollup di livello 2 ha preso il sopravvento come tecnica di scalabilità principale. Ciò è supportato dall'aggiunta di una nuova forma di dati più economica allegata ai blocchi di Ethereum, appositamente progettata per rendere i rollup economici per gli utenti. -### Sharding {#sharding} +### Frammentazione {#sharding} -Lo sharding è il processo di frammentazione di un database. Sottoinsiemi di validatori sarebbero responsabili dei singoli shard invece di tenere traccia di tutta la rete Ethereum. Un tempo destinato a essere trasferito verso il proof-of-stake prima della Fusione, lo sharding è stato per molto tempo sulla [tabella di marcia](/roadmap/) di Ethereum. Tuttavia, il rapido sviluppo dei [rollup di livello 2](#layer-2-scaling) e l'invenzione del [Dansharding](/roadmap/danksharding) (aggiunta di blob di dati di rollup ai blocchi di Ethereum che possono essere verificati in modo molto efficiente dai validatori), ha portato la community di Ethereum a preferire il ridimensionamento incentrato sui rollup piuttosto che sullo sharding. Ciò aiuterà anche a mantenere più semplice la logica del consenso di Ethereum. +La frammentazione è il processo di divisione di un database. Sottoinsiemi di validatori sarebbero responsabili dei singoli frammenti piuttosto che tenere traccia di tutto Ethereum. La frammentazione è stata sul [piano d'azione](/roadmap/) di Ethereum per molto tempo, e un tempo si intendeva rilasciarla prima de La Fusione (The Merge) alla prova di stake. Tuttavia, il rapido sviluppo dei [rollup di livello 2](#layer-2-scaling) e l'invenzione del [Danksharding](/roadmap/danksharding) (l'aggiunta di blob di dati dei rollup ai blocchi di Ethereum che possono essere verificati in modo molto efficiente dai validatori) ha portato la comunità di Ethereum a favorire una scalabilità incentrata sui rollup invece della scalabilità tramite frammentazione. Questo aiuterà anche a mantenere più semplice la logica di consenso di Ethereum. -## Scalabilità off-chain {#off-chain-scaling} +## Scalabilità fuori catena {#offchain-scaling} -Le soluzioni off-chain sono implementate separatamente dalla Rete principale di livello 1, e non richiedono alcuna modifica al protocollo Ethereum esistente. Alcune soluzioni, note come soluzioni di "livello 2", derivano la loro sicurezza direttamente dal consenso del livello 1 di Ethereum, come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/), i [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/) o i [canali di stato](/developers/docs/scaling/state-channels/). Altre soluzioni comportano la creazione di nuove catene in varie forme, che derivano la propria sicurezza separatamente dalla Rete principale, come le [catene secondarie](#sidechains), i [validium](#validium) o le [catene Plasma](#plasma). Queste soluzioni comunicano con la Rete principale, ma derivano la loro sicurezza in modo diverso per raggiungere una serie di obiettivi. +Le soluzioni fuori catena sono implementate separatamente dalla rete principale di livello 1: non richiedono modifiche al protocollo di Ethereum esistente. Alcune soluzioni, note come soluzioni di "livello 2", derivano la loro sicurezza direttamente dal consenso di Ethereum di livello 1, come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/), i [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/) o i [canali di stato](/developers/docs/scaling/state-channels/). Altre soluzioni comportano la creazione di nuove catene in varie forme che derivano la loro sicurezza separatamente dalla rete principale, come le [catene laterali](#sidechains), i [validium](#validium) o le [catene plasma](#plasma). Queste soluzioni comunicano con la rete principale ma derivano la loro sicurezza in modo diverso per ottenere una varietà di obiettivi. ### Scalabilità di livello 2 {#layer-2-scaling} -Questa categoria di soluzioni off-chain deriva la sua sicurezza dalla Rete principale di Ethereum. +Questa categoria di soluzioni fuori catena deriva la sua sicurezza dalla rete principale di Ethereum. -Livello 2 è un termine collettivo per le soluzioni progettate per aiutare a ridimensionare la tua applicazione gestendo le transazioni al di fuori della rete principale di Ethereum (livello 1), sfruttando il robusto modello di sicurezza decentralizzato della Rete principale. La velocità delle transazioni ne risente quando la rete è molto carica, e l'esperienza utente può risultare poco piacevole per alcuni tipi di dApp. E, man mano che la rete si congestiona, i prezzi del carburante aumentano mentre i mittenti delle transazioni mirano a superarsi a vicenda. Ciò può rendere l'utilizzo di Ethereum alquanto dispendioso. +Livello 2 è un termine collettivo per le soluzioni progettate per aiutare a scalare la tua applicazione gestendo le transazioni fuori dalla rete principale di Ethereum (livello 1) pur sfruttando il robusto modello di sicurezza decentralizzato della rete principale. La velocità delle transazioni ne risente quando la rete è occupata, rendendo l'esperienza utente scadente per determinati tipi di dApp. E man mano che la rete diventa più occupata, i prezzi del gas aumentano poiché i mittenti delle transazioni mirano a superarsi a vicenda con le offerte. Questo può rendere l'utilizzo di Ethereum molto costoso. -La maggior parte delle soluzioni di livello 2 è incentrata su un server o su un cluster di server, ognuno dei quali può essere denominato nodo, validatore, operatore, sequenziatore, produttore di blocchi o termini simili. A seconda dell'implementazione, questi nodi di livello 2 possono essere gestiti da persone, aziende o entità che li usano, da operatori terzi o da un grande gruppo di individui (in modo simile alla Rete principale). In linea generale, le transazioni vengono inviate a questi nodi di livello 2 anziché essere inviate direttamente al livello 1 (Rete principale). Per alcune soluzioni, l'istanza di livello 2 le riunisce in gruppi prima di collegarle al livello 1, a quel punto sono protette dal livello 1 e non possono essere alterate. I dettagli dell'esecuzione vera e propria variano notevolmente tra le varie tecnologie e implementazioni di livello 2. +La maggior parte delle soluzioni di livello 2 è incentrata su un server o un cluster di server, ognuno dei quali può essere definito nodo, validatore, operatore, sequenziatore, produttore di blocchi o con un termine simile. A seconda dell'implementazione, questi nodi di livello 2 possono essere gestiti da individui, aziende o entità che li utilizzano, o da un operatore di terze parti, o da un ampio gruppo di individui (simile alla rete principale). In generale, le transazioni vengono inviate a questi nodi di livello 2 invece di essere inviate direttamente al livello 1 (rete principale). Per alcune soluzioni, l'istanza di livello 2 le raggruppa in lotti prima di ancorarle al livello 1, dopodiché sono protette dal livello 1 e non possono essere alterate. I dettagli su come ciò avvenga variano in modo significativo tra le diverse tecnologie e implementazioni di livello 2. -Un'istanza specifica di livello 2 può essere aperta e condivisa da molte applicazioni, oppure può essere implementata da un progetto e dedicata a sostenere solo quell'applicazione specifica. +Una specifica istanza di livello 2 può essere aperta e condivisa da molte applicazioni, oppure può essere distribuita da un progetto e dedicata a supportare solo la propria applicazione. -#### Perché il Livello 2 è necessario? {#why-is-layer-2-needed} +#### Perché è necessario il livello 2? {#why-is-layer-2-needed} -- L'aumento delle transazioni al secondo migliora notevolmente l'esperienza utente e riduce la congestione della rete sulla Mainnet di Ethereum. -- Le transazioni sono raggruppate in una singola transazione sulla Rete Principale di Ethereum, riducendo le commissioni del gas per gli utenti e rendendo Ethereum più inclusivo e accessibile per le persone da tutto il mondo. -- Qualunque aggiornamento alla scalabilità non dovrebbe sacrificare decentralizzazione e sicurezza - il livello 2 è basato su Ethereum. -- Esistono reti di livello 2 specifiche per le applicazioni che sfruttano le proprie efficienze lavorando con risorse su scala. +- L'aumento delle transazioni al secondo migliora notevolmente l'esperienza utente e riduce la congestione della rete sulla rete principale di Ethereum. +- Le transazioni vengono raggruppate (rollup) in un'unica transazione verso la rete principale di Ethereum, riducendo le commissioni per gli utenti e rendendo Ethereum più inclusivo e accessibile per le persone ovunque. +- Qualsiasi aggiornamento alla scalabilità non dovrebbe andare a scapito della decentralizzazione o della sicurezza: il livello 2 si basa su Ethereum. +- Esistono reti di livello 2 specifiche per le applicazioni che portano il proprio insieme di efficienze quando si lavora con risorse su larga scala. [Maggiori informazioni sul livello 2](/layer-2/). #### Rollup {#rollups} -I rollup eseguono le transazioni al di fuori del livello 1, dopodiché i dati vengono pubblicati al livello 1, dove viene raggiunto il consenso. Poiché i dati della transazione sono inclusi nei blocchi del livello 1, ciò consente ai rollup di essere protetti dalla sicurezza nativa di Ethereum. +I rollup eseguono le transazioni al di fuori del livello 1 e poi i dati vengono pubblicati sul livello 1 dove viene raggiunto il consenso. Poiché i dati delle transazioni sono inclusi nei blocchi di livello 1, ciò consente ai rollup di essere protetti dalla sicurezza nativa di Ethereum. -Esistono due tipi di rollup con diversi modelli di sicurezza: +Esistono due tipi di rollup con modelli di sicurezza diversi: -- **Rollup ottimistici**: presumono che le transazioni siano valide di default ed eseguono solo il calcolo, tramite una [**prova di frode**](/glossary/#fraud-proof), nel caso di una contestazione. [Maggiori informazioni sui rollup ottimistici](/developers/docs/scaling/optimistic-rollups/). -- **Rollup a conoscenza zero**: esegue il calcolo al di fuori della catena e invia una [**prova di validità**](/glossary/#validity-proof) alla catena. [Maggiori informazioni sui rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/). +- **Rollup ottimistici**: presumono che le transazioni siano valide per impostazione predefinita ed eseguono il calcolo, tramite una [**prova di frode**](/glossary/#fraud-proof), solo in caso di contestazione. [Maggiori informazioni sui rollup ottimistici](/developers/docs/scaling/optimistic-rollups/). +- **Rollup a conoscenza zero**: eseguono il calcolo fuori catena e inviano una [**prova di validità**](/glossary/#validity-proof) alla catena. [Maggiori informazioni sui rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/). #### Canali di stato {#channels} -I canali di stato utilizzano contratti multifirma per consentire ai partecipanti di effettuare transazioni rapidamente e liberamente al di fuori della catena, regolando la finalità con la Rete principale. In questo modo si riducono al minimo la congestione, le commissioni e i ritardi sulla rete. Al momento esistono due tipi di canali: canali di stato e canali di pagamento. +I canali di stato utilizzano contratti multifirma per consentire ai partecipanti di effettuare transazioni in modo rapido e libero fuori catena, per poi stabilire la finalità con la rete principale. Ciò riduce al minimo la congestione della rete, le commissioni e i ritardi. I due tipi di canali sono attualmente i canali di stato e i canali di pagamento. -Maggiori informazioni sui [canali di stato](/developers/docs/scaling/state-channels/). +Scopri di più sui [canali di stato](/developers/docs/scaling/state-channels/). -### Sidechain {#sidechains} +### Catene laterali {#sidechains} -Una sidechain è una blockchain indipendente compatibile con EVM che viene eseguita in parallelo alla Rete principale. È compatibile con Ethereum tramite ponti bidirezionali e funziona secondo regole di consenso e parametri del blocco propri. +Una catena laterale è una blockchain indipendente compatibile con l'EVM che funziona in parallelo alla rete principale. Queste sono compatibili con Ethereum tramite ponti bidirezionali e funzionano secondo le proprie regole di consenso e parametri dei blocchi scelti. -Maggiori informazioni sulle [sidechain](/developers/docs/scaling/sidechains/). +Scopri di più sulle [catene laterali](/developers/docs/scaling/sidechains/). ### Plasma {#plasma} -Una catena Plasma è una blockchain separata e collegata alla catena principale di Ethereum che utilizza le prove di frode (come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/)) per arbitrare le dispute. +Una catena plasma è una blockchain separata che è ancorata alla catena principale di Ethereum e utilizza prove di frode (come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/)) per arbitrare le controversie. -Scopri di più sui [rollup](/developers/docs/scaling/plasma/). +Scopri di più su [Plasma](/developers/docs/scaling/plasma/). ### Validium {#validium} -Una catena Validum usa le prove di validità come i rollup a conoscenza zero, ma i dati non sono memorizzati sulla catena di livello 1 principale di Ethereum. Questo può tradursi in 10.000 transazioni al secondo per catena Validium, con la possibilità di eseguire più catene in parallelo. +Una catena Validium utilizza prove di validità come i rollup a conoscenza zero, ma i dati non vengono archiviati sulla catena principale di Ethereum di livello 1. Ciò può portare a 10.000 transazioni al secondo per catena Validium e più catene possono essere eseguite in parallelo. Scopri di più su [Validium](/developers/docs/scaling/validium/). ## Perché sono necessarie così tante soluzioni di scalabilità? {#why-do-we-need-these} -- Soluzioni multiple possono contribuire a ridurre la congestione generale su qualsiasi parte della rete, nonché a evitare singoli punti di errore. -- Il tutto è superiore alla somma delle sue parti. Diverse soluzioni possono coesistere e lavorare in armonia, producendo un effetto esponenziale sulla velocità e la produttività delle transazioni future. -- Non tutte le soluzioni richiedono l'utilizzo dell'algoritmo di consenso di Ethereum direttamente, e le alternative possono offrire benefici che altrimenti sarebbero difficili da ottenere. +- Molteplici soluzioni possono aiutare a ridurre la congestione complessiva su qualsiasi parte della rete e anche a prevenire singoli punti di guasto. +- Il tutto è maggiore della somma delle sue parti. Soluzioni diverse possono esistere e lavorare in armonia, consentendo un effetto esponenziale sulla velocità e sul throughput delle transazioni future. +- Non tutte le soluzioni richiedono l'utilizzo diretto dell'algoritmo di consenso di Ethereum e le alternative possono offrire vantaggi che altrimenti sarebbero difficili da ottenere. -## Preferisci un approccio visivo all'apprendimento? {#visual-learner} +## Impari meglio visivamente? {#visual-learner} -_Si noti che la spiegazione nel video usa il termine "Livello 2" per fare riferimento a tutte le soluzioni di ridimensionamento off-chain, mentre noi distinguiamo il "Livello 2" come soluzione off-chain che deriva la sua sicurezza dal consenso di livello 1 (Rete principale)._ +_Nota che la spiegazione nel video utilizza il termine "Livello 2" per riferirsi a tutte le soluzioni di scalabilità fuori catena, mentre noi differenziamo il "Livello 2" come una soluzione fuori catena che deriva la sua sicurezza attraverso il consenso della rete principale di livello 1._ -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} -- [A rollup-centric Ethereum roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ -- [Statistiche aggiornate sulle soluzioni di ridimensionamento del Livello 2 per Ethereum](https://www.l2beat.com/) -- [Valutare le soluzioni di scalabilità del Livello 2 di Ethereum: un quadro di confronto](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) +- [Un piano d'azione di Ethereum incentrato sui rollup](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ +- [Analisi aggiornate sulle soluzioni di scalabilità di livello 2 per Ethereum](https://www.l2beat.com/) +- [Valutazione delle soluzioni di scalabilità di livello 2 di Ethereum: un framework di confronto](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) - [Una guida incompleta ai rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) -- [Rollup ZK basati su Ethereum: fuoriclasse a livello mondiale](https://hackmd.io/@canti/rkUT0BD8K) -- [Rollup ottimistici vs Rollup ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) -- [Perché i rollup e i frammenti di dati sono la sola soluzione sostenibile per un'elevata scalabilità](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [Che tipo di Livelli 3 hanno senso?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) -- [Disponibilità dei dati, ovvero come i rollup hanno imparato a smettere di preoccuparsi e ad amare Ethereum](https://ethereum2077.substack.com/p/data-availability-in-ethereum-rollups) +- [Rollup a conoscenza zero basati su Ethereum: i migliori al mondo](https://hackmd.io/@canti/rkUT0BD8K) +- [Rollup ottimistici vs rollup a conoscenza zero](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) +- [Perché i rollup + i frammenti di dati sono l'unica soluzione sostenibile per un'elevata scalabilità](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) +- [Che tipo di livello 3 ha senso?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) +- [Disponibilità dei dati o: come i rollup hanno imparato a non preoccuparsi e ad amare Ethereum](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [La guida pratica ai rollup di Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della comunità che ti ha aiutato? Modifica questa pagina e aggiungila!_ + +## Tutorial: Costruire livelli 2 scalabili su Ethereum {#tutorials} + +- [Tutto ciò che puoi memorizzare nella cache](/developers/tutorials/all-you-can-cache/) _– Come creare e utilizzare un contratto di memorizzazione nella cache per ridurre i costi dei calldata sui rollup._ +- [ABI brevi per l'ottimizzazione dei calldata](/developers/tutorials/short-abi/) _– Come utilizzare ABI più brevi per ridurre i costi dei calldata per le transazioni di livello 2._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md index 65fc1e05800..3ff48da1e23 100644 --- a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md @@ -1,263 +1,269 @@ --- title: Rollup ottimistici -description: 'Un''introduzione ai rollup ottimistici: una soluzione di ridimensionamento usata dalla community di Ethereum.' +description: "Un'introduzione ai rollup ottimistici, una soluzione di scalabilità utilizzata dalla community di Ethereum." lang: it --- -I rollup ottimistici sono protocolli di livello 2 (L2) progettati per estendere il volume del livello di base di Ethereum. Riducono il calcolo sulla catena principale di Ethereum elaborando le transazioni al di fuori della catena, offrendo miglioramenti significativi in termini di velocità di elaborazione. A differenza di altre soluzioni di ridimensionamento, come le [sidechain](/developers/docs/scaling/sidechains/), i rollup ottimistici derivano la propria sicurezza dalla Rete principale, pubblicando i risultati delle transazioni sulla catena o sulle [catene Plasma](/developers/docs/scaling/plasma/), che verificano le transazioni anche su Ethereum con le prove di frode, ma memorizzano i dati delle transazioni altrove. +I rollup ottimistici sono protocolli di livello 2 (L2) progettati per estendere il throughput del livello di base di Ethereum. Riducono il calcolo sulla catena principale di [Ethereum](/) elaborando le transazioni fuori catena, offrendo miglioramenti significativi nelle velocità di elaborazione. A differenza di altre soluzioni di scalabilità, come le [catene laterali](/developers/docs/scaling/sidechains/), i rollup ottimistici derivano la sicurezza dalla rete principale pubblicando i risultati delle transazioni on-chain, o le [catene plasma](/developers/docs/scaling/plasma/), che verificano anch'esse le transazioni su Ethereum con prove di frode, ma archiviano i dati delle transazioni altrove. -Siccome il calcolo è la parte lenta e costosa di Ethereum, i rollup ottimistici possono offrire miglioramenti alla scalabilità pari a 10-100x. Inoltre, i rollup ottimistici scrivono le transazioni su Ethereum come `calldata` o in [blob](/roadmap/danksharding/), riducendo i costi del gas per gli utenti. +Poiché il calcolo è la parte lenta e costosa dell'utilizzo di Ethereum, i rollup ottimistici possono offrire miglioramenti della scalabilità fino a 10-100 volte. I rollup ottimistici scrivono anche le transazioni su Ethereum come `calldata` o in [blob](/roadmap/danksharding/), riducendo i costi del gas per gli utenti. ## Prerequisiti {#prerequisites} -Dovresti aver letto e compreso le nostre pagine sul [ridimensionamento di Ethereum](/developers/docs/scaling/) e il [livello 2](/layer-2/). +Dovresti aver letto e compreso le nostre pagine sulla [scalabilità di Ethereum](/developers/docs/scaling/) e sul [livello 2](/layer-2/). ## Cos'è un rollup ottimistico? {#what-is-an-optimistic-rollup} -Un rollup ottimistico è un approccio al ridimensionamento di Ethereum che comporta lo spostamento del calcolo e dell'archiviazione di stato al di fuori della catena. I rollup ottimistici eseguono le transazioni all'esterno di Ethereum, ma ne pubblicano i dati sulla Rete Principale come `calldata` o in [blob](/roadmap/danksharding/). +Un rollup ottimistico è un approccio alla scalabilità di Ethereum che prevede lo spostamento del calcolo e dell'archiviazione dello stato fuori catena. I rollup ottimistici eseguono le transazioni al di fuori di Ethereum, ma pubblicano i dati delle transazioni sulla rete principale come `calldata` o in [blob](/roadmap/danksharding/). -Gli operatori del rollup ottimistico raggruppano svariate transazioni off-chain in grandi batch prima di inviarle a Ethereum. Questo approccio consente di distribuire i costi fissi su più transazioni in ogni batch, riducendo le commissioni per gli utenti finali. I rollup ottimistici usano inoltre tecniche di compressione per ridurre la quantità di dati pubblicati su Ethereum. +Gli operatori dei rollup ottimistici raggruppano più transazioni fuori catena in grandi lotti prima di inviarle a Ethereum. Questo approccio consente di distribuire i costi fissi su più transazioni in ogni lotto, riducendo le commissioni per gli utenti finali. I rollup ottimistici utilizzano anche tecniche di compressione per ridurre la quantità di dati pubblicati su Ethereum. -I rollup ottimistici sono considerati "ottimistici" perché presuppongono che le transazioni off-chain siano valide e non pubblicano le prove di validità per i batch di transazioni pubblicati sulla catena. Questo distingue i rollup ottimistici dai [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups) che pubblicano le [prove di validità](/glossary/#validity-proof) crittografiche per le transazioni off-chain. +I rollup ottimistici sono considerati "ottimistici" perché presumono che le transazioni fuori catena siano valide e non pubblicano prove di validità per i lotti di transazioni pubblicati on-chain. Questo separa i rollup ottimistici dai [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups) che pubblicano [prove di validità](/glossary/#validity-proof) crittografiche per le transazioni fuori catena. -I rollup ottimistici, invece, si affidano a uno schema di prova di frode per rilevare i casi in cui le transazioni non sono calcolate correttamente. Dopo che un batch del rollup è inviata a Ethereum, c'è una finestra temporale (detta periodo di contestazione) durante la quale chiunque può contestare i risultati di una transazione del rollup calcolando una [prova di frode](/glossary/#fraud-proof). +I rollup ottimistici si affidano invece a uno schema di prova di frode per rilevare i casi in cui le transazioni non sono calcolate correttamente. Dopo che un lotto di rollup è stato inviato su Ethereum, c'è una finestra temporale (chiamata periodo di contestazione) durante la quale chiunque può contestare i risultati di una transazione di rollup calcolando una [prova di frode](/glossary/#fraud-proof). -Se la prova di frode ha successo, il protocollo del rollup esegue nuovamente le transazioni e aggiorna di conseguenza lo stato del rollup. L'altro effetto di una prova di frode riuscita è che il sequenziatore responsabile dell'inclusione della transazione eseguita erroneamente in un blocco riceve una sanzione. +Se la prova di frode ha successo, il protocollo del rollup riesegue la transazione (o le transazioni) e aggiorna lo stato del rollup di conseguenza. L'altro effetto di una prova di frode riuscita è che il sequenziatore responsabile dell'inclusione della transazione eseguita in modo errato in un blocco riceve una penalità. -Se il batch del rollup non viene contestata (cioè, tutte le transazioni sono eseguite correttamente) dopo la scadenza del periodo di contestazione, è ritenuta valida e accettata su Ethereum. Altri possono continuare a costruire su un blocco di rollup non confermato, ma con una precisazione: i risultati della transazione saranno annullati se basati su una transazione eseguita erroneamente pubblicata in precedenza. +Se il lotto di rollup rimane incontestato (cioè, tutte le transazioni sono eseguite correttamente) dopo la scadenza del periodo di contestazione, viene ritenuto valido e accettato su Ethereum. Altri possono continuare a costruire su un blocco di rollup non confermato, ma con un avvertimento: i risultati delle transazioni saranno annullati se basati su una transazione eseguita in modo errato pubblicata in precedenza. ## Come interagiscono i rollup ottimistici con Ethereum? {#optimistic-rollups-and-Ethereum} -I rollup ottimistici sono [soluzioni di ridimensionamento off-chain](/developers/docs/scaling/#off-chain-scaling) create per funzionare su Ethereum. Ogni rollup ottimistico è gestito da una serie di contratti intelligenti distribuiti sulla rete di Ethereum. I rollup ottimistici elaborano le transazioni al di fuori della catena principale di Ethereum, ma pubblicano le transazioni off-chain (in batch) in un contratto di rollup on-chain. Come la blockchain di Ethereum, questo registro delle transazioni è immutabile e forma la "catena di rollup ottimistico". +I rollup ottimistici sono [soluzioni di scalabilità fuori catena](/developers/docs/scaling/#offchain-scaling) costruite per operare sopra Ethereum. Ogni rollup ottimistico è gestito da un insieme di contratti intelligenti distribuiti sulla rete Ethereum. I rollup ottimistici elaborano le transazioni fuori dalla catena principale di Ethereum, ma pubblicano le transazioni fuori catena (in lotti) su un contratto di rollup on-chain. Come la blockchain di Ethereum, questo registro delle transazioni è immutabile e forma la "catena del rollup ottimistico". -L'architettura di un optimistic rollup comprende le seguenti parti: +L'architettura di un rollup ottimistico comprende le seguenti parti: -**Contratti su catena**: L'operazione del rollup ottimistico è controllata dai contratti intelligenti eseguiti su Ethereum. Questo include i contratti che memorizzano i blocchi del rollup, monitorano gli aggiornamenti di stato sul rollup e tracciano i depositi degli utenti. In questo senso, Ethereum serve da livello di base o "livello 1" per i rollup ottimistici. +**Contratti on-chain**: L'operazione del rollup ottimistico è controllata da contratti intelligenti in esecuzione su Ethereum. Questo include contratti che archiviano i blocchi del rollup, monitorano gli aggiornamenti di stato sul rollup e tracciano i depositi degli utenti. In questo senso, Ethereum funge da livello di base o "livello 1" per i rollup ottimistici. -**Macchina virtuale (VM) off-chain**: sebbene i contratti che gestiscono il protocollo di rollup ottimistico siano eseguiti su Ethereum, il protocollo di rollup esegue calcolo e archiviazione di stato su un'altra macchina virtuale separata dalla [Macchina Virtuale di Ethereum](/developers/docs/evm/). La VM off-chain è dove le applicazioni risiedono e dove sono eseguiti i cambiamenti di stato; serve da livello superiore o "livello 2" per un rollup ottimistico. +**Macchina virtuale (VM) fuori catena**: Sebbene i contratti che gestiscono il protocollo del rollup ottimistico vengano eseguiti su Ethereum, il protocollo del rollup esegue il calcolo e l'archiviazione dello stato su un'altra macchina virtuale separata dalla [macchina virtuale di Ethereum](/developers/docs/evm/). La VM fuori catena è dove risiedono le applicazioni e vengono eseguiti i cambiamenti di stato; funge da livello superiore o "livello 2" per un rollup ottimistico. -Poiché i rollup ottimistici sono progettati per eseguire programmi scritti o compilati per l'EVM, la VM off-chain incorpora molte specifiche di progettazione dell'EVM. Inoltre, le prove di frode calcolate sulla catena consentono alla rete di Ethereum di imporre la validità dei cambiamenti di stato calcolati nella VM off-chain. +Poiché i rollup ottimistici sono progettati per eseguire programmi scritti o compilati per l'EVM, la VM fuori catena incorpora molte specifiche di progettazione dell'EVM. Inoltre, le prove di frode calcolate on-chain consentono alla rete Ethereum di far rispettare la validità dei cambiamenti di stato calcolati nella VM fuori catena. -I rollup ottimistici sono descritti come 'soluzioni di ridimensionamento ibridi' perché, sebbene esistano come protocolli separati, le loro proprietà di sicurezza sono derivate da Ethereum. Tra le altre cose, Ethereum garantisce la correttezza del calcolo off-chain di un rollup e la disponibilità dei dati dietro il calcolo. Questo rende i rollup ottimistici più sicuri dei protocolli di ridimensionamento off-chain puri (ad es. [sidechain](/developers/docs/scaling/sidechains/)) che non si affidano a Ethereum per la sicurezza. +I rollup ottimistici sono descritti come "soluzioni di scalabilità ibride" perché, sebbene esistano come protocolli separati, le loro proprietà di sicurezza derivano da Ethereum. Tra le altre cose, Ethereum garantisce la correttezza del calcolo fuori catena di un rollup e la disponibilità dei dati alla base del calcolo. Questo rende i rollup ottimistici più sicuri rispetto ai protocolli di scalabilità puramente fuori catena (ad es., le [catene laterali](/developers/docs/scaling/sidechains/)) che non si affidano a Ethereum per la sicurezza. I rollup ottimistici si affidano al protocollo principale di Ethereum per quanto segue: ### Disponibilità dei dati {#data-availability} -Come accennato, i rollup ottimistici pubblicano i dati delle transazioni su Ethereum come `calldata` o in [blob](/roadmap/danksharding/). Poiché l'esecuzione della catena di rollup si basa sulle transazioni inviate, chiunque può usare queste informazioni, ancorate al livello di base di Ethereum, per eseguire lo stato del rollup e verificare la correttezza delle transizioni di stato. +Come accennato, i rollup ottimistici pubblicano i dati delle transazioni su Ethereum come `calldata` o [blob](/roadmap/danksharding/). Poiché l'esecuzione della catena del rollup si basa sulle transazioni inviate, chiunque può utilizzare queste informazioni, ancorate al livello di base di Ethereum, per eseguire lo stato del rollup e verificare la correttezza delle transizioni di stato. -[La disponibilità dei dati](/developers/docs/data-availability/) è critica perché, senza accesso ai dati di stato, gli autori della contestazione non possono produrre prove di frode per contestare operazioni di rollup non valide. Con Ethereum che fornisce la disponibilità dei dati, il rischio che gli operatori di rollup la passino liscia con atti malevoli (ad es. inviare blocchi non validi) è ridotto. +La [disponibilità dei dati](/developers/docs/data-availability/) è fondamentale perché senza accesso ai dati di stato, gli sfidanti non possono costruire prove di frode per contestare operazioni di rollup non valide. Con Ethereum che fornisce la disponibilità dei dati, il rischio che gli operatori del rollup la passino liscia con atti dannosi (ad es., l'invio di blocchi non validi) è ridotto. ### Resistenza alla censura {#censorship-resistance} -I rollup ottimistici si affidano a Ethereum anche per la resistenza alla censura. In un rollup ottimistico, un'entità centralizzata (l'operatore) è responsabile dell'elaborazione delle transazioni e dell'invio dei blocchi di rollup a Ethereum. Ciò ha delle implicazioni: +I rollup ottimistici si affidano a Ethereum anche per la resistenza alla censura. In un rollup ottimistico un'entità centralizzata (l'operatore) è responsabile dell'elaborazione delle transazioni e dell'invio dei blocchi del rollup a Ethereum. Questo ha alcune implicazioni: -- Gli operatori del rollup possono censurare gli utenti andando completamente offline o rifiutandosi di produrre blocchi che introducano in essi determinate transazioni. +- Gli operatori del rollup possono censurare gli utenti andando completamente offline, o rifiutandosi di produrre blocchi che includano determinate transazioni al loro interno. -- Gli operatori dei rollup possono impedire agli utenti di prelevare i fondi depositati nel contratto di rollup trattenendo i dati di stato necessari per le prove di proprietà di Merkle. Trattenere i dati di stato può anche nascondere lo stato del rollup agli utenti e impedire loro di interagire col rollup. +- Gli operatori del rollup possono impedire agli utenti di prelevare i fondi depositati nel contratto del rollup trattenendo i dati di stato necessari per le prove di proprietà di Merkle. Trattenere i dati di stato può anche nascondere lo stato del rollup agli utenti e impedire loro di interagire con il rollup. -I rollup ottimistici risolvono questo problema forzando gli operatori a pubblicare i dati associati agli aggiornamenti di stato su Ethereum. La pubblicazione dei dati di rollup sulla catena ha i seguenti benefici: +I rollup ottimistici risolvono questo problema costringendo gli operatori a pubblicare i dati associati agli aggiornamenti di stato su Ethereum. La pubblicazione dei dati del rollup on-chain ha i seguenti vantaggi: -- Se l'operatore di un rollup ottimistico va offline o smette di produrre i batch di transazioni, un altro nodo può usare i dati disponibili per riprodurre l'ultimo stato del rollup e proseguire con la produzione del blocco. +- Se un operatore di rollup ottimistico va offline o smette di produrre lotti di transazioni, un altro nodo può utilizzare i dati disponibili per riprodurre l'ultimo stato del rollup e continuare la produzione di blocchi. -- Gli utenti possono usare i dati della transazione per creare delle prove di Merkle per dimostrare la proprietà dei fondi e prelevare le proprie risorse dal rollup. +- Gli utenti possono utilizzare i dati delle transazioni per creare prove di Merkle che dimostrano la proprietà dei fondi e prelevare i propri asset dal rollup. -- Gli utenti possono inoltre inviare le proprie transazioni sul L1 invece che al sequenziatore, nel qual caso il sequenziatore deve includere la transazione entro un certo limite di tempo per continuare a produrre blocchi validi. +- Gli utenti possono anche inviare le loro transazioni su L1 invece che al sequenziatore, nel qual caso il sequenziatore deve includere la transazione entro un certo limite di tempo per continuare a produrre blocchi validi. -### Accordo {#settlement} +### Regolamento {#settlement} -Un altro ruolo rivestito da Ethereum nel contesto dei rollup ottimistici è quello di un livello d'accordo. Un livello di accordo collega l'intero ecosistema della blockchain, stabilisce sicurezza e fornisce finalità oggettiva se si verifica una disputa su un'altra catena (rollup ottimistici in questo caso) che richieda un arbitrato. +Un altro ruolo che Ethereum svolge nel contesto dei rollup ottimistici è quello di livello di regolamento. Un livello di regolamento ancora l'intero ecosistema blockchain, stabilisce la sicurezza e fornisce una finalità oggettiva se si verifica una controversia su un'altra catena (i rollup ottimistici in questo caso) che richiede un arbitrato. -La Rete principale di Ethereum fornisce un hub per i rollup ottimistici per verificare le prove di frode e risolvere le dispute. Inoltre, le transazioni condotte sul rollup sono finali solo _dopo_ che il blocco del rollup è accettato su Ethereum. Una volta che la transazione di un rollup è impegnata nel livello di base di Ethereum, non è posticipabile (tranne nell'altamente improbabile caso di una riorganizzazione della catena). +La rete principale di Ethereum fornisce un hub per i rollup ottimistici per verificare le prove di frode e risolvere le controversie. Inoltre, le transazioni condotte sul rollup sono definitive solo _dopo_ che il blocco del rollup è stato accettato su Ethereum. Una volta che una transazione di rollup è impegnata nel livello di base di Ethereum, non può essere annullata (tranne nel caso altamente improbabile di una riorganizzazione della catena). ## Come funzionano i rollup ottimistici? {#how-optimistic-rollups-work} ### Esecuzione e aggregazione delle transazioni {#transaction-execution-and-aggregation} -Gli utenti inviano le transazioni agli "operatori", che sono nodi responsabili dell'elaborazione delle transazioni sul rollup ottimistico. Anche noto come "validatore" o "aggregatore", l'operatore aggrega le transazioni, comprime i dati sottostanti e pubblica il blocco su Ethereum. +Gli utenti inviano le transazioni agli "operatori", che sono nodi responsabili dell'elaborazione delle transazioni sul rollup ottimistico. Conosciuto anche come "validatore" o "aggregatore", l'operatore aggrega le transazioni, comprime i dati sottostanti e pubblica il blocco su Ethereum. -Sebbene chiunque possa diventare un validatore, i validatori del rollup ottimistico devono fornire una cauzione prima di produrre i blocchi, come in un [sistema di proof-of-stake](/developers/docs/consensus-mechanisms/pos/). Questa cauzione è decurtabile se il validatore pubblica un blocco non valido o costruisce su un blocco vecchio ma non valido (anche se il suo blocco è valido). Così, i rollup ottimistici usano incentivi cripto-economici per assicurarsi che i validatori agiscano onestamente. +Sebbene chiunque possa diventare un validatore, i validatori dei rollup ottimistici devono fornire una cauzione prima di produrre blocchi, in modo molto simile a un [sistema di prova di stake](/developers/docs/consensus-mechanisms/pos/). Questa cauzione può essere punita se il validatore pubblica un blocco non valido o costruisce su un blocco vecchio ma non valido (anche se il suo blocco è valido). In questo modo i rollup ottimistici utilizzano incentivi crittoeconomici per garantire che i validatori agiscano onestamente. -Gli altri validatori sulla catena di rollup ottimistico dovrebbero eseguire le transazioni inviate usando la loro copia dello stato del rollup. Se lo stato finale di un validatore è differente da quello proposto dall'operatore, possono avviare una contestazione e calcolare una prova di frode. +Ci si aspetta che altri validatori sulla catena del rollup ottimistico eseguano le transazioni inviate utilizzando la loro copia dello stato del rollup. Se lo stato finale di un validatore è diverso dallo stato proposto dall'operatore, possono avviare una contestazione e calcolare una prova di frode. -Alcuni rollup ottimistici potrebbero rinunciare a un sistema di validatore senza permessi e usare un solo "sequenziatore" per eseguire la catena. Come un validatore, il sequenziatore elabora le transazioni, produce i blocchi del rollup e invia le transazioni di rollup alla catena del L1 (Ethereum). +Alcuni rollup ottimistici possono rinunciare a un sistema di validatori senza permessi e utilizzare un singolo "sequenziatore" per eseguire la catena. Come un validatore, il sequenziatore elabora le transazioni, produce i blocchi del rollup e invia le transazioni del rollup alla catena L1 (Ethereum). -Il sequenziatore si distingue da un normale operatore di rollup perché ha un controllo maggiore sull'ordine delle transazioni. Inoltre, il sequenziatore ha accesso prioritario alla catena di rollup ed è l'unica entità autorizzata a inviare le transazioni al contratto on-chain. Le transazioni da nodi non del sequenziatore o da normali utenti sono semplicemente accodate in una casella di ricezione separata finché il sequenziatore non le include in un nuovo batch. +Il sequenziatore è diverso da un normale operatore di rollup perché ha un maggiore controllo sull'ordinamento delle transazioni. Inoltre, il sequenziatore ha accesso prioritario alla catena del rollup ed è l'unica entità autorizzata a inviare transazioni al contratto on-chain. Le transazioni provenienti da nodi non sequenziatori o da utenti normali vengono semplicemente messe in coda in una casella di posta separata finché il sequenziatore non le include in un nuovo lotto. -#### Inviare i blocchi di rollup a Ethereum {#submitting-blocks-to-ethereum} +#### Invio dei blocchi del rollup a Ethereum {#submitting-blocks-to-ethereum} -Come accennato, l'operatore di un rollup ottimistico raggruppa le transazioni off-chain in un batch e le invia a Ethereum per la notarizzazione. Questo procedimento comporta la compressione dei dati correlati alle transazioni e la loro pubblicazione su Ethereum come `calldata` o in blob. +Come accennato, l'operatore di un rollup ottimistico raggruppa le transazioni fuori catena in un lotto e lo invia a Ethereum per l'autenticazione. Questo processo prevede la compressione dei dati relativi alle transazioni e la loro pubblicazione su Ethereum come `calldata` o in blob. -`calldata` è un'area non modificabile e non persistente in un contratto intelligente, che si comporta prevalentemente come una [memoria](/developers/docs/smart-contracts/anatomy/#memory). Mentre `calldata` persiste sulla catena come parte dei [registri storici](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) della blockchain, non è memorizzato come una parte dello statko di Ethereum. Poiché i `calldata` non toccano alcuna parte dello stato di Ethereum, sono più economici dello stato per memorizzare i dati sulla catena. +`calldata` è un'area non modificabile e non persistente in un contratto intelligente che si comporta per lo più come la [memoria](/developers/docs/smart-contracts/anatomy/#memory). Sebbene `calldata` persista on-chain come parte dei [registri storici](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) della blockchain, non viene archiviato come parte dello stato di Ethereum. Poiché `calldata` non tocca alcuna parte dello stato di Ethereum, è più economico dello stato per l'archiviazione dei dati on-chain. -La parola chiave `calldata` è anche usata in Solidity per passare gli argomenti alla funzione di un contratto intelligente al momento dell'esecuzione. `calldata` identifica la funzione chiamata durante una transazione e trattiene gli input della funzione nella forma di una sequenza arbitraria di byte. +La parola chiave `calldata` viene utilizzata anche in Solidity per passare argomenti a una funzione di un contratto intelligente al momento dell'esecuzione. `calldata` identifica la funzione chiamata durante una transazione e contiene gli input per la funzione sotto forma di una sequenza arbitraria di byte. -Nel contesto dei rollup ottimistici, `calldata` è usata per inviare dati di transazione compressi al contratto on-chain. L'operatore del rollup aggiunge un nuovo batch chiamando la funzione necessaria nel contratto di rollup e passando i dati compressi come argomenti della funzione. Usare `calldata` riduce le commissioni degli utenti poiché gran parte dei costi in cui incorrono i rollup provengono dalla memorizzazione dei dati sulla catena. +Nel contesto dei rollup ottimistici, `calldata` viene utilizzato per inviare i dati compressi delle transazioni al contratto on-chain. L'operatore del rollup aggiunge un nuovo lotto chiamando la funzione richiesta nel contratto del rollup e passando i dati compressi come argomenti della funzione. L'utilizzo di `calldata` riduce le commissioni per gli utenti poiché la maggior parte dei costi sostenuti dai rollup deriva dall'archiviazione dei dati on-chain. -Ecco [un esempio](https://etherscan.io/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) dell'invio di un batch del rollup per mostrare come funziona questo concetto. Il sequenziatore ha invocato il metodo `appendSequencerBatch()` e ha passato i dati della transazione compressi come input usando `calldata`. +Ecco [un esempio](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) di invio di un lotto di rollup per mostrare come funziona questo concetto. Il sequenziatore ha invocato il metodo `appendSequencerBatch()` e ha passato i dati compressi della transazione come input utilizzando `calldata`. -Alcuni rollup ora utilizzano i blob per pubblicare pacchetti di transazioni su Ethereum. +Alcuni rollup ora utilizzano i blob per pubblicare lotti di transazioni su Ethereum. -I blob non sono modificabili, né persistenti (proprio come `calldata`), ma sono rimossi dallo storico dopo circa 18 giorni. Per ulteriori informazioni sui blob, consulta [Danksharding](/roadmap/danksharding). +I blob sono non modificabili e non persistenti (proprio come `calldata`) ma vengono eliminati dalla cronologia dopo circa 18 giorni. Per ulteriori informazioni sui blob, consulta [Danksharding](/roadmap/danksharding). ### Impegni di stato {#state-commitments} -In qualsiasi momento, lo stato del rollup ottimistico (conti, saldi, codice del contratto, etc.) è organizzato come un [albero di Merkle](/whitepaper/#merkle-trees), detto "albero di stato". La radice di questo albero di Merkle (radice di stato), che fa riferimento all'ultimo stato del rollup, è associata a un hash ed è memorizzata nel contratto di rollup. Ogni transizione di stato sulla catena produce un nuovo stato del rollup, in cui un operatore si impegna calcolando una nuova radice di stato. +In qualsiasi momento, lo stato del rollup ottimistico (account, saldi, codice del contratto, ecc.) è organizzato come un [albero di Merkle](/whitepaper/#merkle-trees) chiamato "albero di stato". La radice di questo albero di Merkle (radice di stato), che fa riferimento all'ultimo stato del rollup, viene sottoposta a hash e archiviata nel contratto del rollup. Ogni transizione di stato sulla catena produce un nuovo stato del rollup, a cui un operatore si impegna calcolando una nuova radice di stato. -L'operatore deve inviare sia le vecchie radici di stato che quelle nuove quando pubblica i batch. Se la vecchia radice di stato corrisponde a quella esistente nel contratto on-chain, quest'ultima viene scartata e sostituita con quella nuova. +L'operatore è tenuto a inviare sia le vecchie radici di stato che le nuove radici di stato quando pubblica i lotti. Se la vecchia radice di stato corrisponde alla radice di stato esistente nel contratto on-chain, quest'ultima viene scartata e sostituita con la nuova radice di stato. -L'operatore del rollup deve anche creare una radice di Merkle per il batch di transazioni stesso. Questo consente a chiunque di provare l'inclusione di una transazione nel batch (sul L1) presentando una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/). +L'operatore del rollup è inoltre tenuto a impegnare una radice di Merkle per il lotto di transazioni stesso. Questo consente a chiunque di dimostrare l'inclusione di una transazione nel lotto (su L1) presentando una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/). -Gli impegni di stato, specialmente le radici di stato, sono necessari per provare la correttezza dei cambiamenti di stato in un rollup ottimistico. Il contratto di rollup accetta le nuove radici di stato dagli operatori immediatamente dopo la loro pubblicazione, ma può poi eliminare quelle non valide per ripristinare il rollup al suo stato corretto. +Gli impegni di stato, in particolare le radici di stato, sono necessari per dimostrare la correttezza dei cambiamenti di stato in un rollup ottimistico. Il contratto del rollup accetta nuove radici di stato dagli operatori immediatamente dopo la loro pubblicazione, ma può in seguito eliminare le radici di stato non valide per ripristinare il rollup al suo stato corretto. ### Prova di frode {#fraud-proving} -Come spiegato, i rollup ottimistici consentono a chiunque di pubblicare blocchi senza fornire prove di validità. Tuttavia, per assicurarsi che la catena rimanga sicura, i rollup ottimistici specificano una finestra temporale durante la quale chiunque può contestare una transizione di stato. Dunque, i blocchi del rollup sono detti "asserzioni", poiché chiunque può contestarne la validità. +Come spiegato, i rollup ottimistici consentono a chiunque di pubblicare blocchi senza fornire prove di validità. Tuttavia, per garantire che la catena rimanga sicura, i rollup ottimistici specificano una finestra temporale durante la quale chiunque può contestare una transizione di stato. Pertanto, i blocchi del rollup sono chiamati "asserzioni" poiché chiunque può contestarne la validità. -Se qualcuno contesta un'asserzione, il protocollo del rollup avvierà il calcolo della prova di frode. Ogni tipo di prova di frode è interattivo: qualcuno deve pubblicare un'asserzione prima che un'altra persona possa contestarla. La differenza sta nel numero di cicli di interazione necessari per calcolare la prova di frode. +Se qualcuno contesta un'asserzione, il protocollo del rollup avvierà il calcolo della prova di frode. Ogni tipo di prova di frode è interattivo: qualcuno deve pubblicare un'asserzione prima che un'altra persona possa contestarla. La differenza sta nel numero di round di interazione necessari per calcolare la prova di frode. -Gli schemi di prova interattivi a turno singolo riproducono le transazioni oggetto di contestazione sul L1 per rilevare le asserzioni non valide. Il protocollo di rollup emula la ri-esecuzione della transazione oggetto di contestazione sul L1 (Ethereum) usando un contratto di verifica, con la radice di stato calcolata che determina chi vince la contestazione. Se il reclamo dell'autore della contestazione sullo stato del rollup è corretto, l'operatore è sanzionato tramite la decurtazione della sua cauzione. +Gli schemi di prova interattiva a round singolo riproducono le transazioni contestate su L1 per rilevare asserzioni non valide. Il protocollo del rollup emula la riesecuzione della transazione contestata su L1 (Ethereum) utilizzando un contratto verificatore, con la radice di stato calcolata che determina chi vince la sfida. Se l'affermazione dello sfidante sullo stato corretto del rollup è corretta, l'operatore viene penalizzato vedendo la propria cauzione punita. -Tuttavia, ri-eseguire le transazioni sul L1 per rilevare la frode richiede la pubblicazione degli impegni di stato per le singole transazioni e aumenta i dati che i rollup devono pubblicare sulla catena. Anche la riproduzione delle transazioni comporta significativi costi del gas. Per questo, i rollup ottimistici stanno passando alla prova interattiva su più turni, che raggiunge lo stesso obiettivo (cioè, rilevare le operazioni di rollup non valide) con maggiore efficienza. +Tuttavia, la riesecuzione delle transazioni su L1 per rilevare le frodi richiede la pubblicazione di impegni di stato per le singole transazioni e aumenta i dati che i rollup devono pubblicare on-chain. La riproduzione delle transazioni comporta anche costi del gas significativi. Per questi motivi, i rollup ottimistici stanno passando alla prova interattiva multi-round, che raggiunge lo stesso obiettivo (cioè, rilevare operazioni di rollup non valide) con maggiore efficienza. -#### Prova interattiva multi-turno {#multi-round-interactive-proving} +#### Prova interattiva multi-round {#multi-round-interactive-proving} -La prova interattiva su più turni coinvolge un protocollo botta e risposta tra l'assertore e l'autore della contestazione, supervisionato da un contratto di verifica del L1, che decide infine la parte perdente. Dopo che un nodo del L2 contesta un'asserzione, l'assertore deve dividere l'asserzione constata in due metà uguali. Ogni asserzione individuale, in questo caso, conterrà tanti passaggi di calcolo quanto l'altra. +La prova interattiva multi-round prevede un protocollo di botta e risposta tra l'asseritore e lo sfidante supervisionato da un contratto verificatore L1, che alla fine decide quale sia la parte che mente. Dopo che un nodo L2 contesta un'asserzione, l'asseritore è tenuto a dividere l'asserzione contestata in due metà uguali. Ogni singola asserzione in questo caso conterrà tanti passaggi di calcolo quanti l'altra. -L'autore della contestazione sceglierà poi quale asserzione desidera contestare. Il processo di divisione (detto "protocollo di bisezione") prosegue finché entrambe le parti stanno contestando un'asserzione su una _singola_ fase dell'esecuzione. A questo punto, il contratto del L1 risolverà la disputa valutando l'istruzione (e il suo risultato) per identificare la parte fraudolenta. +Lo sfidante sceglierà quindi quale asserzione vuole contestare. Il processo di divisione (chiamato "protocollo di bisezione") continua finché entrambe le parti non contestano un'asserzione su un _singolo_ passaggio di esecuzione. A questo punto, il contratto L1 risolverà la controversia valutando l'istruzione (e il suo risultato) per catturare la parte fraudolenta. -L'assertore deve fornire una "prova di singola fase", verificando la validità del calcolo a singola fase contestato. Se l'assertore non riesce a fornire la prova di singola fase o il verificatore del L1 ritiene che la prova non sia valida, perde la contestazione. +L'asseritore è tenuto a fornire una "prova a un passaggio" che verifichi la validità del calcolo a singolo passaggio contestato. Se l'asseritore non riesce a fornire la prova a un passaggio, o il verificatore L1 ritiene la prova non valida, perde la sfida. Alcune note su questo tipo di prova di frode: -1. La prova di frode interattiva multi-turno è considerata efficiente perché minimizza il lavoro che la catena del L1 deve effettuare nell'arbitrato della disputa. Invece di riprodurre l'intera transazione, la catena del L1 deve eseguire nuovamente solo una fase nell'esecuzione del rollup. +1. La prova di frode interattiva multi-round è considerata efficiente perché riduce al minimo il lavoro che la catena L1 deve svolgere nell'arbitrato delle controversie. Invece di riprodurre l'intera transazione, la catena L1 deve solo rieseguire un passaggio nell'esecuzione del rollup. -2. I protocolli di bisezione riducono la quantità di dati pubblicati sulla catena (non serve pubblicare gli impegni di stato per ogni transazione). Inoltre, le transazioni del rollup ottimistico non sono vincolate dal limite di gas di Ethereum. Viceversa, i rollup ottimistici che ri-eseguono le transazioni devono assicurarsi che una transazione del L2 abbia un limite di gas inferiore per emularne l'esecuzione entro una singola transazione di Ethereum. +2. I protocolli di bisezione riducono la quantità di dati pubblicati on-chain (non è necessario pubblicare impegni di stato per ogni transazione). Inoltre, le transazioni dei rollup ottimistici non sono vincolate dal limite del gas di Ethereum. Al contrario, i rollup ottimistici che rieseguono le transazioni devono assicurarsi che una transazione L2 abbia un limite del gas inferiore per emulare la sua esecuzione all'interno di una singola transazione di Ethereum. -3. Parte della cauzione dell'assertore malevolo è assegnata all'autore della contestazione, mentre l'altra parte viene bruciata. La combustione previene la collusione tra validatori; se due validatori colludono per avviare delle contestazioni fasulle, perderanno comunque una parte considerevole dell'intero stake. +3. Parte della cauzione dell'asseritore malintenzionato viene assegnata allo sfidante, mentre l'altra parte viene bruciata. La bruciatura previene la collusione tra i validatori; se due validatori colludono per avviare sfide fasulle, perderanno comunque una parte considerevole dell'intero stake. -4. La prova interattiva multi-turno richiede che entrambe le parti (l'assertore e l'autore della contestazione) compiano mosse entro la finestra di tempo specificata. La mancata azione prima della scadenza causa la perdita della contestazione dalla parte inadempiente. +4. La prova interattiva multi-round richiede che entrambe le parti (l'asseritore e lo sfidante) facciano le loro mosse entro la finestra temporale specificata. La mancata azione prima della scadenza del termine fa sì che la parte inadempiente perda la sfida. -#### Perché le prove di frode contano per i rollup ottimistici {#fraud-proof-benefits} +#### Perché le prove di frode sono importanti per i rollup ottimistici {#fraud-proof-benefits} -Le prove di frode sono importanti perché facilitano la _finalità senza fiducia_ nei rollup ottimistici. La finalità senza fiducia è una qualità dei rollup ottimistici che garantisce che una transazione, purché valida, sarà poi confermata. +Le prove di frode sono importanti perché facilitano la _finalità senza fiducia_ nei rollup ottimistici. La finalità senza fiducia è una qualità dei rollup ottimistici che garantisce che una transazione, purché sia valida, verrà alla fine confermata. -I nodi malevoli possono provare a ritardare la conferma di un blocco del rollup valido avviando delle contestazioni false. Tuttavia, le prove di frode dimostreranno infine la validità del blocco di rollup e ne causeranno la conferma. +I nodi malintenzionati possono cercare di ritardare la conferma di un blocco di rollup valido avviando false sfide. Tuttavia, le prove di frode alla fine dimostreranno la validità del blocco del rollup e ne causeranno la conferma. -Questo si correla anche a un'altra proprietà di sicurezza dei rollup ottimistici: la validità della catena si basa sull'esistenza di _un_ nodo onesto. Il nodo onesto può far avanzare correttamente la catena pubblicando asserzioni valide o contestando quelle non valide. Indipendentemente dal caso, i nodi malevoli che ingaggiano contestazioni con il nodo onesto perderanno il proprio stake durante il processo di prova di frode. +Questo si collega anche a un'altra proprietà di sicurezza dei rollup ottimistici: la validità della catena si basa sull'esistenza di _un_ nodo onesto. Il nodo onesto può far avanzare correttamente la catena pubblicando asserzioni valide o contestando asserzioni non valide. In ogni caso, i nodi malintenzionati che entrano in controversia con il nodo onesto perderanno i loro stake durante il processo di prova di frode. -### Interoperabilità di L1/L2 {#l1-l2-interoperability} +### Interoperabilità L1/L2 {#l1-l2-interoperability} -I rollup ottimistici sono progettati per l'interoperabilità con la Rete principale di Ethereum e per consentire agli utenti di passare messaggi e dati arbitrari tra L1 e L2. Sono inoltre compatibili con l'EVM, quindi puoi portare le [dapp](/developers/docs/dapps/) esistenti al rollup ottimistico o creare nuove dapp usando gli strumenti di sviluppo di Ethereum. +I rollup ottimistici sono progettati per l'interoperabilità con la rete principale di Ethereum e consentono agli utenti di passare messaggi e dati arbitrari tra L1 e L2. Sono anche compatibili con l'EVM, quindi puoi portare le [dApp](/developers/docs/dapps/) esistenti sui rollup ottimistici o creare nuove dApp utilizzando gli strumenti di sviluppo di Ethereum. -#### 1. Spostamento di risorse {#asset-movement} +#### 1. Movimento degli asset {#asset-movement} -##### Accedere al rollup +##### Entrare nel rollup -Per usare un rollup ottimistico, gli utenti depositano ETH, token ERC-20 e altre risorse accettate nel contratto [ponte](/developers/docs/bridges/) del rollup sul L1. Il contratto ponte trasmetterà la transazione al L2, dove un importo di risorse equivalente è coniato e inviato all'indirizzo scelto dall'utente sul rollup ottimistico. +Per utilizzare un rollup ottimistico, gli utenti depositano ETH, token ERC-20 e altri asset accettati nel contratto [ponte](/developers/docs/bridges/) del rollup su L1. Il contratto ponte trasmetterà la transazione a L2, dove una quantità equivalente di asset viene coniata e inviata all'indirizzo scelto dall'utente sul rollup ottimistico. -Le transazioni generate dall'utente (come un deposito L1 > L2) sono solitamente accodate finché il sequenziatore non le invia nuovamente al contratto del rollup. Tuttavia, per preservare la resistenza alla censura, i rollup ottimistici consentono agli utenti di inviare una transazione direttamente al contratto di rollup on-chain se è stato ritardato oltre il tempo massimo consentito. +Le transazioni generate dagli utenti (come un deposito L1 > L2) vengono solitamente messe in coda finché il sequenziatore non le invia nuovamente al contratto del rollup. Tuttavia, per preservare la resistenza alla censura, i rollup ottimistici consentono agli utenti di inviare una transazione direttamente al contratto del rollup on-chain se è stata ritardata oltre il tempo massimo consentito. -Alcuni rollup ottimistici adottano un approccio più semplice per impedire che i sequenziatori censurino gli utenti. Qui, un blocco è definito da tutte le transazioni inviate al contratto del L1 dal blocco precedente (es. depositi) oltre alle transazioni elaborate sulla catena di rollup. Se un sequenziatore ignora una transazione del L1, pubblicherà la radice di stato errata (in modo dimostrabile); dunque, i sequenziatori non possono ritardare il messaggio generato dall'utente una volta pubblicati sul L1. +Alcuni rollup ottimistici adottano un approccio più diretto per impedire ai sequenziatori di censurare gli utenti. Qui, un blocco è definito da tutte le transazioni inviate al contratto L1 dal blocco precedente (ad es., i depositi) in aggiunta alle transazioni elaborate sulla catena del rollup. Se un sequenziatore ignora una transazione L1, pubblicherà la radice di stato (dimostrabilmente) sbagliata; pertanto, i sequenziatori non possono ritardare i messaggi generati dagli utenti una volta pubblicati su L1. ##### Uscire dal rollup -Il prelievo da un rollup ottimistico a Ethereum è più difficile a causa dello schema di prova di frode. Se un utente avvia una transazione L2 > L1 per prelevare i fondi in garanzia sul L1, devono attendere fino alla scadenza del periodo di contestazione, che dura circa sette giorni. Tuttavia, il processo di prelievo di per sé è abbastanza semplice. +Prelevare da un rollup ottimistico a Ethereum è più difficile a causa dello schema di prova di frode. Se un utente avvia una transazione L2 > L1 per prelevare fondi depositati in garanzia su L1, deve attendere che trascorra il periodo di contestazione, che dura circa sette giorni. Tuttavia, il processo di prelievo in sé è abbastanza semplice. -Dopo l'avvio della richiesta di prelievo sul rollup del L2, la transazione è inclusa nel batch successivo, mentre le risorse dell'utente sul rollup sono bruciate. Una volta pubblicato il batch su Ethereum, l'utente può calcolare una prova di Merkle per verificare l'inclusione della sua transazione di uscita nel blocco. Poi si tratta di attendere durante il periodo di ritardo per finalizzare la transazione sul L1 e prelevare i fondi alla Rete principale. +Dopo che la richiesta di prelievo è stata avviata sul rollup L2, la transazione viene inclusa nel lotto successivo, mentre gli asset dell'utente sul rollup vengono bruciati. Una volta che il lotto è pubblicato su Ethereum, l'utente può calcolare una prova di Merkle che verifica l'inclusione della sua transazione di uscita nel blocco. Quindi si tratta di attendere il periodo di ritardo per finalizzare la transazione su L1 e prelevare i fondi sulla rete principale. -Per evitare di attendere una settimana prima di prelevare i fondi a Ethereum, gli utenti dei rollup ottimistici possono impiegare un **fornitore di liquidità** (LP). Un fornitore di liquidità assume la proprietà di un prelievo del L2 in sospeso e paga l'utente sul L1 (in cambio di una commissione). +Per evitare di aspettare una settimana prima di prelevare fondi su Ethereum, gli utenti dei rollup ottimistici possono impiegare un **fornitore di liquidità** (LP). Un fornitore di liquidità assume la proprietà di un prelievo L2 in sospeso e paga l'utente su L1 (in cambio di una commissione). -I fornitori di liquidità possono verificare la validità della richiesta di prelievo dell'utente (eseguendo essi stessi la catena), prima di rilasciare i fondi. Così hanno la garanzia che la transazione sarà infine confermata (cioè, la finalità senza fiducia). +I fornitori di liquidità possono verificare la validità della richiesta di prelievo dell'utente (eseguendo loro stessi la catena) prima di rilasciare i fondi. In questo modo hanno la garanzia che la transazione verrà alla fine confermata (cioè, finalità senza fiducia). #### 2. Compatibilità con l'EVM {#evm-compatibility} -Per gli sviluppatori, il vantaggio dei rollup ottimistici è la loro compatibilità, o ancora meglio, equivalenza, con la [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/). I rollup compatibili con l'EVM soddisfano le specifiche nel [Yellow Paper di Ethereum](https://ethereum.github.io/yellowpaper/paper.pdf) e supportano l'EVM al livello del cobytecode. +Per gli sviluppatori, il vantaggio dei rollup ottimistici è la loro compatibilità, o meglio ancora, equivalenza, con la [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/). I rollup compatibili con l'EVM sono conformi alle specifiche dell'[Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) e supportano l'EVM a livello di bytecode. -La compatibilità dell'EVM nei rollup ottimistici ha i seguenti vantaggi: +La compatibilità con l'EVM nei rollup ottimistici ha i seguenti vantaggi: -i. Gli sviluppatori possono migrare i contratti intelligenti esistenti su Ethereum alle catene dei rollup ottimistici senza dover estensivamente modificare le basi di codice. Questo può far risparmiare tempo ai team di sviluppo durante la distribuzione dei contratti intelligenti di Ethereum sul L2. +i. Gli sviluppatori possono migrare i contratti intelligenti esistenti su Ethereum verso le catene dei rollup ottimistici senza dover modificare ampiamente le basi di codice. Questo può far risparmiare tempo ai team di sviluppo durante la distribuzione di contratti intelligenti di Ethereum su L2. -ii. I team di sviluppatori e di progetto che usano i rollup ottimistici possono trarre vantaggio dall'infrastruttura di Ethereum. Questo include linguaggi di programmazione, librerie di codice, strumenti di test, software del client, infrastruttura di distribuzione e così via. +ii. Gli sviluppatori e i team di progetto che utilizzano i rollup ottimistici possono trarre vantaggio dall'infrastruttura di Ethereum. Questo include linguaggi di programmazione, librerie di codice, strumenti di test, software client, infrastruttura di distribuzione e così via. -Usare gli strumenti esistenti è importante perché questi sono stati ampiamente controllati, debuggati e migliorati negli anni. Rimuove inoltre la necessità per gli sviluppatori di Ethereum di imparare a costruire con uno stack di sviluppo interamente nuovo. +L'utilizzo degli strumenti esistenti è importante perché questi strumenti sono stati ampiamente controllati, sottoposti a debug e migliorati nel corso degli anni. Rimuove anche la necessità per gli sviluppatori di Ethereum di imparare a costruire con uno stack di sviluppo completamente nuovo. -#### 3. Chiamate del contratto tra catene {#cross-chain-contract-calls} +#### 3. Chiamate di contratto cross-chain {#cross-chain-contract-calls} -Gli utenti (conti posseduti esternamente), interagiscono con i contratti del L2, inviando una transazione al contratto di rollup o faceendolo fare da un sequenziatore o un validatore. I rollup ottimistici, inoltre, consentono ai conti dei contratti su Ethereum di interagire con i contratti del L2, usando i contratti di collegamento per trasmettere messaggi e passare i dati dal L1 al L2. Questo significa che puoi programmare un contratto del L1 sulla Rete principale di Ethereum affinché invochi funzioni appartenenti a contratti su un rollup ottimistico del L2. +Gli utenti (account controllati esternamente) interagiscono con i contratti L2 inviando una transazione al contratto del rollup o facendolo fare a un sequenziatore o a un validatore per loro. I rollup ottimistici consentono anche agli account di contratto su Ethereum di interagire con i contratti L2 utilizzando contratti ponte per trasmettere messaggi e passare dati tra L1 e L2. Questo significa che puoi programmare un contratto L1 sulla rete principale di Ethereum per invocare funzioni appartenenti a contratti su un rollup ottimistico L2. -Le chiamate del contratto tra catene si verificano in modo asincrono, il che significa che la chiamata è prima avviata e in seguito eseguita. Questo differisce dalle chiamate tra i due contratti su Ethereum, in cui la chiamata produce risultati immediatamente. +Le chiamate di contratto cross-chain avvengono in modo asincrono, il che significa che la chiamata viene prima avviata e poi eseguita in un secondo momento. Questo è diverso dalle chiamate tra due contratti su Ethereum, dove la chiamata produce risultati immediatamente. -Un esempio di chiamata del contratto tra catene è il deposito di token descritto precedentemente. Un contratto sul L1 mette in garanzia i token dell'utente e invia un messaggio a un contratto del L2 associato per coniare una quantità equivalente di token sul rollup. +Un esempio di chiamata di contratto cross-chain è il deposito di token descritto in precedenza. Un contratto su L1 deposita in garanzia i token dell'utente e invia un messaggio a un contratto L2 accoppiato per coniare una quantità uguale di token sul rollup. -Poiché le chiamate del messaggio tra catene risultano nell'esecuzione del contratto, il mittente deve solitamente coprire i [costi del gas](/developers/docs/gas/) per il calcolo. Si consiglia di impostare un limite di gas elevato, per impedire alla transazione di fallire sulla catena di destinazione. Lo scenario di collegamento dei token è un buon esempio; se il lato del L1 della transazione (deposito del token) funziona, ma il lato dedl L2 (conio dei nuovi token) fallisce a causa del poco gas, il deposito diventa irrecuperabile. +Poiché le chiamate di messaggi cross-chain comportano l'esecuzione del contratto, al mittente è solitamente richiesto di coprire i [costi del gas](/developers/docs/gas/) per il calcolo. È consigliabile impostare un limite del gas elevato per evitare che la transazione fallisca sulla catena di destinazione. Lo scenario del ponte dei token è un buon esempio; se il lato L1 della transazione (il deposito dei token) funziona, ma il lato L2 (la coniazione di nuovi token) fallisce a causa del gas insufficiente, il deposito diventa irrecuperabile. -Infine, dovremmo notare che le chiamate di messaggio dal L2 al L1 tra i contratti, devono tenere conto dei ritardi (Le chiamate dal L1 al L2 sono tipicamente eseguite dopo qualche minuto). Questo perché i messaggi inviati alla Rete principale dai rollup ottimistici non possono essere eseguiti fino alla scadenza della finestra di contestazione. +Infine, dovremmo notare che le chiamate di messaggi L2 > L1 tra contratti devono tenere conto dei ritardi (le chiamate L1 > L2 vengono in genere eseguite dopo alcuni minuti). Questo perché i messaggi inviati alla rete principale dal rollup ottimistico non possono essere eseguiti finché non scade la finestra di contestazione. ## Come funzionano le commissioni dei rollup ottimistici? {#how-do-optimistic-rollup-fees-work} -I rollup ottimistici usano uno schema di commissioni sul gas, molto simile a Ethereum, per denotare quanto gli utenti pagano per la transazione. Le commissioni addebitate sui rollup ottimistici dipendono dai seguenti componenti: +I rollup ottimistici utilizzano uno schema di commissioni del gas, molto simile a Ethereum, per indicare quanto pagano gli utenti per transazione. Le commissioni addebitate sui rollup ottimistici dipendono dai seguenti componenti: -1. **Scrittura di stato**: i rollup ottimistici pubblicano i dati delle transazioni e le intestazioni dei blocchi (consistenti in: hash dell'intestazione del blocco precedente, radice di stato, radice del batch) su Ethereum come `blob`, o "oggetto binario di grandi dimensioni". [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) ha introdotto una soluzione economica per includere i dati on-chain. Un `blob` è un nuovo campo di transazione che consente ai rollup di pubblicare dati compressi sulle transizioni tra stati sul L1 di Ethereum. A differenza dei `calldata`, che rimangono permanentemente on-chain, i blob sono di breve durata e possono essere eliminati dai client dopo [4096 epoche](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (circa 18 giorni). Utilizzando i blob per pubblicare batch di transazioni compresse, i rollup ottimistici possono ridurre significativamente il costo di scrittura delle transazioni nel L1. +1. **Scrittura dello stato**: I rollup ottimistici pubblicano i dati delle transazioni e le intestazioni dei blocchi (costituiti dall'hash dell'intestazione del blocco precedente, dalla radice di stato, dalla radice del lotto) su Ethereum come `blob`, o "binary large object". L'[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) ha introdotto una soluzione economica per includere i dati on-chain. Un `blob` è un nuovo campo di transazione che consente ai rollup di pubblicare dati compressi di transizione di stato su Ethereum L1. A differenza di `calldata`, che rimane permanentemente on-chain, i blob hanno vita breve e possono essere eliminati dai client dopo [4096 epoche](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (circa 18 giorni). Utilizzando i blob per pubblicare lotti di transazioni compresse, i rollup ottimistici possono ridurre significativamente il costo di scrittura delle transazioni su L1. -2. **Gas del blob utilizzato**: le transazioni che trasportano blob utilizzano un meccanismo di commissione dinamica simile a quello introdotto da [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). La commissione sul gas per le transazioni di tipo 3 tiene conto della commissione di base per i blob, che è determinata dalla rete in base alla domanda di spazio blob e all'utilizzo dello spazio blob della transazione inviata. +2. **Gas del blob utilizzato**: Le transazioni che trasportano blob impiegano un meccanismo di commissione dinamica simile a quello introdotto dall'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559). La commissione per le transazioni di tipo 3 tiene conto della commissione di base per i blob, che è determinata dalla rete in base alla domanda di spazio per i blob e all'utilizzo dello spazio per i blob della transazione inviata. -3. **Commissioni dell'operatore del L2**: questo è l'importo pagato al nodo del rollup come compenso per i costi di calcolo sostenuti nell'elaborazione delle transazioni, proprio come le commissioni sul carburante su Ethereum. I nodi del rollup addebitano commissioni di transazione inferiori, poiché gli L2 hanno capacità di elaborazione maggiori e non affrontano congestioni di rete che forzano i validatori su Ethereum a dare priorità alle transazioni con commissioni maggiori. +3. **Commissioni dell'operatore L2**: Questo è l'importo pagato ai nodi del rollup come compenso per i costi di calcolo sostenuti nell'elaborazione delle transazioni, in modo molto simile alle commissioni su Ethereum. I nodi del rollup addebitano commissioni della transazione inferiori poiché gli L2 hanno capacità di elaborazione più elevate e non devono affrontare le congestioni di rete che costringono i validatori su Ethereum a dare priorità alle transazioni con commissioni più elevate. -I rollup ottimistici applicano diversi meccanismi per ridurre le commissioni per gli utenti, inclusi il raggruppamento delle transazioni e la compressione dei `calldata` per ridurre i costi di pubblicazione dei dati. Puoi controllare il [tracker delle commissioni del L2](https://l2fees.info/) per una panoramica in tempo reale dei costi d'uso dei rollup ottimistici basati su Ethereum. +I rollup ottimistici applicano diversi meccanismi per ridurre le commissioni per gli utenti, tra cui il raggruppamento delle transazioni e la compressione di `calldata` per ridurre i costi di pubblicazione dei dati. Puoi controllare il [tracker delle commissioni L2](https://l2fees.info/) per una panoramica in tempo reale di quanto costa utilizzare i rollup ottimistici basati su Ethereum. -## Come fanno i rollup ottimistici a ridimensionare Ethereum? {#scaling-ethereum-with-optimistic-rollups} +## In che modo i rollup ottimistici scalano Ethereum? {#scaling-ethereum-with-optimistic-rollups} -Come spiegato, i rollup ottimistici pubblicano i dati delle transazioni compressi su Ethereum per garantire la disponibilità dei dati. La possibilità di comprimere i dati pubblicati sulla catena è essenziale per ridimensionare il volume su Ethereum coi rollup ottimistici. +Come spiegato, i rollup ottimistici pubblicano dati compressi delle transazioni su Ethereum per garantire la disponibilità dei dati. La capacità di comprimere i dati pubblicati on-chain è fondamentale per scalare il throughput su Ethereum con i rollup ottimistici. -La catena principale di Ethereum pone limiti su quanti dati possono esser contenuti dai blocchi, denominati in unità di gas (la [dimensione media del blocco](/developers/docs/blocks/#block-size) è di 15 milioni di gas). Mentre ciò limita quanto gas è utilizzabile da ogni transazione, significa anche che possiamo aumentare le transazioni elaborate per blocco, riducendo i dati relativi alla transazione e migliorando direttamente la scalabilità. +La catena principale di Ethereum pone dei limiti alla quantità di dati che i blocchi possono contenere, denominati in unità di gas (la [dimensione media del blocco](/developers/docs/blocks/#block-size) è di 15 milioni di gas). Sebbene questo limiti la quantità di gas che ogni transazione può utilizzare, significa anche che possiamo aumentare le transazioni elaborate per blocco riducendo i dati relativi alle transazioni, migliorando direttamente la scalabilità. -I rollup ottimistici usano diverse tecniche per ottenere la compressione dei dati di transazione e migliorare i tassi TPS. Ad esempio, questo [articolo](https://vitalik.eth.limo/general/2021/01/05/rollup.html) confronta i dati generati da una transazione di base dell'utente (invio di ether) sulla Rete Principale con i dati generati dalla stessa transazione su un rollup: +I rollup ottimistici utilizzano diverse tecniche per ottenere la compressione dei dati delle transazioni e migliorare i tassi di TPS. Ad esempio, questo [articolo](https://vitalik.eth.limo/general/2021/01/05/rollup.html) confronta i dati che una transazione utente di base (l'invio di ether) genera sulla rete principale rispetto a quanti dati la stessa transazione genera su un rollup: -| Parametro | Ethereum (L1) | Rollup (L2) | -| ---------- | --------------------- | ------------ | -| Nonce | ~3 | 0 | -| Gasprice | ~8 | 0-0.5 | -| Gas | 3 | 0-0.5 | -| A | 21 | 4 | -| Valore | 9 | ~3 | -| Firma | ~68 (2 + 33 + 33) | ~0.5 | -| Da | 0 (recuperato da sig) | 4 | -| **Totale** | **~112 byte** | **~12 byte** | +| Parametro | Ethereum (L1) | Rollup (L2) | +| --------- | ---------------------- | ------------- | +| Nonce | ~3 | 0 | +| Gasprice | ~8 | 0-0.5 | +| Gas | 3 | 0-0.5 | +| To | 21 | 4 | +| Value | 9 | ~3 | +| Signature | ~68 (2 + 33 + 33) | ~0.5 | +| From | 0 (recuperato dalla firma) | 4 | +| **Totale** | **\~112 byte** | **\~12 byte** | -Fare qualche calcolo approssimativo su queste cifre può aiutare a mostrare i miglioramenti della scalabilità derivati da un rollup ottimistico: +Fare alcuni calcoli approssimativi su queste cifre può aiutare a mostrare i miglioramenti di scalabilità offerti da un rollup ottimistico: -1. Le dimensioni obiettivo per ogni blocco sono di 15 milioni di gas e, verificare un byte di dati, costa 16 gas. Dividere la dimensione media del blocco per 16 gas (15.000.000/16), mostra che il blocco medio può contenere **937.500 byte di dati**. -2. Se una transazione del rollup di base usa 12 byte, allora il blocco medio di Ethereum può elaborare **78.125 transazioni di rollup** (937.500/12) o **39 batch di rollup** (se ogni batch contiene una media di 2.000 transazioni). -3. Se un nuovo blocco è prodotto su Ethereum ogni 15 secondi, allora le velocità di elaborazione del rollup ammonterebbero approssimativamente a **5.208 transazioni al secondo**. Ciò avviene dividendo il numero di transazioni di rollup di base che un blocco di Ethereum può contenere (**78.125**) per il tempo medio del blocco (**15 secondi**). +1. La dimensione target per ogni blocco è di 15 milioni di gas e costa 16 gas verificare un byte di dati. Dividendo la dimensione media del blocco per 16 gas (15.000.000/16) si evince che il blocco medio può contenere **937.500 byte di dati**. +2. Se una transazione di rollup di base utilizza 12 byte, il blocco medio di Ethereum può elaborare **78.125 transazioni di rollup** (937.500/12) o **39 lotti di rollup** (se ogni lotto contiene in media 2.000 transazioni). +3. Se un nuovo blocco viene prodotto su Ethereum ogni 15 secondi, le velocità di elaborazione del rollup ammonterebbero a circa **5.208 transazioni al secondo**. Questo si ottiene dividendo il numero di transazioni di rollup di base che un blocco di Ethereum può contenere (**78.125**) per il tempo medio del blocco (**15 secondi**). -Questa è una stima piuttosto ottimistica, dato che le transazioni del rollup ottimistico non possono verosimilmente comprendere un intero blocco su Ethereum. Tuttavia, può dare un'idea approssimativa di quanti guadagni in termini di scalabilità i rollup ottimistici possono offrire agli utenti di Ethereum (le implementazioni correnti offrono fino a 2.000 TPS). +Questa è una stima abbastanza ottimistica, dato che le transazioni dei rollup ottimistici non possono in alcun modo comprendere un intero blocco su Ethereum. Tuttavia, può dare un'idea approssimativa di quanti guadagni in termini di scalabilità i rollup ottimistici possono offrire agli utenti di Ethereum (le implementazioni attuali offrono fino a 2.000 TPS). -L'introduzione dello [sharding dei dati](/roadmap/danksharding/) su Ethereum dovrebbe migliorare la scalabilità nei rollup ottimistici. Poiché le transazioni del rollup devono condividere lo spazio del blocco con altre transazioni non del rollup, la loro capacità di elaborazione è limitata dal volume di dati sulla catena principale di Ethereum. Il danksharding aumenterà lo spazio disponibile alle catene L2 per pubblicare i dati per blocco, utilizzando un'archiviazione a "blob" più economica e non permanente, invece di costosi `CALLDATA` permanenti. +L'introduzione della [frammentazione dei dati](/roadmap/danksharding/) su Ethereum dovrebbe migliorare la scalabilità nei rollup ottimistici. Poiché le transazioni dei rollup devono condividere lo spazio del blocco con altre transazioni non di rollup, la loro capacità di elaborazione è limitata dal throughput dei dati sulla catena principale di Ethereum. Il Danksharding aumenterà lo spazio disponibile per le catene L2 per pubblicare dati per blocco, utilizzando l'archiviazione "blob" più economica e non permanente invece del costoso e permanente `CALLDATA`. ### Pro e contro dei rollup ottimistici {#optimistic-rollups-pros-and-cons} -| Pro | Contro | -| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Offre enormi miglioramenti in termini di scalabilità senza sacrificare la sicurezza o la mancanza di fiducia. | Ritardi nella finalità della transazione a causa di potenziali contestazioni di frodi. | -| I dati della transazione sono memorizzati sulla catena del livello 1, migliorando trasparenza, sicurezza, resistenza alla censura e decentralizzazione. | Gli operatori di rollup centralizzati (sequenziatori) possono influenzare l'ordine delle transazioni. | -| La prova di frode garantisce la finalità senza fiducia e consente alle minoranze oneste di proteggere la catena. | Se non esistessero nodi onesti, un operatore malevolo potrebbe rubare i fondi pubblicando blocchi e impegni di stato non validi. | -| Il calcolo delle prove di frode è aperto al nodo regolare del L2, a differenza delle prove di validità (usate nei rollup ZK), che richiedono hardware speciale. | Il modello di sicurezza si basa su almeno un nodo onesto che esegue le transazioni di rollup e invia le prove di frode per contestare le transizioni di stato non valide. | -| I rollup traggono vantaggio dalla "liveness senza fiducia" (chiunque può forzare la catena ad avanzare eseguendo transazioni e pubblicando asserzioni) | Gli utenti devono attendere che scada il periodo di contestazione di una settimana prima di prelevare nuovamente i fondi su Ethereum. | -| I rollup ottimistici si affidano a incentivi cripto-economici ben progettati, per aumentare la sicurezza sulla catena. | I rollup devono pubblicare tutti i dati delle transazioni su catena, il che può aumentare i costi. | -| La compatibilità con l'EVM e Solidity consente agli sviluppatori di portare i contratti intelligenti nativi di Ethereum ai rollup o di usare strumenti esistenti per creare nuove dapp. | | +| Pro | Contro | +| --- | --- | +| Offre enormi miglioramenti nella scalabilità senza sacrificare la sicurezza o l'assenza di fiducia. | Ritardi nella finalità della transazione a causa di potenziali sfide di frode. | +| I dati delle transazioni sono archiviati sulla catena di livello 1, migliorando la trasparenza, la sicurezza, la resistenza alla censura e la decentralizzazione. | Gli operatori centralizzati del rollup (sequenziatori) possono influenzare l'ordinamento delle transazioni. | +| La prova di frode garantisce la finalità senza fiducia e consente alle minoranze oneste di proteggere la catena. | Se non ci sono nodi onesti, un operatore malintenzionato può rubare fondi pubblicando blocchi e impegni di stato non validi. | +| Il calcolo delle prove di frode è aperto ai normali nodi L2, a differenza delle prove di validità (utilizzate nei rollup a conoscenza zero) che richiedono hardware speciale. | Il modello di sicurezza si basa su almeno un nodo onesto che esegue le transazioni del rollup e invia prove di frode per contestare transazioni di stato non valide. | +| I rollup beneficiano della "vivacità senza fiducia" (chiunque può forzare l'avanzamento della catena eseguendo transazioni e pubblicando asserzioni). | Gli utenti devono attendere la scadenza del periodo di contestazione di una settimana prima di prelevare i fondi su Ethereum. | +| I rollup ottimistici si affidano a incentivi crittoeconomici ben progettati per aumentare la sicurezza sulla catena. | I rollup devono pubblicare tutti i dati delle transazioni on-chain, il che può aumentare i costi. | +| La compatibilità con l'EVM e Solidity consente agli sviluppatori di portare i contratti intelligenti nativi di Ethereum sui rollup o di utilizzare gli strumenti esistenti per creare nuove dApp. | | ### Una spiegazione visiva dei rollup ottimistici {#optimistic-video} -Preferisci un approccio visivo all'apprendimento? Guarda Finematics spiegare i rollup ottimistici: +Preferisci imparare visivamente? Guarda Finematics che spiega i rollup ottimistici: ## Ulteriori letture sui rollup ottimistici -- [Come funzionano gli Optimistic Rollup (La guida completa)](https://www.alchemy.com/overviews/optimistic-rollups) -- [Cos'è un rollup della blockchain? Un'introduzione tecnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) -- [Guida essenziale ad Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) +- [Come funzionano i rollup ottimistici (La guida completa)](https://www.alchemy.com/overviews/optimistic-rollups) +- [Cos'è un rollup blockchain? Un'introduzione tecnica](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) +- [La guida essenziale ad Arbitrum](https://www.bankless.com/the-essential-guide-to-arbitrum) +- [La guida pratica ai rollup di Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [Lo stato delle prove di frode negli L2 di Ethereum](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s) - [Come funziona davvero il rollup di Optimism?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) -- [Approfondimento su OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) -- [What is the Optimistic Virtual Machine?](https://www.alchemy.com/overviews/optimistic-virtual-machine) +- [Approfondimento sull'OVM](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) +- [Cos'è la macchina virtuale ottimistica?](https://www.alchemy.com/overviews/optimistic-virtual-machine) + +## Tutorial: Rollup ottimistici e ponti su Ethereum {#tutorials} + +- [Analisi del contratto ponte standard di Optimism](/developers/tutorials/optimism-std-bridge-annotated-code/) _– Un'analisi del codice annotato del ponte standard di Optimism per lo spostamento di asset tra L1 e L2._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/plasma/index.md b/public/content/translations/it/developers/docs/scaling/plasma/index.md index 67acee07f30..cadb4b95b64 100644 --- a/public/content/translations/it/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/it/developers/docs/scaling/plasma/index.md @@ -1,175 +1,180 @@ --- -title: Catene plasma -description: Un'introduzione alle catene plasma come soluzione di scalabilità, attualmente utilizzata dalla comunità Ethereum. +title: Catene Plasma +description: "Un'introduzione alle catene Plasma come soluzione di scalabilità attualmente utilizzata dalla community di Ethereum." lang: it incomplete: true sidebarDepth: 3 --- -Una catena Plasma è una blockchain separata collegata alla Rete principale di Ethereum ma che esegue le transazioni al di fuori della catena con il proprio meccanismo di validazione del blocco. Le catene Plasma sono solitamente note come catene "figlio", essenzialmente copie più piccole della Rete principale di Ethereum. Le catene Plasma usano le [prove di frode](/glossary/#fraud-proof) (come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/)) per arbitrare le dispute. +Una catena Plasma è una blockchain separata ancorata alla rete principale (Mainnet) di [Ethereum](/) ma che esegue transazioni fuori catena con il proprio meccanismo per la convalida dei blocchi. Le catene Plasma sono a volte chiamate catene "figlie", essenzialmente copie più piccole della rete principale di Ethereum. Le catene Plasma usano le [prove di frode](/glossary/#fraud-proof) (come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/)) per arbitrare le dispute. -Gli alberi di Merkle consentono la creazione di una pila illimitata di queste catene che possono funzionare per scaricare la larghezza di banda dalle catene padre (inclusa la Rete principale di Ethereum). Tuttavia, benché queste catene derivino una certa sicurezza da Ethereum (tramite le prove di frode), la loro sicurezza ed efficienza sono influenzate da numerose limitazioni di progettazione. +Gli alberi di Merkle consentono la creazione di una pila infinita di queste catene che possono lavorare per scaricare la larghezza di banda dalle catene madri (inclusa la rete principale di Ethereum). Tuttavia, sebbene queste catene derivino una certa sicurezza da Ethereum (tramite le prove di frode), la loro sicurezza ed efficienza sono influenzate da diverse limitazioni di progettazione. ## Prerequisiti {#prerequisites} -Dovresti avere una buona conoscenza di tutti gli argomenti fondamentali e una comprensione di alto livello del [ridimensionamento di Ethereum](/developers/docs/scaling/). +Dovresti avere una buona comprensione di tutti gli argomenti fondamentali e una comprensione ad alto livello della [scalabilità di Ethereum](/developers/docs/scaling/). ## Cos'è Plasma? -Plasma è un quadro per migliorare la scalabilità nelle blockchain pubbliche come Ethereum. Come descritto nel [whitepaper di Plasma](http://plasma.io/plasma.pdf) originale, le catene Plasma sono costruite su un'altra blockchain (detta "catena radice"). Ogni "catena figlia" si estende dalla catena di radice ed è generalmente gestita da un contratto intelligente, distribuito sulla catena madre. +Plasma è un framework per migliorare la scalabilità nelle blockchain pubbliche come Ethereum. Come descritto nel [whitepaper originale di Plasma](http://plasma.io/plasma.pdf), le catene Plasma sono costruite sopra un'altra blockchain (chiamata "catena radice"). Ogni "catena figlia" si estende dalla catena radice ed è generalmente gestita da un contratto intelligente distribuito sulla catena madre. -Le funzioni del contratto Plasma, tra le altre cose, fungono da [ponte](/developers/docs/bridges/), consentendo agli utenti di spostare risorse tra la Rete principale di Ethereum e la catena Plasma. Sebbene questo le renda simili alle [sidechain](/developers/docs/scaling/sidechains/), le catene Plasma beneficiano, almeno in una certa misura, della sicurezza della Rete principale di Ethereum. Questo le distingue dalle sidechain, che sono le uniche responsabili della propria sicurezza. +Il contratto Plasma funziona, tra le altre cose, come un [ponte](/developers/docs/bridges/) che consente agli utenti di spostare risorse tra la rete principale di Ethereum e la catena Plasma. Sebbene questo le renda simili alle [catene laterali](/developers/docs/scaling/sidechains/), le catene Plasma beneficiano, almeno in una certa misura, della sicurezza della rete principale di Ethereum. Questo a differenza delle catene laterali che sono le uniche responsabili della propria sicurezza. ## Come funziona Plasma? -I componenti di base del quadro Plasma sono: +I componenti di base del framework Plasma sono: -### Calcolo off-chain {#off-chain-computation} +### Calcolo fuori catena {#offchain-computation} -La velocità di elaborazione attuale di Ethereum è limitata a circa 15-20 transazioni al secondo, riducendo la possibilità a breve termine di ridimensionamento per gestire più utenti. Questo problema esiste principalmente perché il [meccanismo di consenso](/developers/docs/consensus-mechanisms/) di Ethereum richiede molti nodi peer-to-peer per verificare ogni aggiornamento allo stato della blockchain. +L'attuale velocità di elaborazione di Ethereum è limitata a circa 15-20 transazioni al secondo, riducendo la possibilità a breve termine di scalabilità per gestire più utenti. Questo problema esiste principalmente perché il [meccanismo di consenso](/developers/docs/consensus-mechanisms/) di Ethereum richiede che molti nodi peer-to-peer verifichino ogni aggiornamento allo stato della blockchain. -Sebbene il meccanismo di consenso di Ethereum sia necessario per la sicurezza, potrebbe non applicarsi a ogni caso d'uso. Ad esempio, Alice potrebbe non aver bisogno dei suoi pagamenti giornalieri a Bob per una tazza di caffè verificata dall'intera rete di Ethereum, poiché esiste una certa fiducia tra entrambe le parti. +Sebbene il meccanismo di consenso di Ethereum sia necessario per la sicurezza, potrebbe non applicarsi a ogni caso d'uso. Ad esempio, Alice potrebbe non aver bisogno che i suoi pagamenti quotidiani a Bob per una tazza di caffè siano verificati dall'intera rete di Ethereum, poiché esiste una certa fiducia tra le due parti. -Plasma suppone che la Rete principale di Ethereum non necessiti di verificare tutte le transazioni. Invece, possiamo elaborare transazioni al di fuori della Rete principale, liberando i nodi dall'obbligo di convalidare ogni transazione. +Plasma suppone che la rete principale di Ethereum non debba verificare tutte le transazioni. Invece, possiamo elaborare le transazioni fuori dalla rete principale, liberando i nodi dal dover convalidare ogni transazione. -Il calcolo off-chain è necessario perché le catene Plasma possono sfruttare al meglio velocità e costo. Ad esempio, una catena Plasma potrebbe usare, e molto spesso usa, un singolo "operatore" per gestire l'ordine e l'esecuzione delle transazioni. Con una sola entità che verifica le transazioni, i tempi di elaborazione su una catena Plasma sono più veloci sulla Rete principale di Ethereum. +Il calcolo fuori catena è necessario poiché le catene Plasma possono ottimizzare velocità e costi. Ad esempio, una catena Plasma può usare, e molto spesso lo fa, un singolo "operatore" per gestire l'ordinamento e l'esecuzione delle transazioni. Con una sola entità che verifica le transazioni, i tempi di elaborazione su una catena Plasma sono più rapidi rispetto alla rete principale di Ethereum. ### Impegni di stato {#state-commitments} -Sebbene Plasma esegua le transazioni al di fuori della catena, queste sono regolate sul livello di esecuzione principale di Ethereum; in caso contrario, le catene Plasma non potrebbero trarre vantaggio dalle garanzie di sicurezza di Ethereum. Ma finalizzare le transazioni off-chain senza conoscere lo stato della catena Plasma corromperebbe il modello di sicurezza e consentirebbe la proliferazione di transazioni non valide. Per questo l'operatore, l'entità responsabile della produzione dei blocchi sulla catena Plasma deve pubblicare periodicamente degli "impegni di stato" su Ethereum. +Mentre Plasma esegue le transazioni fuori catena, queste vengono regolate sul livello di esecuzione principale di Ethereum; altrimenti, le catene Plasma non potrebbero beneficiare delle garanzie di sicurezza di Ethereum. Ma finalizzare le transazioni fuori catena senza conoscere lo stato della catena Plasma romperebbe il modello di sicurezza e consentirebbe la proliferazione di transazioni non valide. Questo è il motivo per cui l'operatore, l'entità responsabile della produzione dei blocchi sulla catena Plasma, è tenuto a pubblicare periodicamente "impegni di stato" su Ethereum. -Uno [schema di impegno](https://en.wikipedia.org/wiki/Commitment_scheme) è una tecnica crittografica per assumersi l'impegno verso un valore o istruzione senza rivelarla all'altra parte. Gli impegni sono "vincolanti" nel senso che non puoi cambiare il valore o l'istruzione una volta che te ne sei assunto l'impegno. Gli impegni di stato in Plasma prendono la forma di "radici di Merkle" (derivate da un [albero di Merkle](/whitepaper/#merkle-trees)), che l'operatore invia a intervalli al contratto Plasma sulla catena di Ethereum. +Uno [schema di impegno](https://en.wikipedia.org/wiki/Commitment_scheme) è una tecnica crittografica per impegnarsi in un valore o in una dichiarazione senza rivelarlo a un'altra parte. Gli impegni sono "vincolanti" nel senso che non puoi cambiare il valore o la dichiarazione una volta che ti sei impegnato. Gli impegni di stato in Plasma assumono la forma di "radici di Merkle" (derivate da un [albero di Merkle](/whitepaper/#merkle-trees)) che l'operatore invia a intervalli al contratto Plasma sulla catena di Ethereum. -Le radici di Merkle sono primitive crittografiche che consentono la compressione di grandi quantità di informazioni. Una radice di Merkle (anche detta una "radice blocco", in questo caso), potrebbe rappresentare tutte le transazioni in un blocco. Le radici di Merkle rendono inoltre più facile verificare che una piccola parte di dati faccia parte del set di dati più ampio. Per esempio, un utente può produrre una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) per dimostrare l'inclusione di una transazione in un blocco specifico. +Le radici di Merkle sono primitive crittografiche che consentono di comprimere grandi quantità di informazioni. Una radice di Merkle (chiamata anche "radice del blocco" in questo caso) potrebbe rappresentare tutte le transazioni in un blocco. Le radici di Merkle rendono anche più facile verificare che un piccolo pezzo di dati faccia parte del set di dati più ampio. Ad esempio, un utente può produrre una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) per dimostrare l'inclusione di una transazione in un blocco specifico. -Le radici di Merkle sono importanti per fornire informazioni sullo stato al di fuori della catena a Ethereum. Puoi pensare alle radici di Merkle come "punti di salvataggio": l'operatore sta dicendo che "Questo è lo stato della catena Plasma nel momento x e questa è la radice di Merkle che ne è la prova". L'operatore si sta assumendo un impegno verso lo _stato attuale_ della catena Plasma con una radice di Merkle, motivo per cui è chiamato "impegno di stato". +Le radici di Merkle sono importanti per fornire informazioni sullo stato fuori catena a Ethereum. Puoi pensare alle radici di Merkle come a "punti di salvataggio": l'operatore sta dicendo: "Questo è lo stato della catena Plasma al momento x, e questa è la radice di Merkle come prova". L'operatore si sta impegnando allo _stato attuale_ della catena Plasma con una radice di Merkle, motivo per cui viene chiamato "impegno di stato". ### Entrate e uscite {#entries-and-exits} -Perché gli utenti di Ethereum sfruttino Plasma, è necessario un meccanismo per spostare i fondi tra la Rete principale e le catene Plasma. Non possiamo però inviare arbitrariamente ether a un indirizzo sulla catena Plasma: queste catene sono incompatibili, quindi, la transazione fallirebbe o porterebbe alla perdita dei fondi. +Affinché gli utenti di Ethereum possano trarre vantaggio da Plasma, deve esserci un meccanismo per spostare i fondi tra la rete principale e le catene Plasma. Tuttavia, non possiamo inviare arbitrariamente ether a un indirizzo sulla catena Plasma: queste catene sono incompatibili, quindi la transazione fallirebbe o porterebbe alla perdita di fondi. -Plasma usa un contratto principale eseguito su Ethereum per elaborare le entrate e uscite dell'utente. Questo contratto principale è inoltre responsabile di monitorare gli impegni di stato (spiegati in precedenza) e di punire il comportamento disonesto tramite prove di frode (maggiori informazioni a riguardo in seguito). +Plasma utilizza un contratto principale in esecuzione su Ethereum per elaborare le entrate e le uscite degli utenti. Questo contratto principale è anche responsabile del tracciamento degli impegni di stato (spiegati in precedenza) e della punizione dei comportamenti disonesti tramite prove di frode (ne parleremo più avanti). #### Entrare nella catena Plasma {#entering-the-plasma-chain} -Per entrare nella catena Plasma, Alice (l'utente) dovrà depositare ETH o qualsiasi token ERC-20 nel contratto Plasma. L'operatore di Plasma, che guarda i depositi del contratto, ricrea un importo pari al deposito iniziale di Alice e lo rilascia al suo indirizzo sulla catena Plasma. Alice deve attestare per ricevere i fondi sulla catena figlio e può poi usarli per le transazioni. +Per entrare nella catena Plasma, Alice (l'utente) dovrà depositare ETH o qualsiasi token ERC-20 nel contratto Plasma. L'operatore Plasma, che osserva i depositi del contratto, ricrea un importo pari al deposito iniziale di Alice e lo rilascia al suo indirizzo sulla catena Plasma. Ad Alice è richiesto di attestare la ricezione dei fondi sulla catena figlia e può quindi utilizzare questi fondi per le transazioni. #### Uscire dalla catena Plasma {#exiting-the-plasma-chain} -Uscire dalla catena Plasma è più complesso che entrarvi per diversi motivi. Il principale è che, mentre Ethereum ha informazioni sullo stato della catena Plasma, non può verificare se le informazioni siano vere o no. Un utente malevolo potrebbe fare un'asserzione errata ("Ho 1000 ETH") e riuscire a fornire prove fasulle per sostenerla. +Uscire dalla catena Plasma è più complesso che entrarvi per diversi motivi. Il più grande è che, sebbene Ethereum abbia informazioni sullo stato della catena Plasma, non può verificare se le informazioni siano vere o meno. Un utente malintenzionato potrebbe fare un'affermazione errata ("Ho 1000 ETH") e farla franca fornendo prove false a sostegno dell'affermazione. -Per impedire i prelievi malevoli, è introdotto un "periodo di contestazione". Durante il periodo di contestazione (solitamente una settimana), chiunque può contestare una richiesta di prelievo usando una prova di frode. Se la contestazione ha successo, allora la richiesta di prelievo è negata. +Per prevenire prelievi dannosi, viene introdotto un "periodo di contestazione". Durante il periodo di contestazione (di solito una settimana), chiunque può contestare una richiesta di prelievo utilizzando una prova di frode. Se la contestazione ha successo, la richiesta di prelievo viene negata. -Tuttavia, di solito gli utenti sono onesti e fanno affermazioni corrette sui fondi che posseggono. In questo scenario, Alice avvierà una richiesta di prelievo sulla catena radice (Ethereum) inviando una transazione al contratto Plasma. +Tuttavia, di solito gli utenti sono onesti e fanno affermazioni corrette sui fondi che possiedono. In questo scenario, Alice avvierà una richiesta di prelievo sulla catena radice (Ethereum) inviando una transazione al contratto Plasma. -Deve anche fornire una prova di Merkle che verifichi che una transazione che ha creato i suoi fondi sulla catena Plasma è stata inclusa in un blocco. Questo è necessario per le iterazioni di Plasma, come [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html), che usa un modello di [output delle transazioni non speso(UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output). +Deve anche fornire una prova di Merkle che verifichi che una transazione che ha creato i suoi fondi sulla catena Plasma sia stata inclusa in un blocco. Questo è necessario per le iterazioni di Plasma, come [Plasma MVP](https://www.learnplasma.org/en/learn/mvp.html), che utilizzano un modello [Unspent Transaction Output (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output). -Altre, come [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), rappresentano i fondi come i [token non fungibili](/developers/docs/standards/tokens/erc-721/) invece degli UTXO. Prelevare, in questo caso, richiede la prova di proprietà dei token sulla catena Plasma. Ciò avviene inviando le ultime due transazioni relative al token e fornendo una prova di Merkle che verifichi l'inclusione di queste transazioni in un blocco. +Altre, come [Plasma Cash](https://www.learnplasma.org/en/learn/cash.html), rappresentano i fondi come [token non fungibili](/developers/docs/standards/tokens/erc-721/) invece di UTXO. Il prelievo, in questo caso, richiede la prova della proprietà dei token sulla catena Plasma. Questo viene fatto inviando le due transazioni più recenti che coinvolgono il token e fornendo una prova di Merkle che verifichi l'inclusione di tali transazioni in un blocco. -L'utente deve anche aggiungere una cauzione alla richiesta di prelievo come garanzia di comportamento onesto. Se l'autore di una contestazione prova che la richiesta di prelievo di Alice non è valida, la sua cauzione viene decurtata e una parte di essa va all'autore della contestazione come ricompensa. +L'utente deve anche aggiungere una cauzione alla richiesta di prelievo come garanzia di comportamento onesto. Se uno sfidante dimostra che la richiesta di prelievo di Alice non è valida, la sua cauzione viene punita, e una parte di essa va allo sfidante come ricompensa. -Se il periodo di contestazione scade senza che nessuno fornisca una prova di frode, la richiesta di prelievo di Alice è considerata valida, consentendole di recuperare i depositi dal contratto Plasma su Ethereum. +Se il periodo di contestazione trascorre senza che nessuno fornisca una prova di frode, la richiesta di prelievo di Alice è considerata valida, consentendole di recuperare i depositi dal contratto Plasma su Ethereum. ### Arbitrato delle dispute {#dispute-arbitration} -Come ogni blockchain, le catene di plasma necessitano di un meccanismo per applicare l'integrità delle transazioni, nel caso in cui i partecipanti agiscano in modo malevolo (es., doppia spesa dei fondi). A tal fine, le catene Plasma usano le prove di frode per arbitrare le dispute relative alla validità delle transizioni di stato e penalizzare i cattivi comportamenti. Le prove di frode sono utilizzate come un meccanismo tramite cui, una catena secondaria di Plasma presenta un reclamo alla sua catena principale o alla catena di root. +Come qualsiasi blockchain, le catene Plasma necessitano di un meccanismo per far rispettare l'integrità delle transazioni nel caso in cui i partecipanti agiscano in modo dannoso (ad es. doppia spesa dei fondi). A tal fine, le catene Plasma utilizzano le prove di frode per arbitrare le dispute riguardanti la validità delle transizioni di stato e penalizzare i comportamenti scorretti. Le prove di frode sono utilizzate come meccanismo attraverso il quale una catena figlia Plasma presenta un reclamo alla sua catena madre o alla catena radice. -Una prova di frode è semplicemente l'affermazione che una particolare transizione di stato non è valida. Un esempio è se un utente (Alice) prova a spendere gli stessi fondi due volte. Forse ha speso l'UTXO in una transazione con Bob e desidera spendere lo stesso UTXO (che ora è di Bob) in un'altra transazione. +Una prova di frode è semplicemente un'affermazione che una particolare transazione di stato non è valida. Un esempio è se un utente (Alice) cerca di spendere gli stessi fondi due volte. Forse ha speso l'UTXO in una transazione con Bob e vuole spendere lo stesso UTXO (che ora è di Bob) in un'altra transazione. -Per impedire il prelievo, Bob costruirà una prova di frode fornendo prova della spesa di tale UTXO da parte di Alice in una transazione precedente e una prova di Merkle dell'inclusione della transazione in un blocco. Lo stesso processo funziona in Plasma Cash: Bob dovrebbe fornire prova che Alice abbia precedentemente trasferito i token che sta provando a prelevare. +Per impedire il prelievo, Bob costruirà una prova di frode fornendo la prova che Alice ha speso il suddetto UTXO in una transazione precedente e una prova di Merkle dell'inclusione della transazione in un blocco. Lo stesso processo funziona in Plasma Cash: Bob dovrebbe fornire la prova che Alice ha precedentemente trasferito i token che sta cercando di prelevare. -Se la contestazione di Bob ha successo, la richiesta di prelievo di Alice viene annullata. Tuttavia, questo approccio si basa sulla possibilità per Bob di guardare la catena alla ricerca di richieste di prelievo. Se Bob è offline, allora Alice può elaborare il prelievo malevolo una volta scaduto il periodo di contestazione. +Se la contestazione di Bob ha successo, la richiesta di prelievo di Alice viene annullata. Tuttavia, questo approccio si basa sulla capacità di Bob di osservare la catena per le richieste di prelievo. Se Bob è offline, Alice può elaborare il prelievo dannoso una volta trascorso il periodo di contestazione. ## Il problema dell'uscita di massa in Plasma {#the-mass-exit-problem-in-plasma} -Il problema dell'uscita di massa si verifica quando un gran numero di utenti prova a prelevare da una catena Plasma allo stesso momento. L'esistenza di questo problema ha a che fare con uno dei più grandi problemi di Plasma: la **non disponibilità dei dati**. +Il problema dell'uscita di massa si verifica quando un gran numero di utenti cerca di prelevare da una catena Plasma contemporaneamente. Il motivo per cui esiste questo problema ha a che fare con uno dei maggiori problemi di Plasma: **l'indisponibilità dei dati**. -La disponibilità dei dati è la capacità di verificare che le informazioni per un blocco proposto siano state realmente pubblicate sulla rete della blockchain. Un blocco è "non disponibile" se il produttore pubblica il blocco stesso ma trattiene i dati usati per crearlo. +La disponibilità dei dati è la capacità di verificare che le informazioni per un blocco proposto siano state effettivamente pubblicate sulla rete blockchain. Un blocco è "non disponibile" se il produttore pubblica il blocco stesso ma trattiene i dati utilizzati per creare il blocco. -I blocchi devono essere disponibili se i nodi devono essere in grado di scaricare il blocco e verificare la validità delle transazioni. Le blockchain assicurano la disponibilità dei dati obbligando i produttori dei blocchi a pubblicare tutti i dati delle transazioni on-chain. +I blocchi devono essere disponibili affinché i nodi siano in grado di scaricare il blocco e verificare la validità delle transazioni. Le blockchain garantiscono la disponibilità dei dati costringendo i produttori di blocchi a pubblicare tutti i dati delle transazioni on-chain. -La disponibilità dei dati aiuta anche a proteggere i protocolli di ridimensionamento off-chain che si basano sul livello di base di Ethereum. Forzando gli operatori su queste catene a pubblicare i dati delle transazioni su Ethereum, chiunque può contestare i blocchi non validi costruendo prove di frode facendo riferimento allo stato corretto della catena. +La disponibilità dei dati aiuta anche a proteggere i protocolli di scalabilità fuori catena che si basano sul livello di base di Ethereum. Costringendo gli operatori su queste catene a pubblicare i dati delle transazioni su Ethereum, chiunque può contestare i blocchi non validi costruendo prove di frode che fanno riferimento allo stato corretto della catena. -Le catene Plasma memorizzano principalmente i dati delle transazioni con l'operatore e **non pubblicano alcun dato sulla Rete principale** (vale a dire, oltre agli impegni di stato periodici). Questo significa che gli utenti devono affidarsi all'operatore per fornire i dati del blocco, se devono creare delle prove di frode che constino le transazioni non valide. Se questo sistema funziona, allora gli utenti possono sempre usare le prove di frode per proteggere i fondi. +Le catene Plasma memorizzano principalmente i dati delle transazioni con l'operatore e **non pubblicano alcun dato sulla rete principale** (cioè, oltre agli impegni di stato periodici). Ciò significa che gli utenti devono fare affidamento sull'operatore per fornire i dati del blocco se hanno bisogno di creare prove di frode che contestano transazioni non valide. Se questo sistema funziona, gli utenti possono sempre utilizzare le prove di frode per proteggere i fondi. -Il problema nasce quando l'operatore, non un utente qualsiasi, è la parte che agisce in modo malevolo. Poiché l'operatore ha il controllo esclusivo della blockchain, ha un maggiore incentivo a portare avanti transizioni di stato non valide su una scala maggiore, come rubare i fondi appartenenti ad utenti sulla catena Plasma. +Il problema inizia quando l'operatore, non un utente qualsiasi, è la parte che agisce in modo dannoso. Poiché l'operatore ha il controllo esclusivo della blockchain, ha maggiori incentivi a far avanzare transazioni di stato non valide su scala più ampia, come rubare fondi appartenenti agli utenti sulla catena Plasma. -In questo caso, l'utilizzo del classico sistema di prova di frode non funziona. L'operatore potrebbe facilmente creare una transazione non valida trasferendo i fondi di Alice e Bob al proprio portafoglio e nascondendo i dati necessari per creare la prova di frode. Questo è possibile perché l'operatore non è tenuto a rendere disponibili i dati agli utenti o alla Rete principale. +In questo caso, l'utilizzo del classico sistema di prova di frode non funziona. L'operatore potrebbe facilmente effettuare una transazione non valida trasferendo i fondi di Alice e Bob al proprio portafoglio e nascondere i dati necessari per creare la prova di frode. Questo è possibile perché l'operatore non è tenuto a rendere i dati disponibili agli utenti o alla rete principale. -Dunque, la soluzione più ottimistica è quella di tentare una "uscita di massa" degli utenti dalla catena Plasma. L'uscita di massa rallenta il piano dell'operatore malevolo di rubare fondi e fornisce una certa misura di protezione agli utenti. Le richieste di prelievo sono ordinate in base al momento di creazione di ogni UTXO (o token), impedendo agli operatori malevoli dal danneggiare gli utenti onesti. +Pertanto, la soluzione più ottimistica è tentare un'"uscita di massa" degli utenti dalla catena Plasma. L'uscita di massa rallenta il piano dell'operatore malintenzionato di rubare fondi e fornisce una certa misura di protezione per gli utenti. Le richieste di prelievo sono ordinate in base a quando è stato creato ciascun UTXO (o token), impedendo agli operatori malintenzionati di anticipare (front-running) gli utenti onesti. -Ciò nonostante, ci serve ancora di un modo per verificare la validità delle richieste di prelievo durante un'uscita di massa, per impedire a individui opportunisti di approfittare dell'elaborazione caotica delle uscite non valide. La soluzione è semplice: richiedere agli utenti di pubblicare l'ultimo **stato valido della catena** per far uscire il proprio denaro. +Tuttavia, abbiamo ancora bisogno di un modo per verificare la validità delle richieste di prelievo durante un'uscita di massa, per impedire a individui opportunisti di trarre profitto dal caos elaborando uscite non valide. La soluzione è semplice: richiedere agli utenti di pubblicare l'ultimo **stato valido della catena** per prelevare i propri soldi. -Ma anche questo approccio ha dei problemi. Per esempio, se tutti gli utenti su una catena Plasma devono uscire (il che è possibile nel caso di un operatore malevolo), allora l'intero stato valido della catena Plasma deve essere scaricato subito sul livello di base di Ethereum. Con le dimensioni arbitrarie delle catene Plasma (elevato volume = più dati) e coi vincoli sulle velocità di elaborazione di Ethereum, questa non è una soluzione ideale. +Ma questo approccio presenta ancora dei problemi. Ad esempio, se tutti gli utenti su una catena Plasma devono uscire (il che è possibile nel caso di un operatore malintenzionato), l'intero stato valido della catena Plasma deve essere scaricato sul livello di base di Ethereum in una sola volta. Con le dimensioni arbitrarie delle catene Plasma (alto throughput = più dati) e i vincoli sulle velocità di elaborazione di Ethereum, questa non è una soluzione ideale. -Sebbene i giochi di fuga sembrino divertenti in teoria, le "fughe" di massa nella vita reale potrebbero innescare congestioni dell'intera rete su Ethereum stessa. Oltre a danneggiare la funzionalità di Ethereum, un'uscita di massa mal coordinata comporta che gli utenti potrebbero non riuscire a prelevare i fondi prima che l'operatore abbia drenato ogni conto sulla catena di Plasma. +Sebbene i giochi di uscita sembrino belli in teoria, le uscite di massa nella vita reale probabilmente innescheranno una congestione a livello di rete su Ethereum stesso. Oltre a danneggiare la funzionalità di Ethereum, un'uscita di massa mal coordinata significa che gli utenti potrebbero non essere in grado di prelevare i fondi prima che l'operatore prosciughi ogni account sulla catena Plasma. ## Pro e contro di Plasma {#pros-and-cons-of-plasma} -| Pro | Contro | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Volumi elevati d'offerta e basso costo per transazione. | Non supporta il calcolo generale (non può eseguire i contratti intelligenti. Solo trasferimenti di base di token, scambi e pochi altri tipi di transazione sono supportati tramite logica dei predicati. | -| Ottima per transazioni tra utenti arbitrari (non c'è sovraccarico per coppia di utenti se entrambi sono sulla catena Plasma) | Necessità di monitorare la rete periodicamente (requisito di liveness) o delegare la responsabilità a qualcun altro per garantire la sicurezza dei fondi. | -| Le catene Plasma sono adattabili a casi d'uso specifici non correlati alla catena principale. Chiunque, incluse le aziende, può personalizzare i contratti intelligenti di Plasma per fornire un'infrastruttura scalabile che funzioni in diversi contesti. | Fa affidamento ad uno o più operatori per archiviare i dati e fornirli su richiesta. | -| Riduce il carico sulla Rete principale di Ethereum spostando calcoli e archiviazione al di fuori della catena. | I prelievi sono ritardati di diversi giorni per consentire eventuali contestazioni. Per risorse fungibili, questo può essere mitigato da provider di liquidità, ma c'è sempre associato un costo di capitale. | -| | Se troppi utenti provano a uscire simultaneamente, la Rete principale di Ethereum potrebbe congestionarsi. | +| Pro | Contro | +| --- | --- | +| Offre un alto throughput e un basso costo per transazione. | Non supporta il calcolo generale (non può eseguire contratti intelligenti). Solo i trasferimenti di token di base, gli scambi e pochi altri tipi di transazioni sono supportati tramite la logica dei predicati. | +| Ottimo per le transazioni tra utenti arbitrari (nessun sovraccarico per coppia di utenti se entrambi sono stabiliti sulla catena Plasma). | Necessità di osservare periodicamente la rete (requisito di liveness) o delegare questa responsabilità a qualcun altro per garantire la sicurezza dei propri fondi. | +| Le catene Plasma possono essere adattate a casi d'uso specifici che non sono correlati alla catena principale. Chiunque, comprese le aziende, può personalizzare i contratti intelligenti Plasma per fornire un'infrastruttura scalabile che funzioni in contesti diversi. | Si affida a uno o più operatori per memorizzare i dati e fornirli su richiesta. | +| Riduce il carico sulla rete principale di Ethereum spostando il calcolo e l'archiviazione fuori catena. | I prelievi sono ritardati di diversi giorni per consentire le contestazioni. Per gli asset fungibili, questo può essere mitigato dai fornitori di liquidità, ma c'è un costo di capitale associato. | +| | Se troppi utenti cercano di uscire contemporaneamente, la rete principale di Ethereum potrebbe congestionarsi. | -## Protocolli di ridimensionamento di Plasma vs. livello 2 {#plasma-vs-layer-2} +## Plasma vs protocolli di scalabilità di livello 2 {#plasma-vs-layer-2} -Sebbene una volta Plasma fosse considerato una soluzione di ridimensionamento utile per Ethereum, da allora è stato abbandonato in favore dei [protocolli di ridimensionamento del livello 2 (L2)](/layer-2/). Le soluzioni di ridimensionamento del L2 rimediano a diversi problemi di Plasma: +Sebbene Plasma fosse un tempo considerata un'utile soluzione di scalabilità per Ethereum, da allora è stata abbandonata a favore dei [protocolli di scalabilità di livello 2 (L2)](/layer-2/). Le soluzioni di scalabilità L2 pongono rimedio a molti dei problemi di Plasma: ### Efficienza {#efficiency} -I [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups) generano prove crittografiche della validità di ogni batch di transazioni elaborato al di fuori della catena. Questo impedisce agli utenti (e agli operatori) di portare avanti transizioni di stato non valide, eliminando il bisogno di periodi di contestazione e fughe di massa. Significa anche che gli utenti non devono guardare periodicamente la catena per proteggere i propri fondi. +I [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups) generano prove crittografiche della validità di ogni lotto di transazioni elaborate fuori catena. Ciò impedisce agli utenti (e agli operatori) di far avanzare transazioni di stato non valide, eliminando la necessità di periodi di contestazione e giochi di uscita. Significa anche che gli utenti non devono osservare periodicamente la catena per proteggere i propri fondi. ### Supporto per i contratti intelligenti {#support-for-smart-contracts} -Un altro problema con il quadro di Plasma era [l'incapacità di supportare l'esecuzione dei contratti intelligenti di Ethereum](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Di conseguenza, gran parte delle implementazioni di Plasma erano prevalentemente create per pagamenti semplici o lo scambio di token ERC-20. +Un altro problema con il framework Plasma era [l'incapacità di supportare l'esecuzione dei contratti intelligenti di Ethereum](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4). Di conseguenza, la maggior parte delle implementazioni di Plasma è stata costruita principalmente per pagamenti semplici o per lo scambio di token ERC-20. -Viceversa, i rollup ottimistici sono compatibili con la [Macchina Virtuale di Ethereum](/developers/docs/evm/) e possono eseguire [i contratti intelligenti](/developers/docs/smart-contracts/) nativi di Ethereum, rendendoli una soluzione utile e _sicura_ per il ridimensionamento delle [applicazioni decentralizzate](/developers/docs/dapps/). Similmente, sono in corso piani per [creare un'implementazione a conoscenza zero dell'EVM (zkEVM)](https://ethresear.ch/t/a-zk-evm-specification/11549) che consentirebbe ai rollup ZK di elaborare la logica arbitraria e di eseguire contratti intelligenti. +Al contrario, i rollup ottimistici sono compatibili con la [macchina virtuale di Ethereum](/developers/docs/evm/) e possono eseguire [contratti intelligenti](/developers/docs/smart-contracts/) nativi di Ethereum, rendendoli una soluzione utile e _sicura_ per la scalabilità delle [applicazioni decentralizzate](/developers/docs/dapps/). Allo stesso modo, sono in corso piani per [creare un'implementazione a conoscenza-zero dell'EVM (zkEVM)](https://ethresear.ch/t/a-zk-evm-specification/11549) che consentirebbe ai rollup ZK di elaborare logica arbitraria ed eseguire contratti intelligenti. -### Non disponibilità dei dati {#data-unavailability} +### Indisponibilità dei dati {#data-unavailability} -Come spiegato in precedenza, Plasma soffre di un problema di disponibilità dei dati. Se un operatore malevolo portasse avanti una transizione non valida sulla catena Plasma, gli utenti non potrebbero contestarla poiché l'operatore può trattenere i dati necessari a creare la prova di frode. I rollup risolvono questo problema forzando gli operatori a pubblicare i dati delle transazioni su Ethereum, consentendo a chiunque di verificare lo stato della catena e creare prove di frode se necessario. +Come spiegato in precedenza, Plasma soffre di un problema di disponibilità dei dati. Se un operatore malintenzionato facesse avanzare una transazione non valida sulla catena Plasma, gli utenti non sarebbero in grado di contestarla poiché l'operatore può trattenere i dati necessari per creare la prova di frode. I rollup risolvono questo problema costringendo gli operatori a pubblicare i dati delle transazioni su Ethereum, consentendo a chiunque di verificare lo stato della catena e creare prove di frode se necessario. -### Problema di uscita di massa {#mass-exit-problem} +### Problema dell'uscita di massa {#mass-exit-problem} -I rollup ZK e ottimistici risolvono entrambi il problema di uscita di massa di Plasma in vari modi. Ad esempio, un rollup ZK si basa su meccanismi crittografici che assicurano che gli operatori non possano rubare i fondi dell'utente in alcuno scenario. +I rollup ZK e i rollup ottimistici risolvono entrambi il problema dell'uscita di massa di Plasma in vari modi. Ad esempio, un rollup ZK si basa su meccanismi crittografici che garantiscono che gli operatori non possano rubare i fondi degli utenti in nessuno scenario. -Analogamente, i rollup ottimistici impongono un periodo di ritardo sui prelievi durante cui chiunque può avviare una contestazione e impedire le richieste di prelievo malevole. Sebbene questo sia simile a Plasma, la differenza è che i verificatori hanno accesso ai dati necessari a creare le prove di frode. Dunque, non serve che gli utenti del rollup diano luogo a un frenetico "fuggi fuggi" per migrare verso la Rete principale di Ethereum. +Allo stesso modo, i rollup ottimistici impongono un periodo di ritardo sui prelievi durante il quale chiunque può avviare una contestazione e prevenire richieste di prelievo dannose. Sebbene questo sia simile a Plasma, la differenza è che i verificatori hanno accesso ai dati necessari per creare prove di frode. Pertanto, non c'è bisogno che gli utenti dei rollup si impegnino in una frenetica migrazione "chi prima esce meglio alloggia" verso la rete principale di Ethereum. -## In che modo Plasma differisce dalle sidechain e dallo sharding? {#plasma-sidechains-sharding} +## In che modo Plasma differisce dalle catene laterali e dalla frammentazione? {#plasma-sidechains-sharding} -Plasma, sidechain e sharding sono abbastanza simili perché si connettono tutti alla Rete principale di Ethereum in qualche modo. Tuttavia, il livello e la forza di queste connessioni variano, il che influenza le proprietà di sicurezza di ciascuna soluzione di ridimensionamento. +Plasma, le catene laterali e la frammentazione sono abbastanza simili perché si connettono tutte alla rete principale di Ethereum in qualche modo. Tuttavia, il livello e la forza di queste connessioni variano, il che influisce sulle proprietà di sicurezza di ciascuna soluzione di scalabilità. -### Plasma vs sidechain {#plasma-vs-sidechains} +### Plasma vs catene laterali {#plasma-vs-sidechains} -Una [sidechain](/developers/docs/scaling/sidechains/) è una blockchain gestita in modo indipendente connessa alla Rete principale di Ethereum tramite un ponte bidirezionale. I [ponti](/bridges/) consentono agli utenti di scambiare token tra le due blockchain per effettuare transazioni sulla sidechain, riducendo la congestione sulla Rete principale di Ethereum e aumentando la scalabilità. Le sidechain usano un meccanismo di consenso separato e sono tipicamente molto più piccole della Rete principale di Ethereum. Ne risulta che il collegamento delle risorse a queste catene coinvolge un maggiore rischio; data la mancanza di garanzie di sicurezza ereditate dalla Rete principale di Ethereum nel modello della sidechain, gli utenti rischiano di perdere fondi in un attacco alla sidechain. +Una [catena laterale](/developers/docs/scaling/sidechains/) è una blockchain gestita in modo indipendente collegata alla rete principale di Ethereum tramite un ponte bidirezionale. I [ponti](/bridges/) consentono agli utenti di scambiare token tra le due blockchain per effettuare transazioni sulla catena laterale, riducendo la congestione sulla rete principale di Ethereum e migliorando la scalabilità. +Le catene laterali utilizzano un meccanismo di consenso separato e sono in genere molto più piccole della rete principale di Ethereum. Di conseguenza, il trasferimento di risorse su queste catene comporta un rischio maggiore; data la mancanza di garanzie di sicurezza ereditate dalla rete principale di Ethereum nel modello della catena laterale, gli utenti rischiano la perdita di fondi in un attacco alla catena laterale. -Viceversa, le catene Plasma derivano la propria sicurezza dalla Rete principale. Questo le rende considerevolmente più sicure delle sidechain. Sia le sidechain che le catene Plasma possono avere diversi protocolli di consenso, ma la differenza è che le seconde pubblicano radici di Merkle per ogni blocco sulla Rete principale di Ethereum. Le radici blocco sono piccole informazioni utilizzabili per verificare le informazioni sulle transazioni che si verificano su una catena Plasma. Se si verifica un attacco su una catena Plasma, gli utenti possono prelevare in sicurezza i propri fondi sulla Rete principale usando le prove appropriate. +Al contrario, le catene Plasma derivano la loro sicurezza dalla rete principale. Questo le rende misurabilmente più sicure delle catene laterali. Sia le catene laterali che le catene Plasma possono avere protocolli di consenso diversi, ma la differenza è che le catene Plasma pubblicano le radici di Merkle per ogni blocco sulla rete principale di Ethereum. Le radici dei blocchi sono piccole informazioni che possiamo utilizzare per verificare le informazioni sulle transazioni che avvengono su una catena Plasma. Se si verifica un attacco su una catena Plasma, gli utenti possono prelevare in sicurezza i propri fondi sulla rete principale utilizzando le prove appropriate. -### Plasma vs sharding {#plasma-vs-sharding} +### Plasma vs frammentazione {#plasma-vs-sharding} -Sia le catene Plasma che le shard chain pubblicano periodicamente prove crittografiche sulla Rete principale di Ethereum. Tuttavia, le due catene hanno proprietà di sicurezza diverse. +Sia le catene Plasma che le catene frammentate pubblicano periodicamente prove crittografiche sulla rete principale di Ethereum. Tuttavia, entrambe hanno proprietà di sicurezza diverse. -Le shard chain inviano "intestazioni di collazione" alla Rete principale contenenti informazioni dettagliate su ogni frammento di dati. I nodi sulla Rete principale verificano e applicano la validità dei frammenti di dati, riducendo la possibilità di transazioni di shard non valide e proteggendo la rete dalle attività malevole. +Le catene frammentate inviano "intestazioni di collazione" alla rete principale contenenti informazioni dettagliate su ciascun frammento di dati. I nodi sulla rete principale verificano e fanno rispettare la validità dei frammenti di dati, riducendo la possibilità di transazioni di frammenti non valide e proteggendo la rete da attività dannose. -Plasma è differente perché la Rete principale riceve solo informazioni minime sullo stato delle catene figlio. Questo significa che la Rete principale non può verificare efficientemente le transazioni condotte sulle catene figlio, rendendole meno sicure. +Plasma è diversa perché la rete principale riceve solo informazioni minime sullo stato delle catene figlie. Ciò significa che la rete principale non può verificare efficacemente le transazioni condotte sulle catene figlie, rendendole meno sicure. -**Nota** che lo sharding della blockchain di Ethereum non è più sulla tabella di marcia. È stato sostituito dal ridimensionamento tramite rollup e dal [Danksharding](/roadmap/danksharding). +**Nota** che la frammentazione della blockchain di Ethereum non è più nel piano d'azione. È stata sostituita dalla scalabilità tramite rollup e [Danksharding](/roadmap/danksharding). ### Usare Plasma {#use-plasma} -Diversi progetti forniscono implementazioni di Plasma che puoi integrare nelle tue dapp: +Diversi progetti forniscono implementazioni di Plasma che puoi integrare nelle tue dApp: - [Polygon](https://polygon.technology/) (precedentemente Matic Network) ## Letture consigliate {#further-reading} -- [Scopri plasma](https://www.learnplasma.org/en/) -- [Un rapido promemoria su che cos'è la "sicurezza condivisa" e perché è così importante](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [Sidechains vs Plasma vs Sharding](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) -- [Comprendere Plasma, Parte 1: Fondamenti](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) -- [The Life and Death of Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) +- [Impara Plasma](https://www.learnplasma.org/en/) +- [Un rapido promemoria di cosa significa "sicurezza condivisa" e perché è così importante](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) +- [Catene laterali vs Plasma vs Frammentazione](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) +- [Comprendere Plasma, Parte 1: Le Basi](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) +- [Vita e morte di Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ + +## Tutorial: Catene Plasma su Ethereum {#tutorials} + +- [Scrivere un plasma specifico per l'app che preservi la privacy](/developers/tutorials/app-plasma/) _– Costruisci un'applicazione plasma che preserva la privacy utilizzando prove a conoscenza-zero e componenti fuori catena._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/sidechains/index.md b/public/content/translations/it/developers/docs/scaling/sidechains/index.md index 89e8af0b7dd..33aa8af114c 100644 --- a/public/content/translations/it/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/it/developers/docs/scaling/sidechains/index.md @@ -1,73 +1,73 @@ --- -title: Sidechain -description: Un'introduzione alle sidechain come soluzione di ridemensionamento attualmente utilizzato dalla community di Ethereum. +title: Catene laterali +description: "Un'introduzione alle catene laterali come soluzione di scalabilità attualmente utilizzata dalla community di Ethereum." lang: it sidebarDepth: 3 --- -Una sidechain è una blockchain separata eseguita in modo indipendente da Ethereum ed è connessa alla Rete principale di Ethereum da un ponte bidirezionale. Le sidechain possono avere parametri del blocco e [algoritmi di consenso](/developers/docs/consensus-mechanisms/) separati, spesso progettati per l'elaborazione efficiente delle transazioni. Usare una sidechain comporta compromessi, però, poiché non eredita le proprietà di sicurezza di Ethereum. A differenza dalle [soluzioni di ridimensionamento del livello 2](/layer-2/), le sidechain non ri-pubblicano i cambiamenti di stato e i dati della transazione nella Rete principale di Ethereum. +Una catena laterale è una blockchain separata che viene eseguita in modo indipendente da [Ethereum](/) ed è connessa alla rete principale di Ethereum tramite un ponte bidirezionale. Le catene laterali possono avere parametri del blocco e [algoritmi di consenso](/developers/docs/consensus-mechanisms/) separati, che sono spesso progettati per un'elaborazione efficiente delle transazioni. L'utilizzo di una catena laterale comporta tuttavia dei compromessi, poiché non ereditano le proprietà di sicurezza di Ethereum. A differenza delle [soluzioni di scalabilità di livello 2](/layer-2/), le catene laterali non inviano le modifiche di stato e i dati delle transazioni alla rete principale di Ethereum. -Inoltre, le sidechain sacrificano alcune misure di decentralizzazione o di sicurezza per ottenere un volume elevato ([trilemma di scalabilità](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Tuttavia, Ethereum, si impegna nel ridimensionamento senza compromettere la decentralizzazione e la sicurezza come definito nella [dichiarazione della vision](/roadmap/) per gli aggiornamenti. +Le catene laterali sacrificano anche una certa misura di decentralizzazione o sicurezza per ottenere un'elevata produttività ([trilemma della scalabilità](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Ethereum è, tuttavia, impegnato nella scalabilità senza compromettere la decentralizzazione e la sicurezza. -## Come funzionano le sidechain? {#how-do-sidechains-work} +## Come funzionano le catene laterali? {#how-do-sidechains-work} -Le sidechain sono blockchain indipendenti, con cronologie, tabelle di marcia di sviluppo e considerazioni di progettazione differenti. Sebbene una sidechain possa condividere alcune somiglianze a livello superficiale con Ethereum, ha diverse funzionalità distintive. +Le catene laterali sono blockchain indipendenti, con storie, piani d'azione di sviluppo e considerazioni di progettazione differenti. Sebbene una catena laterale possa condividere alcune somiglianze superficiali con Ethereum, presenta diverse caratteristiche distintive. ### Algoritmi di consenso {#consensus-algorithms} -Una delle qualità che rendono uniche le sidechain (ossia diverse da Ethereum), è l'algoritmo di consenso utilizzato. Le sidechain non si affidano a Ethereum per il consenso e possono scegliere protocolli di consenso alternativi adatti alle loro esigenze. Alcuni esempi di algoritmi di consenso usati sulle sidechain includono: +Una delle qualità che rendono uniche le catene laterali (cioè diverse da Ethereum) è l'algoritmo di consenso utilizzato. Le catene laterali non si affidano a Ethereum per il consenso e possono scegliere protocolli di consenso alternativi che si adattano alle loro esigenze. Alcuni esempi di algoritmi di consenso utilizzati sulle catene laterali includono: -- [Proof of Authority](/developers/docs/consensus-mechanisms/poa/) -- [proof-of-stake delegato](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) -- [Tolleranza ai guasti bizantini](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained). +- [Prova di autorità (Proof-of-authority)](/developers/docs/consensus-mechanisms/poa/) +- [Prova di stake delegata (Delegated proof-of-stake)](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) +- [Tolleranza ai guasti bizantina (Byzantine fault tolerance)](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained). -Come Ethereum, le sidechain hanno nodi di convalida che verificano ed elaborano le transazioni, producono blocchi e memorizzano lo stato della blockchain. I validatori sono inoltre responsabili del mantenimento del consenso lungo la rete e della sua protezione da attacchi malevoli. +Come Ethereum, le catene laterali hanno nodi di convalida che verificano ed elaborano le transazioni, producono blocchi e memorizzano lo stato della blockchain. I validatori sono anche responsabili del mantenimento del consenso in tutta la rete e della sua protezione da attacchi dannosi. #### Parametri del blocco {#block-parameters} -Ethereum pone dei limiti ai [tempi del blocco](/developers/docs/blocks/#block-time) (cioè, il tempo impiegato per produrre nuovi blocchi) e alle [dimensioni del blocco](/developers/docs/blocks/#block-size) (cioè, la quantità di dati contenuti per blocco denominata in gas). Al contrario, le catene secondarie adottano spesso parametri differenti, come tempi del blocco ridotti e limiti di gas superiori, per ottenere un volume elevato, transazioni veloci e commissioni basse. +Ethereum pone dei limiti ai [tempi del blocco](/developers/docs/blocks/#block-time) (cioè il tempo necessario per produrre nuovi blocchi) e alle [dimensioni del blocco](/developers/docs/blocks/#block-size) (cioè la quantità di dati contenuti per blocco denominata in gas). Al contrario, le catene laterali adottano spesso parametri diversi, come tempi del blocco più rapidi e limiti del gas più elevati, per ottenere un'elevata produttività, transazioni veloci e commissioni basse. -Sebbene ciò abbia alcuni vantaggi, comporta implicazioni critiche per la decentralizzazione e la sicurezza della rete. I parametri del blocco, come tempi di blocco veloci e grandi dimensioni del blocco, aumentano la difficoltà di eseguire un nodo completo, rendendo pochi "supernodi" responsabili della protezione della catena. In tale scenario, la possibilità di collusione del validatore o di un'acquisizione malevola della catena aumenta. +Sebbene ciò abbia alcuni vantaggi, ha implicazioni critiche per la decentralizzazione e la sicurezza della rete. I parametri del blocco, come tempi del blocco rapidi e grandi dimensioni del blocco, aumentano la difficoltà di eseguire un nodo completo, lasciando a pochi "supernodi" la responsabilità di proteggere la catena. In un simile scenario, aumenta la possibilità di collusione dei validatori o di un'acquisizione dannosa della catena. -Perché le blockchain scalino senza danneggiare la decentralizzazione, l'esecuzione di un nodo deve essere aperta a tutti, non necessariamente alle parti con hardware specializzato. Ecco perché sono in corso sforzi per assicurarsi che tutti possano [eseguire un nodo completo](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) sulla rete Ethereum. +Affinché le blockchain possano scalare senza danneggiare la decentralizzazione, l'esecuzione di un nodo deve essere aperta a tutti, non necessariamente a parti con hardware specializzato. Questo è il motivo per cui sono in corso sforzi per garantire che tutti possano [eseguire un nodo completo](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) sulla rete di Ethereum. ### Compatibilità con l'EVM {#evm-compatibility} -Alcune sidechain sono compatibili con l'EVM e possono eseguire i contratti sviluppati per la [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/). Le catene secondarie compatibili con l'EVM supportano i contratti intelligenti [scritti in Solidity](/developers/docs/smart-contracts/languages/), nonché altri linguaggi di contratti intelligenti dell'EVM, il che significa che i contratti intelligenti scritti per la Mainnet di Ethereum funzioneranno anche sulle catene secondarie compatibili con l'EVM. +Alcune catene laterali sono compatibili con l'EVM e sono in grado di eseguire contratti sviluppati per la [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/). Le catene laterali compatibili con l'EVM supportano i contratti intelligenti [scritti in Solidity](/developers/docs/smart-contracts/languages/), così come altri linguaggi per contratti intelligenti dell'EVM, il che significa che i contratti intelligenti scritti per la rete principale di Ethereum funzioneranno anche sulle catene laterali compatibili con l'EVM. -Questo significa che se vuoi usare la tua [dapp](/developers/docs/dapps/) su una catena secondaria, devi solo distribuire il tuo [contratto intelligente](/developers/docs/smart-contracts/) a tale catena secondaria. Assomiglia e funziona proprio come la Rete principale: scrivi i contratti in Solidity e interagisci con la catena tramite RPC della sidechain. +Questo significa che se vuoi usare la tua [dApp](/developers/docs/dapps/) su una catena laterale, è solo questione di distribuire il tuo [contratto intelligente](/developers/docs/smart-contracts/) su questa catena laterale. Ha l'aspetto, la sensazione e si comporta proprio come la rete principale: scrivi contratti in Solidity e interagisci con la catena tramite l'RPC delle catene laterali. -Poiché le sidechain sono compatibili con l'EVM, sono considerate un'utile [soluzione di ridimensionamento](/developers/docs/scaling/) per le dapp native di Ethereum. Con la tua dapp su una catena secondaria, gli utenti possono godere di commissioni sul gas inferiori e transazioni più veloci, specialmente se la Rete Principale è congestionata. +Poiché le catene laterali sono compatibili con l'EVM, sono considerate un'utile [soluzione di scalabilità](/developers/docs/scaling/) per le dApp native di Ethereum. Con la tua dApp su una catena laterale, gli utenti possono godere di commissioni più basse e transazioni più veloci, specialmente se la rete principale è congestionata. -Tuttavia, come spiegato precedentemente, usare una sidechain comporta compromessi significativi. Ogni sidechain è responsabile per la propria sicurezza e non eredita le proprietà di sicurezza di Ethereum. Questo aumenta la possibilità di comportamenti malevoli che possono influenzare i tuoi utenti o metterne a rischio i fondi. +Tuttavia, come spiegato in precedenza, l'utilizzo di una catena laterale comporta compromessi significativi. Ogni catena laterale è responsabile della propria sicurezza e non eredita le proprietà di sicurezza di Ethereum. Ciò aumenta la possibilità di comportamenti dannosi che possono colpire i tuoi utenti o mettere a rischio i loro fondi. -### Spostamento di risorse {#asset-movement} +### Movimento degli asset {#asset-movement} -Perché una blockchain separata diventi una sidechain alla Rete principale di Ethereum, deve avere la possibilità di facilitare il trasferimento di risorse da e verso la Rete principale di Ethereum. Questa interoperabilità con Ethereum è ottenuta usando un ponte della blockchain. I [ponti](/bridges/) usano i contratti intelligenti distribuiti sulla Rete Principale di Ethereum e su una catena secondaria per controllare il collegamento dei fondi tra di essi. +Affinché una blockchain separata diventi una catena laterale della rete principale di Ethereum, deve avere la capacità di facilitare il trasferimento di asset da e verso la rete principale di Ethereum. Questa interoperabilità con Ethereum si ottiene utilizzando un ponte tra blockchain. I [ponti](/bridges/) utilizzano contratti intelligenti distribuiti sulla rete principale di Ethereum e su una catena laterale per controllare il passaggio di fondi tra di loro. -Sebbene i ponti aiutino gli utenti a spostare fondi tra Ethereum e la sidechain, le risorse non vengono spostate fisicamente tra le due catene. Invece, i meccanismi che coinvolgono tipicamente la coniatura e la bruciatura sono usati per trasferire valore tra le catene. Maggiori informazioni su [come funzionano i ponti](/developers/docs/bridges/#how-do-bridges-work). +Sebbene i ponti aiutino gli utenti a spostare fondi tra Ethereum e la catena laterale, gli asset non vengono spostati fisicamente attraverso le due catene. Invece, per trasferire valore tra le catene vengono utilizzati meccanismi che in genere comportano il coniare e il bruciare. Maggiori informazioni su [come funzionano i ponti](/developers/docs/bridges/#how-do-bridges-work). -## Pro e contro delle sidechain {#pros-and-cons-of-sidechains} +## Pro e contro delle catene laterali {#pros-and-cons-of-sidechains} -| Pro | Contro | -| ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | -| La tecnologia sottostante le sidechain è consolidata e beneficia dell'ampia ricerca e dai miglioramenti nella progettazione. | Le sidechain rinunciano a una certa misura di decentralizzazione e assenza di fiducia in cambio della scalabilità. | -| Le sidechain supportano il calcolo generale e offrono compatibilità con l'EVM (possono eseguire dapp native di Ethereum). | Una sidechainusa un meccanismo di consenso e non beneficia delle garanzie di sicurezza di Ethereum. | -| Le sidechain usano modelli di consenso differenti per elaborare efficientemente le transazioni e ridurre le commissioni di transazione per gli utenti. | Le sidechain richiedono ipotesi di fiducia più elevata (ad es. un quorum di validatori malevoli della sidechain può commettere frode). | -| Le sidechain compatibili con l'EVM consentono alle dapp di espandere il proprio ecosistema. | | +| Pro | Contro | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| La tecnologia alla base delle catene laterali è ben consolidata e beneficia di ricerche approfondite e miglioramenti nella progettazione. | Le catene laterali scambiano una certa misura di decentralizzazione e assenza di fiducia (trustlessness) per la scalabilità. | +| Le catene laterali supportano il calcolo generale e offrono compatibilità con l'EVM (possono eseguire dApp native di Ethereum). | Una catena laterale utilizza un meccanismo di consenso separato e non beneficia delle garanzie di sicurezza di Ethereum. | +| Le catene laterali utilizzano modelli di consenso diversi per elaborare in modo efficiente le transazioni e ridurre le commissioni della transazione per gli utenti. | Le catene laterali richiedono maggiori presupposti di fiducia (ad es., un quorum di validatori di catene laterali malintenzionati può commettere frodi). | +| Le catene laterali compatibili con l'EVM consentono alle dApp di espandere il proprio ecosistema. | | -### Usare la sidechain {#use-sidechains} +### Usare le catene laterali {#use-sidechains} -Diversi progetti forniscono implementazioni di sidechain che puoi integrare nelle tue dapp: +Diversi progetti forniscono implementazioni di catene laterali che puoi integrare nelle tue dApp: - [Polygon PoS](https://polygon.technology/solutions/polygon-pos) - [Skale](https://skale.network/) -- [Gnosis Chain (in precedenza xDai)](https://www.gnosischain.com/) -- [Rete di Loom](https://loomx.io/) +- [Gnosis Chain (precedentemente xDai)](https://www.gnosischain.com/) +- [Loom Network](https://loomx.io/) - [Metis Andromeda](https://www.metis.io/) ## Letture consigliate {#further-reading} -- [Scaling Ethereum dapps through Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8 feb 2018 - Georgios Konstantopoulos_ +- [Scaling Ethereum dapps through Sidechains](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _8 febbraio 2018 - Georgios Konstantopoulos_ -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/state-channels/index.md b/public/content/translations/it/developers/docs/scaling/state-channels/index.md new file mode 100644 index 00000000000..50012097687 --- /dev/null +++ b/public/content/translations/it/developers/docs/scaling/state-channels/index.md @@ -0,0 +1,261 @@ +--- +title: State Channels +description: "Un'introduzione ai canali di stato e ai canali di pagamento come soluzione di scalabilità attualmente utilizzata dalla community di Ethereum." +lang: it +sidebarDepth: 3 +--- + +I canali di stato consentono ai partecipanti di effettuare transazioni sicure fuori catena mantenendo al minimo l'interazione con la [rete principale](/) di Ethereum. I peer del canale possono condurre un numero arbitrario di transazioni fuori catena inviando solo due transazioni on-chain per aprire e chiudere il canale. Ciò consente un throughput di transazioni estremamente elevato e si traduce in costi inferiori per gli utenti. + +## Prerequisiti {#prerequisites} + +Dovresti aver letto e compreso le nostre pagine sulla [scalabilità di Ethereum](/developers/docs/scaling/) e sul [livello 2](/layer-2/). + +## Cosa sono i canali? {#what-are-channels} + +Le blockchain pubbliche, come Ethereum, affrontano sfide di scalabilità a causa della loro architettura distribuita: le transazioni on-chain devono essere eseguite da tutti i nodi. I nodi devono essere in grado di gestire il volume di transazioni in un blocco utilizzando hardware modesto, imponendo un limite al throughput delle transazioni per mantenere la rete decentralizzata. I canali della blockchain risolvono questo problema consentendo agli utenti di interagire fuori catena pur continuando a fare affidamento sulla sicurezza della catena principale per il regolamento finale. + +I canali sono semplici protocolli peer-to-peer che consentono a due parti di effettuare molte transazioni tra loro e quindi pubblicare solo i risultati finali sulla blockchain. Il canale utilizza la crittografia per dimostrare che i dati di riepilogo che generano sono veramente il risultato di un insieme valido di transazioni intermedie. Un contratto intelligente ["multifirma"](/developers/docs/smart-contracts/#multisig) assicura che le transazioni siano firmate dalle parti corrette. + +Con i canali, i cambiamenti di stato sono eseguiti e convalidati dalle parti interessate, riducendo al minimo il calcolo sul livello di esecuzione di Ethereum. Questo riduce la congestione su Ethereum e aumenta anche la velocità di elaborazione delle transazioni per gli utenti. + +Ogni canale è gestito da un [contratto intelligente multifirma](/developers/docs/smart-contracts/#multisig) in esecuzione su Ethereum. Per aprire un canale, i partecipanti distribuiscono il contratto del canale on-chain e vi depositano dei fondi. Entrambe le parti firmano collettivamente un aggiornamento di stato per inizializzare lo stato del canale, dopodiché possono effettuare transazioni rapidamente e liberamente fuori catena. + +Per chiudere il canale, i partecipanti inviano l'ultimo stato concordato del canale on-chain. Successivamente, il contratto intelligente distribuisce i fondi bloccati in base al saldo di ciascun partecipante nello stato finale del canale. + +I canali peer-to-peer sono particolarmente utili per le situazioni in cui alcuni partecipanti predefiniti desiderano effettuare transazioni ad alta frequenza senza incorrere in costi generali visibili. I canali della blockchain rientrano in due categorie: **canali di pagamento** e **canali di stato**. + +## Canali di pagamento {#payment-channels} + +Un canale di pagamento è meglio descritto come un "registro bidirezionale" mantenuto collettivamente da due utenti. Il saldo iniziale del registro è la somma dei depositi bloccati nel contratto on-chain durante la fase di apertura del canale. I trasferimenti del canale di pagamento possono essere eseguiti istantaneamente e senza il coinvolgimento della blockchain vera e propria, ad eccezione di una creazione iniziale una tantum on-chain e di un'eventuale chiusura del canale. + +Gli aggiornamenti al saldo del registro (ovvero, lo stato del canale di pagamento) richiedono l'approvazione di tutte le parti nel canale. Un aggiornamento del canale, firmato da tutti i partecipanti al canale, è considerato finalizzato, in modo molto simile a una transazione su Ethereum. + +I canali di pagamento sono stati tra le prime soluzioni di scalabilità progettate per ridurre al minimo le costose attività on-chain di semplici interazioni degli utenti (ad es. trasferimenti di ETH, scambi atomici, micropagamenti). I partecipanti al canale possono condurre una quantità illimitata di transazioni istantanee e senza commissioni tra loro, a condizione che la somma netta dei loro trasferimenti non superi i token depositati. + +## Canali di stato {#state-channels} + +Oltre a supportare i pagamenti fuori catena, i canali di pagamento non si sono dimostrati utili per gestire la logica generale di transizione di stato. I canali di stato sono stati creati per risolvere questo problema e rendere i canali utili per la scalabilità del calcolo di uso generale. + +I canali di stato hanno ancora molto in comune con i canali di pagamento. Ad esempio, gli utenti interagiscono scambiandosi messaggi firmati crittograficamente (transazioni), che anche gli altri partecipanti al canale devono firmare. Se un aggiornamento di stato proposto non è firmato da tutti i partecipanti, è considerato non valido. + +Tuttavia, oltre a mantenere i saldi dell'utente, il canale tiene traccia anche dello stato attuale dell'archiviazione del contratto (ovvero, i valori delle variabili del contratto). + +Ciò rende possibile eseguire un contratto intelligente fuori catena tra due utenti. In questo scenario, gli aggiornamenti allo stato interno del contratto intelligente richiedono solo l'approvazione dei peer che hanno creato il canale. + +Sebbene questo risolva il problema di scalabilità descritto in precedenza, ha implicazioni per la sicurezza. Su Ethereum, la validità delle transizioni di stato è applicata dal protocollo di consenso della rete. Ciò rende impossibile proporre un aggiornamento non valido allo stato di un contratto intelligente o alterare l'esecuzione del contratto intelligente. + +I canali di stato non hanno le stesse garanzie di sicurezza. In una certa misura, un canale di stato è una versione in miniatura della rete principale. Con un insieme limitato di partecipanti che applicano le regole, aumenta la possibilità di comportamenti dannosi (ad es. proporre aggiornamenti di stato non validi). I canali di stato derivano la loro sicurezza da un sistema di arbitrato delle controversie basato su [prove di frode](/glossary/#fraud-proof). + +## Come funzionano i canali di stato {#how-state-channels-work} + +Fondamentalmente, l'attività in un canale di stato è una sessione di interazioni che coinvolge utenti e un sistema blockchain. Gli utenti comunicano principalmente tra loro fuori catena e interagiscono con la blockchain sottostante solo per aprire il canale, chiudere il canale o risolvere potenziali controversie tra i partecipanti. + +La sezione seguente delinea il flusso di lavoro di base di un canale di stato: + +### Apertura del canale {#opening-the-channel} + +L'apertura di un canale richiede ai partecipanti di impegnare fondi in un contratto intelligente sulla rete principale. Il deposito funziona anche come un conto virtuale, in modo che gli attori partecipanti possano effettuare transazioni liberamente senza dover saldare immediatamente i pagamenti. Solo quando il canale è finalizzato on-chain le parti si saldano a vicenda e prelevano ciò che resta del loro conto. + +Questo deposito funge anche da cauzione per garantire un comportamento onesto da parte di ciascun partecipante. Se i depositanti vengono giudicati colpevoli di azioni dannose durante la fase di risoluzione delle controversie, il contratto punisce il loro deposito. + +I peer del canale devono firmare uno stato iniziale, su cui tutti concordano. Questo funge da genesi del canale di stato, dopodiché gli utenti possono iniziare a effettuare transazioni. + +### Utilizzo del canale {#using-the-channel} + +Dopo aver inizializzato lo stato del canale, i peer interagiscono firmando le transazioni e inviandosele a vicenda per l'approvazione. I partecipanti avviano gli aggiornamenti di stato con queste transazioni e firmano gli aggiornamenti di stato degli altri. Ogni transazione comprende quanto segue: + +- Un **nonce**, che funge da ID univoco per le transazioni e previene gli attacchi di replay. Identifica anche l'ordine in cui si sono verificati gli aggiornamenti di stato (il che è importante per la risoluzione delle controversie) + +- Il vecchio stato del canale + +- Il nuovo stato del canale + +- La transazione che innesca la transizione di stato (ad es. Alice invia 5 ETH a Bob) + +Gli aggiornamenti di stato nel canale non vengono trasmessi on-chain come avviene normalmente quando gli utenti interagiscono sulla rete principale, il che è in linea con l'obiettivo dei canali di stato di ridurre al minimo l'impronta on-chain. Finché i partecipanti concordano sugli aggiornamenti di stato, questi sono definitivi quanto una transazione di Ethereum. I partecipanti devono dipendere dal consenso della rete principale solo se sorge una controversia. + +### Chiusura del canale {#closing-the-channel} + +La chiusura di un canale di stato richiede l'invio dello stato finale e concordato del canale al contratto intelligente on-chain. I dettagli a cui si fa riferimento nell'aggiornamento di stato includono il numero di mosse di ciascun partecipante e un elenco di transazioni approvate. + +Dopo aver verificato che l'aggiornamento di stato sia valido (ovvero, che sia firmato da tutte le parti), il contratto intelligente finalizza il canale e distribuisce i fondi bloccati in base all'esito del canale. I pagamenti effettuati fuori catena vengono applicati allo stato di Ethereum e ogni partecipante riceve la propria porzione rimanente dei fondi bloccati. + +Lo scenario descritto sopra rappresenta ciò che accade nel caso ideale. A volte, gli utenti potrebbero non essere in grado di raggiungere un accordo e finalizzare il canale (il caso peggiore). Una qualsiasi delle seguenti condizioni potrebbe essere vera per la situazione: + +- I partecipanti vanno offline e non riescono a proporre transizioni di stato + +- I partecipanti si rifiutano di co-firmare aggiornamenti di stato validi + +- I partecipanti cercano di finalizzare il canale proponendo un vecchio aggiornamento di stato al contratto on-chain + +- I partecipanti propongono transizioni di stato non valide da far firmare agli altri + +Ogni volta che il consenso viene meno tra gli attori partecipanti in un canale, l'ultima opzione è fare affidamento sul consenso della rete principale per far rispettare lo stato finale e valido del canale. In questo caso, la chiusura del canale di stato richiede la risoluzione delle controversie on-chain. + +### Risoluzione delle controversie {#settling-disputes} + +In genere, le parti in un canale concordano in anticipo sulla chiusura del canale e co-firmano l'ultima transizione di stato, che inviano al contratto intelligente. Una volta che l'aggiornamento è approvato on-chain, l'esecuzione del contratto intelligente fuori catena termina e i partecipanti escono dal canale con i loro soldi. + +Tuttavia, una parte può inviare una richiesta on-chain per terminare l'esecuzione del contratto intelligente e finalizzare il canale, senza attendere l'approvazione della controparte. Se si verifica una qualsiasi delle situazioni di rottura del consenso descritte in precedenza, entrambe le parti possono attivare il contratto on-chain per chiudere il canale e distribuire i fondi. Questo fornisce **assenza di necessità di fiducia**, garantendo che le parti oneste possano ritirare i propri depositi in qualsiasi momento, indipendentemente dalle azioni dell'altra parte. + +Per elaborare l'uscita dal canale, l'utente deve inviare l'ultimo aggiornamento di stato valido dell'applicazione al contratto on-chain. Se questo risulta corretto (ovvero, reca la firma di tutte le parti), i fondi vengono ridistribuiti a loro favore. + +C'è, tuttavia, un ritardo nell'esecuzione delle richieste di uscita di un singolo utente. Se la richiesta di concludere il canale è stata approvata all'unanimità, la transazione di uscita on-chain viene eseguita immediatamente. + +Il ritardo entra in gioco nelle uscite di un singolo utente a causa della possibilità di azioni fraudolente. Ad esempio, un partecipante al canale potrebbe tentare di finalizzare il canale su Ethereum inviando un aggiornamento di stato più vecchio on-chain. + +Come contromisura, i canali di stato consentono agli utenti onesti di contestare gli aggiornamenti di stato non validi inviando l'ultimo stato valido del canale on-chain. I canali di stato sono progettati in modo tale che gli aggiornamenti di stato più recenti e concordati prevalgano sugli aggiornamenti di stato più vecchi. + +Una volta che un peer attiva il sistema di risoluzione delle controversie on-chain, l'altra parte è tenuta a rispondere entro un limite di tempo (chiamato finestra di contestazione). Ciò consente agli utenti di contestare la transazione di uscita, specialmente se l'altra parte sta applicando un aggiornamento obsoleto. + +Qualunque sia il caso, gli utenti del canale hanno sempre forti garanzie di finalità: se la transizione di stato in loro possesso è stata firmata da tutti i membri ed è l'aggiornamento più recente, allora ha la stessa finalità di una normale transazione on-chain. Devono comunque contestare l'altra parte on-chain, ma l'unico risultato possibile è la finalizzazione dell'ultimo stato valido, che essi detengono. + +### Come interagiscono i canali di stato con Ethereum? {#how-do-state-channels-interact-with-ethereum} + +Sebbene esistano come protocolli fuori catena, i canali di stato hanno un componente on-chain: il contratto intelligente distribuito su Ethereum all'apertura del canale. Questo contratto controlla le risorse depositate nel canale, verifica gli aggiornamenti di stato e arbitra le controversie tra i partecipanti. + +I canali di stato non pubblicano i dati delle transazioni o gli impegni di stato sulla rete principale, a differenza delle soluzioni di scalabilità di [livello 2](/layer-2/). Tuttavia, sono più connessi alla rete principale rispetto, ad esempio, alle [catene laterali](/developers/docs/scaling/sidechains/), rendendoli in qualche modo più sicuri. + +I canali di stato si affidano al protocollo principale di Ethereum per quanto segue: + +#### 1. Liveness {#liveness} + +Il contratto on-chain distribuito all'apertura del canale è responsabile della funzionalità del canale. Se il contratto è in esecuzione su Ethereum, il canale è sempre disponibile per l'uso. Al contrario, una catena laterale può sempre fallire, anche se la rete principale è operativa, mettendo a rischio i fondi degli utenti. + +#### 2. Sicurezza {#security} + +In una certa misura, i canali di stato si affidano a Ethereum per fornire sicurezza e proteggere gli utenti da peer malintenzionati. Come discusso nelle sezioni successive, i canali utilizzano un meccanismo di prova di frode che consente agli utenti di contestare i tentativi di finalizzare il canale con un aggiornamento non valido o obsoleto. + +In questo caso, la parte onesta fornisce l'ultimo stato valido del canale come prova di frode al contratto on-chain per la verifica. Le prove di frode consentono a parti reciprocamente diffidenti di condurre transazioni fuori catena senza rischiare i propri fondi nel processo. + +#### 3. Finalità {#finality} + +Gli aggiornamenti di stato firmati collettivamente dagli utenti del canale sono considerati validi quanto le transazioni on-chain. Tuttavia, tutte le attività all'interno del canale raggiungono la vera finalità solo quando il canale viene chiuso su Ethereum. + +Nel caso ottimistico, entrambe le parti possono cooperare e firmare l'aggiornamento di stato finale e inviarlo on-chain per chiudere il canale, dopodiché i fondi vengono distribuiti in base allo stato finale del canale. Nel caso pessimistico, in cui qualcuno cerca di imbrogliare pubblicando un aggiornamento di stato errato on-chain, la sua transazione non viene finalizzata fino allo scadere della finestra di contestazione. + +## Canali di stato virtuali {#virtual-state-channels} + +L'implementazione ingenua di un canale di stato consisterebbe nel distribuire un nuovo contratto quando due utenti desiderano eseguire un'applicazione fuori catena. Questo non solo è irrealizzabile, ma annulla anche il rapporto costo-efficacia dei canali di stato (i costi delle transazioni on-chain possono sommarsi rapidamente). + +Per risolvere questo problema, sono stati creati i "canali virtuali". A differenza dei canali normali che richiedono transazioni on-chain per l'apertura e la chiusura, un canale virtuale può essere aperto, eseguito e finalizzato senza interagire con la catena principale. È persino possibile risolvere le controversie fuori catena utilizzando questo metodo. + +Questo sistema si basa sull'esistenza dei cosiddetti "canali di registro" (ledger channels), che sono stati finanziati on-chain. I canali virtuali tra due parti possono essere costruiti su un canale di registro esistente, con il proprietario (o i proprietari) del canale di registro che funge da intermediario. + +Gli utenti in ogni canale virtuale interagiscono tramite una nuova istanza del contratto, con il canale di registro in grado di supportare più istanze del contratto. Lo stato del canale di registro contiene anche più di uno stato di archiviazione del contratto, consentendo l'esecuzione parallela di applicazioni fuori catena tra utenti diversi. + +Proprio come i canali normali, gli utenti si scambiano aggiornamenti di stato per far progredire la macchina a stati. A meno che non sorga una controversia, l'intermediario deve essere contattato solo all'apertura o alla chiusura del canale. + +### Canali di pagamento virtuali {#virtual-payment-channels} + +I canali di pagamento virtuali funzionano sulla stessa idea dei canali di stato virtuali: i partecipanti connessi alla stessa rete possono scambiarsi messaggi senza dover aprire un nuovo canale on-chain. Nei canali di pagamento virtuali, i trasferimenti di valore vengono instradati attraverso uno o più intermediari, con la garanzia che solo il destinatario previsto possa ricevere i fondi trasferiti. + +## Applicazioni dei canali di stato {#applications-of-state-channels} + +### Pagamenti {#payments} + +I primi canali della blockchain erano semplici protocolli che consentivano a due partecipanti di condurre trasferimenti rapidi e a basse commissioni fuori catena senza dover pagare elevate commissioni della transazione sulla rete principale. Oggi, i canali di pagamento sono ancora utili per le applicazioni progettate per lo scambio e i depositi di ether e token. + +I pagamenti basati sui canali presentano i seguenti vantaggi: + +1. **Throughput**: La quantità di transazioni fuori catena per canale è scollegata dal throughput di Ethereum, che è influenzato da vari fattori, in particolare la dimensione del blocco e il tempo di blocco. Eseguendo le transazioni fuori catena, i canali della blockchain possono ottenere un throughput più elevato. + +2. **Privacy**: Poiché i canali esistono fuori catena, i dettagli delle interazioni tra i partecipanti non vengono registrati sulla blockchain pubblica di Ethereum. Gli utenti del canale devono interagire on-chain solo per finanziare e chiudere i canali o risolvere le controversie. Pertanto, i canali sono utili per le persone che desiderano transazioni più private. + +3. **Latenza**: Le transazioni fuori catena condotte tra i partecipanti al canale possono essere regolate istantaneamente, se entrambe le parti cooperano, riducendo i ritardi. Al contrario, l'invio di una transazione sulla rete principale richiede l'attesa che i nodi elaborino la transazione, producano un nuovo blocco con la transazione e raggiungano il consenso. Gli utenti potrebbero anche dover attendere ulteriori conferme del blocco prima di considerare finalizzata una transazione. + +4. **Costo**: I canali di stato sono particolarmente utili in situazioni in cui un insieme di partecipanti scambierà molti aggiornamenti di stato per un lungo periodo. Gli unici costi sostenuti sono l'apertura e la chiusura del contratto intelligente del canale di stato; ogni cambiamento di stato tra l'apertura e la chiusura del canale sarà più economico del precedente poiché il costo di regolamento viene distribuito di conseguenza. + +L'implementazione di canali di stato su soluzioni di livello 2, come i [rollup](/developers/docs/scaling/#rollups), potrebbe renderli ancora più attraenti per i pagamenti. Sebbene i canali offrano pagamenti economici, i costi di configurazione del contratto on-chain sulla rete principale durante la fase di apertura possono diventare costosi, specialmente quando le commissioni aumentano. I rollup basati su Ethereum offrono [commissioni della transazione inferiori](https://l2fees.info/) e possono ridurre i costi generali per i partecipanti al canale abbassando le commissioni di configurazione. + +### Microtransazioni {#microtransactions} + +Le microtransazioni sono pagamenti di basso valore (ad es. inferiori a una frazione di dollaro) che le aziende non possono elaborare senza incorrere in perdite. Queste entità devono pagare i fornitori di servizi di pagamento, cosa che non possono fare se il margine sui pagamenti dei clienti è troppo basso per trarre profitto. + +I canali di pagamento risolvono questo problema riducendo i costi generali associati alle microtransazioni. Ad esempio, un fornitore di servizi Internet (ISP) può aprire un canale di pagamento con un cliente, consentendogli di inviare piccoli pagamenti in streaming ogni volta che utilizza il servizio. + +Oltre al costo di apertura e chiusura del canale, i partecipanti non incorrono in ulteriori costi sulle microtransazioni (nessuna commissione). Questa è una situazione vantaggiosa per tutti, poiché i clienti hanno maggiore flessibilità su quanto pagano per i servizi e le aziende non perdono microtransazioni redditizie. + +### Applicazioni decentralizzate {#decentralized-applications} + +Come i canali di pagamento, i canali di stato possono effettuare pagamenti condizionati in base agli stati finali della macchina a stati. I canali di stato possono anche supportare una logica di transizione di stato arbitraria, rendendoli utili per l'esecuzione di app generiche fuori catena. + +I canali di stato sono spesso limitati a semplici applicazioni a turni, poiché ciò semplifica la gestione dei fondi impegnati nel contratto on-chain. Inoltre, con un numero limitato di parti che aggiornano lo stato dell'applicazione fuori catena a intervalli, punire i comportamenti disonesti è relativamente semplice. + +L'efficienza di un'applicazione di canale di stato dipende anche dalla sua progettazione. Ad esempio, uno sviluppatore potrebbe distribuire il contratto del canale dell'app on-chain una volta e consentire ad altri giocatori di riutilizzare l'app senza dover andare on-chain. In questo caso, il canale dell'app iniziale funge da canale di registro che supporta più canali virtuali, ognuno dei quali esegue una nuova istanza del contratto intelligente dell'app fuori catena. + +Un potenziale caso d'uso per le applicazioni dei canali di stato sono i semplici giochi a due giocatori, in cui i fondi vengono distribuiti in base all'esito del gioco. Il vantaggio qui è che i giocatori non devono fidarsi l'uno dell'altro (assenza di necessità di fiducia) e il contratto on-chain, non i giocatori, controlla l'allocazione dei fondi e la risoluzione delle controversie (decentralizzazione). + +Altri possibili casi d'uso per le app dei canali di stato includono la proprietà dei nomi ENS, i registri NFT e molti altri. + +### Trasferimenti atomici {#atomic-transfers} + +I primi canali di pagamento erano limitati ai trasferimenti tra due parti, limitandone l'usabilità. Tuttavia, l'introduzione dei canali virtuali ha consentito agli individui di instradare i trasferimenti attraverso intermediari (ovvero, più canali p2p) senza dover aprire un nuovo canale on-chain. + +Comunemente descritti come "trasferimenti multi-hop", i pagamenti instradati sono atomici (ovvero, o tutte le parti della transazione hanno successo o fallisce del tutto). I trasferimenti atomici utilizzano gli [Hashed Timelock Contracts (HTLC)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts) per garantire che il pagamento venga rilasciato solo se vengono soddisfatte determinate condizioni, riducendo così il rischio di controparte. + +## Svantaggi dell'utilizzo dei canali di stato {#drawbacks-of-state-channels} + +### Presupposti di liveness {#liveness-assumptions} + +Per garantire l'efficienza, i canali di stato pongono limiti di tempo alla capacità dei partecipanti al canale di rispondere alle controversie. Questa regola presuppone che i peer saranno sempre online per monitorare l'attività del canale e contestare le sfide quando necessario. + +In realtà, gli utenti possono andare offline per motivi al di fuori del loro controllo (ad es. scarsa connessione Internet, guasto meccanico, ecc.). Se un utente onesto va offline, un peer malintenzionato può sfruttare la situazione presentando vecchi stati intermedi al contratto giudicante e rubando i fondi impegnati. + +Alcuni canali utilizzano le "torri di guardia" (watchtowers), entità responsabili di osservare gli eventi di controversia on-chain per conto di altri e di intraprendere le azioni necessarie, come avvisare le parti interessate. Tuttavia, questo può aumentare i costi di utilizzo di un canale di stato. + +### Indisponibilità dei dati {#data-unavailability} + +Come spiegato in precedenza, contestare una controversia non valida richiede la presentazione dell'ultimo stato valido del canale di stato. Questa è un'altra regola basata su un presupposto: che gli utenti abbiano accesso all'ultimo stato del canale. + +Sebbene aspettarsi che gli utenti del canale memorizzino copie dello stato dell'applicazione fuori catena sia ragionevole, questi dati potrebbero andare persi a causa di errori o guasti meccanici. Se l'utente non ha eseguito il backup dei dati, può solo sperare che l'altra parte non finalizzi una richiesta di uscita non valida utilizzando vecchie transizioni di stato in suo possesso. + +Gli utenti di Ethereum non devono affrontare questo problema poiché la rete applica regole sulla disponibilità dei dati. I dati delle transazioni vengono archiviati e propagati da tutti i nodi e sono disponibili per il download da parte degli utenti se e quando necessario. + +### Problemi di liquidità {#liquidity-issues} + +Per stabilire un canale della blockchain, i partecipanti devono bloccare i fondi in un contratto intelligente on-chain per il ciclo di vita del canale. Ciò riduce la liquidità degli utenti del canale e limita anche i canali a coloro che possono permettersi di mantenere i fondi bloccati sulla rete principale. + +Tuttavia, i canali di registro, gestiti da un fornitore di servizi fuori catena (OSP), possono ridurre i problemi di liquidità per gli utenti. Due peer connessi a un canale di registro possono creare un canale virtuale, che possono aprire e finalizzare completamente fuori catena, in qualsiasi momento lo desiderino. + +I fornitori di servizi fuori catena potrebbero anche aprire canali con più peer, rendendoli utili per l'instradamento dei pagamenti. Naturalmente, gli utenti devono pagare delle commissioni agli OSP per i loro servizi, il che potrebbe essere indesiderabile per alcuni. + +### Attacchi di griefing {#griefing-attacks} + +Gli attacchi di griefing sono una caratteristica comune dei sistemi basati su prove di frode. Un attacco di griefing non avvantaggia direttamente l'attaccante ma causa dolore (ovvero, danno) alla vittima, da cui il nome. + +La prova di frode è suscettibile agli attacchi di griefing perché la parte onesta deve rispondere a ogni controversia, anche a quelle non valide, o rischiare di perdere i propri fondi. Un partecipante malintenzionato può decidere di pubblicare ripetutamente transazioni di stato obsolete on-chain, costringendo la parte onesta a rispondere con lo stato valido. Il costo di quelle transazioni on-chain può sommarsi rapidamente, causando perdite alle parti oneste nel processo. + +### Insiemi di partecipanti predefiniti {#predefined-participant-sets} + +Per impostazione predefinita, il numero di partecipanti che compongono un canale di stato rimane fisso per tutta la sua durata. Questo perché l'aggiornamento dell'insieme dei partecipanti complicherebbe il funzionamento del canale, specialmente durante il finanziamento del canale o la risoluzione delle controversie. L'aggiunta o la rimozione di partecipanti richiederebbe anche un'attività on-chain aggiuntiva, che aumenta i costi generali per gli utenti. + +Sebbene ciò renda i canali di stato più facili da analizzare, limita l'utilità dei design dei canali per gli sviluppatori di applicazioni. Questo spiega in parte perché i canali di stato sono stati abbandonati a favore di altre soluzioni di scalabilità, come i rollup. + +### Elaborazione parallela delle transazioni {#parallel-transaction-processing} + +I partecipanti al canale di stato inviano aggiornamenti di stato a turni, motivo per cui funzionano meglio per le "applicazioni a turni" (ad es. una partita a scacchi a due giocatori). Ciò elimina la necessità di gestire aggiornamenti di stato simultanei e riduce il lavoro che il contratto on-chain deve svolgere per punire chi pubblica aggiornamenti obsoleti. Tuttavia, un effetto collaterale di questo design è che le transazioni dipendono l'una dall'altra, aumentando la latenza e diminuendo l'esperienza utente complessiva. + +Alcuni canali di stato risolvono questo problema utilizzando un design "full-duplex" che separa lo stato fuori catena in due stati "simplex" unidirezionali, consentendo aggiornamenti di stato simultanei. Tali design migliorano il throughput fuori catena e riducono i ritardi delle transazioni. + +## Utilizzare i canali di stato {#use-state-channels} + +Diversi progetti fornisono implementazioni di canali di stato che puoi integrare nelle tue dApp: + +- [Connext](https://connext.network/) +- [Kchannels](https://www.kchannels.io/) +- [Perun](https://perun.network/) +- [Raiden](https://raiden.network/) +- [Statechannels.org](https://statechannels.org/) + +## Letture consigliate {#further-reading} + +**Canali di stato** + +- [Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, 12 febbraio 2018_ +- [State Channels - an explanation](https://www.jeffcoleman.ca/state-channels/) _6 novembre 2015 - Jeff Coleman_ +- [Basics of State Channels](https://unlock-protocol.github.io/ethhub/ethereum-roadmap/layer-2-scaling/state-channels/) _District0x_ +- [Blockchain State Channels: A State of the Art](https://ieeexplore.ieee.org/document/9627997) + +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/validium/index.md b/public/content/translations/it/developers/docs/scaling/validium/index.md index eea7e0b546f..fa42999783e 100644 --- a/public/content/translations/it/developers/docs/scaling/validium/index.md +++ b/public/content/translations/it/developers/docs/scaling/validium/index.md @@ -1,157 +1,157 @@ --- title: Validium -description: Un'introduzione a Validium come soluzione di scalabilità, attualmente utilizzata dalla comunità Ethereum. +description: "Un'introduzione a Validium come soluzione di scalabilità attualmente utilizzata dalla community di Ethereum." lang: it sidebarDepth: 3 --- -Validium è una [soluzione di ridimensionamento](/developers/docs/scaling/) che impongono l'integrità delle transazioni usando prove di validità come i [rollup ZK](/developers/docs/scaling/zk-rollups/), ma non memorizza i dati della transazione sulla Rete principale di Ethereum. Sebbene la disponibilità di dati off-chain introduca dei compromessi, può tradursi in enormi miglioramenti della scalabilità (i validium possono elaborare [circa 9.000 transazioni o più, al secondo](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263)). +Validium è una [soluzione di scalabilità](/developers/docs/scaling/) che applica l'integrità delle transazioni utilizzando prove di validità come i [rollup a conoscenza zero](/developers/docs/scaling/zk-rollups/), ma non archivia i dati delle transazioni sulla rete principale di [Ethereum](/). Sebbene la disponibilità dei dati fuori catena introduca dei compromessi, può portare a massicci miglioramenti nella scalabilità (i validium possono elaborare [\~9.000 transazioni, o più, al secondo](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263)). ## Prerequisiti {#prerequisites} -Dovresti aver letto e compreso la nostra pagina sul [ridimensionamento di Ethereum](/developers/docs/scaling/) e il [livello 2](/layer-2). +Dovresti aver letto e compreso la nostra pagina sulla [scalabilità di Ethereum](/developers/docs/scaling/) e sul [livello 2](/layer-2). -## Cos'è un validium? {#what-is-validium} +## Cos'è validium? {#what-is-validium} -I validium sono soluzioni di ridimensionamento che usano la disponibilità di dati off-chain e il calcolo progettato per migliorare il volume elaborando le transazioni al di fuori della Rete principale di Ethereum. Come i rollup a conoscenza zero (rollup ZK), i validium pubblicano delle [prove a conoscenza zero](/glossary/#zk-proof) per verificare le transazioni off-chain su Ethereum. Questo impedisce transizioni di stato non valide e migliora le garanzie di sicurezza di una catena validium. +I validium sono soluzioni di scalabilità che utilizzano la disponibilità dei dati e il calcolo fuori catena progettati per migliorare il throughput elaborando le transazioni fuori dalla rete principale di Ethereum. Come i rollup a conoscenza zero (ZK-rollup), i validium pubblicano [prove a conoscenza-zero](/glossary/#zk-proof) per verificare le transazioni fuori catena su Ethereum. Questo previene transizioni di stato non valide e migliora le garanzie di sicurezza di una catena validium. -Queste "prove di validità" possono essere sotto forma di ZK-SNARK (argomenti di conoscenza succinti non interattivi a conoscenza zero) o ZK-STARK (argomenti di conoscenza trasparenti e scalabili a conoscenza zero). Maggiori informazioni sulle [prove a conoscenza zero](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/). +Queste "prove di validità" possono presentarsi sotto forma di ZK-SNARK (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) o ZK-STARK (Zero-Knowledge Scalable Transparent ARgument of Knowledge). Maggiori informazioni sulle [prove a conoscenza-zero](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/). -I fondi appartenenti agli utenti di validium sono controllati da un contratto intelligente su Ethereum. I validium offrono prelievi quasi istantanei, analogamente ai rollup ZK; una volta che la prova di validità per una richiesta di prelievo è stata verificata sulla Rete principale, gli utenti possono prelevare i fondi fornendo delle [prove di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/). La prova di Merkle convalida l'inclusione della transazione di prelievo dell'utente in un batch di transazioni verificate, consentendo al contratto on-chain di elaborare il prelievo. +I fondi appartenenti agli utenti di validium sono controllati da un contratto intelligente su Ethereum. I validium offrono prelievi quasi istantanei, in modo molto simile agli ZK-rollup; una volta che la prova di validità per una richiesta di prelievo è stata verificata sulla rete principale, gli utenti possono prelevare i fondi fornendo [prove di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/). La prova di Merkle convalida l'inclusione della transazione di prelievo dell'utente in un lotto di transazioni verificato, consentendo al contratto on-chain di elaborare il prelievo. -Tuttavia, gli utenti di validium possono vedersi congelati i fondi e limitati i prelievi. Questo può verificarsi se i gestori della disponibilità dei dati sulla catena validium trattengono i dati di stato off-chain dagli utenti. Senza accesso ai dati della transazione, gli utenti non possono calcolare la prova di Merkle richiesta per dimostrare la proprietà dei fondi ed eseguire i prelievi. +Tuttavia, gli utenti di validium possono subire il congelamento dei propri fondi e la limitazione dei prelievi. Questo può accadere se i gestori della disponibilità dei dati sulla catena validium nascondono agli utenti i dati di stato fuori catena. Senza accesso ai dati delle transazioni, gli utenti non possono calcolare la prova di Merkle necessaria per dimostrare la proprietà dei fondi ed eseguire i prelievi. -Questa è la differenza principale tra i validium e i rollup ZK: le loro posizioni sullo spettro della disponibilità dei dati. Le due soluzioni affrontano l'archiviazione dei dati in modo diverso, il che ha implicazioni per la sicurezza e la mancanza di fiducia. +Questa è la principale differenza tra i validium e gli ZK-rollup: le loro posizioni nello spettro della disponibilità dei dati. Entrambe le soluzioni affrontano l'archiviazione dei dati in modo diverso, il che ha implicazioni per la sicurezza e l'assenza di fiducia. ## Come interagiscono i validium con Ethereum? {#how-do-validiums-interact-with-ethereum} -I validium sono protocolli di ridimensionamento basati sulla catena di Ethereum esistente. Sebbene esegua le transazioni al di fuori della catena, una catena di Validium è amministrata da un insieme di contratti intelligenti distribuiti sulla Rete Principale, tra cui: +I validium sono protocolli di scalabilità costruiti sopra la catena esistente di Ethereum. Sebbene esegua transazioni fuori catena, una catena validium è amministrata da una raccolta di contratti intelligenti distribuiti sulla rete principale, tra cui: -1. **Contratto di verifica**: il contratto di verifica, verifica la validità delle prove inviate dall'operatore di validium creando aggiornamenti di stato. Questo include le prove di validità che attestano la correttezza delle transazioni off-chain e le prove di disponibilità dei dati che verificano l'esistenza dei dati della transazione off-chain. +1. **Contratto verificatore**: Il contratto verificatore verifica la validità delle prove inviate dall'operatore del validium quando effettua aggiornamenti di stato. Questo include prove di validità che attestano la correttezza delle transazioni fuori catena e prove di disponibilità dei dati che verificano l'esistenza dei dati delle transazioni fuori catena. -2. **Contratto principale**: il contratto principale memorizza gli impegni di stato (radici di Merkle) inviati dai produttori di blocchi e aggiorna lo stato del validium una volta verificata la prova di validità sulla catena. Questo contratto elabora inoltre i depositi alla e i prelievi dalla catena validium. +2. **Contratto principale**: Il contratto principale archivia gli impegni di stato (radici di Merkle) inviati dai produttori di blocchi e aggiorna lo stato del validium una volta che una prova di validità viene verificata on-chain. Questo contratto elabora anche i depositi e i prelievi dalla catena validium. I validium si affidano anche alla catena principale di Ethereum per quanto segue: -### Accordo {#settlement} +### Regolamento {#settlement} -Le transazioni eseguite su un validium non possono essere completamente confermate finché la catena genitore ne verifica la validità. Tutte le attività svolte su un validium devono essere infine regolate sulla Rete principale. La blockchain di Ethereum fornisce anche "garanzie di accordo" per gli utenti di validium, a significare che le transazioni off-chain non sono annullabili o alterabili una volta che se ne è assunto l'impegno sulla catena. +Le transazioni eseguite su un validium non possono essere completamente confermate finché la catena genitore non ne verifica la validità. Tutte le operazioni condotte su un validium devono infine essere regolate sulla rete principale. La blockchain di Ethereum fornisce anche "garanzie di regolamento" per gli utenti di validium, il che significa che le transazioni fuori catena non possono essere annullate o alterate una volta impegnate on-chain. ### Sicurezza {#security} -Ethereum, agendo da livello d'accordo, garantisce anche la validità delle transizioni di stato su validium. Le transazioni esterne alla catena eseguite sulla catena di Validium sono verificate tramite un contratto intelligente sul livello di base di Ethereum. +Ethereum, agendo come livello di regolamento, garantisce anche la validità delle transizioni di stato su validium. Le transazioni fuori catena eseguite sulla catena validium sono verificate tramite un contratto intelligente sul livello base di Ethereum. -Se il contratto di verifica on-chain ritiene che la prova non sia valida, le transazioni sono rifiutate. Questo significa che gli operatori devono soddisfare le condizioni di validità imposte dal protocollo Ethereum prima di aggiornare lo stato del validium. +Se il contratto verificatore on-chain ritiene la prova non valida, le transazioni vengono rifiutate. Questo significa che gli operatori devono soddisfare le condizioni di validità imposte dal protocollo di Ethereum prima di aggiornare lo stato del validium. -## Come funziona un validium? {#how-does-validium-work} +## Come funziona validium? {#how-does-validium-work} ### Transazioni {#transactions} -Gli utenti inviano le transazioni all'operatore, un nodo responsabile di eseguire le transazioni sulla catena validium. Alcuni validium potrebbero usare un unico operatore per eseguire la catena o affidarsi a un meccanismo di [proof-of-stake (PoS)](/developers/docs/consensus-mechanisms/pos/) per la rotazione degli operatori. +Gli utenti inviano transazioni all'operatore, un nodo responsabile dell'esecuzione delle transazioni sulla catena validium. Alcuni validium potrebbero utilizzare un unico operatore per eseguire la catena o affidarsi a un meccanismo di [prova di stake (PoS)](/developers/docs/consensus-mechanisms/pos/) per la rotazione degli operatori. -L'operatore aggrega le transazioni in un batch e lo invia a un circuito di prova. Il circuito di prova accetta il batch di transazioni (e altri dati pertinenti) come input e restituisce una prova di validità che verifica che le operazioni siano state eseguite correttamente. +L'operatore aggrega le transazioni in un lotto e lo invia a un circuito di prova per la dimostrazione. Il circuito di prova accetta il lotto di transazioni (e altri dati rilevanti) come input e produce una prova di validità che verifica che le operazioni siano state eseguite correttamente. ### Impegni di stato {#state-commitments} -Lo stato del validium è associato a un hash come un albero di Merkle, con la radice memorizzata nel contratto principale su Ethereum. La radice di Merkle, anche nota come radice di stato, agisce da impegno crittografico allo stato corrente dei conti e saldi sul Validium. +Lo stato del validium viene sottoposto a hash come un albero di Merkle con la radice archiviata nel contratto principale su Ethereum. La radice di Merkle, nota anche come radice di stato, funge da impegno crittografico allo stato attuale degli account e dei saldi sul validium. -Per eseguire un aggiornamento di stato, l'operatore deve calcolare una nuova radice di stato (dopo aver eseguito le transazioni) e inviarla al contratto on-chain. Se la prova di validità corrisponde, lo stato proposto viene accettato e il validium passa alla nuova radice di stato. +Per eseguire un aggiornamento di stato, l'operatore deve calcolare una nuova radice di stato (dopo aver eseguito le transazioni) e inviarla al contratto on-chain. Se la prova di validità risulta corretta, lo stato proposto viene accettato e il validium passa alla nuova radice di stato. ### Depositi e prelievi {#deposits-and-withdrawals} -Gli utenti spostano i fondi da Ethereum a un validium depositando ETH (o qualsiasi token compatibile con ERC) nel contratto on-chain. Il contratto trasmette l'evento di deposito al validium al di fuori della catena, dove sull'indirizzo dell'utente viene accreditato un importo equivalente al suo deposito. L'operatore include inoltre questa transazione di deposito in un nuovo batch. +Gli utenti spostano fondi da Ethereum a un validium depositando ETH (o qualsiasi token compatibile con ERC) nel contratto on-chain. Il contratto trasmette l'evento di deposito al validium fuori catena, dove all'indirizzo dell'utente viene accreditato un importo pari al suo deposito. L'operatore include anche questa transazione di deposito in un nuovo lotto. -Per spostare nuovamente i fondi nella Rete principale, l'utente di un validium avvia una transazione di prelievo e la invia all'operatore, che convalida la richiesta di prelievo e la include in un batch. Le risorse dell'utente sulla catena validium sono inoltre distrutte prima che possano uscire dal sistema. Una volta che la prova di validità associata al batch è verificata, l'utente può richiamare il contratto principale per prelevare ciò che rimane del suo deposito iniziale. +Per spostare i fondi di nuovo sulla rete principale, un utente di validium avvia una transazione di prelievo e la invia all'operatore che convalida la richiesta di prelievo e la include in un lotto. Anche gli asset dell'utente sulla catena validium vengono distrutti prima che possano uscire dal sistema. Una volta verificata la prova di validità associata al lotto, l'utente può chiamare il contratto principale per prelevare il resto del suo deposito iniziale. -Come meccanismo anti-censura, il protocollo validium consente agli utenti di prelevare direttamente dal contratto di validium senza passare per l'operatore. In questo caso, gli utenti devono fornire una prova di Merkle al contratto di verifica, mostrando l'inclusione di un conto nella radice di stato. Se la prova è accettata, l'utente può richiamare la funzione di prelievo del contratto principale per far uscire i suoi fondi dal validium. +Come meccanismo anti-censura, il protocollo validium consente agli utenti di prelevare direttamente dal contratto validium senza passare per l'operatore. In questo caso, gli utenti devono fornire una prova di Merkle al contratto verificatore che mostri l'inclusione di un account nella radice di stato. Se la prova viene accettata, l'utente può chiamare la funzione di prelievo del contratto principale per far uscire i propri fondi dal validium. -### Invio del batch {#batch-submission} +### Invio del lotto {#batch-submission} -Dopo aver eseguito un lotto di transazioni, l'operatore invia la prova di validità associata al contratto verificatore e propone una nuova radice di stato al contratto principale. Se la prova è valida, il contratto principale aggiorna lo stato del validium e finalizza i risultati delle transazioni nel batch. +Dopo aver eseguito un lotto di transazioni, l'operatore invia la prova di validità associata al contratto verificatore e propone una nuova radice di stato al contratto principale. Se la prova è valida, il contratto principale aggiorna lo stato del validium e finalizza i risultati delle transazioni nel lotto. -A differenza di un rollup ZK, i produttori di blocchi su un validium non devono pubblicare i dati della transazione per i batch di transazioni (solo le intestazioni dei blocchi). Questo rende validium un protocollo di ridimensionamento puramente off-chain, a differenza dei protocolli di ridimensionamento "ibridi" (cioè, il [livello 2](/layer-2/)) che pubblicano i dati di stato sulla catena principale di Ethereum come `calldata`. +A differenza di uno ZK-rollup, i produttori di blocchi su un validium non sono tenuti a pubblicare i dati delle transazioni per i lotti di transazioni (solo le intestazioni dei blocchi). Questo rende validium un protocollo di scalabilità puramente fuori catena, in contrasto con i protocolli di scalabilità "ibridi" (cioè, [livello 2](/layer-2/)) che pubblicano i dati di stato sulla catena principale di Ethereum utilizzando dati blob, `calldata` o una combinazione di entrambi. ### Disponibilità dei dati {#data-availability} -Come accennato, i validium utilizzano un modello di disponibilità dei dati off-chain, dove gli operatori memorizzano tutti i dati delle transazioni al di fuori della Rete principale di Ethereum. La bassa impronta di dati on-chain di validium migliora la scalabilità (il volume non è limitato dalla capacità di elaborazione dei dati di Ethereum) e riduce le commissioni dell'utente (il costo di pubblicazione di `calldata` è inferiore). +Come accennato, i validium utilizzano un modello di disponibilità dei dati fuori catena, in cui gli operatori archiviano tutti i dati delle transazioni fuori dalla rete principale di Ethereum. La bassa impronta dei dati on-chain di Validium migliora la scalabilità (il throughput non è limitato dalla capacità di elaborazione dei dati di Ethereum) e riduce le commissioni per gli utenti (il costo di pubblicazione dei dati on-chain è inferiore). -La disponibilità di dati off-chain, tuttavia, presenta un problema: i dati necessari per creare o verificare le prove di Merkle potrebbero non essere disponibili. Questo significa che gli utenti potrebbero non riuscire a prelevare i fondi dal contratto on-chain se gli operatori dovessero agire in modo malevolo. +La disponibilità dei dati fuori catena, tuttavia, presenta un problema: i dati necessari per creare o verificare le prove di Merkle potrebbero non essere disponibili. Questo significa che gli utenti potrebbero non essere in grado di prelevare fondi dal contratto on-chain se gli operatori dovessero agire in modo malevolo. -Varie soluzioni di validium tentano di risolvere questo problema decentralizzando l'archiviazione dei dati di stato. Questo comporta di costringere i produttori di blocchi a inviare i dati sottostanti a "gestori della disponibilità dei dati", responsabili dell'archiviazione dei dati off-chain e di renderli disponibili agli utenti su richiesta. +Varie soluzioni validium tentano di risolvere questo problema decentralizzando l'archiviazione dei dati di stato. Questo comporta costringere i produttori di blocchi a inviare i dati sottostanti ai "gestori della disponibilità dei dati" responsabili dell'archiviazione dei dati fuori catena e di renderli disponibili agli utenti su richiesta. -I gestori della disponibilità dei dati in validium attestano alla disponibilità dei dati per le transazioni off-chain firmando ogni batch del validium. Queste firme costituiscono una forma di "prova di disponibilità", che il contratto di verifica on-chain controlla prima di approvare gli aggiornamenti di stato. +I gestori della disponibilità dei dati in validium attestano la disponibilità dei dati per le transazioni fuori catena firmando ogni lotto validium. Queste firme costituiscono una forma di "prova di disponibilità" che il contratto verificatore on-chain controlla prima di approvare gli aggiornamenti di stato. -I validium differiscono nel loro approccio alla gestione della disponibilità dei dati. Alcuni si affidano a parti fidate per memorizzare i dati di stato, mentre altri usano dei validatori assegnati casualmente per l'attività. +I validium differiscono nel loro approccio alla gestione della disponibilità dei dati. Alcuni si affidano a parti fidate per archiviare i dati di stato, mentre altri utilizzano validatori assegnati casualmente per il compito. -#### Comitato di disponibilità dei dati (DAC) {#data-availability-committee} +#### Comitato per la disponibilità dei dati (DAC) {#data-availability-committee} -Per garantire la disponibilità di dati off-chain, alcune soluzioni di validium nominano un gruppo di entità fidate, collettivamente note come comitato di disponibilità dei dati (DAC), per memorizzare copie dello stato e fornire prova della disponibilità dei dati. I DAC sono più facili da implementare e richiedono un coordinamento minore, vista la bassa adesione. +Per garantire la disponibilità dei dati fuori catena, alcune soluzioni validium nominano un gruppo di entità fidate, note collettivamente come comitato per la disponibilità dei dati (DAC), per archiviare copie dello stato e fornire prove della disponibilità dei dati. I DAC sono più facili da implementare e richiedono meno coordinamento poiché il numero di membri è basso. -Tuttavia, gli utenti devono fidarsi del fatto che i DAC rendono disponibili i dati quando serve (ad es. per generare le prove di Merkle). Esiste la possibilità che i membri del comitato di disponibilità dei dati [siano compromessi da un attore malevolo](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view), che potrebbe poi trattenere i dati off-chain. +Tuttavia, gli utenti devono fidarsi del DAC affinché renda i dati disponibili quando necessario (ad es., per generare prove di Merkle). C'è la possibilità che i membri dei comitati per la disponibilità dei dati [vengano compromessi da un attore malevolo](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view) che può quindi trattenere i dati fuori catena. -[Maggiori informazioni sui comitati di disponibilità dei dati nei validium](https://medium.com/starkware/data-availability-e5564c416424). +[Maggiori informazioni sui comitati per la disponibilità dei dati nei validium](https://medium.com/starkware/data-availability-e5564c416424). #### Disponibilità dei dati vincolata {#bonded-data-availability} -Altri validium richiedono ai partecipanti incaricati di archiviare i dati offline, di mettere in staking (cioè bloccare) i token in un contratto intelligente, prima di assumere i propri ruoli. Questo staking funge da "cauzione" per garantire il comportamento onesto tra i gestori della disponibilità dei dati e riduce le ipotesi di fiducia. Se questi partecipanti non riescono a provare la disponibilità dei dati, la cauzione viene decurtata. +Altri validium richiedono ai partecipanti incaricati di archiviare i dati offline di mettere in stake (cioè, bloccare) token in un contratto intelligente prima di assumere i loro ruoli. Questo stake funge da "vincolo" per garantire un comportamento onesto tra i gestori della disponibilità dei dati e riduce le ipotesi di fiducia. Se questi partecipanti non riescono a dimostrare la disponibilità dei dati, il vincolo viene punito. -In uno schema di disponibilità dei dati vincolato, chiunque può esser assegnato a detenere dati off-chain una volta fornito lo stake necessario. Questo espande il pool di gestori di disponibilità dei dati idonei, riducendo la centralizzazione che influenza i comitati di disponibilità dei dati (DAC). Ancora più importante, questo approccio si affida a incentivi criptoeconomici per prevenire l'attività malevola, il che è considerevolmente più sicuro che nominare parti fidate per proteggere i dati offline nel validium. +In uno schema di disponibilità dei dati vincolata, chiunque può essere assegnato a conservare i dati fuori catena una volta fornito lo stake richiesto. Questo espande il pool di gestori della disponibilità dei dati idonei, riducendo la centralizzazione che affligge i comitati per la disponibilità dei dati (DAC). Ancora più importante, questo approccio si basa su incentivi criptoeconomici per prevenire attività malevole, il che è considerevolmente più sicuro rispetto alla nomina di parti fidate per proteggere i dati offline nel validium. [Maggiori informazioni sulla disponibilità dei dati vincolata nei validium](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf). -## Volizioni e validium {#volitions-and-validium} +## Volition e validium {#volitions-and-validium} -I validium offrono molti vantaggi, ma presentano dei compromessi (in particolare, la disponibilità dei dati). Ma, come molte soluzioni di ridimensionamento, i validium sono adatti a casi d'uso specifici, ecco perché sono state create le volizioni. +I validium offrono molti vantaggi ma comportano dei compromessi (in particolare, la disponibilità dei dati). Ma, come per molte soluzioni di scalabilità, i validium sono adatti a casi d'uso specifici, motivo per cui sono state create le volition. -Le volizioni combinano un rollup ZK e una catena validium e consentono agli utenti di passare tra le due soluzioni di ridimensionamento. Con le volizioni, gli utenti possono approfittare della disponibilità di dati off-chain di validium per determinate transazioni, mantenendo la libertà di passare a una soluzione di disponibilità dei dati on-chain (rollup ZK) se necessario. Questo dà essenzialmente agli utenti la libertà di scegliere i compromessi in base alle loro circostanze specifiche. +Le volition combinano uno ZK-rollup e una catena validium e consentono agli utenti di passare da una soluzione di scalabilità all'altra. Con le volition, gli utenti possono sfruttare la disponibilità dei dati fuori catena del validium per determinate transazioni, pur mantenendo la libertà di passare a una soluzione di disponibilità dei dati on-chain (ZK-rollup) se necessario. Questo dà essenzialmente agli utenti la libertà di scegliere i compromessi dettati dalle loro circostanze uniche. -Una piattaforma di scambio decentralizzata (DEX) potrebbe preferire l'uso di un'infrastruttura scalabile e privata di validium per gli scambi di valore elevato. Può anche usare un rollup ZK per gli utenti che desiderano le maggiori garanzie di sicurezza e la mancanza di fiducia dei rollup ZK. +Un exchange decentralizzato (DEX) potrebbe preferire l'utilizzo dell'infrastruttura scalabile e privata di un validium per scambi di alto valore. Può anche utilizzare uno ZK-rollup per gli utenti che desiderano le maggiori garanzie di sicurezza e l'assenza di fiducia di uno ZK-rollup. -## Compatibilità tra validium ed EVM {#validiums-and-evm-compatibility} +## Validium e compatibilità con l'EVM {#validiums-and-evm-compatibility} -Come i rollup ZK, i validium sono per lo più adatti ad applicazioni semplici, come gli scambi di token e i pagamenti. Supportare il calcolo generale e l'esecuzione di contratti intelligenti tra i Validium è difficile da implementare, dato il considerevole sovraccarico del provare le istruzioni dell'[EVM](/developers/docs/evm/) in un circuito di prova a conoscenza zero. +Come gli ZK-rollup, i validium sono per lo più adatti ad applicazioni semplici, come gli scambi di token e i pagamenti. Supportare il calcolo generale e l'esecuzione di contratti intelligenti tra i validium è difficile da implementare, dato il notevole sovraccarico nel dimostrare le istruzioni della [macchina virtuale di Ethereum](/developers/docs/evm/) in un circuito di prova a conoscenza-zero. -Alcuni progetti di validium provano ad aggirare questo problema compilando linguaggi compatibili all'EVM (es., Solidity, Vyper) per creare bytecode personalizzato e ottimizzato per una prova efficiente. Un inconveniente di questo approccio è che le nuove VM proof-friendly a conoscenza zero potrebbero non supportare importanti opcode dell'EVM, e gli sviluppatori devono scrivere direttamente nel linguaggio di alto livello per un'esperienza ottimale. Questo crea persino più problemi: obbliga gli sviluppatori a creare dapp con uno stack di sviluppo del tutto nuovo e spezza la compatibilità con l'infrastruttura corrente di Ethereum. +Alcuni progetti validium tentano di aggirare questo problema compilando linguaggi compatibili con l'EVM (ad es., Solidity, Vyper) per creare bytecode personalizzato ottimizzato per una dimostrazione efficiente. Uno svantaggio di questo approccio è che le nuove VM adatte alle prove a conoscenza-zero potrebbero non supportare importanti opcode dell'EVM, e gli sviluppatori devono scrivere direttamente nel linguaggio di alto livello per un'esperienza ottimale. Questo crea ancora più problemi: costringe gli sviluppatori a creare dApp con uno stack di sviluppo completamente nuovo e interrompe la compatibilità con l'attuale infrastruttura di Ethereum. -Alcuni team, tuttavia, stanno cercando di ottimizzare gli opcode EVM esistenti per i circuiti di prova ZK. Questo risulterà nello sviluppo di una Macchina virtuale di Ethereum a conoscenza zero (zkEVM), una VM compatibile all'EVM che produce prove per verificare la correttezza dell'esecuzione del programma. Con una zkEVM, le catene di Validium possono eseguire i contratti intelligenti all'esterno della catena e inviare le prove di validità per verificare un calcolo esterno alla catena (senza doverlo eseguire nuovamente) su Ethereum. +Alcuni team, tuttavia, stanno tentando di ottimizzare gli opcode esistenti dell'EVM per i circuiti di prova ZK. Questo porterà allo sviluppo di una macchina virtuale di Ethereum a conoscenza-zero (zkEVM), una VM compatibile con l'EVM che produce prove per verificare la correttezza dell'esecuzione del programma. Con una zkEVM, le catene validium possono eseguire contratti intelligenti fuori catena e inviare prove di validità per verificare un calcolo fuori catena (senza doverlo rieseguire) su Ethereum. [Maggiori informazioni sulle zkEVM](https://www.alchemy.com/overviews/zkevm). -## Come fanno i validium a ridimensionare Ethereum? {#scaling-ethereum-with-validiums} +## In che modo i validium scalano Ethereum? {#scaling-ethereum-with-validiums} -### 1. Archiviazione dei dati off-chain {#off-chain-data-storage} +### 1. Archiviazione dei dati fuori catena {#offchain-data-storage} -I progetti di ridimensionamento del livello 2, come i rollup ottimistici e a conoscenza zero, rinunciano all'infinita scalabilità dei protocolli di ridimensionamento off-chain puri (ad es. [Plasma](/developers/docs/scaling/plasma/)) in cambio della sicurezza, pubblicando alcuni dati di transazione su L1. Ma questo fa sì che le proprietà di scalabilità dei rollup sia limitata dalla larghezza di banda dei dati sulla Rete principale di Ethereum (lo [sharding dei dati](/roadmap/danksharding/) propone di migliorare la capacità di archiviazione dei dati di Ethereum per questo motivo). +I progetti di scalabilità di livello 2, come i rollup ottimistici e gli ZK-rollup, scambiano la scalabilità infinita dei protocolli di scalabilità puramente fuori catena (ad es., [Plasma](/developers/docs/scaling/plasma/)) con la sicurezza pubblicando alcuni dati delle transazioni su L1. Ma questo significa che le proprietà di scalabilità dei rollup sono limitate dalla larghezza di banda dei dati sulla rete principale di Ethereum (la [frammentazione](/roadmap/danksharding/) propone di migliorare la capacità di archiviazione dei dati di Ethereum per questo motivo). -I validium ottengono la scalabilità mantenendo tutti i dati della transazione al di fuori della catena e pubblicando gli impegni di stato (e le prove di validità) solo quando ritrasmettono gli aggiornamenti di stato alla catena principale di Ethereum. L'esistenza delle prove di validità, tuttavia, dà ai validium garanzie di sicurezza maggiori rispetto ad altre soluzioni di ridimensionamento off-chain pure, tra cui Plasma e le [sidechain](/developers/docs/scaling/sidechains/). Riducendo la quantità di dati che Ethereum deve elaborare prima di convalidare le transazioni off-chain, i validium estendono enormemente il volume sulla Rete principale. +I validium ottengono la scalabilità mantenendo tutti i dati delle transazioni fuori catena e pubblicano solo gli impegni di stato (e le prove di validità) quando trasmettono gli aggiornamenti di stato alla catena principale di Ethereum. L'esistenza di prove di validità, tuttavia, conferisce ai validium garanzie di sicurezza superiori rispetto ad altre soluzioni di scalabilità puramente fuori catena, tra cui Plasma e le [catene laterali](/developers/docs/scaling/sidechains/). Riducendo la quantità di dati che Ethereum deve elaborare prima di convalidare le transazioni fuori catena, i design dei validium estendono notevolmente il throughput sulla rete principale. ### 2. Prove ricorsive {#recursive-proofs} -Una prova ricorsiva è una prova di validità che verifica la validità di altre prove. Questa "prova di prove" è generata aggregando diverse prove in modo ricorsivo finché non viene creata una prova finale che verifica tutte le prove precedenti. Le prove ricorsive scalano le velocità d'elaborazione della blockchain aumentando il numero di transazioni verificabili per prova di validità. +Una prova ricorsiva è una prova di validità che verifica la validità di altre prove. Queste "prove di prove" vengono generate aggregando ricorsivamente più prove fino a creare un'unica prova finale che verifica tutte le prove precedenti. Le prove ricorsive scalano le velocità di elaborazione della blockchain aumentando il numero di transazioni che possono essere verificate per ogni prova di validità. -Tipicamente, ogni prova di validità che l'operatore del validium invia a Ethereum per la verifica convalida l'integrità di un singolo blocco. Una singola prova ricorsiva può essere utilizzata per confermare la validità di diversi blocchi di validium allo stesso tempo; ciò è possibile poiché il circuito di prova può aggregare in modo ricorsivo diverse prove di blocco in una prova finale. Se il contratto di verifica on-chain accetta la prova ricorsiva, tutti i blocchi sottostanti sono immediatamente finalizzati. +In genere, ogni prova di validità che l'operatore del validium invia a Ethereum per la verifica convalida l'integrità di un singolo blocco. Mentre una singola prova ricorsiva può essere utilizzata per confermare la validità di diversi blocchi validium contemporaneamente: questo è possibile poiché il circuito di prova può aggregare ricorsivamente diverse prove di blocco in un'unica prova finale. Se il contratto verificatore on-chain accetta la prova ricorsiva, tutti i blocchi sottostanti vengono finalizzati immediatamente. ## Pro e contro di validium {#pros-and-cons-of-validium} -| Pro | Contro | -| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Le prove di validità impongono l'integrità delle transazioni off-chain e impediscono agli operatori di finalizzare aggiornamenti di stato non validi. | Produrre le prove di validità richiede hardware speciale, il che pone un rischio di centralizzazione. | -| Aumenta l'efficienza del capitale per gli utenti (nessun ritardo nel prelievo dei fondi per riportarli su Ethereum) | Supporto limitato al calcolo generale/ai contratti intelligenti; linguaggi specializzati richiesti per lo sviluppo. | -| Non vulnerabile a certi tipi di attacchi economici subiti da sistemi basati su prove di frode in applicazioni ad alto valore. | Elevata potenza di calcolo per generare le prove ZK; non conveniente per applicazioni a basso volume. | -| Riduce le commissioni del gas per gli utenti, non pubblicando i calldata alla Rete Principale di Ethereum. | Tempo di finalità soggettiva più limitato (10-30 minuti per generare una prova ZK) ma più veloce per la finalità completa perché non c'è ritardo dovuto ai tempi di contestazione. | -| Idoneo per casi d'uso specifici, come trading o gaming su blockchain, che danno priorità alla privacy e alla scalabilità della transazione. | Agli utenti può essere impedito il prelievo di fondi poiché la generazione delle prove di Merkle della proprietà richiede la continua disponibilità dei dati off-chain. | -| La disponibilità di dati off-chain fornisce livelli di volume maggiori e aumenta la scalabilità. | Il modello di sicurezza si affida a ipotesi di fiducia e incentivi cripto-economici, a differenza dei rollup ZK, che si affidano puramente a meccanismi di sicurezza crittografica. | +| Pro | Contro | +| --- | --- | +| Le prove di validità applicano l'integrità delle transazioni fuori catena e impediscono agli operatori di finalizzare aggiornamenti di stato non validi. | La produzione di prove di validità richiede hardware speciale, il che comporta un rischio di centralizzazione. | +| Aumenta l'efficienza del capitale per gli utenti (nessun ritardo nel prelevare i fondi di nuovo su Ethereum). | Supporto limitato per il calcolo generale/contratti intelligenti; sono richiesti linguaggi specializzati per lo sviluppo. | +| Non vulnerabile a determinati attacchi economici affrontati dai sistemi basati su prove di frode in applicazioni di alto valore. | Elevata potenza di calcolo richiesta per generare prove ZK; non conveniente per applicazioni a basso throughput. | +| Riduce le commissioni del gas per gli utenti non pubblicando calldata sulla rete principale di Ethereum. | Tempo di finalità soggettiva più lento (10-30 min per generare una prova ZK) ma più veloce per la finalità completa perché non c'è alcun ritardo per le dispute. | +| Adatto a casi d'uso specifici, come il trading o il gaming su blockchain che danno priorità alla privacy delle transazioni e alla scalabilità. | Agli utenti può essere impedito di prelevare fondi poiché la generazione di prove di Merkle di proprietà richiede che i dati fuori catena siano sempre disponibili. | +| La disponibilità dei dati fuori catena fornisce livelli più elevati di throughput e aumenta la scalabilità. | Il modello di sicurezza si basa su ipotesi di fiducia e incentivi criptoeconomici, a differenza degli ZK-rollup, che si basano puramente su meccanismi di sicurezza crittografica. | -### Usare validium/volizioni {#use-validium-and-volitions} +### Usa Validium/Volition {#use-validium-and-volitions} -Diversi progetti forniscono implementazioni di validium e volizioni che puoi integrare nelle tue dapp: +Diversi progetti forniscono implementazioni di Validium e volition che puoi integrare nelle tue dApp: -**StarkWare StarkEx** - _StarkEx è una soluzione di scalabilità del Livello 2 (L2) di Ethereum basata su prove di validità. Può operare in modalità di disponibilità dei dati rollup ZK o validium._ +**StarkWare StarkEx** - _StarkEx è una soluzione di scalabilità di livello 2 (L2) di Ethereum basata su prove di validità. Può operare in modalità di disponibilità dei dati ZK-Rollup o Validium._ - [Documentazione](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium) - [Sito web](https://starkware.co/starkex/) -**Matter Labs zkPorter**- _zkPorter è un protocollo di ridimensionamento del Livello 2 che affronta la disponibilità dei dati con un approccio ibrido che combina le idee dei rollup Zk e dello sharding. Può supportare arbitrariamente molti shard, ognuno con la propria politica di disponibilità dei dati._ +**Matter Labs zkPorter** - _zkPorter è un protocollo di scalabilità di livello 2 che affronta la disponibilità dei dati con un approccio ibrido che combina le idee di zkRollup e frammentazione. Può supportare un numero arbitrario di frammenti, ciascuno con la propria politica di disponibilità dei dati._ - [Blog](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) - [Documentazione](https://docs.zksync.io/zksync-protocol/rollup/data-availability) @@ -160,6 +160,6 @@ Diversi progetti forniscono implementazioni di validium e volizioni che puoi int ## Letture consigliate {#further-reading} - [Validium And The Layer 2 Two-By-Two — Issue No. 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) -- [Rollup ZK vs Validium](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) +- [ZK-rollups vs Validium](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) - [Volition and the Emerging Data Availability spectrum](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) -- [Rollups, Validiums, and Volitions: Learn About the Hottest Ethereum Scaling Solutions](https://medium.com/coinmonks/rollups-vs-validiums-vs-volitions-d76300170f4a) +- [The Practical Guide to Ethereum Rollups](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md index 53e0a590cd4..581e9013459 100644 --- a/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md @@ -1,253 +1,264 @@ --- -title: Rollup zero-knowledge -description: Un'introduzione ai rollup a conoscenza zero, una soluzione di ridimensionamento usata dalla community di Ethereum. +title: Rollup a conoscenza zero +description: "Un'introduzione ai rollup a conoscenza zero, una soluzione di scalabilità utilizzata dalla community di Ethereum." lang: it --- -I rollup a conoscenza zero (rollup ZK) sono [soluzioni di ridimensionamento](/developers/docs/scaling/) di livello 2 che aumentano il volume sulla Rete principale di Ethereum spostando il calcolo e l'archiviazione di stato al di fuori della catena. I rollup ZK possono elaborare migliaia di transazioni in un batch e poi pubblicare solo alcuni dati sommari minimi nella Rete principale. Questi dati sommari definiscono i cambiamenti che dovrebbero essere apportati allo stato di Ethereum e alcune prove crittografiche che tali modifiche siano corrette. +I rollup a conoscenza zero (ZK-rollup) sono soluzioni di [scalabilità](/developers/docs/scaling/) di [livello 2](/layer-2) che aumentano il throughput sulla rete principale di [Ethereum](/) spostando il calcolo e l'archiviazione dello stato fuori catena. I rollup a conoscenza zero possono elaborare migliaia di transazioni in un lotto (batch) e poi pubblicare solo alcuni dati riassuntivi minimi sulla rete principale. Questi dati riassuntivi definiscono le modifiche che dovrebbero essere apportate allo stato di Ethereum e alcune prove crittografiche che tali modifiche sono corrette. ## Prerequisiti {#prerequisites} -Dovresti aver letto e compreso la nostra pagina sul [ridimensionamento di Ethereum](/developers/docs/scaling/) e il [livello 2](/layer-2). +Dovresti aver letto e compreso la nostra pagina sulla [scalabilità di Ethereum](/developers/docs/scaling/) e sul [livello 2](/layer-2). ## Cosa sono i rollup a conoscenza zero? {#what-are-zk-rollups} -I **rollup a conoscenza zero (rollup ZK)** impacchettano (o 'eseguono il roll up') le transazioni in batch eseguiti al di fuori della catena. Il calcolo off-chain riduce la quantità di dati da pubblicare nella blockchain. Gli operatori del rollup ZK inviano un riepilogo delle modifiche necessarie per rappresentare tutte le transazioni in un batch, piuttosto che inviare individualmente ogni transazione. Inoltre, producono delle [prove di validità](/glossary/#validity-proof) per dimostrare la correttezza delle loro modifiche. +I **rollup a conoscenza zero (ZK-rollup)** raggruppano (o 'arrotolano') le transazioni in lotti che vengono eseguiti fuori catena. Il calcolo fuori catena riduce la quantità di dati che deve essere pubblicata sulla blockchain. Gli operatori degli ZK-rollup inviano un riepilogo delle modifiche necessarie per rappresentare tutte le transazioni in un lotto anziché inviare ogni transazione individualmente. Producono anche [prove di validità](/glossary/#validity-proof) per dimostrare la correttezza delle loro modifiche. -Lo stato del rollup ZK è mantenuto da un contratto intelligente distribuito sulla rete di Ethereum. Per aggiornare questo stato, i nodi del rollup ZK devono inviare una prova di validità per la verifica. Come accennato, la prova di validità è una garanzia crittografica che il cambiamento di stato proposto dal rollup sia realmente il risultato dell'esecuzione dello specifico batch di transazioni. Questo significa che i rollup ZK devono solo fornire le prove di validità per finalizzare le transazioni su Ethereum invece di pubblicare tutti i dati della transazione on-chain come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/). +Lo stato dello ZK-rollup è mantenuto da un contratto intelligente distribuito sulla rete Ethereum. Per aggiornare questo stato, i nodi dello ZK-rollup devono inviare una prova di validità per la verifica. Come accennato, la prova di validità è una garanzia crittografica che il cambiamento di stato proposto dal rollup sia realmente il risultato dell'esecuzione del lotto di transazioni fornito. Ciò significa che i rollup a conoscenza zero devono solo fornire prove di validità per finalizzare le transazioni su Ethereum invece di pubblicare tutti i dati delle transazioni on-chain come i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/). -Spostando i fondi da un rollup ZK a Ethereum non ci sono ritardi perché le transazioni di uscita sono eseguite una volta che il contratto del rollup ZK verifica la prova di validità. Viceversa, il prelievo di fondi dai rollup ottimistici è soggetto a un ritardo per consentire di contestare la transazione di uscita con una [prova di frode](/glossary/#fraud-proof). +Non ci sono ritardi nello spostamento di fondi da uno ZK-rollup a Ethereum perché le transazioni di uscita vengono eseguite una volta che il contratto dello ZK-rollup verifica la prova di validità. Al contrario, il prelievo di fondi dai rollup ottimistici è soggetto a un ritardo per consentire a chiunque di contestare la transazione di uscita con una [prova di frode](/glossary/#fraud-proof). -I rollup ZK scrivono le transazioni in Ethereum come `calldata`. `calldata` è dove sono archiviati i dati inclusi nelle chiamate esterne alle funzioni del contratto intelligente. Le informazioni in `calldata` sono pubblicate sulla blockchain, consentendo a chiunque di ricostruire lo stato del rollup in modo indipendente. I rollup ZK usano delle tecniche di compressione per ridurre i dati della transazione; ad esempio, i conti sono rappresentati da un indicec, piuttosto che da un indirizzo, risparmiando 28 byte di dati. La pubblicazione dei dati on-chain rappresenta un costo significativo per i rollup, quindi, la compressione dei dati può ridurre le commissioni per gli utenti. +I rollup a conoscenza zero scrivono le transazioni su Ethereum come `calldata`. `calldata` è dove vengono archiviati i dati inclusi nelle chiamate esterne alle funzioni del contratto intelligente. Le informazioni in `calldata` sono pubblicate sulla blockchain, consentendo a chiunque di ricostruire lo stato del rollup in modo indipendente. I rollup a conoscenza zero utilizzano tecniche di compressione per ridurre i dati delle transazioni: ad esempio, gli account sono rappresentati da un indice anziché da un indirizzo, il che fa risparmiare 28 byte di dati. La pubblicazione dei dati on-chain è un costo significativo per i rollup, quindi la compressione dei dati può ridurre le commissioni per gli utenti. -## Come interagiscono i rollup ZK con Ethereum? {#zk-rollups-and-ethereum} +## Come interagiscono i rollup a conoscenza zero con Ethereum? {#zk-rollups-and-ethereum} -Una catena di rollup ZK è un protocollo esterno alla catena che opera sulla blockchain di Ethereum ed è gestito dai contratti intelligenti sulla catena di Ethereum. I rollup ZK eseguono le transazioni al di fuori della Rete principale, ma impegnano periodicamente batch di transazioni off-chain in un contratto di rollup on-chain. Questo registro di transazioni è immutabile, come la blockchain di Ethereum, e forma la catena di rollup ZK. +Una catena ZK-rollup è un protocollo fuori catena che opera sopra la blockchain di Ethereum ed è gestito da contratti intelligenti di Ethereum on-chain. I rollup a conoscenza zero eseguono transazioni al di fuori della rete principale, ma inviano periodicamente lotti di transazioni fuori catena a un contratto di rollup on-chain. Questo registro delle transazioni è immutabile, in modo molto simile alla blockchain di Ethereum, e forma la catena ZK-rollup. -L'architettura principale del rollup ZK si compone dei seguenti componenti: +L'architettura principale dello ZK-rollup è composta dai seguenti componenti: -1. **Contratti sulla catena**: come menzionato, il protocollo rollup ZK è controllato da contratti intelligenti eseguiti su Ethereum. Questo include il contratto principale che memorizza i blocchi del rollup, traccia i depositi e monitora gli aggiornamenti di stato. Un altro contratto on-chain (il contratto di verifica) verifica le prove a conoscenza zero inviate dai produttori di blocchi. Dunque, Ethereum serve da livello di base o "livello 1" per il rollup ZK. +1. **Contratti on-chain**: Come accennato, il protocollo ZK-rollup è controllato da contratti intelligenti in esecuzione su Ethereum. Questo include il contratto principale che archivia i blocchi del rollup, traccia i depositi e monitora gli aggiornamenti di stato. Un altro contratto on-chain (il contratto verificatore) verifica le prove a conoscenza zero inviate dai produttori di blocchi. Pertanto, Ethereum funge da livello di base o "livello 1" per lo ZK-rollup. -2. **Macchina virtuale (VM) off-chain**: benché il protocollo del rollup ZK risieda su Ethereum, l'esecuzione della transazione e l'archiviazione di stato si verificano su una macchina virtuale separata e indipendente dall'[EVM](/developers/docs/evm/). Questa VM off-chain è l'ambiente di esecuzione per le transazioni sul rollup ZK e serve da livello secondario o "livello 2" per il protocollo rollup ZK. Le prove di validità verificate sulla Rete principale di Ethereum garantiscono la correttezza delle transizioni di stato nella VM off-chain. +2. **Macchina virtuale (VM) fuori catena**: Sebbene il protocollo ZK-rollup risieda su Ethereum, l'esecuzione delle transazioni e l'archiviazione dello stato avvengono su una macchina virtuale separata e indipendente dalla [EVM](/developers/docs/evm/). Questa VM fuori catena è l'ambiente di esecuzione per le transazioni sullo ZK-rollup e funge da livello secondario o "livello 2" per il protocollo ZK-rollup. Le prove di validità verificate sulla rete principale di Ethereum garantiscono la correttezza delle transizioni di stato nella VM fuori catena. -I rollup ZK sono "soluzioni di ridimensionamento ibride": protocolli off-chain che operano indipendentemente ma derivano la sicurezza da Ethereum. Nello specifico, la rete di Ethereum impone la validità degli aggiornamenti di stato sul rollup ZK e garantisce la disponibilità dei dati dietro ogni aggiornamento allo stato del rollup. Di conseguenza, i rollup ZK sono considerevolmente più sicuri delle soluzioni di ridimensionamento off-chain, come le [sidechain](/developers/docs/scaling/sidechains/), responsabili delle proprie proprietà di sicurezza, o i [validium](/developers/docs/scaling/validium/), che pur verificando le transazioni su Ethereum con le prove di validità, memorizzano altrove i dati della transazione. +I rollup a conoscenza zero sono "soluzioni di scalabilità ibride": protocolli fuori catena che operano in modo indipendente ma derivano la sicurezza da Ethereum. Nello specifico, la rete Ethereum applica la validità degli aggiornamenti di stato sullo ZK-rollup e garantisce la disponibilità dei dati dietro ogni aggiornamento allo stato del rollup. Di conseguenza, i rollup a conoscenza zero sono notevolmente più sicuri delle pure soluzioni di scalabilità fuori catena, come le [catene laterali](/developers/docs/scaling/sidechains/), che sono responsabili delle proprie proprietà di sicurezza, o i [validium](/developers/docs/scaling/validium/), che verificano anch'essi le transazioni su Ethereum con prove di validità, ma archiviano i dati delle transazioni altrove. -I rollup ZK si affidano al protocollo principale di Ethereum per quanto segue: +I rollup a conoscenza zero si affidano al protocollo principale di Ethereum per quanto segue: ### Disponibilità dei dati {#data-availability} -I rollup ZK pubblicano dati di stato per ogni transazione elaborata al di fuori della catena in Ethereum. Con questi dati, è possibile per individui o aziende riprodurre lo stato del rollup e validare la catena da soli. Ethereum rende disponibili questi dati a tutti i partecipanti della rete come `calldata`. +I rollup a conoscenza zero pubblicano i dati di stato per ogni transazione elaborata fuori catena su Ethereum. Con questi dati, è possibile per individui o aziende riprodurre lo stato del rollup e convalidare la catena da soli. Ethereum rende questi dati disponibili a tutti i partecipanti della rete come `calldata`. -I rollup ZK non necessitano di pubblicare molti dati di transazione sulla catena poiché le prove di validità verificano già l'autenticità delle transizioni di stato. Tuttavia, memorizzare i dati su catena è comunque importante, perché consente la verifica senza permessi e indipendente dello stato della catena del L2, che a sua volta consente a chiunque di inviare batch di transazioni, impedendo agli operatori malevoli di censurare o congelare la catena. +I rollup a conoscenza zero non hanno bisogno di pubblicare molti dati delle transazioni on-chain perché le prove di validità verificano già l'autenticità delle transizioni di stato. Tuttavia, l'archiviazione dei dati on-chain è ancora importante perché consente una verifica indipendente e senza permessi dello stato della catena di livello 2, che a sua volta consente a chiunque di inviare lotti di transazioni, impedendo a operatori malintenzionati di censurare o bloccare la catena. -Sulla catena è necessario che gli utenti interagiscano col rollup. Senza l'accesso ai dati di stato, gli utenti non possono richiededre il saldo del proprio conto né avviare transazioni (es., prelievi), che si affidino alle informazioni di stato. +L'on-chain è necessario affinché gli utenti possano interagire con il rollup. Senza accesso ai dati di stato, gli utenti non possono interrogare il saldo del proprio account o avviare transazioni (ad es. prelievi) che si basano sulle informazioni di stato. ### Finalità della transazione {#transaction-finality} -Ethereum funge da livello di accordo per i rollup ZK: le transazioni del L2 sono finalizzate solo se il contratto del L1 accetta la prova di validità. Questo elimina il rischio che operatori malevoli corrompano la catena (ad es. rubando i fondi del rollup), poiché ogni transazione deve essere approvata sulla Rete principale. Inoltre, Ethereum garantisce che le operazioni degli utenti non siano annullabili una volta finalizzate sul L1. +Ethereum funge da livello di regolamento per i rollup a conoscenza zero: le transazioni di livello 2 vengono finalizzate solo se il contratto di livello 1 accetta la prova di validità. Ciò elimina il rischio che operatori malintenzionati corrompano la catena (ad es. rubando i fondi del rollup) poiché ogni transazione deve essere approvata sulla rete principale. Inoltre, Ethereum garantisce che le operazioni degli utenti non possano essere annullate una volta finalizzate sul livello 1. ### Resistenza alla censura {#censorship-resistance} -Gran parte dei rollup ZK usa un "supernodo" (l'operatore) per eseguire le transazioni, produrre batch e inviare blocchi al L1. Se ciò da un lato garantisce efficienza, dall'altro aumenta il rischio di censura: gli operatori malevoli dei rollup ZK possono censurare gli utenti, rifiutandosi di includere le loro transazioni nei batch. +La maggior parte dei rollup a conoscenza zero utilizza un "supernodo" (l'operatore) per eseguire transazioni, produrre lotti e inviare blocchi al livello 1. Sebbene ciò garantisca l'efficienza, aumenta il rischio di censura: gli operatori malintenzionati degli ZK-rollup possono censurare gli utenti rifiutandosi di includere le loro transazioni nei lotti. -Come misura di sicurezza, i rollup ZK consentono agli utenti di inviare le transazioni direttamente al contratto di rollup sulla Rete principale se pensano di essere stati censurati dall'operatore. Questo consente agli utenti di forzare un'uscita dal rollup ZK a Ethereum senza doversi affidare all'autorizzazione dell'operatore. +Come misura di sicurezza, i rollup a conoscenza zero consentono agli utenti di inviare transazioni direttamente al contratto del rollup sulla rete principale se ritengono di essere censurati dall'operatore. Ciò consente agli utenti di forzare un'uscita dallo ZK-rollup verso Ethereum senza dover fare affidamento sul permesso dell'operatore. -## Come funzionano i rollup ZK? {#how-do-zk-rollups-work} +## Come funzionano i rollup a conoscenza zero? {#how-do-zk-rollups-work} ### Transazioni {#transactions} -Gli utenti nel rollup ZK firmano le transazioni e le inviano agli operatori del L2 per l'elaborazione e inclusione nel batch successivo. In alcuni casi, l'operatore è un'entità centralizzata, detta sequenziatore, che esegue le transazioni, le aggrega in batch e le invia al L1. Il sequenziatore, in questo sistema, è l'unica entità autorizzata a produrre blocchi del L2 e aggiungere le transazioni del rollup al contratto del rollup ZK. +Gli utenti nello ZK-rollup firmano le transazioni e le inviano agli operatori di livello 2 per l'elaborazione e l'inclusione nel lotto successivo. In alcuni casi, l'operatore è un'entità centralizzata, chiamata sequenziatore, che esegue le transazioni, le aggrega in lotti e le invia al livello 1. Il sequenziatore in questo sistema è l'unica entità autorizzata a produrre blocchi di livello 2 e ad aggiungere transazioni di rollup al contratto dello ZK-rollup. -Altri rollup ZK potrebbero effettuare la rotazione del ruolo dell'operatore usando una serie di validatori di [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). I potenziali operatori depositano i fondi nel contratto di rollup, con la dimensione di ogni stake che influenza le possibilità che lo staker sia selezionato per produrre il prossimo batch del rollup. Lo stake dell'operatore può essere oggetto di slashing se agisce malevolmente, il che lo incentiva a pubblicare blocchi validi. +Altri rollup a conoscenza zero possono ruotare il ruolo dell'operatore utilizzando un set di validatori [prova di stake](/developers/docs/consensus-mechanisms/pos/). I potenziali operatori depositano fondi nel contratto del rollup, con la dimensione di ogni stake che influenza le possibilità dello staker di essere selezionato per produrre il lotto di rollup successivo. Lo stake dell'operatore può essere punito se agisce in modo dannoso, il che lo incentiva a pubblicare blocchi validi. -#### Come i rollup ZK pubblicano i dati delle transazioni su Ethereum {#how-zk-rollups-publish-transaction-data-on-ethereum} +#### Come i rollup a conoscenza zero pubblicano i dati delle transazioni su Ethereum {#how-zk-rollups-publish-transaction-data-on-ethereum} -Come spiegato, i dati della transazione sono pubblicati su Ethereum come `calldata`. `calldata` è un'area di dati in un contratto intelligente, usata per passare gli argomenti a una funzione e si comporta similmente alla [memoria](/developers/docs/smart-contracts/anatomy/#memory). Benché i `calldata` non siano memorizzati come parte dello stato di Ethereum, persistono sulla catena come [registri storici](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) della catena di Ethereum. `calldata` non influenza lo stato di Ethereum, il che la rende un metodo economico per memorizzare i dati su catena. +Come spiegato, i dati delle transazioni vengono pubblicati su Ethereum come `calldata`. `calldata` è un'area dati in un contratto intelligente utilizzata per passare argomenti a una funzione e si comporta in modo simile alla [memoria](/developers/docs/smart-contracts/anatomy/#memory). Sebbene `calldata` non sia archiviato come parte dello stato di Ethereum, persiste on-chain come parte dei [registri storici](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) della catena di Ethereum. `calldata` non influisce sullo stato di Ethereum, rendendolo un modo economico per archiviare dati on-chain. -La parola chiave `calldata` identifica spesso il metodo del contratto intelligente chiamato da una transazione e trattiene gli input del metodo sotto forma di una sequenza arbitraria di byte. I rollup ZK usano `calldata` per pubblicare i dati di transazione compressi sulla catena; l'operatore del rollup aggiunge semplicemente un nuovo batch chiamando la funzione necessaria nel contratto di rollup e passa i dati compressi come argomenti della funzione. Questo aiuta a ridurre i costi per gli utenti poiché gran parte delle commissioni del rollup vanno verso la memorizzazione dei dati della transazione su catena. +La parola chiave `calldata` identifica spesso il metodo del contratto intelligente chiamato da una transazione e contiene gli input al metodo sotto forma di una sequenza arbitraria di byte. I rollup a conoscenza zero utilizzano `calldata` per pubblicare dati di transazione compressi on-chain; l'operatore del rollup aggiunge semplicemente un nuovo lotto chiamando la funzione richiesta nel contratto del rollup e passa i dati compressi come argomenti della funzione. Questo aiuta a ridurre i costi per gli utenti poiché gran parte delle commissioni del rollup è destinata all'archiviazione dei dati delle transazioni on-chain. ### Impegni di stato {#state-commitments} -Lo stato del rollup ZK, che include conti e saldi del L2, è rappresentato come un [albero di Merkle](/whitepaper/#merkle-trees). Un hash crittografico della radice dell'albero di Merkle (radice di Merkle) è memorizzato nel contratto on-chain, consentendo al protocollo di rollup di tracciare le modifiche allo stato del rollup ZK. +Lo stato dello ZK-rollup, che include account e saldi di livello 2, è rappresentato come un [albero di Merkle](/whitepaper/#merkle-trees). Un hash crittografico della radice dell'albero di Merkle (radice di Merkle) è archiviato nel contratto on-chain, consentendo al protocollo di rollup di tracciare le modifiche nello stato dello ZK-rollup. -Il rollup transita a un nuovo stato dopo l'esecuzione di una nuova serie di transazioni. L'operatore che ha avviato la transizione di stato deve calcolare una nuova radice di stato e inviarla al contratto on-chain. Se la prova di validità associata al batch è autenticata dal contratto di verifica, la nuova radice di Merkle diventa la radice di stato canonica del rollup ZK. +Il rollup passa a un nuovo stato dopo l'esecuzione di un nuovo set di transazioni. L'operatore che ha avviato la transizione di stato è tenuto a calcolare una nuova radice di stato e a inviarla al contratto on-chain. Se la prova di validità associata al lotto viene autenticata dal contratto verificatore, la nuova radice di Merkle diventa la radice di stato canonica dello ZK-rollup. -Oltre a calcolare le radici di stato, l'operatore del rollup ZK crea inoltre una radice del batch, la radice di un albero di Merkle che comprende tutte le transazioni in un batch. Quando viene inviato un nuovo batch, il contratto di rollup memorizza la radice del batch, consentendo agli utenti di provare che una transazione (ad es. una richiesta di prelievo) sia stata inclusa nel batch. Gli utenti dovranno fornire i dettagli della transazione, la radice del batch e una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) che mostri il percorso d'inclusione. +Oltre a calcolare le radici di stato, l'operatore dello ZK-rollup crea anche una radice del lotto: la radice di un albero di Merkle che comprende tutte le transazioni in un lotto. Quando viene inviato un nuovo lotto, il contratto del rollup archivia la radice del lotto, consentendo agli utenti di dimostrare che una transazione (ad es. una richiesta di prelievo) è stata inclusa nel lotto. Gli utenti dovranno fornire i dettagli della transazione, la radice del lotto e una [prova di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) che mostri il percorso di inclusione. ### Prove di validità {#validity-proofs} -La nuova radice di stato che l'operatore del rollup ZK invia al contratto del L1 è il risultato degli aggiornamenti allo stato del rollup. Diciamo che Alice invia 10 token a Bob, l'operatore semplicemente riduce il saldo di Alice di 10 e aumenta il saldo di Bob di 10. Poi, l'operatore esegue l'hashing dei dati del conto aggiornati, ricostruisce l'albero di Merkle del rollup e invia la nuova radice di Merkle al contratto su catena. +La nuova radice di stato che l'operatore dello ZK-rollup invia al contratto di livello 1 è il risultato degli aggiornamenti allo stato del rollup. Supponiamo che Alice invii 10 token a Bob, l'operatore diminuisce semplicemente il saldo di Alice di 10 e incrementa il saldo di Bob di 10. L'operatore esegue quindi l'hash dei dati dell'account aggiornati, ricostruisce l'albero di Merkle del rollup e invia la nuova radice di Merkle al contratto on-chain. -Ma il contratto del rollup non accetterà automaticamente l'impegno di stato proposto finché l'operatore non proverà che la nuova radice di Merkle risultava dagli aggiornamenti allo stato del rollup corretti. L'operatore del rollup ZK lo fa producendo una prova di validità, un impegno crittografico succinto che verifica la correttezza delle transazioni raggruppate. +Ma il contratto del rollup non accetterà automaticamente l'impegno di stato proposto finché l'operatore non dimostrerà che la nuova radice di Merkle è il risultato di aggiornamenti corretti allo stato del rollup. L'operatore dello ZK-rollup lo fa producendo una prova di validità, un impegno crittografico succinto che verifica la correttezza delle transazioni raggruppate. -Le prove di validità consentono alle parti di provare la correttezza di una istruzione senza rivelarla, per questo sono anche dette prove a conoscenza zero. I rollup ZK usano le prove di validità per confermare la correttezza delle transizioni di stato off-chain, senza dover eseguire di nuovo le transazioni su Ethereum. Queste prove possono assumere la forma di uno [ZK-SNARK](https://arxiv.org/abs/2202.06877) (argomento di conoscenza succinto non interattivo a conoscenza zero) o di uno [ZK-STARK](https://eprint.iacr.org/2018/046) (argomento di conoscenza trasparente e scalabile a conoscenza zero). +Le prove di validità consentono alle parti di dimostrare la correttezza di un'affermazione senza rivelare l'affermazione stessa: per questo motivo, sono anche chiamate prove a conoscenza zero. I rollup a conoscenza zero utilizzano prove di validità per confermare la correttezza delle transizioni di stato fuori catena senza dover rieseguire le transazioni su Ethereum. Queste prove possono assumere la forma di uno [ZK-SNARK](https://arxiv.org/abs/2202.06877) (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) o di uno [ZK-STARK](https://eprint.iacr.org/2018/046) (Zero-Knowledge Scalable Transparent Argument of Knowledge). -Sia gli SNARK che gli STARK aiutano ad attestare all'integrità del calcolo off-chain nei rollup ZK, sebbene ogni tipo di prova abbia funzionalità distinte. +Sia gli SNARK che gli STARK aiutano ad attestare l'integrità del calcolo fuori catena nei rollup a conoscenza zero, sebbene ogni tipo di prova abbia caratteristiche distintive. **ZK-SNARK** -Perché il protocollo ZK-SNARK funzioni, è necessario creare una Stringa di riferimento comune (CRS): la CRS fornisce i parametri pubblici per provare e verificare le prove di validità. La sicurezza del sistema di prova dipende dalla configurazione della CRS; se le informazioni usate per creare i parametri pubblici finiscono nelle mani di utenti malevoli, potrebbero generare prove di validità false. +Affinché il protocollo ZK-SNARK funzioni, è necessario creare una Common Reference String (CRS): la CRS fornisce parametri pubblici per dimostrare e verificare le prove di validità. La sicurezza del sistema di prova dipende dalla configurazione della CRS; se le informazioni utilizzate per creare i parametri pubblici cadono in possesso di attori malintenzionati, questi potrebbero essere in grado di generare false prove di validità. -Alcuni rollup ZK tentano di risolvere questo problema usando una [cerimonia di calcolo multi-parte(MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/), coinvolgendo individui fidati, per generare i parametri pubblici per il circuito ZK-SNARK. Ogni parte apporta una certa casualità (detta "rifiuti tossici") alla costruzione della CRS, che deve distruggere immediatamente. +Alcuni rollup a conoscenza zero tentano di risolvere questo problema utilizzando una [cerimonia di calcolo multipartecipante (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/), che coinvolge individui fidati, per generare parametri pubblici per il circuito ZK-SNARK. Ogni parte contribuisce con una certa casualità (chiamata "rifiuto tossico") alla costruzione della CRS, che deve distruggere immediatamente. -Le configurazioni attendibili sono usate perché aumentano la sicurezza della configurazione della CRS. Finché un partecipante onesto distrugge il proprio input, la sicurezza del sistema ZK-SNARK è garantita. Tuttavia, questo approccio richiede comunque di fidarsi del fatto che i soggetti coinvolti elimineranno la loro casualità e non comprometteranno le garanzie di sicurezza del sistema. +Le configurazioni fidate vengono utilizzate perché aumentano la sicurezza della configurazione della CRS. Finché un partecipante onesto distrugge il proprio input, la sicurezza del sistema ZK-SNARK è garantita. Tuttavia, questo approccio richiede di fidarsi del fatto che le persone coinvolte eliminino la loro casualità campionata e non compromettano le garanzie di sicurezza del sistema. -Ipotesi di fiducia a parte, gli ZK-SNARK sono popolari per le prove di piccole dimensioni e la verifica costante. Poiché la verifica della prova sul L1 costituisce il costo maggiore della gestione di un rollup ZK, gli L2 usano gli ZK-SNARK per generare prove verificabili in modo rapido ed economico sulla Rete principale. +A parte le ipotesi di fiducia, gli ZK-SNARK sono popolari per le loro dimensioni ridotte delle prove e per la verifica in tempo costante. Poiché la verifica delle prove sul livello 1 costituisce il costo maggiore per l'operatività di uno ZK-rollup, i livelli 2 utilizzano gli ZK-SNARK per generare prove che possono essere verificate in modo rapido ed economico sulla rete principale. **ZK-STARK** -Come gli ZK-SNARK, gli ZK-STARK provano la validità del calcolo off-chain senza rilevare gli input. Tuttavia, gli ZK-STARK sono considerati un miglioramento degli ZK-SNARK per la loro scalabilità e trasparenza. +Come gli ZK-SNARK, gli ZK-STARK dimostrano la validità del calcolo fuori catena senza rivelare gli input. Tuttavia, gli ZK-STARK sono considerati un miglioramento rispetto agli ZK-SNARK per la loro scalabilità e trasparenza. -Gli ZK-STARK sono "trasparenti", potendo lavorare senza la configurazione attendibile di una stringa di riferimento comune (CRS). Invece, gli ZK-STARK si affidano alla casualità verificabile pubblicamente per configurare i parametri per generare e verificare le prove. +Gli ZK-STARK sono 'trasparenti', in quanto possono funzionare senza la configurazione fidata di una Common Reference String (CRS). Invece, gli ZK-STARK si basano su una casualità verificabile pubblicamente per impostare i parametri per la generazione e la verifica delle prove. -Gli ZK-STARK forniscono inoltre una maggiore scalabilità perché il tempo necessario per provare e verificare le prove di validità aumenta _quasi linearmente_ rispetto alla complessità del calcolo sottostante. Con gli ZK-SNARK, la prova e la verifica dei tempi scalano _linearmente_ in rapporto alle dimensioni del calcolo sottostante. Questo significa che gli ZK-STARK richiedono meno tempo degli ZK-SNARK per provare e verificare quando sono coinvolti grandi serie di dati, rendendoli utili per le applicazioni a volume elevato. +Gli ZK-STARK offrono anche maggiore scalabilità perché il tempo necessario per dimostrare e verificare le prove di validità aumenta in modo _quasilineare_ in relazione alla complessità del calcolo sottostante. Con gli ZK-SNARK, i tempi di prova e verifica scalano in modo _lineare_ in relazione alle dimensioni del calcolo sottostante. Ciò significa che gli ZK-STARK richiedono meno tempo rispetto agli ZK-SNARK per la prova e la verifica quando sono coinvolti set di dati di grandi dimensioni, rendendoli utili per applicazioni ad alto volume. -Gli ZK-STARK proteggono inoltre dai computer quantistici, mentre è opinione diffusa che la Crittografia a curva ellittica (ECC) usata negli ZK-SNARK sia suscettibile agli attacchi di calcolo quantistico. Lo svantaggio degli ZK-STARK è che producono prove di dimensioni maggiori, che sono più costose da verificare su Ethereum. +Gli ZK-STARK sono anche sicuri contro i computer quantistici, mentre la crittografia a curva ellittica (ECC) utilizzata negli ZK-SNARK è ampiamente ritenuta suscettibile agli attacchi di calcolo quantistico. Il lato negativo degli ZK-STARK è che producono prove di dimensioni maggiori, che sono più costose da verificare su Ethereum. -#### Come funzionano le prove di validità nei rollup ZK? {#validity-proofs-in-zk-rollups} +#### Come funzionano le prove di validità nei rollup a conoscenza zero? {#validity-proofs-in-zk-rollups} ##### Generazione della prova -Prima di accettare le transazioni, l'operatore eseguirà i soliti controlli. Questo include confermare che: +Prima di accettare le transazioni, l'operatore eseguirà i consueti controlli. Questo include la conferma che: -- I conti del mittente e del destinatario sono parte dell'albero di stato. -- Il mittente abbia abbastanza fondi per procedere con la transazione. -- La transazione sia corretta e corrisponda alla chiave pubblica del mittente sul rollup. -- Il nonce del mittente sia corretto, ecc. +- Gli account del mittente e del destinatario fanno parte dell'albero di stato. +- Il mittente ha fondi sufficienti per elaborare la transazione. +- La transazione è corretta e corrisponde alla chiave pubblica del mittente sul rollup. +- Il nonce del mittente è corretto, ecc. -Una volta che il nodo del rollup ZK ha abbastanza transazioni, le aggrega in un batch e compila gli input per il circuito di prova da compilare in una prova "piccola" ZK. Questo include: +Una volta che il nodo dello ZK-rollup ha abbastanza transazioni, le aggrega in un lotto e compila gli input per il circuito di prova da compilare in una succinta prova ZK. Questo include: -- La radice di una albero di Merkel che comprende tutte le transazioni nel gruppo. -- Le prove di Merkle per le transazioni per provare l'inclusione nel batch. -- Prove di Merkle per ogni coppia mittente-destinatario nelle transazioni, per provare che questi conti facciano parte dell'albero di stato del rollup. -- Una serie di radici di stato intermedie, derivate dall'aggiornamento della radice di stato dopo l'applicazione degli aggiornamenti di stato per ogni transazione (cioè, la riduzione dei conti dei mittente e l'aumento dei conti dei destinatari). +- Una radice dell'albero di Merkle che comprende tutte le transazioni nel lotto. +- Prove di Merkle per le transazioni per dimostrare l'inclusione nel lotto. +- Prove di Merkle per ogni coppia mittente-destinatario nelle transazioni per dimostrare che quegli account fanno parte dell'albero di stato del rollup. +- Un set di radici di stato intermedie, derivate dall'aggiornamento della radice di stato dopo aver applicato gli aggiornamenti di stato per ogni transazione (ovvero, diminuendo gli account del mittente e aumentando gli account del destinatario). -Il circuito di prova calcola la prova di validità eseguendo a "ciclo" ogni transazione ed eseguendo gli stessi controlli che l'operatore ha completato prima di elaborare la transazione. Prima, verifica che il conto del mittente sia parte della radice di stato, utilizzando la prova di Merkle fornita. Poi, riduce il saldo del mittente, ne aumenta il nonce, esegue l'hashing dei dati aggiornati del conto e li combina con la prova di Merkle per generare una nuova radice di Merkle. +Il circuito di prova calcola la prova di validità "iterando" su ogni transazione ed eseguendo gli stessi controlli che l'operatore ha completato prima di elaborare la transazione. Innanzitutto, verifica che l'account del mittente faccia parte della radice di stato esistente utilizzando la prova di Merkle fornita. Quindi riduce il saldo del mittente, aumenta il suo nonce, esegue l'hash dei dati dell'account aggiornati e lo combina con la prova di Merkle per generare una nuova radice di Merkle. -Questa radice di Merkle riflette il solo cambiamento nello stato del rollup ZK: un cambiamento nel saldo e nel nonce del mittente. Ciò è possibile perché la prova di Merkle, usata per provare l'esistenza del conto, è usata per derivare la nuova radice di stato. +Questa radice di Merkle riflette l'unica modifica nello stato dello ZK-rollup: una modifica nel saldo e nel nonce del mittente. Ciò è possibile perché la prova di Merkle utilizzata per dimostrare l'esistenza dell'account viene utilizzata per derivare la nuova radice di stato. -Il circuito di prova esegue lo stesso processo sul conto del destinatario. Verifica se il conto del destinatario esiste sotto la radice di stato intermedia (usando la prova di Merkle), ne aumenta il saldo, esegue nuovamente l'hashing dei dati e li combina con la prova di Merkle per generare una nuova radice di stato. +Il circuito di prova esegue lo stesso processo sull'account del destinatario. Controlla se l'account del destinatario esiste sotto la radice di stato intermedia (utilizzando la prova di Merkle), aumenta il suo saldo, esegue nuovamente l'hash dei dati dell'account e lo combina con la prova di Merkle per generare una nuova radice di stato. -Il processo si ripete per ogni transazione; ogni "ciclo" crea una nuova radice di stato dall'aggiornamento del conto del mittente e una successiva nuova radice dall'aggiornamento del conto del destinatario. Come spiegato, ogni aggiornamento alla radice di stato rappresenta il cambiamento di una parte dell'albero di stato del rollup. +Il processo si ripete per ogni transazione; ogni "iterazione" crea una nuova radice di stato dall'aggiornamento dell'account del mittente e una successiva nuova radice dall'aggiornamento dell'account del destinatario. Come spiegato, ogni aggiornamento alla radice di stato rappresenta una parte dell'albero di stato del rollup che cambia. -Il circuito di prova ZK itera l'intero batch di transazioni, verificando la sequenza di aggiornamenti risultante in una radice di stato finale dopo l'esecuzione dell'ultima transazione. L'ultima radice di Merkle calcolata diventa la più recente radice di stato canonica del rollup ZK. +Il circuito di prova ZK itera sull'intero lotto di transazioni, verificando la sequenza di aggiornamenti che si traducono in una radice di stato finale dopo l'esecuzione dell'ultima transazione. L'ultima radice di Merkle calcolata diventa la più recente radice di stato canonica dello ZK-rollup. ##### Verifica della prova -Dopo che il circuito di prova verifica la correttezza degli aggiornamenti di stato, l'operatore del L2 invia la prova di validità calcolata al contratto di verifica sul L1. Il circuito di verifica del contratto verifica la validità della prova oltre a controllare gli input pubblici che formano parte della prova: +Dopo che il circuito di prova ha verificato la correttezza degli aggiornamenti di stato, l'operatore di livello 2 invia la prova di validità calcolata al contratto verificatore sul livello 1. Il circuito di verifica del contratto verifica la validità della prova e controlla anche gli input pubblici che fanno parte della prova: -- **Radice di pre-stato**: la vecchia radice di stato del rollup ZK (cioè, prima dell'esecuzione delle transazioni raggruppate) che riflette l'ultimo stato valido noto della catena del L2. +- **Radice di pre-stato**: La vecchia radice di stato dello ZK-rollup (ovvero, prima che le transazioni raggruppate venissero eseguite), che riflette l'ultimo stato valido noto della catena di livello 2. -- **Radice di post-stato**: la nuova radice di stato del rollup ZK (cioè, dopo l'esecuzione delle transazioni raggruppate) che riflette lo stato più recente della catena del L2. La radice di post-stato è la radice finale derivata dopo aver applicato gli aggiornamenti di stato nel circuito di prova. +- **Radice di post-stato**: La nuova radice di stato dello ZK-rollup (ovvero, dopo l'esecuzione delle transazioni raggruppate), che riflette lo stato più recente della catena di livello 2. La radice di post-stato è la radice finale derivata dopo aver applicato gli aggiornamenti di stato nel circuito di prova. -- **Radice del batch**: la radice di Merkle del batch, derivata dalla _merklizzazione_ delle transazioni nel batch e dell'hashing della radice dell'albero. +- **Radice del lotto**: La radice di Merkle del lotto, derivata _merklizzando_ le transazioni nel lotto ed eseguendo l'hash della radice dell'albero. -- **Input della transazione**: dati associati alle transazioni eseguite come parte del batch inviato. +- **Input della transazione**: Dati associati alle transazioni eseguite come parte del lotto inviato. -Se la prova soddisfa il circuito (cioè è valida), significa che esiste una sequenza di transazioni valide che fa transitare il rollup dallo stato precedente (con fingerprint crittografica dalla radice di pre-stato) a uno nuovo (con fingerprint crittografica dalla radice di post-stato). Se la radice di pre-stato corrisponde a quella memorizzata nel contratto di rollup e la prova è valida, il contratto di rollup prende la radice di post-stato dalla prova e aggiorna il suo albero di stato per riflettere lo stato cambiato del rollup. +Se la prova soddisfa il circuito (ovvero, è valida), significa che esiste una sequenza di transazioni valide che fanno passare il rollup dallo stato precedente (identificato crittograficamente dalla radice di pre-stato) a un nuovo stato (identificato crittograficamente dalla radice di post-stato). Se la radice di pre-stato corrisponde alla radice archiviata nel contratto del rollup e la prova è valida, il contratto del rollup prende la radice di post-stato dalla prova e aggiorna il suo albero di stato per riflettere lo stato modificato del rollup. ### Entrate e uscite {#entries-and-exits} -Gli utenti entrano nel rollup ZK depositando i token nel contratto di rollup distribuito sulla catena del L1. Questa transazione è accodata poiché solo gli operatori possono inviare le transazioni al contratto di rollup. +Gli utenti entrano nello ZK-rollup depositando token nel contratto del rollup distribuito sulla catena di livello 1. Questa transazione viene messa in coda poiché solo gli operatori possono inviare transazioni al contratto del rollup. -Se la coda di depositi in sospeso inizia a riempirsi, l'operatore del rollup ZK prenderà le transazioni di deposito e le invierà al contratto del rollup. Una volta che i suoi fondi sono nel rollup, l'utente può iniziare a eseguire transazioni inviando le transazioni all'operatore per l'elaborazione. Gli utenti possono verificare i saldi sul rollup eseguendo l'hashing dei dati del loro conto, inviando l'hash al contratto di rollup e fornendo una prova di Merkle per verificare rispetto alla radice di stato corrente. +Se la coda dei depositi in sospeso inizia a riempirsi, l'operatore dello ZK-rollup prenderà le transazioni di deposito e le invierà al contratto del rollup. Una volta che i fondi dell'utente sono nel rollup, possono iniziare a effettuare transazioni inviando transazioni all'operatore per l'elaborazione. Gli utenti possono verificare i saldi sul rollup eseguendo l'hash dei dati del proprio account, inviando l'hash al contratto del rollup e fornendo una prova di Merkle da verificare rispetto alla radice di stato corrente. -Il prelievo da un rollup ZK al L1 è semplice. L'utente avvia la transazione d'uscita, inviando le proprie risorse sul rollup a un conto specificato, per bruciarle. Se l'operatore include la transazione nel batch successivo, l'utente può inviare una richiesta di prelievo al contratto on-chain. Questa richiesta di prelievo includerà quanto segue: +Prelevare da uno ZK-rollup al livello 1 è semplice. L'utente avvia la transazione di uscita inviando i propri asset sul rollup a un account specificato per essere bruciati. Se l'operatore include la transazione nel lotto successivo, l'utente può inviare una richiesta di prelievo al contratto on-chain. Questa richiesta di prelievo includerà quanto segue: -- Prova di Merkle che dimostra l'inclusione della transazione dell'utente al conto di bruciatura nel gruppo di transazioni +- Prova di Merkle che dimostra l'inclusione della transazione dell'utente verso l'account di burn in un lotto di transazioni -- Dati di transazione +- Dati della transazione -- Radice del batch +- Radice del lotto -- Indirizzo del L1 per ricevere i fondi depositati +- Indirizzo di livello 1 per ricevere i fondi depositati -Il contratto di rollup esegue l'hashing dei dati di transazione, verifica l'esistenza della radice del batch e usa la prova di Merkle per verificare se l'hash della transazione è parte della radice del batch. Dopodiché, il contratto esegue la transazione di uscita e invia i fondi all'indirizzo scelto dall'utente sul L1. +Il contratto del rollup esegue l'hash dei dati della transazione, controlla se la radice del lotto esiste e utilizza la prova di Merkle per verificare se l'hash della transazione fa parte della radice del lotto. Successivamente, il contratto esegue la transazione di uscita e invia i fondi all'indirizzo scelto dall'utente sul livello 1. -## Rollup ZK e compatibilità con l'EVM {#zk-rollups-and-evm-compatibility} +## Rollup a conoscenza zero e compatibilità con la EVM {#zk-rollups-and-evm-compatibility} -A differenza dei rollup ottimistici, i rollup ZK non sono facilmente compatibili con la [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/). Fornire calcoli dell'EVM a scopo generale nei circuiti è più difficile e ha uso di risorse più elevato che dimostrare calcoli semplici (come il trasferimento di token descritto precedentemente). +A differenza dei rollup ottimistici, i rollup a conoscenza zero non sono facilmente compatibili con la [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/). Dimostrare il calcolo EVM di uso generale nei circuiti è più difficile e richiede più risorse rispetto alla dimostrazione di calcoli semplici (come il trasferimento di token descritto in precedenza). -Tuttavia, i [progressi nella tecnologia a conoscenza zero](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) stanno accendendo un rinnovato interesse verso l'avvolgimento dei calcoli dell'EVM nelle prove a conoscenza zero. Questi sforzi sono orientati alla creazione dell'implementazione di un'EVM a conoscenza zero (zkEVM) che possa verificare efficientemente la correttezza dell'esecuzione del programma. Una zkEVM ricrea gli opcode esistenti dell'EVM per la prova/verifica nei circuiti, consentendo l'esecuzione dei contratti intelligenti. +Tuttavia, i [progressi nella tecnologia a conoscenza zero](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) stanno accendendo un rinnovato interesse nell'avvolgere il calcolo EVM in prove a conoscenza zero. Questi sforzi sono orientati alla creazione di un'implementazione EVM a conoscenza zero (zkEVM) in grado di verificare in modo efficiente la correttezza dell'esecuzione del programma. Una zkEVM ricrea gli opcode EVM esistenti per la prova/verifica nei circuiti, consentendo di eseguire contratti intelligenti. -Come l'EVM, una zkEVM transita tra gli stati dopo che il calcolo è eseguito su alcuni input. La differenza è che la zkEVM crea anche prove a conoscenza zero per verificare la correttezza di ogni passaggio nell'esecuzione del programma. Le prove di validità potrebbero verificare la correttezza delle operazioni che toccano lo stato della VM (memoria, stack, archiviazione) e il calcolo stesso (cioè, l'operazione ha chiamato gli opcode esatti e li ha eseguiti correttamente?). +Come la EVM, una zkEVM passa da uno stato all'altro dopo che il calcolo è stato eseguito su alcuni input. La differenza è che la zkEVM crea anche prove a conoscenza zero per verificare la correttezza di ogni passaggio nell'esecuzione del programma. Le prove di validità potrebbero verificare la correttezza delle operazioni che toccano lo stato della VM (memoria, stack, archiviazione) e il calcolo stesso (ovvero, l'operazione ha chiamato gli opcode giusti e li ha eseguiti correttamente?). -L'introduzione dei rollup ZK compatibili con l'EVM è prevista per aiutare gli sviluppatori a sfruttare le garanzie di scalabilità e sicurezza delle prove a conoscenza zero. Ancora più importante, la compatibilità con l'infrastruttura nativa di Ethereum fa sì che gli sviluppatori possano creare dApp con funzionalità ZK usando strumenti e linguaggi familiari (e collaudati). +Si prevede che l'introduzione di rollup a conoscenza zero compatibili con la EVM aiuterà gli sviluppatori a sfruttare le garanzie di scalabilità e sicurezza delle prove a conoscenza zero. Ancora più importante, la compatibilità con l'infrastruttura nativa di Ethereum significa che gli sviluppatori possono creare dApp compatibili con ZK utilizzando strumenti e linguaggi familiari (e collaudati). -## Come funzionano le commissioni del rollup ZK? {#how-do-zk-rollup-fees-work} +## Come funzionano le commissioni dei rollup a conoscenza zero? {#how-do-zk-rollup-fees-work} -Quanto gli utenti pagano per le transazioni sui rollup ZK, dipende dalla commissione del gas, proprio come sulla Rete Principale di Ethereum. Tuttavia, le commissioni sul gas funzionano diversamente sul L2 e sono influenzate dai seguenti costi: +Quanto pagano gli utenti per le transazioni sui rollup a conoscenza zero dipende dalla commissione del gas, proprio come sulla rete principale di Ethereum. Tuttavia, le commissioni del gas funzionano in modo diverso sul livello 2 e sono influenzate dai seguenti costi: -1. **Scrittura di stato**: esiste un costo fisso per scrivere allo stato di Ethereum (cioè, inviare una transazione alla blockchain di Ethereum). I rollup ZK riducono questo costo raggruppando le transazioni e distribuendo i costi fissi per più utenti. +1. **Scrittura dello stato**: C'è un costo fisso per scrivere nello stato di Ethereum (ovvero, inviare una transazione sulla blockchain di Ethereum). I rollup a conoscenza zero riducono questo costo raggruppando le transazioni e distribuendo i costi fissi su più utenti. -2. **Pubblicazione dei dati**: i rollup ZK pubblicano i dati di stato per ogni transazione in Ethereum come `calldata`. I costi di `calldata` sono correntemente disciplinati dall'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), che stipola un costo di 16 gas per i byte diversi da zero e di 4 gas per i byte zero di `calldata`, rispettivamente. Il costo pagato su ogni transazione è influenzato dalla quantità di `calldata` da pubblicare sulla catena per essa. +2. **Pubblicazione dei dati**: I rollup a conoscenza zero pubblicano i dati di stato per ogni transazione su Ethereum come `calldata`. I costi di `calldata` sono attualmente regolati dall'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), che stabilisce un costo di 16 gas per i byte non zero e 4 gas per i byte zero di `calldata`, rispettivamente. Il costo pagato su ogni transazione è influenzato da quanto `calldata` deve essere pubblicato on-chain per essa. -3. **Commissioni dell'operatore del L2**: questo è l'importo pagato all'operatore del rollup come compenso per i costi di calcolo sostenuti nell'elaborazione delle transazioni, proprio come le ["commissioni prioritarie (mance)" della transazione](/developers/docs/gas/#how-are-gas-fees-calculated) sulla Rete Principale di Ethereum. +3. **Commissioni dell'operatore di livello 2**: Questo è l'importo pagato all'operatore del rollup come compenso per i costi computazionali sostenuti nell'elaborazione delle transazioni, in modo molto simile alle ["commissioni di priorità (mance)" della transazione](/developers/docs/gas/#how-are-gas-fees-calculated) sulla rete principale di Ethereum. -4. **Generazione e verifica della prova**: gli operatori del rollup ZK devono produrre prove di validità per i batch di transazioni, il che impiega molte risorse. Anche verificare le prove a conoscenza zero sulla Rete Principale costa del gas (circa 500.000 gas). +4. **Generazione e verifica della prova**: Gli operatori degli ZK-rollup devono produrre prove di validità per i lotti di transazioni, il che richiede molte risorse. Anche la verifica delle prove a conoscenza zero sulla rete principale costa gas (~ 500.000 gas). -Oltre a raggruppare le transazioni, i rollup ZK riducono le commissioni per gli utenti comprimendo i dati della transazione. Puoi [vedere una panoramica in tempo reale](https://l2fees.info/) di quanto costa usare i rollup ZK di Ethereum. +Oltre a raggruppare le transazioni, i rollup a conoscenza zero riducono le commissioni per gli utenti comprimendo i dati delle transazioni. Puoi [vedere una panoramica in tempo reale](https://l2fees.info/) di quanto costa utilizzare i rollup a conoscenza zero di Ethereum. -## Come fanno i rollup ZK a ridimensionare Ethereum? {#scaling-ethereum-with-zk-rollups} +## Come i rollup a conoscenza zero scalano Ethereum? {#scaling-ethereum-with-zk-rollups} -### Compressione dei dati della transazione {#transaction-data-compression} +### Compressione dei dati delle transazioni {#transaction-data-compression} -I rollup ZK estendono il volume sul livello di base di Ethereum portando il calcolo al di fuori della catena, ma la vera spinta per il ridimensionamento proviene dalla compressione dei dati delle transazioni. La [dimensione del blocco](/developers/docs/blocks/#block-size) di Ethereum limita i dati che ogni blocco può contenere e, di conseguenza, il numero di transazioni elaborate per blocco. Comprimendo i dati correlati alle transazioni, i rollup ZK aumentano significativamente il numero di transazioni elaborate per blocco. +I rollup a conoscenza zero estendono il throughput sul livello di base di Ethereum portando il calcolo fuori catena, ma la vera spinta per la scalabilità deriva dalla compressione dei dati delle transazioni. La [dimensione del blocco](/developers/docs/blocks/#block-size) di Ethereum limita i dati che ogni blocco può contenere e, per estensione, il numero di transazioni elaborate per blocco. Comprimendo i dati relativi alle transazioni, i rollup a conoscenza zero aumentano significativamente il numero di transazioni elaborate per blocco. -I rollup ZK possono comprimere i dati di transazione meglio dei rollup ottimistici, poiché non devono pubblicare tutti i dati richiesti per validare ogni transazione. Devono solo pubblicare i dati minimi richiesti per ricostruire l'ultimo stato dei conti e saldi sul rollup. +I rollup a conoscenza zero possono comprimere i dati delle transazioni meglio dei rollup ottimistici poiché non devono pubblicare tutti i dati necessari per convalidare ogni transazione. Devono solo pubblicare i dati minimi necessari per ricostruire l'ultimo stato degli account e dei saldi sul rollup. ### Prove ricorsive {#recursive-proofs} -Un vantaggio delle prove a conoscenza zero è che le prove possono verificare altre prove. Ad esempio, uno ZK-SNARK singolo può verificare altri ZK-SNARK. Tale "prova delle prove" è detta prova ricorsiva e aumenta drasticamente il volume sui rollup ZK. +Un vantaggio delle prove a conoscenza zero è che le prove possono verificare altre prove. Ad esempio, un singolo ZK-SNARK può verificare altri ZK-SNARK. Tali "prove di prove" sono chiamate prove ricorsive e aumentano drasticamente il throughput sui rollup a conoscenza zero. -Attualmente le prove di validità sono generate blocco per blocco e inviate al contratto del L1 per la verifica. Tuttavia, verificare singole prove di blocco limita il volume che i rollup ZK possono ottenere poiché solo un blocco può essere finalizzato quando l'operatore invia una prova. +Attualmente, le prove di validità vengono generate blocco per blocco e inviate al contratto di livello 1 per la verifica. Tuttavia, la verifica delle prove di un singolo blocco limita il throughput che i rollup a conoscenza zero possono raggiungere poiché solo un blocco può essere finalizzato quando l'operatore invia una prova. -Le prove ricorsive, invece, permettono di finalizzare diversi blocchi con una sola prova di validità. Questo perché il circuito di prova aggrega ricorsivamente svariate prove di blocco finché non viene creata una prova finale. L'operatore del L2 invia questa prova ricorsiva e, se il contratto la accetta, tutti i blocchi pertinenti saranno finalizzati istantaneamente. Con le prove ricorsive, il numero di transazioni del rollup ZK finalizzabili su Ethereum a intervalli aumenta. +Le prove ricorsive, tuttavia, consentono di finalizzare diversi blocchi con un'unica prova di validità. Questo perché il circuito di prova aggrega ricorsivamente più prove di blocco fino a creare un'unica prova finale. L'operatore di livello 2 invia questa prova ricorsiva e, se il contratto la accetta, tutti i blocchi rilevanti verranno finalizzati all'istante. Con le prove ricorsive, aumenta il numero di transazioni dello ZK-rollup che possono essere finalizzate su Ethereum a intervalli. -### Pro e contro dei rollup ZK {#zk-rollups-pros-and-cons} +### Pro e contro dei rollup a conoscenza zero {#zk-rollups-pros-and-cons} -| Pro | Contro | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| Le prove di validità assicurano la correttezza delle transazioni off-chain e impediscono agli operatori di eseguire le transizioni di stato non valide. | Il costo associato al calcolo e alla verifica delle prove di validità è sostanziale e può aumentare le commissioni per gli utenti del rollup. | -| Offre una finalità della transazione più veloce in quanto gli aggiornamenti di stato sono approvati quando le prove di validità sono verificate sul L1. | Creare rollup ZK compatibili con l'EVM è difficile a causa della complessità della tecnologia a conoscenza zero. | -| Si basa su meccanismi crittografici senza fiducia per la sicurezza, non sull'onestà degli attori incentivati come nei [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | Produrre le prove di validità richiede hardware specializzato, che potrebbe incoraggiare il controllo centralizzato della catena da alcune parti. | -| Memorizza i dati necessari a recuperare lo stato off-chain sul L1, garantendo sicurezza, resistenza alla censura e decentralizzazione. | Gli operatori centralizzati (sequenziatori) possono influenzare l'ordine delle transazioni. | -| Gli utenti beneficiano di una maggiore efficienza del capitale e possono prelevare fondi dal L2 senza ritardi. | I requisiti hardware potrebbero ridurre il numero di partecipanti che possono forzare la catena a fare progressi, aumentando il rischio che gli operatori malevoli congelino lo stato del rollup e censurino gli utenti. | -| Non dipende dalle ipotesi di liveness e gli utenti non devono validare la catena per proteggere i propri fondi. | Alcuni sistemi di prova (es. ZK-SNARK) richiedono una configurazione attendibile che, se mal gestita, potrebbe potenzialmente compromettere il modello di sicurezza di un rollup ZK. | -| Una migliore compressione dei dati può aiutare a ridurre i costi della pubblicazione di `calldata` su Ethereum e minimizzare le commissioni del rollup per gli utenti. | | +| Pro | Contro | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Le prove di validità garantiscono la correttezza delle transazioni fuori catena e impediscono agli operatori di eseguire transizioni di stato non valide. | Il costo associato al calcolo e alla verifica delle prove di validità è sostanziale e può aumentare le commissioni per gli utenti del rollup. | +| Offre una finalità della transazione più rapida poiché gli aggiornamenti di stato vengono approvati una volta che le prove di validità sono verificate sul livello 1. | Costruire rollup a conoscenza zero compatibili con la EVM è difficile a causa della complessità della tecnologia a conoscenza zero. | +| Si affida a meccanismi crittografici senza fiducia per la sicurezza, non all'onestà di attori incentivati come con i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons). | La produzione di prove di validità richiede hardware specializzato, il che potrebbe incoraggiare il controllo centralizzato della catena da parte di poche parti. | +| Archivia i dati necessari per recuperare lo stato fuori catena sul livello 1, il che garantisce sicurezza, resistenza alla censura e decentralizzazione. | Gli operatori centralizzati (sequenziatori) possono influenzare l'ordinamento delle transazioni. | +| Gli utenti beneficiano di una maggiore efficienza del capitale e possono prelevare fondi dal livello 2 senza ritardi. | I requisiti hardware possono ridurre il numero di partecipanti che possono forzare la catena a fare progressi, aumentando il rischio che operatori malintenzionati blocchino lo stato del rollup e censurino gli utenti. | +| Non dipende da ipotesi di vivacità e gli utenti non devono convalidare la catena per proteggere i propri fondi. | Alcuni sistemi di prova (ad es. ZK-SNARK) richiedono una configurazione fidata che, se gestita in modo errato, potrebbe potenzialmente compromettere il modello di sicurezza di uno ZK-rollup. | +| Una migliore compressione dei dati può aiutare a ridurre i costi di pubblicazione di `calldata` su Ethereum e ridurre al minimo le commissioni del rollup per gli utenti. | | -### Una spiegazione grafica dei rollup ZK {#zk-video} +### Una spiegazione visiva dei rollup a conoscenza zero {#zk-video} -Guarda Finematics spiegare i rollup ZK: +Guarda Finematics spiegare i rollup a conoscenza zero: + ## Chi sta lavorando a una zkEVM? {#zkevm-projects} -I progetti che stanno lavorando alle zkEVM includono: +I progetti che lavorano sulle zkEVM includono: + +- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM è un progetto finanziato dalla Ethereum Foundation per sviluppare uno ZK-rollup compatibile con la EVM e un meccanismo per generare prove di validità per i blocchi di Ethereum._ + +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _è uno ZK Rollup decentralizzato sulla rete principale di Ethereum che lavora su una macchina virtuale di Ethereum a conoscenza zero (zkEVM) che esegue transazioni Ethereum in modo trasparente, inclusi contratti intelligenti con convalide di prove a conoscenza zero._ + +- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll è un'azienda guidata dalla tecnologia che lavora alla costruzione di una soluzione nativa di livello 2 zkEVM per Ethereum._ -- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM è un progetto finanziato dalla Ethereum Foundation per sviluppare un rollup ZK compatibile con l'EVM e un meccanismo per generare prove di validità per i blocchi di Ethereum._ +- **[Taiko](https://taiko.xyz)** - _Taiko è uno ZK-rollup decentralizzato ed equivalente a Ethereum (una [ZK-EVM di Tipo 1](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ -- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _ è un Rollup ZK decentralizzato sulla rete principale di Ethereum che opera su una Macchina Virtuale di Ethereum a conoscenza zero (zkEVM) che esegue le transazioni di Ethereum in modo trasparente, includendo contratti intelligenti con validazioni di prova a conoscenza zero._ +- **[ZKsync](https://docs.zksync.io/)** - _ZKsync Era è uno ZK Rollup compatibile con la EVM costruito da Matter Labs, alimentato dalla propria zkEVM._ -- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll è un'azienda orientata alla tecnologia che sta lavorando alla creazione di una Soluzione di Livello 2 dello zkEVM nativa per Ethereum._ +- **[Starknet](https://starkware.co/starknet/)** - _StarkNet è una soluzione di scalabilità di livello 2 compatibile con la EVM costruita da StarkWare._ -- **[Taiko](https://taiko.xyz)** - _Taiko è un rollup ZK decentralizzato ed equivalente a Ethereum (un [ZK-EVM di Tipo 1](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ +- **[Morph](https://www.morphl2.io/)** - _Morph è una soluzione di scalabilità rollup ibrida che utilizza prove ZK per affrontare il problema della sfida di stato del livello 2._ -- **[ZKsync](https://docs.zksync.io/)**: _ZKsync Era è un Rollup ZK compatibile con l'EVM creato da Matter Labs, basato sulla propria zkEVM._ +- **[Linea](https://linea.build)** - _Linea è un livello 2 zkEVM equivalente a Ethereum costruito da Consensys, completamente allineato con l'ecosistema Ethereum._ -- **[StarkNet](https://starkware.co/starknet/)**. _StarkNet è una soluzione di ridimensionamento del livello 2 compatibile con l'EVM, creata da StarkWare._ +## Ulteriori letture sui rollup a conoscenza zero {#further-reading-on-zk-rollups} -- **[Morph](https://www.morphl2.io/)** - _Morph è una soluzione di ridimensionamento dei rollup ibrida che utilizza le prove ZK per risolvere i problemi di dimostrazione dello stato dei livelli 2._ +- [Cosa sono i rollup a conoscenza zero?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) +- [Cosa sono i rollup a conoscenza zero?](https://alchemy.com/blog/zero-knowledge-rollups) +- [La guida pratica ai rollup di Ethereum](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [STARK contro SNARK](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [Cos'è una zkEVM?](https://www.alchemy.com/overviews/zkevm) +- [Tipi di ZK-EVM: equivalente a Ethereum, equivalente a EVM, Tipo 1, Tipo 4 e altre parole d'ordine criptiche](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) +- [Introduzione a zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) +- [Cosa sono i L2 ZK-EVM?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M) +- [Risorse Awesome-zkEVM](https://github.com/LuozhuZhang/awesome-zkevm) +- [ZK-SNARK sotto il cofano](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [Come sono possibili gli SNARK?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) -## Ulteriori letture sui rollup ZK {#further-reading-on-zk-rollups} +## Tutorial: Privacy e conoscenza-zero su Ethereum {#tutorials} -- [What Are Zero-Knowledge Rollups?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) -- [What are zero-knowledge rollups?](https://alchemy.com/blog/zero-knowledge-rollups) -- [STARKs vs SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) -- [What is a zkEVM?](https://www.alchemy.com/overviews/zkevm) -- [Tipi di ZK-EVM: equivalente a Ethereum, equivalente all'EVM, Tipo 1, Tipo 4 e altre parole chiave criptiche](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) -- [Intro to zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) -- [Awesome-zkEVM resources](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARKS under the hood](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) -- [How are SNARKs possible?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) +- [Utilizzare la conoscenza-zero per uno stato segreto](/developers/tutorials/secret-state/) _– Come utilizzare le prove ZK e i componenti del server fuori catena per mantenere lo stato segreto del gioco on-chain._ +- [Utilizzare gli indirizzi invisibili](/developers/tutorials/stealth-addr/) _– Come gli indirizzi invisibili ERC-5564 consentono trasferimenti anonimi di ETH utilizzando la derivazione della chiave crittografica._ +- [Utilizzare Ethereum per l'autenticazione web2](/developers/tutorials/ethereum-for-web2-auth/) _– Come integrare le firme del portafoglio di Ethereum con i sistemi di autenticazione web2 basati su SAML._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/it/developers/docs/smart-contracts/anatomy/index.md index a202d6d9ffd..71056755245 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/anatomy/index.md @@ -1,93 +1,93 @@ --- title: Anatomia dei contratti intelligenti -description: 'Uno sguardo approfondito all''anatomia di un contratto intelligente: le funzioni, i dati e le variabili.' +description: "Uno sguardo approfondito all'anatomia di un contratto intelligente: le funzioni, i dati e le variabili." lang: it --- -Un contratto intelligente è un programma eseguito a un indirizzo su Ethereum. È composto di dati e funzioni che entrano in esecuzione appena si riceve una transazione. Ecco una panoramica di cosa compone un contratto intelligente. +Un contratto intelligente è un programma che viene eseguito a un indirizzo su Ethereum. Sono costituiti da dati e funzioni che possono essere eseguiti alla ricezione di una transazione. Ecco una panoramica di ciò che compone un contratto intelligente. ## Prerequisiti {#prerequisites} -Prima, assicurati di aver letto a riguardo dei [contratti intelligenti](/developers/docs/smart-contracts/). Questa pagina presuppone che si conoscano i linguaggi di programmazione come JavaScript o Python. +Assicurati di aver prima letto dei [contratti intelligenti](/developers/docs/smart-contracts/). Questo documento presuppone che tu abbia già familiarità con linguaggi di programmazione come JavaScript o Python. ## Dati {#data} -Tutti i dati del contratto devono essere assegnati a una posizione: `storage` oppure ` memory`. Modificare l'archiviazione in un contratto intelligente è dispendioso, devi quindi considerare dove dovrebbero risiedere i tuoi dati. +Qualsiasi dato del contratto deve essere assegnato a una posizione: `storage` o `memory`. Modificare lo storage in un contratto intelligente è costoso, quindi devi considerare dove dovrebbero risiedere i tuoi dati. ### Storage {#storage} -I dati persistenti sono detti storage (o spazio di archiviazione) e sono rappresentati da variabili di stato. Questi valori sono memorizzati permanentemente nella blockchain. È necessario dichiarare il tipo così che il contratto possa tenere traccia di quanto storage è necessario sulla blockchain quando viene compilato. +I dati persistenti sono definiti storage e sono rappresentati da variabili di stato. Questi valori vengono archiviati in modo permanente sulla blockchain. Devi dichiararne il tipo in modo che il contratto possa tenere traccia di quanto spazio di archiviazione sulla blockchain necessita durante la compilazione. ```solidity -// Esempio in Solidity +// Esempio in Solidity contract SimpleStorage { uint storedData; // Variabile di stato // ... } ``` -```python -# Esempio in Vyper +```vyper +# Vyper example storedData: int128 ``` -Se hai già programmato con linguaggi orientati agli oggetti, è probabile che tu abbia famigliarità con la maggior parte dei tipi, ma `address` potrebbe non essere noto se non hai mai sviluppato per Ethereum. +Se hai già programmato in linguaggi orientati agli oggetti, probabilmente avrai familiarità con la maggior parte dei tipi. Tuttavia, `address` dovrebbe esserti nuovo se sei agli inizi con lo sviluppo su [Ethereum](/). -Un tipo `address` può contenere un indirizzo Ethereum che equivale a 20 byte o 160 bit. Restituisce una notazione esadecimale preceduta da 0x. +Un tipo `address` può contenere un indirizzo Ethereum, che equivale a 20 byte o 160 bit. Viene restituito in notazione esadecimale con un 0x iniziale. Altri tipi includono: -- booleano -- numero intero +- booleani +- interi - numeri a virgola fissa - array di byte a dimensione fissa -- array di byte di dimensioni dinamiche -- letterali interi e razionali -- stringhe +- array di byte a dimensione dinamica +- letterali razionali e interi +- letterali di stringa - letterali esadecimali -- enumerazioni +- enumerazioni (enum) -Per ulteriori spiegazioni, consulta la documentazione: +Per ulteriori spiegazioni, dai un'occhiata alla documentazione: -- [Vedi Vyper types](https://vyper.readthedocs.io/en/v0.1.0-beta.6/types.html#value-types) -- [Vedi Solidity types](https://solidity.readthedocs.io/en/latest/types.html#value-types) +- [Vedi i tipi di Vyper](https://docs.vyperlang.org/en/v0.1.0-beta.6/types.html#value-types) +- [Vedi i tipi di Solidity](https://docs.soliditylang.org/en/latest/types.html#value-types) -### Memoria {#memory} +### Memory {#memory} -I valori che vengono memorizzati solo per la durata di esecuzione di una funzione di contratto sono detti variabili di memoria. Dal momento che non sono memorizzati in modo permanente sulla blockchain, sono molto più economici da usare. +I valori che vengono archiviati solo per la durata dell'esecuzione di una funzione del contratto sono chiamati variabili di memoria (memory). Poiché non vengono archiviati in modo permanente sulla blockchain, sono molto più economici da usare. -Scopri di più su come l'EVM memorizza i dati (Archiviazione, Memoria e lo Stack), nella [documentazione di Solidity](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack). +Scopri di più su come l'EVM archivia i dati (Storage, Memory e Stack) nella [documentazione di Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack). -### Variabili ambientali {#environment-variables} +### Variabili d'ambiente {#environment-variables} -Oltre alle variabili che vengono definite nel contratto, sono presenti alcune variabili globali speciali. Vengono utilizzate principalmente per fornire informazioni sulla blockchain o sulla transazione corrente. +Oltre alle variabili che definisci nel tuo contratto, ci sono alcune variabili globali speciali. Sono utilizzate principalmente per fornire informazioni sulla blockchain o sulla transazione corrente. Esempi: -| **Proprietà** | **Variabile di stato** | **Descrizione** | -| ----------------- | ---------------------- | ------------------------------------------ | -| `block.timestamp` | uint256 | Data/ora dell'epoca del blocco corrente | +| **Proprietà** | **Variabile di stato** | **Descrizione** | +| ----------------- | ---------------------- | ------------------------------------ | +| `block.timestamp` | uint256 | Timestamp dell'epoca del blocco corrente | | `msg.sender` | address | Mittente del messaggio (chiamata corrente) | ## Funzioni {#functions} -In termini estremamente semplici, le funzioni possono ottenere informazioni o impostarle in risposta alle transazioni in arrivo. +Nei termini più semplici, le funzioni possono ottenere informazioni o impostare informazioni in risposta alle transazioni in entrata. -Ci sono due tipi di chiamata di funzione: +Esistono due tipi di chiamate di funzione: -- `internal` – non creano una chiamata all'EVM - - Le funzioni interne e le variabili di stato sono accessibili solo internamente (ovvero dall'interno del contratto corrente o dei contratti derivanti da esso). -- `external` – creano una chiamata all'EVM - - Le funzioni esterne fanno parte dell'interfaccia del contratto, quindi possono essere chiamate da altri contratti e tramite transazioni. Una funzione esterna `f` non può essere chiamata internamente (quindi `f()` non funziona, ma `this.f()` funziona). +- `internal` – queste non creano una chiamata EVM + - Le funzioni interne e le variabili di stato possono essere accessibili solo internamente (cioè, dall'interno del contratto corrente o dai contratti che ne derivano) +- `external` – queste creano una chiamata EVM + - Le funzioni esterne fanno parte dell'interfaccia del contratto, il che significa che possono essere chiamate da altri contratti e tramite transazioni. Una funzione esterna `f` non può essere chiamata internamente (cioè, `f()` non funziona, ma `this.f()` funziona). Possono anche essere `public` o `private` -- Le funzioni `public` possono essere chiamate direttamente dall'interno del contratto o dall'esterno tramite messaggi -- Le funzioni `private` sono visibili solo per il contratto in cui sono definite e non da contratti derivati +- le funzioni `public` possono essere chiamate internamente dall'interno del contratto o esternamente tramite messaggi +- le funzioni `private` sono visibili solo per il contratto in cui sono definite e non nei contratti derivati Sia le funzioni che le variabili di stato possono essere rese pubbliche o private -Questa è una funzione per aggiornare una variabile di stato su un contratto: +Ecco una funzione per aggiornare una variabile di stato in un contratto: ```solidity // Esempio in Solidity @@ -97,12 +97,12 @@ function update_name(string value) public { ``` - Il parametro `value` di tipo `string` viene passato alla funzione: `update_name` -- È dichiarato `public` e quindi chiunque può accedervi -- Non è dichiarato `view`, quindi può modificare lo stato del contratto +- È dichiarata `public`, il che significa che chiunque può accedervi +- Non è dichiarata `view`, quindi può modificare lo stato del contratto -### Funzioni 'view' {#view-functions} +### Funzioni View {#view-functions} -Queste funzioni promettono di non modificare lo stato dei dati del contratto. Tra gli esempi più comuni vi sono le funzioni "getter": puoi usarle ad esempio per ricevere un saldo dell'utente. +Queste funzioni promettono di non modificare lo stato dei dati del contratto. Esempi comuni sono le funzioni "getter": potresti usarle per ricevere il saldo di un utente, ad esempio. ```solidity // Esempio in Solidity @@ -111,46 +111,45 @@ function balanceOf(address _owner) public view returns (uint256 _balance) { } ``` -```python -dappName: public(string) +```vyper +dapp_name: public(String[24]) +@external @view -@public -def readName() -> string: - return dappName +def readName() -> String[24]: + return self.dapp_name ``` -Ecco cosa è considerato modifica dello stato: +Cosa è considerato una modifica dello stato: -1. Scrittura su variabili di stato. -2. [Emissione di eventi](https://solidity.readthedocs.io/en/v0.7.0/contracts.html#events). -3. [Creazione di altri contratti](https://solidity.readthedocs.io/en/v0.7.0/control-structures.html#creating-contracts). -4. Uso di `selfdestruct`. -5. Invio di ether tramite chiamate. -6. Chiamata di qualsiasi funzione non contrassegnata con `view` o `pure`. -7. Utilizzo di chiamate di basso livello. -8. Utilizzo di assembly inline contenente determinati opcode. +1. Scrivere su variabili di stato. +2. [Emettere eventi](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events). +3. [Creare altri contratti](https://docs.soliditylang.org/en/v0.7.0/control-structures.html#creating-contracts). +4. Usare `selfdestruct`. +5. Inviare ether tramite chiamate. +6. Chiamare qualsiasi funzione non contrassegnata come `view` o `pure`. +7. Usare chiamate di basso livello. +8. Usare assembly inline che contiene determinati opcode. -### Funzioni del costruttore {#constructor-functions} +### Funzioni Constructor {#constructor-functions} -Quando il contratto viene distribuito per la prima volta, le funzioni `constructor` sono eseguite solo una volta. Come accade per `constructor` in molti linguaggi di programmazione basati su classi, queste funzioni spesso inizializzano le variabili di stato ai valori specificati. +Le funzioni `constructor` vengono eseguite solo una volta quando il contratto viene distribuito per la prima volta. Come il `constructor` in molti linguaggi di programmazione basati su classi, queste funzioni spesso inizializzano le variabili di stato ai loro valori specificati. ```solidity -// Esempi in Solidity -// Inizializza i dati del contratto, impostando `owner` -// sull'indirizzo del creatore del contratto. +// Esempio in Solidity +// Inizializza i dati del contratto, impostando l'`owner` +// all'indirizzo del creatore del contratto. constructor() public { - // Tutti gli Smart Contract si basano su transazioni esterne per attivare le proprie funzioni. - // `msg` è una variabile globale che include dati sulla transazione specificata, - // come indirizzo del mittente e valore degli ETH inclusi nella transazione. - // Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + // Tutti gli smart contract si basano su transazioni esterne per attivare le proprie funzioni. + // `msg` è una variabile globale che include dati rilevanti sulla transazione data, + // come l'indirizzo del mittente e il valore in ETH incluso nella transazione. + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } ``` -```python -# Esempio in Vyper - +```vyper +# Vyper example @external def __init__(_beneficiary: address, _bidding_time: uint256): self.beneficiary = _beneficiary @@ -160,85 +159,68 @@ def __init__(_beneficiary: address, _bidding_time: uint256): ### Funzioni integrate {#built-in-functions} -Oltre alle variabili che vengono definite nel contratto, sono presenti alcune funzioni speciali integrate. L'esempio più evidente è: +Oltre alle variabili e alle funzioni che definisci nel tuo contratto, ci sono alcune funzioni integrate speciali. L'esempio più ovvio è: - `address.send()` – Solidity - `send(address)` – Vyper -Queste, consentono ai contratti di inviare ETH agli altri conti. +Queste consentono ai contratti di inviare ETH ad altri account. -## Scrittura delle funzioni {#writing-functions} +## Scrivere funzioni {#writing-functions} -Una funzione ha bisogno di: +La tua funzione necessita di: -- variabile e tipo di parametro (se accetta parametri) -- dichiarazione interna/esterna -- dichiarazione pure/view/payable -- tipo di valore restituito (se restituisce un valore) +- variabile e tipo del parametro (se accetta parametri) +- dichiarazione di internal/external +- dichiarazione di pure/view/payable +- tipo di ritorno (se restituisce un valore) -```solidity -pragma solidity >=0.4.0 <=0.6.0; - -contract ExampleDapp { - string dapp_name; // state variable - - // Called when the contract is deployed and initializes the value - constructor() public { - dapp_name = "My Example dapp"; - } - - // Get Function - function read_name() public view returns(string) { - return dapp_name; - } - - // Set Function - function update_name(string value) public { - dapp_name = value; - } -} +```vyper +@external +def update_name(value: String[24]): + self.dapp_name = value ``` -Un contratto completo potrebbe avere questa forma. Qui la funzione `constructor` fornisce un valore iniziale per la variabile `dapp_name`. +Un contratto completo potrebbe assomigliare a questo. Qui la funzione `constructor` fornisce un valore iniziale per la variabile `dapp_name`. -## Eventi e registri {#events-and-logs} +## Eventi e log {#events-and-logs} -Gli eventi consentono al tuo contratto intelligente di comunicare con il tuo frontend o con altre applicazioni di iscrizione. Una volta che una transazione viene convalidata e aggiunta a un blocco, i contratti intelligenti possono emettere eventi e registrare informazioni, che possono quindi essere elaborati e utilizzati dal frontend. +Gli eventi consentono al tuo contratto intelligente di comunicare con il tuo frontend o altre applicazioni iscritte. Una volta che una transazione è convalidata e aggiunta a un blocco, i contratti intelligenti possono emettere eventi e registrare informazioni, che il frontend può quindi elaborare e utilizzare. ## Esempi annotati {#annotated-examples} -Questi sono alcuni esempi scritti in Solidity. Se vuoi sperimentare con il codice, puoi interagire con questi esempi in [Remix](http://remix.ethereum.org). +Questi sono alcuni esempi scritti in Solidity. Se desideri giocare con il codice, puoi interagirvi in [Remix](http://remix.ethereum.org). -### Ciao mondo {#hello-world} +### Hello world {#hello-world} ```solidity -// Specifica la versione di Solidity, utilizzando il controllo delle versioni semantico. -// Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +// Specifica la versione di Solidity, usando il versionamento semantico. +// Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity ^0.5.10; // Definisce un contratto chiamato `HelloWorld`. // Un contratto è una raccolta di funzioni e dati (il suo stato). -// Una volta distribuito, un contratto risiede in un indirizzo specifico della blockchain Ethereum. -// Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +// Una volta distribuito, un contratto risiede a un indirizzo specifico sulla blockchain di Ethereum. +// Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html contract HelloWorld { // Dichiara una variabile di stato `message` di tipo `string`. - // Le variabili di stato sono variabili con valori memorizzati in modo permanente nello spazio di archiviazione (storage) del contratto. + // Le variabili di stato sono variabili i cui valori sono memorizzati in modo permanente nell'archiviazione del contratto. // La parola chiave `public` rende le variabili accessibili dall'esterno di un contratto // e crea una funzione che altri contratti o client possono chiamare per accedere al valore. string public message; - // Analogamente a molti linguaggi di programmazione basati su classi, un costruttore è - // una funzione speciale che viene eseguita solo al momento della creazione del contratto. - // I costruttori sono utilizzati per inizializzare i dati del contratto. - // Maggiori informazioni: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + // Similmente a molti linguaggi orientati agli oggetti basati su classi, un costruttore è + // una funzione speciale che viene eseguita solo alla creazione del contratto. + // I costruttori sono usati per inizializzare i dati del contratto. + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors constructor(string memory initMessage) public { - // Accetta un argomento di tipo string `initMessage` e imposta il valore + // Accetta un argomento stringa `initMessage` e imposta il valore // nella variabile di archiviazione `message` del contratto). message = initMessage; } - // Funzione pubblica che accetta un argomento string + // Una funzione pubblica che accetta un argomento stringa // e aggiorna la variabile di archiviazione `message`. function update(string memory newMessage) public { message = newMessage; @@ -252,54 +234,54 @@ contract HelloWorld { pragma solidity ^0.5.10; contract Token { - // Un 'address' è paragonabile a un indirizzo email. Viene usato per identificare un account su Ethereum. - // Gli indirizzi possono rappresentare uno Smart Contract o un account esterno (utente). - // Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/types.html#address + // Un `address` è paragonabile a un indirizzo email: è usato per identificare un account su Ethereum. + // Gli indirizzi possono rappresentare uno smart contract o account esterni (di utenti). + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/types.html#address address public owner; - // Un `mapping` è essenzialmente una struttura dati di tipo tabella hash. - // Questo `mapping` assegna un numero intero senza segno (il saldo del token) a un indirizzo (il proprietario del token). - // Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types + // Un `mapping` è essenzialmente una struttura dati a tabella hash. + // Questo `mapping` assegna un intero senza segno (il saldo del token) a un indirizzo (il detentore del token). + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types mapping (address => uint) public balances; // Gli eventi consentono di registrare le attività sulla blockchain. - // I client Ethereum possono attendere gli eventi per reagire alle modifiche di stato del contratto. - // Ulteriori informazioni: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events + // I client di Ethereum possono ascoltare gli eventi per reagire ai cambiamenti di stato del contratto. + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events event Transfer(address from, address to, uint amount); - // Inizializza i dati del contratto, impostando `owner` - // sull'indirizzo del creatore del contratto. + // Inizializza i dati del contratto, impostando l'`owner` + // all'indirizzo del creatore del contratto. constructor() public { - // Tutti gli Smart Contract si basano su transazioni esterne per attivare le proprie funzioni. - // `msg` è una variabile globale che include dati relativi alla transazione specificata, - // come l'indirizzo del mittente e il valore in ETH incluso nella transazione. - // Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + // Tutti gli smart contract si basano su transazioni esterne per attivare le proprie funzioni. + // `msg` è una variabile globale che include dati rilevanti sulla transazione data, + // come l'indirizzo del mittente e il valore in ETH incluso nella transazione. + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties owner = msg.sender; } // Crea una quantità di nuovi token e li invia a un indirizzo. function mint(address receiver, uint amount) public { - // `require` è una struttura di controllo utilizzata per implementare determinate condizioni. + // `require` è una struttura di controllo usata per imporre determinate condizioni. // Se un'istruzione `require` restituisce `false`, viene attivata un'eccezione, - // che ripristina tutte le modifiche apportate allo stato durante la chiamata corrente. - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + // che annulla tutte le modifiche apportate allo stato durante la chiamata corrente. + // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions - // Only the contract owner can call this function + // Solo il proprietario del contratto può chiamare questa funzione require(msg.sender == owner, "You are not the owner."); - // Enforces a maximum amount of tokens + // Impone una quantità massima di token require(amount < 1e60, "Maximum issuance exceeded"); - // Increases the balance of `receiver` by `amount` + // Aumenta il saldo di `receiver` di `amount` balances[receiver] += amount; } - // Sends an amount of existing tokens from any caller to an address. + // Invia una quantità di token esistenti da qualsiasi chiamante a un indirizzo. function transfer(address receiver, uint amount) public { // Il mittente deve avere abbastanza token da inviare require(amount <= balances[msg.sender], "Insufficient balance."); - // Modifica i saldi di token dei due indirizzi + // Regola i saldi dei token dei due indirizzi balances[msg.sender] -= amount; balances[receiver] += amount; @@ -309,350 +291,209 @@ contract Token { } ``` -### Risorsa digitale univoca {#unique-digital-asset} +### Risorsa digitale unica {#unique-digital-asset} ```solidity pragma solidity ^0.5.10; -// Importa simboli da altri file nel contratto corrente. -// In questo caso, una serie di contratti di supporto da OpenZeppelin. -// Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files +// Imports symbols from other files into the current contract. +// In this case, a series of helper contracts from OpenZeppelin. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; -import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol"; +import "../node_modules/@openzeppelin/contracts/utils/Address.sol"; +import "../node_modules/@openzeppelin/contracts/drafts/Counters.sol"; +import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; + +// The `is` keyword is used to inherit functions and keywords from external contracts. +// In this case, `SimpleToken` inherits from the `ERC165` and `IERC721` contracts. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance +contract SimpleToken is ERC165, IERC721 { -// La parola chiave `is` viene utilizzata per ereditare funzioni e parole chiave da contratti esterni. -// In questo caso, `CryptoPizza` eredita dai contratti `IERC721` e `ERC165`. -// Per saperne di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance -contract CryptoPizza is IERC721, ERC165 { - // Utilizza la libreria SafeMath di OpenZeppelin per eseguire operazioni aritmetiche in modo sicuro. - // Ulteriori informazioni: https://docs.openzeppelin.com/contracts/2. /api/math#SafeMath using SafeMath for uint256; + using Address for address; + using Counters for Counters.Counter; - // Le variabili di stato costanti in Solidity sono simili ad altri linguaggi - // ma devono essere assegnate da un'espressione che è costante al momento della compilazione. - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables - uint256 constant dnaDigits = 10; - uint256 constant dnaModulus = 10 ** dnaDigits; + // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; - // I tipi di struttura ti fanno definire il tuo tipo - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs - struct Pizza { - string name; - uint256 dna; - } + // Mapping from token ID to owner + mapping (uint256 => address) private _tokenOwner; - // Crea un insieme vuoto di strutture di Pizza - Pizza[] public pizzas; + // Mapping from token ID to approved address + mapping (uint256 => address) private _tokenApprovals; - // Mappatura dall'ID della pizza all'indirizzo del suo proprietario - mapping(uint256 => address) public pizzaToOwner; + // Mapping from owner to number of owned token + mapping (address => Counters.Counter) private _ownedTokensCount; - // Mappatura dall'indirizzo del proprietario al numero di token posseduti - mapping(address => uint256) public ownerPizzaCount; + // Mapping from owner to operator approvals + mapping (address => mapping (address => bool)) private _operatorApprovals; - // Mappatura dall'ID del token all'indirizzo approvato - mapping(uint256 => address) pizzaApprovals; - - // Puoi nidificare le mappature, questo esempio mappa le approvazioni da proprietario a operatore - mapping(address => mapping(address => bool)) private operatorApprovals; + /* + * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 + * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e + * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 + * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc + * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 + * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 + * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd + * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e + * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde + * + * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ + * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd + */ + bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; - // Funzione interna per creare una Pizza casuale dalla stringa (nome) e dal DNA - function _createPizza(string memory _name, uint256 _dna) - // La parola chiave `internal` significa che questa funzione è visibile solo - // tra questo contratto e i contratti derivati da esso - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters - internal - // `isUnique` è un modificatore della funzione che verifica se la pizza esiste già - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers - isUnique(_name, _dna) - { - // Aggiunge la Pizza all'insieme di Pizze e ottiene l'id - uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1); + constructor () public { + // register the supported interfaces to conform to ERC721 via ERC165 + _registerInterface(_INTERFACE_ID_ERC721); + } - // Verifica che il proprietario della Pizza sia l'utente corrente - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + function balanceOf(address owner) public view returns (uint256) { + require(owner != address(0), "ERC721: balance query for the zero address"); - // nota che address(0) è l'indirizzo zero, - // indicando che pizza[id] non è ancora allocato a un utente in particolare. + return _ownedTokensCount[owner].current(); + } - assert(pizzaToOwner[id] == address(0)); + function ownerOf(uint256 tokenId) public view returns (address) { + address owner = _tokenOwner[tokenId]; + require(owner != address(0), "ERC721: owner query for nonexistent token"); - // Mappa la Pizza al proprietario - pizzaToOwner[id] = msg.sender; - ownerPizzaCount[msg.sender] = SafeMath.add( - ownerPizzaCount[msg.sender], - 1 - ); + return owner; } - // Crea una Pizza casuale dalla stringa (nome) - function createRandomPizza(string memory _name) public { - uint256 randDna = generateRandomDna(_name, msg.sender); - _createPizza(_name, randDna); - } + function approve(address to, uint256 tokenId) public { + address owner = ownerOf(tokenId); + require(to != owner, "ERC721: approval to current owner"); - // Genera DNA casuale dalla stringa (nome) e dall'indirizzo del proprietario (creatore) - function generateRandomDna(string memory _str, address _owner) - public - // Le funzioni contrassegnate come `pure` promettono di non modificare lo stato o non leggere da esso - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions - pure - returns (uint256) - { - // Genera uint casuale dalla stringa (nome) + indirizzo (proprietario) - uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + - uint256(_owner); - rand = rand % dnaModulus; - return rand; - } + require(msg.sender == owner || isApprovedForAll(owner, msg.sender), + "ERC721: approve caller is not owner nor approved for all" + ); - // Restituisce l'insieme di Pizze trovate dal proprietario - function getPizzasByOwner(address _owner) - public - // Le funzioni contrassegnate come `view` promettono di non modificare lo stato - // Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions - view - returns (uint256[] memory) - { - // Usa la posizione d'archiviazione `memory` per memorizzare i valori solo per la durata - // di questa chiamata alla funzione. - // Learn more: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack - uint256[] memory result = new uint256[](ownerPizzaCount[_owner]); - uint256 counter = 0; - for (uint256 i = 0; i < pizzas.length; i++) { - if (pizzaToOwner[i] == _owner) { - result[counter] = i; - counter++; - } - } - return result; + _tokenApprovals[tokenId] = to; + emit Approval(owner, to, tokenId); } - // Transfers Pizza and ownership to other address - function transferFrom(address _from, address _to, uint256 _pizzaId) public { - require(_from != address(0) && _to != address(0), "Invalid address."); - require(_exists(_pizzaId), "Pizza does not exist."); - require(_from != _to, "Cannot transfer to the same address."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + function getApproved(uint256 tokenId) public view returns (address) { + require(_exists(tokenId), "ERC721: approved query for nonexistent token"); - ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); - ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); - pizzaToOwner[_pizzaId] = _to; - - // Emits event defined in the imported IERC721 contract - emit Transfer(_from, _to, _pizzaId); - _clearApproval(_to, _pizzaId); + return _tokenApprovals[tokenId]; } - /** - * Safely transfers the ownership of a given token ID to another address - * If the target address is a contract, it must implement `onERC721Received`, - * which is called upon a safe transfer, and return the magic value - * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; - * otherwise, the transfer is reverted. - */ - function safeTransferFrom(address from, address to, uint256 pizzaId) - public - { - // solium-disable-next-line arg-overflow - this.safeTransferFrom(from, to, pizzaId, ""); + function setApprovalForAll(address to, bool approved) public { + require(to != msg.sender, "ERC721: approve to caller"); + + _operatorApprovals[msg.sender][to] = approved; + emit ApprovalForAll(msg.sender, to, approved); } - /** - * Safely transfers the ownership of a given token ID to another address - * If the target address is a contract, it must implement `onERC721Received`, - * which is called upon a safe transfer, and return the magic value - * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; - * otherwise, the transfer is reverted. - */ - function safeTransferFrom( - address from, - address to, - uint256 pizzaId, - bytes memory _data - ) public { - this.transferFrom(from, to, pizzaId); - require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received."); + function isApprovedForAll(address owner, address operator) public view returns (bool) { + return _operatorApprovals[owner][operator]; } - /** - * Funzione interna per invocare `onERC721Received` su un dato indirizzo - * La chiamata non è eseguita se l'indirizzo di destinazione non è un contratto - */ - function _checkOnERC721Received( - address from, - address to, - uint256 pizzaId, - bytes memory _data - ) internal returns (bool) { - if (!isContract(to)) { - return true; - } + function transferFrom(address from, address to, uint256 tokenId) public { + //solhint-disable-next-line max-line-length + require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); - bytes4 retval = IERC721Receiver(to).onERC721Received( - msg.sender, - from, - pizzaId, - _data - ); - return (retval == _ERC721_RECEIVED); + _transferFrom(from, to, tokenId); } - // Brucia una Pizza - distrugge completamente il Token - // Il modificatore della funzione `external` significa che questa funzione fa - // parte dell'interfaccia del contratto e che gli altri contratti possono chiamarla - function burn(uint256 _pizzaId) external { - require(msg.sender != address(0), "Indirizzo non valido."); - require(_exists(_pizzaId), "La Pizza non esiste."); - require(_isApprovedOrOwner(msg.sender, _pizzaId), "Indirizzo non approvato."); - - ownerPizzaCount[msg.sender] = SafeMath.sub( - ownerPizzaCount[msg.sender], - 1 - ); - pizzaToOwner[_pizzaId] = address(0); + function safeTransferFrom(address from, address to, uint256 tokenId) public { + safeTransferFrom(from, to, tokenId, ""); } - // Restituisce il numero di Pizze per indirizzo - function balanceOf(address _owner) public view returns (uint256 _balance) { - return ownerPizzaCount[_owner]; + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { + transferFrom(from, to, tokenId); + require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } - // Restituisce il proprietario della Pizza trovato per id - function ownerOf(uint256 _pizzaId) public view returns (address _owner) { - address owner = pizzaToOwner[_pizzaId]; - require(owner != address(0), "ID della Pizza non valido."); - return owner; + function _exists(uint256 tokenId) internal view returns (bool) { + address owner = _tokenOwner[tokenId]; + return owner != address(0); } - // Approva altri indirizzi per trasferire la proprietà della Pizza - function approve(address _to, uint256 _pizzaId) public { - require(msg.sender == pizzaToOwner[_pizzaId], "Dev'essere il proprietario della Pizza."); - pizzaApprovals[_pizzaId] = _to; - emit Approval(msg.sender, _to, _pizzaId); + function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { + require(_exists(tokenId), "ERC721: operator query for nonexistent token"); + address owner = ownerOf(tokenId); + return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } - // Restituisce l'indirizzo approvato per la Pizza specifica - function getApproved(uint256 _pizzaId) - public - view - returns (address operator) - { - require(_exists(_pizzaId), "La Pizza non esiste."); - return pizzaApprovals[_pizzaId]; - } + function _mint(address to, uint256 tokenId) internal { + require(to != address(0), "ERC721: mint to the zero address"); + require(!_exists(tokenId), "ERC721: token already minted"); - /** - * La funzione privata per cancellare l'approvazione corrente dell'ID di un dato token - * Si ripristina se l'indirizzo dato non è il proprietario del token - */ - function _clearApproval(address owner, uint256 _pizzaId) private { - require(pizzaToOwner[_pizzaId] == owner, "Dev'essere il proprietario della pizza."); - require(_exists(_pizzaId), "La Pizza non esiste."); - if (pizzaApprovals[_pizzaId] != address(0)) { - pizzaApprovals[_pizzaId] = address(0); - } - } + _tokenOwner[tokenId] = to; + _ownedTokensCount[to].increment(); - /* - * Imposta o rimuove l'approvazione di un dato operatore - * Un operatore può trasferire tutti i token del mittente per conto suo - */ - function setApprovalForAll(address to, bool approved) public { - require(to != msg.sender, "Impossibile approvare il proprio indirizzo"); - operatorApprovals[msg.sender][to] = approved; - emit ApprovalForAll(msg.sender, to, approved); + emit Transfer(address(0), to, tokenId); } - // Dice se un operatore è approvato da un dato proprietario - function isApprovedForAll(address owner, address operator) - public - view - returns (bool) - { - return operatorApprovals[owner][operator]; - } + function _burn(address owner, uint256 tokenId) internal { + require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); + + _clearApproval(tokenId); - // Prende proprietà della Pizza - solo per gli utenti approvati - function takeOwnership(uint256 _pizzaId) public { - require(_isApprovedOrOwner(msg.sender, _pizzaId), "L'indirizzo non è approvato."); - address owner = this.ownerOf(_pizzaId); - this.transferFrom(owner, msg.sender, _pizzaId); + _ownedTokensCount[owner].decrement(); + _tokenOwner[tokenId] = address(0); + + emit Transfer(owner, address(0), tokenId); } - // Verifica se la Pizza esiste - function _exists(uint256 pizzaId) internal view returns (bool) { - address owner = pizzaToOwner[pizzaId]; - return owner != address(0); + function _burn(uint256 tokenId) internal { + _burn(ownerOf(tokenId), tokenId); } - // Verifica se l'indirizzo è il proprietario o è approvato per trasferire la Pizza - function _isApprovedOrOwner(address spender, uint256 pizzaId) - internal - view - returns (bool) - { - address owner = pizzaToOwner[pizzaId]; - // Disabilita il controllo di solium a causa di - // https://github.com/duaraghav8/Solium/issues/175 - // solium-disable-next-line operator-whitespace - return (spender == owner || - this.getApproved(pizzaId) == spender || - this.isApprovedForAll(owner, spender)); + function _transferFrom(address from, address to, uint256 tokenId) internal { + require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); + require(to != address(0), "ERC721: transfer to the zero address"); + + _clearApproval(tokenId); + + _ownedTokensCount[from].decrement(); + _ownedTokensCount[to].increment(); + + _tokenOwner[tokenId] = to; + + emit Transfer(from, to, tokenId); } - // Verifica se la Pizza è univoca e non esiste ancora - modifier isUnique(string memory _name, uint256 _dna) { - bool result = true; - for (uint256 i = 0; i < pizzas.length; i++) { - if ( - keccak256(abi.encodePacked(pizzas[i].name)) == - keccak256(abi.encodePacked(_name)) && - pizzas[i].dna == _dna - ) { - result = false; - } + function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) + internal returns (bool) + { + if (!to.isContract()) { + return true; } - require(result, "Una Pizza con quel nome esiste già."); - _; + + bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); + return (retval == _ERC721_RECEIVED); } - // Restituisce se l'indirizzo di destinazione è un contratto - function isContract(address account) internal view returns (bool) { - uint256 size; - // Correntemente non c'è modo migliore di verificare se esiste un contratto in un indirizzo - // se non controllare la dimensione del codice a quell'indirizzo. - // Visita https://ethereum.stackexchange.com/a/14016/36603 - // per maggiori dettagli sul funzionamento. - // TODO Controllare questo codice nuovamente prima del rilascio di Serenity, perché a quel punto - // tutti gli indirizzi saranno contratti. - // solium-disable-next-line security/no-inline-assembly - assembly { - size := extcodesize(account) + function _clearApproval(uint256 tokenId) private { + if (_tokenApprovals[tokenId] != address(0)) { + _tokenApprovals[tokenId] = address(0); } - return size > 0; } } ``` -## Letture consigliate {#further-reading} +## Letture di approfondimento {#further-reading} -Dai un'occhiata alla documentazione di Solidity e Vyper per una panoramica più complessa dei contratti intelligenti: +Dai un'occhiata alla documentazione di Solidity e Vyper per una panoramica più completa sui contratti intelligenti: -- [Solidity](https://solidity.readthedocs.io/) -- [Vyper](https://vyper.readthedocs.io/) +- [Solidity](https://docs.soliditylang.org/) +- [Vyper](https://docs.vyperlang.org/en/stable/) ## Argomenti correlati {#related-topics} - [Contratti intelligenti](/developers/docs/smart-contracts/) -- [Macchina virtuale Ethereum](/developers/docs/evm/) +- [Macchina virtuale di Ethereum](/developers/docs/evm/) ## Tutorial correlati {#related-tutorials} -- [Ridimensionare i contratti per contrastare il limite di dimensioni del contratto](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/): _Alcuni consigli pratici per ridurre le dimensioni del tuo contratto intelligente._ -- [Registrare dati dai contratti intelligenti con gli eventi](/developers/tutorials/logging-events-smart-contracts/): _Un'introduzione agli eventi dei contratti intelligenti e a come puoi usarli per registrare i dati._ -- [Interagire con gli altri contratti da Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/): _Come distribuire un contratto intelligente da un contratto esistente e interagirvi._ +- [Ridurre le dimensioni dei contratti per combattere il limite di dimensione del contratto](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Alcuni consigli pratici per ridurre le dimensioni del tuo contratto intelligente._ +- [Registrare i dati dai contratti intelligenti con gli eventi](/developers/tutorials/logging-events-smart-contracts/) _– Un'introduzione agli eventi dei contratti intelligenti e a come puoi usarli per registrare i dati._ +- [Interagire con altri contratti da Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Come distribuire un contratto intelligente da un contratto esistente e interagirvi._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/it/developers/docs/smart-contracts/compiling/index.md index d811e9e935d..8fc2bee56f7 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/compiling/index.md @@ -1,26 +1,26 @@ --- -title: Compilazione dei contratti intelligenti -description: Una spiegazione del perché devi compilare i contratti intelligenti e di cosa succede effettivamente durante la compilazione. +title: Compilare i contratti intelligenti +description: "Una spiegazione del perché è necessario compilare i contratti intelligenti e di cosa fa effettivamente la compilazione." lang: it incomplete: true --- -È necessario compilare il contratto in modo che la web app e la macchina virtuale Ethereum (EVM) possano interpretarlo. +Devi compilare il tuo contratto in modo che la tua app web e la macchina virtuale di Ethereum (EVM) possano comprenderlo. ## Prerequisiti {#prerequisites} -Potresti trovare utile leggere la nostra introduzione ai [Contratti Intelligenti](/developers/docs/smart-contracts/) e alla [Macchina Virtuale Ethereum](/developers/docs/evm/) prima di passare alla compilazione. +Potresti trovare utile aver letto la nostra introduzione ai [contratti intelligenti](/developers/docs/smart-contracts/) e alla [macchina virtuale di Ethereum](/developers/docs/evm/) prima di leggere della compilazione. ## L'EVM {#the-evm} -Affinché l'[EVM](/developers/docs/evm/) sia in grado di eseguire il contratto, questo deve essere in **bytecode**. La compilazione trasforma questo: +Affinché l'[EVM](/developers/docs/evm/) sia in grado di eseguire il tuo contratto, questo deve essere in **bytecode**. La compilazione trasforma questo: ```solidity pragma solidity 0.4.24; contract Greeter { - function greet() public constant returns (string) { + function greet() public view returns (string memory) { return "Hello"; } @@ -33,19 +33,19 @@ contract Greeter { PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900 ``` -Questi sono detti **opcode**, o codici operativi. Gli opcode dell'EVM sono le istruzioni di basso livello eseguibili dalla Macchina Virtuale di Ethereum (EVM). Ogni opcode rappresenta un'operazione specifica, come operazioni aritmetiche, operazioni logiche, manipolazione dei dati, flusso di controllo, ecc. +Questi sono chiamati **opcode**. Gli opcode dell'EVM sono le istruzioni di basso livello che la macchina virtuale di Ethereum (EVM) può eseguire. Ogni opcode rappresenta un'operazione specifica, come operazioni aritmetiche, operazioni logiche, manipolazione dei dati, flusso di controllo, ecc. [Maggiori informazioni sugli opcode](/developers/docs/evm/opcodes/) -## Applicazioni Web {#web-applications} +## Applicazioni web {#web-applications} -Il compilatore produce anche l'**Application Binary Interface (ABI)** che serve all'applicazione per capire il contratto e per chiamarne le funzioni. +Il compilatore produrrà anche l'**Application Binary Interface (ABI)**, necessaria affinché la tua applicazione comprenda il contratto e chiami le funzioni del contratto. -L'ABI è un file JSON che descrive il contratto distribuito e le funzioni del suo contratto intelligente. Contribuisce a colmare il divario tra web2 e web3 +L'ABI è un file JSON che descrive il contratto distribuito e le funzioni del suo contratto intelligente. Questo aiuta a colmare il divario tra web2 e web3 -Una [libreria del client JavaScript](/developers/docs/apis/javascript/) leggerà l'**ABI** per poter chiamare il tuo contratto intelligente nell'interfaccia della tua app web. +Una [libreria client JavaScript](/developers/docs/apis/javascript/) leggerà l'**ABI** per consentirti di richiamare il tuo contratto intelligente nell'interfaccia della tua app web. -Di seguito è riportato l'ABI per il contratto token ERC-20. Un ERC-20 è un token che puoi scambiare su Ethereum. +Di seguito è riportata l'ABI per il contratto del token ERC-20. Un ERC-20 è un token che puoi scambiare su Ethereum. ```json [ @@ -274,9 +274,9 @@ Di seguito è riportato l'ABI per il contratto token ERC-20. Un ERC-20 è un tok ## Letture consigliate {#further-reading} -- [ABI spec](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ +- [Specifiche dell'ABI](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ ## Argomenti correlati {#related-topics} - [Librerie client JavaScript](/developers/docs/apis/javascript/) -- [Macchina virtuale Ethereum](/developers/docs/evm/) +- [Macchina virtuale di Ethereum](/developers/docs/evm/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/composability/index.md b/public/content/translations/it/developers/docs/smart-contracts/composability/index.md index 794afad7d10..2f62d0e2040 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/composability/index.md @@ -1,76 +1,76 @@ --- -title: Componibilità dei contratti intelligenti -description: +title: "Componibilità dei contratti intelligenti" +description: Scopri come i contratti intelligenti possono essere combinati come blocchi Lego per creare dApp complesse riutilizzando componenti esistenti. lang: it incomplete: true --- -## Breve introduzione {#a-brief-introduction} +## Una breve introduzione {#a-brief-introduction} -I contratti intelligenti sono pubblici su Ethereum e possono esser considerati come API aperte. Non ti serve di scrivere il tuo contratto intelligente per diventare uno sviluppatore di dapp, basta sapere come interagirvi. Ad esempio, puoi usare i contratti intelligenti esistenti di [Uniswap](https://uniswap.exchange/swap), una borsa decentralizzata, per gestire tutta la logica di scambio di token nella tua app: non devi iniziare da zero. Dai un'occhiata ai loro contratti [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) e [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts). +I contratti intelligenti sono pubblici su Ethereum e possono essere considerati come API aperte. Non è necessario scrivere il proprio contratto intelligente per diventare uno sviluppatore di dApp, basta sapere come interagirvi. Ad esempio, puoi utilizzare i contratti intelligenti esistenti di [Uniswap](https://uniswap.exchange/swap), un exchange decentralizzato, per gestire tutta la logica di scambio di token nella tua app: non è necessario partire da zero. Dai un'occhiata ad alcuni dei loro contratti [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) e [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts). ## Cos'è la componibilità? {#what-is-composability} -La componibilità è la combinazione di componenti distinti per creare nuovi sistemi e risultati. Nello sviluppo software, la componibilità indica che gli sviluppatori possono riutilizzare componenti software esistenti per creare nuove applicazioni. Un modo efficace per comprendere la componibilità è pensare a elementi componibili come i blocchi Lego. I vari tasselli di Lego possono essere combinati tra loro per creare strutture complesse. +La componibilità è la combinazione di componenti distinti per creare nuovi sistemi o risultati. Nello sviluppo di software, la componibilità significa che gli sviluppatori possono riutilizzare componenti software esistenti per creare nuove applicazioni. Un buon modo per comprendere la componibilità è pensare agli elementi componibili come a dei blocchi Lego. Ogni Lego può essere combinato con un altro, consentendoti di costruire strutture complesse combinando Lego diversi. -Su Ethereum, ogni contratto intelligente è un Lego di qualche tipo: puoi usare i contratti intelligenti da altri progetti come blocchi di partenza per il tuo progetto. Ciò significa che non devi passare tempo a reinventare la ruota o costruire da zero. +In Ethereum, ogni contratto intelligente è una sorta di Lego: puoi utilizzare i contratti intelligenti di altri progetti come elementi costitutivi per il tuo progetto. Ciò significa che non devi perdere tempo a reinventare la ruota o a costruire da zero. ## Come funziona la componibilità? {#how-does-composability-work} -I contratti intelligenti di Ethereum sono come API pubbliche, quindi, chiunque può interagire con il contratto o integrarlo nelle dapp per maggiori funzionalità. La componibilità dei contratti intelligenti si basa generalmente su tre principi: modularità, autonomia e scopribilità: +I contratti intelligenti di Ethereum sono come API pubbliche, quindi chiunque può interagire con il contratto o integrarli nelle dApp per aggiungere funzionalità. La componibilità dei contratti intelligenti si basa generalmente su tre principi: modularità, autonomia e rilevabilità: -**1. Modularità**: la capacità dei singoli componenti di eseguire un'attività specifica. Su Ethereum, ogni contratto intelligente ha un caso d'uso specifico (come visto nell'esempio di Uniswap). +**1. Modularità**: è la capacità dei singoli componenti di eseguire un'attività specifica. In Ethereum, ogni contratto intelligente ha un caso d'uso specifico (come mostrato nell'esempio di Uniswap). -**2. Autonomia**: i componenti componibili devono poter operare indipendentemente. Ogni contratto intelligente su Ethereum è auto-eseguibile e può funzionare senza affidarsi ad altre parti del sistema. +**2. Autonomia**: i componenti componibili devono essere in grado di operare in modo indipendente. Ogni contratto intelligente in Ethereum è auto-eseguibile e può funzionare senza fare affidamento su altre parti del sistema. -**3. Scopribilità**: Gli sviluppatori non possono chiamare i contratti esterni o integrare librerie software nelle applicazioni se queste non sono disponibili pubblicamente. Di design, i contratti intelligenti sono open source; chiunque può chiamare un contratto intelligente o biforcare un codebase. +**3. Rilevabilità**: gli sviluppatori non possono chiamare contratti esterni o integrare librerie software nelle applicazioni se i primi non sono disponibili pubblicamente. Per impostazione predefinita, i contratti intelligenti sono open-source; chiunque può chiamare un contratto intelligente o eseguire una biforcazione di una base di codice. ## Vantaggi della componibilità {#benefits-of-composability} ### Ciclo di sviluppo più breve {#shorter-development-cycle} -La componibilità riduce il lavoro degli sviluppatori per la creazione delle [dapp](/apps/#what-are-dapps). [Come dice Naval Ravikant:](https://twitter.com/naval/status/1444366754650656770) "Open source significa che ogni problema va risolto una sola volta." +La componibilità riduce il lavoro che gli sviluppatori devono svolgere durante la creazione di [dApp](/apps/#what-are-dapps). [Come afferma Naval Ravikant:](https://twitter.com/naval/status/1444366754650656770) "Open source significa che ogni problema deve essere risolto una sola volta." -Se esiste un contratto intelligente che risolve un problema, altri sviluppatori possono riutilizzarlo, così che non debbano risolvere lo stesso problema. In questo modo, gli sviluppatori possono utilizzare librerie software esistenti e aggiungere funzionalità supplementari per creare nuove dapp. +Se esiste un contratto intelligente che risolve un problema, altri sviluppatori possono riutilizzarlo, in modo da non dover risolvere lo stesso problema. In questo modo, gli sviluppatori possono prendere librerie software esistenti e aggiungere funzionalità extra per creare nuove dApp. ### Maggiore innovazione {#greater-innovation} -La componibilità incoraggia l'innovazione e la sperimentazione, poiché gli sviluppatori sono liberi di riutilizzare, modificare, duplicare o integrare il codice open source per creare i risultati desiderati. Di conseguenza, i team di sviluppo passano meno tempo sulle funzionalità di base e possono dedicarne di più sperimentando con nuove funzionalità. +La componibilità incoraggia l'innovazione e la sperimentazione perché gli sviluppatori sono liberi di riutilizzare, modificare, duplicare o integrare codice open-source per creare i risultati desiderati. Di conseguenza, i team di sviluppo dedicano meno tempo alle funzionalità di base e possono dedicare più tempo alla sperimentazione di nuove funzionalità. ### Migliore esperienza utente {#better-user-experience} -L'interoperabilità tra i componenti dell'ecosistema di Ethereum migliora l'esperienza utente. Gli utenti possono accedere a maggiori funzionalità quando le dapp integrano i contratti intelligenti esterni, rispetto a un ecosistema frammentato in cui le applicazioni non possono comunicare. +L'interoperabilità tra i componenti dell'ecosistema di Ethereum migliora l'esperienza utente. Gli utenti possono accedere a maggiori funzionalità quando le dApp integrano contratti intelligenti esterni rispetto a un ecosistema frammentato in cui le applicazioni non possono comunicare. -Useremo un esempio dal trading d'arbitraggio per illustrare i benefici dell'interoperabilità: +Useremo un esempio dal trading di arbitraggio per illustrare i vantaggi dell'interoperabilità: -Se un token ha un valore maggiore sull'`exchange A` rispetto all'`exchange B`, puoi sfruttare la differenza di prezzo per ottenere un profitto. Tuttavia, puoi farlo solo se hai abbastanza capitale per finanziare la transazione (ovvero acquistando il token dall'`exchange B` e vendendolo sull'`exchange A`). +Se un token viene scambiato a un prezzo più alto sull'`exchange A` rispetto all'`exchange B`, puoi sfruttare la differenza di prezzo per trarre profitto. Tuttavia, puoi farlo solo se hai abbastanza capitale per finanziare la transazione (ovvero, acquistare il token dall'`exchange B` e venderlo sull'`exchange A`). -In uno scenario in cui non hai fondi sufficienti per coprire lo scambio, un prestito flash potrebbe essere ideale. I [prestiti Flash](/defi/#flash-loans) sono altamente tecnici, ma l'idea di base è che puoi prendere in prestito risorse (senza garanzia) e restituirle entro _una_ transazione. +In uno scenario in cui non hai fondi sufficienti per coprire lo scambio, un prestito lampo (flash loan) potrebbe essere l'ideale. I [prestiti lampo](/defi/#flash-loans) sono altamente tecnici, ma l'idea di base è che puoi prendere in prestito asset (senza garanzie) e restituirli all'interno di _una_ singola transazione. -Tornando al nostro esempio iniziale, un trader d'arbitraggio può assumere un grande prestito flash, acquistare i token dall'`exchange B`, venderli sull'`exchange A`, ripagare il capitale e gli interessi e conservare il profitto, il tutto nella stessa transazione. Questa logica complessa richiede la combinazione di chiamate a più contratti, che sarebbe impossibile se i contratti intelligenti mancassero di interoperabilità. +Tornando al nostro esempio iniziale, un trader di arbitraggio può stipulare un grosso prestito lampo, acquistare token dall'`exchange B`, venderli sull'`exchange A`, rimborsare il capitale + gli interessi e trattenere il profitto, all'interno della stessa transazione. Questa logica complessa richiede la combinazione di chiamate a più contratti, il che non sarebbe possibile se i contratti intelligenti non avessero interoperabilità. -## Esempi di componibilità su Ethereum {#composability-in-ethereum} +## Esempi di componibilità in Ethereum {#composability-in-ethereum} -### Scambio di token {#token-swaps} +### Scambi di token {#token-swaps} -Se crei una dapp che richiede il pagamento delle transazioni in ETH, puoi consentire agli utenti di pagare in altri token ERC-20 integrando la logica di scambio dei token. Il codice convertirà automaticamente il token dell'utente in ETH prima che il contratto esegua la funzione chiamata. +Se crei una dApp che richiede che le transazioni vengano pagate in ETH, puoi consentire agli utenti di pagare in altri token ERC-20 integrando la logica di scambio di token. Il codice convertirà automaticamente il token dell'utente in ETH prima che il contratto esegua la funzione chiamata. ### Governance {#governance} -Creare sistemi di governance su misura per una [DAO](/dao/) può essere costoso e richiedere tempo. Invece, potresti usare un kit di strumenti di governance open source, come [Aragon Client](https://client.aragon.org/), per spingere la tua DAO a creare rapidamente un quadro di governance. +Costruire sistemi di governance su misura per una [DAO](/dao/) può essere costoso e richiedere molto tempo. Invece, potresti utilizzare un toolkit di governance open-source, come [Aragon Client](https://client.aragon.org/), per avviare la tua DAO e creare rapidamente un framework di governance. ### Gestione dell'identità {#identity-management} -Invece di creare un sistema di autenticazione personalizzato o affidarti a fornitori centralizzati, puoi integrare strumenti di identità decentralizzata (DID) per gestire l'autenticazione per gli utenti. Un esempio è [SpruceID](https://www.spruceid.com/), un kit di strumenti open source che offre una funzionalità "Accedi con Ethereum" che consente agli utenti di autenticare le identità con un portafoglio di Ethereum. +Invece di creare un sistema di autenticazione personalizzato o fare affidamento su provider centralizzati, puoi integrare strumenti di identità decentralizzata (DID) per gestire l'autenticazione degli utenti. Un esempio è [SpruceID](https://www.spruceid.com/), un toolkit open-source che offre una funzionalità "Accedi con Ethereum" che consente agli utenti di autenticare le identità con un portafoglio Ethereum. ## Tutorial correlati {#related-tutorials} -- [Avvia lo sviluppo del frontend della tua dapp con create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/)_: una panoramica di come utilizzare create-eth-app per creare app con popolari contratti intelligenti, pronti all'uso._ +- [Avvia lo sviluppo del frontend della tua dApp con create-eth-app](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– Una panoramica su come utilizzare create-eth-app per creare app con contratti intelligenti popolari pronti all'uso._ -## Lettura consigliate {#further-reading} +## Letture consigliate {#further-reading} -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ -- [Componibilità è Innovazione](https://future.a16z.com/how-composability-unlocks-crypto-and-everything-else/) -- [Perché la componibilità conta per Web3](https://hackernoon.com/why-composability-matters-for-web3) -- [Cos'è la componibilità?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) +- [La componibilità è innovazione](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/) +- [Perché la componibilità è importante per il Web3](https://hackernoon.com/why-composability-matters-for-web3) +- [Cos'è la componibilità?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/it/developers/docs/smart-contracts/deploying/index.md index ca0bcaab34a..ab87074a514 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/deploying/index.md @@ -1,59 +1,59 @@ --- title: Distribuire i contratti intelligenti -description: +description: Scopri come distribuire i contratti intelligenti sulle reti di Ethereum, inclusi i prerequisiti, gli strumenti e i passaggi per la distribuzione. lang: it --- -Devi distribuire il tuo contratto intelligente, affinché sia disponibile agli utenti di una rete di Ethereum. +Devi distribuire il tuo contratto intelligente affinché sia disponibile per gli utenti di una rete di Ethereum. -Per distribuire un contratto intelligente, invii una transazione di Ethereum contenente il codice compilato del contratto intelligente, senza specificare alcun destinatario. +Per distribuire un contratto intelligente, devi semplicemente inviare una transazione di Ethereum contenente il codice compilato del contratto intelligente senza specificare alcun destinatario. ## Prerequisiti {#prerequisites} -Dovresti comprendere le [reti di Ethereum](/developers/docs/networks/), le [transazioni](/developers/docs/transactions/) e l'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/), prima di distribuire i contratti intelligenti. +Dovresti comprendere le [reti di Ethereum](/developers/docs/networks/), le [transazioni](/developers/docs/transactions/) e l'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/) prima di distribuire i contratti intelligenti. -Distribuire un contratto, inoltre, costa ether (ETH), poiché questi sono memorizzati sulla blockchain, quindi dovresti avere familiarità con [carburante e commissioni](/developers/docs/gas/) su Ethereum. +Distribuire un contratto costa anche ether (ETH) poiché vengono archiviati sulla blockchain, quindi dovresti avere familiarità con il [gas e le commissioni](/developers/docs/gas/) su Ethereum. -Infine, dovrai compilare il tuo contratto prima di distribuirlo, quindi, assicurati di aver letto a riguardo della [compilazione dei contratti intelligenti](/developers/docs/smart-contracts/compiling/). +Infine, dovrai compilare il tuo contratto prima di distribuirlo, quindi assicurati di aver letto la sezione sulla [compilazione dei contratti intelligenti](/developers/docs/smart-contracts/compiling/). ## Come distribuire un contratto intelligente {#how-to-deploy-a-smart-contract} -### Cosa ti serve {#what-youll-need} +### Cosa ti servirà {#what-youll-need} -- Il bytecode del tuo contratto: è generato tramite la [compilazione](/developers/docs/smart-contracts/compiling/) -- ETH per gas: imposterai il limite di gas come per altre transazioni, quindi, sappi che la distribuzione del contratto necessita di molto più gasi di un semplice trasferimento di ETH -- uno script o un plugin di distribuzione. -- accesso a un [nodo Ethereum](/developers/docs/nodes-and-clients/) tramite esecuzione di un nodo personalizzato, connessione a un nodo pubblico o utilizzando una chiave API con un [servizio di nodi](/developers/docs/nodes-and-clients/nodes-as-a-service/) +- Il bytecode del tuo contratto: viene generato tramite la [compilazione](/developers/docs/smart-contracts/compiling/) +- ETH per il gas: imposterai il tuo limite del gas come per le altre transazioni, quindi tieni presente che la distribuzione del contratto richiede molto più gas rispetto a un semplice trasferimento di ETH +- uno script o un plugin di distribuzione +- accesso a un [nodo di Ethereum](/developers/docs/nodes-and-clients/), eseguendone uno tuo, connettendoti a un nodo pubblico o tramite una chiave API utilizzando un [servizio di nodi](/developers/docs/nodes-and-clients/nodes-as-a-service/) ### Passaggi per distribuire un contratto intelligente {#steps-to-deploy} -I passaggi specifici richiesti dipenderanno dal quadro di sviluppo in questione. Ad esempio, puoi consultare la [documentazione di Hardhat sulla distribuzione dei tuoi contratti](https://hardhat.org/docs/tutorial/deploying) o la [documentazione di Foundry sulla distribuzione e verifica di un contratto intelligente](https://book.getfoundry.sh/forge/deploying). Una volta distribuito, il tuo contratto avrà un indirizzo di Ethereum, come gli altri [conti](/developers/docs/accounts/), e potrà essere verificato utilizzando gli [strumenti di verifica del codice sorgente](/developers/docs/smart-contracts/verifying/#source-code-verification-tools). +I passaggi specifici dipenderanno dal framework di sviluppo in questione. Ad esempio, puoi consultare la [documentazione di Hardhat sulla distribuzione dei tuoi contratti](https://hardhat.org/docs/tutorial/deploying) o la [documentazione di Foundry sulla distribuzione e verifica di un contratto intelligente](https://book.getfoundry.sh/forge/deploying). Una volta distribuito, il tuo contratto avrà un indirizzo di Ethereum come gli altri [account](/developers/docs/accounts/) e potrà essere verificato utilizzando [strumenti di verifica del codice sorgente](/developers/docs/smart-contracts/verifying/#source-code-verification-tools). ## Strumenti correlati {#related-tools} -**Remix - _Remix IDE consente di sviluppare, distribuire e amministrare i contratti intelligenti per Ethereum, come le blockchain_** +**Remix - _L'IDE Remix consente di sviluppare, distribuire e amministrare contratti intelligenti per blockchain simili a Ethereum_** - [Remix](https://remix.ethereum.org) -**Tenderly: _Piattaforma di sviluppo in Web3 che fornisce debug, osservabilità e blocchi di costruzione dell'infrastruttura per sviluppare, testare, monitorare e gestire i contratti intelligenti_** +**Tenderly - _Piattaforma di sviluppo web3 che fornisce debug, osservabilità e blocchi di costruzione dell'infrastruttura per sviluppare, testare, monitorare e gestire contratti intelligenti_** - [tenderly.co](https://tenderly.co/) -- [Documenti](https://docs.tenderly.co/) +- [Documentazione](https://docs.tenderly.co/) - [GitHub](https://github.com/Tenderly) - [Discord](https://discord.gg/eCWjuvt) -**Hardhat - _Un ambiente di sviluppo per compilare, distribuire, testare ed effettuare il debug del tuo software di Ethereum_** +**Hardhat - _Un ambiente di sviluppo per compilare, distribuire, testare ed eseguire il debug del tuo software per Ethereum_** - [hardhat.org](https://hardhat.org/getting-started/) - [Documentazione sulla distribuzione dei tuoi contratti](https://hardhat.org/docs/tutorial/deploying) - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**thirdweb - _Distribuisci con facilità qualsiasi contratto a qualsiasi catena che sia compatibile con EVM, utilizzando un singolo comando_** +**thirdweb - _Distribuisci facilmente qualsiasi contratto su qualsiasi catena compatibile con l'EVM, utilizzando un singolo comando_** - [Documentazione](https://portal.thirdweb.com/deploy/) -**Crossmint - _Piattaforma di sviluppo Web3 per imprese per distribuire contratti intelligenti, consentire i pagamenti con carte di credito e tra catene, e utilizzare le API per creare, distribuire, vendere, memorizzare e modificare i NFT._** +**Crossmint - _Piattaforma di sviluppo web3 di livello aziendale per distribuire contratti intelligenti, abilitare pagamenti con carta di credito e cross-chain, e utilizzare API per creare, distribuire, vendere, archiviare e modificare NFT._** - [crossmint.com](https://www.crossmint.com) - [Documentazione](https://docs.crossmint.com) @@ -62,20 +62,20 @@ I passaggi specifici richiesti dipenderanno dal quadro di sviluppo in questione. ## Tutorial correlati {#related-tutorials} -- [Deploying your first smart contract](/developers/tutorials/deploying-your-first-smart-contract/): _Un'introduzione alla distribuzione del primo contratto su una rete di prova di Ethereum._ -- [Hello World | smart contract tutorial](/developers/tutorials/hello-world-smart-contract/): _Un tutorial facile da seguire per creare e distribuire un contratto intelligente di base su Ethereum._ -- [Interagire con gli altri contratti da Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/): _Come distribuire un contratto intelligente da un contratto esistente e interagirvi._ -- [How to downsize your contract size](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/): _Come ridurre le dimensioni del tuo contratto per mantenerlo sotto il limite e risparmiare carburante_ +- [Distribuire il tuo primo contratto intelligente](/developers/tutorials/deploying-your-first-smart-contract/) _– Un'introduzione alla distribuzione del tuo primo contratto intelligente su una rete di test di Ethereum._ +- [Hello World | tutorial sui contratti intelligenti](/developers/tutorials/hello-world-smart-contract/) _– Un tutorial facile da seguire per creare e distribuire un contratto intelligente di base su Ethereum._ +- [Interagire con altri contratti da Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Come distribuire un contratto intelligente da un contratto esistente e interagirvi._ +- [Come ridurre le dimensioni del tuo contratto](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- Come ridurre le dimensioni del tuo contratto per mantenerlo sotto il limite e risparmiare sul gas_ ## Letture consigliate {#further-reading} - [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_ -- [Distribuire i tuoi contratti Hardhat](https://hardhat.org/docs/tutorial/deploying) - _Nomic Labs_ +- [Distribuire i tuoi contratti con Hardhat](https://hardhat.org/docs/tutorial/deploying) - _Nomic Labs_ -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [Quadri di sviluppo](/developers/docs/frameworks/) +- [Framework di sviluppo](/developers/docs/frameworks/) - [Eseguire un nodo di Ethereum](/developers/docs/nodes-and-clients/run-a-node/) -- [Nodes-as-a-service](/developers/docs/nodes-and-clients/nodes-as-a-service) +- [Nodi come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/it/developers/docs/smart-contracts/formal-verification/index.md index 98898c96b87..2eec637168b 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/formal-verification/index.md @@ -4,145 +4,145 @@ description: Una panoramica della verifica formale per i contratti intelligenti lang: it --- -I [contratti intelligenti](/developers/docs/smart-contracts/) consentono di creare applicazioni decentralizzate, affidabili e robuste che introducono nuovi casi d'uso e creano valore per gli utenti. Poiché i contratti intelligenti gestiscono grandi quantità di valore, la sicurezza è una considerazione fondamentale per gli sviluppatori. +I [contratti intelligenti](/developers/docs/smart-contracts/) stanno rendendo possibile la creazione di applicazioni decentralizzate, robuste e trustless che introducono nuovi casi d'uso e sbloccano valore per gli utenti. Poiché i contratti intelligenti gestiscono grandi quantità di valore, la sicurezza è una considerazione critica per gli sviluppatori. -La verifica formale è una delle tecniche consigliate per migliorare la [sicurezza dei contratti intelligenti](/developers/docs/smart-contracts/security/). La verifica formale, che utilizza i [metodi formali](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) per specificare, progettare e verificare i programmi, è stata utilizzata per anni per assicurare la correttezza di sistemi hardware e software fondamentali. +La verifica formale è una delle tecniche consigliate per migliorare la [sicurezza dei contratti intelligenti](/developers/docs/smart-contracts/security/). La verifica formale, che utilizza [metodi formali](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) per specificare, progettare e verificare i programmi, è stata utilizzata per anni per garantire la correttezza dei sistemi hardware e software critici. -Quando implementata nei contratti intelligenti, la verifica formale può dimostrare che la logica aziendale di un contratto soddisfa una specifica predefinita. Rispetto ad altri metodi di valutazione della correttezza del codice di un contratto, come i test, la verifica formale fornisce maggiori garanzie che un contratto intelligente sia funzionalmente corretto. +Quando implementata nei contratti intelligenti, la verifica formale può dimostrare che la logica di business di un contratto soddisfa una specifica predefinita. Rispetto ad altri metodi per valutare la correttezza del codice del contratto, come i test, la verifica formale offre garanzie più forti che un contratto intelligente sia funzionalmente corretto. -## Cosa è la verifica formale? {#what-is-formal-verification} +## Cos'è la verifica formale? {#what-is-formal-verification} -La verifica formale si riferisce al processo di valutazione della correttezza di un sistema rispetto a una specifica formale. In termini più semplici, ci consente di verificare se il comportamento di un sistema soddisfa dei requisiti (cioè, fa ciò che vogliamo). +La verifica formale si riferisce al processo di valutazione della correttezza di un sistema rispetto a una specifica formale. In termini più semplici, la verifica formale ci consente di controllare se il comportamento di un sistema soddisfa determinati requisiti (cioè, fa ciò che vogliamo). -I comportamenti previsti del sistema (un contratto intelligente, in questo caso) sono descritti utilizzando la modellizzazione formale, mentre i linguaggi di specifica consentono la creazione di proprietà formali. Le tecniche di verifica formale possono quindi verificare che l'implementazione di un contratto sia conforme con le sue specifiche e ricavare la prova matematica della relativa correttezza. Quando un contratto soddisfa le sue specifiche, è descritto come "funzionalmente corretto", "corretto per progettazione" o "corretto per costruzione". +I comportamenti attesi del sistema (un contratto intelligente in questo caso) sono descritti utilizzando la modellazione formale, mentre i linguaggi di specifica consentono la creazione di proprietà formali. Le tecniche di verifica formale possono quindi verificare che l'implementazione di un contratto sia conforme alla sua specifica e derivare una prova matematica della correttezza della prima. Quando un contratto soddisfa la sua specifica, viene descritto come "funzionalmente corretto", "corretto per progettazione" o "corretto per costruzione". -### Cosa è un modello formale? {#what-is-a-formal-model} +### Cos'è un modello formale? {#what-is-a-formal-model} -In informatica, un [modello formale](https://en.wikipedia.org/wiki/Model_of_computation) è una descrizione matematica di un processo di calcolo. I programmi sono astratti in funzioni matematiche (equazioni) e il modello descrive come, dato un input, vengono calcolati i risultati delle funzioni. +Nell'informatica, un [modello formale](https://en.wikipedia.org/wiki/Model_of_computation) è una descrizione matematica di un processo computazionale. I programmi sono astratti in funzioni matematiche (equazioni), con il modello che descrive come vengono calcolati gli output delle funzioni dato un input. -I modelli formali forniscono un livello di astrazione su cui è valutabile l'analisi del comportamento di un programma. L'esistenza di modelli formali consente la creazione di una _specifica formale_, che descrive le proprietà desiderate del modello in questione. +I modelli formali forniscono un livello di astrazione su cui può essere valutata l'analisi del comportamento di un programma. L'esistenza di modelli formali consente la creazione di una _specifica formale_, che descrive le proprietà desiderate del modello in questione. -Sono utilizzate diverse tecniche per modellizzare i contratti intelligenti per la verifica formale. Ad esempio, alcuni modelli sono utilizzati per ragionare sul comportamento di alto livello di un contratto intelligente. Queste tecniche di modellizzazione applicano una visualizzazione a scatola nera ai contratti intelligenti, visualizzandoli come sistemi che accettano input ed eseguono calcoli sulla base degli stessi. +Vengono utilizzate diverse tecniche per modellare i contratti intelligenti per la verifica formale. Ad esempio, alcuni modelli sono utilizzati per ragionare sul comportamento ad alto livello di un contratto intelligente. Queste tecniche di modellazione applicano una visione a scatola nera (black-box) ai contratti intelligenti, considerandoli come sistemi che accettano input ed eseguono calcoli basati su tali input. -I modelli di alto livello si concentrano sulla relazione tra contratti intelligenti e agenti esterni, come conti posseduti esternamente (EOA), conti di contratti e l'ambiente della blockchain. Tali modelli sono utili per definire le proprietà che specificano come un contratto dovrebbe comportarsi in risposta a determinate interazioni degli utenti. +I modelli ad alto livello si concentrano sulla relazione tra i contratti intelligenti e gli agenti esterni, come gli account controllati esternamente (EOA), gli account del contratto e l'ambiente della blockchain. Tali modelli sono utili per definire le proprietà che specificano come un contratto dovrebbe comportarsi in risposta a determinate interazioni dell'utente. -Al contrario, altri modelli formali si concentrano sul comportamento di basso livello di un contratto intelligente. Sebbene i modelli di alto livello possano aiutare a ragionare sulla funzionalità di un contratto, potrebbero non riuscire a catturare i dettagli sui meccanismi interni dell'implementazione. I modelli di basso livello applicano una visualizzazione a scatola bianca per analizzare il programma e si affidano a rappresentazioni di basso livello delle applicazioni del contratto intelligente, quali tracce del programma e [grafici del flusso di controllo](https://en.wikipedia.org/wiki/Control-flow_graph), per ragionare sulle proprietà rilevanti alla sua esecuzione. +Al contrario, altri modelli formali si concentrano sul comportamento a basso livello di un contratto intelligente. Mentre i modelli ad alto livello possono aiutare a ragionare sulla funzionalità di un contratto, potrebbero non riuscire a catturare i dettagli sul funzionamento interno dell'implementazione. I modelli a basso livello applicano una visione a scatola bianca (white-box) all'analisi del programma e si basano su rappresentazioni di livello inferiore delle applicazioni dei contratti intelligenti, come le tracce del programma e i [grafi del flusso di controllo](https://en.wikipedia.org/wiki/Control-flow_graph), per ragionare sulle proprietà rilevanti per l'esecuzione di un contratto. -I modelli di basso livello sono considerati ideali perché rappresentano l'effettiva esecuzione di un contratto intelligente nell'ambiente di esecuzione di Ethereum (cioè, l'[EVM](/developers/docs/evm/)). Le tecniche di modellizzazione di basso livello sono particolarmente utili nello stabilire le proprietà di sicurezza essenziali nei contratti intelligenti e nel rilevare le potenziali vulnerabilità. +I modelli a basso livello sono considerati ideali poiché rappresentano l'effettiva esecuzione di un contratto intelligente nell'ambiente di esecuzione di Ethereum (cioè, la [EVM](/developers/docs/evm/)). Le tecniche di modellazione a basso livello sono particolarmente utili per stabilire proprietà di sicurezza critiche nei contratti intelligenti e rilevare potenziali vulnerabilità. -### Cosa è una specifica formale? {#what-is-a-formal-specification} +### Cos'è una specifica formale? {#what-is-a-formal-specification} -Una specifica è semplicemente un requisito tecnico che uno specifico sistema deve soddisfare. Nella programmazione, le specifiche rappresentano delle idee generali sull'esecuzione di un programma (cioè, cosa il programma dovrebbe fare). +Una specifica è semplicemente un requisito tecnico che un particolare sistema deve soddisfare. Nella programmazione, le specifiche rappresentano idee generali sull'esecuzione di un programma (cioè, cosa dovrebbe fare il programma). -Nel contesto dei contratti intelligenti, le specifiche formali si riferiscono alle _proprietà_: descrizioni formali dei requisiti che un contratto deve soddisfare. Tali proprietà sono descritte come "invarianti" e rappresentano asserzioni logiche sull'esecuzione di un contratto che devono rimanere vere in ogni circostanza possibile, senza eccezione alcuna. +Nel contesto dei contratti intelligenti, le specifiche formali si riferiscono alle _proprietà_: descrizioni formali dei requisiti che un contratto deve soddisfare. Tali proprietà sono descritte come "invarianti" e rappresentano asserzioni logiche sull'esecuzione di un contratto che devono rimanere vere in ogni possibile circostanza, senza alcuna eccezione. -Dunque, possiamo pensare a una specifica formale come una raccolta di dichiarazioni scritte in un linguaggio formale che descrivono l'esecuzione prevista di un contratto intelligente. Le specifiche coprono le proprietà di un contratto e definiscono come questo dovrebbe comportarsi in circostanze diverse. Lo scopo della verifica formale è determinare se un contratto intelligente possiede tali proprietà (invarianti) e che queste non siano violate durante l'esecuzione. +Pertanto, possiamo pensare a una specifica formale come a una raccolta di dichiarazioni scritte in un linguaggio formale che descrivono l'esecuzione prevista di un contratto intelligente. Le specifiche coprono le proprietà di un contratto e definiscono come il contratto dovrebbe comportarsi in diverse circostanze. Lo scopo della verifica formale è determinare se un contratto intelligente possiede queste proprietà (invarianti) e che queste proprietà non vengano violate durante l'esecuzione. -Le specifiche formali sono essenziali per sviluppare implementazioni sicure dei contratti intelligenti. I contratti che non riescono a implementare le invarianti o le cui proprietà sono violate durante l'esecuzione, sono soggetti a vulnerabilità che possono danneggiare la funzionalità o causare sfruttamenti malevoli. +Le specifiche formali sono fondamentali nello sviluppo di implementazioni sicure dei contratti intelligenti. I contratti che non riescono a implementare le invarianti o le cui proprietà vengono violate durante l'esecuzione sono inclini a vulnerabilità che possono danneggiare la funzionalità o causare exploit dannosi. -## Tipi di specifiche formali per contratti intelligenti {#formal-specifications-for-smart-contracts} +## Tipi di specifiche formali per i contratti intelligenti {#formal-specifications-for-smart-contracts} -Le specifiche formali consentono il ragionamento matematico sulla correttezza dell'esecuzione del programma. Come i modelli formali, le specifiche formali possono catturare le proprietà di alto livello o i comportamenti di basso livello dell'implementazione di un contratto. +Le specifiche formali consentono il ragionamento matematico sulla correttezza dell'esecuzione del programma. Come per i modelli formali, le specifiche formali possono catturare sia le proprietà ad alto livello che il comportamento a basso livello di un'implementazione del contratto. -Le specifiche formali sono derivate utilizzando elementi della [logica del programma](https://en.wikipedia.org/wiki/Logic_programming), che consentono il ragionamento formale sulle proprietà di un programma. La logica di un programma contiene le regole formali che esprimono (in linguaggio matematico) il comportamento previsto di un programma. Varie logiche del programma sono utilizzate nella creazione di specifiche formali, tra cui la [logica di raggiungibilità](https://en.wikipedia.org/wiki/Reachability_problem), la [logica temporale](https://en.wikipedia.org/wiki/Temporal_logic) e la [logica di Hoare](https://en.wikipedia.org/wiki/Hoare_logic). +Le specifiche formali sono derivate utilizzando elementi della [logica di programmazione](https://en.wikipedia.org/wiki/Logic_programming), che consentono il ragionamento formale sulle proprietà di un programma. Una logica di programmazione ha regole formali che esprimono (in linguaggio matematico) il comportamento atteso di un programma. Varie logiche di programmazione sono utilizzate nella creazione di specifiche formali, tra cui la [logica di raggiungibilità](https://en.wikipedia.org/wiki/Reachability_problem), la [logica temporale](https://en.wikipedia.org/wiki/Temporal_logic) e la [logica di Hoare](https://en.wikipedia.org/wiki/Hoare_logic). -Le specifiche formali per i contratti intelligenti sono classificabili ampiamente come specifiche di **alto livello** o di **basso livello**. Indipendentemente dalla categoria cui appartiene una specifica, deve descrivere adeguatamente e inequivocabilmente la proprietà del sistema analizzato. +Le specifiche formali per i contratti intelligenti possono essere classificate in generale come specifiche di **alto livello** o di **basso livello**. Indipendentemente dalla categoria a cui appartiene una specifica, deve descrivere in modo adeguato e inequivocabile la proprietà del sistema in analisi. ### Specifiche di alto livello {#high-level-specifications} -Come suggerisce il nome, una specifica di alto livello (anche detta "specifica orientata al modello") descrive il comportamento di alto livello di un programma. Le specifiche di alto livello modellizzano un contratto intelligente come una [macchina a stato finito](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM), che può passare tra stati eseguendo operazioni, utilizzando la logica temporale per definire le proprietà formali per il modello FSM. +Come suggerisce il nome, una specifica di alto livello (chiamata anche "specifica orientata al modello") descrive il comportamento ad alto livello di un programma. Le specifiche di alto livello modellano un contratto intelligente come una [macchina a stati finiti](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM), che può transitare tra gli stati eseguendo operazioni, con la logica temporale utilizzata per definire le proprietà formali per il modello FSM. -Le [logiche temporali](https://en.wikipedia.org/wiki/Temporal_logic) sono "regole per ragionare sulle proposizioni qualificate in termini di tempo (es. "Ho _sempre_ fame" o "_Prima o poi_ avrò fame")." Quando applicate alla verifica formale, le logiche temporali sono utilizzate per dichiarare le asserzioni sul comportamento corretto dei sistemi modellizzati come macchine di stato. Nello specifico, una logica temporale descrive gli stati futuri in cui un contratto intelligente può trovarsi e come passa tra gli stati. +Le [logiche temporali](https://en.wikipedia.org/wiki/Temporal_logic) sono "regole per ragionare su proposizioni qualificate in termini di tempo (ad es., "Ho _sempre_ fame" o "Avrò _alla fine_ fame")". Quando applicate alla verifica formale, le logiche temporali sono utilizzate per dichiarare asserzioni sul comportamento corretto dei sistemi modellati come macchine a stati. Nello specifico, una logica temporale descrive gli stati futuri in cui può trovarsi un contratto intelligente e come transita tra gli stati. -Le specifiche di alto livello catturano generalmente due proprietà temporali essenziali per i contratti intelligenti: **sicurezza** e **vitalità**. Le proprietà di sicurezza rappresentano l'idea che "non si verifica mai nulla di male" e solitamente esprimono invarianza. Una proprietà di sicurezza potrebbe definire i requisiti software generali, quali la libertà da [stallo](https://www.techtarget.com/whatis/definition/deadlock), o esprimere proprietà specifiche del dominio per i contratti (es., le invarianti sul controllo dell'accesso per le funzioni, i valori ammissibili delle variabili di stato o le condizioni per i trasferimenti di token). +Le specifiche di alto livello catturano generalmente due proprietà temporali critiche per i contratti intelligenti: **sicurezza** (safety) e **vitalità** (liveness). Le proprietà di sicurezza rappresentano l'idea che "non accade mai nulla di male" e di solito esprimono invarianza. Una proprietà di sicurezza può definire requisiti software generali, come l'assenza di [stallo (deadlock)](https://www.techtarget.com/whatis/definition/deadlock), o esprimere proprietà specifiche del dominio per i contratti (ad es., invarianti sul controllo degli accessi per le funzioni, valori ammissibili delle variabili di stato o condizioni per i trasferimenti di token). -Prendiamo ad esempio questo requisito di sicurezza che copre le condizioni per l'utilizzo del `transfer()` o `transferFrom()` nei contratti di token ERC-20: _“Il saldo di un mittente non è mai inferiore alla quantità richiesta di token da inviare._ Questa descrizione in linguaggio naturale dell'invariante di un contratto è traducibile in una specifica (matematica) formale, rigorosamente verificabile per la validità. +Prendi ad esempio questo requisito di sicurezza che copre le condizioni per l'utilizzo di `transfer()` o `transferFrom()` nei contratti di token ERC-20: _"Il saldo di un mittente non è mai inferiore all'importo richiesto di token da inviare."_. Questa descrizione in linguaggio naturale di un'invariante del contratto può essere tradotta in una specifica formale (matematica), che può quindi essere rigorosamente controllata per verificarne la validità. -Le proprietà di vitalità asseriscono che "prima o poi si verifica qualcosa di buono" e riguardano la capacità di un contratto di progredire tra diversi stati. Un esempio di proprietà di vitalità è la "liquidità", che si riferisce alla capacità di un contratto di trasferire i propri saldi agli utenti su richiesta. Se questa proprietà viene violata, gli utenti non potrebbero prelevare le risorse memorizzate nel contratto, come avvenuto con l'[incidente del portafoglio Parity](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html). +Le proprietà di vitalità asseriscono che "alla fine accade qualcosa di buono" e riguardano la capacità di un contratto di progredire attraverso diversi stati. Un esempio di proprietà di vitalità è la "liquidità", che si riferisce alla capacità di un contratto di trasferire i propri saldi agli utenti su richiesta. Se questa proprietà viene violata, gli utenti non sarebbero in grado di prelevare gli asset memorizzati nel contratto, come è successo con l'[incidente del portafoglio Parity](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html). ### Specifiche di basso livello {#low-level-specifications} -Le specifiche di alto livello prendono come punto di partenza un modello di stato finito di un contratto e definiscono le proprietà desiderate di questo modello. Al contrario, le specifiche di basso livello (anche dette "specifiche orientate alla proprietà") spesso modellizzano i programmi (contratti intelligenti) come sistemi che comprendono una raccolta di funzioni matematiche e descrivono il comportamento corretto di tali sistemi. +Le specifiche di alto livello prendono come punto di partenza un modello a stati finiti di un contratto e definiscono le proprietà desiderate di questo modello. Al contrario, le specifiche di basso livello (chiamate anche "specifiche orientate alle proprietà") spesso modellano i programmi (contratti intelligenti) come sistemi che comprendono una raccolta di funzioni matematiche e descrivono il comportamento corretto di tali sistemi. -In termini più semplici, le specifiche di basso livello analizzano le _tracce del programma_ e tentano di definire le proprietà di un contratto intelligente sulla base delle stesse. Le tracce si riferiscono a sequenze delle esecuzioni della funzione che alterano lo stato di un contratto intelligente; dunque, le specifiche di basso livello aiutano a specificare i requisiti per l'esecuzione interna di un contratto. +In termini più semplici, le specifiche di basso livello analizzano le _tracce del programma_ e tentano di definire le proprietà di un contratto intelligente su queste tracce. Le tracce si riferiscono a sequenze di esecuzioni di funzioni che alterano lo stato di un contratto intelligente; quindi, le specifiche di basso livello aiutano a specificare i requisiti per l'esecuzione interna di un contratto. -Le specifiche formali di basso livello possono essere date come proprietà in stile Hoare o invarianti sui percorsi d'esecuzione. +Le specifiche formali di basso livello possono essere fornite come proprietà in stile Hoare o invarianti sui percorsi di esecuzione. ### Proprietà in stile Hoare {#hoare-style-properties} -La [logica di Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fornisce una serie di regole formali per ragionare sulla correttezza dei programmi, contratti intelligenti inclusi. Una proprietà in stile Hoare è rappresentata da una tripletta di Hoare `{P}c{Q}`, dove `c` è un programma e `P` e `Q` sono predicati sullo stato della `c` (cioè, il programma), formalmente descritte rispettivamente come _precondizioni_ e _postcondizioni_. +La [logica di Hoare](https://en.wikipedia.org/wiki/Hoare_logic) fornisce un insieme di regole formali per ragionare sulla correttezza dei programmi, inclusi i contratti intelligenti. Una proprietà in stile Hoare è rappresentata da una tripla di Hoare `{P}c{Q}`, dove `c` è un programma e `P` e `Q` sono predicati sullo stato di `c` (cioè, il programma), descritti formalmente come _precondizioni_ e _postcondizioni_, rispettivamente. -Una precondizione è un predicato che descrive le condizioni richieste per l'esecuzione corretta di una funzione; gli utenti che chiamano il contratto devono soddisfare tale requisito. Una postcondizione è un predicato che descrive la condizione che una funzione stabilisce se eseguita correttamente; gli utenti possono prevedere che questa condizione sia vera dopo aver chiamato la funzione. Un'_invariante_ nella logica di Hoare è un predicato che è preservato dall'esecuzione di una funzione (cioè, non cambia). +Una precondizione è un predicato che descrive le condizioni richieste per la corretta esecuzione di una funzione; gli utenti che chiamano il contratto devono soddisfare questo requisito. Una postcondizione è un predicato che descrive la condizione che una funzione stabilisce se eseguita correttamente; gli utenti possono aspettarsi che questa condizione sia vera dopo aver chiamato la funzione. Un'_invariante_ nella logica di Hoare è un predicato che viene preservato dall'esecuzione di una funzione (cioè, non cambia). -Le specifiche in stile Hoare possono garantire la _correttezza parziale_ o la _correttezza totale_. L'implementazione della funzione di un contratto è "parzialmente corretta" se la precondizione resta vera prima dell'esecuzione della funzione e, se l'esecuzione termina, anche la postcondizione è vera. La prova di correttezza totale è ottenuta se una precondizione è vera prima dell'esecuzione della funzione, è garantito che l'esecuzione termini e, quando lo fa, la postcondizione resta vera. +Le specifiche in stile Hoare possono garantire la _correttezza parziale_ o la _correttezza totale_. L'implementazione di una funzione del contratto è "parzialmente corretta" se la precondizione è vera prima che la funzione venga eseguita e, se l'esecuzione termina, anche la postcondizione è vera. La prova della correttezza totale si ottiene se una precondizione è vera prima dell'esecuzione della funzione, l'esecuzione è garantita per terminare e, quando lo fa, la postcondizione è vera. -L'ottenimento della prova di correttezza totale è difficile, poiché alcune esecuzioni potrebbero tardare a terminare, o non terminare affatto. Detto ciò, il fatto che l'esecuzione termini è probabilmente una questione irrilevante, poiché il meccanismo di carburante di Ethereum impedisce i cicli infiniti del programma (l'esecuzione termina con esito positivo o a causa dell'errore 'carburante terminato'). +Ottenere la prova della correttezza totale è difficile poiché alcune esecuzioni potrebbero ritardare prima di terminare, o non terminare affatto. Detto questo, la questione se l'esecuzione termini è probabilmente un punto controverso poiché il meccanismo del gas di Ethereum previene i cicli infiniti del programma (l'esecuzione termina con successo o si conclude a causa di un errore di 'esaurimento del gas'). -Le specifiche dei contratti intelligenti create utilizzando la logica di Hoare avranno precondizioni, postcondizioni e invarianti definite per l'esecuzione di funzioni e cicli in un contratto. Le precondizioni spesso includono la possibilità di input errati a una funzione, con le postcondizioni che descrivono la risposta prevista per tali input (es., generare un'eccezione specifica). In questo modo le proprietà in stile Hoare sono efficaci per garantire la correttezza delle implementazioni del contratto. +Le specifiche dei contratti intelligenti create utilizzando la logica di Hoare avranno precondizioni, postcondizioni e invarianti definite per l'esecuzione di funzioni e cicli in un contratto. Le precondizioni includono spesso la possibilità di input errati a una funzione, con le postcondizioni che descrivono la risposta attesa a tali input (ad es., il lancio di un'eccezione specifica). In questo modo le proprietà in stile Hoare sono efficaci per assicurare la correttezza delle implementazioni del contratto. -Molti quadri di verifica formale utilizzano le specifiche in stile Hoare per provare la correttezza semantica delle funzioni. Inoltre, è possibile aggiungere le proprietà in stile Hoare (come asserzioni) direttamente al codice del contratto utilizzando le istruzioni `require` e `assert` in Solidity. +Molti framework di verifica formale utilizzano specifiche in stile Hoare per dimostrare la correttezza semantica delle funzioni. È anche possibile aggiungere proprietà in stile Hoare (come asserzioni) direttamente al codice del contratto utilizzando le istruzioni `require` e `assert` in Solidity. -Le dichiarazioni `require` esprimono una precondizione o invariante e sono spesso utilizzate per convalidare gli input dell'utente, mentre `assert` cattura una postcondizione necessaria per la sicurezza. Per esempio, il controllo adeguato dell'accesso per le funzioni (un esempio di proprietà di sicurezza) può essere ottenuto utilizzando `require` come controllo della precondizione sull'identità del conto chiamante. Analogamente, un'invariante sui valori di stato ammissibili delle variabili di stato in un contratto (es. numero totale di token in circolazione) può essere protetta dalla violazione utilizzando `assert` per confermare lo stato del contratto dopo l'esecuzione della funzione. +Le istruzioni `require` esprimono una precondizione o un'invariante e sono spesso utilizzate per convalidare gli input dell'utente, mentre `assert` cattura una postcondizione necessaria per la sicurezza. Ad esempio, un adeguato controllo degli accessi per le funzioni (un esempio di proprietà di sicurezza) può essere ottenuto utilizzando `require` come controllo di precondizione sull'identità dell'account chiamante. Allo stesso modo, un'invariante sui valori consentiti delle variabili di stato in un contratto (ad es., il numero totale di token in circolazione) può essere protetta dalla violazione utilizzando `assert` per confermare lo stato del contratto dopo l'esecuzione della funzione. ### Proprietà a livello di traccia {#trace-level-properties} -Le specifiche basate sulla traccia descrivono le operazioni che fanno passare un contratto tra diversi stati e le relazioni tra di esse. Come spiegato in precedenza, le tracce sono sequenze di operazioni che alterano lo stato di un contratto in un certo modo. +Le specifiche basate sulle tracce descrivono le operazioni che fanno transitare un contratto tra diversi stati e le relazioni tra queste operazioni. Come spiegato in precedenza, le tracce sono sequenze di operazioni che alterano lo stato di un contratto in un modo particolare. -Questo approccio si basa sul modello dei contratti intelligenti come sistemi di transizione di stato con degli stati predefiniti (descritti dalle variabili di stato), insieme a una serie di transizioni predefinite (descritte dalle funzioni del contratto). Inoltre, un [grafico del flusso di controllo](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), che è una rappresentazione grafica del flusso d'esecuzione di un programma, è spesso utilizzato per descrivere la semantica operativa di un contratto. Qui ogni traccia è rappresentata come un percorso sul grafico del flusso di controllo. +Questo approccio si basa sul modello dei contratti intelligenti come sistemi di transizione di stato con alcuni stati predefiniti (descritti da variabili di stato) insieme a un insieme di transizioni predefinite (descritte dalle funzioni del contratto). Inoltre, un [grafo del flusso di controllo](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), che è una rappresentazione grafica del flusso di esecuzione di un programma, viene spesso utilizzato per descrivere la semantica operativa di un contratto. Qui, ogni traccia è rappresentata come un percorso sul grafo del flusso di controllo. -In primo luogo, le specifiche a livello di traccia sono utilizzate per ragionare sui modelli d'esecuzione interna nei contratti intelligenti. Creando delle specifiche al livello di traccia, asseriamo i percorsi d'esecuzione ammissibili (cioè, le transizioni di stato) per un contratto intelligente. Utilizzando le tecniche, come l'esecuzione simbolica, possiamo verificare formalmente che l'esecuzione non segua mai un percorso non definito nel modello formale. +Principalmente, le specifiche a livello di traccia sono utilizzate per ragionare sui modelli di esecuzione interna nei contratti intelligenti. Creando specifiche a livello di traccia, asseriamo i percorsi di esecuzione ammissibili (cioè, le transizioni di stato) per un contratto intelligente. Utilizzando tecniche, come l'esecuzione simbolica, possiamo verificare formalmente che l'esecuzione non segua mai un percorso non definito nel modello formale. -Utilizziamo un esempio di contratto [DAO](/dao/) avente delle funzioni accessibili pubblicamente per descrivere le proprietà a livello di traccia. Qui, supponiamo che il contratto DAO consenta agli utenti di eseguire le seguenti operazioni: +Usiamo un esempio di un contratto [DAO](/dao/) che ha alcune funzioni accessibili pubblicamente per descrivere le proprietà a livello di traccia. Qui, supponiamo che il contratto DAO consenta agli utenti di eseguire le seguenti operazioni: - Depositare fondi -- Votare una proposta dopo aver depositato fondi +- Votare su una proposta dopo aver depositato i fondi -- Richiedere un rimborso se non votano una proposta +- Richiedere un rimborso se non votano su una proposta -Le proprietà a livello di traccia dell'esempio potrebbero essere _"gli utenti che non depositano fondi non possono votare una proposta"_ o _"gli utenti che non votano una proposta dovrebbero sempre poter richiedere un rimborso"_. Entrambe le proprietà affermano delle sequenze preferite d'esecuzione (il voto non può verificarsi _prima_ di depositare i fondi e non si può richiedere un rimborso _dopo_ aver votato una proposta). +Esempi di proprietà a livello di traccia potrebbero essere _"gli utenti che non depositano fondi non possono votare su una proposta"_ o _"gli utenti che non votano su una proposta dovrebbero sempre essere in grado di richiedere un rimborso"_. Entrambe le proprietà asseriscono sequenze di esecuzione preferite (il voto non può avvenire _prima_ del deposito dei fondi e la richiesta di un rimborso non può avvenire _dopo_ aver votato su una proposta). -## Tecniche di verifica formale dei contratti intelligenti {#formal-verification-techniques} +## Tecniche per la verifica formale dei contratti intelligenti {#formal-verification-techniques} -### Controllo del modello {#model-checking} +### Controllo dei modelli (Model checking) {#model-checking} -Il controllo del modello è una tecnica di verifica formale in cui un algoritmo controlla il modello formale di un contratto intelligente rispetto alla sua specifica. Nel controllo del modello i contratti intelligenti sono spesso rappresentati come sistemi di transizione di stato, mentre le proprietà sugli stati permissibili del contratto sono definiti utilizzando la logica temporale. +Il controllo dei modelli è una tecnica di verifica formale in cui un algoritmo controlla un modello formale di un contratto intelligente rispetto alla sua specifica. Nel controllo dei modelli i contratti intelligenti sono spesso rappresentati come sistemi di transizione di stato, mentre le proprietà sugli stati consentiti del contratto sono definite utilizzando la logica temporale. -Il controllo del modello richiede la creazione di una rappresentazione matematica astratta di un sistema (ossia un contratto) e di esprimere le proprietà di tale sistema utilizzando le formule radicate nella [logica proposizionale](https://www.baeldung.com/cs/propositional-logic). Ciò semplifica il compito dell'algoritmo di controllo del modello, vale a dire dimostrare che un modello matematico soddisfi una data formula logica. +Il controllo dei modelli richiede la creazione di una rappresentazione matematica astratta di un sistema (cioè, un contratto) e l'espressione delle proprietà di questo sistema utilizzando formule radicate nella [logica proposizionale](https://www.baeldung.com/cs/propositional-logic). Questo semplifica il compito dell'algoritmo di controllo dei modelli, ovvero dimostrare che un modello matematico soddisfa una data formula logica. -Il controllo del modello nella verifica formale è utilizzato principalmente per valutare le proprietà temporali che descrivono il comportamento di un contratto nel tempo. Le proprietà temporali per i contratti intelligenti includono la _sicurezza_ e la _vitalità_, spiegate in precedenza. +Il controllo dei modelli nella verifica formale è utilizzato principalmente per valutare le proprietà temporali che descrivono il comportamento di un contratto nel tempo. Le proprietà temporali per i contratti intelligenti includono _sicurezza_ e _vitalità_, che abbiamo spiegato in precedenza. -Ad esempio, una proprietà di sicurezza relativa al controllo dell'accesso (es., _Solo il proprietario del contratto può chiamare `selfdestruct`_) può essere scritta in logica formale. In seguito, l'algoritmo di controllo del modello può verificare se il contratto soddisfa tale specifica formale. +Ad esempio, una proprietà di sicurezza relativa al controllo degli accessi (ad es., _Solo il proprietario del contratto può chiamare `selfdestruct`_) può essere scritta in logica formale. Successivamente, l'algoritmo di controllo dei modelli può verificare se il contratto soddisfa questa specifica formale. -Il controllo del modello utilizza l'esplorazione dello spazio di stato, che richiede la costruzione di tutti gli stati possibili di un contratto intelligente e di tentare di trovare gli stati raggiungibili risultanti in violazioni della proprietà. Tuttavia, ciò può comportare un numero infinito di stati (noto come il "problema d'esplosione dello stato"), dunque i revisori del modello si affidano a tecniche di astrazione per rendere possibile l'analisi efficiente dei contratti intelligenti. +Il controllo dei modelli utilizza l'esplorazione dello spazio degli stati, che comporta la costruzione di tutti i possibili stati di un contratto intelligente e il tentativo di trovare stati raggiungibili che si traducono in violazioni delle proprietà. Tuttavia, questo può portare a un numero infinito di stati (noto come "problema dell'esplosione degli stati"), quindi i controllori di modelli si affidano a tecniche di astrazione per rendere possibile un'analisi efficiente dei contratti intelligenti. -### Dimostrazione del teorema {#theorem-proving} +### Dimostrazione di teoremi {#theorem-proving} -La dimostrazione del teorema è un metodo di ragionamento matematico sulla correttezza dei programmi, inclusi i contratti intelligenti. Prevede la trasformazione del modello del sistema di un contratto e delle sue specifiche in formule matematiche (dichiarazioni logiche). +La dimostrazione di teoremi è un metodo per ragionare matematicamente sulla correttezza dei programmi, inclusi i contratti intelligenti. Comporta la trasformazione del modello del sistema di un contratto e delle sue specifiche in formule matematiche (dichiarazioni logiche). -L'obiettivo della dimostrazione del teorema è verificare l'equivalenza logica tra tali dichiarazioni. L'"equivalenza logica" (anche detta "bi-implicazione logica") è un tipo di relazione tra due dichiarazioni tale per cui la prima dichiarazione è vera _se e soltanto se_ la seconda è vera. +L'obiettivo della dimostrazione di teoremi è verificare l'equivalenza logica tra queste dichiarazioni. L'"equivalenza logica" (chiamata anche "bi-implicazione logica") è un tipo di relazione tra due dichiarazioni tale che la prima dichiarazione è vera _se e solo se_ la seconda dichiarazione è vera. -La relazione richiesta (equivalenza logica) tra le dichiarazioni sul modello di un contratto e le sue proprietà è formulata come una dichiarazione dimostrabile (detta teorema). Utilizzando un sistema formale di deduzione, il dimostratore automatizzato del teorema può verificarne la validità. In altre parole, un dimostratore del teorema può provare in modo conclusivo che il modello di un contratto intelligente corrisponde precisamente alle sue specifiche. +La relazione richiesta (equivalenza logica) tra le dichiarazioni sul modello di un contratto e la sua proprietà è formulata come una dichiarazione dimostrabile (chiamata teorema). Utilizzando un sistema formale di inferenza, il dimostratore automatico di teoremi può verificare la validità del teorema. In altre parole, un dimostratore di teoremi può dimostrare in modo conclusivo che il modello di un contratto intelligente corrisponde esattamente alle sue specifiche. -Mentre il controllo del modello modellizza i contratti come sistemi di transizione con stati finiti, la dimostrazione del teorema può gestire l'analisi di sistemi di stato infinito. Tuttavia, ciò significa che un dimostratore automatizzato del teorema non può sempre sapere se un problema logico sia "decidibile" o no. +Mentre il controllo dei modelli modella i contratti come sistemi di transizione con stati finiti, la dimostrazione di teoremi può gestire l'analisi di sistemi a stati infiniti. Tuttavia, questo significa che un dimostratore automatico di teoremi non può sempre sapere se un problema logico è "decidibile" o meno. -Di conseguenza, è spesso richiesta l'assistenza umana per guidare il dimostratore del teorema alla derivazione delle prove di correttezza. L'utilizzo del lavoro umano nella dimostrazione del teorema la rende più costosa da usare del controllo del modello, che è completamente automatizzato. +Di conseguenza, è spesso richiesta l'assistenza umana per guidare il dimostratore di teoremi nel derivare le prove di correttezza. L'uso dello sforzo umano nella dimostrazione di teoremi lo rende più costoso da utilizzare rispetto al controllo dei modelli, che è completamente automatizzato. ### Esecuzione simbolica {#symbolic-execution} -L'esecuzione simbolica è un metodo per analizzare un contratto intelligente eseguendo le funzioni utilizzando dei _valori simbolici_ (es. `x > 5`) invece di _valori concreti_ (es. `x == 5`). Come tecnica formale di verifica, l'esecuzione simbolica è utilizzata per ragionare formalmente sulle proprietà a livello di traccia nel codice di un contratto. +L'esecuzione simbolica è un metodo per analizzare un contratto intelligente eseguendo funzioni utilizzando _valori simbolici_ (ad es., `x > 5`) invece di _valori concreti_ (ad es., `x == 5`). Come tecnica di verifica formale, l'esecuzione simbolica è utilizzata per ragionare formalmente sulle proprietà a livello di traccia nel codice di un contratto. -L'esecuzione simbolica rappresenta una traccia d'esecuzione come una formula matematica sui valori di input simbolici, altrimenti detta _predicato del percorso_. Un [risolutore SMT](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) è utilizzato per verificare se il predicato di un percorso sia "soddisfacibile" (cioè, esiste un valore che possa soddisfare la formula). Se un percorso vulnerabile è soddisfacibile, il risolutore SMT genererà un valore concreto che innesca la sterzata dell'esecuzione verso tale percorso. +L'esecuzione simbolica rappresenta una traccia di esecuzione come una formula matematica sui valori di input simbolici, altrimenti chiamata _predicato di percorso_. Un [risolutore SMT](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) viene utilizzato per verificare se un predicato di percorso è "soddisfacibile" (cioè, esiste un valore che può soddisfare la formula). Se un percorso vulnerabile è soddisfacibile, il risolutore SMT genererà un valore concreto che innesca e indirizza l'esecuzione verso quel percorso. -Ipotizziamo che la funzione di un contratto intelligente prenda come input un valore `uint` (`x`) e si ripristini quando `x` è maggiore di `5` e minore di `10`. Trovare un valore per `x` che inneschi l'errore utilizzando una normale procedura di test richiederebbe l'esecuzione di decine di casi di prova (o più) senza la garanzia di trovare effettivamente un input che causi un errore. +Supponiamo che la funzione di un contratto intelligente prenda come input un valore `uint` (`x`) e si annulli (revert) quando `x` è maggiore di `5` e anche inferiore a `10`. Trovare un valore per `x` che inneschi l'errore utilizzando una normale procedura di test richiederebbe l'esecuzione di dozzine di casi di test (o più) senza la garanzia di trovare effettivamente un input che inneschi l'errore. -Viceversa, uno strumento d'esecuzione simbolica eseguirebbe la funzione con il valore simbolico: `X > 5 ∧ X < 10` (cioè `x` è maggiore di 5 AND `x` è minore di 10). Il predicato del percorso associato `x = X > 5 ∧ X < 10` sarebbe quindi dato a un risolutore SMT per la risoluzione. Se un valore specifico soddisfa la formula `x = X > 5 ∧ X < 10`, il risolutore SMT lo calcolerà, ad esempio producendo `7` come valore per `x`. +Al contrario, uno strumento di esecuzione simbolica eseguirebbe la funzione con il valore simbolico: `X > 5 ∧ X < 10` (cioè, `x` è maggiore di 5 E `x` è minore di 10). Il predicato di percorso associato `x = X > 5 ∧ X < 10` verrebbe quindi fornito a un risolutore SMT per essere risolto. Se un particolare valore soddisfa la formula `x = X > 5 ∧ X < 10`, il risolutore SMT lo calcolerà: ad esempio, il risolutore potrebbe produrre `7` come valore per `x`. -Poiché l'esecuzione simbolica si basa sugli input di un programma e la serie di input per esplorare tutti gli stati raggiungibili è potenzialmente infinito, è comunque una forma di test. Tuttavia, come mostrato nell'esempio, l'esecuzione simbolica è più efficiente dei test regolari per trovare gli input che innescano le violazioni di proprietà. +Poiché l'esecuzione simbolica si basa sugli input a un programma e l'insieme di input per esplorare tutti gli stati raggiungibili è potenzialmente infinito, è ancora una forma di test. Tuttavia, come mostrato nell'esempio, l'esecuzione simbolica è più efficiente dei test regolari per trovare input che innescano violazioni delle proprietà. -Inoltre, l'esecuzione simbolica produce meno falsi positivi di altre tecniche basate sulle proprietà (es. il fuzzing) che generano casualmente gli input di una funzione. Se uno stato di errore viene innescato durante l'esecuzione simbolica, allora è possibile generare un valore concreto che inneschi l'errore e lo riproduca. +Inoltre, l'esecuzione simbolica produce meno falsi positivi rispetto ad altre tecniche basate sulle proprietà (ad es., il fuzzing) che generano casualmente input per una funzione. Se uno stato di errore viene innescato durante l'esecuzione simbolica, allora è possibile generare un valore concreto che innesca l'errore e riprodurre il problema. -L'esecuzione simbolica, inoltre, può fornire un certo grado di prova di correttezza matematica. Considera il seguente esempio di una funzione del contratto con la protezione dal sovrafflusso: +L'esecuzione simbolica può anche fornire un certo grado di prova matematica di correttezza. Considera il seguente esempio di una funzione del contratto con protezione dall'overflow: ``` function safe_add(uint x, uint y) returns(uint z){ @@ -152,132 +152,133 @@ function safe_add(uint x, uint y) returns(uint z){ require(z>=y); return z; +} ``` -Una traccia di esecuzione che risulta in un sovrafflusso di interi dovrebbe soddisfare la formula: `z = x + y AND (z >= x) AND (z=>y) AND (z < x OR z < y)` Una simile formula è improbabile che sia risolta, dunque serve una prova matematica che la funzione `safe_add` non vada mai in sovrafflusso. +Una traccia di esecuzione che si traduce in un overflow di interi dovrebbe soddisfare la formula: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)` È improbabile che una tale formula venga risolta, quindi serve come prova matematica che la funzione `safe_add` non va mai in overflow. ### Perché utilizzare la verifica formale per i contratti intelligenti? {#benefits-of-formal-verification} #### Necessità di affidabilità {#need-for-reliability} -La verifica formale è utilizzata per valutare la correttezza dei sistemi critici per la sicurezza, i cui guasti possono avere conseguenze devastanti, quali morte, lesioni o rovina finanziaria. I contratti intelligenti sono applicazioni dal valore elevato che controllano enormi quantità di valore, e i semplici errori di progettazione possono comportare [perdite irrecuperabili per gli utenti](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/). Verificare formalmente un contratto prima della distribuzione, tuttavia, può aumentare le garanzie che funzionerà come previsto una volta eseguito sulla blockchain. +La verifica formale è utilizzata per valutare la correttezza dei sistemi critici per la sicurezza il cui fallimento può avere conseguenze devastanti, come morte, lesioni o rovina finanziaria. I contratti intelligenti sono applicazioni di alto valore che controllano enormi quantità di valore e semplici errori di progettazione possono portare a [perdite irrecuperabili per gli utenti](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/). Verificare formalmente un contratto prima della distribuzione, tuttavia, può aumentare le garanzie che funzionerà come previsto una volta in esecuzione sulla blockchain. -L'affidabilità è una qualità altamente desiderata in qualsiasi contratto intelligente, specialmente perché il codice distribuito alla Macchina Virtuale di Ethereum (EVM) è tipicamente immutabile. Con gli aggiornamenti successivi al lancio non prontamente accessibili, la necessità di garantire l'affidabilità dei contratti rende necessaria la verifica formale. La verifica formale è capace di rilevare problemi delicati, come sottoeccedenze e sovrafflussi di interi, rientranza e ottimizzazioni scadenti del carburante, che potrebbero sfuggire a revisori e tester. +L'affidabilità è una qualità altamente desiderata in qualsiasi contratto intelligente, specialmente perché il codice distribuito nella [macchina virtuale di Ethereum](/) (EVM) è tipicamente immutabile. Con gli aggiornamenti post-lancio non facilmente accessibili, la necessità di garantire l'affidabilità dei contratti rende necessaria la verifica formale. La verifica formale è in grado di rilevare problemi complessi, come underflow e overflow di interi, rientranza (re-entrancy) e scarse ottimizzazioni del gas, che potrebbero sfuggire a revisori e tester. -#### Provare la correttezza funzionale {#prove-functional-correctness} +#### Dimostrare la correttezza funzionale {#prove-functional-correctness} -I test dei programmi è il metodo più comune di provare che un contratto intelligente soddisfa dei requisiti. Ciò comporta l'esecuzione di un contratto con un campione dei dati che si prevede gestirà e l'analisi del rispettivo comportamento. Se il contratto restituisce i risultati previsti per i dati campione, allora gli sviluppatori hanno la prova obiettiva della sua correttezza. +Il test del programma è il metodo più comune per dimostrare che un contratto intelligente soddisfa alcuni requisiti. Ciò comporta l'esecuzione di un contratto con un campione dei dati che ci si aspetta debba gestire e l'analisi del suo comportamento. Se il contratto restituisce i risultati attesi per i dati di esempio, allora gli sviluppatori hanno una prova oggettiva della sua correttezza. -Tuttavia, questo approccio non può provare l'esecuzione corretta per i valori di input che non fanno parte del campione. Dunque, testare un contratto potrebbe aiutare a rilevare i bug (cioè, se i percorsi del codice non riescono a restituire i risultati desiderati durante l'esecuzione), ma **non può provare in via conclusiva l'assenza di bug**. +Tuttavia, questo approccio non può dimostrare la corretta esecuzione per i valori di input che non fanno parte del campione. Pertanto, testare un contratto può aiutare a rilevare i bug (cioè, se alcuni percorsi del codice non riescono a restituire i risultati desiderati durante l'esecuzione), ma **non può dimostrare in modo conclusivo l'assenza di bug**. -Viceversa, la verifica formale può provare formalmente che un contratto intelligente soddisfa i requisiti per una gamma infinita di esecuzioni _senza_ eseguire affatto il contratto. Ciò richiede la creazione di una specifica formale che descriva precisamente i comportamenti corretti del contratto e lo sviluppo di un modello (matematico) formale del sistema del contratto. Quindi possiamo seguire una procedura di prova formale per verificare la coerenza tra il modello del contratto e la sua specifica. +Al contrario, la verifica formale può dimostrare formalmente che un contratto intelligente soddisfa i requisiti per una gamma infinita di esecuzioni _senza_ eseguire affatto il contratto. Ciò richiede la creazione di una specifica formale che descriva con precisione i comportamenti corretti del contratto e lo sviluppo di un modello formale (matematico) del sistema del contratto. Quindi possiamo seguire una procedura di prova formale per verificare la coerenza tra il modello del contratto e la sua specifica. -Con la verifica formale, la questione di verificare se la logica aziendale di un contratto soddisfi i requisiti è una proposizione matematica che può essere dimostrata o confutata. Dimostrando formalmente una proposizione, possiamo verificare un numero infinito di casi di prova con un numero finito di passaggi. Così, la verifica formale ha delle prospettive migliori di dimostrare che un contratto sia funzionalmente corretto rispetto a una specifica. +Con la verifica formale, la questione di verificare se la logica di business di un contratto soddisfa i requisiti è una proposizione matematica che può essere dimostrata o confutata. Dimostrando formalmente una proposizione, possiamo verificare un numero infinito di casi di test con un numero finito di passaggi. In questo modo la verifica formale ha migliori prospettive di dimostrare che un contratto è funzionalmente corretto rispetto a una specifica. #### Obiettivi di verifica ideali {#ideal-verification-targets} -Un obiettivo di verifica descrive il sistema da verificare formalmente. La verifica formale è meglio utilizzata nei "sistemi incorporati" (piccoli pezzi di software semplici che fanno parte di un sistema più grande). Inoltre, sono ideali per i domini specializzati aventi poche regole, poiché ciò semplifica la modifica degli strumenti per verificare le proprietà specifiche del dominio. +Un obiettivo di verifica descrive il sistema da verificare formalmente. La verifica formale è utilizzata al meglio nei "sistemi integrati" (piccoli e semplici pezzi di software che fanno parte di un sistema più ampio). Sono ideali anche per domini specializzati che hanno poche regole, poiché ciò rende più facile modificare gli strumenti per verificare le proprietà specifiche del dominio. -I contratti intelligenti, almeno in una certa misura, soddisfano entrambi i requisiti. Ad esempio, le piccole dimensioni dei contratti di Ethereum li rendono suscettibili alla verifica formale. Analogamente, l'EVM segue delle regole semplici, che rendono più facile specificare e verificare le proprietà semantiche per i programmi in esecuzione nell'EVM. +I contratti intelligenti, almeno in una certa misura, soddisfano entrambi i requisiti. Ad esempio, le piccole dimensioni dei contratti di Ethereum li rendono adatti alla verifica formale. Allo stesso modo, l'EVM segue regole semplici, il che rende più facile specificare e verificare le proprietà semantiche per i programmi in esecuzione nell'EVM. -### Ciclo di sviluppo più veloce {#faster-development-cycle} +### Ciclo di sviluppo più rapido {#faster-development-cycle} -Le tecniche di verifica formale, come il controllo dei modelli e l'esecuzione simbolica, sono generalmente più efficienti dell'analisi regolare del codice del contratto intelligente (eseguita durante i test o i controlli). Questo perché la verifica formale si basa su valori simbolici per testare le asserzioni ("che succede se un utente prova a prelevare _n_ ether?") a differenza dei test che utilizzano valori concreti ("che succede se un utente prova a prelevare 5 ether?"). +Le tecniche di verifica formale, come il controllo dei modelli e l'esecuzione simbolica, sono generalmente più efficienti della normale analisi del codice del contratto intelligente (eseguita durante i test o l'auditing). Questo perché la verifica formale si basa su valori simbolici per testare le asserzioni ("cosa succede se un utente cerca di prelevare _n_ ether?") a differenza dei test che utilizzano valori concreti ("cosa succede se un utente cerca di prelevare 5 ether?"). -Le variabili di input simboliche possono coprire svariate classi di valori concreti, quindi gli approcci di verifica formale promettono maggiore copertura del codice in un periodo di tempo più breve. Se usata efficacemente, la verifica formale può accelerare il ciclo di sviluppo per gli sviluppatori. +Le variabili di input simboliche possono coprire più classi di valori concreti, quindi gli approcci di verifica formale promettono una maggiore copertura del codice in un lasso di tempo più breve. Se utilizzata in modo efficace, la verifica formale può accelerare il ciclo di sviluppo per gli sviluppatori. -La verifica formale, inoltre, migliora il processo di costruzione di applicazioni decentralizzate (dapp) riducendo costosi errori di progettazione. Aggiornare i contratti (ove possibile) per risolvere le vulnerabilità richiede una vasta riscrittura delle basi di codice e maggiori sforzi di sviluppo. La verifica formale può rilevare molti errori nelle implementazioni del contratto che potrebbero sfuggire a tester e revisori e fornire ampia opportunità di correggere tali errori prima della distribuzione di un contratto. +La verifica formale migliora anche il processo di costruzione di applicazioni decentralizzate (dApp) riducendo costosi errori di progettazione. L'aggiornamento dei contratti (ove possibile) per correggere le vulnerabilità richiede un'ampia riscrittura delle basi di codice e un maggiore sforzo speso nello sviluppo. La verifica formale può rilevare molti errori nelle implementazioni dei contratti che potrebbero sfuggire a tester e revisori e offre ampie opportunità per correggere tali problemi prima di distribuire un contratto. ## Svantaggi della verifica formale {#drawbacks-of-formal-verification} -### Costo della manodopera {#cost-of-manual-labor} +### Costo del lavoro manuale {#cost-of-manual-labor} -La verifica formale, specialmente la verifica semi-automatica in cui un umano guida il dimostratore a ricavare le prove di correttezza, richiede considerevole manodopera. Inoltre, la creazione della specifica formale è un'attività complessa che richiede un livello elevato di competenze. +La verifica formale, specialmente la verifica semi-automatizzata in cui un essere umano guida il dimostratore per derivare le prove di correttezza, richiede un notevole lavoro manuale. Inoltre, la creazione di specifiche formali è un'attività complessa che richiede un alto livello di competenza. -Questi fattori (sforzo e competenze) rendono la verifica formale più impegnativa e costosa rispetto ai soliti metodi di valutazione della correttezza nei contratti, come test e controlli. Tuttavia, sostenere il costo di un controllo di verifica completo è pratico, dato il costo degli errori nelle implementazioni del contratto intelligente. +Questi fattori (sforzo e competenza) rendono la verifica formale più impegnativa e costosa rispetto ai metodi usuali di valutazione della correttezza nei contratti, come test e audit. Tuttavia, pagare il costo per un audit di verifica completo è pratico, dato il costo degli errori nelle implementazioni dei contratti intelligenti. ### Falsi negativi {#false-negatives} -La verifica formale può soltanto verificare se l'esecuzione del contratto intelligente corrisponde alla specifica formale. Come tale, è importante assicurarsi che la specifica descriva adeguatamente i comportamenti previsti di un contratto intelligente. +La verifica formale può solo controllare se l'esecuzione del contratto intelligente corrisponde alla specifica formale. Pertanto, è importante assicurarsi che la specifica descriva correttamente i comportamenti attesi di un contratto intelligente. -Se le specifiche sono scritte male, le violazioni delle proprietà – che puntano alle esecuzioni vulnerabili – non sono rilevabili dal controllo di verifica formale. In questo caso il programmatore potrebbe pensare erroneamente che il contratto sia senza bug. +Se le specifiche sono scritte male, le violazioni delle proprietà, che indicano esecuzioni vulnerabili, non possono essere rilevate dall'audit di verifica formale. In questo caso, uno sviluppatore potrebbe erroneamente presumere che il contratto sia privo di bug. -### Problemi di prestazione {#performance-issues} +### Problemi di prestazioni {#performance-issues} -La verifica formale comporta una serie di problemi di prestazione. Per esempio, i problemi d'esplosione di stato e di percorso incontrati durante il controllo del modello e il controllo simbolico, rispettivamente, possono influenzare le procedure di verifica. Inoltre, gli strumenti di verifica formale utilizzano spesso risolutori SMT e altri risolutori di vincolo nel proprio livello sottostante, e questi si basano su procedure ad alta intensità di calcoli. +La verifica formale va incontro a una serie di problemi di prestazioni. Ad esempio, i problemi di esplosione degli stati e dei percorsi riscontrati rispettivamente durante il controllo dei modelli e il controllo simbolico possono influenzare le procedure di verifica. Inoltre, gli strumenti di verifica formale utilizzano spesso risolutori SMT e altri risolutori di vincoli nel loro livello sottostante, e questi risolutori si basano su procedure ad alta intensità di calcolo. -Inoltre, non sempre per i verificatori di programmi è possibile determinare se una proprietà (descritta come una formula logica) sia soddisfacibile o no (il "[problema di decidibilità](https://en.wikipedia.org/wiki/Decision_problem)"), poiché un programma potrebbe non terminare mai. Come tale, potrebbe essere impossibile dimostrare alcune proprietà per un contratto, anche se ben specificate. +Inoltre, non è sempre possibile per i verificatori di programmi determinare se una proprietà (descritta come una formula logica) può essere soddisfatta o meno (il "[problema della decidibilità](https://en.wikipedia.org/wiki/Decision_problem)") perché un programma potrebbe non terminare mai. Pertanto, potrebbe essere impossibile dimostrare alcune proprietà per un contratto anche se è ben specificato. ## Strumenti di verifica formale per i contratti intelligenti di Ethereum {#formal-verification-tools} ### Linguaggi di specifica per la creazione di specifiche formali {#specification-languages} -**Act**: _*Act consente la specifica di aggiornamenti d'archiviazione, pre e post condizioni e invarianti del contratto. La sua suite di strumenti contiene inoltre backend di prova in grado di dimostrare molte proprietà tramite Coq, risolutori SMT o hevm.** +**Act**: _*Act consente la specifica degli aggiornamenti di archiviazione, delle pre/post condizioni e delle invarianti del contratto. La sua suite di strumenti ha anche backend di prova in grado di dimostrare molte proprietà tramite Coq, risolutori SMT o hevm.*_ - [GitHub](https://github.com/ethereum/act) -- [Documentazione](https://ethereum.github.io/act/) +- [Documentazione](https://github.com/argotorg/act) -**Scribble** - _*Scribble trasforma le annotazioni di codice nel linguaggio di specifica di Scribble in asserzioni concrete che verificano la specifica.** +**Scribble** - _*Scribble trasforma le annotazioni del codice nel linguaggio di specifica Scribble in asserzioni concrete che controllano la specifica.*_ - [Documentazione](https://docs.scribble.codes/) -**Dafny** - _*Dafny è un linguaggio di programmazione pronto alla verifica che si basa su annotazioni di alto livello per ragionare sulla correttezza del codice e dimostrarla.** +**Dafny** - _*Dafny è un linguaggio di programmazione pronto per la verifica che si basa su annotazioni di alto livello per ragionare e dimostrare la correttezza del codice.*_ - [GitHub](https://github.com/dafny-lang/dafny) -### Verificatori di programmi per verificare la correttezza {#program-verifiers} +### Verificatori di programmi per il controllo della correttezza {#program-verifiers} -**Certora Prover** - _Certora Prover è uno strumento automatico di verifica formale per verificare la correttezza del codice nei contratti intelligenti. Le specifiche sono scritte in CVL (Certora Verification Language), con le violazioni di proprietà rilevate utilizzando una combinazione di analisi statica e risoluzione del vincolo._ +**Certora Prover** - _Certora Prover è uno strumento di verifica formale automatica per controllare la correttezza del codice nei contratti intelligenti. Le specifiche sono scritte in CVL (Certora Verification Language), con le violazioni delle proprietà rilevate utilizzando una combinazione di analisi statica e risoluzione dei vincoli._ - [Sito web](https://www.certora.com/) - [Documentazione](https://docs.certora.com/en/latest/index.html) -**SMTChecker di Solidity** - _*SMTChecker di Solidity è un revisore del modello integrato basato sulle SMT (Satisfiability Modulo Theories) e la risoluzione di Horn. Conferma se il codice sorgente di un contratto corrisponde alle specifiche durante la compilazione e controlla staticamente le violazioni delle proprietà di sicurezza.** +**Solidity SMTChecker** - _*L'SMTChecker di Solidity è un controllore di modelli integrato basato su SMT (Satisfiability Modulo Theories) e sulla risoluzione di Horn. Conferma se il codice sorgente di un contratto corrisponde alle specifiche durante la compilazione e controlla staticamente le violazioni delle proprietà di sicurezza.*_ - [GitHub](https://github.com/ethereum/solidity) -**solc-verify** - _*solc-verify è una versione estesa del compilatore di Solidity che può eseguire la verifica formale automatizzata sul codice di Solidity utilizzando le annotazioni e la verifica modulare del programma.** +**solc-verify** - _*solc-verify è una versione estesa del compilatore Solidity che può eseguire la verifica formale automatizzata sul codice Solidity utilizzando annotazioni e la verifica modulare del programma.*_ - [GitHub](https://github.com/SRI-CSL/solidity) -**KEVM** - _*KEVM è una semantica formale della Macchina Virtuale di Ethereum (EVM), scritta nel quadro K. KEVM è eseguibile e può dimostrare determinate asserzioni correlate alle proprietà utilizzando la logica di raggiungibilità.** +**KEVM** - _*KEVM è una semantica formale della macchina virtuale di Ethereum (EVM) scritta nel framework K. KEVM è eseguibile e può dimostrare determinate asserzioni relative alle proprietà utilizzando la logica di raggiungibilità.*_ - [GitHub](https://github.com/runtimeverification/evm-semantics) - [Documentazione](https://jellopaper.org/) -### Quadri logici per la dimostrazione del teorema {#theorem-provers} +### Framework logici per la dimostrazione di teoremi {#theorem-provers} -**Isabelle** - _Isabelle/HOL è un assistente di dimostrazione che consente di esprimere formule matematiche in un linguaggio formale e fornisce strumenti per dimostrarle. L'applicazione principale è la formalizzazione delle dimostrazioni matematiche e in particolare la verifica formale, che include la dimostrazione della correttezza di hardware e software e la dimostrazione delle proprietà dei linguaggi e dei protocolli informatici._ +**Isabelle** - _Isabelle/HOL è un assistente di prova che consente di esprimere formule matematiche in un linguaggio formale e fornisce strumenti per dimostrare tali formule. L'applicazione principale è la formalizzazione di prove matematiche e in particolare la verifica formale, che include la dimostrazione della correttezza dell'hardware o del software del computer e la dimostrazione delle proprietà dei linguaggi e dei protocolli informatici._ - [GitHub](https://github.com/isabelle-prover) - [Documentazione](https://isabelle.in.tum.de/documentation.html) -**Coq** - _Coq è un dimostratore interattivo del teorema che ti consente di definire i programmi che utilizzano i teoremi e generare interattivamente prove di correttezza verificate dalla macchina._ +**Rocq** - _Rocq è un dimostratore di teoremi interattivo che ti consente di definire programmi utilizzando teoremi e generare in modo interattivo prove di correttezza controllate dalla macchina._ -- [GitHub](https://github.com/coq/coq) -- [Documentazione](https://coq.github.io/doc/v8.13/refman/index.html) +- [GitHub](https://github.com/rocq-prover/rocq) +- [Documentazione](https://rocq-prover.org/docs) ### Strumenti basati sull'esecuzione simbolica per rilevare modelli vulnerabili nei contratti intelligenti {#symbolic-execution-tools} -**Manticore** - _*Uno strumento per analizzare il bytecode dell'EVM basato sull'esecuzione simbolica*.* +**Manticore** - _*Uno strumento per l'analisi del bytecode EVM basato sull'esecuzione simbolica*._ - [GitHub](https://github.com/trailofbits/manticore) - [Documentazione](https://github.com/trailofbits/manticore/wiki) -**hevm** - _*hevm è un motore di esecuzione simbolica e verificatore di equivalenza per il bytecode dell'EVM.** +**hevm** - _*hevm è un motore di esecuzione simbolica e un controllore di equivalenza per il bytecode EVM.*_ - [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) -**Mythril** - _Uno strumento di esecuzione simbolica per rilevare le vulnerabilità nei contratti intelligenti di Ethereum_ +**Mythril** - _Uno strumento di esecuzione simbolica per rilevare vulnerabilità nei contratti intelligenti di Ethereum_ - [GitHub](https://github.com/ConsenSys/mythril-classic) - [Documentazione](https://mythril-classic.readthedocs.io/en/develop/) -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} - [Come funziona la verifica formale dei contratti intelligenti](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/) -- [Come la verifica formale può assicurare contratti intelligenti impeccabili](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) +- [Come la verifica formale può garantire contratti intelligenti impeccabili](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) - [Una panoramica dei progetti di verifica formale nell'ecosistema di Ethereum](https://github.com/leonardoalt/ethereum_formal_verification_overview) - [Verifica formale end-to-end del contratto intelligente di deposito di Ethereum 2.0](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) -- [Verificare formalmente il contratto intelligente più popolare al mondo](https://www.zellic.io/blog/formal-verification-weth) -- [SMTChecker e verifica formale](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) +- [Verifica formale del contratto intelligente più popolare al mondo](https://www.zellic.io/blog/formal-verification-weth) +- [SMTChecker e verifica formale](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/index.md b/public/content/translations/it/developers/docs/smart-contracts/index.md index c235b47d123..beb67541d0a 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/index.md @@ -1,34 +1,34 @@ --- title: Introduzione ai contratti intelligenti -description: Una panoramica sui contratti intelligenti, incentrata sulle loro caratteristiche e limitazioni uniche. +description: Una panoramica sui contratti intelligenti, concentrandosi sulle loro caratteristiche uniche e limitazioni. lang: it --- ## Cos'è un contratto intelligente? {#what-is-a-smart-contract} -Un "contratto intelligente" è semplicemente un programma eseguito sulla blockchain di Ethereum. È una raccolta di codice (le funzioni) e dati (lo stato) che risiede a un indirizzo specifico sulla blockchain di Ethereum. +Un "contratto intelligente" è semplicemente un programma che viene eseguito sulla blockchain di [Ethereum](/). È una raccolta di codice (le sue funzioni) e dati (il suo stato) che risiede a un indirizzo specifico sulla blockchain di Ethereum. -I contratti intelligenti sono un tipo di [conto di Ethereum](/developers/docs/accounts/). Ciò significa che hanno un saldo e possono essere oggetto di transazioni. Però non sono controllati da un utente, ma distribuiti in rete ed eseguiti come programmato. I conti degli utenti possono quindi interagire con un contratto intelligente, inviando transazioni che eseguono una funzione definita sul contratto intelligente. I contratti intelligenti possono definire delle regole, come un contratto normale, e imporle automaticamente tramite il codice. I contratti intelligenti non possono esser eliminati di default e le interazioni con essi sono irreversibili. +I contratti intelligenti sono un tipo di [account di Ethereum](/developers/docs/accounts/). Ciò significa che hanno un saldo e possono essere l'obiettivo di transazioni. Tuttavia, non sono controllati da un utente, ma vengono distribuiti sulla rete ed eseguiti come programmati. Gli account utente possono quindi interagire con un contratto intelligente inviando transazioni che eseguono una funzione definita sul contratto intelligente. I contratti intelligenti possono definire regole, come un contratto normale, e applicarle automaticamente tramite il codice. I contratti intelligenti non possono essere eliminati per impostazione predefinita e le interazioni con essi sono irreversibili. ## Prerequisiti {#prerequisites} -Se stai solo muovendo i primi passi o stai cercando un'introduzione meno tecnica, consigliamo la nostra [introduzione ai contratti intelligenti](/smart-contracts/). +Se hai appena iniziato o cerchi un'introduzione meno tecnica, ti consigliamo la nostra [introduzione ai contratti intelligenti](/smart-contracts/). -Assicurati di aver letto a riguardo di [conti](/developers/docs/accounts/), [transazioni](/developers/docs/transactions/) e della [Macchina Virtuale di Ethereum](/developers/docs/evm/), prima di saltare nel mondo dei contratti intelligenti. +Assicurati di aver letto le informazioni su [account](/developers/docs/accounts/), [transazioni](/developers/docs/transactions/) e sulla [macchina virtuale di Ethereum](/developers/docs/evm/) prima di tuffarti nel mondo dei contratti intelligenti. ## Un distributore automatico digitale {#a-digital-vending-machine} -Forse la migliore metafora per un contratto intelligente è un distributore automatico, come descritto da [Nick Szabo](https://unenumerated.blogspot.com/). Con i giusti input si ottiene un determinato output. +Forse la migliore metafora per un contratto intelligente è un distributore automatico, come descritto da [Nick Szabo](https://unenumerated.blogspot.com/). Con gli input giusti, è garantito un certo output. -Per ottenere uno snack da un distributore: +Per ottenere uno spuntino da un distributore automatico: ``` -denaro + scelta dello snack = snack erogato +money + snack selection = snack dispensed ``` Questa logica è programmata nel distributore automatico. -Un contratto intelligente, come un distributore automatico, contiene della logica programmata. Ecco un semplice esempio di come apparirebbe questo distributore automatico se fosse un contratto intelligente scritto in Solidity: +Un contratto intelligente, come un distributore automatico, ha una logica programmata al suo interno. Ecco un semplice esempio di come apparirebbe questo distributore automatico se fosse un contratto intelligente scritto in Solidity: ```solidity pragma solidity 0.8.7; @@ -39,66 +39,66 @@ contract VendingMachine { address public owner; mapping (address => uint) public cupcakeBalances; - // Quando il contratto 'VendingMachine' è distribuito: + // Quando il contratto 'VendingMachine' viene distribuito: // 1. imposta l'indirizzo di distribuzione come proprietario del contratto - // 2. imposta il saldo di cupcake del contratto intelligente distribuito a 100 + // 2. imposta il saldo dei cupcake dello smart contract distribuito a 100 constructor() { owner = msg.sender; cupcakeBalances[address(this)] = 100; } - // Consenti al proprietario di aumentare il saldo di cupcake del contratto intelligente + // Consenti al proprietario di aumentare il saldo dei cupcake dello smart contract function refill(uint amount) public { - require(msg.sender == owner, "Solo il proprietario può rifornire."); + require(msg.sender == owner, "Only the owner can refill."); cupcakeBalances[address(this)] += amount; } - // Consenti a chiunque di comprare cupcake + // Consenti a chiunque di acquistare cupcake function purchase(uint amount) public payable { - require(msg.value >= amount * 1 ether, "Devi pagare almeno 1 ETH per cupcake"); - require(cupcakeBalances[address(this)] >= amount, "Non ci sono abbastanza cupcake in magazzino per completare questo acquisto"); + require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake"); + require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase"); cupcakeBalances[address(this)] -= amount; cupcakeBalances[msg.sender] += amount; } } ``` -Proprio come un distributore automatico rimuove la necessità di un addetto alla vendita, i contratti intelligenti possono sostituire gli intermediari in molte industrie. +Così come un distributore automatico elimina la necessità di un dipendente addetto alla vendita, i contratti intelligenti possono sostituire gli intermediari in molti settori. -## Senza autorizzazioni {#permissionless} +## Senza permessi {#permissionless} -Chiunque può scrivere un contratto intelligente e distribuirlo sulla rete. Devi solo imparare come programmare nel [linguaggio di un contratto intelligente](/developers/docs/smart-contracts/languages/) e avere ETH sufficienti per distribuire il tuo contratto. Implementare un contratto intelligente è tecnicamente una transazione, per cui è necessario pagare del [gas](/developers/docs/gas/) allo stesso modo con cui è pagato per una semplice transazione di ETH. Tuttavia, i costi del gas per la distribuzione del contratto sono molto più elevati. +Chiunque può scrivere un contratto intelligente e distribuirlo sulla rete. Devi solo imparare a programmare in un [linguaggio per contratti intelligenti](/developers/docs/smart-contracts/languages/) e avere abbastanza ETH per distribuire il tuo contratto. La distribuzione di un contratto intelligente è tecnicamente una transazione, quindi devi pagare il [gas](/developers/docs/gas/) nello stesso modo in cui devi pagare il gas per un semplice trasferimento di ETH. Tuttavia, i costi del gas per la distribuzione del contratto sono molto più alti. -Ethereum prevede dei linguaggi pratici per gli sviluppatori per scrivere i contratti intelligenti: +Ethereum ha linguaggi adatti agli sviluppatori per scrivere contratti intelligenti: - Solidity - Vyper -[Ulteriori informazioni sui linguaggi](/developers/docs/smart-contracts/languages/) +[Maggiori informazioni sui linguaggi](/developers/docs/smart-contracts/languages/) -I contratti devono però essere compilati prima di poter essere distribuiti, affinché la macchina virtuale Ethereum possa interpretarli e memorizzarli. [Di più sulla compilazione](/developers/docs/smart-contracts/compiling/) +Tuttavia, devono essere compilati prima di poter essere distribuiti, in modo che la macchina virtuale di Ethereum possa interpretare e memorizzare il contratto. [Maggiori informazioni sulla compilazione](/developers/docs/smart-contracts/compiling/) ## Componibilità {#composability} -Gli smart contract sono pubblici su Ethereum e possono essere paragonati ad API aperte. Questo significa che puoi chiamare altri contratti intelligenti nel tuo contratto, così da estendere ampiamente ciò che è possibile. I contratti possono anche distribuire altri contratti. +I contratti intelligenti sono pubblici su Ethereum e possono essere pensati come API aperte. Ciò significa che puoi chiamare altri contratti intelligenti nel tuo contratto intelligente per estendere notevolmente ciò che è possibile fare. I contratti possono persino distribuire altri contratti. Scopri di più sulla [componibilità dei contratti intelligenti](/developers/docs/smart-contracts/composability/). ## Limitazioni {#limitations} -I contratti intelligenti da soli non possono ottenere informazioni riguardo agli eventi nel "mondo reale" perché non possono recuperare dati da risorse esterne alla catena. Questo significa che non possono rispondere a eventi nel mondo reale. Sono stati progettati così. Basarsi su informazioni esterne potrebbe pregiudicare il consenso, importante per la sicurezza e la decentralizzazione. +I contratti intelligenti da soli non possono ottenere informazioni sugli eventi del "mondo reale" perché non possono recuperare dati da fonti fuori catena. Ciò significa che non possono rispondere agli eventi nel mondo reale. Questo è intenzionale. Affidarsi a informazioni esterne potrebbe compromettere il consenso, che è importante per la sicurezza e la decentralizzazione. -A ogni modo, è importante per le applicazioni blockchain essere in grado di usare dati off-chain. La soluzione sono gli [oracoli](/developers/docs/oracles/) che sono strumenti che ingeriscono dati off-chain e li rendono disponibili per i contratti intelligenti. +Tuttavia, è importante che le applicazioni blockchain siano in grado di utilizzare dati fuori catena. La soluzione sono gli [oracoli](/developers/docs/oracles/), che sono strumenti che acquisiscono dati fuori catena e li rendono disponibili ai contratti intelligenti. -Un'altra limitazione dei contratti intelligenti è la dimensione massima del contratto. Un contratto intelligente può avere una dimensione massima di 24 Kb; altrimenti, esaurirà il gas. Questo problema può essere aggirato usando [il Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535) (schema a diamante). +Un'altra limitazione dei contratti intelligenti è la dimensione massima del contratto. Un contratto intelligente può avere una dimensione massima di 24KB, altrimenti esaurirà il gas. Questo problema può essere aggirato utilizzando [Il Pattern Diamond](https://eips.ethereum.org/EIPS/eip-2535). ## Contratti multifirma {#multisig} -I contratti multifirma (a firma multipla), sono conti del contratto intelligente che richiedono più firme valide per eseguire una transazione. Ciò è molto utile per evitare singoli punti di fallimento per i contratti che detengono importi sostanziali di ether o altri token. I multifirma dividono inoltre la responsabilità per l'esecuzione del contratto e la gestione delle chiavi tra diverse parti e impediscono la perdita di una singola chiave privata, che si tradurrebbe in una perdita di fondi irreversibile. Per questi motivi, i contratti multifirma sono utilizzabili per una semplice governance DAO. Per poter esser eseguiti i multifirma richiedono N di M firme accettabili possibili (dove N ≤ M e M > 1). `N = 3, M = 5` e `N = 4, M = 7` sono comunemente usati. Un multifirma 4/7 richiede quattro di sette possibili firme valide. Questo significa che i fondi possono comunque essere recuperati, anche se vengono perse tre firme. In questo caso, significa anche che la maggioranza dei possessori della chiave deve acconsentire e firmare affinché il contratto venga eseguito. +I contratti multifirma (firme multiple) sono account di contratti intelligenti che richiedono più firme valide per eseguire una transazione. Questo è molto utile per evitare singoli punti di vulnerabilità per i contratti che detengono quantità sostanziali di ether o altri token. I multifirma dividono anche la responsabilità per l'esecuzione del contratto e la gestione delle chiavi tra più parti e impediscono che la perdita di una singola chiave privata porti alla perdita irreversibile di fondi. Per questi motivi, i contratti multifirma possono essere utilizzati per la semplice governance delle DAO. I multifirma richiedono N firme su M possibili firme accettabili (dove N ≤ M e M > 1) per essere eseguiti. `N = 3, M = 5` e `N = 4, M = 7` sono comunemente usati. Un multifirma 4/7 richiede quattro firme valide su sette possibili. Ciò significa che i fondi sono ancora recuperabili anche se si perdono tre firme. In questo caso, significa anche che la maggioranza dei detentori delle chiavi deve essere d'accordo e firmare affinché il contratto venga eseguito. -## Risorse dei contratti intelligenti {#smart-contract-resources} +## Risorse sui contratti intelligenti {#smart-contract-resources} -**OpenZeppelin Contracts -** **_Libreria per lo sviluppo sicuro di contratti intelligenti._** +**Contratti OpenZeppelin -** **_Libreria per lo sviluppo sicuro di contratti intelligenti._** - [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) @@ -109,4 +109,8 @@ I contratti multifirma (a firma multipla), sono conti del contratto intelligente - [Coinbase: Cos'è un contratto intelligente?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) - [Chainlink: Cos'è un contratto intelligente?](https://chain.link/education/smart-contracts) - [Video: Spiegato in modo semplice - Contratti intelligenti](https://youtu.be/ZE2HxTmxfrI) -- [Cyfrin Updraft: Piattaforma di apprendimento e controllo Web3](https://updraft.cyfrin.io) +- [Cyfrin Updraft: Piattaforma di apprendimento e auditing Web3](https://updraft.cyfrin.io) + +## Tutorial: Firme dei contratti intelligenti (EIP-1271) su Ethereum {#tutorials} + +- [EIP-1271: Firmare e verificare le firme dei contratti intelligenti](/developers/tutorials/eip-1271-smart-contract-signatures/) _– Come l'EIP-1271 consente ai contratti intelligenti di verificare le firme, con una guida all'implementazione di Safe._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/languages/index.md b/public/content/translations/it/developers/docs/smart-contracts/languages/index.md index c969cedfd06..db27b50858e 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/languages/index.md @@ -1,45 +1,45 @@ --- -title: Linguaggi dei contratti intelligenti -description: 'Panoramica e confronto dei due linguaggi principali dei contratti intelligenti: Solidity e Viper.' +title: Linguaggi per i contratti intelligenti +description: "Una panoramica e un confronto dei due principali linguaggi per i contratti intelligenti: Solidity e Vyper." lang: it --- -Uno degli aspetti positivi di Ethereum è che i contratti intelligenti sono programmabili usando linguaggi relativamente comodi per gli sviluppatori. Se hai esperienza con Python o altri [linguaggi a parentesi graffa](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages), troverai un linguaggio con una sintassi familiare. +Un grande aspetto di [Ethereum](/) è che i contratti intelligenti possono essere programmati utilizzando linguaggi relativamente facili per gli sviluppatori. Se hai esperienza con Python o con qualsiasi [linguaggio a parentesi graffe](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages), puoi trovare un linguaggio con una sintassi familiare. -I due linguaggi più attivi e gestiti sono: +I due linguaggi più attivi e mantenuti sono: - Solidity - Vyper -Remix IDE fornisce un ambiente di sviluppo completo per creare e testare i contratti sia in Solidity che in Vyper. [Prova Remix IDE integrato nel browser](https://remix.ethereum.org) per iniziare a programmare. +Remix IDE fornisce un ambiente di sviluppo completo per creare e testare contratti sia in Solidity che in Vyper. [Prova l'IDE Remix nel browser](https://remix.ethereum.org) per iniziare a programmare. -Gli sviluppatori più esperti potrebbero prendere in considerazione anche Yul, un linguaggio intermedio per la [macchina virtuale Ethereum](/developers/docs/evm/), oppure Yul +, un'estensione di Yul. +Gli sviluppatori più esperti potrebbero anche voler utilizzare Yul, un linguaggio intermedio per la [macchina virtuale di Ethereum](/developers/docs/evm/), o Yul+, un'estensione di Yul. -Se sei curioso e vorresti aiutare a testare nuovi linguaggi ancora in via di sviluppo, puoi sperimentare con Fe, un linguaggio emergente nel campo dei contratti intelligenti, correntemente ai suoi inizi. +Se sei curioso e ti piace aiutare a testare nuovi linguaggi che sono ancora in forte sviluppo, puoi sperimentare con Fe, un linguaggio emergente per i contratti intelligenti che è attualmente ancora agli inizi. ## Prerequisiti {#prerequisites} -Una conoscenza pregressa dei linguaggi di programmazione, specialmente JavaScript o Python, può aiutarti a comprendere le differenze tra i linguaggi dei contratti intelligenti. Ti consigliamo inoltre di approfondire i contratti intelligenti, prima di approfondire i confronti dei vari linguaggi. [Introduzione ai contratti intelligenti](/developers/docs/smart-contracts/). +Una conoscenza pregressa dei linguaggi di programmazione, specialmente di JavaScript o Python, può aiutarti a comprendere le differenze nei linguaggi per i contratti intelligenti. Ti consigliamo inoltre di comprendere i contratti intelligenti come concetto prima di addentrarti troppo nei confronti tra i linguaggi. [Introduzione ai contratti intelligenti](/developers/docs/smart-contracts/). ## Solidity {#solidity} -- Linguaggio d'alto livello orientato agli oggetti per l'implementazione dei contratti intelligenti. -- Linguaggio a parentesi graffa profondamente influenzato da C++. -- Statico (il tipo di una variabile è noto al momento della compilazione). +- Linguaggio di alto livello orientato agli oggetti per l'implementazione di contratti intelligenti. +- Linguaggio a parentesi graffe che è stato profondamente influenzato dal C++. +- Tipizzato staticamente (il tipo di una variabile è noto al momento della compilazione). - Supporta: - Ereditarietà (puoi estendere altri contratti). - - Librerie (puoi creare del codice riutilizzabile che puoi chiamare da contratti diversi, come le funzioni statiche in una classe statica in altri linguaggi di programmazione orientati agli oggetti). - - Tipi complessi, definiti dall'utente. + - Librerie (puoi creare codice riutilizzabile che puoi chiamare da contratti diversi, come le funzioni statiche in una classe statica in altri linguaggi di programmazione orientati agli oggetti). + - Tipi complessi definiti dall'utente. ### Link importanti {#important-links} - [Documentazione](https://docs.soliditylang.org/en/latest/) -- [Portale del Linguaggio di Solidity](https://soliditylang.org/) -- [Solidity per Esempio](https://docs.soliditylang.org/en/latest/solidity-by-example.html) +- [Portale del linguaggio Solidity](https://soliditylang.org/) +- [Solidity by Example](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Matrix Chatroom](https://gitter.im/ethereum/solidity) collegato alla [Chatroom di Solidity Matrix](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Chatroom Gitter di Solidity](https://gitter.im/ethereum/solidity) collegata alla [Chatroom Matrix di Solidity](https://matrix.to/#/#ethereum_solidity:gitter.im) - [Cheat Sheet](https://reference.auditless.com/cheatsheet) -- [Solidity Blog](https://blog.soliditylang.org/) +- [Blog di Solidity](https://blog.soliditylang.org/) - [Twitter di Solidity](https://twitter.com/solidity_lang) ### Esempio di contratto {#example-contract} @@ -54,8 +54,8 @@ contract Coin { address public minter; mapping (address => uint) public balances; - // Gli eventi consentono ai client di reagire a specifiche - // modifiche ai contratti che vengono dichiarate + // Gli eventi permettono ai client di reagire a specifiche + // modifiche del contratto che dichiari event Sent(address from, address to, uint amount); // Il codice del costruttore viene eseguito solo quando il contratto @@ -83,46 +83,46 @@ contract Coin { } ``` -Questo esempio dà un'idea della sintassi di un contratto in Solidity. Per una descrizione più dettagliata di funzioni e variabili, [consulta la documentazione](https://docs.soliditylang.org/en/latest/contracts.html). +Questo esempio dovrebbe darti un'idea di come sia la sintassi dei contratti in Solidity. Per una descrizione più dettagliata delle funzioni e delle variabili, [consulta la documentazione](https://docs.soliditylang.org/en/latest/contracts.html). ## Vyper {#vyper} -- Linguaggio di programmazione Pythonic +- Linguaggio di programmazione pythonico - Tipizzazione forte -- Codice del compilatore contenuto e comprensibile -- Generazione di bytecode efficiente -- Contiene deliberatamente meno funzionalità di Solidity, mirando a rendere i contratti più sicuri e facili da xcontcontrollare. Vyper non supporta: +- Codice del compilatore piccolo e comprensibile +- Generazione efficiente del bytecode +- Ha deliberatamente meno funzionalità rispetto a Solidity con l'obiettivo di rendere i contratti più sicuri e facili da verificare. Vyper non supporta: - Modificatori - Ereditarietà - - Assemblaggio in linea - - Sovraccarico della funzione - - Sovraccarico dell'operatore + - Assembly in linea + - Sovraccarico delle funzioni + - Sovraccarico degli operatori - Chiamate ricorsive - Cicli di lunghezza infinita - Punti fissi binari -Per ulteriori informazioni, [consulta la logica di Vyper](https://vyper.readthedocs.io/en/latest/index.html). +Per maggiori informazioni, [leggi le motivazioni di Vyper](https://vyper.readthedocs.io/en/latest/index.html). ### Link importanti {#important-links-1} - [Documentazione](https://vyper.readthedocs.io) -- [Vyper per Esempio](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) -- [Più Vyper per Esempio](https://vyper-by-example.org/) +- [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [Altro su Vyper by Example](https://vyper-by-example.org/) - [GitHub](https://github.com/vyperlang/vyper) - [Chat Discord della community di Vyper](https://discord.gg/SdvKC79cJk) - [Cheat Sheet](https://reference.auditless.com/cheatsheet) -- [Quadro di sviluppo dei contratti intelligenti e strumenti per Vyper](/developers/docs/programming-languages/python/) -- [VyperPunk: impara a proteggere e hackerare i contratti intelligenti di Vyper](https://github.com/SupremacyTeam/VyperPunk) -- [Hub di Vyper per lo sviluppo](https://github.com/zcor/vyper-dev) -- [Esempi dei migliori contratti intelligenti di Vyper](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) -- [Fantastiche risorse curate di Vyper](https://github.com/spadebuilders/awesome-vyper) +- [Framework e strumenti di sviluppo di contratti intelligenti per Vyper](/developers/docs/programming-languages/python/) +- [VyperPunk - impara a proteggere e hackerare i contratti intelligenti in Vyper](https://github.com/SupremacyTeam/VyperPunk) +- [Vyper Hub per lo sviluppo](https://github.com/zcor/vyper-dev) +- [Esempi dei migliori contratti intelligenti in Vyper](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [Risorse curate Awesome Vyper](https://github.com/spadebuilders/awesome-vyper) ### Esempio {#example} ```python -# Apertura asta +# Asta aperta -# Parametri d'asta +# Parametri dell'asta # Il beneficiario riceve denaro dal miglior offerente beneficiary: public(address) auctionStart: public(uint256) @@ -132,42 +132,42 @@ auctionEnd: public(uint256) highestBidder: public(address) highestBid: public(uint256) -# Imposta a true alla fine per non permettere più modifiche +# Impostato su true alla fine, impedisce qualsiasi modifica ended: public(bool) -# Tiene traccia delle offerte rimborsate in modo da poter seguire il modello di prelievo +# Tieni traccia delle offerte rimborsate in modo da poter seguire il pattern di prelievo pendingReturns: public(HashMap[address, uint256]) # Crea una semplice asta con `_bidding_time` -# tempo di offerta in secondi per conto -# dell'indirizzo del beneficiario `_beneficiary`. +# secondi di tempo per le offerte per conto dell' +# indirizzo del beneficiario `_beneficiary`. @external def __init__(_beneficiary: address, _bidding_time: uint256): self.beneficiary = _beneficiary self.auctionStart = block.timestamp self.auctionEnd = self.auctionStart + _bidding_time -# Offerta sull'asta con il valore inviato +# Fai un'offerta all'asta con il valore inviato # insieme a questa transazione. -# Il valore sarà rimborsato solo se l'asta -# non viene vinta. +# Il valore sarà rimborsato solo se l' +# asta non viene vinta. @external @payable def bid(): - # Controlla se il periodo di offerta è finito. + # Controlla se il periodo delle offerte è terminato. assert block.timestamp < self.auctionEnd - # Verifica se l'offerta è abbastanza alta + # Controlla se l'offerta è abbastanza alta assert msg.value > self.highestBid - # Tiene traccia del rimborso all'offerente più alto precedente + # Tieni traccia del rimborso per il precedente miglior offerente self.pendingReturns[self.highestBidder] += self.highestBid - # Tiene traccia della nuova offerta più alta + # Tieni traccia della nuova offerta più alta self.highestBidder = msg.sender self.highestBid = msg.value -# Preleva un'offerta precedentemente rimborsata. Il modello di prelievo è -# utilizzato qui per evitare un problema di sicurezza. Se i rimborsi venissero inviati direttamente -# come parte di bid(), un contratto di offerta malevolo potrebbe bloccarli -# e quindi bloccare le nuove offerte più alte in arrivo. +# Preleva un'offerta precedentemente rimborsata. Il pattern di prelievo è +# usato qui per evitare un problema di sicurezza. Se i rimborsi fossero direttamente +# inviati come parte di bid(), un contratto di offerta malevolo potrebbe bloccare +# quei rimborsi e quindi bloccare l'arrivo di nuove offerte più alte. @external def withdraw(): pending_amount: uint256 = self.pendingReturns[msg.sender] @@ -178,24 +178,24 @@ def withdraw(): # al beneficiario. @external def endAuction(): - # It is a good guideline to structure functions that interact - # with other contracts (i.e., they call functions or send ether) - # into three phases: + # È una buona linea guida strutturare le funzioni che interagiscono + # con altri contratti (cioè, chiamano funzioni o inviano ether) + # in tre fasi: # 1. controllo delle condizioni # 2. esecuzione delle azioni (potenzialmente modificando le condizioni) # 3. interazione con altri contratti - # Se queste fasi sono mischiate, l'altro contratto potrebbe eseguire - # nuove chiamate al contratto corrente e modificare lo stato o causare - # effetti (pagamento di ether) da eseguire più volte. - # Se le funzioni chiamate internamente includono l'interazione con contratti esterni - # devono essere considerate anche interazioni con + # Se queste fasi vengono mescolate, l'altro contratto potrebbe richiamare + # il contratto corrente e modificare lo stato o causare + # l'esecuzione multipla di effetti (pagamento di ether). + # Se le funzioni chiamate internamente includono l'interazione con + # contratti esterni, devono anche essere considerate interazioni con # contratti esterni. # 1. Condizioni - # Controlla se la fine dell'asta è stata raggiunta + # Controlla se l'ora di fine dell'asta è stata raggiunta assert block.timestamp >= self.auctionEnd - # Verifica se questa funzione è già stata chiamata - assert not self.ended + # Controlla se questa funzione è già stata chiamata + assert not self.ended # 2. Effetti self.ended = True @@ -204,33 +204,34 @@ def endAuction(): send(self.beneficiary, self.highestBid) ``` -Questo esempio dovrebbe darti un'idea della sintassi di un contratto in Vyper. Per una descrizione più dettagliata di funzioni e variabili, [consulta la documentazione](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). +Questo esempio dovrebbe darti un'idea di come sia la sintassi dei contratti in Vyper. Per una descrizione più dettagliata delle funzioni e delle variabili, [consulta la documentazione](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). ## Yul e Yul+ {#yul} -Se non hai esperienza con Ethereum e non hai ancora programmato con alcun linguaggio dei contratti intelligenti, consigliamo di iniziare con Solidity o Vyper. Considera Yul o Yul+ solo quando hai acquisito familiarità con le migliori pratiche di sicurezza per i contratti intelligenti e con le specifiche per l'utilizzo dell'EVM. +Se sei nuovo su Ethereum e non hai ancora programmato con i linguaggi per i contratti intelligenti, ti consigliamo di iniziare con Solidity o Vyper. Esamina Yul o Yul+ solo quando avrai familiarità con le migliori pratiche di sicurezza dei contratti intelligenti e con le specifiche del lavoro con l'EVM. **Yul** - Linguaggio intermedio per Ethereum. -- Supporta l'[EVM](/developers/docs/evm) ed [Ewasm](https://github.com/ewasm), un WebAssembly orientato a Ethereum, progettato per essere un denominatore comune utilizzabile di entrambe le piattaforme. -- Buona soluzione per le fasi di ottimizzazione di alto livello che possono essere utili per entrambe le piattaforme, EVM ed eWASM. +- Supporta l'[EVM](/developers/docs/evm) ed [Ewasm](https://github.com/ewasm), un WebAssembly in stile Ethereum, ed è progettato per essere un denominatore comune utilizzabile per entrambe le piattaforme. +- Ottimo obiettivo per le fasi di ottimizzazione di alto livello che possono avvantaggiare equamente sia le piattaforme EVM che Ewasm. **Yul+** -- Un'estensione a Yul molto efficiente e di basso livello. -- Inizialmente progettata per il contratto di un [rollup ottimistico](/developers/docs/scaling/optimistic-rollups/). -- Yul+ può essere considerato come una proposta di upgrade sperimentale a Yul che aggiunge nuove funzionalità. +- Un'estensione di Yul di basso livello e altamente efficiente. +- Inizialmente progettato per un contratto di [rollup ottimistico](/developers/docs/scaling/optimistic-rollups/). +- Yul+ può essere considerato come una proposta di aggiornamento sperimentale per Yul, aggiungendovi nuove funzionalità. ### Link importanti {#important-links-2} - [Documentazione di Yul](https://docs.soliditylang.org/en/latest/yul.html) - [Documentazione di Yul+](https://github.com/fuellabs/yulp) -- [Post Introduttivo di Yul+](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) +- [Post introduttivo su Yul+](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) ### Esempio di contratto {#example-contract-2} -Il seguente semplice esempio implementa una funzione di potenza. Può essere compilato usando `solc --strict-assembly --bin input.yul`. L'esempio dovrebbe esser archiviato nel file input.yul. +Il seguente semplice esempio implementa una funzione di potenza. Può essere compilato utilizzando `solc --strict-assembly --bin input.yul`. L'esempio dovrebbe +essere salvato nel file input.yul. ``` { @@ -251,26 +252,26 @@ Il seguente semplice esempio implementa una funzione di potenza. Può essere com } ``` -Se hai già una buona esperienza coi contratti intelligenti, puoi trovare [qui](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example) un'implementazione completa di ERC-20 su Yul. +Se hai già molta esperienza con i contratti intelligenti, puoi trovare un'implementazione completa di ERC20 in Yul [qui](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example). ## Fe {#fe} -- Linguaggio statico per la Macchina Virtuale di Ethereum (EVM). -- Ispirato da Python e Rust. -- Mira a esser facile da imparare, anche per sviluppatori nuovi all'ecosistema di Ethereum. -- Lo sviluppo di Fe è ancora alle fasi iniziali e a gennaio 2021 è stata rilasciata la versione alfa del linguaggio. +- Linguaggio tipizzato staticamente per la macchina virtuale di Ethereum (EVM). +- Ispirato a Python e Rust. +- Mira a essere facile da imparare, anche per gli sviluppatori che sono nuovi nell'ecosistema di Ethereum. +- Lo sviluppo di Fe è ancora nelle sue fasi iniziali, il linguaggio ha avuto la sua versione alpha a gennaio 2021. ### Link importanti {#important-links-3} - [GitHub](https://github.com/ethereum/fe) -- [Annuncio di Fe](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) -- [Tabella di marcia 2021 di Fe](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Annuncio di Fe](https://blog.fe-lang.org/posts/fe-a-new-language-for-the-ethereum-ecosystem/) +- [Piano d'azione di Fe 2021](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) - [Chat Discord di Fe](https://discord.com/invite/ywpkAXFjZH) - [Twitter di Fe](https://twitter.com/official_fe) ### Esempio di contratto {#example-contract-3} -Il seguente è un contratto semplice implementato in Fe. +Di seguito è riportato un semplice contratto implementato in Fe. ``` type BookMsg = bytes[100] @@ -293,32 +294,32 @@ contract GuestBook: ## Come scegliere {#how-to-choose} -Come per ogni altro linguaggio di programmazione, si tratta principalmente di scegliere lo strumento adatto al lavoro da compiere, nonché sulle preferenze personali. +Come per qualsiasi altro linguaggio di programmazione, si tratta principalmente di scegliere lo strumento giusto per il lavoro giusto, oltre che di preferenze personali. -Ecco alcune cose da considerare se non hai ancora provato i vari linguaggi: +Ecco alcune cose da considerare se non hai ancora provato nessuno dei linguaggi: -### Quali vantaggi offre Solidity? {#solidity-advantages} +### Cosa c'è di fantastico in Solidity? {#solidity-advantages} -- Se sei un principiante, esistono molti tutorial e strumenti di apprendimento. Visualizza di più nella sezione [Impara Programmando](/developers/learning-tools/). +- Se sei un principiante, ci sono molti tutorial e strumenti di apprendimento disponibili. Scopri di più nella sezione [Impara programmando](/developers/learning-tools/). - Buoni strumenti per sviluppatori disponibili. -- Solidity ha un'ampia community di sviluppatori, quindi probabilmente troverai le risposte alle tue domande abbastanza rapidamente. +- Solidity ha una grande community di sviluppatori, il che significa che molto probabilmente troverai risposte alle tue domande abbastanza rapidamente. -### Quali vantaggi offre Vyper? {#vyper-advatages} +### Cosa c'è di fantastico in Vyper? {#vyper-advatages} -- Ottimo modo per iniziare per gli sviluppatori di Python che vogliono scrivere contratti intelligenti. -- Vyper ha un numero minore di funzionalità che lo rendono perfetto per la prototipazione rapida di idee. -- Vyper mira a facilitare il controllo del codice e a renderlo il più leggibile possibile. +- Ottimo modo per iniziare per gli sviluppatori Python che vogliono scrivere contratti intelligenti. +- Vyper ha un numero minore di funzionalità, il che lo rende ottimo per la prototipazione rapida di idee. +- Vyper mira a essere facile da verificare e massimamente leggibile dall'uomo. -### Quali vantaggi offrono Yul e Yul+? {#yul-advantages} +### Cosa c'è di fantastico in Yul e Yul+? {#yul-advantages} -- Linguaggio di basso livello, semplicistico e funzionale. -- Consente di avvicinarsi all'EVM grezza, aiutando a ottimizzare l'uso di gas dei tuoi contratti. +- Linguaggio di basso livello semplicistico e funzionale. +- Permette di avvicinarsi molto di più all'EVM grezza, il che può aiutare a ottimizzare l'utilizzo del gas dei tuoi contratti. -## Confronti tra linguaggi {#language-comparisons} +## Confronti tra i linguaggi {#language-comparisons} -Per confrontare la sintassi di base, la durata del contratto, le interfacce, gli operatori, le strutture di dati, le funzioni, il flusso di controllo e altro, consulta questo [contenuto riassuntivo di Auditless](https://reference.auditless.com/cheatsheet/) +Per confronti sulla sintassi di base, il ciclo di vita del contratto, le interfacce, gli operatori, le strutture dati, le funzioni, il flusso di controllo e altro ancora, dai un'occhiata a questo [cheat sheet di Auditless](https://reference.auditless.com/cheatsheet/) -## Ulteriori letture {#further-reading} +## Letture consigliate {#further-reading} -- [Libreria di Contratti in Solidity di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/) -- [Solidity per Esempio](https://solidity-by-example.org) +- [Libreria di contratti Solidity di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/) +- [Solidity by Example](https://solidity-by-example.org) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md index 331d258817f..f896f8c5834 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/libraries/index.md @@ -1,26 +1,26 @@ --- -title: Librerie dei contratti intelligenti -description: +title: Librerie di contratti intelligenti +description: Scopri le librerie di contratti intelligenti riutilizzabili e i blocchi di costruzione per accelerare i tuoi progetti di sviluppo su Ethereum. lang: it --- -Non devi scrivere ogni contratto intelligente nel tuo progetto da zero. Esistono molte librerie open source di contratti intelligenti che forniscono blocchi di programmazione riutilizzabili per il tuo progetto, che possono salvarti dal dover reinventare la ruota. +Non è necessario scrivere da zero ogni contratto intelligente del tuo progetto. Sono disponibili molte librerie di contratti intelligenti open source che forniscono blocchi di costruzione riutilizzabili per il tuo progetto, evitandoti di dover reinventare la ruota. ## Prerequisiti {#prerequisites} -Prima di saltare alle librerie dei contratti intelligenti, è una buona idea avere una buona comprensione della struttura di un contratto intelligente. Consulta l'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/), se ancora non l'hai fatto. +Prima di tuffarti nelle librerie di contratti intelligenti, è una buona idea avere una buona comprensione della struttura di un contratto intelligente. Dai un'occhiata all'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/) se non l'hai ancora fatto. -## Cosa contiene una libreria {#whats-in-a-library} +## Cosa c'è in una libreria {#whats-in-a-library} -Solitamente, puoi trovare due tipi di blocchi di programmazione nelle librerie dei contratti intelligenti: comportamenti riutilizzabili che puoi aggiungere ai tuoi contratti e implementazioni di vari standard. +Di solito puoi trovare due tipi di blocchi di costruzione nelle librerie di contratti intelligenti: comportamenti riutilizzabili che puoi aggiungere ai tuoi contratti e implementazioni di vari standard. ### Comportamenti {#behaviors} -Scrivendo i contratti intelligenti, è possibile che ti troverai a scrivere sempre gli stessi schemi, come assegnare un indirizzo _admin_ per svolgere le operazioni protette in un contratto, o aggiungere un pulsante d'emergenza _pause_ nel caso di un problema imprevisto. +Quando scrivi contratti intelligenti, c'è una buona probabilità che ti ritroverai a scrivere schemi simili più e più volte, come assegnare un indirizzo _admin_ per eseguire operazioni protette in un contratto, o aggiungere un pulsante di _pausa_ di emergenza in caso di un problema imprevisto. -Le librerie dei contratti intelligenti, solitamente, forniscono implementazioni riutilizzabili di questi comportamenti come [librerie](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) o tramite [ereditarietà](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) in Solidity. +Le librerie di contratti intelligenti di solito forniscono implementazioni riutilizzabili di questi comportamenti come [librerie](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) o tramite [ereditarietà](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) in Solidity. -Ad esempio, di seguito è riportata una versione semplificata del contratto [`Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) della [libreria dei contratti di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts), che imposta un indirizzo come proprietario di un contratto e fornisce un modificatore per consentire l'accesso a un metodo solo a quel proprietario. +Ad esempio, di seguito è riportata una versione semplificata del [contratto `Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) dalla [libreria OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts), che designa un indirizzo come proprietario di un contratto e fornisce un modificatore per limitare l'accesso a un metodo solo a quel proprietario. ```solidity contract Ownable { @@ -37,35 +37,35 @@ contract Ownable { } ``` -Per usare un blocco di programmazione come questo in un contratto, devi prima importarlo e poi eseguirne estensioni nei tuoi contratti. In questo modo potrai usare il modificatore fornito dal contratto di base di `Ownable` per proteggere le funzioni che utilizzi. +Per utilizzare un blocco di costruzione come questo nel tuo contratto, dovresti prima importarlo e poi estenderlo nei tuoi contratti. Questo ti consentirà di utilizzare il modificatore fornito dal contratto base `Ownable` per proteggere le tue funzioni. ```solidity import ".../Ownable.sol"; // Percorso della libreria importata contract MyContract is Ownable { - // The following function can only be called by the owner + // La seguente funzione può essere chiamata solo dal proprietario function secured() onlyOwner public { msg.sender.transfer(1 ether); } } ``` -Un altro esempio noto è [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) o [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Sono librerie (e non contratti di base) che forniscono funzioni aritmetiche con controlli dell'overflow che non vengono offerti dal linguaggio. È buona pratica usare una di queste librerie al posto delle operazioni aritmetiche native per proteggere un contratto dagli overflow, che possono avere conseguenze disastrose. +Un altro esempio popolare è [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) o [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Queste sono librerie (al contrario dei contratti base) che forniscono funzioni aritmetiche con controlli di overflow, che non sono forniti dal linguaggio. È una buona pratica utilizzare una di queste librerie invece delle operazioni aritmetiche native per proteggere il tuo contratto dagli overflow, che possono avere conseguenze disastrose! ### Standard {#standards} -Per facilitare la [componibilità e l'interoperabilità](/developers/docs/smart-contracts/composability/), la community di Ethereum ha definito diversi standard nella forma di **ERC**. Puoi leggere di più nella sezione dedicata agli [standard](/developers/docs/standards/). +Per facilitare la [componibilità e l'interoperabilità](/developers/docs/smart-contracts/composability/), la comunità di Ethereum ha definito diversi standard sotto forma di **ERC**. Puoi leggere di più al riguardo nella sezione degli [standard](/developers/docs/standards/). -Se desideri includere un ERC all'interno di un contratto, è consigliabile cercare implementazioni standard anziché crearne di proprie. Molte librerie di contratti intelligenti includono implementazioni per gli ERC più popolari. Ad esempio, l'onnipresente [standard per token fungibile ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) si può trovare in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) e [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20). Inoltre, alcuni ERC forniscono implementazioni canoniche come parte dello stesso ERC. +Quando includi un ERC come parte dei tuoi contratti, è una buona idea cercare implementazioni standard piuttosto che cercare di crearne di tue. Molte librerie di contratti intelligenti includono implementazioni per gli ERC più popolari. Ad esempio, l'onnipresente [standard per token fungibili ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) può essere trovato in [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) e [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20). Inoltre, alcuni ERC forniscono anche implementazioni canoniche come parte dell'ERC stesso. -Vale la pena ricordare che alcuni ERC non sono singoli, ma sono aggiunte di altri ERC. Per esempio, [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) aggiunge un'estensione a ERC20 per migliorarne l'utilizzabilità. +Vale la pena menzionare che alcuni ERC non sono a sé stanti, ma sono aggiunte ad altri ERC. Ad esempio, l'[ERC2612](https://eips.ethereum.org/EIPS/eip-2612) aggiunge un'estensione all'ERC20 per migliorarne l'usabilità. ## Come aggiungere una libreria {#how-to} -Consulta sempre la documentazione della libreria che decidi di utilizzare per avere istruzioni specifiche su come includerla nel tuo progetto. Molte librerie dei contratti Solidity sono create con `npm`, quindi puoi usare semplicemente `npm install` per installarle. Gran parte degli strumenti per [compilare](/developers/docs/smart-contracts/compiling/) i contratti, cercherà le librerie dei contratti intelligenti nei tuoi `node_modules`, quindi puoi fare quanto segue: +Fai sempre riferimento alla documentazione della libreria che stai includendo per istruzioni specifiche su come includerla nel tuo progetto. Diverse librerie di contratti Solidity sono pacchettizzate usando `npm`, quindi puoi semplicemente eseguire `npm install`. La maggior parte degli strumenti per la [compilazione](/developers/docs/smart-contracts/compiling/) dei contratti cercherà le librerie di contratti intelligenti nel tuo `node_modules`, quindi puoi fare quanto segue: ```solidity -// Questo caricherà la libreria @openzeppelin/contracts da node_modules +// Questo caricherà la libreria @openzeppelin/contracts dai tuoi node_modules import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract MyNFT is ERC721 { @@ -73,32 +73,32 @@ contract MyNFT is ERC721 { } ``` -Indipendentemente dal metodo utilizzato, includendo una libreria, tieni sempre d'occhio la versione della [lingua](/developers/docs/smart-contracts/languages/). Ad esempio non puoi usare una libreria per Solidity 0.6 se stai scrivendo i contratti in Solidity 0.5. +Indipendentemente dal metodo che usi, quando includi una libreria, tieni sempre d'occhio la versione del [linguaggio](/developers/docs/smart-contracts/languages/). Ad esempio, non puoi usare una libreria per Solidity 0.6 se stai scrivendo i tuoi contratti in Solidity 0.5. -## Quando usare una libreria {#when-to-use} +## Quando usarle {#when-to-use} -Usare la libreria di un contratto intelligente per il tuo progetto ha diversi benefici. Prima di tutto, fa risparmiare tempo perché fornisce blocchi di programmazione pronti all'uso che puoi includere nel sistema e che non devi programmare autonomamente. +L'uso di una libreria di contratti intelligenti per il tuo progetto ha diversi vantaggi. Innanzitutto, ti fa risparmiare tempo fornendoti blocchi di costruzione pronti all'uso che puoi includere nel tuo sistema, piuttosto che doverli programmare tu stesso. -Anche la sicurezza è un importante vantaggio. Le librerie dei contratti intelligenti open source, inoltre, sono spesso molto controllate. Dato che molti progetti dipendono da esse, c'è un forte incentivo da parte della community a revisionarle costantemente. È molto più comune trovare errori nel codice di un'applicazione che nelle librerie riutilizzabili dei contratti. Inoltre alcune librerie sono sottoposte a [controlli esterni](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) per maggior sicurezza. +Anche la sicurezza è un grande vantaggio. Le librerie di contratti intelligenti open source sono spesso esaminate attentamente. Dato che molti progetti dipendono da esse, c'è un forte incentivo da parte della comunità a mantenerle sotto costante revisione. È molto più comune trovare errori nel codice dell'applicazione che nelle librerie di contratti riutilizzabili. Alcune librerie sono anche sottoposte ad [audit esterni](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) per una maggiore sicurezza. -Tuttavia, l'uso delle librerie dei contratti intelligenti comporta il rischio di includere codice con cui non sei familiare nel tuo progetto. La tentazione di importare un contratto e includerlo direttamente nel progetto è forte, ma se non si sa cosa fa il contratto, si potrebbe inavvertitamente inserire un problema nel sistema a causa di un comportamento imprevisto. Leggi sempre la documentazione del codice che importi e quindi controlla il codice direttamente prima di renderlo parte del tuo progetto. +Tuttavia, l'uso di librerie di contratti intelligenti comporta il rischio di includere nel tuo progetto codice con cui non hai familiarità. È allettante importare un contratto e includerlo direttamente nel tuo progetto, ma senza una buona comprensione di ciò che fa quel contratto, potresti inavvertitamente introdurre un problema nel tuo sistema a causa di un comportamento imprevisto. Assicurati sempre di leggere la documentazione del codice che stai importando e poi rivedi il codice stesso prima di renderlo parte del tuo progetto! -Infine, per decidere se includere una libreria, considera l'uso generale che ne vorresti fare. Una libreria ampiamente adottata ha il vantaggio di avere alla base una community più grande e più occhi che la controllano alla ricerca di problemi. La sicurezza dovrebbe essere la tua preoccupazione principale, quando sviluppi i contratti intelligenti! +Infine, quando decidi se includere una libreria, considera il suo utilizzo complessivo. Una libreria ampiamente adottata ha il vantaggio di avere una comunità più ampia e più occhi che la esaminano alla ricerca di problemi. La sicurezza dovrebbe essere il tuo obiettivo principale quando costruisci con i contratti intelligenti! ## Strumenti correlati {#related-tools} -**OpenZeppelin Contracts**: **_La libreria più popolare per lo sviluppo sicuro di contratti intelligenti._** +**OpenZeppelin Contracts -** **_La libreria più popolare per lo sviluppo sicuro di contratti intelligenti._** - [Documentazione](https://docs.openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Forum della community](https://forum.openzeppelin.com/c/general/16) -**DappSys -** **_Blocchi di programmazione sicuri, semplici e flessibili per contratti intelligenti_** +**DappSys -** **_Blocchi di costruzione sicuri, semplici e flessibili per contratti intelligenti._** - [Documentazione](https://dappsys.readthedocs.io/) - [GitHub](https://github.com/dapphub/dappsys) -**HQ20 -** **_Progetto in Solidity con contratti, librerie ed esempi per creare applicazioni complete distribuite per il mondo reale._** +**HQ20 -** **_Un progetto Solidity con contratti, librerie ed esempi per aiutarti a costruire applicazioni distribuite complete per il mondo reale._** - [GitHub](https://github.com/HQ20/contracts) @@ -109,9 +109,9 @@ Infine, per decidere se includere una libreria, considera l'uso generale che ne ## Tutorial correlati {#related-tutorials} -- [Security considerations for Ethereum developers](/developers/docs/smart-contracts/security/): _Un tutorial sulle considerazioni sulla sicurezza durante lo sviluppo dei contratti intelligenti, incluso l'uso della libreria._ -- [Understand the ERC-20 token smart contract](/developers/tutorials/understand-the-erc-20-token-smart-contract/): _Tutorial sullo standard ERC20, fornito da diverse librerie._ +- [Considerazioni sulla sicurezza per gli sviluppatori di Ethereum](/developers/docs/smart-contracts/security/) _– Un tutorial sulle considerazioni di sicurezza durante la creazione di contratti intelligenti, incluso l'uso delle librerie._ +- [Comprendere il contratto intelligente del token ERC-20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _- Tutorial sullo standard ERC20, fornito da più librerie._ ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/naming/index.md b/public/content/translations/it/developers/docs/smart-contracts/naming/index.md new file mode 100644 index 00000000000..8bed315239c --- /dev/null +++ b/public/content/translations/it/developers/docs/smart-contracts/naming/index.md @@ -0,0 +1,101 @@ +--- +title: Dare un nome ai contratti intelligenti +description: Migliori pratiche per dare un nome ai contratti intelligenti di Ethereum con ENS +lang: it +--- + +I contratti intelligenti sono una pietra miliare dell'infrastruttura decentralizzata di Ethereum, consentendo applicazioni e protocolli autonomi. Ma anche se le capacità dei contratti si evolvono, gli utenti e gli sviluppatori si affidano ancora a indirizzi esadecimali grezzi per identificare e fare riferimento a questi contratti. + +Dare un nome ai contratti intelligenti con l'[Ethereum Name Service (ENS)](https://ens.domains/) migliora l'esperienza utente eliminando gli indirizzi esadecimali dei contratti e riduce il rischio di attacchi come l'avvelenamento degli indirizzi (address poisoning) e gli attacchi di spoofing. Questa guida spiega perché dare un nome ai contratti intelligenti è importante, come può essere implementato e gli strumenti disponibili come [Enscribe](https://www.enscribe.xyz) per semplificare il processo e aiutare gli sviluppatori ad adottare questa pratica. + +## Perché dare un nome ai contratti intelligenti? {#why-name-contracts} + +### Identificatori leggibili dall'uomo {#human-readable-identifiers} + +Invece di interagire con indirizzi di contratti opachi come `0x8f8e...f9e3`, gli sviluppatori e gli utenti possono utilizzare nomi leggibili dall'uomo come `v2.myapp.eth`. Questo semplifica le interazioni con i contratti intelligenti. + +Questo è reso possibile dall'[Ethereum Name Service](https://ens.domains/) che fornisce un servizio di denominazione decentralizzato per gli indirizzi di Ethereum. Questo è analogo a come il Domain Name Service (DNS) consente agli utenti di Internet di accedere agli indirizzi di rete utilizzando un nome come ethereum.org invece di un indirizzo IP come `104.18.176.152`. + +### Sicurezza e fiducia migliorate {#improved-security-and-trust} + +I contratti con nome aiutano a ridurre le transazioni accidentali verso l'indirizzo sbagliato. Aiutano anche gli utenti a identificare i contratti legati ad app o marchi specifici. Questo aggiunge un livello di fiducia reputazionale, specialmente quando i nomi sono collegati a domini principali ben noti come `uniswap.eth`. + +A causa della lunghezza di 42 caratteri dell'indirizzo di Ethereum, è molto difficile per gli utenti identificare piccoli cambiamenti negli indirizzi, in cui sono stati modificati un paio di caratteri. Ad esempio, un indirizzo come `0x58068646C148E313CB414E85d2Fe89dDc3426870` verrebbe normalmente troncato a `0x580...870` da applicazioni rivolte all'utente come i portafogli. È improbabile che un utente noti un indirizzo malevolo in cui sono stati alterati un paio di caratteri. + +Questo tipo di tecnica è impiegato dagli attacchi di spoofing e avvelenamento degli indirizzi in cui gli utenti sono indotti a credere di interagire o inviare fondi all'indirizzo corretto, quando in realtà l'indirizzo assomiglia semplicemente a quello corretto, ma non è lo stesso. + +I nomi ENS per portafogli e contratti proteggono da questi tipi di attacchi. Come gli attacchi di spoofing DNS, anche gli attacchi di spoofing ENS possono essere perpetrati, tuttavia, è più probabile che un utente noti un errore di ortografia in un nome ENS rispetto a una piccola modifica a un indirizzo esadecimale. + +### Migliore UX per portafogli ed esploratori {#better-ux} + +Quando un contratto intelligente è stato configurato con un nome ENS, è possibile per app come portafogli ed esploratori di blocchi visualizzare i nomi ENS per i contratti intelligenti, invece degli indirizzi esadecimali. Questo fornisce un significativo miglioramento dell'esperienza utente (UX) per gli utenti. + +Ad esempio, quando interagiscono con un'app come Uniswap, gli utenti vedranno tipicamente che l'app con cui stanno interagendo è ospitata sul sito web `uniswap.org`, ma verrebbe loro presentato un indirizzo di contratto esadecimale se Uniswap non avesse dato un nome ai propri contratti intelligenti con ENS. Se il contratto ha un nome, potrebbero invece vedere `v4.contracts.uniswap.eth`, il che è molto più utile. + +## Dare un nome al momento della distribuzione vs. post-distribuzione {#when-to-name} + +Ci sono due momenti in cui si può dare un nome ai contratti intelligenti: + +- **Al momento della distribuzione**: assegnare un nome ENS al contratto mentre viene distribuito. +- **Dopo la distribuzione**: mappare un indirizzo di contratto esistente a un nuovo nome ENS. + +Entrambi gli approcci si basano sull'avere l'accesso come proprietario o gestore a un dominio ENS in modo da poter creare e impostare i record ENS. + +## Come funziona la denominazione ENS per i contratti {#how-ens-naming-works} + +I nomi ENS sono memorizzati on-chain e si risolvono in indirizzi di Ethereum tramite i resolver ENS. Per dare un nome a un contratto intelligente: + +1. Registrare o controllare un dominio ENS principale (es. `myapp.eth`) +2. Creare un sottodominio (es. `v1.myapp.eth`) +3. Impostare il record `address` del sottodominio all'indirizzo del contratto +4. Impostare il record inverso (reverse record) del contratto sull'ENS per consentire di trovare il nome tramite il suo indirizzo + +I nomi ENS sono gerarchici e supportano sotto-nomi illimitati. L'impostazione di questi record comporta tipicamente l'interazione con il registro ENS e i contratti dei resolver pubblici. + +## Strumenti per dare un nome ai contratti {#tools} + +Ci sono due approcci per dare un nome ai contratti intelligenti. Utilizzare l'[App ENS](https://app.ens.domains) con alcuni passaggi manuali, oppure utilizzare [Enscribe](https://www.enscribe.xyz). Questi sono delineati di seguito. + +### Configurazione manuale di ENS {#manual-ens-setup} + +Utilizzando l'[App ENS](https://app.ens.domains/), gli sviluppatori possono creare manualmente sotto-nomi e impostare i record di indirizzo di inoltro (forward address). Tuttavia, non possono impostare un nome primario per un contratto intelligente impostando il record inverso per il nome tramite l'app ENS. Devono essere intrapresi passaggi manuali che sono trattati nella [documentazione di ENS](https://docs.ens.domains/web/naming-contracts/). + +### Enscribe {#enscribe} + +[Enscribe](https://www.enscribe.xyz) semplifica la denominazione dei contratti intelligenti con ENS e migliora la fiducia degli utenti nei contratti intelligenti. Fornisce: + +- **Distribuzione e denominazione atomica**: Assegna un nome ENS durante la distribuzione di un nuovo contratto +- **Denominazione post-distribuzione**: Associa nomi a contratti già distribuiti +- **Supporto multi-chain**: Funziona su Ethereum e sulle reti L2 in cui è supportato ENS +- **Dati di verifica del contratto**: Include i dati di verifica del contratto estratti da più fonti per aumentare la fiducia degli utenti + +Enscribe supporta i nomi ENS forniti dagli utenti, o i propri domini se l'utente non ha un nome ENS. + +Puoi accedere all'[App Enscribe](https://app.enscribe.xyz) per iniziare a dare un nome e visualizzare i contratti intelligenti. + +## Migliori pratiche {#best-practices} + +- **Usa nomi chiari e versionati** come `v1.myapp.eth` per rendere trasparenti gli aggiornamenti del contratto +- **Imposta i record inversi** per collegare i contratti ai nomi ENS per la visibilità in app come portafogli ed esploratori di blocchi. +- **Monitora attentamente le scadenze** se vuoi prevenire cambiamenti accidentali di proprietà +- **Verifica il codice sorgente del contratto** in modo che gli utenti possano fidarsi che il contratto nominato si comporti come previsto + +## Rischi {#risks} + +Dare un nome ai contratti intelligenti fornisce vantaggi significativi per gli utenti di Ethereum, tuttavia, i proprietari di domini ENS devono essere vigili riguardo alla loro gestione. I rischi degni di nota includono: + +- **Scadenza**: Proprio come i nomi DNS, le registrazioni dei nomi ENS hanno una durata limitata. Pertanto è vitale che i proprietari monitorino le date di scadenza dei loro domini e li rinnovino con largo anticipo rispetto alla loro scadenza. Sia l'App ENS che Enscribe forniscono indicatori visivi per i proprietari di domini quando si avvicina la scadenza. +- **Cambio di proprietà**: I record ENS sono rappresentati come NFT su Ethereum, dove il proprietario di uno specifico dominio `.eth` ha in suo possesso l'NFT associato. Pertanto, se un account diverso dovesse prendere possesso di questo NFT, il nuovo proprietario potrebbe modificare qualsiasi record ENS come ritiene opportuno. + +Per mitigare tali rischi, l'account proprietario per i domini di 2° livello (2LD) `.eth` dovrebbe essere protetto tramite un portafoglio multifirma con sottodomini creati per gestire la denominazione dei contratti. In questo modo, in caso di modifiche accidentali o malevole della proprietà a livello di sottodominio, queste possono essere sovrascritte dal proprietario del 2LD. + +## Il futuro della denominazione dei contratti {#future} + +La denominazione dei contratti sta diventando una migliore pratica per lo sviluppo di dApp, in modo simile a come i nomi di dominio hanno sostituito gli indirizzi IP sul web. Man mano che sempre più infrastrutture come portafogli, esploratori e dashboard integrano la risoluzione ENS per i contratti, i contratti con nome miglioreranno la sicurezza e ridurranno gli errori in tutto l'ecosistema. + +Rendendo i contratti intelligenti più facili da riconoscere e da comprendere, la denominazione aiuta a colmare il divario tra utenti e app su Ethereum, migliorando sia la sicurezza che l'UX per gli utenti. + +## Letture consigliate {#further-reading} + +- [Dare un nome ai contratti intelligenti con ENS](https://docs.ens.domains/web/naming-contracts/) +- [Dare un nome ai contratti intelligenti con Enscribe](https://www.enscribe.xyz/docs). \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/security/index.md b/public/content/translations/it/developers/docs/smart-contracts/security/index.md index 512a8177109..a0bd65c1578 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/security/index.md @@ -1,54 +1,54 @@ --- title: Sicurezza dei contratti intelligenti -description: Una panoramica delle linee guida per costruire contratti intelligenti di Ethereum sicuri +description: Una panoramica delle linee guida per creare contratti intelligenti sicuri su Ethereum lang: it --- -I contratti intelligenti sono estremamente flessibili e in grado di gestire grandi quantità di valori e dati, eseguendo allo stesso tempo una logica immutata basata sul codice distribuito sulla blockchain. Questo ha dato vita a un vivace ecosistema di applicazioni senza fiducia e decentralizzate, che offrono molti vantaggi rispetto ai sistemi legacy. I contratti intelligenti rappresentano anche un'opportunità per gli utenti malevoli che provano a speculare sfruttandone le vulnerabilità. +I contratti intelligenti sono estremamente flessibili e in grado di controllare grandi quantità di valore e dati, eseguendo al contempo una logica immutabile basata sul codice distribuito sulla blockchain. Questo ha creato un vivace ecosistema di applicazioni decentralizzate e trustless che offrono molti vantaggi rispetto ai sistemi tradizionali. Rappresentano anche delle opportunità per gli aggressori che cercano di trarre profitto sfruttando le vulnerabilità nei contratti intelligenti. -Blochchain pubbliche come Ethereum rendono ancora più complessa la questione della sicurezza dei contratti intelligenti. Una volta distribuito, il codice dei contratti _di solito_ non può essere modificato per correggere falle di sicurezza. In più, le risorse rubate dai contratti intelligenti sono estremamente difficili da tracciare e praticamente irrecuperabili per via della loro immutabilità. +Le blockchain pubbliche, come [Ethereum](/), complicano ulteriormente il problema della sicurezza dei contratti intelligenti. Il codice del contratto distribuito _di solito_ non può essere modificato per correggere le falle di sicurezza, mentre gli asset rubati dai contratti intelligenti sono estremamente difficili da rintracciare e per lo più irrecuperabili a causa dell'immutabilità. -Anche se i dati possono variare, si stima che l'ammontare totale di valore rubato o perduto a causa di falle di sicurezza nei contratti intelligenti superi facilmente $1 miliardo. In questo sono inclusi incidenti rilievo come la [violazione della DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 milioni di ETH rubati, per un valore superiore a $1 miliardo al prezzo attuale), la [violazione del portafoglio multi-firma di Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) ($30 milioni sottratti dagli hacker), e la questione del [portafoglio Parity congelato](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (più di $300 milioni di ETH bloccati per sempre). +Sebbene le cifre varino, si stima che l'importo totale del valore rubato o perso a causa di difetti di sicurezza nei contratti intelligenti superi facilmente il miliardo di dollari. Questo include incidenti di alto profilo, come l'[attacco informatico alla DAO](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 milioni di ETH rubati, per un valore di oltre 1 miliardo di dollari ai prezzi odierni), l'[attacco informatico al portafoglio multifirma di Parity](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (30 milioni di dollari persi a causa degli hacker) e il [problema del portafoglio congelato di Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (oltre 300 milioni di dollari in ETH bloccati per sempre). -Per via di tutte queste problematiche, è imperativo per gli sviluppatori investire risorse nella costruzione di contratti intelligenti sicuri, robusti e resilienti. La sicurezza dei contratti intelligenti è una questione seria, su cui ogni sviluppatore farebbe bene a informarsi. Questa guida tratterà alcune considerazioni sulla sicurezza rivolte agli sviluppatori Ethereum ed esaminerà le risorse per migliorare la sicurezza dei contratti intelligenti. +I problemi sopracitati rendono imperativo per gli sviluppatori investire sforzi nella creazione di contratti intelligenti sicuri, robusti e resilienti. La sicurezza dei contratti intelligenti è una questione seria, che ogni sviluppatore farà bene a imparare. Questa guida tratterà le considerazioni sulla sicurezza per gli sviluppatori di Ethereum ed esplorerà le risorse per migliorare la sicurezza dei contratti intelligenti. ## Prerequisiti {#prerequisites} -Assicurati di avere familiarità con le [basi di programmazione di contratti intelligenti](/developers/docs/smart-contracts/) prima di affrontare la questione sicurezza. +Assicurati di avere familiarità con i [fondamenti dello sviluppo di contratti intelligenti](/developers/docs/smart-contracts/) prima di affrontare la sicurezza. -## Linee guida per costruire contratti intelligenti di Ethereum sicuri {#smart-contract-security-guidelines} +## Linee guida per creare contratti intelligenti di Ethereum sicuri {#smart-contract-security-guidelines} -### 1. Progetta controlli di accesso adeguati {#design-proper-access-controls} +### 1. Progettare controlli di accesso adeguati {#design-proper-access-controls} -Nei contratti intelligenti, le funzioni contrassegnate da `public` o `external` possono essere chiamate da qualsiasi conto posseduto esternamente (EOA) o da un conto contratto. È necessario specificare la visibilità pubblica per le funzioni se si desidera che altri interagiscano con il contratto. Le funzioni contrassegnate da `private` invece possono essere chiamate solo da funzioni all'interno del contratto intelligente e non da conti esterni. Dare a ogni partecipante della rete l'accesso alle funzioni del contratto può causare problemi, soprattutto se ciò implica che chiunque possa eseguire operazioni sensibili (ad esempio, coniare nuovi token). +Nei contratti intelligenti, le funzioni contrassegnate come `public` o `external` possono essere chiamate da qualsiasi account controllato esternamente (EOA) o account di contratto. Specificare la visibilità pubblica per le funzioni è necessario se si desidera che altri interagiscano con il proprio contratto. Le funzioni contrassegnate come `private`, tuttavia, possono essere chiamate solo da funzioni all'interno del contratto intelligente e non da account esterni. Dare a ogni partecipante della rete l'accesso alle funzioni del contratto può causare problemi, specialmente se significa che chiunque può eseguire operazioni sensibili (ad es., coniare nuovi token). -Per prevenire l'uso non autorizzato di funzioni di contratti intelligenti, è necessario implementare controlli di accesso sicuri. I meccanismi di controlli di accesso limitano la possibilità di utilizzare determinate funzioni in un contratto intelligente a soggetti approvati, come i conti responsabili della gestione del contratto. Il **modello Ownable** e il **controllo basato sul ruolo** sono due modelli utili per implementare il controllo di access nei contratti intelligenti: +Per prevenire l'uso non autorizzato delle funzioni del contratto intelligente, è necessario implementare controlli di accesso sicuri. I meccanismi di controllo degli accessi limitano la capacità di utilizzare determinate funzioni in un contratto intelligente a entità approvate, come gli account responsabili della gestione del contratto. Il **modello Ownable** e il **controllo basato sui ruoli** sono due modelli utili per implementare il controllo degli accessi nei contratti intelligenti: #### Modello Ownable {#ownable-pattern} -Nel modello Ownable, un indirizzo è impostato come “proprietario” del contratto durante il processo di creazione del contratto. Alle funzioni protette viene assegnato un modificatore `OnlyOwner` che garantisce che il contratto autentichi l'identità dell'indirizzo chiamante prima di eseguire la funzione. Le chiamate a funzioni protette che provengono da altri indirizzi a parte il proprietario del contratto sono sempre respinte, impedendo accessi indesiderati. +Nel modello Ownable, un indirizzo viene impostato come "proprietario" (owner) del contratto durante il processo di creazione del contratto. Alle funzioni protette viene assegnato un modificatore `OnlyOwner`, che assicura che il contratto autentichi l'identità dell'indirizzo chiamante prima di eseguire la funzione. Le chiamate alle funzioni protette da altri indirizzi diversi dal proprietario del contratto vengono sempre annullate (revert), impedendo accessi indesiderati. -#### Controllo di accesso basato sul ruolo {#role-based-access-control} +#### Controllo degli accessi basato sui ruoli {#role-based-access-control} -Registrare un unico indirizzo come `Owner` in un contratto intelligente introduce un rischio di centralizzazione e rappresenta un punto di errore unico. Se le chiavi del conto del proprietario sono compromesse, gli aggressori possono attaccare il contratto proprietario. Questo è il motivo per cui utilizzare un modello di controllo di accesso basato su ruoli con più conti amministrativi potrebbe essere un'opzione migliore. +Registrare un singolo indirizzo come `Owner` in un contratto intelligente introduce il rischio di centralizzazione e rappresenta un singolo punto di vulnerabilità (single point-of-failure). Se le chiavi dell'account del proprietario vengono compromesse, gli aggressori possono attaccare il contratto posseduto. Questo è il motivo per cui l'utilizzo di un modello di controllo degli accessi basato sui ruoli con più account amministrativi potrebbe essere un'opzione migliore. -Nel controllo di accesso basato sui ruoli, l'accesso alle funzioni sensibili è distribuito in un gruppo di partecipanti fidati. Per esempio, un conto può essere responsabile della coniazione di token, mentre un altro esegue gli aggiornamenti o interrompe il contratto. Decentralizzare in questo modo il controllo di accesso elimina punti di errore unici e riduce il bisogno di ipotesi di fiducia per gli utenti. +Nel controllo degli accessi basato sui ruoli, l'accesso alle funzioni sensibili è distribuito tra un insieme di partecipanti fidati. Ad esempio, un account potrebbe essere responsabile di coniare token, mentre un altro account esegue aggiornamenti o mette in pausa il contratto. Decentralizzare il controllo degli accessi in questo modo elimina i singoli punti di vulnerabilità e riduce le presunzioni di fiducia per gli utenti. -##### Uso dei portafogli multifirma +##### Utilizzo di portafogli multifirma -Un altro approccio utile per implementare un controllo di accesso sicuro è utilizzare un [conto multifirma](/developers/docs/smart-contracts/#multisig) nella gestione di un contratto. A differenza di un comune EOA, i conti multifirma sono di proprietà di più entità e richiedono un numero minimo di firme da parte di più conti - solitamente da 3 a 5 - per eseguire transazioni. +Un altro approccio per implementare un controllo degli accessi sicuro è l'utilizzo di un [account multifirma](/developers/docs/smart-contracts/#multisig) per gestire un contratto. A differenza di un normale EOA, gli account multifirma sono di proprietà di più entità e richiedono le firme di un numero minimo di account (ad esempio 3 su 5) per eseguire le transazioni. -L'utilizzo di un multifirma per il controllo di accesso introduce un ulteriore livello di sicurezza, dal momento che le azioni effettuate sul contratto di destinazione richiedono il consenso di più parti. Ciò è particolarmente utile nei casi in cui è necessario fare uso del modello Ownable, in quanto sarà più di difficile per un aggressore esterno o un insider ostile manipolare le funzioni sensibili del contratto per scopi malevoli. +L'utilizzo di un multifirma per il controllo degli accessi introduce un ulteriore livello di sicurezza poiché le azioni sul contratto di destinazione richiedono il consenso di più parti. Ciò è particolarmente utile se è necessario utilizzare il modello Ownable, in quanto rende più difficile per un aggressore o un insider disonesto manipolare le funzioni sensibili del contratto per scopi dannosi. -### 2. Usa le istruzioni require(), assert(), e revert() per sorvegliare le operazioni del contratto {#use-require-assert-revert} +### 2. Utilizzare le istruzioni require(), assert() e revert() per proteggere le operazioni del contratto {#use-require-assert-revert} -Come accennato, chiunque potrà chiamare funzioni pubbliche nel tuo contratto intelligente una volta che questo sarà distribuito sulla blockchain. Poiché è impossibile sapere in anticipo come i conti esterni interagiranno con un contratto, l'ideale è implementare, prima della distribuzione, misure di salvaguardia interne nei confronti di operazioni sensibili. È possibile imporre un comportamento corretto nei contratti intelligenti utilizzando le istruzioni `require()`, `assert()` e `revert()` per attivare eccezioni e annullare le modifiche dello stato se l'esecuzione non soddisfa determinati requisiti. +Come accennato, chiunque può chiamare funzioni pubbliche nel tuo contratto intelligente una volta che è stato distribuito sulla blockchain. Poiché non puoi sapere in anticipo come gli account esterni interagiranno con un contratto, è ideale implementare salvaguardie interne contro operazioni problematiche prima della distribuzione. Puoi imporre un comportamento corretto nei contratti intelligenti utilizzando le istruzioni `require()`, `assert()` e `revert()` per attivare eccezioni e annullare le modifiche di stato se l'esecuzione non soddisfa determinati requisiti. -**`require()`**: le istruzioni `require` sono definite all'inizio della funzione e assicurano che siano soddisfatte condizioni predefinite prima che venga eseguita la funzione chiamata. Un'istruzione `require` è utilizzabile per convalidare gli input dell'utente, controllare le variabili di stato o autenticare l'identità del conto chiamante, prima di procedere con una funzione. +**`require()`**: i `require` sono definiti all'inizio delle funzioni e assicurano che le condizioni predefinite siano soddisfatte prima che la funzione chiamata venga eseguita. Un'istruzione `require` può essere utilizzata per convalidare gli input dell'utente, controllare le variabili di stato o autenticare l'identità dell'account chiamante prima di procedere con una funzione. -**`assert()`**: `assert()` è usata per rilevare gli errori interni e verificare le violazioni delle "invarianti" nel tuo codice. Un'invariante è un'asserzione logica sullo stato di un contratto, che dovrebbe rimanere valida per tutte le esecuzioni della funzione. Un esempio di invariante è la fornitura o saldo massimo totale del contratto di un token. Usare `assert()` garantisce che il tuo contratto non raggiunga mai uno stato vulnerabile e, se lo fa, tutte le modifiche alle variabili di stato sono annullate. +**`assert()`**: `assert()` viene utilizzato per rilevare errori interni e verificare la presenza di violazioni di "invarianti" nel codice. Un invariante è un'asserzione logica sullo stato di un contratto che dovrebbe rimanere vera per tutte le esecuzioni di funzioni. Un esempio di invariante è l'offerta totale massima o il saldo di un contratto di token. L'utilizzo di `assert()` assicura che il tuo contratto non raggiunga mai uno stato vulnerabile e, se lo fa, tutte le modifiche alle variabili di stato vengono annullate. -**`revert()`**: `revert()` è utilizzabile in un'istruzione if-else che innesca un'eccezione se la condizione necessaria non è soddisfatta. Il seguente esempio di contratto utilizza `revert()` per proteggere l'esecuzione delle funzioni: +**`revert()`**: `revert()` può essere utilizzato in un'istruzione if-else che attiva un'eccezione se la condizione richiesta non è soddisfatta. Il contratto di esempio seguente utilizza `revert()` per proteggere l'esecuzione delle funzioni: ``` pragma solidity ^0.8.4; @@ -70,89 +70,89 @@ contract VendingMachine { } ``` -### 3. Testa i contratti intelligenti e verifica la correttezza del codice {#test-smart-contracts-and-verify-code-correctness} +### 3. Testare i contratti intelligenti e verificare la correttezza del codice {#test-smart-contracts-and-verify-code-correctness} -L'immutabilità del codice in esecuzione sulla [Macchina Virtuale di Ethereum](/developers/docs/evm/) fa sì che i contratti intelligenti richiedano un livello superiore di valutazione della qualità durante la fase di sviluppo. Testare ampiamente il tuo contratto e osservarlo per cogliere qualsiasi risultato imprevisto ne migliorerà considerevolmente la sicurezza e proteggerà i tuoi utenti sul lungo periodo. +L'immutabilità del codice in esecuzione nella [macchina virtuale di Ethereum](/developers/docs/evm/) significa che i contratti intelligenti richiedono un livello più elevato di valutazione della qualità durante la fase di sviluppo. Testare ampiamente il tuo contratto e osservarlo per eventuali risultati imprevisti migliorerà notevolmente la sicurezza e proteggerà i tuoi utenti a lungo termine. -Il metodo consueto prevede di scrivere piccole unità di prova utilizzando i dati di simulazione che il contratto dovrebbe ricevere dagli utenti. La conduzione di [unit test](/developers/docs/smart-contracts/testing/#unit-testing) contribuisce a testare la funzionalità di certe funzioni e assicurarsi che un contratto intelligente funzioni come previsto. +Il metodo usuale è scrivere piccoli test unitari utilizzando dati fittizi (mock) che il contratto dovrebbe ricevere dagli utenti. Il [test unitario](/developers/docs/smart-contracts/testing/#unit-testing) è utile per testare la funzionalità di determinate funzioni e garantire che un contratto intelligente funzioni come previsto. -Sfortunatamente, gli unit test sono poco efficaci per migliorare la sicurezza del contratto intelligente se utilizzato in isolamento. Uno unit test potrebbe provare che una funzione sia eseguita correttamente per i dati di simulazione, ma gli unit test sono efficaci solo quanto i test scritti. Questo rende difficile rilevare i casi limite non identificati e le vulnerabilità che potrebbero spezzare la sicurezza del tuo contratto intelligente. +Sfortunatamente, il test unitario è minimamente efficace per migliorare la sicurezza dei contratti intelligenti se utilizzato in isolamento. Un test unitario potrebbe dimostrare che una funzione viene eseguita correttamente per i dati fittizi, ma i test unitari sono efficaci solo quanto i test che vengono scritti. Ciò rende difficile rilevare casi limite mancati e vulnerabilità che potrebbero compromettere la sicurezza del tuo contratto intelligente. -Un approccio migliore è combinare gli unit test con i test basati sulle proprietà, eseguiti usando l'[analisi statica e dinamica](/developers/docs/smart-contracts/testing/#static-dynamic-analysis). L'analisi statica si affida alle rappresentazioni di basso livello, come i [grafici del flusso di controllo](https://en.wikipedia.org/wiki/Control-flow_graph) e gli [alberi di sintassi astratta](https://deepsource.io/glossary/ast/) per analizzare gli stati raggiungibili del programma e i percorsi d'esecuzione. Nel mentre, le tecniche di analisi dinamica, come il [fuzzing dei contratti intelligenti](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), eseguono il codice del contratto con valori di input casuali per rilevare le operazioni che violano le proprietà di sicurezza. +Un approccio migliore è combinare il test unitario con il test basato sulle proprietà eseguito utilizzando [l'analisi statica e dinamica](/developers/docs/smart-contracts/testing/#static-dynamic-analysis). L'analisi statica si basa su rappresentazioni di basso livello, come i [grafi del flusso di controllo](https://en.wikipedia.org/wiki/Control-flow_graph) e gli [alberi sintattici astratti](https://deepsource.io/glossary/ast/) per analizzare gli stati del programma raggiungibili e i percorsi di esecuzione. Nel frattempo, le tecniche di analisi dinamica, come il [fuzzing dei contratti intelligenti](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), eseguono il codice del contratto con valori di input casuali per rilevare operazioni che violano le proprietà di sicurezza. -La [verifica formale](/developers/docs/smart-contracts/formal-verification) è un'altra tecnica per verificare le proprietà di sicurezza nei contratti intelligenti. A differenza dei test regolari, la verifica formale può dimostrare in modo conclusivo l'assenza di errori in un contratto intelligente. Ciò si ottiene creando una specifica formale che racchiuda le proprietà di sicurezza desiderate e dimostrando che un modello formale dei contratti aderisce a tale specifica. +La [verifica formale](/developers/docs/smart-contracts/formal-verification) è un'altra tecnica per verificare le proprietà di sicurezza nei contratti intelligenti. A differenza dei test regolari, la verifica formale può dimostrare in modo conclusivo l'assenza di errori in un contratto intelligente. Ciò si ottiene creando una specifica formale che cattura le proprietà di sicurezza desiderate e dimostrando che un modello formale dei contratti aderisce a questa specifica. -### 4. Richiedi una revisione indipendente del tuo codice {#get-independent-code-reviews} +### 4. Richiedere una revisione indipendente del proprio codice {#get-independent-code-reviews} -Dopo aver testato il tuo contratto, è bene richiedere ad altri di verificare il codice sorgente per qualsiasi problema di sicurezza. I test non scopriranno ogni difetto di un contratto intelligente, ma ottenere una revisione indipendente aumenta la possibilità di individuare le vulnerabilità. +Dopo aver testato il tuo contratto, è buona norma chiedere ad altri di controllare il codice sorgente per eventuali problemi di sicurezza. I test non scopriranno ogni difetto in un contratto intelligente, ma ottenere una revisione indipendente aumenta la possibilità di individuare le vulnerabilità. -#### Controlli {#audits} +#### Audit {#audits} -Commissionare il controllo di un contratto intelligente è un modo di condurre una revisione indipendente del codice. I revisori rivestono un ruolo importante nell'assicurare che i contratti intelligenti siano sicuri e liberi da difetti di qualità ed errori di progettazione. +Commissionare un audit del contratto intelligente è un modo per condurre una revisione indipendente del codice. I revisori (auditor) svolgono un ruolo importante nel garantire che i contratti intelligenti siano sicuri e privi di difetti di qualità ed errori di progettazione. -Detto ciò, dovresti evitare di trattare i controlli come una bacchetta magica. I controlli del contratto intelligente non troveranno ogni bug e sono principalmente progettati per fornire un ulteriore ciclo di revisioni, che possono aiutare a rilevare i problemi non identificati dagli sviluppatori durante lo sviluppo e test iniziali. Inoltre, dovresti seguire le migliori pratiche per lavorare con i revisori, come documentare correttamente il codice e aggiungere commenti inline, per massimizzare i benefici del controllo di un contratto intelligente. +Detto questo, dovresti evitare di trattare gli audit come una soluzione miracolosa. Gli audit dei contratti intelligenti non rileveranno ogni bug e sono progettati principalmente per fornire un ulteriore ciclo di revisioni, che può aiutare a rilevare problemi sfuggiti agli sviluppatori durante lo sviluppo e i test iniziali. Dovresti anche seguire le migliori pratiche per lavorare con i revisori, come documentare correttamente il codice e aggiungere commenti in linea, per massimizzare i vantaggi di un audit del contratto intelligente. -- [Consigli e trucchi di controllo dei contratti intelligenti](https://twitter.com/tinchoabbate/status/1400170232904400897) - _@tinchoabbate_ -- [Ottieni il massimo dal tuo controllo](https://inference.ag/blog/2023-08-14-tips/) - _Inference_ +- [Suggerimenti e trucchi per l'audit dei contratti intelligenti](https://twitter.com/tinchoabbate/status/1400170232904400897) - _@tinchoabbate_ +- [Ottieni il massimo dal tuo audit](https://inference.ag/blog/2023-08-14-tips/) - _Inference_ -#### Caccia ai bug {#bug-bounties} +#### Programmi di bug bounty {#bug-bounties} -Impostare un programma di caccia ai bug è un altro approccio per implementare le revisioni esterne del codice. Una bug bounty è una ricompensa finanziaria data a persone (solitamente hacker whitehat) che scoprono vulnerabilità in un'applicazione. +L'impostazione di un programma di bug bounty è un altro approccio per implementare revisioni del codice esterne. Un bug bounty è una ricompensa finanziaria data a individui (di solito hacker whitehat) che scoprono vulnerabilità in un'applicazione. -Quando usate propriamente, queste ricompense per la caccia ai bug incentivano i membri della community di hacker a ispezionare il tuo codice in cerca di difetti critici. Un esempio reale è il "bug del denaro infinito", che avrebbe consentito a un utente malevolo di creare un importo illimitato di Ether su [Optimism](https://www.optimism.io/), un protocollo del [livello 2](/layer-2/) eseguito su Ethereum. Fortunatamente, un hacker whitehat [ha scoperto il difetto](https://www.saurik.com/optimism.html) e informato il team, [guadagnandosi una ricca ricompensa](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). +Se utilizzati correttamente, i bug bounty incentivano i membri della comunità di hacker a ispezionare il tuo codice alla ricerca di difetti critici. Un esempio reale è il "bug dei soldi infiniti" che avrebbe permesso a un aggressore di creare una quantità illimitata di ether su [Optimism](https://www.optimism.io/), un protocollo di [livello 2](/layer-2/) in esecuzione su Ethereum. Fortunatamente, un hacker whitehat [ha scoperto il difetto](https://www.saurik.com/optimism.html) e ha informato il team, [guadagnando un ingente compenso nel processo](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). -Una strategia utile è impostare la ricompensa di un programma di caccia ai bug proporzionale all'importo di fondi in staking. Descritto come "[caccia ai bug scalare](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)", questo approccio fornisce incentivi finanziari alle persone perché divulghino responsabilmente le vulnerabilità invece di sfruttarle. +Una strategia utile è impostare il compenso di un programma di bug bounty in proporzione alla quantità di fondi in gioco. Descritto come "[bug bounty scalabile](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)", questo approccio fornisce incentivi finanziari agli individui per divulgare responsabilmente le vulnerabilità invece di sfruttarle. -### 5. Segui le migliori pratiche durante lo sviluppo del contratto intelligente {#follow-smart-contract-development-best-practices} +### 5. Seguire le migliori pratiche durante lo sviluppo dei contratti intelligenti {#follow-smart-contract-development-best-practices} -L'esistenza di controlli e ricompense per la caccia ai bug non è una scusa per non scrivere codice di alta qualità. Una buona sicurezza dei contratti intelligenti deriva da processi di progettazione e sviluppo adeguati: +L'esistenza di audit e bug bounty non ti esime dalla responsabilità di scrivere codice di alta qualità. Una buona sicurezza dei contratti intelligenti inizia seguendo processi di progettazione e sviluppo adeguati: -- Archivia tutto il codice in un sistema di controllo delle versioni, come git +- Archivia tutto il codice in un sistema di controllo della versione, come git -- Effettua tutte le modifiche al codice tramite richieste pull +- Apporta tutte le modifiche al codice tramite pull request -- Assicurati che le richieste pull abbiano almeno un revisore indipendente; se stai lavorando a un progetto da solo, valuta di trovare altri sviluppatori e di scambiare revisioni di codice +- Assicurati che le pull request abbiano almeno un revisore indipendente; se stai lavorando da solo a un progetto, considera di trovare altri sviluppatori e scambiare revisioni del codice -- Usa un [ambiente di sviluppo](/developers/docs/frameworks/) per testare, compilare e distribuire i contratti intelligenti +- Utilizza un [ambiente di sviluppo](/developers/docs/frameworks/) per testare, compilare e distribuire contratti intelligenti -- Esegui il tuo codice tramite strumenti di analisi del codice di base, come [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril e Slither. Idealmente, dovresti farlo prima della fusione di ogni richiesta pull e confrontare le differenze nell'output +- Esegui il tuo codice attraverso strumenti di analisi del codice di base, come [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril e Slither. Idealmente, dovresti farlo prima che ogni pull request venga unita e confrontare le differenze nell'output -- Assicurati che il tuo codice si compili senza errori e che il compilatore di Solidity non emetta alcun avviso +- Assicurati che il tuo codice venga compilato senza errori e che il compilatore Solidity non emetta avvisi -- Documenta correttamente il tuo codice (usando [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) e descrivi i dettagli sull'architettura del contratto in un linguaggio facile da comprendere. Questo semplificherà il controllo e la revisione del tuo codice da parte di altri. +- Documenta correttamente il tuo codice (utilizzando [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)) e descrivi i dettagli sull'architettura del contratto in un linguaggio di facile comprensione. Ciò renderà più facile per gli altri controllare e revisionare il tuo codice. -### 6. Implementa solidi piani di ripristino in caso di disastro {#implement-disaster-recovery-plans} +### 6. Implementare solidi piani di ripristino di emergenza {#implement-disaster-recovery-plans} -Progettare controlli di accesso sicuri, implementare modificatori di funzioni e altri suggerimenti possono migliorare la sicurezza dei contratti intelligenti, ma non possono escludere la possibilità di exploit dannosi. Creare contratti intelligenti sicuri richiede di "prepararsi al fallimento" e di avere un piano di ripiego per rispondere efficientemente agli attacchi. Un adeguato piano di ripristino in caso di disastro includerà alcuni o tutti i seguenti componenti: +Progettare controlli di accesso sicuri, implementare modificatori di funzione e altri suggerimenti possono migliorare la sicurezza dei contratti intelligenti, ma non possono escludere la possibilità di exploit dannosi. Costruire contratti intelligenti sicuri richiede di "prepararsi al fallimento" e avere un piano di riserva per rispondere efficacemente agli attacchi. Un piano di ripristino di emergenza adeguato incorporerà alcuni o tutti i seguenti componenti: #### Aggiornamenti del contratto {#contract-upgrades} -Sebbene i contratti intelligenti di Ethereum siano immutabili di default, è possibile ottenere un certo grado di mutabilità utilizzando dei modelli di aggiornamento. Aggiornare i contratti è necessario nel caso in cui un difetto critico renda inutilizzabile il tuo vecchio contratto e distribuire una nuova logica sia l'opzione più fattibile. +Sebbene i contratti intelligenti di Ethereum siano immutabili per impostazione predefinita, è possibile ottenere un certo grado di mutabilità utilizzando modelli di aggiornamento. L'aggiornamento dei contratti è necessario nei casi in cui un difetto critico rende inutilizzabile il tuo vecchio contratto e la distribuzione di una nuova logica è l'opzione più fattibile. -I meccanismi di aggiornamento del contratto operano diversamente, ma lo "schema del proxy" è uno degli approcci più popolari per aggiornare i contratti intelligenti. Gli [schemi del proxy](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) dividono la logica e lo stato di un'applicazione tra _due_ contratti. Il primo contratto (detto "contratto proxy") archivia le variabili di stato (es., i saldi degli utenti), mentre il secondo (detto "contratto logico") detiene il codice per l'esecuzione delle funzioni del contratto. +I meccanismi di aggiornamento del contratto funzionano in modo diverso, ma il "modello proxy" è uno degli approcci più popolari per l'aggiornamento dei contratti intelligenti. I [modelli proxy](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) dividono lo stato e la logica di un'applicazione tra _due_ contratti. Il primo contratto (chiamato 'contratto proxy') memorizza le variabili di stato (ad es., i saldi degli utenti), mentre il secondo contratto (chiamato 'contratto logico') contiene il codice per l'esecuzione delle funzioni del contratto. -I conti interagiscono con il contratto proxy, che invia le chiamate di tutte le funzioni al contratto logico utilizzando la chiamata di basso livello [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries). A differenza di una normale chiamata di messaggio, `delegatecall()` garantisce che il codice in esecuzione all'indirizzo del contratto logico sia eseguito nel contesto del contratto chiamante. Ciò significa che il contratto logico scriverà sempre sulla memoria del proxy (invece che sulla propria) e che i valori originali di `msg.sender` e `msg.value` sono preservati. +Gli account interagiscono con il contratto proxy, che invia tutte le chiamate di funzione al contratto logico utilizzando la chiamata di basso livello [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries). A differenza di una normale chiamata di messaggio, `delegatecall()` assicura che il codice in esecuzione all'indirizzo del contratto logico venga eseguito nel contesto del contratto chiamante. Ciò significa che il contratto logico scriverà sempre nell'archiviazione del proxy (invece che nella propria archiviazione) e i valori originali di `msg.sender` e `msg.value` vengono preservati. -Delegare le chiamate al contratto logico richiede l'archiviazione del suo indirizzo nella memoria del contratto proxy. Pertanto, aggiornare la logica del contratto è solo una questione di distribuire un altro contratto logico e archiviare il nuovo indirizzo nel contratto proxy. Poiché le chiamate successive al contratto proxy sono indirizzate automaticamente al nuovo contratto logico, avresti "aggiornato" il contratto senza effettivamente modificare il codice. +Delegare le chiamate al contratto logico richiede la memorizzazione del suo indirizzo nell'archiviazione del contratto proxy. Pertanto, l'aggiornamento della logica del contratto è solo questione di distribuire un altro contratto logico e memorizzare il nuovo indirizzo nel contratto proxy. Poiché le chiamate successive al contratto proxy vengono instradate automaticamente al nuovo contratto logico, avresti "aggiornato" il contratto senza modificarne effettivamente il codice. [Maggiori informazioni sull'aggiornamento dei contratti](/developers/docs/smart-contracts/upgrading/). -#### Arresto d'emergenza {#emergency-stops} +#### Arresti di emergenza {#emergency-stops} -Come accennato, i controlli e test estesi non possono verosimilmente scoprire tutti i bug in un contratto intelligente. Se una vulnerabilità appare nel tuo codice dopo la distribuzione, correggerla è impossibile perché non puoi modificare il codice in esecuzione all'indirizzo del contratto. Inoltre, i meccanismi di aggiornamento (es., schemi del proxy) potrebbero richiedere del tempo per l'implementazione (spesso richiedono l'approvazione di parti differenti), dando più tempo agli utenti malevoli di causare più danni. +Come accennato, audit e test approfonditi non possono scoprire tutti i bug in un contratto intelligente. Se una vulnerabilità appare nel tuo codice dopo la distribuzione, correggerla è impossibile poiché non puoi modificare il codice in esecuzione all'indirizzo del contratto. Inoltre, i meccanismi di aggiornamento (ad es., i modelli proxy) potrebbero richiedere tempo per essere implementati (spesso richiedono l'approvazione di diverse parti), il che dà solo agli aggressori più tempo per causare ulteriori danni. -L'opzione più drastica è implementare una funzione di "arresto d'emergenza" che blocca le chiamate alle funzioni vulnerabili in un contratto. Gli arresti d'emergenza comprendono tipicamente i seguenti componenti: +L'opzione nucleare è implementare una funzione di "arresto di emergenza" che blocca le chiamate alle funzioni vulnerabili in un contratto. Gli arresti di emergenza in genere comprendono i seguenti componenti: -1. Una variabile booleana globale che indica se il contratto intelligente è in uno stato d'arresto o no. Questa variabile è impostata a `false` durante la configurazione del contratto, ma si ripristinerà a `true` una volta arrestato il contratto. +1. Una variabile booleana globale che indica se il contratto intelligente è in uno stato di arresto o meno. Questa variabile è impostata su `false` durante la configurazione del contratto, ma tornerà a `true` una volta che il contratto viene arrestato. -2. Funzioni riferite alla variabile booleana nella loro esecuzione. Tali funzioni sono accessibili quando il contratto intelligente non è arrestata e divengono inaccessibili una volta innescata la funzionalità di arresto d'emergenza. +2. Funzioni che fanno riferimento alla variabile booleana nella loro esecuzione. Tali funzioni sono accessibili quando il contratto intelligente non è arrestato e diventano inaccessibili quando viene attivata la funzione di arresto di emergenza. -3. Un'entità avente accesso alla funzione di arresto d'emergenza, che imposta la variabile booleana a `true`. Per impedire azioni dannose, le chiamate a questa funzione possono essere limitate a un indirizzo fidato (es., il proprietario del contratto). +3. Un'entità che ha accesso alla funzione di arresto di emergenza, che imposta la variabile booleana su `true`. Per prevenire azioni dannose, le chiamate a questa funzione possono essere limitate a un indirizzo fidato (ad es., il proprietario del contratto). -Una volta che il contratto attiva l'arresto d'emergenza, certe funzioni non potranno essere chiamate. Ciò avviene avvolgendo le funzioni selezionate in un modificatore che fa riferimento alla variabile globale. Di seguito, è riportato [un esempio](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) che descrive un'implementazione di questo schema nei contratti: +Una volta che il contratto attiva l'arresto di emergenza, alcune funzioni non saranno chiamabili. Ciò si ottiene avvolgendo funzioni selezionate in un modificatore che fa riferimento alla variabile globale. Di seguito è riportato [un esempio](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) che descrive un'implementazione di questo modello nei contratti: ```solidity -// Questo codice non è stato controllato professionalmente e non fa promesse su sicurezza o correttezza. Usalo a tuo rischio. +// Questo codice non è stato sottoposto ad audit professionale e non offre alcuna garanzia di sicurezza o correttezza. Utilizzare a proprio rischio. contract EmergencyStop { @@ -169,7 +169,7 @@ contract EmergencyStop { } modifier onlyAuthorized { - // Check for authorization of msg.sender here + // Verifica l'autorizzazione di msg.sender qui _; } @@ -182,63 +182,63 @@ contract EmergencyStop { } function deposit() public payable stoppedInEmergency { - // Deposit logic happening here + // La logica di deposito avviene qui } function emergencyWithdraw() public onlyWhenStopped { - // Emergency withdraw happening here + // Il prelievo di emergenza avviene qui } } ``` -Questo esempio mostra le caratteristiche fondamentali degli arresti d'emergenza: +Questo esempio mostra le caratteristiche di base degli arresti di emergenza: -- `isStopped` è una variabile booleana che restituisce `false` all'inizio e `true` quando il contratto entra in modalità d'emergenza. +- `isStopped` è un booleano che restituisce `false` all'inizio e `true` quando il contratto entra in modalità di emergenza. -- I modificatori della funzione `onlyWhenStopped` e `stoppedInEmergency` controllano la variabile `isStopped`. `stoppedInEmergency` è usata per controllare le funzioni che non dovrebbero essere accessibili quando il contratto è vulnerabile (es., `deposit()`). Le chiamate a queste funzioni saranno semplicemente annullate. +- I modificatori di funzione `onlyWhenStopped` e `stoppedInEmergency` controllano la variabile `isStopped`. `stoppedInEmergency` viene utilizzato per controllare le funzioni che dovrebbero essere inaccessibili quando il contratto è vulnerabile (ad es., `deposit()`). Le chiamate a queste funzioni verranno semplicemente annullate. -`onlyWhenStopped` è usata per le funzioni che dovrebbero poter essere chiamate durante un'emergenza (es., `emergencyWithdraw()`). Tali funzioni possono aiutare a risolvere la situazione, da cui la loro esclusione dall'elenco delle "funzioni limitate". +`onlyWhenStopped` viene utilizzato per le funzioni che dovrebbero essere chiamabili durante un'emergenza (ad es., `emergencyWithdraw()`). Tali funzioni possono aiutare a risolvere la situazione, da qui la loro esclusione dall'elenco delle "funzioni limitate". -L'utilizzo di una funzionalità di arresto d'emergenza fornisce un palliativo efficiente per affrontare gravi vulnerabilità nel tuo contratto intelligente. Tuttavia, aumenta la necessità che gli utenti si fidino del fatto che gli sviluppatori non la attiveranno per motivi egoistici. A tal fine, decentralizzare il controllo dell'arresto d'emergenza sottoponendolo a un meccanismo di voto sulla catena, blocco temporale o a un'approvazione da un portafoglio multifirma, sono possibili soluzioni. +L'utilizzo di una funzionalità di arresto di emergenza fornisce un efficace espediente per affrontare gravi vulnerabilità nel tuo contratto intelligente. Tuttavia, aumenta la necessità per gli utenti di fidarsi degli sviluppatori affinché non la attivino per motivi egoistici. A tal fine, decentralizzare il controllo dell'arresto di emergenza sottoponendolo a un meccanismo di voto on-chain, a un blocco temporale (timelock) o all'approvazione da un portafoglio multifirma sono possibili soluzioni. #### Monitoraggio degli eventi {#event-monitoring} -Gli [eventi](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ti consentono di tracciare le chiamate alle funzioni del contratto intelligente e di monitorare le modifiche alle variabili di stato. È ideale programmare il tuo contratto intelligente in modo che emetta un evento ogni volta che una qualche parte effettua un'azione critica per la sicurezza (es., prelevare fondi). +Gli [eventi](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) ti consentono di tracciare le chiamate alle funzioni del contratto intelligente e monitorare le modifiche alle variabili di stato. È ideale programmare il tuo contratto intelligente per emettere un evento ogni volta che una parte intraprende un'azione critica per la sicurezza (ad es., il prelievo di fondi). -Registrare gli eventi e monitorarli al di fuori della catena fornisce dettagli sulle operazioni del contratto e aiuta a scoprire più velocemente le azioni malevoli. Ciò significa che il tuo team può rispondere più velocemente alle violazioni e agire per mitigare l'impatto sugli utenti, ad esempio interrompendo le funzioni o eseguendo un aggiornamento. +La registrazione degli eventi e il loro monitoraggio fuori catena forniscono informazioni sulle operazioni del contratto e aiutano a scoprire più rapidamente le azioni dannose. Ciò significa che il tuo team può rispondere più rapidamente agli hack e intraprendere azioni per mitigare l'impatto sugli utenti, come mettere in pausa le funzioni o eseguire un aggiornamento. -Puoi anche optare per uno strumento di monitoraggio standard che inoltri automaticamente degli avvisi ogni volta che qualcuno interagisce con i tuoi contratti. Questi strumenti ti consentiranno di creare avvisi personalizzati basati su diversi inneschi, come il volume delle transazioni, la frequenza delle chiamate alla funzione o le funzioni specifiche coinvolte. Ad esempio, potresti programmare un avviso che si attivi quando l'importo prelevato in una singola transazione sia superiore a una determinata soglia. +Puoi anche optare per uno strumento di monitoraggio pronto all'uso che inoltra automaticamente avvisi ogni volta che qualcuno interagisce con i tuoi contratti. Questi strumenti ti consentiranno di creare avvisi personalizzati basati su diversi trigger, come il volume delle transazioni, la frequenza delle chiamate di funzione o le funzioni specifiche coinvolte. Ad esempio, potresti programmare un avviso che arriva quando l'importo prelevato in una singola transazione supera una determinata soglia. -### 7. Progetta sistemi di governance sicuri {#design-secure-governance-systems} +### 7. Progettare sistemi di governance sicuri {#design-secure-governance-systems} -Potresti voler decentralizzare la tua applicazione dando il controllo dei contratti intelligenti ai membri della community. In questo caso, il sistema del contratto intelligente includerà un modulo di governance, ossia un meccanismo che consente ai membri della community di approvare le azioni amministrative tramite un sistema di governance sulla catena. Ad esempio, una proposta di aggiornare un contratto proxy a una nuova implementazione potrebbe esser votata dai possessori di token. +Potresti voler decentralizzare la tua applicazione cedendo il controllo dei contratti intelligenti principali ai membri della comunità. In questo caso, il sistema di contratti intelligenti includerà un modulo di governance: un meccanismo che consente ai membri della comunità di approvare azioni amministrative tramite un sistema di governance on-chain. Ad esempio, una proposta per aggiornare un contratto proxy a una nuova implementazione potrebbe essere votata dai possessori di token. -La governance decentralizzata può essere vantaggiosa, specialmente poiché si allinea agli interessi degli sviluppatori e degli utenti finali. Tuttavia, i meccanismi di governance del contratto intelligente potrebbero introdurre nuovi rischi, se implementati in modo errato. Uno scenario plausibile è se un utente malevolo acquisisce un enorme potere di voto (misurato in numero di token posseduti) chiedendo un [prestito flash](/defi/#flash-loans) e presentando una proposta dannosa. +La governance decentralizzata può essere vantaggiosa, soprattutto perché allinea gli interessi degli sviluppatori e degli utenti finali. Tuttavia, i meccanismi di governance dei contratti intelligenti possono introdurre nuovi rischi se implementati in modo errato. Uno scenario plausibile è se un aggressore acquisisce un enorme potere di voto (misurato in numero di token posseduti) stipulando un [prestito lampo (flash loan)](/defi/#flash-loans) e fa approvare una proposta dannosa. -Un modo di prevenire i problemi correlati alla governance sulla catena è [utilizzare un blocco temporale](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Un blocco temporale impedisce a un contratto intelligente di eseguire certe azioni finché non passa un dato periodo di tempo. Altre strategie includono l'assegnazione di un "peso di voto" a ogni token a seconda del tempo per cui è stato bloccato, o la misurazione del potere di voto di un indirizzo in un dato periodo storico (ad esempio, 2-3 blocchi nel passato) invece che al blocco corrente. Entrambi i metodi riducono la possibilità di accumulare rapidamente potere di voto per influire sui voti sulla catena. +Un modo per prevenire i problemi relativi alla governance on-chain è [utilizzare un blocco temporale (timelock)](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/). Un blocco temporale impedisce a un contratto intelligente di eseguire determinate azioni fino a quando non trascorre un periodo di tempo specifico. Altre strategie includono l'assegnazione di un "peso di voto" a ciascun token in base a quanto tempo è stato bloccato, o la misurazione del potere di voto di un indirizzo in un periodo storico (ad esempio, 2-3 blocchi nel passato) invece del blocco corrente. Entrambi i metodi riducono la possibilità di accumulare rapidamente potere di voto per influenzare i voti on-chain. -Maggiori informazioni sulla [progettazione di sistemi di governance sicuri](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), sui [diversi meccanismi di voto nelle DAO](https://hackernoon.com/governance-is-the-holy-grail-for-daos) e sui [vettori d'attacco comuni alle DAO che sfruttano la DeFi](https://dacian.me/dao-governance-defi-attacks) nei collegamenti condivisi. +Maggiori informazioni sulla [progettazione di sistemi di governance sicuri](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), sui [diversi meccanismi di voto nelle DAO](https://hackernoon.com/governance-is-the-holy-grail-for-daos) e sui [comuni vettori di attacco alle DAO che sfruttano la DeFi](https://dacian.me/dao-governance-defi-attacks) nei link condivisi. -### 8. Riduci al minimo la complessità nel codice {#reduce-code-complexity} +### 8. Ridurre al minimo la complessità del codice {#reduce-code-complexity} -Gli sviluppatori di software tradizionali hanno familiarità con il principio KISS ("keep it simple, stupid", letteralmente "tieniti sul semplice, stupido"), che consiglia di non introdurre complessità non necessarie nella progettazione del software. Questo segue il pensiero di vecchia data che i "sistemi complessi falliscono in modi complessi" e che siano più suscettibili a errori costosi. +Gli sviluppatori di software tradizionali hanno familiarità con il principio KISS ("keep it simple, stupid"), che sconsiglia di introdurre complessità non necessarie nella progettazione del software. Questo segue il pensiero di lunga data secondo cui "i sistemi complessi falliscono in modi complessi" e sono più suscettibili a errori costosi. -Mantenere le cose semplici è di particolare importanza nella scrittura dei contratti intelligenti, dato che i contratti intelligenti potrebbero potenzialmente controllare grandi importi di valore. Un suggerimento per ottenere la semplicità durante la scrittura dei contratti intelligenti è riutilizzare le librerie esistenti, come i [contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/), laddove possibile. Poiché queste librerie sono state controllate e testate ampiamente dagli sviluppatori, utilizzarle riduce le possibilità di introdurre bug rispetto a scrivere nuove funzionalità da zero. +Mantenere le cose semplici è di particolare importanza quando si scrivono contratti intelligenti, dato che i contratti intelligenti controllano potenzialmente grandi quantità di valore. Un suggerimento per ottenere semplicità quando si scrivono contratti intelligenti è riutilizzare le librerie esistenti, come [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), ove possibile. Poiché queste librerie sono state ampiamente controllate e testate dagli sviluppatori, il loro utilizzo riduce le possibilità di introdurre bug scrivendo nuove funzionalità da zero. -Un altro consiglio comune è scrivere piccole funzioni e mantenere i contratti modulari, dividendo la logica commerciale su più contratti. Non solo la scrittura di codice più semplice può ridurre la superficie di attacco in un contratto intelligente, ma rende anche più semplice ragionare della correttezza del sistema complessivo e rilevare precocemente possibili errori di progettazione. +Un altro consiglio comune è scrivere piccole funzioni e mantenere i contratti modulari dividendo la logica aziendale su più contratti. Scrivere codice più semplice non solo riduce la superficie di attacco in un contratto intelligente, ma rende anche più facile ragionare sulla correttezza del sistema complessivo e rilevare tempestivamente possibili errori di progettazione. -### 9. Difenditi dalle vulnerabilità comuni dei contratti intelligenti {#mitigate-common-smart-contract-vulnerabilities} +### 9. Difendersi dalle comuni vulnerabilità dei contratti intelligenti {#mitigate-common-smart-contract-vulnerabilities} -#### Rientranza {#reentrancy} +#### Rientranza (Reentrancy) {#reentrancy} -L'EVM non consente la concorrenza, il che significa che due contratti coinvolti in una chiamata di messaggio non possono essere eseguiti simultaneamente. Una chiamata esterna interrompe l'esecuzione e la memoria del contratto chiamante fino al ritorno della chiamata, dopodiché l'esecuzione procede normalmente. Questo processo può essere formalmente descritto come il trasferimento del [flusso di controllo](https://www.computerhope.com/jargon/c/contflow.htm) a un altro contratto. +L'EVM non consente la concorrenza, il che significa che due contratti coinvolti in una chiamata di messaggio non possono essere eseguiti contemporaneamente. Una chiamata esterna mette in pausa l'esecuzione e la memoria del contratto chiamante fino al ritorno della chiamata, a quel punto l'esecuzione procede normalmente. Questo processo può essere formalmente descritto come il trasferimento del [flusso di controllo](https://www.computerhope.com/jargon/c/contflow.htm) a un altro contratto. -Sebbene per lo più innocuo, il trasferimento del flusso di controllo a contratti non fidati può causare dei problemi, come la rientranza. Un attacco di rientranza si verifica quando un contratto malevolo viene richiamato in un contratto vulnerabile prima che l'invocazione della funzione originale sia completa. Questo tipo di attacco può essere spiegato meglio con un esempio. +Sebbene per lo più innocuo, il trasferimento del flusso di controllo a contratti non attendibili può causare problemi, come la rientranza. Un attacco di rientranza si verifica quando un contratto dannoso richiama un contratto vulnerabile prima che l'invocazione della funzione originale sia completata. Questo tipo di attacco è meglio spiegato con un esempio. -Considera un contratto intelligente semplice ('Victim') che consenta a chiunque di depositare e prelevare Ether: +Considera un semplice contratto intelligente ('Victim') che consente a chiunque di depositare e prelevare ether: ```solidity -// Questo contratto è vulnerabile. Non utilizzarlo in produzione +// Questo contratto è vulnerabile. Non utilizzare in produzione contract Victim { mapping (address => uint256) public balances; @@ -256,15 +256,15 @@ contract Victim { } ``` -Questo contratto espone una funzione `withdraw()` per consentire agli utenti di prelevare gli ETH precedentemente depositati nel contratto. Elaborando un prelievo, il contratto esegue le seguenti operazioni: +Questo contratto espone una funzione `withdraw()` per consentire agli utenti di prelevare gli ETH precedentemente depositati nel contratto. Durante l'elaborazione di un prelievo, il contratto esegue le seguenti operazioni: -1. Controlla il saldo di ETH dell'utente +1. Controlla il saldo in ETH dell'utente 2. Invia i fondi all'indirizzo chiamante -3. Ripristina il loro saldo a 0, impedendo ulteriori prelievi dall'utente +3. Azzera il loro saldo a 0, impedendo ulteriori prelievi da parte dell'utente -La funzione `withdraw()` nel contratto `Victim` segue uno schema di "controlli-interazioni-effetti". _Verifica_ se le condizioni necessarie per l'esecuzione sono soddisfatte (cioè, se l'utente ha un saldo di ETH positivo) ed esegue l'_interazione_ inviando gli ETH all'indirizzo del chiamante, prima di applicare gli _effetti_ della transazione (cioè, ridurre il saldo dell'utente). +La funzione `withdraw()` nel contratto `Victim` segue un modello "controlli-interazioni-effetti" (checks-interactions-effects). _Controlla_ se le condizioni necessarie per l'esecuzione sono soddisfatte (ovvero, l'utente ha un saldo in ETH positivo) ed esegue l'_interazione_ inviando ETH all'indirizzo del chiamante, prima di applicare gli _effetti_ della transazione (ovvero, riducendo il saldo dell'utente). -Se `withdraw()` viene chiamato da un conto posseduto esternamente (EOA), la funzione si esegue come previsto: `msg.sender.call.value()` invia gli ETH al chiamante. Tuttavia, se `msg.sender` è un conto del contratto intelligente e chiama `withdraw()`, inviare i fondi utilizzando `msg.sender.call.value()` innescherà anche l'esecuzione del codice archiviato a quell'indirizzo. +Se `withdraw()` viene chiamata da un account controllato esternamente (EOA), la funzione viene eseguita come previsto: `msg.sender.call.value()` invia ETH al chiamante. Tuttavia, se `msg.sender` è un account di contratto intelligente che chiama `withdraw()`, l'invio di fondi utilizzando `msg.sender.call.value()` attiverà anche l'esecuzione del codice memorizzato a quell'indirizzo. Immagina che questo sia il codice distribuito all'indirizzo del contratto: @@ -285,32 +285,32 @@ Immagina che questo sia il codice distribuito all'indirizzo del contratto: Questo contratto è progettato per fare tre cose: -1. Accettare un deposito da un altro conto (probabilmente l'EOA dell'utente malevolo) +1. Accettare un deposito da un altro account (probabilmente l'EOA dell'aggressore) 2. Depositare 1 ETH nel contratto Victim -3. Prelevare 1 ETH archiviato nel contratto intelligente +3. Prelevare l'1 ETH memorizzato nel contratto intelligente -Non c'è nulla di sbagliato qui, tranne il fatto che l'`Attacker` ha un'altra funzione che chiama nuovamente `withdraw()` in `Victim` se il gas rimanente da `msg.sender.call.value` in entrata è superiore a 40.000. Questo consente all'`Attacker` di rientrare nel contratto `Victim` e di prelevare ulteriori fondi, _prima_ del completamento della prima invocazione di `withdraw`. Il ciclo somiglia al seguente: +Non c'è niente di sbagliato qui, tranne che `Attacker` ha un'altra funzione che chiama di nuovo `withdraw()` in `Victim` se il gas rimasto dal `msg.sender.call.value` in entrata è superiore a 40.000. Ciò dà ad `Attacker` la capacità di rientrare in `Victim` e prelevare più fondi _prima_ che la prima invocazione di `withdraw` sia completata. Il ciclo si presenta così: ```solidity -- L'EOA dell'Attacker chiama `Attacker.beginAttack()` con 1 ETH -- `Attacker.beginAttack()` deposita 1 ETH in `Victim` -- `Attacker` chiama `withdraw() in `Victim` -- `Victim` controlla il saldo di `Attacker` (1 ETH) -- `Victim` invia 1 ETH ad `Attacker` (che innesca la funzione di default) -- `Attacker` chiama di nuovo `Victim.withdraw()` (si noti che `Victim` non ha ridotto il saldo di `Attacker` dopo il primo prelievo) -- `Victim` controlla il saldo di `Attacker` (che è ancora 1 ETH perché non ha applicato gli effetti della prima chiamata) -- `Victim` invia 1 ETH ad `Attacker` (che innesca la funzione di default e consente ad `Attacker` di rientrare nella funzione `withdraw`) -- Il processo si ripete finché `Attacker` rimane senza gas; a quel punto `msg.sender.call.value` ritorna senza innescare alcun prelievo ulteriore -- `Victim` infine applica i risultati della prima transazione (e delle successive) al proprio stato, così che il saldo di `Attacker` è impostato su 0 +- Attacker's EOA calls `Attacker.beginAttack()` with 1 ETH +- `Attacker.beginAttack()` deposits 1 ETH into `Victim` +- `Attacker` calls `withdraw() in `Victim` +- `Victim` checks `Attacker`’s balance (1 ETH) +- `Victim` sends 1 ETH to `Attacker` (which triggers the default function) +- `Attacker` calls `Victim.withdraw()` again (note that `Victim` hasn’t reduced `Attacker`’s balance from the first withdrawal) +- `Victim` checks `Attacker`’s balance (which is still 1 ETH because it hasn’t applied the effects of the first call) +- `Victim` sends 1 ETH to `Attacker` (which triggers the default function and allows `Attacker` to reenter the `withdraw` function) +- The process repeats until `Attacker` runs out of gas, at which point `msg.sender.call.value` returns without triggering additional withdrawals +- `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0 ``` -Riepilogando: poiché il saldo del chiamante non è impostato a 0 fino al completamento dell'esecuzione della funzione, le invocazioni successive avranno successo, consentendo al chiamante di prelevare il proprio saldo numerose volte. Questo tipo di attacco è utilizzabile per sottrarre a un contratto intelligente i suoi fondi, come è avvenuto nella [violazione della DAO del 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Gli attacchi di rientranza sono ancora oggi un problema critico per i contratti intelligenti, come mostrato dagli [elenchi pubblici di exploit di rientranza](https://github.com/pcaversaccio/reentrancy-attacks). +Il riassunto è che poiché il saldo del chiamante non viene impostato a 0 fino al completamento dell'esecuzione della funzione, le invocazioni successive avranno esito positivo e consentiranno al chiamante di prelevare il proprio saldo più volte. Questo tipo di attacco può essere utilizzato per prosciugare i fondi di un contratto intelligente, come è successo nell'[hack della DAO del 2016](https://www.coindesk.com/learn/understanding-the-dao-attack). Gli attacchi di rientranza sono ancora oggi un problema critico per i contratti intelligenti, come mostrano gli [elenchi pubblici di exploit di rientranza](https://github.com/pcaversaccio/reentrancy-attacks). ##### Come prevenire gli attacchi di rientranza -Un approccio per affrontare la rientranza è seguire lo [schema di controlli-effetti-interazioni](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Questo schema ordina l'esecuzione delle funzioni in modo che il codice che esegue i controlli necessari prima di procedere all'esecuzione venga per primo, seguito dal codice che manipola lo stato del contratto e il codice che interagisce con gli altri contratti o EOA per ultimo. +Un approccio per affrontare la rientranza è seguire il [modello controlli-effetti-interazioni](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern). Questo modello ordina l'esecuzione delle funzioni in modo tale che il codice che esegue i controlli necessari prima di procedere con l'esecuzione venga per primo, seguito dal codice che manipola lo stato del contratto, con il codice che interagisce con altri contratti o EOA che arriva per ultimo. -Lo schema di controlli-effetti-interazioni è utilizzato in una versione rivista del contratto `Victim`, mostrato di seguito: +Il modello controlli-effetti-interazioni viene utilizzato in una versione rivista del contratto `Victim` mostrata di seguito: ```solidity contract NoLongerAVictim { @@ -323,9 +323,9 @@ contract NoLongerAVictim { } ``` -Questo contratto esegue un _controllo_ sul saldo dell'utente, applica gli _effetti_ della funzione `withdraw()` (ripristinando il saldo dell'utente a 0), e procede all'esecuzione dell'_interazione_ (inviando gli ETH all'indirizzo dell'utente). Questo garantisce che il contratto aggiorni la propria memoria prima della chiamata esterna, eliminando la condizione di rientranza che ha consentito il primo attacco. Il contratto `Attacker` potrebbe ancora richiamare in `NoLongerAVictim`, ma poiché `balances[msg.sender]` è stata impostata a 0, ulteriori prelievi genereranno un errore. +Questo contratto esegue un _controllo_ sul saldo dell'utente, applica gli _effetti_ della funzione `withdraw()` (azzerando il saldo dell'utente a 0) e procede a eseguire l'_interazione_ (inviando ETH all'indirizzo dell'utente). Ciò assicura che il contratto aggiorni la sua archiviazione prima della chiamata esterna, eliminando la condizione di rientranza che ha consentito il primo attacco. Il contratto `Attacker` potrebbe ancora richiamare `NoLongerAVictim`, ma poiché `balances[msg.sender]` è stato impostato a 0, ulteriori prelievi genereranno un errore. -Un'altra opzione è utilizzare un blocco di esclusione reciproca (comunemente descritto come "mutex"), che blocca una porzione dello stato di un contratto fino al completamento dell'invocazione di una funzione. Questo è implementato utilizzando una variabile booleana impostata a `true` prima dell'esecuzione della funzione e ripristinata a `false` dopo l'invocazione. Come si può vedere nell'esempio seguente, l'utilizzo di un mutex protegge una funzione dalle chiamate ricorsive mentre l'invocazione originale è ancora in elaborazione, interrompendo efficientemente la rientranza. +Un'altra opzione è utilizzare un blocco di mutua esclusione (comunemente descritto come "mutex") che blocca una parte dello stato di un contratto fino al completamento dell'invocazione di una funzione. Questo viene implementato utilizzando una variabile booleana che viene impostata su `true` prima dell'esecuzione della funzione e torna a `false` dopo che l'invocazione è terminata. Come si vede nell'esempio seguente, l'utilizzo di un mutex protegge una funzione dalle chiamate ricorsive mentre l'invocazione originale è ancora in elaborazione, fermando efficacemente la rientranza. ```solidity pragma solidity ^0.7.0; @@ -340,13 +340,13 @@ contract MutexPattern { _; locked = false; } - // This function is protected by a mutex, so reentrant calls from within `msg.sender.call` cannot call `withdraw` again. - // L'istruzione `return` risulta in `true`, pur valutando l'istruzione `locked = false` nel modificatore + // Questa funzione è protetta da un mutex, quindi le chiamate rientranti dall'interno di `msg.sender.call` non possono chiamare di nuovo `withdraw`. + // L'istruzione `return` restituisce `true` ma valuta comunque l'istruzione `locked = false` nel modificatore function withdraw(uint _amount) public payable noReentrancy returns(bool) { - require(balances[msg.sender] >= _amount, "Nessun saldo da prelevare."); + require(balances[msg.sender] >= _amount, "No balance to withdraw."); balances[msg.sender] -= _amount; - bool (success, ) = msg.sender.call{value: _amount}(""); + (bool success, ) = msg.sender.call{value: _amount}(""); require(success); return true; @@ -354,32 +354,32 @@ contract MutexPattern { } ``` -Puoi anche utilizzare un sistema di [pagamenti pull](https://docs.openzeppelin.com/contracts/5.x/api/utils#security#PullPayment), che richiede agli utenti di prelevare i fondi dai contratti intelligenti, invece di un sistema di "pagamenti push", che invia i fondi ai conti. Ciò rimuove la possibilità di innescare inavvertitamente il codice a indirizzi sconosciuti (e può anche impedire determinati attacchi denial-of-service). +Puoi anche utilizzare un sistema di [pagamenti pull](https://docs.openzeppelin.com/contracts/5.x/api/utils#security#PullPayment) che richiede agli utenti di prelevare fondi dai contratti intelligenti, invece di un sistema di "pagamenti push" che invia fondi agli account. Ciò rimuove la possibilità di attivare inavvertitamente codice a indirizzi sconosciuti (e può anche prevenire determinati attacchi denial-of-service). -#### Sottoeccedenze e sovraflussi di interi {#integer-underflows-and-overflows} +#### Underflow e overflow di interi {#integer-underflows-and-overflows} -Il sovraflusso di un intero si verifica quando i risultati di un'operazione aritmetica ricadono al di fuori dell'intervallo accettabile di valori, causandone un "ripristino" al valore più basso rappresentabile. Ad esempio, un `uint8` può memorizzare solo i valori fino a 2^8-1=255. Le operazioni automatiche che risultano in valori superiori a `255` eccederanno e ripristineranno `uint` a `0`, analogamente a come il contachilometri di un'auto si ripristina a zero una volta raggiunto il chilometraggio massimo (999999). +Un overflow di interi si verifica quando i risultati di un'operazione aritmetica non rientrano nell'intervallo di valori accettabile, facendolo "riavvolgere" al valore rappresentabile più basso. Ad esempio, un `uint8` può memorizzare solo valori fino a 2^8-1=255. Le operazioni aritmetiche che producono valori superiori a `255` andranno in overflow e ripristineranno `uint` a `0`, in modo simile a come il contachilometri di un'auto si azzera a 0 una volta raggiunto il chilometraggio massimo (999999). -Le sottoeccedenze di interi si verificano per motivi simili: i risultati di un'operazione aritmetica ricadono al di sotto dell'intervallo accettabile. Diciamo che hai provato a ridurre `0` in un `uint8`, il risultato sarebbe semplicemente il ripristino al valore massimo rappresentabile (`255`). +Gli underflow di interi si verificano per motivi simili: i risultati di un'operazione aritmetica scendono al di sotto dell'intervallo accettabile. Supponiamo che tu abbia provato a decrementare `0` in un `uint8`, il risultato si riavvolgerebbe semplicemente al valore massimo rappresentabile (`255`). -Sia le sottoeccedenze che i sovraflussi di interi possono comportare modifiche impreviste alle variabili di stato di un contratto e risultare nell'esecuzione non pianificata. Di seguito è riportato un esempio che mostra come un utente malevolo può sfruttare il sovraflusso aritmetico in un contratto intelligente per eseguire un'operazione non valida: +Sia gli overflow che gli underflow di interi possono portare a modifiche impreviste alle variabili di stato di un contratto e provocare un'esecuzione non pianificata. Di seguito è riportato un esempio che mostra come un aggressore può sfruttare l'overflow aritmetico in un contratto intelligente per eseguire un'operazione non valida: ``` pragma solidity ^0.7.6; -// Questo contratto è progettato per agire da caveau temporale. -// L'utente può depositare in questo contratto, ma non può prelevare per almeno una settimana. -// L'utente può inoltre estendere il tempo di attesa oltre il periodo di attesa di 1 settimana. +// This contract is designed to act as a time vault. +// User can deposit into this contract but cannot withdraw for at least a week. +// User can also extend the wait time beyond the 1 week waiting period. /* -1. Distribuisci TimeLock -2. Distribuisci Attack con l'indirizzo di TimeLock -3. Chiama Attack.attack inviando 1 ether. Potrai immediatamente - prelevare i tuoi ether. - -Cos'è successo? -L'attacco ha causato il sovraflusso di TimeLock.lockTime ed è riuscito a prelevare -prima del periodo di attesa di 1 settimana. +1. Deploy TimeLock +2. Deploy Attack with address of TimeLock +3. Call Attack.attack sending 1 ether. You will immediately be able to + withdraw your ether. + +What happened? +Attack caused the TimeLock.lockTime to overflow and was able to withdraw +before the 1 week waiting period. */ contract TimeLock { @@ -396,14 +396,14 @@ contract TimeLock { } function withdraw() public { - require(balances[msg.sender] > 0, "Fondi insufficienti"); - require(block.timestamp > lockTime[msg.sender], "Tempo di blocco non scaduto"); + require(balances[msg.sender] > 0, "Insufficient funds"); + require(block.timestamp > lockTime[msg.sender], "Lock time not expired"); uint amount = balances[msg.sender]; balances[msg.sender] = 0; (bool sent, ) = msg.sender.call{value: amount}(""); - require(sent, "Impossibile inviare Ether"); + require(sent, "Failed to send Ether"); } } @@ -419,7 +419,7 @@ contract Attack { function attack() public payable { timeLock.deposit{value: msg.value}(); /* - if t = tempo di blocco corrente, allora dobbiamo trovare x tale che + if t = current lock time then we need to find x such that x + t = 2**256 = 0 so x = -t 2**256 = type(uint).max + 1 @@ -433,133 +433,133 @@ contract Attack { } ``` -##### Come prevenire sottoeccedenze e sovraflussi di interi +##### Come prevenire underflow e overflow di interi -Dalla versione 0.8.0, il compilatore di Solidity rifiuta il codice risultante in sottoeccedenze e sovraflussi di interi. Tuttavia, i contratti compilati con una versione inferiore del compilatore dovrebbero eseguire controlli sulle funzioni che comportano operazioni aritmetiche, oppure utilizzare una libreria (es., [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) che controlli sottoeccedenze/sovraflussi. +A partire dalla versione 0.8.0, il compilatore Solidity rifiuta il codice che genera underflow e overflow di interi. Tuttavia, i contratti compilati con una versione del compilatore inferiore dovrebbero eseguire controlli sulle funzioni che coinvolgono operazioni aritmetiche o utilizzare una libreria (ad es., [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) che controlla la presenza di underflow/overflow. -#### Manipolazione degli oracoli {#oracle-manipulation} +#### Manipolazione dell'oracolo {#oracle-manipulation} -Gli [oracoli](/developers/docs/oracles/) si procurano le informazioni al di fuori della catena e le inviano sulla catena per l'uso dai contratti intelligenti. Con gli oracoli puoi progettare dei contratti intelligenti che interagiscono con sistemi esterni alla catena, come i mercati dei capitali, espandendo notevolmente la loro applicazione. +Gli [oracoli](/developers/docs/oracles/) reperiscono informazioni fuori catena e le inviano on-chain affinché i contratti intelligenti le utilizzino. Con gli oracoli, puoi progettare contratti intelligenti che interagiscono con sistemi fuori catena, come i mercati dei capitali, espandendo notevolmente la loro applicazione. -Ma se l'oracolo è corrotto e invia informazioni errate sulla catena, i contratti intelligenti saranno eseguiti sulla base di input errati, il che può causare problemi. Questa è la base del "problema degli oracoli", che riguarda il compito di assicurarsi che le informazioni provenienti da un oracolo della blockchain siano accurate, aggiornate e tempestive. +Ma se l'oracolo è corrotto e invia informazioni errate on-chain, i contratti intelligenti verranno eseguiti in base a input errati, il che può causare problemi. Questa è la base del "problema dell'oracolo", che riguarda il compito di assicurarsi che le informazioni provenienti da un oracolo della blockchain siano accurate, aggiornate e tempestive. -Un problema di sicurezza correlato è l'utilizzo di un oracolo sulla catena, come uno scambio decentralizzato, per ottenere il prezzo a pronti per un bene. Le piattaforme di prestito nell'industria della [finanza decentralizzata (DeFi)](/defi/) lo fanno spesso per determinare il valore della garanzia di un utente, per determinare quanto possa prendere in prestito. +Un problema di sicurezza correlato è l'utilizzo di un oracolo on-chain, come un exchange decentralizzato, per ottenere il prezzo spot di un asset. Le piattaforme di prestito nel settore della [finanza decentralizzata (DeFi)](/defi/) lo fanno spesso per determinare il valore della garanzia di un utente per stabilire quanto può prendere in prestito. -I prezzi del DEX sono spesso accurati, in gran parte a causa degli arbitri che ripristinano la parità nei mercati. Tuttavia, sono aperti alla manipolazione, in particolare se l'oracolo sulla catena calcola i prezzi dei beni sulla base degli schemi di negoziazione storici (come di solito accade). +I prezzi dei DEX sono spesso accurati, in gran parte grazie agli arbitraggisti che ripristinano la parità nei mercati. Tuttavia, sono aperti alla manipolazione, in particolare se l'oracolo on-chain calcola i prezzi degli asset in base a modelli di trading storici (come di solito accade). -Ad esempio, un utente malevolo potrebbe pompare artificialmente il prezzo a pronti di un bene richiedendo un prestito flash poco prima di interagire con il tuo contratto di prestito. L'interrogazione del DEX per sapere il prezzo del bene restituirebbe un valore superiore al normale (a causa del grande "ordine d'acquisto" dell'utente malevolo, distorcendo la domanda per il bene), consentendogli di prendere in prestito più del dovuto. Tali "attacchi di prestito flash" sono stati utilizzati per sfruttare la dipendenza dagli oracoli dei prezzi tra le applicazioni DeFi, costando ai protocolli milioni in fondi perduti. +Ad esempio, un aggressore potrebbe pompare artificialmente il prezzo spot di un asset stipulando un prestito lampo (flash loan) subito prima di interagire con il tuo contratto di prestito. Interrogare il DEX per il prezzo dell'asset restituirebbe un valore superiore al normale (a causa del grande "ordine di acquisto" dell'aggressore che distorce la domanda per l'asset), consentendogli di prendere in prestito più di quanto dovrebbe. Tali "attacchi di prestito lampo" sono stati utilizzati per sfruttare la dipendenza dagli oracoli di prezzo tra le applicazioni DeFi, costando ai protocolli milioni in fondi persi. -##### Come prevenire la manipolazione degli oracoli +##### Come prevenire la manipolazione dell'oracolo -Il requisito minimo per [evitare la manipolazione dell'oracolo](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) è utilizzare una rete di oracoli decentralizzati per richiedere informazioni da più fonti per evitare punti di errore unici. In gran parte dei casi, gli oracoli decentralizzati contengono incentivi criptoeconomici integrati per incoraggiare i nodi dell'oracolo a segnalare le informazioni corrette, rendendoli più sicuri rispetto agli oracoli centralizzati. +Il requisito minimo per [evitare la manipolazione dell'oracolo](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) è utilizzare una rete di oracoli decentralizzata che interroga le informazioni da più fonti per evitare singoli punti di vulnerabilità. Nella maggior parte dei casi, gli oracoli decentralizzati hanno incentivi criptoeconomici integrati per incoraggiare i nodi dell'oracolo a riportare informazioni corrette, rendendoli più sicuri degli oracoli centralizzati. -Se prevedi di interrogare un oracolo sulla catena per conoscere i prezzi dei beni, valuta di utilizzarne uno che implementi un meccanismo di prezzo medio ponderato per il tempo (TWAP). Un [oracolo TWAP](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) interroga il prezzo di un bene in due momenti differenti (che puoi modificare) e calcola il prezzo a pronti a seconda della media ottenuta. La scelta di periodi di tempo più lunghi protegge il tuo protocollo dalla manipolazione dei prezzi poiché i grandi ordini eseguiti di recente non possono influire sui prezzi dei beni. +Se prevedi di interrogare un oracolo on-chain per i prezzi degli asset, considera di utilizzarne uno che implementi un meccanismo di prezzo medio ponderato nel tempo (TWAP). Un [oracolo TWAP](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) interroga il prezzo di un asset in due diversi momenti nel tempo (che puoi modificare) e calcola il prezzo spot in base alla media ottenuta. La scelta di periodi di tempo più lunghi protegge il tuo protocollo dalla manipolazione dei prezzi poiché i grandi ordini eseguiti di recente non possono influire sui prezzi degli asset. -## Risorse di sicurezza dei contratti intelligenti per sviluppatori {#smart-contract-security-resources-for-developers} +## Risorse sulla sicurezza dei contratti intelligenti per gli sviluppatori {#smart-contract-security-resources-for-developers} ### Strumenti per analizzare i contratti intelligenti e verificare la correttezza del codice {#code-analysis-tools} -- **[Strumenti e librerie di test](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)**: _raccolta di strumenti e librerie standard per eseguire unit test, analisi statiche e dinamiche sui contratti intelligenti._ +- **[Strumenti e librerie di test](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _Raccolta di strumenti e librerie standard del settore per eseguire test unitari, analisi statica e analisi dinamica sui contratti intelligenti._ -- **[Strumenti di verifica formale](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)**: _strumenti per verificare la correttezza funzionale nei contratti intelligenti e controllare le invarianti._ +- **[Strumenti di verifica formale](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** - _Strumenti per verificare la correttezza funzionale nei contratti intelligenti e controllare gli invarianti._ -- **[Servizi di controllo dei contratti intelligenti](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)**: _elenco di organizzazioni che forniscono servizi di controllo dei contratti intelligenti per progetti di sviluppo per Ethereum._ +- **[Servizi di auditing dei contratti intelligenti](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _Elenco di organizzazioni che forniscono servizi di auditing dei contratti intelligenti per i progetti di sviluppo su Ethereum._ -- **[Piattaforme di bug bounty](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)**: _piattaforme per coordinare le ricompense per la segnalazione di bug e ricompensare la divulgazione responsabile delle vulnerabilità critiche nei contratti intelligenti._ +- **[Piattaforme di bug bounty](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _Piattaforme per coordinare i bug bounty e ricompensare la divulgazione responsabile di vulnerabilità critiche nei contratti intelligenti._ -- **[Fork Checker](https://forkchecker.hashex.org/)**: _uno strumento online gratuito per verificare tutte le informazioni disponibili riguardanti un contratto diramato._ +- **[Fork Checker](https://forkchecker.hashex.org/)** - _Uno strumento online gratuito per controllare tutte le informazioni disponibili riguardo a un contratto biforcato._ -- **[ABI Encoder](https://abi.hashex.org/)**: _un servizio online gratuito per la codifica delle funzioni e degli argomenti del costruttore del tuo contratto in Solidity._ +- **[ABI Encoder](https://abi.hashex.org/)** - _Un servizio online gratuito per codificare le funzioni del tuo contratto Solidity e gli argomenti del costruttore._ -- **[Aderyn](https://github.com/Cyfrin/aderyn)**: _analizzatore statico di Solidity che attraversa gli alberi di sintassi astratta (AST) per individuare le vulnerabilità sospette e restituire i problemi in un formato Markdown facilmente fruibile._ +- **[Aderyn](https://github.com/Cyfrin/aderyn)** - _Analizzatore statico per Solidity, che attraversa gli Alberi Sintattici Astratti (AST) per individuare vulnerabilità sospette e stampare i problemi in un formato markdown facile da consultare._ -### Strumenti per monitorare i contratti intelligenti {#smart-contract-monitoring-tools} +### Strumenti per il monitoraggio dei contratti intelligenti {#smart-contract-monitoring-tools} -- **[Tenderly Real-Time Alerting](https://tenderly.co/alerting/)**: _uno strumento per ricevere notifiche in tempo reale quando si verificano eventi insoliti o imprevisti sui tuoi contratti intelligenti o portafogli._ +- **[Tenderly Real-Time Alerting](https://tenderly.co/monitoring)** - _Uno strumento per ricevere notifiche in tempo reale quando si verificano eventi insoliti o inaspettati sui tuoi contratti intelligenti o portafogli._ ### Strumenti per l'amministrazione sicura dei contratti intelligenti {#smart-contract-administration-tools} -- **[Safe](https://safe.global/)**: _portafoglio del contratto intelligente eseguito su Ethereum, che richiede un numero minimo di persone per approvare una transazione prima che possa verificarsi (M di N)._ +- **[Safe](https://safe.global/)** - _Portafoglio di contratti intelligenti in esecuzione su Ethereum che richiede un numero minimo di persone per approvare una transazione prima che possa avvenire (M-di-N)._ -- **[Contratti OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/)**: _librerie dei contratti per implementare funzionalità amministrative, inclusa la proprietà del contratto, aggiornamenti, controlli di accesso, governance, interruzioni e altro._ +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** - _Librerie di contratti per implementare funzionalità amministrative, tra cui la proprietà del contratto, gli aggiornamenti, i controlli di accesso, la governance, la possibilità di pausa e altro ancora._ -### Servizi di controllo dei contratti intelligenti {#smart-contract-auditing-services} +### Servizi di auditing dei contratti intelligenti {#smart-contract-auditing-services} -- **[ConsenSys Diligence](https://consensys.net/diligence/)**: _servizio di controllo dei contratti intelligenti che aiuta i progetti sull'ecosistema della blockchain ad assicurare che i loro protocolli siano pronti al lancio e creati per proteggere gli utenti._ +- **[ConsenSys Diligence](https://diligence.consensys.io/)** - _Servizio di auditing dei contratti intelligenti che aiuta i progetti in tutto l'ecosistema blockchain ad assicurarsi che i loro protocolli siano pronti per il lancio e costruiti per proteggere gli utenti._ -- **[CertiK](https://www.certik.com/)**: _società di sicurezza Blockchain pionieristica nell'uso della tecnologia di verifica formale all'avanguardia sui contratti intelligenti e sulle reti blockchain._ +- **[CertiK](https://www.certik.com/)** - _Azienda di sicurezza blockchain pioniera nell'uso di tecnologie di verifica formale all'avanguardia sui contratti intelligenti e sulle reti blockchain._ -- **[Trail of Bits](https://www.trailofbits.com/)**: _società di cybersicurezza che combina la ricerca sulla sicurezza con una mentalità da utente malevolo per ridurre i rischi e fortificare il codice._ +- **[Trail of Bits](https://www.trailofbits.com/)** - _Azienda di sicurezza informatica che combina la ricerca sulla sicurezza con una mentalità da attaccante per ridurre i rischi e fortificare il codice._ -- **[PeckShield](https://peckshield.com/)**: _società di sicurezza della blockchain che offre prodotti e servizi per la sicurezza, la privacy e l'usabilità dell'intero ecosistema blockchain._ +- **[PeckShield](https://peckshield.com/)** - _Azienda di sicurezza blockchain che offre prodotti e servizi per la sicurezza, la privacy e l'usabilità dell'intero ecosistema blockchain._ -- **[QuantStamp](https://quantstamp.com/)**: _servizio di controllo che facilita l'adozione mainstream della tecnologia della blockchain attraverso servizi di sicurezza e valutazione dei rischi._ +- **[QuantStamp](https://quantstamp.com/)** - _Servizio di auditing che facilita l'adozione di massa della tecnologia blockchain attraverso servizi di sicurezza e valutazione dei rischi._ -- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)**: _società di sicurezza dei contratti intelligenti che fornisce controlli di sicurezza per i sistemi distribuiti_ +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _Azienda di sicurezza dei contratti intelligenti che fornisce audit di sicurezza per sistemi distribuiti._ -- **[Runtime Verification](https://runtimeverification.com/)**: _società di sicurezza specializzata nella modellazione formale e nella verifica dei contratti intelligenti._ +- **[Runtime Verification](https://runtimeverification.com/)** - _Azienda di sicurezza specializzata nella modellazione formale e nella verifica dei contratti intelligenti._ -- **[Hacken](https://hacken.io)**: _Controllore della cybersicurezza in Web3 che porta un approccio a 360 gradi alla sicurezza della blockchain._ +- **[Hacken](https://hacken.io)** - _Revisore di sicurezza informatica web3 che porta un approccio a 360 gradi alla sicurezza della blockchain._ -- **[](https://www.nethermind.io/smart-contract-audits)**: _servizi di controllo in Solidity e Carico che garantiscono l'integrità dei contratti intelligenti e la sicurezza degli utenti nell'ecosistema Ethereum e Starknet._ +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Servizi di auditing per Solidity e Cairo, che garantiscono l'integrità dei contratti intelligenti e la sicurezza degli utenti su Ethereum e Starknet._ -- **[HashEx](https://hashex.org/)**: _HashEx è incentrata sul controllo della blockchain e dei controlli intelligenti allo scopo di garantire la sicurezza delle criptovalute, fornendo servizi come lo sviluppo di contratti intelligenti, test di penetrazione o consulenza sulla blockchain._ +- **[HashEx](https://hashex.org/)** - _HashEx si concentra sull'auditing della blockchain e dei contratti intelligenti per garantire la sicurezza delle criptovalute, fornendo servizi come lo sviluppo di contratti intelligenti, test di penetrazione e consulenza blockchain._ -- **[Code4rena](https://code4rena.com/)**: _piattaforma di controllo competitiva che incentiva gli esperti di sicurezza dei contratti intelligenti a trovare le vulnerabilità e ad aiutare a rendere il Web3 più sicuro._ +- **[Code4rena](https://code4rena.com/)** - _Piattaforma di audit competitiva che incentiva gli esperti di sicurezza dei contratti intelligenti a trovare vulnerabilità e contribuire a rendere il web3 più sicuro._ -- **[CodeHawks](https://codehawks.com/)**: _piattaforma di controllo competitiva che ospita competizioni di controllo dei contratti intelligenti per ricercatori della sicurezza._ +- **[CodeHawks](https://codehawks.com/)** - _Piattaforma di audit competitiva che ospita competizioni di auditing dei contratti intelligenti per i ricercatori di sicurezza._ -- **[Cyfrin](https://cyfrin.io)**: _motore di sicurezza per Web3, che incuba la criptosicurezza tramite prodotti e servizi di controllo dei contratti intelligenti._ +- **[Cyfrin](https://cyfrin.io)** - _Potenza della sicurezza web3, che incuba la sicurezza crittografica attraverso prodotti e servizi di auditing dei contratti intelligenti._ -- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)**: _studio di sicurezza del Web3 che offre controlli di sicurezza per i sistemi della blockchain tramite un team di revisori esperti e strumenti di prim'ordine._ +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _Azienda di sicurezza web3 che offre audit di sicurezza per sistemi blockchain attraverso un team di revisori esperti e strumenti di prim'ordine._ -- **[Oxorio](https://oxor.io/)**: _servizi di controllo dei contratti intelligenti e sicurezza della blockchain con esperienza nell'EVM, in Solidity, tecnologie tra catene per cripto-aziende e progetti di DeFi._ +- **[Oxorio](https://oxor.io/)** - _Audit di contratti intelligenti e servizi di sicurezza blockchain con esperienza in EVM, Solidity, ZK e tecnologie cross-chain per aziende crittografiche e progetti DeFi._ -- **[Inference](https://inference.ag/)**: _azienda di controllo della sicurezza, specializzata nel controllo dei contratti intelligenti per le blockchain basate sull'EVM. Grazie ai suoi esperti revisori, identifica le potenziali problematiche e suggerisce le soluzioni attuabili per risoverle prima della distribuzione._ +- **[Inference](https://inference.ag/)** - _Azienda di auditing di sicurezza, specializzata nell'auditing di contratti intelligenti per blockchain basate su EVM. Grazie ai suoi revisori esperti, identificano potenziali problemi e suggeriscono soluzioni attuabili per risolverli prima della distribuzione._ ### Piattaforme di bug bounty {#bug-bounty-platforms} -- **[Immunefi](https://immunefi.com/)**: _piattaforma di bug bounty per contratti intelligenti e progetti di DeFi, in cui i ricercatori revisionano il codice, divulgano le vulnerabilità, vengono pagati e rendono le criptovalute più sicure._ +- **[Immunefi](https://immunefi.com/)** - _Piattaforma di bug bounty per contratti intelligenti e progetti DeFi, dove i ricercatori di sicurezza esaminano il codice, divulgano le vulnerabilità, vengono pagati e rendono le criptovalute più sicure._ -- **[HackerOne](https://www.hackerone.com/)**: _piattaforma di coordinamento delle vulnerabilità e di bug bounty che connette le aziende ai tester di penetrazione e ai ricercatori sulla cybersicurezza._ +- **[HackerOne](https://www.hackerone.com/)** - _Piattaforma di coordinamento delle vulnerabilità e bug bounty che connette le aziende con penetration tester e ricercatori di sicurezza informatica._ -- **[HackenProof](https://hackenproof.com/)**: _piattaforma esperta di bug bounty per progetti di criptovalute (DeFi, contratti intelligenti, portafogli, CEX e altro), in cui dei professionisti della sicurezza forniscono servizi di triage e i ricercatori sono pagati per segnalazioni di bug rilevanti e verificate._ +- **[HackenProof](https://hackenproof.com/)** - _Piattaforma esperta di bug bounty per progetti crittografici (DeFi, contratti intelligenti, portafogli, CEX e altro), dove i professionisti della sicurezza forniscono servizi di triage e i ricercatori vengono pagati per segnalazioni di bug rilevanti e verificate._ -- **[Sherlock](https://www.sherlock.xyz/)**: _sottoscrittore in Web3 per la sicurezza dei contratti intelligenti, con pagamenti per i revisori gestiti tramite contratti intelligenti per assicurarsi che i bug rilevanti siano pagati equamente._ +- **[Sherlock](https://www.sherlock.xyz/)** - _Sottoscrittore nel web3 per la sicurezza dei contratti intelligenti, con pagamenti per i revisori gestiti tramite contratti intelligenti per garantire che i bug rilevanti vengano pagati equamente._ -- **[CodeHawks](https://www.codehawks.com/)**: _piattaforma competitiva di caccia ai bug in cui i revisori prendono parte a gare e sfide di sicurezza e (presto) ai propri controlli privati._ +- **[CodeHawks](https://www.codehawks.com/)** - _Piattaforma competitiva di bug bounty in cui i revisori partecipano a concorsi e sfide di sicurezza e (presto) ai propri audit privati._ -### Pubblicazioni di vulnerabilità e sfruttamenti noti dei contratti intelligenti {#common-smart-contract-vulnerabilities-and-exploits} +### Pubblicazioni di vulnerabilità ed exploit noti dei contratti intelligenti {#common-smart-contract-vulnerabilities-and-exploits} -- **[ConsenSys: attacchi noti ai contratti intelligenti](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)**: _spiegazione per principianti delle vulnerabilità più significative dei contratti, con esempi di codice per gran parte dei casi._ +- **[ConsenSys: Smart Contract Known Attacks](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** - _Spiegazione adatta ai principianti delle vulnerabilità più significative dei contratti, con codice di esempio per la maggior parte dei casi._ -- **[Registro SWC](https://swcregistry.io/)**: _elenco curato di elementi di enumerazione delle debolezze comuni (CWE) che si applicano ai contratti intelligenti di Ethereum._ +- **[SWC Registry](https://swcregistry.io/)** - _Elenco curato di elementi della Common Weakness Enumeration (CWE) che si applicano ai contratti intelligenti di Ethereum._ -- **[Rekt](https://rekt.news/)**: _pubblicazione aggiornata regolarmente di violazioni e sfruttamenti di alto profilo delle criptovalute, con report postumi dettagliati._ +- **[Rekt](https://rekt.news/)** - _Pubblicazione regolarmente aggiornata di hack ed exploit crittografici di alto profilo, insieme a rapporti post-mortem dettagliati._ -### Sfide per imparare sulla sicurezza dei contratti intelligenti {#challenges-for-learning-smart-contract-security} +### Sfide per imparare la sicurezza dei contratti intelligenti {#challenges-for-learning-smart-contract-security} -- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)**: _elenco curato di wargame di sicurezza della blockchain, sfide e competizioni di [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) e soluzioni._ +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _Elenco curato di wargame sulla sicurezza della blockchain, sfide e competizioni [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) e resoconti delle soluzioni._ -- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)**: _wargame per apprendere la sicurezza offensiva dei contratti intelligenti della Defi e creare abilità di caccia ai bug e controllo di sicurezza._ +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _Wargame per imparare la sicurezza offensiva dei contratti intelligenti DeFi e sviluppare competenze nella caccia ai bug e nell'auditing di sicurezza._ -- **[Ethernaut](https://ethernaut.openzeppelin.com/)**: _wargame basato su Web3/Solidity in cui ogni livello è un contratto intelligente da 'violare'._ +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _Wargame basato su web3/Solidity in cui ogni livello è un contratto intelligente che deve essere "hackerato"._ -- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)**: _sfida di violazione dei contratti intelligenti, ambientata in un'avventura fantasy. Inoltre, il completamento della sfida fornisce l'accesso a un programma privato di caccia ai bug._ +- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** - _Sfida di hacking di contratti intelligenti, ambientata in un'avventura fantasy. Il completamento con successo della sfida dà anche accesso a un programma privato di bug bounty._ ### Migliori pratiche per proteggere i contratti intelligenti {#smart-contract-security-best-practices} -- **[ConsenSys: migliori pratiche sulla sicurezza dei contratti intelligenti di Ethereum](https://consensys.github.io/smart-contract-best-practices/)**: _elenco completo di linee guida per proteggere i contratti intelligenti di Ethereum._ +- **[ConsenSys: Ethereum Smart Contract Security Best Practices](https://consensys.github.io/smart-contract-best-practices/)** - _Elenco completo di linee guida per proteggere i contratti intelligenti di Ethereum._ -- **[Nascent: semplice kit di strumenti di sicurezza](https://github.com/nascentxyz/simple-security-toolkit)**: _raccolta di pratiche guide e liste di controllo incentrate sulla sicurezza per lo sviluppo dei contratti intelligenti._ +- **[Nascent: Simple Security Toolkit](https://github.com/nascentxyz/simple-security-toolkit)** - _Raccolta di guide pratiche incentrate sulla sicurezza e liste di controllo per lo sviluppo di contratti intelligenti._ -- **[Schemi di Solidity](https://fravoll.github.io/solidity-patterns/)**: _utile raccolta di schemi sicuri e migliori pratiche per il linguaggio di programmazione di contratti intelligenti Solidity._ +- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** - _Utile raccolta di modelli sicuri e migliori pratiche per il linguaggio di programmazione dei contratti intelligenti Solidity._ -- **[Documentazione di Solidity: considerazioni sulla sicurezza](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)**: _linee guida per la scrittura di contratti intelligenti sicuri con Solidity._ +- **[Solidity Docs: Security Considerations](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Linee guida per scrivere contratti intelligenti sicuri con Solidity._ -- **[Standard di verifica della sicurezza dei contratti intelligenti](https://github.com/securing/SCSVS)**: _lista di controllo in quattordici parti, creata per standardizzare la sicurezza dei contratti intelligenti per sviluppatori, architetti, revisori di sicurezza e fornitori._ +- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** - _Lista di controllo in quattordici parti creata per standardizzare la sicurezza dei contratti intelligenti per sviluppatori, architetti, revisori della sicurezza e fornitori._ -- **[Impara sulla sicurezza e il controllo dei contratti intelligenti](https://updraft.cyfrin.io/courses/security): _corso definitivo sulla sicurezza e il controllo dei contratti intelligenti, creato per gli sviluppatori di contratti intelligenti che desiderano migliorare le proprie migliori pratiche di sicurezza e diventare ricercatori della sicurezza._ +- **[Learn Smart Contract Security and Auditing](https://updraft.cyfrin.io/courses/security)** - _Corso definitivo sulla sicurezza e l'auditing dei contratti intelligenti, creato per gli sviluppatori di contratti intelligenti che desiderano migliorare le loro migliori pratiche di sicurezza e diventare ricercatori di sicurezza._ ### Tutorial sulla sicurezza dei contratti intelligenti {#tutorials-on-smart-contract-security} @@ -569,8 +569,8 @@ Se prevedi di interrogare un oracolo sulla catena per conoscere i prezzi dei ben - [Come usare Manticore per trovare bug nei contratti intelligenti](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [Linee guida di sicurezza per i contratti intelligenti](/developers/tutorials/smart-contract-security-guidelines/) +- [Linee guida sulla sicurezza dei contratti intelligenti](/developers/tutorials/smart-contract-security-guidelines/) -- [Come integrare in sicurezza il tuo contratto dei token con token arbitrari](/developers/tutorials/token-integration-checklist/) +- [Come integrare in modo sicuro il tuo contratto di token con token arbitrari](/developers/tutorials/token-integration-checklist/) -- [Cyfrin Updraft: corso completo sulla sicurezza e il controllo dei contratti intelligenti](https://updraft.cyfrin.io/courses/security) +- [Cyfrin Updraft - Corso completo sulla sicurezza e l'auditing dei contratti intelligenti](https://updraft.cyfrin.io/courses/security) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md index c7f08300518..e0dc29ba8cf 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/testing/index.md @@ -1,62 +1,62 @@ --- title: Testare i contratti intelligenti -description: Una panoramica delle tecniche e considerazioni per testare i contratti intelligenti di Ethereum. +description: Una panoramica delle tecniche e delle considerazioni per testare i contratti intelligenti di Ethereum. lang: it --- -Le blockchain pubbliche come Ethereum sono immutabili, il che rende difficile modificare il codice di un contratto intelligente dopo la sua distribuzione. Esistono dei [modelli di aggiornamento dei contratti](/developers/docs/smart-contracts/upgrading/) per eseguire "aggiornamenti virtuali", ma sono difficili da implementare e richiedono il consenso sociale. Inoltre, un aggiornamento può risolvere un errore solo _dopo_ che è stato scoperto; se un utente malevolo scopre per primo la vulnerabilità, il tuo contratto intelligente rischierà di essere sfruttato. +Le blockchain pubbliche come Ethereum sono immutabili, il che rende difficile modificare il codice di un contratto intelligente dopo la distribuzione. Esistono [modelli di aggiornamento dei contratti](/developers/docs/smart-contracts/upgrading/) per eseguire "aggiornamenti virtuali", ma sono difficili da implementare e richiedono il consenso sociale. Inoltre, un aggiornamento può correggere un errore solo _dopo_ che è stato scoperto: se un utente malintenzionato scopre prima la vulnerabilità, il tuo contratto intelligente è a rischio di exploit. -Per questi motivi, testare i contratti intelligenti prima della [distribuzione](/developers/docs/smart-contracts/deploying/) alla Rete Principale è un requisito minimo per la [sicurezza](/developers/docs/smart-contracts/security/). Esistono molte tecniche per testare i contratti e valutare la correttezza del codice; ciò che scegli dipende dalle tue esigenze. Tuttavia, una suite di test composta da strumenti e approcci differenti è ideale per individuare le falle di sicurezza sia minori che maggiori nel codice dei contratti. +Per questi motivi, testare i contratti intelligenti prima di [distribuirli](/developers/docs/smart-contracts/deploying/) sulla rete principale è un requisito minimo per la [sicurezza](/developers/docs/smart-contracts/security/). Esistono molte tecniche per testare i contratti e valutare la correttezza del codice; la scelta dipende dalle tue esigenze. Tuttavia, una suite di test composta da strumenti e approcci diversi è l'ideale per individuare falle di sicurezza sia minori che maggiori nel codice del contratto. ## Prerequisiti {#prerequisites} -Questa pagina spiega come testare i contratti intelligenti prima della distribuzione sulla rete di Ethereum. Parte dal presupposto che tu abbia familiarità con i [contratti intelligenti](/developers/docs/smart-contracts/). +Questa pagina spiega come testare i contratti intelligenti prima di distribuirli sulla rete Ethereum. Presuppone che tu abbia familiarità con i [contratti intelligenti](/developers/docs/smart-contracts/). -## In cosa consistono i test dei contratti intelligenti? {#what-is-smart-contract-testing} +## Cos'è il test dei contratti intelligenti? {#what-is-smart-contract-testing} -I test dei contratti intelligenti sono il procedimento per verificare che il codice di un contratto intelligente funzioni come previsto. I test sono utili per verificare se uno specifico contratto intelligente soddisfa i requisiti di affidabilità, utilizzabilità e sicurezza. +Il test dei contratti intelligenti è il processo di verifica che il codice di un contratto intelligente funzioni come previsto. I test sono utili per verificare se un particolare contratto intelligente soddisfa i requisiti di affidabilità, usabilità e sicurezza. -Sebbene gli approcci possano variare, gran parte dei metodi di test richiedono l'esecuzione di un contratto intelligente con un piccolo campione dei dati che si prevede dovrà gestire. Se il contratto produce risultati corretti per i dati del campione, si presume che funzioni correttamente. Gran parte degli strumenti di test fornisce risorse per scrivere ed eseguire i [casi d'uso](https://en.m.wikipedia.org/wiki/Test_case) per verificare se l'esecuzione dei contratti corrisponde ai risultati previsti. +Sebbene gli approcci varino, la maggior parte dei metodi di test richiede l'esecuzione di un contratto intelligente con un piccolo campione dei dati che dovrebbe gestire. Se il contratto produce risultati corretti per i dati campione, si presume che funzioni correttamente. La maggior parte degli strumenti di test fornisce risorse per scrivere ed eseguire [casi di test](https://en.m.wikipedia.org/wiki/Test_case) per verificare se l'esecuzione di un contratto corrisponde ai risultati previsti. ### Perché è importante testare i contratti intelligenti? {#importance-of-testing-smart-contracts} -Poiché i contratti intelligenti gestiscono spesso risorse finanziarie dal valore elevato, gli errori minori di programmazione possono causare, e spesso causano, [enormi perdite per gli utenti](https://rekt.news/leaderboard/). Test rigorosi possono, tuttavia, aiutarti a scoprire i difetti e i problemi nel codice di un contratto intelligente in anticipo, e correggerli prima del lancio sulla Rete Principale. +Poiché i contratti intelligenti gestiscono spesso asset finanziari di alto valore, errori di programmazione minori possono portare, e spesso portano, a [perdite massicce per gli utenti](https://rekt.news/leaderboard/). Test rigorosi possono, tuttavia, aiutarti a scoprire tempestivamente difetti e problemi nel codice di un contratto intelligente e a risolverli prima del lancio sulla rete principale. -Sebbene sia possibile aggiornare un contratto se viene scoperto un bug, gli aggiornamenti sono complessi e possono [risultare in errori](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) se gestiti impropriamente. L'aggiornamento di un contratto nega ulteriormente il principio di immutabilità, gravando sugli utenti con ulteriori ipotesi di fiducia. Viceversa, un piano completo per testare il tuo contratto mitiga i rischi di sicurezza del contratto intelligente, riducendo l'esigenza di eseguire complessi aggiornamenti alla logica dopo la distribuzione. +Sebbene sia possibile aggiornare un contratto se viene scoperto un bug, gli aggiornamenti sono complessi e possono [causare errori](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) se gestiti in modo improprio. L'aggiornamento di un contratto nega ulteriormente il principio di immutabilità e grava gli utenti di ulteriori presupposti di fiducia. Al contrario, un piano completo per testare il tuo contratto mitiga i rischi per la sicurezza dei contratti intelligenti e riduce la necessità di eseguire complessi aggiornamenti logici dopo la distribuzione. ## Metodi per testare i contratti intelligenti {#methods-for-testing-smart-contracts} -I metodi per testare i contratti intelligenti di Ethereum ricadono in due ampie categorie: **test automatizzati** e **test manuali**. I test automatizzati e manuali offrono vantaggi e compromessi unici, ma puoi combinarli per creare un piano robusto di analisi dei tuoi contratti. +I metodi per testare i contratti intelligenti di Ethereum rientrano in due grandi categorie: **test automatizzati** e **test manuali**. I test automatizzati e i test manuali offrono vantaggi e compromessi unici, ma puoi combinarli entrambi per creare un piano robusto per l'analisi dei tuoi contratti. ### Test automatizzati {#automated-testing} -I test automatizzati utilizzano strumenti che controllano automaticamente il codice di un contratto intelligente alla ricerca di errori durante l'esecuzione. Il vantaggio dei test automatizzati deriva dall'utilizzo di [script](https://www.techtarget.com/whatis/definition/script?amp=1) per guidare la valutazione delle funzionalità del contratto. I test basati su script sono pianificabili per essere eseguiti ripetutamente con un minimo intervento umano, rendendoli più efficienti degli approcci manuali al test. +I test automatizzati utilizzano strumenti che controllano automaticamente il codice di un contratto intelligente per individuare errori di esecuzione. Il vantaggio dei test automatizzati deriva dall'uso di [script](https://www.techtarget.com/whatis/definition/script?amp=1) per guidare la valutazione delle funzionalità del contratto. I test basati su script possono essere programmati per essere eseguiti ripetutamente con un intervento umano minimo, rendendo i test automatizzati più efficienti rispetto agli approcci manuali. -I test automatizzati sono particolarmente utili quando sono ripetitivi e richiedono tempo, difficili da svolgere manualmente, suscettibili all'errore umano, o coinvolgono la valutazione delle funzioni critiche del contratto. Ma gli strumenti di test automatizzati possono comportare svantaggi: potrebbero non identificare certi bug e produrre molti [falsi positivi](https://www.contrastsecurity.com/glossary/false-positive). Dunque, associare ai test automatizzati dei test manuali per i contratti intelligenti è ideale. +I test automatizzati sono particolarmente utili quando i test sono ripetitivi e dispendiosi in termini di tempo; difficili da eseguire manualmente; suscettibili di errore umano; o comportano la valutazione di funzioni critiche del contratto. Ma gli strumenti di test automatizzati possono presentare degli svantaggi: potrebbero non rilevare determinati bug e produrre molti [falsi positivi](https://www.contrastsecurity.com/glossary/false-positive). Pertanto, l'abbinamento di test automatizzati con test manuali per i contratti intelligenti è l'ideale. ### Test manuali {#manual-testing} -I test manuali sono assistiti dall'uomo e comportano l'esecuzione di ogni caso di prova nella tua suite di test, l'uno dopo l'altro, analizzando la correttezza di un contratto intelligente. Questo si distingue dai test automatizzati, in cui puoi eseguire simultaneamente diversi test isolati su un contratto e ottenere un report che mostri tutti i test falliti e superati. +I test manuali sono assistiti dall'uomo e comportano l'esecuzione di ogni caso di test nella tua suite di test uno dopo l'altro durante l'analisi della correttezza di un contratto intelligente. Questo è diverso dai test automatizzati in cui puoi eseguire simultaneamente più test isolati su un contratto e ottenere un rapporto che mostra tutti i test falliti e superati. -I test manuali sono eseguibili da un singolo individuo che segue un piano testuale scritto che copre diversi scenari di test. Inoltre, come parte dei test manuali potresti far interagire diversi individui o gruppi con un contratto intelligente durante un periodo specificato. I collaudatori confronteranno il comportamento effettivo del contratto con quello previsto, segnalando qualsiasi differenza come un bug. +I test manuali possono essere eseguiti da un singolo individuo seguendo un piano di test scritto che copre diversi scenari di test. Potresti anche far interagire più individui o gruppi con un contratto intelligente per un periodo specificato come parte dei test manuali. I tester confronteranno il comportamento effettivo del contratto con il comportamento previsto, segnalando qualsiasi differenza come un bug. -I test manuali efficaci richiedono considerevoli risorse (abilità, tempo, denaro e sforzo) ed è possibile, a causa di errori umani, non identificare certi errori eseguendo i test. Ma i test manuali possono anche essere vantaggiosi, ad esempio un collaudatore umano (es. un revisore) potrebbe utilizzare l'intuito per rilevare i casi limite che non sarebbero identificati da uno strumento di test automatizzato. +Test manuali efficaci richiedono notevoli risorse (competenze, tempo, denaro e impegno) ed è possibile, a causa di errori umani, non rilevare determinati errori durante l'esecuzione dei test. Ma i test manuali possono anche essere vantaggiosi: ad esempio, un tester umano (es. un revisore) può usare l'intuizione per rilevare casi limite che uno strumento di test automatizzato non coglierebbe. ## Test automatizzati per i contratti intelligenti {#automated-testing-for-smart-contracts} -### Test unitario {#unit-testing-for-smart-contracts} +### Test unitari {#unit-testing-for-smart-contracts} -Il test unitario valuta le funzioni del contratto separatamente, verificando che ogni componente funzioni correttamente. Dei buoni test unitari dovrebbero essere semplici, rapidi da eseguire e fornire un'idea chiara di cosa sia andato storto, qualora dovessero fallire. +I test unitari valutano le funzioni del contratto separatamente e verificano che ogni componente funzioni correttamente. I buoni test unitari dovrebbero essere semplici, veloci da eseguire e fornire un'idea chiara di cosa è andato storto in caso di fallimento dei test. -I test unitari sono utili per verificare che le funzioni restituiscano i valori previsti e che l'archiviazione del contratto sia aggiornata correttamente dopo l'esecuzione della funzione. Inoltre, l'esecuzione dei test unitari dopo aver apportato modifiche alla base di codice dei contratti assicura che l'aggiunta di nuova logica non introduca errori. Seguono alcune linee guida per effettuare test unitari efficienti: +I test unitari sono utili per verificare che le funzioni restituiscano i valori previsti e che l'archiviazione del contratto venga aggiornata correttamente dopo l'esecuzione della funzione. Inoltre, l'esecuzione di test unitari dopo aver apportato modifiche alla base di codice di un contratto garantisce che l'aggiunta di nuova logica non introduca errori. Di seguito sono riportate alcune linee guida per eseguire test unitari efficaci: #### Linee guida per i test unitari dei contratti intelligenti {#unit-testing-guidelines} -##### 1. Comprendere la logica e il flusso di lavoro dei contratti +##### 1. Comprendere la logica di business e il flusso di lavoro del contratto -Prima di scrivere i test unitari, è utile conoscere quali funzionalità sono offerte da un contratto intelligente, nonché come gli utenti accederanno a tali funzioni e le utilizzeranno. Ciò è particolarmente utile per eseguire i [test del percorso felice](https://en.m.wikipedia.org/wiki/Happy_path) che determinano se le funzioni in un contratto restituiscono il risultato corretto per gli input validi dell'utente. Spiegheremo questo concetto utilizzando questo esempio (accorciato) di [un contratto d'asta](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) +Prima di scrivere test unitari, è utile sapere quali funzionalità offre un contratto intelligente e come gli utenti accederanno e utilizzeranno tali funzioni. Questo è particolarmente utile per eseguire [test del percorso felice (happy path)](https://en.m.wikipedia.org/wiki/Happy_path) che determinano se le funzioni in un contratto restituiscono l'output corretto per input utente validi. Spiegheremo questo concetto utilizzando questo esempio (abbreviato) di [un contratto d'asta](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) -``` +```solidity constructor( uint biddingTime, address payable beneficiaryAddress @@ -108,35 +108,35 @@ function auctionEnd() external { } ``` -Questo è un semplice contratto d'asta, progettato per ricevere offerte durante il periodo d'offerta. Se `highestBid` aumenta, l'offerente maggiore precedente riceve il denaro; una volta terminato il periodo di offerta, il `beneficiary` chiama il contratto per ricevere il denaro. +Questo è un semplice contratto d'asta progettato per ricevere offerte durante il periodo di offerta. Se l'`highestBid` aumenta, il precedente miglior offerente riceve indietro il proprio denaro; una volta terminato il periodo di offerta, il `beneficiary` chiama il contratto per ottenere il proprio denaro. -I test unitari per un contratto simile coprirebbero diverse funzioni che un utente potrebbe chiamare quando interagisce con esso. Un esempio sarebbe un test unitario che controlli se un utente può presentare un'offerta durante l'asta (cioè, le chiamate a `bid()` hanno esito positivo) o uno che controlli se un utente può presentare un'offerta maggiore dell'attuale `highestBid`. +I test unitari per un contratto come questo coprirebbero diverse funzioni che un utente potrebbe chiamare interagendo con il contratto. Un esempio potrebbe essere un test unitario che verifica se un utente può fare un'offerta mentre l'asta è in corso (ovvero, le chiamate a `bid()` hanno successo) o uno che verifica se un utente può fare un'offerta più alta dell'attuale `highestBid`. -Comprendere il flusso di lavoro operativo di un contratto aiuta anche a scrivere test unitari che verificano se l'esecuzione soddisfa i requisiti. Ad esempio, il contratto d'asta specifica che gli utenti non possono presentare offerte al termine dell'asta (cioè, quando `auctionEndTime` è inferiore a `block.timestamp`). Dunque, uno sviluppatore potrebbe eseguire un test unitario che verifichi se le chiamate alla funzione `bid()` hanno esito positivo o negativo al termine dell'asta (cioè, quando `auctionEndTime` > `block.timestamp`). +Comprendere il flusso di lavoro operativo di un contratto aiuta anche a scrivere test unitari che verificano se l'esecuzione soddisfa i requisiti. Ad esempio, il contratto d'asta specifica che gli utenti non possono fare offerte quando l'asta è terminata (ovvero, quando `auctionEndTime` è inferiore a `block.timestamp`). Pertanto, uno sviluppatore potrebbe eseguire un test unitario che verifica se le chiamate alla funzione `bid()` hanno successo o falliscono quando l'asta è finita (ovvero, quando `auctionEndTime` > `block.timestamp`). -##### 2. Valutare tutte le ipotesi legate all'esecuzione del contratto +##### 2. Valutare tutte le ipotesi relative all'esecuzione del contratto -È importante documentare qualsiasi ipotesi sull'esecuzione di un contratto e scrivere test unitari per verificare la validità di tali ipotesi. Oltre a offrire protezione dall'esecuzione imprevista, testare le asserzioni impone di pensare alle operazioni che potrebbero infrangere il modello di sicurezza di un contratto intelligente. Un suggerimento utile è andare oltre i "test utente felice" e scrivere test negativi che verifichino se una funzione fallisce per gli input errati. +È importante documentare qualsiasi ipotesi sull'esecuzione di un contratto e scrivere test unitari per verificare la validità di tali ipotesi. Oltre a offrire protezione contro esecuzioni impreviste, testare le asserzioni ti costringe a pensare alle operazioni che potrebbero infrangere il modello di sicurezza di un contratto intelligente. Un consiglio utile è andare oltre i "test dell'utente felice" e scrivere test negativi che verificano se una funzione fallisce per input errati. -Molti quadri di test unitari ti consentono di creare asserzioni – semplici dichiarazioni che dichiarano ciò che un contratto può e non può fare – ed eseguire test per verificare se tali asserzioni sono rispettate durante l'esecuzione. Uno sviluppatore che lavora al contratto d'asta descritto in precedenza potrebbe fare le seguenti asserzioni sul suo comportamento prima di seguire dei test negativi: +Molti framework di test unitari consentono di creare asserzioni (semplici dichiarazioni che stabiliscono cosa un contratto può e non può fare) ed eseguire test per vedere se tali asserzioni reggono durante l'esecuzione. Uno sviluppatore che lavora sul contratto d'asta descritto in precedenza potrebbe fare le seguenti asserzioni sul suo comportamento prima di eseguire test negativi: -- Gli utenti non possono presentare offerte quando l'asta è terminata o quando non è iniziata. +- Gli utenti non possono fare offerte quando l'asta è finita o non è ancora iniziata. -- Il contratto d'asta viene annullato se un'offerta è inferiore alla soglia accettabile. +- Il contratto d'asta si annulla se un'offerta è inferiore alla soglia accettabile. -- Agli utenti che non vincono l'asta vengono accreditati i propri fondi +- Agli utenti che non riescono a vincere l'offerta vengono accreditati i loro fondi. -**Nota**: un altro modo di testare le ipotesi è scrivere test che inneschino i [modificatori della funzione](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) in un contratto, specialmente, le dichiarazioni `require`, `assert` e `if…else`. +**Nota**: Un altro modo per testare le ipotesi è scrivere test che attivano i [modificatori di funzione](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) in un contratto, in particolare le istruzioni `require`, `assert` e `if…else`. ##### 3. Misurare la copertura del codice -La [copertura del codice](https://en.m.wikipedia.org/wiki/Code_coverage) è un parametro di prova che traccia il numero di rami, righe e dichiarazioni nel tuo codice eseguiti durante i test. I test dovrebbero avere una buona code coverage per ridurre al minimo il rischio di vulnerabilità non testate. Senza una code coverage sufficiente potresti dare erroneamente per scontato che il tuo contratto sia sicuro; pur superando tutti i test, infatti, potrebbero comunque esistere vulnerabilità in percorsi di codice non testati. Registrare un'elevata copertura del codice, tuttavia, garantisce che tutte le dichiarazioni/funzioni di un contratto intelligente siano state testate sufficientemente per verificarne la correttezza. +La [copertura del codice](https://en.m.wikipedia.org/wiki/Code_coverage) è una metrica di test che traccia il numero di rami, righe e istruzioni nel tuo codice eseguiti durante i test. I test dovrebbero avere una buona copertura del codice per ridurre al minimo il rischio di vulnerabilità non testate. Senza una copertura sufficiente, potresti presumere erroneamente che il tuo contratto sia sicuro perché tutti i test vengono superati, mentre le vulnerabilità esistono ancora in percorsi di codice non testati. Registrare un'elevata copertura del codice, tuttavia, dà la garanzia che tutte le istruzioni/funzioni in un contratto intelligente siano state sufficientemente testate per la correttezza. -##### 4. Utilizzare quadri di test ben sviluppati +##### 4. Utilizzare framework di test ben sviluppati -La qualità degli strumenti utilizzati nell'esecuzione dei test unitari per i tuoi contratti intelligenti è fondamentale. Un quadro di test ideale è mantenuto regolarmente, fornisce funzionalità utili (es. capacità di registrazione e segnalazione) e deve essere utilizzato e controllato ampiamente da altri sviluppatori. +La qualità degli strumenti utilizzati per eseguire i test unitari per i tuoi contratti intelligenti è fondamentale. Un framework di test ideale è quello che viene regolarmente mantenuto; fornisce funzionalità utili (es. capacità di registrazione e reportistica); e deve essere stato ampiamente utilizzato e verificato da altri sviluppatori. -I quadri di test unitari per i contratti intelligenti in Solidity esistono in diversi linguaggi (principalmente JavaScript, Python e Rust). Vedi alcune delle guide seguenti per informazioni su come iniziare a eseguire test unitari con diversi quadri di test: +I framework di test unitari per i contratti intelligenti in Solidity sono disponibili in diversi linguaggi (principalmente JavaScript, Python e Rust). Consulta alcune delle guide di seguito per informazioni su come iniziare a eseguire test unitari con diversi framework di test: - **[Eseguire test unitari con Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - **[Eseguire test unitari con Foundry](https://book.getfoundry.sh/forge/writing-tests)** @@ -146,49 +146,49 @@ I quadri di test unitari per i contratti intelligenti in Solidity esistono in di - **[Eseguire test unitari con Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - **[Eseguire test unitari con Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** -### Test d'integrazione {#integration-testing-for-smart-contracts} +### Test di integrazione {#integration-testing-for-smart-contracts} -Mentre i test unitari eseguono il debug delle funzioni del contratto in isolamento, i test d'integrazione valutano i componenti di un contratto intelligente nella sua interezza. I test d'integrazione possono rilevare i problemi che sorgono da chiamate tra contratti o da interazioni tra funzioni differenti nello stesso contratto intelligente. Ad esempio, i test d'integrazione possono aiutare a verificare se aspetti come l'[eredità](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) e l'iniezione di dipendenza funzionano correttamente. +Mentre i test unitari eseguono il debug delle funzioni del contratto in isolamento, i test di integrazione valutano i componenti di un contratto intelligente nel loro insieme. I test di integrazione possono rilevare problemi derivanti da chiamate tra contratti o interazioni tra diverse funzioni nello stesso contratto intelligente. Ad esempio, i test di integrazione possono aiutare a verificare se elementi come l'[ereditarietà](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) e l'iniezione delle dipendenze funzionano correttamente. -I test d'integrazione sono utili se il tuo contratto adotta un'architettura modulare o si interfaccia con altri contratti su catena durante l'esecuzione. Un modo di eseguire i test d'integrazone è [biforcare la blockchain](/glossary/#fork) a un'altezza specifica (utilizzando uno strumento come [Forge](https://book.getfoundry.sh/forge/fork-testing) o [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks) e simulare le interazioni tra il tuo contratto e i contratti distribuiti. +I test di integrazione sono utili se il tuo contratto adotta un'architettura modulare o si interfaccia con altri contratti on-chain durante l'esecuzione. Un modo per eseguire test di integrazione è creare una [biforcazione della blockchain](/glossary/#fork) a un'altezza specifica (utilizzando uno strumento come [Forge](https://book.getfoundry.sh/forge/fork-testing) o [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)) e simulare le interazioni tra il tuo contratto e i contratti distribuiti. -La blockchain diramata si comporterà in modo simile alla Rete Principale e avrà conti con stati e saldi associati. Ma agisce soltanto come un ambiente di sviluppo locale in modalità sandbox, a significare che non avrai bisogno di ETH reali per le transazioni, ad esempio, né le tue modifiche influenzeranno il protocollo reale di Ethereum. +La blockchain biforcata si comporterà in modo simile alla rete principale e avrà account con stati e saldi associati. Ma agisce solo come un ambiente di sviluppo locale in sandbox, il che significa che non avrai bisogno di ETH reali per le transazioni, ad esempio, né le tue modifiche influenzeranno il vero protocollo Ethereum. ### Test basati sulle proprietà {#property-based-testing-for-smart-contracts} -I test basati sulle proprietà sono il procedimento di verifica che un contratto intelligente soddisfi una data proprietà definita. Le proprietà asseriscono fatti sul comportamento di un contratto che si prevede restino veri in diversi scenari: un esempio di proprietà di un contratto intelligente potrebbe essere che "Le operazioni aritmetiche nel contratto non hanno mai sovrafflussi o sottoeccedenze." +Il test basato sulle proprietà è il processo di verifica che un contratto intelligente soddisfi alcune proprietà definite. Le proprietà affermano fatti sul comportamento di un contratto che dovrebbero rimanere veri in diversi scenari: un esempio di proprietà di un contratto intelligente potrebbe essere "Le operazioni aritmetiche nel contratto non vanno mai in overflow o underflow". -L'**analisi statica** e l'**analisi dinamica** sono due tecniche comuni per eseguire i test basati sulle proprietà ed entrambe posso verificare che il codice di un programma (in questo caso, un contratto intelligente) soddisfi una data proprietà predefinita. Alcuni strumenti di test basati sulle proprietà comprendono delle regole predefinite sulle proprietà previste del contratto e verificano il codice rispetto a tali regole; altri ti consentono di creare proprietà personalizzate per un contratto intelligente. +L'**analisi statica** e l'**analisi dinamica** sono due tecniche comuni per eseguire test basati sulle proprietà ed entrambe possono verificare che il codice di un programma (un contratto intelligente in questo caso) soddisfi alcune proprietà predefinite. Alcuni strumenti di test basati sulle proprietà sono dotati di regole predefinite sulle proprietà previste del contratto e controllano il codice rispetto a tali regole, mentre altri consentono di creare proprietà personalizzate per un contratto intelligente. #### Analisi statica {#static-analysis} -Un analizzatore statico prende come input il codice sorgente di un contratto intelligente e produce dei risultati che dichiarano se un contratto soddisfa o meno una proprietà. A differenza dell'analisi dinamica, l'analisi statica non coinvolge l'esecuzione di un contratto per analizzarne la correttezza. L'analisi statica, invece, ragiona su tutti i possibili percorsi che un contratto intelligente potrebbe intraprendere durante l'esecuzione (esaminando la struttura del codice sorgente per determinare cosa significherebbe per il funzionamento dei contratti all'esecuzione). +Un analizzatore statico prende in input il codice sorgente di un contratto intelligente e restituisce risultati che dichiarano se un contratto soddisfa o meno una proprietà. A differenza dell'analisi dinamica, l'analisi statica non comporta l'esecuzione di un contratto per analizzarne la correttezza. L'analisi statica ragiona invece su tutti i possibili percorsi che un contratto intelligente potrebbe intraprendere durante l'esecuzione (ovvero, esaminando la struttura del codice sorgente per determinare cosa significherebbe per il funzionamento del contratto in fase di esecuzione). -Il [linting](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important) e i [test statici](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sono metodi comuni per eseguire analisi statiche sui contratti. Entrambi richiedono rappresentazioni di basso livello dell'esecuzione di un contratto, come [alberi di sintassi astratta](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) e [grafici del flusso di controllo](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/) prodotti dal compilatore. +Il [linting](https://www.perforce.com/blog/qac/what-is-linting) e i [test statici](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) sono metodi comuni per eseguire l'analisi statica sui contratti. Entrambi richiedono l'analisi di rappresentazioni di basso livello dell'esecuzione di un contratto, come gli [alberi di sintassi astratta](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) e i [grafi del flusso di controllo](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/) generati dal compilatore. -In gran parte dei casi, l'analisi statica è utile per rilevare problemi di sicurezza come l'uso di costrutti non sicuri, errori di sintassi o violazioni degli standard di scrittura nel codice di un contratto. Tuttavia, gli analizzatori statici sono noti come generalmente instabili nel rilevare le vulnerabilità più profonde e potrebbero produrre un eccesso di falsi positivi. +Nella maggior parte dei casi, l'analisi statica è utile per rilevare problemi di sicurezza come l'uso di costrutti non sicuri, errori di sintassi o violazioni degli standard di codifica nel codice di un contratto. Tuttavia, è noto che gli analizzatori statici sono generalmente inaffidabili nel rilevare vulnerabilità più profonde e possono produrre eccessivi falsi positivi. #### Analisi dinamica {#dynamic-analysis} -L'analisi dinamica genera input simbolici (es. nell'[esecuzione simbolica](https://en.m.wikipedia.org/wiki/Symbolic_execution)) o input concreti (es. nel [fuzzing](https://owasp.org/www-community/Fuzzing)) alle funzioni di un contratto intelligente, per scoprire se qualche traccia d'esecuzione viola delle proprietà specifiche. Questa forma di test basato sulle proprietà differisce dai test unitari nel fatto che i casi di prova coprono diversi scenari e che un programma gestisce la generazione dei casi di prova. +L'analisi dinamica genera input simbolici (es. nell'[esecuzione simbolica](https://en.m.wikipedia.org/wiki/Symbolic_execution)) o input concreti (es. nel [fuzzing](https://owasp.org/www-community/Fuzzing)) per le funzioni di un contratto intelligente per vedere se qualche traccia di esecuzione viola proprietà specifiche. Questa forma di test basato sulle proprietà differisce dai test unitari in quanto i casi di test coprono più scenari e un programma gestisce la generazione dei casi di test. -Il [fuzzing](https://halborn.com/what-is-fuzz-testing-fuzzing/) è un esempio di tecnica di analisi dinamica per verificare le proprietà arbitrarie nei contratti intelligenti. Un fuzzer invoca le funzioni in un contratto in questione con varianti casuali o malformate di un valore di input definito. Se il contratto intelligente entra in uno stato di errore (es., uno in cui un'asserzione fallisce), il problema è segnalato e gli input che guidano l'esecuzione verso il percorso vulnerabile sono prodotti in un report. +Il [fuzzing](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) è un esempio di tecnica di analisi dinamica per verificare proprietà arbitrarie nei contratti intelligenti. Un fuzzer invoca funzioni in un contratto di destinazione con variazioni casuali o malformate di un valore di input definito. Se il contratto intelligente entra in uno stato di errore (es. uno in cui un'asserzione fallisce), il problema viene segnalato e gli input che guidano l'esecuzione verso il percorso vulnerabile vengono prodotti in un rapporto. -Il fuzzing è utile per valutare il meccanismo di validazione dell'input di un contratto intelligente, poiché la gestione inappropriata degli input imprevisti potrebbe risultare in un'esecuzione indesiderata, producendo effetti pericolosi. Questa forma di test basati sulle proprietà può essere ideale per molti motivi: +Il fuzzing è utile per valutare il meccanismo di convalida dell'input di un contratto intelligente poiché una gestione impropria di input imprevisti potrebbe comportare un'esecuzione non intenzionale e produrre effetti pericolosi. Questa forma di test basato sulle proprietà può essere ideale per molti motivi: -1. **Scrivere i casi di prova per coprire molti scenari è difficile.** Un test delle proprietà ti richiede soltanto di definire un comportamento e un intervallo di dati con cui testare il comportamento; sarà il programma a generare automaticamente i casi di prova secondo la proprietà definita. +1. **Scrivere casi di test per coprire molti scenari è difficile.** Un test delle proprietà richiede solo di definire un comportamento e un intervallo di dati con cui testare il comportamento: il programma genera automaticamente casi di test in base alla proprietà definita. -2. **La tua suite di test potrebbe non coprire a sufficienza tutti i percorsi possibili nel programma.** Anche con una copertura del 100%, è possibile perdere alcuni casi limite. +2. **La tua suite di test potrebbe non coprire sufficientemente tutti i possibili percorsi all'interno del programma.** Anche con una copertura del 100%, è possibile perdersi casi limite. -3. **I test unitari provano che un contratto si esegue correttamente per i dati campione, ma se il contratto si esegua correttamente per gli input esterni al campione resta ignoto.** I test delle proprietà eseguono il contratto in questione con molte varianti di un dato valore di input per trovare le tracce d'esecuzione che causano gli errori dell'asserzione. Dunque, un test delle proprietà fornisce maggiori garanzie che un contratto sia eseguito correttamente per un'ampia classe di dati di input. +3. **I test unitari dimostrano che un contratto viene eseguito correttamente per i dati campione, ma non è noto se il contratto venga eseguito correttamente per input al di fuori del campione.** I test delle proprietà eseguono un contratto di destinazione con più variazioni di un determinato valore di input per trovare tracce di esecuzione che causano fallimenti delle asserzioni. Pertanto, un test delle proprietà fornisce maggiori garanzie che un contratto venga eseguito correttamente per un'ampia classe di dati di input. ### Linee guida per l'esecuzione di test basati sulle proprietà per i contratti intelligenti {#running-property-based-tests} -L'esecuzione di test basati sulle proprietà inizia solitamente con la definizione di una proprietà (es. l'assenza di [sovrafflussi di interi](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) o la raccolta di proprietà che desideri verificare in un contratto intelligente. Inoltre, durante la scrittura dei test delle proprietà potresti dover definire un intervallo di valori entro cui il programma possa generare i dati per gli input della transazione. +L'esecuzione di test basati sulle proprietà inizia in genere con la definizione di una proprietà (es. assenza di [overflow di interi](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) o di una raccolta di proprietà che si desidera verificare in un contratto intelligente. Potrebbe anche essere necessario definire un intervallo di valori entro il quale il programma può generare dati per gli input delle transazioni durante la scrittura dei test delle proprietà. -Una volta configurato adeguatamente, lo strumento di test delle proprietà eseguirà le funzioni dei tuoi contratti intelligenti con input generati casualmente. Se si verifica una violazione delle asserzioni, dovresti ottenere un report con i dati di input concreti che violano la proprietà valutata. Vedi alcune delle seguenti linee guida per iniziare a eseguire test basati sulle proprietà con diversi strumenti: +Una volta configurato correttamente, lo strumento di test delle proprietà eseguirà le funzioni dei tuoi contratti intelligenti con input generati casualmente. Se ci sono violazioni delle asserzioni, dovresti ottenere un rapporto con dati di input concreti che violano la proprietà in fase di valutazione. Consulta alcune delle guide di seguito per iniziare a eseguire test basati sulle proprietà con diversi strumenti: -- **[Analisi statica dei contratti intelligenti con Slither](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither#slither)** +- **[Analisi statica dei contratti intelligenti con Slither](https://github.com/crytic/slither)** - **[Analisi statica dei contratti intelligenti con Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** - **[Test basati sulle proprietà con Brownie](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** - **[Fuzzing dei contratti con Foundry](https://book.getfoundry.sh/forge/fuzz-testing)** @@ -199,110 +199,118 @@ Una volta configurato adeguatamente, lo strumento di test delle proprietà esegu ## Test manuali per i contratti intelligenti {#manual-testing-for-smart-contracts} -I test manuali dei contratti intelligenti sono spesso effettuati più avanti nel ciclo di sviluppo, dopo aver eseguito i test automatizzati. Questa forma di test valuta il contratto intelligente come un prodotto pienamente integrato per scoprire se opera come specificato nei requisiti tecnici. +I test manuali dei contratti intelligenti avvengono spesso più avanti nel ciclo di sviluppo, dopo l'esecuzione dei test automatizzati. Questa forma di test valuta il contratto intelligente come un prodotto completamente integrato per vedere se funziona come specificato nei requisiti tecnici. ### Testare i contratti su una blockchain locale {#testing-on-local-blockchain} -Mentre i test automatizzati eseguiti in un ambiente di sviluppo locale possono fornire utili informazioni di debug, vorrai sapere come il tuo contratto intelligente si comporta in un ambiente di produzione. Tuttavia, distribuire alla catena principale di Ethereum comporta delle commissioni sul carburante, per non menzionare che tu o i tuoi utenti potreste perdere denaro reale se il contratto intelligente dovesse ancora contenere dei bug. +Sebbene i test automatizzati eseguiti in un ambiente di sviluppo locale possano fornire utili informazioni di debug, vorrai sapere come si comporta il tuo contratto intelligente in un ambiente di produzione. Tuttavia, la distribuzione sulla catena principale di Ethereum comporta commissioni del gas, per non parlare del fatto che tu o i tuoi utenti potreste perdere denaro reale se il tuo contratto intelligente presenta ancora dei bug. -Testare il contratto su una blockchain locale (anche nota come una [rete di sviluppo](/developers/docs/development-networks/)) è un'alternativa consigliata ai test sulla Rete principale. Una blockchain locale è una copia della blockchain di Ethereum eseguita localmente sul tuo computer che simula il comportamento del livello di esecuzione di Ethereum. Come tale, puoi programmare le transazioni affinché interagiscano con un contratto senza incorrere in significativi costi di gestione. +Testare il tuo contratto su una blockchain locale (nota anche come [rete di sviluppo](/developers/docs/development-networks/)) è un'alternativa consigliata ai test sulla rete principale. Una blockchain locale è una copia della blockchain di Ethereum in esecuzione localmente sul tuo computer che simula il comportamento del livello di esecuzione di Ethereum. In quanto tale, puoi programmare transazioni per interagire con un contratto senza incorrere in costi generali significativi. -Eseguire i contratti su una blockchain locale potrebbe essere utile come forma di test d'integrazione manuale. [I contratti intelligenti sono altamente componibili](/developers/docs/smart-contracts/composability/), il che ti consente di integrarli con i protocolli esistenti – ma dovrai assicurarti che tali interazioni complesse su catena producano i risultati corretti. +L'esecuzione di contratti su una blockchain locale potrebbe essere utile come forma di test di integrazione manuale. [I contratti intelligenti sono altamente componibili](/developers/docs/smart-contracts/composability/), consentendoti di integrarti con i protocolli esistenti, ma dovrai comunque assicurarti che tali complesse interazioni on-chain producano i risultati corretti. [Maggiori informazioni sulle reti di sviluppo.](/developers/docs/development-networks/) -### Testare i contratti sulle reti di prova {#testing-contracts-on-testnets} +### Testare i contratti sulle reti di test {#testing-contracts-on-testnets} -Una rete di prova funziona esattamente come la Rete Principale di Ethereum, tranne per il fatto che utilizza degli ether (ETH) privi di valore reale. Distribuire il proprio contratto su una [rete di prova](/developers/docs/networks/#ethereum-testnets) significa che chiunque può interagirvi (es. tramite il frontend della dapp) senza mettere a rischio dei fondi. +Una rete di test o testnet funziona esattamente come la rete principale di Ethereum, tranne per il fatto che utilizza ether (ETH) senza alcun valore nel mondo reale. Distribuire il tuo contratto su una [rete di test](/developers/docs/networks/#ethereum-testnets) significa che chiunque può interagirvi (es. tramite il frontend della dApp) senza mettere a rischio i fondi. -Questa forma di test manuale è utile per valutare il flusso end-to-end della tua applicazione dal punto di vista di un utente. Inoltre, qui i beta tester possono eseguire prove e segnalare qualsiasi problema con la logica aziendale del contratto e le sue funzionalità complessive. +Questa forma di test manuale è utile per valutare il flusso end-to-end della tua applicazione dal punto di vista dell'utente. Qui, i beta tester possono anche eseguire prove e segnalare eventuali problemi con la logica di business e la funzionalità complessiva del contratto. -Distribuire su una rete di prova dopo il test su una blockchain locale è ideale, poiché la prima è più simile al comportamento della Macchina Virtuale di Ethereum. Pertanto, è comune per molti progetti nativi di Ethereum distribuire le dapp sulle reti di prova per valutare il funzionamento dei contratti intelligenti in condizioni reali. +La distribuzione su una rete di test dopo i test su una blockchain locale è l'ideale poiché la prima è più vicina al comportamento della macchina virtuale di Ethereum. Pertanto, è comune per molti progetti nativi di Ethereum distribuire dApp sulle reti di test per valutare il funzionamento di un contratto intelligente in condizioni reali. -[Maggiori informazioni sulle reti di prova di Ethereum.](/developers/docs/development-networks/#public-beacon-testchains) +[Maggiori informazioni sulle reti di test di Ethereum.](/developers/docs/development-networks/#public-beacon-testchains) ## Test vs. verifica formale {#testing-vs-formal-verification} -Sebbene i test aiutino a confermare che un contratto restituisce i risultati previsti per alcuni input di dati, non può provare in via conclusiva lo stesso per gli input non usati durante i test. Testare un contratto intelligente, dunque, non può garantire la "correttezza funzionale" (cioè, non può dimostrare che un programma si comporti come richiesto per _tutte_ le serie di valori di input). +Sebbene i test aiutino a confermare che un contratto restituisce i risultati previsti per alcuni input di dati, non possono dimostrare in modo conclusivo lo stesso per gli input non utilizzati durante i test. Testare un contratto intelligente, pertanto, non può garantire la "correttezza funzionale" (ovvero, non può dimostrare che un programma si comporti come richiesto per _tutti_ gli insiemi di valori di input). -La verifica formale è un approccio di valutazione della correttezza del software tramite la verifica del fatto che un modello formale del programma corrisponda alla specifica formale. Un modello formale è una rappresentazione matematica astratta di un programma, mentre una specifica formale definisce le proprietà di un programma (ossia le asserzioni logiche sull'esecuzione del programma). +La verifica formale è un approccio per valutare la correttezza del software verificando se un modello formale del programma corrisponde alla specifica formale. Un modello formale è una rappresentazione matematica astratta di un programma, mentre una specifica formale definisce le proprietà di un programma (ovvero, asserzioni logiche sull'esecuzione del programma). -Poiché le proprietà sono scritte in termini matematici, diventa possibile verificare che un modello (matematico) formale del sistema soddisfi una specifica utilizzando le regole logiche di inferenza. Dunque, si dice che gli strumenti di verifica formale producano una 'prova matematica' della correttezza di un sistema. +Poiché le proprietà sono scritte in termini matematici, diventa possibile verificare che un modello formale (matematico) del sistema soddisfi una specifica utilizzando regole logiche di inferenza. Pertanto, si dice che gli strumenti di verifica formale producano una "prova matematica" della correttezza di un sistema. -A differenza dei test, la verifica formale è utilizzabile per verificare che l'esecuzione dei contratti intelligenti soddisfi una specifica formale per _tutte_ le esecuzioni (cioè che sia privo di bug) senza doverlo eseguire con dei campioni di dati. Questo non solo riduce il tempo trascorso a eseguire decine di test unitari, ma è anche più efficiente nel trovare le vulnerabilità nascoste. Detto ciò, le tecniche di verifica formale si trovano su uno spettro che dipende dalla loro difficoltà di implementazione e utilità. +A differenza dei test, la verifica formale può essere utilizzata per verificare che l'esecuzione di un contratto intelligente soddisfi una specifica formale per _tutte_ le esecuzioni (ovvero, non ha bug) senza doverlo eseguire con dati campione. Questo non solo riduce il tempo impiegato per eseguire dozzine di test unitari, ma è anche più efficace nel rilevare vulnerabilità nascoste. Detto questo, le tecniche di verifica formale si collocano su uno spettro a seconda della loro difficoltà di implementazione e utilità. [Maggiori informazioni sulla verifica formale per i contratti intelligenti.](/developers/docs/smart-contracts/formal-verification) -## Test vs. controlli e bug bounty {#testing-vs-audits-bug-bounties} +## Test vs audit e bug bounty {#testing-vs-audits-bug-bounties} -Come accennato, raramente i test rigorosi possono garantire l'assenza di bug in un contratto; gli approcci di verifica formale possono fornire maggiori garanzie di correttezza ma al momento sono difficili da utilizzare e incorrono in considerevoli costi. +Come accennato, test rigorosi raramente possono garantire l'assenza di bug in un contratto; gli approcci di verifica formale possono fornire garanzie di correttezza più forti, ma sono attualmente difficili da usare e comportano costi considerevoli. -Tuttavia, puoi aumentare maggiormente la possibilità di identificare le vulnerabilità del contratto aggiungendo una revisione indipendente del codice. I [controlli dei contratti intelligenti](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) e le [bug bounty](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sono due metodi per far analizzare ad altri i tuoi contratti. +Tuttavia, puoi aumentare ulteriormente la possibilità di individuare le vulnerabilità del contratto ottenendo una revisione indipendente del codice. Gli [audit dei contratti intelligenti](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) e i [bug bounty](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) sono due modi per far analizzare i tuoi contratti ad altri. -I controlli sono eseguiti da revisori esperti nel trovare i casi di falle di sicurezza e pratiche di sviluppo inadeguate nei contratti intelligenti. Un controllo, solitamente, includerà test (e verosimilmente una verifica formale), nonché una revisione manuale dell'intera base di codice. +Gli audit vengono eseguiti da revisori esperti nel trovare casi di falle di sicurezza e scarse pratiche di sviluppo nei contratti intelligenti. Un audit di solito includerà test (e possibilmente verifiche formali) nonché una revisione manuale dell'intera base di codice. -Viceversa, un programma di bug bounty comporta solitamente l'offerta di una ricompensa economica a una persona (comunemente descritto come [hacker whitehat](https://en.wikipedia.org/wiki/White_hat_(computer_security))) che scopre una vulnerabilità in un contratto intelligente e la comunica agli sviluppatori. Le bug bounty sono simili ai controlli poiché comportano di chiedere ad altri di aiutare a trovare difetti nei contratti intelligenti. +Al contrario, un programma di bug bounty di solito prevede l'offerta di una ricompensa finanziaria a un individuo (comunemente descritto come [hacker whitehat]()) che scopre una vulnerabilità in un contratto intelligente e la rivela agli sviluppatori. I bug bounty sono simili agli audit poiché implicano la richiesta ad altri di aiutare a trovare difetti nei contratti intelligenti. -La differenza principale è che i programmi di bug bounty sono aperti alla più ampia community di sviluppatori/hacker e attrae un'ampia classe di hacker etici e professionisti della sicurezza indipendenti dotati di competenze uniche ed esperienza. Questo potrebbe essere un vantaggio rispetto ai controlli del contratto intelligente che si affidano principalmente ai team che potrebbero possedere esperienza limitata o minima. +La differenza principale è che i programmi di bug bounty sono aperti alla più ampia comunità di sviluppatori/hacker e attraggono un'ampia classe di hacker etici e professionisti della sicurezza indipendenti con competenze ed esperienze uniche. Questo può essere un vantaggio rispetto agli audit dei contratti intelligenti che si basano principalmente su team che potrebbero possedere competenze limitate o ristrette. -## Strumenti di test e librerie {#testing-tools-and-libraries} +## Strumenti e librerie di test {#testing-tools-and-libraries} -### Strumenti per i test unitari {#unit-testing-tools} +### Strumenti di test unitari {#unit-testing-tools} - **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** - _Strumento di copertura del codice per contratti intelligenti scritti in Solidity._ -- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _Quadro per lo sviluppo e test avanzati dei contratti intelligenti (basato su ethers.js)_. +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _Framework per lo sviluppo e il test avanzati di contratti intelligenti (basato su ethers.js)_. -- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Strumento per testare contratti intelligenti in Solidity. Opera sotto il plugin "Solidity Unit Testing" di Remix IDE, usato per scrivere ed eseguire casi di prova per un contratto._ +- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Strumento per testare i contratti intelligenti in Solidity. Funziona sotto il plugin "Solidity Unit Testing" di Remix IDE, che viene utilizzato per scrivere ed eseguire casi di test per un contratto._ -- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _Libreria di asserzioni per i test di contratti intelligenti di Ethereum. Assicurati che i tuoi contratti si comportino come previsto!_ +- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _Libreria di asserzioni per il test dei contratti intelligenti di Ethereum. Assicurati che i tuoi contratti si comportino come previsto!_ -- **[Quadro di test unitari di Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizza Pytest, un quadro di test ricco di funzionalità che ti consente di scrivere piccoli test con codice minimale, si ridimensiona bene per i grandi progetti ed è altamente estendibile._ +- **[Framework di test unitari Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utilizza Pytest, un framework di test ricco di funzionalità che ti consente di scrivere piccoli test con codice minimo, scala bene per progetti di grandi dimensioni ed è altamente estensibile._ -- **[Test di Foundry](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offre Forge, un quadro di test di Ethereum veloci e flessibili, in grado di eseguire semplici test unitari, controlli d'ottimizzazione del carburante e fuzzing del contratto._ +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _Foundry offre Forge, un framework di test per Ethereum veloce e flessibile in grado di eseguire semplici test unitari, controlli di ottimizzazione del gas e fuzzing dei contratti._ -- **[Test di Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Quadro per testare i contratti intelligenti basato su ethers.js, Mocha e Chai._ +- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework per testare i contratti intelligenti basato su ethers.js, Mocha e Chai._ -- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _Quadro di sviluppo e test basato su Python per i contratti intelligenti, rivolto alla Macchina Virtuale Intelligente._ +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _Framework di sviluppo e test basato su Python per contratti intelligenti mirati alla macchina virtuale di Ethereum._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** - _Assetto basato su Python per i test unitari e il fuzzing, con forti capacità di debug e supporto ai test tra catene, che utilizza pytest e Anvil per un'esperienza dell'utente e prestazioni migliori._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** - _Framework basato su Python per test unitari e fuzzing con forti capacità di debug e supporto per test cross-chain, che utilizza pytest e Anvil per la migliore esperienza utente e prestazioni._ ### Strumenti di test basati sulle proprietà {#property-based-testing-tools} #### Strumenti di analisi statica {#static-analysis-tools} -- **[Slither](https://github.com/crytic/slither)** - _Quadro di analisi statica in Solidity basato su Python per trovare vulnerabilità, migliorare la comprensione del codice e scrivere analisi personalizzate per i contratti intelligenti._ +- **[Slither](https://github.com/crytic/slither)** - _Framework di analisi statica per Solidity basato su Python per trovare vulnerabilità, migliorare la comprensione del codice e scrivere analisi personalizzate per i contratti intelligenti._ + +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _Linter per far rispettare le migliori pratiche di stile e sicurezza per il linguaggio di programmazione dei contratti intelligenti Solidity._ -- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _Linter per l'applicazione delle migliori pratiche di stile e sicurezza per il linguaggio di programmazione dei contratti intelligenti Solidity_ +- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** - _Analizzatore statico basato su Rust specificamente progettato per la sicurezza e lo sviluppo di contratti intelligenti Web3._ -- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)**: _Analizzatore statico basato su Rust, progettato specificamente per la sicurezza e lo sviluppo di contratti intelligenti in Web3._ +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** - _Framework di analisi statica basato su Python con rilevatori di vulnerabilità e qualità del codice, stampanti per estrarre informazioni utili dal codice e supporto per la scrittura di sottomoduli personalizzati._ -- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** - _Assetto di analisi statica basato su Python con rilevatori delle vulnerabilità e della qualità del codice, stampanti per estrarre informazioni utili dal codice e supporto alla scrittura di moduli secondari personalizzati._ +- **[Slippy](https://github.com/fvictorio/slippy)** - _Un linter semplice e potente per Solidity._ #### Strumenti di analisi dinamica {#dynamic-analysis-tools} -- **[Echidna](https://github.com/crytic/echidna/)** - _Veloce fuzzer di contratti per rilevare le vulnerabilità nei contratti intelligenti tramite i test basati sulle proprietà._ +- **[Echidna](https://github.com/crytic/echidna/)** - _Fuzzer di contratti veloce per rilevare vulnerabilità nei contratti intelligenti attraverso test basati sulle proprietà._ -- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _Strumento automatizzato di fuzzing utile per rilevare le violazioni delle proprietà nel codice dei contratti intelligenti._ +- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _Strumento di fuzzing automatizzato utile per rilevare violazioni delle proprietà nel codice dei contratti intelligenti._ -- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _Quadro di esecuzione simbolica e dinamica per analizzare il bytecode dell'EVM._ +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _Framework di esecuzione simbolica dinamica per l'analisi del bytecode della EVM._ -- **[Mythril](https://github.com/ConsenSys/mythril-classic)** - _Strumento di valutazione del bytecode dell'EVM per rilevare le vulnerabilità del contratto utilizzando l'analisi a macchia, l'analisi concolica e la verifica del flusso di controllo._ +- **[Mythril](https://github.com/ConsenSys/mythril-classic)** - _Strumento di valutazione del bytecode della EVM per rilevare le vulnerabilità dei contratti utilizzando l'analisi delle contaminazioni (taint analysis), l'analisi concolica e il controllo del flusso di controllo._ -- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _Scribble è uno strumento di verifica del linguaggio della specifica e dell'esecuzione che consente di annotare i contratti intelligenti con proprietà che consentono di testare automaticamente i contratti con strumenti come Diligence Fuzzing o MythX._ +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _Scribble è un linguaggio di specifica e uno strumento di verifica a runtime che ti consente di annotare i contratti intelligenti con proprietà che ti permettono di testare automaticamente i contratti con strumenti come Diligence Fuzzing o MythX._ ## Tutorial correlati {#related-tutorials} -- [Panoramica e confronto dei diversi prodotti di test](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ -- [Come usare Echidna per testare gli smart contract](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [Come utilizzare Manticore per trovare bug nei contratti intelligenti](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [Una panoramica e un confronto di diversi prodotti di test](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ +- [Come usare Echidna per testare i contratti intelligenti](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) +- [Come usare Manticore per trovare bug nei contratti intelligenti](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [Come usare Slither per trovare bug nei contratti intelligenti](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [Come simulare contratti in Solidity per i test](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) -- [Come eseguire i test unitari in Solidity, utilizzando Foundry](https://www.rareskills.io/post/foundry-testing-solidity) +- [Come simulare (mock) i contratti Solidity per i test](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) +- [Come eseguire test unitari in Solidity usando Foundry](https://www.rareskills.io/post/foundry-testing-solidity) ## Letture consigliate {#further-reading} -- [Una guida approfondita ai test dei contratti intelligenti di Ethereum](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [Una guida approfondita al test dei contratti intelligenti di Ethereum](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) - [Come testare i contratti intelligenti di Ethereum](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) - [Guida ai test unitari di MolochDAO per sviluppatori](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) - [Come testare i contratti intelligenti come una rockstar](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) + +## Tutorial: Test dei contratti intelligenti su Ethereum {#tutorials} + +- [Come sviluppare e testare una dApp su una rete di test locale multi-client](/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/) _– Procedura dettagliata per la distribuzione di un contratto intelligente su una rete di test locale e l'esecuzione di test._ +- [Come simulare (mock) i contratti intelligenti Solidity per i test](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) _– Tutorial intermedio su come utilizzare dati fittizi e implementare test unitari._ +- [Come usare Echidna per testare i contratti intelligenti](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) _– Approccio avanzato al fuzzing e al test dei contratti intelligenti._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/it/developers/docs/smart-contracts/upgrading/index.md index 1d0658cdd34..de7841b614b 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/upgrading/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/upgrading/index.md @@ -1,165 +1,165 @@ --- title: Aggiornare i contratti intelligenti -description: Una panoramica degli schemi di aggiornamento per i contratti intelligenti di Ethereum +description: Una panoramica dei modelli di aggiornamento per i contratti intelligenti di Ethereum lang: it --- -I contratti intelligenti su Ethereum sono programmi autoeseguibili eseguiti nella Macchina Virtuale di Ethereum (EVM). Questi programmi sono immutabili per progettazione, il che impedisce qualsiasi aggiornamento alla logica aziendale una volta che il contratto è distribuito. +I contratti intelligenti su Ethereum sono programmi auto-eseguibili che operano nella macchina virtuale di Ethereum (EVM). Questi programmi sono immutabili per concezione, il che impedisce qualsiasi aggiornamento alla logica di business una volta che il contratto è stato distribuito. -Sebbene l'immutabilità sia necessaria per la mancanza di fiducia, la decentralizzazione e la sicurezza dei contratti intelligenti, potrebbe talvolta comportare uno svantaggio. Ad esempio, un codice immutabile può rendere impossibile per gli sviluppatori correggere dei contratti vulnerabili. +Sebbene l'immutabilità sia necessaria per l'assenza di fiducia (trustlessness), la decentralizzazione e la sicurezza dei contratti intelligenti, in certi casi può rappresentare uno svantaggio. Ad esempio, il codice immutabile può rendere impossibile per gli sviluppatori correggere i contratti vulnerabili. -Tuttavia, maggiori ricerche volte a migliorare i contratti intelligenti hanno portato all'introduzione di svariati schemi di aggiornamento. Questi consentono agli sviluppatori di aggiornare i contratti intelligenti (preservandone l'immutabilità) inserendo della logica aziendale in contratti differenti. +Tuttavia, la crescente ricerca per migliorare i contratti intelligenti ha portato all'introduzione di diversi modelli di aggiornamento. Questi modelli di aggiornamento consentono agli sviluppatori di aggiornare i contratti intelligenti (pur preservandone l'immutabilità) inserendo la logica di business in contratti diversi. ## Prerequisiti {#prerequisites} -Dovresti avere una buona comprensione dei [contratti intelligenti](/developers/docs/smart-contracts/), dell'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/) e della [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/). Questa guida, inoltre, presume che i lettori comprendano la programmazione dei contratti intelligenti. +Dovresti avere una buona comprensione dei [contratti intelligenti](/developers/docs/smart-contracts/), dell'[anatomia dei contratti intelligenti](/developers/docs/smart-contracts/anatomy/) e della [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/). Questa guida presuppone inoltre che i lettori abbiano una conoscenza di base della programmazione dei contratti intelligenti. -## Cos'è l'aggiornamento di un contratto intelligente? {#what-is-a-smart-contract-upgrade} +## Cos'è un aggiornamento di un contratto intelligente? {#what-is-a-smart-contract-upgrade} -L'aggiornamento di un contratto intelligente comporta la modifica della sua logica aziendale pur preservandone lo stato. È importante chiarire che l'aggiornabilità e la mutabilità non sono la stessa cosa, specialmente nel contesto dei contratti intelligenti. +L'aggiornamento di un contratto intelligente comporta la modifica della logica di business di un contratto intelligente preservando lo stato del contratto. È importante chiarire che aggiornabilità e mutabilità non sono la stessa cosa, specialmente nel contesto dei contratti intelligenti. -Non è comunque possibile modificare un programma distribuito a un indirizzo sulla rete di Ethereum. Ma è possibile modificare il codice eseguito quando gli utenti interagiscono con il contratto intelligente. +Non è ancora possibile modificare un programma distribuito a un indirizzo sulla rete di Ethereum. Ma è possibile modificare il codice che viene eseguito quando gli utenti interagiscono con un contratto intelligente. -Ciò può avvenire tramite uno dei seguenti metodi: +Questo può essere fatto tramite i seguenti metodi: -1. Creazione di diverse versioni di un contratto intelligente e migrazione dello stato (cioè, dei dati) dal vecchio contratto a una sua nuova istanza. +1. Creare più versioni di un contratto intelligente e migrare lo stato (cioè i dati) dal vecchio contratto a una nuova istanza del contratto. -2. Creazione di contratti separati per memorizzare la logica aziendale e lo stato. +2. Creare contratti separati per memorizzare la logica di business e lo stato. -3. Utilizzo di modelli proxy per delegare le chiamate alle funzioni da un contratto proxy immutabile a un contratto logico modificabile. +3. Utilizzare modelli proxy per delegare le chiamate di funzione da un contratto proxy immutabile a un contratto logico modificabile. -4. Creazione di un contratto principale immutabile che si interfacci con contratti satellite flessibili, e si basi su questi ultimi, per eseguire funzioni specifiche. +4. Creare un contratto principale immutabile che si interfaccia e si affida a contratti satellite flessibili per eseguire funzioni specifiche. -5. Utilizzo di modelli a diamante per delegare le chiamate alle funzioni da un contratto proxy a contratti logici. +5. Utilizzare il modello a diamante (diamond pattern) per delegare le chiamate di funzione da un contratto proxy a contratti logici. -### Meccanismo di aggiornamento n. 1: migrazione del contratto {#contract-migration} +### Meccanismo di aggiornamento #1: Migrazione del contratto {#contract-migration} -La migrazione del contratto si basa sul versionamento: l'idea di creare e gestire stati univoci dello stesso software. La migrazione del contratto comporta la distribuzione di una nuova istanza di un contratto intelligente esistente e il trasferimento di archiviazione e saldi al nuovo contratto. +La migrazione del contratto si basa sul controllo delle versioni (versioning), ovvero l'idea di creare e gestire stati unici dello stesso software. La migrazione del contratto comporta la distribuzione di una nuova istanza di un contratto intelligente esistente e il trasferimento dell'archiviazione e dei saldi al nuovo contratto. -Il nuovo contratto distribuito avrà un'archiviazione vuota, consentendoti di recuperare i dati dal precedente e di scriverli nella nuova implementazione. Dopodiché, dovrai aggiornare tutti i contratti che hanno interagito con il vecchio contratto affinché riflettano il nuovo indirizzo. +Il contratto appena distribuito avrà un'archiviazione vuota, consentendoti di recuperare i dati dal vecchio contratto e scriverli nella nuova implementazione. Successivamente, dovrai aggiornare tutti i contratti che interagivano con il vecchio contratto per riflettere il nuovo indirizzo. -L'ultimo passaggio nella migrazione del contratto è convincere gli utenti a passare all'utilizzo di quello nuovo. La nuova versione del contratto manterrà i saldi e indirizzi degli utenti, preservandone l'immutabilità. Se è un contratto basato su token, dovrai anche contattare le borse per scartare il vecchio contratto e utilizzare quello nuovo. +L'ultimo passaggio nella migrazione del contratto è convincere gli utenti a passare all'utilizzo del nuovo contratto. La nuova versione del contratto manterrà i saldi e gli indirizzi degli utenti, il che preserva l'immutabilità. Se si tratta di un contratto basato su token, dovrai anche contattare gli exchange per scartare il vecchio contratto e utilizzare il nuovo. -La migrazione del contratto è una misura relativamente semplice e sicura per aggiornare i contratti intelligenti senza spezzare le interazioni degli utenti. Tuttavia, la migrazione manuale dell'archiviazione e dei saldi degli utenti al nuovo contratto richiede tempo e può comportare costi elevati in termini di carburante. +La migrazione del contratto è una misura relativamente semplice e sicura per aggiornare i contratti intelligenti senza interrompere le interazioni degli utenti. Tuttavia, la migrazione manuale dell'archiviazione e dei saldi degli utenti al nuovo contratto richiede molto tempo e può comportare costi del gas elevati. -[Maggiori informazioni sulla migrazione del contratto.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) +[Maggiori informazioni sulla migrazione dei contratti.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) -### Meccanismo di aggiornamento n. 2: separazione dei dati {#data-separation} +### Meccanismo di aggiornamento #2: Separazione dei dati {#data-separation} -Un altro metodo per aggiornare i contratti intelligenti è separare la logica aziendale e l'archiviazione dei dati in contratti separati. Ciò significa che gli utenti interagiscono con il contratto logico, mentre i dati sono memorizzati in quello d'archiviazione. +Un altro metodo per aggiornare i contratti intelligenti è separare la logica di business e l'archiviazione dei dati in contratti separati. Ciò significa che gli utenti interagiscono con il contratto logico, mentre i dati sono memorizzati nel contratto di archiviazione. -Il contratto logico contiene il codice eseguito quando gli utenti interagiscono con l'applicazione. Inoltre, contiene l'indirizzo del contratto d'archiviazione e vi interagisce per ottenere e impostare dati. +Il contratto logico contiene il codice eseguito quando gli utenti interagiscono con l'applicazione. Contiene anche l'indirizzo del contratto di archiviazione e interagisce con esso per ottenere e impostare i dati. -Nel mentre, il contratto d'archiviazione detiene lo stato associato al contratto intelligente, come saldi e indirizzi degli utenti. Nota che il contratto d'archiviazione è posseduto dal contratto logico ed è configurato con l'indirizzo di quest'ultimo alla distribuzione. Ciò impedisce ai contratti non autorizzati di chiamare il contratto d'archiviazione o di aggiornarne i dati. +Nel frattempo, il contratto di archiviazione mantiene lo stato associato al contratto intelligente, come i saldi e gli indirizzi degli utenti. Nota che il contratto di archiviazione è di proprietà del contratto logico ed è configurato con l'indirizzo di quest'ultimo al momento della distribuzione. Questo impedisce a contratti non autorizzati di chiamare il contratto di archiviazione o di aggiornarne i dati. -Di default, il contratto d'archiviazione è immutabile, ma puoi sostituire il contratto logico a cui è indirizzato con una nuova implementazione. Questo modificherà il codice eseguito nell'EVM, mantenendo intatti archiviazione e saldi. +Per impostazione predefinita, il contratto di archiviazione è immutabile, ma puoi sostituire il contratto logico a cui punta con una nuova implementazione. Questo cambierà il codice che viene eseguito nella EVM, mantenendo intatti l'archiviazione e i saldi. -Utilizzare questo metodo di aggiornamento richiede l'aggiornamento dell'indirizzo del contratto logico nel contratto d'archiviazione. Devi inoltre configurare il nuovo contratto logico con l'indirizzo del contratto d'archiviazione per i suddetti motivi. +L'utilizzo di questo metodo di aggiornamento richiede l'aggiornamento dell'indirizzo del contratto logico nel contratto di archiviazione. Devi anche configurare il nuovo contratto logico con l'indirizzo del contratto di archiviazione per i motivi spiegati in precedenza. -Il modello di separazione dei dati è indubbiamente più facile da implementare rispetto alla migrazione del contratto. Tuttavia, dovrai gestire svariati contratti e implementare complessi schemi di autorizzazione per proteggere i contratti intelligenti dagli aggiornamenti malevoli. +Il modello di separazione dei dati è probabilmente più facile da implementare rispetto alla migrazione del contratto. Tuttavia, dovrai gestire più contratti e implementare schemi di autorizzazione complessi per proteggere i contratti intelligenti da aggiornamenti dannosi. -### Meccanismo di aggiornamento n. 3: modelli del proxy {#proxy-patterns} +### Meccanismo di aggiornamento #3: Modelli proxy {#proxy-patterns} -Anche il modello del proxy utilizza la separazione dei dati per mantenere la logica aziendale e i dati in contratti separati. Tuttavia, in un modello del proxy, il contratto di archiviazione (detto proxy) chiama il contratto logico durante l'esecuzione del codice. Questo è l'inverso del metodo di separazione dei dati, in cui il contratto logico chiama il contratto d'archiviazione. +Anche il modello proxy utilizza la separazione dei dati per mantenere la logica di business e i dati in contratti separati. Tuttavia, in un modello proxy, il contratto di archiviazione (chiamato proxy) chiama il contratto logico durante l'esecuzione del codice. Questo è l'inverso del metodo di separazione dei dati, in cui il contratto logico chiama il contratto di archiviazione. -Questo è quanto si verifica in un modello del proxy: +Ecco cosa succede in un modello proxy: -1. Gli utenti interagiscono con il contratto proxy, che memorizza i dati ma non detiene la logica aziendale. +1. Gli utenti interagiscono con il contratto proxy, che memorizza i dati, ma non contiene la logica di business. -2. Il contratto proxy memorizza gli indirizzi del contratto logico e delega tutte le chiamate alle funzioni al contratto logico (che detiene la logica aziendale) utilizzando la funzione `delegatecall`. +2. Il contratto proxy memorizza l'indirizzo del contratto logico e delega tutte le chiamate di funzione al contratto logico (che contiene la logica di business) utilizzando la funzione `delegatecall`. -3. Dopo l'inoltro della chiamata al contratto logico, i dati restituiti dal contratto logico sono recuperati e restituiti all'utente. +3. Dopo che la chiamata è stata inoltrata al contratto logico, i dati restituiti dal contratto logico vengono recuperati e restituiti all'utente. -Utilizzare i modelli del proxy richiede una comprensione della funzione **delegatecall**. Fondamentalmente, `delegatecall` è un opcode che permette a un contratto di chiamarne un altro, mentre l'esecuzione effettiva del codice si verifica nel contesto del contratto chiamante. Un'implicazione dell'utilizzo di `delegatecall` nei modelli del proxy è che il contratto proxy legge e scrive alla propria archiviazione, eseguendo la logica archiviata al contratto logico come se stesse chiamando una funzione interna. +L'utilizzo dei modelli proxy richiede la comprensione della funzione **delegatecall**. Fondamentalmente, `delegatecall` è un codice operativo (opcode) che consente a un contratto di chiamare un altro contratto, mentre l'effettiva esecuzione del codice avviene nel contesto del contratto chiamante. Un'implicazione dell'uso di `delegatecall` nei modelli proxy è che il contratto proxy legge e scrive nella sua archiviazione ed esegue la logica memorizzata nel contratto logico come se stesse chiamando una funzione interna. Dalla [documentazione di Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries): -> _Esiste una variante speciale di una chiamata al messaggio, detta **delegatecall**, identica a una chiamata al messaggio tranne nel fatto che il codice all'indirizzo di destinazione è eseguito nel contesto (cioè, all'indirizzo) del contratto chiamante e `msg.sender` e `msg.value` non modificano i propri valori. _ _Ciò significa che un contratto può caricare dinamicamente il codice da un indirizzo differente all'esecuzione. L'archiviazione, l'indirizzo corrente e il saldo fanno ancora riferimento al contratto chiamante, solo il codice è preso dall'indirizzo chiamato._ +> _Esiste una variante speciale di una chiamata di messaggio, denominata **delegatecall**, che è identica a una chiamata di messaggio a parte il fatto che il codice all'indirizzo di destinazione viene eseguito nel contesto (cioè, all'indirizzo) del contratto chiamante e `msg.sender` e `msg.value` non cambiano i loro valori._ _Ciò significa che un contratto può caricare dinamicamente codice da un indirizzo diverso in fase di esecuzione. L'archiviazione, l'indirizzo corrente e il saldo si riferiscono ancora al contratto chiamante, solo il codice viene preso dall'indirizzo chiamato._ -Il contratto proxy sa di invocare `delegatecall` ogni volta che un utente chiama una funzione, poiché ha una funzione di `fallback` integrata. Nella programmazione in Solidity, la [funzione di fallback](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) è eseguita quando una chiamata a una funzione non corrisponde alle funzioni specificate in un contratto. +Il contratto proxy sa di dover invocare `delegatecall` ogni volta che un utente chiama una funzione perché ha una funzione di `fallback` integrata. Nella programmazione Solidity la [funzione di fallback](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) viene eseguita quando una chiamata di funzione non corrisponde alle funzioni specificate in un contratto. -Far funzionare il modello del proxy richiede la scrittura di una funzione di fallback personalizzata che specifichi come il contratto proxy dovrebbe gestire le chiamate alla funzione che non supporta. In questo caso, la funzione di fallback del proxy è programmata per avviare una delegatecall e reindirizzare la richiesta dell'utente all'implementazione del contratto logico corrente. +Far funzionare il modello proxy richiede la scrittura di una funzione di fallback personalizzata che specifichi come il contratto proxy debba gestire le chiamate di funzione che non supporta. In questo caso la funzione di fallback del proxy è programmata per avviare una delegatecall e reindirizzare la richiesta dell'utente all'attuale implementazione del contratto logico. -Il contratto proxy è immutabile di default, ma possono essere creati dei nuovi contratti logici con logica aziendale aggiornata. Eseguire l'aggiornamento dipende quindi dalla modifica dell'indirizzo del contratto logico a cui si fa riferimento nel contratto proxy. +Il contratto proxy è immutabile per impostazione predefinita, ma possono essere creati nuovi contratti logici con logica di business aggiornata. Eseguire l'aggiornamento è quindi una questione di modifica dell'indirizzo del contratto logico a cui si fa riferimento nel contratto proxy. -Indicando il contratto proxy a un nuovo contratto logico, il codice eseguito quando gli utenti chiamano la funzione del contratto proxy cambia. Ciò ci consente di aggiornare la logica di un contratto senza chiedere agli utenti di interagire con un nuovo contratto. +Puntando il contratto proxy a un nuovo contratto logico, il codice eseguito quando gli utenti chiamano la funzione del contratto proxy cambia. Questo ci consente di aggiornare la logica di un contratto senza chiedere agli utenti di interagire con un nuovo contratto. -I modelli del proxy sono un metodo popolare per aggiornare i contratti intelligenti poiché eliminano le difficoltà associate alla migrazione del contratto. Tuttavia, i modelli del proxy sono più complicati da utilizzare e possono introdurre falle critiche, come [conflitti del selettore di funzione](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357), se usate impropriamente. +I modelli proxy sono un metodo popolare per aggiornare i contratti intelligenti perché eliminano le difficoltà associate alla migrazione del contratto. Tuttavia, i modelli proxy sono più complicati da usare e possono introdurre difetti critici, come i [conflitti dei selettori di funzione](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357), se usati in modo improprio. -[Maggiori informazioni sui modelli del proxy](https://blog.openzeppelin.com/proxy-patterns/). +[Maggiori informazioni sui modelli proxy](https://blog.openzeppelin.com/proxy-patterns/). -### Meccanismo di aggiornamento n. 4: modello strategico {#strategy-pattern} +### Meccanismo di aggiornamento #4: Modello di strategia {#strategy-pattern} -Questa tecnica è influenzata dal [modello strategico](https://en.wikipedia.org/wiki/Strategy_pattern), che incoraggia la creazione di programmi software che si interfaccino con altri programmi per implementare specifiche funzionalità. Applicare il modello strategico allo sviluppo di Ethereum significherebbe costruire un contratto intelligente che chiami le funzioni da altri contratti. +Questa tecnica è influenzata dal [modello di strategia](https://en.wikipedia.org/wiki/Strategy_pattern), che incoraggia la creazione di programmi software che si interfacciano con altri programmi per implementare funzionalità specifiche. Applicare il modello di strategia allo sviluppo su Ethereum significherebbe costruire un contratto intelligente che chiama funzioni da altri contratti. -Il contratto principale in questo caso contiene la logica aziendale principale, ma si interfaccia con altri contratti intelligenti ("contratti satellite") per eseguire certe funzioni. Questo contratto principale, inoltre, memorizza l'indirizzo per ogni contratto satellite e può passare tra diverse implementazioni del contratto satellite. +Il contratto principale in questo caso contiene la logica di business di base, ma si interfaccia con altri contratti intelligenti ("contratti satellite") per eseguire determinate funzioni. Questo contratto principale memorizza anche l'indirizzo per ogni contratto satellite e può passare da un'implementazione all'altra del contratto satellite. -Puoi creare un nuovo contratto satellite e configurare il contratto principale con il nuovo indirizzo. Ciò ti consente di cambiare le _strategie_ (cioè, implementare nuova logica) per un contratto intelligente. +Puoi costruire un nuovo contratto satellite e configurare il contratto principale con il nuovo indirizzo. Questo ti consente di cambiare _strategie_ (cioè, implementare nuova logica) per un contratto intelligente. -Sebbene sia simile al modello del proxy discusso in precedenza, il modello strategico è differente poiché il contratto principale, con cui gli utenti interagiscono, detiene la logica aziendale. Utilizzare questo modello ti offre l'opportunità di introdurre modifiche limitate a un contratto intelligente senza influenzare l'infrastruttura principale. +Sebbene simile al modello proxy discusso in precedenza, il modello di strategia è diverso perché il contratto principale, con cui gli utenti interagiscono, contiene la logica di business. L'utilizzo di questo modello ti offre l'opportunità di introdurre modifiche limitate a un contratto intelligente senza influire sull'infrastruttura di base. -Lo svantaggio principale è che questo modello è per lo più utile per implementare aggiornamenti minori. Inoltre, se il contratto intelligente è compromesso (es. per via di una violazione), non puoi utilizzare questo metodo di aggiornamento. +Lo svantaggio principale è che questo modello è utile soprattutto per lanciare aggiornamenti minori. Inoltre, se il contratto principale viene compromesso (ad es. tramite un attacco informatico), non puoi utilizzare questo metodo di aggiornamento. -### Meccanismo di aggiornamento n. 5: modello a diamante {#diamond-pattern} +### Meccanismo di aggiornamento #5: Modello a diamante {#diamond-pattern} -Il modello a diamante può essere considerato un miglioramento del modello del proxy. I modelli a diamante differiscono dai modelli del proxy perché il contratto proxy a diamante può delegare le chiamate alle funzioni a più di un contratto logico. +Il modello a diamante può essere considerato un miglioramento del modello proxy. I modelli a diamante differiscono dai modelli proxy perché il contratto proxy a diamante può delegare le chiamate di funzione a più di un contratto logico. -I contratti logici nel modello a diamante sono noti come _sfaccettature_. Per far funzionare il modello a diamante, devi creare una mappatura nel contratto proxy che mappi i [selettori della funzione](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) a diversi indirizzi di sfaccettatura. +I contratti logici nel modello a diamante sono noti come _sfaccettature_ (facets). Per far funzionare il modello a diamante, devi creare una mappatura nel contratto proxy che associ i [selettori di funzione](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) a diversi indirizzi delle sfaccettature. -Quando un utente effettua una chiamata a una funzione, il contratto proxy controlla la mappatura per trovare la sfaccettatura responsabile dell'esecuzione di tale funzione. Quindi invoca `delegatecall` (utilizzando la funzione di fallback) e reindirizza la chiamata al contratto logico appropriato. +Quando un utente effettua una chiamata di funzione, il contratto proxy controlla la mappatura per trovare la sfaccettatura responsabile dell'esecuzione di quella funzione. Quindi invoca `delegatecall` (utilizzando la funzione di fallback) e reindirizza la chiamata al contratto logico appropriato. -Il modello di aggiornamento a diamante presenta dei vantaggi rispetto ai tradizionali modelli di aggiornamento del proxy: +Il modello di aggiornamento a diamante presenta alcuni vantaggi rispetto ai tradizionali modelli di aggiornamento proxy: -1. Ti consente di aggiornare una piccola parte del contratto senza modificare tutto il codice. L'utilizzo del modello del proxy per gli aggiornamenti richiede la creazione di un contratto logico completamente nuovo, anche per aggiornamenti minori. +1. Ti consente di aggiornare una piccola parte del contratto senza modificare tutto il codice. L'utilizzo del modello proxy per gli aggiornamenti richiede la creazione di un contratto logico completamente nuovo, anche per aggiornamenti minori. -2. Tutti i contratti intelligenti (inclusi i contratti logici utilizzati nei modelli del proxy) hanno un limite di dimensione di 24KB che può risultare limitante, specialmente per i contratti complessi che richiedono più funzioni. Il modello a diamante semplifica la risoluzione di questo problema dividendo le funzioni tra più contratti logici. +2. Tutti i contratti intelligenti (inclusi i contratti logici utilizzati nei modelli proxy) hanno un limite di dimensione di 24KB, che può essere una limitazione, specialmente per contratti complessi che richiedono più funzioni. Il modello a diamante semplifica la risoluzione di questo problema suddividendo le funzioni su più contratti logici. -3. I modelli del proxy adottano un approccio omnicomprensivo per i controlli dell'accesso. Un'entità con accesso alle funzioni di aggiornamento può modificare l'_intero_ contratto. Ma il modello a diamante consente un approccio modulare ai permessi, in cui puoi fare in modo che le entità possano aggiornare solo determinate funzioni in un contratto intelligente. +3. I modelli proxy adottano un approccio generico (catch-all) ai controlli di accesso. Un'entità con accesso alle funzioni di aggiornamento può modificare l'_intero_ contratto. Ma il modello a diamante consente un approccio modulare alle autorizzazioni, in cui puoi limitare le entità all'aggiornamento di determinate funzioni all'interno di un contratto intelligente. -[Maggiori informazioni sui modelli a diamante](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). +[Maggiori informazioni sul modello a diamante](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). ## Pro e contro dell'aggiornamento dei contratti intelligenti {#pros-and-cons-of-upgrading-smart-contracts} -| Pro | Contro | -| ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| L'aggiornamento di un contratto intelligente può semplificare la correzione delle vulnerabilità scoperte nella fase post-distribuzione. | L'aggiornamento dei contratti intelligenti nega l'idea dell'immutabilità del codice, il che ha implicazioni per la decentralizzazione e la sicurezza. | -| Gli sviluppatori possono utilizzare gli aggiornamenti logici per aggiungere nuove funzionalità alle applicazioni decentralizzate. | Gli utenti devono fidarsi del fatto che gli sviluppatori non modifichino arbitrariamente i contratti intelligenti. | -| Gli aggiornamenti dei contratti intelligenti possono migliorare la sicurezza per gli utenti finali grazie a una rapida correzione dei bug. | La programmazione di funzionalità di aggiornamento nei contratti intelligenti aggiunge un ulteriore livello di complessità, incrementando la possibilità di falle critiche. | -| Gli aggiornamenti dei contratti danno più spazio agli sviluppatori per sperimentare con varie funzionalità e migliorare le dapp nel corso del tempo. | L'opportunità di aggiornare i contratti intelligenti potrebbe incoraggiare gli sviluppatori a lanciare i progetti più velocemente senza la dovuta diligenza durante la fase di sviluppo. | -| | Un controllo dell'accesso non sicuro o la centralizzazione nei contratti intelligenti possono semplificare l'esecuzione di aggiornamenti non autorizzati da parte di utenti malevoli. | +| Pro | Contro | +| --- | --- | +| Un aggiornamento di un contratto intelligente può semplificare la correzione delle vulnerabilità scoperte nella fase successiva alla distribuzione. | L'aggiornamento dei contratti intelligenti nega l'idea dell'immutabilità del codice, il che ha implicazioni per la decentralizzazione e la sicurezza. | +| Gli sviluppatori possono utilizzare gli aggiornamenti logici per aggiungere nuove funzionalità alle applicazioni decentralizzate. | Gli utenti devono fidarsi che gli sviluppatori non modifichino arbitrariamente i contratti intelligenti. | +| Gli aggiornamenti dei contratti intelligenti possono migliorare la sicurezza per gli utenti finali poiché i bug possono essere corretti rapidamente. | Programmare la funzionalità di aggiornamento nei contratti intelligenti aggiunge un ulteriore livello di complessità e aumenta la possibilità di difetti critici. | +| Gli aggiornamenti dei contratti offrono agli sviluppatori più spazio per sperimentare diverse funzionalità e migliorare le dApp nel tempo. | L'opportunità di aggiornare i contratti intelligenti potrebbe incoraggiare gli sviluppatori a lanciare i progetti più velocemente senza eseguire la dovuta diligenza durante la fase di sviluppo. | +| | Un controllo degli accessi insicuro o la centralizzazione nei contratti intelligenti possono rendere più facile per gli attori malintenzionati eseguire aggiornamenti non autorizzati. | -## Considerazioni sull'aggiornamento dei contratti intelligenti {#considerations-for-upgrading-smart-contracts} +## Considerazioni per l'aggiornamento dei contratti intelligenti {#considerations-for-upgrading-smart-contracts} -1. Utilizzare meccanismi di controllo/autorizzazione dell'accesso sicuro per prevenire aggiornamenti non autorizzati ai contratti intelligenti, specialmente se si utilizzano modelli proxy, modelli strategici o separazione dei dati. Un esempio è limitare l'accesso alla funzione di aggiornamento, così che soltanto il proprietario del contratto possa chiamarla. +1. Utilizza meccanismi sicuri di controllo degli accessi/autorizzazione per prevenire aggiornamenti non autorizzati dei contratti intelligenti, specialmente se si utilizzano modelli proxy, modelli di strategia o separazione dei dati. Un esempio è limitare l'accesso alla funzione di aggiornamento, in modo che solo il proprietario del contratto possa chiamarla. -2. L'aggiornamento dei contratti intelligenti è un'attività complessa e richiede un elevato livello di diligenza per prevenire l'introduzione di vulnerabilità. +2. L'aggiornamento dei contratti intelligenti è un'attività complessa e richiede un alto livello di diligenza per prevenire l'introduzione di vulnerabilità. -3. Ridurre le ipotesi di fiducia decentralizzando il processo di implementazione degli aggiornamenti. Le possibili strategie includono l'utilizzo di un [contratto del portafoglio multifirma](/developers/docs/smart-contracts/#multisig) per controllare gli aggiornamenti, o la richiesta ai [membri di una DAO](/dao/) di votare sull'approvazione dell'aggiornamento. +3. Riduci le ipotesi di fiducia decentralizzando il processo di implementazione degli aggiornamenti. Le possibili strategie includono l'utilizzo di un [contratto di portafoglio multifirma](/developers/docs/smart-contracts/#multisig) per controllare gli aggiornamenti, o richiedere ai [membri di una DAO](/dao/) di votare per approvare l'aggiornamento. -4. Essere consapevoli dei costi comportati dall'aggiornamento dei contratti. Ad esempio, copiare lo stato (es. i saldi degli utenti) da un contratto vecchio a uno nuovo durante la sua migrazione potrebbe richiedere più di una transazione, il che significa maggiori commissioni sul carburante. +4. Sii consapevole dei costi coinvolti nell'aggiornamento dei contratti. Ad esempio, copiare lo stato (es. i saldi degli utenti) da un vecchio contratto a un nuovo contratto durante la migrazione del contratto potrebbe richiedere più di una transazione, il che significa maggiori commissioni del gas. -5. Considerare l'implementazione di **blocchi temporali** per proteggere gli utenti. Un blocco temporale si riferisce a un ritardo imposto alle modifiche a un sistema. I blocchi temporali sono combinabili con un sistema di governance multifirma per controllare gli aggiornamenti: se un'azione proposta raggiunge la soglia di approvazione necessaria, non viene eseguita fino al termine del periodo di ritardo predefinito. +5. Considera l'implementazione di **timelock** (blocchi temporali) per proteggere gli utenti. Un timelock si riferisce a un ritardo imposto alle modifiche di un sistema. I timelock possono essere combinati con un sistema di governance multifirma per controllare gli aggiornamenti: se un'azione proposta raggiunge la soglia di approvazione richiesta, non viene eseguita fino allo scadere del periodo di ritardo predefinito. -I blocchi temporali danno del tempo agli utenti per uscire dal sistema se sono in disaccordo con una modifica proposta (es. aggiornamento logico o nuovi schemi di commissioni). Senza i blocchi temporali, gli utenti devono fidarsi del fatto che gli sviluppatori non implementino modifiche arbitrarie in un contratto intelligente senza preavviso. In questo caso lo svantaggio è che i blocchi temporali limitano la possibilità di correggere rapidamente le vulnerabilità. +I timelock danno agli utenti un po' di tempo per uscire dal sistema se non sono d'accordo con una modifica proposta (es. aggiornamento logico o nuovi schemi di commissioni). Senza i timelock, gli utenti devono fidarsi che gli sviluppatori non implementino modifiche arbitrarie in un contratto intelligente senza preavviso. Lo svantaggio in questo caso è che i timelock limitano la capacità di correggere rapidamente le vulnerabilità. ## Risorse {#resources} -**OpenZeppelin Upgrades Plugins - _Una suite di strumenti per distribuire e proteggere contratti intelligenti aggiornabili._** +**Plugin di aggiornamento di OpenZeppelin - _Una suite di strumenti per distribuire e proteggere contratti intelligenti aggiornabili._** - [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) - [Documentazione](https://docs.openzeppelin.com/upgrades) ## Tutorial {#tutorials} -- [Aggiornare i tuoi contratti intelligenti | Tutorial YouTube](https://www.youtube.com/watch?v=bdXJmWajZRY) di Patrick Collins -- [Tutorial di migrazione dei contratti intelligenti di Ethereum](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) di Austin Griffith +- [Aggiornare i tuoi contratti intelligenti | Tutorial su YouTube](https://www.youtube.com/watch?v=bdXJmWajZRY) di Patrick Collins +- [Tutorial sulla migrazione dei contratti intelligenti di Ethereum](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) di Austin Griffith - [Utilizzare il modello proxy UUPS per aggiornare i contratti intelligenti](https://blog.logrocket.com/author/praneshas/) di Pranesh A.S -- [Tutorial Web3: scrivere contratti intelligenti aggiornabili (proxy) utilizzando OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) di fangjun.eth +- [Tutorial Web3: Scrivere un contratto intelligente aggiornabile (proxy) utilizzando OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) di fangjun.eth ## Letture consigliate {#further-reading} - [Lo stato degli aggiornamenti dei contratti intelligenti](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) di Santiago Palladino -- [Svariati metodi per aggiornare un contratto intelligente in Solidity](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - Blog Crypto Market Pool -- [Impara: aggiornare i contratti intelligenti](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - Documentazione di OpenZeppelin -- [Modelli proxy per l'aggiornabilità dei contratti in Solidity: proxy trasparenti vs. UUPS](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) di Naveen Sahu -- [Come funzionano gli aggiornamenti a diamante](https://dev.to/mudgen/how-diamond-upgrades-work-417j) di Nick Mudge +- [Diversi modi per aggiornare un contratto intelligente in Solidity](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - Blog di Crypto Market Pool +- [Impara: Aggiornare i contratti intelligenti](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - Documentazione di OpenZeppelin +- [Modelli proxy per l'aggiornabilità dei contratti in Solidity: Proxy trasparenti vs UUPS](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) di Naveen Sahu +- [Come funzionano gli aggiornamenti a diamante](https://dev.to/mudgen/how-diamond-upgrades-work-417j) di Nick Mudge \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/it/developers/docs/smart-contracts/verifying/index.md index f46d2fbc5f8..44688bd7622 100644 --- a/public/content/translations/it/developers/docs/smart-contracts/verifying/index.md +++ b/public/content/translations/it/developers/docs/smart-contracts/verifying/index.md @@ -1,107 +1,113 @@ --- -title: Verificare gli smart contract +title: Verificare i contratti intelligenti description: Una panoramica della verifica del codice sorgente per i contratti intelligenti di Ethereum lang: it --- -I [contratti intelligenti](/developers/docs/smart-contracts/) sono progettati per essere "senza fiducia", a significare che gli utenti non dovrebbero essere obbligati a fidarsi di terze parti (es. sviluppatori e aziende) prima di interagire con un contratto. Come requisito della mancanza di fiducia, gli utenti e gli altri sviluppatori devono poter verificare il codice sorgente di un contratto intelligente. La verifica del codice sorgente assicura agli utenti e agli sviluppatori che il codice del contratto pubblicato è lo stesso eseguito all'indirizzo del contratto sulla blockchain di Ethereum. +I [contratti intelligenti](/developers/docs/smart-contracts/) sono progettati per essere "trustless" (senza bisogno di fiducia), il che significa che gli utenti non dovrebbero doversi fidare di terze parti (ad es. sviluppatori e aziende) prima di interagire con un contratto. Come requisito per l'assenza di fiducia, gli utenti e gli altri sviluppatori devono essere in grado di verificare il codice sorgente di un contratto intelligente. La verifica del codice sorgente assicura agli utenti e agli sviluppatori che il codice del contratto pubblicato sia lo stesso codice in esecuzione all'indirizzo del contratto sulla blockchain di Ethereum. -È importante operare una distinzione tra "verifica del codice sorgente" e "[verifica formale](/developers/docs/smart-contracts/formal-verification/)". La verifica del codice sorgente, che sarà spiegata nel dettaglio di seguito, si riferisce alla verifica che un dato codice sorgente di un contratto intelligente in un linguaggio di alto livello (es. Solidity) si compili allo stesso bytecode da eseguire all'indirizzo del contratto. Tuttavia, la verifica formale descrive la verifica della correttezza di un contratto intelligente, ossia che il contratto si comporti come previsto. Sebbene dipenda dal contesto, la verifica del contratto si riferisce solitamente alla verifica del codice sorgente. +È importante fare una distinzione tra "verifica del codice sorgente" e "[verifica formale](/developers/docs/smart-contracts/formal-verification/)". La verifica del codice sorgente, che verrà spiegata in dettaglio di seguito, si riferisce alla verifica che il codice sorgente fornito di un contratto intelligente in un linguaggio di alto livello (ad es. Solidity) venga compilato nello stesso bytecode da eseguire all'indirizzo del contratto. Tuttavia, la verifica formale descrive la verifica della correttezza di un contratto intelligente, il che significa che il contratto si comporta come previsto. Sebbene dipenda dal contesto, la verifica del contratto di solito si riferisce alla verifica del codice sorgente. ## Cos'è la verifica del codice sorgente? {#what-is-source-code-verification} -Prima di distribuire un contratto intelligente nella [Macchina Virtuale di Ethereum (EVM)](/developers/docs/evm/), gli sviluppatori [compilano](/developers/docs/smart-contracts/compiling/) il codice sorgente del contratto – le istruzioni [scritte in Solidity](/developers/docs/smart-contracts/languages/) o in un altro linguaggio di programmazione di alto livello – al bytecode. Poiché l'EVM non può interpretare le istruzioni di alto livello, compilare il codice sorgente al bytecode (cioè, al basso livello, le istruzioni macchina) è necessario per eseguire la logica del contratto nell'EVM. +Prima di distribuire un contratto intelligente nella [macchina virtuale di Ethereum (EVM)](/developers/docs/evm/), gli sviluppatori [compilano](/developers/docs/smart-contracts/compiling/) il codice sorgente del contratto (istruzioni [scritte in Solidity](/developers/docs/smart-contracts/languages/) o in un altro linguaggio di programmazione di alto livello) in bytecode. Poiché l'EVM non può interpretare istruzioni di alto livello, la compilazione del codice sorgente in bytecode (ovvero istruzioni macchina di basso livello) è necessaria per eseguire la logica del contratto nell'EVM. -La verifica del codice sorgente consiste nel confrontare il codice sorgente di un contratto intelligente e il bytecode compilato utilizzato durante la creazione del contratto per rilevare eventuali differenze. La verifica dei contratti intelligenti è importante perché il codice del contratto pubblicizzato potrebbe avere una forma differente da quello eseguito sulla blockchain. +La verifica del codice sorgente consiste nel confrontare il codice sorgente di un contratto intelligente e il bytecode compilato utilizzato durante la creazione del contratto per rilevare eventuali differenze. Verificare i contratti intelligenti è importante perché il codice del contratto pubblicizzato potrebbe essere diverso da quello in esecuzione sulla blockchain. -La verifica del contratto intelligente consente di studiare cosa faccia un contratto tramite il linguaggio di livello superiore in cui è scritto senza dover leggere il codice macchina. Le funzioni, i valori e solitamente i nomi delle variabili e i commenti restano uguali al codice sorgente originale compilato e distribuito. Questo semplifica molto la lettura del codice. La verifica del codice sorgente, inoltre, prevede la documentazione del codice, così che gli utenti finali sappiano per cosa sia progettato un contratto intelligente. +La verifica del contratto intelligente consente di indagare su cosa fa un contratto attraverso il linguaggio di livello superiore in cui è scritto, senza dover leggere il codice macchina. Funzioni, valori e di solito i nomi delle variabili e i commenti rimangono gli stessi del codice sorgente originale che viene compilato e distribuito. Questo rende la lettura del codice molto più semplice. La verifica del sorgente prevede anche la documentazione del codice, in modo che gli utenti finali sappiano per cosa è progettato un contratto intelligente. ### Cos'è la verifica completa? {#full-verification} -Esistono delle parti del codice sorgente che non influenzano il bytecode compilato, quali commenti o nomi delle variabili. Ciò significa che due codici sorgente con nomi delle variabili e commenti differenti sarebbero entrambi capaci di verificare lo stesso contratto. Così, un utente malevolo può aggiungere commenti ingannevoli o dare nomi di variabili fuorvianti nel codice sorgente e far verificare il contratto con un codice sorgente differente da quello originale. +Ci sono alcune parti del codice sorgente che non influenzano il bytecode compilato, come i commenti o i nomi delle variabili. Ciò significa che due codici sorgente con nomi di variabili diversi e commenti diversi sarebbero entrambi in grado di verificare lo stesso contratto. Con questo, un attore malintenzionato può aggiungere commenti ingannevoli o dare nomi di variabili fuorvianti all'interno del codice sorgente e far verificare il contratto con un codice sorgente diverso da quello originale. -È possibile evitarlo aggiungendo ulteriori dati al bytecode, che servano da _garanzia crittografica_ per l'esattezza del codice sorgente, e da _impronta digitale_ delle informazioni di compilazione. Le informazioni necessarie si trovano nei [metadati del contratto di Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), e l'hash di questo file è aggiunto al bytecode di un contratto. Puoi vederlo in azione nel [playground dei metadati](https://playground.sourcify.dev) +È possibile evitare ciò aggiungendo dati extra al bytecode che fungano da _garanzia crittografica_ per l'esattezza del codice sorgente e come _impronta digitale_ delle informazioni di compilazione. Le informazioni necessarie si trovano nei [metadati del contratto di Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), e l'hash di questo file viene aggiunto al bytecode di un contratto. Puoi vederlo in azione nel [playground dei metadati](https://playground.sourcify.dev) -Il file dei metadati contiene le informazioni sulla compilazione del contratto, inclusi i file sorgente e i loro hash. Ciò significa che, se una delle impostazioni di compilazione o persino un byte in uno dei file sorgente cambiano, il file dei metadati cambia. Di conseguenza, anche l'hash del file dei metadati, aggiunto al bytecode, cambia. Ciò significa che se il bytecode di un contratto + l'hash dei metadati aggiunto corrisponde al codice sorgente e alle impostazioni di compilazione indicati, possiamo essere certi che sia esattamente lo stesso codice sorgente utilizzato nella compilazione originale e che nemmeno un singolo byte sia differente. +Il file dei metadati contiene informazioni sulla compilazione del contratto, inclusi i file sorgente e i loro hash. Ciò significa che se una qualsiasi delle impostazioni di compilazione o anche un solo byte in uno dei file sorgente cambia, il file dei metadati cambia. Di conseguenza, cambia anche l'hash del file dei metadati, che è aggiunto al bytecode. Ciò significa che se il bytecode di un contratto + l'hash dei metadati aggiunto corrispondono al codice sorgente e alle impostazioni di compilazione forniti, possiamo essere sicuri che questo sia esattamente lo stesso codice sorgente utilizzato nella compilazione originale, senza che nemmeno un singolo byte sia diverso. -Questo tipo di verifica che sfrutta l'hash dei metadati è noto come **"[verifica completa](https://docs.sourcify.dev/docs/full-vs-partial-match/)"** (o "verifica perfetta"). Se gli hash dei metadati non corrispondono o non sono considerati nella verifica, sarebbe una "corrispondenza parziale", attualmente il metodo più comune per verificare i contratti. È possibile [inserire del codice malevolo](https://samczsun.com/hiding-in-plain-sight/) che non sarebbe riflesso nel codice sorgente verificato senza la verifica completa. Gran parte degli sviluppatori non è a conoscenza della verifica completa e non conserva il file dei metadati della propria compilazione, per cui finora la verifica parziale è stata il metodo utilizzato di fatto per la verifica dei contratti. +Questo tipo di verifica che sfrutta l'hash dei metadati è indicato come **"[verifica completa](https://docs.sourcify.dev/docs/full-vs-partial-match/)"** (anche "verifica perfetta"). Se gli hash dei metadati non corrispondono o non vengono considerati nella verifica, si tratterebbe di una "corrispondenza parziale", che attualmente è il modo più comune per verificare i contratti. È possibile [inserire codice dannoso](https://samczsun.com/hiding-in-plain-sight/) che non si rifletterebbe nel codice sorgente verificato senza una verifica completa. La maggior parte degli sviluppatori non è a conoscenza della verifica completa e non conserva il file dei metadati della propria compilazione, quindi la verifica parziale è stata finora il metodo de facto per verificare i contratti. ## Perché la verifica del codice sorgente è importante? {#importance-of-source-code-verification} -### Mancanza di fiducia {#trustlessness} +### Assenza di fiducia (Trustlessness) {#trustlessness} -La mancanza di fiducia è senza dubbio la più grande premessa per i contratti intelligenti e le [applicazioni decentralizzate (dapp)](/developers/docs/dapps/). I contratti intelligenti sono "immutabili" e inalterabili; un contratto eseguirà la logica aziendale definita nel codice soltanto al momento della distribuzione. Ciò significa che sviluppatori e imprese non possono manomettere il codice di un contratto dopo la distribuzione su Ethereum. +L'assenza di fiducia è probabilmente la premessa più grande per i contratti intelligenti e le [applicazioni decentralizzate (dApp)](/developers/docs/dapps/). I contratti intelligenti sono "immutabili" e non possono essere alterati; un contratto eseguirà solo la logica di business definita nel codice al momento della distribuzione. Ciò significa che gli sviluppatori e le imprese non possono manomettere il codice di un contratto dopo averlo distribuito su Ethereum. -Perché un contratto intelligente sia senza fiducia, il suo codice dovrebbe essere disponibile per la verifica indipendente. Mentre il bytecode compilato per ogni contratto intelligente è pubblicamente disponibile sulla blockchain, il linguaggio di basso livello è difficile da comprendere, sia per gli sviluppatori che per gli utenti. +Affinché un contratto intelligente sia trustless, il codice del contratto dovrebbe essere disponibile per una verifica indipendente. Sebbene il bytecode compilato per ogni contratto intelligente sia pubblicamente disponibile sulla blockchain, il linguaggio di basso livello è difficile da comprendere, sia per gli sviluppatori che per gli utenti. -I progetti riducono le ipotesi di fiducia pubblicando il codice sorgente dei propri contratti. Ma ciò comporta un altro problema: è difficile verificare che il codice sorgente pubblicato corrisponda al bytecode del contratto. In questo scenario, il valore di mancanza di fiducia è perduto poiché gli utenti devono fidarsi del fatto che gli sviluppatori non modifichino la logica aziendale di un contratto (modificando il bytecode) prima di distribuirlo sulla blockchain. +I progetti riducono le supposizioni di fiducia pubblicando il codice sorgente dei loro contratti. Ma questo porta a un altro problema: è difficile verificare che il codice sorgente pubblicato corrisponda al bytecode del contratto. In questo scenario, il valore dell'assenza di fiducia va perso perché gli utenti devono fidarsi che gli sviluppatori non cambino la logica di business di un contratto (ad es. modificando il bytecode) prima di distribuirlo sulla blockchain. -Gli strumenti di verifica del codice sorgente forniscono garanzie che i file del codice sorgente di un contratto intelligente corrispondano al codice assembly. Il risultato è un ecosistema senza fiducia, in cui gli utenti non si fidano ciecamente di terze parti e verificano piuttosto il codice prima di depositare fondi in un contratto. +Gli strumenti di verifica del codice sorgente forniscono garanzie che i file del codice sorgente di un contratto intelligente corrispondano al codice assembly. Il risultato è un ecosistema trustless, in cui gli utenti non si fidano ciecamente di terze parti e invece verificano il codice prima di depositare fondi in un contratto. -### Sicurezza degli utenti {#user-safety} +### Sicurezza dell'utente {#user-safety} -Con i contratti intelligenti, solitamente è in gioco molto denaro. Questo richiede maggiori garanzie di sicurezza e la verifica della logica di un contratto intelligente prima del suo utilizzo. Il problema è che gli sviluppatori disonesti possono ingannare gli utenti inserendo del codice malevolo in un contratto intelligente. Senza verifiche, i contratti intelligenti malevoli possono contenere delle [backdoor](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), meccanismi di controllo dell'accesso controversi, vulnerabilità sfruttabili e altri aspetti che mettono a repentaglio la sicurezza dell'utente, che passerebbero inosservati. +Con i contratti intelligenti, di solito ci sono molti soldi in gioco. Ciò richiede maggiori garanzie di sicurezza e la verifica della logica di un contratto intelligente prima di utilizzarlo. Il problema è che sviluppatori senza scrupoli possono ingannare gli utenti inserendo codice dannoso in un contratto intelligente. Senza verifica, i contratti intelligenti dannosi possono avere [backdoor](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), meccanismi di controllo degli accessi controversi, vulnerabilità sfruttabili e altre cose che mettono a repentaglio la sicurezza dell'utente e che passerebbero inosservate. -Pubblicare i file del codice sorgente di un contratto intelligente rende più semplice per coloro che sono interessati, come i revisori, valutare il contratto per individuare potenziali vettori d'attacco. Con molte parti che verificano indipendentemente un contratto intelligente, gli utenti hanno maggiori garanzie della sua sicurezza. +La pubblicazione dei file del codice sorgente di un contratto intelligente rende più facile per gli interessati, come i revisori, valutare il contratto per potenziali vettori di attacco. Con più parti che verificano in modo indipendente un contratto intelligente, gli utenti hanno garanzie più forti della sua sicurezza. ## Come verificare il codice sorgente per i contratti intelligenti di Ethereum {#source-code-verification-for-ethereum-smart-contracts} -La [distribuzione di un contratto intelligente su Ethereum](/developers/docs/smart-contracts/deploying/) richiede l'invio di una transazione con il un payload di dati (bytecode compilato) a un indirizzo specifico. Il payload di dati è generato compilando il codice sorgente, più gli [argomenti del costruttore](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) dell'istanza del contratto aggiunti al payload di dati nella transazione. La compilazione è deterministica, il che significa che produce sempre lo stesso risultato (cioè, il bytecode del contratto) se sono utilizzati gli stessi file sorgente e le stesse impostazioni di compilazione (es. versione del compilatore, ottimizzatore). +[Distribuire un contratto intelligente su Ethereum](/developers/docs/smart-contracts/deploying/) richiede l'invio di una transazione con un payload di dati (bytecode compilato) a un indirizzo speciale. Il payload di dati viene generato compilando il codice sorgente, più gli [argomenti del costruttore](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) dell'istanza del contratto aggiunti al payload di dati nella transazione. La compilazione è deterministica, il che significa che produce sempre lo stesso output (ovvero il bytecode del contratto) se vengono utilizzati gli stessi file sorgente e le stesse impostazioni di compilazione (ad es. versione del compilatore, ottimizzatore). ![Un diagramma che mostra la verifica del codice sorgente del contratto intelligente](./source-code-verification.png) La verifica di un contratto intelligente comporta fondamentalmente i seguenti passaggi: -1. Inserimento dei file sorgente e delle impostazioni di compilazione in un compilatore. +1. Inserire i file sorgente e le impostazioni di compilazione in un compilatore. -2. Il compilatore produce il bytecode del contratto +2. Il compilatore restituisce il bytecode del contratto. -3. Ottenimento del bytecode del contratto distribuito a un certo indirizzo +3. Ottenere il bytecode del contratto distribuito a un determinato indirizzo. -4. Confronto del bytecode distribuito con il bytecode ricompilato. Se i codici corrispondono, il contratto viene verificato con il codice sorgente e le impostazioni di compilazione indicati. +4. Confrontare il bytecode distribuito con il bytecode ricompilato. Se i codici corrispondono, il contratto viene verificato con il codice sorgente e le impostazioni di compilazione forniti. -5. Inoltre, se gli hash dei metadati alla fine del bytecode corrispondono, sarà una corrispondenza completa. +5. Inoltre, se gli hash dei metadati alla fine del bytecode corrispondono, si tratterà di una corrispondenza completa. -Nota che questa è una descrizione semplicistica della verifica e che esistono molte eccezioni che non funzionerebbero, come avere delle [variabili immutabili](https://docs.sourcify.dev/docs/immutables/). +Nota che questa è una descrizione semplicistica della verifica e ci sono molte eccezioni che non funzionerebbero con questo, come avere [variabili immutabili](https://docs.sourcify.dev/docs/immutables/). ## Strumenti di verifica del codice sorgente {#source-code-verification-tools} -Il tradizionale processo di verifica dei contratti può essere complesso. Per questo abbiamo strumenti per la verifica del codice sorgente per i contratti intelligenti distribuiti su Ethereum. Questi automatizzano buona parte della verifica del codice sorgente, oltre a curare i contratti verificati per i benefici degli utenti. +Il processo tradizionale di verifica dei contratti può essere complesso. Questo è il motivo per cui disponiamo di strumenti per verificare il codice sorgente per i contratti intelligenti distribuiti su Ethereum. Questi strumenti automatizzano gran parte della verifica del codice sorgente e curano anche i contratti verificati a vantaggio degli utenti. ### Etherscan {#etherscan} -Sebbene per lo più conosciuto come un [esploratore della blockchain di Ethereum](/developers/docs/data-and-analytics/block-explorers/), Etherscan offre anche un [servizio di verifica del codice sorgente](https://etherscan.io/verifyContract) per sviluppatori e utenti dei contratti intelligenti. +Sebbene sia noto principalmente come un [esploratore di blocchi di Ethereum](/developers/docs/data-and-analytics/block-explorers/), Etherscan offre anche un [servizio di verifica del codice sorgente](https://etherscan.io/verifyContract) per sviluppatori e utenti di contratti intelligenti. -Etherscan ti consente di ricompilare il bytecode del contratto dal payload di dati originale (codice sorgente, indirizzo della libreria, impostazioni del compilatore, indirizzo del contratto, ecc.) Se il bytecode ricompilato è associato al bytecode (e ai parametri del costruttore) del contratto su catena, allora [il contratto è verificato](https://info.etherscan.com/types-of-contract-verification/). +Etherscan ti consente di ricompilare il bytecode del contratto dal payload di dati originale (codice sorgente, indirizzo della libreria, impostazioni del compilatore, indirizzo del contratto, ecc.). Se il bytecode ricompilato è associato al bytecode (e ai parametri del costruttore) del contratto on-chain, allora [il contratto è verificato](https://info.etherscan.com/types-of-contract-verification/). -Una volta verificato, il codice sorgente del tuo contratto riceve un'etichetta "verificato" ed è pubblicato su Etherscan per essere revisionato da altri. Inoltre, viene aggiunto alla sezione [Contratti verificati](https://etherscan.io/contractsVerified/), una repository dei contratti intelligenti con codici sorgente verificati. +Una volta verificato, il codice sorgente del tuo contratto riceve un'etichetta "Verified" (Verificato) e viene pubblicato su Etherscan affinché altri possano controllarlo. Viene anche aggiunto alla sezione [Verified Contracts](https://etherscan.io/contractsVerified/), un archivio di contratti intelligenti con codici sorgente verificati. -Etherscan è lo strumento più utilizzato per verificare i contratti. Tuttavia, la verifica dei contratti di Etherscan presenta uno svantaggio: non riesce a confrontare l'**hash dei metadati** del bytecode su catena e del bytecode ricompilato. Dunque, le corrispondenze su Etherscan sono parziali. +Etherscan è lo strumento più utilizzato per verificare i contratti. Tuttavia, la verifica del contratto di Etherscan ha uno svantaggio: non riesce a confrontare l'**hash dei metadati** del bytecode on-chain e del bytecode ricompilato. Pertanto le corrispondenze in Etherscan sono corrispondenze parziali. [Maggiori informazioni sulla verifica dei contratti su Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327). +### Blockscout {#blockscout} + +[Blockscout](https://blockscout.com/) è un esploratore di blockchain open source che fornisce anche un [servizio di verifica dei contratti](https://eth.blockscout.com/contract-verification) per sviluppatori e utenti di contratti intelligenti. Come alternativa open source, Blockscout offre trasparenza su come viene eseguita la verifica e consente i contributi della community per migliorare il processo di verifica. + +Similmente ad altri servizi di verifica, Blockscout ti consente di verificare il codice sorgente del tuo contratto ricompilando il bytecode e confrontandolo con il contratto distribuito. Una volta verificato, il tuo contratto riceve lo stato di verifica e il codice sorgente diventa pubblicamente disponibile per l'auditing e l'interazione. I contratti verificati sono anche elencati nell'[archivio dei contratti verificati](https://eth.blockscout.com/verified-contracts) di Blockscout per facilitarne la navigazione e la scoperta. + ### Sourcify {#sourcify} -[Sourcify](https://sourcify.dev/#/verifier) è un altro strumento, open source e decentralizzato, per verificare i contratti. Non è un esploratore di blocchi e verifica i contratti soltanto su [diverse reti basate sull'EVM](https://docs.sourcify.dev/docs/chains). Agisce da infrastruttura pubblica per la costruzione di altri strumenti e mira a consentire interazioni con i contratti più intuitive, utilizzando i commenti [ABI](/developers/docs/smart-contracts/compiling/#web-applications) e [NatSpc](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) che si trovano nel file dei metadati. +[Sourcify](https://sourcify.dev/#/verifier) è un altro strumento per verificare i contratti che è open source e decentralizzato. Non è un esploratore di blocchi e verifica solo i contratti su [diverse reti basate su EVM](https://docs.sourcify.dev/docs/chains). Agisce come un'infrastruttura pubblica su cui altri strumenti possono basarsi e mira a consentire interazioni con i contratti più a misura d'uomo utilizzando l'[ABI](/developers/docs/smart-contracts/compiling/#web-applications) e i commenti [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) trovati nel file dei metadati. -A differenza di Etherscan, Sourcify supporta le corrispondenze complete con l'hash dei metadati. I contratti verificati sono serviti nella sua [repository pubblica](https://docs.sourcify.dev/docs/repository/) su HTTP e [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), un'archiviazione [indirizzata ai contenuti](https://web3.storage/docs/concepts/content-addressing/) e decentralizzata. Questo consente il recupero dei file dei metadati di un contratto via IPFS, poiché l'hash dei metadati aggiunto è un hash IPFS. +A differenza di Etherscan, Sourcify supporta le corrispondenze complete con l'hash dei metadati. I contratti verificati sono serviti nel suo [archivio pubblico](https://docs.sourcify.dev/docs/repository/) su HTTP e [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), che è un'archiviazione decentralizzata e [indirizzata ai contenuti](https://docs.storacha.network/concepts/content-addressing/). Ciò consente di recuperare il file dei metadati di un contratto tramite IPFS poiché l'hash dei metadati aggiunto è un hash IPFS. -Inoltre, è anche possibile recuperare i file del codice sorgente via IPFS, poiché anche gli hash IPFS di questi file si trovano nei metadati. Un contratto è verificabile fornendo il file dei metadati e i file sorgente tramite la sua API o tramite l'[UI](https://sourcify.dev/#/verifier), o utilizzando i plugin. Lo strumento di monitoraggio di Sourcify ascolta anche le creazioni dei contratti su nuovi blocchi e prova a verificare i contratti se i loro metadati e file sorgente sono pubblicati su IPFS. +Inoltre, è anche possibile recuperare i file del codice sorgente tramite IPFS, poiché anche gli hash IPFS di questi file si trovano nei metadati. Un contratto può essere verificato fornendo il file dei metadati e i file sorgente tramite la sua API o l'[interfaccia utente](https://sourcify.dev/#/verifier), oppure utilizzando i plugin. Lo strumento di monitoraggio di Sourcify ascolta anche le creazioni di contratti su nuovi blocchi e cerca di verificare i contratti se i loro metadati e file sorgente sono pubblicati su IPFS. -[Maggiori informazioni sulla verifica dei contratti su Sourcify](https://blog.soliditylang.org/2020/06/25/sourcify-faq/). +[Maggiori informazioni sulla verifica dei contratti su Sourcify](https://soliditylang.org/blog/2020/06/25/sourcify-faq/). ### Tenderly {#tenderly} -La [piattaforma Tenderly](https://tenderly.co/) consente agli sviluppatori in Web3 di creare, testare, monitorare e gestire i contratti intelligenti. Combinando strumenti di debug con osservabilità e blocchi di costruzione dell'infrastruttura, Tenderly aiuta gli sviluppatori ad accelerare lo sviluppo dei contratti intelligenti. Per abilitare appieno le funzionalità di Tenderly, gli sviluppatori devono [eseguire la verifica del codice sorgente](https://docs.tenderly.co/monitoring/contract-verification) utilizzando svariati metodi. +La [piattaforma Tenderly](https://tenderly.co/) consente agli sviluppatori Web3 di creare, testare, monitorare e gestire contratti intelligenti. Combinando strumenti di debug con osservabilità e blocchi di costruzione dell'infrastruttura, Tenderly aiuta gli sviluppatori ad accelerare lo sviluppo dei contratti intelligenti. Per abilitare completamente le funzionalità di Tenderly, gli sviluppatori devono [eseguire la verifica del codice sorgente](https://docs.tenderly.co/monitoring/contract-verification) utilizzando diversi metodi. -È possibile verificare un contratto sia privatamente che pubblicamente. Se verificato privatamente, il contratto intelligente è visibile soltanto a te (e agli altri membri del tuo progetto). Verificarlo pubblicamente lo rende visibile a chiunque utilizzi la piattaforma Tenderly. +È possibile verificare un contratto privatamente o pubblicamente. Se verificato privatamente, il contratto intelligente è visibile solo a te (e ad altri membri del tuo progetto). Verificare un contratto pubblicamente lo rende visibile a tutti coloro che utilizzano la piattaforma Tenderly. -Puoi verificare i tuoi contratti utilizzando il [Pannello di controllo](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-a-smart-contract), il [plugin Hardhat di Tenderly](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-the-tenderly-hardhat-plugin) o la [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli). +Puoi verificare i tuoi contratti utilizzando la [Dashboard](https://docs.tenderly.co/contract-verification), il [plugin Tenderly Hardhat](https://docs.tenderly.co/contract-verification/hardhat) o la [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli). -Verificando i contratti tramite il Pannello di controllo, devi importare il file sorgente o il file dei metadati generati dal compilatore in Solidity, l'indirizzo/rete e le impostazioni del compilatore. +Quando verifichi i contratti tramite la Dashboard, devi importare il file sorgente o il file dei metadati generato dal compilatore Solidity, l'indirizzo/rete e le impostazioni del compilatore. -L'utilizzo del plugin Hardhat di Tenderly consente di avere maggiore controllo sul processo di verifica con minori sforzi, consentendoti di scegliere tra una verifica automatica (senza codice) e manuale (basata sul codice). +L'utilizzo del plugin Tenderly Hardhat consente un maggiore controllo sul processo di verifica con meno sforzo, permettendoti di scegliere tra la verifica automatica (senza codice) e manuale (basata sul codice). ## Letture consigliate {#further-reading} -- [Verificare il codice sorgente del contratto](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) +- [Verificare il codice sorgente del contratto](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/index.md b/public/content/translations/it/developers/docs/standards/index.md index 0156d8bd1a3..cce80f38217 100644 --- a/public/content/translations/it/developers/docs/standards/index.md +++ b/public/content/translations/it/developers/docs/standards/index.md @@ -1,59 +1,59 @@ --- title: Standard di sviluppo di Ethereum -description: +description: Scopri gli standard di Ethereum, inclusi gli EIP, gli standard dei token come ERC-20 ed ERC-721 e le convenzioni di sviluppo. lang: it incomplete: true --- -## Panoramica degli standard {#standards-overview} +## Panoramica sugli standard {#standards-overview} -La community di Ethereum ha adottato molti standard che aiutano a mantenere interoperabili i progetti (come i [client di Ethereum](/developers/docs/nodes-and-clients/) e i portafogli) tra le implementazioni e ad assicurarsi che i contratti intelligenti e le dapp restino componibili. +La community di Ethereum ha adottato molti standard che aiutano a mantenere i progetti (come i [client di Ethereum](/developers/docs/nodes-and-clients/) e i portafogli) interoperabili tra le implementazioni e assicurano che i contratti intelligenti e le dApp rimangano componibili. -Normalmente, gli standard vengono introdotti come [proposte di miglioramento di Ethereum](/eips/) (EIP) che vengono discusse dai membri della community attraverso un [processo standard](https://eips.ethereum.org/EIPS/eip-1). +In genere, gli standard vengono introdotti come [Proposte di miglioramento di Ethereum](/eips/) (EIP), che vengono discusse dai membri della community attraverso un [processo standard](https://eips.ethereum.org/EIPS/eip-1). -- [Introduzione alle EIP](/eips/) -- [Elenco delle EIP](https://eips.ethereum.org/) -- [Repo di GitHub delle EIP](https://github.com/ethereum/EIPs) -- [Forum di discussione per le EIP](https://ethereum-magicians.org/c/eips) -- [Introduzione alla Governance di Ethereum](/governance/) -- [Ethereum Governance Overview](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _March 31, 2019 - Boris Mann_ -- [Ethereum Protocol Development Governance and Network Upgrade Coordination](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _March 23, 2020 - Hudson Jameson_ -- [Playlist di tutti gli incontri di Core Dev di Ethereum](https://www.youtube.com/@EthereumProtocol) _(Playlist di YouTube)_ +- [Introduzione agli EIP](/eips/) +- [Elenco degli EIP](https://eips.ethereum.org/) +- [Repository GitHub degli EIP](https://github.com/ethereum/EIPs) +- [Forum di discussione degli EIP](https://ethereum-magicians.org/c/eips) +- [Introduzione alla governance di Ethereum](/governance/) +- [Panoramica sulla governance di Ethereum](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _31 marzo 2019 - Boris Mann_ +- [Governance dello sviluppo del protocollo di Ethereum e coordinamento degli aggiornamenti di rete](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _23 marzo 2020 - Hudson Jameson_ +- [Playlist di tutte le riunioni dei Core Dev di Ethereum](https://www.youtube.com/@EthereumProtocol) _(Playlist di YouTube)_ ## Tipi di standard {#types-of-standards} Esistono 3 tipi di EIP: -- Traccia Standard: descrive qualsiasi modifica che influenzi gran parte o tutte le implementazioni di Ethereum -- [Meta-Traccia](https://eips.ethereum.org/meta): descrive un processo circostante Ethereum o propone una modifica a un processo -- [Traccia Informativa](https://eips.ethereum.org/informational): descrive un problema di design di Ethereum o fornisce linee guida o informazioni generali alla community di Ethereum +- Standards Track: descrive qualsiasi modifica che influisce sulla maggior parte o su tutte le implementazioni di Ethereum +- [Meta Track](https://eips.ethereum.org/meta): descrive un processo relativo a Ethereum o propone una modifica a un processo +- [Informational Track](https://eips.ethereum.org/informational): descrive un problema di progettazione di Ethereum o fornisce linee guida generali o informazioni alla community di Ethereum -Inoltre, la Traccia Standard è suddivisa in 4 categorie: +Inoltre, lo Standards Track è suddiviso in 4 categorie: -- [Principale](https://eips.ethereum.org/core): miglioramenti che richiedono una diramazione del consenso -- [Rete](https://eips.ethereum.org/networking): miglioramenti relativi a devp2p e al protocollo secondario Ethereum leggero, nonché miglioramenti proposti alle specifiche del protocollo di rete di Whisper e Swarm. -- [Interfaccia](https://eips.ethereum.org/interface): miglioramenti relativi alle specifiche e agli standard API/RPC del client e certi standard di livello linguistico come i nomi dei metodi e le ABI del contratto. -- [ERC](https://eips.ethereum.org/erc): standard e convenzioni a livello delle applicazioni +- [Core](https://eips.ethereum.org/core): miglioramenti che richiedono una biforcazione del consenso +- [Networking](https://eips.ethereum.org/networking): miglioramenti relativi a devp2p e al Light Ethereum Subprotocol, nonché proposte di miglioramento alle specifiche del protocollo di rete di whisper e swarm. +- [Interface](https://eips.ethereum.org/interface): miglioramenti relativi alle specifiche e agli standard API/RPC dei client e ad alcuni standard a livello di linguaggio come i nomi dei metodi e le ABI dei contratti. +- [ERC](https://eips.ethereum.org/erc): standard e convenzioni a livello di applicazione -Informazioni più dettagliate su questi diversi tipi e categorie sono disponibili in [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types) +Informazioni più dettagliate su questi diversi tipi e categorie sono disponibili nell'[EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types) -### Standard per i token {#token-standards} +### Standard dei token {#token-standards} -- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Un'interfaccia standard per token fungibili (intercambiabili), come i token di voto, i token di staking o le valute virtuali. - - [ERC-223](/developers/docs/standards/tokens/erc-223/) - Uno standard di token fungibili che fa comportare i token in modo identico all'ether e supporta la gestione dei trasferimenti di token dal lato dei destinatari. - - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) - Definisce un'interfaccia token per i token ERC-20 che supporta l'esecuzione del codice del destinatario dopo il codice transfer o transferFrom o spender dopo l'approvazione. -- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Un'interfaccia standard per token non fungibili, come un atto relativo a opere d'arte o canzoni. - - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - Un evento standardizzato emesso quando si creano/trasferiscono uno o molti token non fungibili utilizzando identificatori di token consecutivi. - - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - Estensione dell'interfaccia per il ruolo dei consumatori EIP-721. - - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - Aggiungere un ruolo limitato nel tempo e con permessi limitati ai token ERC-721. -- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(SCONSIGLIATO)** Uno standard token migliorato rispetto a ERC-20. -- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - Uno standard per i token che può contenere risorse sia fungibili che non fungibili. -- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - Uno standard di cassaforte tokenizzata progettato per ottimizzare e unificare i parametri tecnici delle cassaforti di resa. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Un'interfaccia standard per i token fungibili (intercambiabili), come i token di voto, i token di staking o le valute virtuali. + - [ERC-223](/developers/docs/standards/tokens/erc-223/) - Uno standard per i token fungibili che fa sì che i token si comportino in modo identico agli ether e supporta la gestione dei trasferimenti di token dal lato dei destinatari. + - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) - Un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di callback sui contratti destinatari in una singola transazione. +- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Un'interfaccia standard per i token non fungibili, come un atto di proprietà per un'opera d'arte o una canzone. + - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - Un evento standardizzato emesso durante la creazione/trasferimento di uno o più token non fungibili utilizzando identificatori di token consecutivi. + - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - Estensione dell'interfaccia per il ruolo di consumatore EIP-721. + - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - Aggiunge un ruolo limitato nel tempo con permessi ristretti ai token ERC-721. +- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(NON CONSIGLIATO)** Uno standard di token che migliora l'ERC-20. +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - Uno standard di token che può contenere sia asset fungibili che non fungibili. +- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - Uno standard per i vault tokenizzati progettato per ottimizzare e unificare i parametri tecnici dei vault fruttiferi. -Maggiori informazioni sugli [standard peri token](/developers/docs/standards/tokens/). +Scopri di più sugli [standard dei token](/developers/docs/standards/tokens/). ## Letture consigliate {#further-reading} - [Proposte di miglioramento di Ethereum (EIP)](/eips/) -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-1155/index.md index 4bc768c00b0..8796158e78a 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-1155/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-1155/index.md @@ -1,35 +1,35 @@ --- title: Standard Multi-Token ERC-1155 -description: +description: Scopri l'ERC-1155, uno standard multi-token che combina token fungibili e non fungibili in un singolo contratto. lang: it --- ## Introduzione {#introduction} -Un'interfaccia standard per i contratti che gestiscono più tipi di token. Un singolo contratto distribuito può includere qualsiasi combinazione di token fungibili, token non fungibili o altre configurazioni (ad esempio token semi-fungibili). +Un'interfaccia standard per i contratti che gestiscono più tipi di token. Un singolo contratto distribuito può includere qualsiasi combinazione di token fungibili, token non fungibili o altre configurazioni (ad es., token semi-fungibili). **Cosa si intende per Standard Multi-Token?** -L'idea è semplice e cerca di creare un'interfaccia per i contratti intelligenti, che possa rappresentare e controllare qualsiasi numero di tipi di token fungibili e non fungibili. In questo modo, il token ERC-1155 può svolgere le stesse funzioni di un token [ERC-20](/developers/docs/standards/tokens/erc-20/) e [ERC-721](/developers/docs/standards/tokens/erc-721/), e anche entrambi contemporaneamente. Migliora la funzionalità degli standard ERC-20 ed ERC-721, rendendola più efficiente e correggendo ovvi errori d'implementazione. +L'idea è semplice e cerca di creare un'interfaccia per contratti intelligenti in grado di rappresentare e controllare un numero qualsiasi di tipi di token fungibili e non fungibili. In questo modo, il token ERC-1155 può svolgere le stesse funzioni di un token [ERC-20](/developers/docs/standards/tokens/erc-20/) e [ERC-721](/developers/docs/standards/tokens/erc-721/), e persino di entrambi contemporaneamente. Migliora la funzionalità di entrambi gli standard ERC-20 ed ERC-721, rendendolo più efficiente e correggendo evidenti errori di implementazione. -Il token ERC-1155 è descritto nella sua interezza in [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155). +Il token ERC-1155 è descritto completamente nell'[EIP-1155](https://eips.ethereum.org/EIPS/eip-1155). ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzi tutto di leggere [token standards](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/), and [ERC-721](/developers/docs/standards/tokens/erc-721/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima gli [standard dei token](/developers/docs/standards/tokens/), l'[ERC-20](/developers/docs/standards/tokens/erc-20/) e l'[ERC-721](/developers/docs/standards/tokens/erc-721/). -## ERC-1155 Funzioni e caratteristiche: {#body} +## Funzioni e caratteristiche dell'ERC-1155: {#body} -- [Batch Transfer](#batch_transfers): trasferire più risorse con una singola chiamata. -- [Batch Balance](#batch_transfers): richiedere i saldi di più risorse con una singola chiamata. -- [Batch Approval](#batch_approval): approvare tutti i token ad un indirizzo. -- [Hook](#receive_hook): ricevere l'hook dei token. -- [Supporto NFT](#nft_support): Se la quantità è solo 1, trattatala come NFT. -- [Regole di trasferimento sicure](#safe_transfer_rule): insieme di regole per il trasferimento sicuro. +- [Trasferimento in blocco](#batch_transfers): Trasferisce più asset in una singola chiamata. +- [Saldo in blocco](#batch_balance): Ottiene i saldi di più asset in una singola chiamata. +- [Approvazione in blocco](#batch_approval): Approva tutti i token per un indirizzo. +- [Hook](#receive_hook): Hook per la ricezione dei token. +- [Supporto NFT](#nft_support): Se la fornitura è solo 1, lo tratta come NFT. +- [Regole di trasferimento sicuro](#safe_transfer_rule): Insieme di regole per un trasferimento sicuro. -### Trasferimenti in batch {#batch-transfers} +### Trasferimenti in blocco {#batch-transfers} -Il trasferimento in batch funziona in modo molto simile ai normali trasferimenti ERC-20. Diamo un'occhiata alla normale funzione `transferFrom` dell'ERC-20: +Il trasferimento in blocco funziona in modo molto simile ai normali trasferimenti ERC-20. Diamo un'occhiata alla normale funzione `transferFrom` dell'ERC-20: ```solidity // ERC-20 @@ -45,17 +45,17 @@ function safeBatchTransferFrom( ) external; ``` -La sola differenza in ERC-1155 è che passiamo i valori come un array e inoltre passiamo un array di ID. Per esempio, dati `ids=[3, 6, 13]` e `values=[100, 200, 5]`, i trasferimenti risultanti saranno +L'unica differenza nell'ERC-1155 è che passiamo i valori come un array e passiamo anche un array di ID. Ad esempio, dati `ids=[3, 6, 13]` e `values=[100, 200, 5]`, i trasferimenti risultanti saranno: -1. Trasferisci 100 token con id 3 da `_from` a `_to`. -2. Trasferisci 200 token con id 6 da `_from` a `_to`. -3. Trasferisci 5 token con id 13 da `_from` a `_to`. +1. Trasferimento di 100 token con ID 3 da `_from` a `_to`. +2. Trasferimento di 200 token con ID 6 da `_from` a `_to`. +3. Trasferimento di 5 token con ID 13 da `_from` a `_to`. -In ERC-1155 abbiamo solo `transferFrom`, non `transfer`. Per usarlo come un normale `transfer`, basta impostare l'indirizzo di provenienza all'indirizzo che sta chiamando la funzione. +Nell'ERC-1155 abbiamo solo `transferFrom`, non `transfer`. Per usarlo come un normale `transfer`, basta impostare l'indirizzo di provenienza (from) all'indirizzo che sta chiamando la funzione. -### Saldo Batch {#batch-balance} +### Saldo in blocco {#batch-balance} -La rispettiva chiamata dell'ERC-20 `balanceOf`, ha la propria funzione partner con supporto al batch. Come promemoria, questa è la versione dell'ERC-20: +La rispettiva chiamata `balanceOf` dell'ERC-20 ha analogamente la sua funzione partner con supporto per i blocchi. Come promemoria, questa è la versione ERC-20: ```solidity // ERC-20 @@ -68,9 +68,9 @@ function balanceOfBatch( ) external view returns (uint256[] memory); ``` -Ancora più semplice per la chiamata del saldo, possiamo recuperare più saldi in una sola chiamata. Passiamo l'array di proprietari, seguito dall'array di id del token. +Ancora più semplice per la chiamata del saldo, possiamo recuperare più saldi in una singola chiamata. Passiamo l'array dei proprietari, seguito dall'array degli ID dei token. -Per esempio, dati `_ids=[3, 6, 13]` e `_owners=[0xbeef..., 0x1337..., 0x1111...]`, il valore restituito sarà +Ad esempio, dati `_ids=[3, 6, 13]` e `_owners=[0xbeef..., 0x1337..., 0x1111...]`, il valore restituito sarà: ```solidity [ @@ -80,7 +80,7 @@ Per esempio, dati `_ids=[3, 6, 13]` e `_owners=[0xbeef..., 0x1337..., 0x1111...] ] ``` -### Approvazione del batch {#batch-approval} +### Approvazione in blocco {#batch-approval} ```solidity // ERC-1155 @@ -95,13 +95,13 @@ function isApprovedForAll( ) external view returns (bool); ``` -Le approvazioni sono leggermente diverse da quelle dell'ERC-20. Invece di approvare quantità specifiche, si imposta un operatore come approvato o non approvato tramite `setApprovalForAll`. +Le approvazioni sono leggermente diverse rispetto all'ERC-20. Invece di approvare importi specifici, si imposta un operatore come approvato o non approvato tramite `setApprovalForAll`. -È possibile leggere lo stato corrente tramite `isApprovedForAll`. Come puoi vedere, si tratta di un'operazione "o tutto o niente". Non è possibile definire quanti token o quale classe di token approvare. +La lettura dello stato attuale può essere effettuata tramite `isApprovedForAll`. Come puoi vedere, è un'operazione del tipo tutto o niente. Non puoi definire quanti token approvare o persino quale classe di token. -Questo è intenzionalmente progettato pensando alla semplicità. È possibile solo approvare tutto per un indirizzo. +Questo è stato progettato intenzionalmente tenendo a mente la semplicità. Puoi solo approvare tutto per un indirizzo. -### Ricevere Hook {#receive-hook} +### Hook di ricezione {#receive-hook} ```solidity function onERC1155BatchReceived( @@ -113,34 +113,34 @@ function onERC1155BatchReceived( ) external returns(bytes4); ``` -Dato il supporto all'[EIP-165](https://eips.ethereum.org/EIPS/eip-165), i supporti di ERC-1155 ricevono hook solo per i contratti intelligenti. La funzione di hook deve restituire un valore bytes4 magico predefinito dato come: +Dato il supporto dell'[EIP-165](https://eips.ethereum.org/EIPS/eip-165), l'ERC-1155 supporta gli hook di ricezione solo per i contratti intelligenti. La funzione hook deve restituire un valore magico predefinito bytes4 che è dato come: ```solidity bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) ``` -Quando il contratto ricevente restituisce questo valore, si presume che il contratto accetti il trasferimento e sappia come gestire i token ERC-1155. Fantastico, niente più token bloccati in un contratto! +Quando il contratto ricevente restituisce questo valore, si presume che il contratto accetti il trasferimento e sappia come gestire i token ERC-1155. Ottimo, niente più token bloccati in un contratto! ### Supporto NFT {#nft-support} -Quando la quantità è solo una, il token è essenzialmente un token non fungibile (NFT). E, come nel caso dello standard per l'ERC-721, è possibile definire un URL di metadati. L'URL può essere letto e modificato dai client, vedi [qui](https://eips.ethereum.org/EIPS/eip-1155#metadata). +Quando la fornitura è solo una, il token è essenzialmente un token non fungibile (NFT). E come è standard per l'ERC-721, puoi definire un URL di metadati. L'URL può essere letto e modificato dai client, vedi [qui](https://eips.ethereum.org/EIPS/eip-1155#metadata). ### Regola di trasferimento sicuro {#safe-transfer-rule} -Abbiamo già accennato ad alcune regole di trasferimento sicure già nelle spiegazioni precedenti. Ma diamo un'occhiata alla regola più importante: +Abbiamo già accennato ad alcune regole di trasferimento sicuro nelle spiegazioni precedenti. Ma diamo un'occhiata alla più importante delle regole: -1. il chiamante dev'esser approvato per spendere i token per l'indirizzo `_from` o il chiamante dev'esser pari a `_from`. -2. la chiamata di trasferimento deve ripristinarsi se - 1. l'indirizzo `_to` è 0. - 2. la lunghezza di `_ids` non è pari alla lunghezza di `_values`. - 3. uno qualsiasi dei saldi dei titolari per i token in `_ids` è inferiore ai rispettivi importi in `_values` inviati al destinatario. - 4. si verifica qualsiasi altro errore. +1. Il chiamante deve essere approvato per spendere i token per l'indirizzo `_from` o il chiamante deve essere uguale a `_from`. +2. La chiamata di trasferimento deve essere annullata (revert) se: + 1. L'indirizzo `_to` è 0. + 2. La lunghezza di `_ids` non è uguale alla lunghezza di `_values`. + 3. Qualsiasi saldo dei titolari per i token in `_ids` è inferiore ai rispettivi importi in `_values` inviati al destinatario. + 4. Si verifica qualsiasi altro errore. -_Nota_: tutte le funzioni batch compreso l'hook esistono anche come versioni senza batch. Ciò avviene per l'efficienza del gas, considerando che trasferire una singola risorsa sarebbe comunque il metodo più usato. Li abbiamo esclusi per semplicità nelle spiegazioni, lo stesso vale per le regole di trasferimento sicure. I nomi sono identici, basta rimuovere 'Batch'. +_Nota_: Tutte le funzioni in blocco (batch), incluso l'hook, esistono anche in versioni senza blocco. Questo viene fatto per l'efficienza del gas, considerando che il trasferimento di un solo asset sarà probabilmente ancora il modo più comunemente usato. Le abbiamo omesse per semplicità nelle spiegazioni, incluse le regole di trasferimento sicuro. I nomi sono identici, basta rimuovere 'Batch'. ## Letture consigliate {#further-reading} -- [EIP-1155 Standard Multi-Token](https://eips.ethereum.org/EIPS/eip-1155) -- [ERC-1155: Openzeppelin Docs](https://docs.openzeppelin.com/contracts/3.x/erc1155) -- [ERC-1155: Repository di GitHub](https://github.com/enjin/erc-1155) -- [API di Alchemy NFT](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- [EIP-1155: Standard Multi Token](https://eips.ethereum.org/EIPS/eip-1155) +- [ERC-1155: Documentazione di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/erc1155) +- [ERC-1155: Repository GitHub](https://github.com/enjin/erc-1155) +- [API NFT di Alchemy](https://www.alchemy.com/docs/reference/nft-api-quickstart) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-1363/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-1363/index.md new file mode 100644 index 00000000000..7b62851ec60 --- /dev/null +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-1363/index.md @@ -0,0 +1,297 @@ +--- +title: Standard dei Token Pagabili ERC-1363 +description: "L'ERC-1363 è un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di logica personalizzata su un contratto ricevente dopo i trasferimenti, o su un contratto di spesa dopo le approvazioni, tutto all'interno di una singola transazione." +lang: it +--- + +## Introduzione {#introduction} + +### Cos'è l'ERC-1363? {#what-is-erc1363} + +L'ERC-1363 è un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di logica personalizzata su un contratto ricevente dopo i trasferimenti, o su un contratto di spesa dopo le approvazioni, tutto all'interno di una singola transazione. + +### Differenze rispetto all'ERC-20 {#erc20-differences} + +Le operazioni standard dell'ERC-20 come `transfer`, `transferFrom` e `approve`, non consentono l'esecuzione di codice sul contratto ricevente o di spesa senza una transazione separata. +Ciò introduce complessità nello sviluppo dell'interfaccia utente (UI) e attrito nell'adozione, poiché gli utenti devono attendere l'esecuzione della prima transazione per poi inviare la seconda. +Devono inoltre pagare il gas due volte. + +L'ERC-1363 rende i token fungibili capaci di eseguire azioni più facilmente e di funzionare senza l'uso di alcun listener fuori catena. +Consente di effettuare una callback su un contratto ricevente o di spesa, dopo un trasferimento o un'approvazione, in una singola transazione. + +## Prerequisiti {#prerequisites} + +Per comprendere meglio questa pagina, ti consigliamo di leggere prima: + +- [Standard dei token](/developers/docs/standards/tokens/) +- [ERC-20](/developers/docs/standards/tokens/erc-20/) + +## Corpo {#body} + +L'ERC-1363 introduce un'API standard per i token ERC-20 per interagire con i contratti intelligenti dopo `transfer`, `transferFrom` o `approve`. + +Questo standard fornisce funzionalità di base per trasferire token, oltre a consentire l'approvazione dei token in modo che possano essere spesi da un'altra terza parte on-chain, per poi effettuare una callback sul contratto ricevente o di spesa. + +Ci sono molti usi proposti per i contratti intelligenti che possono accettare callback ERC-20. + +Alcuni esempi potrebbero essere: + +- **Crowdsale**: i token inviati innescano l'allocazione istantanea delle ricompense. +- **Servizi**: il pagamento attiva l'accesso al servizio in un solo passaggio. +- **Fatture**: i token saldano le fatture automaticamente. +- **Abbonamenti**: l'approvazione della tariffa annuale attiva l'abbonamento con il pagamento del primo mese. + +Per questi motivi è stato originariamente chiamato **"Token Pagabile"**. + +Il comportamento della callback espande ulteriormente la sua utilità, consentendo interazioni fluide come: + +- **Staking**: i token trasferiti innescano il blocco automatico in un contratto di staking. +- **Votazione**: i token ricevuti registrano i voti in un sistema di governance. +- **Scambio**: le approvazioni dei token attivano la logica di scambio in un singolo passaggio. + +I token ERC-1363 possono essere utilizzati per utilità specifiche in tutti i casi che richiedono l'esecuzione di una callback dopo un trasferimento o un'approvazione ricevuta. +L'ERC-1363 è utile anche per evitare la perdita o il blocco dei token nei contratti intelligenti verificando la capacità del destinatario di gestire i token. + +A differenza di altre proposte di estensione dell'ERC-20, l'ERC-1363 non sovrascrive i metodi `transfer` e `transferFrom` dell'ERC-20 e definisce gli ID delle interfacce da implementare mantenendo la retrocompatibilità con l'ERC-20. + +Dall'[EIP-1363](https://eips.ethereum.org/EIPS/eip-1363): + +### Metodi {#methods} + +I contratti intelligenti che implementano lo standard ERC-1363 **DEVONO** implementare tutte le funzioni nell'interfaccia `ERC1363`, così come le interfacce `ERC20` e `ERC165`. + +```solidity +pragma solidity ^0.8.0; + +/* * + * @title ERC1363 + * @dev Un'interfaccia di estensione per i token ERC-20 che supporta l'esecuzione di codice su un contratto destinatario + * dopo `transfer` o `transferFrom`, o di codice su un contratto spenditore dopo `approve`, in una singola transazione. */ + + + + + +interface ERC1363 is ERC20, ERC165 { + /* * NOTE: l'identificatore ERC-165 per questa interfaccia è 0xb0202a11. + * 0xb0202a11 === + * bytes4(keccak256('transferAndCall(address,uint256)')) ^ + * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ + + + + + + + + + + + + /* * + * @dev Sposta una quantità `value` di token dall'account del chiamante a `to` + * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`. + * @param to L'indirizzo a cui vengono trasferiti i token. + * @param value La quantità di token da trasferire. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + function transferAndCall(address to, uint256 value) external returns (bool); + + /* * + * @dev Sposta una quantità `value` di token dall'account del chiamante a `to` + * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`. + * @param to L'indirizzo a cui vengono trasferiti i token. + * @param value La quantità di token da trasferire. + * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `to`. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); + + /* * + * @dev Sposta una quantità `value` di token da `from` a `to` utilizzando il meccanismo di allowance + * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`. + * @param from L'indirizzo da cui inviare i token. + * @param to L'indirizzo a cui vengono trasferiti i token. + * @param value La quantità di token da trasferire. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + + function transferFromAndCall(address from, address to, uint256 value) external returns (bool); + + /* * + * @dev Sposta una quantità `value` di token da `from` a `to` utilizzando il meccanismo di allowance + * e poi chiama `ERC1363Receiver::onTransferReceived` su `to`. + * @param from L'indirizzo da cui inviare i token. + * @param to L'indirizzo a cui vengono trasferiti i token. + * @param value La quantità di token da trasferire. + * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `to`. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + + + function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); + + /* * + * @dev Imposta una quantità `value` di token come allowance di `spender` sui token del chiamante + * e poi chiama `ERC1363Spender::onApprovalReceived` su `spender`. + * @param spender L'indirizzo che spenderà i fondi. + * @param value La quantità di token da spendere. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + function approveAndCall(address spender, uint256 value) external returns (bool); + + /* * + * @dev Imposta una quantità `value` di token come allowance di `spender` sui token del chiamante + * e poi chiama `ERC1363Spender::onApprovalReceived` su `spender`. + * @param spender L'indirizzo che spenderà i fondi. + * @param value La quantità di token da spendere. + * @param data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `spender`. + * @return Un valore booleano che indica che l'operazione ha avuto successo a meno che non venga lanciata un'eccezione. */ + + + + + + + + + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); +} + +interface ERC20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + function transfer(address to, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); + function approve(address spender, uint256 value) external returns (bool); + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function allowance(address owner, address spender) external view returns (uint256); +} + +interface ERC165 { + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} +``` + +Un contratto intelligente che desidera accettare token ERC-1363 tramite `transferAndCall` o `transferFromAndCall` **DEVE** implementare l'interfaccia `ERC1363Receiver`: + +```solidity +/* * + * @title ERC1363Receiver + * @dev Interfaccia per qualsiasi contratto che desidera supportare `transferAndCall` o `transferFromAndCall` dai contratti token ERC-1363. */ + + + + +interface ERC1363Receiver { + /* * + * @dev Ogni volta che i token ERC-1363 vengono trasferiti a questo contratto tramite `ERC1363::transferAndCall` o `ERC1363::transferFromAndCall` + * da `operator` da `from`, viene chiamata questa funzione. + * + * NOTE: Per accettare il trasferimento, questa deve restituire + * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` + * (cioè 0x88a7ca5c, o il proprio selettore di funzione). + * + * @param operator L'indirizzo che ha chiamato la funzione `transferAndCall` o `transferFromAndCall`. + * @param from L'indirizzo da cui vengono trasferiti i token. + * @param value La quantità di token trasferiti. + * @param data Dati aggiuntivi senza formato specificato. + * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` se il trasferimento è consentito a meno che non venga lanciata un'eccezione. */ + + + + + + + + + + + + + + + function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +Un contratto intelligente che desidera accettare token ERC-1363 tramite `approveAndCall` **DEVE** implementare l'interfaccia `ERC1363Spender`: + +```solidity +/* * + * @title ERC1363Spender + * @dev Interfaccia per qualsiasi contratto che desidera supportare `approveAndCall` dai contratti token ERC-1363. */ + + + + +interface ERC1363Spender { + /* * + * @dev Ogni volta che un `owner` di token ERC-1363 approva questo contratto tramite `ERC1363::approveAndCall` + * per spendere i propri token, viene chiamata questa funzione. + * + * NOTE: Per accettare l'approvazione, questa deve restituire + * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` + * (cioè 0x7b04a2d0, o il proprio selettore di funzione). + * + * @param owner L'indirizzo che ha chiamato la funzione `approveAndCall` e che in precedenza possedeva i token. + * @param value La quantità di token da spendere. + * @param data Dati aggiuntivi senza formato specificato. + * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` se l'approvazione è consentita a meno che non venga lanciata un'eccezione. */ + + + + + + + + + + + + + + function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +## Letture di approfondimento {#further-reading} + +- [ERC-1363: Standard dei Token Pagabili](https://eips.ethereum.org/EIPS/eip-1363) +- [ERC-1363: Repository GitHub](https://github.com/vittominacori/erc1363-payable-token) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-20/index.md index 6d648b8e8df..139b9847d42 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-20/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-20/index.md @@ -1,46 +1,46 @@ --- -title: Standard token ERC-20 -description: +title: Standard dei Token ERC-20 +description: Scopri l'ERC-20, lo standard per i token fungibili su Ethereum che consente applicazioni di token interoperabili. lang: it --- ## Introduzione {#introduction} -**Cos'è un token?** +**Cos'è un Token?** -I token possono rappresentare praticamente tutto in Ethereum: +I token possono rappresentare virtualmente qualsiasi cosa in [Ethereum](/): -- punti di reputazione in piattaforme online -- abilità di un personaggio di un videogioco -- strumenti finanziari come una partecipazione in una società -- una valuta legale come il dollaro statunitense +- punti reputazione in una piattaforma online +- abilità di un personaggio in un gioco +- attività finanziarie come un'azione in una società +- una valuta fiat come l'USD - un'oncia d'oro - e molto altro... -Una caratteristica così potente di Ethereum deve essere gestita da uno standard robusto. Questo è esattamente il ruolo di ERC-20! Questo standard permette agli sviluppatori di creare applicazioni token interoperabili con altri prodotti e servizi. Lo standard ERC-20 è anche utilizzato per fornire funzionalità aggiuntive a [ether](/glossary/#ether). +Una funzionalità così potente di Ethereum deve essere gestita da uno standard robusto, giusto? È esattamente qui che l'ERC-20 entra in gioco! Questo standard consente agli sviluppatori di creare applicazioni di token interoperabili con altri prodotti e servizi. Lo standard ERC-20 è utilizzato anche per fornire funzionalità aggiuntive all'[ether](/glossary/#ether). -**Cos'è ERC-20?** +**Cos'è l'ERC-20?** -ERC-20 introduce uno standard per i token fungibili. In altre parole, questi token hanno una proprietà che rende ogni token esattamente uguale (per tipo e valore) a un altro token. Per esempio, un token ERC-20 funziona esattamente come ETH, ossia 1 token è e sarà sempre uguale a tutti gli altri token. +L'ERC-20 introduce uno standard per i Token Fungibili, in altre parole, hanno una proprietà che rende ogni Token esattamente uguale (per tipo e valore) a un altro Token. Ad esempio, un Token ERC-20 agisce proprio come l'ETH, il che significa che 1 Token è e sarà sempre uguale a tutti gli altri Token. ## Prerequisiti {#prerequisites} -- [Conti](/developers/docs/accounts) -- [Contratti Intelligenti](/developers/docs/smart-contracts/) -- [Standard per i token](/developers/docs/standards/tokens/) +- [Account](/developers/docs/accounts) +- [Contratti intelligenti](/developers/docs/smart-contracts/) +- [Standard dei token](/developers/docs/standards/tokens/) ## Corpo {#body} -L'ERC-20 (Ethereum Request for Comments 20), proposto da Fabian Vogelsteller nel novembre del 2015, è uno Standard del Token che implementa un'API per i token nei Contratti Intelligenti. +L'ERC-20 (Ethereum Request for Comments 20), proposto da Fabian Vogelsteller nel novembre 2015, è uno Standard dei Token che implementa un'API per i token all'interno dei contratti intelligenti. -Esempio di funzionalità fornite da ERC-20: +Esempi di funzionalità fornite dall'ERC-20: -- trasferire token da un conto all'altro -- ottenere il saldo corrente di token di un conto -- richiedere la quantità totale di token disponibile sulla rete -- approvare se un importo di token da un conto è spendibile da un conto di terze parti +- trasferire token da un account a un altro +- ottenere il saldo attuale dei token di un account +- ottenere l'offerta totale del token disponibile sulla rete +- approvare se una quantità di token di un account può essere spesa da un account di terze parti -Se un Contratto Intelligente implementa i seguenti metodi ed eventi, può esser definito un Contratto a Token ERC-20 e, una volta distribuito, sarà responsabile di tenere traccia dei token creati su Ethereum. +Se un contratto intelligente implementa i seguenti metodi ed eventi, può essere definito un Contratto di Token ERC-20 e, una volta distribuito, sarà responsabile di tenere traccia dei token creati su Ethereum. Da [EIP-20](https://eips.ethereum.org/EIPS/eip-20): @@ -67,11 +67,11 @@ event Approval(address indexed _owner, address indexed _spender, uint256 _value) ### Esempi {#web3py-example} -Vediamo perché uno standard è così importante per semplificare l'ispezione dei contratti token ERC-20 su Ethereum. Ci serve solo la Contract Application Binary Interface (ABI) per creare un'interfaccia per qualsiasi token ERC-20. Come puoi vedere di seguito, useremo un'ABI semplificata per fornire un esempio semplice da capire. +Vediamo come uno Standard sia così importante per semplificarci l'ispezione di qualsiasi Contratto di Token ERC-20 su Ethereum. Abbiamo solo bisogno dell'Application Binary Interface (ABI) del contratto per creare un'interfaccia per qualsiasi Token ERC-20. Come puoi vedere di seguito, utilizzeremo un'ABI semplificata, per renderlo un esempio a basso attrito. -#### Esempio Web3.py {#web3py-example} +#### Esempio con Web3.py {#web3py-example} -Prima di tutto, controlla di avere installato la libreria Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation): +Innanzitutto, assicurati di aver installato la libreria Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation): ``` pip install web3 @@ -83,13 +83,13 @@ from web3 import Web3 w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) -dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI -weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH) +dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI +weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH) -acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 +acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 -# questa è un'ABI (Contract Application Binary Interface) semplificata per un contratto token ERC-20. -# It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply() +# Questa è una Contract Application Binary Interface (ABI) semplificata di un contratto token ERC-20. +# Esporrà solo i metodi: balanceOf(address), decimals(), symbol() e totalSupply() simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}], @@ -123,7 +123,7 @@ decimals = dai_contract.functions.decimals().call() totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals -# DAI +# DAI print("===== %s =====" % symbol) print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) @@ -134,7 +134,7 @@ decimals = weth_contract.functions.decimals().call() totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals -# WETH +# WETH print("===== %s =====" % symbol) print("Total Supply:", totalSupply) print("Addr Balance:", addr_balance) @@ -142,32 +142,49 @@ print("Addr Balance:", addr_balance) ## Problemi noti {#erc20-issues} -### Problema di ricezione del token ERC-20 {#reception-issue} +### Problema di ricezione dei token ERC-20 {#reception-issue} -Quando i token ERC-20 sono inviati a un contratto intelligente non progettato per gestirli, questi potrebbero essere perduti permanentemente. Questo si verifica perché il contratto ricevente non dispone della funzionalità per riconoscere o rispondere ai token in entrata e perché nello standard ERC-20 non è presente alcun meccanismo per avvertire il contratto ricevente dei token in entrata. Le forme principali assunte da questo problema sono: +**Al 20/06/2024, almeno 83.656.418 $ in token ERC-20 sono stati persi a causa di questo problema. Nota che un'implementazione ERC-20 pura è soggetta a questo problema a meno che non si implementi una serie di restrizioni aggiuntive oltre allo standard, come elencato di seguito.** -1. Meccanismo di trasferimento del token - - I token ERC-20 sono trasferiti utilizzando le funzioni transfer e transferFrom - - Quando un utente invia i token a un indirizzo del contratto utilizzando queste funzioni, i token sono trasferiti indipendentemente dal fatto che il contratto ricevente sia progettato per gestirli -2. Mancanza di notifica - - Il contratto ricevente non riceve una notifica o callback quando gli vengono inviati i token - - Se il contratto ricevente manca di un meccanismo per gestire i token (ad es. una funzione di ripiego o una funzione dedicata per gestirne la ricezione), i token restano di fatto bloccati nell'indirizzo del contratto -3. Nessuna gestione integrata - - Lo standard ERC-20 non include una funzione obbligatoria che i contratti riceventi devono implementare, il che comporta situazioni in cui molti contratti non riescono a gestire adeguatamente i token in entrata +Quando i token ERC-20 vengono inviati a un contratto intelligente che non è progettato per gestire i token ERC-20, tali token possono andare persi in modo permanente. Questo accade perché il contratto ricevente non ha la funzionalità per riconoscere o rispondere ai token in arrivo e non c'è alcun meccanismo nello standard ERC-20 per notificare al contratto ricevente i token in arrivo. I modi principali in cui questo problema prende forma sono attraverso: -Alcuni standard alternativi hanno risolto questo problema, come l'[ERC-223](/developers/docs/standards/tokens/erc-223) o l'[ERC-1363](/developers/docs/standards/tokens/erc-1363). +1. Meccanismo di trasferimento dei token + - I token ERC-20 vengono trasferiti utilizzando le funzioni transfer o transferFrom + - Quando un utente invia token all'indirizzo del contratto utilizzando queste funzioni, i token vengono trasferiti indipendentemente dal fatto che il contratto ricevente sia progettato per gestirli +2. Mancanza di notifica + - Il contratto ricevente non riceve una notifica o un callback che i token gli sono stati inviati + - Se il contratto ricevente non ha un meccanismo per gestire i token (ad es., una funzione di fallback o una funzione dedicata per gestire la ricezione dei token), i token rimangono effettivamente bloccati nell'indirizzo del contratto +3. Nessuna gestione integrata + - Lo standard ERC-20 non include una funzione obbligatoria da implementare per i contratti riceventi, portando a una situazione in cui molti contratti non sono in grado di gestire correttamente i token in arrivo + +**Possibili Soluzioni** + +Sebbene non sia possibile prevenire completamente questo problema con l'ERC-20, esistono metodi che consentirebbero di ridurre significativamente la possibilità di perdita di token per l'utente finale: + +- Il problema più comune si verifica quando un utente invia token all'indirizzo del contratto del token stesso (ad es., USDT depositati all'indirizzo del contratto del token USDT). Si consiglia di limitare la funzione `transfer(..)` per annullare tali tentativi di trasferimento. Considera l'aggiunta del controllo `require(_to != address(this));` all'interno dell'implementazione della funzione `transfer(..)`. +- La funzione `transfer(..)` in generale non è progettata per depositare token nei contratti. Il pattern `approve(..) & transferFrom(..)` viene invece utilizzato per depositare token ERC-20 nei contratti. È possibile limitare la funzione di trasferimento per impedire il deposito di token in qualsiasi contratto con essa, tuttavia ciò potrebbe interrompere la compatibilità con i contratti che presumono che i token possano essere depositati nei contratti con la funzione `transfer(..)` (ad es., le pool di liquidità di Uniswap). +- Presumi sempre che i token ERC-20 possano finire nel tuo contratto anche se il tuo contratto non dovrebbe mai riceverne. Non c'è modo di prevenire o rifiutare depositi accidentali da parte del destinatario. Si consiglia di implementare una funzione che consenta di estrarre i token ERC-20 depositati accidentalmente. +- Considera l'utilizzo di standard dei token alternativi. + +Da questo problema sono emersi alcuni standard alternativi come l'[ERC-223](/developers/docs/standards/tokens/erc-223) o l'[ERC-1363](/developers/docs/standards/tokens/erc-1363). ## Letture consigliate {#further-reading} -- [EIP-20: Standard dei token ERC-20](https://eips.ethereum.org/EIPS/eip-20) +- [EIP-20: Standard dei Token ERC-20](https://eips.ethereum.org/EIPS/eip-20) - [OpenZeppelin - Token](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) - [OpenZeppelin - Implementazione ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) -- [Alchemy - Guida ai token ERC20 di Solidity](https://www.alchemy.com/overviews/erc20-solidity) - +- [Alchemy - Guida ai Token ERC20 in Solidity](https://www.alchemy.com/overviews/erc20-solidity) ## Altri standard di token fungibili {#fungible-token-standards} - [ERC-223](/developers/docs/standards/tokens/erc-223) - [ERC-1363](/developers/docs/standards/tokens/erc-1363) - [ERC-777](/developers/docs/standards/tokens/erc-777) -- [ERC-4626 - Casseforti tokenizzate](/developers/docs/standards/tokens/erc-4626) \ No newline at end of file +- [ERC-4626 - Caveau tokenizzati](/developers/docs/standards/tokens/erc-4626) + +## Tutorial: Sviluppare con l'ERC-20 su Ethereum {#tutorials} + +- [Panoramica del contratto ERC-20](/developers/tutorials/erc20-annotated-code/) _– Una panoramica annotata riga per riga dell'implementazione del contratto ERC-20 di OpenZeppelin._ +- [ERC-20 con misure di sicurezza](/developers/tutorials/erc20-with-safety-rails/) _– Come aggiungere salvaguardie ai token ERC-20 per aiutare gli utenti a evitare errori comuni._ +- [Inviare token utilizzando ethers.js](/developers/tutorials/send-token-ethersjs/) _– Una guida per principianti al trasferimento di token ERC-20 utilizzando ethers.js._ +- [Alcuni trucchi utilizzati dai token truffa e come rilevarli](/developers/tutorials/scam-token-tricks/) _– Un'analisi approfondita dei pattern dei token ERC-20 truffa e come identificarli._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-223/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-223/index.md index a18b66de118..d79ce24876e 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-223/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-223/index.md @@ -1,44 +1,43 @@ --- -title: Standard dei token ERC-223 -description: Una panoramica dello standard per token fungibili ERC-223, come funziona e un confronto con ERC-20. +title: Standard dei Token ERC-223 +description: Una panoramica dello standard dei token fungibili ERC-223, come funziona e un confronto con l'ERC-20. lang: it --- ## Introduzione {#introduction} -### Cos'è ERC-223? {#what-is-erc223} +### Cos'è l'ERC-223? {#what-is-erc223} -ERC-223 è uno standard per token fungibili simile allo standard ERC-20. La differenza principale è che ERC-223 definisce non solo l'API del token ma anche la logica per trasferire i token dal mittente al destinatario. Introduce un modello di comunicazione che permette la gestione dei trasferimenti di token da parte del destinatario. +L'ERC-223 è uno standard per i token fungibili, simile allo standard ERC-20. La differenza chiave è che l'ERC-223 definisce non solo l'API del token, ma anche la logica per il trasferimento dei token dal mittente al destinatario. Introduce un modello di comunicazione che consente di gestire i trasferimenti di token dal lato del destinatario. -### Differenze rispetto a ERC-20 {#erc20-differences} +### Differenze rispetto all'ERC-20 {#erc20-differences} -ERC-223 affronta alcune limitazioni di ERC-20 e introduce un nuovo metodo di interazione tra il contratto del token e un contratto che potrebbe ricevere i token. Ci sono alcune cose che sono possibili con ERC-223 ma non con ERC-20: +L'ERC-223 affronta alcune limitazioni dell'ERC-20 e introduce un nuovo metodo di interazione tra il contratto del token e un contratto che potrebbe ricevere i token. Ci sono alcune cose che sono possibili con l'ERC-223 ma non con l'ERC-20: -- La gestione del trasferimento dei token da parte del destinatario: i destinatari possono rilevare che un token ERC-223 è stato depositato. -- Il rifiuto di token inviati erroneamente: se un utente manda dei token ERC-223 a un contratto che non dovrebbe ricevere token, il contratto può rifiutare la transazione impedendo la perdita di token. -- Metadati nei trasferimenti: i token ERC-223 possono includere metadati, permettendo di allegare informazioni arbitrarie alle transazioni di token. +- Gestione del trasferimento di token dal lato del destinatario: i destinatari possono rilevare che un token ERC-223 viene depositato. +- Rifiuto di token inviati in modo improprio: se un utente invia token ERC-223 a un contratto che non dovrebbe ricevere token, il contratto può rifiutare la transazione, prevenendo la perdita di token. +- Metadati nei trasferimenti: i token ERC-223 possono includere metadati, consentendo di allegare informazioni arbitrarie alle transazioni di token. ## Prerequisiti {#prerequisites} -- [Conti](/developers/docs/accounts) +- [Account](/developers/docs/accounts) - [Contratti intelligenti](/developers/docs/smart-contracts/) - [Standard dei token](/developers/docs/standards/tokens/) - [ERC-20](/developers/docs/standards/tokens/erc-20/) -## Body {#body} +## Corpo {#body} -ERC-223 è uno standard di token che implementa un'API per i token con contratti intelligenti. Dichiara anche un'API per i contratti che dovrebbero ricevere token ERC-223. I contratti che non supportano l'API ERC-223 del destinatario non possono ricevere token ERC-223, impedendo un errore utente. +L'ERC-223 è uno standard di token che implementa un'API per i token all'interno dei contratti intelligenti. Dichiara inoltre un'API per i contratti che dovrebbero ricevere token ERC-223. I contratti che non supportano l'API del Ricevitore ERC-223 non possono ricevere token ERC-223, prevenendo errori da parte dell'utente. -Se un contratto intelligente implementa i seguenti metodi ed eventi può essere definito contratto di toke compatibile con ERC-223. Una volta distribuito, -sarà responsabile di tener traccia dei token creati su Ethereum. +Se un contratto intelligente implementa i seguenti metodi ed eventi, può essere definito un contratto di token compatibile con l'ERC-223. Una volta distribuito, sarà responsabile di tenere traccia dei token creati su Ethereum. -Il contratto non è obbligato ad avere solo queste funzioni e uno sviluppatore può aggiungere qualsiasi altra funzione da diversi standard di token a questo contratto. Per esempio, le funzioni `approve` e `transferFrom` non sono parte dello standard ERC-223 ma queste funzioni potrebbero essere implementate se necessario. +Il contratto non è obbligato ad avere solo queste funzioni e uno sviluppatore può aggiungere a questo contratto qualsiasi altra funzionalità da diversi standard di token. Ad esempio, le funzioni `approve` e `transferFrom` non fanno parte dello standard ERC-223, ma queste funzioni potrebbero essere implementate qualora fosse necessario. Da [EIP-223](https://eips.ethereum.org/EIPS/eip-223): ### Metodi {#methods} -Il token ERC-223 deve implementare i metodi seguenti: +Il token ERC-223 deve implementare i seguenti metodi: ```solidity function name() public view returns (string) @@ -50,13 +49,13 @@ function transfer(address _to, uint256 _value) public returns (bool success) function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success) ``` -Un contratto che debba ricevere token ERC-223 deve implementare il metodo seguente: +Un contratto che dovrebbe ricevere token ERC-223 deve implementare il seguente metodo: ```solidity function tokenReceived(address _from, uint _value, bytes calldata _data) ``` -Se i token ERC-223 sono inviati a un contratto che non ha implementato la funzione `tokenReceived(..)`, il trasferimento deve fallire e i token non possono essere spostati dal saldo del mittente. +Se i token ERC-223 vengono inviati a un contratto che non implementa la funzione `tokenReceived(..)`, il trasferimento deve fallire e i token non devono essere spostati dal saldo del mittente. ### Eventi {#events} @@ -66,11 +65,11 @@ event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes ### Esempi {#examples} -L'API del token ERC-223 è simile a quella del ERC-20, quindi dalla prospettiva dello sviluppo della UI non ci sono differenze. L'unica eccezione qui è che i token ERC-223 potrebbero non avere le funzioni `approve` + `transferFrom` dato che sono facoltative per questo standard. +L'API del token ERC-223 è simile a quella dell'ERC-20, quindi dal punto di vista dello sviluppo dell'interfaccia utente non c'è alcuna differenza. L'unica eccezione qui è che i token ERC-223 potrebbero non avere le funzioni `approve` + `transferFrom`, poiché queste sono opzionali per questo standard. #### Esempi in Solidity {#solidity-example} -L'esempio seguente illustra come funziona un contratto del token ERC-223 di base: +Il seguente esempio illustra come opera un contratto di token ERC-223 di base: ```solidity pragma solidity ^0.8.19; @@ -116,7 +115,7 @@ contract VeryBasicERC223Token { } ``` -Adesso vogliamo che un altro contratto accetti i depositi di `tokenA` presupponendo che il tokenA sia un token ERC-223. Il contratto deve accettare solo tokenA e rigettare qualsiasi altro token. Quando il contratto riceve tokenA deve emettere un evento `Deposit()` e aumentare il valore della variabile interna `deposits`. +Ora vogliamo che un altro contratto accetti depositi di `tokenA` supponendo che tokenA sia un token ERC-223. Il contratto deve accettare solo tokenA e rifiutare qualsiasi altro token. Quando il contratto riceve tokenA, deve emettere un evento `Deposit()` e aumentare il valore della variabile interna `deposits`. Ecco il codice: @@ -124,14 +123,14 @@ Ecco il codice: contract RecipientContract is IERC223Recipient { event Deposit(address whoSentTheTokens); uint256 deposits = 0; - address tokenA; // The only token that we want to accept. + address tokenA; // L'unico token che vogliamo accettare. function tokenReceived(address _from, uint _value, bytes memory _data) public override { - // It is important to understand that within this function - // msg.sender is the address of a token that is being received, - // msg.value is always 0 as the token contract does not own or send Ether in most cases, - // _from is the sender of the token transfer, - // _value is the amount of tokens that was deposited. + // È importante capire che all'interno di questa funzione + // msg.sender è l'indirizzo di un token che viene ricevuto, + // msg.value è sempre 0 poiché il contratto del token non possiede né invia ether nella maggior parte dei casi, + // _from è il mittente del trasferimento del token, + // _value è la quantità di token che è stata depositata. require(msg.sender == tokenA); deposits += _value; emit Deposit(_from); @@ -141,31 +140,31 @@ contract RecipientContract is IERC223Recipient { ## Domande frequenti {#faq} -### Cosa succede se mandiamo dei tokenB al contratto? {#sending-tokens} +### Cosa succederà se inviamo del tokenB al contratto? {#sending-tokens} -La transazione fallirà e il trasferimento dei token non avrà luogo. I token saranno restituiti all'indirizzo del mittente. +La transazione fallirà e il trasferimento dei token non avverrà. I token verranno restituiti all'indirizzo del mittente. -### Come possiamo fare un deposito su questo contratto? {#contract-deposits} +### Come possiamo effettuare un deposito su questo contratto? {#contract-deposits} -Chiamare la funzione `transfer(address,uint256)` o `transfer(address,uint256,bytes)` del token ERC-223 specificando l'indirizzo del `RecipientContract`. +Chiama la funzione `transfer(address,uint256)` o `transfer(address,uint256,bytes)` del token ERC-223, specificando l'indirizzo del `RecipientContract`. -### Cosa succede se trasferiamo un token ERC-20 a questo contratto? {#erc-20-transfers} +### Cosa succederà se trasferiamo un token ERC-20 a questo contratto? {#erc-20-transfers} -Se un token ERC-20 viene inviato al `RecipientContract`, i token saranno trasferiti ma il trasferimento non verrà riconosciuto (non sarà attivato alcun evento `Deposit()` e il valore del deposito non cambierà). Non è possibile filtrare o impedire depositi di ERC-20 indesiderati. +Se un token ERC-20 viene inviato al `RecipientContract`, i token verranno trasferiti, ma il trasferimento non sarà riconosciuto (nessun evento `Deposit()` verrà attivato e il valore dei depositi non cambierà). I depositi ERC-20 indesiderati non possono essere filtrati o prevenuti. -### E nel caso volessimo eseguire qualche funzione dopo che il deposito del token è completato? {#function-execution} +### E se volessimo eseguire una funzione dopo il completamento del deposito del token? {#function-execution} -Ci sono vari modi per farlo. In questo esempio seguiamo il metodo che rende i trasferimenti di ERC-223 identici a trasferimenti di Ether: +Ci sono diversi modi per farlo. In questo esempio seguiremo il metodo che rende i trasferimenti ERC-223 identici ai trasferimenti di ether: ```solidity contract RecipientContract is IERC223Recipient { event Foo(); event Bar(uint256 someNumber); - address tokenA; // The only token that we want to accept. + address tokenA; // L'unico token che vogliamo accettare. function tokenReceived(address _from, uint _value, bytes memory _data) public override { require(msg.sender == tokenA); - address(this).call(_data); // Handle incoming transaction and perform a subsequent function call. + address(this).call(_data); // Gestire la transazione in entrata ed eseguire una successiva chiamata di funzione. } function foo() public { @@ -178,21 +177,21 @@ contract RecipientContract is IERC223Recipient { } ``` -Quando il `RecipientContract` riceverà un token ERC-223 il contratto eseguirà una funzione codificata come parametro `_data` della transazione del token, in modo identico a come le transazioni di Ether codificano le chiamate di funzioni come transazioni `data`. Leggi [il campo dati](/developers/docs/transactions/#the-data-field) per maggiori informazioni. +Quando il `RecipientContract` riceverà un token ERC-223, il contratto eseguirà una funzione codificata come parametro `_data` della transazione del token, in modo identico a come le transazioni di ether codificano le chiamate di funzione come `data` della transazione. Leggi [il campo dei dati](/developers/docs/transactions/#the-data-field) per maggiori informazioni. -Nell'esempio precedente un token ERC-223 deve essere trasferito all'indirizzo del `RecipientContract` con la funzione `transfer(address,uin256,bytes calldata _data)`. Se il parametro dei dati sarà `0xc2985578` (la firma di una funzione `foo()`) allora la funzione foo() sarà invocata dopo che il deposito del token è stato ricevuto e l'evento Foo() è stato attivato. +Nell'esempio sopra, un token ERC-223 deve essere trasferito all'indirizzo del `RecipientContract` con la funzione `transfer(address,uin256,bytes calldata _data)`. Se il parametro dei dati sarà `0xc2985578` (la firma di una funzione `foo()`), allora la funzione foo() verrà invocata dopo aver ricevuto il deposito del token e verrà attivato l'evento Foo(). -I parametri possono essere codificati anche come `data` del trasferimento del token, per esempio possiamo chiamare la funzione bar() con valore 12345 per `_someNumber`. In questo caso `data` deve essere `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` dove `0x0423a132` è la firma della funzione `bar(uint256)` e `00000000000000000000000000000000000000000000000000000000000004d2` è 12345 in uint256. +I parametri possono essere codificati anche nei `data` del trasferimento del token, ad esempio possiamo chiamare la funzione bar() con il valore 12345 per `_someNumber`. In questo caso i `data` devono essere `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` dove `0x0423a132` è la firma della funzione `bar(uint256)` e `00000000000000000000000000000000000000000000000000000000000004d2` è 12345 come uint256. ## Limitazioni {#limitations} -Nonostante ERC-223 affronti diversi problemi che si trovano nello standard ERC-20, non è privo di limitazioni: +Sebbene l'ERC-223 affronti diversi problemi riscontrati nello standard ERC-20, non è privo di limitazioni: -- Adozione e compatibilità: ERC-223 non è ancora adottato ampiamente, il che potrebbe limitarne la compatibilità con strumenti e piattaforme esistenti. -- Compatibilità retroattiva: ERC-223 non è compatibile con le versioni precedenti di ERC-20, il che significa che i contratti ERC-20 e gli strumenti esistenti non funzionano con i token ERC-223 senza modifiche. -- Costi del gas: ulteriori controlli e funzionalità nei trasferimenti di ERC-223 potrebbero risultare in costi del gas maggiori rispetto a transazioni di ERC-20. +- Adozione e compatibilità: l'ERC-223 non è ancora ampiamente adottato, il che potrebbe limitare la sua compatibilità con gli strumenti e le piattaforme esistenti. +- Retrocompatibilità: l'ERC-223 non è retrocompatibile con l'ERC-20, il che significa che i contratti e gli strumenti ERC-20 esistenti non funzioneranno con i token ERC-223 senza modifiche. +- Costi del gas: i controlli e le funzionalità aggiuntive nei trasferimenti ERC-223 potrebbero comportare costi del gas più elevati rispetto alle transazioni ERC-20. ## Letture consigliate {#further-reading} -- [EIP-223: standard per token ERC-223](https://eips.ethereum.org/EIPS/eip-223) -- [Proposta iniziale di ERC-223](https://github.com/ethereum/eips/issues/223) +- [EIP-223: Standard dei Token ERC-223](https://eips.ethereum.org/EIPS/eip-223) +- [Proposta iniziale dell'ERC-223](https://github.com/ethereum/eips/issues/223) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md index 441c54a55a2..36001c20082 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-4626/index.md @@ -1,26 +1,42 @@ --- -title: Standard della cassaforte tokenizzata ERC-4626 -description: Uno standard per le cassaforti di resa. +title: Standard dei Vault Tokenizzati ERC-4626 +description: Uno standard per i vault che generano rendimento. lang: it --- ## Introduzione {#introduction} -ERC-4626 è uno standard per ottimizzare e unificare i parametri tecnici delle cassaforti di resa. Fornisce un'API standard per le cassaforti di resa tokenizzate che rappresenta le quote di un singolo token ERC-20 sottostante. ERC-4626 delinea anche un'estensione facoltativa per le cassaforti tokenizzate usando ERC-20, offrendo le funzionalità di base per depositare e prelevare token e leggere i saldi. +L'ERC-4626 è uno standard per ottimizzare e unificare i parametri tecnici dei vault che generano rendimento. Fornisce un'API standard per i vault tokenizzati che generano rendimento che rappresentano quote di un singolo token ERC-20 sottostante. L'ERC-4626 delinea anche un'estensione opzionale per i vault tokenizzati che utilizzano l'ERC-20, offrendo funzionalità di base per depositare, prelevare token e leggere i saldi. -**Il ruolo dell'ERC-4626 nelle cassaforti di resa** +**Il ruolo dell'ERC-4626 nei vault che generano rendimento** -I mercati di prestito, gli aggregatori e i token intrinsecamente fruttiferi di interessi aiutano gli utenti a trovare la miglior resa sui propri cripto-token eseguendo strategie differenti. Queste strategie sono create con lievi variazioni, che potrebbero essere incline a errore o potrebbero sprecare risorse di sviluppo. +I mercati di prestito, gli aggregatori e i token intrinsecamente fruttiferi aiutano gli utenti a trovare il miglior rendimento sui loro token crittografici eseguendo diverse strategie. Queste strategie vengono eseguite con lievi variazioni, il che potrebbe essere soggetto a errori o sprecare risorse di sviluppo. -L'ERC-4626 nelle cassaforti di resa ridurrà lo sforzo di integrazione e sbloccherà l'accesso alla resa in varie applicazioni con piccoli sforzi specializzati dagli sviluppatori, creando schemi d'implementazione coerenti e robusti. +L'ERC-4626 nei vault che generano rendimento ridurrà lo sforzo di integrazione e sbloccherà l'accesso al rendimento in varie applicazioni con poco sforzo specializzato da parte degli sviluppatori, creando modelli di implementazione più coerenti e robusti. -Il token ERC-4626 è descritto nella sua interezza in [EIP-4626](https://eips.ethereum.org/EIPS/eip-4626). +Il token ERC-4626 è descritto completamente nell'[EIP-4626](https://eips.ethereum.org/EIPS/eip-4626). + +**Estensione asincrona del vault (ERC-7540)** + +L'ERC-4626 è ottimizzato per depositi e rimborsi atomici fino a un limite. Se il limite viene raggiunto, non possono essere inviati nuovi depositi o rimborsi. Questa limitazione non funziona bene per alcun sistema di contratto intelligente con azioni asincrone o ritardi come prerequisito per interfacciarsi con il Vault (ad es. protocolli di asset del mondo reale, protocolli di prestito sottocollateralizzati, protocolli di prestito cross-chain, token di staking liquido o moduli di sicurezza assicurativa). + +L'ERC-7540 espande l'utilità dei Vault ERC-4626 per i casi d'uso asincroni. L'interfaccia esistente del Vault (`deposit`/`withdraw`/`mint`/`redeem`) è completamente utilizzata per rivendicare le Richieste asincrone. + +L'estensione ERC-7540 è descritta completamente nell'[ERC-7540](https://eips.ethereum.org/EIPS/eip-7540). + +**Estensione del vault multi-asset (ERC-7575)** + +Un caso d'uso mancante che non è supportato dall'ERC-4626 sono i Vault che hanno più asset o punti di ingresso come i Token dei fornitori di liquidità (LP). Questi sono generalmente poco maneggevoli o non conformi a causa del requisito dell'ERC-4626 di essere esso stesso un ERC-20. + +L'ERC-7575 aggiunge il supporto per i Vault con più asset esternalizzando l'implementazione del token ERC-20 dall'implementazione dell'ERC-4626. + +L'estensione ERC-7575 è descritta completamente nell'[ERC-7575](https://eips.ethereum.org/EIPS/eip-7575). ## Prerequisiti {#prerequisites} -Per comprendere meglio questa pagina, consigliamo innanzitutto di leggere [standard per i token](/developers/docs/standards/tokens/) e [ERC-20](/developers/docs/standards/tokens/erc-20/). +Per comprendere meglio questa pagina, ti consigliamo di leggere prima gli [standard dei token](/developers/docs/standards/tokens/) e l'[ERC-20](/developers/docs/standards/tokens/erc-20/). -## ERC-4626 Funzioni e caratteristiche: {#body} +## Funzioni e caratteristiche dell'ERC-4626: {#body} ### Metodi {#methods} @@ -30,7 +46,7 @@ Per comprendere meglio questa pagina, consigliamo innanzitutto di leggere [stand function asset() public view returns (address assetTokenAddress) ``` -Questa funzione restituisce l'indirizzo del token sottostante, utilizzato per la cassaforte per la contabilità, i depositi e i prelievi. +Questa funzione restituisce l'indirizzo del token sottostante utilizzato per il vault per la contabilità, il deposito e il prelievo. #### totalAssets {#totalassets} @@ -38,7 +54,7 @@ Questa funzione restituisce l'indirizzo del token sottostante, utilizzato per la function totalAssets() public view returns (uint256) ``` -Questa funzione restituisce l'importo totale di risorse sottostanti detenute dalla cassaforte. +Questa funzione restituisce l'importo totale degli asset sottostanti detenuti dal vault. #### convertToShares {#convertoshares} @@ -46,7 +62,7 @@ Questa funzione restituisce l'importo totale di risorse sottostanti detenute dal function convertToShares(uint256 assets) public view returns (uint256 shares) ``` -Questa funzione restituisce la quantità di `shares` che sarebbe scambiata dalla cassaforte per la quantità fornita di `assets`. +Questa funzione restituisce la quantità di `shares` (quote) che verrebbe scambiata dal vault per la quantità di `assets` fornita. #### convertToAssets {#convertoassets} @@ -54,7 +70,7 @@ Questa funzione restituisce la quantità di `shares` che sarebbe scambiata dalla function convertToAssets(uint256 shares) public view returns (uint256 assets) ``` -Questa funzione restituisce la quantità di `assets` che sarebbe scambiata dalla cassaforte per la quantità di `shares` fornita. +Questa funzione restituisce la quantità di `assets` che verrebbe scambiata dal vault per la quantità di `shares` fornita. #### maxDeposit {#maxdeposit} @@ -62,7 +78,7 @@ Questa funzione restituisce la quantità di `assets` che sarebbe scambiata dalla function maxDeposit(address receiver) public view returns (uint256 maxAssets) ``` -Questa funzione restituisce la quantità massima di risorse sottostanti depositabili in una singola chiamata a [`deposit`](#deposit) dal `receiver`. +Questa funzione restituisce l'importo massimo di asset sottostanti che possono essere depositati in una singola chiamata [`deposit`](#deposit), con le quote coniate per il `receiver`. #### previewDeposit {#previewdeposit} @@ -78,7 +94,7 @@ Questa funzione consente agli utenti di simulare gli effetti del loro deposito a function deposit(uint256 assets, address receiver) public returns (uint256 shares) ``` -Questa funzione deposita `assets` di token sottostanti nella cassaforte e concede la proprietà delle `shares` al `receiver`. +Questa funzione deposita gli `assets` dei token sottostanti nel vault e concede la proprietà delle `shares` al `receiver`. #### maxMint {#maxmint} @@ -86,7 +102,7 @@ Questa funzione deposita `assets` di token sottostanti nella cassaforte e conced function maxMint(address receiver) public view returns (uint256 maxShares) ``` -Questa funzione restituisce la quantità massima di quote coniabili in una sola chiamata a [`mint`](#mint) dal `receiver`. +Questa funzione restituisce la quantità massima di quote che possono essere coniate in una singola chiamata [`mint`](#mint), con le quote coniate per il `receiver`. #### previewMint {#previewmint} @@ -94,7 +110,7 @@ Questa funzione restituisce la quantità massima di quote coniabili in una sola function previewMint(uint256 shares) public view returns (uint256 assets) ``` -Questa funzione consente agli utenti di simulare gli effetti del loro conio al blocco corrente. +Questa funzione consente agli utenti di simulare gli effetti della loro coniazione al blocco corrente. #### mint {#mint} @@ -102,7 +118,7 @@ Questa funzione consente agli utenti di simulare gli effetti del loro conio al b function mint(uint256 shares, address receiver) public returns (uint256 assets) ``` -Questa funzione conia esattamente quote della cassaforte `shares` al `receiver`, depositando `assets` di token sottostanti. +Questa funzione conia esattamente le `shares` del vault per il `receiver` depositando gli `assets` dei token sottostanti. #### maxWithdraw {#maxwithdraw} @@ -110,7 +126,7 @@ Questa funzione conia esattamente quote della cassaforte `shares` al `receiver`, function maxWithdraw(address owner) public view returns (uint256 maxAssets) ``` -Questa funzione restituisce la quantità massima di risorse sottostanti prelevabili dal saldo dell'`owner` con una singola chiamata a [`withdraw`](#withdraw). +Questa funzione restituisce l'importo massimo di asset sottostanti che possono essere prelevati dal saldo dell'`owner` con una singola chiamata [`withdraw`](#withdraw). #### previewWithdraw {#previewwithdraw} @@ -126,7 +142,7 @@ Questa funzione consente agli utenti di simulare gli effetti del loro prelievo a function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares) ``` -Questa funzione brucia `shares` da `owner` e invia esattamente token `assets` dalla cassaforte al `receiver`. +Questa funzione brucia le `shares` dall'`owner` e invia esattamente i token `assets` dal vault al `receiver`. #### maxRedeem {#maxredeem} @@ -134,7 +150,7 @@ Questa funzione brucia `shares` da `owner` e invia esattamente token `assets` da function maxRedeem(address owner) public view returns (uint256 maxShares) ``` -Questa funzione restituisce la quantità massima di quote che possono essere riscattate dal saldo dell'`owner` tramite una chiamata a [`redeem`](#redeem). +Questa funzione restituisce la quantità massima di quote che possono essere rimborsate dal saldo dell'`owner` tramite una chiamata [`redeem`](#redeem). #### previewRedeem {#previewredeem} @@ -142,7 +158,7 @@ Questa funzione restituisce la quantità massima di quote che possono essere ris function previewRedeem(uint256 shares) public view returns (uint256 assets) ``` -Questa funzione consente agli utenti di simulare gli effetti del loro riscatto al blocco corrente. +Questa funzione consente agli utenti di simulare gli effetti del loro rimborso al blocco corrente. #### redeem {#redeem} @@ -150,7 +166,7 @@ Questa funzione consente agli utenti di simulare gli effetti del loro riscatto a function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets) ``` -Questa funzione riscatta un numero specifico di `shares` dall'`owner` e invia `assets` del token sottostante dalla cassaforte al `receiver`. +Questa funzione rimborsa un numero specifico di `shares` dall'`owner` e invia gli `assets` del token sottostante dal vault al `receiver`. #### totalSupply {#totalsupply} @@ -158,7 +174,7 @@ Questa funzione riscatta un numero specifico di `shares` dall'`owner` e invia `a function totalSupply() public view returns (uint256) ``` -Restituisce il numero totale di quote della cassaforte non riscattate in circolazione. +Restituisce il numero totale di quote del vault non rimborsate in circolazione. #### balanceOf {#balanceof} @@ -166,17 +182,17 @@ Restituisce il numero totale di quote della cassaforte non riscattate in circola function balanceOf(address owner) public view returns (uint256) ``` -Restituisce la quantità totale di quote della cassaforte che l'`owner` possiede attualmente. +Restituisce l'importo totale delle quote del vault che l'`owner` possiede attualmente. ### Mappa dell'interfaccia {#mapOfTheInterface} -![Mappa dell'interfaccia di ERC-4626](./map-of-erc-4626.png) +![Mappa dell'interfaccia ERC-4626](./map-of-erc-4626.png) ### Eventi {#events} -#### Evento di Deposito +#### Evento Deposit -**DEVE** essere emesso quando i token sono depositati nella cassaforte tramite i metodi [`mint`](#mint) e [`deposit`](#deposit) +**DEVE** essere emesso quando i token vengono depositati nel vault tramite i metodi [`mint`](#mint) e [`deposit`](#deposit). ```solidity event Deposit( @@ -187,11 +203,11 @@ event Deposit( ) ``` -Dove `sender` è l'utente che ha scambiato `assets` per `shares` e ha trasferito tali `shares` all'`owner`. +Dove `sender` è l'utente che ha scambiato gli `assets` per le `shares` e ha trasferito tali `shares` all'`owner`. -#### Evento di Prelievo (Withdraw) +#### Evento Withdraw -**DEVE** essere emesso quando le quote sono prelevate dalla cassaforte da un depositante con i metodi [`redeem`](#redeem) o [`withdraw`](#withdraw). +**DEVE** essere emesso quando le quote vengono prelevate dal vault da un depositante nei metodi [`redeem`](#redeem) o [`withdraw`](#withdraw). ```solidity event Withdraw( @@ -203,9 +219,9 @@ event Withdraw( ) ``` -Dove `sender` è l'utente che ha innescato il prelievo e scambiato `shares`, possedute dall'`owner`, per `assets`. `receiver` è l'utente che ha ricevuto le `assets` prelevate. +Dove `sender` è l'utente che ha attivato il prelievo e ha scambiato le `shares`, di proprietà dell'`owner`, per gli `assets`. `receiver` è l'utente che ha ricevuto gli `assets` prelevati. ## Letture consigliate {#further-reading} -- [EIP-4626: Tokenized vault Standard](https://eips.ethereum.org/EIPS/eip-4626) -- [ERC-4626: GitHub Repo](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) +- [EIP-4626: Standard dei vault tokenizzati](https://eips.ethereum.org/EIPS/eip-4626) +- [ERC-4626: Repository GitHub](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-721/index.md index d64b0dc7cde..6715e52a445 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/erc-721/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-721/index.md @@ -1,6 +1,6 @@ --- -title: Standard token non fungibile ERC-721 -description: +title: Standard dei token non fungibili ERC-721 +description: Scopri l'ERC-721, lo standard per i token non fungibili (NFT) che rappresentano risorse digitali uniche su Ethereum. lang: it --- @@ -8,27 +8,29 @@ lang: it **Cos'è un token non fungibile?** -Un token non fungibile (NFT) è usato per identificare inequivocabilmente qualcosa o qualcuno. Questo tipo di Token è perfetto su piattaforme che offrono oggetti collezionabili, chiavi di accesso, biglietti della lotteria, posti numerati per concerti o eventi sportivi ecc. Questo particolare tipo di token offre possibilità straordinarie quindi si merita uno standard vero e proprio, ed ERC-721 serve proprio per questo! +Un token non fungibile (NFT) è utilizzato per identificare qualcosa o qualcuno in modo unico. Questo tipo di token è perfetto per essere utilizzato su piattaforme che offrono oggetti da collezione, chiavi di accesso, biglietti della lotteria, posti numerati per concerti e partite sportive, ecc. Questo tipo speciale di token ha possibilità incredibili, quindi merita uno standard adeguato, e l'ERC-721 è nato per risolvere questo problema! -**Cos'è ERC-721?** +**Cos'è l'ERC-721?** -L'ERC-721 introduce uno standard per gli NFT; in altre parole, questo tipo di Token è unico e può avere un valore differente da un altro Token dallo stesso Contratto Intelligente, forse a causa della sua età, rarità o persino ad altro, come il suo aspetto. Cosa? Aspetto? +L'ERC-721 introduce uno standard per gli NFT; in altre parole, questo tipo di token è unico e può avere un valore diverso rispetto a un altro token proveniente dallo stesso contratto intelligente, magari a causa della sua età, rarità o persino di qualcos'altro come il suo aspetto visivo. +Aspetta, aspetto visivo? -Sì! Tutti gli NFT hanno una variabile `uint256` chiamata `tokenId`, quindi per i contratti ERC-721 la coppia `contract address, uint256 tokenId` deve essere unica a livello globale. Detto ciò, una dapp può avere un "convertitore" che utilizza il `tokenId` come input e restituisce l'immagine di qualcosa come zombie, armi, abilità o teneri gattini! +Sì! Tutti gli NFT hanno una variabile `uint256` chiamata `tokenId`, quindi per qualsiasi contratto ERC-721, la coppia `indirizzo del contratto, uint256 tokenId` deve essere globalmente unica. Detto questo, una dApp può avere un "convertitore" che utilizza il `tokenId` come input e restituisce un'immagine di qualcosa di fantastico, come zombi, armi, abilità o gattini incredibili! ## Prerequisiti {#prerequisites} -- [Conti](/developers/docs/accounts/) -- [Contratti Intelligenti](/developers/docs/smart-contracts/) -- [Standard token](/developers/docs/standards/tokens/) +- [Account](/developers/docs/accounts/) +- [Contratti intelligenti](/developers/docs/smart-contracts/) +- [Standard dei token](/developers/docs/standards/tokens/) ## Corpo {#body} -L'ERC-721 (Ethereum Request for Comments 721), proposto da William Entriken, Dieter Shirely, Jacob Evans e Nastassia Sachs a gennaio 2018, è uno Standard del Token Non Fungibile che implementa un'API per i token nei Contratti Intelligenti. +L'ERC-721 ([Ethereum](/) Request for Comments 721), proposto da William Entriken, Dieter Shirley, Jacob Evans e Nastassia Sachs nel gennaio 2018, è uno standard per token non fungibili che implementa un'API per i token all'interno dei contratti intelligenti. -Fornisce funzionalità come il trasferimento dei token da un conto all'altro, l'ottenimento del saldo corrente del token di un conto, l'ottenimento del proprietario di un token specifico, nonché l'offerta totale del token disponibile sulla rete. Oltre a ciò, ha alcune altre funzionalità, come approvare che un importo di token da un conto possa esser spostato da un conto di terze parti. +Fornisce funzionalità come il trasferimento di token da un account a un altro, l'ottenimento del saldo attuale dei token di un account, l'identificazione del proprietario di un token specifico e anche l'offerta totale del token disponibile sulla rete. +Oltre a queste, ha anche altre funzionalità, come l'approvazione affinché una quantità di token da un account possa essere spostata da un account di terze parti. -Se un Contratto Intelligente implementa i seguenti metodi ed eventi, può esser definito un Contratto a Token Non Fungibile ERC-721 e, una volta distribuito, sarà responsabile di tenere traccia dei token creati su Ethereum. +Se un contratto intelligente implementa i seguenti metodi ed eventi, può essere definito un contratto di token non fungibili ERC-721 e, una volta distribuito, sarà responsabile di tenere traccia dei token creati su Ethereum. Da [EIP-721](https://eips.ethereum.org/EIPS/eip-721): @@ -56,11 +58,12 @@ Da [EIP-721](https://eips.ethereum.org/EIPS/eip-721): ### Esempi {#web3py-example} -Vediamo perché uno standard è così importante per semplificare l'ispezione dei contratti token ERC-721 su Ethereum. Ci serve solo la Contract Application Binary Interface (ABI) per creare un'interfaccia per qualsiasi token ERC-721. Come puoi vedere di seguito, useremo un'ABI semplificata per fornire un esempio semplice da capire. +Vediamo come uno standard sia così importante per semplificarci l'ispezione di qualsiasi contratto di token ERC-721 su Ethereum. +Abbiamo solo bisogno dell'Application Binary Interface (ABI) del contratto per creare un'interfaccia verso qualsiasi token ERC-721. Come puoi vedere di seguito, utilizzeremo un'ABI semplificata, per renderlo un esempio a basso attrito. -#### Esempio Web3.py {#web3py-example} +#### Esempio con Web3.py {#web3py-example} -Prima di tutto, controlla di avere installato la libreria Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation): +Innanzitutto, assicurati di aver installato la libreria Python [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation): ``` pip install web3 @@ -73,12 +76,12 @@ from web3._utils.events import get_event_data w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) -ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties Contract +ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # Contratto CryptoKitties -acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties Sales Auction +acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # Asta di vendita CryptoKitties -# This is a simplified Contract Application Binary Interface (ABI) of an ERC-721 NFT Contract. -# It will expose only the methods: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() +# Questa è una Contract Application Binary Interface (ABI) semplificata di un contratto NFT ERC-721. +# Esporrà solo i metodi: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() simplified_abi = [ { 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}], @@ -136,7 +139,7 @@ print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}") pregnant_kitties = ck_contract.functions.pregnantKitties().call() print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}") -# Using the Transfer Event ABI to get info about transferred Kitties. +# Utilizzo dell'ABI dell'evento Transfer per ottenere informazioni sui Kitties trasferiti. tx_event_abi = { 'anonymous': False, 'inputs': [ @@ -147,7 +150,7 @@ tx_event_abi = { 'type': 'event' } -# We need the event's signature to filter the logs +# Abbiamo bisogno della firma dell'evento per filtrare i log event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex() logs = w3.eth.get_logs({ @@ -156,25 +159,25 @@ logs = w3.eth.get_logs({ "topics": [event_signature] }) -# Notes: -# - Increase the number of blocks up from 120 if no Transfer event is returned. -# - If you didn't find any Transfer event you can also try to get a tokenId at: -# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events -# Click to expand the event's logs and copy its "tokenId" argument +# Note: +# - Aumenta il numero di blocchi oltre 120 se non viene restituito alcun evento Transfer. +# - Se non hai trovato alcun evento Transfer, puoi anche provare a ottenere un tokenId su: +# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events +# Fai clic per espandere i log dell'evento e copia il suo argomento "tokenId" recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs] if recent_tx: - kitty_id = recent_tx[0]['tokenId'] # Paste the "tokenId" here from the link above + kitty_id = recent_tx[0]['tokenId'] # Incolla qui il "tokenId" dal link sopra is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}") ``` -Il contratto CryptoKitties contiene alcuni eventi interessanti oltre a quelli standard. +Il contratto di CryptoKitties ha alcuni eventi interessanti oltre a quelli standard. -Diamo un'occhiata a due di questi, `Pregnant` e `Birth`. +Controlliamone due: `Pregnant` e `Birth`. ```python -# Viene usata l'ABI Pregnant e Birth Events per ottenere informazioni sui nuovi gattini. +# Utilizzo dell'ABI degli eventi Pregnant e Birth per ottenere informazioni sui nuovi Kitties. ck_extra_events_abi = [ { 'anonymous': False, @@ -198,13 +201,13 @@ ck_extra_events_abi = [ 'type': 'event' }] -# We need the event's signature to filter the logs +# Abbiamo bisogno della firma dell'evento per filtrare i log ck_event_signatures = [ w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(), w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), ] -# Here is a Pregnant Event: +# Ecco un evento Pregnant: # - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog pregnant_logs = w3.eth.get_logs({ "fromBlock": w3.eth.block_number - 120, @@ -214,7 +217,7 @@ pregnant_logs = w3.eth.get_logs({ recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs] -# Here is a Birth Event: +# Ecco un evento Birth: # - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a birth_logs = w3.eth.get_logs({ "fromBlock": w3.eth.block_number - 120, @@ -225,20 +228,28 @@ birth_logs = w3.eth.get_logs({ recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs] ``` -## NFT più popolari {#popular-nfts} +## NFT popolari {#popular-nfts} -- [Etherscan NFT Tracker](https://etherscan.io/tokens-nft) elenca i principali NFT su Ethereum per volume di trasferimento. -- [CryptoKitties](https://www.cryptokitties.co/) è un gioco basato su creature a cui si può dare da mangiare, collezionabili e molto tenere chiamate CryptoKitties. -- [Sorare](https://sorare.com/) è un gioco di calcio fantasy globale in cui si possono collezionare oggetti in edizione limitata e gestire squadre, gareggiando per vincere premi. -- [The Ethereum Name Service (ENS)](https://ens.domains/) offre un modo sicuro e decentralizzato per indirizzare risorse sia all'interno che all'esterno della blockchain utilizzando nomi semplici e leggibili. -- [POAP](https://poap.xyz) offre NFT gratuiti alle persone che partecipano a eventi o completano azioni specifiche. I POAP sono creabili e distribuibili gratuitamente. -- [Unstoppable Domains](https://unstoppabledomains.com/) è un'azienda di San Francisco che crea domini sulle blockchain. I domini delle blockchain sostituiscono gli indirizzi della criptovaluta con nomi leggibili dall'uomo, che possono essere usati per creare siti web resistenti alla censura. -- [Gods Unchained Cards](https://godsunchained.com/) è un gioco di carte collezionabili sulla blockchain Ethereum che usa gli NFT per dare una proprietà reale alle risorse del gioco. -- [Bored Ape Yacht Club](https://boredapeyachtclub.com) è una raccolta di 10.000 NFT unici che, oltre a essere opere d'arte la cui rarità è dimostrata, fungono da token di appartenenza al club, fornendo ai membri vantaggi e benefici che possono aumentare nel tempo come risultato degli sforzi della community. +- [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) elenca i migliori NFT su Ethereum per volume di trasferimenti. +- [CryptoKitties](https://www.cryptokitties.co/) è un gioco incentrato su creature allevabili, collezionabili e adorabili che chiamiamo CryptoKitties. +- [Sorare](https://sorare.com/) è un gioco di fantacalcio globale in cui puoi raccogliere oggetti da collezione in edizione limitata, gestire le tue squadre e competere per vincere premi. +- [L'Ethereum Name Service (ENS)](https://ens.domains/) offre un modo sicuro e decentralizzato per indirizzare le risorse sia sulla blockchain che fuori utilizzando nomi semplici e leggibili dall'uomo. +- [POAP](https://poap.xyz) distribuisce NFT gratuiti alle persone che partecipano a eventi o completano azioni specifiche. I POAP sono gratuiti da creare e distribuire. +- [Unstoppable Domains](https://unstoppabledomains.com/) è un'azienda con sede a San Francisco che crea domini sulle blockchain. I domini blockchain sostituiscono gli indirizzi di criptovaluta con nomi leggibili dall'uomo e possono essere utilizzati per abilitare siti web resistenti alla censura. +- [Gods Unchained Cards](https://godsunchained.com/) è un gioco di carte collezionabili (TCG) sulla blockchain di Ethereum che utilizza gli NFT per conferire la vera proprietà alle risorse di gioco. +- [Bored Ape Yacht Club](https://boredapeyachtclub.com) è una collezione di 10.000 NFT unici che, oltre a essere un'opera d'arte di comprovata rarità, funge da token di appartenenza al club, fornendo vantaggi e benefici ai membri che aumentano nel tempo grazie agli sforzi della community. ## Letture consigliate {#further-reading} -- [EIP-721: ERC-721 Non-Fungible Token Standard](https://eips.ethereum.org/EIPS/eip-721) -- [OpenZeppelin - ERC-721 Docs](https://docs.openzeppelin.com/contracts/3.x/erc721) -- [OpenZeppelin - ERC-721 Implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) -- [API di Alchemy NFT](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- [EIP-721: Standard dei token non fungibili ERC-721](https://eips.ethereum.org/EIPS/eip-721) +- [OpenZeppelin - Documentazione ERC-721](https://docs.openzeppelin.com/contracts/3.x/erc721) +- [OpenZeppelin - Implementazione ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) +- [API per NFT di Alchemy](https://www.alchemy.com/docs/reference/nft-api-quickstart) + +## Tutorial: Sviluppare con i token non fungibili (ERC-721) su Ethereum {#tutorials} + +- [Guida al contratto ERC-721 in Vyper](/developers/tutorials/erc-721-vyper-annotated-code/) _– Una guida annotata di un contratto NFT ERC-721 completo scritto in Vyper._ +- [Come scrivere e distribuire un NFT (Parte 1/3)](/developers/tutorials/how-to-write-and-deploy-an-nft/) _– Guida passo passo per scrivere e distribuire il tuo primo contratto intelligente ERC-721._ +- [Come coniare un NFT (Parte 2/3)](/developers/tutorials/how-to-mint-an-nft/) _– Come coniare un NFT ERC-721 utilizzando il tuo contratto intelligente distribuito e Web3._ +- [Come visualizzare il tuo NFT nel tuo portafoglio (Parte 3/3)](/developers/tutorials/how-to-view-nft-in-metamask/) _– Come visualizzare il tuo NFT coniato in MetaMask dopo la distribuzione._ +- [Tutorial per coniare NFT](/developers/tutorials/nft-minter/) _– Crea una dApp full-stack per coniare NFT con un frontend React, MetaMask e Alchemy._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/it/developers/docs/standards/tokens/erc-777/index.md new file mode 100644 index 00000000000..10f92791c55 --- /dev/null +++ b/public/content/translations/it/developers/docs/standards/tokens/erc-777/index.md @@ -0,0 +1,45 @@ +--- +title: Standard dei Token ERC-777 +description: Scopri l'ERC-777, uno standard migliorato per i token fungibili con hook, sebbene l'ERC-20 sia raccomandato per la sicurezza. +lang: it +--- + +## Avvertenza {#warning} + +**L'ERC-777 è difficile da implementare correttamente, a causa della sua [suscettibilità a diverse forme di attacco](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620). Si raccomanda invece di utilizzare l'[ERC-20](/developers/docs/standards/tokens/erc-20/).** Questa pagina rimane come archivio storico. + +## Introduzione? {#introduction} + +L'ERC-777 è uno standard per token fungibili che migliora l'attuale standard [ERC-20](/developers/docs/standards/tokens/erc-20/). + +## Prerequisiti {#prerequisites} + +Per comprendere meglio questa pagina, ti consigliamo di leggere prima l'[ERC-20](/developers/docs/standards/tokens/erc-20/). + +## Quali miglioramenti propone l'ERC-777 rispetto all'ERC-20? {#-erc-777-vs-erc-20} + +L'ERC-777 fornisce i seguenti miglioramenti rispetto all'ERC-20. + +### Hook {#hooks} + +Gli hook sono una funzione descritta nel codice di un contratto intelligente. Gli hook vengono chiamati quando i token vengono inviati o ricevuti tramite il contratto. Ciò consente a un contratto intelligente di reagire ai token in entrata o in uscita. + +Gli hook vengono registrati e scoperti utilizzando lo standard [ERC-1820](https://eips.ethereum.org/EIPS/eip-1820). + +#### Perché gli hook sono fantastici? {#why-are-hooks-great} + +1. Gli hook consentono di inviare token a un contratto e di notificare il contratto in una singola transazione, a differenza dell'[ERC-20](https://eips.ethereum.org/EIPS/eip-20), che richiede una doppia chiamata (`approve`/`transferFrom`) per ottenere questo risultato. +2. I contratti che non hanno registrato hook sono incompatibili con l'ERC-777. Il contratto mittente interromperà la transazione quando il contratto ricevente non ha registrato un hook. Questo previene trasferimenti accidentali a contratti intelligenti non ERC-777. +3. Gli hook possono rifiutare le transazioni. + +### Decimali {#decimals} + +Lo standard risolve anche la confusione attorno ai `decimals` causata nell'ERC-20. Questa chiarezza migliora l'esperienza degli sviluppatori. + +### Retrocompatibilità con l'ERC-20 {#backwards-compatibility-with-erc-20} + +È possibile interagire con i contratti ERC-777 come se fossero contratti ERC-20. + +## Letture consigliate {#further-reading} + +[EIP-777: Standard dei Token](https://eips.ethereum.org/EIPS/eip-777) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/standards/tokens/index.md b/public/content/translations/it/developers/docs/standards/tokens/index.md index b608ec768ee..0b480b229f6 100644 --- a/public/content/translations/it/developers/docs/standards/tokens/index.md +++ b/public/content/translations/it/developers/docs/standards/tokens/index.md @@ -1,39 +1,41 @@ --- -title: Standard token -description: +title: Standard dei token +description: Esplora gli standard dei token di Ethereum, inclusi ERC-20, ERC-721 ed ERC-1155 per token fungibili e non fungibili. lang: it incomplete: true --- ## Introduzione {#introduction} -Molti standard di sviluppo di Ethereum si incentrano sulle interfacce dei token. Questi standard aiutano ad assicurarsi che i contratti intelligenti restino componibili, così che, ad esempio, quando un nuovo progetto emette un token, esso rimanga compatibile con le borse decentralizzate esistenti. +Molti standard di sviluppo di [Ethereum](/) si concentrano sulle interfacce dei token. Questi standard aiutano a garantire che i contratti intelligenti rimangano componibili, in modo che quando un nuovo progetto emette un token, questo rimanga compatibile con le applicazioni e gli exchange decentralizzati esistenti. + +Gli standard dei token definiscono come i token si comportano e interagiscono nell'ecosistema di Ethereum. Semplificano il lavoro degli sviluppatori permettendo loro di costruire senza reinventare la ruota, garantendo che i token funzionino perfettamente con portafogli, exchange e piattaforme DeFi. Che si tratti di giochi, governance o altri casi d'uso, questi standard forniscono coerenza e rendono Ethereum più interconnesso. ## Prerequisiti {#prerequisites} -- [Standard di sviluppo Ethereum](/developers/docs/standards/) +- [Standard di sviluppo di Ethereum](/developers/docs/standards/) - [Contratti intelligenti](/developers/docs/smart-contracts/) -## Standard token {#token-standards} +## Standard dei token {#token-standards} -Ecco alcuni degli standard token più popolari su Ethereum: +Ecco alcuni degli standard dei token più popolari su Ethereum: -- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Un'interfaccia standard per token fungibili (intercambiabili), come i token di voto, i token di staking o le valute virtuali. +- [ERC-20](/developers/docs/standards/tokens/erc-20/) - Un'interfaccia standard per i token fungibili (intercambiabili), come i token di voto, i token di staking o le valute virtuali. -### Standard NFT {#nft-standards} +### Standard degli NFT {#nft-standards} -- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Un'interfaccia standard per token non fungibili, come un atto relativo a opere d'arte o canzoni. -- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 consente scambi e aggregazioni di transazioni più efficienti, risparmiando sui costi. Questo standard del token consente di creare token d'utilità (come $BNB o $BAT) e token non fungibili come CryptoPunks. +- [ERC-721](/developers/docs/standards/tokens/erc-721/) - Un'interfaccia standard per i token non fungibili, come l'atto di proprietà di un'opera d'arte o di una canzone. +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - L'ERC-1155 consente scambi più efficienti e il raggruppamento delle transazioni, risparmiando così sui costi. Questo standard dei token consente di creare sia token di utilità (come $BNB o $BAT) che token non fungibili come i CryptoPunks. L'elenco completo delle proposte [ERC](https://eips.ethereum.org/erc). ## Letture consigliate {#further-reading} -_Conosci una risorsa della comunità che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Tutorial correlati {#related-tutorials} -- [Token integration checklist](/developers/tutorials/token-integration-checklist/) _- Una checklist di aspetti da considerare quando interagiamo con i token._ -- [Comprendere il contratto intelligente del token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/): _Un'introduzione alla distribuzione del tuo primo contratto intelligente su una rete di prova di Ethereum._ -- [Trasferimenti e approvazione dei token ERC20 da un contratto intelligente in Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/): _Come usare un contratto intelligente per interagire con un token, usando il linguaggio Solidity._ -- [Implementing an ERC721 market [a how-to guide]](/developers/tutorials/how-to-implement-an-erc721-market/) _- Come mettere in vendita oggetti tokenizzati su una bacheca annunci decentralizzata._ +- [Lista di controllo per l'integrazione dei token](/developers/tutorials/token-integration-checklist/) _– Una lista di controllo delle cose da considerare quando si interagisce con i token._ +- [Comprendere il contratto intelligente del token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Un'introduzione alla distribuzione del tuo primo contratto intelligente su una rete di test di Ethereum._ +- [Trasferimenti e approvazione di token ERC20 da un contratto intelligente in Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Come usare un contratto intelligente per interagire con un token usando il linguaggio Solidity._ +- [Implementare un mercato ERC721 [una guida pratica]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Come mettere in vendita oggetti tokenizzati su una bacheca di annunci decentralizzata._ \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/storage/index.md b/public/content/translations/it/developers/docs/storage/index.md index ef3bd169125..3843306cd06 100644 --- a/public/content/translations/it/developers/docs/storage/index.md +++ b/public/content/translations/it/developers/docs/storage/index.md @@ -1,90 +1,90 @@ --- -title: Archiviazione Decentralizzata -description: Panoramica di cos'è l'archiviazione decentralizzata e degli strumenti disponibili per integrarla in una dapp. +title: Archiviazione decentralizzata +description: "Panoramica di cos'è l'archiviazione decentralizzata e degli strumenti disponibili per integrarla in una dApp." lang: it --- -A differenza di un server centralizzato gestito da una singola società o organizzazione, il sistema di storage decentralizzato consiste in una rete peer-to-peer di operatori-user che trattengono una porzione di tutti i dati esistenti, creando un sistema resiliente di salvataggio e condivisione di file. Tale sistema può trovarsi in un'applicazione basata sulla blockchain o in qualunque rete peer-to-peer. +A differenza di un server centralizzato gestito da una singola azienda o organizzazione, i sistemi di archiviazione decentralizzata consistono in una rete peer-to-peer di utenti-operatori che detengono una porzione dei dati complessivi, creando un sistema di condivisione e archiviazione di file resiliente. Questi possono trovarsi in un'applicazione basata su blockchain o in qualsiasi rete basata su peer-to-peer. -Lo stesso Ethereum è utilizzabile come un sistema decentralizzato d'archiviazione e ciò avviene per l'archiviazione del codice in tutti i contratti intelligenti. Ad ogni modo, Ethereum non è stato progettato per gestire grandi quantitativi di dati. La catena Ethereum cresce costantemente e, al momento della redazione di questa pagina, si aggira intorno a 500GB - 1TB ([a seconda del client](https://etherscan.io/chartsync/chaindefault)), ed ogni nodo sulla rete deve essere in grado di memorizzare tutti i dati. Se la catena dovesse espandersi raggiungendo un grosso volume di dati (ad esempio 5TB), non sarebbe possibile continuare l'esecuzione di tutti i nodi. Inoltre, il costo di distribuzione di così tanti dati alla Rete Principale, sarebbe proibitivo a causa delle commissioni del [gas](/developers/docs/gas). +Ethereum stesso può essere utilizzato come sistema di archiviazione decentralizzata, e lo è quando si tratta di archiviare il codice in tutti i contratti intelligenti. Tuttavia, quando si tratta di grandi quantità di dati, non è per questo che Ethereum è stato progettato. La catena è in costante crescita, ma al momento della stesura, la catena di Ethereum è di circa 500GB - 1TB ([a seconda del client](https://etherscan.io/chartsync/chaindefault)), e ogni nodo sulla rete deve essere in grado di archiviare tutti i dati. Se la catena dovesse espandersi a grandi quantità di dati (diciamo 5TB) non sarebbe fattibile per tutti i nodi continuare a funzionare. Inoltre, il costo di distribuzione di una tale quantità di dati sulla rete principale sarebbe proibitivo a causa delle commissioni del [gas](/developers/docs/gas). -A causa di tali vincoli, necessitiamo di una catena o metodologia diversa per archiviare grandi quantità di dati in modo decentralizzato. +A causa di questi vincoli, abbiamo bisogno di una catena o metodologia diversa per archiviare grandi quantità di dati in modo decentralizzato. -Guardando alle opzioni di archiviazione decentralizzata (dStorage), esistono alcune cose che un utente deve tenere a mente. +Quando si esaminano le opzioni di archiviazione decentralizzata (dStorage), ci sono alcune cose che un utente deve tenere a mente. -- Meccanismo di persistenza / struttura d'incentivazione -- Applicazione della ritenzione dei dati -- Decentralità +- Meccanismo di persistenza / struttura degli incentivi +- Applicazione della conservazione dei dati +- Decentralizzazione - Consenso -## Meccanismo di persistenza / struttura d'incentivazione {#persistence-mechanism} +## Meccanismo di persistenza / struttura degli incentivi {#persistence-mechanism} -### Basata sulla blockchain {#blockchain-based} +### Basato su blockchain {#blockchain-based} -Affinché un dato persista nel tempo, occorre usare un meccanismo di persistenza. Ad esempio, su Ethereum, il meccanismo di persistenza prevede di tener conto dell'intera catena, operando un nodo. Nuovi pezzi di dati vengono aggiunti alla fine della chain, e questa continua a crescere - richiedendo ad ogni nodo di replicare tutti i dati incorporati. +Affinché un dato persista per sempre, dobbiamo utilizzare un meccanismo di persistenza. Ad esempio, su Ethereum, il meccanismo di persistenza prevede che l'intera catena debba essere presa in considerazione quando si esegue un nodo. Nuovi dati vengono aggiunti alla fine della catena, che continua a crescere, richiedendo a ogni nodo di replicare tutti i dati incorporati. -Questo meccanismo prende il nome di persistenza **basata sulla blockchain**. +Questa è nota come persistenza **basata su blockchain**. -Il problema della persistenza basata sulla blockchain è che la chain potrebbe diventare troppo grande per mantenere e memorizzare tutti i dati in modo fattibile (e.g., [molte fonti](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) stimano che, per fare ciò, internet richieda una capacità di archiviazione di oltre 40 Zetabyte). +Il problema con la persistenza basata su blockchain è che la catena potrebbe diventare troppo grande per mantenere e archiviare tutti i dati in modo fattibile (ad es., [molte fonti](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) stimano che Internet richieda oltre 40 Zettabyte di capacità di archiviazione). -La blockchain deve anche avere qualche tipo di struttura d'incentivazione. Per la persistenza basata sulla blockchain, esiste un pagamento effettuato al validatore. Quando i dati sono aggiunti alla catena, i validatori sono pagati per aggiungervi i dati. +La blockchain deve anche avere un qualche tipo di struttura degli incentivi. Per la persistenza basata su blockchain, viene effettuato un pagamento al validatore. Quando i dati vengono aggiunti alla catena, i validatori vengono pagati per aggiungervi i dati. -Le piattaforme con persistenza basata sulla blockchain sono: +Piattaforme con persistenza basata su blockchain: - Ethereum - [Arweave](https://www.arweave.org/) -### Persistenza basata su contratto {#contract-based} +### Basato su contratti {#contract-based} -La persistenza **basata sul contratto** si basa sull'intuizione che i dati non possono essere replicati da ogni nodo e memorizzati per sempre, devono invece essere mantenuti con accordi contrattuali. Si tratta di accordi effettuati con più nodi che si sono impegnati a conservare un dato per un certo periodo di tempo. Per far sì che mantengano i dati, devono essere rimborsati o rinnovati ogni volta che scadono. +La persistenza **basata su contratti** si fonda sull'intuizione che i dati non possono essere replicati da ogni nodo e archiviati per sempre, ma devono invece essere mantenuti tramite accordi contrattuali. Si tratta di accordi stipulati con più nodi che hanno promesso di conservare un dato per un periodo di tempo. Devono essere rimborsati o rinnovati ogni volta che scadono per mantenere i dati persistenti. -In gran parte dei casi, invece di archiviare tutti i dati sulla catena, viene memorizzato l'hash che indica la posizione dei dati sulla catena. In questo modo, l'intera catena non deve scalare per mantenere tutti i dati. +Nella maggior parte dei casi, invece di archiviare tutti i dati on-chain, viene archiviato l'hash della posizione in cui si trovano i dati su una catena. In questo modo, l'intera catena non ha bisogno di scalare per conservare tutti i dati. -Le piattaforme con persistenza basata su contratto sono: +Piattaforme con persistenza basata su contratti: -- [Filecoin](https://docs.filecoin.io/about-filecoin/what-is-filecoin/) -- [Skynet](https://siasky.net/) +- [Filecoin](https://docs.filecoin.io/basics/what-is-filecoin) +- [Skynet](https://sia.tech/) - [Storj](https://storj.io/) - [Züs](https://zus.network/) -- [Rete Crust](https://crust.network) +- [Crust Network](https://crust.network) - [Swarm](https://www.ethswarm.org/) - [4EVERLAND](https://www.4everland.org/) ### Considerazioni aggiuntive {#additional-consideration} -IPFS è un sistema distribuito per memorizzare e accedere a file, siti web, applicazioni e dati. Non ha un sistema di incentivi incorporato, ma può essere utilizzato con una qualsiasi delle soluzioni di incentivazione basate sul contratto citate prima per una persistenza di maggiore durata. Un altro modo per mantenere i dati su IPFS è quello di lavorare con un servizio di pinning, che "appunta" i dati per te. È possibile anche eseguire il proprio nodo IPFS e contribuire alla rete per conservare i propri dati e/o quelli degli altri gratuitamente! +IPFS è un sistema distribuito per l'archiviazione e l'accesso a file, siti web, applicazioni e dati. Non ha uno schema di incentivi integrato, ma può invece essere utilizzato con una qualsiasi delle soluzioni di incentivi basate su contratti di cui sopra per una persistenza a lungo termine. Un altro modo per rendere persistenti i dati su IPFS è lavorare con un servizio di pinning, che "fisserà" (pin) i tuoi dati per te. Puoi persino eseguire il tuo nodo IPFS e contribuire alla rete per rendere persistenti i tuoi dati e/o quelli di altri gratuitamente! - [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/) - [Pinata](https://www.pinata.cloud/) _(servizio di pinning IPFS)_ -- [Pinata](https://www.pinata.cloud/) _(servizio di pinning IPFS)_ -- [Pinata](https://www.pinata.cloud/) _(servizio di pinning IPFS)_ -- [IPFS Scan](https://ipfs-scan.io) _(esploratore di pinning di IPFS)_ -- [4EVERLAND](https://www.4everland.org/)_(Servizio di pinning IPFS)_ +- [web3.storage](https://web3.storage/) _(servizio di pinning IPFS/Filecoin)_ +- [Infura](https://infura.io/product/ipfs) _(servizio di pinning IPFS)_ +- [IPFS Scan](https://ipfs-scan.io) _(esploratore di pinning IPFS)_ +- [4EVERLAND](https://www.4everland.org/)_(servizio di pinning IPFS)_ - [Filebase](https://filebase.com) _(Servizio di pinning IPFS)_ -- [Spheron Network](https://spheron.network/) _(Servizio di pinning IPFS/Filecoin)_ +- [Spheron Network](https://spheron.network/) _(servizio di pinning IPFS/Filecoin)_ -SWARM è una tecnologia decentralizzata di archiviazione e distribuzione di dati con un sistema di incentivazione di archiviazione e un oracolo del prezzo di affitto della memoria. +SWARM è una tecnologia di archiviazione e distribuzione dei dati decentralizzata con un sistema di incentivi per l'archiviazione e un oracolo per il prezzo di affitto dell'archiviazione. -## Ritenzione dei dati {#data-retention} +## Conservazione dei dati {#data-retention} -Per conservare i dati, i sistemi devono avere qualche tipo di meccanismo per assicurarsi che i dati vengano conservati. +Al fine di conservare i dati, i sistemi devono avere una sorta di meccanismo per assicurarsi che i dati vengano conservati. -### Meccanismo di messa alla prova {#challenge-mechanism} +### Meccanismo di sfida {#challenge-mechanism} -Uno dei metodi più diffusi per verificare l'effettiva conservazione dei dati consiste nell'utilizzare qualche tipo di meccanismo di messa alla prova crittografica applicato ai nodi per accertare che contengano ancora i dati. Un esempio semplice è quello di verificare il proof-of-access di Arweave. I nodi vengono messi alla prova per vedere se contengono i dati sia sul blocco più recente sia su un blocco casuale in passato. Se il nodo non trova la risposta, viene penalizzato. +Uno dei modi più popolari per assicurarsi che i dati vengano conservati è utilizzare un qualche tipo di sfida crittografica che viene inviata ai nodi per assicurarsi che abbiano ancora i dati. Un esempio semplice è la prova di accesso (proof-of-access) di Arweave. Emettono una sfida ai nodi per vedere se hanno i dati sia nel blocco più recente che in un blocco casuale nel passato. Se il nodo non riesce a fornire la risposta, viene penalizzato. -Tipi di dStorage con meccanismo di messa alla prova: +Tipi di dStorage con un meccanismo di sfida: - Züs - Skynet - Arweave - Filecoin -- Rete Crust +- Crust Network - 4EVERLAND -### Decentralità {#decentrality} +### Decentralizzazione {#decentrality} -Non esistono strumenti impeccabili per misurare il livello di decentralizzazione delle piattaforme ma, in generale, si tende a ricorrere a strumenti che non utilizzano qualche tipo di KYC per dimostrare di non essere centralizzati. +Non ci sono ottimi strumenti per misurare il livello di decentralizzazione delle piattaforme, ma in generale, vorrai utilizzare strumenti che non abbiano alcuna forma di KYC per fornire prove che non siano centralizzati. Strumenti decentralizzati senza KYC: @@ -93,64 +93,64 @@ Strumenti decentralizzati senza KYC: - Filecoin - IPFS - Ethereum -- Rete Crust +- Crust Network - 4EVERLAND ### Consenso {#consensus} -Gran parte di questi strumenti ha la propria versione di un [meccanismo di consenso](/developers/docs/consensus-mechanisms/), ma generalmente si basano su [**proof-of-work (PoW)**](/developers/docs/consensus-mechanisms/pow/) o [**proof-of-stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). +La maggior parte di questi strumenti ha la propria versione di un [meccanismo di consenso](/developers/docs/consensus-mechanisms/), ma generalmente si basano sulla [**prova di lavoro (PoW)**](/developers/docs/consensus-mechanisms/pow/) o sulla [**prova di stake (PoS)**](/developers/docs/consensus-mechanisms/pos/). -Basata sul proof-of-work: +Basati sulla prova di lavoro: - Skynet - Arweave -Basata sul proof-of-stake: +Basati sulla prova di stake: - Ethereum - Filecoin - Züs -- Rete Crust +- Crust Network ## Strumenti correlati {#related-tools} -**IPFS - _InterPlanetary File System è un sistema decentralizzato di archiviazione e referenziazione dei file per Ethereum._** +**IPFS - _L'InterPlanetary File System è un sistema di archiviazione decentralizzata e di riferimento ai file per Ethereum._** - [Ipfs.io](https://ipfs.io/) - [Documentazione](https://docs.ipfs.io/) - [GitHub](https://github.com/ipfs/ipfs) -**Storj DCS - _Archiviazione decentralizzata di oggetti su cloud per sviluppatori, sicura, privata e compatibile con S3._** +**Storj DCS - _Archiviazione di oggetti cloud decentralizzata sicura, privata e compatibile con S3 per sviluppatori._** - [Storj.io](https://storj.io/) - [Documentazione](https://docs.storj.io/) - [GitHub](https://github.com/storj/storj) -**Skynet - _Skynet è una catena di PoW decentralizzata dedicata a un web decentralizzato._** +**Sia - _Sfrutta la crittografia per creare un mercato di archiviazione cloud trustless, consentendo ad acquirenti e venditori di effettuare transazioni direttamente._** -- [Skynet.net](https://siasky.net/) -- [Documentazione](https://siasky.net/docs/) -- [GitHub](https://github.com/SkynetLabs/) +- [Skynet.net](https://sia.tech/) +- [Documentazione](https://docs.sia.tech/) +- [GitHub](https://github.com/SiaFoundation/) -**Filecoin - _Filecoin è stato creato dallo stesso team dietro a IPFS. È un livello d'incentivazione basato sui principi di IPFS._** +**Filecoin - _Filecoin è stato creato dallo stesso team dietro IPFS. È un livello di incentivi basato sugli ideali di IPFS._** - [Filecoin.io](https://filecoin.io/) - [Documentazione](https://docs.filecoin.io/) - [GitHub](https://github.com/filecoin-project/) -**Arweave - _Arweave è una piattaforma di dStorage per l'archiviazione di dati._** +**Arweave - _Arweave è una piattaforma dStorage per l'archiviazione dei dati._** - [Arweave.org](https://www.arweave.org/) - [Documentazione](https://docs.arweave.org/info/) - [Arweave](https://github.com/ArweaveTeam/arweave/) -**Züs - _Züs è una piattaforma di dStorage in proof-of-stake con sharding e blobber._** +**Züs - _Züs è una piattaforma dStorage basata sulla prova di stake con frammentazione e blobber._** - [zus.network](https://zus.network/) -- [Documentazione](https://0chaindocs.gitbook.io/zus-docs) +- [Documentazione](https://docs.zus.network/zus-docs/) - [GitHub](https://github.com/0chain/) -**Rete Crust: _Crust è una piattaforma di dStorage basata su IPFS._** +**Crust Network - _Crust è una piattaforma dStorage basata su IPFS._** - [Crust.network](https://crust.network) - [Documentazione](https://wiki.crust.network) @@ -159,7 +159,7 @@ Basata sul proof-of-stake: **Swarm - _Una piattaforma di archiviazione distribuita e un servizio di distribuzione di contenuti per lo stack web3 di Ethereum._** - [EthSwarm.org](https://www.ethswarm.org/) -- [Documentazione](https://docs.ethswarm.org/docs/) +- [Documentazione](https://docs.ethswarm.org/) - [GitHub](https://github.com/ethersphere/) **OrbitDB - _Un database peer-to-peer decentralizzato basato su IPFS._** @@ -168,37 +168,37 @@ Basata sul proof-of-stake: - [Documentazione](https://github.com/orbitdb/field-manual/) - [GitHub](https://github.com/orbitdb/orbit-db/) -**Aleph.im - _Progetto decentralizzato su cloud (database, archiviazione di file, calcolo e DID). Una combinazione unica di tecnologia peer-to-peer on-chain e off-chain. Compatibilità multi-catena e IPFS._** +**Aleph.im - _Progetto cloud decentralizzato (database, archiviazione di file, calcolo e DID). Una miscela unica di tecnologia peer-to-peer fuori catena e on-chain. Compatibilità con IPFS e multi-chain._** -- [Aleph.im](https://aleph.im/) -- [Documentazione](https://aleph.im/#/developers/) +- [Aleph.im](https://aleph.cloud/) +- [Documentazione](https://docs.aleph.cloud/) - [GitHub](https://github.com/aleph-im/) -**Ceramic - _Archiviazione di database IPFS controllata dall'utente per applicazioni impegnative e ricche di dati._** +**Ceramic - _Archiviazione di database IPFS controllata dall'utente per applicazioni ricche di dati e coinvolgenti._** - [Ceramic.network](https://ceramic.network/) -- [Documentazione](https://developers.ceramic.network/learn/welcome/) +- [Documentazione](https://developers.ceramic.network/) - [GitHub](https://github.com/ceramicnetwork/js-ceramic/) -**Filebase - _archiviazione decentralizzata compatibile con S3 e servizio di pinning IPFS geo-ridondante. Tutti i file caricati in IPFS tramite Filebase sono fissati automaticamente all'infrastruttura di Filebase con replicazione 3x in tutto il globo._** +**Filebase - _Archiviazione decentralizzata compatibile con S3 e servizio di pinning IPFS geo-ridondante. Tutti i file caricati su IPFS tramite Filebase vengono automaticamente fissati (pinned) all'infrastruttura Filebase con una replica 3x in tutto il mondo._** - [Filebase.com](https://filebase.com/) - [Documentazione](https://docs.filebase.com/) - [GitHub](https://github.com/filebase) -**4EVERLAND: _Una piattaforma di cloud computing in Web 3.0 che integra archiviazione, calcolo e capacità essenziali di rete, è compatibile con S3 e fornisce l'archiviazione sincrona dei dati su reti di archiviazione decentralizzate quali IPFS e Arweave._** +**4EVERLAND - _Una piattaforma di cloud computing Web 3.0 che integra funzionalità principali di archiviazione, calcolo e rete, è compatibile con S3 e fornisce archiviazione dati sincrona su reti di archiviazione decentralizzata come IPFS e Arweave._** - [4everland.org](https://www.4everland.org/) - [Documentazione](https://docs.4everland.org/) - [GitHub](https://github.com/4everland) -**Kaleido - _Una piattaforma di blockchain-as-a-service con Nodi IPFS alla pressione di un pulsante_** +**Kaleido - _Una piattaforma blockchain-as-a-service con nodi IPFS attivabili con un clic_** - [Kaleido](https://kaleido.io/) - [Documentazione](https://docs.kaleido.io/kaleido-services/ipfs/) - [GitHub](https://github.com/kaleido-io) -**Spheron Network - _Spheron è una platform-as-a-service (PaaS) progettata per le dApp che desiderano lanciare le proprie applicazioni su infrastrutture decentralizzate con le migliori prestazioni. Fornisce calcolo, archiviazione decentralizzata, CDN e hosting web pronti all'uso._** +**Spheron Network - _Spheron è una platform-as-a-service (PaaS) progettata per le dApp che desiderano lanciare le proprie applicazioni su un'infrastruttura decentralizzata con le migliori prestazioni. Fornisce calcolo, archiviazione decentralizzata, CDN e web hosting pronti all'uso._** - [spheron.network](https://spheron.network/) - [Documentazione](https://docs.spheron.network/) @@ -206,11 +206,11 @@ Basata sul proof-of-stake: ## Letture consigliate {#further-reading} -- [Cos'è l'archiviazione decentralizzata?](https://coinmarketcap.com/alexandria/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) - _CoinMarketCap_ -- [Sfatiamo cinque falsi miti sull'archiviazione decentralizzata](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) - _Storj_ +- [Cos'è l'archiviazione decentralizzata?](https://coinmarketcap.com/academy/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) - _CoinMarketCap_ +- [Sfatare cinque miti comuni sull'archiviazione decentralizzata](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) - _Storj_ -_Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ +_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ ## Argomenti correlati {#related-topics} -- [Quadri di sviluppo](/developers/docs/frameworks/) +- [Framework di sviluppo](/developers/docs/frameworks/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/transactions/index.md b/public/content/translations/it/developers/docs/transactions/index.md index 0a3ede82e33..567b38c03d4 100644 --- a/public/content/translations/it/developers/docs/transactions/index.md +++ b/public/content/translations/it/developers/docs/transactions/index.md @@ -1,56 +1,57 @@ --- title: Transazioni -description: 'Panoramica sulle transazioni Ethereum: come funzionano, struttura dati e come inviarle tramite un''applicazione.' +description: "Una panoramica delle transazioni di Ethereum: come funzionano, la loro struttura dei dati e come inviarle tramite un'applicazione." lang: it --- -Le transazioni sono istruzioni firmate crittograficamente dai conti. Un conto avvierà una transazione per aggiornare lo stato della rete di Ethereum. La transazione più semplice è il trasferimento di ETH da un conto all'altro. +Le transazioni sono istruzioni firmate crittograficamente dagli account. Un account avvierà una transazione per aggiornare lo stato della rete [Ethereum](/). La transazione più semplice è il trasferimento di ETH da un account a un altro. ## Prerequisiti {#prerequisites} -Per aiutarti a comprendere meglio questa pagina, ti consigliamo di leggere, innanzitutto, sui [Conti](/developers/docs/accounts/) e la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). +Per aiutarti a comprendere meglio questa pagina, ti consigliamo di leggere prima [Account](/developers/docs/accounts/) e la nostra [introduzione a Ethereum](/developers/docs/intro-to-ethereum/). ## Cos'è una transazione? {#whats-a-transaction} -Una transazione di Ethereum si riferisce a un'azione avviata da un conto esterno, in altre parole, da un conto gestito da un umano, non da un contratto. Ad esempio, se Bob invia 1 ETH ad Alice, il conto di Bob sarà addebitato e quello di Alice sarà accreditato. Questa azione che modifica lo stato avviene all'interno di una transazione. +Una transazione di Ethereum si riferisce a un'azione avviata da un account controllato esternamente, in altre parole un account gestito da un essere umano, non da un contratto. Ad esempio, se Bob invia ad Alice 1 ETH, l'account di Bob deve essere addebitato e quello di Alice accreditato. Questa azione di modifica dello stato avviene all'interno di una transazione. -![Diagramma che mostra un cambiamento di stato causato da una transazione](./tx.png) _Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramma che mostra una transazione che causa un cambio di stato](./tx.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Le transazioni, che cambiano lo stato dell'EVM, devono essere trasmesse all'intera rete. Ogni nodo può trasmettere una richiesta di esecuzione di una transazione sull'EVM; in seguito, un validatore eseguirà la transazione e propagherà il cambiamento di stato risultante al resto della rete. +Le transazioni, che cambiano lo stato della macchina virtuale di Ethereum (EVM), devono essere trasmesse all'intera rete. Qualsiasi nodo può trasmettere una richiesta affinché una transazione venga eseguita sull'EVM; dopo che ciò accade, un validatore eseguirà la transazione e propagherà il cambiamento di stato risultante al resto della rete. -Le transazioni richiedono una commissione e devono essere incluse in un blocco validato. Per semplificare questa spiegazione, parleremo in altra sede di commissioni e di convalida. +Le transazioni richiedono una commissione e devono essere incluse in un blocco convalidato. Per rendere questa panoramica più semplice, tratteremo le commissioni del gas e la convalida altrove. -Una transazione inviata contiene le seguenti informazioni: +Una transazione inviata include le seguenti informazioni: -- `from` – indirizzo del mittente che firmerà la transazione. Questo sarà un conto posseduto esternamente, in quanto i conti contratto non possono inviare transazioni -- `to`: l'indirizzo del destinatario (se è un conto posseduto esternamente, la transazione trasferirà il valore. Se è un conto di contratto, la transazione eseguirà il codice del contratto) -- `signature` – l'identificativo del mittente. Viene generata quando la chiave privata del mittente firma la transazione e conferma che il mittente ha autorizzato la transazione -- `nonce` – un contatore con incremento sequenziale, che indica il numero della transazione dal conto -- `value` – quantità di ETH da trasferire dal mittente al destinatario (denominata in WEI, dove 1 ETH corrisponde a 1e+18wei) -- `input data` - campo facoltativo per includere dati arbitrari -- `gasLimit` – importo massimo di unità di carburante che possono essere consumate dalla transazione. L'[EVM](/developers/docs/evm/opcodes) specifica le unità di gas necessarie per ogni passaggio di calcolo -- `maxPriorityFeePerGas` – il prezzo massimo del carburante consumato da includere come mancia al validatore -- `maxFeePerGas` – la commissione massima per unità di carburante che si desidera pagare per la transazione (che include `baseFeePerGas` e `maxPriorityFeePerGas`) +- `from` – l'indirizzo del mittente, che firmerà la transazione. Questo sarà un account controllato esternamente poiché gli account dei contratti non possono inviare transazioni +- `to` – l'indirizzo di ricezione (se è un account controllato esternamente, la transazione trasferirà valore. Se è un account di un contratto, la transazione eseguirà il codice del contratto) +- `signature` – l'identificatore del mittente. Questo viene generato quando la chiave privata del mittente firma la transazione e conferma che il mittente ha autorizzato questa transazione +- `nonce` - un contatore che si incrementa in modo sequenziale e indica il numero della transazione dall'account +- `value` – la quantità di ETH da trasferire dal mittente al destinatario (denominata in WEI, dove 1 ETH equivale a 1e+18 wei) +- `input data` – campo opzionale per includere dati arbitrari +- `gasLimit` – la quantità massima di unità di gas che possono essere consumate dalla transazione. L'[EVM](/developers/docs/evm/opcodes) specifica le unità di gas richieste da ogni passaggio computazionale +- `maxPriorityFeePerGas` - il prezzo massimo del gas consumato da includere come mancia per il validatore +- `maxFeePerGas` - la commissione massima per unità di gas che si è disposti a pagare per la transazione (comprensiva di `baseFeePerGas` e `maxPriorityFeePerGas`) -Il gas è un riferimento al calcolo necessario perché un validatore elabori la transazione. Gli utenti devono pagare una commissione per questo calcolo. Il `gasLimit` e il `maxPriorityFeePerGas` determinano la commissione massima sulla transazione pagata al validatore. [Di più sul Gas](/developers/docs/gas/). +Il gas è un riferimento al calcolo richiesto per elaborare la transazione da parte di un validatore. Gli utenti devono pagare una commissione per questo calcolo. Il `gasLimit` e la `maxPriorityFeePerGas` determinano la commissione della transazione massima pagata al validatore. [Maggiori informazioni sul Gas](/developers/docs/gas/). -L'oggetto della transazione sarà qualcosa del genere: +L'oggetto della transazione avrà un aspetto simile a questo: ```js { from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8", to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a", gasLimit: "21000", - maxFeePerGas: "300" - maxPriorityFeePerGas: "10" + maxFeePerGas: "300", + maxPriorityFeePerGas: "10", nonce: "0", - value: "10000000000", + value: "10000000000" } ``` -Ma l'oggetto di una transazione deve essere firmato utilizzando la chiave privata del mittente. Questo prova che la transazione è stata originata solo dal mittente e non è stata inviata in modo fraudolento. +Ma un oggetto della transazione deve essere firmato utilizzando la chiave privata del mittente. Questo dimostra che la transazione può provenire solo dal mittente e non è stata inviata in modo fraudolento. -Un client Ethereum come Geth gestirà il processo di firma. +Un client di Ethereum come Geth gestirà questo processo di firma. Esempio di chiamata [JSON-RPC](/developers/docs/apis/json-rpc): @@ -99,22 +100,26 @@ Esempio di risposta: } ``` -- `raw` è la transazione firmata nella forma codificata [prefisso di lunghezza ricorsiva (RLP)](/developers/docs/data-structures-and-encoding/rlp) +- `raw` è la transazione firmata in forma codificata [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp) - `tx` è la transazione firmata in formato JSON -Con l'hash di firma, la transazione può provare crittograficamente che proviene dal mittente ed è stata inviata alla rete. +Con l'hash della firma, si può dimostrare crittograficamente che la transazione proviene dal mittente ed è stata inviata alla rete. -### Il campo di dati {#the-data-field} +### Il campo dati {#the-data-field} -La grande maggioranza delle transazioni accede a un contratto da un conto esterno. Gran parte dei contratti è scritta in Solidity e interpreta il proprio campo dei dati secondo l'[interfaccia binaria dell'applicazione (Application Binary Interface – ABI)](/glossary/#abi/). +La stragrande maggioranza delle transazioni accede a un contratto da un account controllato esternamente. +La maggior parte dei contratti è scritta in Solidity e interpreta il proprio campo dati in conformità con l'[interfaccia binaria dell'applicazione (ABI)](/glossary/#abi). -I primi quattro byte specificano quale funzione chiamare, usando l'hash del nome e degli argomenti della funzione. Talvolta si può identificare la funzione dal selettore, usando [questo database](https://www.4byte.directory/signatures/). +I primi quattro byte specificano quale funzione chiamare, utilizzando l'hash del nome della funzione e dei suoi argomenti. +A volte puoi identificare la funzione dal selettore utilizzando [questo database](https://www.4byte.directory/signatures/). Il resto dei calldata sono gli argomenti, [codificati come specificato nelle specifiche dell'ABI](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). -Ad esempio, diamo un'occhiata a [questa transazione](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1). Usa **Clicca per scoprire di più** per visualizzare i calldata. +Ad esempio, diamo un'occhiata a [questa transazione](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1). +Usa **Click to see More** per vedere i calldata. -Il selettore della funzione è `0xa9059cbb`. Ci sono diverse [funzioni note con questa firma](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). In questo caso, [il codice sorgente del contratto](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) è stato caricato su Etherscan, quindi sappiamo che la funzione è `transfer(address,uint256)`. +Il selettore della funzione è `0xa9059cbb`. Ci sono diverse [funzioni note con questa firma](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). +In questo caso [il codice sorgente del contratto](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) è stato caricato su Etherscan, quindi sappiamo che la funzione è `transfer(address,uint256)`. Il resto dei dati è: @@ -123,21 +128,23 @@ Il resto dei dati è: 000000000000000000000000000000000000000000000000000000003b0559f4 ``` -Secondo le specifiche ABI, i valori interi (come gli indirizzi, che sono interi da 20 byte), appaiono nell'ABI come words a 32 byte, con riempimento di zeri nella parte anteriore. Quindi sappiamo che l'indirizzo `to` è [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279). Il `value` è 0x3b0559f4 = 990206452. +Secondo le specifiche dell'ABI, i valori interi (come gli indirizzi, che sono interi a 20 byte) appaiono nell'ABI come parole a 32 byte, riempite con zeri all'inizio. +Quindi sappiamo che l'indirizzo `to` è [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279). +Il `value` è 0x3b0559f4 = 990206452. ## Tipi di transazioni {#types-of-transactions} -Su Ethereum esistono diversi tipi di transazioni: +Su Ethereum ci sono alcuni tipi diversi di transazioni: -- Transazioni regolari: una transazione da un conto a un altro. -- Transazioni di distribuzione del contratto: una transazione senza un indirizzo 'to', in cui il campo dei dati è usato per il codice del contratto. -- Esecuzione di un contratto: una transazione che interagisce con un contratto intelligente distribuito. In questo caso, l'indirizzo 'a' è l'indirizzo del contratto intelligente. +- Transazioni regolari: una transazione da un account a un altro. +- Transazioni di distribuzione del contratto: una transazione senza un indirizzo 'to', in cui il campo dati viene utilizzato per il codice del contratto. +- Esecuzione di un contratto: una transazione che interagisce con un contratto intelligente distribuito. In questo caso, l'indirizzo 'to' è l'indirizzo del contratto intelligente. ### Sul gas {#on-gas} -Come accennato, le transazioni hanno un costo di [gas](/developers/docs/gas/) per essere eseguite. Semplici transazioni di trasferimento richiedono 21.000 unità di Gas. +Come accennato, l'esecuzione delle transazioni costa [gas](/developers/docs/gas/). Le transazioni di trasferimento semplici richiedono 21000 unità di Gas. -Quindi, perché Bob possa inviare 1 ETH ad Alice a una `baseFeePerGas` di 190 gwei e una `maxPriorityFeePerGas` di 10 gwei, Bob dovrà pagare la seguente commissione: +Quindi, affinché Bob invii ad Alice 1 ETH a una `baseFeePerGas` di 190 gwei e una `maxPriorityFeePerGas` di 10 gwei, Bob dovrà pagare la seguente commissione: ``` (190 + 10) * 21000 = 4,200,000 gwei @@ -145,68 +152,72 @@ Quindi, perché Bob possa inviare 1 ETH ad Alice a una `baseFeePerGas` di 190 gw 0.0042 ETH ``` -Sul conto di Bob sarà addebitato **-1,0042 ETH** (1 ETH per Alice + 0,0042 ETH di commissioni del gas) +L'account di Bob verrà addebitato di **-1,0042 ETH** (1 ETH per Alice + 0,0042 ETH in commissioni del gas) -Il conto di Alice sarà accreditato di **+1,0 ETH** +L'account di Alice verrà accreditato di **+1,0 ETH** -La commissione base brucerà **-0,00399 ETH** +La commissione di base verrà bruciata **-0,00399 ETH** -Il validatore riceve la mancia di **oltre 0,000210 ETH** +Il validatore trattiene la mancia **+0,000210 ETH** -![Diagramma che mostra come è rimborsato il gas inutilizzato](./gas-tx.png) _Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![Diagramma che mostra come viene rimborsato il gas non utilizzato](./gas-tx.png) +_Diagramma adattato da [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ -Il gas non utilizzato, viene rimborsato al conto dell'utente. +Qualsiasi gas non utilizzato in una transazione viene rimborsato all'account dell'utente. ### Interazioni con i contratti intelligenti {#smart-contract-interactions} -Il gas è necessario per qualsiasi transazione riguardi un contratto intelligente. +Il gas è richiesto per qualsiasi transazione che coinvolga un contratto intelligente. -Inoltre, i contratti intelligenti possono contenere delle funzioni note come [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) o [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions), che non alterano lo stato del contratto. Per questo, chiamare tali funzioni da un EOA non richiederà alcun gas. La chiamata RPC sottostante per questo scenario è [`eth_call`](/developers/docs/apis/json-rpc#eth_call). +I contratti intelligenti possono anche contenere funzioni note come funzioni [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) o [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions), che non alterano lo stato del contratto. Pertanto, chiamare queste funzioni da un account controllato esternamente (EOA) non richiederà alcun gas. La chiamata RPC sottostante per questo scenario è [`eth_call`](/developers/docs/apis/json-rpc#eth_call). -A differenza di quando si accede utilizzando `eth_call`, queste funzioni `view` o `pure` sono comunemente chiamate anche internamente (cioè dal contratto stesso o da un altro contratto) e questo costa gas. +A differenza di quando vi si accede utilizzando `eth_call`, queste funzioni `view` o `pure` sono anche comunemente chiamate internamente (cioè, dal contratto stesso o da un altro contratto), il che costa gas. -## Ciclo di vita delle transazioni {#transaction-lifecycle} +## Ciclo di vita della transazione {#transaction-lifecycle} -Una volta inviata una transazione, succede quanto segue: +Una volta inviata la transazione, accade quanto segue: -1. Un hash della transazione è stato generato crittograficamente: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` -2. La transazione è quindi trasmessa alla rete e aggiunta a un pool di transazione consistente in tutte le altre transazioni in sospeso della rete. -3. Un validatore deve scegliere la transazione e includerla in un blocco per verificarla e considerarla "riuscita". -4. Col passare del tempo, il blocco contenente la tua transazione sarà aggiornato a "giustificato", poi "finalizzato". Questi aggiornamenti rendono molto più certo che la transazione sia "riuscita" e che non sarà mai alterata. Una volta che un blocco è "finalizzato", l'unica cosa che potrebbe cambiarlo è un attacco a livello della rete che costerebbe molti miliardi di dollari. +1. Viene generato crittograficamente un hash della transazione: + `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` +2. La transazione viene quindi trasmessa alla rete e aggiunta a un pool di transazioni costituito da tutte le altre transazioni di rete in sospeso. +3. Un validatore deve prelevare la tua transazione e includerla in un blocco per verificare la transazione e considerarla "riuscita". +4. Col passare del tempo, il blocco contenente la tua transazione verrà aggiornato a "giustificato" e poi a "finalizzato". Questi aggiornamenti rendono molto più certo che la tua transazione sia andata a buon fine e non verrà mai alterata. Una volta che un blocco è "finalizzato", potrebbe essere modificato solo da un attacco a livello di rete che costerebbe molti miliardi di dollari. -## Dimostrazione visiva {#a-visual-demo} +## Una demo visiva {#a-visual-demo} -Guarda Austin mentre ti illustra transazioni, gas e mining. +Guarda Austin che ti guida attraverso le transazioni, il gas e il mining. ## Typed Transaction Envelope {#typed-transaction-envelope} -In origine Ethereum aveva un solo formato per le transazioni. Ogni transazione conteneva un nonce, il prezzo del gas, il limite del gass, l'indirizzo di destinazione, il valore, i dati, v, r e s. Questi campi sono [ codificati in RLP](/developers/docs/data-structures-and-encoding/rlp/) per essere simili a questo: +In origine, Ethereum aveva un solo formato per le transazioni. Ogni transazione conteneva un nonce, il prezzo del gas, il limite del gas, l'indirizzo di destinazione (to), il valore, i dati, v, r e s. Questi campi sono [codificati in RLP](/developers/docs/data-structures-and-encoding/rlp/), per apparire in questo modo: `RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` -Ethereum si è evoluto per supportare diversi tipi di transazioni e consentire l'implementazione di nuove funzionalità, come gli elenchi d'accesso e [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), senza interferire sui precedenti formati di transazione. +Ethereum si è evoluto per supportare più tipi di transazioni per consentire l'implementazione di nuove funzionalità come le liste di accesso e l'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) senza influire sui formati delle transazioni legacy. -[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) consente tale comportamento. Le transazioni sono interpretate come: +L'[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) è ciò che consente questo comportamento. Le transazioni vengono interpretate come: `TransactionType || TransactionPayload` Dove i campi sono definiti come: -- `TransactionType` - un numero tra 0 e 0x7f, per un totale di 128 tipi di transazione possibili. -- `TransactionPayload` - un insieme arbitrario di byte definito dal tipo di transazione. +- `TransactionType` - un numero compreso tra 0 e 0x7f, per un totale di 128 possibili tipi di transazione. +- `TransactionPayload` - un array di byte arbitrario definito dal tipo di transazione. -A seconda del valore del campo `TransactionType`, una transazione è classificabile come: +In base al valore di `TransactionType`, una transazione può essere classificata come: -1. **Transazioni di Tipo 0 (Ereditarie):** Il formato della transazione originale utilizzato dal lancio di Ethereum. Non includono le funzionalità dall'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), come il calcolo dinamico delle commissioni sul gas o gli elenchi di accesso per i contratti intelligenti. Le transazioni ereditarie mancano di un prefisso specifico che ne indichi il tipo nella loro forma serializzata, che parte dal byte `0xf8` utilizzando la codifica a [Prefisso di Lunghezza Ricorsiva (RLP)](/developers/docs/data-structures-and-encoding/rlp). Il valore TransactionType per queste transazioni è `0x0`. +1. **Transazioni di Tipo 0 (Legacy):** Il formato di transazione originale utilizzato sin dal lancio di Ethereum. Non includono funzionalità dell'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) come i calcoli dinamici delle commissioni del gas o le liste di accesso per i contratti intelligenti. Le transazioni legacy non hanno un prefisso specifico che indichi il loro tipo nella loro forma serializzata, iniziando con il byte `0xf8` quando si utilizza la codifica [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp). Il valore TransactionType per queste transazioni è `0x0`. -2. **Transazioni di Tipo 1:** introdotte nell'[EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) come parte dell'[Aggiornamento Berlino](/ethereum-forks/#berlin) di Ethereum, queste transazioni includono un parametro `accessList`. Questo elenco specifica gli indirizzi e le chiavi di memorizzazione a cui la transazione prevede di accedere, contribuendo potenzialmente a ridurre i costi del [gas](/developers/docs/gas/) per le transazioni complesse che comportano contratti intelligenti. Le modifiche al mercato delle commissioni dell'EIP-1559 non sono incluse nelle transazioni di Tipo 1. Le transazioni di Tipo 1 includono anche un parametro `yParity`, che può essere `0x0` o `0x1`, indicando la parità del valore y della firma secp256k1. Sono identificate perché iniziano con il byte `0x01` e il loro valore di TransactionType è `0x1`. +2. **Transazioni di Tipo 1:** Introdotte nell'[EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) come parte dell'[Aggiornamento Berlin](/ethereum-forks/#berlin) di Ethereum, queste transazioni includono un parametro `accessList`. Questo elenco specifica gli indirizzi e le chiavi di archiviazione a cui la transazione prevede di accedere, aiutando a ridurre potenzialmente i costi del [gas](/developers/docs/gas/) per transazioni complesse che coinvolgono contratti intelligenti. Le modifiche al mercato delle commissioni dell'EIP-1559 non sono incluse nelle transazioni di Tipo 1. Le transazioni di Tipo 1 includono anche un parametro `yParity`, che può essere `0x0` o `0x1`, indicando la parità del valore y della firma secp256k1. Sono identificate iniziando con il byte `0x01` e il loro valore TransactionType è `0x1`. -3. Le **transazioni di Tipo 2**, comunemente note come transazioni EIP-1559, sono transazioni introdotte nell'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), nell'[Aggiornamento Londra](/ethereum-forks/#london) di Ethereum. Sono diventate il tipo di transazione standard sulla rete di Ethereum. Queste transazioni introducono un nuovo meccanismo del mercato delle commissioni che ne migliora la prevedibilità, separando la commissione sulla transazione in una commissione di base e una di priorità. Iniziano con il byte `0x02` e includono campi come `maxPriorityFeePerGas` e `maxFeePerGas`. Le transazioni di Tipo 2 sono ora le predefinite a causa della loro flessibilità ed efficienza, favorite specialmente durante i periodi di elevata congestione della rete per la loro capacità di aiutare gli utenti a gestire le commissioni sulle transazioni in maniera più prevedibile. Il valore di TransactionType per queste transazioni è `0x2`. +3. **Transazioni di Tipo 2**, comunemente chiamate transazioni EIP-1559, sono transazioni introdotte nell'[EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), nell'[Aggiornamento London](/ethereum-forks/#london) di Ethereum. Sono diventate il tipo di transazione standard sulla rete Ethereum. Queste transazioni introducono un nuovo meccanismo di mercato delle commissioni che migliora la prevedibilità separando la commissione della transazione in una commissione di base e una commissione di priorità. Iniziano con il byte `0x02` e includono campi come `maxPriorityFeePerGas` e `maxFeePerGas`. Le transazioni di Tipo 2 sono ora l'impostazione predefinita grazie alla loro flessibilità ed efficienza, particolarmente favorite durante i periodi di elevata congestione della rete per la loro capacità di aiutare gli utenti a gestire le commissioni delle transazioni in modo più prevedibile. Il valore TransactionType per queste transazioni è `0x2`. +4. **Transazioni di Tipo 3 (Blob)** sono state introdotte nell'[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) come parte dell'[Aggiornamento Dencun](/ethereum-forks/#dencun) di Ethereum. Queste transazioni sono progettate per gestire i dati "blob" (Binary Large Objects) in modo più efficiente, avvantaggiando in particolare i rollup di livello 2 fornendo un modo per pubblicare dati sulla rete Ethereum a un costo inferiore. Le transazioni blob includono campi aggiuntivi come `blobVersionedHashes`, `maxFeePerBlobGas` e `blobGasPrice`. Iniziano con il byte `0x03` e il loro valore TransactionType è `0x3`. Le transazioni blob rappresentano un miglioramento significativo nella disponibilità dei dati e nelle capacità di scalabilità di Ethereum. +5. **Transazioni di Tipo 4** sono state introdotte nell'[EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) come parte dell'[Aggiornamento Pectra](/roadmap/pectra/) di Ethereum. Queste transazioni sono progettate per essere compatibili in avanti con l'astrazione dell'account. Consentono agli EOA di comportarsi temporaneamente come account di contratti intelligenti senza compromettere la loro funzionalità originale. Includono un parametro `authorization_list`, che specifica il contratto intelligente a cui l'EOA delega la propria autorità. Dopo la transazione, il campo del codice dell'EOA avrà l'indirizzo del contratto intelligente delegato. ## Letture consigliate {#further-reading} @@ -216,6 +227,6 @@ _Conosci una risorsa della community che ti è stata utile? Modifica questa pagi ## Argomenti correlati {#related-topics} -- [Conti](/developers/docs/accounts/) -- [Macchina virtuale Ethereum (EVM)](/developers/docs/evm/) -- [Gas](/developers/docs/gas/) +- [Account](/developers/docs/accounts/) +- [Macchina virtuale di Ethereum (EVM)](/developers/docs/evm/) +- [Gas](/developers/docs/gas/) \ No newline at end of file diff --git a/public/content/translations/it/developers/docs/web2-vs-web3/index.md b/public/content/translations/it/developers/docs/web2-vs-web3/index.md index 5fe23815edd..e1c217adcd7 100644 --- a/public/content/translations/it/developers/docs/web2-vs-web3/index.md +++ b/public/content/translations/it/developers/docs/web2-vs-web3/index.md @@ -1,62 +1,62 @@ --- -title: Web2 e Web3 -description: +title: Web2 vs Web3 +description: Confronta i servizi centralizzati del Web2 con le applicazioni decentralizzate del Web3 basate sulla tecnologia blockchain di Ethereum. lang: it --- -Web2 si riferisce alla versione di Internet che la maggior parte di noi conosce attualmente. Una rete dominata da aziende che offrono servizi in cambio dei dati personali. Il Web3, nel contesto di Ethereum, si riferisce alle app decentralizzate che vengono eseguite sulla blockchain. Queste app consentono a chiunque di partecipare senza monetizzare i propri dati personali. +Il Web2 si riferisce alla versione di internet che la maggior parte di noi conosce oggi. Un internet dominato da aziende che forniscono servizi in cambio dei tuoi dati personali. Il Web3, nel contesto di [Ethereum](/), si riferisce alle app decentralizzate che vengono eseguite sulla blockchain. Si tratta di app che consentono a chiunque di partecipare senza monetizzare i propri dati personali. -Stai cercando una risorsa più adatta ai principianti? Visualizza la nostra [introduzione al web3](/web3/). +Cerchi una risorsa più adatta ai principianti? Consulta la nostra [introduzione al web3](/web3/). ## Vantaggi del Web3 {#web3-benefits} -Molti sviluppatori Web3 hanno deciso di sviluppare dApp per via della decentralizzazione intrinseca di Ethereum: +Molti sviluppatori del Web3 hanno scelto di creare dApp a causa della decentralizzazione intrinseca di Ethereum: -- Chiunque sia in rete ha il permesso di utilizzare il servizio. In altre parole, non serve chiedere un permesso. -- Nessuno può bloccare un utente o impedirgli l'accesso al servizio. -- I pagamenti sono incorporati tramite il token nativo, ether (ETH). -- Ethereum è Turing completa, a significare che puoi programmare praticamente qualsiasi cosa. +- Chiunque si trovi sulla rete ha il permesso di utilizzare il servizio, o in altre parole, non è richiesto alcun permesso. +- Nessuno può bloccarti o negarti l'accesso al servizio. +- I pagamenti sono integrati tramite il token nativo, l'ether (ETH). +- Ethereum è Turing-completo, il che significa che puoi programmare praticamente qualsiasi cosa. ## Confronti pratici {#practical-comparisons} -| Web2 | Web3 | -| ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Twitter può censurare qualsiasi conto o tweet | I tweet Web3 sarebbero incensurabili perché il controllo è decentralizzato | -| Il servizio di pagamento potrebbe decidere di non consentire determinati tipi di lavoro | Le app di pagamento Web3 non richiedono dati personali e non possono impedire pagamenti | -| I server delle app della gig-economy potrebbero non essere disponibili temporaneamente e influenzare il reddito dei lavoratori | Su Web3 non si può verificare una situazione di non disponibilità dei server: usano Ethereum, una rete decentralizzata con migliaia di computer che agiscono da backend | +| Web2 | Web3 | +| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| Twitter può censurare qualsiasi account o tweet | I tweet del Web3 sarebbero incensurabili perché il controllo è decentralizzato | +| Un servizio di pagamento potrebbe decidere di non consentire pagamenti per determinati tipi di lavoro | Le app di pagamento del Web3 non richiedono dati personali e non possono impedire i pagamenti | +| I server per le app della gig-economy potrebbero bloccarsi e influire sul reddito dei lavoratori | I server del Web3 non possono bloccarsi: usano Ethereum, una rete decentralizzata di migliaia di computer come backend | -Questo non significa che tutti i servizi debbano essere trasformati in dApp. Questi esempi sono illustrativi delle differenze principali tra i servizi web2 e web3. +Questo non significa che tutti i servizi debbano essere trasformati in una dApp. Questi esempi sono illustrativi delle principali differenze tra i servizi web2 e web3. ## Limitazioni del Web3 {#web3-limitations} -Al momento, il Web3 presenta alcune limitazioni: +Il Web3 presenta attualmente alcune limitazioni: -- Scalabilità - Le transazioni sono più lente sul web3 perché sono decentralizzate. Le modifiche allo stato, come un pagamento, devono esser elaborate da un nodo e propagate per la rete. -- UX - L'interazione con applicazioni web3 può richiedere passaggi, software e formazione aggiuntivi. Questo può essere un ostacolo all'adozione. -- Accessibilità: la mancanza di integrazione nei browser web moderni rende web3 meno accessibile a gran parte degli utenti. -- Costo - Per via del costo elevato, le dapp di maggior successo mettono porzioni piccole del loro codice sulla blockchain. +- Scalabilità: le transazioni sono più lente sul web3 perché sono decentralizzate. Le modifiche allo stato, come un pagamento, devono essere elaborate da un nodo e propagate in tutta la rete. +- UX: l'interazione con le applicazioni web3 può richiedere passaggi, software e formazione aggiuntivi. Questo può rappresentare un ostacolo all'adozione. +- Accessibilità: la mancanza di integrazione nei moderni browser web rende il web3 meno accessibile alla maggior parte degli utenti. +- Costo: la maggior parte delle dApp di successo inserisce porzioni molto piccole del proprio codice sulla blockchain poiché è costoso. -## Centralizzazione e decentralizzazione {#centralization-vs-decentralization} +## Centralizzazione vs decentralizzazione {#centralization-vs-decentralization} -Nella tabella seguente elenchiamo alcuni dei vantaggi e degli svantaggi delle reti centralizzate e decentralizzate. +Nella tabella seguente, elenchiamo a grandi linee alcuni dei vantaggi e degli svantaggi delle reti digitali centralizzate e decentralizzate. -| Sistema centralizzato | Sistema decentralizzato | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Diametro ridotto della rete (tutti i partecipanti sono collegati a un'autorità centrale); le informazioni si propagano velocemente, perché la distribuzione è gestita da un'autorità centrale con molte risorse di calcolo. | I partecipanti più lontani della rete possono potenzialmente essere molto distanti tra di loro. La trasmissione di informazioni da un lato all'altro della rete potrebbe richiedere molto tempo. | -| Solitamente ha performance più elevate (maggiori volumi, meno risorse di calcolo totali utilizzate) ed è più semplice da implementare. | Solitamente performance minori (volumi minori, più risorse di calcolo utilizzate) e più difficile da implementare. | -| In caso di conflitto di dati, la risoluzione è facile e chiara: la fonte di verità è l'autorità centrale. | Un protocollo (spesso complesso) è necessario per la risoluzione di dispute, se i peer fanno affermazioni contrastanti riguardo i dati che dovrebbero essere sincronizzati tra i partecipanti. | -| Punto di errore unico: attori malevoli potrebbero essere in grado di interrompere il funzionamento della rete puntando all'autorità centrale. | Non c'è un punto di errore unico: la rete può continuare a funzionare anche se una gran parte dei partecipanti vengono attaccati o resi non disponibili. | -| Il coordinamento tra i partecipanti alla rete è più semplice ed è gestito da un'autorità centrale. L'autorità centrale può obbligare i partecipanti alla rete ad adottare aggiornamenti, aggiornamenti del protocollo ecc. con pochi ostacoli. | Il coordinamento è spesso difficoltoso, perché non c'è un utente singolo che ha l'ultima parola a livello di decisioni della rete, upgrade del protocollo ecc. Nel caso peggiore, la rete è incline a dividersi quando ci sono disaccordi su cambiamenti di protocollo. | -| L'autorità centrale può censurare dati, escludendo potenzialmente parti della rete dall'interazione con il resto della rete. | La censura è molto più difficile perché le informazioni hanno molti modi per diffondersi attraverso la rete. | -| La partecipazione alla rete è controllata dall'autorità centrale. | Chiunque può partecipare alla rete, non ci sono "guardiani". Idealmente, il costo per la partecipazione è molto basso. | +| Sistemi Centralizzati | Sistemi Decentralizzati | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Basso diametro della rete (tutti i partecipanti sono connessi a un'autorità centrale); le informazioni si propagano rapidamente, poiché la propagazione è gestita da un'autorità centrale con molte risorse computazionali. | I partecipanti più lontani sulla rete potrebbero essere potenzialmente a molti nodi di distanza l'uno dall'altro. Le informazioni trasmesse da un lato della rete potrebbero impiegare molto tempo per raggiungere l'altro lato. | +| Solitamente prestazioni più elevate (maggiore produttività, minori risorse computazionali totali impiegate) e più facili da implementare. | Solitamente prestazioni inferiori (minore produttività, maggiori risorse computazionali totali impiegate) e più complessi da implementare. | +| In caso di dati contrastanti, la risoluzione è chiara e semplice: la fonte ultima di verità è l'autorità centrale. | È necessario un protocollo (spesso complesso) per la risoluzione delle controversie, se i peer fanno affermazioni contrastanti sullo stato dei dati su cui i partecipanti dovrebbero essere sincronizzati. | +| Singolo punto di guasto: attori malintenzionati potrebbero essere in grado di abbattere la rete prendendo di mira l'autorità centrale. | Nessun singolo punto di guasto: la rete può ancora funzionare anche se un'ampia percentuale di partecipanti viene attaccata/eliminata. | +| Il coordinamento tra i partecipanti alla rete è molto più semplice ed è gestito da un'autorità centrale. L'autorità centrale può obbligare i partecipanti alla rete ad adottare aggiornamenti, aggiornamenti del protocollo, ecc., con pochissimo attrito. | Il coordinamento è spesso difficile, poiché nessun singolo agente ha l'ultima parola sulle decisioni a livello di rete, sugli aggiornamenti del protocollo, ecc. Nel peggiore dei casi, la rete è soggetta a fratture in caso di disaccordi sulle modifiche al protocollo. | +| L'autorità centrale può censurare i dati, impedendo potenzialmente a parti della rete di interagire con il resto della rete. | La censura è molto più difficile, poiché le informazioni hanno molti modi per propagarsi attraverso la rete. | +| La partecipazione alla rete è controllata dall'autorità centrale. | Chiunque può partecipare alla rete; non ci sono "guardiani". Idealmente, il costo di partecipazione è molto basso. | -Tieni presente che questi sono schemi generali, che potrebbero non essere validi per ogni rete. Oltre a questo, in realtà il grado a cui una rete può essere considerata decentralizzata o centralizzata non è facile da definire; nessuna rete è totalmente centralizzata o decentralizzata. +Nota che questi sono modelli generali che potrebbero non essere validi in ogni rete. Inoltre, in realtà il grado in cui una rete è centralizzata/decentralizzata si trova su uno spettro; nessuna rete è interamente centralizzata o interamente decentralizzata. ## Letture consigliate {#further-reading} -- [What is Web3?](/web3/) - _ethereum.org_ -- [L'Architettura di un'applicazione Web 3.0](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -- [The Meaning of Decentralization](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _6 febbraio 2017 - Vitalik Buterin_ -- [Why Decentralization Matters](https://medium.com/s/story/why-decentralization-matters-5e3f79f7638e) _18 febbraio 2018 - Chris Dixon_ -- [What Is Web 3.0 & Why It Matters](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _31 dicembre 2019 - Max Mersch e Richard Muirhead_ -- [Perché Abbiamo Bisogno di Web 3.0](https://medium.com/@gavofyork/why-we-need-web-3-0-5da4f2bf95ab) _12 Set 2018 - Gavin Wood_ +- [Cos'è il Web3?](/web3/) - _ethereum.org_ +- [The Architecture of a Web 3.0 application](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ +- [The Meaning of Decentralization](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _6 feb 2017 - Vitalik Buterin_ +- [Why Decentralization Matters](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _18 feb 2018 - Chris Dixon_ +- [What Is Web 3.0 & Why It Matters](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _31 dic 2019 - Max Mersch e Richard Muirhead_ +- [Why We Need Web 3.0](https://gavofyork.medium.com/why-we-need-web-3-0-5da4f2bf95ab) _12 set 2018 - Gavin Wood_ \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 64ba70d0411..471f491ef14 100644 --- a/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/it/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -1,34 +1,33 @@ --- -title: Un'introduzione ad Ethereum per sviluppatori con Python, parte 1 -description: Un'introduzione allo sviluppo di Ethereum, particolarmente utile per chi conosce il linguaggio di programmazione Python +title: Introduzione a Ethereum per sviluppatori Python, parte 1 +description: Un'introduzione allo sviluppo su Ethereum, particolarmente utile per chi ha conoscenze del linguaggio di programmazione Python author: Marc Garreau lang: it -tags: - - "python" - - "web3.py" +tags: ["Python", "web3.py"] skill: beginner -breadcrumb: "Ethereum con Python" +breadcrumb: Ethereum con Python published: 2020-09-08 source: Snake charmers sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ --- -Quindi hai sentito parlare di questo Ethereum e sei pronto ad avventurarti nella tana del coniglio? Questo post coprirà rapidamente alcune basi della blockchain, portandoti a interagire con un nodo simulato di Ethereum: leggere i dati del blocco, verificare i saldi dei conti e inviare transazioni. Lungo il percorso, evidenzieremo le differenze tra metodi tradizionali di costruzione delle app e questo nuovo paradigma decentralizzato. +Quindi, hai sentito parlare di questo Ethereum e sei pronto ad avventurarti nella tana del bianconiglio? Questo articolo coprirà rapidamente alcune basi della blockchain, per poi farti interagire con un nodo Ethereum simulato: leggendo i dati dei blocchi, controllando i saldi degli account e inviando transazioni. Lungo il percorso, evidenzieremo le differenze tra i modi tradizionali di creare app e questo nuovo paradigma decentralizzato. -## Prerequisiti (soft) {#soft-prerequisites} +## Prerequisiti (leggeri) {#soft-prerequisites} -Questo post aspira ad essere accessibile ad un'ampia gamma di sviluppatori. Tireremo in ballo gli [strumenti di Python](/developers/docs/programming-languages/python/), ma sono solo un veicolo per le idee - non importa se non sei uno sviluppatore Python. Tuttavia, farò solo alcune premesse sulle basi che dovresti già avere, così da poter passare rapidamente alle parti specifiche di Ethereum. +Questo articolo aspira a essere accessibile a un'ampia gamma di sviluppatori. Saranno coinvolti [strumenti Python](/developers/docs/programming-languages/python/), ma sono solo un veicolo per le idee: nessun problema se non sei uno sviluppatore Python. Tuttavia, farò solo alcune supposizioni su ciò che già sai, in modo da poter passare rapidamente alle parti specifiche di Ethereum. -Premesse: +Presupposti: - Sai muoverti in un terminale, - Hai scritto qualche riga di codice Python, -- hai la versione 3.6 o superiore di Python installata nella tua macchina (l'uso di un [ambiente virtuale](https://realpython.com/effective-python-environment/#virtual-environments) è fortemente consigliato), e -- hai usato `pip`, l'installatore di pacchetti di Python. Se alcune di queste premesse non rispondessero alla tua situazione o se non fossi interessato a riprodurre il codice in questo articolo, probabilmente puoi comunque seguirlo senza problemi. +- La versione 3.6 o superiore di Python è installata sulla tua macchina (l'uso di un [ambiente virtuale](https://realpython.com/effective-python-environment/#virtual-environments) è fortemente incoraggiato), e +- hai usato `pip`, l'installatore di pacchetti di Python. + Ancora una volta, se una di queste condizioni non è vera, o non hai intenzione di riprodurre il codice in questo articolo, probabilmente potrai comunque seguire senza problemi. ## Blockchain, in breve {#blockchains-briefly} -Ci sono molti modi per descrivere Ethereum, ma il suo fulcro è costituito dalla blockchain. Le blockchain sono composte da una serie di blocchi, quindi iniziamo da qui. In termini più semplici, ogni blocco sulla blockchain di Ethereum è semplicemente una serie di metadati e un elenco di transazioni. In formato JSON, somiglia a qualcosa del genere: +Ci sono molti modi per descrivere Ethereum, ma al suo centro c'è una blockchain. Le blockchain sono composte da una serie di blocchi, quindi iniziamo da lì. In termini più semplici, ogni blocco sulla blockchain di Ethereum è solo un insieme di metadati e un elenco di transazioni. In formato JSON, si presenta più o meno così: ```json { @@ -40,85 +39,85 @@ Ci sono molti modi per descrivere Ethereum, ma il suo fulcro è costituito dalla } ``` -Ogni [blocco](/developers/docs/blocks/) contiene un riferimento al blocco precedente; il `parentHash` è semplicemente l'hash del blocco precedente. +Ogni [blocco](/developers/docs/blocks/) ha un riferimento al blocco che lo ha preceduto; il `parentHash` è semplicemente l'hash del blocco precedente. -Nota: Ethereum fa uso regolare delle funzioni di hash per produrre valori di dimensioni fisse ("hash"). Gli hash giocano un ruolo importante in Ethereum, ma per il momento puoi tranquillamente vederli come ID unici. +Nota: Ethereum fa un uso regolare di funzioni di hash per produrre valori di dimensione fissa ("hash"). Gli hash svolgono un ruolo importante in Ethereum, ma per ora puoi tranquillamente pensarli come ID univoci. -![Un diagramma raffigurante una blockchain che include i dati in ogni blocco](./blockchain-diagram.png) +![Un diagramma che raffigura una blockchain includendo i dati all'interno di ogni blocco](./blockchain-diagram.png) -_Una blockchain è fondamentalmente un elenco collegato; ogni blocco si riferisce al precedente._ +_Una blockchain è essenzialmente una lista concatenata; ogni blocco ha un riferimento al blocco precedente._ -Questa struttura di dati non è nulla di nuovo, ma le regole (ovvero i protocolli peer-to-peer) che governano la rete lo sono. Non esiste alcuna autorità centrale; la rete di pari deve collaborare per sostenere la rete e competere per decidere quali transazioni includere nel blocco successivo. Quindi, se desideri inviare denaro a un amico, dovrai trasmettere la transazione alla rete, quindi attendere che venga inclusa in un blocco successivo. +Questa struttura dati non è una novità, ma le regole (ovvero i protocolli peer-to-peer) che governano la rete lo sono. Non c'è un'autorità centrale; la rete di peer deve collaborare per sostenere la rete e competere per decidere quali transazioni includere nel blocco successivo. Quindi, quando vuoi inviare del denaro a un amico, dovrai trasmettere quella transazione alla rete, per poi aspettare che venga inclusa in un blocco imminente. -L'unico modo per la blockchain di verificare che il denaro sia realmente inviato da un utente all'altro è usare una valuta nativa a quella blockchain (es., creata e governata da essa). In Ethereum, questa valuta è detta ether e la blockchain di Ethereum contiene solo il registro ufficiale dei saldi dei conti. +L'unico modo per la blockchain di verificare che il denaro sia stato veramente inviato da un utente all'altro è utilizzare una valuta nativa (cioè creata e governata da) quella blockchain. In Ethereum, questa valuta si chiama ether e la blockchain di Ethereum contiene l'unico registro ufficiale dei saldi degli account. ## Un nuovo paradigma {#a-new-paradigm} -Questa nuova tecnologia decentralizzata ha generato nuovi strumenti per sviluppatori. Questi esistono in molti linguaggi di programmazione, ma per il momento guarderemo attraverso la lente di Python. Per ribadire: anche se Python non è il tuo linguaggio preferito, non dovrebbe esser troppo difficile proseguire. +Questo nuovo stack tecnologico decentralizzato ha generato nuovi strumenti per sviluppatori. Tali strumenti esistono in molti linguaggi di programmazione, ma noi li guarderemo attraverso la lente di Python. Per ribadire: anche se Python non è il tuo linguaggio preferito, non dovrebbe essere un grosso problema seguire. -Gli sviluppatori di Python che desiderano interagire con Ethereum, probabilmente sceglieranno [Web3.py](https://web3py.readthedocs.io/). Web3.py è una libreria che semplifica notevolmente la connessione a un nodo di Ethereum e l'invio e la ricezione di dati da esso. +Gli sviluppatori Python che vogliono interagire con Ethereum probabilmente ricorreranno a [Web3.py](https://web3py.readthedocs.io/). Web3.py è una libreria che semplifica notevolmente il modo in cui ti connetti a un nodo Ethereum, per poi inviare e ricevere dati da esso. -Nota: "nodo di Ethereum" e "client di Ethereum" sono usati in modo intercambiabile. Ad ogni modo, ci riferiamo al software eseguito da un partecipante alla rete di Ethereum. Questo software può leggere i dati del blocco, ricevere aggiornamenti quando i nuovi blocchi sono aggiunti alla catena, trasmettere le nuove transazioni e tanto altro. Tecnicamente, il client è il software, il nodo è il computer che esegue il software. +Nota: "nodo Ethereum" e "client Ethereum" sono usati in modo intercambiabile. In entrambi i casi, si riferiscono al software eseguito da un partecipante alla rete Ethereum. Questo software può leggere i dati dei blocchi, ricevere aggiornamenti quando nuovi blocchi vengono aggiunti alla catena, trasmettere nuove transazioni e altro ancora. Tecnicamente, il client è il software, il nodo è il computer che esegue il software. -I [client di Ethereum](/developers/docs/nodes-and-clients/) sono configurabili per esser raggiungibili da [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP, o Websocket, quindi Web3.py dovrà rispecchiare tale configurazione. Web3.py si riferisce a queste opzioni di connessione come **provider**. Occorre scegliere uno dei tre provider per collegare l'istanza di Web3.py al tuo nodo. +I [client Ethereum](/developers/docs/nodes-and-clients/) possono essere configurati per essere raggiungibili tramite [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP o Websocket, quindi Web3.py dovrà rispecchiare questa configurazione. Web3.py si riferisce a queste opzioni di connessione come **provider**. Dovrai scegliere uno dei tre provider per collegare l'istanza di Web3.py al tuo nodo. -![Un diagramma che mostra come web3.py utilizza IPC per collegare la tua applicazione a un nodo Ethereum](./web3py-and-nodes.png) +![Un diagramma che mostra come web3.py utilizza IPC per connettere la tua applicazione a un nodo Ethereum](./web3py-and-nodes.png) -_Configura il nodo di Ethereum e Web3.py per comunicare tramite lo stesso protocollo, ad es. IPC in questo diagramma._ +_Configura il nodo Ethereum e Web3.py per comunicare tramite lo stesso protocollo, ad es. IPC in questo diagramma._ -Una volta configurato correttamente Web3.py, puoi iniziare a interagire con la blockchain. Ecco un paio di esempi di utilizzo di Web3.py come anticipazione di ciò che vedremo tra poco: +Una volta che Web3.py è configurato correttamente, puoi iniziare a interagire con la blockchain. Ecco un paio di esempi di utilizzo di Web3.py come anteprima di ciò che verrà: ```python -# read block data: +# leggi i dati del blocco: w3.eth.get_block('latest') -# send a transaction: +# invia una transazione: w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) ``` ## Installazione {#installation} -In questa guida, lavoreremo solo all'interno di un interprete Python. Non creeremo cartelle, file, classi o funzioni. +In questa guida, lavoreremo solo all'interno di un interprete Python. Non creeremo directory, file, classi o funzioni. -Nota: Negli esempi seguenti, i comandi che iniziano con "$" sono intesi come da eseguire nel terminale. (Non occorre digitare "$", indica solo l'inizio della riga.) +Nota: Negli esempi seguenti, i comandi che iniziano con `$` sono destinati a essere eseguiti nel terminale. (Non digitare il `$`, indica solo l'inizio della riga.) -Innanzi tutto, installa [IPython](https://ipython.org/) per un ambiente user-friendly da esplorare. IPython offre il completamento delle schede, tra le altre funzionalità, facilitando notevolmente la visualizzazione di cosa è possibile in Web3.py. +Per prima cosa, installa [IPython](https://ipython.org/) per avere un ambiente user-friendly in cui esplorare. IPython offre il completamento con il tasto Tab, tra le altre funzionalità, rendendo molto più facile vedere cosa è possibile fare all'interno di Web3.py. ```bash pip install ipython ``` -Web3.py è pubblicato sotto il nome `web3`. Installalo come segue: +Web3.py è pubblicato con il nome `web3`. Installalo in questo modo: ```bash pip install web3 ``` -Un'altra cosa: più avanti simuleremo una blockchain, il che richiede un paio di altre dipendenze. Puoi installarle tramite: +Un'ultima cosa: più tardi simuleremo una blockchain, il che richiede un paio di dipendenze in più. Puoi installarle tramite: ```bash pip install 'web3[tester]' ``` -È tutto pronto per iniziare! +Sei pronto per iniziare! -Nota: il pacchetto `web3[tester]` funziona fino a Python 3.10.xx. +Nota: Il pacchetto `web3[tester]` funziona fino a Python 3.10.xx -## Aprire un sandbox {#spin-up-a-sandbox} +## Avviare una sandbox {#spin-up-a-sandbox} -Apri un nuovo ambiente di Python eseguendo `ipyton` nel tuo terminale. Ciò è comparabile ad eseguire `python`, ma con qualche fronzolo in più. +Apri un nuovo ambiente Python eseguendo `ipython` nel tuo terminale. Questo è paragonabile all'esecuzione di `python`, ma è dotato di più funzionalità. ```bash ipython ``` -Questo produrrà una serie di informazioni sulle versioni di Python e IPython in uso, poi dovresti vedere una richiesta d'inserimento in attesa: +Questo stamperà alcune informazioni sulle versioni di Python e IPython che stai eseguendo, dopodiché dovresti vedere un prompt in attesa di input: ```python In [1]: ``` -Ciò che vedi ora è una shell interattiva di Python. In sostanza, è un recinto di sabbia in cui giocare. Se sei arrivato fin qui, è il momento di importare Web3.py: +Ora stai guardando una shell Python interattiva. Essenzialmente, è una sandbox in cui giocare. Se sei arrivato fin qui, è il momento di importare Web3.py: ```python In [1]: from web3 import Web3 @@ -126,22 +125,22 @@ In [1]: from web3 import Web3 ## Introduzione al modulo Web3 {#introducing-the-web3-module} -Oltre all'essere un gateway per Ethereum, il modulo [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) offre alcune funzioni comode. Esploriamone alcune. +Oltre a essere un gateway per Ethereum, il modulo [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) offre alcune funzioni di utilità. Esploriamone un paio. -In un'applicazione di Ethereum, normalmente occorre convertire le denominazioni delle valute. Il modulo Web3 fornisce un paio di metodi di supporto appositamente per questo: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) e [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). +In un'applicazione Ethereum, avrai comunemente bisogno di convertire le denominazioni di valuta. Il modulo Web3 fornisce un paio di metodi di supporto proprio per questo: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) e [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). -Nota: I computer sono notoriamente inefficaci nella gestione della matematica decimale. Per aggirare ciò, gli sviluppatori archiviano spesso importi di dollari in centesimi. Per esempio, un oggetto con un prezzo di $5,99 potrebbe esser memorizzato nel database come 599. +Nota: I computer sono notoriamente pessimi nel gestire la matematica decimale. Per aggirare questo problema, gli sviluppatori spesso memorizzano gli importi in dollari in centesimi. Ad esempio, un articolo con un prezzo di $5.99 potrebbe essere memorizzato nel database come 599. -Uno schema simile è usato per gestire le transazioni in ether. Tuttavia, invece di due punti decimali, ether ne ha 18! La più piccola denominazione di ether è chiamata wei, ovvero il valore specificato inviando le transazioni. +Un modello simile viene utilizzato quando si gestiscono transazioni in ether. Tuttavia, invece di due cifre decimali, l'ether ne ha 18! La denominazione più piccola di ether si chiama wei, quindi questo è il valore specificato quando si inviano transazioni. 1 ether = 1000000000000000000 wei -1 wei = 0,000000000000000001 ether +1 wei = 0.000000000000000001 ether -Prova a convertire dei valori da e verso wei. Nota che [esistono nomi per molte delle denominazioni](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) tra ether e wei. Una delle più note è **gwei**, spesso utilizzata per rappresentare le commissioni di transazione. +Prova a convertire alcuni valori da e verso wei. Nota che [ci sono nomi per molte delle denominazioni](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations) tra ether e wei. Una delle più note tra queste è il **gwei**, poiché è spesso il modo in cui vengono rappresentate le commissioni della transazione. ```python In [2]: Web3.to_wei(1, 'ether') @@ -151,49 +150,50 @@ In [3]: Web3.from_wei(500000000, 'gwei') Out[3]: Decimal('0.5') ``` -Altri metodi d'utilità sul modulo Web3 includono i convertitori di formato dei dati (ad es. [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), helper di indirizzo (ad es. [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) e funzioni di hash (es., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Molti di questi saranno affrontati in seguito nella serie. Per visualizzare tutti i metodi e le proprietà disponibili, usa l'autocompilazione di Python digitando `Web3` e premi il tasto tab due volte dopo il punto. +Altri metodi di utilità sul modulo Web3 includono convertitori di formato dati (ad es., [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), helper per gli indirizzi (ad es., [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) e funzioni di hash (ad es., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Molti di questi verranno trattati più avanti nella serie. Per visualizzare tutti i metodi e le proprietà disponibili, utilizza l'autocompletamento di IPython digitando `Web3.` e premendo due volte il tasto Tab dopo il punto. -## Comunicare con la catena {#talk-to-the-chain} +## Parlare con la catena {#talk-to-the-chain} -I metodi di convenienza sono fantastici, ma passiamo alla blockchain. Il prossimo passaggio è configurare Web3.py per comunicare con un nodo di Ethereum. Qui abbiamo l'opzione di usare i provider IPC, HTTP o Websocket. +I metodi di utilità sono adorabili, ma passiamo alla blockchain. Il passo successivo è configurare Web3.py per comunicare con un nodo Ethereum. Qui abbiamo l'opzione di utilizzare i provider IPC, HTTP o Websocket. -Non percorreremo questo percorso, ma un esempio di flusso di lavoro completo usando il provider HTTP potrebbe apparire così: +Non seguiremo questa strada, ma un esempio di flusso di lavoro completo utilizzando l'HTTP Provider potrebbe assomigliare a questo: -- Scarica un nodo di Ethereum, ad es. [Geth](https://geth.ethereum.org/). -- Avvia Geth in una finestra del terminale e attendi che si sincronizzi alla rete. La porta HTTP predefinita è `8545`, ma è configurabile. -- Dì a Web3.py di connettersi al nodo tramite HTTP, su `localhost:8545`. `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` +- Scarica un nodo Ethereum, ad es. [Geth](https://geth.ethereum.org/). +- Avvia Geth in una finestra del terminale e attendi che sincronizzi la rete. La porta HTTP predefinita è `8545`, ma è configurabile. +- Dì a Web3.py di connettersi al nodo tramite HTTP, su `localhost:8545`. + `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` - Usa l'istanza `w3` per interagire con il nodo. -Questo è uno dei modi "reali" per farlo, mentre il processo di sincronizzazione impiega ore e non è necessario se vuoi solo un ambiente di sviluppo. Web3.py espone un quarto provider per questo scopo, l'**EthereumTesterProvider**. Questo provider di prova si collega a un nodo simulato di Ethereum con autorizzazioni rilassate e valute false con cui giocare. +Sebbene questo sia un modo "reale" per farlo, il processo di sincronizzazione richiede ore ed è inutile se desideri solo un ambiente di sviluppo. Web3.py espone un quarto provider per questo scopo, l'**EthereumTesterProvider**. Questo provider di test si collega a un nodo Ethereum simulato con permessi rilassati e valuta finta con cui giocare. -![Un diagramma che mostra l'EthereumTesterProvider collegare la tua applicazione di web3.py a un nodo simulato di Ethereum](./ethereumtesterprovider.png) +![Un diagramma che mostra l'EthereumTesterProvider che collega la tua applicazione web3.py a un nodo Ethereum simulato](./ethereumtesterprovider.png) -_L'EthereumTesterProvider si connette a un nodo simulato ed è utile per gli ambienti di sviluppo rapido._ +_L'EthereumTesterProvider si connette a un nodo simulato ed è comodo per ambienti di sviluppo rapidi._ -Quel nodo simulato è detto [eth-tester](https://github.com/ethereum/eth-tester) e lo abbiamo installato come parte del comando `pip install web3[tester]`. Configurare Web3.py per usare questo provider di prova è semplicissimo: +Quel nodo simulato si chiama [eth-tester](https://github.com/ethereum/eth-tester) e lo abbiamo installato come parte del comando `pip install web3[tester]`. Configurare Web3.py per utilizzare questo provider di test è semplice come: ```python In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -Ora sei pronto a navigare sulla catena! In realtà non si dice così, l'ho inventato io sul momento. Facciamo un rapido tour. +Ora sei pronto per navigare sulla catena! Non è una cosa che si dice. Me la sono appena inventata. Facciamo un rapido tour. ## Il tour rapido {#the-quick-tour} -Per prima cosa, un bel sanity check: +Prima di tutto, un controllo di integrità: ```python In [5]: w3.is_connected() Out[5]: True ``` -Poiché stiamo usando il provider di prova, non è un test probante, ma se dovesse fallire, c'è la possibilità che tu abbia digitato qualcosa di sbagliato per avviare un'istanza della variabile `w3`. Ricontrolla di aver incluso le parentesi interne, ad es.`Web3.EthereumTesterProvider()`. +Poiché stiamo utilizzando il provider di test, questo non è un test molto prezioso, ma se fallisce, è probabile che tu abbia digitato qualcosa di sbagliato durante l'istanziazione della variabile `w3`. Ricontrolla di aver incluso le parentesi interne, ovvero `Web3.EthereumTesterProvider()`. -## Fermata #1 del tour: [conti](/developers/docs/accounts/) {#tour-stop-1-accounts} +## Tappa del tour n. 1: [account](/developers/docs/accounts/) {#tour-stop-1-accounts} -Per comodità, il fornitore di tester ha creato alcuni account e li ha precaricati con test ether. +Per comodità, il provider di test ha creato alcuni account e li ha precaricati con ether di test. -In primo luogo, vediamo un elenco di questi account: +Per prima cosa, vediamo un elenco di quegli account: ```python In [6]: w3.eth.accounts @@ -202,27 +202,27 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -Se esegui questo comando, vedrai un elenco di dieci stringhe che iniziano per `0x`. Ciascuna di esse è un **indirizzo pubblico** ed è in qualche modo analoga al numero dell'account di verifica. Puoi fornire questo indirizzo a chiunque voglia inviarti ether. +Se esegui questo comando, dovresti vedere un elenco di dieci stringhe che iniziano con `0x`. Ognuna è un **indirizzo pubblico** ed è, in qualche modo, analoga al numero di conto di un conto corrente. Forniresti questo indirizzo a qualcuno che volesse inviarti ether. -Come accennato, il fornitore di tester ha precaricato ciascuno di questi account con qualche test ether. Scopriamo quanto c'è nel primo account: +Come accennato, il provider di test ha precaricato ciascuno di questi account con alcuni ether di test. Scopriamo quanto c'è nel primo account: ```python In [7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 ``` -Sono molti zeri! Prima di correre alla velocità della luce fino alla banca finta, ricordati la lezione di poco fa sulle denominazioni della valuta. I valori dell'ether sono rappresentati nella più piccola denominazione, ovvero il wei. Convertila in ether: +Sono un sacco di zeri! Prima di andare a ridere fino alla finta banca, ricorda quella lezione sulle denominazioni di valuta di prima. I valori in ether sono rappresentati nella denominazione più piccola, i wei. Convertilo in ether: ```python In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` -Un milione di ether di prova, comunque una cifra di tutto rispetto. +Un milione di ether di test: non è affatto male. -## Fermata del tour #2: dati del blocco {#tour-stop-2-block-data} +## Tappa del tour n. 2: dati del blocco {#tour-stop-2-block-data} -Diamo una sbirciatina allo stato di questa blockchain simulata: +Diamo un'occhiata allo stato di questa blockchain simulata: ```python In [9]: w3.eth.get_block('latest') @@ -235,15 +235,15 @@ Out[9]: AttributeDict({ }) ``` -Vengono restituite molte informazioni su un blocco, ma qui vale la pena di sottolineare solo un paio di cose: +Vengono restituite molte informazioni su un blocco, ma ci sono solo un paio di cose da sottolineare qui: -- Il numero del blocco è zero, non importa quanto tempo fa tu abbia configurato il provider di prova. A differenza della vera rete di Ethereum, che aggiunge un nuovo blocco ogni 12 secondi, questa simulazione attenderà finché non le darai qualcosa da fare. -- `transactions` è un elenco vuoto, per lo stesso motivo: non abbiamo ancora fatto nulla. Questo primo blocco è un **blocco vuoto**, giusto per dare il via alla catena. -- Nota che il `parentHash` è solo un mucchio di byte vuoti. Questo significa che è il primo blocco nella catena, anche noto come **blocco di genesi**. +- Il numero del blocco è zero, indipendentemente da quanto tempo fa hai configurato il provider di test. A differenza della vera rete Ethereum, che aggiunge un nuovo blocco ogni 12 secondi, questa simulazione aspetterà finché non le darai del lavoro da fare. +- `transactions` è un elenco vuoto, per lo stesso motivo: non abbiamo ancora fatto nulla. Questo primo blocco è un **blocco vuoto**, solo per dare il via alla catena. +- Nota che il `parentHash` è solo un mucchio di byte vuoti. Questo significa che è il primo blocco della catena, noto anche come **blocco genesi**. -## Fermata #3 del tour: [transazioni](/developers/docs/transactions/) {#tour-stop-3-transactions} +## Tappa del tour n. 3: [transazioni](/developers/docs/transactions/) {#tour-stop-3-transactions} -Siamo fermi al blocco zero finché non si verifica una transazione in sospeso, quindi diamogliene una. Invia qualche ether di prova da un account all'altro: +Siamo bloccati al blocco zero finché non c'è una transazione in sospeso, quindi diamogliene una. Invia alcuni ether di test da un account all'altro: ```python In [10]: tx_hash = w3.eth.send_transaction({ @@ -254,13 +254,16 @@ In [10]: tx_hash = w3.eth.send_transaction({ }) ``` -Questo è tipicamente il punto in cui dovresti aspettare diversi secondi affinché la tua transazione sia inclusa in un nuovo blocco. L'intero processo va più o meno come indicato sotto: +Questo è in genere il punto in cui aspetteresti diversi secondi affinché la tua transazione venga inclusa in un nuovo blocco. L'intero processo si svolge più o meno così: -1. Invia una transazione e mantieni l'hash della transazione. Finché il blocco contenente la transazione non viene creato e trasmesso, la transazione è "in sospeso". `tx_hash = w3.eth.send_transaction({ … })` -2. Attendi che la transazione sia inclusa in un blocco: `w3.eth.wait_for_transaction_receipt(tx_hash)` -3. Prosegui la logica dell'applicazione. Per visualizzare la transazione riuscita: `w3.eth.get_transaction(tx_hash)` +1. Invia una transazione e conserva l'hash della transazione. Finché il blocco contenente la transazione non viene creato e trasmesso, la transazione è "in sospeso". + `tx_hash = w3.eth.send_transaction({ … })` +2. Attendi che la transazione venga inclusa in un blocco: + `w3.eth.wait_for_transaction_receipt(tx_hash)` +3. Continua la logica dell'applicazione. Per visualizzare la transazione andata a buon fine: + `w3.eth.get_transaction(tx_hash)` -Il nostro ambiente simulato aggiungerà la transazione in un nuovo blocco istantaneamente, quindi possiamo visualizzare immediatamente la transazione: +Il nostro ambiente simulato aggiungerà la transazione in un nuovo blocco all'istante, in modo da poter visualizzare immediatamente la transazione: ```python In [11]: w3.eth.get_transaction(tx_hash) @@ -275,9 +278,9 @@ Out[11]: AttributeDict({ }) ``` -Vedrai qualche dettaglio familiare qui: i campi `from`, `to` e `value` dovrebbero corrispondere alle immissioni della tua chiamata `send_transaction`. L'altra parte rassicurante è che questa transazione è stata inclusa come prima transazione (`'transactionIndex': 0`) nel blocco numero 1. +Vedrai alcuni dettagli familiari qui: i campi `from`, `to` e `value` dovrebbero corrispondere agli input della nostra chiamata `send_transaction`. L'altro dettaglio rassicurante è che questa transazione è stata inclusa come prima transazione (`'transactionIndex': 0`) all'interno del blocco numero 1. -Possiamo anche verificare facilmente il successo di questa transazione controllando i saldi dei due account coinvolti. Tre ether dovrebbero essersi spostati dal primo al secondo. +Possiamo anche verificare facilmente il successo di questa transazione controllando i saldi dei due account coinvolti. Tre ether dovrebbero essersi spostati da uno all'altro. ```python In [12]: w3.eth.get_balance(w3.eth.accounts[0]) @@ -287,12 +290,12 @@ In [13]: w3.eth.get_balance(w3.eth.accounts[1]) Out[13]: 1000003000000000000000000 ``` -Quest'ultima parte sembra a posto! Il saldo è passato da 1.000.000 a 1.000.003 ether. Ma cosa è successo al primo account? Sembra aver perso lievemente di più di tre ether. Ahimè, niente nella vita è gratis e per usare la rete pubblica di Ethereum occorre compensare i tuoi pari per il loro ruolo di supporto. Una piccola commissione di transazione è stata detratta dall'account che ha inviato la transazione: si tratta dell'importo di gas bruciato (21000 unità di gas per un trasferimento di ETH), moltiplicato per una commissione di base che varia a seconda dell'attività della rete, più una mancia inviata al validatore che include la transazione in un blocco. +Il secondo sembra a posto! Il saldo è passato da 1.000.000 a 1.000.003 ether. Ma cosa è successo al primo account? Sembra aver perso poco più di tre ether. Ahimè, niente nella vita è gratis e l'utilizzo della rete pubblica di Ethereum richiede di compensare i propri peer per il loro ruolo di supporto. Una piccola commissione della transazione è stata detratta dall'account che ha inviato la transazione: questa commissione è la quantità di gas bruciato (21000 unità di gas per un trasferimento di ETH) moltiplicata per una commissione di base che varia in base all'attività della rete più una mancia che va al validatore che include la transazione in un blocco. Maggiori informazioni sul [gas](/developers/docs/gas/#post-london) -Nota: Sulla rete pubblica, le commissioni di transazione sono variabili in base alla domanda della rete ella rapidità con cui vorresti che una transazione fosse elaborata. Se sei interessato a una ripartizione di come sono calcolate le commissioni, vedi il mio post precedente su come sono incluse le transazioni in un blocco. +Nota: Sulla rete pubblica, le commissioni della transazione sono variabili in base alla domanda della rete e alla rapidità con cui desideri che una transazione venga elaborata. Se sei interessato a un'analisi dettagliata di come vengono calcolate le commissioni, consulta il mio post precedente su come le transazioni vengono incluse in un blocco. ## E respira {#and-breathe} -Ci siamo soffermati su questo argomento per un po' di tempo, quindi sembra un buon momento per prendersi una pausa. L'argomento non è esaurito e continueremo a parlarne nella seconda parte di questa serie. Alcuni concetti che affronteremo: connettersi a un nodo reale, contratti intelligenti e token. Hai domande d'approfondimento? Fammelo sapere! Il tuo feedback influenzerà il contenuto della seconda parte. Le richieste sono benvenute tramite [Twitter](https://twitter.com/wolovim). +Siamo stati su questo per un po', quindi questo sembra un buon posto come un altro per fare una pausa. La tana del bianconiglio continua e continueremo a esplorare nella seconda parte di questa serie. Alcuni concetti in arrivo: connessione a un nodo reale, contratti intelligenti e token. Hai domande di follow-up? Fammelo sapere! Il tuo feedback influenzerà la direzione che prenderemo da qui in poi. Le richieste sono benvenute tramite [Twitter](https://twitter.com/wolovim). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/ai-trading-agent/index.md b/public/content/translations/it/developers/tutorials/ai-trading-agent/index.md index 44283b84a24..08026d536c6 100644 --- a/public/content/translations/it/developers/tutorials/ai-trading-agent/index.md +++ b/public/content/translations/it/developers/tutorials/ai-trading-agent/index.md @@ -1,39 +1,40 @@ --- title: Crea il tuo agente di trading IA su Ethereum -description: In questa guida imparerai a creare un semplice agente di trading IA. Questo agente legge le informazioni dalla blockchain, chiede una raccomandazione a un LLM in base a tali informazioni, esegue lo scambio consigliato dall'LLM, quindi attende e ripete. +description: In questo tutorial imparerai come creare un semplice agente di trading IA. Questo agente legge informazioni dalla blockchain, chiede a un LLM una raccomandazione basata su tali informazioni, esegue lo scambio raccomandato dall'LLM, quindi attende e ripete. author: Ori Pomerantz -tags: [ "IA", "trading", "agente", "python" ] +tags: ["IA", "trading", "agente", "Python"] skill: intermediate +breadcrumb: Agente di trading IA published: 2026-02-13 lang: it sidebarDepth: 3 --- -In questa guida imparerai a creare un semplice agente di trading IA. Questo agente funziona seguendo questi passaggi: +In questo tutorial imparerai come costruire un semplice agente di trading IA. Questo agente funziona seguendo questi passaggi: -1. Leggere i prezzi attuali e passati di un token, nonché altre informazioni potenzialmente pertinenti -2. Costruire una query con queste informazioni, insieme a informazioni di base per spiegare come potrebbero essere pertinenti +1. Leggere i prezzi attuali e passati di un token, oltre ad altre informazioni potenzialmente rilevanti +2. Costruire una query con queste informazioni, insieme a informazioni di base per spiegare come potrebbero essere rilevanti 3. Inviare la query e ricevere in risposta un prezzo previsto -4. Effettuare uno scambio in base alla raccomandazione +4. Fare trading in base alla raccomandazione 5. Attendere e ripetere -Questo agente dimostra come leggere le informazioni, tradurle in una query che fornisce una risposta utilizzabile e utilizzare tale risposta. Tutti questi sono passaggi richiesti per un agente IA. Questo agente è implementato in Python perché è il linguaggio più comune utilizzato nell'IA. +Questo agente dimostra come leggere informazioni, tradurle in una query che produce una risposta utilizzabile e utilizzare tale risposta. Tutti questi sono passaggi richiesti per un agente IA. Questo agente è implementato in Python perché è il linguaggio più comune utilizzato nell'IA. ## Perché farlo? {#why-do-this} -Gli agenti di trading automatizzati consentono agli sviluppatori di selezionare ed eseguire una strategia di trading. Gli [agenti IA](/ai-agents) consentono strategie di trading più complesse e dinamiche, utilizzando potenzialmente informazioni e algoritmi che lo sviluppatore non ha nemmeno considerato di usare. +Gli agenti di trading automatizzati consentono agli sviluppatori di selezionare ed eseguire una strategia di trading. Gli [agenti IA](/ai-agents) consentono strategie di trading più complesse e dinamiche, utilizzando potenzialmente informazioni e algoritmi che lo sviluppatore non ha nemmeno preso in considerazione. ## Gli strumenti {#tools} -Questa guida utilizza [Python](https://www.python.org/), la [libreria Web3](https://web3py.readthedocs.io/en/stable/) e [Uniswap v3](https://github.com/Uniswap/v3-periphery) per quotazioni e trading. +Questo tutorial utilizza [Python](https://www.python.org/), la [libreria Web3](https://web3py.readthedocs.io/en/stable/) e [Uniswap v3](https://github.com/Uniswap/v3-periphery) per le quotazioni e il trading. ### Perché Python? {#python} -Il linguaggio più utilizzato per l'IA è [Python](https://www.python.org/), quindi lo usiamo qui. Non ti preoccupare se non conosci Python. Il linguaggio è molto chiaro e spiegherò esattamente cosa fa. +Il linguaggio più utilizzato per l'IA è [Python](https://www.python.org/), quindi lo useremo qui. Non preoccuparti se non conosci Python. Il linguaggio è molto chiaro e spiegherò esattamente cosa fa. -La [libreria Web3](https://web3py.readthedocs.io/en/stable/) è l'API Python di Ethereum più comune. È abbastanza facile da usare. +La [libreria Web3](https://web3py.readthedocs.io/en/stable/) è l'API Ethereum per Python più comune. È piuttosto facile da usare. -### Trading sulla blockchain {#trading-on-blockchain} +### Fare trading sulla blockchain {#trading-on-blockchain} Ci sono [molti exchange decentralizzati (DEX)](/apps/categories/defi/) che ti permettono di scambiare token su Ethereum. Tuttavia, tendono ad avere tassi di cambio simili a causa dell'[arbitraggio](/developers/docs/smart-contracts/composability/#better-user-experience). @@ -41,44 +42,44 @@ Ci sono [molti exchange decentralizzati (DEX)](/apps/categories/defi/) che ti pe ### OpenAI {#openai} -Per un modello linguistico di grandi dimensioni, ho scelto di iniziare con [OpenAI](https://openai.com/). Per eseguire l'applicazione in questa guida dovrai pagare per l'accesso all'API. Il pagamento minimo di 5$ è più che sufficiente. +Per un modello linguistico di grandi dimensioni (LLM), ho scelto di iniziare con [OpenAI](https://openai.com/). Per eseguire l'applicazione in questo tutorial dovrai pagare per l'accesso all'API. Il pagamento minimo di 5$ è più che sufficiente. ## Sviluppo, passo dopo passo {#step-by-step} -Per semplificare lo sviluppo, procediamo per fasi. Ogni passaggio è un branch in GitHub. +Per semplificare lo sviluppo, procederemo per fasi. Ogni passaggio è un branch su GitHub. ### Per iniziare {#getting-started} -Ci sono passaggi per iniziare con UNIX o Linux (incluso [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)) +Ci sono dei passaggi per iniziare su UNIX o Linux (incluso [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)) 1. Se non lo hai già, scarica e installa [Python](https://www.python.org/downloads/). -2. Clona la repository di GitHub. +2. Clona il repository GitHub. ```sh git clone https://github.com/qbzzt/260215-ai-agent.git -b 01-getting-started cd 260215-ai-agent - ``` +``` 3. Installa [`uv`](https://docs.astral.sh/uv/getting-started/installation/). Il comando sul tuo sistema potrebbe essere diverso. ```sh pipx install uv - ``` +``` 4. Scarica le librerie. ```sh uv sync - ``` +``` 5. Attiva l'ambiente virtuale. ```sh source .venv/bin/activate - ``` +``` -6. Per verificare che Python e Web3 funzionino correttamente, esegui `python3` e forniscigli questo programma. Puoi inserirlo al prompt `>>>`; non è necessario creare un file. +6. Per verificare che Python e Web3 funzionino correttamente, esegui `python3` e forniscigli questo programma. Puoi inserirlo al prompt `>>>`; non c'è bisogno di creare un file. ```python from web3 import Web3 @@ -86,18 +87,18 @@ Ci sono passaggi per iniziare con UNIX o Linux (incluso [WSL](https://learn.micr w3 = Web3(Web3.HTTPProvider(MAINNET_URL)) w3.eth.block_number quit() - ``` +``` -### Lettura dalla blockchain {#read-blockchain} +### Leggere dalla blockchain {#read-blockchain} -Il passo successivo è leggere dalla blockchain. Per farlo, devi passare al branch `02-read-quote` e quindi usare `uv` per eseguire il programma. +Il passaggio successivo è leggere dalla blockchain. Per farlo, devi passare al branch `02-read-quote` e poi usare `uv` per eseguire il programma. ```sh git checkout 02-read-quote uv run agent.py ``` -Dovresti ricevere un elenco di oggetti `Quote`, ognuno con un indicatore ora, un prezzo e l'asset (attualmente sempre `WETH/USDC`). +Dovresti ricevere un elenco di oggetti `Quote`, ciascuno con un timestamp, un prezzo e l'asset (attualmente sempre `WETH/USDC`). Ecco una spiegazione riga per riga. @@ -113,19 +114,19 @@ import functools import sys ``` -Importa le librerie di cui abbiamo bisogno. Sono spiegati di seguito quando vengono utilizzati. +Importa le librerie di cui abbiamo bisogno. Sono spiegate di seguito quando vengono utilizzate. ```python print = functools.partial(print, flush=True) ``` -Sostituisce il `print` di Python con una versione che svuota sempre l'output immediatamente. Questo è utile in uno script a lunga esecuzione perché non vogliamo attendere aggiornamenti di stato o output di debug. +Sostituisce il `print` di Python con una versione che svuota sempre l'output immediatamente. Questo è utile in uno script a esecuzione prolungata perché non vogliamo aspettare per gli aggiornamenti di stato o l'output di debug. ```python MAINNET_URL = "https://eth.drpc.org" ``` -Un URL per accedere alla Rete Principale. Puoi ottenerne uno da [Nodo come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service/) o usare uno di quelli pubblicizzati in [Chainlist](https://chainlist.org/chain/1). +Un URL per accedere alla rete principale. Puoi ottenerne uno da [Nodo come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service/) o usarne uno tra quelli pubblicizzati su [Chainlist](https://chainlist.org/chain/1). ```python BLOCK_TIME_SECONDS = 12 @@ -134,20 +135,20 @@ HOUR_BLOCKS = MINUTE_BLOCKS * 60 DAY_BLOCKS = HOUR_BLOCKS * 24 ``` -Un blocco della Rete Principale di Ethereum si verifica in genere ogni dodici secondi, quindi questo è il numero di blocchi che ci aspetteremmo si verifichino in un periodo di tempo. Nota che questa non è una cifra esatta. Quando il [proponente del blocco](/developers/docs/consensus-mechanisms/pos/block-proposal/) non è attivo, quel blocco viene saltato e il tempo per il blocco successivo è di 24 secondi. Se volessimo ottenere il blocco esatto per un indicatore ora, useremmo la [ricerca binaria](https://en.wikipedia.org/wiki/Binary_search). Tuttavia, questo è sufficientemente vicino per i nostri scopi. Prevedere il futuro non è una scienza esatta. +Un blocco della rete principale di Ethereum viene tipicamente prodotto ogni dodici secondi, quindi questo è il numero di blocchi che ci aspetteremmo in un determinato periodo di tempo. Nota che questa non è una cifra esatta. Quando il [proponente del blocco](/developers/docs/consensus-mechanisms/pos/block-proposal/) è inattivo, quel blocco viene saltato e il tempo per il blocco successivo è di 24 secondi. Se volessimo ottenere il blocco esatto per un timestamp, useremmo la [ricerca binaria](https://it.wikipedia.org/wiki/Ricerca_dicotomica). Tuttavia, questo è abbastanza vicino per i nostri scopi. Prevedere il futuro non è una scienza esatta. ```python CYCLE_BLOCKS = DAY_BLOCKS ``` -La dimensione del ciclo. Esaminiamo le quotazioni una volta per ciclo e proviamo a stimare il valore alla fine del ciclo successivo. +La dimensione del ciclo. Esaminiamo le quotazioni una volta per ciclo e cerchiamo di stimare il valore alla fine del ciclo successivo. ```python -# L'indirizzo del gruppo che stiamo leggendo +# L'indirizzo della pool che stiamo leggendo WETHUSDC_ADDRESS = Web3.to_checksum_address("0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640") ``` -I valori delle quotazioni sono presi dal gruppo USDC/WETH di Uniswap 3 all'indirizzo [`0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640`](https://eth.blockscout.com/address/0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640?tab=read_write_contract). Questo indirizzo è già in formato checksum, ma è meglio usare [`Web3.to_checksum_address`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_checksum_address) per rendere il codice riutilizzabile. +I valori delle quotazioni sono presi dalla pool USDC/WETH di Uniswap 3 all'indirizzo [`0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640`](https://eth.blockscout.com/address/0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640?tab=read_write_contract). Questo indirizzo è già in formato checksum, ma è meglio usare [`Web3.to_checksum_address`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_checksum_address) per rendere il codice riutilizzabile. ```python POOL_ABI = [ @@ -179,9 +180,9 @@ class ERC20Token: contract: Contract ``` -Questo è un modo per creare una classe di dati in Python. Il tipo di dati [`Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) viene utilizzato per connettersi al contratto. Nota il `(frozen=True)`. In Python i [booleani](https://en.wikipedia.org/wiki/Boolean_data_type) sono definiti come `True` o `False`, con la lettera maiuscola. Questa classe di dati è `frozen`, il che significa che i campi non possono essere modificati. +Questo è un modo per creare una classe di dati (data class) in Python. Il tipo di dati [`Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) viene utilizzato per connettersi al contratto. Nota il `(frozen=True)`. In Python i [booleani](https://it.wikipedia.org/wiki/Tipo_booleano) sono definiti come `True` o `False`, con l'iniziale maiuscola. Questa classe di dati è `frozen` (congelata), il che significa che i campi non possono essere modificati. -Nota l'indentazione. A differenza dei [linguaggi derivati dal C](https://en.wikipedia.org/wiki/List_of_C-family_programming_languages), Python usa l'indentazione per denotare i blocchi. L'interprete Python sa che la seguente definizione non fa parte di questa classe di dati perché non inizia con la stessa indentazione dei campi della classe di dati. +Nota l'indentazione. A differenza dei [linguaggi derivati dal C](https://it.wikipedia.org/wiki/Linguaggio_C), Python usa l'indentazione per denotare i blocchi. L'interprete Python sa che la definizione seguente non fa parte di questa classe di dati perché non inizia con la stessa indentazione dei campi della classe di dati. ```python @dataclass(frozen=True) @@ -202,10 +203,10 @@ Il tipo [`Decimal`](https://docs.python.org/3/library/decimal.html) viene utiliz Questo è il modo per definire una funzione in Python. La definizione è indentata per mostrare che fa ancora parte di `PoolInfo`. -In una funzione che fa parte di una classe di dati il primo parametro è sempre `self`, l'istanza della classe di dati che ha chiamato qui. Qui c'è un altro parametro, il numero del blocco. +In una funzione che fa parte di una classe di dati, il primo parametro è sempre `self`, l'istanza della classe di dati che ha effettuato la chiamata. Qui c'è un altro parametro, il numero del blocco. ```python - assert block <= w3.eth.block_number, "Il blocco è nel futuro" + assert block <= w3.eth.block_number, "Block is in the future" ``` Se potessimo leggere il futuro, non avremmo bisogno dell'IA per il trading. @@ -214,7 +215,7 @@ Se potessimo leggere il futuro, non avremmo bisogno dell'IA per il trading. sqrt_price_x96 = Decimal(self.contract.functions.slot0().call(block_identifier=block)[0]) ``` -La sintassi per chiamare una funzione sulla EVM da Web3 è questa: `.functions.().call()`. I parametri possono essere i parametri della funzione EVM (se presenti; qui non ce ne sono) o [parametri nominativi](https://en.wikipedia.org/wiki/Named_parameter) per modificare il comportamento della blockchain. Qui ne usiamo uno, `block_identifier`, per specificare [il numero del blocco](/developers/docs/apis/json-rpc/#default-block) in cui desideriamo eseguire. +La sintassi per chiamare una funzione sull'EVM da Web3 è questa: `.functions.().call()`. I parametri possono essere i parametri della funzione EVM (se presenti; qui non ce ne sono) o [parametri nominati](https://it.wikipedia.org/wiki/Parametro_nominato) per modificare il comportamento della blockchain. Qui ne usiamo uno, `block_identifier`, per specificare [il numero del blocco](/developers/docs/apis/json-rpc/#default-block) in cui desideriamo eseguire. Il risultato è [questa struct, in forma di array](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol#L56-L72). Il primo valore è una funzione del tasso di cambio tra i due token. @@ -222,14 +223,14 @@ Il risultato è [questa struct, in forma di array](https://github.com/Uniswap/v3 raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 ``` -Per ridurre i calcoli sulla catena, Uniswap v3 non memorizza il fattore di cambio effettivo ma la sua radice quadrata. Poiché l'EVM non supporta la matematica in virgola mobile o le frazioni, invece del valore effettivo, la risposta è price296 +Per ridurre i calcoli on-chain, Uniswap v3 non memorizza il fattore di cambio effettivo, ma piuttosto la sua radice quadrata. Poiché l'EVM non supporta la matematica in virgola mobile o le frazioni, invece del valore effettivo, la risposta è price296 ```python # (token1 per token0) return 1/(raw_price * self.decimal_factor) ``` -Il prezzo grezzo che otteniamo è il numero di `token0` che otteniamo per ogni `token1`. Nel nostro gruppo `token0` è USDC (stablecoin con lo stesso valore di un dollaro USA) e `token1` è [WETH](https://opensea.io/learn/blockchain/what-is-weth). Il valore che vogliamo veramente è il numero di dollari per WETH, non l'inverso. +Il prezzo grezzo che otteniamo è il numero di `token0` che riceviamo per ogni `token1`. Nella nostra pool `token0` è USDC (stablecoin con lo stesso valore di un dollaro USA) e `token1` è [WETH](https://opensea.io/learn/blockchain/what-is-weth). Il valore che vogliamo veramente è il numero di dollari per WETH, non l'inverso. Il fattore decimale è il rapporto tra i [fattori decimali](https://docs.openzeppelin.com/contracts/4.x/erc20#a-note-on-decimals) per i due token. @@ -241,7 +242,7 @@ class Quote: asset: str ``` -Questa classe di dati rappresenta una quotazione: il prezzo di un asset specifico in un dato momento. A questo punto, il campo `asset` è irrilevante perché usiamo un singolo gruppo e quindi abbiamo un singolo asset. Tuttavia, aggiungeremo altri asset in seguito. +Questa classe di dati rappresenta una quotazione: il prezzo di un asset specifico in un dato momento. A questo punto, il campo `asset` è irrilevante perché usiamo una singola pool e quindi abbiamo un singolo asset. Tuttavia, aggiungeremo altri asset in seguito. ```python def read_token(address: str) -> ERC20Token: @@ -277,7 +278,7 @@ def read_pool(address: str) -> PoolInfo: ) ``` -Questa funzione restituisce tutto ciò di cui abbiamo bisogno su [un gruppo specifico](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol). La sintassi `f""` è una [stringa formattata](https://docs.python.org/3/reference/lexical_analysis.html#f-strings). +Questa funzione restituisce tutto ciò di cui abbiamo bisogno su [una pool specifica](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3Pool.sol). La sintassi `f""` è una [stringa formattata](https://docs.python.org/3/reference/lexical_analysis.html#f-strings). ```python def get_quote(pool: PoolInfo, block_number: int = None) -> Quote: @@ -292,7 +293,7 @@ Ottieni un oggetto `Quote`. Il valore predefinito per `block_number` è `None` ( Se non è stato specificato un numero di blocco, usa `w3.eth.block_number`, che è l'ultimo numero di blocco. Questa è la sintassi per [un'istruzione `if`](https://docs.python.org/3/reference/compound_stmts.html#the-if-statement). -Potrebbe sembrare che sarebbe stato meglio impostare semplicemente il valore predefinito su `w3.eth.block_number`, ma non funziona bene perché sarebbe il numero di blocco al momento della definizione della funzione. In un agente a lunga esecuzione, questo sarebbe un problema. +Potrebbe sembrare che sarebbe stato meglio impostare semplicemente il valore predefinito su `w3.eth.block_number`, ma non funziona bene perché sarebbe il numero del blocco al momento in cui la funzione viene definita. In un agente a esecuzione prolungata, questo sarebbe un problema. ```python block = w3.eth.get_block(block_number) @@ -310,14 +311,14 @@ Usa [la libreria `datetime`](https://docs.python.org/3/library/datetime.html) pe def get_quotes(pool: PoolInfo, start_block: int, end_block: int, step: int) -> list[Quote]: ``` -In Python si definisce un [elenco](https://docs.python.org/3/library/stdtypes.html#typesseq-list) che può contenere solo un tipo specifico usando `list[]`. +In Python definisci una [lista](https://docs.python.org/3/library/stdtypes.html#typesseq-list) che può contenere solo un tipo specifico usando `list[]`. ```python quotes = [] for block in range(start_block, end_block + 1, step): ``` -In Python un [`ciclo `for``](https://docs.python.org/3/tutorial/controlflow.html#for-statements) di solito itera su un elenco. L'elenco di numeri di blocco in cui trovare le quotazioni proviene da [`range`](https://docs.python.org/3/library/stdtypes.html#range). +In Python un [ciclo `for`](https://docs.python.org/3/tutorial/controlflow.html#for-statements) tipicamente itera su una lista. L'elenco dei numeri di blocco in cui trovare le quotazioni proviene da [`range`](https://docs.python.org/3/library/stdtypes.html#range). ```python quote = get_quote(pool, block) @@ -325,7 +326,7 @@ In Python un [`ciclo `for``](https://docs.python.org/3/tutorial/controlflow.html return quotes ``` -Per ogni numero di blocco, ottieni un oggetto `Quote` e aggiungilo all'elenco `quotes`. Quindi restituisci quell'elenco. +Per ogni numero di blocco, ottieni un oggetto `Quote` e aggiungilo alla lista `quotes`. Quindi restituisci quella lista. ```python pool = read_pool(WETHUSDC_ADDRESS) @@ -339,9 +340,9 @@ quotes = get_quotes( pprint(quotes) ``` -Questo è il codice principale dello script. Leggi le informazioni del gruppo, ottieni dodici quotazioni e visualizzale con [`pprint`](https://docs.python.org/3/library/pprint.html#pprint.pprint). +Questo è il codice principale dello script. Leggi le informazioni sulla pool, ottieni dodici quotazioni e stampale con [`pprint`](https://docs.python.org/3/library/pprint.html#pprint.pprint). -### Creazione di un prompt {#prompt} +### Creare un prompt {#prompt} Successivamente, dobbiamo convertire questo elenco di quotazioni in un prompt per un LLM e ottenere un valore futuro atteso. @@ -353,7 +354,7 @@ uv run agent.py L'output ora sarà un prompt per un LLM, simile a: ``` -Date queste quotazioni: +Given these quotes: Asset: WETH/USDC 2026-01-20T16:34 3016.21 . @@ -369,19 +370,19 @@ Asset: WBTC/WETH 2026-02-01T17:50 33.46 -Quale valore ti aspetteresti per WETH/USDC all'ora 2026-02-02T17:56? +What would you expect the value for WETH/USDC to be at time 2026-02-02T17:56? -Fornisci la tua risposta come un singolo numero arrotondato a due cifre decimali, -senza alcun altro testo. +Provide your answer as a single number rounded to two decimal places, +without any other text. ``` Nota che qui ci sono quotazioni per due asset, `WETH/USDC` e `WBTC/WETH`. L'aggiunta di quotazioni da un altro asset potrebbe migliorare l'accuratezza della previsione. -#### Come appare un prompt {#prompt-explanation} +#### Come si presenta un prompt {#prompt-explanation} -Questo prompt contiene tre sezioni, che sono abbastanza comuni nei prompt LLM. +Questo prompt contiene tre sezioni, che sono piuttosto comuni nei prompt degli LLM. -1. Informazioni. Gli LLM hanno molte informazioni dal loro addestramento, ma di solito non hanno le più recenti. Questo è il motivo per cui dobbiamo recuperare le ultime quotazioni qui. L'aggiunta di informazioni a un prompt è chiamata [generazione aumentata dal recupero (RAG)](https://en.wikipedia.org/wiki/Retrieval-augmented_generation). +1. Informazioni. Gli LLM hanno molte informazioni derivanti dal loro addestramento, ma di solito non hanno le più recenti. Questo è il motivo per cui dobbiamo recuperare le ultime quotazioni qui. L'aggiunta di informazioni a un prompt è chiamata [retrieval augmented generation (RAG)](https://it.wikipedia.org/wiki/Retrieval-augmented_generation). 2. La domanda vera e propria. Questo è ciò che vogliamo sapere. @@ -395,15 +396,15 @@ Ecco il nuovo codice. from datetime import datetime, timezone, timedelta ``` -Dobbiamo fornire all'LLM l'ora per la quale vogliamo una stima. Per ottenere un'ora "n minuti/ore/giorni" nel futuro, usiamo [la classe `timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta). +Dobbiamo fornire all'LLM il momento per il quale vogliamo una stima. Per ottenere un tempo "n minuti/ore/giorni" nel futuro, usiamo [la classe `timedelta`](https://docs.python.org/3/library/datetime.html#datetime.timedelta). ```python -# Gli indirizzi dei gruppi che stiamo leggendo +# Gli indirizzi delle pool che stiamo leggendo WETHUSDC_ADDRESS = Web3.to_checksum_address("0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640") WETHWBTC_ADDRESS = Web3.to_checksum_address("0xCBCdF9626bC03E24f779434178A73a0B4bad62eD") ``` -Abbiamo due gruppi che dobbiamo leggere. +Abbiamo due pool che dobbiamo leggere. ```python @dataclass(frozen=True) @@ -414,16 +415,16 @@ class PoolInfo: reverse: bool = False def get_price(self, block: int) -> Decimal: - assert block <= w3.eth.block_number, "Il blocco è nel futuro" + assert block <= w3.eth.block_number, "Block is in the future" sqrt_price_x96 = Decimal(self.contract.functions.slot0().call(block_identifier=block)[0]) - raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 # (token1 per token0) + raw_price = (sqrt_price_x96 / Decimal(2**96)) ** 2 # (token1 per token0) if self.reverse: return 1/(raw_price * self.decimal_factor) else: return raw_price * self.decimal_factor ``` -Nel gruppo WETH/USDC, vogliamo sapere quanti `token0` (USDC) ci servono per acquistare un `token1` (WETH). Nel gruppo WETH/WBTC, vogliamo sapere quanti `token1` (WETH) ci servono per acquistare un `token0` (WBTC, che è Bitcoin wrappato). Dobbiamo tenere traccia se il rapporto del gruppo deve essere invertito. +Nella pool WETH/USDC, vogliamo sapere quanti `token0` (USDC) ci servono per comprare un `token1` (WETH). Nella pool WETH/WBTC, vogliamo sapere quanti `token1` (WETH) ci servono per comprare un `token0` (WBTC, che è Bitcoin avvolto). Dobbiamo tenere traccia se il rapporto della pool deve essere invertito. ```python def read_pool(address: str, reverse: bool = False) -> PoolInfo: @@ -441,9 +442,9 @@ def read_pool(address: str, reverse: bool = False) -> PoolInfo: ) ``` -Per sapere se un gruppo deve essere invertito, dobbiamo ottenerlo come input per `read_pool`. Inoltre, il simbolo dell'asset deve essere impostato correttamente. +Per sapere se una pool deve essere invertita, dobbiamo ottenerlo come input per `read_pool`. Inoltre, il simbolo dell'asset deve essere impostato correttamente. -La sintassi ` if else ` è l'equivalente Python dell'[operatore condizionale ternario](https://en.wikipedia.org/wiki/Ternary_conditional_operator), che in un linguaggio derivato dal C sarebbe ` ? : `. +La sintassi ` if else ` è l'equivalente Python dell'[operatore condizionale ternario](https://it.wikipedia.org/wiki/Operatore_ternario), che in un linguaggio derivato dal C sarebbe ` ? : `. ```python def format_quotes(quotes: list[Quote]) -> str: @@ -453,30 +454,30 @@ def format_quotes(quotes: list[Quote]) -> str: return result ``` -Questa funzione costruisce una stringa che formatta un elenco di oggetti `Quote`, assumendo che si applichino tutti allo stesso asset. +Questa funzione costruisce una stringa che formatta un elenco di oggetti `Quote`, supponendo che si applichino tutti allo stesso asset. ```python def make_prompt(quotes: list[list[Quote]], expected_time: str, asset: str) -> str: return f""" ``` -In Python le [stringhe letterali multiriga](https://www.w3schools.com/python/gloss_python_multi_line_strings.asp) sono scritte come `"""` .... `"""`. +In Python le [stringhe letterali multilinea](https://www.w3schools.com/python/gloss_python_multi_line_strings.asp) sono scritte come `"""` .... `"""`. ```python -Date queste quotazioni: +Given these quotes: { functools.reduce(lambda acc, q: acc + '\n' + q, map(lambda q: format_quotes(q), quotes)) } ``` -Qui usiamo il modello [MapReduce](https://en.wikipedia.org/wiki/MapReduce) per generare una stringa per ogni elenco di quotazioni con `format_quotes`, quindi li riduciamo in una singola stringa da usare nel prompt. +Qui, usiamo il pattern [MapReduce](https://it.wikipedia.org/wiki/MapReduce) per generare una stringa per ogni elenco di quotazioni con `format_quotes`, quindi le riduciamo in una singola stringa da usare nel prompt. ```python -Quale valore ti aspetteresti per {asset} all'ora {expected_time}? +What would you expect the value for {asset} to be at time {expected_time}? -Fornisci la tua risposta come un singolo numero arrotondato a due cifre decimali, -senza alcun altro testo. +Provide your answer as a single number rounded to two decimal places, +without any other text. """ ``` @@ -500,7 +501,7 @@ wethwbtc_quotes = get_quotes( ) ``` -Esamina i due gruppi e ottieni quotazioni da entrambi. +Esamina le due pool e ottieni le quotazioni da entrambe. ```python future_time = (datetime.now(timezone.utc) + timedelta(days=1)).isoformat()[0:16] @@ -512,33 +513,30 @@ Determina il momento futuro per il quale vogliamo la stima e crea il prompt. ### Interfacciarsi con un LLM {#interface-llm} -Successivamente, inviamo un prompt a un LLM effettivo e riceviamo un valore futuro atteso. Ho scritto questo programma usando OpenAI, quindi se vuoi usare un fornitore diverso, dovrai adattarlo. - -1. Ottieni un [conto OpenAI](https://auth.openai.com/create-account) - -2. [Ricarica il conto](https://platform.openai.com/settings/organization/billing/overview)—l'importo minimo al momento della scrittura è di 5$ +Successivamente, interroghiamo un vero LLM e riceviamo un valore futuro atteso. Ho scritto questo programma usando OpenAI, quindi se vuoi usare un provider diverso, dovrai adattarlo. +1. Ottieni un [account OpenAI](https://auth.openai.com/create-account) +2. [Finanzia l'account](https://platform.openai.com/settings/organization/billing/overview): l'importo minimo al momento della stesura è di 5$ 3. [Crea una chiave API](https://platform.openai.com/settings/organization/api-keys) - 4. Nella riga di comando, esporta la chiave API in modo che il tuo programma possa usarla ```sh - export OPENAI_API_KEY=sk- - ``` + export OPENAI_API_KEY=sk- +``` 5. Fai il checkout ed esegui l'agente ```sh git checkout 04-interface-llm uv run agent.py - ``` +``` Ecco il nuovo codice. ```python from openai import OpenAI -open_ai = OpenAI() # Il client legge la variabile d'ambiente OPENAI_API_KEY +open_ai = OpenAI() # Il client legge la variabile d'ambiente OPENAI_API_KEY ``` Importa e istanzia l'API di OpenAI. @@ -560,20 +558,20 @@ Chiama l'API di OpenAI (`open_ai.chat.completions.create`) per creare la rispost expected_price = Decimal(response.choices[0].message.content.strip()) current_price = wethusdc_quotes[-1].price -print ("Prezzo attuale:", wethusdc_quotes[-1].price) -print(f"In {future_time}, prezzo previsto: {expected_price} USD") +print ("Current price:", wethusdc_quotes[-1].price) +print(f"In {future_time}, expected price: {expected_price} USD") if (expected_price > current_price): - print(f"Compra, mi aspetto che il prezzo salga di {expected_price - current_price} USD") + print(f"Buy, I expect the price to go up by {expected_price - current_price} USD") else: - print(f"Vendi, mi aspetto che il prezzo scenda di {current_price - expected_price} USD") + print(f"Sell, I expect the price to go down by {current_price - expected_price} USD") ``` -Mostra il prezzo e fornisci una raccomandazione di acquisto o vendita. +Emetti il prezzo e fornisci una raccomandazione di acquisto o vendita. #### Testare le previsioni {#testing-the-predictions} -Ora che possiamo generare previsioni, possiamo anche utilizzare dati storici per valutare se produciamo previsioni utili. +Ora che possiamo generare previsioni, possiamo anche usare i dati storici per valutare se produciamo previsioni utili. ```sh uv run test-predictor.py @@ -582,27 +580,27 @@ uv run test-predictor.py Il risultato atteso è simile a: ``` -Previsione per 2026-01-05T19:50: previsto 3138.93 USD, reale 3218.92 USD, errore 79.99 USD -Previsione per 2026-01-06T19:56: previsto 3243.39 USD, reale 3221.08 USD, errore 22.31 USD -Previsione per 2026-01-07T20:02: previsto 3223.24 USD, reale 3146.89 USD, errore 76.35 USD -Previsione per 2026-01-08T20:11: previsto 3150.47 USD, reale 3092.04 USD, errore 58.43 USD +Prediction for 2026-01-05T19:50: predicted 3138.93 USD, real 3218.92 USD, error 79.99 USD +Prediction for 2026-01-06T19:56: predicted 3243.39 USD, real 3221.08 USD, error 22.31 USD +Prediction for 2026-01-07T20:02: predicted 3223.24 USD, real 3146.89 USD, error 76.35 USD +Prediction for 2026-01-08T20:11: predicted 3150.47 USD, real 3092.04 USD, error 58.43 USD . . . -Previsione per 2026-01-31T22:33: previsto 2637.73 USD, reale 2417.77 USD, errore 219.96 USD -Previsione per 2026-02-01T22:41: previsto 2381.70 USD, reale 2318.84 USD, errore 62.86 USD -Previsione per 2026-02-02T22:49: previsto 2234.91 USD, reale 2349.28 USD, errore 114.37 USD -Errore medio di previsione su 29 previsioni: 83.87103448275862068965517241 USD -Variazione media per raccomandazione: 4.787931034482758620689655172 USD -Varianza standard delle variazioni: 104.42 USD -Giorni redditizi: 51.72% -Giorni in perdita: 48.28% +Prediction for 2026-01-31T22:33: predicted 2637.73 USD, real 2417.77 USD, error 219.96 USD +Prediction for 2026-02-01T22:41: predicted 2381.70 USD, real 2318.84 USD, error 62.86 USD +Prediction for 2026-02-02T22:49: predicted 2234.91 USD, real 2349.28 USD, error 114.37 USD +Mean prediction error over 29 predictions: 83.87103448275862068965517241 USD +Mean change per recommendation: 4.787931034482758620689655172 USD +Standard variance of changes: 104.42 USD +Profitable days: 51.72% +Losing days: 48.28% ``` La maggior parte del tester è identica all'agente, ma ecco le parti nuove o modificate. ```python -CYCLES_FOR_TEST = 40 # Per il backtest, quanti cicli testiamo +CYCLES_FOR_TEST = 40 # Per il backtest, su quanti cicli effettuiamo il test # Ottieni molte quotazioni wethusdc_pool = read_pool(WETHUSDC_ADDRESS, True) @@ -622,31 +620,31 @@ wethwbtc_quotes = get_quotes( ) ``` -Guardiamo indietro di `CYCLES_FOR_TEST` (specificato come 40 qui) giorni. +Guardiamo indietro di `CYCLES_FOR_TEST` (specificato qui come 40) giorni. ```python -# Crea previsioni e confrontale con la cronologia reale +# Crea previsioni e verificale con lo storico reale total_error = Decimal(0) changes = [] ``` -Ci sono due tipi di errori che ci interessano. Il primo, `total_error`, è semplicemente la somma degli errori commessi dal predittore. +Ci sono due tipi di errori a cui siamo interessati. Il primo, `total_error`, è semplicemente la somma degli errori commessi dal predittore. -Per capire il secondo, `changes`, dobbiamo ricordare lo scopo dell'agente. Non è prevedere il rapporto WETH/USDC (prezzo di ETH). È emettere raccomandazioni di vendita e acquisto. Se il prezzo è attualmente di 2000 $ e prevede 2010 $ domani, non ci importa se il risultato effettivo è 2020 $ e guadagniamo soldi extra. Ma ci importa se ha previsto 2010 $, e ha comprato ETH sulla base di quella raccomandazione, e il prezzo scende a 1990 $. +Per capire il secondo, `changes`, dobbiamo ricordare lo scopo dell'agente. Non è prevedere il rapporto WETH/USDC (prezzo di ETH). È emettere raccomandazioni di vendita e acquisto. Se il prezzo è attualmente di 2000$ e prevede 2010$ per domani, non ci dispiace se il risultato effettivo è 2020$ e guadagniamo soldi extra. Ma ci _dispiace_ se ha previsto 2010$ e ha comprato ETH in base a quella raccomandazione, e il prezzo scende a 1990$. ```python for index in range(0,len(wethusdc_quotes)-CYCLES_BACK): ``` -Possiamo esaminare solo i casi in cui la cronologia completa (i valori utilizzati per la previsione e il valore del mondo reale con cui confrontarla) è disponibile. Ciò significa che il caso più recente deve essere quello iniziato `CYCLES_BACK` fa. +Possiamo esaminare solo i casi in cui è disponibile la cronologia completa (i valori utilizzati per la previsione e il valore reale con cui confrontarla). Ciò significa che il caso più recente deve essere quello iniziato `CYCLES_BACK` fa. ```python wethusdc_slice = wethusdc_quotes[index:index+CYCLES_BACK] wethwbtc_slice = wethwbtc_quotes[index:index+CYCLES_BACK] ``` -Usa le [slice](https://www.w3schools.com/python/ref_func_slice.asp) per ottenere lo stesso numero di campioni utilizzato dall'agente. Il codice tra qui e il segmento successivo è lo stesso codice per ottenere una previsione che abbiamo nell'agente. +Usa gli [slice](https://www.w3schools.com/python/ref_func_slice.asp) per ottenere lo stesso numero di campioni del numero utilizzato dall'agente. Il codice tra qui e il segmento successivo è lo stesso codice per ottenere una previsione che abbiamo nell'agente. ```python predicted_price = Decimal(response.choices[0].message.content.strip()) @@ -659,7 +657,7 @@ Ottieni il prezzo previsto, il prezzo reale e il prezzo al momento della previsi ```python error = abs(predicted_price - real_price) total_error += error - print (f"Previsione per {prediction_time}: previsto {predicted_price} USD, reale {real_price} USD, errore {error} USD") + print (f"Prediction for {prediction_time}: predicted {predicted_price} USD, real {real_price} USD, error {error} USD") ``` Calcola l'errore e aggiungilo al totale. @@ -670,30 +668,30 @@ Calcola l'errore e aggiungilo al totale. changes.append(price_increase if recomended_action == 'buy' else -price_increase) ``` -Per `changes`, vogliamo l'impatto monetario dell'acquisto o della vendita di un ETH. Quindi, prima dobbiamo determinare la raccomandazione, poi valutare come è cambiato il prezzo effettivo e se la raccomandazione ha prodotto un guadagno (variazione positiva) o una perdita (variazione negativa). +Per `changes`, vogliamo l'impatto monetario dell'acquisto o della vendita di un ETH. Quindi, per prima cosa, dobbiamo determinare la raccomandazione, quindi valutare come è cambiato il prezzo effettivo e se la raccomandazione ha fatto guadagnare (variazione positiva) o perdere denaro (variazione negativa). ```python -print (f"Errore medio di previsione su {len(wethusdc_quotes)-CYCLES_BACK} previsioni: {total_error / Decimal(len(wethusdc_quotes)-CYCLES_BACK)} USD") +print (f"Mean prediction error over {len(wethusdc_quotes)-CYCLES_BACK} predictions: {total_error / Decimal(len(wethusdc_quotes)-CYCLES_BACK)} USD") length_changes = Decimal(len(changes)) mean_change = sum(changes, Decimal(0)) / length_changes -print (f"Variazione media per raccomandazione: {mean_change} USD") +print (f"Mean change per recommendation: {mean_change} USD") var = sum((x - mean_change) ** 2 for x in changes) / length_changes -print (f"Varianza standard delle variazioni: {var.sqrt().quantize(Decimal("0.01"))} USD") +print (f"Standard variance of changes: {var.sqrt().quantize(Decimal("0.01"))} USD") ``` Riporta i risultati. ```python -print (f"Giorni redditizi: {len(list(filter(lambda x: x > 0, changes)))/length_changes:.2%}") -print (f"Giorni in perdita: {len(list(filter(lambda x: x < 0, changes)))/length_changes:.2%}") +print (f"Profitable days: {len(list(filter(lambda x: x > 0, changes)))/length_changes:.2%}") +print (f"Losing days: {len(list(filter(lambda x: x < 0, changes)))/length_changes:.2%}") ``` -Usa [`filter`](https://www.w3schools.com/python/ref_func_filter.asp) per contare il numero di giorni redditizi e il numero di giorni costosi. Il risultato è un oggetto filtro, che dobbiamo convertire in un elenco per ottenerne la lunghezza. +Usa [`filter`](https://www.w3schools.com/python/ref_func_filter.asp) per contare il numero di giorni redditizi e il numero di giorni in perdita. Il risultato è un oggetto filtro, che dobbiamo convertire in una lista per ottenerne la lunghezza. -### Invio di transazioni {#submit-txn} +### Inviare transazioni {#submit-txn} -Ora dobbiamo effettivamente inviare le transazioni. Tuttavia, non voglio spendere soldi veri a questo punto, prima che il sistema sia collaudato. Invece, creeremo una biforcazione locale della Rete Principale e faremo "trading" su quella rete. +Ora dobbiamo effettivamente inviare transazioni. Tuttavia, non voglio spendere soldi veri a questo punto, prima che il sistema sia collaudato. Invece, creeremo una biforcazione locale della rete principale e faremo "trading" su quella rete. Ecco i passaggi per creare una biforcazione locale e abilitare il trading. @@ -703,20 +701,20 @@ Ecco i passaggi per creare una biforcazione locale e abilitare il trading. ```sh anvil --fork-url https://eth.drpc.org --block-time 12 - ``` +``` - `anvil` è in ascolto sull'URL predefinito per Foundry, http://localhost:8545, quindi non è necessario specificare l'URL per [il comando `cast`](https://getfoundry.sh/cast/overview) che usiamo per manipolare la blockchain. + `anvil` è in ascolto sull'URL predefinito per Foundry, http://localhost:8545, quindi non abbiamo bisogno di specificare l'URL per [il comando `cast`](https://getfoundry.sh/cast/overview) che usiamo per manipolare la blockchain. -3. Quando si esegue in `anvil`, ci sono dieci conti di prova che hanno ETH: imposta le variabili d'ambiente per il primo +3. Quando si esegue in `anvil`, ci sono dieci account di test che hanno ETH: imposta le variabili d'ambiente per il primo ```sh PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 ADDRESS=`cast wallet address $PRIVATE_KEY` - ``` +``` -4. Questi sono i contratti che dobbiamo usare. [`SwapRouter`](https://github.com/Uniswap/v3-periphery/blob/main/contracts/SwapRouter.sol) è il contratto di Uniswap v3 che usiamo per fare trading. Potremmo fare trading direttamente attraverso il gruppo, ma questo è molto più facile. +4. Questi sono i contratti che dobbiamo usare. [`SwapRouter`](https://github.com/Uniswap/v3-periphery/blob/main/contracts/SwapRouter.sol) è il contratto Uniswap v3 che usiamo per fare effettivamente trading. Potremmo fare trading direttamente tramite la pool, ma questo è molto più semplice. - Le due variabili in basso sono i percorsi di Uniswap v3 necessari per scambiare tra WETH e USDC. + Le due variabili in basso sono i percorsi di Uniswap v3 necessari per lo scambio tra WETH e USDC. ```sh WETH_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 @@ -725,13 +723,13 @@ Ecco i passaggi per creare una biforcazione locale e abilitare il trading. SWAP_ROUTER=0xE592427A0AEce92De3Edee1F18E0157C05861564 WETH_TO_USDC=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc20001F4A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 USDC_TO_WETH=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480001F4C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 - ``` +``` -5. Ognuno dei conti di prova ha 10.000 ETH. Usa il contratto WETH per wrappare 1000 ETH per ottenere 1000 WETH per il trading. +5. Ciascuno degli account di test ha 10.000 ETH. Usa il contratto WETH per avvolgere 1000 ETH per ottenere 1000 WETH per il trading. ```sh cast send $WETH_ADDRESS "deposit()" --value 1000ether --private-key $PRIVATE_KEY - ``` +``` 6. Usa `SwapRouter` per scambiare 500 WETH con USDC. @@ -742,16 +740,16 @@ Ecco i passaggi per creare una biforcazione locale e abilitare il trading. "exactInput((bytes,address,uint256,uint256,uint256))" \ "($WETH_TO_USDC,$ADDRESS,$MAXINT,500ether,1000000)" \ --private-key $PRIVATE_KEY - ``` +``` - La chiamata `approve` crea un'autorizzazione che consente a `SwapRouter` di spendere alcuni dei nostri token. I contratti non possono monitorare gli eventi, quindi se trasferiamo i token direttamente al contratto `SwapRouter`, questo non saprebbe di essere stato pagato. Invece, permettiamo al contratto `SwapRouter` di spendere un certo importo, e poi `SwapRouter` lo fa. Questo viene fatto tramite una funzione chiamata da `SwapRouter`, quindi sa se ha avuto successo. + La chiamata `approve` crea un'indennità (allowance) che consente a `SwapRouter` di spendere alcuni dei nostri token. I contratti non possono monitorare gli eventi, quindi se trasferissimo i token direttamente al contratto `SwapRouter`, non saprebbe di essere stato pagato. Invece, permettiamo al contratto `SwapRouter` di spendere un certo importo, e poi `SwapRouter` lo fa. Questo viene fatto tramite una funzione chiamata da `SwapRouter`, in modo che sappia se ha avuto successo. 7. Verifica di avere abbastanza di entrambi i token. ```sh cast call $WETH_ADDRESS "balanceOf(address)" $ADDRESS | cast from-wei echo `cast call $USDC_ADDRESS "balanceOf(address)" $ADDRESS | cast to-dec`/10^6 | bc - ``` +``` Ora che abbiamo WETH e USDC, possiamo effettivamente eseguire l'agente. @@ -764,26 +762,26 @@ L'output sarà simile a: ``` (ai-trading-agent) qbzzt@Ori-Cloudnomics:~/260215-ai-agent$ uv run agent.py -Prezzo attuale: 1843.16 -In 2026-02-06T23:07, prezzo previsto: 1724.41 USD -Saldi del conto prima dello scambio: -Saldo USDC: 927301.578272 -Saldo WETH: 500 -Vendi, mi aspetto che il prezzo scenda di 118.75 USD -Transazione di approvazione inviata: 74e367ddbb407c1aaf567d87aa5863049991b1d2aa092b6b85195d925e2bd41f -Transazione di approvazione minata. -Transazione di vendita inviata: fad1bcf938585c9e90364b26ac7a80eea9efd34c37e5db81e58d7655bcae28bf -Transazione di vendita minata. -Saldi del conto dopo lo scambio: -Saldo USDC: 929143.797116 -Saldo WETH: 499 +Current price: 1843.16 +In 2026-02-06T23:07, expected price: 1724.41 USD +Account balances before trade: +USDC Balance: 927301.578272 +WETH Balance: 500 +Sell, I expect the price to go down by 118.75 USD +Approve transaction sent: 74e367ddbb407c1aaf567d87aa5863049991b1d2aa092b6b85195d925e2bd41f +Approve transaction mined. +Sell transaction sent: fad1bcf938585c9e90364b26ac7a80eea9efd34c37e5db81e58d7655bcae28bf +Sell transaction mined. +Account balances after trade: +USDC Balance: 929143.797116 +WETH Balance: 499 ``` Per usarlo effettivamente, hai bisogno di alcune piccole modifiche. -- Nella riga 14, cambia `MAINNET_URL` in un punto di accesso reale, come `https://eth.drpc.org` -- Nella riga 28, cambia `PRIVATE_KEY` con la tua chiave privata -- A meno che tu non sia molto ricco e possa comprare o vendere 1 ETH ogni giorno per un agente non provato, potresti voler cambiare la riga 29 per diminuire `WETH_TRADE_AMOUNT` +- Alla riga 14, cambia `MAINNET_URL` in un vero punto di accesso, come `https://eth.drpc.org` +- Alla riga 28, cambia `PRIVATE_KEY` con la tua chiave privata +- A meno che tu non sia molto ricco e possa comprare o vendere 1 ETH ogni giorno per un agente non collaudato, potresti voler cambiare la riga 29 per diminuire `WETH_TRADE_AMOUNT` #### Spiegazione del codice {#trading-code} @@ -821,7 +819,7 @@ SWAP_ROUTER_ABI = [ ] ``` -Nell'ABI di `SwapRouter` abbiamo solo bisogno di `exactInput`. Esiste una funzione correlata, `exactOutput`, che potremmo usare per comprare esattamente un WETH, ma per semplicità usiamo solo `exactInput` in entrambi i casi. +Nell'ABI di `SwapRouter` abbiamo solo bisogno di `exactInput`. C'è una funzione correlata, `exactOutput`, che potremmo usare per comprare esattamente un WETH, ma per semplicità usiamo solo `exactInput` in entrambi i casi. ```python account = w3.eth.account.from_key(PRIVATE_KEY) @@ -831,7 +829,7 @@ swap_router = w3.eth.contract( ) ``` -Le definizioni Web3 per il [`conto`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html) e il contratto `SwapRouter`. +Le definizioni Web3 per l'[`account`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html) e il contratto `SwapRouter`. ```python def txn_params() -> dict: @@ -843,13 +841,13 @@ def txn_params() -> dict: } ``` -I parametri della transazione. Abbiamo bisogno di una funzione qui perché [il nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce) deve cambiare ogni volta. +I parametri della transazione. Abbiamo bisogno di una funzione qui perché [il nonce](https://it.wikipedia.org/wiki/Nonce) deve cambiare ogni volta. ```python def approve_token(contract: Contract, amount: int): ``` -Approva un'autorizzazione di token per `SwapRouter`. +Approva un'indennità di token per `SwapRouter`. ```python txn = contract.functions.approve(SWAP_ROUTER_ADDRESS, amount).build_transaction(txn_params()) @@ -857,15 +855,15 @@ Approva un'autorizzazione di token per `SwapRouter`. tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction) ``` -Questo è il modo in cui inviamo una transazione in Web3. Per prima cosa usiamo [l'oggetto `Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) per costruire la transazione. Poi usiamo [`web3.eth.account.sign_transaction`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-contract-transaction) per firmare la transazione, usando `PRIVATE_KEY`. Infine, usiamo [`w3.eth.send_raw_transaction`](https://web3py.readthedocs.io/en/stable/transactions.html#chapter-2-w3-eth-send-raw-transaction) per inviare la transazione. +Questo è il modo in cui inviamo una transazione in Web3. Per prima cosa usiamo [l'oggetto `Contract`](https://web3py.readthedocs.io/en/stable/web3.contract.html) per costruire la transazione. Quindi usiamo [`web3.eth.account.sign_transaction`](https://web3py.readthedocs.io/en/stable/web3.eth.account.html#sign-a-contract-transaction) per firmare la transazione, usando `PRIVATE_KEY`. Infine, usiamo [`w3.eth.send_raw_transaction`](https://web3py.readthedocs.io/en/stable/transactions.html#chapter-2-w3-eth-send-raw-transaction) per inviare la transazione. ```python - print(f"Transazione di approvazione inviata: {tx_hash.hex()}") + print(f"Approve transaction sent: {tx_hash.hex()}") w3.eth.wait_for_transaction_receipt(tx_hash) - print("Transazione di approvazione minata.") + print("Approve transaction mined.") ``` -[`w3.eth.wait_for_transaction_receipt`](https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.wait_for_transaction_receipt) attende che la transazione venga minata. Restituisce la ricevuta, se necessario. +[`w3.eth.wait_for_transaction_receipt`](https://web3py.readthedocs.io/en/stable/web3.eth.html#web3.eth.Eth.wait_for_transaction_receipt) attende fino a quando la transazione non viene minata. Restituisce la ricevuta se necessario. ```python SELL_PARAMS = { @@ -877,7 +875,7 @@ SELL_PARAMS = { } ``` -Questi sono i parametri per la vendita di WETH. +Questi sono i parametri quando si vende WETH. ```python def make_buy_params(quote: Quote) -> dict: @@ -890,7 +888,7 @@ def make_buy_params(quote: Quote) -> dict: } ``` -A differenza di `SELL_PARAMS`, i parametri di acquisto possono cambiare. L'importo in entrata è il costo di 1 WETH, come disponibile in `quote`. +A differenza di `SELL_PARAMS`, i parametri di acquisto possono cambiare. L'importo di input è il costo di 1 WETH, come disponibile in `quote`. ```python def buy(quote: Quote): @@ -899,9 +897,9 @@ def buy(quote: Quote): txn = swap_router.functions.exactInput(buy_params).build_transaction(txn_params()) signed_txn = w3.eth.account.sign_transaction(txn, private_key=PRIVATE_KEY) tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction) - print(f"Transazione di acquisto inviata: {tx_hash.hex()}") + print(f"Buy transaction sent: {tx_hash.hex()}") w3.eth.wait_for_transaction_receipt(tx_hash) - print("Transazione di acquisto minata.") + print("Buy transaction mined.") def sell(): @@ -910,36 +908,36 @@ def sell(): txn = swap_router.functions.exactInput(SELL_PARAMS).build_transaction(txn_params()) signed_txn = w3.eth.account.sign_transaction(txn, private_key=PRIVATE_KEY) tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction) - print(f"Transazione di vendita inviata: {tx_hash.hex()}") + print(f"Sell transaction sent: {tx_hash.hex()}") w3.eth.wait_for_transaction_receipt(tx_hash) - print("Transazione di vendita minata.") + print("Sell transaction mined.") ``` -Le funzioni `buy()` e `sell()` sono quasi identiche. Per prima cosa approviamo un'autorizzazione sufficiente per `SwapRouter`, e poi lo chiamiamo con il percorso e l'importo corretti. +Le funzioni `buy()` e `sell()` sono quasi identiche. Per prima cosa approviamo un'indennità sufficiente per `SwapRouter`, e poi lo chiamiamo con il percorso e l'importo corretti. ```python def balances(): token0_balance = wethusdc_pool.token0.contract.functions.balanceOf(account.address).call() token1_balance = wethusdc_pool.token1.contract.functions.balanceOf(account.address).call() - print(f"{wethusdc_pool.token0.symbol} Saldo: {Decimal(token0_balance) / Decimal(10 ** wethusdc_pool.token0.decimals)}") - print(f"{wethusdc_pool.token1.symbol} Saldo: {Decimal(token1_balance) / Decimal(10 ** wethusdc_pool.token1.decimals)}") + print(f"{wethusdc_pool.token0.symbol} Balance: {Decimal(token0_balance) / Decimal(10 ** wethusdc_pool.token0.decimals)}") + print(f"{wethusdc_pool.token1.symbol} Balance: {Decimal(token1_balance) / Decimal(10 ** wethusdc_pool.token1.decimals)}") ``` Riporta i saldi dell'utente in entrambe le valute. ```python -print("Saldi del conto prima dello scambio:") +print("Account balances before trade:") balances() if (expected_price > current_price): - print(f"Compra, mi aspetto che il prezzo salga di {expected_price - current_price} USD") + print(f"Buy, I expect the price to go up by {expected_price - current_price} USD") buy(wethusdc_quotes[-1]) else: - print(f"Vendi, mi aspetto che il prezzo scenda di {current_price - expected_price} USD") + print(f"Sell, I expect the price to go down by {current_price - expected_price} USD") sell() -print("Saldi del conto dopo lo scambio:") +print("Account balances after trade:") balances() ``` @@ -953,28 +951,28 @@ Questa non è una versione di produzione completa; è semplicemente un esempio p Ci sono due fatti importanti che l'agente ignora quando decide cosa fare. -- _L'entità del cambiamento previsto_. L'agente vende una quantità fissa di `WETH` se si prevede che il prezzo diminuisca, indipendentemente dall'entità del calo. - Probabilmente, sarebbe meglio ignorare le piccole variazioni e vendere in base a quanto ci aspettiamo che il prezzo diminuisca. -- _Il portafoglio attuale_. Se il 10% del tuo portafoglio è in WETH e pensi che il prezzo salirà, probabilmente ha senso acquistarne di più. Ma se il 90% del tuo portafoglio è in WETH, potresti essere sufficientemente esposto e non c'è bisogno di acquistarne di più. Il contrario è vero se ti aspetti che il prezzo scenda. +- _L'entità del cambiamento previsto_. L'agente vende un importo fisso di `WETH` se si prevede che il prezzo diminuirà, indipendentemente dall'entità del calo. + Probabilmente, sarebbe meglio ignorare i cambiamenti minori e vendere in base a quanto ci aspettiamo che il prezzo diminuisca. +- _Il portafoglio attuale_. Se il 10% del tuo portafoglio è in WETH e pensi che il prezzo salirà, probabilmente ha senso comprarne di più. Ma se il 90% del tuo portafoglio è in WETH, potresti essere sufficientemente esposto e non c'è bisogno di comprarne di più. Il contrario è vero se ti aspetti che il prezzo scenda. ### E se volessi mantenere segreta la tua strategia di trading? {#secret} -I fornitori di IA possono vedere le query che invii ai loro LLM, il che potrebbe esporre il geniale sistema di trading che hai sviluppato con il tuo agente. Un sistema di trading che troppe persone usano è inutile perché troppe persone cercano di comprare quando vuoi comprare tu (e il prezzo sale) e cercano di vendere quando vuoi vendere tu (e il prezzo scende). +I fornitori di IA possono vedere le query che invii ai loro LLM, il che potrebbe esporre il geniale sistema di trading che hai sviluppato con il tuo agente. Un sistema di trading che troppe persone usano è inutile perché troppe persone cercano di comprare quando tu vuoi comprare (e il prezzo sale) e cercano di vendere quando tu vuoi vendere (e il prezzo scende). -Puoi eseguire un LLM localmente, ad esempio, utilizzando [LM-Studio](https://lmstudio.ai/), per evitare questo problema. +Puoi eseguire un LLM localmente, ad esempio, usando [LM-Studio](https://lmstudio.ai/), per evitare questo problema. ### Da bot IA ad agente IA {#bot-to-agent} -Si può sostenere validamente che questo è [un bot IA, non un agente IA](/ai-agents/#ai-agents-vs-ai-bots). Implementa una strategia relativamente semplice che si basa su informazioni predefinite. Possiamo abilitare l'auto-miglioramento, ad esempio, fornendo un elenco di gruppi di Uniswap v3 e i loro ultimi valori e chiedendo quale combinazione ha il miglior valore predittivo. +Si può sostenere a ragione che questo sia [un bot IA, non un agente IA](/ai-agents/#ai-agents-vs-ai-bots). Implementa una strategia relativamente semplice che si basa su informazioni predefinite. Possiamo abilitare l'auto-miglioramento, ad esempio, fornendo un elenco di pool Uniswap v3 e i loro ultimi valori e chiedendo quale combinazione abbia il miglior valore predittivo. ### Protezione dallo slippage {#slippage-protection} -Attualmente non c'è [protezione dallo slippage](https://uniswapv3book.com/milestone_3/slippage-protection.html). Se la quotazione attuale è di 2000 $ e il prezzo previsto è di 2100 $, l'agente comprerà. Tuttavia, se prima che l'agente acquisti il costo sale a 2200 $, non ha più senso comprare. +Attualmente non c'è [protezione dallo slippage](https://uniswapv3book.com/milestone_3/slippage-protection.html). Se la quotazione attuale è di 2000$ e il prezzo previsto è di 2100$, l'agente comprerà. Tuttavia, se prima che l'agente compri il costo sale a 2200$, non ha più senso comprare. Per implementare la protezione dallo slippage, specifica un valore `amountOutMinimum` nelle righe 325 e 334 di [`agent.py`](https://github.com/qbzzt/260215-ai-agent/blob/05-trade/agent.py#L325). ## Conclusione {#conclusion} -Speriamo che ora tu sappia abbastanza per iniziare con gli agenti IA. Questa non è una panoramica completa dell'argomento; ci sono interi libri dedicati a questo, ma questo è sufficiente per iniziare. Buona fortuna! +Speriamo che ora tu ne sappia abbastanza per iniziare con gli agenti IA. Questa non è una panoramica completa dell'argomento; ci sono interi libri dedicati a questo, ma è sufficiente per iniziare. Buona fortuna! -[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/it/developers/tutorials/all-you-can-cache/index.md index f754fba4728..560a6b96e20 100644 --- a/public/content/translations/it/developers/tutorials/all-you-can-cache/index.md +++ b/public/content/translations/it/developers/tutorials/all-you-can-cache/index.md @@ -1,43 +1,40 @@ --- -title: "Salva nella cache quanto vuoi" -description: Scopri come creare e utilizzare un contratto di memorizzazione nella cache per transazioni rollup più economiche +title: "Tutto ciò che puoi mettere in cache" +description: "Impara a creare e utilizzare un contratto di caching per transazioni di rollup più economiche" author: Ori Pomerantz -tags: - - "livello 2" - - "memorizzazione nella cache" - - "archiviazione" +tags: ["livello 2", "caching", "archiviazione", "scalabilità"] skill: intermediate -breadcrumb: "Cache per rollup" +breadcrumb: Caching per i rollup published: 2022-09-15 lang: it --- -Utilizzando i rollup, il costo di un byte nella transazione è molto maggiore di quello di uno spazio d'archiviazione. Dunque, ha senso salvare nella cache quante più informazioni possibili sulla catena. +Quando si utilizzano i rollup, il costo di un byte nella transazione è molto più costoso del costo di uno slot di archiviazione. Pertanto, ha senso memorizzare nella cache quante più informazioni possibili on-chain. -In questo articolo imparerai come creare e utilizzare un contratto di memorizzazione nella cache, in modo tale che il valore di ogni parametro che è probabile sia utilizzato più volte sarà salvato nella cache e disponibile all'uso (dopo la prima volta), con un numero di byte molto inferiore, e come scrivere il codice fuori catena che utilizza tale cache. +In questo articolo imparerai come creare e utilizzare un contratto di caching in modo tale che qualsiasi valore di parametro che probabilmente verrà utilizzato più volte venga memorizzato nella cache e reso disponibile per l'uso (dopo la prima volta) con un numero molto inferiore di byte, e come scrivere codice fuori catena che utilizzi questa cache. -Se desideri saltare l'articolo e visualizzare soltanto il codice sorgente, [lo trovi qui](https://github.com/qbzzt/20220915-all-you-can-cache). Lo stack di sviluppo è [Foundry](https://book.getfoundry.sh/getting-started/installation). +Se vuoi saltare l'articolo e vedere solo il codice sorgente, [è qui](https://github.com/qbzzt/20220915-all-you-can-cache). Lo stack di sviluppo è [Foundry](https://getfoundry.sh/introduction/installation/). ## Design generale {#overall-design} -Per semplicità supponiamo che tutti i parametri delle transazioni siano `uint256`, lunghi 32 byte. Quando riceviamo una transazione, analizziamo ogni parametro come segue: +Per semplicità, supporremo che tutti i parametri della transazione siano `uint256`, lunghi 32 byte. Quando riceviamo una transazione, analizzeremo ogni parametro in questo modo: -1. Se il primo byte è `0xFF`, prendi i successivi 32 byte come valore di parametro e scrivilo nella cache. +1. Se il primo byte è `0xFF`, prendi i successivi 32 byte come valore del parametro e scrivilo nella cache. -2. Se il primo byte è `0xFE`, prendi i successivi 32 byte come valore del parametro e _non_ scriverli nella cache. +2. Se il primo byte è `0xFE`, prendi i successivi 32 byte come valore del parametro ma _non_ scriverlo nella cache. -3. Per qualsiasi altro valore, prendi i primi quattro bit come numero di byte aggiuntivi e gli ultimi quattro come i bit più significativi della chiave di cache. Ecco alcuni esempi: +3. Per qualsiasi altro valore, prendi i primi quattro bit come numero di byte aggiuntivi e gli ultimi quattro bit come bit più significativi della chiave della cache. Ecco alcuni esempi: - | Byte nei calldata | Chiave della cache | - |:----------------- | ------------------:| - | 0x0F | 0x0F | - | 0x10,0x10 | 0x10 | - | 0x12,0xAC | 0x02AC | - | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + | Byte in calldata | Chiave della cache | + | :---------------- | --------: | + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | ## Manipolazione della cache {#cache-manipulation} -La cache è implementata in [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol). Analizziamolo riga per riga. +La cache è implementata in [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol). Esaminiamola riga per riga. ```solidity // SPDX-License-Identifier: UNLICENSED @@ -50,81 +47,81 @@ contract Cache { bytes1 public constant DONT_CACHE = 0xFE; ``` -Queste costanti sono utilizzate per interpretare i casi speciali in cui forniamo tutte le informazioni e se desideriamo scriverle o no nella cache. Scrivere nella cache richiede due operazioni [`SSTORE`](https://www.evm.codes/#55) negli spazi d'archiviazione precedentemente inutilizzati, al costo di 22100 gas l'uno, quindi lo rendiamo facoltativo. +Queste costanti sono utilizzate per interpretare i casi speciali in cui forniamo tutte le informazioni e vogliamo che vengano scritte nella cache o meno. Scrivere nella cache richiede due operazioni [`SSTORE`](https://www.evm.codes/#55) in slot di archiviazione precedentemente inutilizzati a un costo di 22100 gas ciascuna, quindi lo rendiamo opzionale. ```solidity mapping(uint => uint) public val2key; ``` -Una [mappatura](https://www.geeksforgeeks.org/solidity-mappings/) tra i valori e le loro chiavi. Queste informazioni sono necessarie per codificare i valori prima di inviare la transazione. +Una [mappatura](https://www.geeksforgeeks.org/solidity/solidity-mappings/) tra i valori e le loro chiavi. Questa informazione è necessaria per codificare i valori prima di inviare la transazione. ```solidity - // Location n has the value for key n+1, because we need to preserve - // zero as "not in the cache". + // La posizione n ha il valore per la chiave n+1, perché dobbiamo preservare + // lo zero come "non nella cache". uint[] public key2val; ``` -Possiamo utilizzare un insieme per la mappatura dalle chiavi ai valori, perché assegniamo le chiavi e, per semplicità, lo facciamo sequenzialmente. +Possiamo usare un array per la mappatura dalle chiavi ai valori perché assegniamo noi le chiavi e, per semplicità, lo facciamo in modo sequenziale. ```solidity function cacheRead(uint _key) public view returns (uint) { require(_key <= key2val.length, "Reading uninitialize cache entry"); return key2val[_key-1]; - } // cacheRead + } // cacheRead ``` Legge un valore dalla cache. ```solidity - // Write a value to the cache if it's not there already - // Only public to enable the test to work + // Scrive un valore nella cache se non è già presente + // Pubblico solo per permettere al test di funzionare function cacheWrite(uint _value) public returns (uint) { - // If the value is already in the cache, return the current key + // Se il valore è già nella cache, restituisce la chiave corrente if (val2key[_value] != 0) { return val2key[_value]; } ``` -Non ha senso mettere lo stesso valore nella cache più di una volta. Se il valore è già presente, basta restituire la chiave esistente. +Non ha senso inserire lo stesso valore nella cache più di una volta. Se il valore è già presente, restituisce semplicemente la chiave esistente. ```solidity - // Since 0xFE is a special case, the largest key the cache can - // hold is 0x0D followed by 15 0xFF's. If the cache length is already that - // large, fail. - // 1 2 3 4 5 6 7 8 9 A B C D E F + // Poiché 0xFE è un caso speciale, la chiave più grande che la cache può + // contenere è 0x0D seguito da 15 0xFF. Se la lunghezza della cache è già così + // grande, fallisce. + // 1 2 3 4 5 6 7 8 9 A B C D E F require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "cache overflow"); ``` -Non penso che otterremo mai una cache così grande (approssimativamente 1,8\*1037 voci, che richiederebbero circa 1027 TB per l'archiviazione). Tuttavia, sono abbastanza anziano da ricordare che ["640 kB saranno sempre sufficienti"](https://quoteinvestigator.com/2011/09/08/640k-enough/). Questo test è molto economico. +Non credo che avremo mai una cache così grande (circa 1.8\*1037 voci, che richiederebbero circa 1027 TB per l'archiviazione). Tuttavia, sono abbastanza vecchio da ricordare che ["640kB sarebbero sempre stati sufficienti"](https://quoteinvestigator.com/2011/09/08/640k-enough/). Questo test è molto economico. ```solidity - // Write the value using the next key + // Scrive il valore usando la chiave successiva val2key[_value] = key2val.length+1; ``` -Aggiungi la ricerca inversa (dal valore alla chiave). +Aggiunge la ricerca inversa (dal valore alla chiave). ```solidity key2val.push(_value); ``` -Aggiungi la ricerca inversa (dalla chiave al valore). Poiché assegniamo i valori sequenzialmente, possiamo semplicemente aggiungerli dopo il valore dell'ultimo insieme. +Aggiunge la ricerca in avanti (dalla chiave al valore). Poiché assegniamo i valori in modo sequenziale, possiamo semplicemente aggiungerlo dopo l'ultimo valore dell'array. ```solidity return key2val.length; - } // cacheWrite + } // cacheWrite ``` -Restituisce la nuova lunghezza di `key2val`, la cella in cui è memorizzato il nuovo valore. +Restituisce la nuova lunghezza di `key2val`, che è la cella in cui è memorizzato il nuovo valore. ```solidity function _calldataVal(uint startByte, uint length) private pure returns (uint) ``` -Questa funzione legge un valore dai calldata di lunghezza arbitraria (fino a 32 byte, le dimensioni delle parole). +Questa funzione legge un valore dal calldata di lunghezza arbitraria (fino a 32 byte, la dimensione della parola). ```solidity { @@ -136,7 +133,7 @@ Questa funzione legge un valore dai calldata di lunghezza arbitraria (fino a 32 "_calldataVal trying to read beyond calldatasize"); ``` -Questa funzione è interna, quindi se il resto del codice è scritto correttamente, questi test non sono necessari. Tuttavia, non costano molto, quindi potremmo anche averli. +Questa funzione è interna, quindi se il resto del codice è scritto correttamente questi test non sono necessari. Tuttavia, non costano molto, quindi tanto vale averli. ```solidity assembly { @@ -144,7 +141,7 @@ Questa funzione è interna, quindi se il resto del codice è scritto correttamen } ``` -Questo codice è in [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Legge un valore di 32 byte dai calldata. Ciò funziona anche se i calldata si fermano prima di `startByte+32`, poiché lo spazio non inizializzato nell'EVM è considerato pari a zero. +Questo codice è in [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Legge un valore di 32 byte dal calldata. Questo funziona anche se il calldata si ferma prima di `startByte+32` perché lo spazio non inizializzato nell'EVM è considerato pari a zero. ```solidity _retVal = _retVal >> (256-length*8); @@ -157,43 +154,43 @@ Non vogliamo necessariamente un valore di 32 byte. Questo elimina i byte in ecce } // _calldataVal - // Read a single parameter from the calldata, starting at _fromByte + // Legge un singolo parametro dalla calldata, partendo da _fromByte function _readParam(uint _fromByte) internal returns (uint _nextByte, uint _parameterValue) { ``` -Legge un singolo parametro dai calldata. Nota che dobbiamo restituire non soltanto il valore che leggiamo, ma anche la posizione di quello successivo, poiché i parametri possono andare da una lunghezza di 1 byte a 33 byte. +Legge un singolo parametro dal calldata. Nota che dobbiamo restituire non solo il valore che abbiamo letto, ma anche la posizione del byte successivo perché i parametri possono variare da 1 byte a 33 byte di lunghezza. ```solidity - // The first byte tells us how to interpret the rest + // Il primo byte ci dice come interpretare il resto uint8 _firstByte; _firstByte = uint8(_calldataVal(_fromByte, 1)); ``` -Solidity prova a ridurre il numero di bug vietando le [conversioni di tipo implicito](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) potenzialmente pericolose. Un downgrade, ad esempio da 256 bit a 8 bit, dev'essere esplicito. +Solidity cerca di ridurre il numero di bug vietando [conversioni di tipo implicite](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) potenzialmente pericolose. Un declassamento, ad esempio da 256 bit a 8 bit, deve essere esplicito. ```solidity - // Read the value, but do not write it to the cache + // Legge il valore, ma non lo scrive nella cache if (_firstByte == uint8(DONT_CACHE)) return(_fromByte+33, _calldataVal(_fromByte+1, 32)); - // Read the value, and write it to the cache + // Legge il valore e lo scrive nella cache if (_firstByte == uint8(INTO_CACHE)) { uint _param = _calldataVal(_fromByte+1, 32); cacheWrite(_param); return(_fromByte+33, _param); } - // If we got here it means that we need to read from the cache + // Se siamo arrivati qui significa che dobbiamo leggere dalla cache - // Number of extra bytes to read + // Numero di byte extra da leggere uint8 _extraBytes = _firstByte / 16; ``` -Prendi un [nibble](https://en.wikipedia.org/wiki/Nibble) inferiore e combinalo con altri byte per leggere il valore dalla cache. +Prende il [nibble](https://en.wikipedia.org/wiki/Nibble) inferiore e lo combina con gli altri byte per leggere il valore dalla cache. ```solidity uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + @@ -201,20 +198,20 @@ Prendi un [nibble](https://en.wikipedia.org/wiki/Nibble) inferiore e combinalo c return (_fromByte+_extraBytes+1, cacheRead(_key)); - } // _readParam + } // _readParam - // Read n parameters (functions know how many parameters they expect) + // Legge n parametri (le funzioni sanno quanti parametri si aspettano) function _readParams(uint _paramNum) internal returns (uint[] memory) { ``` -Potremmo ottenere il numero di parametri dagli stessi calldata, ma le funzioni che ci chiamano sanno quanti parametri sono previsti. È più facile lasciarcelo dire. +Potremmo ottenere il numero di parametri che abbiamo dal calldata stesso, ma le funzioni che ci chiamano sanno quanti parametri si aspettano. È più facile lasciare che ce lo dicano loro. ```solidity - // The parameters we read + // I parametri che leggiamo uint[] memory params = new uint[](_paramNum); - // Parameters start at byte 4, before that it's the function signature + // I parametri iniziano al byte 4, prima c'è la firma della funzione uint _atByte = 4; for(uint i=0; i<_paramNum; i++) { @@ -222,62 +219,62 @@ Potremmo ottenere il numero di parametri dagli stessi calldata, ma le funzioni c } ``` -Leggi i parametri finché non ottieni il numero desiderato. Se andiamo oltre la fine dei calldata, `_readParams` ripristinerà la chiamata. +Legge i parametri finché non hai il numero di cui hai bisogno. Se andiamo oltre la fine del calldata, `_readParams` annullerà la chiamata. ```solidity return(params); - } // readParams + } // readParams - // For testing _readParams, test reading four parameters + // Per testare _readParams, testa la lettura di quattro parametri function fourParam() public returns (uint256,uint256,uint256,uint256) { uint[] memory params; params = _readParams(4); return (params[0], params[1], params[2], params[3]); - } // fourParam + } // fourParam ``` -Un grande vantaggio di Foundry è che consente la scrittura dei test in Solidity ([vedi Testare la cache di seguito](#testing-the-cache)). Questo semplifica molto i test unitari. Questa è una funzione che legge quattro parametri e li restituisce in modo che il test possa verificare che siano corretti. +Un grande vantaggio di Foundry è che consente di scrivere test in Solidity ([vedi Testare la cache di seguito](#testing-the-cache)). Questo rende i test unitari molto più semplici. Questa è una funzione che legge quattro parametri e li restituisce in modo che il test possa verificare che fossero corretti. ```solidity - // Get a value, return bytes that will encode it (using the cache if possible) + // Ottiene un valore, restituisce i byte che lo codificheranno (usando la cache se possibile) function encodeVal(uint _val) public view returns(bytes memory) { ``` -`encodeVal` è una funzione che il codice fuori catena chiama per aiutare a creare calldata che utilizzano la cache. Riceve un singolo valore e restituisce i byte che lo codificano. Questa funzione è una `view`, quindi non richiede una transazione e quando chiamata esternamente non costa alcun gas. +`encodeVal` è una funzione che il codice fuori catena chiama per aiutare a creare calldata che utilizza la cache. Riceve un singolo valore e restituisce i byte che lo codificano. Questa funzione è una `view`, quindi non richiede una transazione e quando chiamata esternamente non costa alcun gas. ```solidity uint _key = val2key[_val]; - // The value isn't in the cache yet, add it + // Il valore non è ancora nella cache, lo aggiunge if (_key == 0) return bytes.concat(INTO_CACHE, bytes32(_val)); ``` -Nell'[EVM](/developers/docs/evm/) si presume che tutta l'archiviazione non inizializzata contenga zeri. Quindi se cerchiamo la chiave per un valore assente, otteniaamo uno zero. In quel caso i byte che la codificano sono `INTO_CACHE` (quindi sarà salvato nella cache la prossima volta), seguiti dal valore effettivo. +Nell'[EVM](/developers/docs/evm/) (macchina virtuale di Ethereum) tutta l'archiviazione non inizializzata si presume sia composta da zeri. Quindi, se cerchiamo la chiave per un valore che non c'è, otteniamo uno zero. In tal caso i byte che lo codificano sono `INTO_CACHE` (in modo che venga memorizzato nella cache la prossima volta), seguiti dal valore effettivo. ```solidity - // If the key is <0x10, return it as a single byte + // Se la chiave è <0x10, la restituisce come singolo byte if (_key < 0x10) return bytes.concat(bytes1(uint8(_key))); ``` -I byte singoli sono i più facili. Semplicemente, utilizziamo [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) per trasformare un tipo `bytes` in un insieme di byte di qualsiasi lunghezza. Nonostante il nome, funziona bene quando fornito con un solo argomento. +I byte singoli sono i più facili. Usiamo semplicemente [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) per trasformare un tipo `bytes` in un array di byte che può essere di qualsiasi lunghezza. Nonostante il nome, funziona bene quando viene fornito con un solo argomento. ```solidity - // Two byte value, encoded as 0x1vvv + // Valore a due byte, codificato come 0x1vvv if (_key < 0x1000) return bytes.concat(bytes2(uint16(_key) | 0x1000)); ``` -Quando abbiamo una chiave inferiore a 163, possiamo esprimerla in due byte. Prima convertiamo `_key`, un valore da 256 bit, in un valore da 16 bit, quindi utilizziamo il logical o aggiungiamo il numero di byte aggiuntivi al primo byte. Quindi abbiamo un valore `bytes2` convertibile in `bytes`. +Quando abbiamo una chiave inferiore a 163, possiamo esprimerla in due byte. Per prima cosa convertiamo `_key`, che è un valore a 256 bit, in un valore a 16 bit e usiamo l'OR logico per aggiungere il numero di byte extra al primo byte. Quindi lo inseriamo semplicemente in un valore `bytes2`, che può essere convertito in `bytes`. ```solidity - // There is probably a clever way to do the following lines as a loop, - // but it's a view function so I'm optimizing for programmer time and - // simplicity. + // Probabilmente c'è un modo intelligente per eseguire le righe seguenti come un ciclo, + // ma è una funzione view, quindi sto ottimizzando per il tempo del programmatore e + // la semplicità. if (_key < 16*256**2) return bytes.concat(bytes3(uint24(_key) | (0x2 * 16 * 256**2))); @@ -292,24 +289,24 @@ Quando abbiamo una chiave inferiore a 163, possiamo esprimerla in due return bytes.concat(bytes16(uint128(_key) | (0xF * 16 * 256**15))); ``` -Gli altri valori (3 byte, 4 byte, ecc.) sono gestiti allo stesso modo, ma con dimensioni del campo differenti. +Gli altri valori (3 byte, 4 byte, ecc.) vengono gestiti allo stesso modo, solo con dimensioni del campo diverse. ```solidity - // If we get here, something is wrong. + // Se arriviamo qui, c'è qualcosa di sbagliato. revert("Error in encodeVal, should not happen"); ``` -Se arriviamo qui significa che abbiamo una chiave non inferiore a 16\*25615. Ma `cacheWrite` limita le chiavi quindi non possiamo arrivare nemmeno fino a 14\*25616 (che avrebbe un primo byte di 0xFE, quindi apparirebbe così: `DONT_CACHE`). Ma aggiungere un test nel caso in cui un programmatore futuro aggiunga un bug non ci costa molto. +Se arriviamo qui significa che abbiamo ottenuto una chiave che non è inferiore a 16\*25615. Ma `cacheWrite` limita le chiavi, quindi non possiamo nemmeno arrivare a 14\*25616 (che avrebbe un primo byte di 0xFE, quindi sembrerebbe `DONT_CACHE`). Ma non ci costa molto aggiungere un test nel caso in cui un programmatore futuro introduca un bug. ```solidity } // encodeVal -} // Cache +} // Cache ``` ### Testare la cache {#testing-the-cache} -Uno dei vantaggi di Foundry è che [ti consente di scrivere i test in Solidity](https://book.getfoundry.sh/forge/tests), semplificando la scrittura dei test unitari. I test per la classe `Cache` sono [qui](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Poiché il codice del test è ripetitivo, come tendono a essere i test, questo articolo spiega soltanto le parti interessanti. +Uno dei vantaggi di Foundry è che [ti permette di scrivere test in Solidity](https://getfoundry.sh/forge/tests/overview/), il che rende più facile scrivere test unitari. I test per la classe `Cache` sono [qui](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Poiché il codice di test è ripetitivo, come tendono a essere i test, questo articolo spiega solo le parti interessanti. ```solidity // SPDX-License-Identifier: UNLICENSED @@ -318,11 +315,11 @@ pragma solidity ^0.8.13; import "forge-std/Test.sol"; -// Need to run `forge test -vv` for the console. +// È necessario eseguire `forge test -vv` per la console. import "forge-std/console.sol"; ``` -Questo è solo un modello standard necessario per utilizzare il pacchetto del test e `console.log`. +Questo è solo codice boilerplate necessario per utilizzare il pacchetto di test e `console.log`. ```solidity import "src/Cache.sol"; @@ -339,13 +336,13 @@ contract CacheTest is Test { } ``` -La funzione `setUp` viene chiamata prima di ogni test. In questo caso, creiamo semplicemente una nuova cache, così che i nostri test non si influenzeranno a vicenda. +La funzione `setUp` viene chiamata prima di ogni test. In questo caso creiamo semplicemente una nuova cache, in modo che i nostri test non si influenzino a vicenda. ```solidity function testCaching() public { ``` -I test sono funzioni i cui nomi iniziano per `test`. Questa funzione verifica la funzionalità di base della cache, scrivendo i valori e rileggendoli. +I test sono funzioni i cui nomi iniziano con `test`. Questa funzione controlla la funzionalità di base della cache, scrivendo valori e leggendoli di nuovo. ```solidity for(uint i=1; i<5000; i++) { @@ -356,15 +353,15 @@ I test sono funzioni i cui nomi iniziano per `test`. Questa funzione verifica la assertEq(cache.cacheRead(i), i*i); ``` -Ecco come si esegue il test effettivo, utilizzando le funzioni [`assert...`](https://book.getfoundry.sh/reference/forge-std/std-assertions). In questo caso verifichiamo che il valore scritto sia quello che leggiamo. Possiamo scartare il risultato di `cache.cacheWrite`, poiché sappiamo che le chiavi della cache sono assegnate linearmente. +Ecco come si esegue il test vero e proprio, utilizzando le [funzioni `assert...`](https://getfoundry.sh/reference/forge-std/std-assertions/). In questo caso, controlliamo che il valore che abbiamo scritto sia quello che abbiamo letto. Possiamo scartare il risultato di `cache.cacheWrite` perché sappiamo che le chiavi della cache vengono assegnate in modo lineare. ```solidity } - } // testCaching + } // testCaching - // Cache the same value multiple times, ensure that the key stays - // the same + // Mette in cache lo stesso valore più volte, assicurandosi che la chiave rimanga + // la stessa function testRepeatCaching() public { for(uint i=1; i<100; i++) { uint _key1 = cache.cacheWrite(i); @@ -373,26 +370,26 @@ Ecco come si esegue il test effettivo, utilizzando le funzioni [`assert...`](htt } ``` -Prima scriviamo ogni valore due volte nella cache e ci assicuriamo che le chiavi siano uguali (a significare che la seconda scrittura non si è verificata realmente). +Per prima cosa scriviamo ogni valore due volte nella cache e ci assicuriamo che le chiavi siano le stesse (il che significa che la seconda scrittura non è avvenuta realmente). ```solidity for(uint i=1; i<100; i+=3) { uint _key = cache.cacheWrite(i); assertEq(_key, i); } - } // testRepeatCaching + } // testRepeatCaching ``` -In teoria, potrebbe esserci un bug che non influenza le scritture consecutive nella cache. Quindi qui eseguiamo altre scritture non consecutive e visualizziamo i valori che non sono ancora riscritti. +In teoria potrebbe esserci un bug che non influisce sulle scritture consecutive nella cache. Quindi qui facciamo alcune scritture che non sono consecutive e vediamo che i valori non vengono comunque riscritti. ```solidity - // Read a uint from a memory buffer (to make sure we get back the parameters - // we sent out) + // Legge un uint da un buffer di memoria (per assicurarsi di riavere i parametri + // che abbiamo inviato) function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) ``` -Legge una parola da 256 bit da un buffer `bytes memory`. Questa funzione di utilità ci consente di verificare che riceviamo i risultati corretti, eseguendo la chiamata a una funzione che utilizza la cache. +Legge una parola a 256 bit da un buffer `bytes memory`. Questa funzione di utilità ci consente di verificare di ricevere i risultati corretti quando eseguiamo una chiamata di funzione che utilizza la cache. ```solidity { @@ -404,31 +401,31 @@ Legge una parola da 256 bit da un buffer `bytes memory`. Questa funzione di util } ``` -Yul non supporta le strutture di dati oltre `uint256`, quindi quando fai riferimento a strutture di dati più sofisticate, come il buffer di memoria `_bytes`, ne ottieni l'indirizzo. Solidity memorizza i valori di `bytes memory` come una parola da 32 byte contenente la lunghezza, seguita dai byte effettivi, quindi per ottenere il numero di byte `_start`, dobbiamo calcolare `_bytes+32+_start`. +Yul non supporta strutture dati oltre a `uint256`, quindi quando ti riferisci a una struttura dati più sofisticata, come il buffer di memoria `_bytes`, ottieni l'indirizzo di quella struttura. Solidity memorizza i valori `bytes memory` come una parola di 32 byte che contiene la lunghezza, seguita dai byte effettivi, quindi per ottenere il numero di byte `_start` dobbiamo calcolare `_bytes+32+_start`. ```solidity return tempUint; - } // toUint256 + } // toUint256 - // Function signature for fourParams(), courtesy of + // Firma della funzione per fourParams(), per gentile concessione di // https://www.4byte.directory/signatures/?bytes4_signature=0x3edc1e6d bytes4 constant FOUR_PARAMS = 0x3edc1e6d; - // Just some constant values to see we're getting the correct values back + // Solo alcuni valori costanti per vedere che stiamo ottenendo indietro i valori corretti uint256 constant VAL_A = 0xDEAD60A7; uint256 constant VAL_B = 0xBEEF; uint256 constant VAL_C = 0x600D; uint256 constant VAL_D = 0x600D60A7; ``` -Alcune costanti necessarie per il test. +Alcune costanti di cui abbiamo bisogno per i test. ```solidity function testReadParam() public { ``` -Chiama `fourParams()`, una funzione che utilizza `readParams` per testare la possibilità di leggere correttamente i parametri. +Chiama `fourParams()`, una funzione che utilizza `readParams`, per testare che possiamo leggere i parametri correttamente. ```solidity address _cacheAddr = address(cache); @@ -437,23 +434,23 @@ Chiama `fourParams()`, una funzione che utilizza `readParams` per testare la pos bytes memory _callOutput; ``` -Non possiamo utilizzare il normale meccanismo ABI per chiamare una funzione utilizzando la cache, quindi dobbiamo utilizzare il meccanismo di basso livello [`
.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses). Tale meccanismo prende `bytes memory` come input e lo restituisce (insieme a un valore Booleano) come output. +Non possiamo usare il normale meccanismo ABI per chiamare una funzione usando la cache, quindi dobbiamo usare il meccanismo di basso livello [`
.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses). Quel meccanismo accetta un `bytes memory` come input e lo restituisce (insieme a un valore booleano) come output. ```solidity - // First call, the cache is empty + // Prima chiamata, la cache è vuota _callInput = bytes.concat( FOUR_PARAMS, ``` -È utile, per lo stesso contratto, supportare sie le funzioni nella cache (per le chiamate direttamente dalle transazioni) che le funzioni non nella cache (per le chiamate da altri contratti intelligenti). Per farlo, dobbiamo continuare ad affidarci al meccanismo di Solidity per chiamare la funzione corretta, invece di mettere tutto in [una funzione di `fallback`](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function). Farlo semplifica la compositività. Un singolo byte basterebbe per identificare la funzione in gran parte dei casi, quindi stiamo sprecando tre byte (16\*3=48 gas). Tuttavia, al momento della scrittura di questa guida, quei 48 di gas costano 0,07 centesimi, un costo ragionevole del codice più semplice e meno soggetto a bug. +È utile che lo stesso contratto supporti sia funzioni memorizzate nella cache (per chiamate direttamente dalle transazioni) sia funzioni non memorizzate nella cache (per chiamate da altri contratti intelligenti). Per farlo dobbiamo continuare ad affidarci al meccanismo di Solidity per chiamare la funzione corretta, invece di inserire tutto in [una funzione di `fallback`](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function). Fare questo rende la componibilità molto più semplice. Un singolo byte sarebbe sufficiente per identificare la funzione nella maggior parte dei casi, quindi stiamo sprecando tre byte (16\*3=48 gas). Tuttavia, mentre scrivo questo, quei 48 gas costano 0,07 centesimi, che è un costo ragionevole per un codice più semplice e meno soggetto a bug. ```solidity - // First value, add it to the cache + // Primo valore, lo aggiunge alla cache cache.INTO_CACHE(), bytes32(VAL_A), ``` -Il primo valore: un flag che dice che è un valore completo che necessita di essere scritto nella cache, seguito dai 32 byte del valore. Gli altri tre valori sono simili, ma `VAL_B` non è scritto nella cache e `VAL_C` è sia il terzo che il quarto parametro. +Il primo valore: un flag che indica che è un valore completo che deve essere scritto nella cache, seguito dai 32 byte del valore. Gli altri tre valori sono simili, tranne per il fatto che `VAL_B` non viene scritto nella cache e `VAL_C` è sia il terzo parametro che il quarto. ```solidity . @@ -463,20 +460,20 @@ Il primo valore: un flag che dice che è un valore completo che necessita di ess (_success, _callOutput) = _cacheAddr.call(_callInput); ``` -Qui è dove chiamiamo effettivamente il contratto `Cache`. +È qui che chiamiamo effettivamente il contratto `Cache`. ```solidity assertEq(_success, true); ``` -Ci aspettiamo che la chiamata riesca. +Ci aspettiamo che la chiamata abbia successo. ```solidity assertEq(cache.cacheRead(1), VAL_A); assertEq(cache.cacheRead(2), VAL_C); ``` -Iniziamo con una cache vuota e poi aggiungiamo `VAL_A`, seguito da `VAL_C`. Ci aspetteremmo che la prima abbia la chiave 1 e che la seconda abbia la chiave 2. +Iniziamo con una cache vuota e poi aggiungiamo `VAL_A` seguito da `VAL_C`. Ci aspetteremmo che il primo abbia la chiave 1 e il secondo abbia 2. ``` assertEq(toUint256(_callOutput,0), VAL_A); @@ -485,32 +482,32 @@ Iniziamo con una cache vuota e poi aggiungiamo `VAL_A`, seguito da `VAL_C`. Ci a assertEq(toUint256(_callOutput,96), VAL_C); ``` -Il risultato comprende i quattro parametri. Qui verifichiamo che sia corretto. +L'output sono i quattro parametri. Qui verifichiamo che sia corretto. ```solidity - // Second call, we can use the cache + // Seconda chiamata, possiamo usare la cache _callInput = bytes.concat( FOUR_PARAMS, - // First value in the Cache + // Primo valore nella Cache bytes1(0x01), ``` -Le chiavi della cache sotto 16 sono composte da un solo byte. +Le chiavi della cache inferiori a 16 sono di un solo byte. ```solidity - // Second value, don't add it to the cache + // Secondo valore, non lo aggiunge alla cache cache.DONT_CACHE(), bytes32(VAL_B), - // Third and fourth values, same value + // Terzo e quarto valore, stesso valore bytes1(0x02), bytes1(0x02) ); . . . - } // testReadParam + } // testReadParam ``` I test dopo la chiamata sono identici a quelli dopo la prima chiamata. @@ -519,7 +516,7 @@ I test dopo la chiamata sono identici a quelli dopo la prima chiamata. function testEncodeVal() public { ``` -Questa funzione è simile a `testReadParam`, ma, invece di scrivere i parametri esplicitamente, utilizziamo `encodeVal()`. +Questa funzione è simile a `testReadParam`, tranne per il fatto che invece di scrivere i parametri esplicitamente usiamo `encodeVal()`. ```solidity . @@ -536,26 +533,26 @@ Questa funzione è simile a `testReadParam`, ma, invece di scrivere i parametri . . assertEq(_callInput.length, 4+1*4); - } // testEncodeVal + } // testEncodeVal ``` -Il solo test aggiuntivo in `testEncodeVal()` consiste nel verificare che la lunghezza di `_callInput` sia corretta. Per la prima chiamata, è 4+33\*4. Per la seconda, dove ogni valore è già nella cache, è 4+1\*4. +L'unico test aggiuntivo in `testEncodeVal()` è verificare che la lunghezza di `_callInput` sia corretta. Per la prima chiamata è 4+33\*4. Per la seconda, dove ogni valore è già nella cache, è 4+1\*4. ```solidity - // Test encodeVal when the key is more than a single byte - // Maximum three bytes because filling the cache to four bytes takes - // too long. + // Testa encodeVal quando la chiave è più di un singolo byte + // Massimo tre byte perché riempire la cache a quattro byte richiede + // troppo tempo. function testEncodeValBig() public { - // Put a number of values in the cache. - // To keep things simple, use key n for value n. + // Mette un certo numero di valori nella cache. + // Per mantenere le cose semplici, usa la chiave n per il valore n. for(uint i=1; i<0x1FFF; i++) { cache.cacheWrite(i); } ``` -La funzione `testEncodeVal` precedente scrive soltanto quattro valori nella cache, quindi [la parte della funzione che si occupa dei valori a più byte](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) non è controllata. Ma quel codice è complicato e tende ad avere errori. +La funzione `testEncodeVal` sopra scrive solo quattro valori nella cache, quindi [la parte della funzione che gestisce i valori multi-byte](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) non viene controllata. Ma quel codice è complicato e soggetto a errori. -La prima parte di questa funzione è un ciclo che scrive tutti i valori da 1 a 0x1FFF nella cache in ordine, quindi potrai codificarli e sapere cosa sta succedendo. +La prima parte di questa funzione è un ciclo che scrive tutti i valori da 1 a 0x1FFF nella cache in ordine, in modo da poter codificare quei valori e sapere dove stanno andando. ```solidity . @@ -564,28 +561,28 @@ La prima parte di questa funzione è un ciclo che scrive tutti i valori da 1 a 0 _callInput = bytes.concat( FOUR_PARAMS, - cache.encodeVal(0x000F), // One byte 0x0F - cache.encodeVal(0x0010), // Two bytes 0x1010 - cache.encodeVal(0x0100), // Two bytes 0x1100 - cache.encodeVal(0x1000) // Three bytes 0x201000 + cache.encodeVal(0x000F), // Un byte 0x0F + cache.encodeVal(0x0010), // Due byte 0x1010 + cache.encodeVal(0x0100), // Due byte 0x1100 + cache.encodeVal(0x1000) // Tre byte 0x201000 ); ``` -Testa valori da uno, due e tre byte. Non testiamo oltre tali valori perché ci vorrebbe troppo tempo per scrivere abbastanza elementi dello stack (almeno 0x10000000, approssimativamente, un quarto di miliardo). +Testa valori di un byte, due byte e tre byte. Non testiamo oltre perché ci vorrebbe troppo tempo per scrivere abbastanza voci nello stack (almeno 0x10000000, circa un quarto di miliardo). ```solidity . . . . - } // testEncodeValBig + } // testEncodeValBig - // Test what with an excessively small buffer we get a revert + // Testa che con un buffer eccessivamente piccolo otteniamo un revert function testShortCalldata() public { ``` -Testiamo cosa si verifica nel caso anomalo in cui non ci siano abbastanza parametri. +Testa cosa succede nel caso anomalo in cui non ci sono abbastanza parametri. ```solidity . @@ -593,10 +590,10 @@ Testiamo cosa si verifica nel caso anomalo in cui non ci siano abbastanza parame . (_success, _callOutput) = _cacheAddr.call(_callInput); assertEq(_success, false); - } // testShortCalldata + } // testShortCalldata ``` -Poiché si ripristina, dovremmo ottenere `false`. +Poiché si annulla, il risultato che dovremmo ottenere è `false`. ``` // Call with cache keys that aren't there @@ -618,41 +615,41 @@ Poiché si ripristina, dovremmo ottenere `false`. ); ``` -Questa funzione ottiene quattro parametri perfettamente legittimi, ma la cache è vuota, quindi non non sono presenti valori da leggere. +Questa funzione ottiene quattro parametri perfettamente legittimi, tranne per il fatto che la cache è vuota, quindi non ci sono valori da leggere. ```solidity . . . - // Test what with an excessively long buffer everything works file + // Testa che con un buffer eccessivamente lungo tutto funziona correttamente function testLongCalldata() public { address _cacheAddr = address(cache); bool _success; bytes memory _callInput; bytes memory _callOutput; - // First call, the cache is empty + // Prima chiamata, la cache è vuota _callInput = bytes.concat( FOUR_PARAMS, - // First value, add it to the cache + // Primo valore, lo aggiunge alla cache cache.INTO_CACHE(), bytes32(VAL_A), - // Second value, add it to the cache + // Secondo valore, lo aggiunge alla cache cache.INTO_CACHE(), bytes32(VAL_B), - // Third value, add it to the cache + // Terzo valore, lo aggiunge alla cache cache.INTO_CACHE(), bytes32(VAL_C), - // Fourth value, add it to the cache + // Quarto valore, lo aggiunge alla cache cache.INTO_CACHE(), bytes32(VAL_D), - // And another value for "good luck" + // E un altro valore per "buona fortuna" bytes4(0x31112233) ); ``` -Questa funzione invia cinque valori. Sappiamo che il quinto valore è ignorato perché non è un elemento della cache valido, ma avrebbe causato un ripristino se non fosse stato incluso. +Questa funzione invia cinque valori. Sappiamo che il quinto valore viene ignorato perché non è una voce di cache valida, il che avrebbe causato un annullamento se non fosse stato incluso. ```solidity (_success, _callOutput) = _cacheAddr.call(_callInput); @@ -660,19 +657,19 @@ Questa funzione invia cinque valori. Sappiamo che il quinto valore è ignorato p . . . - } // testLongCalldata + } // testLongCalldata -} // CacheTest +} // CacheTest ``` -## Un esempio di applicazione {#a-sample-app} +## Un'applicazione di esempio {#a-sample-app} -Scrivere test in Solidity va bene, ma alla fine una dapp deve poter elaborare le richieste dall'esterno della catena per essere utile. Questo articolo dimostra come utilizzare la memorizzazione nella cache in una dapp con `WORM`, che sta per "Write Once, Read Many" (Scrivi una volta, leggi molte volte). Se una chiave non è ancora stata scritta, puoi scriverci un valore. Se la chiave è già scritta, ottieni un ripristino. +Scrivere test in Solidity va benissimo, ma alla fine della giornata una dApp deve essere in grado di elaborare richieste dall'esterno della catena per essere utile. Questo articolo dimostra come utilizzare il caching in una dApp con `WORM`, che sta per "Write Once, Read Many" (Scrivi una volta, leggi molte). Se una chiave non è ancora stata scritta, puoi scriverci un valore. Se la chiave è già scritta, ottieni un annullamento. ### Il contratto {#the-contract} -[Questo è il contratto](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Per lo più ripete ciò che abbiamo già fatto con `Cache` e `CacheTest`, quindi copriremo soltanto le parti interessanti. +[Questo è il contratto](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Ripete per lo più ciò che abbiamo già fatto con `Cache` e `CacheTest`, quindi copriamo solo le parti interessanti. ```solidity import "./Cache.sol"; @@ -680,38 +677,38 @@ import "./Cache.sol"; contract WORM is Cache { ``` -Il metodo più facile per utilizzare `Cache` è ereditarlo nel proprio contratto. +Il modo più semplice per usare `Cache` è ereditarlo nel nostro contratto. ```solidity function writeEntryCached() external { uint[] memory params = _readParams(2); writeEntry(params[0], params[1]); - } // writeEntryCached + } // writeEntryCached ``` -Questa funzione è simile a `fourParam` nel precedente `CacheTest`. Poiché non seguiamo le specifiche ABI, è meglio non dichiarare alcun parametro nella funzione. +Questa funzione è simile a `fourParam` in `CacheTest` sopra. Poiché non seguiamo le specifiche ABI, è meglio non dichiarare alcun parametro nella funzione. ```solidity - // Make it easier to call us - // Function signature for writeEntryCached(), courtesy of + // Rende più facile chiamarci + // Firma della funzione per writeEntryCached(), per gentile concessione di // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; ``` -Il codice esterno che chiama `writeEntryCached` dovrà creare manualmente i calldata, invece di utilizzare `worm.writeEntryCached`, poiché non seguiamo le specifiche ABI. Avere questo valore costante ne semplifica la scrittura. +Il codice esterno che chiama `writeEntryCached` dovrà costruire manualmente il calldata, invece di usare `worm.writeEntryCached`, perché non seguiamo le specifiche ABI. Avere questo valore costante rende semplicemente più facile scriverlo. -Nota che anche se definiamo `WRITE_ENTRY_CACHED` come una variabile di stato, per leggerla esternamente è necessario utilizzare la sua funzione di ottenimento, `worm.WRITE_ENTRY_CACHED()`. +Nota che anche se definiamo `WRITE_ENTRY_CACHED` come una variabile di stato, per leggerla esternamente è necessario utilizzare la sua funzione getter, `worm.WRITE_ENTRY_CACHED()`. ```solidity function readEntry(uint key) public view returns (uint _value, address _writtenBy, uint _writtenAtBlock) ``` -La funzione Leggi è una `view`, quindi non richiede una transazione, né costa gas. Di conseguenza, non vi è beneficio nell'usare la cache per il parametro. Con le funzioni view, è meglio utilizzare il meccanismo standard, che è più semplice. +La funzione di lettura è una `view`, quindi non richiede una transazione e non costa gas. Di conseguenza, non c'è alcun vantaggio nell'usare la cache per il parametro. Con le funzioni view è meglio usare il meccanismo standard che è più semplice. -### Il codice di prova {#the-testing-code} +### Il codice di test {#the-testing-code} -[Questo è il codice di prova per il contratto](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Anche in questo caso ci occupiamo soltanto di ciò che ci interessa. +[Questo è il codice di test per il contratto](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Ancora una volta, guardiamo solo ciò che è interessante. ```solidity function testWReadWrite() public { @@ -721,27 +718,27 @@ La funzione Leggi è una `view`, quindi non richiede una transazione, né costa worm.writeEntry(0xDEAD, 0xBEEF); ``` -[Questo (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) è il modo in cui specifichiamo in un test Foundry che la chiamata successiva dovrebbe non riuscire e il motivo segnalato per l'errore. Questo si applica quando utilizziamo la sintassi `.()`, piuttosto che creare i calldata e chiamare il contratto utilizzando l'interfaccia di basso livello (`.call()`, etc.). +[Questo (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) è il modo in cui specifichiamo in un test di Foundry che la chiamata successiva dovrebbe fallire, e il motivo riportato per un fallimento. Questo si applica quando usiamo la sintassi `.()` piuttosto che costruire il calldata e chiamare il contratto usando l'interfaccia di basso livello (`.call()`, ecc.). ```solidity function testReadWriteCached() public { uint cacheGoat = worm.cacheWrite(0x60A7); ``` -Qui utilizziamo il fatto che `cacheWrite` restituisce la chiave della cache. Questo non è qualcosa che prevediamo di utilizzare in produzione, poiché `cacheWrite` cambia lo stato, ed è quindi chiamabile soltanto durante una transazione. Le transazioni non hanno valori restituiti, se hanno risultati, questi dovrebbero essere emessi come eventi. Quindi, il valore restituito di `cacheWrite` è accessibile soltanto dal codice sulla catena, che non necessita il salvataggio nella cache dei parametri. +Qui usiamo il fatto che `cacheWrite` restituisce la chiave della cache. Questo non è qualcosa che ci aspetteremmo di usare in produzione, perché `cacheWrite` cambia lo stato, e quindi può essere chiamato solo durante una transazione. Le transazioni non hanno valori di ritorno, se hanno risultati si suppone che quei risultati vengano emessi come eventi. Quindi il valore di ritorno di `cacheWrite` è accessibile solo dal codice on-chain, e il codice on-chain non ha bisogno del caching dei parametri. ```solidity (_success,) = address(worm).call(_callInput); ``` -Questo è il modo in cui diciamo a Solidity che mentre `.call()` ha due valori restituiti, ci importa soltanto del primo. +Questo è il modo in cui diciamo a Solidity che mentre `.call()` ha due valori di ritorno, a noi interessa solo il primo. ```solidity (_success,) = address(worm).call(_callInput); assertEq(_success, false); ``` -Poiché utilizziamo la funzione di basso livello `
.call()`, non possiamo utilizzare `vm.expectRevert()` e dobbiamo guardare al valore di successo booleano, ottenuto dalla chiamata. +Poiché usiamo la funzione di basso livello `
.call()`, non possiamo usare `vm.expectRevert()` e dobbiamo guardare il valore booleano di successo che otteniamo dalla chiamata. ```solidity event EntryWritten(uint indexed key, uint indexed value); @@ -757,49 +754,49 @@ Poiché utilizziamo la funzione di basso livello `
.call()`, non possiam (_success,) = address(worm).call(_callInput); ``` -Così, verifichiamo che il codice [emetta un evento correttamente](https://book.getfoundry.sh/cheatcodes/expect-emit), in Foundry. +Questo è il modo in cui verifichiamo che il codice [emetta un evento correttamente](https://getfoundry.sh/reference/cheatcodes/expect-emit/) in Foundry. ### Il client {#the-client} -Una cosa che non ottieni con i test in Solidity è il codice in JavaScript che puoi tagliare e incollare nella tua applicazione. Per scrivere quel codice, ho distribuito WORM a [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), la nuova rete di prova di [Optimism](https://www.optimism.io/). Si trova all'indirizzo [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). +Una cosa che non ottieni con i test di Solidity è il codice JavaScript che puoi tagliare e incollare nella tua applicazione. Per scrivere quel codice ho distribuito WORM su [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), la nuova rete di test di [Optimism](https://www.optimism.io/). Si trova all'indirizzo [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). -[Puoi visualizzare qui il codice in JavaScript per il client](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Per utilizzarlo: +[Puoi vedere il codice JavaScript per il client qui](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Per usarlo: -1. Clona la repository di git: +1. Clona il repository git: ```sh git clone https://github.com/qbzzt/20220915-all-you-can-cache.git - ``` +``` 2. Installa i pacchetti necessari: ```sh cd javascript yarn - ``` +``` 3. Copia il file di configurazione: ```sh cp .env.example .env - ``` +``` 4. Modifica `.env` per la tua configurazione: - | Parametro | Valore | - | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - | MNEMONIC | La frase mnemonica per un account avente abbastanza ETH da pagare per una transazione. [Puoi ottenere ETH gratuiti per la rete Goerli di Optimism qui](https://optimismfaucet.xyz/). | - | OPTIMISM_GOERLI_URL | URL per Goerli di Optimism. L'endpoint pubblico, `https://goerli.optimism.io`, è limitato ma sufficiente per ciò che ci occorre qui | + | Parametro | Valore | + | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | MNEMONIC | La frase mnemonica per un account che ha abbastanza ETH per pagare una transazione. [Puoi ottenere ETH gratuiti per la rete Optimism Goerli qui](https://optimismfaucet.xyz/). | + | OPTIMISM_GOERLI_URL | URL per Optimism Goerli. L'endpoint pubblico, `https://goerli.optimism.io`, ha un limite di velocità ma è sufficiente per ciò di cui abbiamo bisogno qui | 5. Esegui `index.js`. ```sh node index.js - ``` +``` - Questo esempio di applicazione prima scrive una voce nel WORM, mostrando i calldata e un collegamento alla transazione su Etherscan. Poi rilegge quella voce e mostra la chiave che utilizza e i valori nella voce (valore, numero del blocco e autore). + Questa applicazione di esempio scrive prima una voce in WORM, visualizzando il calldata e un link alla transazione su Etherscan. Quindi rilegge quella voce e visualizza la chiave che utilizza e i valori nella voce (valore, numero del blocco e autore). -Gran parte del client è una normale Dapp in JavaScript. Quindi, ancora, analizzeremo soltanto le parti interessanti. +La maggior parte del client è normale JavaScript per dApp. Quindi, ancora una volta, esamineremo solo le parti interessanti. ```javascript . @@ -808,20 +805,20 @@ Gran parte del client è una normale Dapp in JavaScript. Quindi, ancora, analizz const main = async () => { const func = await worm.WRITE_ENTRY_CACHED() - // Need a new key every time + // Serve una nuova chiave ogni volta const key = await worm.encodeVal(Number(new Date())) ``` -Un dato spazio è scrivibile soltanto una volta, quindi utilizziamo la marca oraria per assicurarci di non riutilizzarlo. +Un determinato slot può essere scritto solo una volta, quindi usiamo il timestamp per assicurarci di non riutilizzare gli slot. ```javascript const val = await worm.encodeVal("0x600D") -// Write an entry +// Scrive una voce const calldata = func + key.slice(2) + val.slice(2) ``` -Gli ether si aspettano che i dati di chiamata siano una stringa esadecimale, `0x`, seguita da un numero pari di crifre esadecimali. Poiché sia `key` che `val` iniziano con `0x`, dobbiamo rimuovere queste intestazioni. +Ethers si aspetta che i dati della chiamata siano una stringa esadecimale, `0x` seguita da un numero pari di cifre esadecimali. Poiché sia `key` che `val` iniziano con `0x`, dobbiamo rimuovere quelle intestazioni. ```javascript const tx = await worm.populateTransaction.writeEntryCached() @@ -830,39 +827,41 @@ tx.data = calldata sentTx = await wallet.sendTransaction(tx) ``` -Come con il codice di test di Solidity, non possiamo chiamare normalmente una funzione. Invece, dobbiamo utilizzare un meccanismo di livello inferiore. +Come con il codice di test di Solidity, non possiamo chiamare normalmente una funzione memorizzata nella cache. Invece, dobbiamo usare un meccanismo di livello inferiore. ```javascript . . . - // Read the entry just written - const realKey = '0x' + key.slice(4) // remove the FF flag + // Legge la voce appena scritta + const realKey = '0x' + key.slice(4) // rimuove il flag FF const entryRead = await worm.readEntry(realKey) . . . ``` -Per leggere le voci possiamo utilizzare il meccanismo normale. Non serve utilizzare il salvataggio nella cache del parametro con le funzioni `view`. +Per leggere le voci possiamo usare il meccanismo normale. Non c'è bisogno di usare il caching dei parametri con le funzioni `view`. -## Conclusioni {#conclusion} +## Conclusione {#conclusion} -Il codice in questo articolo è una prova di concetto, lo scopo è rendere l'idea facile da comprendere. Per un sistema pronto alla produzione, potresti voler implementare delle funzionalità aggiuntive: +Il codice in questo articolo è una prova di concetto, lo scopo è rendere l'idea facile da capire. Per un sistema pronto per la produzione potresti voler implementare alcune funzionalità aggiuntive: -- Gestisce i valori diversi da `uint256`. Ad esempio, stringhe. -- Invece di una cache globale, forse, avere una mappatura tra utenti e cache. Utenti differenti utilizzano valori differenti. -- I valori utilizzati per gli indirizzi sono distinti da quelli utilizzati per altri scopi. Potrebbe avere senso avere una cache separata soltanto per gli indirizzi. -- Al momento, le chiavi della cache si basano su un algoritmo "il primo che arriva riceve la chiave più piccola". I primi sedici valori sono inviabili come un singolo byte. I 4080 valori successivi sono inviabili come due byte. Il successivo milione approssimativo di valori è in tre byte, ecc. Un sistema di produzione dovrebbe mantenere dei contatori di utilizzo sulle voci della cache e riorganizzarli così che i sedici valori _più comuni_ siano un byte, i successivi 4080 valori più comuni siano due byte, ecc. +- Gestire valori che non sono `uint256`. Ad esempio, le stringhe. +- Invece di una cache globale, magari avere una mappatura tra utenti e cache. Utenti diversi usano valori diversi. +- I valori utilizzati per gli indirizzi sono distinti da quelli utilizzati per altri scopi. Potrebbe avere senso avere una cache separata solo per gli indirizzi. +- Attualmente, le chiavi della cache si basano su un algoritmo "primo arrivato, chiave più piccola". I primi sedici valori possono essere inviati come un singolo byte. I successivi 4080 valori possono essere inviati come due byte. Il successivo milione circa di valori sono tre byte, ecc. Un sistema di produzione dovrebbe mantenere contatori di utilizzo sulle voci della cache e riorganizzarle in modo che i sedici valori _più comuni_ siano di un byte, i successivi 4080 valori più comuni di due byte, ecc. Tuttavia, questa è un'operazione potenzialmente pericolosa. Immagina la seguente sequenza di eventi: - 1. Noam Naive chiama `encodeVal` per codificare l'indirizzo a cui desidera inviare i token. Quell'indirizzo è uno dei primi utilizzati sull'applicazione, quindi il valore codificato è 0x06. Questa è una funzione `view`, non una transazione, quindi si trova tra Noam e il nodo che utilizza, e nessun altro ne è a conoscenza + 1. Noam Naive chiama `encodeVal` per codificare l'indirizzo a cui vuole inviare i token. Quell'indirizzo è uno dei primi utilizzati sull'applicazione, quindi il valore codificato è 0x06. Questa è una funzione `view`, non una transazione, quindi è tra Noam e il nodo che utilizza, e nessun altro ne è a conoscenza. + + 2. Owen Owner esegue l'operazione di riordino della cache. Pochissime persone utilizzano effettivamente quell'indirizzo, quindi ora è codificato come 0x201122. A un valore diverso, 1018, viene assegnato 0x06. - 2. Owen Owner esegue l'operazione di riordinamento della cache. In pochissimi utilizzano realmente quell'indirizzo, quindi è ora codificato come 0x201122. Un valore differente, 1018, è assegnato a 0x06. + 3. Noam Naive invia i suoi token a 0x06. Vanno all'indirizzo `0x0000000000000000000000000de0b6b3a7640000`, e poiché nessuno conosce la chiave privata per quell'indirizzo, rimangono semplicemente bloccati lì. Noam _non è felice_. - 3. Noam Naive invia i suoi token a 0x06. I token arrivano all'indirizzo `0x0000000000000000000000000de0b6b3a7640000` e, poiché nessuno conosce la chiave privata per quell'indirizzo, restano bloccati lì. Noam _non è felice_. + Ci sono modi per risolvere questo problema, e il problema correlato delle transazioni che si trovano nella mempool durante il riordino della cache, ma devi esserne consapevole. - Esistono dei modi per risolvere questo problema e il problema correlato delle transazioni nel mempool durante il riordino della cache, ma devi esserne consapevole. +Ho dimostrato il caching qui con Optimism, perché sono un dipendente di Optimism e questo è il rollup che conosco meglio. Ma dovrebbe funzionare con qualsiasi rollup che addebita un costo minimo per l'elaborazione interna, in modo che in confronto la scrittura dei dati della transazione su L1 sia la spesa maggiore. -Qui, ho dimostrato il salvataggio nella cache con Optimism, perché ne sono un dipendente ed è il rollup che conosco meglio. Ma dovrebbe funzionare con qualsiasi rollup che addebiti un costo minimo per l'elaborazione interna, così che, in confronto, scrivere i dati della transazione a L1 sia la spesa maggiore. +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/app-plasma/index.md b/public/content/translations/it/developers/tutorials/app-plasma/index.md new file mode 100644 index 00000000000..31d82c2ced9 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/app-plasma/index.md @@ -0,0 +1,1256 @@ +--- +title: Scrivere un plasma specifico per l'app che preserva la privacy +description: "In questo tutorial, costruiamo una banca semi-segreta per i depositi. La banca è un componente centralizzato; conosce il saldo di ogni utente. Tuttavia, queste informazioni non sono memorizzate on-chain. Invece, la banca pubblica un hash dello stato. Ogni volta che si verifica una transazione, la banca pubblica il nuovo hash, insieme a una prova a conoscenza-zero di avere una transazione firmata che modifica lo stato dell'hash in quello nuovo. Dopo aver letto questo tutorial, capirai non solo come usare le prove a conoscenza-zero, ma anche perché usarle e come farlo in modo sicuro." +author: Ori Pomerantz +tags: ["conoscenza-zero", "server", "fuori catena", "privacy"] +skill: advanced +breadcrumb: Plasma specifico per l'app +lang: it +published: 2025-10-15 +--- + +## Introduzione {#introduction} + +A differenza dei [rollup](/developers/docs/scaling/zk-rollups/), i [plasma](/developers/docs/scaling/plasma) utilizzano la rete principale di Ethereum per l'integrità, ma non per la disponibilità. In questo articolo, scriviamo un'applicazione che si comporta come un plasma, con Ethereum che garantisce l'integrità (nessuna modifica non autorizzata) ma non la disponibilità (un componente centralizzato può bloccarsi e disabilitare l'intero sistema). + +L'applicazione che scriviamo qui è una banca che preserva la privacy. Diversi indirizzi hanno account con saldi e possono inviare denaro (ETH) ad altri account. La banca pubblica gli hash dello stato (account e relativi saldi) e delle transazioni, ma mantiene i saldi effettivi fuori catena dove possono rimanere privati. + +## Progettazione {#design} + +Questo non è un sistema pronto per la produzione, ma uno strumento didattico. Come tale, è scritto con diverse ipotesi semplificative. + +- Pool di account fisso. Esiste un numero specifico di account e ogni account appartiene a un indirizzo predeterminato. Questo rende il sistema molto più semplice perché è difficile gestire strutture dati di dimensioni variabili nelle prove a conoscenza-zero. Per un sistema pronto per la produzione, possiamo usare la [radice di Merkle](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) come hash dello stato e fornire prove di Merkle per i saldi richiesti. + +- Archiviazione in memoria. In un sistema di produzione, dobbiamo scrivere tutti i saldi degli account su disco per preservarli in caso di riavvio. Qui, va bene se le informazioni vengono semplicemente perse. + +- Solo trasferimenti. Un sistema di produzione richiederebbe un modo per depositare asset nella banca e per prelevarli. Ma lo scopo qui è solo illustrare il concetto, quindi questa banca è limitata ai trasferimenti. + +### Prove a conoscenza-zero {#zero-knowledge-proofs} + +A livello fondamentale, una prova a conoscenza-zero dimostra che il dimostratore conosce alcuni dati, _Datiprivati_ tali che esista una relazione _Relazione_ tra alcuni dati pubblici, _Datipubblici_, e _Datiprivati_. Il verificatore conosce la _Relazione_ e i _Datipubblici_. + +Per preservare la privacy, abbiamo bisogno che gli stati e le transazioni siano privati. Ma per garantire l'integrità, abbiamo bisogno che l' [hash crittografico](https://en.wikipedia.org/wiki/Cryptographic_hash_function) degli stati sia pubblico. Per dimostrare alle persone che inviano transazioni che quelle transazioni sono realmente avvenute, dobbiamo anche pubblicare gli hash delle transazioni. + +Nella maggior parte dei casi, i _Datiprivati_ sono l'input del programma di prova a conoscenza-zero e i _Datipubblici_ sono l'output. + +Questi campi nei _Datiprivati_: + +- _Staton_, il vecchio stato +- _Staton+1_, il nuovo stato +- _Transazione_, una transazione che passa dal vecchio stato al nuovo. Questa transazione deve includere questi campi: + - _Indirizzo di destinazione_ che riceve il trasferimento + - _Importo_ trasferito + - _Nonce_ per garantire che ogni transazione possa essere elaborata solo una volta. + L'indirizzo di origine non deve essere nella transazione, perché può essere recuperato dalla firma. +- _Firma_, una firma autorizzata a eseguire la transazione. Nel nostro caso, l'unico indirizzo autorizzato a eseguire una transazione è l'indirizzo di origine. Poiché il nostro sistema a conoscenza-zero funziona in questo modo, abbiamo bisogno anche della chiave pubblica dell'account, oltre alla firma di Ethereum. + +Questi sono i campi nei _Datipubblici_: + +- _Hash(Staton)_ l'hash del vecchio stato +- _Hash(Staton+1)_ l'hash del nuovo stato +- _Hash(Transazione)_ l'hash della transazione che cambia lo stato da _Staton_ a _Staton+1_. + +La relazione verifica diverse condizioni: + +- Gli hash pubblici sono effettivamente gli hash corretti per i campi privati. +- La transazione, quando applicata al vecchio stato, si traduce nel nuovo stato. +- La firma proviene dall'indirizzo di origine della transazione. + +A causa delle proprietà delle funzioni di hash crittografico, dimostrare queste condizioni è sufficiente per garantire l'integrità. + +### Strutture dati {#data-structures} + +La struttura dati principale è lo stato mantenuto dal server. Per ogni account, il server tiene traccia del saldo dell'account e di un [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce), utilizzato per prevenire gli [attacchi di replay](https://en.wikipedia.org/wiki/Replay_attack). + +### Componenti {#components} + +Questo sistema richiede due componenti: + +- Il _server_ che riceve le transazioni, le elabora e pubblica gli hash sulla catena insieme alle prove a conoscenza-zero. +- Un _contratto intelligente_ che memorizza gli hash e verifica le prove a conoscenza-zero per garantire che le transizioni di stato siano legittime. + +### Flusso di dati e controllo {#flows} + +Questi sono i modi in cui i vari componenti comunicano per trasferire da un account all'altro. + +1. Un browser web invia una transazione firmata richiedendo un trasferimento dall'account del firmatario a un account diverso. + +2. Il server verifica che la transazione sia valida: + + - Il firmatario ha un account nella banca con un saldo sufficiente. + - Il destinatario ha un account nella banca. + +3. Il server calcola il nuovo stato sottraendo l'importo trasferito dal saldo del firmatario e aggiungendolo al saldo del destinatario. + +4. Il server calcola una prova a conoscenza-zero che il cambiamento di stato è valido. + +5. Il server invia a Ethereum una transazione che include: + + - Il nuovo hash dello stato + - L'hash della transazione (in modo che il mittente della transazione possa sapere che è stata elaborata) + - La prova a conoscenza-zero che dimostra che la transizione al nuovo stato è valida + +6. Il contratto intelligente verifica la prova a conoscenza-zero. + +7. Se la prova a conoscenza-zero è corretta, il contratto intelligente esegue queste azioni: + - Aggiorna l'hash dello stato corrente al nuovo hash dello stato + - Emette una voce di registro con il nuovo hash dello stato e l'hash della transazione + +### Strumenti {#tools} + +Per il codice lato client, useremo [Vite](https://vite.dev/), [React](https://react.dev/), [Viem](https://viem.sh/) e [Wagmi](https://wagmi.sh/). Questi sono strumenti standard del settore; se non hai familiarità con essi, puoi usare [questo tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). + +La maggior parte del server è scritta in JavaScript usando [Node](https://nodejs.org/en). La parte a conoscenza-zero è scritta in [Noir](https://noir-lang.org/). Abbiamo bisogno della versione `1.0.0-beta.10`, quindi dopo aver [installato Noir come indicato](https://noir-lang.org/docs/getting_started/quick_start), esegui: + +``` +noirup -v 1.0.0-beta.10 +``` + +La blockchain che usiamo è `anvil`, una blockchain di test locale che fa parte di [Foundry](https://getfoundry.sh/introduction/installation). + +## Implementazione {#implementation} + +Poiché si tratta di un sistema complesso, lo implementeremo in fasi. + +### Fase 1 - Conoscenza-zero manuale {#stage-1} + +Per la prima fase, firmeremo una transazione nel browser e poi forniremo manualmente le informazioni alla prova a conoscenza-zero. Il codice a conoscenza-zero si aspetta di ottenere quelle informazioni in `server/noir/Prover.toml` (documentato [qui](https://noir-lang.org/docs/getting_started/project_breakdown#provertoml-1)). + +Per vederlo in azione: + +1. Assicurati di avere [Node](https://nodejs.org/en/download) e [Noir](https://noir-lang.org/install) installati. Preferibilmente, installali su un sistema UNIX come macOS, Linux o [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). + +2. Scarica il codice della fase 1 e avvia il server web per servire il codice client. + + ```sh + git clone https://github.com/qbzzt/250911-zk-bank.git -b 01-manual-zk + cd 250911-zk-bank + cd client + npm install + npm run dev +``` + + Il motivo per cui hai bisogno di un server web qui è che, per prevenire determinati tipi di frode, molti portafogli (come MetaMask) non accettano file serviti direttamente dal disco + +3. Apri un browser con un portafoglio. + +4. Nel portafoglio, inserisci una nuova frase di recupero. Nota che questo eliminerà la tua frase di recupero esistente, quindi _assicurati di avere un backup_. + + La frase di recupero è `test test test test test test test test test test test junk`, la frase di recupero di test predefinita per anvil. + +5. Vai al [codice lato client](http://localhost:5173/). + +6. Connettiti al portafoglio e seleziona l'account di destinazione e l'importo. + +7. Fai clic su **Sign** (Firma) e firma la transazione. + +8. Sotto l'intestazione **Prover.toml**, troverai del testo. Sostituisci `server/noir/Prover.toml` con quel testo. + +9. Esegui la prova a conoscenza-zero. + + ```sh + cd ../server/noir + nargo execute +``` + + L'output dovrebbe essere simile a + + ``` + ori@CryptoDocGuy:~/noir/250911-zk-bank/server/noir$ nargo execute + + [zkBank] Circuit witness successfully solved + [zkBank] Witness saved to target/zkBank.gz + [zkBank] Circuit output: (0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b, 0x0cfc0a67cb7308e4e9b254026b54204e34f6c8b041be207e64c5db77d95dd82d, 0x450cf9da6e180d6159290554ae3d8787, 0x6d8bc5a15b9037e52fb59b6b98722a85) +``` + +10. Confronta gli ultimi due valori con l'hash che vedi sul browser web per vedere se il messaggio è stato sottoposto ad hash correttamente. + +#### `server/noir/Prover.toml` {#server-noir-prover-toml} + +[Questo file](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) mostra il formato delle informazioni previsto da Noir. + +```toml +message="send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 500 finney (milliEth) 0 " +``` + +Il messaggio è in formato testo, il che lo rende facile da capire per l'utente (il che è necessario al momento della firma) e da analizzare per il codice Noir. L'importo è quotato in finney per consentire trasferimenti frazionari da un lato, ed essere facilmente leggibile dall'altro. L'ultimo numero è il [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). + +La stringa è lunga 100 caratteri. Le prove a conoscenza-zero non gestiscono bene i dati di dimensioni variabili, quindi è spesso necessario riempire i dati (padding). + +```toml +pubKeyX=["0x83",...,"0x75"] +pubKeyY=["0x35",...,"0xa5"] +signature=["0xb1",...,"0x0d"] +``` + +Questi tre parametri sono array di byte a dimensione fissa. + +```toml +[[accounts]] +address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +balance=100_000 +nonce=0 + +[[accounts]] +address="0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +balance=100_000 +nonce=0 +``` + +Questo è il modo per specificare un array di strutture. Per ogni voce, specifichiamo l'indirizzo, il saldo (in milliETH, noto anche come [finney](https://cryptovalleyjournal.com/glossary/finney/)) e il valore del nonce successivo. + +#### `client/src/Transfer.tsx` {#client-src-transfer-tsx} + +[Questo file](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/client/src/Transfer.tsx) implementa l'elaborazione lato client e genera il file `server/noir/Prover.toml` (quello che include i parametri a conoscenza-zero). + +Ecco la spiegazione delle parti più interessanti. + +```tsx +export default attrs => { +``` + +Questa funzione crea il componente React `Transfer`, che altri file possono importare. + +```tsx + const accounts = [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + ] +``` + +Questi sono gli indirizzi degli account, gli indirizzi creati dalla frase di recupero `test ... test junk`. Se vuoi usare i tuoi indirizzi, modifica semplicemente questa definizione. + +```tsx + const account = useAccount() + const wallet = createWalletClient({ + transport: custom(window.ethereum!) + }) +``` + +Questi [hook di Wagmi](https://wagmi.sh/react/api/hooks) ci permettono di accedere alla libreria [viem](https://viem.sh/) e al portafoglio. + +```tsx + const message = `send ${toAccount} ${ethAmount*1000} finney (milliEth) ${nonce}`.padEnd(100, " ") +``` + +Questo è il messaggio, riempito con spazi. Ogni volta che una delle variabili [`useState`](https://react.dev/reference/react/useState) cambia, il componente viene ridisegnato e `message` viene aggiornato. + +```tsx + const sign = async () => { +``` + +Questa funzione viene chiamata quando l'utente fa clic sul pulsante **Sign**. Il messaggio viene aggiornato automaticamente, ma la firma richiede l'approvazione dell'utente nel portafoglio e non vogliamo chiederla a meno che non sia necessario. + +```tsx + const signature = await wallet.signMessage({ + account: fromAccount, + message, + }) +``` + +Chiedi al portafoglio di [firmare il messaggio](https://viem.sh/docs/accounts/local/signMessage). + +```tsx + const hash = hashMessage(message) +``` + +Ottieni l'hash del messaggio. È utile fornirlo all'utente per il debug (del codice Noir). + +```tsx + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +[Ottieni la chiave pubblica](https://viem.sh/docs/utilities/recoverPublicKey). Questo è richiesto per la funzione [`ecrecover` di Noir](https://github.com/colinnielsen/ecrecover-noir). + +```tsx + setSignature(signature) + setHash(hash) + setPubKey(pubKey) +``` + +Imposta le variabili di stato. In questo modo si ridisegna il componente (dopo l'uscita della funzione `sign`) e si mostrano all'utente i valori aggiornati. + +```tsx + let proverToml = ` +``` + +Il testo per `Prover.toml`. + +```tsx +message="${message}" + +pubKeyX=${hexToArray(pubKey.slice(4,4+2*32))} +pubKeyY=${hexToArray(pubKey.slice(4+2*32))} +``` + +Viem ci fornisce la chiave pubblica come una stringa esadecimale di 65 byte. Il primo byte è `0x04`, un marcatore di versione. Questo è seguito da 32 byte per la `x` della chiave pubblica e poi 32 byte per la `y` della chiave pubblica. + +Tuttavia, Noir si aspetta di ottenere queste informazioni come array di due byte, uno per `x` e uno per `y`. È più facile analizzarlo qui sul client piuttosto che come parte della prova a conoscenza-zero. + +Nota che questa è una buona pratica nella conoscenza-zero in generale. Il codice all'interno di una prova a conoscenza-zero è costoso, quindi qualsiasi elaborazione che può essere eseguita al di fuori della prova a conoscenza-zero _dovrebbe_ essere eseguita al di fuori della prova a conoscenza-zero. + +```tsx +signature=${hexToArray(signature.slice(2,-2))} +``` + +Anche la firma viene fornita come una stringa esadecimale di 65 byte. Tuttavia, l'ultimo byte è necessario solo per recuperare la chiave pubblica. Poiché la chiave pubblica sarà già fornita al codice Noir, non ne abbiamo bisogno per verificare la firma e il codice Noir non lo richiede. + +```tsx +${accounts.map(accountInProverToml).reduce((a,b) => a+b, "")} +` +``` + +Fornisci gli account. + +```tsx + setProverToml(proverToml) + } + + return ( + \<> +

Transfer

+``` + +Questo è il formato HTML (più precisamente, [JSX](https://react.dev/learn/writing-markup-with-jsx)) del componente. + +#### `server/noir/src/main.nr` {#server-noir-src-main-nr} + +[Questo file](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/src/main.nr) è il codice a conoscenza-zero effettivo. + +``` +use std::hash::pedersen_hash; +``` + +L'[hash di Pedersen](https://rya-sge.github.io/access-denied/2024/05/07/pedersen-hash-function/) è fornito con la [libreria standard di Noir](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#pedersen_hash). Le prove a conoscenza-zero usano comunemente questa funzione di hash. È molto più facile da calcolare all'interno dei [circuiti aritmetici](https://rareskills.io/post/arithmetic-circuit) rispetto alle funzioni di hash standard. + +``` +use keccak256::keccak256; +use dep::ecrecover; +``` + +Queste due funzioni sono librerie esterne, definite in [`Nargo.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Nargo.toml). Sono esattamente ciò per cui prendono il nome, una funzione che calcola l'[hash keccak256](https://emn178.github.io/online-tools/keccak_256.html) e una funzione che verifica le firme di Ethereum e recupera l'indirizzo Ethereum del firmatario. + +``` +global ACCOUNT_NUMBER : u32 = 5; +``` + +Noir è ispirato a [Rust](https://www.rust-lang.org/). Le variabili, per impostazione predefinita, sono costanti. È così che definiamo le costanti di configurazione globali. Nello specifico, `ACCOUNT_NUMBER` è il numero di account che memorizziamo. + +I tipi di dati denominati `u` sono quel numero di bit, senza segno. Gli unici tipi supportati sono `u8`, `u16`, `u32`, `u64` e `u128`. + +``` +global FLAT_ACCOUNT_FIELDS : u32 = 2; +``` + +Questa variabile è usata per l'hash di Pedersen degli account, come spiegato di seguito. + +``` +global MESSAGE_LENGTH : u32 = 100; +``` + +Come spiegato sopra, la lunghezza del messaggio è fissa. È specificata qui. + +``` +global ASCII_MESSAGE_LENGTH : [u8; 3] = [0x31, 0x30, 0x30]; +global HASH_BUFFER_SIZE : u32 = 26+3+MESSAGE_LENGTH; +``` + +Le [firme EIP-191](https://eips.ethereum.org/EIPS/eip-191) richiedono un buffer con un prefisso di 26 byte, seguito dalla lunghezza del messaggio in ASCII e infine dal messaggio stesso. + +``` +struct Account { + balance: u128, + address: Field, + nonce: u32, +} +``` + +Le informazioni che memorizziamo su un account. [`Field`](https://noir-lang.org/docs/noir/concepts/data_types/fields) è un numero, in genere fino a 253 bit, che può essere usato direttamente nel [circuito aritmetico](https://rareskills.io/post/arithmetic-circuit) che implementa la prova a conoscenza-zero. Qui usiamo il `Field` per memorizzare un indirizzo Ethereum a 160 bit. + +``` +struct TransferTxn { + from: Field, + to: Field, + amount: u128, + nonce: u32 +} +``` + +Le informazioni che memorizziamo per una transazione di trasferimento. + +``` +fn flatten_account(account: Account) -> [Field; FLAT_ACCOUNT_FIELDS] { +``` + +Una definizione di funzione. Il parametro è l'informazione dell'`Account`. Il risultato è un array di variabili `Field`, la cui lunghezza è `FLAT_ACCOUNT_FIELDS` + +``` + let flat = [ + account.address, + ((account.balance << 32) + account.nonce.into()).into(), + ]; +``` + +Il primo valore nell'array è l'indirizzo dell'account. Il secondo include sia il saldo che il nonce. Le chiamate `.into()` cambiano un numero nel tipo di dati che deve essere. `account.nonce` è un valore `u32`, ma per aggiungerlo a `account.balance << 32`, un valore `u128`, deve essere un `u128`. Questo è il primo `.into()`. Il secondo converte il risultato `u128` in un `Field` in modo che si adatti all'array. + +``` + flat +} +``` + +In Noir, le funzioni possono restituire un valore solo alla fine (non c'è un ritorno anticipato). Per specificare il valore di ritorno, lo valuti appena prima della parentesi di chiusura della funzione. + +``` +fn flatten_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] { +``` + +Questa funzione trasforma l'array degli account in un array `Field`, che può essere usato come input per un hash di Petersen. + +``` + let mut flat: [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] = [0; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER]; +``` + +Questo è il modo in cui specifichi una variabile mutabile, cioè _non_ una costante. Le variabili in Noir devono sempre avere un valore, quindi inizializziamo questa variabile a tutti zeri. + +``` + for i in 0..ACCOUNT_NUMBER { +``` + +Questo è un ciclo `for`. Nota che i limiti sono costanti. I cicli Noir devono avere i loro limiti noti in fase di compilazione. Il motivo è che i circuiti aritmetici non supportano il controllo del flusso. Durante l'elaborazione di un ciclo `for`, il compilatore inserisce semplicemente il codice al suo interno più volte, una per ogni iterazione. + +``` + let fields = flatten_account(accounts[i]); + for j in 0..FLAT_ACCOUNT_FIELDS { + flat[i*FLAT_ACCOUNT_FIELDS + j] = fields[j]; + } + } + + flat +} + +fn hash_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> Field { + pedersen_hash(flatten_accounts(accounts)) +} +``` + +Infine, siamo arrivati alla funzione che esegue l'hash dell'array degli account. + +``` +fn find_account(accounts: [Account; ACCOUNT_NUMBER], address: Field) -> u32 { + let mut account : u32 = ACCOUNT_NUMBER; + + for i in 0..ACCOUNT_NUMBER { + if accounts[i].address == address { + account = i; + } + } +``` + +Questa funzione trova l'account con un indirizzo specifico. Questa funzione sarebbe terribilmente inefficiente nel codice standard perché itera su tutti gli account, anche dopo aver trovato l'indirizzo. + +Tuttavia, nelle prove a conoscenza-zero, non c'è controllo del flusso. Se abbiamo mai bisogno di controllare una condizione, dobbiamo controllarla ogni volta. + +Una cosa simile accade con le istruzioni `if`. L'istruzione `if` nel ciclo sopra è tradotta in queste istruzioni matematiche. + +_condizionerisultato = accounts[i].address == address_ // uno se sono uguali, zero altrimenti + +_accountnuovo = condizionerisultato\*i + (1-condizionerisultato)\*accountvecchio_ + +```rust + assert (account < ACCOUNT_NUMBER, f"{address} does not have an account"); + + account +} +``` + +La funzione [`assert`](https://noir-lang.org/docs/dev/noir/concepts/assert) fa sì che la prova a conoscenza-zero si blocchi se l'asserzione è falsa. In questo caso, se non riusciamo a trovare un account con l'indirizzo pertinente. Per segnalare l'indirizzo, usiamo una [stringa di formato](https://noir-lang.org/docs/noir/concepts/data_types/strings#format-strings). + +```rust +fn apply_transfer_txn(accounts: [Account; ACCOUNT_NUMBER], txn: TransferTxn) -> [Account; ACCOUNT_NUMBER] { +``` + +Questa funzione applica una transazione di trasferimento e restituisce il nuovo array di account. + +```rust + let from = find_account(accounts, txn.from); + let to = find_account(accounts, txn.to); + + let (txnFrom, txnAmount, txnNonce, accountNonce) = + (txn.from, txn.amount, txn.nonce, accounts[from].nonce); +``` + +Non possiamo accedere agli elementi della struttura all'interno di una stringa di formato in Noir, quindi creiamo una copia utilizzabile. + +```rust + assert (accounts[from].balance >= txn.amount, + f"{txnFrom} does not have {txnAmount} finney"); + + assert (accounts[from].nonce == txn.nonce, + f"Transaction has nonce {txnNonce}, but the account is expected to use {accountNonce}"); +``` + +Queste sono due condizioni che potrebbero rendere non valida una transazione. + +```rust + let mut newAccounts = accounts; + + newAccounts[from].balance -= txn.amount; + newAccounts[from].nonce += 1; + newAccounts[to].balance += txn.amount; + + newAccounts +} +``` + +Crea il nuovo array di account e poi restituiscilo. + +```rust +fn readAddress(messageBytes: [u8; MESSAGE_LENGTH]) -> Field +``` + +Questa funzione legge l'indirizzo dal messaggio. + +```rust +{ + let mut result : Field = 0; + + for i in 7..47 { +``` + +L'indirizzo è sempre lungo 20 byte (ovvero 40 cifre esadecimali) e inizia dal carattere #7. + +```rust + result *= 0x10; + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + result += (messageBytes[i]-48).into(); + } + if messageBytes[i] >= 65 & messageBytes[i] <= 70 { // A-F + result += (messageBytes[i]-65+10).into() + } + if messageBytes[i] >= 97 & messageBytes[i] <= 102 { // a-f + result += (messageBytes[i]-97+10).into() + } + } + + result +} + +fn readAmountAndNonce(messageBytes: [u8; MESSAGE_LENGTH]) -> (u128, u32) +``` + +Leggi l'importo e il nonce dal messaggio. + +```rust +{ + let mut amount : u128 = 0; + let mut nonce: u32 = 0; + let mut stillReadingAmount: bool = true; + let mut lookingForNonce: bool = false; + let mut stillReadingNonce: bool = false; +``` + +Nel messaggio, il primo numero dopo l'indirizzo è l'importo di finney (ovvero un millesimo di ETH) da trasferire. Il secondo numero è il nonce. Qualsiasi testo tra di loro viene ignorato. + +```rust + for i in 48..MESSAGE_LENGTH { + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + let digit = (messageBytes[i]-48); + + if stillReadingAmount { + amount = amount*10 + digit.into(); + } + + if lookingForNonce { // L'abbiamo appena trovato + stillReadingNonce = true; + lookingForNonce = false; + } + + if stillReadingNonce { + nonce = nonce*10 + digit.into(); + } + } else { + if stillReadingAmount { + stillReadingAmount = false; + lookingForNonce = true; + } + if stillReadingNonce { + stillReadingNonce = false; + } + } + } + + (amount, nonce) +} +``` + +Restituire una [tupla](https://noir-lang.org/docs/noir/concepts/data_types/tuples) è il modo di Noir per restituire più valori da una funzione. + +```rust +fn readTransferTxn(message: str) -> TransferTxn +{ + let mut txn: TransferTxn = TransferTxn { from: 0, to: 0, amount:0, nonce:0 }; + let messageBytes = message.as_bytes(); + + txn.to = readAddress(messageBytes); + let (amount, nonce) = readAmountAndNonce(messageBytes); + txn.amount = amount; + txn.nonce = nonce; + + txn +} +``` + +Questa funzione converte il messaggio in byte, quindi converte gli importi in una `TransferTxn`. + +```rust +// L'equivalente di hashMessage di Viem +// https://viem.sh/docs/utilities/hashMessage#hashmessage +fn hashMessage(message: str) -> [u8;32] { +``` + +Siamo stati in grado di usare l'hash di Pedersen per gli account perché vengono sottoposti ad hash solo all'interno della prova a conoscenza-zero. Tuttavia, in questo codice dobbiamo controllare la firma del messaggio, che viene generata dal browser. Per farlo, dobbiamo seguire il formato di firma di Ethereum in [EIP 191](https://eips.ethereum.org/EIPS/eip-191). Ciò significa che dobbiamo creare un buffer combinato con un prefisso standard, la lunghezza del messaggio in ASCII e il messaggio stesso, e usare lo standard Ethereum keccak256 per eseguirne l'hash. + +```rust + // Prefisso ASCII + let prefix_bytes = [ + 0x19, // \x19 + 0x45, // 'E' + 0x74, // 't' + 0x68, // 'h' + 0x65, // 'e' + 0x72, // 'r' + 0x65, // 'e' + 0x75, // 'u' + 0x6D, // 'm' + 0x20, // ' ' + 0x53, // 'S' + 0x69, // 'i' + 0x67, // 'g' + 0x6E, // 'n' + 0x65, // 'e' + 0x64, // 'd' + 0x20, // ' ' + 0x4D, // 'M' + 0x65, // 'e' + 0x73, // 's' + 0x73, // 's' + 0x61, // 'a' + 0x67, // 'g' + 0x65, // 'e' + 0x3A, // ':' + 0x0A // '\n' + ]; +``` + +Per evitare casi in cui un'applicazione chiede all'utente di firmare un messaggio che può essere usato come transazione o per qualche altro scopo, l'EIP 191 specifica che tutti i messaggi firmati iniziano con il carattere 0x19 (non un carattere ASCII valido) seguito da `Ethereum Signed Message:` e una nuova riga. + +```rust + let mut buffer: [u8; HASH_BUFFER_SIZE] = [0u8; HASH_BUFFER_SIZE]; + for i in 0..26 { + buffer[i] = prefix_bytes[i]; + } + + let messageBytes : [u8; MESSAGE_LENGTH] = message.as_bytes(); + + if MESSAGE_LENGTH <= 9 { + for i in 0..1 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+1] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 10 & MESSAGE_LENGTH <= 99 { + for i in 0..2 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+2] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 100 { + for i in 0..3 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+3] = messageBytes[i]; + } + } + + assert(MESSAGE_LENGTH < 1000, "Messages whose length is over three digits are not supported"); +``` + +Gestisci lunghezze di messaggio fino a 999 e fallisci se è maggiore. Ho aggiunto questo codice, anche se la lunghezza del messaggio è una costante, perché rende più facile cambiarla. In un sistema di produzione, probabilmente presumeresti semplicemente che `MESSAGE_LENGTH` non cambi per il bene di prestazioni migliori. + +```rust + keccak256::keccak256(buffer, HASH_BUFFER_SIZE) +} +``` + +Usa la funzione standard di Ethereum `keccak256`. + +```rust +fn signatureToAddressAndHash( + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64] + ) -> (Field, Field, Field) // indirizzo, primi 16 byte dell'hash, ultimi 16 byte dell'hash +{ +``` + +Questa funzione verifica la firma, che richiede l'hash del messaggio. Ci fornisce quindi l'indirizzo che l'ha firmato e l'hash del messaggio. L'hash del messaggio è fornito in due valori `Field` perché sono più facili da usare nel resto del programma rispetto a un array di byte. + +Dobbiamo usare due valori `Field` perché i calcoli dei campi vengono eseguiti [modulo](https://en.wikipedia.org/wiki/Modulo) un numero grande, ma quel numero è in genere inferiore a 256 bit (altrimenti sarebbe difficile eseguire quei calcoli nella EVM). + +```rust + let hash = hashMessage(message); + + let mut (hash1, hash2) = (0,0); + + for i in 0..16 { + hash1 = hash1*256 + hash[31-i].into(); + hash2 = hash2*256 + hash[15-i].into(); + } +``` + +Specifica `hash1` e `hash2` come variabili mutabili e scrivi l'hash in esse byte per byte. + +```rust + ( + ecrecover::ecrecover(pubKeyX, pubKeyY, signature, hash), +``` + +Questo è simile a [`ecrecover` di Solidity](https://docs.soliditylang.org/en/v0.8.30/cheatsheet.html#mathematical-and-cryptographic-functions), con due importanti differenze: + +- Se la firma non è valida, la chiamata fallisce un `assert` e il programma viene interrotto. +- Sebbene la chiave pubblica possa essere recuperata dalla firma e dall'hash, questa è un'elaborazione che può essere eseguita esternamente e, pertanto, non vale la pena farla all'interno della prova a conoscenza-zero. Se qualcuno cerca di imbrogliarci qui, la verifica della firma fallirà. + +```rust + hash1, + hash2 + ) +} + +fn main( + accounts: [Account; ACCOUNT_NUMBER], + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64], + ) -> pub ( + Field, // Hash dell'array dei vecchi account + Field, // Hash dell'array dei nuovi account + Field, // Primi 16 byte dell'hash del messaggio + Field, // Ultimi 16 byte dell'hash del messaggio + ) +``` + +Infine, raggiungiamo la funzione `main`. Dobbiamo dimostrare di avere una transazione che modifica validamente l'hash degli account dal vecchio valore a quello nuovo. Dobbiamo anche dimostrare che ha questo specifico hash della transazione in modo che la persona che l'ha inviata sappia che la sua transazione è stata elaborata. + +```rust +{ + let mut txn = readTransferTxn(message); +``` + +Abbiamo bisogno che `txn` sia mutabile perché non leggiamo l'indirizzo del mittente dal messaggio, lo leggiamo dalla firma. + +```rust + let (fromAddress, txnHash1, txnHash2) = signatureToAddressAndHash( + message, + pubKeyX, + pubKeyY, + signature); + + txn.from = fromAddress; + + let newAccounts = apply_transfer_txn(accounts, txn); + + ( + hash_accounts(accounts), + hash_accounts(newAccounts), + txnHash1, + txnHash2 + ) +} +``` + +### Fase 2 - Aggiunta di un server {#stage-2} + +Nella seconda fase, aggiungiamo un server che riceve e implementa le transazioni di trasferimento dal browser. + +Per vederlo in azione: + +1. Ferma Vite se è in esecuzione. + +2. Scarica il ramo che include il server e assicurati di avere tutti i moduli necessari. + + ```sh + git checkout 02-add-server + cd client + npm install + cd ../server + npm install +``` + + Non c'è bisogno di compilare il codice Noir, è lo stesso codice che hai usato per la fase 1. + +3. Avvia il server. + + ```sh + npm run start +``` + +4. In una finestra della riga di comando separata, esegui Vite per servire il codice del browser. + + ```sh + cd client + npm run dev +``` + +5. Vai al codice client su [http://localhost:5173](http://localhost:5173) + +6. Prima di poter emettere una transazione, devi conoscere il nonce, così come l'importo che puoi inviare. Per ottenere queste informazioni, fai clic su **Update account data** (Aggiorna dati account) e firma il messaggio. + + Abbiamo un dilemma qui. Da un lato, non vogliamo firmare un messaggio che può essere riutilizzato (un [attacco di replay](https://en.wikipedia.org/wiki/Replay_attack)), motivo per cui vogliamo un nonce in primo luogo. Tuttavia, non abbiamo ancora un nonce. La soluzione è scegliere un nonce che può essere usato solo una volta e che abbiamo già su entrambi i lati, come l'ora corrente. + + Il problema con questa soluzione è che l'ora potrebbe non essere perfettamente sincronizzata. Quindi, invece, firmiamo un valore che cambia ogni minuto. Ciò significa che la nostra finestra di vulnerabilità agli attacchi di replay è al massimo di un minuto. Considerando che in produzione la richiesta firmata sarà protetta da TLS e che l'altro lato del tunnel---il server---può già rivelare il saldo e il nonce (deve conoscerli per funzionare), questo è un rischio accettabile. + +7. Una volta che il browser riceve indietro il saldo e il nonce, mostra il modulo di trasferimento. Seleziona l'indirizzo di destinazione e l'importo e fai clic su **Transfer** (Trasferisci). Firma questa richiesta. + +8. Per vedere il trasferimento, fai clic su **Update account data** o guarda nella finestra in cui esegui il server. Il server registra lo stato ogni volta che cambia. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 36000 finney (milliEth) 0 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 64000 (1) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 100000 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 7200 finney (milliEth) 1 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 56800 (2) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 3000 finney (milliEth) 2 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 53800 (3) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 139000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) +``` + +#### `server/index.mjs` {#server-index-mjs-1} + +[Questo file](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/index.mjs) contiene il processo del server e interagisce con il codice Noir in [`main.nr`](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/noir/src/main.nr). Ecco una spiegazione delle parti interessanti. + +```js +import { Noir } from '@noir-lang/noir_js' +``` + +La libreria [noir.js](https://www.npmjs.com/package/@noir-lang/noir_js) fa da interfaccia tra il codice JavaScript e il codice Noir. + +```js +const circuit = JSON.parse(await fs.readFile("./noir/target/zkBank.json")) +const noir = new Noir(circuit) +``` + +Carica il circuito aritmetico---il programma Noir compilato che abbiamo creato nella fase precedente---e preparati a eseguirlo. + +```js +// Forniamo informazioni sull'account solo in risposta a una richiesta firmata +const accountInformation = async signature => { + const fromAddress = await recoverAddress({ + hash: hashMessage("Get account data " + Math.floor((new Date().getTime())/60000)), + signature + }) +``` + +Per fornire le informazioni sull'account, abbiamo bisogno solo della firma. Il motivo è che sappiamo già quale sarà il messaggio e quindi l'hash del messaggio. + +```js +const processMessage = async (message, signature) => { +``` + +Elabora un messaggio ed esegui la transazione che codifica. + +```js + // Ottieni la chiave pubblica + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +Ora che eseguiamo JavaScript sul server, possiamo recuperare la chiave pubblica lì piuttosto che sul client. + +```js + let noirResult + try { + noirResult = await noir.execute({ + message, + signature: signature.slice(2,-2).match(/.{2}/g).map(x => `0x${x}`), + pubKeyX, + pubKeyY, + accounts: Accounts + }) +``` + +`noir.execute` esegue il programma Noir. I parametri sono equivalenti a quelli forniti in [`Prover.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml). Nota che i valori lunghi sono forniti come un array di stringhe esadecimali (`["0x60", "0xA7"]`), non come un singolo valore esadecimale (`0x60A7`), nel modo in cui lo fa Viem. + +```js + } catch (err) { + console.log(`Noir error: ${err}`) + throw Error("Invalid transaction, not processed") + } +``` + +Se c'è un errore, catturalo e poi trasmetti una versione semplificata al client. + +```js + Accounts[fromAccountNumber].nonce++ + Accounts[fromAccountNumber].balance -= amount + Accounts[toAccountNumber].balance += amount +``` + +Applica la transazione. Lo abbiamo già fatto nel codice Noir, ma è più facile farlo di nuovo qui piuttosto che estrarre il risultato da lì. + +```js +let Accounts = [ + { + address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + balance: 5000, + nonce: 0, + }, +``` + +La struttura iniziale di `Accounts`. + +### Fase 3 - Contratti intelligenti di Ethereum {#stage-3} + +1. Ferma i processi del server e del client. + +2. Scarica il ramo con i contratti intelligenti e assicurati di avere tutti i moduli necessari. + + ```sh + git checkout 03-smart-contracts + cd client + npm install + cd ../server + npm install +``` + +3. Esegui `anvil` in una finestra della riga di comando separata. + +4. Genera la chiave di verifica e il verificatore solidity, quindi copia il codice del verificatore nel progetto Solidity. + + ```sh + cd noir + bb write_vk -b ./target/zkBank.json -o ./target --oracle_hash keccak + bb write_solidity_verifier -k ./target/vk -o ./target/Verifier.sol + cp target/Verifier.sol ../../smart-contracts/src +``` + +5. Vai ai contratti intelligenti e imposta le variabili d'ambiente per usare la blockchain `anvil`. + + ```sh + cd ../../smart-contracts + export ETH_RPC_URL=http://localhost:8545 + ETH_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 +``` + +6. Distribuisci `Verifier.sol` e memorizza l'indirizzo in una variabile d'ambiente. + + ```sh + VERIFIER_ADDRESS=`forge create src/Verifier.sol:HonkVerifier --private-key $ETH_PRIVATE_KEY --optimize --broadcast | awk '/Deployed to:/ {print $3}'` + echo $VERIFIER_ADDRESS +``` + +7. Distribuisci il contratto `ZkBank`. + + ```sh + ZKBANK_ADDRESS=`forge create ZkBank --private-key $ETH_PRIVATE_KEY --broadcast --constructor-args $VERIFIER_ADDRESS 0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b | awk '/Deployed to:/ {print $3}'` + echo $ZKBANK_ADDRESS +``` + + Il valore `0x199..67b` è l'hash di Pederson dello stato iniziale di `Accounts`. Se modifichi questo stato iniziale in `server/index.mjs`, puoi eseguire una transazione per vedere l'hash iniziale riportato dalla prova a conoscenza-zero. + +8. Avvia il server. + + ```sh + cd ../server + npm run start +``` + +9. Esegui il client in una finestra della riga di comando diversa. + + ```sh + cd client + npm run dev +``` + +10. Esegui alcune transazioni. + +11. Per verificare che lo stato sia cambiato on-chain, riavvia il processo del server. Vedi che `ZkBank` non accetta più transazioni, perché il valore hash originale nelle transazioni differisce dal valore hash memorizzato on-chain. + + Questo è il tipo di errore previsto. + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Verification error: ContractFunctionExecutionError: The contract function "processTransaction" reverted with the following reason: + Wrong old state hash + + Contract Call: + address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + function: processTransaction(bytes _proof, bytes32[] _publicInputs) + args: (0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf00000000000000000000000000000000000000000000000b75c020998797da7800000000000000000000000000000000000000000000000 +``` + +#### `server/index.mjs` {#server-index-mjs-2} + +Le modifiche in questo file riguardano principalmente la creazione della prova effettiva e il suo invio on-chain. + +```js +import { exec } from 'child_process' +import util from 'util' + +const execPromise = util.promisify(exec) +``` + +Dobbiamo usare [il pacchetto Barretenberg](https://github.com/AztecProtocol/aztec-packages/tree/next/barretenberg) per creare la prova effettiva da inviare on-chain. Possiamo usare questo pacchetto eseguendo l'interfaccia a riga di comando (`bb`) o usando la [libreria JavaScript, `bb.js`](https://www.npmjs.com/package/@aztec/bb.js). La libreria JavaScript è molto più lenta dell'esecuzione nativa del codice, quindi usiamo [`exec`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback) qui per usare la riga di comando. + +Nota che se decidi di usare `bb.js`, devi usare una versione compatibile con la versione di Noir che stai usando. Al momento della stesura, la versione attuale di Noir (1.0.0-beta.11) usa la versione 0.87 di `bb.js`. + +```js +const zkBankAddress = process.env.ZKBANK_ADDRESS || "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +``` + +L'indirizzo qui è quello che ottieni quando inizi con un `anvil` pulito e segui le indicazioni sopra. + +```js +const walletClient = createWalletClient({ + chain: anvil, + transport: http(), + account: privateKeyToAccount("0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") +}) +``` + +Questa chiave privata è uno degli account pre-finanziati predefiniti in `anvil`. + +```js +const generateProof = async (witness, fileID) => { +``` + +Genera una prova usando l'eseguibile `bb`. + +```js + const fname = `witness-${fileID}.gz` + await fs.writeFile(fname, witness) +``` + +Scrivi il testimone (witness) in un file. + +```js + await execPromise(`bb prove -b ./noir/target/zkBank.json -w ${fname} -o ${fileID} --oracle_hash keccak --output_format fields`) +``` + +Crea effettivamente la prova. Questo passaggio crea anche un file con le variabili pubbliche, ma non ne abbiamo bisogno. Abbiamo già ottenuto quelle variabili da `noir.execute`. + +```js + const proof = "0x" + JSON.parse(await fs.readFile(`./${fileID}/proof_fields.json`)).reduce((a,b) => a+b, "").replace(/0x/g, "") +``` + +La prova è un array JSON di valori `Field`, ciascuno rappresentato come un valore esadecimale. Tuttavia, dobbiamo inviarlo nella transazione come un singolo valore `bytes`, che Viem rappresenta con una grande stringa esadecimale. Qui cambiamo il formato concatenando tutti i valori, rimuovendo tutti gli `0x` e poi aggiungendone uno alla fine. + +```js + await execPromise(`rm -r ${fname} ${fileID}`) + + return proof +} +``` + +Pulisci e restituisci la prova. + +```js +const processMessage = async (message, signature) => { + . + . + . + + const publicFields = noirResult.returnValue.map(x=>'0x' + x.slice(2).padStart(64, "0")) +``` + +I campi pubblici devono essere un array di valori a 32 byte. Tuttavia, poiché dovevamo dividere l'hash della transazione tra due valori `Field`, appare come un valore a 16 byte. Qui aggiungiamo zeri in modo che Viem capisca che in realtà sono 32 byte. + +```js + const proof = await generateProof(noirResult.witness, `${fromAddress}-${nonce}`) +``` + +Ogni indirizzo usa ogni nonce solo una volta in modo da poter usare una combinazione di `fromAddress` e `nonce` come identificatore univoco per il file del testimone e la directory di output. + +```js + try { + await zkBank.write.processTransaction([ + proof, publicFields]) + } catch (err) { + console.log(`Verification error: ${err}`) + throw Error("Can't verify the transaction onchain") + } + . + . + . +} +``` + +Invia la transazione alla catena. + +#### `smart-contracts/src/ZkBank.sol` {#smart-contracts-src-zkbank-sol} + +Questo è il codice on-chain che riceve la transazione. + +```solidity +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.21; + +import {HonkVerifier} from "./Verifier.sol"; + +contract ZkBank { + HonkVerifier immutable myVerifier; + bytes32 currentStateHash; + + constructor(address _verifierAddress, bytes32 _initialStateHash) { + currentStateHash = _initialStateHash; + myVerifier = HonkVerifier(_verifierAddress); + } +``` + +Il codice on-chain deve tenere traccia di due variabili: il verificatore (un contratto separato che viene creato da `nargo`) e l'hash dello stato corrente. + +```solidity + event TransactionProcessed( + bytes32 indexed transactionHash, + bytes32 oldStateHash, + bytes32 newStateHash + ); +``` + +Ogni volta che lo stato cambia, emettiamo un evento `TransactionProcessed`. + +```solidity + function processTransaction( + bytes calldata _proof, + bytes32[] calldata _publicFields + ) public { +``` + +Questa funzione elabora le transazioni. Ottiene la prova (come `bytes`) e gli input pubblici (come un array `bytes32`), nel formato richiesto dal verificatore (per ridurre al minimo l'elaborazione on-chain e quindi i costi del gas). + +```solidity + require(_publicInputs[0] == currentStateHash, + "Wrong old state hash"); +``` + +La prova a conoscenza-zero deve dimostrare che la transazione cambia dal nostro hash corrente a uno nuovo. + +```solidity + myVerifier.verify(_proof, _publicFields); +``` + +Chiama il contratto del verificatore per verificare la prova a conoscenza-zero. Questo passaggio annulla la transazione se la prova a conoscenza-zero è sbagliata. + +```solidity + currentStateHash = _publicFields[1]; + + emit TransactionProcessed( + _publicFields[2]<<128 | _publicFields[3], + _publicFields[0], + _publicFields[1] + ); + } +} +``` + +Se tutto è corretto, aggiorna l'hash dello stato al nuovo valore ed emetti un evento `TransactionProcessed`. + +## Abusi da parte del componente centralizzato {#abuses} + +La sicurezza delle informazioni è costituita da tre attributi: + +- _Riservatezza_, gli utenti non possono leggere informazioni che non sono autorizzati a leggere. +- _Integrità_, le informazioni non possono essere modificate se non da utenti autorizzati in modo autorizzato. +- _Disponibilità_, gli utenti autorizzati possono usare il sistema. + +Su questo sistema, l'integrità è fornita attraverso prove a conoscenza-zero. La disponibilità è molto più difficile da garantire e la riservatezza è impossibile, perché la banca deve conoscere il saldo di ogni account e tutte le transazioni. Non c'è modo di impedire a un'entità che possiede informazioni di condividere tali informazioni. + +Potrebbe essere possibile creare una banca veramente riservata usando [indirizzi stealth](https://vitalik.eth.limo/general/2023/01/20/stealth.html), ma questo va oltre lo scopo di questo articolo. + +### Informazioni false {#false-info} + +Un modo in cui il server può violare l'integrità è fornire informazioni false quando [vengono richiesti i dati](https://github.com/qbzzt/250911-zk-bank/blob/03-smart-contracts/server/index.mjs#L278-L291). + +Per risolvere questo problema, possiamo scrivere un secondo programma Noir che riceve gli account come input privato e l'indirizzo per il quale vengono richieste le informazioni come input pubblico. L'output è il saldo e il nonce di quell'indirizzo e l'hash degli account. + +Naturalmente, questa prova non può essere verificata on-chain, perché non vogliamo pubblicare nonce e saldi on-chain. Tuttavia, può essere verificata dal codice client in esecuzione nel browser. + +### Transazioni forzate {#forced-txns} + +Il meccanismo abituale per garantire la disponibilità e prevenire la censura sui L2 sono le [transazioni forzate](https://docs.optimism.io/stack/transactions/forced-transaction). Ma le transazioni forzate non si combinano con le prove a conoscenza-zero. Il server è l'unica entità che può verificare le transazioni. + +Possiamo modificare `smart-contracts/src/ZkBank.sol` per accettare transazioni forzate e impedire al server di cambiare lo stato finché non vengono elaborate. Tuttavia, questo ci espone a un semplice attacco denial-of-service. E se una transazione forzata non fosse valida e quindi impossibile da elaborare? + +La soluzione è avere una prova a conoscenza-zero che una transazione forzata non è valida. Questo dà al server tre opzioni: + +- Elaborare la transazione forzata, fornendo una prova a conoscenza-zero che è stata elaborata e il nuovo hash dello stato. +- Rifiutare la transazione forzata e fornire una prova a conoscenza-zero al contratto che la transazione non è valida (indirizzo sconosciuto, nonce errato o saldo insufficiente). +- Ignorare la transazione forzata. Non c'è modo di forzare il server a elaborare effettivamente la transazione, ma significa che l'intero sistema non è disponibile. + +#### Vincoli di disponibilità {#avail-bonds} + +In un'implementazione reale, ci sarebbe probabilmente un qualche tipo di motivo di profitto per mantenere il server in esecuzione. Possiamo rafforzare questo incentivo facendo in modo che il server pubblichi un vincolo di disponibilità che chiunque può bruciare se una transazione forzata non viene elaborata entro un certo periodo. + +### Codice Noir errato {#bad-noir-code} + +Normalmente, per far sì che le persone si fidino di un contratto intelligente, carichiamo il codice sorgente su un [esploratore di blocchi](https://eth.blockscout.com/address/0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b?tab=contract). Tuttavia, nel caso delle prove a conoscenza-zero, ciò è insufficiente. + +`Verifier.sol` contiene la chiave di verifica, che è una funzione del programma Noir. Tuttavia, quella chiave non ci dice quale fosse il programma Noir. Per avere effettivamente una soluzione fidata, devi caricare il programma Noir (e la versione che lo ha creato). Altrimenti, le prove a conoscenza-zero potrebbero riflettere un programma diverso, uno con una backdoor. + +Finché gli esploratori di blocchi non inizieranno a permetterci di caricare e verificare i programmi Noir, dovresti farlo tu stesso (preferibilmente su [IPFS](/developers/tutorials/ipfs-decentralized-ui/)). Quindi gli utenti sofisticati saranno in grado di scaricare il codice sorgente, compilarlo da soli, creare `Verifier.sol` e verificare che sia identico a quello on-chain. + +## Conclusione {#conclusion} + +Le applicazioni di tipo plasma richiedono un componente centralizzato come archiviazione delle informazioni. Questo apre a potenziali vulnerabilità ma, in cambio, ci permette di preservare la privacy in modi non disponibili sulla blockchain stessa. Con le prove a conoscenza-zero possiamo garantire l'integrità e possibilmente rendere economicamente vantaggioso per chiunque gestisca il componente centralizzato mantenere la disponibilità. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). + +## Ringraziamenti {#acknowledgements} + +- Josh Crites ha letto una bozza di questo articolo e mi ha aiutato con uno spinoso problema di Noir. + +Eventuali errori rimanenti sono di mia responsabilità. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/it/developers/tutorials/calling-a-smart-contract-from-javascript/index.md index dffdcb04b04..9b7d8ccc66c 100644 --- a/public/content/translations/it/developers/tutorials/calling-a-smart-contract-from-javascript/index.md +++ b/public/content/translations/it/developers/tutorials/calling-a-smart-contract-from-javascript/index.md @@ -1,14 +1,10 @@ --- title: Chiamare un contratto intelligente da JavaScript -description: Come chiamare la funzione di un contratto intelligente da JavaScript usando un esempio di token Dai +description: Come chiamare una funzione di un contratto intelligente da JavaScript usando un esempio con il token Dai author: jdourlens -tags: - - "transazioni" - - "frontend" - - "JavaScript" - - "web3.js" +tags: ["transazioni", "frontend", "JavaScript", "web3.js"] skill: beginner -breadcrumb: "Chiamare contratti da JS" +breadcrumb: Chiamare contratti da JS lang: it published: 2020-04-19 source: EthereumDev @@ -16,15 +12,15 @@ sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In questo tutorial vedremo come chiamare la funzione di un [Contratto Intelligente](/developers/docs/smart-contracts/) da JavaScript. Prima, bisogna leggere lo stato di un contratto intelligente (es. il saldo di un titolare di ERC20), poi modificheremo lo stato della blockchain effettuando un trasferimento di token. Dovresti esser già familiare con la [configurazione di un ambiente JS per interagire con la blockchain](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/). +In questo tutorial vedremo come chiamare una funzione di un [contratto intelligente](/developers/docs/smart-contracts/) da JavaScript. Prima leggeremo lo stato di un contratto intelligente (ad es., il saldo di un possessore di ERC20), poi modificheremo lo stato della blockchain effettuando un trasferimento di token. Dovresti avere già familiarità con la [configurazione di un ambiente JS per interagire con la blockchain](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/). -Per questo esempio, avremo a che fare con il token DAI e, per scopi di testing biforcheremo la blockchain usando ganache-cli e sbloccheremo un indirizzo che contiene già molti DAI: +Per questo esempio giocheremo con il token DAI, a scopo di test effettueremo una biforcazione della blockchain usando ganache-cli e sbloccheremo un indirizzo che ha già molti DAI: ```bash ganache-cli -f https://mainnet.infura.io/v3/[YOUR INFURA KEY] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81 ``` -Per interagire con un contratto intelligente, avremo bisogno del suo indirizzo e ABI: +Per interagire con un contratto intelligente avremo bisogno del suo indirizzo e dell'ABI: ```js const ERC20TransferABI = [ @@ -75,9 +71,9 @@ const ERC20TransferABI = [ const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f" ``` -Per questo progetto abbiamo ridotto l'ABI completa dell'ERC20 per mantenere solo la funzione `balancecOf` e `transfer`, ma puoi trovare l'[ABI completa dell'ERC20 qui](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). +Per questo progetto abbiamo ridotto l'ABI completa dell'ERC20 per mantenere solo le funzioni `balanceOf` e `transfer`, ma puoi trovare [l'ABI completa dell'ERC20 qui](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/). -Poi dobbiamo istanziare il nostro contratto intelligente: +Dobbiamo quindi istanziare il nostro contratto intelligente: ```js const web3 = new Web3("http://localhost:8545") @@ -85,7 +81,7 @@ const web3 = new Web3("http://localhost:8545") const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS) ``` -Inoltre, configureremo due indirizzi: +Imposteremo anche due indirizzi: - quello che riceverà il trasferimento e - quello che abbiamo già sbloccato che lo invierà: @@ -95,13 +91,13 @@ const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81" const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" ``` -Nella prossima parte, chiameremo la funzione `balanceOf` per recuperare l'importo corrente dei token posseduti da entrambi gli indirizzi. +Nella prossima parte chiameremo la funzione `balanceOf` per recuperare la quantità attuale di token posseduta da entrambi gli indirizzi. -## Chiamata: Leggere il valore da un contratto intelligente {#call-reading-value-from-a-smart-contract} +## Call: Leggere un valore da un contratto intelligente {#call-reading-value-from-a-smart-contract} -Il primo esempio chiamerà un metodo "constant" ed eseguirà il metodo del suo contratto intelligente nell'EVM, senza inviare alcuna transazione. Per questo leggeremo il saldo di ERC20 di un indirizzo. [Leggi il nostro articolo sui token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/). +Il primo esempio chiamerà un metodo "costante" ed eseguirà il suo metodo del contratto intelligente nella EVM senza inviare alcuna transazione. Per questo leggeremo il saldo ERC20 di un indirizzo. [Leggi il nostro articolo sui token ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/). -Puoi accedere ai metodi di un contratto intelligente istanziato per cui hai fornito l'ABI come segue: `yourContract.methods.methodname`. Usando la funzione `call` riceverai il risultato dell'esecuzione della funzione. +Puoi accedere ai metodi di un contratto intelligente istanziato per cui hai fornito l'ABI nel modo seguente: `yourContract.methods.methodname`. Usando la funzione `call` riceverai il risultato dell'esecuzione della funzione. ```js daiToken.methods.balanceOf(senderAddress).call(function (err, res) { @@ -113,11 +109,11 @@ daiToken.methods.balanceOf(senderAddress).call(function (err, res) { }) ``` -Ricorda che l'ERC20 di DAI contiene 18 cifre decimali, il che significa che devi rimuovere 18 zeri per ottenere l'importo corretto. I valori uint256 sono restituiti come stringhe, poiché JavaScript non gestisce i grandi valori numerici. Se non sai [come gestire i grandi numeri in JS consulta il nostro tutorial su bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). +Ricorda che il DAI ERC20 ha 18 decimali, il che significa che devi rimuovere 18 zeri per ottenere l'importo corretto. Gli uint256 vengono restituiti come stringhe poiché JavaScript non gestisce valori numerici grandi. Se non sei sicuro di [come gestire i grandi numeri in JS, dai un'occhiata al nostro tutorial su bignumber.js](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/). -## Invio: Inviare una transazione alla funzione di un contratto intelligente {#send-sending-a-transaction-to-a-smart-contract-function} +## Send: Inviare una transazione a una funzione di un contratto intelligente {#send-sending-a-transaction-to-a-smart-contract-function} -Per il secondo esempio, chiameremo la funzione di trasferimento del contratto intelligente di DAI per inviare 10 DAI al nostro secondo indirizzo. La funzione di trasferimento accetta due parametri: l'indirizzo del destinatario e l'importo di token da trasferire: +Per il secondo esempio chiameremo la funzione di trasferimento del contratto intelligente DAI per inviare 10 DAI al nostro secondo indirizzo. La funzione di trasferimento accetta due parametri: l'indirizzo del destinatario e la quantità di token da trasferire: ```js daiToken.methods @@ -131,6 +127,6 @@ daiToken.methods }) ``` -La funzione di chiamata restituiscec l'hash dedlla transazione che sarà minato nella blockchain. Su Ethereum, gli hash della transazione sono prevedibili, così possiamo ottenere l'hash della transazione prima che sia eseguita ([scopri qui come sono calcolati gli hash](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). +La funzione call restituisce l'hash della transazione che verrà minata nella blockchain. Su Ethereum, gli hash delle transazioni sono prevedibili: ecco come possiamo ottenere l'hash della transazione prima che venga eseguita ([scopri come vengono calcolati gli hash qui](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction)). -Poiché la funzione invia soltanto la transazione alla blockchain, non possiamo vedere il risultato finché non sappiamo quando è minato e incluso nella blockchain. Nel prossimo tutorial, impareremo [come attendedre l'esecuzione di una transazione, conoscendone l'hash](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). +Poiché la funzione invia solo la transazione alla blockchain, non possiamo vedere il risultato finché non sappiamo quando viene minata e inclusa nella blockchain. Nel prossimo tutorial impareremo [come attendere che una transazione venga eseguita sulla blockchain conoscendone l'hash](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/it/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md new file mode 100644 index 00000000000..e940de51ed2 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -0,0 +1,772 @@ +--- +title: "Creare un'interfaccia utente per il tuo contratto" +description: Utilizzando componenti moderni come TypeScript, React, Vite e Wagmi, esamineremo un'interfaccia utente moderna ma minimale e impareremo come connettere un portafoglio all'interfaccia utente, chiamare un contratto intelligente per leggere informazioni, inviare una transazione a un contratto intelligente e monitorare gli eventi da un contratto intelligente per identificare i cambiamenti. +author: Ori Pomerantz +tags: ["TypeScript", "React", "Vite", "Wagmi", "frontend"] +skill: beginner +breadcrumb: UI con WAGMI +published: 2023-11-01 +lang: it +sidebarDepth: 3 +--- + +Hai trovato una funzionalità di cui abbiamo bisogno nell'ecosistema di Ethereum. Hai scritto i contratti intelligenti per implementarla, e forse anche del codice correlato che viene eseguito fuori catena. È fantastico! Sfortunatamente, senza un'interfaccia utente non avrai alcun utente, e l'ultima volta che hai scritto un sito web le persone usavano modem dial-up e JavaScript era una novità. + +Questo articolo fa per te. Presumo che tu conosca la programmazione, e forse un po' di JavaScript e HTML, ma che le tue competenze in materia di interfacce utente siano arrugginite e obsolete. Insieme esamineremo una semplice applicazione moderna in modo che tu possa vedere come si fa al giorno d'oggi. + +## Perché è importante {#why-important} + +In teoria, potresti semplicemente far usare alle persone [Etherscan](https://sepolia.etherscan.io/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA#readContract) o [Blockscout](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=read_write_contract) per interagire con i tuoi contratti. Questo è ottimo per gli Ethereani esperti. Ma stiamo cercando di servire [un altro miliardo di persone](https://blog.ethereum.org/2021/05/07/ethereum-for-the-next-billion). Questo non accadrà senza un'ottima esperienza utente, e un'interfaccia utente amichevole ne è una parte importante. + +## Applicazione Greeter {#greeter-app} + +C'è molta teoria dietro al funzionamento delle moderne interfacce utente, e [molti ottimi siti](https://react.dev/learn/thinking-in-react) [che la spiegano](https://wagmi.sh/core/getting-started). Invece di ripetere l'ottimo lavoro svolto da quei siti, presumerò che tu preferisca imparare facendo e iniziare con un'applicazione con cui puoi giocare. Hai comunque bisogno della teoria per fare le cose, e ci arriveremo: esamineremo semplicemente file sorgente per file sorgente e discuteremo le cose man mano che le incontriamo. + +### Installazione {#installation} + +1. L'applicazione utilizza la rete di test [Sepolia](https://sepolia.dev/). Se necessario, [ottieni ETH di test di Sepolia](/developers/docs/networks/#sepolia) e [aggiungi Sepolia al tuo portafoglio](https://chainlist.org/chain/11155111). + +2. Clona il repository GitHub e installa i pacchetti necessari. + + ```sh + git clone https://github.com/qbzzt/260301-modern-ui-web3.git + cd 260301-modern-ui-web3 + npm install +``` + +3. L'applicazione utilizza punti di accesso gratuiti, che presentano limitazioni di prestazioni. Se desideri utilizzare un fornitore di [Nodi come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service/), sostituisci gli URL in [`src/wagmi.ts`](#wagmi-ts). + +4. Avvia l'applicazione. + + ```sh + npm run dev +``` + +5. Naviga all'URL mostrato dall'applicazione. Nella maggior parte dei casi, è [http://localhost:5173/](http://localhost:5173/). + +6. Puoi vedere il codice sorgente del contratto, una versione modificata del Greeter di Hardhat, [su un esploratore di blocchi](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract_code). + +### Analisi dei file {#file-walk-through} + +#### `index.html` {#index-html} + +Questo file è un boilerplate HTML standard, ad eccezione di questa riga, che importa il file di script. + +```html + +``` + +#### `src/main.tsx` {#main-tsx} + +L'estensione del file indica che si tratta di un [componente React](https://www.w3schools.com/react/react_components.asp) scritto in [TypeScript](https://www.typescriptlang.org/), un'estensione di JavaScript che supporta il [controllo dei tipi](https://en.wikipedia.org/wiki/Type_system#Type_checking). TypeScript viene compilato in JavaScript, quindi possiamo usarlo lato client. + +Questo file è spiegato principalmente nel caso in cui tu sia interessato. Di solito non si modifica questo file, ma [`src/App.tsx`](#app-tsx) e i file che importa. + +```tsx +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import React from 'react' +import ReactDOM from 'react-dom/client' +import { WagmiProvider } from 'wagmi' +``` + +Importa il codice della libreria di cui abbiamo bisogno. + +```tsx +import App from './App.tsx' +``` + +Importa il componente React che implementa l'applicazione (vedi sotto). + +```tsx +import { config } from './wagmi.ts' +``` + +Importa la configurazione di [wagmi](https://wagmi.sh/), che include la configurazione della blockchain. + +```tsx +const queryClient = new QueryClient() +``` + +Crea una nuova istanza del gestore della cache di [React Query](https://tanstack.com/query/latest/docs/framework/react/overview). Questo oggetto memorizzerà: + +- Chiamate RPC memorizzate nella cache +- Letture del contratto +- Stato di recupero in background + +Abbiamo bisogno del gestore della cache perché wagmi v3 utilizza React Query internamente. + +```tsx +ReactDOM.createRoot(document.getElementById('root')!).render( +``` + +Crea il componente React radice. Il parametro per `render` è [JSX](https://www.w3schools.com/react/react_jsx.asp), un linguaggio di estensione che utilizza sia HTML che JavaScript/TypeScript. Il punto esclamativo qui dice al componente TypeScript: "non sai che `document.getElementById('root')` sarà un parametro valido per `ReactDOM.createRoot`, ma non preoccuparti: sono lo sviluppatore e ti dico che ci sarà". + +```tsx + +``` + +L'applicazione andrà all'interno di [un componente `React.StrictMode`](https://react.dev/reference/react/StrictMode). Questo componente dice alla libreria React di inserire controlli di debug aggiuntivi, il che è utile durante lo sviluppo. + +```tsx + +``` + +L'applicazione è anche all'interno di [un componente `WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). [La libreria wagmi (we are going to make it)](https://wagmi.sh/) collega le definizioni dell'interfaccia utente React con [la libreria viem](https://viem.sh/) per scrivere un'applicazione decentralizzata su Ethereum. + +```tsx + +``` + +E infine, aggiungi un provider React Query in modo che qualsiasi componente dell'applicazione possa utilizzare le query memorizzate nella cache. + +```tsx + +``` + +Ora possiamo avere il componente per l'applicazione, che implementa effettivamente l'interfaccia utente. Il `/>` alla fine del componente dice a React che questo componente non ha alcuna definizione al suo interno, secondo lo standard XML. + +```tsx + + + , +) +``` + +Naturalmente, dobbiamo chiudere gli altri componenti. + +#### `src/App.tsx` {#app-tsx} + +```tsx +import { + useConnect, + useConnection, + useDisconnect, + useSwitchChain +} from 'wagmi' + +import { useEffect } from 'react' +import { Greeter } from './Greeter' +``` + +Importa le librerie di cui abbiamo bisogno, così come [il componente `Greeter`](#greeter-tsx). + +```tsx +const SEPOLIA_CHAIN_ID = 11155111 +``` + +L'ID della catena Sepolia. + +``` +function App() { +``` + +Questo è il modo standard per creare un componente React: definire una funzione che viene chiamata ogni volta che deve essere renderizzata. Questa funzione contiene in genere codice TypeScript o JavaScript, seguito da un'istruzione `return` che restituisce il codice JSX. + +```tsx + const connection = useConnection() +``` + +Usa [`useConnection`](https://wagmi.sh/react/api/hooks/useConnection) per ottenere informazioni relative alla connessione corrente, come l'indirizzo e il `chainId`. + +Per convenzione, in React le funzioni chiamate `use...` sono [hook](https://www.w3schools.com/react/react_hooks.asp). Queste funzioni non si limitano a restituire dati al componente; assicurano anche che venga renderizzato di nuovo (la funzione del componente viene eseguita di nuovo e il suo output sostituisce quello precedente nell'HTML) quando quei dati cambiano. + +```tsx + const { connectors, connect, status, error } = useConnect() +``` + +Usa [`useConnect`](https://wagmi.sh/react/api/hooks/useConnect) per ottenere informazioni sulla connessione del portafoglio. + +```tsx + const { disconnect } = useDisconnect() +``` + +[Questo hook](https://wagmi.sh/react/api/hooks/useDisconnect) ci fornisce la funzione per disconnetterci dal portafoglio. + +```tsx + const { switchChain } = useSwitchChain() +``` + +[Questo hook](https://wagmi.sh/react/api/hooks/useSwitchChain) ci permette di cambiare catena. + +```tsx + useEffect(() => { +``` + +L'hook di React [`useEffect`](https://react.dev/reference/react/useEffect) ti consente di eseguire una funzione ogni volta che il valore di una variabile cambia per sincronizzare un sistema esterno. + +```tsx + if (connection.status === 'connected' && + connection.chainId !== SEPOLIA_CHAIN_ID + ) { + switchChain({ chainId: SEPOLIA_CHAIN_ID }) + } +``` + +Se siamo connessi, ma non alla blockchain di Sepolia, passa a Sepolia. + +```tsx + }, [connection.status, connection.chainId]) +``` + +Esegui di nuovo la funzione ogni volta che lo stato della connessione o il chainId della connessione cambiano. + +```tsx + return ( + <> +``` + +Il JSX di un componente React _deve_ restituire un singolo componente HTML. Quando abbiamo più componenti e non abbiamo bisogno di un contenitore per avvolgerli tutti, usiamo un componente vuoto (`<> ... `) per combinarli in un singolo componente. + +```tsx +

Connection

+
+ status: {connection.status} +
+ addresses: {JSON.stringify(connection.addresses)} +
+ chainId: {connection.chainId} +
+``` + +Fornisci informazioni sulla connessione corrente. All'interno di JSX, `{}` significa valutare l'espressione come JavaScript. + +```tsx + {connection.status === 'connected' && ( +``` + +La sintassi `{ && } significa "se la condizione è `true`, valuta il valore; se non lo è, valuta `false`". + +Questo è il modo standard per inserire istruzioni if all'interno di JSX. + +```tsx +
+ +
+``` + +JSX segue lo standard XML, che è più rigoroso dell'HTML. Se un tag non ha un tag di chiusura corrispondente, _deve_ avere una barra (`/`) alla fine per terminarlo. + +Qui abbiamo due di questi tag, `` (che in realtà contiene il codice HTML che comunica con il contratto) e [`
` per una linea orizzontale](https://www.w3schools.com/tags/tag_hr.asp). + +```tsx + +
+ )} +``` + +Se l'utente fa clic su questo pulsante, chiama la funzione `disconnect`. + +```tsx + {connection.status !== 'connected' && ( +``` + +Se _non_ siamo connessi, mostra le opzioni necessarie per connettersi al portafoglio. + +```tsx +
+

Connect

+ {connectors.map((connector) => ( +``` + +In `connectors` abbiamo un elenco di connettori. Usiamo [`map`](https://www.w3schools.com/jsref/jsref_map.asp) per trasformarlo in un elenco di pulsanti JSX da visualizzare. + +```tsx + + ))} +``` + +I pulsanti del connettore. + +```tsx +
{status}
+
{error?.message}
+ +
+ )} +``` + +Fornisci informazioni aggiuntive. La sintassi dell'espressione `?.` dice a JavaScript che se la variabile è definita, valuta quel campo. Se la variabile non è definita, allora questa espressione valuta `undefined`. + +L'espressione `error.message`, quando non ci sono errori, solleverebbe un'eccezione. L'uso di `error?.message` ci consente di evitare questo problema. + +#### `src/Greeter.tsx` {#greeter-tsx} + +Questo file contiene la maggior parte delle funzionalità dell'interfaccia utente. Include definizioni che normalmente si troverebbero in più file, ma poiché si tratta di un tutorial, il programma è ottimizzato per essere facile da comprendere la prima volta, piuttosto che per le prestazioni o la facilità di manutenzione. + +```tsx +import { + useState, + useEffect, + } from 'react' +import { useChainId, + useAccount, + useReadContract, + useWriteContract, + useWatchContractEvent, + useSimulateContract + } from 'wagmi' +``` + +Usiamo queste funzioni di libreria. Anche in questo caso, sono spiegate di seguito dove vengono utilizzate. + +```tsx +import { AddressType } from 'abitype' +``` + +[La libreria `abitype`](https://abitype.dev/) ci fornisce definizioni TypeScript per vari tipi di dati di Ethereum, come [`AddressType`](https://abitype.dev/config#addresstype). + +```tsx +let greeterABI = [ + { "type": "function", "name": "greet", ... }, + { "type": "function", "name": "setGreeting", ... }, + { "type": "event", "name": "SetGreeting", ... }, +] as const // greeterABI +``` + +L'ABI per il contratto `Greeter`. +Se stai sviluppando i contratti e l'interfaccia utente contemporaneamente, normalmente li metteresti nello stesso repository e useresti l'ABI generata dal compilatore Solidity come file nella tua applicazione. Tuttavia, questo non è necessario qui perché il contratto è già sviluppato e non cambierà. + +Usiamo [`as const`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) per dire a TypeScript che questa è una _vera_ costante. Normalmente, quando specifichi in JavaScript `const x = {"a": 1}`, puoi cambiare il valore in `x`, semplicemente non puoi assegnargli un nuovo valore. + +```tsx +type AddressPerBlockchainType = { + [key: number]: AddressType +} +``` + +TypeScript è fortemente tipizzato. Usiamo questa definizione per specificare l'indirizzo in cui il contratto `Greeter` è distribuito su diverse catene. La chiave è un numero (il chainId) e il valore è un `AddressType` (un indirizzo). + +```tsx +const contractAddrs : AddressPerBlockchainType = { + // Sepolia + 11155111: '0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA' +} +``` + +L'indirizzo del contratto su [Sepolia](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract). + +##### Componente Timer {#timer-component} + +Il componente `Timer` mostra il numero di secondi trascorsi da un determinato momento. Questo è importante ai fini dell'usabilità. Quando gli utenti fanno qualcosa, si aspettano una reazione immediata. Nelle blockchain, questo è spesso impossibile perché non succede nulla finché una transazione non viene inserita in un blocco. Una soluzione è mostrare quanto tempo è trascorso da quando l'utente ha eseguito l'azione, in modo che l'utente possa decidere se il tempo richiesto è ragionevole. + +```tsx +type TimerProps = { + lastUpdate: Date +} +``` + +Il componente `Timer` accetta un parametro, `lastUpdate`, che è l'ora dell'ultima azione. + +```tsx +const Timer = ({ lastUpdate }: TimerProps) => { + const [_, setNow] = useState(new Date()) +``` + +Dobbiamo avere uno stato (una variabile legata al componente) e aggiornarlo affinché il componente funzioni correttamente. Ma non abbiamo mai bisogno di leggerlo, quindi non preoccuparti di creare una variabile. + +```tsx + useEffect(() => { + const id = setInterval(() => setNow(new Date()), 1000) + return () => clearInterval(id) + }, []) +``` + +La funzione [`setInterval`](https://www.w3schools.com/jsref/met_win_setinterval.asp) ci consente di programmare l'esecuzione periodica di una funzione. In questo caso, ogni secondo. La funzione chiama `setNow` per aggiornare lo stato, in modo che il componente `Timer` venga renderizzato di nuovo. Avvolgiamo questo all'interno di [`useEffect`](https://react.dev/reference/react/useEffect) con un elenco di dipendenze vuoto in modo che avvenga solo una volta, piuttosto che ogni volta che il componente viene renderizzato. + +```tsx + const secondsSinceUpdate = Math.floor( + (Date.now() - lastUpdate.getTime()) / 1000 + ) + + return ( + {secondsSinceUpdate} seconds ago + ) +} +``` + +Calcola il numero di secondi dall'ultimo aggiornamento e restituiscilo. + +##### Componente Greeter {#greeter-component} + +```tsx +const Greeter = () => { +``` + +Infine, arriviamo a definire il componente. + +```tsx + const chainId = useChainId() + const account = useAccount() +``` + +Informazioni sulla catena e sull'account che stiamo utilizzando, per gentile concessione di [wagmi](https://wagmi.sh/). Poiché si tratta di un hook (`use...`), il componente viene renderizzato di nuovo ogni volta che queste informazioni cambiano. + +```tsx + const greeterAddr = chainId && contractAddrs[chainId] +``` + +L'indirizzo del contratto Greeter, che è `undefined` se non abbiamo informazioni sulla catena, o se siamo su una catena senza quel contratto. + +```tsx + const readResults = useReadContract({ + address: greeterAddr, + abi: greeterABI, + functionName: "greet", // Nessun argomento + }) +``` + +[L'hook `useReadContract`](https://wagmi.sh/react/api/hooks/useReadContract) chiama la funzione `greet` del [contratto](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA?tab=contract). + +```tsx + const [ currentGreeting, setCurrentGreeting ] = + useState("Please wait while we fetch the greeting from the blockchain...") + const [ newGreeting, setNewGreeting ] = useState("") +``` + +L'hook [`useState`](https://www.w3schools.com/react/react_usestate.asp) di React ci consente di specificare una variabile di stato, il cui valore persiste da un rendering del componente all'altro. Il valore iniziale è il parametro, in questo caso la stringa vuota. + +L'hook `useState` restituisce un elenco con due valori: + +1. Il valore corrente della variabile di stato. +2. Una funzione per modificare la variabile di stato quando necessario. Poiché si tratta di un hook, ogni volta che viene chiamato il componente viene renderizzato di nuovo. + +In questo caso, stiamo utilizzando una variabile di stato per il nuovo saluto che l'utente desidera impostare. + +```tsx + const [ lastSetterAddress, setLastSetterAddress ] = useState("") +``` + +Se più utenti utilizzano lo stesso contratto contemporaneamente, potrebbero sovrascrivere i saluti degli altri. Questo sembrerebbe agli utenti come se l'applicazione non funzionasse correttamente. Se l'applicazione mostra chi ha impostato il saluto per ultimo, l'utente saprà che è stato qualcun altro e che l'applicazione funziona correttamente. + +```tsx + const [ status, setStatus ] = useState("") + const [ statusTime, setStatusTime ] = useState(new Date()) +``` + +Agli utenti piace vedere che le loro azioni hanno un effetto immediato. Tuttavia, su una blockchain, non è così. Queste variabili di stato ci consentono almeno di visualizzare qualcosa agli utenti in modo che sappiano che la loro azione è in corso. + +```tsx + useEffect(() => { + if (readResults.data) { + setCurrentGreeting(readResults.data) + setStatus("Greeting fetched from blockchain") + } + }, [readResults.data]) +``` + +Se `readResults` sopra modifica i dati e non è impostato su un valore falso (ad esempio `undefined`), aggiorna il saluto corrente a quello letto dalla blockchain. Inoltre, aggiorna lo stato. + +```tsx + useWatchContractEvent({ + address: greeterAddr, + abi: greeterABI, + eventName: 'SetGreeting', + chainId, +``` + +Ascolta gli eventi `SetGreeting`. + +```tsx + enabled: !!greeterAddr, +``` + +`!!` significa che se il valore è `false`, o un valore che viene valutato come falso, come `undefined`, `0` o una stringa vuota, l'espressione nel complesso è `false`. Per qualsiasi altro valore, è `true`. È un modo per convertire i valori in booleani, perché se non c'è `greeterAddr`, non vogliamo ascoltare gli eventi. + +```tsx + onLogs: logs => { + const greetingFromContract = logs[0].args.greeting + setCurrentGreeting(greetingFromContract) + setLastSetterAddress(logs[0].args.sender) + updateStatus("Greeting updated by event") + }, + }) +``` + +Quando vediamo i log (il che accade quando vediamo un nuovo evento), significa che il saluto è stato modificato. In tal caso, possiamo aggiornare `currentGreeting` e `lastSetterAddress` ai nuovi valori. Inoltre, vogliamo aggiornare la visualizzazione dello stato. + +```tsx + const updateStatus = (newStatus: string) => { + setStatus(newStatus) + setStatusTime(new Date()) + } +``` + +Quando aggiorniamo lo stato vogliamo fare due cose: + +1. Aggiornare la stringa di stato (`status`) +2. Aggiornare l'ora dell'ultimo aggiornamento di stato (`statusTime`) ad adesso. + +```tsx + const greetingChange = (evt) => + setNewGreeting(evt.target.value) +``` + +Questo è il gestore di eventi per le modifiche al nuovo campo di input del saluto. Potremmo specificare il tipo del parametro `evt`, ma TypeScript è un linguaggio con tipi opzionali. Poiché questa funzione viene chiamata solo una volta, in un gestore di eventi HTML, non credo sia necessario. + +```tsx + const { writeContractAsync } = useWriteContract() +``` + +La funzione per scrivere su un contratto. È simile a [`writeContracts`](https://wagmi.sh/core/api/actions/writeContracts#writecontracts), ma consente migliori aggiornamenti di stato. + +```tsx + const simulation = useSimulateContract({ + address: greeterAddr, + abi: greeterABI, + functionName: 'setGreeting', + args: [newGreeting], + account: account.address + }) +``` + +Questo è il processo per inviare una transazione blockchain dalla prospettiva del client: + +1. Invia la transazione a un nodo nella blockchain utilizzando [`eth_estimateGas`](https://docs.alchemy.com/reference/eth-estimategas). +2. Attendi una risposta dal nodo. +3. Quando viene ricevuta la risposta, chiedi all'utente di firmare la transazione tramite il portafoglio. Questo passaggio _deve_ avvenire dopo aver ricevuto la risposta del nodo perché all'utente viene mostrato il costo del gas della transazione prima di firmarla. +4. Attendi l'approvazione dell'utente. +5. Invia di nuovo la transazione, questa volta utilizzando [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction). + +È probabile che il passaggio 2 richieda una quantità di tempo percettibile, durante la quale gli utenti potrebbero chiedersi se il loro comando sia stato ricevuto dall'interfaccia utente e perché non venga ancora chiesto loro di firmare la transazione. Ciò crea una scarsa esperienza utente (UX). + +Una soluzione è inviare `eth_estimateGas` ogni volta che un parametro cambia. Quindi, quando l'utente desidera effettivamente inviare la transazione (in questo caso premendo **Update greeting**), il costo del gas è noto e l'utente può vedere immediatamente la pagina del portafoglio. + +```tsx + return ( +``` + +Ora possiamo finalmente creare l'HTML effettivo da restituire. + +```tsx + <> +

Greeter

+ {currentGreeting} +``` + +Mostra il saluto corrente. + +```tsx + {lastSetterAddress && ( +

Last updated by { + lastSetterAddress === account.address ? "you" : lastSetterAddress + }

+ )} +``` + +Se sappiamo chi ha impostato il saluto per ultimo, visualizza tali informazioni. `Greeter` non tiene traccia di queste informazioni e non vogliamo guardare indietro per gli eventi `SetGreeting`, quindi le otteniamo solo una volta che il saluto viene modificato mentre siamo in esecuzione. + +```tsx +
+ +
+``` + +Questo è il campo di testo di input in cui l'utente può impostare un nuovo saluto. Ogni volta che l'utente preme un tasto, chiamiamo `greetingChange`, che chiama `setNewGreeting`. Poiché `setNewGreeting` proviene da `useState`, fa sì che il componente `Greeter` venga renderizzato di nuovo. Questo significa che: + +- Dobbiamo specificare `value` per mantenere il valore del nuovo saluto, perché altrimenti tornerebbe al valore predefinito, la stringa vuota. +- Anche `simulation` viene aggiornato ogni volta che `newGreeting` cambia, il che significa che otterremo una simulazione con il saluto corretto. Questo potrebbe essere rilevante perché il costo del gas dipende dalla dimensione dei dati della chiamata, che dipende dalla lunghezza della stringa. + +```tsx + + +``` + +`writeContractAsync` restituisce un valore solo dopo che la transazione è stata effettivamente inviata. Questo ci consente di mostrare all'utente da quanto tempo la transazione è in attesa di essere inclusa nella blockchain. + +```tsx +

Status: {status}

+

Updated

+ + ) +} +``` + +Mostra lo stato e da quanto tempo è stato aggiornato. + +``` +export {Greeter} +``` + +Esporta il componente. + +#### `src/wagmi.ts` {#wagmi-ts} + +Infine, varie definizioni relative a wagmi si trovano in `src/wagmi.ts`. Non spiegherò tutto qui, perché la maggior parte è boilerplate che difficilmente avrai bisogno di cambiare. + +```ts +import { http, webSocket, createConfig, fallback } from 'wagmi' +import { sepolia } from 'wagmi/chains' +import { injected } from 'wagmi/connectors' + +export const config = createConfig({ + chains: [sepolia], +``` + +La configurazione di wagmi include le catene supportate da questa applicazione. Puoi vedere l'[elenco delle catene disponibili](https://wagmi.sh/core/api/chains). + +```ts + connectors: [ + injected(), + ], +``` + +[Questo connettore](https://wagmi.sh/core/api/connectors/injected) ci consente di comunicare con un portafoglio installato nel browser. + +```ts + transports: { + [sepolia.id]: http() +``` + +L'endpoint HTTP predefinito fornito con Viem è sufficiente. Se vogliamo un URL diverso, possiamo usare `http("https:// hostname ")` o `webSocket("wss:// hostname ")`. + +```ts + }, + multiInjectedProviderDiscovery: false, +}) +``` + +## Aggiungere un'altra blockchain {#add-blockchain} + +Al giorno d'oggi ci sono molte [soluzioni di scalabilità di livello 2](https://ethereum.org/layer-2/), e potresti voler supportarne alcune che viem non supporta ancora. Per farlo, modifica `src/wagmi.ts`. Queste istruzioni spiegano come aggiungere [Optimism Sepolia](https://chainlist.org/chain/11155420). + +1. Modifica `src/wagmi.ts` + + A. Importa il tipo `defineChain` da viem. + + ```ts + import { defineChain } from 'viem' +``` + + B. Aggiungi la definizione della rete. Non hai davvero bisogno di farlo per Optimism Sepolia, [è già in `viem`](https://github.com/wevm/viem/blob/main/src/chains/definitions/optimismSepolia.ts), ma in questo modo impari come aggiungere una blockchain che non è in `viem`. + + ```ts + const optimismSepolia = defineChain({ + id: 11_155_420, + name: 'OP Sepolia', + nativeCurrency: { name: 'Sepolia Ether', symbol: 'ETH', decimals: 18 }, + rpcUrls: { + default: { + http: ['https://sepolia.optimism.io'], + webSocket: ['wss://optimism-sepolia.drpc.org'], + }, + }, + blockExplorers: { + default: { + name: 'Blockscout', + url: 'https://optimism-sepolia.blockscout.com', + apiUrl: 'https://optimism-sepolia.blockscout.com/api', + } + }, + }) +``` + + C. Aggiungi la nuova catena alla chiamata `createConfig`. + + ```ts + export const config = createConfig({ + chains: [sepolia, optimismSepolia], + connectors: [ + injected(), + ], + transports: { + [optimismSepolia.id]: http(), + [sepolia.id]: http() + }, + multiInjectedProviderDiscovery: false, + }) +``` + +2. Modifica `src/App.tsx` per commentare il passaggio automatico a Sepolia. Su un sistema di produzione, probabilmente mostreresti pulsanti con collegamenti a ciascuna delle blockchain che supporti. + + ```ts + /* useEffect(() => { + if (connection.status === 'connected' && + connection.chainId !== SEPOLIA_CHAIN_ID + ) { + switchChain({ chainId: SEPOLIA_CHAIN_ID }) + } + }, [connection.status, connection.chainId]) */ + + + + + + + + + +``` + +3. Modifica `src/Greeter.tsx` per assicurarti che l'applicazione conosca l'indirizzo dei tuoi contratti sulla nuova rete. + + ```ts + const contractAddrs: AddressPerBlockchainType = { + // Optimism Sepolia + 11155420: "0x4dd85791923E9294E934271522f63875EAe5806f", + + // Sepolia + 11155111: "0x7143d5c190F048C8d19fe325b748b081903E3BF0", + } +``` + +4. Nel tuo browser. + + A. Naviga su [ChainList](https://chainlist.org/chain/11155420?testnets=true) e fai clic su uno dei pulsanti sul lato destro della tabella per aggiungere la catena al tuo portafoglio. + + B. Nell'applicazione, fai clic su **Disconnect** e poi riconnettiti per cambiare la blockchain. Ci sono modi più eleganti per gestirlo, ma richiederebbero modifiche all'applicazione. + +## Conclusione {#conclusion} + +Naturalmente, non ti interessa davvero fornire un'interfaccia utente per `Greeter`. Vuoi creare un'interfaccia utente per i tuoi contratti. Per creare la tua applicazione, esegui questi passaggi: + +1. Specifica di creare un'applicazione wagmi. + + ```sh copy + npm create wagmi +``` + +2. Digita `y` per procedere. + +3. Dai un nome all'applicazione. + +4. Seleziona il framework **React**. + +5. Seleziona la variante **Vite**. + +Ora vai e rendi i tuoi contratti utilizzabili per il mondo intero. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/it/developers/tutorials/deploying-your-first-smart-contract/index.md index 85a1b1209b4..3e3be9f5d13 100644 --- a/public/content/translations/it/developers/tutorials/deploying-your-first-smart-contract/index.md +++ b/public/content/translations/it/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -1,14 +1,10 @@ --- -title: Distribuzione del primo Smart Contract -description: Introduzione alla distribuzione del primo Smart Contract su una rete di prova Ethereum +title: Distribuire il tuo primo contratto intelligente +description: Un'introduzione alla distribuzione del tuo primo contratto intelligente su una rete di test di Ethereum author: "jdourlens" -tags: - - "smart contract" - - "remix" - - "Solidity" - - "distribuzione" +tags: ["contratti intelligenti", "Remix", "Solidity", "distribuzione"] skill: beginner -breadcrumb: "Primo contratto" +breadcrumb: Distribuisci il primo contratto lang: it published: 2020-04-03 source: EthereumDev @@ -16,15 +12,15 @@ sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -Sicuramente sarai entusiasta almeno quanto noi di [distribuire](/developers/docs/smart-contracts/deploying/) il tuo primo [Smart Contract](/developers/docs/smart-contracts/) e interagirvi sulla blockchain Ethereum. +Immagino che tu sia entusiasta quanto noi di [distribuire](/developers/docs/smart-contracts/deploying/) e interagire con il tuo primo [contratto intelligente](/developers/docs/smart-contracts/) sulla blockchain di Ethereum. -Non preoccuparti, essendo il nostro primo smart contract, lo distribuiremo su una [rete locale di prova](/developers/docs/networks/) così che non ti costi nulla distribuirlo e giocarci quanto vuoi. +Non preoccuparti, dato che è il nostro primo contratto intelligente, lo distribuiremo su una [rete di test locale](/developers/docs/networks/) in modo che non ti costi nulla distribuirlo e giocarci quanto vuoi. -## Scrittura del contratto {#writing-our-contract} +## Scrivere il nostro contratto {#writing-our-contract} -Il primo passaggio consiste nel [visitare Remix](https://remix.ethereum.org/) e creare un nuovo file. Nella parte in alto a sinistra dell'interfaccia di Remix, aggiungi un nuovo file e inserisci il nome che preferisci. +Il primo passo è [visitare Remix](https://remix.ethereum.org/) e creare un nuovo file. Nella parte in alto a sinistra dell'interfaccia di Remix, aggiungi un nuovo file e inserisci il nome del file che desideri. -![Aggiunta di un nuovo file all'interfaccia di Remix](./remix.png) +![Aggiungere un nuovo file nell'interfaccia di Remix](./remix.png) Nel nuovo file, incolleremo il seguente codice. @@ -34,15 +30,15 @@ pragma solidity >=0.5.17; contract Counter { - // Public variable of type unsigned int to keep the number of counts + // Variabile pubblica di tipo unsigned int per mantenere il numero di conteggi uint256 public count = 0; - // Function that increments our counter + // Funzione che incrementa il nostro contatore function increment() public { count += 1; } - // Not necessary getter to get the count value + // Getter non necessario per ottenere il valore del conteggio function getCount() public view returns (uint256) { return count; } @@ -50,51 +46,51 @@ contract Counter { } ``` -Se sei familiare con la programmazione, puoi facilmente intuire cosa faccia questo programma. Ecco una spiegazione riga per riga: +Se sei abituato a programmare, puoi facilmente intuire cosa fa questo programma. Ecco una spiegazione riga per riga: -- Riga 4: definiamo un contratto con il nome `Counter`. -- Riga 7: il nostro contratto memorizza un numero intero senza firma `count` a partire da 0. -- Riga 10: la prima funzione modificherà lo stato del contratto e incrementerà (`increment()`) la nostra variabile `count`. -- Riga 15: la seconda funzione è solo un getter per leggere il valore della variabile `count` al di fuori dello Smart Contract. Nota che, dato che abbiamo definito la variabile `count` come pubblica, questo non è necessario. Lo indichiamo come esempio. +- Riga 4: Definiamo un contratto con il nome `Counter`. +- Riga 7: Il nostro contratto memorizza un intero senza segno chiamato `count` che parte da 0. +- Riga 10: La prima funzione modificherà lo stato del contratto e incrementerà (`increment()`) la nostra variabile `count`. +- Riga 15: La seconda funzione è solo un getter per poter leggere il valore della variabile `count` all'esterno del contratto intelligente. Nota che, poiché abbiamo definito la nostra variabile `count` come pubblica, questo non è necessario ma viene mostrato come esempio. -Questo è tutto per il nostro primo semplice Smart Contract. Come forse saprai, somiglia un po' un linguaggio di OOP (Programmazione Orientata agli Oggetti), come Java o C++. Ora è il momento di sperimentare con il contratto. +Questo è tutto per il nostro primo semplice contratto intelligente. Come forse saprai, assomiglia a una classe dei linguaggi OOP (Programmazione Orientata agli Oggetti) come Java o C++. Ora è il momento di giocare con il nostro contratto. -## Distribuzione del contratto {#deploying-our-contract} +## Distribuire il nostro contratto {#deploying-our-contract} -Una volta scritto il nostro primo Smart Contract, è il momento di distribuirlo sulla blockchain per potervi interagire. +Poiché abbiamo scritto il nostro primissimo contratto intelligente, ora lo distribuiremo sulla blockchain per poterci giocare. -[Distribuire il primo Smart Contract sulla blockchain](/developers/docs/smart-contracts/deploying/) significa semplicemente inviare una transazione contenente il codice dello Smart Contract compilato senza specificare nessun destinatario. +[Distribuire il contratto intelligente sulla blockchain](/developers/docs/smart-contracts/deploying/) in realtà consiste solo nell'inviare una transazione contenente il codice del contratto intelligente compilato senza specificare alcun destinatario. -Dovremo per prima cosa [compilare il contratto](/developers/docs/smart-contracts/compiling/) facendo clic sull'icona di compilazione sul lato sinistro: +Per prima cosa [compileremo il contratto](/developers/docs/smart-contracts/compiling/) cliccando sull'icona di compilazione sul lato sinistro: -![L'icona compile nella toolbar di Remix](./remix-compile-button.png) +![L'icona di compilazione nella barra degli strumenti di Remix](./remix-compile-button.png) -Poi facciamo clic sul pulsante di compilazione: +Quindi clicca sul pulsante di compilazione: -![Il pulsante compile nel compilatore Solidity di Remix](./remix-compile.png) +![Il pulsante di compilazione nel compilatore Solidity di Remix](./remix-compile.png) Puoi scegliere di selezionare l'opzione "Auto compile" in modo che il contratto venga sempre compilato quando salvi il contenuto nell'editor di testo. -Poi passa alla schermata per la distribuzione e l'esecuzione delle transazioni: +Quindi naviga alla schermata "deploy and run transactions" (distribuisci ed esegui transazioni): -![L'icona deploy nella toolbar di Remix](./remix-deploy.png) +![L'icona di distribuzione nella barra degli strumenti di Remix](./remix-deploy.png) -Una volta sulla schermata di distribuzione ed esecuzione, controlla bene che appaia il nome del tuo contratto e fai clic su Deploy. Come puoi vedere in alto nella pagina, l'ambiente corrente è "JavaScript VM", che significa che distribuiremo il nostro Smart Contract e interagiremo con esso su una blockchain di test locale per poter effettuare test in modo più veloce e senza commissioni. +Una volta che sei nella schermata "deploy and run transactions", controlla che appaia il nome del tuo contratto e clicca su Deploy. Come puoi vedere in cima alla pagina, l'ambiente attuale è "JavaScript VM", il che significa che distribuiremo e interagiramo con il nostro contratto intelligente su una blockchain di test locale per poter testare più velocemente e senza alcuna commissione. -![Il pulsante deploy nel compilatore Solidity di Remix](./remix-deploy-button.png) +![Il pulsante di distribuzione nel compilatore Solidity di Remix](./remix-deploy-button.png) -Una volta fatto clic sul pulsante "Deploy", il tuo contratto apparirà nella parte inferiore. Fai clic sulla freccia a sinistra per espanderlo, così da vederne il contenuto. Questa è la nostra variabile `counter`, la nostra funzione `increment()` e il getter `getCounter()`. +Una volta cliccato il pulsante "Deploy", vedrai apparire il tuo contratto in basso. Clicca sulla freccia a sinistra per espanderlo in modo da vedere il contenuto del nostro contratto. Questa è la nostra variabile `counter`, la nostra funzione `increment()` e il getter `getCounter()`. -Se fai clic sul pulsante `count` o `getCount`, verrà recuperato e mostrato il contenuto della variabile `count` del contratto. Dato che non abbiamo ancora chiamato la funzione `increment`, questa dovrebbe indicare 0. +Se clicchi sul pulsante `count` o `getCount`, recupererà effettivamente il contenuto della variabile `count` del contratto e lo visualizzerà. Poiché non abbiamo ancora chiamato la funzione `increment`, dovrebbe visualizzare 0. -![Il pulsante function nel compilatore Solidity di Remix](./remix-function-button.png) +![Il pulsante della funzione nel compilatore Solidity di Remix](./remix-function-button.png) -Chiamiamo ora la funzione `increment` facendo clic sul pulsante. Appariranno i log delle transazioni nella parte inferiore della finestra. Vedrai che i log sono diversi quando premi il pulsante per recuperare i dati invece del pulsante `increment`. Questo perché leggere dati sulla blockchain non richiede alcuna transazione (scrittura) o commissione. Perché una transazione è richiesta solo quando si modifica lo stato della blockchain: +Chiamiamo ora la funzione `increment` cliccando sul pulsante. Vedrai i log delle transazioni effettuate apparire nella parte inferiore della finestra. Vedrai che i log sono diversi quando premi il pulsante per recuperare i dati invece del pulsante `increment`. Questo perché la lettura dei dati sulla blockchain non richiede alcuna transazione (scrittura) o commissione. Perché solo la modifica dello stato della blockchain richiede di effettuare una transazione: -![Un log delle transazioni](./transaction-log.png) +![Un log di transazioni](./transaction-log.png) -Dopo aver scelto il pulsante increment che genererà una transazione per chiamare la funzione `increment()`, se facciamo clic di nuovo sui pulsanti count o getCount, leggiamo lo stato aggiornato del nostro Smart Contract con la variabile count maggiore di 0. +Dopo aver premuto il pulsante di incremento che genererà una transazione per chiamare la nostra funzione `increment()`, se clicchiamo di nuovo sui pulsanti count o getCount leggeremo il nuovo stato aggiornato del nostro contratto intelligente con la variabile count maggiore di 0. -![Il nuovo stato dello Smart Contract aggiornato](./updated-state.png) +![Nuovo stato aggiornato del contratto intelligente](./updated-state.png) -Nel prossimo tutorial spiegheremo [come aggiungere eventi agli Smart Contract](/developers/tutorials/logging-events-smart-contracts/). Avere un log degli eventi è un modo comodo per eseguire il debug di uno Smart Contract e per capire cosa succede quando si chiama una funzione. +Nel prossimo tutorial, tratteremo [come puoi aggiungere eventi ai tuoi contratti intelligenti](/developers/tutorials/logging-events-smart-contracts/). La registrazione degli eventi è un modo conveniente per eseguire il debug del tuo contratto intelligente e capire cosa sta succedendo durante la chiamata di una funzione. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/it/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md new file mode 100644 index 00000000000..654c53b4004 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -0,0 +1,373 @@ +--- +title: Come sviluppare e testare una dApp su una rete di test locale multi-client +description: "Questa guida ti illustrerà prima come istanziare e configurare una rete di test locale di Ethereum multi-client prima di utilizzare la rete di test per distribuire e testare una dApp." +author: "Tedi Mitiku" +tags: + [ + "client", + "nodi", + "contratti intelligenti", + "componibilità", + "livello di consenso", + "livello di esecuzione", + "test", + ] +skill: intermediate +breadcrumb: Rete di test multi-client +lang: it +published: 2023-04-11 +--- + +## Introduzione {#introduction} + +Questa guida ti accompagna nel processo di istanziazione di una rete di test locale e configurabile di Ethereum, di distribuzione di un contratto intelligente su di essa e di utilizzo della rete di test per eseguire test sulla tua dApp. Questa guida è progettata per gli sviluppatori di dApp che desiderano sviluppare e testare le proprie dApp localmente su diverse configurazioni di rete prima di distribuirle su una rete di test attiva o sulla rete principale. + +In questa guida, potrai: + +- Istanziare una rete di test locale di Ethereum con l'[`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) utilizzando [Kurtosis](https://www.kurtosis.com/), +- Connettere il tuo ambiente di sviluppo di dApp Hardhat alla rete di test locale per compilare, distribuire e testare una dApp, e +- Configurare la rete di test locale, inclusi parametri come il numero di nodi e specifici abbinamenti di client EL/CL, per abilitare flussi di lavoro di sviluppo e test su varie configurazioni di rete. + +### Cos'è Kurtosis? {#what-is-kurtosis} + +[Kurtosis](https://www.kurtosis.com/) è un sistema di compilazione componibile progettato per configurare ambienti di test multi-container. Consente specificamente agli sviluppatori di creare ambienti riproducibili che richiedono logiche di configurazione dinamiche, come le reti di test blockchain. + +In questa guida, l'eth-network-package di Kurtosis avvia una rete di test locale di Ethereum con supporto per il client del livello di esecuzione (EL) [`geth`](https://geth.ethereum.org/), oltre ai client del livello di consenso (CL) [`teku`](https://consensys.io/teku), [`lighthouse`](https://lighthouse.sigmaprime.io/) e [`lodestar`](https://lodestar.chainsafe.io/). Questo pacchetto funge da alternativa configurabile e componibile alle reti in framework come Hardhat Network, Ganache e Anvil. Kurtosis offre agli sviluppatori un maggiore controllo e flessibilità sulle reti di test che utilizzano, che è uno dei motivi principali per cui la [Fondazione Ethereum ha utilizzato Kurtosis per testare il Merge](https://www.kurtosis.com/blog/testing-the-ethereum-merge) e continua a utilizzarlo per testare gli aggiornamenti della rete. + +## Configurare Kurtosis {#setting-up-kurtosis} + +Prima di procedere, assicurati di aver: + +- [Installato e avviato il motore Docker](https://docs.kurtosis.com/install/#i-install--start-docker) sulla tua macchina locale +- [Installato la CLI di Kurtosis](https://docs.kurtosis.com/install#ii-install-the-cli) (o aggiornata all'ultima versione, se hai già installato la CLI) +- Installato [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable) e [npx](https://www.npmjs.com/package/npx) (per il tuo ambiente dApp) + +## Istanziare una rete di test locale di Ethereum {#instantiate-testnet} + +Per avviare una rete di test locale di Ethereum, esegui: + +```python +kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package +``` + +Nota: questo comando nomina la tua rete: "local-eth-testnet" utilizzando il flag `--enclave`. + +Kurtosis stamperà i passaggi che sta eseguendo in background mentre lavora per interpretare, convalidare e quindi eseguire le istruzioni. Alla fine, dovresti vedere un output simile al seguente: + +```python +INFO[2023-04-04T18:09:44-04:00] ====================================================== +INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-04T18:09:44-04:00] ====================================================== +Name: local-eth-testnet +UUID: 39372d756ae8 +Status: RUNNING +Creation Time: Tue, 04 Apr 2023 18:09:03 EDT + +========================================= Files Artifacts ========================================= +UUID Name +d4085a064230 cl-genesis-data +1c62cb792e4c el-genesis-data +bd60489b73a7 genesis-generation-config-cl +b2e593fe5228 genesis-generation-config-el +d552a54acf78 geth-prefunded-keys +5f7e661eb838 prysm-password +054e7338bb59 validator-keystore-0 + +========================================== User Services ========================================== +UUID Name Ports Status +e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> RUNNING + metrics: 5054/tcp -> + tcp-discovery: 9000/tcp -> 127.0.0.1:54263 + udp-discovery: 9000/udp -> 127.0.0.1:60470 +a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING + metrics: 5064/tcp -> +d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING + rpc: 8545/tcp -> 127.0.0.1:54251 + tcp-discovery: 30303/tcp -> 127.0.0.1:54254 + udp-discovery: 30303/udp -> 127.0.0.1:53834 + ws: 8546/tcp -> 127.0.0.1:54252 +514a829c0a84 prelaunch-data-generator-1680646157905431468 STOPPED +62bd62d0aa7a prelaunch-data-generator-1680646157915424301 STOPPED +05e9619e0e90 prelaunch-data-generator-1680646157922872635 STOPPED + +``` + +Congratulazioni! Hai utilizzato Kurtosis per istanziare una rete di test locale di Ethereum, con un client CL (`lighthouse`) ed EL (`geth`), su Docker. + +### Revisione {#review-instantiate-testnet} + +In questa sezione, hai eseguito un comando che ha indicato a Kurtosis di utilizzare l'[`eth-network-package` ospitato in remoto su GitHub](https://github.com/kurtosis-tech/eth-network-package) per avviare una rete di test locale di Ethereum all'interno di un'[Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/) di Kurtosis. All'interno della tua enclave, troverai sia "artefatti di file" che "servizi utente". + +Gli [Artefatti di File](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) nella tua enclave includono tutti i dati generati e utilizzati per avviare i client EL e CL. I dati sono stati creati utilizzando il servizio `prelaunch-data-generator` creato da questa [immagine Docker](https://github.com/ethpandaops/ethereum-genesis-generator) + +I servizi utente mostrano tutti i servizi containerizzati operativi nella tua enclave. Noterai che è stato creato un singolo nodo, che presenta sia un client EL che un client CL. + +## Connettere il tuo ambiente di sviluppo di dApp alla rete di test locale di Ethereum {#connect-your-dapp} + +### Configurare l'ambiente di sviluppo della dApp {#set-up-dapp-env} + +Ora che hai una rete di test locale in esecuzione, puoi connettere il tuo ambiente di sviluppo di dApp per utilizzare la tua rete di test locale. Il framework Hardhat verrà utilizzato in questa guida per distribuire una dApp di blackjack sulla tua rete di test locale. + +Per configurare il tuo ambiente di sviluppo di dApp, clona il repository che contiene la nostra dApp di esempio e installa le sue dipendenze, esegui: + +```python +git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn +``` + +La cartella [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) utilizzata qui contiene la configurazione tipica per uno sviluppatore di dApp che utilizza il framework [Hardhat](https://hardhat.org/): + +- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts) contiene alcuni semplici contratti intelligenti per una dApp di Blackjack +- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts) contiene uno script per distribuire un contratto di token sulla tua rete locale di Ethereum +- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test) contiene un semplice test .js per il tuo contratto di token per confermare che ogni giocatore nella nostra dApp di Blackjack abbia 1000 token coniati per loro +- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) configura la tua installazione di Hardhat + +### Configurare Hardhat per utilizzare la rete di test locale {#configure-hardhat} + +Con il tuo ambiente di sviluppo di dApp configurato, ora connetterai Hardhat per utilizzare la rete di test locale di Ethereum generata utilizzando Kurtosis. Per farlo, sostituisci `<$YOUR_PORT>` nella struttura `localnet` nel tuo file di configurazione `hardhat.config.ts` con la porta dell'URI RPC in output da qualsiasi servizio `el-client-`. In questo caso di esempio, la porta sarebbe `64248`. La tua porta sarà diversa. + +Esempio in `hardhat.config.ts`: + +```js +localnet: { +url: 'http://127.0.0.1:<$YOUR_PORT>', // TODO: SOSTITUISCI $YOUR_PORT CON LA PORTA DI UN URI DEL NODO PRODOTTO DAL PACCHETTO ETH NETWORK KURTOSIS + +// Queste sono chiavi private associate ad account di test prefinanziati creati dall'eth-network-package +// +accounts: [ + "ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2", + "48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567", + "7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31", + "b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35", + "df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f", + "7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6", + ], +}, +``` + +Una volta salvato il file, il tuo ambiente di sviluppo di dApp Hardhat è ora connesso alla tua rete di test locale di Ethereum! Puoi verificare che la tua rete di test funzioni eseguendo: + +```python +npx hardhat balances --network localnet +``` + +L'output dovrebbe essere simile a questo: + +```python +0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000 +0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000 +0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000 +0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000 +0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000 +0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000 +``` + +Questo conferma che Hardhat sta utilizzando la tua rete di test locale e rileva gli account prefinanziati creati dall'`eth-network-package`. + +### Distribuire e testare la tua dApp localmente {#deploy-and-test-dapp} + +Con l'ambiente di sviluppo della dApp completamente connesso alla rete di test locale di Ethereum, ora puoi eseguire flussi di lavoro di sviluppo e test sulla tua dApp utilizzando la rete di test locale. + +Per compilare e distribuire il contratto intelligente `ChipToken.sol` per la prototipazione e lo sviluppo locale, esegui: + +```python +npx hardhat compile +npx hardhat run scripts/deploy.ts --network localnet +``` + +L'output dovrebbe essere simile a: + +```python +ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d +``` + +Ora prova a eseguire il test `simple.js` sulla tua dApp locale per confermare che ogni giocatore nella nostra dApp di Blackjack abbia 1000 token coniati per loro: + +L'output dovrebbe essere simile a questo: + +```python +npx hardhat test --network localnet +``` + +L'output dovrebbe essere simile a questo: + +```python +ChipToken + mint + ✔ should mint 1000 chips for PLAYER ONE + + 1 passing (654ms) +``` + +### Revisione {#review-dapp-workflows} + +A questo punto, hai configurato un ambiente di sviluppo di dApp, lo hai connesso a una rete locale di Ethereum creata da Kurtosis e hai compilato, distribuito ed eseguito un semplice test sulla tua dApp. + +Ora esploriamo come puoi configurare la rete sottostante per testare le nostre dApp in diverse configurazioni di rete. + +## Configurare la rete di test locale di Ethereum {#configure-testnet} + +### Modificare le configurazioni dei client e il numero di nodi {#configure-client-config-and-num-nodes} + +La tua rete di test locale di Ethereum può essere configurata per utilizzare diverse coppie di client EL e CL, oltre a un numero variabile di nodi, a seconda dello scenario e della specifica configurazione di rete che desideri sviluppare o testare. Ciò significa che, una volta configurata, puoi avviare una rete di test locale personalizzata e utilizzarla per eseguire gli stessi flussi di lavoro (distribuzione, test, ecc.) in varie configurazioni di rete per assicurarti che tutto funzioni come previsto. Per saperne di più sugli altri parametri che puoi modificare, visita questo link. + +Fai una prova! Puoi passare varie opzioni di configurazione all'`eth-network-package` tramite un file JSON. Questo file JSON dei parametri di rete fornisce le configurazioni specifiche che Kurtosis utilizzerà per configurare la rete locale di Ethereum. + +Prendi il file di configurazione predefinito e modificalo per avviare due nodi con diverse coppie EL/CL: + +- Nodo 1 con `geth`/`lighthouse` +- Nodo 2 con `geth`/`lodestar` +- Nodo 3 con `geth`/`teku` + +Questa configurazione crea una rete eterogenea di implementazioni di nodi Ethereum per testare la tua dApp. Il tuo file di configurazione dovrebbe ora apparire così: + +```yaml +{ + "participants": + [ + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lighthouse", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lodestar", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "teku", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + ], + "network_params": + { + "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete", + "num_validator_keys_per_node": 64, + "network_id": "3151908", + "deposit_contract_address": "0x4242424242424242424242424242424242424242", + "seconds_per_slot": 12, + "genesis_delay": 120, + "capella_fork_epoch": 5, + }, +} +``` + +Ogni struttura `participants` è mappata a un nodo nella rete, quindi 3 strutture `participants` diranno a Kurtosis di avviare 3 nodi nella tua rete. Ogni struttura `participants` ti consentirà di specificare la coppia EL e CL utilizzata per quel nodo specifico. + +La struttura `network_params` configura le impostazioni di rete che vengono utilizzate per creare i file di genesi per ogni nodo, oltre ad altre impostazioni come i secondi per slot della rete. + +Salva il tuo file dei parametri modificato in qualsiasi directory desideri (nell'esempio seguente, è salvato sul desktop) e quindi utilizzalo per eseguire il tuo pacchetto Kurtosis eseguendo: + +```python +kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)" +``` + +Nota: il comando `kurtosis clean -a` viene utilizzato qui per istruire Kurtosis a distruggere la vecchia rete di test e i suoi contenuti prima di avviarne una nuova. + +Ancora una volta, Kurtosis lavorerà per un po' e stamperà i singoli passaggi che stanno avendo luogo. Alla fine, l'output dovrebbe essere simile a: + +```python +Starlark code successfully run. No output was returned. +INFO[2023-04-07T11:43:16-04:00] ========================================================== +INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-07T11:43:16-04:00] ========================================================== +Name: local-eth-testnet +UUID: bef8c192008e +Status: RUNNING +Creation Time: Fri, 07 Apr 2023 11:41:58 EDT + +========================================= Files Artifacts ========================================= +UUID Name +cc495a8e364a cl-genesis-data +7033fcdb5471 el-genesis-data +a3aef43fc738 genesis-generation-config-cl +8e968005fc9d genesis-generation-config-el +3182cca9d3cd geth-prefunded-keys +8421166e234f prysm-password +d9e6e8d44d99 validator-keystore-0 +23f5ba517394 validator-keystore-1 +4d28dea40b5c validator-keystore-2 + +========================================== User Services ========================================== +UUID Name Ports Status +485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING + metrics: 5054/tcp -> http://127.0.0.1:65011 + tcp-discovery: 9000/tcp -> 127.0.0.1:65012 + udp-discovery: 9000/udp -> 127.0.0.1:54455 +73739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING + metrics: 5064/tcp -> http://127.0.0.1:65017 +1b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65023 + tcp-discovery: 9000/tcp -> 127.0.0.1:65024 + udp-discovery: 9000/udp -> 127.0.0.1:56031 + validator-metrics: 5064/tcp -> 127.0.0.1:65022 +949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65030 + tcp-discovery: 9000/tcp -> 127.0.0.1:65031 + udp-discovery: 9000/udp -> 127.0.0.1:60784 + validator-metrics: 5064/tcp -> 127.0.0.1:65029 +c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65035 + tcp-discovery: 9000/tcp -> 127.0.0.1:65036 + udp-discovery: 9000/udp -> 127.0.0.1:63581 +e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64988 + tcp-discovery: 30303/tcp -> 127.0.0.1:64987 + udp-discovery: 30303/udp -> 127.0.0.1:55706 + ws: 8546/tcp -> 127.0.0.1:64989 +e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64995 + tcp-discovery: 30303/tcp -> 127.0.0.1:64994 + udp-discovery: 30303/udp -> 127.0.0.1:58096 + ws: 8546/tcp -> 127.0.0.1:64996 +ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING + rpc: 8545/tcp -> 127.0.0.1:65001 + tcp-discovery: 30303/tcp -> 127.0.0.1:65000 + udp-discovery: 30303/udp -> 127.0.0.1:57269 + ws: 8546/tcp -> 127.0.0.1:65002 +12d04a9dbb69 prelaunch-data-generator-1680882122181135513 STOPPED +5b45f9c0504b prelaunch-data-generator-1680882122192182847 STOPPED +3d4aaa75e218 prelaunch-data-generator-1680882122201668972 STOPPED +``` + +Congratulazioni! Hai configurato con successo la tua rete di test locale per avere 3 nodi invece di 1. Per eseguire gli stessi flussi di lavoro che hai fatto prima sulla tua dApp (distribuzione e test), esegui le stesse operazioni che abbiamo fatto prima sostituendo `<$YOUR_PORT>` nella struttura `localnet` nel tuo file di configurazione `hardhat.config.ts` con la porta dell'URI RPC in output da qualsiasi servizio `el-client-` nella tua nuova rete di test locale a 3 nodi. + +## Conclusione {#conclusion} + +E questo è tutto! Per riassumere questa breve guida, hai: + +- Creato una rete di test locale di Ethereum su Docker utilizzando Kurtosis +- Connesso il tuo ambiente di sviluppo di dApp locale alla rete locale di Ethereum +- Distribuito una dApp ed eseguito un semplice test su di essa sulla rete locale di Ethereum +- Configurato la rete Ethereum sottostante per avere 3 nodi + +Ci piacerebbe sapere da te cosa è andato bene, cosa potrebbe essere migliorato o rispondere a qualsiasi tua domanda. Non esitare a contattarci tramite [GitHub](https://github.com/kurtosis-tech/kurtosis/issues/new/choose) o [inviaci un'e-mail](mailto:feedback@kurtosistech.com)! + +### Altri esempi e guide {#other-examples-guides} + +Ti invitiamo a dare un'occhiata alla nostra [guida rapida](https://docs.kurtosis.com/quickstart) (dove costruirai un database Postgres e un'API su di esso) e ai nostri altri esempi nel nostro [repository awesome-kurtosis](https://github.com/kurtosis-tech/awesome-kurtosis) dove troverai alcuni ottimi esempi, inclusi pacchetti per: + +- [Avviare la stessa rete di test locale di Ethereum](https://github.com/kurtosis-tech/eth2-package), ma con servizi aggiuntivi connessi come uno spammer di transazioni (per simulare transazioni), un monitor di biforcazione e un'istanza Grafana e Prometheus connessa +- Eseguire un [test di sotto-rete](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/ethereum-network-partition-test) sulla stessa rete locale di Ethereum \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/it/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md index 5594e708601..8b45b6797df 100644 --- a/public/content/translations/it/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md +++ b/public/content/translations/it/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -1,14 +1,11 @@ --- -title: "Ridimensionare i contratti per combattere i limiti di dimensioni" -description: Cosa puoi fare per impedire che i tuoi smart contract diventino troppo grandi? +title: "Ridurre le dimensioni dei contratti per combattere il limite di dimensione del contratto" +description: Cosa puoi fare per evitare che i tuoi contratti intelligenti diventino troppo grandi? author: Markus Waas lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "archiviazione" +tags: ["Solidity", "contratti intelligenti", "archiviazione"] skill: intermediate -breadcrumb: "Ridurre i contratti" +breadcrumb: Ridurre le dimensioni dei contratti published: 2020-06-26 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/max-contract-size @@ -16,46 +13,44 @@ sourceUrl: https://soliditydeveloper.com/max-contract-size ## Perché c'è un limite? {#why-is-there-a-limit} -Il [22 Novembre 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon), la diramazione permanente Spurious Dragon ha introdotto [EIP-170](https://eips.ethereum.org/EIPS/eip-170), che ha aggiunto un limite di dimensioni per gli smart contract di 24.576 kb. Per gli sviluppatori in Solidity, significa che quando si aggiungono più funzionalità al contratto, a un certo punto si raggiunge il limite e, in fase di implementazione, si vedrà l'errore: +Il [22 novembre 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon) la biforcazione hard Spurious Dragon ha introdotto l'[EIP-170](https://eips.ethereum.org/EIPS/eip-170) che ha aggiunto un limite di dimensione del contratto intelligente di 24,576 kb. Per te come sviluppatore Solidity questo significa che quando aggiungi sempre più funzionalità al tuo contratto, a un certo punto raggiungerai il limite e durante la distribuzione vedrai l'errore: -`Attenzione: La dimensione del codice del contratto eccede i 24576 byte (un limite introdotto in Spurious Dragon). This contract may not be deployable on Mainnet. Considera di abilitare l'ottimizzatore (con un valore di "esecuzioni" basso!), disattivare le stringhe di ripristino o usare le librerie.` +`Warning: Contract code size exceeds 24576 bytes (a limit introduced in Spurious Dragon). This contract may not be deployable on Mainnet. Consider enabling the optimizer (with a low "runs" value!), turning off revert strings, or using libraries.` -Questo limite è stato introdotto per prevenire gli attacchi DOS (denial-of-service). Qualsiasi chiamata a un contratto è relativamente economica in termini di gas. Tuttavia, l'impatto della chiamata di un contratto per i nodi di Ethereum aumenta sproporzionatamente in base alla dimensione del codice del contratto chiamato (lettura del codice dal disco, pre-elaborazione del codice, aggiunta di dati alla prova di Merkle). Ogni volta che ti trovi in una situazione in cui il malintenzionato richiede poche risorse per causare molto lavoro per altri, esiste il potenziale di attacchi DOS. +Questo limite è stato introdotto per prevenire attacchi denial-of-service (DOS). Qualsiasi chiamata a un contratto è relativamente economica in termini di gas. Tuttavia, l'impatto di una chiamata al contratto per i nodi di Ethereum aumenta in modo sproporzionato a seconda delle dimensioni del codice del contratto chiamato (lettura del codice dal disco, pre-elaborazione del codice, aggiunta di dati alla prova di Merkle). Ogni volta che si verifica una situazione in cui l'attaccante richiede poche risorse per causare molto lavoro agli altri, si ottiene il potenziale per attacchi DOS. -In origine, questo era un problema minore, dato che il limite naturale di dimensioni del contratto è il limite di gas del blocco. Ovviamente, un contratto dev'esser distribuito entro una transazione che detenga tutto il codice del byte del contratto. Se includi solo quella transazione in un blocco, puoi usare anche tutto il gas, ma non è infinito. Dall'[Aggiornamento di Londra](/ethereum-forks/#london), il limite di gas del blocco è stato capace di variare tra le 15M e le 30M unità, a seconda della domanda di rete. +In origine questo era un problema minore perché un limite naturale alle dimensioni del contratto è il limite del gas del blocco. Ovviamente, un contratto deve essere distribuito all'interno di una transazione che contiene tutto il bytecode del contratto. Se includi solo quella transazione in un blocco, puoi consumare tutto quel gas, ma non è infinito. A partire dall'[Aggiornamento di Londra](/ethereum-forks/#london), il limite del gas del blocco ha potuto variare tra 15M e 30M di unità a seconda della domanda della rete. -Di seguito, passeremo in rassegna alcuni metodi, ordinati in base al loro impatto potenziale. Pensiamo ad esempio alla perdita di peso: la strategia migliore per raggiungere il proprio peso target (nel nostro caso 24kb) consiste nel concentrarsi prima sui metodi a maggiore impatto. In gran parte dei casi è sufficiente adattare la propria dieta, mentre in altri serve qualcosa di più. Si può aggiungere un po' di esercizio fisico (impatto medio) o persino degli integratori (impatto ridotto). +Di seguito esamineremo alcuni metodi ordinati in base al loro potenziale impatto. Pensaci in termini di perdita di peso. La strategia migliore per raggiungere il proprio peso forma (nel nostro caso 24kb) è concentrarsi prima sui metodi a grande impatto. Nella maggior parte dei casi, basta sistemare la dieta per arrivarci, ma a volte serve un po' di più. Quindi potresti aggiungere un po' di esercizio fisico (impatto medio) o persino degli integratori (impatto basso). -## Impatto elevato {#big-impact} +## Grande impatto {#big-impact} ### Separa i tuoi contratti {#separate-your-contracts} -Questo dovrebbe sempre essere l'approccio preferenziale. Come fare per separare un unico contratto in diversi contratti più piccoli? Generalmente è necessario trovare un'architettura efficace per i propri contratti. I contratti più piccoli sono sempre preferibili a livello di leggibilità del codice. Per dividere i contratti, chiediti: +Questo dovrebbe sempre essere il tuo primo approccio. Come puoi separare il contratto in più contratti più piccoli? In genere ti costringe a ideare una buona architettura per i tuoi contratti. I contratti più piccoli sono sempre preferiti dal punto di vista della leggibilità del codice. Per dividere i contratti, chiediti: -- Quali funzioni devono rimanere insieme? Ogni serie di funzioni potrebbe risultare più efficace in un contratto a sé stante. -- Quali funzioni non richiedono la lettura dello stato del contratto o solo un sottoinsieme specifico dello stato? -- Puoi dividere archiviazione e funzionalità? +- Quali funzioni appartengono allo stesso gruppo? Ogni insieme di funzioni potrebbe stare meglio nel proprio contratto. +- Quali funzioni non richiedono la lettura dello stato del contratto o solo di un sottoinsieme specifico dello stato? +- Puoi separare l'archiviazione e le funzionalità? ### Librerie {#libraries} -Un modo semplice per togliere il codice di funzionalità dall'archiviazione consiste nell'utilizzare una [libreria](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Evita di dichiarare le funzioni della libreria come interne, poiché verranno [aggiunte al contratto](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) direttamente durante la compilazione. Se invece usi funzioni pubbliche, queste si troveranno nel contratto di una libreria separata. Considera [using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) per rendere l'utilizzo delle librerie più pratico. +Un modo semplice per allontanare il codice delle funzionalità dall'archiviazione è utilizzare una [libreria](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Non dichiarare le funzioni della libreria come interne, poiché queste verranno [aggiunte al contratto](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) direttamente durante la compilazione. Ma se usi funzioni pubbliche, allora queste saranno di fatto in un contratto di libreria separato. Considera l'utilizzo di [using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) per rendere più conveniente l'uso delle librerie. ### Proxy {#proxies} -Una strategia più avanzata è il sistema proxy. Le librerie usano `DELEGATECALL` in background, che esegue semplicemente la funzione di un altro contratto con lo stato del contratto chiamante. Dai un'occhiata a [questo post del blog](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) per scoprire di più sui sistemi proxy. Offono maggiore funzionalità, ad es. consentono l'aggiornabilità ma aggiungono anche una notevole complessità. Non li aggiungerei solo per ridurre le dimensioni del contratto, a meno che non sia la sola opzione per qualche motivo. +Una strategia più avanzata sarebbe un sistema proxy. Le librerie usano `DELEGATECALL` in background, che esegue semplicemente la funzione di un altro contratto con lo stato del contratto chiamante. Dai un'occhiata a [questo post del blog](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) per saperne di più sui sistemi proxy. Ti offrono maggiori funzionalità, ad esempio consentono l'aggiornabilità, ma aggiungono anche molta complessità. Non li aggiungerei solo per ridurre le dimensioni del contratto, a meno che non sia la tua unica opzione per qualsiasi motivo. ## Impatto medio {#medium-impact} -### Rimuovi le funzioni {#remove-functions} +### Rimuovi funzioni {#remove-functions} -Questo punto dovrebbe essere ovvio. Le funzioni aumentano di un bel po' le dimensioni di un contratto. +Questo dovrebbe essere ovvio. Le funzioni aumentano un bel po' le dimensioni di un contratto. -- **Esterne**: talvolta aggiungiamo molte funzioni di visualizzazione per motivi di comodità, il che va perfettamente bene finché non si supera il limite di dimensioni. A quel punto si potrebbe seriamente pensare di rimuovere tutte le funzioni tranne quelle essenziali. -- **Interne**: puoi rimuovere anche le funzioni interne/private e limitarti a mettere il codice in linea, a condizione che la funzione venga chiamata solo una volta. +- **Esterne**: Spesso aggiungiamo molte funzioni di visualizzazione (view) per motivi di comodità. Va benissimo finché non si raggiunge il limite di dimensione. A quel punto potresti voler pensare seriamente di rimuovere tutte quelle non assolutamente essenziali. +- **Interne**: Puoi anche rimuovere le funzioni interne/private e semplicemente inserire il codice in linea, a patto che la funzione venga chiamata solo una volta. -### Evita le variabili aggiuntive {#avoid-additional-variables} - -Una semplice modifica come questa: +### Evita variabili aggiuntive {#avoid-additional-variables} ```solidity function get(uint id) returns (address,address) { @@ -70,24 +65,23 @@ function get(uint id) returns (address,address) { } ``` -crea una differenza di **0,28kb**. È facile incontrare numerose situazioni simili nei propri contratti, con il rischio che si sommino fino a raggiungere volumi significativi. +Un semplice cambiamento come questo fa una differenza di **0,28kb**. È probabile che tu possa trovare molte situazioni simili nei tuoi contratti e queste possono davvero sommarsi fino a raggiungere quantità significative. -### Abbrevia i messaggi d'errore {#shorten-error-message} +### Accorcia i messaggi di errore {#shorten-error-message} -I messaggi di ripristino lunghi e, in particolare, la presenza di numerosi messaggi diversi possono fare espandere il contratto. Invece, è meglio usare brevi codici d'errore e decodificali nel contratto. In questo modo è possibile rendere brevi i messaggi più lunghi: +I messaggi di revert lunghi e in particolare molti messaggi di revert diversi possono gonfiare il contratto. Usa invece codici di errore brevi e decodificali nel tuo contratto. Un messaggio lungo potrebbe diventare molto più corto: ```solidity require(msg.sender == owner, "Only the owner of this contract can call this function"); - ``` ```solidity require(msg.sender == owner, "OW1"); ``` -### Utilizza gli errori personalizzati invece dei messaggi d'errore +### Usa errori personalizzati invece di messaggi di errore -Gli errori personalizzati sono stati introdotti in [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/). Sono ottimi modi per ridurre le dimensioni dei tuoi contratti, poiché sono codificati in ABI come selettori (proprio come le funzioni). +Gli errori personalizzati sono stati introdotti in [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/). Sono un ottimo modo per ridurre le dimensioni dei tuoi contratti, perché sono codificati in ABI come selettori (proprio come lo sono le funzioni). ```solidity error Unauthorized(); @@ -97,15 +91,15 @@ if (msg.sender != owner) { } ``` -### Considera un valore d'esecuzione basso nell'ottimizzatore {#consider-a-low-run-value-in-the-optimizer} +### Considera un valore di esecuzione basso nell'ottimizzatore {#consider-a-low-run-value-in-the-optimizer} -Puoi anche cambiare le impostazioni dell'ottimizzatore. Il valore predefinito di 200 significa che sta provando a ottimizzare il bytecode come se una funzione fosse chiamata 200 volte. Se lo modifichi a 1, fondamentalmente dici all'ottimizzatore di ottimizzare nel caso dell'esecuzione di ogni funzione una sola volta. Una funzione ottimizzata per essere eseguita solo una volta è ottimizzata per la distribuzione stessa. Sappi che **ciò aumenta i [costi del gas](/developers/docs/gas/) per l'esecuzione delle funzioni**, quindi meglio non farlo. +Puoi anche modificare le impostazioni dell'ottimizzatore. Il valore predefinito di 200 significa che sta cercando di ottimizzare il bytecode come se una funzione venisse chiamata 200 volte. Se lo modifichi a 1, in pratica dici all'ottimizzatore di ottimizzare per il caso in cui ogni funzione venga eseguita solo una volta. Una funzione ottimizzata per essere eseguita una sola volta significa che è ottimizzata per la distribuzione stessa. Tieni presente che **questo aumenta i [costi del gas](/developers/docs/gas/) per l'esecuzione delle funzioni**, quindi potresti non volerlo fare. -## Piccolo impatto {#small-impact} +## Impatto basso {#small-impact} -### Evita il passaggio di struct alle funzioni {#avoid-passing-structs-to-functions} +### Evita di passare struct alle funzioni {#avoid-passing-structs-to-functions} -Se utilizzi l'[ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2), può essere utile evitare il passaggio di struct a una funzione. Anziché passare il parametro come struct... +Se stai utilizzando l'[ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2), può essere utile non passare struct a una funzione. Invece di passare il parametro come struct, passa direttamente i parametri richiesti. In questo esempio abbiamo risparmiato un altro **0,1kb**. ```solidity function get(uint id) returns (address,address) { @@ -127,12 +121,10 @@ function _get(address addr1, address addr2) private view returns(address,address } ``` -... passa direttamente i parametri richiesti. In questo esempio abbiamo risparmiato altri **0,1kb**. - ### Dichiara la visibilità corretta per funzioni e variabili {#declare-correct-visibility-for-functions-and-variables} -- Funzioni o variabili chiamate solo dall'esterno? Dichiarale come `external` anziché `public`. -- Funzioni o variabili chiamate dall'interno del contratto? Dichiarale come `private` o `internal` anziché `public`. +- Funzioni o variabili che vengono chiamate solo dall'esterno? Dichiarale come `external` invece di `public`. +- Funzioni o variabili chiamate solo dall'interno del contratto? Dichiarale come `private` o `internal` invece di `public`. ### Rimuovi i modificatori {#remove-modifiers} @@ -150,4 +142,4 @@ function checkStuff() private {} function doSomething() { checkStuff(); } ``` -Questi suggerimenti dovrebbero aiutarti a ridurre significativamente le dimensioni del contratto. Ancora una volta, non smetterò mai di insistere sull'importanza di concentrarsi sempre sulla divisione dei contratti, se possibile, per avere il massimo impatto. +Questi suggerimenti dovrebbero aiutarti a ridurre significativamente le dimensioni del contratto. Ancora una volta, non lo sottolineerò mai abbastanza, concentrati sempre sulla divisione dei contratti, se possibile, per ottenere l'impatto maggiore. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/it/developers/tutorials/eip-1271-smart-contract-signatures/index.md index 0f3c6f62491..2f7a868ca39 100644 --- a/public/content/translations/it/developers/tutorials/eip-1271-smart-contract-signatures/index.md +++ b/public/content/translations/it/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -1,67 +1,63 @@ --- -title: "EIP-1271: firmare e verificare le firme dei contratti intelligenti" -description: Una panoramica della generazione e della verifica delle firme dei contratti intelligenti con EIP-1271. Rivediamo anche l'implementazione di EIP-1271 utilizzata in Safe (precedentemente Gnosis Safe) per fornire un esempio concreto agli sviluppatori di contratti intelligenti su cui costruire. +title: "EIP-1271: Firmare e Verificare le Firme dei Contratti Intelligenti" +description: Una panoramica sulla generazione e verifica delle firme dei contratti intelligenti con l'EIP-1271. Esaminiamo anche l'implementazione dell'EIP-1271 utilizzata in Safe (precedentemente Gnosis Safe) per fornire un esempio concreto su cui gli sviluppatori di contratti intelligenti possono basarsi. author: Nathan H. Leung lang: it -tags: - - "eip-1271" - - "contratti intelligenti" - - "verifica" - - "firma" +tags: ["eip-1271", "contratti intelligenti", "verifica", "firma"] skill: intermediate -breadcrumb: "Firme EIP-1271" +breadcrumb: Firme EIP-1271 published: 2023-01-12 --- -Lo standard [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) permette ai contratti intelligenti di verificare le firme. +Lo standard [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) consente ai contratti intelligenti di verificare le firme. -In questo tutorial diamo una panoramica delle firme digitali, conoscenze di base su EIP-1271 e l'implementazione specifica di EIP-1271 utilizzata da [Safe](https://safe.global/) (precedentemente Gnosis Safe). Tutto ciò può servire come punto di partenza per implementare EIP-1271 nei tuoi contratti. +In questo tutorial, forniamo una panoramica delle firme digitali, del contesto dell'EIP-1271 e dell'implementazione specifica dell'EIP-1271 utilizzata da [Safe](https://safe.global/) (precedentemente Gnosis Safe). Tutto questo può servire come punto di partenza per implementare l'EIP-1271 nei propri contratti. -## Che cos'è una firma? +## Cos'è una firma? -In questo contesto una firma (più precisamente una "firma digitale") è un messaggio con in più una sorta di prova che quel messaggio arriva da una specifica persona/mittente/indirizzo. +In questo contesto, una firma (più precisamente, una "firma digitale") è un messaggio più una sorta di prova che il messaggio provenga da una persona/mittente/indirizzo specifico. -Ad esempio, una firma digitale potrebbe essere così: +Ad esempio, una firma digitale potrebbe apparire così: -1. Messaggio: "Voglio accedere a questo sito web con il mio portafoglio di Ethereum." +1. Messaggio: "Voglio accedere a questo sito web con il mio portafoglio Ethereum." 2. Firmatario: Il mio indirizzo è `0x000…` -3. Prova: Qui c'è una prova che io, `0x000…`, ho effettivamente creato questo intero messaggio (questo di solito è qualcosa di crittografico). +3. Prova: Ecco alcune prove che io, `0x000…`, ho effettivamente creato l'intero messaggio (di solito si tratta di qualcosa di crittografico). È importante notare che una firma digitale include sia un "messaggio" che una "firma". -Perché? Ad esempio, se tu mi dessi un contratto da firmare, e poi io tagliassi via la pagina con la firma e te lo restituissi solo con le mie firme senza il resto del contratto, il contratto non sarebbe valido. +Perché? Ad esempio, se mi dessi un contratto da firmare, e poi io tagliassi la pagina della firma e ti restituissi solo le mie firme senza il resto del contratto, il contratto non sarebbe valido. -Allo stesso modo una firma digitale non significa nulla senza un messaggio a essa associato! +Allo stesso modo, una firma digitale non significa nulla senza un messaggio associato! -## Perché esiste lo standard EIP-1271? +## Perché esiste l'EIP-1271? -Per creare una firma digitale che possa essere utilizzata su una blockchain basata su Ethereum, in linea generale si ha bisogno di una chiave privata che nessun altro conosca. Questo è ciò che rende tua la tua firma (nessun altro può creare la stessa firma senza sapere la chiave segreta). +Per creare una firma digitale da utilizzare sulle blockchain basate su Ethereum, in genere è necessaria una chiave privata segreta che nessun altro conosce. Questo è ciò che rende la tua firma, tua (nessun altro può creare la stessa firma senza conoscere la chiave segreta). -Il tuo conto di Ethereum (ovvero il tuo conto posseduto esternamente/EOA) ha una chiave privata associata, e questa è la chiave privata che tipicamente viene utilizzata quando un sito web o una dApp chiede la tua firma (ad es. per "Accedi con Ethereum"). +Il tuo account Ethereum (ovvero, il tuo account controllato esternamente/EOA) ha una chiave privata associata, e questa è la chiave privata che viene tipicamente utilizzata quando un sito web o una dApp ti chiede una firma (ad es., per "Accedi con Ethereum"). -Un'app può [verificare una firma](https://docs.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) creata usando una libreria esterna come ether.js [senza conoscere la tua chiave privata](https://en.wikipedia.org/wiki/Public-key_cryptography) ed essere sicura che _tu_ sia la persona che ha generato la firma. +Un'app può [verificare una firma](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) che crei utilizzando una libreria di terze parti come ethers.js [senza conoscere la tua chiave privata](https://en.wikipedia.org/wiki/Public-key_cryptography) ed essere sicura che _tu_ sia stato colui che ha creato la firma. -> Infatti siccome le firme digitali degli EOA utilizzano una crittografia a chiave pubblica, possono essere generate e verificate **fuori dalla catena**! Così funziona la votazione senza gas nelle DAO: invece di inviare voti sulla catena, le firme digitali possono creare e verificare fuori dalla catena utilizzando librerie crittografiche. +> Infatti, poiché le firme digitali degli EOA utilizzano la crittografia a chiave pubblica, possono essere generate e verificate **fuori catena**! È così che funziona il voto delle DAO senza gas: invece di inviare i voti on-chain, le firme digitali possono essere create e verificate fuori catena utilizzando librerie crittografiche. -Mentre i conti EOA hanno una chiave privata, i conti dei contratti intelligenti non hanno alcun tipo di chiave privata o segreta (quindi "Accedi con Ethereum", e simili non possono funzionare nativamente con i conti dei contratti intelligenti). +Mentre gli account EOA hanno una chiave privata, gli account dei contratti intelligenti non hanno alcun tipo di chiave privata o segreta (quindi "Accedi con Ethereum", ecc. non può funzionare nativamente con gli account dei contratti intelligenti). -Il problema che EIP-1271 si pone di risolvere: come possiamo essere sicuri che la firma di un contratto intelligente sia valida se il contratto intelligente non ha un "segreto" da incorporare nella firma? +Il problema che l'EIP-1271 mira a risolvere: come possiamo dire che la firma di un contratto intelligente è valida se il contratto intelligente non ha alcun "segreto" che può incorporare nella firma? -## Come funziona EIP-1271? +## Come funziona l'EIP-1271? -I contratti intelligenti non hanno chiavi private che possano essere usate per firmare i messaggi. Quindi come possiamo sapere se una firma è autentica? +I contratti intelligenti non hanno chiavi private che possono essere utilizzate per firmare messaggi. Quindi come possiamo dire se una firma è autentica? -Un'idea è che possiamo semplicemente _chiedere_ al contratto intelligente se una firma è autentica! +Beh, un'idea è che possiamo semplicemente _chiedere_ al contratto intelligente se una firma è autentica! -Quello che fa EIP-1271 è standardizzare l'idea di "chiedere" a un contratto intelligente se una data firma sia valida. +Ciò che fa l'EIP-1271 è standardizzare questa idea di "chiedere" a un contratto intelligente se una data firma è valida. -Un contratto che implementa EIP-1271 deve avere una funzione chiamata `isValidSignature` che accetti un messaggio e una firma. Il contratto può quindi eseguire qualche logica di validazione (le specifiche non impongono nulla di specifico qui) e restituire un valore che indica se la firma sia valida o meno. +Un contratto che implementa l'EIP-1271 deve avere una funzione chiamata `isValidSignature` che accetta un messaggio e una firma. Il contratto può quindi eseguire una logica di convalida (la specifica non impone nulla di specifico qui) e quindi restituire un valore che indica se la firma è valida o meno. -Se `isValidSignature` restituisce un risultato valido, significa che il contratto sta dicendo "sì, approvo questa firma + messaggio!" +Se `isValidSignature` restituisce un risultato valido, è praticamente il contratto che dice "sì, approvo questa firma + messaggio!" ### Interfaccia -Ecco l'interfaccia esatta presente nelle specifiche EIP-1271 (parleremo del parametro `_hash` più avanti, ma per adesso, puoi pensarlo come il messaggio che viene verificato): +Ecco l'interfaccia esatta nella specifica EIP-1271 (parleremo del parametro `_hash` di seguito, ma per ora, pensalo come il messaggio che viene verificato): ```jsx pragma solidity ^0.5.0; @@ -71,15 +67,23 @@ contract ERC1271 { // bytes4(keccak256("isValidSignature(bytes32,bytes)") bytes4 constant internal MAGICVALUE = 0x1626ba7e; - /** - * @dev Should return whether the signature provided is valid for the provided hash - * @param _hash Hash of the data to be signed - * @param _signature Signature byte array associated with _hash + /* * + * @dev Dovrebbe restituire se la firma fornita è valida per l'hash fornito + * @param _hash Hash dei dati da firmare + * @param _signature Array di byte della firma associato a _hash * - * MUST return the bytes4 magic value 0x1626ba7e when function passes. - * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) - * MUST allow external calls - */ + * DEVE restituire il valore magico bytes4 0x1626ba7e quando la funzione ha successo. + * NON DEVE modificare lo stato (usando STATICCALL per solc < 0.5, modificatore view per solc > 0.5) + * DEVE consentire chiamate esterne */ + + + + + + + + + function isValidSignature( bytes32 _hash, bytes memory _signature) @@ -89,40 +93,40 @@ contract ERC1271 { } ``` -## Esempio di implementazione di EIP-1271: Safe +## Esempio di Implementazione dell'EIP-1271: Safe -I contratti possono implementare `isValidSignature` in diversi modi, le specifiche da sole non dicono molto riguardo l'esatta implementazione. +I contratti possono implementare `isValidSignature` in molti modi: la specifica non dice molto sull'implementazione esatta. -Un contratto degno di nota che implementa EIP-1271 è Safe (precedentemente Gnosis Safe). +Un contratto degno di nota che implementa l'EIP-1271 è Safe (precedentemente Gnosis Safe). Nel codice di Safe, `isValidSignature` [è implementata](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) in modo che le firme possano essere create e verificate in [due modi](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support): 1. Messaggi on-chain - 1. Creazione: un proprietario sicuro crea una nuova transazione sicura per "firmare" il messaggio, passando il messaggio come dati nella transazione. Quando un numero sufficiente di proprietari firma la transazione per raggiungere la soglia multifirma, la transazione è trasmessa ed eseguita. Nella transazione viene chiamata una funzione sicura che aggiunge il messaggio all'elenco di messaggi "approvati". - 2. Verifica: chiama `isValidSignature` sul contratto di Safe, passando il messaggio da verificare come parametro messaggio e [un valore vuoto per il parametro firma](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (ossia `0x`). Safe vedrà che il parametro firma è vuoto e invece di verificare in maniera crittografica la firma, saprà di dover andare avanti e controllare se il messaggio si trova nell'elenco di messaggi "approvati". -2. Messaggi off-chain: - 1. Creazione: un proprietario sicuro crea un messaggio off-chain, poi fa in modo che altri proprietari sicuri firmino il messaggio, ognuno individualmente, finché ci sono abbastanza firme per superare la soglia di approvazione multifirma. - 2. Verifica: chiama `isValidSignature`. Nel parametro messaggio, passa il messaggio da verificare. Nel parametro firma, passa ognuna delle firme dei proprietari sicure tutte concatenate, una dietro l'altra. Safe controllerà che ci siano abbastanza firme per raggiungere la soglia **e** che ogni firma sia valida. Se è così, restituirà un valore che indica che la firma è stata verificata con successo. + 1. Creazione: un proprietario del safe crea una nuova transazione del safe per "firmare" un messaggio, passando il messaggio come dati nella transazione. Una volta che un numero sufficiente di proprietari firma la transazione per raggiungere la soglia della multifirma, la transazione viene trasmessa ed eseguita. Nella transazione, c'è una funzione del safe chiamata (`signMessage(bytes calldata _data)`) che aggiunge il messaggio a un elenco di messaggi "approvati". + 2. Verifica: chiama `isValidSignature` sul contratto Safe e passa il messaggio da verificare come parametro del messaggio e [un valore vuoto per il parametro della firma](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (ovvero, `0x`). Il Safe vedrà che il parametro della firma è vuoto e invece di verificare crittograficamente la firma, saprà di dover semplicemente procedere e controllare se il messaggio è nell'elenco dei messaggi "approvati". +2. Messaggi fuori catena: + 1. Creazione: un proprietario del safe crea un messaggio fuori catena, quindi fa in modo che altri proprietari del safe firmino il messaggio ciascuno individualmente fino a quando non ci sono abbastanza firme per superare la soglia di approvazione della multifirma. + 2. Verifica: chiama `isValidSignature`. Nel parametro del messaggio, passa il messaggio da verificare. Nel parametro della firma, passa le singole firme di ciascun proprietario del safe tutte concatenate insieme, una dopo l'altra. Il Safe controllerà che ci siano abbastanza firme per soddisfare la soglia **e** che ogni firma sia valida. In tal caso, restituirà un valore che indica l'avvenuta verifica della firma. -## Che cos'è esattamente il parametro `_hash`? Perché non passiamo l'intero messaggio? +## Cos'è esattamente il parametro `_hash`? Perché non passare l'intero messaggio? -Potresti aver notato che la funzione `isValidSignature` nell'[interfaccia EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) non prende il messaggio stesso bensì un parametro `_hash`. Questo significa che invece che passare l'intero messaggio di lunghezza arbitraria a `isValidSignature`, passiamo invece un hash di 32-byte del messaggio (generalmente keccak256). +Potresti aver notato che la funzione `isValidSignature` nell'[interfaccia EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) non accetta il messaggio stesso, ma un parametro `_hash`. Ciò significa che invece di passare l'intero messaggio di lunghezza arbitraria a `isValidSignature`, passiamo invece un hash di 32 byte del messaggio (generalmente keccak256). -Ogni byte di calldata – ovvero dati dei parametri della funzione passati a una funzione del contratto intelligente – [costa 16 unità di gas (4 unità di gas se sono zero byte)](https://eips.ethereum.org/EIPS/eip-2028), quindi in questo modo si può risparmiare molto gas se il messaggio è lungo. +Ogni byte di calldata — ovvero, i dati dei parametri della funzione passati a una funzione del contratto intelligente — [costa 16 gas (4 gas se il byte è zero)](https://eips.ethereum.org/EIPS/eip-2028), quindi questo può far risparmiare molto gas se un messaggio è lungo. -### Specifiche precedenti di EIP-1271 +### Specifiche Precedenti dell'EIP-1271 -Esistono specifiche di EIP-1271 che hanno la funzione `isValidSignature` con un primo parametro di tipo `bytes` (di lunghezza arbitraria invece che di lunghezza fissa `bytes32`) e un parametro nome `message`. Questa è una [versione precedente](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) dello standard EIP-1271. +Ci sono specifiche EIP-1271 in circolazione che hanno una funzione `isValidSignature` con un primo parametro di tipo `bytes` (lunghezza arbitraria, invece di un `bytes32` a lunghezza fissa) e nome del parametro `message`. Questa è una [versione precedente](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) dello standard EIP-1271. -## Come dovrei implementare EIP-1271 nei miei contratti? +## Come dovrebbe essere implementato l'EIP-1271 nei miei contratti? -La specifica è molto flessibile in merito. L'implementazione di Safe ha alcune buone idee: +La specifica è molto aperta qui. L'implementazione di Safe ha alcune buone idee: -- È possibile considerare valide le firme EOA del "proprietario" del contratto. -- Si potrebbe memorizzare un elenco di messaggi approvati e considerare validi solo quelli. +- Puoi considerare valide le firme degli EOA del "proprietario" del contratto. +- Potresti memorizzare un elenco di messaggi approvati e considerare validi solo quelli. -Alla fine, dipende da te, in quanto sviluppatore del contratto! +Alla fine, spetta a te come sviluppatore del contratto! -## Conclusioni +## Conclusione -[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) è uno standard versatile che consente ai contratti intelligenti di verificare le firme. Apre la porta perché i contratti intelligenti agiscano in modo più simile agli EOA - ad esempio fornendo un modo per far funzionare "Accedi con Ethereum" con i contratti intelligenti - e può essere implementato in molti modi (Safe ha un'implementazione non banale e interessante da considerare). +L'[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) è uno standard versatile che consente ai contratti intelligenti di verificare le firme. Apre le porte affinché i contratti intelligenti agiscano in modo più simile agli EOA — ad esempio fornendo un modo per far funzionare "Accedi con Ethereum" con i contratti intelligenti — e può essere implementato in molti modi (Safe ha un'implementazione non banale e interessante da considerare). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/it/developers/tutorials/erc-721-vyper-annotated-code/index.md index 5d200b803a3..7509998e705 100644 --- a/public/content/translations/it/developers/tutorials/erc-721-vyper-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -1,32 +1,34 @@ --- -title: "Guisa sul Contratto ERC-721 Vyper" +title: "Guida passo passo al contratto ERC-721 in Vyper" description: Il contratto ERC-721 di Ryuya Nakamura e come funziona author: Ori Pomerantz lang: it -tags: - - "vyper" - - "erc-721" - - "python" +tags: ["Vyper", "erc-721", "Python"] skill: beginner -breadcrumb: "Vyper ERC-721" +breadcrumb: Vyper ERC-721 published: 2021-04-01 --- ## Introduzione {#introduction} -Lo standard [ERC-721](/developers/docs/standards/tokens/erc-721/) è utilizzato per determinare la proprietà di un Token Non Fungibile (NFT). I token [ERC-20](/developers/docs/standards/tokens/erc-20/) si comportano come una commodity, perché non c'è differenza tra i token individuali. Al contrario, i token ERC-721 sono progettati per risorse simili ma non identiche, come diversi [cat cartoon](https://www.cryptokitties.co/) o titoli di diverse proprietà immobiliari. +Lo standard [ERC-721](/developers/docs/standards/tokens/erc-721/) è utilizzato per detenere la proprietà dei token non fungibili (NFT). +I token [ERC-20](/developers/docs/standards/tokens/erc-20/) si comportano come una merce, perché non c'è differenza tra i singoli token. +Al contrario, i token ERC-721 sono progettati per asset simili ma non identici, come diversi [gatti dei cartoni animati](https://www.cryptokitties.co/) +o titoli di diverse proprietà immobiliari. -In questo articolo analizzeremo [il contratto ERC-721 di Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). Questo contratto è scritto in [Vyper](https://vyper.readthedocs.io/en/latest/index.html), un linguaggio per contratti simile a Python, pensato per rendere più difficile scrivere codice non sicuro rispetto a Solidity. +In questo articolo analizzeremo [il contratto ERC-721 di Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). +Questo contratto è scritto in [Vyper](https://vyper.readthedocs.io/en/latest/index.html), un linguaggio per contratti simile a Python progettato per rendere più difficile scrivere codice insicuro rispetto a Solidity. ## Il contratto {#contract} ```python -# @dev Implementation of ERC-721 non-fungible token standard. +# @dev Implementazione dello standard dei token non fungibili ERC-721. # @author Ryuya Nakamura (@nrryuya) -# Modified from: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +# Modificato da: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy ``` -I commenti in Vyper, come in Python, iniziano con un hash (`#`) e continuano fino alla fine della riga. I commenti che includono `@` sono usati da [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) per produrre una documentazione leggibile. +I commenti in Vyper, come in Python, iniziano con un cancelletto (`#`) e continuano fino alla fine della riga. I commenti che includono +`@` sono utilizzati da [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) per produrre documentazione leggibile dall'uomo. ```python from vyper.interfaces import ERC721 @@ -34,22 +36,29 @@ from vyper.interfaces import ERC721 implements: ERC721 ``` -L'interfaccia ERC-721 è creata nel linguaggio Vyper. [Puoi vedere qui la definizione del codice](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). La definizione dell'interfaccia è scritta in Python, anziché in Vyper, perché le interfacce non sono usate solo nella blockchain, ma anche quando si invia una transazione alla blockchain da un client esterno, che potrebbe esser scritto in Python. +L'interfaccia ERC-721 è integrata nel linguaggio Vyper. +[Puoi vedere la definizione del codice qui](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). +La definizione dell'interfaccia è scritta in Python, anziché in Vyper, perché le interfacce sono utilizzate non solo all'interno della +blockchain, ma anche quando si invia alla blockchain una transazione da un client esterno, che potrebbe essere scritto in +Python. -La prima riga importa l'interfaccia, la seconda specifica che la stiamo implementando qui. +La prima riga importa l'interfaccia e la seconda specifica che la stiamo implementando qui. ### L'interfaccia ERC721Receiver {#receiver-interface} ```python -# Interface for the contract called by safeTransferFrom() +# Interfaccia per il contratto chiamato da safeTransferFrom() interface ERC721Receiver: def onERC721Received( ``` -ERC-721 supporta due tipi di trasferimento: +L'ERC-721 supporta due tipi di trasferimento: -- `transferFrom`, che consente al mittente di specificare qualsiasi indirizzo di destinazione e pone sul mittente la responsabilità del trasferimento. Ciò significa che puoi trasferire a un indirizzo non valido, nel qual caso l'NFT è perso definitivamente. -- `safeTransferFrom`, che controlla se l'indirizzo di destinazione è un contratto. In tal caso, il contratto ERC-721 chiede al contratto ricevente se vuole ricevere l’NFT. +- `transferFrom`, che consente al mittente di specificare qualsiasi indirizzo di destinazione e pone la responsabilità + del trasferimento sul mittente. Ciò significa che puoi trasferire a un indirizzo non valido, nel qual caso + l'NFT è perso per sempre. +- `safeTransferFrom`, che controlla se l'indirizzo di destinazione è un contratto. In tal caso, il contratto ERC-721 + chiede al contratto ricevente se desidera ricevere l'NFT. Per rispondere alle richieste `safeTransferFrom`, un contratto ricevente deve implementare `ERC721Receiver`. @@ -58,135 +67,165 @@ Per rispondere alle richieste `safeTransferFrom`, un contratto ricevente deve im _from: address, ``` -L'indirizzo `_from` è il proprietario corrente del token. L'indirizzo `_operator` è quello che ha richiesto il trasferimento (i due potrebbero non corrispondere, a causa delle indennità). +L'indirizzo `_from` è l'attuale proprietario del token. L'indirizzo `_operator` è quello che ha +richiesto il trasferimento (questi due potrebbero non essere gli stessi, a causa delle autorizzazioni). ```python _tokenId: uint256, ``` -Gli ID del token ERC-721 sono a 256 bit. Solitamente sono creati mediante hashing di una descrizione di qualsiasi token rappresenti. +Gli ID dei token ERC-721 sono a 256 bit. In genere vengono creati eseguendo l'hash di una descrizione di ciò che +il token rappresenta. ```python _data: Bytes[1024] ``` -La richiesta può avere fino a 1024 byte di dati utente. +La richiesta può contenere fino a 1024 byte di dati utente. ```python ) -> bytes32: view ``` -Per impedire casi la possibilità che un contratto accetti accidentalmente un trasferimento, il valore restituito non è booleano, ma 256 bit con un valore specifico. +Per prevenire i casi in cui un contratto accetta accidentalmente un trasferimento, il valore di ritorno non è un booleano, +ma 256 bit con un valore specifico. -Questa funzione è una `view`, ovvero può leggere lo stato della blockchain, ma non modificarlo. +Questa funzione è una `view`, il che significa che può leggere lo stato della blockchain, ma non modificarlo. ### Eventi {#events} -Gli [eventi](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) sono emessi per informare gli utenti e i server al di fuori della blockchain degli eventi. Nota che il contenuto degli eventi non è disponibile per i contratti sulla blockchain. +Gli [eventi](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) +vengono emessi per informare gli utenti e i server all'esterno della blockchain degli eventi. Nota che il contenuto degli eventi +non è disponibile per i contratti sulla blockchain. ```python -# @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are -# created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any -# number of NFTs may be created and assigned without emitting Transfer. At the time of any -# transfer, the approved address for that NFT (if any) is reset to none. -# @param _from Sender of NFT (if address is zero address it indicates token creation). -# @param _to Receiver of NFT (if address is zero address it indicates token destruction). -# @param _tokenId The NFT that got transferred. +# @dev Emesso quando la proprietà di qualsiasi NFT cambia tramite qualsiasi meccanismo. Questo evento viene emesso quando gli NFT vengono +# creati (`from` == 0) e distrutti (`to` == 0). Eccezione: durante la creazione del contratto, qualsiasi +# numero di NFT può essere creato e assegnato senza emettere Transfer. Al momento di qualsiasi +# trasferimento, l'indirizzo approvato per quell'NFT (se presente) viene reimpostato a nessuno. +# @param _from Mittente dell'NFT (se l'indirizzo è l'indirizzo zero indica la creazione del token). +# @param _to Ricevitore dell'NFT (se l'indirizzo è l'indirizzo zero indica la distruzione del token). +# @param _tokenId L'NFT che è stato trasferito. event Transfer: sender: indexed(address) receiver: indexed(address) tokenId: indexed(uint256) ``` -Questo è simile all'evento di Trasferimento dell'ERC-20, tranne per il fatto che segnaliamo un `tokenId` anziché un importo. Nessuno possiede l'indirizzo zero, quindi per convenzione lo usiamo per segnalare la creazione e distruzione dei token. +Questo è simile all'evento Transfer dell'ERC-20, tranne per il fatto che riportiamo un `tokenId` invece di un importo. +Nessuno possiede l'indirizzo zero, quindi per convenzione lo usiamo per segnalare la creazione e la distruzione dei token. ```python -# @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero -# address indicates there is no approved address. When a Transfer event emits, this also -# indicates that the approved address for that NFT (if any) is reset to none. -# @param _owner Owner of NFT. -# @param _approved Address that we are approving. -# @param _tokenId NFT which we are approving. +# @dev Questo viene emesso quando l'indirizzo approvato per un NFT viene modificato o riaffermato. L'indirizzo +# zero indica che non c'è alcun indirizzo approvato. Quando viene emesso un evento Transfer, questo +# indica anche che l'indirizzo approvato per quell'NFT (se presente) viene reimpostato a nessuno. +# @param _owner Proprietario dell'NFT. +# @param _approved Indirizzo che stiamo approvando. +# @param _tokenId NFT che stiamo approvando. event Approval: owner: indexed(address) approved: indexed(address) tokenId: indexed(uint256) ``` -L'approvazione di un ERC-721 è simile a un'indennità dell'ERC-20. Un indirizzo specifico può trasferire un token specifico. Questo offre ai contratti un meccanismo per rispondere quando accettano un token. I contratti non possono ascoltare gli eventi, quindi se semplicemente trasferisci loro il token, non lo "sanno". In questo modo, il proprietario invia prima un'approvazione e poi una richiesta al contratto: "Ho approvato il tuo trasferimento del token X, sei pregato di...". +Un'approvazione ERC-721 è simile a un'autorizzazione (allowance) ERC-20. A un indirizzo specifico è consentito trasferire un token +specifico. Questo fornisce un meccanismo ai contratti per rispondere quando accettano un token. I contratti non possono +ascoltare gli eventi, quindi se trasferisci semplicemente il token a loro, non ne "sanno" nulla. In questo modo il +proprietario invia prima un'approvazione e poi invia una richiesta al contratto: "Ho approvato il trasferimento del token +X da parte tua, per favore procedi...". -Si tratta di una scelta di progettazione per rendere lo standard ERC-721 simile allo standard ERC-20. Poiché i token di ERC-721 non sono fungibili, un contratto può capire di aver ricevuto un token specifico anche guardando alle sue proprietà. +Questa è una scelta di progettazione per rendere lo standard ERC-721 simile allo standard ERC-20. Poiché +i token ERC-721 non sono fungibili, un contratto può anche identificare di aver ottenuto un token specifico +esaminando la proprietà del token. ```python -# @dev This emits when an operator is enabled or disabled for an owner. The operator can manage -# all NFTs of the owner. -# @param _owner Owner of NFT. -# @param _operator Address to which we are setting operator rights. -# @param _approved Status of operator rights(true if operator rights are given and false if -# revoked). +# @dev Questo viene emesso quando un operatore viene abilitato o disabilitato per un proprietario. L'operatore può gestire +# tutti gli NFT del proprietario. +# @param _owner Proprietario dell'NFT. +# @param _operator Indirizzo al quale stiamo impostando i diritti di operatore. +# @param _approved Stato dei diritti dell'operatore (true se i diritti dell'operatore sono concessi e false se +# revocati). event ApprovalForAll: owner: indexed(address) operator: indexed(address) approved: bool ``` -Talvolta, è utile avere un _operatore_, che possa gestire tutti i token di un conto di un tipo specifico (quelli gestiti da un contratto specifico), similmente a una delega. Ad esempio, potrei voler dare a un contratto una delega per verificare se non l'ho contattato per sei mesi e, in questo caso, distribuisce le mie risorse ai miei eredi (se uno di loro lo richiede, i contratti non possono fare niente senza esser chiamati da una transazione). In ERC-20 possiamo solo dare un'indennità elevata a un contratto di ereditarietà, ma questo non funziona per ERC-721 perché i token non sono fungibili. Questo è l'equivalente. +A volte è utile avere un _operatore_ che possa gestire tutti i token di un account di un tipo specifico (quelli gestiti da +un contratto specifico), in modo simile a una procura. Ad esempio, potrei voler dare tale potere a un contratto che controlla se +non l'ho contattato per sei mesi e, in tal caso, distribuisce i miei beni ai miei eredi (se uno di loro lo chiede, i contratti +non possono fare nulla senza essere chiamati da una transazione). Nell'ERC-20 possiamo semplicemente dare un'alta autorizzazione a un contratto di eredità, +ma questo non funziona per l'ERC-721 perché i token non sono fungibili. Questo è l'equivalente. -Il valore `approved` ci comunica se l'evento è per un'approvazione, o la revoca di un'approvazione. +Il valore `approved` ci dice se l'evento riguarda un'approvazione o il ritiro di un'approvazione. ### Variabili di stato {#state-vars} -Queste variabili contengono lo stato corrente dei token: quali sono disponibili e chi li possiede. Gran parte di questi sono oggetti di `HashMap`, [mappature unidirezionali che esistono tra due tipi](https://vyper.readthedocs.io/en/latest/types.html#mappings). +Queste variabili contengono lo stato attuale dei token: quali sono disponibili e chi li possiede. La maggior parte di questi +sono oggetti `HashMap`, [mappature unidirezionali che esistono tra due tipi](https://vyper.readthedocs.io/en/latest/types.html#mappings). ```python -# @dev Mapping from NFT ID to the address that owns it. +# @dev Mappatura dall'ID dell'NFT all'indirizzo che lo possiede. idToOwner: HashMap[uint256, address] -# @dev Mapping from NFT ID to approved address. +# @dev Mappatura dall'ID dell'NFT all'indirizzo approvato. idToApprovals: HashMap[uint256, address] ``` -Le identità dell'utente e del contratto su Ethereum sono rappresentate da indirizzi a 160 bit. Queste due variabili mappano gli ID dei token con i loro proprietari e quelli approvati per trasferirli (a un massimo di uno ciascuno). In Ethereum, i dati non inizializzati sono sempre zero, quindi se non c'è alcun proprietario o trasferente approvato, il valore per quel token è zero. +Le identità degli utenti e dei contratti in Ethereum sono rappresentate da indirizzi a 160 bit. Queste due variabili mappano +dagli ID dei token ai loro proprietari e a coloro che sono approvati per trasferirli (al massimo uno per ciascuno). In Ethereum, +i dati non inizializzati sono sempre zero, quindi se non c'è un proprietario o un trasferitore approvato, il valore per quel token +è zero. ```python -# @dev Mapping from owner address to count of his tokens. +# @dev Mappatura dall'indirizzo del proprietario al conteggio dei suoi token. ownerToNFTokenCount: HashMap[address, uint256] ``` -Questa variabile tiene conto dei token per ogni proprietario. Non c'è alcuna mappatura dai proprietari ai token, quindi l'unico modo per identificare i token che un proprietario specifico possiede è guardare alla cronologia di eventi della blockchain e vedere gli eventi di `trasferimento` appropriati. Possiamo usare questa variabile per sapere quando abbiamo tutti gli NFT e non dobbiamo guardare oltre nel tempo. +Questa variabile contiene il conteggio dei token per ogni proprietario. Non c'è alcuna mappatura dai proprietari ai token, quindi +l'unico modo per identificare i token posseduti da un proprietario specifico è guardare indietro nella cronologia degli eventi della blockchain +e vedere gli eventi `Transfer` appropriati. Possiamo usare questa variabile per sapere quando abbiamo tutti gli NFT e non +abbiamo bisogno di guardare ancora più indietro nel tempo. -Questo algoritmo funziona solo per le interfacce utente e i server esterni. Il codice in esecuzione sulla blockchain stessa non può leggere gli eventi passati. +Nota che questo algoritmo funziona solo per le interfacce utente e i server esterni. Il codice in esecuzione sulla blockchain +stessa non può leggere gli eventi passati. ```python -# @dev Mapping from owner address to mapping of operator addresses. +# @dev Mappatura dall'indirizzo del proprietario alla mappatura degli indirizzi degli operatori. ownerToOperators: HashMap[address, HashMap[address, bool]] ``` -Un conto potrebbe avere più di un singolo operatore. Un semplice `HashMap` è insufficiente per tenerne traccia, perché ogni chiave conduce a un valore singolo. Invece, puoi usare `HashMap[address, bool]` come valore. Di default, il valore per ogni indirizzo è `False`, che significa che non è un operatore. Puoi impostare i valori a `True` se necessario. +Un account può avere più di un singolo operatore. Una semplice `HashMap` è insufficiente per +tenerne traccia, perché ogni chiave porta a un singolo valore. Invece, puoi usare +`HashMap[address, bool]` come valore. Per impostazione predefinita, il valore per ogni indirizzo è `False`, il che significa che +non è un operatore. Puoi impostare i valori su `True` secondo necessità. ```python -# @dev Address of minter, who can mint a token +# @dev Indirizzo del minter, che può coniare un token minter: address ``` -I nuovi token devono in qualche modo esser creati. In questo contratto, esiste solo un'entità che può farlo, il `coniatore`. Questo sarà probabilmente sufficiente per un gioco, ad esempio. Per altri scopi, potrebbe esser necessario creare una logica di business più complicata. +I nuovi token devono essere creati in qualche modo. In questo contratto c'è una singola entità a cui è consentito farlo, il +`minter` (coniatore). Questo è probabilmente sufficiente per un gioco, ad esempio. Per altri scopi, potrebbe essere necessario +creare una logica di business più complicata. ```python -# @dev Mapping of interface id to bool about whether or not it's supported +# @dev Mappatura dell'id dell'interfaccia a bool per indicare se è supportata o meno supportedInterfaces: HashMap[bytes32, bool] -# @dev ERC165 interface ID of ERC165 +# @dev ID dell'interfaccia ERC165 di ERC165 ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 -# @dev ERC165 interface ID of ERC721 +# @dev ID dell'interfaccia ERC165 di ERC721 ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd ``` -[ERC-165](https://eips.ethereum.org/EIPS/eip-165) specifica un meccanismo con cui un contratto può rivelare come le applicazioni possono comunicare con esso, a quali ERC è conforme. In questo caso, il contratto è conforme a ERC-165 ed ERC-721. +L'[ERC-165](https://eips.ethereum.org/EIPS/eip-165) specifica un meccanismo per un contratto per rivelare come le applicazioni +possono comunicare con esso, a quali ERC è conforme. In questo caso, il contratto è conforme a ERC-165 ed ERC-721. ### Funzioni {#functions} -Queste sono le funzioni che implementano effettivamente ERC-721. +Queste sono le funzioni che implementano effettivamente l'ERC-721. #### Costruttore {#constructor} @@ -195,15 +234,18 @@ Queste sono le funzioni che implementano effettivamente ERC-721. def __init__(): ``` -In Vyper, come in Python, la funzione del costruttore è chiamata `__init__`. +In Vyper, come in Python, la funzione costruttore è chiamata `__init__`. ```python - """ - @dev Contract constructor. - """ + # @dev Costruttore del contratto. + + + ``` -Su Python e su Vyper, puoi anche creare un commento specificando una stringa su più righe (che inizia e termina per `"""`), senza usarla in alcun modo. Questi commenti possono anche includere [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html). +In Python e in Vyper, puoi anche creare un commento specificando una stringa multilinea (che inizia e finisce +con `"""`) e non utilizzandola in alcun modo. Questi commenti possono includere anche +[NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html). ```python self.supportedInterfaces[ERC165_INTERFACE_ID] = True @@ -211,57 +253,69 @@ Su Python e su Vyper, puoi anche creare un commento specificando una stringa su self.minter = msg.sender ``` -Per accedere alle variabili di stato, si usa `self.` (di nuovo, come in Python). +Per accedere alle variabili di stato si usa `self.` (di nuovo, come in Python). -#### Funzioni di visualizzazione {#views} +#### Funzioni View {#views} -Sono funzioni che non modificano lo stato della blockchain e dunque sono eseguibili liberamente se chiamate esternamente. Se le funzioni di visualizzazione sono chiamate da un contratto, devono comunque esser eseguite su ogni nodo e, dunque, costano gas. +Queste sono funzioni che non modificano lo stato della blockchain e, pertanto, possono essere eseguite +gratuitamente se chiamate esternamente. Se le funzioni view vengono chiamate da un contratto, devono comunque essere eseguite su +ogni nodo e quindi costano gas. ```python @view @external ``` -Queste parole chiave prima della definizione di una funzione che inizia con un segno (`@`) sono dette _decorazioni_. Specificano le circostanze in cui una funzione è chiamabile. +Queste parole chiave prima della definizione di una funzione che iniziano con una chiocciola (`@`) sono chiamate _decorazioni_. +Specificano le circostanze in cui una funzione può essere chiamata. -- `@view` specifica che questa funzione è una visualizzazione. -- `@external` specifica che questa particolare funzione è chiamabile dalle transazioni o da altri contratti. +- `@view` specifica che questa funzione è una view. +- `@external` specifica che questa particolare funzione può essere chiamata dalle transazioni e da altri contratti. ```python def supportsInterface(_interfaceID: bytes32) -> bool: ``` -A differenza di Python, Vyper è un [linguaggio tipizzato statico](https://wikipedia.org/wiki/Type_system#Static_type_checking). Non puoi dichiarare una variabile, o il parametro di una funzione, senza indicare il [tipo di dato](https://vyper.readthedocs.io/en/latest/types.html). In questo caso, il parametro inserito è `bytes32`, un valore a 256 bit (256 bit è la dimensione nativa della word della [Macchina Virtuale di Ethereum](/developers/docs/evm/)). L'output è un valore booleano. Per convenzione, i nomi dei parametri della funzione iniziano con un trattino basso (`_`). +A differenza di Python, Vyper è un [linguaggio a tipizzazione statica](https://wikipedia.org/wiki/Type_system#Static_type_checking). +Non puoi dichiarare una variabile o un parametro di funzione senza identificare il [tipo di dato](https://vyper.readthedocs.io/en/latest/types.html). In questo caso il parametro di input è `bytes32`, un valore a 256 bit +(256 bit è la dimensione della parola nativa della [macchina virtuale di Ethereum](/developers/docs/evm/)). L'output è un valore booleano. +Per convenzione, i nomi dei parametri di funzione iniziano con un trattino basso (`_`). ```python - """ - @dev Interface identification is specified in ERC-165. - @param _interfaceID Id of the interface - """ + # @dev L'identificazione dell'interfaccia è specificata in ERC-165. + @param _interfaceID Id dell'interfaccia + + + + return self.supportedInterfaces[_interfaceID] ``` -Restituisce il valore dall'HashMap `self-supportedInterfaces`, che è impostata nel costruttore (`__init__`). +Restituisce il valore dalla HashMap `self.supportedInterfaces`, che è impostata nel costruttore (`__init__`). ```python -### VIEW FUNCTIONS ### +# ## FUNZIONI DI VISUALIZZAZIONE ### ``` -Queste sono le funzioni di visualizzazione che rendono le informazioni sui token disponibili a utenti e altri contratti. +Queste sono le funzioni view che rendono disponibili le informazioni sui token agli utenti e ad altri contratti. ```python @view @external def balanceOf(_owner: address) -> uint256: - """ - @dev Returns the number of NFTs owned by `_owner`. - Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. - @param _owner Address for whom to query the balance. - """ + # @dev Restituisce il numero di NFT posseduti da `_owner`. + Genera un'eccezione se `_owner` è l'indirizzo zero. Gli NFT assegnati all'indirizzo zero sono considerati non validi. + @param _owner Indirizzo per il quale interrogare il saldo. + + + + + assert _owner != ZERO_ADDRESS ``` -Questa riga [afferma](https://vyper.readthedocs.io/en/latest/statements.html#assert) che `_owner` non è zero. Se lo è, c'è un errore e l'operazione è annullata. +Questa riga [asserisce](https://vyper.readthedocs.io/en/latest/statements.html#assert) che `_owner` non è +zero. Se lo è, c'è un errore e l'operazione viene annullata (reverted). ```python return self.ownerToNFTokenCount[_owner] @@ -269,72 +323,91 @@ Questa riga [afferma](https://vyper.readthedocs.io/en/latest/statements.html#ass @view @external def ownerOf(_tokenId: uint256) -> address: - """ - @dev Returns the address of the owner of the NFT. - Throws if `_tokenId` is not a valid NFT. - @param _tokenId The identifier for an NFT. - """ + # @dev Restituisce l'indirizzo del proprietario dell'NFT. + Genera un'eccezione se `_tokenId` non è un NFT valido. + @param _tokenId L'identificatore per un NFT. + + + + + owner: address = self.idToOwner[_tokenId] - # Throws if `_tokenId` is not a valid NFT + # Genera un'eccezione se `_tokenId` non è un NFT valido assert owner != ZERO_ADDRESS return owner ``` -Nella Macchina Virtuale di Ethereum (EVM), ogni memoria senza un valore memorizzato è zero. Se non esiste alcun token a `_tokenId`, allora il valore di `self.idToOwner[_tokenId]` è zero. In quel caso la funzione si annulla. +Nella macchina virtuale di Ethereum (EVM) qualsiasi spazio di archiviazione che non ha un valore memorizzato in esso è zero. +Se non c'è alcun token in `_tokenId`, il valore di `self.idToOwner[_tokenId]` è zero. In tal +caso la funzione viene annullata. ```python @view @external def getApproved(_tokenId: uint256) -> address: - """ - @dev Get the approved address for a single NFT. - Throws if `_tokenId` is not a valid NFT. - @param _tokenId ID of the NFT to query the approval of. - """ - # Throws if `_tokenId` is not a valid NFT + # @dev Ottiene l'indirizzo approvato per un singolo NFT. + Genera un'eccezione se `_tokenId` non è un NFT valido. + @param _tokenId ID dell'NFT di cui interrogare l'approvazione. + + + + + + # Genera un'eccezione se `_tokenId` non è un NFT valido assert self.idToOwner[_tokenId] != ZERO_ADDRESS return self.idToApprovals[_tokenId] ``` -Nota che `getApproved` _può_ restituire zero. Se il token è valido, restituisce `self.idToApprovals[_tokenId]`. Se non c'è alcun approvatore, quel valore è zero. +Nota che `getApproved` _può_ restituire zero. Se il token è valido, restituisce `self.idToApprovals[_tokenId]`. +Se non c'è alcun approvatore, quel valore è zero. ```python @view @external def isApprovedForAll(_owner: address, _operator: address) -> bool: - """ - @dev Checks if `_operator` is an approved operator for `_owner`. - @param _owner The address that owns the NFTs. - @param _operator The address that acts on behalf of the owner. - """ + # @dev Controlla se `_operator` è un operatore approvato per `_owner`. + @param _owner L'indirizzo che possiede gli NFT. + @param _operator L'indirizzo che agisce per conto del proprietario. + + + + + return (self.ownerToOperators[_owner])[_operator] ``` -Questa funzione verifica se `_operator` può gestire tutti i token del `_owner` in questo contratto. Poiché possono esserci diversi operatori, si tratta di un HashMap a due livelli. +Questa funzione controlla se a `_operator` è consentito gestire tutti i token di `_owner` in questo contratto. +Poiché possono esserci più operatori, questa è una HashMap a due livelli. -#### Funzioni d'aiuto al trasferimento {#transfer-helpers} +#### Funzioni di supporto al trasferimento {#transfer-helpers} Queste funzioni implementano operazioni che fanno parte del trasferimento o della gestione dei token. ```python -### TRANSFER FUNCTION HELPERS ### +# ## FUNZIONI DI SUPPORTO AL TRASFERIMENTO ### @view @internal ``` -Questa decorazione, `@internal`, significa che la funzione è accessibile solo da altre funzioni nello stesso contratto. Per convenzione, questi nomi di funzione iniziano anch'essi con un trattino basso (`_`). +Questa decorazione, `@internal`, significa che la funzione è accessibile solo da altre funzioni all'interno dello +stesso contratto. Per convenzione, anche i nomi di queste funzioni iniziano con un trattino basso (`_`). ```python def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: - """ - @dev Returns whether the given spender can transfer a given token ID - @param spender address of the spender to query - @param tokenId uint256 ID of the token to be transferred - @return bool whether the msg.sender is approved for the given token ID, - is an operator of the owner, or is the owner of the token - """ + # @dev Restituisce se lo spender specificato può trasferire un determinato ID del token + @param spender indirizzo dello spender da interrogare + @param tokenId uint256 ID del token da trasferire + @return bool se il msg.sender è approvato per l'ID del token specificato, + è un operatore del proprietario, o è il proprietario del token + + + + + + + owner: address = self.idToOwner[_tokenId] spenderIsOwner: bool = owner == _spender spenderIsApproved: bool = _spender == self.idToApprovals[_tokenId] @@ -342,117 +415,145 @@ def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: return (spenderIsOwner or spenderIsApproved) or spenderIsApprovedForAll ``` -Esistono tre modi in cui a un indirizzo è consentito trasferire un token: +Ci sono tre modi in cui a un indirizzo può essere consentito di trasferire un token: 1. L'indirizzo è il proprietario del token -2. L'indirizzo è autorizzato a spendere quel token +2. L'indirizzo è approvato per spendere quel token 3. L'indirizzo è un operatore per il proprietario del token -La funzione che precedere può essere una visualizzazione, perché non modifica lo stato. Per ridurre i costi operativi, ogni funzione che _può_ essere una visualizzazione, _dovrebbe_ esserlo. +La funzione precedente può essere una view perché non modifica lo stato. Per ridurre i costi operativi, qualsiasi +funzione che _può_ essere una view _dovrebbe_ essere una view. ```python @internal def _addTokenTo(_to: address, _tokenId: uint256): - """ - @dev Add a NFT to a given address - Throws if `_tokenId` is owned by someone. - """ - # Throws if `_tokenId` is owned by someone + # @dev Aggiunge un NFT a un determinato indirizzo + Genera un'eccezione se `_tokenId` è posseduto da qualcuno. + + + + + # Genera un'eccezione se `_tokenId` è posseduto da qualcuno assert self.idToOwner[_tokenId] == ZERO_ADDRESS - # Change the owner + # Cambia il proprietario self.idToOwner[_tokenId] = _to - # Change count tracking + # Cambia il tracciamento del conteggio self.ownerToNFTokenCount[_to] += 1 @internal def _removeTokenFrom(_from: address, _tokenId: uint256): - """ - @dev Remove a NFT from a given address - Throws if `_from` is not the current owner. - """ - # Throws if `_from` is not the current owner + # @dev Rimuove un NFT da un determinato indirizzo + Genera un'eccezione se `_from` non è il proprietario attuale. + + + + + # Genera un'eccezione se `_from` non è il proprietario attuale assert self.idToOwner[_tokenId] == _from - # Change the owner + # Cambia il proprietario self.idToOwner[_tokenId] = ZERO_ADDRESS - # Change count tracking + # Cambia il tracciamento del conteggio self.ownerToNFTokenCount[_from] -= 1 ``` -Quando c'è un problema con un trasferimento, anulliamo la chiamata. +Quando c'è un problema con un trasferimento, annulliamo la chiamata. ```python @internal def _clearApproval(_owner: address, _tokenId: uint256): - """ - @dev Clear an approval of a given address - Throws if `_owner` is not the current owner. - """ - # Throws if `_owner` is not the current owner + # @dev Cancella un'approvazione di un determinato indirizzo + Genera un'eccezione se `_owner` non è il proprietario attuale. + + + + + # Genera un'eccezione se `_owner` non è il proprietario attuale assert self.idToOwner[_tokenId] == _owner if self.idToApprovals[_tokenId] != ZERO_ADDRESS: - # Reset approvals + # Reimposta le approvazioni self.idToApprovals[_tokenId] = ZERO_ADDRESS ``` -Cambia il valore solo se necessario. Le variabili di stato risiedono nella memoria. La scrittura all'archiviazione è una delle operazioni più costose che l'EVM (Macchina Virtuale di Ethereum) effettua (in termini di [gas](/developers/docs/gas/)). Dunque, è bene mantenerla al minimo, anche scrivere il valore esistente ha un costo elevato. +Modifica il valore solo se necessario. Le variabili di stato risiedono nell'archiviazione (storage). Scrivere nell'archiviazione è +una delle operazioni più costose che l'EVM (macchina virtuale di Ethereum) esegue (in termini di +[gas](/developers/docs/gas/)). Pertanto, è una buona idea ridurla al minimo; persino scrivere il +valore esistente ha un costo elevato. ```python @internal def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): - """ - @dev Execute transfer of a NFT. - Throws unless `msg.sender` is the current owner, an authorized operator, or the approved - address for this NFT. (NOTE: `msg.sender` not allowed in private function so pass `_sender`.) - Throws if `_to` is the zero address. - Throws if `_from` is not the current owner. - Throws if `_tokenId` is not a valid NFT. - """ + # @dev Esegue il trasferimento di un NFT. + Genera un'eccezione a meno che `msg.sender` non sia il proprietario attuale, un operatore autorizzato o l'indirizzo + approvato per questo NFT. (NOTA: `msg.sender` non è consentito in una funzione privata, quindi passa `_sender`.) + Genera un'eccezione se `_to` è l'indirizzo zero. + Genera un'eccezione se `_from` non è il proprietario attuale. + Genera un'eccezione se `_tokenId` non è un NFT valido. + + + + + + + + ``` -Abbiamo questa funzione interna perché esistono due modi per trasferire i token (regolare e sicuro), ma vogliamo una sola posizione nel codice dove farlo, per semplificare il controllo. +Abbiamo questa funzione interna perché ci sono due modi per trasferire i token (normale e sicuro), ma +vogliamo solo una singola posizione nel codice in cui lo facciamo per semplificare l'auditing. ```python - # Check requirements + # Controlla i requisiti assert self._isApprovedOrOwner(_sender, _tokenId) - # Throws if `_to` is the zero address + # Genera un'eccezione se `_to` è l'indirizzo zero assert _to != ZERO_ADDRESS - # Clear approval. Throws if `_from` is not the current owner + # Cancella l'approvazione. Genera un'eccezione se `_from` non è il proprietario attuale self._clearApproval(_from, _tokenId) - # Remove NFT. Throws if `_tokenId` is not a valid NFT + # Rimuove l'NFT. Genera un'eccezione se `_tokenId` non è un NFT valido self._removeTokenFrom(_from, _tokenId) - # Add NFT + # Aggiunge l'NFT self._addTokenTo(_to, _tokenId) - # Log the transfer + # Registra il trasferimento log Transfer(_from, _to, _tokenId) ``` -Per emettere un evento su Vyper, si usa una dichiarazione di `log` ([vedi qui per ulteriori dettagli](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). +Per emettere un evento in Vyper si usa un'istruzione `log` ([vedi qui per maggiori dettagli](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). #### Funzioni di trasferimento {#transfer-funs} ```python -### TRANSFER FUNCTIONS ### +# ## FUNZIONI DI TRASFERIMENTO ### @external def transferFrom(_from: address, _to: address, _tokenId: uint256): - """ - @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved - address for this NFT. - Throws if `_from` is not the current owner. - Throws if `_to` is the zero address. - Throws if `_tokenId` is not a valid NFT. - @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else - they maybe be permanently lost. - @param _from The current owner of the NFT. - @param _to The new owner. - @param _tokenId The NFT to transfer. - """ + # @dev Genera un'eccezione a meno che `msg.sender` non sia il proprietario attuale, un operatore autorizzato o l'indirizzo + approvato per questo NFT. + Genera un'eccezione se `_from` non è il proprietario attuale. + Genera un'eccezione se `_to` è l'indirizzo zero. + Genera un'eccezione se `_tokenId` non è un NFT valido. + @notice Il chiamante è responsabile di confermare che `_to` sia in grado di ricevere NFT, altrimenti + potrebbero andare persi in modo permanente. + @param _from Il proprietario attuale dell'NFT. + @param _to Il nuovo proprietario. + @param _tokenId L'NFT da trasferire. + + + + + + + + + + + + self._transferFrom(_from, _to, _tokenId, msg.sender) ``` -Questa funzione ti consente di trasferire a un indirizzo arbitrario. A meno che l'indirizzo non sia un utente o un contratto che sa come trasferire i token, ogni token che trasferisci sarà bloccato in quell'indirizzo e inutile. +Questa funzione ti consente di trasferire a un indirizzo arbitrario. A meno che l'indirizzo non sia un utente o un contratto che +sa come trasferire i token, qualsiasi token trasferito rimarrà bloccato in quell'indirizzo e sarà inutile. ```python @external @@ -462,172 +563,228 @@ def safeTransferFrom( _tokenId: uint256, _data: Bytes[1024]=b"" ): - """ - @dev Transfers the ownership of an NFT from one address to another address. - Throws unless `msg.sender` is the current owner, an authorized operator, or the - approved address for this NFT. - Throws if `_from` is not the current owner. - Throws if `_to` is the zero address. - Throws if `_tokenId` is not a valid NFT. - If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if - the return value is not `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. - NOTE: bytes4 is represented by bytes32 with padding - @param _from The current owner of the NFT. - @param _to The new owner. - @param _tokenId The NFT to transfer. - @param _data Additional data with no specified format, sent in call to `_to`. - """ + # @dev Trasferisce la proprietà di un NFT da un indirizzo a un altro indirizzo. + Genera un'eccezione a meno che `msg.sender` non sia il proprietario attuale, un operatore autorizzato o + l'indirizzo approvato per questo NFT. + Genera un'eccezione se `_from` non è il proprietario attuale. + Genera un'eccezione se `_to` è l'indirizzo zero. + Genera un'eccezione se `_tokenId` non è un NFT valido. + Se `_to` è uno smart contract, chiama `onERC721Received` su `_to` e genera un'eccezione se + il valore di ritorno non è `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + NOTA: bytes4 è rappresentato da bytes32 con padding + @param _from Il proprietario attuale dell'NFT. + @param _to Il nuovo proprietario. + @param _tokenId L'NFT da trasferire. + @param _data Dati aggiuntivi senza formato specificato, inviati nella chiamata a `_to`. + + + + + + + + + + + + + + + self._transferFrom(_from, _to, _tokenId, msg.sender) ``` -Va bene effettuare prima il trasferimento perché se c'è un problema, ripristineremo comunque, quindi tutto ciò che è fatto nella chiamata sarà annullato. +Va bene eseguire prima il trasferimento perché, se c'è un problema, annulleremo comunque l'operazione, +quindi tutto ciò che è stato fatto nella chiamata verrà cancellato. ```python - if _to.is_contract: # check if `_to` is a contract address + if _to.is_contract: # controlla se `_to` è un indirizzo di contratto ``` -Prima controlla per vedere se l'indirizzo è un contratto (se ha il codice). Altrimenti, presumi che sia un indirizzo utente e che l'utente possa usare o trasferire il token. Ma non abbandonarti a un falso senso di sicurezza. Puoi infatti perdere i token, anche con `safeTransferFrom`, se li trasferisci a un indirizzo di cui nessuno conosce la chiave privata. +Per prima cosa controlla se l'indirizzo è un contratto (se ha del codice). In caso contrario, presumi che sia un indirizzo utente +e che l'utente sarà in grado di utilizzare il token o trasferirlo. Ma non farti cullare da un falso +senso di sicurezza. Puoi perdere i token, anche con `safeTransferFrom`, se li trasferisci +a un indirizzo di cui nessuno conosce la chiave privata. ```python returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) ``` -Chiama il contratto di destinazione per vedere se può ricevere i token ERC-721. +Chiama il contratto di destinazione per vedere se può ricevere token ERC-721. ```python - # Throws if transfer destination is a contract which does not implement 'onERC721Received' + # Genera un'eccezione se la destinazione del trasferimento è un contratto che non implementa 'onERC721Received' assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) ``` -Se la destinazione è un contratto, ma un contratto che non accetta i token ERC-721 (o che ha deciso di non accettare questo specifico trasferimento), annulla. +Se la destinazione è un contratto, ma non accetta token ERC-721 (o ha deciso di non accettare questo +particolare trasferimento), annulla l'operazione. ```python @external def approve(_approved: address, _tokenId: uint256): - """ - @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. - Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. - Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) - Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) - @param _approved Address to be approved for the given NFT ID. - @param _tokenId ID of the token to be approved. - """ + # @dev Imposta o riafferma l'indirizzo approvato per un NFT. L'indirizzo zero indica che non c'è alcun indirizzo approvato. + Genera un'eccezione a meno che `msg.sender` non sia il proprietario attuale dell'NFT, o un operatore autorizzato del proprietario attuale. + Genera un'eccezione se `_tokenId` non è un NFT valido. (NOTA: Questo non è scritto nell'EIP) + Genera un'eccezione se `_approved` è il proprietario attuale. (NOTA: Questo non è scritto nell'EIP) + @param _approved Indirizzo da approvare per l'ID dell'NFT specificato. + @param _tokenId ID del token da approvare. + + + + + + + + owner: address = self.idToOwner[_tokenId] - # Throws if `_tokenId` is not a valid NFT + # Genera un'eccezione se `_tokenId` non è un NFT valido assert owner != ZERO_ADDRESS - # Throws if `_approved` is the current owner + # Genera un'eccezione se `_approved` è il proprietario attuale assert _approved != owner ``` Per convenzione, se non vuoi avere un approvatore, nomini l'indirizzo zero, non te stesso. ```python - # Check requirements + # Controlla i requisiti senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] assert (senderIsOwner or senderIsApprovedForAll) ``` -Per impostare un'approvazione, puoi essere il proprietario o un operatore autorizzato dal proprietario. +Per impostare un'approvazione puoi essere il proprietario o un operatore autorizzato dal proprietario. ```python - # Set the approval + # Imposta l'approvazione self.idToApprovals[_tokenId] = _approved log Approval(owner, _approved, _tokenId) @external def setApprovalForAll(_operator: address, _approved: bool): - """ - @dev Enables or disables approval for a third party ("operator") to manage all of - `msg.sender`'s assets. It also emits the ApprovalForAll event. - Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) - @notice This works even if sender doesn't own any tokens at the time. - @param _operator Address to add to the set of authorized operators. - @param _approved True if the operators is approved, false to revoke approval. - """ - # Throws if `_operator` is the `msg.sender` + # @dev Abilita o disabilita l'approvazione per una terza parte ("operatore") per gestire tutti gli + asset di `msg.sender`. Emette anche l'evento ApprovalForAll. + Genera un'eccezione se `_operator` è il `msg.sender`. (NOTA: Questo non è scritto nell'EIP) + @notice Questo funziona anche se il mittente non possiede alcun token in quel momento. + @param _operator Indirizzo da aggiungere all'insieme degli operatori autorizzati. + @param _approved True se l'operatore è approvato, false per revocare l'approvazione. + + + + + + + + + # Genera un'eccezione se `_operator` è il `msg.sender` assert _operator != msg.sender self.ownerToOperators[msg.sender][_operator] = _approved log ApprovalForAll(msg.sender, _operator, _approved) ``` -#### Conia nuovi token e distruggi token esistenti {#mint-burn} +#### Coniare nuovi token e distruggere quelli esistenti {#mint-burn} -Il conto che ha creato il contratto è il `minter`, il super utente autorizzato a coniare nuovi NFT. Tuttavia, nemmeno lui è autorizzato a bruciare i token esistenti. Può farlo solo il proprietario, o un'entità da autorizzata dal proprietario. +L'account che ha creato il contratto è il `minter`, il super utente autorizzato a coniare +nuovi NFT. Tuttavia, nemmeno a lui è consentito bruciare i token esistenti. Solo il proprietario, o un'entità +autorizzata dal proprietario, può farlo. ```python -### MINT & BURN FUNCTIONS ### +# ## FUNZIONI PER CONIARE E BRUCIARE ### @external def mint(_to: address, _tokenId: uint256) -> bool: ``` -Questa funzione restituisce sempre `True`, perché se l'operazione fallisce è ripristinata. +Questa funzione restituisce sempre `True`, perché se l'operazione fallisce viene annullata. ```python - """ - @dev Function to mint tokens - Throws if `msg.sender` is not the minter. - Throws if `_to` is zero address. - Throws if `_tokenId` is owned by someone. - @param _to The address that will receive the minted tokens. - @param _tokenId The token id to mint. - @return A boolean that indicates if the operation was successful. - """ - # Throws if `msg.sender` is not the minter + # @dev Funzione per coniare token + Genera un'eccezione se `msg.sender` non è il minter. + Genera un'eccezione se `_to` è l'indirizzo zero. + Genera un'eccezione se `_tokenId` è posseduto da qualcuno. + @param _to L'indirizzo che riceverà i token coniati. + @param _tokenId L'id del token da coniare. + @return Un booleano che indica se l'operazione ha avuto successo. + + + + + + + + + + # Genera un'eccezione se `msg.sender` non è il minter assert msg.sender == self.minter ``` -Solo il coniatore (il conto che ha creato il contratto ERC-721) può coniare nuovi token. Questo può essere un problema in futuro se si vuole cambiare l'identità del coniatore. In un contratto di produzione, potresti volere una funzione che consenta al coniatore di trasferire i propri privilegi a qualcun altro. +Solo il minter (l'account che ha creato il contratto ERC-721) può coniare nuovi token. Questo può essere un +problema in futuro se vogliamo cambiare l'identità del minter. In +un contratto di produzione probabilmente vorresti una funzione che consenta al minter di trasferire +i privilegi di minter a qualcun altro. ```python - # Throws if `_to` is zero address + # Genera un'eccezione se `_to` è l'indirizzo zero assert _to != ZERO_ADDRESS - # Add NFT. Throws if `_tokenId` is owned by someone + # Aggiunge l'NFT. Genera un'eccezione se `_tokenId` è posseduto da qualcuno self._addTokenTo(_to, _tokenId) log Transfer(ZERO_ADDRESS, _to, _tokenId) return True ``` -Per convenzione, coniare i nuovi token conta come un trasferimento all'indirizzo zero. +Per convenzione, il conio di nuovi token conta come un trasferimento dall'indirizzo zero. ```python @external def burn(_tokenId: uint256): - """ - @dev Burns a specific ERC721 token. - Throws unless `msg.sender` is the current owner, an authorized operator, or the approved - address for this NFT. - Throws if `_tokenId` is not a valid NFT. - @param _tokenId uint256 id of the ERC721 token to be burned. - """ - # Check requirements + # @dev Brucia uno specifico token ERC721. + Genera un'eccezione a meno che `msg.sender` non sia il proprietario attuale, un operatore autorizzato o l'indirizzo + approvato per questo NFT. + Genera un'eccezione se `_tokenId` non è un NFT valido. + @param _tokenId uint256 id del token ERC721 da bruciare. + + + + + + + + # Controlla i requisiti assert self._isApprovedOrOwner(msg.sender, _tokenId) owner: address = self.idToOwner[_tokenId] - # Throws if `_tokenId` is not a valid NFT + # Genera un'eccezione se `_tokenId` non è un NFT valido assert owner != ZERO_ADDRESS self._clearApproval(owner, _tokenId) self._removeTokenFrom(owner, _tokenId) log Transfer(owner, ZERO_ADDRESS, _tokenId) ``` -Chiunque è autorizzato a trasferire un token, può bruciarlo. Anche se bruciare un token appare equivalente a trasferirlo all'indirizzo zero, l'indirizzo zero non riceve realmente il token. Ciò ci consente di liberare tutta l'archiviazione usata per il token, riducendo il costo del gas della transazione. +Chiunque sia autorizzato a trasferire un token è autorizzato a bruciarlo. Sebbene una bruciatura appaia equivalente al +trasferimento all'indirizzo zero, l'indirizzo zero in realtà non riceve il token. Questo ci consente di +liberare tutto lo spazio di archiviazione che è stato utilizzato per il token, il che può ridurre il costo del gas della transazione. -## Usare questo contratto {#using-contract} +## Utilizzare questo contratto {#using-contract} -A differenza di Solidity, Vyper non ha un ereditarietà. Si tratta di una scelta progettuale deliberata per rendere il codice più chiaro e quindi più facile da proteggere. Quindi, per creare il tuo contratto ERC-721 in Vyper, prendi [questo contratto](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) e lo modifichi per implementare la logica di business che desideri. +A differenza di Solidity, Vyper non ha l'ereditarietà. Questa è una scelta di progettazione deliberata per rendere il +codice più chiaro e quindi più facile da proteggere. Quindi, per creare il tuo contratto ERC-721 in Vyper, prendi [questo +contratto](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) e modificalo +per implementare la logica di business che desideri. -### Conclusione {#conclusion} +## Conclusione {#conclusion} -Per ripasso presentiamo alcune delle idee più importanti in questo contratto: +Per riepilogare, ecco alcune delle idee più importanti in questo contratto: -- Per ricevere i token ERC-721 con un trasferimento sicuro, i contratti devono implementare l'interfaccia di `ERC721Receiver`. -- Anche se usi il trasferimento sicuro, i token possono comunque rimanere bloccati se li invii a un indirizzo la cui chiave privata è sconosciuta. -- Quando c'è un problema con un'operazione, è una buona idea eseguire il `revert` della chiamata, piuttosto che restituire semplicemente un valore d'errore. +- Per ricevere token ERC-721 con un trasferimento sicuro, i contratti devono implementare l'interfaccia `ERC721Receiver`. +- Anche se usi il trasferimento sicuro, i token possono comunque rimanere bloccati se li invii a un indirizzo di cui non si conosce la chiave privata. +- Quando c'è un problema con un'operazione, è una buona idea annullare (`revert`) la chiamata, piuttosto che restituire semplicemente + un valore di fallimento. - I token ERC-721 esistono quando hanno un proprietario. -- Esistono tre modi per essere autorizzati a trasferire un NFT. Puoi essere il proprietario, essere approvato per un token specifico o essere un operatore per tutti i token del proprietario. -- Gli eventi passati sono visibili solo al di fuori della blockchain. Il codice eseguito nella blockchain non può vederli. +- Ci sono tre modi per essere autorizzati a trasferire un NFT. Puoi essere il proprietario, essere approvato per un token specifico, + o essere un operatore per tutti i token del proprietario. +- Gli eventi passati sono visibili solo all'esterno della blockchain. Il codice in esecuzione all'interno della blockchain non può visualizzarli. + +Ora vai e implementa contratti Vyper sicuri. -Ora puoi andare a implementare contratti sicuri in Vyper. +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/it/developers/tutorials/erc20-annotated-code/index.md index c28b6b22582..833f74e51a3 100644 --- a/public/content/translations/it/developers/tutorials/erc20-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/erc20-annotated-code/index.md @@ -1,31 +1,29 @@ --- title: "Guida dettagliata al contratto ERC-20" -description: Cosa c'è nel contratto ERC-20 di OpenZeppelin e a cosa serve? +description: "Cosa c'è nel contratto ERC-20 di OpenZeppelin e perché si trova lì?" author: Ori Pomerantz lang: it -tags: - - "solidity" - - "erc-20" +tags: ["Solidity", "erc-20"] skill: beginner -breadcrumb: "ERC-20 passo passo" +breadcrumb: Guida dettagliata a ERC-20 published: 2021-03-09 --- ## Introduzione {#introduction} -Uno degli utilizzi più comuni di Ethereum è quello di permettere a un gruppo di persone di creare un token scambiabile, che potremmo definire la loro valuta. In genere questi token seguono uno standard, l'[ERC-20](/developers/docs/standards/tokens/erc-20/). Questo standard permette di scrivere gli strumenti, come pool di liquidità e wallet, compatibili con tutti i token ERC-20. In questo articolo analizzeremo l'[Implementazione di ERC20 in Solidity su OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), nonché la [definizione dell'interfaccia](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol). +Uno degli usi più comuni di Ethereum è la creazione da parte di un gruppo di un token scambiabile, in un certo senso la propria valuta. Questi token seguono tipicamente uno standard, l'[ERC-20](/developers/docs/standards/tokens/erc-20/). Questo standard rende possibile scrivere strumenti, come pool di liquidità e portafogli, che funzionano con tutti i token ERC-20. In questo articolo analizzeremo l'[implementazione ERC20 in Solidity di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), così come la [definizione dell'interfaccia](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol). -Qui parliamo del codice sorgente annotato. Se vuoi implementare ERC-20, [leggi questo tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). +Questo è codice sorgente annotato. Se vuoi implementare l'ERC-20, [leggi questo tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). -## L'interfaccia {#the-interface} +## L'Interfaccia {#the-interface} -Lo scopo di uno standard come ERC-20 è quello di consentire molte implementazioni di token che siano interoperabili tra le varie applicazioni, quali wallet e scambi decentralizzati. A tale scopo, creiamo un'[interfaccia](https://www.geeksforgeeks.org/solidity-basics-of-interface/). Ogni codice che necessita di usare il contratto del token può avvalersi delle stesse definizioni nell'interfaccia ed essere compatibile con tutti i contratti del token che la usano, che si tratti di un portafoglio come MetaMask, una dApp come etherscan.io o un contratto diverso, come un pool di liquidità. +Lo scopo di uno standard come l'ERC-20 è consentire molte implementazioni di token che siano interoperabili tra le applicazioni, come portafogli ed exchange decentralizzati. Per ottenere ciò, creiamo un'[interfaccia](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/). Qualsiasi codice che debba utilizzare il contratto del token può usare le stesse definizioni nell'interfaccia ed essere compatibile con tutti i contratti dei token che la utilizzano, che si tratti di un portafoglio come MetaMask, di una dApp come etherscan.io o di un contratto diverso come una pool di liquidità. -![Illustrazione dell'interfaccia di ERC-20](erc20_interface.png) +![Illustrazione dell'interfaccia ERC-20](erc20_interface.png) -Se sei un programmatore esperto, probabilmente ricorderai di aver visto costrutti simili in [Java](https://www.w3schools.com/java/java_interface.asp) o persino nei [file d'intestazione in C](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html). +Se sei un programmatore esperto, probabilmente ricordi di aver visto costrutti simili in [Java](https://www.w3schools.com/java/java_interface.asp) o persino nei [file header del C](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html). -Questa è una definizione dell'[Interfaccia di ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) da OpenZeppelin. È una traduzione dello [standard leggibile umano](https://eips.ethereum.org/EIPS/eip-20) nel codice di Solidity. Ovviamente, l'interfaccia di per sé non definisce _come_ fare qualcosa. Ciò è spiegato nel codice sorgente del contratto di seguito. +Questa è una definizione dell'[Interfaccia ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) di OpenZeppelin. È una traduzione dello [standard leggibile dall'uomo](https://eips.ethereum.org/EIPS/eip-20) in codice Solidity. Naturalmente, l'interfaccia stessa non definisce _come_ fare qualcosa. Questo è spiegato nel codice sorgente del contratto di seguito.   @@ -33,7 +31,7 @@ Questa è una definizione dell'[Interfaccia di ERC-20](https://github.com/OpenZe // SPDX-License-Identifier: MIT ``` -I file di Solidity dovrebbero includere un'identificativo della licenza. [Puoi vedere qui l'elenco di licenze](https://spdx.org/licenses/). Se hai bisogno di una licenza diversa, basta spiegarlo nei commenti. +I file Solidity dovrebbero includere un identificatore di licenza. [Puoi vedere l'elenco delle licenze qui](https://spdx.org/licenses/). Se hai bisogno di una licenza diversa, spiegalo semplicemente nei commenti.   @@ -41,17 +39,19 @@ I file di Solidity dovrebbero includere un'identificativo della licenza. [Puoi v pragma solidity >=0.6.0 <0.8.0; ``` -Il linguaggio Solidity si sta ancora evolvendo rapidamente e le nuove versioni potrebbero non essere compatibili con il vecchio codice ([vedi qui](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Dunque, è una buona idea specificare non solo una versione minima del linguaggio, ma anche una versione massima, l'ultima con cui hai testato il codice. +Il linguaggio Solidity si sta ancora evolvendo rapidamente e le nuove versioni potrebbero non essere compatibili con il vecchio codice ([vedi qui](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Pertanto, è una buona idea specificare non solo una versione minima del linguaggio, ma anche una versione massima, l'ultima con cui hai testato il codice.   ```solidity -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ +/* * + * @dev Interfaccia dello standard ERC20 come definito nell'EIP. */ + + + ``` -Il `@dev` nel commento è parte del [formato NatSpec](https://docs.soliditylang.org/en/develop/natspec-format.html), usato per produrre la documentazione dal codice sorgente. +Il `@dev` nel commento fa parte del [formato NatSpec](https://docs.soliditylang.org/en/develop/natspec-format.html), utilizzato per produrre documentazione dal codice sorgente.   @@ -59,135 +59,181 @@ Il `@dev` nel commento è parte del [formato NatSpec](https://docs.soliditylang. interface IERC20 { ``` -Per convenzione, i nomi dell'interfaccia iniziano per `I`. +Per convenzione, i nomi delle interfacce iniziano con `I`.   ```solidity - /** - * @dev Returns the amount of tokens in existence. - */ + /* * + * @dev Restituisce la quantità di token esistenti. */ + + + function totalSupply() external view returns (uint256); ``` -Questa funzione è `external`, a significare che [può essere chiamata solo dal di fuori del contratto](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). Restituisce la fornitura totale di token nel contratto. Questo valore è restituito usando il tipo più comune in Ethereum, ovvero 256 bit non firmati (256 bit è la dimensione nativa della parola dell'EVM). Questa funzione è anche una `view`, il che significa che non cambia stato, quindi è eseguibile su un nodo singolo invece di farla eseguire da ciascun nodo nella blockchain. Questo tipo di funzione non genera una transazione e non costa [gas](/developers/docs/gas/). +Questa funzione è `external`, il che significa che [può essere chiamata solo dall'esterno del contratto](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). Restituisce l'offerta totale di token nel contratto. Questo valore viene restituito utilizzando il tipo più comune in Ethereum, 256 bit senza segno (256 bit è la dimensione della parola nativa della EVM). Questa funzione è anche una `view`, il che significa che non modifica lo stato, quindi può essere eseguita su un singolo nodo invece di farla eseguire a ogni nodo della blockchain. Questo tipo di funzione non genera una transazione e non costa [gas](/developers/docs/gas/). -**Nota:** In teoria, si potrebbe pensare che il creatore del contratto possa imbrogliare restituendo una fornitura totale inferiore al valore reale, facendo apparire ogni token come più prezioso di quanto sia realmente. Tuttavia, tale timore ignora la vera natura della blockchain. Tutto ciò che succede sulla blockchain è verificabile da ogni nodo. A tale scopo, il codice del linguaggio della macchina e la memoria di ciascun contratto sono disponibili su tutti i nodi. Benché non sia obbligatorio pubblicare il codice di Solidity per il tuo contratto, nessuno ti prenderebbe sul serio se non pubblicassi il codice sorgente e la versione di Solidity con cui lo hai compilato, così da renderlo verificabile rispetto al codice del linguaggio della macchina che hai indicato. Vediamo ad esempio [questo contratto](https://etherscan.io/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD#code). +**Nota:** In teoria potrebbe sembrare che il creatore di un contratto possa imbrogliare restituendo un'offerta totale inferiore al valore reale, facendo apparire ogni token più prezioso di quanto non sia in realtà. Tuttavia, questo timore ignora la vera natura della blockchain. Tutto ciò che accade sulla blockchain può essere verificato da ogni nodo. Per ottenere ciò, il codice in linguaggio macchina e l'archiviazione di ogni contratto sono disponibili su ogni nodo. Sebbene non sia richiesto di pubblicare il codice Solidity per il tuo contratto, nessuno ti prenderebbe sul serio a meno che tu non pubblichi il codice sorgente e la versione di Solidity con cui è stato compilato, in modo che possa essere verificato rispetto al codice in linguaggio macchina che hai fornito. +Ad esempio, vedi [questo contratto](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract).   ```solidity - /** - * @dev Returns the amount of tokens owned by `account`. - */ + /* * + * @dev Restituisce la quantità di token posseduti da `account`. */ + + + function balanceOf(address account) external view returns (uint256); ``` -Come dice il nome `balanceOf` restituisce il saldo di un conto. I conti di Ethereum sono identificati in Solidity usando il tipo `address`, contenente 160 bit. È anche `external` e `view`. +Come dice il nome, `balanceOf` restituisce il saldo di un account. Gli account di Ethereum sono identificati in Solidity utilizzando il tipo `address`, che contiene 160 bit. È anche `external` e `view`.   ```solidity - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. + /* * + * @dev Sposta `amount` token dall'account del chiamante a `recipient`. * - * Returns a boolean value indicating whether the operation succeeded. + * Restituisce un valore booleano che indica se l'operazione ha avuto successo. * - * Emits a {Transfer} event. - */ + * Emette un evento {Transfer}. */ + + + + + + + function transfer(address recipient, uint256 amount) external returns (bool); ``` -La funzione `transfer` trasferisce i token dal chiamante a un indirizzo diverso. Ciò implica un cambio di stato, quindi non è una `view`. Quando un utente chiama questa funzione, crea una transazione e consuma del gas. Inoltre viene emesso un evento, `Transfer`, per informare tutti sulla blockchain dell'evento. +La funzione `transfer` trasferisce dei token dal chiamante a un indirizzo diverso. Ciò comporta un cambiamento di stato, quindi non è una `view`. Quando un utente chiama questa funzione, crea una transazione e costa gas. Emette anche un evento, `Transfer`, per informare tutti sulla blockchain dell'evento. La funzione ha due tipi di output per due diversi tipi di chiamanti: -- Gli utenti che chiamano la funzione direttamente da un'interfaccia utente. In genere l'utente invia una transazione e non attende una risposta, il che potrebbe richiedere un tempo indefinito. L'utente può vedere cosa è successo cercando la ricevuta della transazione (identificata dall'hash della transazione) o cercando l'evento `Transfer`. -- Altri contratti, che chiamano la funzione nell'ambito di una transazione complessiva. Questi ottengono il risultato immediatamente, perché sono eseguiti nella transazione stessa, così da poter usare il valore di ritorno della funzione. +- Gli utenti che chiamano la funzione direttamente da un'interfaccia utente. Tipicamente l'utente invia una transazione e non aspetta una risposta, che potrebbe richiedere un tempo indefinito. L'utente può vedere cosa è successo cercando la ricevuta della transazione (che è identificata dall'hash della transazione) o cercando l'evento `Transfer`. +- Altri contratti, che chiamano la funzione come parte di una transazione complessiva. Quei contratti ottengono il risultato immediatamente, perché vengono eseguiti nella stessa transazione, quindi possono utilizzare il valore di ritorno della funzione. -Lo stesso tipo di output è creato da altre funzioni che cambiano lo stato del contratto. +Lo stesso tipo di output viene creato dalle altre funzioni che modificano lo stato del contratto.   -Le indennità permettono a un conto di spendere dei token appartenenti a un altro proprietario. Ciò è utile, ad esempio, per i contratti che fungono da venditori. I contratti non possono monitorare gli eventi, quindi se un acquirente dovesse trasferire token al contratto del venditore direttamente, quel contratto non saprebbe di aver ricevuto il pagamento. Invece, l'acquirente permette al contratto del venditore di spendere un certo importo e il venditore trasferisce quell'importo. Questo avviene tramite un funzione chiamata dal contratto del venditore, in modo tale che il contratto del venditore possa sapere se è andata a buon fine. +Le autorizzazioni (allowance) permettono a un account di spendere alcuni token che appartengono a un proprietario diverso. Questo è utile, ad esempio, per i contratti che agiscono come venditori. I contratti non possono monitorare gli eventi, quindi se un acquirente trasferisse i token direttamente al contratto del venditore, quel contratto non saprebbe di essere stato pagato. Invece, l'acquirente autorizza il contratto del venditore a spendere un certo importo, e il venditore trasferisce quell'importo. Questo viene fatto tramite una funzione chiamata dal contratto del venditore, in modo che il contratto del venditore possa sapere se ha avuto successo. ```solidity - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. + /* * + * @dev Restituisce il numero rimanente di token che `spender` sarà + * autorizzato a spendere per conto di `owner` tramite {transferFrom}. Questo è + * zero per impostazione predefinita. * - * This value changes when {approve} or {transferFrom} are called. - */ + * Questo valore cambia quando vengono chiamati {approve} o {transferFrom}. */ + + + + + + + function allowance(address owner, address spender) external view returns (uint256); ``` -La funzione `allowance` consente a chiunque di richiedere di vedere quale sia il margine di tolleranza che un indirizzo (`owner`) permette all'altro indirizzo (`spender`) di spendere. +La funzione `allowance` consente a chiunque di interrogare per vedere qual è l'autorizzazione che un indirizzo (`owner`) consente a un altro indirizzo (`spender`) di spendere.   ```solidity - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + /* * + * @dev Imposta `amount` come limite di spesa di `spender` sui token del chiamante. * - * Returns a boolean value indicating whether the operation succeeded. + * Restituisce un valore booleano che indica se l'operazione ha avuto successo. * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: + * IMPORTANTE: Attenzione che modificare un limite di spesa con questo metodo comporta il rischio + * che qualcuno possa utilizzare sia il vecchio che il nuovo limite di spesa a causa di uno sfortunato + * ordinamento delle transazioni. Una possibile soluzione per mitigare questa race + * condition è ridurre prima il limite di spesa dello spender a 0 e impostare il + * valore desiderato in seguito: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * - * Emits an {Approval} event. - */ + * Emette un evento {Approval}. */ + + + + + + + + + + + + + + function approve(address spender, uint256 amount) external returns (bool); ``` -La funzione `approve` crea una tolleranza. Assicurati di leggere il messaggio sui rischi di utilizzo improprio. In Ethereum puoi controllare l'ordine delle tue transazioni, ma non puoi controllare l'ordine con cui le transazioni altrui saranno eseguite, a meno che tu tenga in sospeso la tua transazione finché non vedi che la transazione dell'altro lato ha avuto luogo. +La funzione `approve` crea un'autorizzazione. Assicurati di leggere il messaggio su come può essere abusata. In Ethereum controlli l'ordine delle tue transazioni, ma non puoi controllare l'ordine in cui verranno eseguite le transazioni di altre persone, a meno che tu non invii la tua transazione finché non vedi che la transazione dell'altra parte è avvenuta.   ```solidity - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. + /* * + * @dev Sposta `amount` token da `sender` a `recipient` utilizzando il + * meccanismo del limite di spesa. `amount` viene quindi detratto dal limite di spesa + * del chiamante. * - * Returns a boolean value indicating whether the operation succeeded. + * Restituisce un valore booleano che indica se l'operazione ha avuto successo. * - * Emits a {Transfer} event. - */ + * Emette un evento {Transfer}. */ + + + + + + + + + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); ``` -Infine, `transferFrom` è usata dallo spender per spendere concretamente il margine di tolleranza. +Infine, `transferFrom` viene utilizzata dallo spenditore per spendere effettivamente l'autorizzazione.   ```solidity - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). + /* * + * @dev Emesso quando `value` token vengono spostati da un account (`from`) a + * un altro (`to`). * - * Note that `value` may be zero. - */ + * Nota che `value` può essere zero. */ + + + + + + event Transfer(address indexed from, address indexed to, uint256 value); - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ + /* * + * @dev Emesso quando il limite di spesa di uno `spender` per un `owner` viene impostato da + * una chiamata a {approve}. `value` è il nuovo limite di spesa. */ + + + + event Approval(address indexed owner, address indexed spender, uint256 value); } ``` -Questi eventi sono emessi quando lo stato del contratto ERC-20 cambia. +Questi eventi vengono emessi quando lo stato del contratto ERC-20 cambia. -## Il Contratto effettivo {#the-actual-contract} +## Il Contratto Effettivo {#the-actual-contract} -Si tratta del contratto vero e proprio che implementa lo standard ERC-20, [preso da qui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). Non è destinato a essere utilizzato così com'è, ma puoi [ereditare](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) la sua struttura ed estenderla per ottenere un qualcosa di utilizzabile. +Questo è il contratto effettivo che implementa lo standard ERC-20, [preso da qui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). Non è pensato per essere utilizzato così com'è, ma puoi [ereditare](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) da esso per estenderlo a qualcosa di utilizzabile. ```solidity // SPDX-License-Identifier: MIT @@ -196,9 +242,9 @@ pragma solidity >=0.6.0 <0.8.0;   -### Dichiarazioni relative all'importazione {#import-statements} +### Dichiarazioni di Importazione {#import-statements} -Oltre alle definizioni d'interfaccia summenzionate, la definizione del contratto importa altri due file: +Oltre alle definizioni dell'interfaccia di cui sopra, la definizione del contratto importa altri due file: ```solidity @@ -207,48 +253,71 @@ import "./IERC20.sol"; import "../../math/SafeMath.sol"; ``` -- `GSN/Context.sol` è la definizione necessaria per usare [OpenGSN](https://www.opengsn.org/), un sistema che consente agli utenti senza ether di usare la blockchain. Tieni conto che questa è una versione obsoleta. Se vuoi integrare con OpenGSN [usa questo tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). -- [La libreria SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), usata per effettuare addizioni e sottrazioni senza sovraflussi. È necessaria perché altrimenti una persona potrebbe in qualche modo avere un token, spenderne due e poi ritrovarsi con 2^256-1. +- `GSN/Context.sol` contiene le definizioni necessarie per utilizzare [OpenGSN](https://www.opengsn.org/), un sistema che consente agli utenti senza ether di utilizzare la blockchain. Nota che questa è una vecchia versione, se vuoi integrarti con OpenGSN [usa questo tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). +- [La libreria SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), che previene overflow/underflow aritmetici per le versioni di Solidity **<0.8.0**. In Solidity ≥0.8.0, le operazioni aritmetiche si annullano automaticamente in caso di overflow/underflow, rendendo SafeMath non necessaria. Questo contratto utilizza SafeMath per la retrocompatibilità con le versioni precedenti del compilatore.   Questo commento spiega lo scopo del contratto. ```solidity -/** - * @dev Implementation of the {IERC20} interface. +/* * + * @dev Implementazione dell'interfaccia {IERC20}. * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * For a generic mechanism see {ERC20PresetMinterPauser}. + * Questa implementazione è agnostica rispetto al modo in cui vengono creati i token. Ciò significa + * che un meccanismo di fornitura deve essere aggiunto in un contratto derivato utilizzando {_mint}. + * Per un meccanismo generico vedi {ERC20PresetMinterPauser}. * - * TIP: For a detailed writeup see our guide + * SUGGERIMENTO: Per una descrizione dettagliata vedi la nostra guida * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * - * We have followed general OpenZeppelin guidelines: functions revert instead - * of returning `false` on failure. This behavior is nonetheless conventional - * and does not conflict with the expectations of ERC20 applications. + * Abbiamo seguito le linee guida generali di OpenZeppelin: le funzioni si annullano (revert) invece + * di restituire `false` in caso di fallimento. Questo comportamento è tuttavia convenzionale + * e non è in conflitto con le aspettative delle applicazioni ERC20. * - * Additionally, an {Approval} event is emitted on calls to {transferFrom}. - * This allows applications to reconstruct the allowance for all accounts just - * by listening to said events. Other implementations of the EIP may not emit - * these events, as it isn't required by the specification. + * Inoltre, un evento {Approval} viene emesso alle chiamate a {transferFrom}. + * Questo permette alle applicazioni di ricostruire il limite di spesa per tutti gli account semplicemente + * ascoltando tali eventi. Altre implementazioni dell'EIP potrebbero non emettere + * questi eventi, poiché non è richiesto dalle specifiche. * - * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} - * functions have been added to mitigate the well-known issues around setting - * allowances. See {IERC20-approve}. - */ + * Infine, le funzioni non standard {decreaseAllowance} e {increaseAllowance} + * sono state aggiunte per mitigare i ben noti problemi relativi all'impostazione + * dei limiti di spesa. Vedi {IERC20-approve}. */ + + + + + + + + + + + + + + + + + + + + + + + + ``` -### Composizione del contratto {#contract-definition} +### Definizione del Contratto {#contract-definition} ```solidity contract ERC20 is Context, IERC20 { ``` -Questa riga specifica l'eredità, in questo caso da `IERC20` da sopra e `Context`, per OpenGSN. +Questa riga specifica l'ereditarietà, in questo caso da `IERC20` di cui sopra e `Context`, per OpenGSN.   @@ -258,19 +327,19 @@ Questa riga specifica l'eredità, in questo caso da `IERC20` da sopra e `Context ``` -Questa riga allega la libreria `SafeMath` al tipo `uint256`. Puoi trovare questa libreria [qui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol). +Questa riga collega la libreria `SafeMath` al tipo `uint256`. Puoi trovare questa libreria [qui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol). -### Definizioni delle variabili {#variable-definitions} +### Definizioni delle Variabili {#variable-definitions} -Queste definizioni specificano le variabili di stato del contratto. Queste variabili sono dichiarate come `private`, ma ciò significa solo che gli altri contratti sulla blockchain non possono leggerle. _Non ci sono segreti sulla blockchain_, il software su ogni nodo ha lo stato di ciascun contratto in ogni blocco. Per convenzione, le variabili di stato sono denominate `_`. +Queste definizioni specificano le variabili di stato del contratto. Queste variabili sono dichiarate `private`, ma ciò significa solo che altri contratti sulla blockchain non possono leggerle. _Non ci sono segreti sulla blockchain_, il software su ogni nodo ha lo stato di ogni contratto a ogni blocco. Per convenzione, le variabili di stato sono chiamate `_`. -Le prime due variabili sono di [mappatura](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), il che significa che si comportano più o meno come [insiemi associativi](https://wikipedia.org/wiki/Associative_array), se con la differenza che le chiavi sono valori numerici. La memoria è allocata solo per le voci che hanno valori differenti dal default (zero). +Le prime due variabili sono [mappature (mapping)](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), il che significa che si comportano all'incirca come gli [array associativi](https://wikipedia.org/wiki/Associative_array), tranne per il fatto che le chiavi sono valori numerici. L'archiviazione viene allocata solo per le voci che hanno valori diversi da quello predefinito (zero). ```solidity mapping (address => uint256) private _balances; ``` -La prima mappatura, `_balances` è composta da indirizzi e dai rispettivi saldi di questo token. Per accedere al saldo, usa questa sintassi: `_balances[
]`. +La prima mappatura, `_balances`, rappresenta gli indirizzi e i loro rispettivi saldi di questo token. Per accedere al saldo, usa questa sintassi: `_balances[]`.   @@ -278,7 +347,7 @@ La prima mappatura, `_balances` è composta da indirizzi e dai rispettivi saldi mapping (address => mapping (address => uint256)) private _allowances; ``` -Questa variabile, `_allowances`, memorizza i margini di tolleranza spiegati in precedenza. Il primo indice è il proprietario dei token e il secondo è il contratto con il margine di tolleranza. Per accedere all'importo che l'indirizzo A può spendere dal conto dell'indirizzo B, usa `_allowances[B][A]`. +Questa variabile, `_allowances`, memorizza le autorizzazioni spiegate in precedenza. Il primo indice è il proprietario dei token, e il secondo è il contratto con l'autorizzazione. Per accedere all'importo che l'indirizzo A può spendere dall'account dell'indirizzo B, usa `_allowances[B][A]`.   @@ -286,7 +355,7 @@ Questa variabile, `_allowances`, memorizza i margini di tolleranza spiegati in p uint256 private _totalSupply; ``` -Come suggerisce il nome, questa variabile tiene traccia della fornitura totale di token. +Come suggerisce il nome, questa variabile tiene traccia dell'offerta totale di token.   @@ -296,126 +365,164 @@ Come suggerisce il nome, questa variabile tiene traccia della fornitura totale d uint8 private _decimals; ``` -Queste tre variabili sono usate per migliorare la leggibilità. Le prime due sono autoesplicative, ma `_decimals` no. +Queste tre variabili sono utilizzate per migliorare la leggibilità. Le prime due si spiegano da sole, ma `_decimals` no. -Da un lato, Ethereum non ha un numero in virgola mobile o variabili frazionali. Dall'altro, gli esseri vogliono la libertà di dividere i token. Un motivo per cui è stato scelto l'oro per gli scambi era la difficoltà di dare il resto quando qualcuno voleva comprare una quantità di mucca equivalente a un'anatra. +Da un lato, Ethereum non ha variabili a virgola mobile o frazionarie. Dall'altro lato, agli esseri umani piace poter dividere i token. Uno dei motivi per cui le persone hanno scelto l'oro come valuta è che era difficile dare il resto quando qualcuno voleva comprare una mucca per il valore di un'anatra. -La soluzione è tenere traccia degli interi e, al posto del token reale, contare un token frazionale, quasi privo di valore. Nel caso dell'ether, il token frazionale è detto wei e 10^18 wei sono pari a un ETH. Mentre scriviamo questo articolo, 10.000.000.000.000 wei corrispondono a circa un centesimo di dollaro americano o di euro. +La soluzione è tenere traccia dei numeri interi, ma contare invece del token reale un token frazionario che è quasi senza valore. Nel caso dell'ether, il token frazionario si chiama wei, e 10^18 wei equivalgono a un ETH. Al momento della stesura, 10.000.000.000.000 wei corrispondono a circa un centesimo di dollaro USA o di euro. -Le applicazioni devono sapere come mostrare il saldo di token. Se un utente ha 3.141.000.000.000.000.000 wei, vuol dire che ha in mano 3,14 ETH? O forse 31,41 ETH? O magari 3.141 ETH? Nel caso dell'ether, è definito a 10^18 wei per ETH, ma per il tuo token, puoi selezionare un valore differente. Se dividere il token non ha senso, puoi usare un valore `_decimals` di zero. Se vuoi usare lo stesso standard come ETH, usa il valore **18**. +Le applicazioni devono sapere come visualizzare il saldo del token. Se un utente ha 3.141.000.000.000.000.000 wei, sono 3,14 ETH? 31,41 ETH? 3.141 ETH? Nel caso dell'ether è definito 10^18 wei per ETH, ma per il tuo token puoi selezionare un valore diverso. Se dividere il token non ha senso, puoi usare un valore `_decimals` pari a zero. Se vuoi usare lo stesso standard dell'ETH, usa il valore **18**. -### Il costruttore {#the-constructor} +### Il Costruttore {#the-constructor} ```solidity - /** - * @dev Sets the values for {name} and {symbol}, initializes {decimals} with - * a default value of 18. + /* * + * @dev Imposta i valori per {name} e {symbol}, inizializza {decimals} con + * un valore predefinito di 18. * - * To select a different value for {decimals}, use {_setupDecimals}. + * Per selezionare un valore diverso per {decimals}, usa {_setupDecimals}. * - * All three of these values are immutable: they can only be set once during - * construction. - */ + * Tutti e tre questi valori sono immutabili: possono essere impostati solo una volta durante + * la costruzione. */ + + + + + + + + + constructor (string memory name_, string memory symbol_) public { + // In Solidity ≥0.7.0, 'public' è implicito e può essere omesso. + _name = name_; _symbol = symbol_; _decimals = 18; } ``` -Il costruttore viene chiamato alla prima creazione del contratto. Per convenzione, i parametri della funzione sono denominati `_`. +Il costruttore viene chiamato quando il contratto viene creato per la prima volta. Per convenzione, i parametri della funzione sono chiamati `_`. -### Funzioni dell'interfaccia utente {#user-interface-functions} +### Funzioni dell'Interfaccia Utente {#user-interface-functions} ```solidity - /** - * @dev Returns the name of the token. - */ + /* * + * @dev Restituisce il nome del token. */ + + + function name() public view returns (string memory) { return _name; } - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ + /* * + * @dev Restituisce il simbolo del token, di solito una versione più corta del + * nome. */ + + + + function symbol() public view returns (string memory) { return _symbol; } - /** - * @dev Returns the number of decimals used to get its user representation. - * For example, if `decimals` equals `2`, a balance of `505` tokens should - * be displayed to a user as `5,05` (`505 / 10 ** 2`). + /* * + * @dev Restituisce il numero di decimali utilizzati per ottenere la sua rappresentazione utente. + * Ad esempio, se `decimals` è uguale a `2`, un saldo di `505` token dovrebbe + * essere mostrato a un utente come `5,05` (`505 / 10 ** 2`). * - * Tokens usually opt for a value of 18, imitating the relationship between - * ether and wei. This is the value {ERC20} uses, unless {_setupDecimals} is - * called. + * I token di solito optano per un valore di 18, imitando la relazione tra + * ether e wei. Questo è il valore che {ERC20} utilizza, a meno che non venga chiamato + * {_setupDecimals}. * - * NOTE: This information is only used for _display_ purposes: it in - * no way affects any of the arithmetic of the contract, including - * {IERC20-balanceOf} and {IERC20-transfer}. - */ + * NOTA: Questa informazione è utilizzata solo a scopo di _visualizzazione_: non + * influisce in alcun modo sull'aritmetica del contratto, inclusi + * {IERC20-balanceOf} e {IERC20-transfer}. */ + + + + + + + + + + + + + function decimals() public view returns (uint8) { return _decimals; } ``` -Queste funzioni, `name`, `symbol`, e `decimals` aiutano le interfacce utente a conoscere il tuo contratto, in modo da visualizzarlo correttamente. +Queste funzioni, `name`, `symbol` e `decimals` aiutano le interfacce utente a conoscere il tuo contratto in modo che possano visualizzarlo correttamente. -Il tipo di restituzione è `string memory`, a significare che la restituzione è una stringa archiviata in memoria. Le variabili, come le stringhe, sono memorizzabili in tre posizioni: +Il tipo di ritorno è `string memory`, il che significa che restituisce una stringa memorizzata in memoria. Le variabili, come le stringhe, possono essere memorizzate in tre posizioni: -| | Durata | Accesso al contratto | Costo del Gas | -| ------------- | ----------------------- | -------------------- | ---------------------------------------------------------------------------------- | -| Memoria | Chiamata della funzione | Lettura/Scrittura | Decine o centinaia (maggiori per maggiori posizioni) | -| Calldata | Chiamata della funzione | Sola Lettura | Inutilizzabile come tipo di restituzione, solo un tipo di parametro della funzione | -| Archiviazione | Fino alla modifica | Lettura/Scrittura | Elevato (800 per la lettura, 20.000 per la scrittura) | +| | Durata | Accesso al Contratto | Costo del Gas | +| -------- | ------------- | --------------- | -------------------------------------------------------------- | +| Memoria (Memory) | Chiamata di funzione | Lettura/Scrittura | Decine o centinaia (più alto per posizioni più alte) | +| Dati di chiamata (Calldata) | Chiamata di funzione | Solo Lettura | Non può essere usato come tipo di ritorno, solo come tipo di parametro di funzione | +| Archiviazione (Storage) | Fino a modifica | Lettura/Scrittura | Alto (800 per la lettura, 20k per la scrittura) | In questo caso, `memory` è la scelta migliore. -### Informazioni di lettura del token {#read-token-information} +### Leggere le Informazioni del Token {#read-token-information} -Queste sono funzioni che forniscono informazioni sul token, la fornitura totale o il saldo di un conto. +Queste sono funzioni che forniscono informazioni sul token, che si tratti dell'offerta totale o del saldo di un account. ```solidity - /** - * @dev See {IERC20-totalSupply}. - */ + /* * + * @dev Vedi {IERC20-totalSupply}. */ + + + function totalSupply() public view override returns (uint256) { return _totalSupply; } ``` -La funzione `totalSupply` restituisce la fornitura totale di token. +La funzione `totalSupply` restituisce l'offerta totale di token.   ```solidity - /** - * @dev See {IERC20-balanceOf}. - */ + /* * + * @dev Vedi {IERC20-balanceOf}. */ + + + function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } ``` -Leggi il saldo di un conto. Nota che chiunque può ottenere il saldo del conto di qualcun altro. Non ha senso provare a nascondere queste informazioni, perché sono comunque disponibili su ogni nodo. _Non ci sono segreti sulla blockchain._ +Legge il saldo di un account. Nota che a chiunque è permesso ottenere il saldo dell'account di chiunque altro. Non ha senso cercare di nascondere queste informazioni, perché sono comunque disponibili su ogni nodo. _Non ci sono segreti sulla blockchain._ -### Trasferire token {#transfer-tokens} +### Trasferire Token {#transfer-tokens} ```solidity - /** - * @dev See {IERC20-transfer}. + /* * + * @dev Vedi {IERC20-transfer}. * - * Requirements: + * Requisiti: * - * - `recipient` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ + * - `recipient` non può essere l'indirizzo zero. + * - il chiamante deve avere un saldo di almeno `amount`. */ + + + + + + + + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { ``` -La funzione `transfer` è chiamata per trasferire i token dal conto del mittente a un altro. Nota che anche se viene restituito un valore booleano, quel valore è sempre **true**. Se il trasferimento fallisce, il contratto ripristina la chiamata. +La funzione `transfer` viene chiamata per trasferire token dall'account del mittente a uno diverso. Nota che anche se restituisce un valore booleano, quel valore è sempre **true**. Se il trasferimento fallisce, il contratto annulla (revert) la chiamata.   @@ -425,44 +532,52 @@ La funzione `transfer` è chiamata per trasferire i token dal conto del mittente } ``` -La funzione `_transfer` fa il lavoro effettivo. È una funzione privata, chiamabile solo da altre funzioni del contratto. Per convenzione le funzioni private sono denominate `_`, come le variabili di stato. +La funzione `_transfer` fa il lavoro effettivo. È una funzione privata che può essere chiamata solo da altre funzioni del contratto. Per convenzione le funzioni private sono chiamate `_`, come le variabili di stato. -Normalmente, in Solidity usiamo `msg.sender` per il mittente del messaggio. Tuttavia, ciò corrompe [OpenGSN](http://opengsn.org/). Se vogliamo consentire transazioni senza ether con il nostro token, dobbiamo usare `_msgSender()`. Restituisce `msg.sender` per le transazioni normali, ma per quelle senza ether restituisce il firmatario originale e non il contratto che ha trasmesso il messaggio. +Normalmente in Solidity usiamo `msg.sender` per il mittente del messaggio. Tuttavia, questo rompe [OpenGSN](http://opengsn.org/). Se vogliamo consentire transazioni senza ether con il nostro token, dobbiamo usare `_msgSender()`. Restituisce `msg.sender` per le transazioni normali, ma per quelle senza ether restituisce il firmatario originale e non il contratto che ha inoltrato il messaggio. -### Funzioni di tolleranza {#allowance-functions} +### Funzioni di Autorizzazione {#allowance-functions} -Sono le funzioni che implementano il margine di tolleranza: `allowance`, `approve`, `transferFrom` e `_approve`. Inoltre, l'implementazione di OpenZeppelin va oltre lo standard di base e include alcune funzionalità che migliorano la sicurezza: `increaseAllowance` e `decreaseAllowance`. +Queste sono le funzioni che implementano la funzionalità di autorizzazione: `allowance`, `approve`, `transferFrom` e `_approve`. Inoltre, l'implementazione di OpenZeppelin va oltre lo standard di base per includere alcune funzionalità che migliorano la sicurezza: `increaseAllowance` e `decreaseAllowance`. -#### La funzione di tolleranza {#allowance} +#### La funzione allowance {#allowance} ```solidity - /** - * @dev See {IERC20-allowance}. - */ + /* * + * @dev Vedi {IERC20-allowance}. */ + + + function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } ``` -La funzione `allowance` consente a chiunque di verificare qualsiasi margine di tolleranza. +La funzione `allowance` consente a tutti di controllare qualsiasi autorizzazione. -#### La funzione di approvazione {#approve} +#### La funzione approve {#approve} ```solidity - /** - * @dev See {IERC20-approve}. + /* * + * @dev Vedi {IERC20-approve}. * - * Requirements: + * Requisiti: * - * - `spender` cannot be the zero address. - */ + * - `spender` non può essere l'indirizzo zero. */ + + + + + + + function approve(address spender, uint256 amount) public virtual override returns (bool) { ``` -Questa funzione viene chiamata per creare un margine di tolleranza. È simile alla suddetta funzione `transfer`: +Questa funzione viene chiamata per creare un'autorizzazione. È simile alla funzione `transfer` di cui sopra: -- La funzione chiama semplicemente una funzione interna (in questo caso, `_approve`), che fa il lavoro vero e proprio. -- La funzione restituisce `true` (se va a buon fine), altrimenti si ripristina. +- La funzione chiama semplicemente una funzione interna (in questo caso, `_approve`) che fa il vero lavoro. +- La funzione restituisce `true` (se ha successo) o si annulla (se non lo ha).   @@ -472,26 +587,38 @@ Questa funzione viene chiamata per creare un margine di tolleranza. È simile al } ``` -Usiamo le funzioni interne per minimizzre il numero di posti in cui si verificano cambi di stato. _Qualsiasi_ funzione che cambia stato costituisce un potenziale rischio di sicurezza, che va controllato per sicurezza. Così facendo riduciamo il rischio di conseguenze negative. +Usiamo funzioni interne per ridurre al minimo il numero di punti in cui avvengono i cambiamenti di stato. _Qualsiasi_ funzione che modifichi lo stato è un potenziale rischio per la sicurezza che deve essere verificato. In questo modo abbiamo meno possibilità di sbagliare. #### La funzione transferFrom {#transferFrom} -È la funzione chiamata dallo spender per spendere un margine di tolleranza. Richiede due operazioni: trasferire l'importo speso e ridurre il margine di tolleranza in misura pari allo stesso importo. +Questa è la funzione che uno spenditore chiama per spendere un'autorizzazione. Ciò richiede due operazioni: trasferire l'importo speso e ridurre l'autorizzazione di tale importo. ```solidity - /** - * @dev See {IERC20-transferFrom}. + /* * + * @dev Vedi {IERC20-transferFrom}. * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {ERC20}. + * Emette un evento {Approval} che indica il limite di spesa aggiornato. Questo non è + * richiesto dall'EIP. Vedi la nota all'inizio di {ERC20}. * - * Requirements: + * Requisiti: * - * - `sender` and `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - * - the caller must have allowance for ``sender``'s tokens of at least - * `amount`. - */ + * - `sender` e `recipient` non possono essere l'indirizzo zero. + * - `sender` deve avere un saldo di almeno `amount`. + * - il chiamante deve avere un limite di spesa per i token di ``sender`` di almeno + * `amount`. */ + + + + + + + + + + + + + function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); @@ -499,7 +626,7 @@ Usiamo le funzioni interne per minimizzre il numero di posti in cui si verifican   -La funzione `a.sub(b, "message")` produce due azioni. Innanzi tutto calcola `a-b`, ovvero il nuovo margine di tolleranza (allowance). Quindi controlla che tale risultato non sia negativo. Se lo è, la chiamata si ripristina con il messaggio fornito. Occorre notare che, in caso di ripristino, qualsiasi elaborazione effettuata in precedenza durante tale chiamata viene ignorata, così da evitare di dover annullare il `_transfer`. +La chiamata di funzione `a.sub(b, "message")` fa due cose. Primo, calcola `a-b`, che è la nuova autorizzazione. Secondo, controlla che questo risultato non sia negativo. Se è negativo, la chiamata si annulla con il messaggio fornito. Nota che quando una chiamata si annulla, qualsiasi elaborazione eseguita in precedenza durante quella chiamata viene ignorata, quindi non abbiamo bisogno di annullare il `_transfer`. ```solidity _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, @@ -510,73 +637,97 @@ La funzione `a.sub(b, "message")` produce due azioni. Innanzi tutto calcola `a-b #### Aggiunte di sicurezza di OpenZeppelin {#openzeppelin-safety-additions} -È pericoloso impostare un margine di tolleranza diverso da zero su un altro valore diverso da zero, perché puoi controllare solo l'ordine delle tue transazioni, ma non di quelle altrui. Immagina che ci siano due utenti: Alice, una ragazza ingenua, e Bill, un uomo disonesto. Alice vuole ricevere da Bill un servizio che secondo lei costa cinque token, quindi concede a Bill un margine di tolleranza di cinque token. +È pericoloso impostare un'autorizzazione diversa da zero a un altro valore diverso da zero, perché controlli solo l'ordine delle tue transazioni, non quello di nessun altro. Immagina di avere due utenti, Alice che è ingenua e Bill che è disonesto. Alice vuole un servizio da Bill, che pensa costi cinque token, quindi dà a Bill un'autorizzazione di cinque token. -Poi qualcosa cambia e il prezzo di Bill aumenta a dieci token. Alice, che è ancora interessata a ricevere il servizio, invia una transazione che imposta il margine di tolleranza di Bill a dieci. Quando Bill vede questa nuova transazione nel pool della transazione, invia una transazione che spende cinque token di Alice e ha un prezzo del gas molto maggiore, così che sarà minata più rapidamente. In questo modo Bill può spendere prima i cinque token e poi, una volta minato il nuovo margine di tolleranza di Alice, spenderne altri dieci per un prezzo complessivo di quindici token, più di quanto Alice volesse autorizzare. Questa tecnica è detta [front-running](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running) +Poi qualcosa cambia e il prezzo di Bill sale a dieci token. Alice, che vuole ancora il servizio, invia una transazione che imposta l'autorizzazione di Bill a dieci. Nel momento in cui Bill vede questa nuova transazione nel pool delle transazioni, invia una transazione che spende i cinque token di Alice e ha un prezzo del gas molto più alto in modo che venga minata più velocemente. In questo modo Bill può spendere prima cinque token e poi, una volta minata la nuova autorizzazione di Alice, spenderne altri dieci per un prezzo totale di quindici token, più di quanto Alice intendesse autorizzare. Questa tecnica è chiamata [front-running](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running) -| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Tolleranza di Bill | Entrate totali di Bill da Alice | -| -------------------- | -------------- | ----------------------------- | ------------- | ------------------ | ------------------------------- | -| approve(Bill, 5) | 10 | | | 5 | 0 | -| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | -| approve(Bill, 10) | 11 | | | 10 | 5 | -| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 | +| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Autorizzazione di Bill | Entrate Totali di Bill da Alice | +| ----------------- | ----------- | ----------------------------- | ---------- | ---------------- | ---------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| approve(Bill, 10) | 11 | | | 10 | 5 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 | -Per evitare questo problema, queste due funzioni (`increaseAllowance` e `decreaseAllowance`) ti consentono di modificare il margine di tolleranza di un importo specifico. Quindi, se Bill avesse già speso cinque token, potrà spenderne solo altri cinque. A seconda delle tempistiche, esistono due modi in cui questo può funzionare, entrambi terminano con Bill che riceve solo dieci token: +Per evitare questo problema, queste due funzioni (`increaseAllowance` e `decreaseAllowance`) consentono di modificare l'autorizzazione di un importo specifico. Quindi, se Bill avesse già speso cinque token, potrà spenderne solo altri cinque. A seconda delle tempistiche, ci sono due modi in cui questo può funzionare, entrambi i quali finiscono con Bill che ottiene solo dieci token: A: -| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Tolleranza di Bill | Entrate totali di Bill da Alice | -| -------------------------- | --------------:| ---------------------------- | -------------:| ------------------:| ------------------------------- | -| approve(Bill, 5) | 10 | | | 5 | 0 | -| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | -| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 | -| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 | +| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Autorizzazione di Bill | Entrate Totali di Bill da Alice | +| -------------------------- | ----------: | ---------------------------- | ---------: | ---------------: | ---------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 | +| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 | B: -| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Tolleranza di Bill | Entrate totali di Bill da Alice | -| -------------------------- | --------------:| ----------------------------- | -------------:| ------------------:| -------------------------------:| -| approve(Bill, 5) | 10 | | | 5 | 0 | -| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 | -| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 | +| Transazione di Alice | Nonce di Alice | Transazione di Bill | Nonce di Bill | Autorizzazione di Bill | Entrate Totali di Bill da Alice | +| -------------------------- | ----------: | ----------------------------- | ---------: | ---------------: | ---------------------------: | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 | ```solidity - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. + /* * + * @dev Aumenta atomicamente il limite di spesa concesso a `spender` dal chiamante. * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. + * Questa è un'alternativa a {approve} che può essere utilizzata come mitigazione per + * i problemi descritti in {IERC20-approve}. * - * Emits an {Approval} event indicating the updated allowance. + * Emette un evento {Approval} che indica il limite di spesa aggiornato. * - * Requirements: + * Requisiti: * - * - `spender` cannot be the zero address. - */ + * - `spender` non può essere l'indirizzo zero. */ + + + + + + + + + + + + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } ``` -La funzione `a.add(b)` è un'aggiunta sicura. Nell'improbabile caso in cui `a`+`b`>=`2^256`, non ha luogo il mormale avvolgimento come avviene con l'addizione normale. +La funzione `a.add(b)` è un'addizione sicura. Nel caso improbabile in cui `a`+`b`>=`2^256`, non ricomincia da zero (wrap around) come fa la normale addizione. ```solidity - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. + /* * + * @dev Diminuisce atomicamente il limite di spesa concesso a `spender` dal chiamante. * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. + * Questa è un'alternativa a {approve} che può essere utilizzata come mitigazione per + * i problemi descritti in {IERC20-approve}. * - * Emits an {Approval} event indicating the updated allowance. + * Emette un evento {Approval} che indica il limite di spesa aggiornato. * - * Requirements: + * Requisiti: * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ + * - `spender` non può essere l'indirizzo zero. + * - `spender` deve avere un limite di spesa per il chiamante di almeno + * `subtractedValue`. */ + + + + + + + + + + + + + + function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); @@ -584,31 +735,44 @@ La funzione `a.add(b)` è un'aggiunta sicura. Nell'improbabile caso in cui `a`+` } ``` -### Funzioni che modificano le informazioni del token {#functions-that-modify-token-information} +### Funzioni che Modificano le Informazioni del Token {#functions-that-modify-token-information} -Queste sono le quattro funzioni che effettuano il lavoro effettivo: `_transfer`, `_mint`, `_burn` e `_approve`. +Queste sono le quattro funzioni che fanno il lavoro effettivo: `_transfer`, `_mint`, `_burn` e `_approve`. -#### La funzione \_transfer {#_transfer} +#### La funzione _transfer {#_transfer} ```solidity - /** - * @dev Moves tokens `amount` from `sender` to `recipient`. + /* * + * @dev Sposta `amount` token da `sender` a `recipient`. * - * This is internal function is equivalent to {transfer}, and can be used to - * e.g., implement automatic token fees, slashing mechanisms, etc. + * Questa funzione interna è equivalente a {transfer}, e può essere utilizzata per + * es., implementare commissioni automatiche sui token, meccanismi di slashing, ecc. * - * Emits a {Transfer} event. + * Emette un evento {Transfer}. * - * Requirements: + * Requisiti: * - * - `sender` cannot be the zero address. - * - `recipient` cannot be the zero address. - * - `sender` must have a balance of at least `amount`. - */ + * - `sender` non può essere l'indirizzo zero. + * - `recipient` non può essere l'indirizzo zero. + * - `sender` deve avere un saldo di almeno `amount`. */ + + + + + + + + + + + + + + function _transfer(address sender, address recipient, uint256 amount) internal virtual { ``` -Questa funzione, `_transfer`, trasferisce i token da un conto all'altro. È chiamata sia da `transfer` (per i trasferimenti dal conto del mittente) che da `transferFrom` (per usare le indennità per trasferire dal conto di qualcun altro). +Questa funzione, `_transfer`, trasferisce token da un account a un altro. Viene chiamata sia da `transfer` (per i trasferimenti dal proprio account del mittente) sia da `transferFrom` (per l'utilizzo delle autorizzazioni per trasferire dall'account di qualcun altro).   @@ -617,7 +781,7 @@ Questa funzione, `_transfer`, trasferisce i token da un conto all'altro. È chia require(recipient != address(0), "ERC20: transfer to the zero address"); ``` -Nessuno possiedere realmente l'indirizzo zero in Ethereum (ciò significa che nessuno conosce una chiave privata la cui chiave pubblica corrispondente è trasformata all'indirizzo zero). Quando si usa quell'indirizzo, in genere si tratta di un bug del software, quindi falliamo se usiamo l'indirizzo zero come mittente o destinatario. +Nessuno possiede effettivamente l'indirizzo zero in Ethereum (cioè, nessuno conosce una chiave privata la cui chiave pubblica corrispondente si trasforma nell'indirizzo zero). Quando le persone usano quell'indirizzo, di solito si tratta di un bug del software, quindi falliamo se l'indirizzo zero viene utilizzato come mittente o destinatario.   @@ -626,14 +790,14 @@ Nessuno possiedere realmente l'indirizzo zero in Ethereum (ciò significa che ne ``` -Esistono due modi per usare questo contratto: +Ci sono due modi per utilizzare questo contratto: -1. Usarlo come modello per il proprio codice -1. [Ereditare da esso](https://www.bitdegree.org/learn/solidity-inheritance) e sovrascrivere solo le funzioni da modificare +1. Usarlo come modello per il tuo codice +1. [Ereditare da esso](https://www.bitdegree.org/learn/solidity-inheritance) e sovrascrivere solo le funzioni che devi modificare -Il secondo metodo è di gran lunga migliore perché il codice ERC-20 di OpenZeppelin è stato già controllato e mostrato come sicuro. Quando si usa l'eredità, le funzioni da modificare sono note e, per fidarsi del tuo contratto, gli altri devono controllare solo quelle funzioni specifiche. +Il secondo metodo è molto migliore perché il codice ERC-20 di OpenZeppelin è già stato verificato e si è dimostrato sicuro. Quando usi l'ereditarietà è chiaro quali sono le funzioni che modifichi, e per fidarsi del tuo contratto le persone devono solo verificare quelle funzioni specifiche. -Spesso è utile eseguire una funzione ogni volta che i token passano di mano. Tuttavia, `_transfer` è una funzione davvero importante ed esiste il rischio di scriverla in modo non sicuro (vedi sotto), quindi è meglio non sovrascriverla. La soluzione è `_beforeTokenTransfer`, una [funzione hook](https://wikipedia.org/wiki/Hooking). Puoi sovrascrivere questa funzione, che verrà quindi richiamata a ogni trasferimento. +Spesso è utile eseguire una funzione ogni volta che i token passano di mano. Tuttavia, `_transfer` è una funzione molto importante ed è possibile scriverla in modo non sicuro (vedi sotto), quindi è meglio non sovrascriverla. La soluzione è `_beforeTokenTransfer`, una [funzione hook](https://wikipedia.org/wiki/Hooking). Puoi sovrascrivere questa funzione e verrà chiamata a ogni trasferimento.   @@ -642,7 +806,7 @@ Spesso è utile eseguire una funzione ogni volta che i token passano di mano. Tu _balances[recipient] = _balances[recipient].add(amount); ``` -Queste sono le righe che effettuano concretamente il trasferimento. Nota che non c'è **nulla** tra di esse e che sottraiamo l'importo trasferito dal mittente prima di aggiungerlo al destinatario. Questo passaggio è importante perché, se ci fosse una chiamata a un contratto diverso nel mezzo, potrebbe essere utilizzata per barare su questo contratto. Questo metodo di trasferimento è atomico, in quanto nulla può verificarsi mentre è in corso. +Queste sono le righe che eseguono effettivamente il trasferimento. Nota che non c'è **nulla** tra di esse, e che sottraiamo l'importo trasferito dal mittente prima di aggiungerlo al destinatario. Questo è importante perché se ci fosse stata una chiamata a un contratto diverso nel mezzo, avrebbe potuto essere usata per imbrogliare questo contratto. In questo modo il trasferimento è atomico, non può succedere nulla nel mezzo.   @@ -651,24 +815,32 @@ Queste sono le righe che effettuano concretamente il trasferimento. Nota che non } ``` -Infine, emetti un evento `Transfer`. Gli eventi non sono accessibili agli smart contract, ma il codice eseguito al di fuori della blockchain può ascoltarli e reagire a essi. Ad esempio, un portafoglio può tracciare la ricezione di altri token da parte del proprietario. +Infine, emette un evento `Transfer`. Gli eventi non sono accessibili ai contratti intelligenti, ma il codice in esecuzione all'esterno della blockchain può ascoltare gli eventi e reagire ad essi. Ad esempio, un portafoglio può tenere traccia di quando il proprietario ottiene più token. -#### Le funzioni \_mint e \_burn {#_mint-and-_burn} +#### Le funzioni _mint e _burn {#_mint-and-_burn} -Queste due funzioni (`_mint` e `_burn`) modificano la fornitura totale di token. Sono interne e non esiste alcuna funzione che le chiami in questo contratto, quindi sono utili solo se erediti dal contratto e aggiungi la tua logica per decidere a quali condizioni coniare nuovi token o bruciare quelli esistenti. +Queste due funzioni (`_mint` e `_burn`) modificano l'offerta totale di token. Sono interne e non c'è alcuna funzione che le chiami in questo contratto, quindi sono utili solo se erediti dal contratto e aggiungi la tua logica per decidere a quali condizioni coniare nuovi token o bruciare quelli esistenti. -**NOTA:** Ogni token ERC-20 ha la propria logica commerciale che detta la gestione del token. Ad esempio, un contratto di fornitura fissa potrebbe chiamare solo `_mint` nel costruttore e mai `_burn`. Un contratto che vende token chiamerà `_mint` quando è pagato e chiamerà presumibilmente `_burn` a un certo punto per evitare l'inflazione incontrollata. +**NOTA:** Ogni token ERC-20 ha la propria logica di business che detta la gestione dei token. Ad esempio, un contratto a fornitura fissa potrebbe chiamare `_mint` solo nel costruttore e non chiamare mai `_burn`. Un contratto che vende token chiamerà `_mint` quando viene pagato, e presumibilmente chiamerà `_burn` a un certo punto per evitare un'inflazione fuori controllo. ```solidity - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. + /* * @dev Crea `amount` token e li assegna a `account`, aumentando + * la fornitura totale. * - * Emits a {Transfer} event with `from` set to the zero address. + * Emette un evento {Transfer} con `from` impostato all'indirizzo zero. * - * Requirements: + * Requisiti: * - * - `to` cannot be the zero address. - */ + * - `to` non può essere l'indirizzo zero. */ + + + + + + + + + function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); @@ -682,18 +854,28 @@ Assicurati di aggiornare `_totalSupply` quando il numero totale di token cambia.   -``` - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. +```solidity + /* * + * @dev Distrugge `amount` token da `account`, riducendo la + * fornitura totale. * - * Emits a {Transfer} event with `to` set to the zero address. + * Emette un evento {Transfer} con `to` impostato all'indirizzo zero. * - * Requirements: + * Requisiti: * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ + * - `account` non può essere l'indirizzo zero. + * - `account` deve avere almeno `amount` token. */ + + + + + + + + + + + function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); @@ -705,26 +887,38 @@ Assicurati di aggiornare `_totalSupply` quando il numero totale di token cambia. } ``` -La funzione `_burn` è quasi identica a `_mint`, con la differenza che va in senso opposto. +La funzione `_burn` è quasi identica a `_mint`, tranne per il fatto che va nell'altra direzione. -#### La funzione \_approve {#_approve} +#### La funzione _approve {#_approve} -Questa è la funzione che specifica concretamente i margini di tolleranza. Nota che consente a un proprietario di specificare una tolleranza superiore al saldo corrente del proprietario. Questo non è un problema, poiché il saldo è controllato al momento del trasferimento, quando potrebbe differire dal saldo alla creazione del margine di tolleranza. +Questa è la funzione che specifica effettivamente le autorizzazioni. Nota che consente a un proprietario di specificare un'autorizzazione superiore al saldo attuale del proprietario. Questo va bene perché il saldo viene controllato al momento del trasferimento, quando potrebbe essere diverso dal saldo al momento della creazione dell'autorizzazione. ```solidity - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + /* * + * @dev Imposta `amount` come limite di spesa di `spender` sui token di `owner`. * - * This internal function is equivalent to `approve`, and can be used to - * e.g., set automatic allowances for certain subsystems, etc. + * Questa funzione interna è equivalente a `approve`, e può essere utilizzata per + * es., impostare limiti di spesa automatici per determinati sottosistemi, ecc. * - * Emits an {Approval} event. + * Emette un evento {Approval}. * - * Requirements: + * Requisiti: * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ + * - `owner` non può essere l'indirizzo zero. + * - `spender` non può essere l'indirizzo zero. */ + + + + + + + + + + + + + function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); @@ -734,7 +928,7 @@ Questa è la funzione che specifica concretamente i margini di tolleranza. Nota   -Emette un evento `Approval`. In base a come è scritta l'applicazione, il contratto dello spender può essere informato dell'approvazione dal proprietario o da un server che monitora questi eventi. +Emette un evento `Approval`. A seconda di come è scritta l'applicazione, il contratto dello spenditore può essere informato dell'approvazione dal proprietario o da un server che ascolta questi eventi. ```solidity emit Approval(owner, spender, amount); @@ -742,57 +936,78 @@ Emette un evento `Approval`. In base a come è scritta l'applicazione, il contra ``` -### Modificare la variabile dei decimali {#modify-the-decimals-variable} +### Modificare la Variabile Decimals {#modify-the-decimals-variable} ```solidity - /** - * @dev Sets {decimals} to a value other than the default one of 18. + /* * + * @dev Imposta {decimals} a un valore diverso da quello predefinito di 18. * - * WARNING: This function should only be called from the constructor. Most - * applications that interact with token contracts will not expect - * {decimals} to ever change, and may work incorrectly if it does. - */ + * AVVERTENZA: Questa funzione dovrebbe essere chiamata solo dal costruttore. La maggior parte + * delle applicazioni che interagiscono con i contratti dei token non si aspetterà + * che {decimals} cambi mai, e potrebbero funzionare in modo errato se lo fa. */ + + + + + + + function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } ``` -Questa funzione modifica la variabile `_decimals`, usata per indicare alle interfacce utente come interpretare l'importo. Suggeriamo di chiamarla dal costruttore. Sarebbe disonesto chiamarla in qualsiasi punto successivo e le applicazioni non sono progettate per gestirla. +Questa funzione modifica la variabile `_decimals` che viene utilizzata per dire alle interfacce utente come interpretare l'importo. Dovresti chiamarla dal costruttore. Sarebbe disonesto chiamarla in qualsiasi momento successivo, e le applicazioni non sono progettate per gestirlo. ### Hook {#hooks} ```solidity - /** - * @dev Hook that is called before any transfer of tokens. This includes - * minting and burning. + /* * + * @dev Hook che viene chiamato prima di qualsiasi trasferimento di token. Questo include + * il coniare e il bruciare. * - * Calling conditions: + * Condizioni di chiamata: * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be to transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. + * - quando `from` e `to` sono entrambi non zero, `amount` dei token di ``from`` + * saranno trasferiti a `to`. + * - quando `from` è zero, `amount` token saranno coniati per `to`. + * - quando `to` è zero, `amount` dei token di ``from`` saranno bruciati. + * - `from` e `to` non sono mai entrambi zero. * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ + * Per saperne di più sugli hook, vai a xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ + + + + + + + + + + + + + + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } ``` -Questa è la funzione hook da chiamare durante i trasferimenti. Qui è vuota, ma se hai bisogno di fare qualcosa, basta sovrascriverla. +Questa è la funzione hook da chiamare durante i trasferimenti. Qui è vuota, ma se hai bisogno che faccia qualcosa, basta sovrascriverla. + +## Conclusione {#conclusion} -## Conclusioni {#conclusion} +Per riepilogare, ecco alcune delle idee più importanti in questo contratto (secondo me, la tua opinione potrebbe variare): -A titolo di ripasso, ecco alcune delle idee più importanti in questo contrato (a mio parere, probabilmente il tuo sarà diverso): +- _Non ci sono segreti sulla blockchain_. Qualsiasi informazione a cui un contratto intelligente può accedere è disponibile per tutto il mondo. +- Puoi controllare l'ordine delle tue transazioni, ma non quando avvengono le transazioni di altre persone. Questo è il motivo per cui modificare un'autorizzazione può essere pericoloso, perché consente allo spenditore di spendere la somma di entrambe le autorizzazioni. +- I valori di tipo `uint256` ricominciano da zero (wrap around). In altre parole, _0-1=2^256-1_. Se questo non è il comportamento desiderato, devi verificarlo (o usare la libreria SafeMath che lo fa per te). Nota che questo è cambiato in [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html). +- Esegui tutti i cambiamenti di stato di un tipo specifico in un luogo specifico, perché semplifica la verifica (auditing). Questo è il motivo per cui abbiamo, ad esempio, `_approve`, che viene chiamata da `approve`, `transferFrom`, `increaseAllowance` e `decreaseAllowance` +- I cambiamenti di stato dovrebbero essere atomici, senza nessun'altra azione nel mezzo (come puoi vedere in `_transfer`). Questo perché durante il cambiamento di stato si ha uno stato incoerente. Ad esempio, tra il momento in cui deduci dal saldo del mittente e il momento in cui aggiungi al saldo del destinatario ci sono meno token in esistenza di quanti dovrebbero esserci. Questo potrebbe essere potenzialmente abusato se ci sono operazioni tra di loro, specialmente chiamate a un contratto diverso. -- _Non ci sono segreti sulla blockchain_. Ogni informazione accessibile a uno smart contract è disponibile per il mondo intero. -- Puoi controllare l'ordine delle tue transazioni, ma non come si verificano quelle altrui. Per questo modificare un'indennità può esser pericoloso, perché consente allo spender di spendere la somma di entrambi i margini di tolleranza. -- I valori di tipo `uint256` si avvolgono o, in altre parole, _0-1=2^256-1_. Se questo non è il comportamento desiderato, devi verificarlo (o usare la libreria SafeMath più adatta alle tue esigenze). Nota che ciò è cambiato in [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html). -- Effettua tutte le modifiche di un tipo specifico in un luogo specifico, così da semplificare i controlli. Per questo abbiamo, ad esempio, `_approve`, chiamata da `approve`, `transferFrom`, `increaseAllowance` e `decreaseAllowance` -- I cambi di stato dovrebbero essere atomici, senza altre azioni nel mezzo (come si può vedere in `_transfer`). Questo perché durante il cambio di stato hai uno stato incoerente. Ad esempio, tra il momento in cui detrai dal saldo del mittente e il momento in cui aggiungi al saldo del destinatario, esistono meno token di quanti dovrebbero essercene. Questa condizione potrebbe essere esposta ad abusi se vengono effettuate operazioni tra di essi, specialmente nel caso di chiamate a un contratto differente. +Ora che hai visto come è scritto il contratto ERC-20 di OpenZeppelin, e specialmente come è reso più sicuro, vai e scrivi i tuoi contratti e applicazioni sicuri. -Ora che hai visto come è scritto il contratto ERC-20 di OpenZeppelin e specialmente come viene reso più sicuro, vai a scrivere i tuoi contratti sicuri e le tue applicazioni. +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md index 0c84502f174..81623ddd6a9 100644 --- a/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/it/developers/tutorials/erc20-with-safety-rails/index.md @@ -1,61 +1,60 @@ --- -title: ERC-20 con barriere di sicurezza -description: Come aiutare le persone a evitare errori banali +title: ERC-20 con misure di sicurezza +description: Come aiutare le persone a evitare errori sciocchi author: Ori Pomerantz lang: it -tags: - - "erc-20" +tags: ["erc-20"] skill: beginner -breadcrumb: "ERC-20 sicuro" +breadcrumb: Sicurezza ERC-20 published: 2022-08-15 --- ## Introduzione {#introduction} -Una delle cose fantastiche su Ethereum è che non esiste un'autorità centrale che possa modificare o annullare le tue transazioni. Uno dei suoi grandi problemi è che non c'è un'autorità centrale con il potere di annullare gli errori o le transazioni illecite degli utenti. In questo articolo imparerai alcuni dei comuni errori che gli utenti commettono con i token [ERC-20](/developers/docs/standards/tokens/erc-20/), nonché come creare dei contratti ERC-20 che aiutano gli utenti a evitarli, o danno poteri a un'autorità centrale (ad esempio, congelare gli account). +Una delle cose fantastiche di Ethereum è che non esiste un'autorità centrale in grado di modificare o annullare le tue transazioni. Uno dei grandi problemi di Ethereum è che non esiste un'autorità centrale con il potere di annullare gli errori degli utenti o le transazioni illecite. In questo articolo scoprirai alcuni degli errori comuni che gli utenti commettono con i token [ERC-20](/developers/docs/standards/tokens/erc-20/), oltre a come creare contratti intelligenti ERC-20 che aiutino gli utenti a evitare tali errori, o che conferiscano a un'autorità centrale un certo potere (ad esempio per congelare gli account). -Nota che, mentre utilizzeremo il [contratto del token ERC-20 di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), questo articolo non lo spiega nel dettaglio. Puoi trovare queste informazioni [qui](/developers/tutorials/erc20-annotated-code). +Nota che, sebbene utilizzeremo il [contratto del token ERC-20 di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), questo articolo non lo spiega in grande dettaglio. Puoi trovare queste informazioni [qui](/developers/tutorials/erc20-annotated-code). -Se desideri visualizzare il codice sorgente completo: +Se vuoi vedere il codice sorgente completo: -1. Apri l'[IDE di Remix](https://remix.ethereum.org/). -2. Clicca l'icona di clonazione di GitHub (![clone github icon](icon-clone.png)). -3. Clona la repository di GitHub `https://github.com/qbzzt/20220815-erc20-safety-rails`. -4. Apri **contratti > erc20-safety-rails.sol**. +1. Apri l'[IDE Remix](https://remix.ethereum.org/). +2. Clicca sull'icona per clonare da github (![clone github icon](icon-clone.png)). +3. Clona il repository github `https://github.com/qbzzt/20220815-erc20-safety-rails`. +4. Apri **contracts > erc20-safety-rails.sol**. ## Creare un contratto ERC-20 {#creating-an-erc-20-contract} -Prima di poter aggiungere la funzionalità della barriera di sicurezza, ci occorre un contratto ERC-20. In questo articolo utilizzeremo [la procedura guidata dei contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Aprila in un altro browser e segui queste istruzioni: +Prima di poter aggiungere la funzionalità delle misure di sicurezza, abbiamo bisogno di un contratto ERC-20. In questo articolo utilizzeremo [il Wizard dei Contratti di OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Aprilo in un altro browser e segui queste istruzioni: 1. Seleziona **ERC20**. 2. Inserisci queste impostazioni: - | Parametro | Valore | - | --------------- | ---------------- | - | Nome | SafetyRailsToken | - | Symbol | SAFE | - | Premint | 1000 | - | Caratteristiche | Nessuno | - | Access Control | Ownable | - | Upgradability | Nessuno | + | Parametro | Valore | + | -------------- | ---------------- | + | Nome | SafetyRailsToken | + | Simbolo | SAFE | + | Premint | 1000 | + | Funzionalità | Nessuna | + | Controllo degli accessi | Ownable | + | Aggiornabilità | Nessuna | -3. Scorri in alto e clicca su **Apri su Remix** (per Remix) o su **Scarica** per utilizzare un ambiente differente. Supporrò che tu stia utilizzando Remix, altrimenti, effettua le modifiche appropriate. -4. Ora, abbiamo un contratto ERC-20 pienamente funzionante. Puoi espandere `.deps` > `npm` per visualizzare il codice importato. -5. Compila, distribuisci e gioca con il contratto, per scoprire che funziona come un contratto ERC-20. Se devi apprendere come funziona Remix, [utilizza questo tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). +3. Scorri verso l'alto e clicca su **Open in Remix** (per Remix) o **Download** per utilizzare un ambiente diverso. Darò per scontato che tu stia usando Remix; se usi qualcos'altro, apporta semplicemente le modifiche appropriate. +4. Ora abbiamo un contratto ERC-20 completamente funzionante. Puoi espandere `.deps` > `npm` per vedere il codice importato. +5. Compila, distribuisci e gioca con il contratto per vedere che funziona come un contratto ERC-20. Se hai bisogno di imparare a usare Remix, [usa questo tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). ## Errori comuni {#common-mistakes} ### Gli errori {#the-mistakes} -Gli utenti, talvolta, inviano dei token all'indirizzo errato. Anche se non possiamo leggere la loro mente per sapere cosa intendevano fare, ci sono due tipi di errore che capitano spesso e sono facili da rilevare: +A volte gli utenti inviano token all'indirizzo sbagliato. Sebbene non possiamo leggere le loro menti per sapere cosa intendessero fare, ci sono due tipi di errori che si verificano spesso e sono facili da rilevare: -1. Inviare i token all'indirizzo del contratto. Ad esempio, il [token OP di Optimism](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) è riuscito ad accumulare [oltre 120.000](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns) token OP in meno di due mesi. Questo rappresenta una significativa quantità di ricchezza che, presumibilmente, è semplicemente stata persa dalle persone. +1. Inviare i token all'indirizzo del contratto stesso. Ad esempio, il [token OP di Optimism](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) è riuscito ad accumulare [oltre 120.000](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042) token OP in meno di due mesi. Ciò rappresenta una quantità significativa di ricchezza che presumibilmente le persone hanno semplicemente perso. -2. Inviare i token a un indirizzo vuoto, non corrispondente a un [conto posseduto esternamente](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) o a un [contratto intelligente](/developers/docs/smart-contracts). Sebbene non siano disponibili le statistiche su quanto spesso si verifichi, [un incidente potrebbe costare fino a 20.000.000 token](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). +2. Inviare i token a un indirizzo vuoto, uno che non corrisponde a un [account controllato esternamente](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) o a un [contratto intelligente](/developers/docs/smart-contracts). Sebbene non abbia statistiche su quanto spesso ciò accada, [un incidente potrebbe essere costato 20.000.000 di token](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). ### Prevenire i trasferimenti {#preventing-transfers} -Il contratto ERC-20 di OpenZeppelin include [un hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), chiamato prima del trasferimento di un token. Per impostazione predefinita, questo hook non fa nulla, ma possiamo allegarci la nostra funzionalità, come controlli che ripristinano la transazione se si verifica un problema. +Il contratto ERC-20 di OpenZeppelin include [un hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), che viene chiamato prima che un token venga trasferito. Per impostazione predefinita, questo hook non fa nulla, ma possiamo agganciarvi le nostre funzionalità, come controlli che annullano l'operazione se c'è un problema. Per utilizzare l'hook, aggiungi questa funzione dopo il costruttore: @@ -68,42 +67,42 @@ Per utilizzare l'hook, aggiungi questa funzione dopo il costruttore: } ``` -Alcune parti di questa funzione potrebbero essere nuove, se non hai familiarità con Solidity: +Alcune parti di questa funzione potrebbero essere nuove se non hai molta familiarità con Solidity: ```solidity internal virtual ``` -La parola chiave `virtual` signiica che appena abbiamo ereditato la funzionalità da `ERC20` e sovrascritto questa funzione, gli altri contratti possono ereditare da noi e sovrascriverla. +La parola chiave `virtual` significa che, proprio come abbiamo ereditato la funzionalità da `ERC20` e sovrascritto questa funzione, altri contratti possono ereditare da noi e sovrascrivere questa funzione. ```solidity override(ERC20) ``` -Dobbiamo specificare esplicitamente che stiamo [sovrascrivendo](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) la definizione del token ERC20 di `_beforeTokenTransfer`. In generale, le definizioni esplicite sono molto migliori, dal punto di vista della sicurezza, rispetto a quelle implicite: non puoi dimenticare di aver fatto qualcosa se ce l'hai davanti. Questo è anche il motivo per cui dobbiamo specificare il `_beforeTokenTransfer` di quale superclasse stiamo sovrascrivendo. +Dobbiamo specificare esplicitamente che stiamo [sovrascrivendo](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) la definizione del token ERC20 di `_beforeTokenTransfer`. In generale, le definizioni esplicite sono molto migliori, dal punto di vista della sicurezza, rispetto a quelle implicite: non puoi dimenticare di aver fatto qualcosa se è proprio di fronte a te. Questo è anche il motivo per cui dobbiamo specificare quale `_beforeTokenTransfer` della superclasse stiamo sovrascrivendo. ```solidity super._beforeTokenTransfer(from, to, amount); ``` -Questa riga chiama la funzione `_beforeTokenTransfer` del contratto o dei contratti da cui abbiamo ereditato o che la contengono. In qusto caso, è solo `ERC20`, `Ownable` non contiene questo hook. Sebbene correntemente `ERC20._beforeTokenTransfer` non faccia nulla, lo chiamiamo nel caso in cui la funzionalità sia aggiunta in futuro (e, quindi, decidiamo di ridistribuire il contratto, poiché i contratti non cambiano dopo la distribuzione). +Questa riga chiama la funzione `_beforeTokenTransfer` del contratto o dei contratti da cui abbiamo ereditato che ce l'hanno. In questo caso, è solo `ERC20`, `Ownable` non ha questo hook. Anche se attualmente `ERC20._beforeTokenTransfer` non fa nulla, lo chiamiamo nel caso in cui vengano aggiunte funzionalità in futuro (e decidessimo quindi di ridistribuire il contratto, perché i contratti non cambiano dopo la distribuzione). -### Codifica dei requisiti {#coding-the-requirements} +### Codificare i requisiti {#coding-the-requirements} Vogliamo aggiungere questi requisiti alla funzione: -- L'indirizzo `to` non può equivalere ad `address(this)`, l'indirizzo dello stesso contratto ERC-20. -- L'indirizzo `to` non può essere vuoto, dev'essere: - - Account posseduti esternamente (EOA). Non possiamo verificare se un indirizzo è un EOA direttamente, ma possiamo verificare il saldo di ETH di un indirizzo. Gli EOA contengono quasi sempre un saldo, anche se non sono più utilizzati; è difficile ripulirli fino all'ultimo wei. - - Un contratto intelligente. Testare se un indirizzo è un contratto intelligente è più difficile. Esiste un codice operativo che controlla la lunghezza del codice esterno, chiamato [`EXTCODESIZE`](https://www.evm.codes/#3b), ma non è direttamente disponibile in Solidity. Dobbiamo utilizzare [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), un assemblaggio dell'EVM, per farlo. Esistono altri valori che potremmo utilizzare da Solidity ([`
.code` e `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), ma costano di più. +- L'indirizzo `to` non può essere uguale a `address(this)`, l'indirizzo del contratto ERC-20 stesso. +- L'indirizzo `to` non può essere vuoto, deve essere uno dei seguenti: + - Un account controllato esternamente (EOA). Non possiamo verificare direttamente se un indirizzo è un EOA, ma possiamo controllare il saldo in ETH di un indirizzo. Gli EOA hanno quasi sempre un saldo, anche se non vengono più utilizzati: è difficile svuotarli fino all'ultimo wei. + - Un contratto intelligente. Verificare se un indirizzo è un contratto intelligente è un po' più difficile. Esiste un opcode che controlla la lunghezza del codice esterno, chiamato [`EXTCODESIZE`](https://www.evm.codes/#3b), ma non è disponibile direttamente in Solidity. Dobbiamo usare [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), che è l'assembly dell'EVM, per farlo. Ci sono altri valori che potremmo usare da Solidity ([`
.code` e `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), ma costano di più. -Analizziamo il codice, riga per riga: +Esaminiamo il nuovo codice riga per riga: ```solidity require(to != address(this), "Can't send tokens to the contract address"); ``` -Questo è il primo requisito, controlla che `to` `this(address)` non siano la stessa cosa. +Questo è il primo requisito, verificare che `to` e `this(address)` non siano la stessa cosa. ```solidity bool isToContract; @@ -112,81 +111,81 @@ Questo è il primo requisito, controlla che `to` `this(address)` non siano la st } ``` -È così che controlliamo se un indirizzo è un contratto. Non possiamo ricevere direttamente il risultato da Yul, quindi, invece, definiamo una variabile che detenga il risultato (`isToContract` in questo caso). Yul funziona così: ogni codice operativo è considerato come una funzione. Quindi, prima chiamiamo [`EXTCODESIZE`](https://www.evm.codes/#3b) per ottenere le dimensioni del contratto, quindi utilizziamo [`GT`](https://www.evm.codes/#11) per verificare che non sia zero (stiamo avendo a che fare con interi non firmati, quindi, ovviamente, non possono essere negativi). Poi, dobbiamo scrivere il risultato in `isToContract`. +Ecco come verifichiamo se un indirizzo è un contratto. Non possiamo ricevere l'output direttamente da Yul, quindi definiamo invece una variabile per contenere il risultato (`isToContract` in questo caso). Il modo in cui funziona Yul è che ogni opcode è considerato una funzione. Quindi prima chiamiamo [`EXTCODESIZE`](https://www.evm.codes/#3b) per ottenere la dimensione del contratto, e poi usiamo [`GT`](https://www.evm.codes/#11) per verificare che non sia zero (abbiamo a che fare con interi senza segno, quindi ovviamente non può essere negativo). Scriviamo quindi il risultato in `isToContract`. ```solidity require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); ``` -E, infine, abbiamo il controllo effettivo per gli indirizzi vuoti. +E infine, abbiamo il controllo effettivo per gli indirizzi vuoti. ## Accesso amministrativo {#admin-access} -Talvolta è utile avere un amministratore che possa annullare gli errori. Per ridurre il potenziale di abusi, questo può essere una [multifirma](https://blog.logrocket.com/security-choices-multi-signature-wallets/), quindi più persone devono approvare un'azione. In questo articolo abbiamo due funzionalità amministrative: +A volte è utile avere un amministratore che possa annullare gli errori. Per ridurre il potenziale di abuso, questo amministratore può essere un [multifirma](https://blog.logrocket.com/security-choices-multi-signature-wallets/) in modo che più persone debbano concordare su un'azione. In questo articolo avremo due funzionalità amministrative: -1. Congelamento e scongelamento degli account. Utile, ad esempio, quando un account potrebbe essere compromesso. -2. Pulizia della risorsa. +1. Congelare e scongelare gli account. Questo può essere utile, ad esempio, quando un account potrebbe essere compromesso. +2. Pulizia degli asset. - Talvolta, i truffatori inviano token fraudolenti al contratto del token reale, per ottenere legittimità. Ad esempio, [vedi qui](https://optimistic.etherscan.io/token/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe?a=0x4200000000000000000000000000000000000042). Il contratto ERC-20 legittimo è [0x4200....0042](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042). La truffa che pretende di essere tale contratto è [0x234....bbe](https://optimistic.etherscan.io/address/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe). + A volte i truffatori inviano token fraudolenti al contratto del token reale per ottenere legittimità. Ad esempio, [vedi qui](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders). Il contratto ERC-20 legittimo è [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042). La truffa che finge di esserlo è [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe). - Inoltre, è possibile che le persone inviino token ERC-20 legittimi al nostro contratto per errore, un altro motivo per cui vogliamo avere un modo per farli uscire. + È anche possibile che le persone inviino per errore token ERC-20 legittimi al nostro contratto, il che è un altro motivo per voler avere un modo per tirarli fuori. -OpenZeppelin fornisce due meccanismi per consentire l'accesso amministrativo: +OpenZeppelin fornisce due meccanismi per abilitare l'accesso amministrativo: -- I contratti [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable) hanno un singolo proprietario. Le funzioni aventi il [modificatore](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `onlyOwner` possono essere chiamate soltanto dal proprietario. I proprietari possono trasferire la proprietà a qualcun altro o rinunciarvi completamente. I diritti di tutti gli altri account sono solitamente identici. -- I contratti [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control) hanno il [controllo d'accesso basato sul ruolo (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). +- I contratti [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable) hanno un singolo proprietario. Le funzioni che hanno il [modificatore](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `onlyOwner` possono essere chiamate solo da quel proprietario. I proprietari possono trasferire la proprietà a qualcun altro o rinunciarvi completamente. I diritti di tutti gli altri account sono in genere identici. +- I contratti [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control) hanno il [controllo degli accessi basato sui ruoli (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). -Per semplicità, in questo articolo utilizzeremo `Ownable`. +Per motivi di semplicità, in questo articolo utilizziamo `Ownable`. ### Congelare e scongelare i contratti {#freezing-and-thawing-contracts} Congelare e scongelare i contratti richiede diverse modifiche: -- Una [mappatura](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) dagli indirizzi a [booleani](https://en.wikipedia.org/wiki/Boolean_data_type) per tenere traccia di quali indirizzi siano congelati. Tutti i valori sono inizialmente pari a zero, che per i valori booleani è interpretato come falso. Questo è ciò che vogliamo perché gli account non sono congelati per impostazione predefinita. +- Una [mappatura](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) dagli indirizzi ai [booleani](https://en.wikipedia.org/wiki/Boolean_data_type) per tenere traccia di quali indirizzi sono congelati. Tutti i valori sono inizialmente zero, che per i valori booleani viene interpretato come falso. Questo è ciò che vogliamo perché per impostazione predefinita gli account non sono congelati. ```solidity mapping(address => bool) public frozenAccounts; - ``` +``` -- [Eventi](https://www.tutorialspoint.com/solidity/solidity_events.htm) per informare chiunque sia interessato quando un account è congelato o scongelato. Tecnicamente parlando, gli eventi non sono necessari per tali azioni, ma aiutano il codice esterno alla catena a essere capace di ascoltare tali eventi e sapere che sta succedendo. È considerata buona pratica, per un contratto intelligente, di emetterli quando si verifica qualcosa che potrebbe essere rilevante per qualcuno. +- [Eventi](https://www.tutorialspoint.com/solidity/solidity_events.htm) per informare chiunque sia interessato quando un account viene congelato o scongelato. Tecnicamente parlando, gli eventi non sono richiesti per queste azioni, ma aiutano il codice fuori catena a poter ascoltare questi eventi e sapere cosa sta succedendo. È considerata buona educazione per un contratto intelligente emetterli quando accade qualcosa che potrebbe essere rilevante per qualcun altro. - Gli eventi sono indicizzati, quindi sarà possibile cercarli tutte le volte che un account è stato congelato o scongelato. + Gli eventi sono indicizzati, quindi sarà possibile cercare tutte le volte in cui un account è stato congelato o scongelato. ```solidity - // When accounts are frozen or unfrozen + // Quando gli account vengono congelati o scongelati event AccountFrozen(address indexed _addr); event AccountThawed(address indexed _addr); - ``` +``` -- Funzioni per congelare e scongelare gli account. Queste due funzioni sono quasi identiche, quindi analizzeremo soltanto la funzione di congelamento. +- Funzioni per congelare e scongelare gli account. Queste due funzioni sono quasi identiche, quindi esamineremo solo la funzione di congelamento. ```solidity function freezeAccount(address addr) public onlyOwner - ``` +``` - Le funzioni contrassegnate come [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm), possono essere chiamate da altri contratti intelligenti o direttamente da una transazione. + Le funzioni contrassegnate come [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) possono essere chiamate da altri contratti intelligenti o direttamente da una transazione. ```solidity { require(!frozenAccounts[addr], "Account already frozen"); frozenAccounts[addr] = true; emit AccountFrozen(addr); - } // freezeAccount - ``` + } // freezeAccount +``` - Se l'account è già congelato, si ripristina. Altrimenti, lo congela ed emette (`emit`) un evento. + Se l'account è già congelato, esegui un revert. Altrimenti, congelalo ed emetti (`emit`) un evento. -- Modificare `_beforeTokenTransfer` per impedire che il denaro sia spostato da un account congelato. Nota che il denaro è ancora trasferibile in un account congelato. +- Modifica `_beforeTokenTransfer` per impedire che il denaro venga spostato da un account congelato. Nota che il denaro può ancora essere trasferito nell'account congelato. ```solidity require(!frozenAccounts[from], "The account is frozen"); - ``` +``` -### Pulizia della risorsa {#asset-cleanup} +### Pulizia degli asset {#asset-cleanup} -Per rilasciare i token ERC-20 detenuti da questo contratto, dobbiamo chiamare una funzione sul contratto del token cui aappartengono, [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) o [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Non ha senso, in questo caso, sprecare gas sulle indennità, potremmo anche trasferirle direttamente. +Per rilasciare i token ERC-20 detenuti da questo contratto dobbiamo chiamare una funzione sul contratto del token a cui appartengono, ovvero [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) o [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Non ha senso sprecare gas in questo caso per le allowance, tanto vale trasferire direttamente. ```solidity function cleanupERC20( @@ -199,7 +198,7 @@ Per rilasciare i token ERC-20 detenuti da questo contratto, dobbiamo chiamare un IERC20 token = IERC20(erc20); ``` -Questa è la sintassi per creare un oggetto per un contratto quando riceviamo l'indirizzo. Possiamo farlo perché abbiamo la definizione per i token ERC20 come parte del codice sorgente (vedi riga 4) e tale file include [la definizione per IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), l'interfaccia per un contratto ERC-20 di OpenZeppelin. +Questa è la sintassi per creare un oggetto per un contratto quando riceviamo l'indirizzo. Possiamo farlo perché abbiamo la definizione per i token ERC20 come parte del codice sorgente (vedi riga 4), e quel file include [la definizione per IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), l'interfaccia per un contratto ERC-20 di OpenZeppelin. ```solidity uint balance = token.balanceOf(address(this)); @@ -207,8 +206,10 @@ Questa è la sintassi per creare un oggetto per un contratto quando riceviamo l' } ``` -Questa è una funzione di pulizia, quindi, presumibilmente, non vogliamo lasciare alcun token. Invece di ottenere manualmente il saldo dall'utente, potremmo automatizzare anche questo processo. +Questa è una funzione di pulizia, quindi presumibilmente non vogliamo lasciare alcun token. Invece di ottenere il saldo dall'utente manualmente, tanto vale automatizzare il processo. + +## Conclusione {#conclusion} -## Conclusioni {#conclusion} +Questa non è una soluzione perfetta: non esiste una soluzione perfetta per il problema "l'utente ha commesso un errore". Tuttavia, l'utilizzo di questo tipo di controlli può almeno prevenire alcuni errori. La capacità di congelare gli account, sebbene pericolosa, può essere utilizzata per limitare i danni di determinati attacchi informatici negando all'hacker i fondi rubati. -Questa non è una soluzione perfetta, non esiste una soluzione perfetta al problema "un utente ha commesso un errore". Tuttavia, utilizzando questi tipi di controlli, alcuni errori possono almeno essere prevenuti. L'abilità di congelare gli account, sebbene pericolosa, è utilizzabile per limitare i danni di certi attacchi, negando all'hacker i fondi rubati. +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/it/developers/tutorials/ethereum-for-web2-auth/index.md new file mode 100644 index 00000000000..70a7434954a --- /dev/null +++ b/public/content/translations/it/developers/tutorials/ethereum-for-web2-auth/index.md @@ -0,0 +1,888 @@ +--- +title: Utilizzare Ethereum per l'autenticazione web2 +description: "Dopo aver letto questo tutorial, uno sviluppatore sarà in grado di integrare l'accesso di Ethereum (web3) con l'accesso SAML, uno standard utilizzato nel web2 per fornire il single sign-on e altri servizi correlati. Questo consente di autenticare l'accesso alle risorse web2 tramite le firme di Ethereum, con gli attributi dell'utente provenienti dalle attestazioni." +author: Ori Pomerantz +tags: ["web2", "autenticazione", "eas"] +skill: beginner +breadcrumb: Ethereum per l'autenticazione web2 +lang: it +published: 2025-04-30 +--- + +## Introduzione + +[SAML](https://www.onelogin.com/learn/saml) è uno standard utilizzato nel web2 per consentire a un [provider di identità (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider) di fornire informazioni sull'utente ai [provider di servizi (SP)](https://en.wikipedia.org/wiki/Service_provider_(SAML)). + +In questo tutorial imparerai come integrare le firme di Ethereum con SAML per consentire agli utenti di utilizzare i propri portafogli Ethereum per autenticarsi ai servizi web2 che non supportano ancora nativamente Ethereum. + +Nota che questo tutorial è scritto per due tipi di pubblico distinti: + +- Utenti di Ethereum che comprendono Ethereum e hanno bisogno di imparare SAML +- Utenti del web2 che comprendono SAML e l'autenticazione web2 e hanno bisogno di imparare Ethereum + +Di conseguenza, conterrà molto materiale introduttivo che potresti già conoscere. Sentiti libero di saltarlo. + +### SAML per gli utenti di Ethereum + +SAML è un protocollo centralizzato. Un provider di servizi (SP) accetta asserzioni (come "questo è il mio utente John, dovrebbe avere i permessi per fare A, B e C") da un provider di identità (IdP) solo se ha una relazione di fiducia preesistente con esso, o con l'[autorità di certificazione](https://www.ssl.com/article/what-is-a-certificate-authority-ca/) che ha firmato il certificato di quell'IdP. + +Ad esempio, l'SP può essere un'agenzia di viaggi che fornisce servizi di viaggio alle aziende, e l'IdP può essere il sito web interno di un'azienda. Quando i dipendenti devono prenotare un viaggio di lavoro, l'agenzia di viaggi li invia per l'autenticazione da parte dell'azienda prima di consentire loro di prenotare effettivamente il viaggio. + +![Processo SAML passo dopo passo](./fig-01-saml.png) + +Questo è il modo in cui le tre entità, il browser, l'SP e l'IdP, negoziano l'accesso. L'SP non ha bisogno di sapere nulla in anticipo sull'utente che utilizza il browser, deve solo fidarsi dell'IdP. + +### Ethereum per gli utenti di SAML + +Ethereum è un sistema decentralizzato. + +![Accesso a Ethereum](./fig-02-eth-logon.png) + +Gli utenti hanno una chiave privata (tipicamente conservata in un'estensione del browser). Dalla chiave privata è possibile derivare una chiave pubblica, e da questa un indirizzo di 20 byte. Quando gli utenti devono accedere a un sistema, viene loro richiesto di firmare un messaggio con un nonce (un valore monouso). Il server può verificare che la firma sia stata creata da quell'indirizzo. + +![Ottenere dati extra dalle attestazioni](./fig-03-eas-data.png) + +La firma verifica solo l'indirizzo di Ethereum. Per ottenere altri attributi dell'utente, in genere si utilizzano le [attestazioni](https://attest.org/). Un'attestazione ha tipicamente questi campi: + +- **Attestatore**, l'indirizzo che ha effettuato l'attestazione +- **Destinatario**, l'indirizzo a cui si applica l'attestazione +- **Dati**, i dati attestati, come nome, permessi, ecc. +- **Schema**, l'ID dello schema utilizzato per interpretare i dati. + +A causa della natura decentralizzata di Ethereum, qualsiasi utente può effettuare attestazioni. L'identità dell'attestatore è importante per identificare quali attestazioni consideriamo affidabili. + +## Configurazione + +Il primo passo è far comunicare tra loro un SP SAML e un IdP SAML. + +1. Scarica il software. Il software di esempio per questo articolo è [su github](https://github.com/qbzzt/250420-saml-ethereum). Le diverse fasi sono memorizzate in rami diversi, per questa fase ti serve `saml-only` + + ```sh + git clone https://github.com/qbzzt/250420-saml-ethereum -b saml-only + cd 250420-saml-ethereum + pnpm install +``` + +2. Crea chiavi con certificati autofirmati. Questo significa che la chiave è la propria autorità di certificazione e deve essere importata manualmente nel provider di servizi. Consulta [la documentazione di OpenSSL](https://docs.openssl.org/master/man1/openssl-req/) per maggiori informazioni. + + ```sh + mkdir keys + cd keys + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-sp.crt -keyout saml-sp.pem -subj /CN=sp/ + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-idp.crt -keyout saml-idp.pem -subj /CN=idp/ + cd .. +``` + +3. Avvia i server (sia SP che IdP) + + ```sh + pnpm start +``` + +4. Naviga verso l'SP all'URL [http://localhost:3000/](http://localhost:3000/) e fai clic sul pulsante per essere reindirizzato all'IdP (porta 3001). + +5. Fornisci all'IdP il tuo indirizzo e-mail e fai clic su **Login to the service provider**. Vedrai che verrai reindirizzato di nuovo al provider di servizi (porta 3000) e che ti riconoscerà tramite il tuo indirizzo e-mail. + +### Spiegazione dettagliata + +Questo è ciò che accade, passo dopo passo: + +![Accesso SAML normale senza Ethereum](./fig-04-saml-no-eth.png) + +#### src/config.mts + +Questo file contiene la configurazione sia per il Provider di Identità che per il Provider di Servizi. Normalmente queste due sarebbero entità diverse, ma qui possiamo condividere il codice per semplicità. + +```typescript +const fs = await import("fs") + +const protocol="http" +``` + +Per ora stiamo solo testando, quindi va bene usare HTTP. + +```typescript +export const spCert = fs.readFileSync("keys/saml-sp.crt").toString() +export const idpCert = fs.readFileSync("keys/saml-idp.crt").toString() +``` + +Leggi le chiavi pubbliche, che sono normalmente disponibili per entrambi i componenti (e considerate affidabili direttamente, o firmate da un'autorità di certificazione fidata). + +```typescript +export const spPort = 3000 +export const spHostname = "localhost" +export const spDir = "sp" + +export const idpPort = 3001 +export const idpHostname = "localhost" +export const idpDir = "idp" + +export const spUrl = `${protocol}://${spHostname}:${spPort}/${spDir}` +export const idpUrl = `${protocol}://${idpHostname}:${idpPort}/${idpDir}` +``` + +Gli URL per entrambi i componenti. + +```typescript +export const spPublicData = { +``` + +I dati pubblici per il provider di servizi. + +```typescript + entityID: `${spUrl}/metadata`, +``` + +Per convenzione, in SAML l'`entityID` è l'URL in cui sono disponibili i metadati dell'entità. Questi metadati corrispondono ai dati pubblici qui presenti, tranne per il fatto che sono in formato XML. + +```typescript + wantAssertionsSigned: true, + authnRequestsSigned: false, + signingCert: spCert, + allowCreate: true, + assertionConsumerService: [{ + Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', + Location: `${spUrl}/assertion`, + }] + } +``` + +La definizione più importante per i nostri scopi è l'`assertionConsumerServer`. Significa che per asserire qualcosa (ad esempio, "l'utente che ti invia queste informazioni è somebody@example.com") al provider di servizi dobbiamo usare [HTTP POST](https://www.w3schools.com/tags/ref_httpmethods.asp) all'URL `http://localhost:3000/sp/assertion`. + +```typescript +export const idpPublicData = { + entityID: `${idpUrl}/metadata`, + signingCert: idpCert, + wantAuthnRequestsSigned: false, + singleSignOnService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/login` + }], + singleLogoutService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/logout` + }], + } +``` + +I dati pubblici per il provider di identità sono simili. Specificano che per far accedere un utente si effettua un POST a `http://localhost:3001/idp/login` e per disconnettere un utente si effettua un POST a `http://localhost:3001/idp/logout`. + +#### src/sp.mts + +Questo è il codice che implementa un provider di servizi. + +```typescript +import * as config from "./config.mts" +const fs = await import("fs") +const saml = await import("samlify") +``` + +Usiamo la libreria [`samlify`](https://www.npmjs.com/package/samlify) per implementare SAML. + +```typescript +import * as validator from "@authenio/samlify-node-xmllint" +saml.setSchemaValidator(validator) +``` + +La libreria `samlify` si aspetta di avere un pacchetto che convalidi che l'XML sia corretto, firmato con la chiave pubblica prevista, ecc. Usiamo [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint) per questo scopo. + +```typescript +const express = (await import("express")).default +const spRouter = express.Router() +const app = express() +``` + +Un [`Router`](https://expressjs.com/en/5x/api.html#router) di [`express`](https://expressjs.com/) è un "mini sito web" che può essere montato all'interno di un sito web. In questo caso, lo usiamo per raggruppare tutte le definizioni del provider di servizi. + +```typescript +const spPrivateKey = fs.readFileSync("keys/saml-sp.pem").toString() + +const sp = saml.ServiceProvider({ + privateKey: spPrivateKey, + ...config.spPublicData +}) +``` + +La rappresentazione che il provider di servizi ha di se stesso è costituita da tutti i dati pubblici e dalla chiave privata che utilizza per firmare le informazioni. + +```typescript +const idp = saml.IdentityProvider(config.idpPublicData); +``` + +I dati pubblici contengono tutto ciò che il provider di servizi deve sapere sul provider di identità. + +```typescript +spRouter.get(`/metadata`, + (req, res) => res.header("Content-Type", "text/xml").send(sp.getMetadata()) +) +``` + +Per consentire l'interoperabilità con altri componenti SAML, i provider di servizi e di identità dovrebbero avere i loro dati pubblici (chiamati metadati) disponibili in formato XML in `/metadata`. + +```typescript +spRouter.post(`/assertion`, +``` + +Questa è la pagina a cui accede il browser per identificarsi. L'asserzione include l'identificatore dell'utente (qui usiamo l'indirizzo e-mail) e può includere attributi aggiuntivi. Questo è il gestore per il passaggio 7 nel diagramma di sequenza sopra. + +```typescript + async (req, res) => { + // console.log(`Risposta SAML:\n${Buffer.from(req.body.SAMLResponse, 'base64').toString('utf-8')}`) +``` + +Puoi usare il comando commentato per vedere i dati XML forniti nell'asserzione. È [codificato in base64](https://en.wikipedia.org/wiki/Base64). + +```typescript + try { + const loginResponse = await sp.parseLoginResponse(idp, 'post', req); +``` + +Analizza la richiesta di accesso dal server di identità. + +```typescript + res.send(` + + +

Hello ${loginResponse.extract.nameID}

+ + + `) + res.send(); +``` + +Invia una risposta HTML, solo per mostrare all'utente che abbiamo ricevuto l'accesso. + +```typescript + } catch (err) { + console.error('Error processing SAML response:', err); + res.status(400).send('SAML authentication failed'); + } + } +) +``` + +Informa l'utente in caso di fallimento. + +```typescript +spRouter.get('/login', +``` + +Crea una richiesta di accesso quando il browser tenta di ottenere questa pagina. Questo è il gestore per il passaggio 1 nel diagramma di sequenza sopra. + +```typescript + async (req, res) => { + const loginRequest = await sp.createLoginRequest(idp, "post") +``` + +Ottieni le informazioni per inviare una richiesta di accesso. + +```typescript + res.send(` + + + +``` + +Questa pagina invia il modulo (vedi sotto) automaticamente. In questo modo l'utente non deve fare nulla per essere reindirizzato. Questo è il passaggio 2 nel diagramma di sequenza sopra. + +```typescript +
+``` + +Invia a `loginRequest.entityEndpoint` (l'URL dell'endpoint del provider di identità). + +```typescript + +``` + +Il nome dell'input è `loginRequest.type` (`SAMLRequest`). Il contenuto per quel campo è `loginRequest.context`, che è di nuovo XML codificato in base64. + +```typescript +
+ + + `) + } +) + +app.use(express.urlencoded({extended: true})) +``` + +[Questo middleware](https://expressjs.com/en/5x/api.html#express.urlencoded) legge il corpo della [richiesta HTTP](https://www.tutorialspoint.com/http/http_requests.htm). Per impostazione predefinita express lo ignora, perché la maggior parte delle richieste non lo richiede. Ne abbiamo bisogno perché POST utilizza il corpo. + +```typescript +app.use(`/${config.spDir}`, spRouter) +``` + +Monta il router nella directory del provider di servizi (`/sp`). + +```typescript +app.get("/", (req, res) => { + res.send(` + + + + + + `) +}) +``` + +Se un browser tenta di ottenere la directory principale, forniscigli un link alla pagina di accesso. + +```typescript +app.listen(config.spPort, () => { + console.log(`service provider is running on http://${config.spHostname}:${config.spPort}`) +}) +``` + +Ascolta la `spPort` con questa applicazione express. + +#### src/idp.mts + +Questo è il provider di identità. È molto simile al provider di servizi, le spiegazioni di seguito riguardano le parti che sono diverse. + +```typescript +const xmlParser = new (await import("fast-xml-parser")).XMLParser( + { + ignoreAttributes: false, // Preserva gli attributi + attributeNamePrefix: "@_", // Prefisso per gli attributi + } +) +``` + +Dobbiamo leggere e comprendere la richiesta XML che riceviamo dal provider di servizi. + +```typescript +const getLoginPage = requestId => ` +``` + +Questa funzione crea la pagina con il modulo inviato automaticamente che viene restituita nel passaggio 4 del diagramma di sequenza sopra. + +```typescript + + + Login page + + +

Login page

+
+ + Email address: +
+ +``` + +Ci sono due campi che inviamo al provider di servizi: + +1. Il `requestId` a cui stiamo rispondendo. +2. L'identificatore dell'utente (per ora usiamo l'indirizzo e-mail fornito dall'utente). + +```typescript +
+ + + +const idpRouter = express.Router() + +idpRouter.post("/loginSubmitted", async (req, res) => { + const loginResponse = await idp.createLoginResponse( +``` + +Questo è il gestore per il passaggio 5 del diagramma di sequenza sopra. [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125) crea la risposta di accesso. + +```typescript + sp, + { + authnContextClassRef: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport', + audience: sp.entityID, +``` + +Il pubblico è il provider di servizi. + +```typescript + extract: { + request: { + id: req.body.requestId + } + }, +``` + +Informazioni estratte dalla richiesta. L'unico parametro che ci interessa nella richiesta è il requestId, che consente al provider di servizi di far corrispondere le richieste e le relative risposte. + +```typescript + signingKey: { privateKey: idpPrivateKey, publicKey: config.idpCert } // Assicura la firma +``` + +Abbiamo bisogno di `signingKey` per avere i dati per firmare la risposta. Il provider di servizi non si fida delle richieste non firmate. + +```typescript + }, + "post", + { + email: req.body.email +``` + +Questo è il campo con le informazioni sull'utente che inviamo di nuovo al provider di servizi. + +```typescript + } + ); + + res.send(` + + + + +
+ +
+ + + `) +}) +``` + +Ancora una volta, usa un modulo inviato automaticamente. Questo è il passaggio 6 del diagramma di sequenza sopra. + +```typescript + +// Endpoint IdP per le richieste di login +idpRouter.post(`/login`, +``` + +Questo è l'endpoint che riceve una richiesta di accesso dal provider di servizi. Questo è il gestore del passaggio 3 del diagramma di sequenza sopra. + +```typescript + async (req, res) => { + try { + // Soluzione alternativa perché non sono riuscito a far funzionare parseLoginRequest. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getLoginPage(samlRequest["samlp:AuthnRequest"]["@_ID"])) +``` + +Dovremmo essere in grado di usare [`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144) per leggere l'ID della richiesta di autenticazione. Tuttavia, non sono riuscito a farlo funzionare e non valeva la pena dedicarci molto tempo, quindi uso semplicemente un [parser XML di uso generale](https://www.npmjs.com/package/fast-xml-parser). L'informazione di cui abbiamo bisogno è l'attributo `ID` all'interno del tag ``, che si trova al livello superiore dell'XML. + +## Utilizzare le firme di Ethereum + +Ora che possiamo inviare un'identità utente al provider di servizi, il passo successivo è ottenere l'identità utente in modo affidabile. Viem ci consente di chiedere semplicemente al portafoglio l'indirizzo dell'utente, ma questo significa chiedere le informazioni al browser. Non controlliamo il browser, quindi non possiamo fidarci automaticamente della risposta che ne otteniamo. + +Invece, l'IdP invierà al browser una stringa da firmare. Se il portafoglio nel browser firma questa stringa, significa che è davvero quell'indirizzo (cioè, conosce la chiave privata che corrisponde all'indirizzo). + +Per vederlo in azione, ferma l'IdP e l'SP esistenti ed esegui questi comandi: + +```sh +git checkout eth-signatures +pnpm install +pnpm start +``` + +Quindi naviga [verso l'SP](http://localhost:3000) e segui le indicazioni. + +Nota che a questo punto non sappiamo come ottenere l'indirizzo e-mail dall'indirizzo di Ethereum, quindi riportiamo invece `@bad.email.address` all'SP. + +### Spiegazione dettagliata + +Le modifiche sono nei passaggi 4-5 del diagramma precedente. + +![SAML con una firma di Ethereum](./fig-05-saml-w-signature.png) + +L'unico file che abbiamo modificato è `idp.mts`. Ecco le parti modificate. + +```typescript +import { v4 as uuidv4 } from 'uuid' +import { verifyMessage } from 'viem' +``` + +Abbiamo bisogno di queste due librerie aggiuntive. Usiamo [`uuid`](https://www.npmjs.com/package/uuid) per creare il valore del [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). Il valore in sé non ha importanza, solo il fatto che venga utilizzato una sola volta. + +La libreria [`viem`](https://viem.sh/) ci consente di utilizzare le definizioni di Ethereum. Qui ne abbiamo bisogno per verificare che la firma sia effettivamente valida. + +```typescript +const loginPrompt = "To access the service provider, sign this nonce: " +``` + +Il portafoglio chiede all'utente il permesso di firmare il messaggio. Un messaggio che è solo un nonce potrebbe confondere gli utenti, quindi includiamo questo prompt. + +```typescript +// Mantieni qui i requestID +let nonces = {} +``` + +Abbiamo bisogno delle informazioni della richiesta per potervi rispondere. Potremmo inviarle con la richiesta (passaggio 4) e riceverle indietro (passaggio 5). Tuttavia, non possiamo fidarci delle informazioni che otteniamo dal browser, che è sotto il controllo di un utente potenzialmente ostile. Quindi è meglio memorizzarle qui, con il nonce come chiave. + +Nota che lo stiamo facendo qui come variabile per motivi di semplicità. Tuttavia, questo presenta diversi svantaggi: + +- Siamo vulnerabili a un attacco denial of service. Un utente malintenzionato potrebbe tentare di accedere più volte, riempiendo la nostra memoria. +- Se il processo IdP deve essere riavviato, perdiamo i valori esistenti. +- Non possiamo bilanciare il carico su più processi, perché ognuno avrebbe la propria variabile. + +Su un sistema di produzione useremmo un database e implementeremmo un qualche tipo di meccanismo di scadenza. + +```typescript +const getSignaturePage = requestId => { + const nonce = uuidv4() + nonces[nonce] = requestId +``` + +Crea un nonce e memorizza il `requestId` per un uso futuro. + +```typescript + return ` + + + + + +

Please sign

+ +
+ + + +` +} +``` + +Il resto è solo HTML standard. + +```typescript +idpRouter.get("/signature/:nonce/:account/:signature", async (req, res) => { +``` + +Questo è il gestore per il passaggio 5 nel diagramma di sequenza. + +```typescript + const requestId = nonces[req.params.nonce] + if (requestId === undefined) { + res.send("Bad nonce") + return ; + } + + nonces[req.params.nonce] = undefined +``` + +Ottieni l'ID della richiesta ed elimina il nonce da `nonces` per assicurarti che non possa essere riutilizzato. + +```typescript + try { +``` + +Poiché ci sono così tanti modi in cui la firma può essere non valida, racchiudiamo questo in un blocco `try ... catch` per intercettare eventuali errori generati. + +```typescript + const validSignature = await verifyMessage({ + address: req.params.account, + message: `${loginPrompt}${req.params.nonce}`, + signature: req.params.signature + }) +``` + +Usa [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) per implementare il passaggio 5.5 nel diagramma di sequenza. + +```typescript + if (!validSignature) + throw("Bad signature") + } catch (err) { + res.send("Error:" + err) + return ; + } +``` + +Il resto del gestore è equivalente a quello che abbiamo fatto in precedenza nel gestore `/loginSubmitted`, ad eccezione di una piccola modifica. + +```typescript + const loginResponse = await idp.createLoginResponse( + . + . + . + { + email: req.params.account + "@bad.email.address" + } + ); +``` + +Non abbiamo l'indirizzo e-mail effettivo (lo otterremo nella prossima sezione), quindi per ora restituiamo l'indirizzo di Ethereum e lo contrassegniamo chiaramente come non un indirizzo e-mail. + + +```typescript +// Endpoint IdP per le richieste di login +idpRouter.post(`/login`, + async (req, res) => { + try { + // Soluzione alternativa perché non sono riuscito a far funzionare parseLoginRequest. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getSignaturePage(samlRequest["samlp:AuthnRequest"]["@_ID"])) + } catch (err) { + console.error('Error processing SAML response:', err); + res.status(400).send('SAML authentication failed'); + } + } +) +``` + +Invece di `getLoginPage`, ora usa `getSignaturePage` nel gestore del passaggio 3. + +## Ottenere l'indirizzo e-mail + +Il passo successivo è ottenere l'indirizzo e-mail, l'identificatore richiesto dal provider di servizi. Per farlo, usiamo l'[Ethereum Attestation Service (EAS)](https://attest.org/). + +Il modo più semplice per ottenere le attestazioni è usare l'[API GraphQL](https://docs.attest.org/docs/developer-tools/api). Usiamo questa query: + +``` +query GetAttestationsByRecipient { + attestations( + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } + take: 1 + ) { + data + id + attester + } +} +``` + +Questo [`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) include solo un indirizzo e-mail. Questa query richiede le attestazioni di questo schema. Il soggetto dell'attestazione è chiamato `recipient` (destinatario). È sempre un indirizzo di Ethereum. + +Attenzione: Il modo in cui stiamo ottenendo le attestazioni qui presenta due problemi di sicurezza. + +- Stiamo andando all'endpoint dell'API, `https://optimism.easscan.org/graphql`, che è un componente centralizzato. Possiamo ottenere l'attributo `id` e poi fare una ricerca on-chain per verificare che un'attestazione sia reale, ma l'endpoint dell'API può comunque censurare le attestazioni non informandoci su di esse. + + Questo problema non è impossibile da risolvere, potremmo eseguire il nostro endpoint GraphQL e ottenere le attestazioni dai log della catena, ma questo è eccessivo per i nostri scopi. + +- Non guardiamo l'identità dell'attestatore. Chiunque può fornirci informazioni false. In un'implementazione nel mondo reale avremmo un insieme di attestatori fidati e guarderemmo solo le loro attestazioni. + +Per vederlo in azione, ferma l'IdP e l'SP esistenti ed esegui questi comandi: + +```sh +git checkout email-address +pnpm install +pnpm start +``` + +Quindi fornisci il tuo indirizzo e-mail. Hai due modi per farlo: + +- Importa un portafoglio usando una chiave privata e usa la chiave privata di test `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80`. + +- Aggiungi un'attestazione per il tuo indirizzo e-mail: + + 1. Naviga verso [lo schema nell'esploratore di attestazioni](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977). + + 2. Fai clic su **Attest with Schema**. + + 3. Inserisci il tuo indirizzo di Ethereum come destinatario, il tuo indirizzo e-mail come email address e seleziona **Onchain**. Quindi fai clic su **Make Attestation**. + + 4. Approva la transazione nel tuo portafoglio. Avrai bisogno di un po' di ETH sulla [Blockchain di Optimism](https://app.optimism.io/bridge/deposit) per pagare il gas. + +In ogni caso, dopo averlo fatto naviga verso [http://localhost:3000](http://localhost:3000) e segui le indicazioni. Se hai importato la chiave privata di test, l'e-mail che ricevi è `test_addr_0@example.com`. Se hai usato il tuo indirizzo, dovrebbe essere quello che hai attestato. + +### Spiegazione dettagliata + +![Passare dall'indirizzo di Ethereum all'e-mail](./fig-06-saml-sig-n-email.png) + +I nuovi passaggi sono la comunicazione GraphQL, passaggi 5.6 e 5.7. + +Ancora una volta, ecco le parti modificate di `idp.mts`. + +```typescript +import { GraphQLClient } from 'graphql-request' +import { SchemaEncoder } from '@ethereum-attestation-service/eas-sdk' +``` + +Importa le librerie di cui abbiamo bisogno. + +```typescript +const graphqlEndpointUrl = "https://optimism.easscan.org/graphql" +``` + +C'è [un endpoint separato per ogni blockchain](https://docs.attest.org/docs/developer-tools/api). + +```typescript +const graphqlClient = new GraphQLClient(graphqlEndpointUrl, { fetch }) +``` + +Crea un nuovo client `GraphQLClient` che possiamo usare per interrogare l'endpoint. + +```typescript +const graphqlSchema = 'string emailAddress' +const graphqlEncoder = new SchemaEncoder(graphqlSchema) +``` + +GraphQL ci fornisce solo un oggetto dati opaco con byte. Per capirlo abbiamo bisogno dello schema. + +```typescript +const ethereumAddressToEmail = async ethAddr => { +``` + +Una funzione per passare da un indirizzo di Ethereum a un indirizzo e-mail. + +```typescript + const query = ` + query GetAttestationsByRecipient { +``` + +Questa è una query GraphQL. + +```typescript + attestations( +``` + +Stiamo cercando attestazioni. + +```typescript + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } +``` + +Le attestazioni che vogliamo sono quelle nel nostro schema, in cui il destinatario è `getAddress(ethAddr)`. La funzione [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress) si assicura che il nostro indirizzo abbia il [checksum](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md) corretto. Questo è necessario perché GraphQL fa distinzione tra maiuscole e minuscole. "0xBAD060A7", "0xBad060A7" e "0xbad060a7" sono valori diversi. + +```typescript + take: 1 +``` + +Indipendentemente da quante attestazioni troviamo, vogliamo solo la prima. + +```typescript + ) { + data + id + attester + } + }` +``` + +I campi che vogliamo ricevere. + +- `attester`: L'indirizzo che ha inviato l'attestazione. Normalmente questo viene utilizzato per decidere se fidarsi o meno dell'attestazione. +- `id`: L'ID dell'attestazione. Puoi usare questo valore per [leggere l'attestazione on-chain](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64) per verificare che le informazioni dalla query GraphQL siano corrette. +- `data`: I dati dello schema (in questo caso, l'indirizzo e-mail). + +```typescript + const queryResult = await graphqlClient.request(query) + + if (queryResult.attestations.length == 0) + return "no_address@available.is" +``` + +Se non c'è alcuna attestazione, restituisci un valore che è ovviamente errato, ma che apparirebbe valido al provider di servizi. + +```typescript + const attestationDataFields = graphqlEncoder.decodeData(queryResult.attestations[0].data) + return attestationDataFields[0].value.value +} +``` + +Se c'è un valore, usa `decodeData` per decodificare i dati. Non abbiamo bisogno dei metadati che fornisce, solo del valore stesso. + +```typescript + const loginResponse = await idp.createLoginResponse( + sp, + { + . + . + . + }, + "post", + { + email: await ethereumAddressToEmail(req.params.account) + } + ); +``` + +Usa la nuova funzione per ottenere l'indirizzo e-mail. + +## E la decentralizzazione? + +In questa configurazione gli utenti non possono fingere di essere qualcuno che non sono, a patto di affidarci ad attestatori fidati per la mappatura dall'indirizzo di Ethereum all'indirizzo e-mail. Tuttavia, il nostro provider di identità è ancora un componente centralizzato. Chiunque abbia la chiave privata del provider di identità può inviare informazioni false al provider di servizi. + +Potrebbe esserci una soluzione che utilizza il [calcolo multiparte (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation). Spero di scriverne in un tutorial futuro. + +## Conclusione + +L'adozione di uno standard di accesso, come le firme di Ethereum, affronta il problema dell'uovo e della gallina. I provider di servizi vogliono attrarre il mercato più ampio possibile. Gli utenti vogliono poter accedere ai servizi senza doversi preoccupare di supportare il loro standard di accesso. +La creazione di adattatori, come un IdP di Ethereum, può aiutarci a superare questo ostacolo. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/gasless/index.md b/public/content/translations/it/developers/tutorials/gasless/index.md new file mode 100644 index 00000000000..2b6aaad18f1 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/gasless/index.md @@ -0,0 +1,363 @@ +--- +title: "Sponsorizzare le commissioni: Come coprire i costi di transazione per i tuoi utenti" +description: "È facile creare una chiave privata e un indirizzo; è solo questione di eseguire il software giusto. Ma ci sono molti posti al mondo in cui ottenere ETH per inviare transazioni è molto più difficile. In questo tutorial imparerai come coprire i costi del gas on-chain per l'esecuzione di dati strutturati fuori catena firmati dall'utente nel tuo contratto intelligente. Fai firmare all'utente una struttura contenente le informazioni della transazione, che il tuo codice fuori catena invia poi alla blockchain come transazione." +author: Ori Pomerantz +tags: ["senza gas", "Solidity", "eip-712", "meta-transazioni"] +skill: intermediate +breadcrumb: Sponsorizzazione del gas +lang: it +published: 2026-02-27 +--- + +## Introduzione {#introduction} + +Se vogliamo che Ethereum serva [un miliardo di persone in più](https://blog.ethereum.org/category/next-billion), dobbiamo rimuovere gli attriti e renderlo il più facile possibile da usare. Una fonte di questo attrito è la necessità di ETH per pagare le commissioni. + +Se hai una dApp che guadagna dagli utenti, potrebbe avere senso consentire agli utenti di inviare transazioni tramite il tuo server e pagare tu stesso le commissioni della transazione. Poiché gli utenti firmano comunque un [messaggio di autorizzazione EIP-712](https://eips.ethereum.org/EIPS/eip-712) nei loro portafogli, mantengono le garanzie di integrità di Ethereum. La disponibilità dipende dal server che trasmette le transazioni, quindi è più limitata. Tuttavia, puoi configurare le cose in modo che gli utenti possano anche accedere direttamente al contratto intelligente (se ottengono ETH) e consentire ad altri di configurare i propri server se desiderano sponsorizzare le transazioni. + +La tecnica in questo tutorial funziona solo quando controlli il contratto intelligente. Ci sono altre tecniche, inclusa l'[astrazione dell'account](https://eips.ethereum.org/EIPS/eip-4337) che ti permettono di sponsorizzare transazioni verso altri contratti intelligenti, che spero di trattare in un tutorial futuro. + +Nota: Questo _non_ è codice a livello di produzione. È vulnerabile ad attacchi significativi e manca di funzionalità importanti. Scopri di più nella [sezione sulle vulnerabilità di questa guida](#vulnerabilities). + +### Prerequisiti {#prerequisites} + +Per comprendere questo tutorial devi avere già familiarità con: + +- Solidity +- JavaScript +- React e WAGMI. Se non hai familiarità con questi strumenti per l'interfaccia utente, [abbiamo un tutorial a riguardo](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). + +## L'applicazione di esempio {#sample-app} + +L'applicazione di esempio qui è una variante del contratto `Greeter` di Hardhat. Puoi vederla [su GitHub](https://github.com/qbzzt/260301-gasless). Il contratto intelligente è già distribuito su [Sepolia](https://sepolia.dev/), all'indirizzo [`0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA`](https://eth-sepolia.blockscout.com/address/0xC87506C66c7896366b9E988FE0aA5B6dDE77CFfA). + +Per vederla in azione, segui questi passaggi. + +1. Clona il repository e installa il software necessario. + + ```sh + git clone https://github.com/qbzzt/260301-gasless.git + cd 260301-gasless/server + npm install +``` + +2. Modifica `.env` per impostare `PRIVATE_KEY` su un portafoglio che ha ETH su Sepolia. Se hai bisogno di ETH su Sepolia, [usa un rubinetto](/developers/docs/networks/#sepolia). Idealmente, questa chiave privata dovrebbe essere diversa da quella che hai nel portafoglio del tuo browser. + +3. Avvia il server. + + ```sh + npm run dev +``` + +4. Naviga verso l'applicazione all'URL [`http://localhost:5173`](http://localhost:5173). + +5. Fai clic su **Connect with Injected** per connetterti a un portafoglio. Approva nel portafoglio e approva il passaggio a Sepolia se necessario. + +6. Scrivi un nuovo saluto e fai clic su **Update greeting via sponsor**. + +7. Firma il messaggio. + +8. Attendi circa 12 secondi (il tempo di blocco su Sepolia). Durante l'attesa puoi guardare l'URL nella console del server per vedere la transazione. + +9. Verifica che il saluto sia cambiato e che il valore dell'indirizzo dell'ultimo aggiornamento sia ora l'indirizzo del portafoglio del tuo browser. + +Per capire come funziona, dobbiamo esaminare come il messaggio viene creato nell'interfaccia utente, come viene trasmesso dal server e come il contratto intelligente lo elabora. + +### L'interfaccia utente {#ui-changes} + +L'interfaccia utente è basata su [WAGMI](https://wagmi.sh/); puoi leggerne a riguardo [in questo tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). + +Ecco come firmiamo il messaggio: + +```js +const signGreeting = useCallback( +``` + +L'hook di React [`useCallback`](https://react.dev/reference/react/useCallback) ci permette di migliorare le prestazioni riutilizzando la stessa funzione quando il componente viene ridisegnato. + +```js + async (greeting) => { + if (!account) throw new Error("Wallet not connected") +``` + +Se non c'è alcun account, solleva un errore. Questo non dovrebbe mai accadere perché il pulsante dell'interfaccia utente che avvia il processo che chiama `signGreeting` è disabilitato in quel caso. Tuttavia, i programmatori futuri potrebbero rimuovere quella salvaguardia, quindi è una buona idea controllare questa condizione anche qui. + +```js + const domain = { + name: "Greeter", + version: "1", + chainId, + verifyingContract: contractAddr, + } +``` + +Parametri per il [separatore di dominio](https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator). Questo valore è costante, quindi in un'implementazione meglio ottimizzata, potremmo calcolarlo una volta anziché ricalcolarlo ogni volta che la funzione viene chiamata. + +- `name` è un nome leggibile dall'utente, come il nome della dApp per cui stiamo producendo le firme. +- `version` è la versione. Versioni diverse non sono compatibili. +- `chainId` è la catena che stiamo utilizzando, come fornito [da WAGMI](https://wagmi.sh/react/api/hooks/useChainId). +- `verifyingContract` è l'indirizzo del contratto che verificherà questa firma. Non vogliamo che la stessa firma si applichi a più contratti, nel caso in cui ci siano diversi contratti `Greeter` e vogliamo che abbiano saluti diversi. + +```js + + const types = { + GreetingRequest: [ + { name: "greeting", type: "string" }, + ], + } +``` + +Il tipo di dati che firmiamo. Qui abbiamo un singolo parametro, `greeting`, ma i sistemi reali in genere ne hanno di più. + +```js + const message = { greeting } +``` + +Il messaggio effettivo che vogliamo firmare e inviare. `greeting` è sia il nome del campo che il nome della variabile che lo riempie. + +```js + const signature = await signTypedDataAsync({ + domain, + types, + primaryType: "GreetingRequest", + message, + }) +``` + +Ottieni effettivamente la firma. Questa funzione è asincrona perché gli utenti impiegano molto tempo (dal punto di vista di un computer) per firmare i dati. + +```js + const r = `0x${signature.slice(2, 66)}` + const s = `0x${signature.slice(66, 130)}` + const v = parseInt(signature.slice(130, 132), 16) + + return { + req: { greeting }, + v, + r, + s, + } + }, +``` + +La funzione restituisce un singolo valore esadecimale. Qui lo dividiamo in campi. + +```js + [account, chainId, contractAddr, signTypedDataAsync], +) +``` + +Se una qualsiasi di queste variabili cambia, crea una nuova istanza della funzione. I parametri `account` e `chainId` possono essere modificati dall'utente nel portafoglio. `contractAddr` è una funzione dell'Id della catena. `signTypedDataAsync` non dovrebbe cambiare, ma lo importiamo da [un hook](https://wagmi.sh/react/api/hooks/useSignTypedData), quindi non possiamo esserne sicuri, ed è meglio aggiungerlo qui. + +Ora che il nuovo saluto è firmato, dobbiamo inviarlo al server. + +```js + const sponsoredGreeting = async () => { + try { +``` + +Questa funzione prende una firma e la invia al server. + +```js + const signedMessage = await signGreeting(newGreeting) + const response = await fetch("/server/sponsor", { +``` + +Invia al percorso `/server/sponsor` nel server da cui proveniamo. + +```js + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(signedMessage), + }) +``` + +Usa `POST` per inviare le informazioni codificate in JSON. + +```js + const data = await response.json() + console.log("Server response:", data) + } catch (err) { + console.error("Error:", err) + } + } +``` + +Emetti la risposta. Su un sistema di produzione mostreremmo anche la risposta all'utente. + +### Il server {#server} + +Mi piace usare [Vite](https://vite.dev/) come mio front-end. Serve automaticamente le librerie React e aggiorna il browser quando il codice front-end cambia. Tuttavia, Vite non include strumenti di backend. + +La soluzione è in [`index.js`](https://github.com/qbzzt/260301-gasless/blob/main/server/index.js). + +```js + app.post("/server/sponsor", async (req, res) => { + ... + }) + + // Lascia che Vite gestisca tutto il resto + const vite = await createViteServer({ + server: { middlewareMode: true } + }) + + app.use(vite.middlewares) +``` + +Per prima cosa registriamo un gestore per le richieste che gestiamo noi stessi (`POST` a `/server/sponsor`). Quindi creiamo e usiamo un server Vite per gestire tutti gli altri URL. + +```js + app.post("/server/sponsor", async (req, res) => { + try { + const signed = req.body + + const txHash = await sepoliaClient.writeContract({ + address: greeterAddr, + abi: greeterABI, + functionName: 'sponsoredSetGreeting', + args: [signed.req, signed.v, signed.r, signed.s], + }) + } ... + }) +``` + +Questa è solo una chiamata standard alla blockchain con [viem](https://viem.sh/). + +### Il contratto intelligente {#smart-contract} + +Infine, [`Greeter.sol`](https://github.com/qbzzt/260301-gasless/blob/main/contracts/src/Greeter.sol) deve verificare la firma. + +```solidity + constructor(string memory _greeting) { + greeting = _greeting; + + DOMAIN_SEPARATOR = keccak256( + abi.encode( + keccak256( + "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" + ), + keccak256(bytes("Greeter")), + keccak256(bytes("1")), + block.chainid, + address(this) + ) + ); + } +``` + +Il costruttore crea il [separatore di dominio](https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator), in modo simile al codice dell'interfaccia utente sopra. L'esecuzione sulla blockchain è molto più costosa, quindi lo calcoliamo solo una volta. + +```solidity + struct GreetingRequest { + string greeting; + } +``` + +Questa è la struttura che viene firmata. Qui abbiamo un solo campo. + +```solidity + bytes32 private constant GREETING_TYPEHASH = + keccak256("GreetingRequest(string greeting)"); +``` + +Questo è l'[identificatore della struttura](https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct). Viene calcolato ogni volta nell'interfaccia utente. + +```solidity + function sponsoredSetGreeting( + GreetingRequest calldata req, + uint8 v, + bytes32 r, + bytes32 s + ) external { +``` + +Questa funzione riceve una richiesta firmata e aggiorna il saluto. + +```solidity + // Calcola il digest EIP-712 + bytes32 digest = keccak256( + abi.encodePacked( + "\x19\x01", + DOMAIN_SEPARATOR, + keccak256( + abi.encode( + GREETING_TYPEHASH, + keccak256(bytes(req.greeting)) + ) + ) + ) + ); +``` + +Crea il digest in conformità con l'[EIP 712](https://eips.ethereum.org/EIPS/eip-712). + +```solidity + // Recupera il firmatario + address signer = ecrecover(digest, v, r, s); + require(signer != address(0), "Invalid signature"); +``` + +Usa [`ecrecover`](https://www.evm.codes/precompiled?fork=osaka#0x01) per ottenere l'indirizzo del firmatario. Nota che una firma errata può comunque produrre un indirizzo valido, solo che sarà casuale. + +```solidity + // Applica il saluto come se il firmatario lo avesse chiamato + greeting = req.greeting; + emit SetGreeting(signer, req.greeting); + } +``` + +Aggiorna il saluto. + +## Vulnerabilità {#vulnerabilities} + +Questo _non_ è codice a livello di produzione. È vulnerabile ad attacchi significativi e manca di funzionalità importanti. Eccone alcune, insieme a come risolverle. + +Per vedere alcuni di questi attacchi, fai clic sui pulsanti sotto l'intestazione _Attacks_ e guarda cosa succede. Per il pulsante **Invalid signature**, controlla la console del server per vedere la risposta della transazione. + +### Denial of service sul server {#dos-on-server} + +L'attacco più semplice è un attacco [denial-of-service](https://en.wikipedia.org/wiki/Denial-of-service_attack) sul server. Il server riceve richieste da qualsiasi parte di Internet e, in base a tali richieste, invia transazioni. Non c'è assolutamente nulla che impedisca a un utente malintenzionato di emettere un mucchio di firme, valide o non valide. Ognuna causerà una transazione. Alla fine il server esaurirà gli ETH per pagare il gas. + +Una soluzione a questo problema è limitare la frequenza a una transazione per blocco. Se lo scopo è mostrare i saluti agli [account controllati esternamente](/developers/docs/accounts/#key-differences), non importa comunque quale sia il saluto nel mezzo del blocco. + +Un'altra soluzione è tenere traccia degli indirizzi e consentire solo le firme da clienti validi. + +### Firme di saluto errate {#wrong-greeting-sigs} + +Quando fai clic su **Signature for wrong greeting**, invii una firma valida per un indirizzo specifico (`0xaA92c5d426430D4769c9E878C1333BDe3d689b3e`) e un saluto (`Hello`). Ma lo invia con un saluto diverso. Questo confonde `ecrecover`, che cambia il saluto ma ha l'indirizzo sbagliato. + +Per risolvere questo problema, aggiungi l'indirizzo alla [struttura firmata](https://github.com/qbzzt/260301-gasless/blob/main/server/src/Greeter.jsx#L122-L124). In questo modo, l'indirizzo casuale di `ecrecover` non corrisponderà all'indirizzo nella firma e il contratto intelligente rifiuterà il messaggio. + +### Attacchi di replay {#replay-attack} + +Quando fai clic su **Replay attack**, invii la stessa firma "Sono 0xaA92c5d426430D4769c9E878C1333BDe3d689b3e e vorrei che il saluto fosse `Hello`", ma con il saluto corretto. Di conseguenza, il contratto intelligente crede che l'indirizzo (che non è il tuo) abbia riportato il saluto a `Hello`. Le informazioni per farlo sono pubblicamente disponibili nelle [informazioni della transazione](https://eth-sepolia.blockscout.com/tx/0xa66afe4bbf886f59533e677a798c802ceab1ac0f9db6e83a4d4b59a45cf7c1b1). + +Se questo è un problema, una soluzione è aggiungere un [nonce](https://en.wikipedia.org/wiki/Cryptographic_nonce). Crea una [mappatura](https://docs.soliditylang.org/en/latest/types.html#mapping-types) tra indirizzi e numeri e aggiungi un campo nonce alla firma. Se il campo nonce corrisponde alla mappatura per l'indirizzo, accetta la firma e incrementa la mappatura per la volta successiva. In caso contrario, rifiuta la transazione. + +Un'altra soluzione è aggiungere un timestamp ai dati firmati e accettare la firma come valida solo per pochi secondi dopo quel timestamp. Questo è più semplice ed economico, ma rischiamo attacchi di replay all'interno della finestra temporale e il fallimento di transazioni legittime se la finestra temporale viene superata. + +## Altre funzionalità mancanti {#other-missing-features} + +Ci sono funzionalità aggiuntive che aggiungeremmo in un ambiente di produzione. + +### Accesso da altri server {#other-servers} + +Attualmente, consentiamo a qualsiasi indirizzo di inviare un `sponsorSetGreeting`. Questo potrebbe essere esattamente ciò che vogliamo, nell'interesse della decentralizzazione. O forse vogliamo assicurarci che le transazioni sponsorizzate passino attraverso il _nostro_ server, nel qual caso controlleremmo `msg.sender` nel contratto intelligente. + +In ogni caso, questa dovrebbe essere una decisione di progettazione consapevole, non solo il risultato di non aver pensato al problema. + +### Gestione degli errori {#error-handling} + +Un utente invia un saluto. Forse viene aggiornato al blocco successivo. Forse no. Gli errori sono invisibili. Su un sistema di produzione, l'utente dovrebbe essere in grado di distinguere tra questi casi: + +- Il nuovo saluto non è stato ancora inviato +- Il nuovo saluto è stato inviato ed è in fase di elaborazione +- Il nuovo saluto è stato rifiutato + +## Conclusione {#conclusion} + +A questo punto, dovresti essere in grado di creare un'esperienza senza gas per gli utenti della tua dApp, al costo di una certa centralizzazione. + +Tuttavia, questo funziona solo con contratti intelligenti che supportano ERC-712. Per trasferire un token ERC-20, ad esempio, è necessario che la transazione sia firmata dal proprietario anziché solo un messaggio. La soluzione è l'[astrazione dell'account (ERC-4337)](https://docs.erc4337.io/index.html). Spero di scrivere un tutorial futuro a riguardo. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/it/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md index 13d10e13f2f..12f51be6b43 100644 --- a/public/content/translations/it/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md +++ b/public/content/translations/it/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -1,61 +1,56 @@ --- -title: Primi passi con lo sviluppo di Ethereum -description: "Questa è una guida per principianti per iniziare con lo sviluppo di Ethereum. Ti guideremo dal lancio di un endpoint API alla formulazione di una richiesta da riga di comando, fino alla scrittura del tuo primo script web3! Non è necessaria alcuna esperienza di sviluppo con le blockchain!" +title: Iniziare con lo sviluppo su Ethereum +description: "Questa è una guida per principianti per iniziare con lo sviluppo su Ethereum. Ti accompagneremo dall'avvio di un endpoint API, all'esecuzione di una richiesta da riga di comando, fino alla scrittura del tuo primo script web3! Nessuna esperienza di sviluppo blockchain necessaria!" author: "Elan Halpern" -tags: - - "javascript" - - "ethers.js" - - "nodi" - - "query" - - "alchemy" +tags: ["JavaScript", "ethers.js", "nodi", "query", "Alchemy"] skill: beginner -breadcrumb: "Primi passi" +breadcrumb: Per iniziare lang: it published: 2020-10-30 -source: Medio +source: Medium sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f --- -![Loghi Ethereum e Alchemy](./ethereum-alchemy.png) +![Loghi di Ethereum e Alchemy](./ethereum-alchemy.png) -Questa è una guida per principianti per muovere i primi passi con lo sviluppo di Ethereum. Per questo tutorial useremo [Alchemy](https://alchemyapi.io/), la piattaforma principale per sviluppatori della blockchain con milioni di utenti dal 70% delle migliori app della blockchain, tra cui Maker, 0x, MyEtherWallet, Dharma e Kyber. Alchemy ci darà accesso all'endpoint di un'API sulla catena di Ethereum, così da permetterci di leggere e scrivere le transazioni. +Questa è una guida per principianti per iniziare con lo sviluppo su Ethereum. Per questo tutorial utilizzeremo [Alchemy](https://alchemyapi.io/), la principale piattaforma di sviluppo blockchain che alimenta milioni di utenti dal 70% delle migliori app blockchain, tra cui Maker, 0x, MyEtherWallet, Dharma e Kyber. Alchemy ci darà accesso a un endpoint API sulla catena di Ethereum in modo da poter leggere e scrivere transazioni. -Inizieremo dalla registrazione ad Alchemy e passeremo alla scrittura del tuo primo script web3! Non è necessaria alcuna esperienza di sviluppo con blockchain. +Ti accompagneremo dalla registrazione su Alchemy alla scrittura del tuo primo script web3! Nessuna esperienza di sviluppo blockchain necessaria! -## 1. Registrati per un Conto Gratuito di Alchemy {#sign-up-for-a-free-alchemy-account} +## 1. Registrati per un account Alchemy gratuito {#sign-up-for-a-free-alchemy-account} -Creare un conto di Alchemy è facile, [registrati gratuitamente qui](https://auth.alchemyapi.io/signup). +Creare un account con Alchemy è facile, [registrati gratuitamente qui](https://auth.alchemy.com/). -## 2. Crea un'app con Alchemy {#create-an-alchemy-app} +## 2. Crea un'app Alchemy {#create-an-alchemy-app} -Per comunicare con la catena Ethereum e per utilizzare i prodotti di Alchemy, è necessaria una chiave API per autenticare le richieste. +Per comunicare con la catena di Ethereum e utilizzare i prodotti di Alchemy, hai bisogno di una chiave API per autenticare le tue richieste. -Puoi [creare chiavi API dalla dashboard](http://dashboard.alchemyapi.io/). Per creare una nuova chiave, vai a "Create App" come mostrato sotto: +Puoi [creare chiavi API dalla dashboard](https://dashboard.alchemy.com/). Per creare una nuova chiave, vai su "Create App" (Crea App) come mostrato di seguito: -Ringraziamenti speciali a [_ShapeShift_](https://shapeshift.com/) _per averci permesso di mostrare la sua dashboard!_ +Un ringraziamento speciale a [_ShapeShift_](https://shapeshift.com/) _per averci permesso di mostrare la loro dashboard!_ ![Dashboard di Alchemy](./alchemy-dashboard.png) -Compila i dettagli sotto "Create App" per ottenere la tua nuova chiave. Qui puoi anche vedere le app create in precedenza e quelle create dal tuo team. Preleva le chiavi esistenti facendo clic su "View Key" per qualsiasi app. +Compila i dettagli sotto "Create App" per ottenere la tua nuova chiave. Qui puoi anche vedere le app che hai creato in precedenza e quelle create dal tuo team. Recupera le chiavi esistenti cliccando su "View Key" (Visualizza Chiave) per qualsiasi app. -![Crea l'app con gli screenshot di Alchemy](./create-app.png) +![Screenshot della creazione di un'app con Alchemy](./create-app.png) -Puoi anche prelevare chiavi API esistenti passando con il mouse su "Apps" e selezionandone una. Puoi scegliere "View Key" o "Edit App" per consentire domini specifici, vedere diversi strumenti da sviluppatore e visualizzare i dati analitici. +Puoi anche recuperare le chiavi API esistenti passando il mouse su "Apps" e selezionandone una. Qui puoi cliccare su "View Key", così come su "Edit App" (Modifica App) per inserire nella whitelist domini specifici, vedere diversi strumenti per sviluppatori e visualizzare le analisi. -![Gif che mostra a un utente come estrarre le chiavi API](./pull-api-keys.gif) +![Gif che mostra a un utente come recuperare le chiavi API](./pull-api-keys.gif) ## 3. Effettua una richiesta dalla riga di comando {#make-a-request-from-the-command-line} -Interagisci con la blockchain Ethereum tramite Alchemy usando JSON-RPC e curl. +Interagisci con la blockchain di Ethereum tramite Alchemy utilizzando JSON-RPC e curl. -Per le richieste manuali, consigliamo di interagire con `JSON-RPC` tramite richieste `POST`. Passa semplicemente nell'intestazione `Content-Type: application/json` la tua query sotto forma di corpo `POST` con i seguenti campi: +Per le richieste manuali, consigliamo di interagire con `JSON-RPC` tramite richieste `POST`. Passa semplicemente l'intestazione `Content-Type: application/json` e la tua query come corpo della richiesta `POST` con i seguenti campi: -- `jsonrpc`: versione JSON-RPC. Attualmente è supportata solo la `2.0`. -- `method`: metodo dell'API ETH. [Vedi il riferimento all'API.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) -- `params`: elenco di parametri da passare al metodo. -- `id`: ID della richiesta. Sarà restituita dalla risposta, e potrai controllare sempre a quale richiesta appartiene la risposta. +- `jsonrpc`: La versione JSON-RPC; attualmente è supportata solo la `2.0`. +- `method`: Il metodo dell'API ETH. [Vedi il riferimento API.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: Un elenco di parametri da passare al metodo. +- `id`: L'ID della tua richiesta. Verrà restituito dalla risposta in modo da poter tenere traccia a quale richiesta appartiene una risposta. -Ecco un esempio che puoi eseguire dalla riga di comando per recuperare il prezzo corrente del gas: +Ecco un esempio che puoi eseguire dalla riga di comando per recuperare l'attuale prezzo del gas: ```bash curl https://eth-mainnet.alchemyapi.io/v2/demo \ @@ -64,7 +59,7 @@ curl https://eth-mainnet.alchemyapi.io/v2/demo \ -d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' ``` -_**NOTA:** Sostituisci [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) con la tua chiave API `https://eth-mainnet.alchemyapi.io/v2/**your-api-key`._ +_**NOTA:** Sostituisci [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) con la tua chiave API `https://eth-mainnet.alchemyapi.io/v2/**la-tua-chiave-api`._ **Risultati:** @@ -72,15 +67,15 @@ _**NOTA:** Sostituisci [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-m { "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } ``` -## 4. Configura il client Web3 {#set-up-your-web3-client} +## 4. Configura il tuo client Web3 {#set-up-your-web3-client} -**Se hai già un client,** cambia l'URL del provider del nodo corrente inserendo un URL Alchemy con la tua chiave API: `"https://eth-mainnet.alchemyapi.io/v2/your-api-key"` +**Se hai un client esistente,** cambia l'URL del tuo attuale fornitore di nodi in un URL di Alchemy con la tua chiave API: `“https://eth-mainnet.alchemyapi.io/v2/la-tua-chiave-api"` -**_NOTA:_** gli script qui sotto devono essere eseguiti in un **contesto node** o **salvati in un file**, non devono essere eseguiti dalla riga di comando. Se non hai installato Node o npm, dai un'occhiata a questa [guida di configurazione per Mac](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs). +**_NOTA:_** Gli script sottostanti devono essere eseguiti in un **contesto nodo** o **salvati in un file**, non eseguiti dalla riga di comando. Se non hai già installato Node o npm, dai un'occhiata a questa rapida [guida alla configurazione per Mac](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs). -Ci sono tantissime [librerie Web3](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) che puoi integrare con Alchemy, tuttavia, consigliamo di usare [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), un sostituto di web3.js, creato e configurato per funzionare senza problemi con Alchemy. Fornisce diversi vantaggi, come tentativi automatici e supporto affidabile per WebSocket. +Ci sono tantissime [librerie Web3](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) che puoi integrare con Alchemy, tuttavia, ti consigliamo di utilizzare [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), un sostituto diretto per web3.js, creato e configurato per funzionare perfettamente con Alchemy. Questo offre molteplici vantaggi come i tentativi automatici e un robusto supporto WebSocket. -Per installare AlchemyWeb3.js, **passa alla directory del tuo progetto** ed esegui: +Per installare AlchemyWeb3.js, **vai alla directory del tuo progetto** ed esegui: **Con Yarn:** @@ -94,7 +89,7 @@ yarn add @alch/alchemy-web3 npm install @alch/alchemy-web3 ``` -Per interagire con l'infrastruttura del nodo di Alchemy, esegui NodeJS o aggiungi il codice seguente a un file JavaScript: +Per interagire con l'infrastruttura del nodo di Alchemy, esegui in NodeJS o aggiungi questo a un file JavaScript: ```js const { createAlchemyWeb3 } = require("@alch/alchemy-web3") @@ -105,24 +100,24 @@ const web3 = createAlchemyWeb3( ## 5. Scrivi il tuo primo script Web3! {#write-your-first-web3-script} -Ora per sporcarci un po' le mani con la programmazione web3 scriveremo uno script semplice che riporta il numero dell'ultimo blocco della rete principale Ethereum. +Ora, per sporcarci le mani con un po' di programmazione web3, scriveremo un semplice script che stampa l'ultimo numero di blocco dalla rete principale di Ethereum. -**1. Se non lo hai già fatto, nel terminale crea una nuova directory del progetto passa ad essa (cd):** +**1. Se non l'hai già fatto, nel tuo terminale crea una nuova directory di progetto ed entraci con cd:** ``` mkdir web3-example cd web3-example ``` -**2. Se non lo hai già fatto, installa la dipendenza Alchemy Web3 (o web3 di altro tipo) nel progetto:** +**2. Installa la dipendenza web3 di Alchemy (o qualsiasi web3) nel tuo progetto se non l'hai già fatto:** ``` npm install @alch/alchemy-web3 ``` -**3. Crea un file denominato `index.js` e aggiungi i seguenti contenuti:** +**3. Crea un file chiamato `index.js` e aggiungi i seguenti contenuti:** -> Devi sostituire `demo` con la tua chiave API HTTP di Alchemy. +> Alla fine dovresti sostituire `demo` con la tua chiave API HTTP di Alchemy. ```js async function main() { @@ -134,22 +129,22 @@ async function main() { main() ``` -Non hai famigliarità con la programmazione asincrona? Dai un'occhiata a questo [post di Medium](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c). +Non hai familiarità con la programmazione asincrona? Dai un'occhiata a questo [post su Medium](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c). -**4. Eseguilo nel terminale usando node** +**4. Eseguilo nel tuo terminale usando node** ``` node index.js ``` -**5. A questo punto dovresti vedere l'output con il numero dell'ultimo blocco nella console!** +**5. Ora dovresti vedere l'output dell'ultimo numero di blocco nella tua console!** ``` The latest block number is 11043912 ``` -**Wow! Congratulazioni! Hai appena scritto il tuo primo script web3 usando Alchemy** +**Evviva! Congratulazioni! Hai appena scritto il tuo primo script web3 usando Alchemy 🎉** -Non sai come proseguire? Prova a distribuire il tuo primo smart contract e fai qualche prova pratica di programmazione in Solidity nella nostra [Guida agli smart contract Hello World](https://docs.alchemyapi.io/tutorials/hello-world-smart-contract) o testa la tua conoscenza della Dashboard con l'[_App Demo della Dashboard_](https://docs.alchemyapi.io/tutorials/demo-app)! +Non sai cosa fare dopo? Prova a distribuire il tuo primo contratto intelligente e sporcati le mani con un po' di programmazione in Solidity nella nostra [Guida al contratto intelligente Hello World](https://www.alchemy.com/docs/hello-world-smart-contract), oppure metti alla prova la tua conoscenza della dashboard con l'[App Demo della Dashboard](https://docs.alchemyapi.io/tutorials/demo-app)! -_[Iscriviti gratis ad Alchemy](https://auth.alchemyapi.io/signup), dai un'occhiata alla nostra [documentazione](https://docs.alchemyapi.io/) e, per le ultime notizie, seguici su [Twitter](https://twitter.com/AlchemyPlatform)_. +_[Registrati gratuitamente su Alchemy](https://auth.alchemy.com/), dai un'occhiata alla nostra [documentazione](https://www.alchemy.com/docs/) e, per le ultime notizie, seguici su [Twitter](https://twitter.com/AlchemyPlatform)_. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/it/developers/tutorials/guide-to-smart-contract-security-tools/index.md index 302d70f5b8e..51a1e458b54 100644 --- a/public/content/translations/it/developers/tutorials/guide-to-smart-contract-security-tools/index.md +++ b/public/content/translations/it/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -1,106 +1,103 @@ --- -title: Una guida agli strumenti di sicurezza per gli smart contract -description: Una panoramica di tre differenti tecniche di test e analisi del programma +title: Una guida agli strumenti di sicurezza per i contratti intelligenti +description: Una panoramica di tre diverse tecniche di test e analisi dei programmi author: "Trailofbits" lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "sicurezza" +tags: ["Solidity", "contratti intelligenti", "sicurezza"] skill: intermediate -breadcrumb: "Strumenti di sicurezza" +breadcrumb: Strumenti di sicurezza published: 2020-09-07 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis --- -Utilizziremo tre distinte tecniche di test e analisi del programma: +Utilizzeremo tre tecniche distinte di test e analisi dei programmi: -- **Analisi statica con [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Tutti i percorsi del programma sono approssimati e analizzati simultaneamente, tramite diverse presentazioni del programma (es. diagramma di flusso di controllo) -- **Fuzzing con [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** Il codice è eseguito con una generazione pseudo-casuale di transazioni. Il fuzzer proverà a trovare una sequenza di transazioni per violare una data proprietà. -- **Esecuzione simbolica con [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Una tecnica di verifica formale che traduce ogni percorso d'esecuzione in una formula matematica, su cui possono essere controllati i vincoli massimi. +- **Analisi statica con [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Tutti i percorsi del programma vengono approssimati e analizzati contemporaneamente, attraverso diverse presentazioni del programma (es. grafo del flusso di controllo). +- **Fuzzing con [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** Il codice viene eseguito con una generazione pseudo-casuale di transazioni. Il fuzzer cercherà di trovare una sequenza di transazioni per violare una determinata proprietà. +- **Esecuzione simbolica con [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Una tecnica di verifica formale, che traduce ogni percorso di esecuzione in una formula matematica, su cui possono essere verificati dei vincoli. -Ogni tecnica ha vantaggi e svantaggi ed è utile in [casi specifici](#determining-security-properties): +Ogni tecnica presenta vantaggi e insidie, e sarà utile in [casi specifici](#determining-security-properties): -| Tecnica | Strumento | Uso | Velocità | Bug mancati | Falsi allarmi | -| -------------------- | --------- | ------------------------------ | -------- | ----------- | ------------- | -| Analisi statica | Slither | CLI e script | secondi | moderati | bassi | -| Fuzzing | Echidna | Proprietà di Solidity | minuti | bassi | nessuno | -| Esecuzione simbolica | Manticore | Proprietà di Solidity e script | ore | nessuno\* | nessuno | +| Tecnica | Strumento | Utilizzo | Velocità | Bug mancati | Falsi allarmi | +| ------------------ | --------- | ----------------------------- | ------- | ----------- | ------------ | +| Analisi Statica | Slither | CLI e script | secondi | moderati | bassi | +| Fuzzing | Echidna | Proprietà di Solidity | minuti | bassi | nessuno | +| Esecuzione Simbolica | Manticore | Proprietà di Solidity e script | ore | nessuno\* | nessuno | -\* se tutti i percorsi sono esplorati senza timeout +\* se tutti i percorsi vengono esplorati senza timeout -**Slither** analizza i contratti in pochi secondi, tuttavia, l'analisi statica potrebbe condurre a falsi allarmi e sarà meno idonea per i controlli complessi (es. controlli aritmetici). Esegui Slither tramite l'API per l'accesso ai pulsanti per i rilevatori integrati o tramite l'API per i controlli definiti dall'utente. +**Slither** analizza i contratti in pochi secondi, tuttavia, l'analisi statica potrebbe portare a falsi allarmi e sarà meno adatta per controlli complessi (es. controlli aritmetici). Esegui Slither tramite l'API per un accesso immediato ai rilevatori integrati o tramite l'API per controlli definiti dall'utente. -**Echidna** deve essere eseguito per diversi minuti e produrrà solo veri positivi. Echidna controlla le proprietà di sicurezza fornite dall'utente, scritte in Solidity. Potrebbe tralasciare dei bug, essendo basato sull'esplorazione casuale. +**Echidna** deve essere eseguito per diversi minuti e produrrà solo veri positivi. Echidna verifica le proprietà di sicurezza fornite dall'utente, scritte in Solidity. Potrebbe mancare dei bug poiché si basa sull'esplorazione casuale. -**Manticore** esegue l'analisi dal "peso maggiore". Come Echidna, Manticore verifica le proprietà fornite dall'utente. Necessiterà di maggiore tempo per funzionare, ma può provare la validità di una proprietà e non segnalerà falsi allarmi. +**Manticore** esegue l'analisi "più intensiva". Come Echidna, Manticore verifica le proprietà fornite dall'utente. Avrà bisogno di più tempo per l'esecuzione, ma può dimostrare la validità di una proprietà e non segnalerà falsi allarmi. ## Flusso di lavoro suggerito {#suggested-workflow} -Inizia con i rilevatori integrati di Slither per assicurarti che non siano presenti bug semplici ora o che non saranno introdotti in seguito. Usa Slither per controllare le proprietà correlate all'eredità, le dipendenze della variabile e i problemi strutturali. Al crescere della base di codice, usa Echidna per testare proprietà più complesse della macchina di stato. Rivisita Slither per sviluppare controlli personalizzati per protezioni non disponibili con Solidity, come la protezione contro una funzione in sovrascrizione. Infine, usa Manticore per eseguire la verifica mirata di proprietà di sicurezza critiche, ad es. operazioni aritmetiche. +Inizia con i rilevatori integrati di Slither per assicurarti che non siano presenti bug semplici ora o che non vengano introdotti in seguito. Usa Slither per verificare le proprietà relative all'ereditarietà, alle dipendenze delle variabili e ai problemi strutturali. Man mano che la base di codice cresce, usa Echidna per testare proprietà più complesse della macchina a stati. Ritorna a Slither per sviluppare controlli personalizzati per protezioni non disponibili in Solidity, come la protezione contro la sovrascrittura di una funzione. Infine, usa Manticore per eseguire una verifica mirata delle proprietà di sicurezza critiche, ad es. le operazioni aritmetiche. -- Usa la CLI di Slither per individuare problemi comuni -- Usa Echidna per testare le proprietà di sicurezza d'alto livello del tuo contratto +- Usa la CLI di Slither per individuare i problemi comuni +- Usa Echidna per testare le proprietà di sicurezza di alto livello del tuo contratto - Usa Slither per scrivere controlli statici personalizzati -- Usa Manticore quando desideri un'assicurazione approfondita delle proprietà di sicurezza critiche +- Usa Manticore quando desideri una garanzia approfondita delle proprietà di sicurezza critiche -**Una nota sui test unitari**. I testi unitari servono necessariamente per creare software di alta qualità. Tuttavia, queste tecniche non sono le più adatte a trovare difetti di sicurezza. Sono tipicamente usati per testare i comportamenti positivi del codice (ad es. il codice funziona come previsto nel contesto normale), mentre i difetti di sicurezza tendono a risiedere in casi al limite che gli sviluppatori non hanno considerato. Nel nostro studio di dozzine di revisioni di sicurezza di contratti intelligenti, la [copertura dei test unitari non ha avuto alcun effetto sul numero o sulla gravità dei difetti di sicurezza](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/) trovati nel codice del nostro client. +**Una nota sui test unitari**. I test unitari sono necessari per creare software di alta qualità. Tuttavia, queste tecniche non sono le più adatte per trovare falle di sicurezza. In genere vengono utilizzate per testare i comportamenti positivi del codice (ovvero, il codice funziona come previsto nel contesto normale), mentre le falle di sicurezza tendono a risiedere in casi limite che gli sviluppatori non hanno considerato. Nel nostro studio su dozzine di revisioni di sicurezza dei contratti intelligenti, [la copertura dei test unitari non ha avuto alcun effetto sul numero o sulla gravità delle falle di sicurezza](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/) che abbiamo trovato nel codice dei nostri clienti. ## Determinare le proprietà di sicurezza {#determining-security-properties} -Per testare e verificare efficacemente il tuo codice, devi identificare le aree che richiedono attenzione. Poiché le risorse impiegate per la sicurezza sono limitate, è importante sfruttare le parti deboli o d'alto valore della tua base di codice per ottimizzare lo sforzo. La modellazione della minaccia può essere utile. Puoi consultare: +Per testare e verificare efficacemente il tuo codice, devi identificare le aree che richiedono attenzione. Poiché le risorse spese per la sicurezza sono limitate, definire l'ambito delle parti deboli o di alto valore della tua base di codice è importante per ottimizzare i tuoi sforzi. La modellazione delle minacce può aiutare. Prendi in considerazione la revisione di: -- [Valutazione rapida del rischio](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (il nostro approccio preferito quando c'è poco tempo a disposizione) -- [Guide to Data-Centric System Threat Modeling](https://csrc.nist.gov/publications/detail/sp/800-154/draft) (o NIST 800-154) -- [Modellazione delle minacce Shostack](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998) -- [STRIDE](https://wikipedia.org/wiki/STRIDE_(security)) / [DREAD](https://wikipedia.org/wiki/DREAD_(risk_assessment_model)) +- [Valutazioni rapide del rischio](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (il nostro approccio preferito quando il tempo scarseggia) +- [Guida alla modellazione delle minacce dei sistemi incentrati sui dati](https://csrc.nist.gov/pubs/sp/800/154/ipd) (nota anche come NIST 800-154) +- [Modellazione delle minacce di Shostack](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998) +- [STRIDE]() / [DREAD]() - [PASTA](https://wikipedia.org/wiki/Threat_model#P.A.S.T.A.) - [Uso delle asserzioni](https://blog.regehr.org/archives/1091) ### Componenti {#components} -Sapere cosa vuoi controllare ti aiuterà anche a selezionare lo strumento più adatto. +Sapere cosa si desidera controllare aiuterà anche a selezionare lo strumento giusto. -Tra le grandi aree spesso pertinenti per gli smart contract troviamo: +Le ampie aree che sono frequentemente rilevanti per i contratti intelligenti includono: -- **Macchina di stato.** Gran parte dei contratti è rappresentabile come una macchina di stato. Considera di controllare che: (1) nessuno stato invalido sia raggiungibile, (2) se uno stato è valido, che sia raggiungibile e (3) nessuno stato intrappoli il contratto. +- **Macchina a stati.** La maggior parte dei contratti può essere rappresentata come una macchina a stati. Considera di verificare che (1) non possa essere raggiunto alcuno stato non valido, (2) se uno stato è valido possa essere raggiunto, e (3) nessuno stato intrappoli il contratto. - - Echidna e Manticore sono gli strumenti da preferire per testare le specifiche della macchina di stato. + - Echidna e Manticore sono gli strumenti da preferire per testare le specifiche della macchina a stati. -- **Controlli d'accesso.** Se il tuo sistema ha degli utenti privilegiati (ad es. un proprietario, controllori...) devi assicurarti che (1) ogni utente possa eseguire solo le azioni autorizzate e (2) nessun utente possa bloccare le azioni da un utente più privilegiato. +- **Controlli di accesso.** Se il tuo sistema ha utenti privilegiati (es. un proprietario, controllori, ...) devi assicurarti che (1) ogni utente possa eseguire solo le azioni autorizzate e (2) nessun utente possa bloccare le azioni di un utente più privilegiato. - - Slither, Echidna e Manticore possono controllare i controlli d'accesso corretti. Ad esempio, Slither può controllare che solo alle funzioni incluse nella white list manchi il modificatore onlyOwner. Echidna e Manticore sono utili per un controllo d'accesso più complesso, come un permesso dato solo se il contratto raggiunge un particolare stato. + - Slither, Echidna e Manticore possono verificare la correttezza dei controlli di accesso. Ad esempio, Slither può verificare che solo le funzioni in whitelist siano prive del modificatore `onlyOwner`. Echidna e Manticore sono utili per controlli di accesso più complessi, come un permesso concesso solo se il contratto raggiunge un determinato stato. -- **Operazioni aritmetiche.** Controllare la solidità delle operazioni aritmetiche è fondamentale. Usare `SafeMath` ovunque è un buon passo per prevenire overflow e underflow, ma occorre comunque considerare altri difetti aritmetici, tra cui i problemi d'arrotondamento e i difetti che intrappolano il contratto. +- **Operazioni aritmetiche.** Verificare la solidità delle operazioni aritmetiche è fondamentale. Usare `SafeMath` ovunque è un buon passo per prevenire overflow/underflow, tuttavia, devi comunque considerare altre falle aritmetiche, inclusi problemi di arrotondamento e falle che intrappolano il contratto. - - Manticore è la migliore scelta a questo scopo. Echidna è utilizzabile se l'aritmetica è esclusa dall'ambito del risolutore SMT. + - Manticore è la scelta migliore in questo caso. Echidna può essere utilizzato se l'aritmetica è fuori dall'ambito del risolutore SMT. -- **Correttezza dell'eredità.** I contratti di Solidity fanno ampio affidamento sull'eredità multipla. Sono facilmente introducibili errori quali funzioni di shadowing prive di chiamata `super` e ordini di linearizzazione c3 interpretati erroneamente. +- **Correttezza dell'ereditarietà.** I contratti Solidity si basano pesantemente sull'ereditarietà multipla. Errori come una funzione di shadowing a cui manca una chiamata `super` e un ordine di linearizzazione c3 interpretato male possono essere facilmente introdotti. - - Slither è lo strumento giusto per assicurare il rilevamento di tali problemi. + - Slither è lo strumento per garantire il rilevamento di questi problemi. -- **Interazioni esterne.** I contratti interagiscono tra loro, ragion per cui non ci si dovrebbe fidare di alcuni contratti esterni. Ad esempio, se il tuo contratto si basa su oracoli esterni, rimarrà sicuro se metà degli oracoli disponibili sono compromessi? +- **Interazioni esterne.** I contratti interagiscono tra loro e alcuni contratti esterni non dovrebbero essere considerati attendibili. Ad esempio, se il tuo contratto si affida a oracoli esterni, rimarrà sicuro se metà degli oracoli disponibili viene compromessa? - - Manticore ed Echidna sono la scelta migliore per testare le interazioni esterne coi tuoi contratti. Manticore ha un meccanismo integrato per troncare i contratti esterni. + - Manticore ed Echidna sono la scelta migliore per testare le interazioni esterne con i tuoi contratti. Manticore ha un meccanismo integrato per creare stub dei contratti esterni. -- **Conformità standard.** Gli standard di Ethereum (es. ERC20) sono noti per i difetti a livello di progettazione. Sii consapevole delle limitazioni dello standard su cui stai costruendo. - - Slither, Echidna e Manticore ti aiuteranno a rilevare le deviazioni da un dato standard. +- **Conformità agli standard.** Gli standard di Ethereum (es. ERC20) hanno una storia di falle nella loro progettazione. Sii consapevole delle limitazioni dello standard su cui stai costruendo. + - Slither, Echidna e Manticore ti aiuteranno a rilevare le deviazioni da un determinato standard. -### Tabella riepilogativa per la selezione degli strumenti {#tool-selection-cheatsheet} +### Cheat sheet per la selezione degli strumenti {#tool-selection-cheatsheet} -| Componente | Strumenti | Esempi | -| ------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Macchina di stato | Echidna, Manticore | | -| Controllo d'accesso | Slither, Echidna, Manticore | [Esercizio di Slither 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Esercizio di Echidna 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) | -| Operazioni aritmetiche | Manticore, Echidna | [Esercizio di Echidna 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Esercizi di Manticore 1 - 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | -| Correttezza d'eredità | Slither | [Esercizio di Slither 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) | -| Interazioni esterne | Manticore, Echidna | | -| Conformità agli standard | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | +| Componente | Strumenti | Esempi | +| ----------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Macchina a stati | Echidna, Manticore | +| Controllo di accesso | Slither, Echidna, Manticore | [Esercizio 2 di Slither](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Esercizio 2 di Echidna](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) | +| Operazioni aritmetiche | Manticore, Echidna | [Esercizio 1 di Echidna](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Esercizi 1 - 3 di Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| Correttezza dell'ereditarietà | Slither | [Esercizio 1 di Slither](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) | +| Interazioni esterne | Manticore, Echidna | +| Conformità agli standard | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | -Occorrerà controllare altri aspetti a seconda degli obiettivi, ma queste macro aree di attenzione sono un buon inizio per qualunque sistema di smart contract. +Altre aree dovranno essere controllate a seconda dei tuoi obiettivi, ma queste aree di interesse generali sono un buon punto di partenza per qualsiasi sistema di contratti intelligenti. -I nostri controlli pubblici contengono esempi di proprietà verificate o testate. Considera di leggere le sezioni `Test e verifiche automatizzate` dei seguenti report per verificare le proprietà di sicurezza reali: +I nostri audit pubblici contengono esempi di proprietà verificate o testate. Considera di leggere le sezioni `Automated Testing and Verification` dei seguenti report per esaminare le proprietà di sicurezza del mondo reale: - [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) -- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) +- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md index bf6c2e7eab5..9c13bbc4196 100644 --- a/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/it/developers/tutorials/hello-world-smart-contract/index.md @@ -1,91 +1,80 @@ --- -title: Smart Contract "Hello World" per principianti -description: Tutorial introduttivo su come scrivere e distribuire un semplice smart contract su Ethereum. +title: Contratto intelligente Hello World per principianti +description: Tutorial introduttivo sulla scrittura e la distribuzione di un semplice contratto intelligente su Ethereum. author: "elanh" -tags: - - "solidity" - - "hardhat" - - "alchemy" - - "smart contract" - - "distribuzione" +tags: ["Solidity", "Hardhat", "Alchemy", "contratti intelligenti", "distribuzione"] skill: beginner -breadcrumb: "Contratto Hello World" +breadcrumb: Contratto Hello World lang: it published: 2021-03-31 --- -Se hai appena iniziato con lo sviluppo blockchain e non sai da dove cominciare, oppure se sei solo interessato a capire come distribuire e interagire con gli smart contract, questa è la guida che fa al caso tuo. Esamineremo la creazione e la distribuzione di un semplice contratto intelligente sulla rete di prova di Goerli, utilizzando un portafoglio virtuale di [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth) (non preoccuparti se non capisci cosa significhi, lo spiegheremo). +Se sei nuovo nello sviluppo su blockchain e non sai da dove iniziare, o se vuoi semplicemente capire come distribuire e interagire con i contratti intelligenti, questa guida fa per te. Ti guideremo attraverso la creazione e la distribuzione di un semplice contratto intelligente sulla rete di test Sepolia utilizzando un portafoglio virtuale [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://www.alchemy.com/eth) (non preoccuparti se non capisci ancora cosa significhi tutto questo, lo spiegheremo). -> **Attenzione** -> -> 🚧 Avviso di obsolescenza -> -> Per l'intera guida, la rete di test Goerli viene utilizzata per creare e distribuire un contratto intelligente. Tuttavia, tieni presente che la Ethereum Foundation ha annunciato che [Goerli sarà presto abbandonata](https://www.alchemy.com/blog/goerli-faucet-deprecation). -> -> Ti consigliamo di utilizzare [Sepolia](https://sepoliafaucet.com/) e il [faucet di Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) per questo tutorial. +Nella [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) di questo tutorial vedremo come interagire con il nostro contratto intelligente una volta distribuito qui, e nella [parte 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) spiegheremo come pubblicarlo su Etherscan. -Nella [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) di questo tutorial, esamineremo come possiamo interagire con il nostro contratto intelligente una volta distribuito e, nella [parte 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan), copriremo come pubblicarlo su Etherscan. +Se hai domande in qualsiasi momento, sentiti libero di contattarci nel [Discord di Alchemy](https://discord.gg/gWuC7zB)! -Se in qualsiasi momento hai domande, non esitare a contattarci nel [Discord di Alchemy](https://discord.gg/gWuC7zB)! +## Passaggio 1: Connettiti alla rete Ethereum {#step-1} -## Fase 1: connettersi alla rete di Ethereum {#step-1} +Ci sono molti modi per fare richieste alla catena di Ethereum. Per semplicità, useremo un account gratuito su Alchemy, una piattaforma per sviluppatori blockchain e API che ci consente di comunicare con la catena di Ethereum senza dover eseguire i nostri nodi. La piattaforma dispone anche di strumenti per sviluppatori per il monitoraggio e l'analisi che sfrutteremo in questo tutorial per capire cosa succede dietro le quinte nella distribuzione del nostro contratto intelligente. Se non hai già un account Alchemy, [puoi registrarti gratuitamente qui](https://dashboard.alchemy.com/signup). -Esistono molti modi per effettuare richieste alla catena di Ethereum. Per semplicità, ci serviremo di un conto gratuito su Alchemy, una piattaforma per sviluppatori di blockchain e API che ci consentirà di comunicare con la catena di Ethereum senza dover operare i nostri nodi. La piattaforma offre anche strumenti di analisi e monitoraggio di cui ci serviremo in questo tutorial per comprendere al meglio l'andamento della distribuzione del nostro smart contract. Se non possiedi già un conto di Alchemy, [puoi iscriverti gratuitamente qui](https://dashboard.alchemyapi.io/signup). +## Passaggio 2: Crea la tua app (e la chiave API) {#step-2} -## Fase 2: crea la tua app (e chiave API) {#step-2} +Una volta creato un account Alchemy, puoi generare una chiave API creando un'app. Questo ci consentirà di fare richieste alla rete di test Sepolia. Se non hai familiarità con le reti di test, dai un'occhiata a [questa pagina](/developers/docs/networks/). -Una volta creato un conto di Alchemy, puoi generare una chiave API creando un'app. Questo ci permetterà di effettuare delle richieste alla rete di prova di Goerli. Se non hai familiarità con le reti di prova, dai un'occhiata a [questa pagina](/developers/docs/networks/). +1. Naviga alla pagina "Create new app" (Crea nuova app) nella tua Dashboard di Alchemy selezionando "Select an app" (Seleziona un'app) nella barra di navigazione e cliccando su "Create new app" -1. Vai alla pagina “Crea App” nella tua dashboard di Alchemy passando su “App” nella barra di navigazione e cliccando “Crea App” +![Hello world create app](./hello-world-create-app.png) -![Creare l'app Hello world](./hello-world-create-app.png) +2. Dai un nome alla tua app "Hello World", offri una breve descrizione e scegli un caso d'uso, ad es. "Infra & Tooling". Successivamente, cerca "Ethereum" e seleziona la rete. -2. Denomina la tua app "Ciao Mondo", offri una breve descrizione, seleziona "Staging" per l'Ambiente (utilizzato per la contabilità della tua app) e scegli "Goerli" per la tua rete. +![create app view hello world](./create-app-view-hello-world.png) -![Vista della creazione dell'app Hello world](./create-app-view-hello-world.png) +3. Clicca su "Next" (Avanti) per procedere, poi su "Create app" (Crea app) e il gioco è fatto! La tua app dovrebbe apparire nel menu a discesa della barra di navigazione, con una chiave API disponibile per essere copiata. -3. Clicca “Create app” ed è tutto! La tua app dovrebbe apparire nella tabella sottostante. +## Passaggio 3: Crea un account Ethereum (indirizzo) {#step-3} -## Fase 3: Crea un conto di Ethereum (indirizzo) {#step-3} +Abbiamo bisogno di un account Ethereum per inviare e ricevere transazioni. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser utilizzato per gestire l'indirizzo del tuo account Ethereum. Maggiori informazioni sulle [transazioni](/developers/docs/transactions/). -Per inviare e ricevere le transazioni, necessitiamo di un conto di Ethereum. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser per gestire l'indirizzo del tuo conto di Ethereum. Maggiori informazioni sulle [transazioni](/developers/docs/transactions/). +Puoi scaricare MetaMask e creare un account Ethereum gratuitamente [qui](https://metamask.io/download). Quando crei un account, o se ne hai già uno, assicurati di passare alla rete di test "Sepolia" utilizzando il menu a discesa della rete (in modo da non avere a che fare con denaro reale). -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "rete di prova di Goerli" in alto a destra (così da non avere a che fare con denaro reale). +Se non vedi Sepolia nell'elenco, vai nel menu, poi su Advanced (Avanzate) e scorri verso il basso per attivare "Show test networks" (Mostra reti di test). Nel menu di selezione della rete, scegli la scheda "Custom" (Personalizzata) per trovare un elenco di reti di test e seleziona "Sepolia". -![esempio ropsten metamask](./metamask-ropsten-example.png) +![metamask sepolia example](./metamask-sepolia-example.png) -## Fase 4: aggiungi ether da un Faucet {#step-4} +## Passaggio 4: Aggiungi ether da un rubinetto {#step-4} -Per poter distribuire il nostro contratto intelligente alla rete di prova, avremo bisogno di degli ETH finti. Per ottenere degli ETH, puoi andare al [faucet di Goerli](https://goerlifaucet.com/), accedere al tuo conto di Alchemy e inserire l'indirizzo del tuo portafoglio, cliccando poi su "Inviami gli ETH". Potrebbe volerci del tempo per ricevere i tuoi ETH finti, a causa del traffico della rete. (Al momento della scrittura di questo tutorial, ci sono voluti circa 30 minuti.) Dovresti vedere i tuoi ETH nel tuo conto di Metamask dopo qualche minuto! +Per distribuire il nostro contratto intelligente sulla rete di test, avremo bisogno di alcuni finti ETH. Per ottenere ETH di Sepolia puoi andare ai [dettagli della rete Sepolia](/developers/docs/networks/#sepolia) per visualizzare un elenco di vari rubinetti. Se uno non funziona, provane un altro poiché a volte possono esaurirsi. Potrebbe volerci del tempo per ricevere i tuoi finti ETH a causa del traffico di rete. Dovresti vedere gli ETH nel tuo account MetaMask subito dopo! -## Fase 5: controlla il saldo {#step-5} +## Passaggio 5: Controlla il tuo saldo {#step-5} -Per ricontrollare che ci sia il saldo, facciamo una richiesta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando lo [strumento compositore di Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Questo restituirà l'importo di ETH nel nostro portafoglio. Dopo aver inserito l'indirizzo del tuo conto di MetaMask e aver cliccato su “Invia Richiesta”, dovresti vedere una risposta come questa: +Per verificare che il nostro saldo sia presente, facciamo una richiesta [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance) utilizzando lo [strumento composer di Alchemy](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest). Questo restituirà la quantità di ETH nel nostro portafoglio. Dopo aver inserito l'indirizzo del tuo account MetaMask e cliccato su "Send Request" (Invia richiesta), dovresti vedere una risposta come questa: ```json { "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } ``` -> **NOTA:** questo risultato è in wei non in ETH. Wei è usato come taglio più piccolo dell'ether. La conversione da wei a ETH è: 1 eth = 1018 wei. Quindi se convertiamo 0x2B5E3AF16B1880000 in decimali, otteniamo 5\*10¹⁸, pari a 5 ETH. +> **NOTA:** Questo risultato è in wei, non in ETH. Il wei è utilizzato come la più piccola denominazione di ether. La conversione da wei a ETH è: 1 eth = 1018 wei. Quindi, se convertiamo 0x2B5E3AF16B1880000 in decimale otteniamo 5\*10¹⁸ che equivale a 5 ETH. > -> Meno male! I nostri soldi finti ci sono tutti . +> Fiuu! I nostri soldi finti ci sono tutti . -## Fase 6: inizializza il progetto {#step-6} +## Passaggio 6: Inizializza il nostro progetto {#step-6} -Prima, dovremo creare una cartella per il nostro progetto. Vai alla riga di comando e digita: +Per prima cosa, dovremo creare una cartella per il nostro progetto. Naviga nella tua riga di comando e digita: ``` mkdir hello-world cd hello-world ``` -Ora che siamo nella cartella del nostro progetto, useremo `npm init` per inizializzare il progetto. Se non hai già installato npm, segui [queste istruzioni](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (avremo bisogno anche di Node.js, quindi scarica anche questo!). +Ora che siamo all'interno della cartella del nostro progetto, useremo `npm init` per inizializzare il progetto. Se non hai già installato npm, segui [queste istruzioni](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (avremo bisogno anche di Node.js, quindi scarica anche quello!). ``` npm init ``` -Non è rilevante come rispondi alle domande d'installazione, ecco le nostre risposte come esempio: +Non importa molto come rispondi alle domande di installazione, ecco come abbiamo fatto noi come riferimento: ``` package name: (hello-world) @@ -112,29 +101,29 @@ About to write to /Users/.../.../.../hello-world/package.json: } ``` -Approva il package.json e siamo pronti! +Approva il package.json e siamo pronti a partire! -## Fase 7: Scarica [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7} +## Passaggio 7: Scarica [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7} -Hardhat è un ambiente di sviluppo per compilare, distribuire, testare ed effettuare il debug del tuo software di Ethereum. Aiuta gli sviluppatori nella costruzione di contratti intelligenti e dapp localmente, prima di distribuirli alla catena. +Hardhat è un ambiente di sviluppo per compilare, distribuire, testare ed eseguire il debug del tuo software Ethereum. Aiuta gli sviluppatori nella creazione di contratti intelligenti e dApp localmente prima della distribuzione sulla catena live. -Nel nostro progetto `hello-world` esegui: +All'interno del nostro progetto `hello-world` esegui: ``` npm install --save-dev hardhat ``` -Dai un'occhiata a questa pagina per ulteriori dettagli sulle [istruzioni d'installazione](https://hardhat.org/getting-started/#overview). +Dai un'occhiata a questa pagina per maggiori dettagli sulle [istruzioni di installazione](https://hardhat.org/getting-started/#overview). -## Fase 8: crea un progetto Hardhat {#step-8} +## Passaggio 8: Crea il progetto Hardhat {#step-8} -Nella cartella del nostro progetto esegui: +All'interno della cartella del nostro progetto esegui: ``` npx hardhat ``` -Dovresti poi vedere un messaggio di benvenuto e l'opzione per selezionare cosa desideri fare. Seleziona “crea un hardhat.config.js vuoto”: +Dovresti quindi vedere un messaggio di benvenuto e l'opzione per selezionare cosa vuoi fare. Seleziona "create an empty hardhat.config.js": ``` 888 888 888 888 888 @@ -154,118 +143,118 @@ Create a sample project Quit ``` -Questo genererà un file `hardhat.config.js`, in cui specificheremo tutta la configurazione per il nostro progetto (alla fase 13). +Questo genererà un file `hardhat.config.js` per noi, che è dove specificheremo tutta la configurazione per il nostro progetto (nel passaggio 13). -## Fase 9: aggiungi le cartelle del progetto {#step-9} +## Passaggio 9: Aggiungi le cartelle del progetto {#step-9} -Per mantenere organizzato il nostro progetto creeremo due nuove cartelle. Vai alla cartella di root del tuo progetto nella tua riga di comando e digita: +Per mantenere organizzato il nostro progetto creeremo due nuove cartelle. Naviga nella directory principale del tuo progetto nella riga di comando e digita: ``` mkdir contracts mkdir scripts ``` -- `contracts/` è dove manterremo il file del codice del nostro smart contract hello world -- `scripts/` è dove manterremo gli script per distribuire e interagire con il nostro contratto +- `contracts/` è dove conserveremo il file di codice del nostro contratto intelligente hello world +- `scripts/` è dove conserveremo gli script per distribuire e interagire con il nostro contratto -## Fase 10: compila il nostro contratto {#step-10} +## Passaggio 10: Scrivi il nostro contratto {#step-10} -Potresti chiederti, quando diavolo scriviamo il codice? Beh, eccoci qui, alla fase 10. +Ti starai chiedendo, quando diavolo scriveremo il codice?? Bene, eccoci qui, al passaggio 10. -Apri il progetto hello-world nel tuo editor preferito (a noi piace [VSCode](https://code.visualstudio.com/)). Gli smart contract sono scritti in un linguaggio detto Solidity, che useremo per scrivere il nostro smart contract HelloWorld.sol. +Apri il progetto hello-world nel tuo editor preferito (a noi piace [VSCode](https://code.visualstudio.com/)). I contratti intelligenti sono scritti in un linguaggio chiamato Solidity, che è quello che useremo per scrivere il nostro contratto intelligente HelloWorld.sol.‌ -1. Vai alla cartella "contracts" e crea un nuovo file chiamato HelloWorld.sol -2. Di seguito, un esempio dello smart contract Hello World dalla Ethereum Foundation che useremo per questo tutorial. Copia e incolla i contenuti seguenti nel tuo file HelloWorld.sol e assicurati di leggere i commenti per comprendere cosa fa il contratto: +1. Naviga nella cartella "contracts" e crea un nuovo file chiamato HelloWorld.sol +2. Di seguito è riportato un esempio di contratto intelligente Hello World della Ethereum Foundation che useremo per questo tutorial. Copia e incolla i contenuti sottostanti nel tuo file HelloWorld.sol e assicurati di leggere i commenti per capire cosa fa questo contratto: ```solidity -// Specifica la versione di Solidity, utilizzando il controllo delle versioni semantico. -// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +// Specifica la versione di Solidity, utilizzando il versionamento semantico. +// Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma pragma solidity ^0.7.0; -// Defines a contract named `HelloWorld`. -// Un contratto è una raccolta di funzioni e dati (il suo stato). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +// Definisce un contratto chiamato `HelloWorld`. +// Un contratto è una raccolta di funzioni e dati (il suo stato). Una volta distribuito, un contratto risiede a un indirizzo specifico sulla blockchain di Ethereum. Scopri di più: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html contract HelloWorld { - // Declares a state variable `message` of type `string`. - // Le variabili di stato sono variabili con valori memorizzati in modo permanente nello spazio di archiviazione (storage) del contratto. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + // Dichiara una variabile di stato `message` di tipo `string`. + // Le variabili di stato sono variabili i cui valori sono memorizzati in modo permanente nell'archiviazione del contratto. La parola chiave `public` rende le variabili accessibili dall'esterno di un contratto e crea una funzione che altri contratti o client possono chiamare per accedere al valore. string public message; - // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. - // I costruttori sono utilizzati per inizializzare i dati del contratto. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + // Similmente a molti linguaggi orientati agli oggetti basati su classi, un costruttore è una funzione speciale che viene eseguita solo alla creazione del contratto. + // I costruttori sono usati per inizializzare i dati del contratto. Scopri di più:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors constructor(string memory initMessage) { - // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + // Accetta un argomento stringa `initMessage` e imposta il valore nella variabile di archiviazione `message` del contratto). message = initMessage; } - // A public function that accepts a string argument and updates the `message` storage variable. + // Una funzione pubblica che accetta un argomento stringa e aggiorna la variabile di archiviazione `message`. function update(string memory newMessage) public { message = newMessage; } } ``` -Questo è uno smart contract semplicissimo che memorizza un messaggio alla creazione ed è aggiornabile chiamando la funzione `update`. +Questo è un contratto intelligente semplicissimo che memorizza un messaggio al momento della creazione e può essere aggiornato chiamando la funzione `update`. -## Fase 11: connetti MetaMask e Alchemy al tuo progetto {#step-11} +## Passaggio 11: Connetti MetaMask e Alchemy al tuo progetto {#step-11} -Abbiamo creato un portafoglio di MetaMask, un conto di Alchemy e scritto il nostro contratto intelligente; è arrivato il momento di collegarli. +Abbiamo creato un portafoglio MetaMask, un account Alchemy e scritto il nostro contratto intelligente, ora è il momento di connettere i tre. -Ogni transazione inviata dal tuo portafoglio virtuale richiede una firma tramite la tua chiave privata unica. Per fornire al nostro programma quest'autorizzazione, possiamo memorizzare in sicurezza la nostra chiave privata (e la chiave API di Alchemy) in un file ambientale. +Ogni transazione inviata dal tuo portafoglio virtuale richiede una firma utilizzando la tua chiave privata univoca. Per fornire al nostro programma questa autorizzazione, possiamo archiviare in modo sicuro la nostra chiave privata (e la chiave API di Alchemy) in un file di ambiente. -> Per saperne di più sull'invio delle transazioni, dai un'occhiata a [questo tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sull'invio di transazioni usando web3. +> Per saperne di più sull'invio di transazioni, dai un'occhiata a [questo tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sull'invio di transazioni utilizzando web3. -Prima, installa il pacchetto dotenv nella cartella del tuo progetto: +Per prima cosa, installa il pacchetto dotenv nella directory del tuo progetto: ``` npm install dotenv --save ``` -Poi, crea un file `.env` nella cartella di root del nostro progetto e aggiungi la tua chiave privata di MetaMask e l'URL API di Alchemy HTTP. +Quindi, crea un file `.env` nella directory principale del nostro progetto e aggiungi la tua chiave privata MetaMask e l'URL dell'API HTTP di Alchemy. -- Segui [queste istruzioni](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) per esportare la tua chiave privata -- Vedi sotto per ottenere l'URL dell'API di Alchemy HTTP +- Segui [queste istruzioni](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/) per esportare la tua chiave privata +- Vedi sotto per ottenere l'URL dell'API HTTP di Alchemy -![ottieni la chiave api di alchemy](./get-alchemy-api-key.gif) +![get alchemy api key](./get-alchemy-api-key.png) Copia l'URL dell'API di Alchemy -Il tuo `.env` dovrebbe somigliare a questo: +Il tuo `.env` dovrebbe apparire così: ``` -API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY = "your-metamask-private-key" ``` -Per connetterli realmente al nostro codice, faremo riferimento a queste variabili nel nostro file `hardhat.config.js` nella fase 13. +Per connetterli effettivamente al nostro codice, faremo riferimento a queste variabili nel nostro file `hardhat.config.js` nel passaggio 13. -Non eseguire il commit di .env! Assicurati di non condividere o esporre mai il tuo file .env con nessuno, poiché così facendo comprometteresti i tuoi segreti. Se stai usando il controllo di versione, aggiungi il tuo .env a un file gitignore. +Non committare .env! Assicurati di non condividere o esporre mai il tuo file .env a nessuno, poiché così facendo comprometti i tuoi segreti. Se stai utilizzando il controllo di versione, aggiungi il tuo .env a un file
gitignore. -## Fase 12: installa Ethers.js {#step-12-install-ethersjs} +## Passaggio 12: Installa Ethers.js {#step-12-install-ethersjs} -Ethers.js è una libreria che rende più facile interagire ed effettuare richieste a Ethereum tramite wrapping dei [metodi JSON-RPC standard](/developers/docs/apis/json-rpc/) con altri metodi più facili da usare. +Ethers.js è una libreria che semplifica l'interazione e l'esecuzione di richieste a Ethereum avvolgendo i [metodi JSON-RPC standard](/developers/docs/apis/json-rpc/) con metodi più intuitivi. -Hardhat rende davvero facile integrare [Plugin](https://hardhat.org/plugins/) per strumenti e funzionalità aggiuntive. Sfrutteremo il [plugin di Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) per la distribuzione del contratto ([Ethers.js](https://github.com/ethers-io/ethers.js/) ha dei metodi di distribuzione del contratto molto puliti). +Hardhat rende facilissimo integrare i [Plugin](https://hardhat.org/plugins/) per strumenti aggiuntivi e funzionalità estese. Sfrutteremo il [plugin Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) per la distribuzione dei contratti ([Ethers.js](https://github.com/ethers-io/ethers.js/) ha alcuni metodi di distribuzione dei contratti estremamente puliti). -Nella cartella del tuo progetto digita: +Nella directory del tuo progetto digita: ``` npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" ``` -Avremo bisogno di ethers anche nel nostro `hardhat.config.js` nella prossima fase. +Richiederemo anche ethers nel nostro `hardhat.config.js` nel passaggio successivo. -## Fase 13: aggiorna hardhat.config.js {#step-13-update-hardhatconfigjs} +## Passaggio 13: Aggiorna hardhat.config.js {#step-13-update-hardhatconfigjs} -Finora abbiamo aggiunto diverse dipendenze e plugin, ora dobbiamo aggiornare `hardhat.config.js` in modo che il nostro progetto li riconosca tutti. +Finora abbiamo aggiunto diverse dipendenze e plugin, ora dobbiamo aggiornare `hardhat.config.js` in modo che il nostro progetto li conosca tutti. -Aggiorna il tuo `hardhat.config.js` affinché somigli a questo: +Aggiorna il tuo `hardhat.config.js` in modo che appaia così: ``` require('dotenv').config(); @@ -278,10 +267,10 @@ const { API_URL, PRIVATE_KEY } = process.env; */ module.exports = { solidity: "0.7.3", - defaultNetwork: "goerli", + defaultNetwork: "sepolia", networks: { hardhat: {}, - goerli: { + sepolia: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -289,9 +278,9 @@ module.exports = { } ``` -## Fase 14: compila il contratto {#step-14-compile-our-contracts} +## Passaggio 14: Compila il nostro contratto {#step-14-compile-our-contracts} -Per assicurarti che tutto funzioni fino a questo punto, compila il contratto. L'attività di `compilazione` è una delle attività integrate di hardhat. +Per assicurarci che tutto funzioni finora, compiliamo il nostro contratto. L'attività `compile` è una delle attività integrate di hardhat. Dalla riga di comando esegui: @@ -299,13 +288,13 @@ Dalla riga di comando esegui: npx hardhat compile ``` -Potresti ottenere un avviso sull'assenza `nel file sorgente dell'identificativo della licenza SPDX`, ma non preoccupartene, si spera che tutto il resto funzioni! Altrimenti, puoi sempre inviare un messaggio nel [Discord di Alchemy](https://discord.gg/u72VCg3). +Potresti ricevere un avviso su `SPDX license identifier not provided in source file`, ma non c'è bisogno di preoccuparsi: si spera che tutto il resto vada bene! In caso contrario, puoi sempre inviare un messaggio nel [Discord di Alchemy](https://discord.gg/u72VCg3). -## Fase 15: scrivi lo script di distribuzione {#step-15-write-our-deploy-scripts} +## Passaggio 15: Scrivi il nostro script di distribuzione {#step-15-write-our-deploy-scripts} -Ora che il nostro contratto è scritto e il nostro file di configurazione è pronto, è il momento di scrivere lo script di distribuzione del contratto. +Ora che il nostro contratto è scritto e il nostro file di configurazione è pronto, è il momento di scrivere il nostro script di distribuzione del contratto. -Vai alla cartella `script/` e crea un nuovo file chiamato `deploy.js`, aggiungendo i seguenti contenuti: +Naviga nella cartella `scripts/` e crea un nuovo file chiamato `deploy.js`, aggiungendovi i seguenti contenuti: ``` async function main() { @@ -323,48 +312,49 @@ main() }); ``` -Nel suo [tutorial sui Contratti](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hardhat spiega in modo eccellente cosa fa ognuna di queste righe di codice nel loro, quindi riportiamo qui le loro spiegazioni. +Hardhat fa un lavoro straordinario nello spiegare cosa fa ciascuna di queste righe di codice nel loro [tutorial sui Contratti](https://hardhat.org/tutorial/testing-contracts.html#writing-tests), abbiamo adottato le loro spiegazioni qui. ``` const HelloWorld = await ethers.getContractFactory("HelloWorld"); ``` -Un `ContractFactory` su ethers.js è un'astrazione usata per distribuire nuovi smart contract, quindi `HelloWorld` qui è una fabbrica di istanze del nostro contratto hello world. Usando il plugin `hardhat-ethers`, le istanze `ContractFactory` e `Contract` sono connesse di default al primo firmatario. +Una `ContractFactory` in ethers.js è un'astrazione utilizzata per distribuire nuovi contratti intelligenti, quindi `HelloWorld` qui è una fabbrica per le istanze del nostro contratto hello world. Quando si utilizza il plugin `hardhat-ethers`, le istanze `ContractFactory` e `Contract` sono connesse al primo firmatario per impostazione predefinita. ``` const hello_world = await HelloWorld.deploy(); ``` -Chiamare `deploy()` su un `ContractFactory` avvierà la distribuzione e restituirà un `Promise` che si risolve in un `Contract`. Questo è l'oggetto che ha un metodo per ciascuna delle funzioni del nostro smart contract. +Chiamare `deploy()` su una `ContractFactory` avvierà la distribuzione e restituirà una `Promise` che si risolve in un `Contract`. Questo è l'oggetto che ha un metodo per ciascuna delle funzioni del nostro contratto intelligente. -## Fase 16: distribuisci il contratto {#step-16-deploy-our-contract} +## Passaggio 16: Distribuisci il nostro contratto {#step-16-deploy-our-contract} -Siamo finalmente pronti a distribuire il nostro smart contract! Vai alla riga di comando ed esegui: +Siamo finalmente pronti per distribuire il nostro contratto intelligente! Naviga nella riga di comando ed esegui: ``` -npx hardhat run scripts/deploy.js --network goerli +npx hardhat run scripts/deploy.js --network sepolia ``` -Vorrai poi vedere qualcosa del genere: +Dovresti quindi vedere qualcosa del genere: ``` Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 ``` -Se andiamo all'[Etherscan di Goerli](https://goerli.etherscan.io/) e cerchiamo l'indirizzo del nostro contratto, dovremmo poter vedere che è stato distribuito correttamente. La transazione somiglierà a questa: +Se andiamo su [Sepolia etherscan](https://sepolia.etherscan.io/) e cerchiamo l'indirizzo del nostro contratto, dovremmo essere in grado di vedere che è stato distribuito con successo. La transazione apparirà più o meno così: -![contratto etherscan](./etherscan-contract.png) +![etherscan contract](./etherscan-contract.png) -L'indirizzo `From` dovrebbe corrispondere all'indirizzo del tuo conto di MetaMask e, l'indirizzo To indicherà la "Creazione del Contratto"; ma cliccando sulla transazione, vedremo l'indirizzo del nostro contratto nel campo `To`: +L'indirizzo `From` dovrebbe corrispondere all'indirizzo del tuo account MetaMask e l'indirizzo To dirà "Contract Creation" (Creazione del contratto), ma se clicchiamo sulla transazione vedremo l'indirizzo del nostro contratto nel campo `To`: -![transazione etherscan](./etherscan-transaction.png) +![etherscan transaction](./etherscan-transaction.png) -Congratulazioni! Hai appena distribuito uno smart contract nella chain di Ethereum +Congratulazioni! Hai appena distribuito un contratto intelligente sulla catena di Ethereum 🎉 -Per capire cosa sta succedendo, andiamo alla scheda Explorer nel nostro [dashboard di Alchemy](https://dashboard.alchemyapi.io/explorer). Se hai diverse app di Alchemy, assicurati di filtrare per app e selezionare "Hello World". ![explorer hello world](./hello-world-explorer.png) +Per capire cosa succede dietro le quinte, navighiamo nella scheda Explorer nella nostra [dashboard di Alchemy](https://dashboard.alchemyapi.io/explorer). Se hai più app Alchemy, assicurati di filtrare per app e seleziona "Hello World". +![hello world explorer](./hello-world-explorer.png) -Qui vedrai numerose chiamate a JSON-RPC che Hardhat/Ethers ha effettuato per noi quando abbiamo chiamato la funzione `.deploy()`. Due funzioni importanti da chiamare qui sono [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), che è la richiesta per scrivere effettivamente il nostro contratto sulla catena di Goerli, e [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), che è una richiesta di leggere le informazioni sulla nostra transazione, dato l'hash (uno schema tipico nelle transazioni). Per saperne di più sull'invio delle transazioni, dai un'occhiata a questo tutorial [ sull'invio di transazioni usando web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +Qui vedrai una manciata di chiamate JSON-RPC che Hardhat/Ethers ha effettuato dietro le quinte per noi quando abbiamo chiamato la funzione `.deploy()`. Due importanti da segnalare qui sono [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), che è la richiesta per scrivere effettivamente il nostro contratto sulla catena Sepolia, e [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash) che è una richiesta per leggere informazioni sulla nostra transazione dato l'hash (un modello tipico quando si effettuano transazioni). Per saperne di più sull'invio di transazioni, dai un'occhiata a questo tutorial sull'[invio di transazioni utilizzando Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) -Questo è tutto per la parte 1 di questo tutorial, nella parte 2, [interagiremo realmente con il nostro smart contract](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract) aggiornando il nostro messaggio iniziale e nella parte 3 [pubblicheremo il nostro smart contract su Etherscan](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan), così che tutti sapranno come interagire con esso. +Questo è tutto per la parte 1 di questo tutorial, nella parte 2 [interagiremo effettivamente con il nostro contratto intelligente](https://www.alchemy.com/docs/interacting-with-a-smart-contract) aggiornando il nostro messaggio iniziale, e nella parte 3 [pubblicheremo il nostro contratto intelligente su Etherscan](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) in modo che tutti sappiano come interagire con esso. -**Vuoi saperne di più su Alchemy? Dai un'occhiata al nostro [sito web](https://alchemyapi.io/eth). Non vuoi mai perderti un aggiornamento? Iscriviti alla nostra newsletter [qui](https://www.alchemyapi.io/newsletter)! Assicurati anche di seguire il nostro [Twitter](https://twitter.com/alchemyplatform) e di unirti al nostro [Discord](https://discord.com/invite/u72VCg3)**. +**Vuoi saperne di più su Alchemy? Dai un'occhiata al nostro [sito web](https://www.alchemy.com/eth). Non vuoi mai perderti un aggiornamento? Iscriviti alla nostra newsletter [qui](https://www.alchemy.com/newsletter)! Assicurati anche di unirti al nostro [Discord](https://discord.gg/u72VCg3).** \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/it/developers/tutorials/how-to-implement-an-erc721-market/index.md index 364904e4e08..a508b3df4fa 100644 --- a/public/content/translations/it/developers/tutorials/how-to-implement-an-erc721-market/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -1,76 +1,72 @@ --- -title: Come implementare un market ERC-721 -description: Come mettere in vendita oggetti tokenizzati su bacheche di annunci decentralizzate +title: Come implementare un mercato ERC-721 +description: Come mettere in vendita oggetti tokenizzati su una bacheca di annunci decentralizzata author: "Alberto Cuesta Cañada" -tags: - - "smart contract" - - "erc-721" - - "Solidity" - - "token" +tags: ["contratti intelligenti", "erc-721", "Solidity", "token"] skill: intermediate -breadcrumb: "Mercato ERC-721" +breadcrumb: Mercato ERC-721 lang: it published: 2020-03-19 source: Hackernoon sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 --- -In questo articolo, ti mostrerò come sviluppare in Craigslist per la blockchain Ethereum. +In questo articolo, ti mostrerò come programmare Craigslist per la blockchain di Ethereum. -Prima di Gumtree, Ebay e Craigstlist, le bacheche di annunci erano più che altro di sughero o carta. C'erano bacheche nei corridoi delle scuole, sui giornali, sui lampioni o sulle vetrine. +Prima di Gumtree, Ebay e Craigslist, le bacheche di annunci erano per lo più fatte di sughero o carta. C'erano bacheche di annunci nei corridoi delle scuole, sui giornali, sui lampioni, nelle vetrine dei negozi. -Con Internet è cambiato tutto. Il numero di persone che potevano vedere una determinata bacheca di annunci si è moltiplicato a livello esponenziale. Di conseguenza, i mercati che rappresentano sono diventati molto più efficienti e si rivolgono a livello globale. Ebay è un business enorme che ha le sue origini proprio in queste bacheche di annunci fisiche. +Tutto questo è cambiato con Internet. Il numero di persone che potevano vedere una specifica bacheca di annunci si è moltiplicato di molti ordini di grandezza. Con ciò, i mercati che rappresentano sono diventati molto più efficienti e sono scalati a dimensioni globali. Ebay è un'azienda enorme che affonda le sue origini in queste bacheche di annunci fisiche. -Con la blockchain questi mercati sono destinati a cambiare di nuovo, vediamo come. +Con la blockchain questi mercati sono destinati a cambiare ancora una volta, lascia che ti mostri come. ## Monetizzazione {#monetization} -Il modello di business di una bacheca di annunci su blockchain pubblica sarà diverso da quello di Ebay e simili. +Il modello di business di una bacheca di annunci su una blockchain pubblica dovrà essere diverso da quello di Ebay e compagnia. -Prima di tutto, c'è la [questione della decentralizzazione](/developers/docs/web2-vs-web3/). Le piattaforme esistenti devono mantenere i loro server. Una piattaforma decentralizzata è gestita dai suoi utenti, quindi il costo per tenere attiva la piattaforma base scende a zero per il proprietario della piattaforma. +Innanzitutto, c'è [l'aspetto della decentralizzazione](/developers/docs/web2-vs-web3/). Le piattaforme esistenti devono mantenere i propri server. Una piattaforma decentralizzata è mantenuta dai suoi utenti, quindi il costo di gestione della piattaforma principale scende a zero per il proprietario della piattaforma. -Poi c'è il front end, ossia il sito Web o l'interfaccia che dà accesso alla piattaforma. Qua ci sono molte opzioni. Il proprietario della piattaforma può limitare l'accesso e costringere tutti a usare la propria interfaccia, imponendo un costo di utilizzo. I proprietari della piattaforma possono anche decidere di lasciare libero l'accesso (potere al popolo!) e di permettere che chiunque crei interfacce per la piattaforma. Oppure, potrebbero decidere qualsiasi altro tipo di approccio tra questi due estremi. +Poi c'è il front-end, il sito web o l'interfaccia che dà accesso alla piattaforma. Qui ci sono molte opzioni. I proprietari della piattaforma possono limitare l'accesso e costringere tutti a usare la loro interfaccia, addebitando una commissione. I proprietari della piattaforma possono anche decidere di aprire l'accesso (Potere al Popolo!) e lasciare che chiunque costruisca interfacce per la piattaforma. Oppure i proprietari potrebbero decidere per un approccio a metà tra questi estremi. -_Chi si occupa di affari e ha più visione di me saprà come monetizzare tutto questo. Tutto quello che io riesco a capire è che questo è diverso dallo status quo e probabilmente redditizio._ +_I leader aziendali con più visione di me sapranno come monetizzare tutto questo. Tutto ciò che vedo è che questo è diverso dallo status quo e probabilmente redditizio._ -In più, c'è la questione dell'automazione e dei pagamenti. Alcuni articoli si prestano molto ad essere [tokenizzati in modo efficace](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) e scambiati in una bacheca di annunci. Le risorse tokenizzate sono facilmente trasferibili su una blockchain. Metodi di pagamento altamente complessi possono essere facilmente implementati su una blockchain. +Inoltre, c'è l'aspetto dell'automazione e dei pagamenti. Alcune cose possono essere [tokenizzate in modo molto efficace](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) e scambiate in una bacheca di annunci. Gli asset tokenizzati sono facilmente trasferibili in una blockchain. Metodi di pagamento altamente complessi possono essere facilmente implementati in una blockchain. -Sento odore di business. Una bacheca di annunci senza costi di gestione può facilmente essere implementata con complessi percorsi di pagamento inclusi in ogni transazione. Sono sicuro che qualcuno verrà fuori con qualche idea su come utilizzare tutto questo. +Sento odore di un'opportunità di business qui. Una bacheca di annunci senza costi di gestione può essere facilmente implementata, con percorsi di pagamento complessi inclusi in ogni transazione. Sono sicuro che a qualcuno verrà in mente un'idea su come utilizzarla. -Io sono felice di occuparmi della programmazione. Diamo un'occhiata al codice. +Io sono solo felice di costruirla. Diamo un'occhiata al codice. ## Implementazione {#implementation} -Un po' di tempo fa abbiamo iniziato un [repository open source](https://github.com/HQ20/contracts?ref=hackernoon.com) con implementazioni di esempio e altre cose interessanti, consiglio di dare una sbirciata. +Qualche tempo fa abbiamo avviato un [repository open source](https://github.com/HQ20/contracts?ref=hackernoon.com) con implementazioni di esempi di casi aziendali e altre chicche, dacci un'occhiata. -Il codice di questa [bacheca di annunci Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) è qui, potete usarlo e anche abusarne. Occhio solo che non è stato verificato e quindi fate molta attenzione prima di metterci dei soldi. +Il codice per questa [Bacheca di Annunci di Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) è lì, per favore usalo e abusane. Tieni solo presente che il codice non è stato verificato e devi fare la tua due diligence prima di investirci del denaro. -Le basi della bacheca non sono difficili. Tutti gli annunci della bacheca saranno semplicemente uno struct con pochi campi: +Le basi della bacheca non sono complesse. Tutti gli annunci nella bacheca saranno solo una struct con alcuni campi: ```solidity struct Trade { address poster; uint256 item; uint256 price; - bytes32 status; // Open, Executed, Cancelled + bytes32 status; // Aperto, Eseguito, Annullato } ``` -Supponiamo che ci sia qualcuno che pubblica l'annuncio. Un oggetto in vendita. Un prezzo per l'oggetto. Lo stato dello scambio che può essere aperto, chiuso o annullato. +Quindi c'è qualcuno che pubblica l'annuncio. Un oggetto in vendita. Un prezzo per l'oggetto. Lo stato dello scambio che può essere aperto, eseguito o annullato. -Tutti questi scambi saranno tenuti in un mapping. Perché tutto in Solidity sembra essere un mapping. E anche perché è comodo. +Tutti questi scambi saranno conservati in una mappatura. Perché tutto in Solidity sembra essere una mappatura. Anche perché è conveniente. ```solidity mapping(uint256 => Trade) public trades; ``` -Usare un mapping significa solo che dobbiamo trovare un ID per ogni annuncio prima di pubblicarlo e che dovremo conoscere l'ID di un annuncio prima di poter lavorare su di esso. Ci sono molti modi per affrontare questo problema sia con gli Smart Contract che nel front end. Chiedi se ti servono delle indicazioni. +Usare una mappatura significa solo che dobbiamo inventare un ID per ogni annuncio prima di pubblicarlo, e avremo bisogno di conoscere l'ID di un annuncio prima di potervi operare. Ci sono molti modi per affrontare questo problema sia nel contratto intelligente che nel front-end. Chiedi pure se hai bisogno di qualche dritta. -La seconda questione è capire quali sono gli elementi con cui lavoriamo e qual è la valuta che deve essere usata per pagare la transazione. +Poi sorge la domanda su quali siano quegli oggetti di cui ci occupiamo, e quale sia questa valuta utilizzata per pagare la transazione. -Per gli elementi, chiederemo solo che implementino l'interfaccia [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), che è semplicemente un modo per rappresentare gli oggetti del mondo reale su una blockchain, anche se [funziona meglio con le risorse digitali](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Specificheremo il nostro contratto ERC271 nel costruttore, dicendo che ogni risorsa della nostra bacheca di annunci deve prima essere tokenizzata. +Per gli oggetti, chiederemo semplicemente che implementino l'interfaccia [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), che in realtà è solo un modo per rappresentare oggetti del mondo reale in una blockchain, sebbene [funzioni meglio con gli asset digitali](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Specificheremo il nostro contratto ERC721 nel costruttore, il che significa che qualsiasi asset nella nostra bacheca di annunci deve essere stato tokenizzato in precedenza. -Per i pagamenti, faremo qualcosa di simile. La maggior parte dei progetti di blockchain definisce la propria criptovaluta [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com). Altri preferiscono usarne una popolare come DAI. In questa bacheca di annunci, dovrai solo decidere al momento della creazione quale sarà la tua valuta. Facile. +Per i pagamenti, faremo qualcosa di simile. La maggior parte dei progetti blockchain definisce la propria criptovaluta [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com). Altri preferiscono usarne una tradizionale come DAI. In questa bacheca di annunci, devi solo decidere al momento della costruzione quale sarà la tua valuta. Facile. ```solidity constructor ( @@ -82,9 +78,9 @@ constructor ( } ``` -Ci siamo quasi. Abbiamo annunci, oggetti da scambiare e una valuta per i pagamenti. Creare un annuncio significa mettere un oggetto in deposito per mostrare sia che tu lo possiedi, sia che non lo hai pubblicato due volte, magari in una bacheca diversa. +Ci stiamo arrivando. Abbiamo annunci, oggetti da scambiare e una valuta per i pagamenti. Creare un annuncio significa mettere un oggetto in garanzia (escrow) per dimostrare sia che lo possiedi sia che non lo hai pubblicato due volte, possibilmente in una bacheca diversa. -Il codice qui sotto fa esattamente questo. Mette l'oggetto in deposito, crea l'annuncio e fa un po' di altri lavoretti. +Il codice qui sotto fa esattamente questo. Mette l'oggetto in garanzia, crea l'annuncio, fa un po' di pulizia. ```solidity function openTrade(uint256 _item, uint256 _price) @@ -102,7 +98,7 @@ function openTrade(uint256 _item, uint256 _price) } ``` -Accettare lo scambio significa scegliere un annuncio (scambio), pagare il prezzo, ricevere l'oggetto. Il codice qui sotto recupera uno scambio. Controlla se è disponibile. Paga l'oggetto. Recupera l'oggetto. Aggiorna l'annuncio. +Accettare lo scambio significa scegliere un annuncio (scambio), pagare il prezzo, ricevere l'oggetto. Il codice qui sotto recupera uno scambio. Controlla che sia disponibile. Paga l'oggetto. Recupera l'oggetto. Aggiorna l'annuncio. ```solidity function executeTrade(uint256 _trade) @@ -117,9 +113,9 @@ function executeTrade(uint256 _trade) } ``` -Infine abbiamo un'opzione che permette al venditore di uscire da uno scambio prima che l'acquirente lo accetti. In alcuni modelli, invece, gli annunci rimangono online per un determinato periodo di tempo, prima di scadere. La scelta è tua, a seconda di come funziona il tuo marketplace. +Infine, abbiamo un'opzione per i venditori di ritirarsi da uno scambio prima che un acquirente lo accetti. In alcuni modelli, gli annunci rimarrebbero invece attivi per un periodo di tempo prima di scadere. A te la scelta, a seconda del design del tuo mercato. -Il codice è molto simile a quello usato per eseguire uno scambio, solo che qua non c'è moneta che passa di mano e l'oggetto torna indietro a chi ha pubblicato l'annuncio. +Il codice è molto simile a quello utilizzato per eseguire uno scambio, solo che non c'è alcun passaggio di valuta e l'oggetto torna a chi ha pubblicato l'annuncio. ```solidity function cancelTrade(uint256 _trade) @@ -137,14 +133,14 @@ function cancelTrade(uint256 _trade) } ``` -Ecco qua. Siamo giunti alla fine dell'implementazione. È sorprendente come alcuni concetti di business siano compatti quando vengono espressi con codice, e questo è uno di questi esempi. Guarda il contratto completo [nel nostro repo](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol). +Questo è tutto. Sei arrivato alla fine dell'implementazione. È abbastanza sorprendente quanto siano compatti alcuni concetti aziendali quando espressi in codice, e questo è uno di quei casi. Controlla il contratto completo [nel nostro repo](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol). ## Conclusione {#conclusion} -Le bacheche di annunci sono una configurazione di mercato comune che ha preso piede rapidamente con Internet, diventando un modello di business incredibilmente popolare, con alcuni monopoli che si sono accaparrati il segmento di mercato. +Le bacheche di annunci sono una configurazione di mercato comune che è scalata massicciamente con Internet, diventando un modello di business estremamente popolare con pochi vincitori monopolistici. -Sono anche uno strumento facile da replicare in un ambiente blockchain, con caratteristiche molto specifiche che permetteranno di sfidare i giganti attuali. +Le bacheche di annunci si rivelano anche uno strumento facile da replicare in un ambiente blockchain, con caratteristiche molto specifiche che renderanno possibile una sfida ai giganti esistenti. -In questo articolo ho fatto un tentativo di collegare la realtà delle bacheche di annunci con l'implementazione tecnologica. Queste conoscenze, con le giuste capacità, dovrebbero aiutare a creare una vision e una roadmap per l'implementazione. +In questo articolo, ho fatto un tentativo di collegare la realtà aziendale di un business di bacheche di annunci con l'implementazione tecnologica. Questa conoscenza dovrebbe aiutarti a creare una visione e un piano d'azione per l'implementazione se hai le giuste competenze. -Come sempre, se vuoi creare qualcosa di interessante e vorresti qualche consiglio, [scrivimi](https://albertocuesta.es/)! Sono sempre felice di dare una mano. +Come sempre, se hai intenzione di costruire qualcosa di divertente e gradiresti qualche consiglio, per favore [scrivimi](https://albertocuesta.es/)! Sono sempre felice di aiutare. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/it/developers/tutorials/how-to-mint-an-nft/index.md index d41082d813d..cdf46213ab2 100644 --- a/public/content/translations/it/developers/tutorials/how-to-mint-an-nft/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-mint-an-nft/index.md @@ -1,39 +1,37 @@ --- -title: Come coniare un NFT (Parte 2/3 della Serie di tutorial sugli NFT) -description: Questo tutorial descrive come coniare un NFT sulla Blockchain di Ethereum usando il nostro contratto intelligente e Web3. +title: Come coniare un NFT (Parte 2/3 della serie di tutorial sugli NFT) +description: Questo tutorial descrive come coniare un NFT sulla blockchain di Ethereum usando il nostro contratto intelligente e Web3. author: "Sumi Mudgil" -tags: - - "ERC-721" - - "alchemy" - - "solidity" - - "contratti intelligenti" +tags: ["ERC-721", "Alchemy", "Solidity", "contratti intelligenti"] skill: beginner -breadcrumb: "Coniare un NFT" +breadcrumb: Coniare un NFT lang: it published: 2021-04-22 --- -[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): $69 milioni [3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): $11 milioni [Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): $6 milioni +[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 milioni di dollari +[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 milioni di dollari +[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 milioni di dollari -Tutti loro hanno coniato i propri NFT utilizzando la potente API di Alchemy. In questo tutorial ti insegneremo come fare lo stesso in meno di 10 minuti. +Tutti loro hanno coniato i propri NFT usando la potente API di Alchemy. In questo tutorial, ti insegneremo come fare lo stesso in \<10 minuti. -"Coniare un NFT" è l'atto di pubblicare un'istanza unica del tuo token ERC-721 sulla blockchain. Usando il nostro contratto intelligente dalla [Parte 1 di questa serie di tutorial sugli NFT](/developers/tutorials/how-to-write-and-deploy-an-nft/), dimostriamo le nostre abilità di Web3 e coniamo un NFT. Alla fine di questo tutorial, potrai coniare tutti gli NFT che desideri (e che può permettersi il tuo portafoglio)! +"Coniare un NFT" è l'atto di pubblicare un'istanza unica del tuo token ERC-721 sulla blockchain. Usando il nostro contratto intelligente dalla [Parte 1 di questa serie di tutorial sugli NFT](/developers/tutorials/how-to-write-and-deploy-an-nft/), mettiamo in mostra le nostre abilità con Web3 e coniamo un NFT. Alla fine di questo tutorial, sarai in grado di coniare tutti gli NFT che il tuo cuore (e il tuo portafoglio) desidera! Iniziamo! -## Fase 1: installa Web3 {#install-web3} +## Passaggio 1: Installare Web3 {#install-web3} -Se hai seguito il primo tutorial sulla creazione del tuo contratto intelligente di NFT, hai già esperienza usando Ethers.js. Web3 è simile a Ethers, trattandosi di una libreria usata per effettuare più facilmente richieste di creazione alla Blockchain di Ethereum. In questo tutorial, useremo [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), una libreria Web3 migliorata che offre tentativi automatici e robusto supporto a WebSocket. +Se hai seguito il primo tutorial sulla creazione del tuo contratto intelligente per NFT, hai già esperienza nell'uso di Ethers.js. Web3 è simile a Ethers, in quanto è una libreria usata per facilitare la creazione di richieste alla blockchain di [Ethereum](/). In questo tutorial useremo [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3), che è una libreria Web3 migliorata che offre tentativi automatici e un solido supporto per WebSocket. -Nella cartella home del tuo progetto, esegui: +Nella directory principale del tuo progetto esegui: ``` npm install @alch/alchemy-web3 ``` -## Fase 2: crea un file `mint-nft.js` {#create-mintnftjs} +## Passaggio 2: Creare un file `mint-nft.js` {#create-mintnftjs} -Nella tua cartella di script, crea un `mint-nft.js` e aggiungi le seguenti righe di codice: +All'interno della tua directory degli script, crea un file `mint-nft.js` e aggiungi le seguenti righe di codice: ```js require("dotenv").config() @@ -42,49 +40,49 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(API_URL) ``` -## Fase 3: prendi l'ABI del tuo contratto {#contract-abi} +## Passaggio 3: Ottenere l'ABI del tuo contratto {#contract-abi} -L'ABI (Interfaccia Binaria dell'Applicazione) del nostro contratto è l'interfaccia per interagire con il nostro contratto intelligente. Puoi saperne di più sull'ABI dei contratti leggi [qui](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat genera automaticamente un'ABI e la salva nel file `MyNFT.json`. Per poterla usare, dovremo analizzare i contenuti aggiungendo le seguenti righe di codice al nostro `mint-nft.js`: +L'ABI (Application Binary Interface) del nostro contratto è l'interfaccia per interagire con il nostro contratto intelligente. Puoi saperne di più sulle ABI dei contratti [qui](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is). Hardhat genera automaticamente un'ABI per noi e la salva nel file `MyNFT.json`. Per poterla usare dovremo analizzarne i contenuti aggiungendo le seguenti righe di codice al nostro file `mint-nft.js`: ```js const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") ``` -Se vuoi vedere l'ABI, puoi stamparla nella tua console: +Se vuoi vedere l'ABI puoi stamparla nella tua console: ```js console.log(JSON.stringify(contract.abi)) ``` -Per eseguire `mint-nft.js` e vedere l'ABI stampata alla console, vai alla console ed esegui: +Per eseguire `mint-nft.js` e vedere la tua ABI stampata nella console, naviga nel tuo terminale ed esegui: ```js node scripts/mint-nft.js ``` -## Fase 4: configura i metadati del tuo NFT usando IPFS {#config-meta} +## Passaggio 4: Configurare i metadati per il tuo NFT usando IPFS {#config-meta} -Se ti ricordi dal nostro tutorial nella Parte 1, la funzione del nostro contratto intelligente `mintNFT` prende un parametro tokenURl che dovrebbe risolversi a un documento JSON che descrive i metadati del NFT; che è ciò che porta realmente in vita lo NFT, consentendogli di avere proprietà configurabili, come un nome, una descrizione, un'immagine e altri attributi. +Se ricordi dal nostro tutorial nella Parte 1, la nostra funzione del contratto intelligente `mintNFT` accetta un parametro tokenURI che dovrebbe risolversi in un documento JSON che descrive i metadati dell'NFT, che è in realtà ciò che dà vita all'NFT, permettendogli di avere proprietà configurabili, come un nome, una descrizione, un'immagine e altri attributi. -> _Il Planetary File System (IPFS) è un protocollo decentralizzato e una rete peer-to-peer per memorizzare e condividere i dati in un file di sistema distribuito._ +> _L'Interplanetary File System (IPFS) è un protocollo decentralizzato e una rete peer-to-peer per l'archiviazione e la condivisione di dati in un file system distribuito._ -Useremo Pinata, una comoda API di IPFS e strumento per memorizzare la nostra risorsa NFT e i metadati, per essere sicuri che il nostro NFT sia realmente decentralizzato. Se non hai un conto di Pinata, registrane uno gratuito [qui](https://app.pinata.cloud) e completa i passaggi per verificare la tua email. +Useremo Pinata, una comoda API e toolkit IPFS, per archiviare la risorsa e i metadati del nostro NFT per assicurarci che il nostro NFT sia veramente decentralizzato. Se non hai un account Pinata, registrati per un account gratuito [qui](https://app.pinata.cloud) e completa i passaggi per verificare la tua email. -Una volta creato un conto: +Una volta creato un account: -- Vai alla pagina "File" e clicca il pulsante "Carica" blu in alto a sinistra alla pagina. +- Naviga alla pagina "Files" e clicca sul pulsante blu "Upload" in alto a sinistra della pagina. -- Carica un'immagine su Pinata, sarà la risorsa immagine del tuo NFT. Assegna alla risorsa il nome desideri +- Carica un'immagine su Pinata: questa sarà la risorsa immagine per il tuo NFT. Sentiti libero di nominare la risorsa come preferisci -- Dopo il caricamento, vedrai le informazioni del file nella tabella sulla pagina "File". Vedrai anche una colonna CID. Puoi copiare il CID cliccando il pulsante di copia accanto. Puoi visualizzare il tuo caricamento su: `https://gateway.pinata.cloud/ipfs/`. Puoi trovare l'immagine che abbiamo usato su IPFS [qui](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5), ad esempio. +- Dopo il caricamento, vedrai le informazioni del file nella tabella sulla pagina "Files". Vedrai anche una colonna CID. Puoi copiare il CID cliccando sul pulsante di copia accanto ad esso. Puoi visualizzare il tuo caricamento su: `https://gateway.pinata.cloud/ipfs/`. Puoi trovare l'immagine che abbiamo usato su IPFS [qui](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5), per esempio. -Per chi preferisce un apprendimento "visivo", i passaggi sopra sono riassunti qui: +Per chi apprende in modo più visivo, i passaggi precedenti sono riassunti qui: -![Come caricare l'immagine su Pinata](./instructionsPinata.gif) +![Come caricare la tua immagine su Pinata](./instructionsPinata.gif) -Vogliamo caricare ora un altro documento su Pinata. Ma prima, dobbiamo crearlo! +Ora, vorremo caricare un altro documento su Pinata. Ma prima di farlo, dobbiamo crearlo! -Nella tua cartella di root, crea un nuovo file chiamato `nft-metadata.json` e aggiungi il seguente codice json: +Nella tua directory principale, crea un nuovo file chiamato `nft-metadata.json` e aggiungi il seguente codice json: ```json { @@ -104,21 +102,21 @@ Nella tua cartella di root, crea un nuovo file chiamato `nft-metadata.json` e ag } ``` -Puoi modificare liberamente i dati nel json. Puoi rimuoverli o aggiungerli alla sezione degli attributi. Soprattutto, assicurati che il campo immagine punti alla posizione della tua immagine IPFS; altrimenti, il tuo NFT includerà la foto di un cane (molto carino!). +Sentiti libero di cambiare i dati nel json. Puoi rimuovere o aggiungere alla sezione degli attributi. La cosa più importante è assicurarsi che il campo dell'immagine punti alla posizione della tua immagine IPFS, altrimenti il tuo NFT includerà una foto di un cane (molto carino!). -Una volta finito di modificare il file JSON, salvalo e caricalo su Pinata, seguendo gli stessi passaggi di caricamento dell'immagine. +Una volta terminata la modifica del file JSON, salvalo e caricalo su Pinata, seguendo gli stessi passaggi che abbiamo fatto per caricare l'immagine. ![Come caricare il tuo nft-metadata.json su Pinata](./uploadPinata.gif) -## Fase 5: crea un'istanza del tuo contratto {#instance-contract} +## Passaggio 5: Creare un'istanza del tuo contratto {#instance-contract} -Ora, per interagire con il nostro contratto, dobbiamo crearne un'istanza nel nostro codice. Per farlo, avremo bisogno dell'indirizzo del nostro contratto, che possiamo ottenere dalla distribuzione o da [Etherscan](https://sepolia.etherscan.io/), cercando l'indirizzo usato per distribuire il contratto. +Ora, per interagire con il nostro contratto, dobbiamo crearne un'istanza nel nostro codice. Per farlo avremo bisogno del nostro indirizzo del contratto che possiamo ottenere dalla distribuzione o da [Blockscout](https://eth-sepolia.blockscout.com/) cercando l'indirizzo che hai usato per distribuire il contratto. ![Visualizza l'indirizzo del tuo contratto su Etherscan](./view-contract-etherscan.png) -Nell'esempio precedente, l'indirizzo del nostro contratto è 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778. +Nell'esempio sopra, il nostro indirizzo del contratto è 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778. -Poi useremo il [metodo di contratto](https://docs.web3js.org/api/web3-eth-contract/class/Contract) di Web3 per creare il nostro contratto usando l'ABI e l'indirizzo. Nel tuo file `mint-nft.js`, aggiungi quanto segue: +Successivamente useremo il [metodo contract](https://docs.web3js.org/api/web3-eth-contract/class/Contract) di Web3 per creare il nostro contratto usando l'ABI e l'indirizzo. Nel tuo file `mint-nft.js`, aggiungi quanto segue: ```js const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" @@ -126,11 +124,11 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) ``` -## Fase 6: aggiorna il file `.env` {#update-env} +## Passaggio 6: Aggiornare il file `.env` {#update-env} -Ora, per poter creare e inviare le transazioni alla catena di Ethereum, useremo l'indirizzo pubblico del tuo conto di Ethereum per ottenerne il nonce (spiegheremo in seguito). +Ora, per creare e inviare transazioni alla catena di Ethereum, useremo l'indirizzo pubblico del tuo account Ethereum per ottenere il nonce dell'account (lo spiegheremo di seguito). -Aggiungi la tua chiave pubblica al tuo file `.env`; se hai completato la parte 1 del tutorial, il nostro file `.env` dovrebbe somigliare a questo: +Aggiungi la tua chiave pubblica al tuo file `.env`: se hai completato la parte 1 del tutorial, il nostro file `.env` dovrebbe ora apparire così: ```js API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key" @@ -138,27 +136,27 @@ PRIVATE_KEY = "your-private-account-address" PUBLIC_KEY = "your-public-account-address" ``` -## Fase 7: crea la tua transazione {#create-txn} +## Passaggio 7: Creare la tua transazione {#create-txn} -Prima di tutto, definiamo una funzione denominata `mintNFT(tokenData)` e creiamo la nostra transazione facendo quanto segue: +Per prima cosa, definiamo una funzione chiamata `mintNFT(tokenData)` e creiamo la nostra transazione facendo quanto segue: 1. Prendi la tua _PRIVATE_KEY_ e _PUBLIC_KEY_ dal file `.env`. -1. Poi, dobbiamo trovare il nonce del conto. La specifica di nonce è usata per tracciare il numero di transazioni inviate dal tuo indirizzo, di cui necessitiamo per motivi di sicurezza e per impedire gli [attacchi di riproduzione](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Per ottenere il numero di transazioni inviate dal tuo indirizzo, usiamo [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +1. Successivamente, dovremo capire il nonce dell'account. La specifica del nonce è usata per tenere traccia del numero di transazioni inviate dal tuo indirizzo, di cui abbiamo bisogno per motivi di sicurezza e per prevenire [attacchi di replay](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Per ottenere il numero di transazioni inviate dal tuo indirizzo, usiamo [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). -1. Infine, configureremo la nostra transazione con le seguenti informazioni: +1. Infine imposteremo la nostra transazione con le seguenti informazioni: - `'from': PUBLIC_KEY` — L'origine della nostra transazione è il nostro indirizzo pubblico -- `'to': contractAddress` — Il contratto con cui vogliamo interagire e a cui vogliamo inviare la transazione +- `'to': contractAddress` — Il contratto con cui desideriamo interagire e a cui inviare la transazione -- `'nonce': nonce`: l'account nonce con il numero di transazioni inviate dal nostro indirizzo +- `'nonce': nonce` — Il nonce dell'account con il numero di transazioni inviate dal nostro indirizzo -- `'gas': estimatedGas`: Il gas stimato necessario per completare la transazione +- `'gas': estimatedGas` — Il gas stimato necessario per completare la transazione -- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Il calcolo che vogliamo eseguire in questa transazione, che in questo caso è il conio di un NFT +- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — Il calcolo che desideriamo eseguire in questa transazione, che in questo caso è coniare un NFT -Il tuo file `mint-nft.js` dovrebbe somigliare a questo ora: +Il tuo file `mint-nft.js` dovrebbe apparire così ora: ```js require('dotenv').config(); @@ -174,9 +172,9 @@ Il tuo file `mint-nft.js` dovrebbe somigliare a questo ora: const nftContract = new web3.eth.Contract(contract.abi, contractAddress); async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); // ottieni l'ultimo nonce - //the transaction + // la transazione const tx = { 'from': PUBLIC_KEY, 'to': contractAddress, @@ -187,11 +185,11 @@ Il tuo file `mint-nft.js` dovrebbe somigliare a questo ora: }​ ``` -## Fase 8: firma la transazione {#sign-txn} +## Passaggio 8: Firmare la transazione {#sign-txn} -Ora che abbiamo creato la nostra transazione, dobbiamo firmarla per inviarla. Ecco dove useremo la nostra chiave privata. +Ora che abbiamo creato la nostra transazione, dobbiamo firmarla per poterla inviare. È qui che useremo la nostra chiave privata. -`web3.eth. endSignedTransaction` ci darà l'hash della transazione, che possiamo usare per assicurarci che la nostra transazione sia stata minata e non sia stata eliminata dalla rete. Noterai nella sezione di firma della transazione che abbiamo aggiunto dei controlli degli errori, per poter sapere se la nostra transazione è passata correttamente. +`web3.eth.sendSignedTransaction` ci darà l'hash della transazione, che possiamo usare per assicurarci che la nostra transazione sia stata minata e non sia stata scartata dalla rete. Noterai che nella sezione della firma della transazione, abbiamo aggiunto un controllo degli errori in modo da sapere se la nostra transazione è andata a buon fine. ```js require("dotenv").config() @@ -207,9 +205,9 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") // ottieni l'ultimo nonce - //the transaction + // la transazione const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -245,19 +243,19 @@ async function mintNFT(tokenURI) { } ``` -## Fase 9: chiama `mintNFT` ed esegui il nodo `mint-nft.js` {#call-mintnft-fn} +## Passaggio 9: Chiamare `mintNFT` ed eseguire node `mint-nft.js` {#call-mintnft-fn} -Ricordi il `metadata.json` che hai caricato su Pinata? Ottieni il suo hashcode da Pinata e passa il seguente come un parametro alla funzione `mintNFT` `https://gateway.pinata.cloud/ipfs/` +Ricordi il `metadata.json` che hai caricato su Pinata? Ottieni il suo codice hash da Pinata e passa quanto segue come parametro alla funzione `mintNFT` `https://gateway.pinata.cloud/ipfs/` -Ecco come ottenere l'hashcode: +Ecco come ottenere il codice hash: -![Come ottenere l'hashcode dei metadati del tuo NFT su Pinata](./metadataPinata.gif)_Come ottenere l'hashcode dei metadati del tuo NFT su Pinata_ +![Come ottenere il codice hash dei metadati del tuo nft su Pinata](./metadataPinata.gif)_Come ottenere il codice hash dei metadati del tuo nft su Pinata_ -> Ricontrolla che l'hashcode che hai copiato si colleghi al tuo **metadata.json**, caricando `https://gateway.pinata.cloud/ipfs/` in una finestra separata. La pagina dovrebbe somigliare al seguente screenshot: +> Controlla due volte che il codice hash che hai copiato si colleghi al tuo **metadata.json** caricando `https://gateway.pinata.cloud/ipfs/` in una finestra separata. La pagina dovrebbe apparire simile allo screenshot qui sotto: -![La tua pagina dovrebbe visualizzare i metadati in json](./metadataJSON.png)_La tua pagina deve mostrare i metadati in json_ +![La tua pagina dovrebbe visualizzare i metadati json](./metadataJSON.png)_La tua pagina dovrebbe visualizzare i metadati json_ -Nel complesso, il tuo codice dovrebbe somigliare a questo: +Nel complesso, il tuo codice dovrebbe apparire più o meno così: ```js require("dotenv").config() @@ -273,9 +271,9 @@ const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" const nftContract = new web3.eth.Contract(contract.abi, contractAddress) async function mintNFT(tokenURI) { - const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //get latest nonce + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") // ottieni l'ultimo nonce - //the transaction + // la transazione const tx = { from: PUBLIC_KEY, to: contractAddress, @@ -313,19 +311,18 @@ async function mintNFT(tokenURI) { mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") ``` -Ora, esegui `scripts/mint-nft.js` per distribuire il tuo NFT. Dopo qualche secondo, dovresti vedere una risposta come questa nel tuo terminale: +Ora, esegui `node scripts/mint-nft.js` per distribuire il tuo NFT. Dopo un paio di secondi, dovresti vedere una risposta come questa nel tuo terminale: - L'hash della tua transazione è: - 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 - - Consulta il Mempool di Alchemy per visualizzare lo stato della tua transazione! + The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 -Vai quindi alla tua [mempool di Alchemy](https://dashboard.alchemyapi.io/mempool) per vedere lo stato della transazione (se è sospesa, minata o eliminata dalla rete). Se la tua transazione è stata eliminata, è utile dare un'occhiata anche su [Sepolia Etherscan](https://sepolia.etherscan.io/) e cercare l'hash della tua transazione. + Check Alchemy's Mempool to view the status of your transaction! -![Visualizza l'hash della tua transazione NFT su Etherscan](./view-nft-etherscan.png)_Visualizza l'hash della tua transazione NFT su Etherscan_ +Successivamente, visita la tua [mempool di Alchemy](https://dashboard.alchemyapi.io/mempool) per vedere lo stato della tua transazione (se è in sospeso, minata o è stata scartata dalla rete). Se la tua transazione è stata scartata, è anche utile controllare [Blockscout](https://eth-sepolia.blockscout.com/) e cercare l'hash della tua transazione. -Ecco fatto! Hai ora distribuito E coniato con un NFT sulla Blockchain di Ethereum +![Visualizza l'hash della transazione del tuo NFT su Etherscan](./view-nft-etherscan.png)_Visualizza l'hash della transazione del tuo NFT su Etherscan_ -Utilizzando `mint-nft.js`, puoi coniare quanti NFT il tuo cuore, e portafoglio, desiderino! Basta che ti accerti di passare un nuovo tokenURI che descriva i metadati dell'NFT (altrimenti, finirai per crearne tanti identici con ID differenti). +E questo è tutto! Ora hai distribuito E coniato un NFT sulla blockchain di Ethereum -Molto probabilmente vorrai visualizzare il tuo NFT nel tuo portafoglio, quindi assicurati di leggere la [Parte 3: come visualizzare il tuo NFT nel portafoglio](/developers/tutorials/how-to-view-nft-in-metamask/)! +Usando `mint-nft.js` puoi coniare tutti gli NFT che il tuo cuore (e il tuo portafoglio) desidera! Assicurati solo di passare un nuovo tokenURI che descrive i metadati dell'NFT (altrimenti, finirai solo per crearne un mucchio identici con ID diversi). + +Presumibilmente, ti piacerebbe poter mostrare il tuo NFT nel tuo portafoglio, quindi assicurati di dare un'occhiata alla [Parte 3: Come visualizzare il tuo NFT nel tuo portafoglio](/developers/tutorials/how-to-view-nft-in-metamask/)! \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/it/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md index 41335b67e1d..2bc48ac9d78 100644 --- a/public/content/translations/it/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -1,31 +1,27 @@ --- -title: Come simulare i contratti intelligenti in Solidity per testarli -description: Perché è importante prendersi gioco dei propri contratti in fase di test +title: Come simulare (mock) i contratti intelligenti in Solidity per i test +description: "Perché dovresti prendere in giro i tuoi contratti durante i test" author: Markus Waas lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "test" - - "simulazione" +tags: ["Solidity", "contratti intelligenti", "test", "mocking"] skill: intermediate -breadcrumb: "Simulare contratti" +breadcrumb: Simulare i contratti published: 2020-05-02 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/mocking-contracts --- -[Gli oggetti Mock](https://wikipedia.org/wiki/Mock_object) sono un modello di progettazione comune nella programmazione orientata agli oggetti. Il termine inglese per "simulare" è "to mock", dal francese antico "mocquer" col significato di "prendersi gioco di". Questo significato si è poi evoluto in "imitare qualcosa di reale", che è ciò che in effetti facciamo nella programmazione. Prenditi gioco dei tuoi contratti intelligenti quanto vuoi, ma simulali ogni volta che puoi. Ti semplificherà la vita. +Gli [oggetti mock](https://wikipedia.org/wiki/Mock_object) (o simulati) sono un design pattern comune nella programmazione orientata agli oggetti. Derivante dall'antica parola francese 'mocquer' con il significato di 'prendere in giro', si è evoluto in 'imitare qualcosa di reale', che è in realtà ciò che facciamo nella programmazione. Per favore, prendi in giro i tuoi contratti intelligenti solo se lo desideri, ma simulali (mock) ogni volta che puoi. Ti semplificherà la vita. -## Condurre unit test dei contratti con le simulazioni {#unit-testing-contracts-with-mocks} +## Test unitari dei contratti con i mock {#unit-testing-contracts-with-mocks} -Simulare un contratto significa essenzialmente creare una seconda versione di quel contratto che si comporta in modo simile a quello originale, ma in modo che possa essere facilmente controllato dallo sviluppatore. Ci si ritrova spesso con contratti complessi in cui si desidera solo [eseguire unit test di piccole parti del contratto](/developers/docs/smart-contracts/testing/). Ma cosa succede se il test di questa piccola parte richiede uno condizione molto specifica del contratto, difficile da ottenere? +Simulare (mocking) un contratto significa essenzialmente creare una seconda versione di quel contratto che si comporta in modo molto simile all'originale, ma in un modo che può essere facilmente controllato dallo sviluppatore. Spesso ci si ritrova con contratti complessi in cui si desidera solo [eseguire test unitari su piccole parti del contratto](/developers/docs/smart-contracts/testing/). Il problema è: cosa succede se testare questa piccola parte richiede uno stato del contratto molto specifico e difficile da raggiungere? -Potresti scrivere una complessa logica di configurazione del test ogni volta che porta il contratto nello stato richiesto o scrivi una simulazione. Simulare un contratto tramite ereditarietà è semplice. Basta creare un secondo contratto simulato che erediti da quello originale. Ora puoi sovrascrivere le funzioni nella tua simulazione. Vediamolo con un esempio. +Potresti scrivere ogni volta una complessa logica di configurazione dei test che porti il contratto nello stato richiesto, oppure scrivere un mock. Simulare un contratto è facile con l'ereditarietà. Crea semplicemente un secondo contratto mock che eredita da quello originale. Ora puoi sovrascrivere (override) le funzioni nel tuo mock. Vediamolo con un esempio. -## Esempio: ERC20 Privato {#example-private-erc20} +## Esempio: ERC-20 privato {#example-private-erc20} -Usiamo un contratto ERC-20 di esempio dotato di un tempo privato iniziale. Il proprietario può gestire utenti privati, che saranno gli unici autorizzati a ricevere token all'inizio. Una volta trascorso un certo intervallo di tempo, a tutti sarà consentito utilizzare i token. Se sei curioso, stiamo usando l'hook [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks) dalla nuova libreria di contratti OpenZeppelin v3. +Usiamo un contratto ERC-20 di esempio che ha un periodo privato iniziale. Il proprietario può gestire gli utenti privati e solo a loro sarà permesso ricevere token all'inizio. Una volta trascorso un certo periodo di tempo, a tutti sarà permesso utilizzare i token. Se sei curioso, stiamo usando l'hook [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks) dai nuovi contratti OpenZeppelin v3. ```solidity pragma solidity ^0.6.0; @@ -65,7 +61,7 @@ contract PrivateERC20 is ERC20, Ownable { } ``` -E ora, simuliamolo. +E ora simuliamolo (mock). ```solidity pragma solidity ^0.6.0; @@ -86,22 +82,22 @@ contract PrivateERC20Mock is PrivateERC20 { } ``` -Otterrai uno dei seguenti messaggi d'errore: +Otterrai uno dei seguenti messaggi di errore: - `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` - `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` -Poiché stiamo usando la nuova versione di Solidity 0.6, dobbiamo aggiungere la parola chiave `virtual` per le funzioni sovrascrivibili e `override` per la funzione di sovrascrizione. Quindi, aggiungiamoli a entrambe le funzioni `isPublic`. +Poiché stiamo utilizzando la nuova versione 0.6 di Solidity, dobbiamo aggiungere la parola chiave `virtual` per le funzioni che possono essere sovrascritte e `override` per la funzione che sovrascrive. Quindi aggiungiamole a entrambe le funzioni `isPublic`. -Ora, nei tuoi unit test, puoi invece usare `PrivateERC20Mock`. Quando desideri testare il comportamento durante il tempo di utilizzo privato, usa `setIsPublic(false` e, allo stesso modo, `setIsPublic(true)` per testare il tempo di utilizzo pubblico. Ovviamente, nel nostro esempio, abbiamo potuto usare soltanto i [time helper](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) per modificare anche i tempi di conseguenza. Ma l'idea della simulazione dovrebbe ora esserti chiara e puoi immaginarti scenari in cui non sia facile come far procedere semplicemente il tempo. +Ora nei tuoi test unitari, puoi usare invece `PrivateERC20Mock`. Quando vuoi testare il comportamento durante il periodo di utilizzo privato, usa `setIsPublic(false)` e allo stesso modo `setIsPublic(true)` per testare il periodo di utilizzo pubblico. Naturalmente nel nostro esempio, potremmo semplicemente usare gli [aiutanti temporali (time helpers)](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) per modificare i tempi di conseguenza. Ma l'idea del mocking dovrebbe essere chiara ora e puoi immaginare scenari in cui non è così facile come far semplicemente avanzare il tempo. ## Simulare molti contratti {#mocking-many-contracts} -Può diventare caotico creare un altro contratto per ogni singola simulazione. Se ciò ti preoccupa, puoi dare un'occhiata alla libreria [MockContract](https://github.com/gnosis/mock-contract). Ti consente di sovrascrivere e modificare i comportamenti dei contratti al volo. Tuttavia, funziona solo per le chiamate di simulazione a un altro contratto, quindi non funzionerebbe per il nostro esempio. +Può diventare caotico se devi creare un altro contratto per ogni singolo mock. Se questo ti infastidisce, puoi dare un'occhiata alla libreria [MockContract](https://github.com/gnosis/mock-contract). Ti consente di sovrascrivere e modificare i comportamenti dei contratti al volo. Tuttavia, funziona solo per simulare le chiamate a un altro contratto, quindi non funzionerebbe per il nostro esempio. -## La simulazione può essere ancora più potente {#mocking-can-be-even-more-powerful} +## Il mocking può essere ancora più potente {#mocking-can-be-even-more-powerful} -I poteri della simulazione non finiscono qui. +I poteri del mocking non finiscono qui. -- Aggiungere funzioni: è utile non solo sovrascrivere una funzione specifica, ma anche aggiungere funzioni aggiuntive. Un buon esempio per i token è proprio avere una funzione `mint` aggiuntiva per consentire a qualsiasi utente di ottenere nuovi token gratuitamente. -- Uso nelle testnet: quando distribuisci e testi i tuoi contratti sulle reti di prova insieme alla tua dApp, prendi in considerazione l'uso di una versione simulata. Evita di sovrascrivere le funzioni, a meno che non sia davvero necessario. Dopotutto, vuoi testare la logica reale. Ma può essere utile aggiungere una funzione di ripristino che ripristini semplicemente lo stato del contratto all'inizio, senza necessità di alcuna nuova distribuzione. Ovviamente, non vorresti farlo in un contratto sulla Rete mainnet. +- Aggiungere funzioni: non solo è utile sovrascrivere una funzione specifica, ma anche semplicemente aggiungere funzioni aggiuntive. Un buon esempio per i token è avere semplicemente una funzione `mint` (coniare) aggiuntiva per consentire a qualsiasi utente di ottenere nuovi token gratuitamente. +- Utilizzo nelle reti di test: quando distribuisci e testi i tuoi contratti sulle reti di test insieme alla tua dApp, prendi in considerazione l'utilizzo di una versione simulata (mock). Evita di sovrascrivere le funzioni a meno che tu non debba davvero farlo. Dopotutto, vuoi testare la logica reale. Ma aggiungere, ad esempio, una funzione di ripristino può essere utile per riportare semplicemente lo stato del contratto all'inizio, senza richiedere una nuova distribuzione. Ovviamente non vorresti avere una cosa del genere in un contratto sulla rete principale. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/it/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md index e5554cab34c..3a1318513a7 100644 --- a/public/content/translations/it/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -1,24 +1,19 @@ --- -title: Come usare Echidna per testare gli smart contract -description: Come usare Echidna per testare automaticamente gli smart contract +title: Come usare Echidna per testare i contratti intelligenti +description: Come usare Echidna per testare automaticamente i contratti intelligenti author: "Trailofbits" lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "sicurezza" - - "test" - - "fuzzing" +tags: ["Solidity", "contratti intelligenti", "sicurezza", "testing", "fuzzing"] skill: advanced -breadcrumb: "Echidna" +breadcrumb: Echidna published: 2020-04-10 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna --- ## Installazione {#installation} -Echidna è installabile tramite docker o usando il binario pre-compilato. +Echidna può essere installato tramite docker o utilizzando il binario precompilato. ### Echidna tramite docker {#echidna-through-docker} @@ -27,46 +22,45 @@ docker pull trailofbits/eth-security-toolbox docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox ``` -_L'ultimo comando esegue eth-security-toolbox in un docker che ha accesso alla tua cartella corrente. Puoi modificare i file dal tuo host ed eseguire gli strumenti sui file dal docker_ +_L'ultimo comando esegue eth-security-toolbox in un docker che ha accesso alla tua directory corrente. Puoi modificare i file dal tuo host ed eseguire gli strumenti sui file dal docker_ -Nel docker, esegui: +All'interno di docker, esegui: ```bash -solc-select 0.5.11 -cd /home/training +echidna-test ``` ### Binario {#binary} [https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) -## Introduzione al fuzzing basato sulla proprietà {#introduction-to-property-based-fuzzing} +## Introduzione al fuzzing basato sulle proprietà {#introduction-to-property-based-fuzzing} -Echidna è un fuzzer basato sulla proprietà, che abbiamo descritto nei nostri post del blog precedenti ([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/), [2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/), [3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/)). +Echidna è un fuzzer basato sulle proprietà, che abbiamo descritto nei nostri precedenti post del blog ([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/), [2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/), [3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/)). ### Fuzzing {#fuzzing} -Il [fuzzing](https://wikipedia.org/wiki/Fuzzing) è una ben nota tecnica nella community della sicurezza. Consiste nella generazione di input più o meno randomici, per trovare i bug nel programma. I fuzzer per il software tradizionale (come [AFL](http://lcamtuf.coredump.cx/afl/) o [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) sono noti per essere strumenti efficienti per trovare i bug. +Il [Fuzzing](https://wikipedia.org/wiki/Fuzzing) è una tecnica ben nota nella community della sicurezza. Consiste nel generare input più o meno casuali per trovare bug nel programma. I fuzzer per i software tradizionali (come [AFL](http://lcamtuf.coredump.cx/afl/) o [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) sono noti per essere strumenti efficienti per trovare bug. -Oltre alla generazione di input puramente casuale, esistono molte tecniche e strategie per generare input validi, tra cui: +Oltre alla generazione puramente casuale di input, esistono molte tecniche e strategie per generare buoni input, tra cui: -- Ottenere feedback da ogni esecuzione e generazione della guida durante l'utilizzo. Ad esempio, se un input appena generato conduce alla scoperta di un nuovo percorso, può avere senso generare nuovi input vicini a esso. -- Generare l'input rispettando un vincolo strutturale. Ad esempio, se il tuo input contiene un'intestazione con un checksum, avrà senso lasciare che il fuzzer generi input a convalida del checksum. -- Usare input noti per generarne di nuovi: se hai accesso a un grande dataset di input validi, il tuo fuzzer può generarne di nuovi, anziché iniziare da zero la generazione. In genere sono detti _seed_. +- Ottenere feedback da ogni esecuzione e guidare la generazione utilizzandolo. Ad esempio, se un input appena generato porta alla scoperta di un nuovo percorso, può avere senso generare nuovi input vicini ad esso. +- Generare l'input rispettando un vincolo strutturale. Ad esempio, se il tuo input contiene un'intestazione con un checksum, avrà senso lasciare che il fuzzer generi input che convalidano il checksum. +- Utilizzare input noti per generare nuovi input: se hai accesso a un ampio set di dati di input validi, il tuo fuzzer può generare nuovi input da essi, piuttosto che iniziare la sua generazione da zero. Questi sono solitamente chiamati _seed_ (semi). -### Fuzzing basato sulla proprietà {#property-based-fuzzing} +### Fuzzing basato sulle proprietà {#property-based-fuzzing} -Echidna appartiene a una famiglia specifica di fuzzer: il fuzzing basato sulla proprietà, ampiamente ispirato da [QuickCheck](https://wikipedia.org/wiki/QuickCheck). In contrasto al fuzzer classico che prova a trovare i crash, Echidna prova a rompere le invarianti definite dall'utente. +Echidna appartiene a una famiglia specifica di fuzzer: il fuzzing basato sulle proprietà, fortemente ispirato a [QuickCheck](https://wikipedia.org/wiki/QuickCheck). A differenza dei fuzzer classici che cercheranno di trovare crash, Echidna cercherà di infrangere gli invarianti definiti dall'utente. -Negli smart contract, le invarianti sono funzioni di Solidity, che possono rappresentare ogni stato non corretto o non valido raggiungibile dal contratto, tra cui: +Nei contratti intelligenti, gli invarianti sono funzioni Solidity, che possono rappresentare qualsiasi stato errato o non valido che il contratto può raggiungere, tra cui: -- Controllo d'accesso errato: il malintenzionato diventa il proprietario del contratto. -- Macchina di stato errata: i token sono trasferibili mentre il contratto è in pausa. -- Aritmetica errata: l'utente può sottovalutare il proprio saldo e ottenere token gratuiti illimitati. +- Controllo degli accessi errato: l'attaccante è diventato il proprietario del contratto. +- Macchina a stati errata: i token possono essere trasferiti mentre il contratto è in pausa. +- Aritmetica errata: l'utente può mandare in underflow il proprio saldo e ottenere token gratuiti illimitati. ### Testare una proprietà con Echidna {#testing-a-property-with-echidna} -Vedremo come testare un contratto intelligente con Echidna. L'obiettivo è il seguente smart contract [`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol): +Vedremo come testare un contratto intelligente con Echidna. L'obiettivo è il seguente contratto intelligente [`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol): ```solidity contract Token{ @@ -84,26 +78,26 @@ contract Token{ } ``` -Presumeremo che questo token debba avere le seguenti proprietà: +Faremo l'ipotesi che questo token debba avere le seguenti proprietà: -- Chiunque può avere al massimo 1.000 token -- Il token non è trasferibile (non è un token ERC20) +- Chiunque può avere al massimo 1000 token +- Il token non può essere trasferito (non è un token ERC20) -### Scrivi una proprietà {#write-a-property} +### Scrivere una proprietà {#write-a-property} -Le proprietà di Echidna sono funzioni di Solidity. Una proprietà deve: +Le proprietà di Echidna sono funzioni Solidity. Una proprietà deve: -- Non avere alcun argomento -- Restituire `true` se va a buon fine -- Avere un nome che inizia per `echidna` +- Non avere argomenti +- Restituire `true` se ha successo +- Avere il suo nome che inizia con `echidna` -Echidna: +Echidna farà quanto segue: - Genererà automaticamente transazioni arbitrarie per testare la proprietà. -- Segnalare ogni transazione che fa sì che una proprietà restituisca `false` o generi un errore. -- Scartare l'effetto collaterale quando si chiama una proprietà (ad es. se la proprietà cambia una variabile di stato, viene scartata dopo il test) +- Segnalerà qualsiasi transazione che porta una proprietà a restituire `false` o a generare un errore. +- Scarterà gli effetti collaterali quando si chiama una proprietà (ad es., se la proprietà modifica una variabile di stato, viene scartata dopo il test) -La seguente proprietà controlla che il chiamante non abbia più di 1.000 token: +La seguente proprietà verifica che il chiamante non abbia più di 1000 token: ```solidity function echidna_balance_under_1000() public view returns(bool){ @@ -111,7 +105,7 @@ function echidna_balance_under_1000() public view returns(bool){ } ``` -Usa l'eredità per separare il contratto dalle proprietà: +Usa l'ereditarietà per separare il tuo contratto dalle tue proprietà: ```solidity contract TestToken is Token{ @@ -123,20 +117,20 @@ contract TestToken is Token{ [`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol) implementa la proprietà ed eredita dal token. -### Avviare un contratto {#initiate-a-contract} +### Inizializzare un contratto {#initiate-a-contract} -Echidna necessita di un [costruttore](/developers/docs/smart-contracts/anatomy/#constructor-functions) senza argomento. Se il tuo contratto necessita di un'inizializzazione specifica, devi farlo nel costruttore. +Echidna ha bisogno di un [costruttore](/developers/docs/smart-contracts/anatomy/#constructor-functions) senza argomenti. Se il tuo contratto necessita di un'inizializzazione specifica, devi farla nel costruttore. -Esistono degli indirizzi specifici in Echidna: +Ci sono alcuni indirizzi specifici in Echidna: -- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` per chiamare il costruttore. -- `0x10000`, `0x20000`, e `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` per chiamare casualmente le altre funzioni. +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` che chiama il costruttore. +- `0x10000`, `0x20000` e `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` che chiamano casualmente le altre funzioni. -Non necessitiamo di alcuna inizializzazione particolare nel nostro esempio corrente, di conseguenza il nostro costruttore è vuoto. +Non abbiamo bisogno di alcuna inizializzazione particolare nel nostro esempio attuale, di conseguenza il nostro costruttore è vuoto. ### Eseguire Echidna {#run-echidna} -Echidna è avviato con: +Echidna viene avviato con: ```bash echidna-test contract.sol @@ -150,34 +144,28 @@ echidna-test contract.sol --contract MyContract ### Riepilogo: Testare una proprietà {#summary-testing-a-property} -Di seguito è riepilogata l'esecuzione di Echidna nel nostro esempio: +Quanto segue riassume l'esecuzione di echidna sul nostro esempio: -```solidity -contract TestToken is Token{ - constructor() public {} - function echidna_balance_under_1000() public view returns(bool){ - return balances[msg.sender] <= 1000; - } - } +```bash +echidna-test token.sol ``` -```bash -echidna-test testtoken.sol --contract TestToken +```text ... - echidna_balance_under_1000: failed!💥 - Call sequence, shrinking (1205/5000): + Call sequence, shrinking (2596/5000): airdrop() backdoor() ... ``` -Echidna ha individuato che la proprietà è violata se `backdoor` viene chiamata. +Echidna ha scoperto che la proprietà viene violata se viene chiamato `backdoor`. ## Filtrare le funzioni da chiamare durante una campagna di fuzzing {#filtering-functions-to-call-during-a-fuzzing-campaign} -Vedremo come filtrare le funzioni da sottoporre a fuzzing. L'obiettivo è il seguente smart contract: +Vedremo come filtrare le funzioni da sottoporre a fuzzing. +L'obiettivo è il seguente contratto intelligente: ```solidity contract C { @@ -203,7 +191,7 @@ contract C { state3 = true; } - function i() public { + function i() public { require(state3); state4 = true; } @@ -228,35 +216,37 @@ contract C { } ``` -Questo piccolo esempio forza Echidna a trovare una certa sequenza di transazioni per modificare una variabile di stato. Ciò è difficile per un fuzzer (si consiglia di usare uno strumento di esecuzione simbolica come [Manticore](https://github.com/trailofbits/manticore)). Possiamo eseguire Echidna per verificarlo: +Questo piccolo esempio forza Echidna a trovare una certa sequenza di transazioni per modificare una variabile di stato. +Questo è difficile per un fuzzer (si consiglia di utilizzare uno strumento di esecuzione simbolica come [Manticore](https://github.com/trailofbits/manticore)). +Possiamo eseguire Echidna per verificarlo: ```bash echidna-test multi.sol ... echidna_state4: passed! 🎉 -Seed: -3684648582249875403 ``` -### Funzioni di filtraggio {#filtering-functions} +### Filtrare le funzioni {#filtering-functions} -Echidna fa fatica a trovare la sequenza corretta per testare questo contratto perché le due funzioni di reset (`reset1` e `reset2`) imposteranno tutte le variabili di stato su `false`. Tuttavia, possiamo usare una funzionalità speciale di Echidna per inserire nella blacklist la funzione di reset o nella whitelist solo le funzioni `f`, `g`, `h` e `i`. +Echidna ha difficoltà a trovare la sequenza corretta per testare questo contratto perché le due funzioni di ripristino (`reset1` e `reset2`) imposteranno tutte le variabili di stato su `false`. +Tuttavia, possiamo utilizzare una funzionalità speciale di Echidna per inserire nella blacklist la funzione di ripristino o per inserire nella whitelist solo le funzioni `f`, `g`, `h` e `i`. -Per inserire le funzioni nella blacklist, possiamo usare questo file di configurazione: +Per inserire le funzioni nella blacklist, possiamo utilizzare questo file di configurazione: ```yaml filterBlacklist: true filterFunctions: ["reset1", "reset2"] ``` -Un altro approccio per filtrare le funzioni è elencare quelle nella whitelist. Per farlo, possiamo usare questo file di configurazione: +Un altro approccio per filtrare le funzioni è elencare le funzioni nella whitelist. Per farlo, possiamo utilizzare questo file di configurazione: ```yaml filterBlacklist: false filterFunctions: ["f", "g", "h", "i"] ``` -- `filterBlacklist` è `true` di default. -- Il filtraggio sarà eseguito solo per nome (senza parametri). Se hai `f()` e `f(uint256)`, il filtro `"f"` abbinerà entrambe le funzioni. +- `filterBlacklist` è `true` per impostazione predefinita. +- Il filtraggio verrà eseguito solo per nome (senza parametri). Se hai `f()` e `f(uint256)`, il filtro `"f"` corrisponderà a entrambe le funzioni. ### Eseguire Echidna {#run-echidna-1} @@ -265,7 +255,7 @@ Per eseguire Echidna con un file di configurazione `blacklist.yaml`: ```bash echidna-test multi.sol --config blacklist.yaml ... -echidna_state4: failed! +echidna_state4: failed!💥 Call sequence: f(12) g(8) @@ -277,7 +267,7 @@ Echidna troverà la sequenza di transazioni per falsificare la proprietà quasi ### Riepilogo: Filtrare le funzioni {#summary-filtering-functions} -Echidna può inserire le funzioni di blacklist o whitelist da chiamare durante una campagna di fuzzing usando: +Echidna può inserire nella blacklist o nella whitelist le funzioni da chiamare durante una campagna di fuzzing utilizzando: ```yaml filterBlacklist: true @@ -289,11 +279,11 @@ echidna-test contract.sol --config config.yaml ... ``` -Echidna avvia una campagna di fuzzing inserendo `f1`, `f2` e `f3` nella blacklist o solo chiamandole, in base al valore del booleano `filterBlacklist`. +Echidna avvia una campagna di fuzzing inserendo nella blacklist `f1`, `f2` e `f3` o chiamando solo queste, in base al valore del booleano `filterBlacklist`. -## Come testare l'affermazione di Solidity con Echidna {#how-to-test-soliditys-assert-with-echidna} +## Come testare l'assert di Solidity con Echidna {#how-to-test-soliditys-assert-with-echidna} -In questo breve tutorial, mostreremo come usare Echidna per testare il controllo dell'affermazione nei contratti. Supponiamo di avere un contratto come questo: +In questo breve tutorial, mostreremo come utilizzare Echidna per testare il controllo delle asserzioni nei contratti. Supponiamo di avere un contratto come questo: ```solidity contract Incrementor { @@ -310,7 +300,7 @@ contract Incrementor { ### Scrivere un'asserzione {#write-an-assertion} -Vogliamo assicurarci che `tmp` sia minore o uguale al `counter` dopo averne restituita la differenza. Potremmo scrivere una proprietà di Echidna, ma dovremmo memorizzare da qualche parte il valore `tmp`. Invece, potremmo usare un'asserzione come questa: +Vogliamo assicurarci che `tmp` sia minore o uguale a `counter` dopo aver restituito la sua differenza. Potremmo scrivere una proprietà Echidna, ma avremmo bisogno di memorizzare il valore `tmp` da qualche parte. Invece, potremmo usare un'asserzione come questa: ```solidity contract Incrementor { @@ -327,31 +317,29 @@ contract Incrementor { ### Eseguire Echidna {#run-echidna-2} -Per abilitare il test di insuccesso dell'asserzione, crea un [file di configurazione di Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: +Per abilitare il test di fallimento dell'asserzione, crea un [file di configurazione di Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: ```yaml checkAsserts: true ``` -Quando eseguiamo questo contratto in Echidna, otteniamo i risultati previsti: +Quando eseguiamo questo contratto in Echidna, otteniamo i risultati attesi: ```bash echidna-test assert.sol --config config.yaml -Analyzing contract: assert.sol:Incrementor +Analyzing contract: /tmp/assert.sol:Incrementor assertion in inc: failed!💥 Call sequence, shrinking (2596/5000): inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) - -Seed: 1806480648350826486 ``` -Come puoi vedere, Echidna segnala alcuni insuccessi dell'asserzione nella funzione `inc`. Aggiungere più di un'asserzione per funzione è possibile, ma Echidna non può dire quale sia fallita. +Come puoi vedere, Echidna segnala alcuni fallimenti di asserzione nella funzione `inc`. È possibile aggiungere più di un'asserzione per funzione, ma Echidna non può dire quale asserzione è fallita. ### Quando e come usare le asserzioni {#when-and-how-use-assertions} -Le asserzioni sono utilizzabili come alternative a proprietà esplicite, specialmente se le condizioni per il controllo sono direttamente correlate all'uso corretto della stessa operazione `f`. Aggiungere le asserzioni dopo il codice farà sì che il controllo abbia luogo immediatamente dopo la sua esecuzione: +Le asserzioni possono essere utilizzate come alternative alle proprietà esplicite, specialmente se le condizioni da verificare sono direttamente correlate all'uso corretto di qualche operazione `f`. L'aggiunta di asserzioni dopo del codice imporrà che il controllo avvenga immediatamente dopo la sua esecuzione: ```solidity function f(..) public { @@ -360,10 +348,9 @@ function f(..) public { assert (condition); ... } - ``` -Al contrario, l'utilizzo di una proprietà esplicita di Echidna eseguirà casualmente le transazioni e non esiste alcun metodo semplice per imporre esattamente quando verrà controllata. È comunque possibile sfruttare questa scappatoia: +Al contrario, l'utilizzo di una proprietà echidna esplicita eseguirà casualmente le transazioni e non c'è un modo semplice per imporre esattamente quando verrà verificata. È comunque possibile utilizzare questa soluzione alternativa: ```solidity function echidna_assert_after_f() public returns (bool) { @@ -372,22 +359,22 @@ function echidna_assert_after_f() public returns (bool) { } ``` -Tuttavia, esistono dei problemi: +Tuttavia, ci sono alcuni problemi: - Fallisce se `f` è dichiarata come `internal` o `external`. -- Non è chiaro quali argomenti dovrebbero essere usati per chiamare `f`. -- Se `f` si ripristina, la proprietà fallirà. +- Non è chiaro quali argomenti debbano essere utilizzati per chiamare `f`. +- Se `f` esegue un revert, la proprietà fallirà. -In generale, consigliamo di seguire i [consigli di John Regehr](https://blog.regehr.org/archives/1091) su come usare le affermazioni: +In generale, consigliamo di seguire la [raccomandazione di John Regehr](https://blog.regehr.org/archives/1091) su come utilizzare le asserzioni: -- Non forzare alcun effetto collaterale durante il controllo dell'affermazione. Ad esempio: `assert(ChangeStateAndReturn() == 1)` -- Non affermare dichiarazioni ovvie. Ad esempio `assert(var >= 0)` dove `var` è dichiarata come `uint`. +- Non forzare alcun effetto collaterale durante il controllo dell'asserzione. Ad esempio: `assert(ChangeStateAndReturn() == 1)` +- Non asserire affermazioni ovvie. Ad esempio `assert(var >= 0)` dove `var` è dichiarata come `uint`. -Infine, consigliamo di **non usare** `require` al posto di `assert`, poiché Echidna non potrà rilevarlo (ma il contratto si ripristinerà ugualmente). +Infine, per favore **non usare** `require` invece di `assert`, poiché Echidna non sarà in grado di rilevarlo (ma il contratto verrà comunque annullato). -### Riepilogo: Controllo dell'asserzione {#summary-assertion-checking} +### Riepilogo: Controllo delle asserzioni {#summary-assertion-checking} -Quanto segue riepiloga l'esecuzione di Echidna nel nostro esempio: +Quanto segue riassume l'esecuzione di echidna sul nostro esempio: ```solidity contract Incrementor { @@ -404,21 +391,19 @@ contract Incrementor { ```bash echidna-test assert.sol --config config.yaml -Analyzing contract: assert.sol:Incrementor +Analyzing contract: /tmp/assert.sol:Incrementor assertion in inc: failed!💥 Call sequence, shrinking (2596/5000): inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) - -Seed: 1806480648350826486 ``` -Echidna ha trovato che l'asserzione in `inc` può fallire se questa funzione è chiamata diverse volte con grandi argomenti. +Echidna ha scoperto che l'asserzione in `inc` può fallire se questa funzione viene chiamata più volte con argomenti di grandi dimensioni. ## Raccogliere e modificare un corpus di Echidna {#collecting-and-modifying-an-echidna-corpus} -Vedremo come raccogliere e usare un corpus di transazioni con Echidna. L'obiettivo è il seguente smart contract [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): +Vedremo come raccogliere e utilizzare un corpus di transazioni con Echidna. L'obiettivo è il seguente contratto intelligente [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): ```solidity contract C { @@ -426,7 +411,8 @@ contract C { function magic(uint magic_1, uint magic_2, uint magic_3, uint magic_4) public { require(magic_1 == 42); require(magic_2 == 129); - require(magic_3 == magic_4+333); + require(magic_3 == 333); + require(magic_4 == 0); value_found = true; return; } @@ -438,22 +424,20 @@ contract C { } ``` -Questo piccolo esempio forza Echidna a trovare una certi valori per modificare una variabile di stato, il che è difficile per un fuzzer (si consiglia di usare uno strumento d'esecuzione simbolica come [Manticore](https://github.com/trailofbits/manticore)). Possiamo eseguire Echidna per verificarlo: +Questo piccolo esempio forza Echidna a trovare determinati valori per modificare una variabile di stato. Questo è difficile per un fuzzer (si consiglia di utilizzare uno strumento di esecuzione simbolica come [Manticore](https://github.com/trailofbits/manticore)). +Possiamo eseguire Echidna per verificarlo: ```bash echidna-test magic.sol ... - echidna_magic_values: passed! 🎉 - -Seed: 2221503356319272685 ``` -Tuttavia, possiamo comunque usare Echidna per raccogliere il corpus mentre si esegue questa campagna di fuzzing. +Tuttavia, possiamo ancora utilizzare Echidna per raccogliere il corpus durante l'esecuzione di questa campagna di fuzzing. ### Raccogliere un corpus {#collecting-a-corpus} -Per abilitare la raccolta, crea la cartella di un corpus: +Per abilitare la raccolta del corpus, crea una directory per il corpus: ```bash mkdir corpus-magic @@ -472,62 +456,37 @@ Ora possiamo eseguire il nostro strumento e controllare il corpus raccolto: echidna-test magic.sol --config config.yaml ``` -Echidna non è ancora in grado di trovare i valori magici corretti, ma possiamo dare un'occhiata al corpus raccolto. Ad esempio, uno di questi file era: +Echidna non riesce ancora a trovare i valori magici corretti, ma possiamo dare un'occhiata al corpus che ha raccolto. +Ad esempio, uno di questi file era: ```json [ { - "_gas'": "0xffffffff", - "_delay": ["0x13647", "0xccf6"], - "_src": "00a329c0648769a73afac7f9381e08fb43dbea70", - "_dst": "00a329c0648769a73afac7f9381e08fb43dbea72", + "_m": "magic(uint256,uint256,uint256,uint256)", + "_args": [ + "0x4fa567653f26f941", + "0x227c946b75c6b9", + "0x1176a2410b466f71", + "0xbf6b4ea0ceebdce8" + ], + "_gas": "0x50911", "_value": "0x0", - "_call": { - "tag": "SolCall", - "contents": [ - "magic", - [ - { - "contents": [ - 256, - "93723985220345906694500679277863898678726808528711107336895287282192244575836" - ], - "tag": "AbiUInt" - }, - { - "contents": [256, "334"], - "tag": "AbiUInt" - }, - { - "contents": [ - 256, - "68093943901352437066264791224433559271778087297543421781073458233697135179558" - ], - "tag": "AbiUInt" - }, - { - "tag": "AbiUInt", - "contents": [256, "332"] - } - ] - ] - }, - "_gasprice'": "0xa904461f1" + "_delay": ["0x1364", "0xccfa"] } ] ``` -Chiaramente, questo input non innescherà il fallimento nella nostra proprietà. Tuttavia, nel prossimo passaggio, vedremo come modificarlo a tale scopo. +Chiaramente, questo input non innescherà il fallimento nella nostra proprietà. Tuttavia, nel passaggio successivo, vedremo come modificarlo a tale scopo. -### Seeding di un corpus {#seeding-a-corpus} +### Seminare un corpus {#seeding-a-corpus} -Echidna necessita di un po' di aiuto per poter affrontare la funzione `magic`. Copieremo e modificheremo l'input per usare parametri idonei a tale scopo: +Echidna ha bisogno di un po' di aiuto per gestire la funzione `magic`. Copieremo e modificheremo l'input per utilizzare parametri adatti ad essa: ```bash -cp corpus/2712688662897926208.txt corpus/new.txt +cp corpus/covered.1560453495.html new.txt ``` -Modificheremo `new.txt` per chiamare `magic(42,129,333,0)`. Ora possiamo ri-eseguire Echidna: +Modificheremo `new.txt` per chiamare `magic(42,129,333,0)`. Ora possiamo eseguire nuovamente Echidna: ```bash echidna-test magic.sol --config config.yaml @@ -535,36 +494,23 @@ echidna-test magic.sol --config config.yaml echidna_magic_values: failed!💥 Call sequence: magic(42,129,333,0) - - -Unique instructions: 142 -Unique codehashes: 1 -Seed: -7293830866560616537 - ``` -Questa volta, ha scoperto che la proprietà è immediatamente violata. +Questa volta, ha scoperto che la proprietà viene violata immediatamente. -## Individuare le transazioni ad alto consumo di gas {#finding-transactions-with-high-gas-consumption} +## Trovare transazioni con un elevato consumo di gas {#finding-transactions-with-high-gas-consumption} -Vedremo come individuare le transazioni con un alto consumo di gas con Echidna. L'obiettivo è il seguente smart contract: +Vedremo come trovare le transazioni con un elevato consumo di gas con Echidna. L'obiettivo è il seguente contratto intelligente: ```solidity contract C { uint state; - function expensive(uint8 times) internal { + function expensive(uint8 times) public { for(uint8 i=0; i < times; i++) state = state + i; } - function f(uint x, uint y, uint8 times) public { - if (x == 42 && y == 123) - expensive(times); - else - state = 0; - } - function echidna_test() public returns (bool) { return true; } @@ -572,19 +518,18 @@ contract C { } ``` -Qui `expensive` può avere un gran consumo di gas. +Qui `expensive` può avere un grande consumo di gas. -Attualmente, Echidna necessità sempre di una proprietà da testare: qui `echidna_test` restituisce sempre `true`. Possiamo eseguire Echidna per verificarlo: +Attualmente, Echidna ha sempre bisogno di una proprietà da testare: qui `echidna_test` restituisce sempre `true`. +Possiamo eseguire Echidna per verificarlo: -``` +```bash echidna-test gas.sol ... echidna_test: passed! 🎉 - -Seed: 2320549945714142710 ``` -### Misurare il Consumo di Gas {#measuring-gas-consumption} +### Misurare il consumo di gas {#measuring-gas-consumption} Per abilitare il consumo di gas con Echidna, crea un file di configurazione `config.yaml`: @@ -592,7 +537,7 @@ Per abilitare il consumo di gas con Echidna, crea un file di configurazione `con estimateGas: true ``` -In questo esempio, ridurremo anche le dimensioni della sequenza di transazione per facilitare la comprensione dei risultati: +In questo esempio, ridurremo anche la dimensione della sequenza di transazioni per rendere i risultati più facili da comprendere: ```yaml seqLen: 2 @@ -601,86 +546,192 @@ estimateGas: true ### Eseguire Echidna {#run-echidna-3} -Una volta creato il file di configurazione, possiamo eseguire Echidna come segue: +Una volta creato il file di configurazione, possiamo eseguire Echidna in questo modo: ```bash echidna-test gas.sol --config config.yaml ... echidna_test: passed! 🎉 -f used a maximum of 1333608 gas - Call sequence: - f(42,123,249) Gas price: 0x10d5733f0a Time delay: 0x495e5 Block delay: 0x88b2 - -Unique instructions: 157 -Unique codehashes: 1 -Seed: -325611019680165325 +fuzzing time: 2.70s +C.expensive(uint8) with gas 5463708: + expensive(255) + expensive(255) ``` - Il gas mostrato è una stima fornita da [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-). -### Filtrare le Chiamate di Riduzione del Gas {#filtering-out-gas-reducing-calls} +### Filtrare le chiamate che riducono il gas {#filtering-out-gas-reducing-calls} -Il tutorial precedente sulle **funzioni di filtraggio da chiamare durante una campagna di fuzzing**, mostra come rimuovere alcune funzioni dal tuo test. -Questo può esser critico per ottenere una stima accurata del gas. Considera l'esempio seguente: +Il tutorial su **filtrare le funzioni da chiamare durante una campagna di fuzzing** qui sopra mostra come rimuovere alcune funzioni dai tuoi test. +Questo può essere fondamentale per ottenere una stima accurata del gas. +Considera il seguente esempio: ```solidity contract C { - address [] addrs; + address[] addrs; + function push(address a) public { addrs.push(a); } + function pop() public { addrs.pop(); } + function clear() public{ addrs.length = 0; } + function check() public{ for(uint256 i = 0; i < addrs.length; i++) for(uint256 j = i+1; j < addrs.length; j++) if (addrs[i] == addrs[j]) addrs[j] = address(0x0); } + function echidna_test() public returns (bool) { return true; } } ``` -Se Echidna può chiamare tutte le funzioni, non troverà facilmente le transazioni a costo elevato di gas: +Se Echidna può chiamare tutte le funzioni, non troverà facilmente transazioni con un costo del gas elevato: -``` -echidna-test pushpop.sol --config config.yaml -... -pop used a maximum of 10746 gas -... -check used a maximum of 23730 gas -... -clear used a maximum of 35916 gas +```bash +echidna-test gas.sol --config config.yaml ... -push used a maximum of 40839 gas -``` - -Questo perché il costo dipende dalla dimensione di `addrs` e le chiamate casuali tendono a lasciare l'array quasi vuoto. L'inserimento in blacklist di `pop` e `clear`, tuttavia, fornisce risultati molto più efficaci: +C.check() with gas 733189: + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + check() +``` + +Questo perché il costo dipende dalla dimensione di `addrs` e le chiamate casuali tendono a lasciare l'array quasi vuoto. +Inserire nella blacklist `pop` e `clear`, tuttavia, ci dà risultati molto migliori: ```yaml filterBlacklist: true filterFunctions: ["pop", "clear"] ``` -``` -echidna-test pushpop.sol --config config.yaml -... -push used a maximum of 40839 gas +```bash +echidna-test gas.sol --config config.yaml ... -check used a maximum of 1484472 gas -``` - -### Sommario: Individuare le transazioni ad alto consumo di gas {#summary-finding-transactions-with-high-gas-consumption} - -Echidna può trovare le transazioni ad alto consumo di gas usando l'opzione di configurazione `estimateGas`: +C.check() with gas 5082692: + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + push(0x0000000000000000000000000000000000000000) + check() +``` + +### Riepilogo: Trovare transazioni con un elevato consumo di gas {#summary-finding-transactions-with-high-gas-consumption} + +Echidna può trovare transazioni con un elevato consumo di gas utilizzando l'opzione di configurazione `estimateGas`: ```yaml estimateGas: true @@ -691,4 +742,4 @@ echidna-test contract.sol --config config.yaml ... ``` -Echidna segnalerà una sequenza con il consumo massimo di gas per ogni funzione, una volta terminata la campagna di fuzzing. +Echidna segnalerà una sequenza con il massimo consumo di gas per ogni funzione, una volta terminata la campagna di fuzzing. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/it/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md index d3e43595e27..65acdb714f8 100644 --- a/public/content/translations/it/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -1,54 +1,50 @@ --- -title: Come usare Manticore per trovare bug negli Smart Contract -description: Come usare Manticore per trovare automaticamente bug negli Smart Contract +title: Come usare Manticore per trovare bug nei contratti intelligenti +description: Come usare Manticore per trovare automaticamente bug nei contratti intelligenti author: Trailofbits lang: it tags: - - "solidity" - - "contratti intelligenti" - - "sicurezza" - - "test" - - "verifica formale" + ["Solidity", "contratti intelligenti", "sicurezza", "test", "verifica formale"] skill: advanced -breadcrumb: "Manticore" +breadcrumb: Manticore published: 2020-01-13 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore --- -L'obiettivo di questo tutorial è mostrare come usare Manticore per trovare automaticamente bug negli Smart Contract. +Lo scopo di questo tutorial è mostrare come usare Manticore per trovare automaticamente bug nei contratti intelligenti. ## Installazione {#installation} -Manticore richiede >= Python 3.6. Può essere installato tramite pip o usando docker. +Manticore richiede python >= 3.6. Può essere installato tramite pip o usando docker. -### Manticore con docker {#manticore-through-docker} +### Manticore tramite docker {#manticore-through-docker} ```bash docker pull trailofbits/eth-security-toolbox docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox ``` -_L'ultimo comando esegue eth-security-toolbox in un docker avente accesso alla tua directory corrente. Puoi cambiare i file dal tuo host ed eseguire gli strumenti sui file dal docker_ +_L'ultimo comando esegue eth-security-toolbox in un docker che ha accesso alla tua directory corrente. Puoi modificare i file dal tuo host ed eseguire gli strumenti sui file dal docker_ -In docker, esegui: +All'interno di docker, esegui: ```bash solc-select 0.5.11 cd /home/trufflecon/ ``` -### Manticore con pip {#manticore-through-pip} +### Manticore tramite pip {#manticore-through-pip} ```bash pip3 install --user manticore ``` -È consigliato solc 0.5.11. +Si consiglia solc 0.5.11. -### Esecuzione di uno script {#running-a-script} +### Eseguire uno script {#running-a-script} -Per eseguire uno script Python con Python 3: +Per eseguire uno script python con python 3: ```bash python3 script.py @@ -56,18 +52,18 @@ python3 script.py ## Introduzione all'esecuzione simbolica dinamica {#introduction-to-dynamic-symbolic-execution} -### Esecuzione simbolica dinamica in pillole {#dynamic-symbolic-execution-in-a-nutshell} +### L'esecuzione simbolica dinamica in breve {#dynamic-symbolic-execution-in-a-nutshell} -L'esecuzione simbolica dinamica (DSE) è una tecnica di analisi di un programma che esplora uno spazio di stati con un alto grado di consapevolezza semantica. Questa tecnica si basa sulla scoperta dei "percorsi del programma", rappresentati da formule matematiche dette `predicati di percorso`. Concettualmente, opera su predicati di percorso in due passaggi: +L'esecuzione simbolica dinamica (DSE) è una tecnica di analisi dei programmi che esplora uno spazio degli stati con un alto grado di consapevolezza semantica. Questa tecnica si basa sulla scoperta di "percorsi del programma", rappresentati come formule matematiche chiamate `path predicates` (predicati di percorso). Concettualmente, questa tecnica opera sui predicati di percorso in due passaggi: -1. Vengono costruiti usando vincoli nell'input del programma. +1. Vengono costruiti usando vincoli sull'input del programma. 2. Vengono usati per generare input del programma che causeranno l'esecuzione dei percorsi associati. -Questo approccio non produce falsi positivi nel senso che tutti gli stati del programma identificati possono essere attivati durante l'esecuzione concreta. Per esempio, se le analisi trova un overflow di valori interi, è garantito che sia riproducibile. +Questo approccio non produce falsi positivi nel senso che tutti gli stati del programma identificati possono essere attivati durante l'esecuzione concreta. Ad esempio, se l'analisi trova un overflow di interi, è garantito che sia riproducibile. ### Esempio di predicato di percorso {#path-predicate-example} -Per avere un'idea di funziona la DSE, considera il seguente esempio: +Per avere un'idea di come funziona la DSE, considera il seguente esempio: ```solidity function f(uint a){ @@ -84,32 +80,32 @@ Poiché `f()` contiene due percorsi, una DSE costruirà due diversi predicati di - Percorso 1: `a == 65` - Percorso 2: `Not (a == 65)` -Ogni predicato di percorso è una formula matematica che può essere passata a un cosiddetto [risolutore SMT](https://wikipedia.org/wiki/Satisfiability_modulo_theories), che proverà a risolvere l'equazione. Per il `Percorso 1`, il risolutore dirà che il percorso può essere esplorato con `a = 65`. Per il `Percorso 2`, il risolutore può assegnare ad `a` tutti i valori diversi da 65, per esempio `a = 0`. +Ogni predicato di percorso è una formula matematica che può essere fornita a un cosiddetto [risolutore SMT](https://wikipedia.org/wiki/Satisfiability_modulo_theories), che cercherà di risolvere l'equazione. Per il `Percorso 1`, il risolutore dirà che il percorso può essere esplorato con `a = 65`. Per il `Percorso 2`, il risolutore può dare ad `a` qualsiasi valore diverso da 65, ad esempio `a = 0`. -### Verifica delle proprietà {#verifying-properties} +### Verificare le proprietà {#verifying-properties} -Manticore permette un controllo completo su tutta l'esecuzione di ogni percorso. Di conseguenza, consente di aggiungere vincoli arbitrari quasi a tutto. Questo controllo permette di creare proprietà sul contratto. +Manticore consente un controllo completo su tutta l'esecuzione di ogni percorso. Di conseguenza, ti permette di aggiungere vincoli arbitrari a quasi tutto. Questo controllo consente la creazione di proprietà sul contratto. -Considera l'esempio seguente: +Considera il seguente esempio: ```solidity function unsafe_add(uint a, uint b) returns(uint c){ - c = a + b; // no overflow protection + c = a + b; // nessuna protezione da overflow return c; } ``` -Qui c'è un solo percorso da esplorare nella funzione: +Qui c'è solo un percorso da esplorare nella funzione: - Percorso 1: `c = a + b` -Usando Manticore, si può controllare l'overflow e aggiungere vincoli al predicato di percorso: +Usando Manticore, puoi controllare l'overflow e aggiungere vincoli al predicato di percorso: - `c = a + b AND (c < a OR c < b)` -Se è possibile trovare una valutazione di `a` e `b` per cui il predicato di percorso qui sopra sia fattibile, significa che è stato trovato un overflow. Ad esempio, il risolutore può generare l'input `a = 10 , b = MAXUINT256`. +Se è possibile trovare una valutazione di `a` e `b` per cui il predicato di percorso sopra è fattibile, significa che hai trovato un overflow. Ad esempio, il risolutore può generare l'input `a = 10 , b = MAXUINT256`. -Se consideri una versione fissa: +Se consideri una versione corretta: ```solidity function safe_add(uint a, uint b) returns(uint c){ @@ -120,17 +116,17 @@ function safe_add(uint a, uint b) returns(uint c){ } ``` -La formula associata al controllo dell'overflow sarebbe: +La formula associata con il controllo dell'overflow sarebbe: - `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` -Questa formula non è risolvibile; in altri mondi questa è una **prova** che in `safe_add`, `c` aumenterà sempre. +Questa formula non può essere risolta; in altre parole questa è una **prova** che in `safe_add`, `c` aumenterà sempre. -La DSE è quindi uno strumento potente, che può verificare i vincoli arbitrari nel codice. +La DSE è quindi uno strumento potente, che può verificare vincoli arbitrari sul tuo codice. ## Esecuzione in Manticore {#running-under-manticore} -Vedremo come esplorare uno Smart Contract con l'API Manticore. La destinazione è il seguente Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): +Vedremo come esplorare un contratto intelligente con l'API di Manticore. L'obiettivo è il seguente contratto intelligente [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): ```solidity pragma solidity >=0.4.24 <0.6.0; @@ -144,15 +140,15 @@ contract Simple { } ``` -### Esplorazione indipendente {#run-a-standalone-exploration} +### Eseguire un'esplorazione autonoma {#run-a-standalone-exploration} -Manticore può essere eseguito direttamente sullo Smart Contract con il comando seguente (`project` può essere un file Solidity o una directory del progetto): +Puoi eseguire Manticore direttamente sul contratto intelligente con il seguente comando (`project` può essere un file Solidity o una directory di progetto): ```bash $ manticore project ``` -Otterrai l'output dei casi di prova, come il seguente (l'ordine potrebbe variare): +Otterrai l'output dei casi di test come questo (l'ordine potrebbe cambiare): ``` ... @@ -163,43 +159,43 @@ Otterrai l'output dei casi di prova, come il seguente (l'ordine potrebbe variare ... m.c.manticore:INFO: Generated testcase No. 4 - STOP ... m.c.manticore:INFO: Generated testcase No. 5 - REVERT ... m.c.manticore:INFO: Generated testcase No. 6 - REVERT -... m.c.manticore:INFO: Results in /home/ethsec/workshops/Automated Smart Contract Audit - TruffleCon 2018/manticore/examples/mcore_t6vi6ij3 +... m.c.manticore:INFO: Results in /home/ethsec/workshops/Automated Smart Contracts Audit - TruffleCon 2018/manticore/examples/mcore_t6vi6ij3 ... ``` -Senza altre informazioni, Manticore esplorerà il contratto con nuove transazioni simboliche, finché non esplorerà nuovi percorsi sul contratto. Manticore non esegue nuove transazioni se una non riesce (ad esempio dopo un ripristino). +Senza informazioni aggiuntive, Manticore esplorerà il contratto con nuove transazioni simboliche finché non esplorerà nuovi percorsi sul contratto. Manticore non esegue nuove transazioni dopo una fallita (es: dopo un revert). -Manticore restituirà le informazioni un una directory `mcore_*`. In questa directory troverai, tra altre cose: +Manticore produrrà le informazioni in una directory `mcore_*`. Tra le altre cose, troverai in questa directory: - `global.summary`: copertura e avvisi del compilatore -- `test_XXXXX.summary`: copertura, ultima istruzione, saldi del conto per casi di prova -- `test_XXXXX.tx`: elenco dettagliato delle transazioni per test case +- `test_XXXXX.summary`: copertura, ultima istruzione, saldi degli account per caso di test +- `test_XXXXX.tx`: elenco dettagliato delle transazioni per caso di test -Qui Manticore trova 7 test case che corrispondono a (l'ordine dei nomi dei file potrebbe variare): +Qui Manticore trova 7 casi di test, che corrispondono a (l'ordine dei nomi dei file potrebbe cambiare): -| | Transazione 0 | Transazione 1 | Transazione 2 | Risultato | -|:--------------------:|:-----------------------:|:--------------------:| -------------------- |:---------:| -| **test_00000000.tx** | Creazione del contratto | f(!=65) | f(!=65) | STOP | -| **test_00000001.tx** | Creazione del contratto | funzione di fallback | | REVERT | -| **test_00000002.tx** | Creazione del contratto | | | RETURN | -| **test_00000003.tx** | Creazione del contratto | f(65) | | REVERT | -| **test_00000004.tx** | Creazione del contratto | f(!=65) | | STOP | -| **test_00000005.tx** | Creazione del contratto | f(!=65) | f(65) | REVERT | -| **test_00000006.tx** | Creazione del contratto | f(!=65) | funzione di fallback | REVERT | +| | Transazione 0 | Transazione 1 | Transazione 2 | Risultato | +| :------------------: | :---------------: | :---------------: | ----------------- | :----: | +| **test_00000000.tx** | Creazione del contratto | f(!=65) | f(!=65) | STOP | +| **test_00000001.tx** | Creazione del contratto | funzione di fallback | | REVERT | +| **test_00000002.tx** | Creazione del contratto | | | RETURN | +| **test_00000003.tx** | Creazione del contratto | f(65) | | REVERT | +| **test_00000004.tx** | Creazione del contratto | f(!=65) | | STOP | +| **test_00000005.tx** | Creazione del contratto | f(!=65) | f(65) | REVERT | +| **test_00000006.tx** | Creazione del contratto | f(!=65) | funzione di fallback | REVERT | -_Il riepilogo dell'esplorazione f(!=65) denota f chiamata con ogni valore diverso da 65._ +_Il riepilogo dell'esplorazione f(!=65) indica f chiamata con qualsiasi valore diverso da 65._ -Come puoi notare, Manticore genera un test case univoco per ogni transazione riuscita o ripristinata. +Come puoi notare, Manticore genera un caso di test unico per ogni transazione riuscita o annullata. -Usa il flag `--quick-mode` se desideri un'esplorazione veloce del codice (disabilita rilevatori di bug, calcolo del carburante, etc.) +Usa il flag `--quick-mode` se desideri un'esplorazione rapida del codice (disabilita i rilevatori di bug, il calcolo del gas, ...) -### Manipolazione di uno Smart Contract tramite l'API {#manipulate-a-smart-contract-through-the-api} +### Manipolare un contratto intelligente tramite l'API {#manipulate-a-smart-contract-through-the-api} -Questa sezione contiene informazioni su come manipolare uno Smart Contract tramite l'API Python di Manticore. Puoi creare un nuovo file con l'estensione di Python `*.py` e scrivere il codice necessario aggiungendo i comandi dell'API (le basi saranno descritte di seguito) in questo file e poi eseguirlo con il comando `$ python3 *.py`. Puoi anche eseguire i comandi qui sotto direttamente nella console Python. Per eseguirla usa il comando `$ python3`. +Questa sezione descrive in dettaglio come manipolare un contratto intelligente tramite l'API Python di Manticore. Puoi creare un nuovo file con estensione python `*.py` e scrivere il codice necessario aggiungendo i comandi dell'API (le cui basi saranno descritte di seguito) in questo file e poi eseguirlo con il comando `$ python3 *.py`. Inoltre puoi eseguire i comandi sottostanti direttamente nella console python; per avviare la console usa il comando `$ python3`. -### Creare i Conti {#creating-accounts} +### Creare account {#creating-accounts} -La prima da fare è inizializzare una nuova blockchain con i comandi seguenti: +La prima cosa che dovresti fare è avviare una nuova blockchain con i seguenti comandi: ```python from manticore.ethereum import ManticoreEVM @@ -207,7 +203,7 @@ from manticore.ethereum import ManticoreEVM m = ManticoreEVM() ``` -Un conto privo di contratto è creato usando [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account): +Un account non contrattuale viene creato usando [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account): ```python user_account = m.create_account(balance=1000) @@ -226,20 +222,20 @@ contract Simple { } } ''' -# Inizializza il contratto +# Initiate the contract contract_account = m.solidity_create_contract(source_code, owner=user_account) ``` #### Riepilogo {#summary} -- Puoi creare conti dell'utente e del contratto con [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) e [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract). +- Puoi creare account utente e contratto con [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) e [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract). -### Esecuzione di transazioni {#executing-transactions} +### Eseguire transazioni {#executing-transactions} Manticore supporta due tipi di transazione: -- Transazione grezza: vengono esplorate tutte le funzioni -- Transazione con nome: viene esplorata solo una funzione +- Transazione grezza: tutte le funzioni vengono esplorate +- Transazione nominata: viene esplorata solo una funzione #### Transazione grezza {#raw-transaction} @@ -255,7 +251,7 @@ m.transaction(caller=user_account, Il chiamante, l'indirizzo, i dati o il valore della transazione possono essere concreti o simbolici: - [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) crea un valore simbolico. -- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) crea un array di byte simbolici. +- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) crea un array di byte simbolico. Ad esempio: @@ -268,38 +264,39 @@ m.transaction(caller=user_account, value=symbolic_value) ``` -Se i dati sono simbolici, Manticore esplorerà tutte le funzioni del contratto durante l'esecuzione della transazione. È utile consultare la spiegazione della funzione di fallback nell'articolo [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) per comprendere come funziona la selezione delle funzioni. +Se i dati sono simbolici, Manticore esplorerà tutte le funzioni del contratto durante l'esecuzione della transazione. Sarà utile vedere la spiegazione della funzione di fallback nell'articolo [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) per capire come funziona la selezione della funzione. -#### Transazione con nome {#named-transaction} +#### Transazione nominata {#named-transaction} -Le funzioni sono eseguibili tramite il loro nome. Per eseguire `f(uint var)` con un valore simbolico, da user_account e con 0 ether, usa: +Le funzioni possono essere eseguite tramite il loro nome. +Per eseguire `f(uint var)` con un valore simbolico, da user_account e con 0 ether, usa: ```python symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var, caller=user_account, value=0) ``` -Se `value` della transazione non è specificato, è 0 di default. +Se il `value` della transazione non è specificato, è 0 per impostazione predefinita. #### Riepilogo {#summary-1} - Gli argomenti di una transazione possono essere concreti o simbolici -- Una transazione grezza esplorerà tutte le funzioni -- La funzione può essere chiamata con il suo nome +- Una transazione grezza esplorererà tutte le funzioni +- Le funzioni possono essere chiamate con il loro nome -### Area di lavoro {#workspace} +### Spazio di lavoro {#workspace} -`m.workspace` è la directory usata come output per tutti i file generati: +`m.workspace` è la directory usata come directory di output per tutti i file generati: ```python print("Results are in {}".format(m.workspace)) ``` -### Chiusura dell'esplorazione {#terminate-the-exploration} +### Terminare l'esplorazione {#terminate-the-exploration} -Per interrompere l'esplorazione usa [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Nessun'altra transazione dovrebbe essere inviata una volta chiamato questo metodo e dopo che Manticore ha generato test case per ognuno dei percorsi esplorati. +Per interrompere l'esplorazione usa [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Nessuna ulteriore transazione dovrebbe essere inviata una volta chiamato questo metodo e Manticore genera casi di test per ciascuno dei percorsi esplorati. -### Riepilogo: esecuzione in Manticore {#summary-running-under-manticore} +### Riepilogo: Esecuzione in Manticore {#summary-running-under-manticore} Mettendo insieme tutti i passaggi precedenti, otteniamo: @@ -318,14 +315,14 @@ symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var) print("Results are in {}".format(m.workspace)) -m.finalize() # stop the exploration +m.finalize() # interrompi l'esplorazione ``` Tutto il codice sopra lo puoi trovare in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) -## Ottenere i percorsi che generano eccezioni {#getting-throwing-paths} +## Ottenere percorsi che generano eccezioni {#getting-throwing-paths} -Ora creeremo input specifici per i percorsi che generano un'eccezione in `f()`. La destinazione è ancora il seguente Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): +Ora genereremo input specifici per i percorsi che sollevano un'eccezione in `f()`. L'obiettivo è ancora il seguente contratto intelligente [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): ```solidity pragma solidity >=0.4.24 <0.6.0; @@ -338,35 +335,35 @@ contract Simple { } ``` -### Uso delle informazioni di stato {#using-state-information} +### Usare le informazioni di stato {#using-state-information} -Ogni percorso eseguito ha il proprio stato della blockchain. Uno stato è pronto o terminato, a significare che ha raggiunto un'istruzione THROW o REVERT: +Ogni percorso eseguito ha il suo stato della blockchain. Uno stato è pronto (ready) o è terminato (killed), il che significa che raggiunge un'istruzione THROW o REVERT: -- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): l'elenco degli stati pronti (cioè che non hanno eseguito un REVERT/INVALID) -- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): l'elenco degli stati terminati +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): l'elenco degli stati che sono pronti (non hanno eseguito un REVERT/INVALID) +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): l'elenco degli stati che sono terminati - [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): tutti gli stati ```python for state in m.all_states: - # esegue un'operazione con lo stato + # fare qualcosa con lo stato ``` -Puoi accedere alle informazioni sullo stato. Per esempio: +Puoi accedere alle informazioni di stato. Ad esempio: -- `state.platform.get_balance(account.address)`: il saldo del conto +- `state.platform.get_balance(account.address)`: il saldo dell'account - `state.platform.transactions`: l'elenco delle transazioni - `state.platform.transactions[-1].return_data`: i dati restituiti dall'ultima transazione -I dati restituiti dall'ultima transazione sono un array, convertibile in un valore con ABI.deserialize, per esempio: +I dati restituiti dall'ultima transazione sono un array, che può essere convertito in un valore con ABI.deserialize, ad esempio: ```python data = state.platform.transactions[0].return_data data = ABI.deserialize("uint", data) ``` -### Come generare test case {#how-to-generate-testcase} +### Come generare un caso di test {#how-to-generate-testcase} -Usa [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) per generare test case: +Usa [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) per generare un caso di test: ```python m.generate_testcase(state, 'BugFound') @@ -374,13 +371,13 @@ m.generate_testcase(state, 'BugFound') ### Riepilogo {#summary-2} -- Puoi eseguire iterazioni sullo stato con m.all_states -- `state.platform.get_balance(account.address)` restituisce il saldo del conto +- Puoi iterare sullo stato con m.all_states +- `state.platform.get_balance(account.address)` restituisce il saldo dell'account - `state.platform.transactions` restituisce l'elenco delle transazioni - `transaction.return_data` sono i dati restituiti - `m.generate_testcase(state, name)` genera input per lo stato -### Riepilogo: ottenere il percorso che genera eccezioni {#summary-getting-throwing-path} +### Riepilogo: Ottenere percorsi che generano eccezioni {#summary-getting-throwing-path} ```python from manticore.ethereum import ManticoreEVM @@ -396,7 +393,7 @@ contract_account = m.solidity_create_contract(source_code, owner=user_account) symbolic_var = m.make_symbolic_value() contract_account.f(symbolic_var) -## Controlla se l'esecuzione termina con REVERT o INVALID +# # Verifica se un'esecuzione termina con un REVERT o INVALID for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: @@ -404,13 +401,13 @@ for state in m.terminated_states: m.generate_testcase(state, 'ThrowFound') ``` -Tutto il codice qui sopra si trova in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) +Tutto il codice sopra lo puoi trovare in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) -_Nota: avremmo potuto generare uno script molto più semplice poiché tutti gli stati restituiti da terminated_state hanno REVERT o INVALID nel risultato. Questo esempio era inteso solo per dimostrare come manipolare l'API._ +_Nota che avremmo potuto generare uno script molto più semplice, poiché tutti gli stati restituiti da terminated_state hanno REVERT o INVALID nel loro risultato: questo esempio aveva solo lo scopo di dimostrare come manipolare l'API._ -## Aggiunta di vincoli {#adding-constraints} +## Aggiungere vincoli {#adding-constraints} -Vediamo ora come vincolare l'esplorazione. Presumiamo che la documentazione di `f()` indichi che la funzione non viene mai chiamata con `a == 65`, quindi ogni bug con `a == 65` non è un vero bug. La destinazione è ancora il seguente Smart Contract [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): +Vedremo come vincolare l'esplorazione. Faremo l'ipotesi che la documentazione di `f()` affermi che la funzione non viene mai chiamata con `a == 65`, quindi qualsiasi bug con `a == 65` non è un vero bug. L'obiettivo è ancora il seguente contratto intelligente [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): ```solidity pragma solidity >=0.4.24 <0.6.0; @@ -425,7 +422,7 @@ contract Simple { ### Operatori {#operators} -Il modulo [Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) facilita la manipolazione dei vincoli, fornendo tra l'altro: +Il modulo [Operators](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) facilita la manipolazione dei vincoli, tra le altre cose fornisce: - Operators.AND, - Operators.OR, @@ -434,13 +431,13 @@ Il modulo [Operators](https://github.com/trailofbits/manticore/blob/master/manti - Operators.ULT (minore di senza segno), - Operators.ULE (minore o uguale a senza segno). -Per importare il modulo usa: +Per importare il modulo usa quanto segue: ```python from manticore.core.smtlib import Operators ``` -`Operators.CONCAT` è usato per concatenare un array a un valore. Per esempio, return_data di una transazione deve essere modificato in valore per poter essere verificato a fronte di un altro valore: +`Operators.CONCAT` viene usato per concatenare un array a un valore. Ad esempio, il return_data di una transazione deve essere modificato in un valore per essere confrontato con un altro valore: ```python last_return = Operators.CONCAT(256, *last_return) @@ -448,11 +445,12 @@ last_return = Operators.CONCAT(256, *last_return) ### Vincoli {#state-constraint} -Puoi usare vincoli globalmente o per uno stato specifico. +Puoi usare i vincoli a livello globale o per uno stato specifico. #### Vincolo globale {#state-constraint} -Usa `m.constrain(constraint)` per aggiungere un vincolo globale. Per esempio, puoi chiamare un contratto da un indirizzo simbolico e limitare quest'indirizzo a valori specifici: +Usa `m.constrain(constraint)` per aggiungere un vincolo globale. +Ad esempio, puoi chiamare un contratto da un indirizzo simbolico e vincolare questo indirizzo a valori specifici: ```python symbolic_address = m.make_symbolic_value() @@ -465,11 +463,13 @@ m.transaction(caller=user_account, #### Vincolo di stato {#state-constraint} -Usa [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) per aggiungere un vincolo a uno stato specifico Può essere usato per vincolare lo stato dopo la sua esplorazione per verificarvi della proprietà. +Usa [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) per aggiungere un vincolo a uno stato specifico. +Può essere usato per vincolare lo stato dopo la sua esplorazione per verificare alcune proprietà su di esso. -### Controllo di un vincolo {#checking-constraint} +### Verificare i vincoli {#checking-constraint} -Usa `solver.check(state.constraints)` per sapere se un vincolo è ancora fattibile. Per esempio, il codice seguente vincola symbolic_value ad essere diverso da 65 e controlla se lo stato è ancora fattibile: +Usa `solver.check(state.constraints)` per sapere se un vincolo è ancora fattibile. +Ad esempio, quanto segue vincolerà symbolic_value a essere diverso da 65 e verificherà se lo stato è ancora fattibile: ```python state.constrain(symbolic_var != 65) @@ -477,7 +477,7 @@ if solver.check(state.constraints): # lo stato è fattibile ``` -### Riepilogo: aggiunta di vincoli {#summary-adding-constraints} +### Riepilogo: Aggiungere vincoli {#summary-adding-constraints} Aggiungendo il vincolo al codice precedente, otteniamo: @@ -500,11 +500,11 @@ contract_account.f(symbolic_var) no_bug_found = True -## Controlla se l'esecuzione termina con REVERT o INVALID +# # Verifica se un'esecuzione termina con un REVERT o INVALID for state in m.terminated_states: last_tx = state.platform.transactions[-1] if last_tx.result in ['REVERT', 'INVALID']: - # we do not consider the path were a == 65 + # non consideriamo il percorso in cui a == 65 condition = symbolic_var != 65 if m.generate_testcase(state, name="BugFound", only_if=condition): print(f'Bug found, results are in {m.workspace}') @@ -514,4 +514,4 @@ if no_bug_found: print(f'No bug found') ``` -Tutto il codice sopra si può trovare in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) +Tutto il codice sopra lo puoi trovare in [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/it/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md index 672e8ab92fe..e5c272c7686 100644 --- a/public/content/translations/it/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -1,50 +1,45 @@ --- -title: Come usare Slither per trovare i bug dello Smart Contract -description: Come usare Slither per trovare automaticamente bug negli Smart Contract +title: Come usare Slither per trovare bug nei contratti intelligenti +description: Come usare Slither per trovare automaticamente bug nei contratti intelligenti author: Trailofbits lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "sicurezza" - - "test" - - "analisi statica" +tags: ["Solidity", "contratti intelligenti", "sicurezza", "test"] skill: advanced -breadcrumb: "Slither" +breadcrumb: Slither published: 2020-06-09 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither --- ## Come usare Slither {#how-to-use-slither} -L'obiettivo di questo tutorial è mostrare come usare Slither per trovare automaticamente bug negli Smart Contract. +Lo scopo di questo tutorial è mostrare come usare Slither per trovare automaticamente bug nei contratti intelligenti. - [Installazione](#installation) -- [Uso dalla riga di comando](#command-line) -- [Introduzione all'analisi statica](#static-analysis): breve introduzione all'analisi statica -- [API](#api-basics): descrizione dell'API Python +- [Uso della riga di comando](#command-line) +- [Introduzione all'analisi statica](#static-analysis): Breve introduzione all'analisi statica +- [API](#api-basics): Descrizione dell'API Python ## Installazione {#installation} -Slither richiede Python >=3.6. Può essere installato tramite pip o usando docker. +Slither richiede Python >= 3.6. Può essere installato tramite pip o usando docker. -Slither con pip: +Slither tramite pip: ```bash pip3 install --user slither-analyzer ``` -Slither con docker: +Slither tramite docker: ```bash docker pull trailofbits/eth-security-toolbox docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox ``` -_L'ultimo comando esegue eth-security-toolbox in un docker che ha accesso alla directory corrente. Puoi cambiare i file dall'host ed eseguire gli strumenti sui file dal docker_ +_L'ultimo comando esegue eth-security-toolbox in un docker che ha accesso alla tua directory corrente. Puoi modificare i file dal tuo host ed eseguire gli strumenti sui file dal docker_ -In docker, esegui: +All'interno di docker, esegui: ```bash solc-select 0.5.11 @@ -53,7 +48,7 @@ cd /home/trufflecon/ ### Eseguire uno script {#running-a-script} -Per eseguire uno script Python con Python 3: +Per eseguire uno script python con python 3: ```bash python3 script.py @@ -61,23 +56,23 @@ python3 script.py ### Riga di comando {#command-line} -**Riga di comando e script definiti dall'utente.** Slither comprende una serie di rilevatori predefiniti che trovano molti bug comuni. Chiamare Slither dalla riga di comando eseguirà tutti i rilevatori, non è necessaria alcuna conoscenza dettagliata dell'analisi statica: +**Riga di comando rispetto a script definiti dall'utente.** Slither è fornito con un set di rilevatori predefiniti che trovano molti bug comuni. Chiamare Slither dalla riga di comando eseguirà tutti i rilevatori, senza che sia necessaria alcuna conoscenza dettagliata dell'analisi statica: ```bash slither project_paths ``` -Oltre ai rilevatori, Slither ha capacità di revisione del codice tramite le sue [stampanti](https://github.com/crytic/slither#printers) e i suoi [strumenti](https://github.com/crytic/slither#tools). +Oltre ai rilevatori, Slither ha capacità di revisione del codice attraverso i suoi [printer](https://github.com/crytic/slither#printers) e [strumenti](https://github.com/crytic/slither#tools). -Usa [crytic.io](https://github.com/crytic) per ottenere accesso ai rilevatori privati e integrazione con GitHub. +Usa [crytic.io](https://github.com/crytic) per ottenere l'accesso a rilevatori privati e all'integrazione con GitHub. ## Analisi statica {#static-analysis} -Le capacità e il design del framework di analisi statica di Slither sono stati descritti in post di blog ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) e in un [paper accademico](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf). +Le capacità e il design del framework di analisi statica Slither sono stati descritti in post del blog ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) e in un [documento accademico](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf). -L'analisi statica esiste in diversi tipi. Molto probabilmente ti renderai conto che compilatori come [clang](https://clang-analyzer.llvm.org/) e [gcc](https://lwn.net/Articles/806099/) dipendono da queste tecniche di ricerca, che sono anche alla base di [Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) e strumenti basati sui metodi formali come [Frama-C](https://frama-c.com/) e [Polyspace](https://www.mathworks.com/products/polyspace.html). +L'analisi statica esiste in diverse varianti. Molto probabilmente ti renderai conto che compilatori come [clang](https://clang-analyzer.llvm.org/) e [gcc](https://lwn.net/Articles/806099/) dipendono da queste tecniche di ricerca, ma è anche alla base di ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) e strumenti basati su metodi formali come [Frama-C](https://frama-c.com/) e [Polyspace](https://www.mathworks.com/products/polyspace.html). -Qui non esamineremo in modo esaustivo le tecniche di analisi statica e il ricercatore. Ci concentreremo invece su ciò che serve per capire come funziona Slither così da poterlo usare più efficacemente per trovare bug e comprendere il codice. +Non esamineremo in modo esaustivo le tecniche di analisi statica e i ricercatori qui. Ci concentreremo invece su ciò che è necessario per comprendere come funziona Slither, in modo da poterlo usare più efficacemente per trovare bug e comprendere il codice. - [Rappresentazione del codice](#code-representation) - [Analisi del codice](#analysis) @@ -85,13 +80,13 @@ Qui non esamineremo in modo esaustivo le tecniche di analisi statica e il ricerc ### Rappresentazione del codice {#code-representation} -A differenza dell'analisi dinamica, che ragiona su un percorso di esecuzione singolo, l'analisi statica ragiona su tutti i percorsi contemporaneamente. Per farlo, si basa su una diversa rappresentazione del codice. Le due tipologie più comuni sono l'albero di sintassi astratta (AST) e il grafico del flusso di controllo (CFG). +A differenza di un'analisi dinamica, che ragiona su un singolo percorso di esecuzione, l'analisi statica ragiona su tutti i percorsi contemporaneamente. Per farlo, si affida a una diversa rappresentazione del codice. Le due più comuni sono l'albero sintattico astratto (AST) e il grafo del flusso di controllo (CFG). -### Alberi di sintassi astratta (AST) {#abstract-syntax-trees-ast} +### Alberi Sintattici Astratti (AST) {#abstract-syntax-trees-ast} -Gli AST sono usati ogni volta che il compilatore analizza il codice. Sono probabilmente la struttura più basilare su cui è eseguibile l'analisi statica. +Gli AST vengono usati ogni volta che il compilatore analizza il codice. È probabilmente la struttura più basilare su cui può essere eseguita l'analisi statica. -In pillole, un AST è un albero strutturato dove, di solito, ogni foglia contiene una variabile o una costante e i nodi interni sono operandi o controllano le operazioni del flusso. Considera il codice seguente: +In breve, un AST è un albero strutturato in cui, di solito, ogni foglia contiene una variabile o una costante e i nodi interni sono operandi o operazioni del flusso di controllo. Considera il seguente codice: ```solidity function safeAdd(uint a, uint b) pure internal returns(uint){ @@ -108,9 +103,9 @@ L'AST corrispondente è mostrato in: Slither usa l'AST esportato da solc. -Sebbene semplice da costruire, l'AST è una struttura nidificata. A volte, non è la più semplice da analizzare. Per esempio, per identificare le operazioni usate dall'espressione `a + b <= a`, devi prima analizzare `<=` e poi `+`. Un approccio comune è usare il cosiddetto schema dei visitatori, che naviga l'albero in modo ricorsivo. Slither contiene un visitatore generico in [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). +Sebbene semplice da costruire, l'AST è una struttura annidata. A volte, non è la più semplice da analizzare. Ad esempio, per identificare le operazioni usate dall'espressione `a + b <= a`, devi prima analizzare `<=` e poi `+`. Un approccio comune è usare il cosiddetto pattern visitor, che naviga attraverso l'albero in modo ricorsivo. Slither contiene un visitor generico in [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). -Il codice seguente usa `ExpressionVisitor` per rilevare se l'espressione contiene una somma: +Il seguente codice usa `ExpressionVisitor` per rilevare se l'espressione contiene un'addizione: ```python from slither.visitors.expression.expression import ExpressionVisitor @@ -125,58 +120,58 @@ class HasAddition(ExpressionVisitor): if expression.type == BinaryOperationType.ADDITION: self._result = True -visitor = HasAddition(expression) # expression is the expression to be tested +visitor = HasAddition(expression) # expression è l'espressione da testare print(f'The expression {expression} has a addition: {visitor.result()}') ``` -### Grafico del flusso di controllo (CFG) {#control-flow-graph-cfg} +### Grafo del Flusso di Controllo (CFG) {#control-flow-graph-cfg} -La seconda rappresentazione più comune del codice è il grafico del flusso di controllo (CFG). Come suggerisce il nome, è una rappresentazione basata su un grafico, che espone tutti i percorsi d'esecuzione. Ogni nodo contiene una o più istruzioni. I bordi nel grafico rappresentano le operazioni del flusso di controllo (if/then/else, loop, ecc). Il CFG del nostro esempio precedente è: +La seconda rappresentazione del codice più comune è il grafo del flusso di controllo (CFG). Come suggerisce il nome, è una rappresentazione basata su grafi che espone tutti i percorsi di esecuzione. Ogni nodo contiene una o più istruzioni. Gli archi nel grafo rappresentano le operazioni del flusso di controllo (if/then/else, loop, ecc.). Il CFG del nostro esempio precedente è: ![CFG](./cfg.png) -Il CFG è la rappresentazione su cui gran parte delle analisi sono costruite. +Il CFG è la rappresentazione su cui si basa la maggior parte delle analisi. Esistono molte altre rappresentazioni del codice. Ogni rappresentazione ha vantaggi e svantaggi a seconda dell'analisi che si desidera eseguire. ### Analisi {#analysis} -Il tipo più semplice di analisi eseguibile con Slither è l'analisi sintattica. +Il tipo più semplice di analisi che puoi eseguire con Slither sono le analisi sintattiche. -### Analisi della sintassi {#syntax-analysis} +### Analisi sintattica {#syntax-analysis} -Slither può navigare attraverso diversi componenti del codice e la loro rappresentazione per trovare incoerenze e difetti usando un approccio simile all'abbinamento a schemi. +Slither può navigare attraverso i diversi componenti del codice e la loro rappresentazione per trovare incongruenze e difetti usando un approccio simile al pattern matching. -Per esempio i seguenti rilevatori cercano problemi correlati alla sintassi: +Ad esempio, i seguenti rilevatori cercano problemi legati alla sintassi: -- [Shadowing della variabile di stato](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): esegue iterazioni su tutte le variabili di stato e controlla se qualcuna esegue lo shadowing di una variabile da un contratto ereditato ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) +- [Shadowing delle variabili di stato](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): itera su tutte le variabili di stato e controlla se qualcuna fa ombra a una variabile di un contratto ereditato ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) -- [Interfaccia errata di ERC20](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): cerca firme della funzione ERC20 errate ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) +- [Interfaccia ERC20 errata](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): cerca firme di funzioni ERC20 errate ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) ### Analisi semantica {#semantic-analysis} -A differenza dell'analisi di sintassi, un'analisi semantica va più in profondità e analizza il "significato" del codice. Questa famiglia include alcuni tipi generici di analisi. Conducono a risultati più potenti e utili, ma anche più complessi da scrivere. +A differenza dell'analisi sintattica, un'analisi semantica andrà più a fondo e analizzerà il "significato" del codice. Questa famiglia include alcuni ampi tipi di analisi. Portano a risultati più potenti e utili, ma sono anche più complessi da scrivere. -Le analisi semantiche sono usate per i rilevamenti più avanzati delle vulnerabilità. +Le analisi semantiche vengono usate per i rilevamenti di vulnerabilità più avanzati. -#### Analisi della dipendenza dei dati {#fixed-point-computation} +#### Analisi delle dipendenze dei dati {#fixed-point-computation} -Una variabile `variable_a` si dice dipendente dai dati di `variable_b` se esiste un percorso per cui il valore di `variable_a` è influenzato da `variable_b`. +Si dice che una variabile `variable_a` è dipendente dai dati di `variable_b` se esiste un percorso per il quale il valore di `variable_a` è influenzato da `variable_b`. -Nel codice seguente, `variable_a` dipende da `variable_b`: +Nel seguente codice, `variable_a` è dipendente da `variable_b`: ```solidity // ... variable_a = variable_b + 1; ``` -Slither è dotato di capacità integrate di [dipendenza dai dati](https://github.com/crytic/slither/wiki/data-dependency), grazie alla sua rappresentazione intermedia (discussa in una sezione successiva). +Slither è dotato di capacità integrate di [dipendenza dei dati](https://github.com/crytic/slither/wiki/data-dependency), grazie alla sua rappresentazione intermedia (discussa in una sezione successiva). -Un esempio di uso della dipendenza dei dati si può trovare nel [rilevatore di uguaglianze rigorose pericolose](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). In questo caso Slither cercherà confronti tra uguaglianze rigorose a un valore pericoloso ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)), e informerà l'utente che dovrebbe usare `>=` o `<=` anziché `==`, per impedire a un malintenzionato di bloccare il contratto. Tra gli altri, il rilevatore considererà come pericoloso il valore restituito da una chiamata di `balanceOf(address)` ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)), e userà il motore delle dipendenze dei dati per monitorarne l'uso. +Un esempio di utilizzo della dipendenza dei dati può essere trovato nel [rilevatore di uguaglianza stretta pericolosa](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Qui Slither cercherà un confronto di uguaglianza stretta con un valore pericoloso ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) e informerà l'utente che dovrebbe usare `>=` o `<=` piuttosto che `==`, per impedire a un utente malintenzionato di intrappolare il contratto. Tra le altre cose, il rilevatore considererà come pericoloso il valore di ritorno di una chiamata a `balanceOf(address)` ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) e userà il motore di dipendenza dei dati per tracciarne l'utilizzo. #### Calcolo del punto fisso {#fixed-point-computation} -Se l'analisi naviga attraverso il CFG e segue i bordi, potresti vedere nodi già visitati. Per esempio, se un ciclo viene presentato come mostrato sotto: +Se la tua analisi naviga attraverso il CFG e segue gli archi, è probabile che tu veda nodi già visitati. Ad esempio, se è presente un ciclo come mostrato di seguito: ```solidity for(uint i; i < range; ++){ @@ -184,21 +179,21 @@ for(uint i; i < range; ++){ } ``` -L'analisi dovrà sapere quando interrompersi. Qui esistono due strategie principali: (1) itera su ogni nodo un numero finito di volte, (2) calcola un cosiddetto _fixpoint_ (punto fisso). Un punto fisso indica fondamentalmente che analizzare il nodo non fornisce alcuna informazione utile. +La tua analisi dovrà sapere quando fermarsi. Ci sono due strategie principali qui: (1) iterare su ogni nodo un numero finito di volte, (2) calcolare un cosiddetto _punto fisso_ (fixpoint). Un punto fisso significa fondamentalmente che l'analisi di questo nodo non fornisce alcuna informazione significativa. -Un esempio di punto fisso usato si può trovare nei rilevatori di rientranza: Slither esplora i nodi e cerca chiamate esterne, scrive e legge lo storage. Una volta raggiunto un punto fisso ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), interrompe l'esplorazione e analizza i risultati per vedere se è presente una rientranza, tramite diversi schemi di rientranza ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)). +Un esempio di punto fisso utilizzato può essere trovato nei rilevatori di rientranza: Slither esplora i nodi e cerca chiamate esterne, scritture e letture nello spazio di archiviazione. Una volta raggiunto un punto fisso ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), interrompe l'esplorazione e analizza i risultati per vedere se è presente una rientranza, attraverso diversi pattern di rientranza ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)). -La scrittura dell'analisi tramite un calcolo efficiente dei punti fissi richiede una buona comprensione di come l'analisi propaga le informazioni. +Scrivere analisi usando un calcolo efficiente del punto fisso richiede una buona comprensione di come l'analisi propaga le sue informazioni. ### Rappresentazione intermedia {#intermediate-representation} -Una rappresentazione intermedia (IR) è un linguaggio pensato per essere più adatto all'analisi statica che a quella originale. Slither traduce Solidity nella propria rappresentazione intermedia: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). +Una rappresentazione intermedia (IR) è un linguaggio concepito per essere più adatto all'analisi statica rispetto a quello originale. Slither traduce Solidity nella propria IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). -Comprendere SlithIR non è necessario per scrivere controlli di base. È invece utile se pensi di scrivere analisi semantiche avanzate. Le stampanti [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) e [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) aiuteranno a comprendere come è tradotto il codice. +Comprendere SlithIR non è necessario se si desidera solo scrivere controlli di base. Tuttavia, tornerà utile se si prevede di scrivere analisi semantiche avanzate. I printer [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) e [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) ti aiuteranno a capire come viene tradotto il codice. -## Fondamenti delle API {#api-basics} +## Basi dell'API {#api-basics} -Slither ha un'API che consente di esplorare gli attributi di base del contratto e le sue funzioni. +Slither ha un'API che ti consente di esplorare gli attributi di base del contratto e delle sue funzioni. Per caricare una base di codice: @@ -212,28 +207,28 @@ slither = Slither('/path/to/project') Un oggetto `Slither` ha: -- `contracts (list(Contract)`: elenco di contratti -- `contracts_derived (list(Contract)`: elenco dei contratti che non vengono ereditati da un altro contratto (sottoinsieme di contratti) -- `get_contract_from_name (str)`: restituisce un contratto dal nome +- `contracts (list(Contract)`: elenco dei contratti +- `contracts_derived (list(Contract)`: elenco dei contratti che non sono ereditati da un altro contratto (sottoinsieme di contratti) +- `get_contract_from_name (str)`: Restituisce un contratto dal suo nome Un oggetto `Contract` ha: -- `name (str)`: nome del contratto -- `functions (list(Function))`: elenco di funzioni -- `modifiers (list(Modifier))`: elenco di funzioni -- `all_functions_called (list(Function/Modifier))`: elenco di tutte le funzioni interne raggiungibili dal contratto -- `inheritance (list(Contract))`: elenco di contratti ereditati -- `get_function_from_signature (str)`: restituisce una funzione dalla firma -- `get_modifier_from_signature (str)`: restituisce un modificatore dalla firma -- `get_state_variable_from_name (str)`: restituisce una variabile di stato dal nome +- `name (str)`: Nome del contratto +- `functions (list(Function))`: Elenco delle funzioni +- `modifiers (list(Modifier))`: Elenco delle funzioni +- `all_functions_called (list(Function/Modifier))`: Elenco di tutte le funzioni interne raggiungibili dal contratto +- `inheritance (list(Contract))`: Elenco dei contratti ereditati +- `get_function_from_signature (str)`: Restituisce una Function dalla sua firma +- `get_modifier_from_signature (str)`: Restituisce un Modifier dalla sua firma +- `get_state_variable_from_name (str)`: Restituisce una StateVariable dal suo nome Un oggetto `Function` o `Modifier` ha: -- `name (str)`: nome della funzione +- `name (str)`: Nome della funzione - `contract (contract)`: il contratto in cui è dichiarata la funzione -- `nodes (list(Node))`: elenco dei nodi che compongono il CFG della funzione o del modificatore -- `entry_point (Node)`: punto di ingresso del CFG -- `variables_read (list(Variable))`: elenco delle variabili lette -- `variables_written (list(Variable))`: elenco delle variabili scritte -- `state_variables_read (list(StateVariable))`: elenco delle variabili di stato lette (sottoinsieme di variables`read) -- `state_variables_written (list(StateVariable))`: elenco delle variabili di stato scritte (sottoinsieme di variables`written) +- `nodes (list(Node))`: Elenco dei nodi che compongono il CFG della funzione/modificatore +- `entry_point (Node)`: Punto di ingresso del CFG +- `variables_read (list(Variable))`: Elenco delle variabili lette +- `variables_written (list(Variable))`: Elenco delle variabili scritte +- `state_variables_read (list(StateVariable))`: Elenco delle variabili di stato lette (sottoinsieme di variables`read) +- `state_variables_written (list(StateVariable))`: Elenco delle variabili di stato scritte (sottoinsieme di variables`written) \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/it/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md index 64dd3da9885..9015f53b0a1 100644 --- a/public/content/translations/it/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -1,52 +1,49 @@ --- -title: Come Configurare Tellor come tuo Oracolo -description: Una guida per iniziare a integrare l'oracolo di Tellor nel tuo protocollo +title: Come configurare Tellor come tuo oracolo +description: Una guida per iniziare a integrare l'oracolo Tellor nel tuo protocollo author: "Tellor" lang: it -tags: - - "solidity" - - "contratti intelligenti" - - "oracoli" +tags: ["Solidity", "contratti intelligenti", "oracoli"] skill: beginner -breadcrumb: "Oracle Tellor" +breadcrumb: Oracolo Tellor published: 2021-06-29 -source: Documentazione di Tellor +source: Tellor Docs sourceUrl: https://docs.tellor.io/tellor/ --- -Quiz: il tuo protocollo è appena terminato, ma ti serve un oracolo per avere accesso ai dati esterni alla catena... Cosa fai? +Quiz a sorpresa: Il tuo protocollo è quasi finito, ma ha bisogno di un oracolo per accedere ai dati fuori catena... Cosa fai? -## (Soft) Prerequisiti {#soft-prerequisites} +## Prerequisiti (flessibili) {#soft-prerequisites} -Questo post intende rendere l'accesso al feed dell'oracolo il più semplice e diretto possibile. Detto ciò, per concentrarci sull'aspetto dell'oracolo, presumiamo da parte tua le seguenti abilità di programmazione. +Questo post mira a rendere l'accesso a un feed dell'oracolo il più semplice e diretto possibile. Detto questo, diamo per scontato quanto segue sul tuo livello di abilità di programmazione per concentrarci sull'aspetto dell'oracolo. -Premesse: +Presupposti: -- se capage di muoverti nella console +- sai navigare in un terminale - hai installato npm - sai come usare npm per gestire le dipendenze -Tellor è un oracolo in diretta e open source pronto all'implementazione. Questa guida per principianti serve a mostrare la facilità con cui puoi metterti al lavoro con Tellor, fornendo il tuo progetto con un oracolo completamente decentralizzato e resistente alla censura. +Tellor è un oracolo live e open-source pronto per l'implementazione. Questa guida per principianti è qui per mostrare la facilità con cui si può iniziare a usare Tellor, fornendo al tuo progetto un oracolo completamente decentralizzato e resistente alla censura. ## Panoramica {#overview} -Tellor è un sistema di oracolo in cui le parti possono richiedere il valore di un punto di dati esterno alla catena (es. BTC/USD) e i segnalatori competono ad aggiungere tale valore a una banca dati sulla catena, accessibile da tutti i contratti intelligenti di Ethereum. Gli input a questa banca dati sono protetti da una rete di reporter di staking. Tellor utilizza dei meccanismi d'incentivazione cripto-economica, ricompensando gli invii di dati onesti dai segnalatori e punendo gli utenti malevoli tramite l'emissione del token di Tellor, Tributes (TRB) e un meccanismo di disputa. +Tellor è un sistema di oracolo in cui le parti possono richiedere il valore di un punto dati fuori catena (es. BTC/USD) e i reporter competono per aggiungere questo valore a una banca dati on-chain, accessibile da tutti i contratti intelligenti di Ethereum. Gli input a questa banca dati sono protetti da una rete di reporter in stake. Tellor utilizza meccanismi di incentivi criptoeconomici, premiando l'invio di dati onesti da parte dei reporter e punendo i malintenzionati attraverso l'emissione del token di Tellor, Tributes (TRB), e un meccanismo di disputa. -In questo tutorial, esamineremo: +In questo tutorial esamineremo: -- Configurazione del toolkit iniziale di cui ha bisogno per metterti al lavoro. -- Guida a un semplice esempio. -- Elenco degli indirizzi testnet delle reti su cui puoi testare Tellor in questo momento. +- La configurazione del toolkit iniziale necessario per iniziare. +- Un semplice esempio passo dopo passo. +- L'elenco degli indirizzi della rete di test delle reti su cui attualmente puoi testare Tellor. -## Usare Tellor {#usingtellor} +## UsingTellor {#usingtellor} -La prima cosa che dovrai fare è installare gli strumenti di base necessari per usare Tellor come oracolo. Usa [questo pacchetto](https://github.com/tellor-io/usingtellor) per installare i Contratti Utente di Tellor: +La prima cosa che vorrai fare è installare gli strumenti di base necessari per usare Tellor come tuo oracolo. Usa [questo pacchetto](https://github.com/tellor-io/usingtellor) per installare i Contratti Utente di Tellor (Tellor User Contracts): `npm install usingtellor` -Una volta installato, i tuoi contratti potranno ereditare le funzioni dal contratto 'UsingTellor'. +Una volta installato, questo permetterà ai tuoi contratti di ereditare le funzioni dal contratto 'UsingTellor'. -Ottimo! Ora che hai preparato gli strumenti, guardiamo un semplice esercizio in cui recuperiamo il prezzo Bitcoin: +Ottimo! Ora che hai gli strumenti pronti, facciamo un semplice esercizio in cui recuperiamo il prezzo del bitcoin: ### Esempio BTC/USD {#btcusd-example} @@ -60,7 +57,7 @@ import "usingtellor/contracts/UsingTellor.sol"; contract PriceContract is UsingTellor { uint256 public btcPrice; - //This Contract now has access to all functions in UsingTellor + // Questo contratto ora ha accesso a tutte le funzioni in UsingTellor constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) public {} @@ -78,8 +75,8 @@ function setBtcPrice() public { } ``` -Per un elenco completo degli indirizzi dei contratti, fai riferimento a [questa guida](https://docs.tellor.io/tellor/the-basics/contracts-reference). +Per un elenco completo degli indirizzi del contratto fai riferimento a [questa pagina](https://docs.tellor.io/tellor/the-basics/contracts-reference). -Per semplicità d'uso, la repository UsingTellort è dotata di una versione del contratto [Tellor Playground](https://github.com/tellor-io/TellorPlayground), per una più facile integrazione. Visualizza [questa pagina](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) per un elenco delle funzioni utili. +Per facilità d'uso, la repository UsingTellor include una versione del contratto [Tellor Playground](https://github.com/tellor-io/TellorPlayground) per un'integrazione più semplice. Vedi [qui](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) per un elenco di funzioni utili. -Per un'implementazione più robusta dell'oracolo di Tellor, consulta [qui](https://github.com/tellor-io/usingtellor/blob/master/README.md) l'elenco completo delle funzioni disponibili. +Per un'implementazione più robusta dell'oracolo Tellor, dai un'occhiata all'elenco completo delle funzioni disponibili [qui](https://github.com/tellor-io/usingtellor/blob/master/README.md). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/it/developers/tutorials/how-to-view-nft-in-metamask/index.md index 9a57cedc1eb..0abe0a61631 100644 --- a/public/content/translations/it/developers/tutorials/how-to-view-nft-in-metamask/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -1,37 +1,34 @@ --- -title: Come visualizzare il tuo NFT nel portafoglio (Parte 3/3 della Serie di tutorial sugli NFT) -description: Questo tutorial descrive come visualizzare un NFT esistente su Metamask! +title: Come visualizzare il tuo NFT nel tuo portafoglio (Parte 3/3 della serie di tutorial sugli NFT) +description: Questo tutorial descrive come visualizzare un NFT esistente su MetaMask! author: "Sumi Mudgil" -tags: - - "ERC-721" - - "Alchemy" - - "Solidity" +tags: ["ERC-721", "Alchemy", "Solidity"] skill: beginner -breadcrumb: "Vedere NFT nel wallet" +breadcrumb: Visualizzare l'NFT nel portafoglio lang: it published: 2021-04-22 --- -Questo tutorial è la Parte 3/3 della serie di Tutorial sugli NFT, dove visualizziamo il nostro NFT appena coniato. Tuttavia, puoi usare il tutorial generico per qualsiasi token ERC-721 usando MetaMask, anche sulla rete principale o su qualsiasi testnet. Se vorresti imparare come coniare il tuo NFT su Ethereum, dovresti dare un'occhiata alla [Parte 1 su Come Scrivere e Distribuire un contratto intelligente NFT](/developers/tutorials/how-to-write-and-deploy-an-nft)! +Questo tutorial è la Parte 3/3 della serie di tutorial sugli NFT, in cui visualizziamo il nostro NFT appena coniato. Tuttavia, puoi utilizzare il tutorial generale per qualsiasi token ERC-721 utilizzando MetaMask, inclusa la rete principale o qualsiasi rete di test. Se desideri imparare a coniare il tuo NFT su Ethereum, dovresti dare un'occhiata alla [Parte 1 su Come scrivere e distribuire un contratto intelligente per NFT](/developers/tutorials/how-to-write-and-deploy-an-nft)! -Congratulazioni! Sei arrivato alla parte più breve e semplice della nostra serie di tutorial sugli NFT: come visualizzare il tuo NFT appena coniato in un portafoglio virtuale. Useremo MetaMask per questo esempio poiché lo abbiamo usato nelle due parti precedenti. +Congratulazioni! Sei arrivato alla parte più breve e semplice della nostra serie di tutorial sugli NFT: come visualizzare il tuo NFT appena coniato su un portafoglio virtuale. Utilizzeremo MetaMask per questo esempio, poiché è quello che abbiamo utilizzato nelle due parti precedenti. -Come prerequisito, dovresti già aver installato MetaMask sullo smartphone e dovrebbe includere il conto in cui hai coniato il tuo NFT, puoi ottenere l'app gratuitamente su [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) o su [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US). +Come prerequisito, dovresti avere già installato MetaMask sul dispositivo mobile e dovrebbe includere l'account su cui hai coniato il tuo NFT; puoi scaricare l'app gratuitamente su [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) o [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US). -## Fase 1: imposta la tua rete su Sepolia {#set-network-to-sepolia} +## Passaggio 1: Imposta la tua rete su Sepolia {#set-network-to-sepolia} -Nella parte superiore dell'app, premi il pulsante “Portafoglio”, dopodiché ti sarà richiesto di selezionare una rete. Dato che il nostro NFT è stato coniato sulla rete di Sepolia, ti consigliamo di selezionare Sepolia come tua rete. +Nella parte superiore dell'app, premi il pulsante "Wallet", dopodiché ti verrà chiesto di selezionare una rete. Poiché il nostro NFT è stato coniato sulla rete Sepolia, dovrai selezionare Sepolia come tua rete. -![Come impostare Sepolia come tua rete su MetaMask Mobile](./goerliMetamask.gif) +![Come impostare Sepolia come rete su MetaMask Mobile](./goerliMetamask.gif) -## Fase 2: aggiungi il tuo oggetto collezionabile a MetaMask {#add-nft-to-metamask} +## Passaggio 2: Aggiungi il tuo oggetto da collezione a MetaMask {#add-nft-to-metamask} -Una volta sulla rete di Sepolia, seleziona la scheda "Collezionabili" sulla destra e aggiungi l'indirizzo del contratto intelligente NFT e l'ID del token ERC-721 del tuo NFT (dovrebbe essere reperibile su Etherscan a seconda dell'hash della transazione del tuo NFT, distribuito nella parte II del nostro tutorial). +Una volta sulla rete Sepolia, seleziona la scheda "Collectibles" (Oggetti da collezione) sulla destra e aggiungi l'indirizzo del contratto intelligente dell'NFT e l'ID del token ERC-721 del tuo NFT, che dovresti riuscire a trovare su Etherscan in base all'hash della transazione del tuo NFT distribuito nella Parte II del nostro tutorial. -![Come trovare l'hash della tua transazione e l'ID del token ERC-721](./findNFTEtherscan.png) +![Come trovare l'hash della transazione e l'ID del token ERC-721](./findNFTEtherscan.png) -È possibile che tu debba ricaricare un paio di volte per vedere il tuo NFT — ma ci sarà ! +Potrebbe essere necessario aggiornare un paio di volte per visualizzare il tuo NFT, ma sarà lì ! ![Come caricare il tuo NFT su MetaMask](./findNFTMetamask.gif) -Congratulazioni! Hai coniato con successo un NFT, e puoi ora visualizzarlo! Non vediamo l'ora di vedere come conquisterai il mondo degli NFT! +Congratulazioni! Hai coniato con successo un NFT e ora puoi visualizzarlo! Non vediamo l'ora di vedere come conquisterai il mondo degli NFT! \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index 3726d1eff40..42b81e3c0b1 100644 --- a/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/it/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -1,82 +1,79 @@ --- -title: Come Scrivere e Distribuire un NFT (Parte 1/3 della Serie di tutorial sugli NFT) -description: Questo tutorial è la Parte 1 di una serie sui NFT che ti guiderà passo dopo passo alla scrittura e distribuzione del contratto intelligente di un Token Non Fungibile (token ERC-721) usando Ethereum e l'InterPlanetary File System (IPFS). +title: Come Scrivere e Distribuire un NFT (Parte 1/3 della Serie di Tutorial sugli NFT) +description: "Questo tutorial è la Parte 1 di una serie sugli NFT che ti guiderà passo dopo passo su come scrivere e distribuire un contratto intelligente per un Token Non Fungibile (token ERC-721) usando Ethereum e l'Inter Planetary File System (IPFS)." author: "Sumi Mudgil" -tags: - - "ERC-721" - - "Alchemy" - - "Solidity" - - "contratti intelligenti" +tags: ["ERC-721", "Alchemy", "Solidity", "contratti intelligenti"] skill: beginner -breadcrumb: "Creare e distribuire NFT" +breadcrumb: Scrivere e distribuire un NFT lang: it published: 2021-04-22 --- -Ora che gli NFT rendono nota la blockchain al grande pubblico, si presenta un'eccellente opportunità per comprendere questo interesse, pubblicando il tuo NFT (Token ERC-721) sulla blockchain di Ethereum! +Con gli NFT che portano la blockchain sotto gli occhi del pubblico, ora è un'ottima opportunità per comprendere tu stesso l'entusiasmo pubblicando il tuo contratto NFT (Token ERC-721) sulla blockchain di Ethereum! -Alchemy è estremamente orgogliosa di supportare i più grandi nomi nello spazio degli NFT, tra cui Makersplace (ha recentemente toccato un record nella vendita di opere d'arte digitali a Christie, per $69 milioni), Dapper Labs (creatori di NBA Top Shot e Crypto Kitties), OpenSea (il più grande mercato di NFT al mondo), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable e altri. +Alchemy è estremamente orgogliosa di alimentare i più grandi nomi nello spazio degli NFT, tra cui Makersplace (che ha recentemente stabilito un record di vendita di opere d'arte digitali da Christie's per 69 milioni di dollari), Dapper Labs (creatori di NBA Top Shot e Crypto Kitties), OpenSea (il più grande mercato di NFT al mondo), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable e altri ancora. -In questo tutorial, ti guideremo alla creazione e distribuzione di un contratto intelligente ERC-721 sulla rete di prova di Sepolia, utilizzando [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) e [Alchemy](https://alchemy.com/signup/eth) (non preoccuparti se ancora non capisci che significa; te lo spiegheremo!). +In questo tutorial, esamineremo la creazione e la distribuzione di un contratto intelligente ERC-721 sulla rete di test di Sepolia utilizzando [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) e [Alchemy](https://alchemy.com/signup/eth) (non preoccuparti se non capisci ancora cosa significhi tutto questo: lo spiegheremo!). -Nella Parte 2 di questo tutorial affronteremo come possiamo usare il nostro contratto intelligente per coniare un NFT e nella Parte 3 spiegheremo come visualizzare il tuo NFT su MetaMask. +Nella Parte 2 di questo tutorial vedremo come possiamo usare il nostro contratto intelligente per coniare un NFT, e nella Parte 3 spiegheremo come visualizzare il tuo NFT su MetaMask. -E, ovviamente, se in qualsiasi momento hai domande, non esitare a contattarci nel [Discord di Alchemy](https://discord.gg/gWuC7zB) o consulta [la documentazione sulle NFT API di Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)!! +E naturalmente, se hai domande in qualsiasi momento, non esitare a contattarci nel [Discord di Alchemy](https://discord.gg/gWuC7zB) o visita la [documentazione dell'API per NFT di Alchemy](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)! -## Fase 1: connettersi alla rete di Ethereum {#connect-to-ethereum} +## Passaggio 1: Connettiti alla rete di Ethereum {#connect-to-ethereum} -Esistono molti modi per effettuare richieste alla blockchain di Ethereum, ma per semplificare le cose, utilizzeremo un conto gratuito su [Alchemy](https://alchemy.com/signup/eth), una piattaforma per sviluppatori della blockchain e API, che ci consente di comunicare con la catena di Ethereum senza dover operare i nostri nodi. +Ci sono molti modi per fare richieste alla blockchain di Ethereum, ma per semplificare le cose, useremo un account gratuito su [Alchemy](https://alchemy.com/signup/eth), una piattaforma per sviluppatori blockchain e API che ci consente di comunicare con la catena di Ethereum senza dover eseguire i nostri nodi. -In questo tutorial, approfitteremo anche degli strumenti per monitoraggio e analisi per sviluppatori messi a disposizione da Alchemy per comprendere cosa succede dietro le quinte quando distribuiamo il nostro contratto intelligente. Se non hai già un conto di Alchemy, puoi iscriverti gratuitamente [qui](https://alchemy.com/signup/eth). +In questo tutorial, sfrutteremo anche gli strumenti per sviluppatori di Alchemy per il monitoraggio e l'analisi per capire cosa succede dietro le quinte nella distribuzione del nostro contratto intelligente. Se non hai già un account Alchemy, puoi registrarti gratuitamente [qui](https://alchemy.com/signup/eth). -## Fase 2: crea la tua app (e chiave API) {#make-api-key} +## Passaggio 2: Crea la tua app (e la chiave API) {#make-api-key} -Una volta creato un profilo di Alchemy, puoi generare una chiave API creando un'app. Questo ci consentirà di effettuare richieste alla rete di prova di Sepolia. Dai un'occhiata a [questa guida](https://docs.alchemyapi.io/guides/choosing-a-network) se vuoi maggiori informazioni sulle reti di prova. +Una volta creato un account Alchemy, puoi generare una chiave API creando un'app. Questo ci consentirà di fare richieste alla rete di test di Sepolia. Dai un'occhiata a [questa guida](https://docs.alchemyapi.io/guides/choosing-a-network) se sei curioso di saperne di più sulle reti di test. -1. Naviga fino alla pagina "Create App" nella tua Dashboard di Alchemy passando il puntatore del mouse su "Apps" nella barra di navigazione e cliccando su "Create App" +1. Vai alla pagina "Create App" nella tua Dashboard di Alchemy passando il mouse su "Apps" nella barra di navigazione e cliccando su "Create App" ![Crea la tua app](./create-your-app.png) -2. Dai un nome alla tua app (abbiamo scelto "My First NFT!"), inserisci una breve descrizione, seleziona “Ethereum” per la chain, e scegli “Sepolia" per la tua rete. Le altre reti di prova sono diventate obsolete in seguito alla fusione. +2. Dai un nome alla tua app (noi abbiamo scelto "My First NFT!"), offri una breve descrizione, seleziona "Ethereum" per la Chain e scegli "Sepolia" per la tua rete. Dalla Fusione (The Merge) le altre reti di test sono state deprecate. ![Configura e pubblica la tua app](./alchemy-explorer-sepolia.png) -3. Clicca su “Create app” e il gioco è fatto! La tua app dovrebbe apparire nella tabella seguente. +3. Clicca su "Create app" e il gioco è fatto! La tua app dovrebbe apparire nella tabella sottostante. -## Fase 3: crea un conto di Ethereum (indirizzo) {#create-eth-address} +## Passaggio 3: Crea un account Ethereum (indirizzo) {#create-eth-address} -Per inviare e ricevere le transazioni, necessitiamo di un conto di Ethereum. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser per gestire l'indirizzo del tuo conto di Ethereum. Se vuoi capire di più su come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/) della Ethereum Foundation. +Abbiamo bisogno di un account Ethereum per inviare e ricevere transazioni. Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser utilizzato per gestire l'indirizzo del tuo account Ethereum. Se vuoi capire meglio come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/) della Ethereum Foundation. -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando crei un account, o se ne possiedi già uno, assicurati di passare alla "Rete di prova di Sepolia" in alto a destra (così da non avere a che fare con denaro reale). +Puoi scaricare e creare un account MetaMask gratuitamente [qui](https://metamask.io/download). Quando crei un account, o se ne hai già uno, assicurati di passare alla "Sepolia Test Network" in alto a destra (in modo da non avere a che fare con denaro reale). ![Imposta Sepolia come tua rete](./metamask-goerli.png) -## Fase 4: aggiungi ether da un Faucet {#step-4-add-ether-from-a-faucet} +## Passaggio 4: Aggiungi ether da un rubinetto {#step-4-add-ether-from-a-faucet} -Per poter distribuire il nostro contratto intelligente alla rete di prova, avremo prima bisogno di degli ETH finti. Per ottenere ETH puoi andare al [Faucet di Sepolia](https://sepoliafaucet.com/) ospitato da Alchemy, accedi e inserisci l'indirizzo del tuo account, fai clic su “Inviami ETH”. Subito dopo, dovresti vedere gli ETH nel tuo conto di MetaMask! +Per distribuire il nostro contratto intelligente sulla rete di test, avremo bisogno di alcuni ETH finti. Per ottenere ETH puoi andare al [Rubinetto di Sepolia](https://sepoliafaucet.com/) ospitato da Alchemy, accedere e inserire l'indirizzo del tuo account, cliccare su "Send Me ETH". Dovresti vedere gli ETH nel tuo account MetaMask subito dopo! -## Fase 5: controlla il saldo {#check-balance} +## Passaggio 5: Controlla il tuo saldo {#check-balance} -Per ricontrollare che ci sia il saldo, facciamo una richiesta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando lo [strumento compositore di Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Questo restituirà l'importo di ETH nel nostro portafoglio. Dopo aver inserito l'indirizzo del tuo conto di MetaMask e aver cliccato “Invia richiesta”, dovresti vedere una risposta come questa: +Per verificare che il nostro saldo sia presente, facciamo una richiesta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) utilizzando lo [strumento composer di Alchemy](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Questo restituirà la quantità di ETH nel nostro portafoglio. Dopo aver inserito l'indirizzo del tuo account MetaMask e cliccato su "Send Request", dovresti vedere una risposta come questa: `{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}` -> **NOTA:** Questo risultato è in wei, non in ETH. Wei è usato come taglio più piccolo dell'ether. La conversione da wei a ETH è: 1 eth = 1018 wei. Quindi se convertiamo 0xde0b6b3a7640000 in decimali, otteniamo 1\*1018 wei, pari a 1 ETH. +> **Nota** Questo risultato è in wei, non in ETH. Il wei è utilizzato come la più piccola denominazione di ether. La conversione da wei a ETH è 1 eth = 1018 wei. Quindi, se convertiamo 0xde0b6b3a7640000 in decimale otteniamo 1\*1018 wei, che equivale a 1 ETH. -Meno male! I nostri soldi finti ci sono tutti. +Fiuuu! I nostri soldi finti ci sono tutti. -## Fase 6: inizializza il progetto {#initialize-project} +## Passaggio 6: Inizializza il nostro progetto {#initialize-project} -Prima, dovremo creare una cartella per il nostro progetto. Vai alla riga di comando e digita: +Per prima cosa, dovremo creare una cartella per il nostro progetto. Vai alla riga di comando e digita: mkdir my-nft cd my-nft -Ora che siamo nella cartella del nostro progetto, useremo npm init per inizializzare il progetto. Se non hai già installato npm, segui [queste istruzioni](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (avremo anche bisogno di [Node.js](https://nodejs.org/en/download/), quindi scarica anche questo!). +Ora che siamo all'interno della cartella del nostro progetto, useremo npm init per inizializzare il progetto. Se non hai già installato npm, segui [queste istruzioni](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (avremo bisogno anche di [Node.js](https://nodejs.org/en/download/), quindi scarica anche quello!). npm init -Non è importante come rispondi alle domande d'installazione; a titolo di esempio, ecco le nostre risposte: +Non importa molto come rispondi alle domande di installazione; ecco come abbiamo fatto noi come riferimento: + ```json package name: (my-nft) version: (1.0.0) @@ -101,25 +98,26 @@ Non è importante come rispondi alle domande d'installazione; a titolo di esempi "license": "ISC" } ``` -Approva il package.json, e siamo pronti! -## Fase 7: installa [Hardhat](https://hardhat.org/getting-started/#overview) {#install-hardhat} +Approva il package.json e siamo pronti a partire! + +## Passaggio 7: Installa [Hardhat](https://hardhat.org/getting-started/#overview) {#install-hardhat} -Hardhat è un ambiente di sviluppo per compilare, distribuire, testare ed effettuare il debug del tuo software di Ethereum. Aiuta gli sviluppatori nella costruzione di contratti intelligenti e dapp localmente, prima di distribuirli alla catena. +Hardhat è un ambiente di sviluppo per compilare, distribuire, testare ed eseguire il debug del tuo software Ethereum. Aiuta gli sviluppatori nella creazione di contratti intelligenti e dApp localmente prima di distribuirli sulla catena attiva. -Nel nostro progetto my-nft esegui: +All'interno del nostro progetto my-nft esegui: npm install --save-dev hardhat -Dai un'occhiata a questa pagina per ulteriori dettagli sulle [istruzioni d'installazione](https://hardhat.org/getting-started/#overview). +Dai un'occhiata a questa pagina per maggiori dettagli sulle [istruzioni di installazione](https://hardhat.org/getting-started/#overview). -## Fase 8: crea un progetto Hardhat {#create-hardhat-project} +## Passaggio 8: Crea il progetto Hardhat {#create-hardhat-project} -Nella cartella del nostro progetto esegui: +All'interno della cartella del nostro progetto esegui: npx hardhat -Dovresti poi vedere un messaggio di benvenuto e l'opzione per selezionare cosa desideri fare. Seleziona “crea un hardhat.config.js vuoto”: +Dovresti quindi vedere un messaggio di benvenuto e l'opzione per selezionare cosa vuoi fare. Seleziona "create an empty hardhat.config.js": 888 888 888 888 888 888 888 888 888 888 @@ -130,36 +128,36 @@ Dovresti poi vedere un messaggio di benvenuto e l'opzione per selezionare cosa d 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷‍ - ? Cosa vuoi fare? … + ? What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit -Questo genererà un file hardhat.config.js, in cui specificheremo tutta la configurazione per il nostro progetto (alla fase 13). +Questo genererà per noi un file hardhat.config.js che è dove specificheremo tutta la configurazione per il nostro progetto (nel passaggio 13). -## Fase 9: aggiungi le cartelle del progetto {#add-project-folders} +## Passaggio 9: Aggiungi le cartelle del progetto {#add-project-folders} -Per mantenere organizzato il nostro progetto, creeremo due nuove cartelle. Vai alla cartella di root del tuo progetto nella tua riga di comando e digita: +Per mantenere organizzato il nostro progetto, creeremo due nuove cartelle. Vai alla directory principale del tuo progetto nella riga di comando e digita: mkdir contracts mkdir scripts -- contracts/ è dove manterremo il codice del contratto intelligente del nostro NFT +- contracts/ è dove conserveremo il codice del nostro contratto intelligente per l'NFT -- scripts/ è dove manterremo gli script per distribuire e interagire con il nostro contratto intelligente +- scripts/ è dove conserveremo gli script per distribuire e interagire con il nostro contratto intelligente -## Fase 10: compila il nostro contratto {#write-contract} +## Passaggio 10: Scrivi il nostro contratto {#write-contract} -Ora che il nostro ambiente è configurato, passiamo alle cose più entusiasmanti: _scrivere il codice del nostro contratto intelligente!_ +Ora che il nostro ambiente è configurato, passiamo a cose più entusiasmanti: _scrivere il codice del nostro contratto intelligente!_ -Apri il progetto my-nft nel tuo editor preferito (a noi piace [VSCode](https://code.visualstudio.com/)). I contratti intelligenti sono scritti in un linguaggio detto Solidity, che useremo per scrivere il nostro contratto intelligente MyNFT.sol. +Apri il progetto my-nft nel tuo editor preferito (a noi piace [VSCode](https://code.visualstudio.com/)). I contratti intelligenti sono scritti in un linguaggio chiamato Solidity, che è quello che useremo per scrivere il nostro contratto intelligente MyNFT.sol.‌ 1. Vai alla cartella `contracts` e crea un nuovo file chiamato MyNFT.sol -2. Segue il codice del contratto intelligente del nostro NFT, che abbiamo basato sull'implementazione ERC-721 della libreria di [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721). Copia e incolla i seguenti contenuti nel tuo file MyNFT.sol. +2. Di seguito è riportato il codice del nostro contratto intelligente per l'NFT, che abbiamo basato sull'implementazione ERC-721 della libreria [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721). Copia e incolla i contenuti sottostanti nel tuo file MyNFT.sol. ```solidity - //Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) + // Contratto basato su [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721) // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; @@ -187,83 +185,85 @@ Apri il progetto my-nft nel tuo editor preferito (a noi piace [VSCode](https://c return newItemId; } } - ``` +``` -3. Poiché stiamo ereditando classi dalla libreria di contratti di OpenZeppelin, nella riga di comando esegui `npm install @openzeppelin/contracts` per installare la libreria nella nostra cartella. +3. Poiché stiamo ereditando classi dalla libreria di contratti OpenZeppelin, nella tua riga di comando esegui `npm install @openzeppelin/contracts^4.0.0` per installare la libreria nella nostra cartella. -Quindi, cosa _fa_ esattamente questo codice? Analizziamolo, riga dopo riga. +Quindi, cosa _fa_ esattamente questo codice? Analizziamolo riga per riga. -In cima al nostro contratto intelligente, importiamo tre classi del contratto intelligente di [OpenZeppelin](https://openzeppelin.com/): +All'inizio del nostro contratto intelligente, importiamo tre classi di contratti intelligenti di [OpenZeppelin](https://openzeppelin.com/): -- @openzeppelin/contracts/token/ERC721/ERC721.sol contiene l'implementazione dello standard ERC-721, che il contratto intelligente del nostro NFT erediterà. (Per essere un NFT valido, il tuo contratto intelligente deve implementare tutti i metodi dello standard ERC-721.) Per saperne di più sulle funzioni ERC-721 ereditate, dai un'occhiata alla definizione dell'interfaccia [qui](https://eips.ethereum.org/EIPS/eip-721). +- @openzeppelin/contracts/token/ERC721/ERC721.sol contiene l'implementazione dello standard ERC-721, che il nostro contratto intelligente per l'NFT erediterà. (Per essere un NFT valido, il tuo contratto intelligente deve implementare tutti i metodi dello standard ERC-721). Per saperne di più sulle funzioni ERC-721 ereditate, dai un'occhiata alla definizione dell'interfaccia [qui](https://eips.ethereum.org/EIPS/eip-721). -- @openzeppelin/contracts/utils/Counters.sol fornisce contatori che possono esser solo incrementati o diminuiti di unità alla volta. Il nostro contratto intelligente usa un contatore per tener traccia del numero totale di NFT coniati e impostare l'ID univoco sul nostro nuovo NFT. (A ogni NFT coniato usando un contratto intelligente, dev'esser assegnato un ID univoco, qui il nostro ID univoco è determinato solo dal numero totale di NFT esistenti. Ad esempio, il primo NFT che coniamo con il nostro contratto intelligente ha un ID di "1," il nostro secondo NFT ha un ID di "2," ecc.) +- @openzeppelin/contracts/utils/Counters.sol fornisce contatori che possono essere solo incrementati o decrementati di uno. Il nostro contratto intelligente utilizza un contatore per tenere traccia del numero totale di NFT coniati e impostare l'ID univoco sul nostro nuovo NFT. (A ogni NFT coniato utilizzando un contratto intelligente deve essere assegnato un ID univoco: qui il nostro ID univoco è semplicemente determinato dal numero totale di NFT esistenti. Ad esempio, il primo NFT che coniamo con il nostro contratto intelligente ha un ID di "1", il nostro secondo NFT ha un ID di "2", ecc.) -- @openzeppelin/contracts/access/Ownable.sol imposta [il controllo d'accesso](https://docs.openzeppelin.com/contracts/3.x/access-control) sul nostro contratto intelligente, così solo il proprietario del contratto intelligente (tu) può coniare NFT. (Nota, prevedere il controllo dell'accesso è totalmente facoltativo. Se volessi che tutti potessero coniare un NFT usando il tuo contratto intelligente, dovresti rimuovere la parola Ownable alla riga 10 e onlyOwner alla riga 17.) +- @openzeppelin/contracts/access/Ownable.sol imposta il [controllo degli accessi](https://docs.openzeppelin.com/contracts/3.x/access-control) sul nostro contratto intelligente, in modo che solo il proprietario del contratto intelligente (tu) possa coniare NFT. (Nota, includere il controllo degli accessi è interamente una preferenza. Se desideri che chiunque possa coniare un NFT utilizzando il tuo contratto intelligente, rimuovi la parola Ownable alla riga 10 e onlyOwner alla riga 17). -Dopo le nostre dichiarazioni d'importazione, abbiamo il contratto intelligente del nostro NFT personalizzato, che è sorprendentemente corto: contiene solo un contatore, un costruttore e una funzione singola! Questo grazie ai nostri contratti ereditati da OpenZeppelin, che implementa gran parte dei metodi che necessitiamo per creare un NFT, come `ownerOf`, che restituisce il proprietario del NFT e `transferFrom`, che trasferisce la proprietà del NFT da un conto a un altro. +Dopo le nostre istruzioni di importazione, abbiamo il nostro contratto intelligente NFT personalizzato, che è sorprendentemente breve: contiene solo un contatore, un costruttore e una singola funzione! Questo grazie ai nostri contratti OpenZeppelin ereditati, che implementano la maggior parte dei metodi di cui abbiamo bisogno per creare un NFT, come `ownerOf` che restituisce il proprietario dell'NFT, e `transferFrom`, che trasferisce la proprietà dell'NFT da un account a un altro. -Nel nostro costruttore ERC-721, noterai che passiamo 2 stringhe, “MyNFT” e “NFT.” La prima variabile è il nome del contratto intelligente e la seconda è il suo simbolo. Puoi assegnare a ciascuna di queste variabili il nome che desideri! +Nel nostro costruttore ERC-721, noterai che passiamo 2 stringhe, "MyNFT" e "NFT". La prima variabile è il nome del contratto intelligente e la seconda è il suo simbolo. Puoi nominare ciascuna di queste variabili come preferisci! -Infine, abbiamo la nostra funzione `mintNFT(address recipient, string tokenURI)` che ci consente di coniare un NFT! Noterai che questa funzione usa due variabili: +Infine, abbiamo la nostra funzione `mintNFT(address recipient, string memory tokenURI)` che ci permette di coniare un NFT! Noterai che questa funzione accetta due variabili: - `address recipient` specifica l'indirizzo che riceverà il tuo NFT appena coniato -- `string memory tokenURI` è una stringa che dovrebbe risolversi in un documento JSON che descrive i metadati dell'NFT. I metadati di un NFT sono davvero ciò che lo porta in vita, consentendogli di avere proprietà configurabili, quali nome, descrizione, immagine e altri attributi. Nella parte 2 di questo tutorial, descriveremo come configurare questi metadati. +- `string memory tokenURI` è una stringa che dovrebbe risolversi in un documento JSON che descrive i metadati dell'NFT. I metadati di un NFT sono in realtà ciò che gli dà vita, consentendogli di avere proprietà configurabili, come un nome, una descrizione, un'immagine e altri attributi. Nella parte 2 di questo tutorial, descriveremo come configurare questi metadati. -`mintNFT` chiama alcuni metodi dalla libreria ERC-721 ereditata e, infine, restituisce un numero che rappresenta l'ID dell'NFT appena coniato. +`mintNFT` chiama alcuni metodi dalla libreria ERC-721 ereditata e, in definitiva, restituisce un numero che rappresenta l'ID dell'NFT appena coniato. -## Fase 11: connetti MetaMask e Alchemy al tuo progetto {#connect-metamask-and-alchemy} +## Passaggio 11: Connetti MetaMask e Alchemy al tuo progetto {#connect-metamask-and-alchemy} -Ora che abbiamo creato un portafoglio di MetaMask, un conto di Alchemy e scritto il nostro contratto intelligente, è il momento di collegarli. +Ora che abbiamo creato un portafoglio MetaMask, un account Alchemy e scritto il nostro contratto intelligente, è il momento di connettere i tre. -Ogni transazione inviata dal tuo portafoglio virtuale richiede una firma tramite la tua chiave privata unica. Per fornire al nostro programma quest'autorizzazione, possiamo memorizzare in sicurezza la nostra chiave privata (e la chiave API di Alchemy) in un file ambientale. +Ogni transazione inviata dal tuo portafoglio virtuale richiede una firma utilizzando la tua chiave privata univoca. Per fornire al nostro programma questa autorizzazione, possiamo archiviare in modo sicuro la nostra chiave privata (e la chiave API di Alchemy) in un file di ambiente. -Per saperne di più sull'invio delle transazioni, dai un'occhiata a [questo tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sull'invio di transazioni usando web3. +Per saperne di più sull'invio di transazioni, dai un'occhiata a [questo tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sull'invio di transazioni utilizzando web3. -Prima, installa il pacchetto dotenv nella cartella del tuo progetto: +Per prima cosa, installa il pacchetto dotenv nella directory del tuo progetto: npm install dotenv --save -Poi, crea un file `.env` nella cartella di root del nostro progetto e aggiungi la tua chiave privata di MetaMask e l'URL API di Alchemy HTTP. +Quindi, crea un file `.env` nella directory principale del nostro progetto e aggiungi la tua chiave privata di MetaMask e l'URL HTTP dell'API di Alchemy. - Segui [queste istruzioni](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) per esportare la tua chiave privata da MetaMask -- Vedi di seguito come ottenere l'URL dell'API di Alchemy HTTP e copialo negli appunti +- Vedi sotto per ottenere l'URL HTTP dell'API di Alchemy e copialo negli appunti -![Copia l'URL dell'API di Alchemy](./copy-alchemy-api-url.gif) +![Copia l'URL della tua API di Alchemy](./copy-alchemy-api-url.gif) -Il tuo `.env` dovrebbe somigliare a questo: +Il tuo `.env` dovrebbe ora apparire così: API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY="your-metamask-private-key" -Per connetterli realmente al nostro codice, faremo riferimento a queste variabili nel nostro file hardhat.config.js nella fase 13. +Per connetterli effettivamente al nostro codice, faremo riferimento a queste variabili nel nostro file hardhat.config.js nel passaggio 13. -## Fase 12: installa Ethers.js {#install-ethers} +## Passaggio 12: Installa Ethers.js {#install-ethers} -Ethers.js è una libreria che rende più facile interagire ed effettuare richieste a Ethereum tramite wrapping dei [metodi JSON-RPC standard](/developers/docs/apis/json-rpc/) con altri metodi più facili da usare. +Ethers.js è una libreria che semplifica l'interazione e l'esecuzione di richieste a Ethereum avvolgendo i [metodi JSON-RPC standard](/developers/docs/apis/json-rpc/) con metodi più intuitivi. -Hardhat rende davvero facile integrare [Plugin](https://hardhat.org/plugins/) per strumenti e funzionalità aggiuntive. Sfrutteremo il [plugin di Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) per la distribuzione del contratto ([Ethers.js](https://github.com/ethers-io/ethers.js/) ha dei metodi di distribuzione del contratto molto puliti). +Hardhat rende facilissimo integrare [Plugin](https://hardhat.org/plugins/) per strumenti aggiuntivi e funzionalità estese. Sfrutteremo il [plugin Ethers](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) per la distribuzione dei contratti ([Ethers.js](https://github.com/ethers-io/ethers.js/) ha alcuni metodi di distribuzione dei contratti super puliti). -Nella cartella del tuo progetto digita: +Nella directory del tuo progetto digita: npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0 -Avremo bisogno di ethers anche nel nostro hardhat.config.js nella prossima fase. +Richiederemo anche ethers nel nostro hardhat.config.js nel passaggio successivo. -## Fase 13: aggiorna hardhat.config.js {#update-hardhat-config} +## Passaggio 13: Aggiorna hardhat.config.js {#update-hardhat-config} -Finora abbiamo aggiunto diverse dipendenze e plugin, ora dobbiamo aggiornare hardhat.config.js in modo che il nostro progetto li riconosca tutti. +Finora abbiamo aggiunto diverse dipendenze e plugin, ora dobbiamo aggiornare hardhat.config.js in modo che il nostro progetto li conosca tutti. -Aggiorna il tuo hardhat.config.js affinché appaia così: +Aggiorna il tuo hardhat.config.js in modo che appaia così: ```js - /** - * @type import('hardhat/config').HardhatUserConfig - */ + /* * + * @type import('hardhat/config').HardhatUserConfig */ + + + require('dotenv').config(); require("@nomiclabs/hardhat-ethers"); const { API_URL, PRIVATE_KEY } = process.env; @@ -280,27 +280,27 @@ Aggiorna il tuo hardhat.config.js affinché appaia così: } ``` -## Fase 14: compila il contratto {#compile-contract} +## Passaggio 14: Compila il nostro contratto {#compile-contract} -Per assicurarti che tutto funzioni fino a questo punto, compila il contratto. L'attività di compilazione è una delle attività integrate di hardhat. +Per assicurarci che tutto funzioni finora, compiliamo il nostro contratto. L'attività di compilazione è una delle attività integrate di hardhat. Dalla riga di comando esegui: npx hardhat compile -Potresti ottenere un avviso sull'assenza nel file sorgente dell'identificativo della licenza SPDX, ma non preoccupartene, tutto il resto dovrebbe funzionare! Altrimenti, puoi sempre inviare un messaggio nel [Discord di Alchemy](https://discord.gg/u72VCg3). +Potresti ricevere un avviso relativo all'identificatore di licenza SPDX non fornito nel file sorgente, ma non c'è da preoccuparsi: si spera che tutto il resto vada bene! In caso contrario, puoi sempre inviare un messaggio nel [Discord di Alchemy](https://discord.gg/u72VCg3). -## Fase 15: scrivi lo script di distribuzione {#write-deploy} +## Passaggio 15: Scrivi il nostro script di distribuzione {#write-deploy} -Ora che il nostro contratto è scritto e il nostro file di configurazione è pronto, è il momento di scrivere lo script di distribuzione del contratto. +Ora che il nostro contratto è scritto e il nostro file di configurazione è pronto, è il momento di scrivere il nostro script di distribuzione del contratto. -Vai alla cartella `script/` e crea un nuovo file chiamato `deploy.js`, aggiungendo i seguenti contenuti: +Vai alla cartella `scripts/` e crea un nuovo file chiamato `deploy.js`, aggiungendovi i seguenti contenuti: ```js async function main() { const MyNFT = await ethers.getContractFactory("MyNFT") - // Start deployment, returning a promise that resolves to a contract object + // Avvia il deployment, restituendo una promise che si risolve in un oggetto contratto const myNFT = await MyNFT.deploy() await myNFT.deployed() console.log("Contract deployed to address:", myNFT.address) @@ -314,40 +314,40 @@ main() }) ``` -Nel suo [tutorial sui Contratti](https://hardhat.org/tutorial/testing-contracts.html#writing-tests) hardhat spiega in modo eccellente cosa fa ognuna di queste righe di codice nel loro, quindi riportiamo qui le loro spiegazioni. +Hardhat fa un lavoro straordinario nello spiegare cosa fa ciascuna di queste righe di codice nel loro [tutorial sui Contratti](https://hardhat.org/tutorial/testing-contracts.html#writing-tests), abbiamo adottato le loro spiegazioni qui. const MyNFT = await ethers.getContractFactory("MyNFT"); -Un ContractFactory su ethers.js è un'astrazione usata per distribuire nuovi contratti intelligenti, quindi MyNFT qui è una fabbrica di istanze del nostro contratto NFT. Usando il plugin hardhat-ethers, le istanze ContractFactory e Contract sono connesse di default al primo firmatario. +Una ContractFactory in ethers.js è un'astrazione utilizzata per distribuire nuovi contratti intelligenti, quindi MyNFT qui è una fabbrica per le istanze del nostro contratto NFT. Quando si utilizza il plugin hardhat-ethers, le istanze ContractFactory e Contract sono connesse al primo firmatario per impostazione predefinita. const myNFT = await MyNFT.deploy(); -Chiamare deploy() su un ContractFactory avvierà la distribuzione e restituirà una promessa che si risolverà in un contratto. Questo è l'oggetto che ha un metodo per ciascuna delle funzioni del nostro smart contract. +Chiamare deploy() su una ContractFactory avvierà la distribuzione e restituirà una Promise che si risolve in un Contract. Questo è l'oggetto che ha un metodo per ciascuna delle funzioni del nostro contratto intelligente. -## Fase 16: distribuisci il contratto {#deploy-contract} +## Passaggio 16: Distribuisci il nostro contratto {#deploy-contract} -Siamo finalmente pronti a distribuire il nostro smart contract! Torna alla root della cartella del tuo progetto e nella riga di comando esegui: +Siamo finalmente pronti per distribuire il nostro contratto intelligente! Torna alla radice della directory del tuo progetto e nella riga di comando esegui: npx hardhat --network sepolia run scripts/deploy.js -Vorrai poi vedere qualcosa del genere: +Dovresti quindi vedere qualcosa del genere: - Contratto distribuito all'indirizzo: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 + Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 -Se andiamo su [Sepolia etherscan](https://sepolia.etherscan.io/) e cerchiamo l'indirizzo del nostro contratto, dovremmo poter vedere che è stato distribuito correttamente. Se non riesci a vederlo immediatamente, attendi alcuni istanti poiché potrebbe essere necessario un po' di tempo. La transazione somiglierà a questa: +Se andiamo su [Sepolia etherscan](https://sepolia.etherscan.io/) e cerchiamo l'indirizzo del nostro contratto, dovremmo essere in grado di vedere che è stato distribuito con successo. Se non riesci a vederlo immediatamente, attendi un po' poiché potrebbe volerci del tempo. La transazione apparirà più o meno così: ![Visualizza l'indirizzo della tua transazione su Etherscan](./etherscan-sepoila-contract-creation.png) -L'indirizzo "Da" dovrebbe corrispondere all'indirizzo del tuo account di MetaMask mentre l'indirizzo "A" sarà: “Creazione del contratto.” Se facciamo clic sulla transazione, vediamo l'indirizzo del nostro contratto nel campo "A": +L'indirizzo "From" dovrebbe corrispondere all'indirizzo del tuo account MetaMask e l'indirizzo "To" dirà "Contract Creation". Se clicchiamo sulla transazione, vedremo l'indirizzo del nostro contratto nel campo "To": ![Visualizza l'indirizzo del tuo contratto su Etherscan](./etherscan-sepolia-tx-details.png) -Sììììììììììì! Hai appena distribuito il tuo contratto intelligente NFT alla catena (testnet) di Ethereum! +Siiii! Hai appena distribuito il tuo contratto intelligente per l'NFT sulla catena (rete di test) di Ethereum! -Per capire cosa sta succedendo, andiamo alla scheda Explorer nel nostro [dashboard di Alchemy](https://dashboard.alchemyapi.io/explorer). Se hai diverse app di Alchemy, assicurati di filtrare per app e selezionare "MyNFT". +Per capire cosa succede dietro le quinte, andiamo alla scheda Explorer nella nostra [dashboard di Alchemy](https://dashboard.alchemyapi.io/explorer). Se hai più app Alchemy, assicurati di filtrare per app e seleziona "MyNFT". -![Visualizza le chiamate effettuate "dietro le quinte" con il pannello Explorer di Alchemy](./alchemy-explorer-goerli.png) +![Visualizza le chiamate effettuate "dietro le quinte" con la Dashboard Explorer di Alchemy](./alchemy-explorer-goerli.png) -Qui vedrai numerose chiamate a JSON-RPC che Hardhat/Ethers ha effettuato per noi quando abbiamo chiamato la funzione .deploy(). Due funzioni importanti da chiamare qui sono [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), che è la richiesta di scrivere realmente il nostro contratto intelligente sulla catena di Sepolia e [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), che è una richiesta di leggere le informazioni sulla nostra transazione dato l'hash (uno schema tipico quando si inviano le transazioni). Per saperne di più sull'invio delle transazioni, dai un'occhiata a questo tutorial [ sull'invio di transazioni usando web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). +Qui vedrai una manciata di chiamate JSON-RPC che Hardhat/Ethers ha effettuato dietro le quinte per noi quando abbiamo chiamato la funzione .deploy(). Due importanti da segnalare qui sono [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), che è la richiesta per scrivere effettivamente il nostro contratto intelligente sulla catena di Sepolia, ed [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash) che è una richiesta per leggere informazioni sulla nostra transazione dato l'hash (un modello tipico quando si inviano transazioni). Per saperne di più sull'invio di transazioni, dai un'occhiata a questo tutorial sull'[invio di transazioni utilizzando Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). -È tutto per la parte 1 di questo tutorial. Nella [parte 2 interagiremo realmente con il nostro contratto intelligente, coniando un NFT](/developers/tutorials/how-to-mint-an-nft/) e nella [parte 3 ti mostreremo come visualizzare il tuo NFT nel tuo portafoglio di Ethereum](/developers/tutorials/how-to-view-nft-in-metamask/)! +Questo è tutto per la Parte 1 di questo tutorial. Nella [Parte 2, interagirai effettivamente con il nostro contratto intelligente coniando un NFT](/developers/tutorials/how-to-mint-an-nft/), e nella [Parte 3 ti mostreremo come visualizzare il tuo NFT nel tuo portafoglio Ethereum](/developers/tutorials/how-to-view-nft-in-metamask/)! \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/it/developers/tutorials/interact-with-other-contracts-from-solidity/index.md index cc752b68ab3..e9ded297c97 100644 --- a/public/content/translations/it/developers/tutorials/interact-with-other-contracts-from-solidity/index.md +++ b/public/content/translations/it/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -1,15 +1,10 @@ --- -title: Interazione con altri contratti da Solidity -description: Come distribuire uno Smart Contract da uno esistente e interagirvi +title: Interagire con altri contratti da Solidity +description: Come distribuire un contratto intelligente da un contratto esistente e interagirvi author: "jdourlens" -tags: - - "smart contract" - - "Solidity" - - "remix" - - "distribuzione" - - "componibilità" +tags: ["contratti intelligenti", "Solidity", "Remix", "distribuzione", "componibilità"] skill: advanced -breadcrumb: "Interazioni tra contratti" +breadcrumb: Interazioni tra contratti lang: it published: 2020-04-05 source: EthereumDev @@ -17,9 +12,9 @@ sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -Nei tutorial precedenti abbiamo imparato molto su [come distribuire il primo Smart Contract](/developers/tutorials/deploying-your-first-smart-contract/) e aggiungervi alcune funzionalità come il [controllo degli accessi con modificatori](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) o la [gestione degli errori in Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). In questo tutorial impareremo come distribuire uno Smart Contract da uno esistente e interagirvi. +Nei tutorial precedenti abbiamo imparato molto su [come distribuire il tuo primo contratto intelligente](/developers/tutorials/deploying-your-first-smart-contract/) e aggiungervi alcune funzionalità come [controllare l'accesso con i modificatori](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) o [gestire gli errori in Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). In questo tutorial impareremo come distribuire un contratto intelligente da un contratto esistente e interagirvi. -Creeremo un contratto che permetta a chiunque ad avere uno Smart Contract `Counter` creando una factory associata, il cui nome sarà `CounterFactory`. Prima di tutto, ecco il codice del nostro Smart Contract iniziale `Counter`: +Creeremo un contratto che consenta a chiunque di avere il proprio contratto intelligente `Counter` creandone una fabbrica (factory), il cui nome sarà `CounterFactory`. Innanzitutto, ecco il codice del nostro contratto intelligente `Counter` iniziale: ```solidity pragma solidity 0.5.17; @@ -57,19 +52,19 @@ contract Counter { } ``` -Nota: abbiamo leggermente modificato il codice del contratto per tenere traccia dell'indirizzo della factory e dell'indirizzo del proprietario del contratto. Quando si chiama il codice di un contratto da un altro contratto, msg.sender fa riferimento all'indirizzo della factory del contratto. È **molto importante comprendere questo concetto**, perché usare un contratto per interagire con altri contratti è una prassi comune. Dovresti quindi saper gestire il mittente nei casi complessi. +Nota che abbiamo leggermente modificato il codice del contratto per tenere traccia dell'indirizzo della factory e dell'indirizzo del proprietario del contratto. Quando chiami il codice di un contratto da un altro contratto, il msg.sender si riferirà all'indirizzo della nostra factory del contratto. Questo è **un punto davvero importante da comprendere** poiché usare un contratto per interagire con altri contratti è una pratica comune. Dovresti quindi prestare attenzione a chi è il mittente nei casi complessi. -Per questo motivo abbiamo aggiunto anche un modificatore `onlyFactory` che fa in modo che la funzione di cambiamento dello stato sia chiamabile solo dalla factory che passerà il chiamante originale come parametro. +Per questo abbiamo anche aggiunto un modificatore `onlyFactory` che si assicura che la funzione che modifica lo stato possa essere chiamata solo dalla factory, la quale passerà il chiamante originale come parametro. -Nella nostra nuova `CounterFactory` che gestirà tutti gli altri Counter aggiungeremo un mapping che assocerà un proprietario all'indirizzo del relativo contratto Counter: +All'interno della nostra nuova `CounterFactory` che gestirà tutti gli altri Counter, aggiungeremo una mappatura (mapping) che assocerà un proprietario all'indirizzo del suo contratto counter: ```solidity mapping(address => Counter) _counters; ``` -In Ethereum, i mapping equivalgono agli oggetti di Javascript, che permettono di mappare una chiave di tipo A a un valore di tipo B. In questo caso mappiamo l'indirizzo di un proprietario all'istanza del suo Counter. +In Ethereum, le mappature sono l'equivalente degli oggetti in javascript, consentono di mappare una chiave di tipo A a un valore di tipo B. In questo caso mappiamo l'indirizzo di un proprietario con l'istanza del suo Counter. -Istanziare un nuovo Counter per un utente sarà più o meno: +L'istanziazione di un nuovo Counter per qualcuno avrà questo aspetto: ```solidity function createCounter() public { @@ -78,9 +73,9 @@ Istanziare un nuovo Counter per un utente sarà più o meno: } ``` -Prima controlliamo se la persona possiede già un Counter. Se non lo possiede, istanziamo un nuovo Counter passandone l'indirizzo al costruttore del `Counter` e assegniamo l'istanza appena creata al mapping. +Per prima cosa controlliamo se la persona possiede già un counter. Se non possiede un counter, istanziamo un nuovo counter passando il suo indirizzo al costruttore di `Counter` e assegniamo l'istanza appena creata alla mappatura. -Ottenere il conteggio di un Counter specifico significa: +Per ottenere il conteggio di un Counter specifico, l'aspetto sarà questo: ```solidity function getCount(address account) public view returns (uint256) { @@ -93,9 +88,9 @@ function getMyCount() public view returns (uint256) { } ``` -La prima funzione controlla se il contratto Counter esiste per un determinato indirizzo e poi chiama il metodo `getCount` dall'istanza. La seconda funzione: `getMyCount` è passa direttamente msg.sender alla funzione `getCount`. +La prima funzione controlla se il contratto Counter esiste per un dato indirizzo e poi chiama il metodo `getCount` dall'istanza. La seconda funzione: `getMyCount` è solo una scorciatoia per passare il msg.sender direttamente alla funzione `getCount`. -La funzione `increment` è abbastanza simile ma passa il mittente della transazione originale al contratto `Counter`: +La funzione `increment` è abbastanza simile ma passa il mittente originale della transazione al contratto `Counter`: ```solidity function increment() public { @@ -104,9 +99,9 @@ function increment() public { } ``` -Nota: se chiamato troppe volte, il Counter potrebbe rimanere vittima di overflow. È consigliabile usare la [libreria di SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) il più possibile per evitare questa eventualità. +Nota che se chiamato troppe volte, il nostro counter potrebbe essere vittima di un overflow. Dovresti usare la [libreria SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) il più possibile per proteggerti da questo possibile caso. -Per distribuire il contratto, dovrai fornire sia il codice della `CounterFactory` che il `Counter`. Quando si esegue la distribuzione ad esempio in Remix, è necessario selezionare CounterFactory. +Per distribuire il nostro contratto, dovrai fornire sia il codice della `CounterFactory` che del `Counter`. Quando distribuisci, ad esempio in Remix, dovrai selezionare CounterFactory. Ecco il codice completo: @@ -171,8 +166,8 @@ contract CounterFactory { } ``` -Dopo la compilazione, nella sezione di distribuzione di Remix si selezionerà la factory da distribuire: +Dopo la compilazione, nella sezione di distribuzione di Remix selezionerai la factory da distribuire: ![Selezione della factory da distribuire in Remix](./counterfactory-deploy.png) -A questo punto puoi fare esperimenti la factory del contratto e controllare il valore che cambia. Se vorresti chiamare il contratto intelligente da un indirizzo differente, dovrai cambiare l'indirizzo nella selezione Conto di Remix. +Quindi puoi giocare con la tua factory del contratto e controllare il cambiamento del valore. Se desideri chiamare il contratto intelligente da un indirizzo diverso, dovrai cambiare l'indirizzo nella selezione Account di Remix. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/it/developers/tutorials/ipfs-decentralized-ui/index.md new file mode 100644 index 00000000000..8f052676aa7 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/ipfs-decentralized-ui/index.md @@ -0,0 +1,74 @@ +--- +title: IPFS per interfacce utente decentralizzate +description: Questo tutorial insegna al lettore come usare IPFS per archiviare l'interfaccia utente di una dApp. Sebbene i dati e la logica di business dell'applicazione siano decentralizzati, senza un'interfaccia utente resistente alla censura gli utenti potrebbero comunque perderne l'accesso. +author: Ori Pomerantz +tags: ["ipfs", "dApp", "frontend"] +skill: beginner +breadcrumb: IPFS per le interfacce utente delle dApp +lang: it +published: 2024-06-29 +--- + +Hai scritto una nuova incredibile dApp. Hai persino scritto un'[interfaccia utente](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) per essa. Ma ora temi che qualcuno tenti di censurarla abbattendo la tua interfaccia utente, che si trova su un solo server nel cloud. In questo tutorial imparerai come evitare la censura caricando la tua interfaccia utente sull'**[interplanetary file system (IPFS)](https://ipfs.tech/developers/)** in modo che chiunque sia interessato possa fissarla (pin) su un server per l'accesso futuro. + +Potresti usare un servizio di terze parti come [Fleek](https://resources.fleek.xyz/docs/) per fare tutto il lavoro. Questo tutorial è per le persone che vogliono fare abbastanza per capire cosa stanno facendo, anche se richiede più lavoro. + +## Iniziare localmente {#getting-started-locally} + +Esistono diversi [provider IPFS di terze parti](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service), ma è meglio iniziare eseguendo IPFS localmente per i test. + +1. Installa l'[interfaccia utente di IPFS](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions). + +2. Crea una directory con il tuo sito web. Se stai usando [Vite](https://vite.dev/), usa questo comando: + + ```sh + pnpm vite build +``` + +3. In IPFS Desktop, fai clic su **Import > Folder** (Importa > Cartella) e seleziona la directory che hai creato nel passaggio precedente. + +4. Seleziona la cartella appena caricata e fai clic su **Rename** (Rinomina). Dalle un nome più significativo. + +5. Selezionala di nuovo e fai clic su **Share link** (Condividi link). Copia l'URL negli appunti. Il link sarà simile a `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. + +6. Fai clic su **Status** (Stato). Espandi la scheda **Advanced** (Avanzate) per vedere l'indirizzo del gateway. Ad esempio, sul mio sistema l'indirizzo è `http://127.0.0.1:8080`. + +7. Combina il percorso dal passaggio del link con l'indirizzo del gateway per trovare il tuo indirizzo. Ad esempio, per l'esempio precedente, l'URL è `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`. Apri quell'URL in un browser per vedere il tuo sito. + +## Caricamento {#uploading} + +Quindi ora puoi usare IPFS per servire file localmente, il che non è molto entusiasmante. Il passaggio successivo è renderli disponibili per il mondo quando sei offline. + +Esistono diversi [servizi di pinning](https://docs.ipfs.tech/concepts/persistence/#pinning-services) ben noti. Scegline uno. Qualunque servizio tu usi, devi creare un account e fornirgli il **content identifier (CID)** (identificatore di contenuto) nel tuo IPFS desktop. + +Personalmente, ho trovato [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) il più facile da usare. Ecco le istruzioni per usarlo: + +1. Vai alla [dashboard](https://dashboard.4everland.org/overview) e accedi con il tuo portafoglio. + +2. Nella barra laterale sinistra fai clic su **Storage > 4EVER Pin**. + +3. Fai clic su **Upload > Selected CID**. Dai un nome al tuo contenuto e fornisci il CID da IPFS desktop. Attualmente un CID è una stringa che inizia con `Qm` seguita da 44 lettere e cifre che rappresentano un hash [codificato in base-58](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524), come `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, ma [è probabile che questo cambi](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1). + +4. Lo stato iniziale è **Queued** (In coda). Ricarica finché non cambia in **Pinned** (Fissato). + +5. Fai clic sul tuo CID per ottenere il link. Puoi vedere la mia applicazione [qui](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im.ipfs.dweb.link/). + +6. Potresti dover attivare il tuo account per averlo fissato per più di un mese. L'attivazione dell'account costa circa 1$. Se lo hai chiuso, esci e accedi di nuovo per farti chiedere nuovamente di attivarlo. + +## Utilizzo da IPFS {#using-from-ipfs} + +A questo punto hai un link a un gateway centralizzato che serve il tuo contenuto IPFS. In breve, la tua interfaccia utente potrebbe essere un po' più sicura ma non è ancora resistente alla censura. Per una vera resistenza alla censura, gli utenti devono usare IPFS [direttamente da un browser](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites). + +Una volta installato (e con IPFS desktop funzionante), puoi andare su [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) su qualsiasi sito e otterrai quel contenuto, servito in modo decentralizzato. + +## Svantaggi {#drawbacks} + +Non puoi eliminare in modo affidabile i file IPFS, quindi finché stai modificando la tua interfaccia utente, probabilmente è meglio lasciarla centralizzata o usare l'[interplanetary name system (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs), un sistema che fornisce mutabilità sopra IPFS. Naturalmente, qualsiasi cosa sia mutabile può essere censurata, nel caso di IPNS facendo pressione sulla persona con la chiave privata a cui corrisponde. + +Inoltre, alcuni pacchetti hanno problemi con IPFS, quindi se il tuo sito web è molto complicato potrebbe non essere una buona soluzione. E naturalmente, qualsiasi cosa si basi sull'integrazione del server non può essere decentralizzata solo avendo il lato client su IPFS. + +## Conclusione {#conclusion} + +Proprio come Ethereum ti consente di decentralizzare il database e gli aspetti della logica di business della tua dApp, IPFS ti consente di decentralizzare l'interfaccia utente. Questo ti permette di chiudere un ulteriore vettore di attacco contro la tua dApp. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md index 15d4bcf8225..1e085815af1 100644 --- a/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md +++ b/public/content/translations/it/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -1,27 +1,22 @@ --- -title: Avvia lo sviluppo del frontend della tua dapp con create-eth-app -description: Una panoramica su come usare create-eth-app e le sue funzionalità +title: Avvia lo sviluppo del frontend della tua dApp con create-eth-app +description: "Una panoramica su come usare create-eth-app e le sue funzionalità" author: "Markus Waas" tags: - - "create-eth-app" - - "frontend" - - "javascript" - - "ethers.js" - - "the graph" - - "defi" + ["frontend", "JavaScript", "ethers.js", "the graph", "defi"] skill: beginner -breadcrumb: "create-eth-app" +breadcrumb: create-eth-app lang: it published: 2020-04-27 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/create-eth-app --- -L'ultima volta abbiamo dato un'occhiata al [quadro generale di Solidity](https://soliditydeveloper.com/solidity-overview-2020) e abbiamo già accennato a [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Ora scoprirai come usarlo, quali funzionalità sono integrate e alcune idee aggiuntive su come approfondilo. Creata da Paul Razvan Berg, fondatore di [Sablier](http://sablier.com/), quest'app avvierà lo sviluppo del tuo frontend, offrendo diverse integrazioni facoltative tra cui scegliere. +L'ultima volta abbiamo dato un'occhiata al [quadro generale di Solidity](https://soliditydeveloper.com/solidity-overview-2020) e abbiamo già menzionato [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Ora scoprirai come usarla, quali funzionalità sono integrate e ulteriori idee su come espanderla. Creata da Paul Razvan Berg, il fondatore di [Sablier](http://sablier.com/), questa app avvierà lo sviluppo del tuo frontend e include diverse integrazioni opzionali tra cui scegliere. ## Installazione {#installation} -L'installazione richiede Yarn 0.25 o superiore (`npm install yarn -- global`). L'esecuzione è semplicissima: +L'installazione richiede Yarn 0.25 o superiore (`npm install yarn --global`). È semplice come eseguire: ```bash yarn create eth-app my-eth-app @@ -29,44 +24,44 @@ cd my-eth-app yarn react-app:start ``` -Come sistema sottostante utilizza [create-react-app](https://github.com/facebook/create-react-app). Per vedere la tua app, apri `http://localhost:3000/`. Quando sei pronto a distribuire in produzione, crea un pacchetto minimizzato con yarn build. Un modo facile per ospitarlo sarebbe [Netlify](https://www.netlify.com/). Puoi creare una repo di GitHub, aggiungerla a Netlify, configurare il comando build e hai finito! La tua app sarà ospitata e utilizzabile da tutti. E tutto gratuitamente. +Utilizza [create-react-app](https://github.com/facebook/create-react-app) dietro le quinte. Per vedere la tua app, apri `http://localhost:3000/`. Quando sei pronto per la distribuzione in produzione, crea un pacchetto minimizzato con yarn build. Un modo semplice per ospitarlo sarebbe [Netlify](https://www.netlify.com/). Puoi creare un repository GitHub, aggiungerlo a Netlify, configurare il comando di build e hai finito! La tua app sarà ospitata e utilizzabile da tutti. E tutto questo gratuitamente. -## Caratteristiche {#features} +## Funzionalità {#features} ### React e create-react-app {#react--create-react-app} -Prima di tutto, il cuore dell'app: React e tutte le funzionalità aggiuntive fornite con _create-react-app_. Usare solo questo strumento è un'ottima opzione se non vuoi integrare Ethereum. [React](https://reactjs.org/) stesso rende semplicissima la costruzione di UI interattive. Potrebbe non esser facile per i principianti come [Vue](https://vuejs.org/), ma è comunque molto usato, ha più funzionalità e, soprattutto, ha migliaia di librerie aggiuntive tra cui scegliere. _create-react-app_ è facilissimo per iniziare e include: +Prima di tutto il cuore dell'app: React e tutte le funzionalità aggiuntive fornite con _create-react-app_. Usare solo questo è un'ottima opzione se non vuoi integrare Ethereum. [React](https://react.dev/) stesso rende la creazione di interfacce utente interattive davvero semplice. Potrebbe non essere adatto ai principianti quanto [Vue](https://vuejs.org/), ma è comunque il più utilizzato, ha più funzionalità e, cosa più importante, migliaia di librerie aggiuntive tra cui scegliere. Anche _create-react-app_ rende davvero facile iniziare a usarlo e include: -- Supporto alla sintassi di React, JSX, ES6, TypeScript, Flow. -- Extra linguistici oltre ES6 come l'operatore di diffusione dell'oggetto. -- CSS auto-prefissato, così da non necessitare -webkit- o altri prefissi. -- Un veloce esecutore di test unitari interattivi con supporto integrato per la segnalazione della copertura. -- Un server di sviluppo live che avverte degli errori comuni. -- Uno script di costruzione per riunire JS, CSS e immagini per la produzione, con hash e mappe sorgente. +- Supporto per la sintassi di React, JSX, ES6, TypeScript e Flow. +- Extra del linguaggio oltre a ES6 come l'operatore spread per gli oggetti. +- CSS con prefissi automatici, così non hai bisogno di -webkit- o altri prefissi. +- Un esecutore di test unitari interattivo e veloce con supporto integrato per i report di copertura. +- Un server di sviluppo live che avvisa degli errori comuni. +- Uno script di build per raggruppare JS, CSS e immagini per la produzione, con hash e sourcemap. -_create-eth-app_ in particolare, fa uso dei nuovi [effetti hook](https://reactjs.org/docs/hooks-effect.html). Un metodo per scrivere componenti funzionali potenti ma molto piccoli. Vedi di seguito la sezione su Apollo per capire come vengono usati in _create-eth-app_. +In particolare, _create-eth-app_ fa uso dei nuovi [effetti degli hook](https://legacy.reactjs.org/docs/hooks-effect.html). Un metodo per scrivere componenti cosiddetti funzionali potenti, ma molto piccoli. Consulta la sezione seguente su Apollo per scoprire come vengono utilizzati in _create-eth-app_. ### Yarn Workspaces {#yarn-workspaces} -[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) ti consente di utilizzare più pacchetti e di gestirli tutti dalla cartella di root e installare le dipendenze per tutti in una volta, usando `yarn install`. Ciò è utile soprattutto per i pacchetti aggiuntivi più piccoli, come la gestione di indirizzi/ABI degli smart contract (le informazioni su dove hai distribuito quali smart contract e come comunicare con essi) o l'integrazione di Graph, entrambi parte di `create-eth-app`. +[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) ti consente di avere più pacchetti, ma di poterli gestire tutti dalla cartella principale e di installare le dipendenze per tutti in una volta sola usando `yarn install`. Questo ha particolarmente senso per pacchetti aggiuntivi più piccoli come la gestione degli indirizzi/ABI dei contratti intelligenti (le informazioni su dove hai distribuito quali contratti intelligenti e come comunicare con essi) o l'integrazione di The Graph, entrambi parte di `create-eth-app`. ### ethers.js {#ethersjs} -Mentre [Web3](https://docs.web3js.org/) è ancora molto usato, nell'ultimo anno [ethers.js](https://docs.ethers.io/) ha riscosso molto successo come strumento alternativo ed è integrato in _create-eth-app_. Puoi lavorare con questo strumento, passare a Web3 o considerare di aggiornare a [ethers.js v5](https://docs.ethers.org/v5/), che ha quasi terminato la fase beta. +Sebbene [Web3](https://docs.web3js.org/) sia ancora il più utilizzato, [ethers.js](https://docs.ethers.io/) ha ottenuto molta più trazione come alternativa nell'ultimo anno ed è quello integrato in _create-eth-app_. Puoi lavorare con questo, passare a Web3 o considerare l'aggiornamento a [ethers.js v5](https://docs.ethers.org/v5/) che è quasi fuori dalla fase beta. -### Graph {#the-graph} +### The Graph {#the-graph} -[GraphQL](https://graphql.org/) è un metodo alternativo per gestire i dati rispetto a un'[API di Restful](https://restfulapi.net/). Ha diversi vantaggi rispetto alle Api di Restful, specialmente per i dati della blockchain decentralizzata. Se sei interessato al ragionamento dietro questo metodo, dai un'occhiata a [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). +[GraphQL](https://graphql.org/) è un modo alternativo per gestire i dati rispetto a un'[API Restful](https://restfulapi.net/). Hanno diversi vantaggi rispetto alle API Restful, specialmente per i dati decentralizzati della blockchain. Se sei interessato al ragionamento alla base di questo, dai un'occhiata a [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). -Solitamente recupereresti i dati direttamente dal tuo smart contract. Vuoi leggere l'ora dell'ultima operazione? Basta chiamare `MyContract.methods.latestTradeTime().call()`, che recupera i dati da un nodo di Ethereum nella tua dapp. E se ci fossero centinaia di punti di dati diversi? Ciò risulterebbe in centinaia di recuperi di dati al nodo, richiedendo ogni volta un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) e rendendo la tua dapp lenta e inefficace. Una scappatoia potrebbe essere una funzione di chiamata del recuperatore nel tuo contratto, in modo da restituire più dati in una volta. Questa soluzione però non è sempre ideale. +Di solito recupereresti i dati direttamente dal tuo contratto intelligente. Vuoi leggere l'ora dell'ultimo scambio? Basta chiamare `MyContract.methods.latestTradeTime().call()` che recupera i dati da un nodo di Ethereum nella tua dApp. Ma cosa succede se hai bisogno di centinaia di punti dati diversi? Ciò comporterebbe centinaia di recuperi di dati verso il nodo, richiedendo ogni volta un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) che rende la tua dApp lenta e inefficiente. Una soluzione alternativa potrebbe essere una funzione di chiamata di recupero all'interno del tuo contratto che restituisce più dati contemporaneamente. Tuttavia, questo non è sempre l'ideale. -E poi potresti essere interessato anche ai dati storici. Vuoi sapere non solo l'orario dell'ultima operazione, ma gli orari per tutte le operazioni che tu stesso hai mai eseguito? Usa il pacchetto subgraph _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) e adattalo ai tuoi contratti. Se stai cercando degli smart contract popolari, potrebbe anche esistere già un subgraph. Dai un'occhiata al [subgraph explorer](https://thegraph.com/explorer/). +E poi potresti essere interessato anche ai dati storici. Vuoi conoscere non solo l'ora dell'ultimo scambio, ma gli orari di tutti gli scambi che hai mai effettuato tu stesso. Usa il pacchetto subgraph di _create-eth-app_, leggi la [documentazione](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) e adattalo ai tuoi contratti. Se stai cercando contratti intelligenti popolari, potrebbe esserci già un sottografo. Dai un'occhiata all'[esploratore di sottografi](https://thegraph.com/explorer/). -Una volta che hai un grafico secondario, ti consente di scrivere una semplice richiesta nella tua dapp che recuperi tutti i dati importanti della blockchain, inclusi quelli storici che necessiti, tramite un solo recupero necessario. +Una volta che hai un sottografo, ti consente di scrivere una semplice query nella tua dApp che recupera tutti i dati importanti della blockchain, inclusi quelli storici di cui hai bisogno, richiedendo un solo recupero. ### Apollo {#apollo} -Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puoi integrare facilmente il grafico nella tua dapp di React. Specialmente quando si utilizzano gli [hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), recuperare i dati è tanto facile quanto scrivere una singola query di GraphQL nel tuo componente: +Grazie all'integrazione di [Apollo Boost](https://www.apollographql.com/docs/react/get-started/) puoi facilmente integrare The Graph nella tua dApp React. Specialmente quando si usano [gli hook di React e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks), recuperare i dati è semplice come scrivere una singola query GraphQl nel tuo componente: ```js const { loading, error, data } = useQuery(myGraphQlQuery) @@ -80,32 +75,32 @@ React.useEffect(() => { ## Modelli {#templates} -Inoltre, puoi scegliere tra diversi modelli. Finora puoi usare un'integrazione di Aave, Compound, Uniswap o Sablier. Aggiungono tutti importanti indirizzi di servizi degli smart contract con integrazioni di subgraph pre-realizzate. Basta aggiungere il modello al comando di creazione come in `yarn create eth-app my-eth-app --with-template aave`. +Inoltre puoi scegliere tra diversi modelli. Finora puoi usare un'integrazione Aave, Compound, UniSwap o Sablier. Tutti aggiungono importanti indirizzi di contratti intelligenti di servizio insieme a integrazioni di sottografi predefinite. Basta aggiungere il modello al comando di creazione come `yarn create eth-app my-eth-app --with-template aave`. ### Aave {#aave} -[Aave](https://aave.com/) è un mercato per il prestito di denaro decentralizzato. I depositanti forniscono liquidità al mercato per guadagnare un reddito passivo, mentre i debitori possono prendere in prestito usando garanzie. Una funzionalità unica di Aave sono quei [prestiti flash](https://docs.aave.com/developers/guides/flash-loans) che ti consentono di prendere in prestito denaro senza alcuna garanzia, finché restituisci il prestito entro una transazione. Questo può essere utile, ad esempio, per fornirti denaro extra sul trading d'arbitraggio. +[Aave](https://aave.com/) è un mercato di prestito di denaro decentralizzato. I depositanti forniscono liquidità al mercato per guadagnare un reddito passivo, mentre i mutuatari sono in grado di prendere in prestito utilizzando collaterali. Una caratteristica unica di Aave sono i [prestiti lampo (flash loan)](https://aave.com/docs/developers/flash-loans) che ti consentono di prendere in prestito denaro senza alcun collaterale, a patto di restituire il prestito all'interno di una singola transazione. Questo può essere utile, ad esempio, per darti liquidità extra nel trading di arbitraggio. -I token scambiati che ti fanno guadagnare interessi si chiamano _aTokens_. +I token scambiati che ti fanno guadagnare interessi sono chiamati _aToken_. -Quando scegli di integrare Aave con _create-eth-app_, otterrai un'[integrazione del subgraph](https://docs.aave.com/developers/getting-started/using-graphql). Aave usa The Graph e ti fornisce già diversi subgraph pronti all'uso su [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) e sulla [rete principale](https://thegraph.com/explorer/subgraph/aave/protocol) in forma [grezza](https://thegraph.com/explorer/subgraph/aave/protocol-raw) o [formattata](https://thegraph.com/explorer/subgraph/aave/protocol). +Quando scegli di integrare Aave con _create-eth-app_, otterrai un'[integrazione del sottografo](https://docs.aave.com/developers/getting-started/using-graphql). Aave usa The Graph e ti fornisce già diversi sottografi pronti all'uso su [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) e sulla [rete principale](https://thegraph.com/explorer/subgraph/aave/protocol) in forma [grezza](https://thegraph.com/explorer/subgraph/aave/protocol-raw) o [formattata](https://thegraph.com/explorer/subgraph/aave/protocol). -![Meme sui Prestiti Flash di Aave – "Eh già... se potessi mantenere il mio prestito flash per più di una transazione, sarebbe fantastico"](./flashloan-meme.png) +![Meme sui prestiti lampo di Aave – "Sììì, se potessi tenere il mio prestito lampo per più di 1 transazione, sarebbe fantastico"](./flashloan-meme.png) ### Compound {#compound} -[Compound](https://compound.finance/) è simile ad Aave. L'integrazione include già il nuovo [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). A gran sorpresa, qui i token che guadagnano interessi sono chiamati _cToken_. +[Compound](https://compound.finance/) è simile ad Aave. L'integrazione include già il nuovo [sottografo Compound v2](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). I token che guadagnano interessi qui sono sorprendentemente chiamati _cToken_. ### Uniswap {#uniswap} -[Uniswap](https://uniswap.exchange/) è uno scambio decentralizzato (DEX). I fornitori di liquidità possono guadagnare commissioni fornendo i token richiesti o ether per ambe le parti di uno scambio. È ampiamente usato e dunque ha una delle liquidità più elevate per una gamma davvero ampia di token. Puoi integrarla facilmente nella tua dapp, ad esempio, per consentire agli utenti di scambiare i propri ETH per DAI. +[Uniswap](https://uniswap.exchange/) è un exchange decentralizzato (DEX). I fornitori di liquidità possono guadagnare commissioni fornendo i token o gli ether richiesti per entrambi i lati di uno scambio. È ampiamente utilizzato e quindi ha una delle liquidità più elevate per una gamma molto ampia di token. Puoi facilmente integrarlo nella tua dApp per, ad esempio, consentire agli utenti di scambiare i loro ETH per DAI. -Sfortunatamente, al momento della redazione del del presente articolo, l'integrazione è solo per Uniswap v1 e non per [la recente v2](https://uniswap.org/blog/uniswap-v2/). +Sfortunatamente, al momento della stesura di questo articolo l'integrazione è solo per Uniswap v1 e non per la [v2 appena rilasciata](https://uniswap.org/blog/uniswap-v2/). ### Sablier {#sablier} -[Sablier](https://sablier.com/) consente agli utenti di trasmettere pagamenti in denaro. Invece di un singolo giorno di pagamento, in realtà puoi ricevere denaro costantemente senza ulteriore amministrazione dopo la configurazione iniziale. L'integrazione include i [propri subgraph](https://thegraph.com/explorer/subgraph/sablierhq/sablier). +[Sablier](https://sablier.com/) consente agli utenti di trasmettere pagamenti in denaro in streaming. Invece di un singolo giorno di paga, ottieni effettivamente i tuoi soldi costantemente senza ulteriore amministrazione dopo la configurazione iniziale. L'integrazione include il suo [sottografo dedicato](https://thegraph.com/explorer/subgraph/sablierhq/sablier). -## E poi? {#whats-next} +## Quali sono i prossimi passi? {#whats-next} -Se hai domande su _create-eth-app_, vai al [server della community di Sablier](https://discord.gg/bsS8T47), dove puoi contattare gli autori di _create-eth-app_. Come passaggi iniziali, potrebbe essere utile integrare un framework dell'UI come [Material UI](https://material-ui.com/), scrivere query di GraphQL per i dati che ti servono realmente e configurare la distribuzione. +Se hai domande su _create-eth-app_, vai al [server della community di Sablier](https://discord.gg/bsS8T47), dove puoi metterti in contatto con gli autori di _create-eth-app_. Come primi passi successivi potresti voler integrare un framework per l'interfaccia utente come [Material UI](https://mui.com/material-ui/), scrivere query GraphQL per i dati di cui hai effettivamente bisogno e configurare la distribuzione. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/it/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md index 8f9d4673a4c..266ed1a5e1a 100644 --- a/public/content/translations/it/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md +++ b/public/content/translations/it/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -1,94 +1,95 @@ --- title: Imparare gli argomenti fondamentali di Ethereum con SQL -description: Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, incluse le transazioni, i blocchi e il gas, interrogando i dati sulla catena con il Linguaggio di Richiesta Strutturato (SQL). +description: Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, tra cui transazioni, blocchi e gas, interrogando i dati on-chain con lo Structured Query Language (SQL). author: "Paul Apivat" -tags: - - "SQL" - - "Interrogazioni" - - "Transazioni" +tags: ["SQL", "Interrogazione", "Transazioni", "dati e analisi"] skill: beginner -breadcrumb: "Ethereum con SQL" +breadcrumb: Ethereum con SQL lang: it published: 2021-05-11 source: paulapivat.com sourceUrl: https://paulapivat.com/post/query_ethereum/ --- -Molti tutorial di Ethereum sono rivolti agli sviluppatori, mancano invece risorse educative per gli analisti di dati o per le persone che vogliono visualizzare dati sulla catena senza eseguire un client o un nodo. +Molti tutorial su Ethereum si rivolgono agli sviluppatori, ma mancano risorse educative per gli analisti di dati o per le persone che desiderano vedere i dati on-chain senza eseguire un client o un nodo. -Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, incluse le transazioni, i blocchi e il gas, interrogando i dati sulla catena con il linguaggio di richiesta strutturato (SQL), tramite un'interfaccia fornita da [Dune Analytics](https://dune.xyz/home). +Questo tutorial aiuta i lettori a comprendere i concetti fondamentali di Ethereum, tra cui transazioni, blocchi e gas, interrogando i dati on-chain con lo structured query language (SQL) attraverso un'interfaccia fornita da [Dune Analytics](https://dune.com/). -I dati sulla catena possono aiutarci a comprendere Ethereum, la rete, come un'economia per la potenza di calcolo, e dovrebbero servire da base per comprendere le sfide che Ethereum affronta oggi (cioè, l'aumento dei prezzi del gas) e, soprattutto, le discussioni sulle soluzioni di ridimensionamento. +I dati on-chain possono aiutarci a comprendere Ethereum, la rete, e come economia per la potenza di calcolo e dovrebbero servire come base per comprendere le sfide che Ethereum affronta oggi (ad es., l'aumento dei prezzi del gas) e, cosa più importante, le discussioni sulle soluzioni di scalabilità. ### Transazioni {#transactions} -Il percorso di un utente su Ethereum inizia inizializzando il conto controllato da un utente o da un'entità, con un saldo di ETH. Esistono due tipi di conto: controllato dall'utente o contratto intelligente (vedi [ethereum.org](/developers/docs/accounts/)). +Il viaggio di un utente su Ethereum inizia con l'inizializzazione di un account controllato dall'utente o di un'entità con un saldo in ETH. Esistono due tipi di account: controllato dall'utente o un contratto intelligente (vedi [ethereum.org](/developers/docs/accounts/)). -Ogni conto è visualizzabile su un esploratore di blocchi come [Etherscan](https://etherscan.io/). Gli esploratori di blocchi sono un portale ai dati di Ethereum. Mostrano, in tempo reale, i dati su blocchi, transazioni, miner, conti e altre attività sulla catena (vedi [qui](/developers/docs/data-and-analytics/block-explorers/)). +Qualsiasi account può essere visualizzato su un esploratore di blocchi come [Etherscan](https://etherscan.io/) o [Blockscout](https://eth.blockscout.com/). Gli esploratori di blocchi sono un portale per i dati di Ethereum. Mostrano, in tempo reale, dati su blocchi, transazioni, minatori, account e altre attività on-chain (vedi [qui](/developers/docs/data-and-analytics/block-explorers/)). -Tuttavia, è possibile che un utente voglia interrogare i dati direttamente per riconciliare le informazioni fornite da esploratori di blocchi esterni. [Dune Analytics](https://duneanalytics.com/)mette a disposizione questa capacità a chiunque abbia una conoscenza di SQL. +Tuttavia, un utente potrebbe voler interrogare i dati direttamente per riconciliare le informazioni fornite dagli esploratori di blocchi esterni. [Dune Analytics](https://dune.com/) offre questa capacità a chiunque abbia una certa conoscenza di SQL. -Per riferimento, il conto del contratto intelligente per la Ethereum Foundation (EF) può essere visualizzato su [Etherscan](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae). +Come riferimento, l'account del contratto intelligente per la Ethereum Foundation (EF) può essere visualizzato su [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe). -Una cosa da notare è che tutti i conti, incluso quello dell'EF, hanno un indirizzo pubblico, utilizzabile per inviare e ricevere le transazioni. +Una cosa da notare è che tutti gli account, incluso quello della EF, hanno un indirizzo pubblico che può essere utilizzato per inviare e ricevere transazioni. -Il saldo del conto su Etherscan comprende transazioni regolari e interne. Le transazioni interne, nonostante il nome, non sono transazioni _reali_ che modificano lo stato della catena. Sono trasferimenti di valore avviati eseguendo un contratto ([sorgente](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Poiché le transazioni interne non hanno firma, **non** sono incluse sulla blockchain e non sono interrogabili con Dune Analytics. +Il saldo dell'account su Etherscan comprende transazioni regolari e transazioni interne. Le transazioni interne, nonostante il nome, non sono _effettive_ transazioni che cambiano lo stato della catena. Sono trasferimenti di valore avviati dall'esecuzione di un contratto ([fonte](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Poiché le transazioni interne non hanno firma, **non** sono incluse nella blockchain e non possono essere interrogate con Dune Analytics. -Questo tutorial si concentrerà dunque sulle transazioni regolari. Queste sono interrogabili come segue: +Pertanto, questo tutorial si concentrerà sulle transazioni regolari. Queste possono essere interrogate in questo modo: ```sql WITH temp_table AS ( SELECT hash, - block_number, - block_time, "from", "to", value / 1e18 AS ether, - gas_used, - gas_price / 1e9 AS gas_price_gwei + data, + "gas_limit", + "gas_price" / 1e9 AS gas_price_gwei, + "gas_used", + ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct FROM ethereum."transactions" WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' ORDER BY block_time DESC ) SELECT hash, - block_number, - block_time, "from", "to", ether, + data, + gas_limit, + gas_price_gwei, + gas_used, + gas_used_pct, (gas_used * gas_price_gwei) / 1e9 AS txn_fee FROM temp_table ``` -Questo produrrà le stesse informazioni fornite sulla pagina della transazione di Etherscan. A titolo di confronto, ecco le due sorgenti: +Questo produrrà le stesse informazioni fornite sulla pagina delle transazioni di Etherscan. Per confronto, ecco le due fonti: #### Etherscan {#etherscan} -![Screenshot della visualizzazione dell'Explorer delle transazioni Etherscan](./etherscan_view.png) +![Screenshot della vista dell'esploratore di transazioni di Etherscan](./etherscan_view.png) -[Pagina del contratto dell'EF su Etherscan.](https://etherscan.io/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) +[Pagina del contratto della EF su Blockscout.](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) #### Dune Analytics {#dune-analytics} -![Screenshot di un dashboard delle query di Dune Analytics](./dune_view.png) +![Screenshot di una dashboard di interrogazione di Dune Analytics](./dune_view.png) -Puoi trovare la dashboard [qui](https://duneanalytics.com/paulapivat/Learn-Ethereum). Clicca sulla tabella per vedere l'interrogazione (vedi anche sopra). +Puoi trovare la dashboard [qui](https://dune.com/paulapivat/Learn-Ethereum). Clicca sulla tabella per vedere l'interrogazione (vedi anche sopra). -### Spezzare le Transazioni {#breaking_down_transactions} +### Scomposizione delle Transazioni {#breaking_down_transactions} -Una transazione inviata presenta diverse informazioni, tra cui ([sorgente](/developers/docs/transactions/)): +Una transazione inviata include diverse informazioni, tra cui ([fonte](/developers/docs/transactions/)): -- **Destinatario**: l'indirizzo ricevente (interrogato come "a") -- **Firma**: mentre le chiavi private di un mittente firmano una transazione, con SQL possiamo interrogare l'indirizzo pubblico di un mittente ("da"). -- **Valore**: questo è l'importo di ETH trasferito (vedi la colonna di `ether`). -- **Dati**: sono i dati arbitrari che hanno ricevuto l'hashing (vedi la colonna `data`) -- **gasLimit**: l'importo massimo di unità di gas consumabili dalla transazione. Le unità di gas rappresentano le fasi di calcolo -- **maxPriorityFeePerGas**: l'importo massimo di gas da includere come mancia al miner -- **maxFeePerGas**: l'importo massimo di gas che si è disposti a pagare per la transazione (inclusiva di baseFeePerGas e maxPriorityFeePerGas) +- **Destinatario**: L'indirizzo di ricezione (interrogato come "to") +- **Firma**: Mentre le chiavi private di un mittente firmano una transazione, ciò che possiamo interrogare con SQL è l'indirizzo pubblico del mittente ("from"). +- **Valore**: Questo è l'importo di ETH trasferito (vedi la colonna `ether`). +- **Dati**: Si tratta di dati arbitrari che sono stati sottoposti a hash (vedi la colonna `data`) +- **gasLimit** – la quantità massima di unità di gas che può essere consumata dalla transazione. Le unità di gas rappresentano i passaggi computazionali +- **maxPriorityFeePerGas** - la quantità massima di gas da includere come mancia al minatore +- **maxFeePerGas** - la quantità massima di gas che si è disposti a pagare per la transazione (inclusi baseFeePerGas e maxPriorityFeePerGas) -Possiamo richiedere informazioni specifici per le transazioni all'indirizzo pubblico della Ethereum Foundation: +Possiamo interrogare queste informazioni specifiche per le transazioni verso l'indirizzo pubblico della Ethereum Foundation: ```sql SELECT @@ -107,87 +108,82 @@ ORDER BY block_time DESC ### Blocchi {#blocks} -Ogni transazione cambierà lo stato della macchina virtuale di Ethereum ([EVM](/developers/docs/evm/)) ([sorgente](/developers/docs/transactions/)). Le transazioni sono trasmesse alla rete per esser verificate e incluse in un blocco. Ogni transazione è associata al numero di un blocco. Per vedere i dati, potremmo interrogare un numero di blocco specifico: 12396854 (il blocco più recente tra le transazioni di Ethereum Foundation al momento della scrittura, 05/11/2021). +Ogni transazione cambierà lo stato della macchina virtuale di Ethereum ([EVM](/developers/docs/evm/)) ([fonte](/developers/docs/transactions/)). Le transazioni vengono trasmesse alla rete per essere verificate e incluse in un blocco. Ogni transazione è associata a un numero di blocco. Per vedere i dati, potremmo interrogare un numero di blocco specifico: 12396854 (il blocco più recente tra le transazioni della Ethereum Foundation al momento in cui scriviamo, 11/5/21). -Inoltre, quando interroghiamo i due blocchi successivi, possiamo vedere che ogni blocco contiene l'hash del blocco precedente (cioè l'hash padre), e questo illustra com'è formata la blockchain. +Inoltre, quando interroghiamo i due blocchi successivi, possiamo vedere che ogni blocco contiene l'hash del blocco precedente (ovvero, l'hash genitore), illustrando come si forma la blockchain. -Ogni blocco contiene un riferimento al suo blocco padre. Questo è mostrato di sotto tra le colonne `hash` e `parent_hash` ([sorgente](/developers/docs/blocks/)): +Ogni blocco contiene un riferimento al suo blocco genitore. Questo è mostrato di seguito tra le colonne `hash` e `parent_hash` ([fonte](/developers/docs/blocks/)): ![parent_hash](./parent_hash.png) -Ecco l'[interrogazione](https://duneanalytics.com/queries/44856/88292) su Dune Analytics: +Ecco l'[interrogazione](https://dune.com/queries/44856/88292) su Dune Analytics: ```sql SELECT - time, - number, - hash, - parent_hash, - nonce + time, + number, + difficulty, + hash, + parent_hash, + nonce FROM ethereum."blocks" WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 LIMIT 10 ``` -Possiamo esaminare un blocco interrogando orario, numero del blocco, difficoltà, hash, hash padre e nonce. +Possiamo esaminare un blocco interrogando tempo, numero di blocco, difficoltà, hash, hash genitore e nonce. -L'unica cosa che questa interrogazione non copre è l'_elenco di transazioni_, che richiede un'apposita interrogazione successiva, e il _root di stato_. Un nodo completo o d'archivio memorizzerà tutte le transazioni e transizioni di stato, consentendo ai client di interrogare lo stato della catena in qualsiasi momento. Poiché questo richiede un grande spazio d'archiviazione, possiamo separare i dati della catena dai dati di stato: +L'unica cosa che questa interrogazione non copre è la _lista delle transazioni_, che richiede un'interrogazione separata di seguito, e la _radice di stato_ (state root). Un nodo completo o di archivio memorizzerà tutte le transazioni e le transizioni di stato, consentendo ai client di interrogare lo stato della catena in qualsiasi momento. Poiché ciò richiede un ampio spazio di archiviazione, possiamo separare i dati della catena dai dati di stato: -- Dati della catena (elenco di blocchi, transazioni) +- Dati della catena (lista di blocchi, transazioni) - Dati di stato (risultato della transizione di stato di ogni transazione) -Il root di stato rientra nel secondo gruppo e si compone di dati _impliciti_ (non memorizzati sulla catena), mentre i dati della catena sono espliciti e memorizzati nella catena stessa ([sorgente](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). +La radice di stato rientra in quest'ultimo ed è un dato _implicito_ (non memorizzato on-chain), mentre i dati della catena sono espliciti e memorizzati sulla catena stessa ([fonte](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). -Per questo tutorial, ci concentreremo sui dati sulla catena che sono _interrogabili_ con SQL tramite Dune Analytics. +Per questo tutorial, ci concentreremo sui dati on-chain che _possono_ essere interrogati con SQL tramite Dune Analytics. -Come indicato sopra, ogni blocco contiene un elenco di transazioni, possiamo interrogarlo filtrando per un blocco specifico. Proveremo con il blocco più recente, 12396854: +Come affermato sopra, ogni blocco contiene una lista di transazioni; possiamo interrogarla filtrando per un blocco specifico. Proveremo con il blocco più recente, 12396854: ```sql SELECT * FROM ethereum."transactions" WHERE block_number = 12396854 -ORDER BY block_time DESC` ``` -Ecco l'output in SQL su Dune: +Ecco l'output SQL su Dune: -![Screenshot di un elenco di transazioni Ethereum](./list_of_txn.png) +![Screenshot di una lista di transazioni di Ethereum](./list_of_txn.png) -Questo singolo blocco aggiunto alla catena cambia lo stato della macchina virtuale di Ethereum ([EVM](/developers/docs/evm/)). Dozzine, a volte, centinaia di transazioni vengono verificate in un solo colpo. In questo caso specifico, sono state incluse 222 transazioni. +L'aggiunta di questo singolo blocco alla catena cambia lo stato della macchina virtuale di Ethereum ([EVM](/developers/docs/evm/)). Dozzine, a volte centinaia di transazioni vengono verificate contemporaneamente. In questo caso specifico, sono state incluse 222 transazioni. -Per vedere quante sono realmente riuscite, aggiungeremmo un altro filtro per contare le transazioni riuscite: +Per vedere quante hanno avuto effettivamente successo, aggiungeremmo un altro filtro per contare le transazioni riuscite: ```sql -WITH temp_table AS ( - SELECT * FROM ethereum."transactions" - WHERE block_number = 12396854 AND success = true - ORDER BY block_time DESC -) SELECT - COUNT(success) AS num_successful_txn -FROM temp_table + COUNT(success) AS successful_txn +FROM ethereum."transactions" +WHERE block_number = 12396854 AND success = true ``` -Per il blocco 12396854, di 222 transazioni totali, 204 sono state verificate correttamente: +Per il blocco 12396854, su 222 transazioni totali, 204 sono state verificate con successo: -![Screenshot di una transazione Ethereum riuscita](./successful_txn.png) +![Screenshot di una transazione di Ethereum riuscita](./successful_txn.png) -Le richieste di transazioni si verificano dozzine di volte al secondo, ma i blocchi sono impegnati approssimativamente ogni 15 secondi ([sorgente](/developers/docs/blocks/)). +Le richieste di transazioni avvengono dozzine di volte al secondo, ma i blocchi vengono confermati circa una volta ogni 15 secondi ([fonte](/developers/docs/blocks/)). -Per vedere che un blocco è prodotto approssimativamente ogni 15 secondi, potremmo prendere il numero di secondi in una giornata (86400) diviso per 15 per ottenere un numero medio stimato di blocchi al giorno (circa 5760). +Per vedere che viene prodotto un blocco circa ogni 15 secondi, potremmo prendere il numero di secondi in un giorno (86400) diviso per 15 per ottenere un numero medio stimato di blocchi al giorno (~ 5760). -Il grafico per i blocchi di Ethereum prodotti al giorno (2016 - presente) è: +Il grafico dei blocchi di Ethereum prodotti al giorno (dal 2016 a oggi) è: -![Grafico che mostra la produzione giornaliera di blocchi Ethereum](./daily_blocks.png) +![Grafico che mostra la produzione giornaliera di blocchi di Ethereum](./daily_blocks.png) -Il numero medio di blocchi prodotti giornalmente in questo periodo di tempo è di ~5.874: +Il numero medio di blocchi prodotti quotidianamente in questo periodo di tempo è ~5.874: -![Grafico che mostra la produzione giornaliera di blocchi Ethereum](./avg_daily_blocks.png) +![Grafico che mostra la produzione giornaliera di blocchi di Ethereum](./avg_daily_blocks.png) Le interrogazioni sono: ```sql -# query to visualize number of blocks produced daily since 2016 - +-- query for daily blocks produced SELECT DATE_TRUNC('day', time) AS dt, COUNT(*) AS block_count @@ -195,8 +191,7 @@ FROM ethereum."blocks" GROUP BY dt OFFSET 1 -# average number of blocks produced per day - +-- query for average blocks produced per day WITH temp_table AS ( SELECT DATE_TRUNC('day', time) AS dt, @@ -210,15 +205,15 @@ SELECT FROM temp_table ``` -Il numero medio di blocchi prodotto ogni giorno dal 2016 è lievemente superiore a quel numero, a 5.874. In alternativa, dividendo 86400 secondi per i 5874 blocchi medi, si ottiene 14,7 secondi, pari a circa un blocco ogni 15 secondi. +Il numero medio di blocchi prodotti al giorno dal 2016 è leggermente superiore a quel numero, a 5.874. In alternativa, dividendo 86400 secondi per 5874 blocchi medi si ottengono 14,7 secondi, ovvero circa un blocco ogni 15 secondi. ### Gas {#gas} -I blocchi hanno dimensioni limitate. La dimensione massima del blocco è dinamica e varia a seconda della domanda di rete, tra le 12.500.000 e le 25.000.000 unità. I limiti sono necessari per evitare che le dimensioni arbitrariamente grandi dei blocchi mettano a dura prova i nodi completi, in termini di requisiti di spazio su disco e velocità ([fonte](/developers/docs/blocks/)). +I blocchi hanno dimensioni limitate. La dimensione massima del blocco è dinamica e varia in base alla domanda della rete tra 12.500.000 e 25.000.000 di unità. I limiti sono necessari per evitare che dimensioni di blocco arbitrariamente grandi mettano sotto sforzo i nodi completi in termini di spazio su disco e requisiti di velocità ([fonte](/developers/docs/blocks/)). -Un modo per concettualizzare il limite di gas del blocco è immaginarlo come l'**offerta** di spazio del blocco disponibile, in cui raggruppare le transazioni. Il limite di gas del blocco è interrogabile e visualizzabile dal 2016 a oggi: +Un modo per concettualizzare il limite del gas del blocco è pensarlo come l'**offerta** di spazio disponibile nel blocco in cui raggruppare le transazioni. Il limite del gas del blocco può essere interrogato e visualizzato dal 2016 a oggi: -![Grafico che mostra il limite medio di gas di Ethereum nel tempo](./avg_gas_limit.png) +![Grafico che mostra il limite medio del gas di Ethereum nel tempo](./avg_gas_limit.png) ```sql SELECT @@ -229,9 +224,9 @@ GROUP BY dt OFFSET 1 ``` -Poi, c'è il gas effettivo, usato quotidianamente per pagare i calcoli effettuati sulla catena di Ethereum (cioè, l'invio della transazione, la chiamata di un contratto intelligente, il conio di un NFT). Questa è la **domanda** di spazio per i blocchi disponibile di Ethereum: +Poi c'è il gas effettivo utilizzato quotidianamente per pagare il calcolo eseguito sulla catena di Ethereum (ad es., inviare una transazione, chiamare un contratto intelligente, coniare un NFT). Questa è la **domanda** di spazio disponibile nei blocchi di Ethereum: -![Grafico che mostra il gas Ethereum utilizzato quotidianamente](./daily_gas_used.png) +![Grafico che mostra il gas di Ethereum utilizzato quotidianamente](./daily_gas_used.png) ```sql SELECT @@ -242,23 +237,22 @@ GROUP BY dt OFFSET 1 ``` -Possiamo anche giustapporre questi due grafici insieme per vedere come si allineano **domanda e offerta**: +Possiamo anche giustapporre questi due grafici per vedere come si allineano **domanda e offerta**: ![gas_demand_supply](./gas_demand_supply.png) -Dunque, possiamo comprendere i prezzi del gas come una funzione di domanda per lo spazio del blocco di Ethereum, data l'offerta disponibile. +Pertanto possiamo comprendere i prezzi del gas come una funzione della domanda di spazio nei blocchi di Ethereum, data l'offerta disponibile. -Infine, potremmo voler interrogare i prezzi del gas quotidiani medi per la catena di Ethereum, tuttavia, farlo risulterà in un tempo di richiesta particolarmente lungo, quindi filtreremo la nostra richiesta all'importo medio di gas pagato per transazione dall'Ethereum Foundation. +Infine, potremmo voler interrogare i prezzi medi giornalieri del gas per la catena di Ethereum; tuttavia, farlo comporterà un tempo di interrogazione particolarmente lungo, quindi filtreremo la nostra interrogazione per la quantità media di gas pagata per transazione dalla Ethereum Foundation. -![Grafico che mostra l'utilizzo giornaliero del gas della Ethereum Foundation](./ef_daily_gas.png) +![Grafico che mostra l'utilizzo giornaliero di gas della Ethereum Foundation](./ef_daily_gas.png) -Possiamo vedere i prezzi del gas pagati per tutte le transazioni effettuate all'indirizzo dell'Ethereum Foundation negli anni. Ecco l'interrogazione: +Possiamo vedere i prezzi del gas pagati per tutte le transazioni effettuate verso l'indirizzo della Ethereum Foundation nel corso degli anni. Ecco l'interrogazione: ```sql SELECT block_time, - gas_price / 1e9 AS gas_price_gwei, - value / 1e18 AS eth_sent + gas_price / 1e9 AS gas_price_gwei FROM ethereum."transactions" WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' ORDER BY block_time DESC @@ -266,8 +260,8 @@ ORDER BY block_time DESC ### Riepilogo {#summary} -Con questo tutorial esaminiamo i concetti fondamentali di Ethereum e come funziona la blockchain di Ethereum interrogando e comprendendo i dati sulla catena. +Con questo tutorial, comprendiamo i concetti fondamentali di Ethereum e come funziona la blockchain di Ethereum interrogando e prendendo confidenza con i dati on-chain. -La dashboard che contiene tutto il codice usato in questo tutorial si può trovare [qui](https://duneanalytics.com/paulapivat/Learn-Ethereum). +La dashboard che contiene tutto il codice utilizzato in questo tutorial può essere trovata [qui](https://dune.com/paulapivat/Learn-Ethereum). -Per altri usi dei dati per l'esplorazione di web3 [cercami su Twitter](https://twitter.com/paulapivat). +Per un ulteriore utilizzo dei dati per esplorare il web3 [trovami su Twitter](https://twitter.com/paulapivat). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/it/developers/tutorials/logging-events-smart-contracts/index.md index 17636af14a8..0ea296a2e68 100644 --- a/public/content/translations/it/developers/tutorials/logging-events-smart-contracts/index.md +++ b/public/content/translations/it/developers/tutorials/logging-events-smart-contracts/index.md @@ -1,14 +1,10 @@ --- -title: Registrare dati dagli Smart Contract con gli eventi -description: Introduzione agli eventi degli Smart Contract e come usarli per registrare dati +title: Registrare i dati dai contratti intelligenti con gli eventi +description: Un'introduzione agli eventi dei contratti intelligenti e a come puoi usarli per registrare i dati author: "jdourlens" -tags: - - "contratti intelligenti" - - "remix" - - "solidity" - - "eventi" +tags: ["contratti intelligenti", "Remix", "Solidity", "eventi"] skill: intermediate -breadcrumb: "Registrazione eventi" +breadcrumb: Registrazione degli eventi lang: it published: 2020-04-03 source: EthereumDev @@ -16,19 +12,19 @@ sourceUrl: https://ethereumdev.io/logging-data-with-events/ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In Solidity, gli [eventi](/developers/docs/smart-contracts/anatomy/#events-and-logs) sono segnali inviati che possono essere attivati dagli Smart Contract. Le dapp, o qualsiasi cosa sia connessa all'API di JSON-RPC di Ethereum, possono ascoltare questi eventi e agire di conseguenza. Gli eventi sono anche indicizzabili così che la cronologia dell'evento sia ricercabile in seguito. +In Solidity, gli [eventi](/developers/docs/smart-contracts/anatomy/#events-and-logs) sono segnali inviati che i contratti intelligenti possono attivare. Le dApp, o qualsiasi cosa connessa all'API JSON-RPC di Ethereum, possono ascoltare questi eventi e agire di conseguenza. Un evento può anche essere indicizzato in modo che la cronologia degli eventi sia ricercabile in seguito. ## Eventi {#events} -L'evento più comune sulla blockchain Ethereum al momento della scrittura di questo articolo è l'evento Transfer, emesso dai token ERC20 quando qualcuno trasferisce token. +L'evento più comune sulla blockchain di Ethereum al momento della stesura di questo articolo è l'evento Transfer che viene emesso dai token ERC20 quando qualcuno trasferisce dei token. ```solidity event Transfer(address indexed from, address indexed to, uint256 value); ``` -Le firme dell'evento sono dichiarate nel codice del contratto e possono essere emesse con la parola chiave emit. Per esempio l'evento transfer registra chi ha inviato il trasferimento (_from_), a chi (_to_) e quanti token sono stati trasferiti (_value_). +La firma dell'evento è dichiarata all'interno del codice del contratto e può essere emessa con la parola chiave emit. Ad esempio, l'evento transfer registra chi ha inviato il trasferimento (_from_), a chi (_to_) e quanti token sono stati trasferiti (_value_). -Torniamo al nostro Smart Contract Counter e decidiamo di registrare ogni volta che il valore cambia. Poiché questo contratto non è inteso per la distribuzione ma serve come base per la costruzione di un altro contratto tramite estensione, è detto contratto astratto. Nel caso del nostro esempio Counter somiglierà a: +Se torniamo al nostro contratto intelligente Counter e decidiamo di registrare ogni volta che il valore viene modificato. Poiché questo contratto non è destinato a essere distribuito ma a fungere da base per costruire un altro contratto estendendolo: è chiamato contratto astratto. Nel caso del nostro esempio del contatore, apparirebbe così: ```solidity pragma solidity 0.5.17; @@ -37,16 +33,16 @@ contract Counter { event ValueChanged(uint oldValue, uint256 newValue); - // Variabile privata di tipo int senza segno per tenere il numero di conteggi + // Variabile privata di tipo unsigned int per mantenere il numero di conteggi uint256 private count = 0; - // Funzione che incrementa il Counter + // Funzione che incrementa il nostro contatore function increment() public { count += 1; emit ValueChanged(count - 1, count); } - // Getter per ottenere il valore di conteggio + // Getter per ottenere il valore del conteggio function getCount() public view returns (uint256) { return count; } @@ -54,14 +50,14 @@ contract Counter { } ``` -Da notare: +Nota che: -- **Riga 5**: dichiariamo l'evento e cosa contiene, il vecchio e il nuovo valore. +- **Riga 5**: dichiariamo il nostro evento e cosa contiene, il vecchio valore e il nuovo valore. -- **Riga 13**: quando aumentiamo la variabile di conteggio, emettiamo l'evento. +- **Riga 13**: Quando incrementiamo la nostra variabile count, emettiamo l'evento. -Se ora distribuiamo il contratto e chiamiamo la funzione di incremento, vedremo che Remix lo mostrerà automaticamente se clicchiamo sulla nuova transazione all'interno di un array di registri con nome. +Se ora distribuiamo il contratto e chiamiamo la funzione increment, vedremo che Remix lo visualizzerà automaticamente se fai clic sulla nuova transazione all'interno di un array chiamato logs. ![Screenshot di Remix](./remix-screenshot.png) -I registri sono davvero utili per il debug degli Smart Contract ma sono anche importanti se si creano applicazioni usate da persone diverse e facilitano l'analisi per monitorare e comprendere come viene usato lo Smart Contract. I registri generati da transazioni sono mostrati in block explorer popolari e ad esempio si possono usare per creare script esterni alla catena, con lo scopo di attendere eventi specifici ed eseguire determinate azioni quando si verificano. +I log sono davvero utili per il debug dei tuoi contratti intelligenti, ma sono anche importanti se crei applicazioni utilizzate da persone diverse e semplificano l'esecuzione di analisi per tracciare e comprendere come viene utilizzato il tuo contratto intelligente. I log generati dalle transazioni vengono visualizzati nei popolari esploratori di blocchi e puoi anche, ad esempio, usarli per creare script fuori catena per ascoltare eventi specifici e intraprendere azioni quando si verificano. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/it/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md index 97ef79ffafa..365e80ba74b 100644 --- a/public/content/translations/it/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md +++ b/public/content/translations/it/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -1,106 +1,109 @@ --- -title: Prove di Merkle per l'integrità dei dati offline -description: Garantire l'integrità dei dati sulla catena per i dati memorizzati principalmente al di fuori di essa +title: "Prove di Merkle per l'integrità dei dati fuori catena" +description: "Garantire l'integrità dei dati on-chain per i dati che sono archiviati, per lo più, fuori catena" author: Ori Pomerantz -tags: - - "archiviazione" +tags: ["archiviazione"] skill: advanced -breadcrumb: "Prove Merkle" +breadcrumb: Prove di Merkle lang: it published: 2021-12-30 --- ## Introduzione {#introduction} -Idealmente, vorremmo archiviare tutto nell'archiviazione di Ethereum, memorizzata tra migliaia di computer e avente una disponibilità estremamente elevata (i dati non sono censurabili) e integrità (i dati non sono modificabili in un modo non autorizzato), ma archiviare una parola di 32 byte costa tipicamente 20.000 gas. Mentre scriviamo il presente articolo, tale costo equivale a 6,60 dollari. Ne consegue che 21 centesimi per byte sia un costo impraticabile per molti utilizzi. +Idealmente vorremmo archiviare tutto nell'archiviazione di Ethereum, che è memorizzata su migliaia di computer e ha una disponibilità estremamente elevata (i dati non possono essere censurati) e integrità (i dati non possono essere modificati in modo non autorizzato), ma l'archiviazione di una parola di 32 byte costa in genere 20.000 gas. Nel momento in cui scrivo, questo costo equivale a 6,60 $. A 21 centesimi per byte, questo è troppo costoso per molti usi. -Per risolvere questo problema l'ecosistema di Ethereum ha sviluppato [molti metodi alternativi per memorizzare dati in modo decentralizzato](/developers/docs/storage/). Solitamente occorre raggiungere un compromesso tra disponibilità e prezzo, mentre l'integrità è generalmente garantita. +Per risolvere questo problema, l'ecosistema di Ethereum ha sviluppato [molti modi alternativi per archiviare i dati in modo decentralizzato](/developers/docs/storage/). Di solito comportano un compromesso tra disponibilità e prezzo. Tuttavia, l'integrità è solitamente garantita. -In questo articolo imparerai **come** garantire l'integrità dei dati senza memorizzare i dati sulla blockchain, usando le [prove di Merkle](https://computersciencewiki.org/index.php/Merkle_proof). +In questo articolo imparerai **come** garantire l'integrità dei dati senza archiviare i dati sulla blockchain, utilizzando le [prove di Merkle](https://computersciencewiki.org/index.php/Merkle_proof). ## Come funziona? {#how-does-it-work} -In teoria, potremmo semplicemente memorizzare l'hash dei dati sulla catena e inviare tutti i dati nelle transazioni che lo richiedono. Anche questo però sarebbe troppo costoso. Un byte di dati per una transazione costa circa 16 gas, correntemente circa mezzo centesimo, o circa 5 dollari per kilobyte. 5.000 dollari per megabyte è un prezzo comunque proibitivo per molti utilizzi, anche senza il costo supplementare connesso all'hashing dei dati. +In teoria potremmo semplicemente archiviare l'hash dei dati on-chain e inviare tutti i dati nelle transazioni che lo richiedono. Tuttavia, questo è ancora troppo costoso. Un byte di dati per una transazione costa circa 16 gas, attualmente circa mezzo centesimo, o circa 5 $ per kilobyte. A 5000 $ per megabyte, questo è ancora troppo costoso per molti usi, anche senza il costo aggiuntivo dell'hashing dei dati. -La soluzione consiste nel procedere ripetutamente all'hashing di diverse sottoserie di dati, quindi per i dati che non devono essere inviati è sufficiente inviare un hash. A tale scopo puoi utilizzare un albero di Merkle, una struttura di dati ad albero in cui ogni nodo rappresenta un hash dei nodi sottostanti: +La soluzione è eseguire ripetutamente l'hash di diversi sottoinsiemi di dati, in modo che per i dati che non è necessario inviare si possa semplicemente inviare un hash. Lo si fa utilizzando un albero di Merkle, una struttura dati ad albero in cui ogni nodo è un hash dei nodi sottostanti: ![Albero di Merkle](tree.png) -L'hash principale è l'unica parte che deve essere memorizzata sulla catena. Per provare un dato valore, occorre fornire tutti gli hash che devono essere combinati con esso per ottenere il root. Ad esempio, per provare `C`, occorre fornire `D`, `H(A-B)` e `H(E-H)`. +L'hash radice è l'unica parte che deve essere archiviata on-chain. Per provare un certo valore, fornisci tutti gli hash che devono essere combinati con esso per ottenere la radice. Ad esempio, per provare `C` fornisci `D`, `H(A-B)` e `H(E-H)`. ![Prova del valore di C](proof-c.png) ## Implementazione {#implementation} -[Il campione di codice è disponibile qui](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). +[Il codice di esempio è fornito qui](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). -### Codice esterno alla catena {#off-chain-code} +### Codice fuori catena {#offchain-code} -In questo articolo usiamo JavaScript per i calcoli al di fuori della catena. Gran parte delle app decentralizzate hanno i propri componenti esterni alla catena su JavaScript. +In questo articolo utilizziamo JavaScript per i calcoli fuori catena. La maggior parte delle applicazioni decentralizzate ha il proprio componente fuori catena in JavaScript. -#### Creare il root di Merkle {#creating-the-merkle-root} +#### Creazione della radice di Merkle {#creating-the-merkle-root} -Prima dobbiamo fornire il root di Merkle alla catena. +Per prima cosa dobbiamo fornire la radice di Merkle alla catena. ```javascript const ethers = require("ethers") ``` -[Usiamo la funzione hash dal pacchetto ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). +[Utilizziamo la funzione di hash dal pacchetto ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). ```javascript -// The raw data whose integrity we have to verify. The first two bytes a -// are a user identifier, and the last two bytes the amount of tokens the -// user owns at present. +// I dati grezzi la cui integrità dobbiamo verificare. I primi due byte s +// ono un identificatore utente, e gli ultimi due byte la quantità di token che l' +// utente possiede attualmente. const dataArray = [ 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, 0xface0070, 0xbad00080, 0x060d0091, ] ``` -Codificando ogni voce in un unico numero intero da 256 bit si ottiene un codice meno leggibile rispetto, ad esempio, all'utilizzo di JSON. Tuttavia, ciò comporta un'elaborazione significativamente ridotta per recuperare i dati nel contratto, quindi costi del gas molto inferiori. [JSON può essere letto sulla catena](https://github.com/chrisdotn/jsmnSol), ma è una cattiva idea, quindi se possibile consigliamo di evitarlo. +La codifica di ogni voce in un singolo intero a 256 bit si traduce in un codice meno leggibile rispetto all'utilizzo di JSON, ad esempio. Tuttavia, questo significa un'elaborazione significativamente inferiore per recuperare i dati nel contratto, quindi costi del gas molto più bassi. [Puoi leggere JSON on-chain](https://github.com/chrisdotn/jsmnSol), è solo una cattiva idea se evitabile. ```javascript -// The array of hash values, as BigInts +// L'array dei valori di hash, come BigInt const hashArray = dataArray ``` -In questo caso, per iniziare i nostri dati sono valori da 256 bit, quindi non è necessaria alcuna elaborazione. Se usiamo una struttura di dati più complicata, come le stringhe, dovremo assicurarci di eseguire per prima cosa l'hashing dei dati, così da ottenere un insieme di hash. Anche questo, ricordiamo che non importa se gli utenti conoscono le informazioni altrui. In caso contrario, dovremmo eseguire l'hashing in modo tale che l'utente 1 non conosca il valore per l'utente 0, l'utente 2 non conosca il valore per l'utente 3, ecc. +In questo caso i nostri dati sono valori a 256 bit per cominciare, quindi non è necessaria alcuna elaborazione. Se utilizziamo una struttura dati più complicata, come le stringhe, dobbiamo assicurarci di eseguire prima l'hash dei dati per ottenere un array di hash. Nota che questo è anche perché non ci interessa se gli utenti conoscono le informazioni di altri utenti. Altrimenti avremmo dovuto eseguire l'hash in modo che l'utente 1 non conosca il valore per l'utente 0, l'utente 2 non conosca il valore per l'utente 3, ecc. ```javascript -// Convert between the string the hash function expects and the -// BigInt we use everywhere else. +// Converte tra la stringa che la funzione di hash si aspetta e il +// BigInt che usiamo in ogni altra parte. const hash = (x) => BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) ``` -La funzione hash di ethers prevede di ottenere una stringa in JavaScript con un numero esadecimale, come `0x60A7` e rispondere con un'altra stringa con la stessa struttura. Tuttavia, per il resto del codice è più facile usare `BigInt`, in modo da poter convertire in una stringa esadecimale e tornare indietro. +La funzione di hash di ethers si aspetta di ricevere una stringa JavaScript con un numero esadecimale, come `0x60A7`, e risponde con un'altra stringa con la stessa struttura. Tuttavia, per il resto del codice è più facile usare `BigInt`, quindi convertiamo in una stringa esadecimale e viceversa. ```javascript -// Symmetrical hash of a pair so we won't care if the order is reversed. +// Hash simmetrico di una coppia, così non ci importerà se l'ordine è invertito. const pairHash = (a, b) => hash(hash(a) ^ hash(b)) ``` -Questa funzione è simmetrica (hash di una b [xor](https://en.wikipedia.org/wiki/Exclusive_or)). Questo significa che quando controlliamo la prova di Merkle, non dobbiamo preoccuparci di mettere il valore dalla prova prima o dopo il valore calcolato. Il controllo della prova di Merkle ha luogo sulla catena, quindi meno bisogna fare lì, meglio è. +Questa funzione è simmetrica (hash di a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Ciò significa che quando controlliamo la prova di Merkle non dobbiamo preoccuparci se inserire il valore della prova prima o dopo il valore calcolato. Il controllo della prova di Merkle viene eseguito on-chain, quindi meno dobbiamo fare lì, meglio è. -Attenzione: La crittografia è più complessa di quanto sembri. La versione iniziale di questo articolo conteneva la funzione di hash `hash(a^b)`. Quella era una **cattiva** idea, poiché comportava che, conoscendo i valori legittimi di `a` e `b` avresti potuto usare `b' = a^b^a'` per provare qualsiasi valore `a'` desiderato. Con questa funzione dovresti calcolare `b'` così che `hash(a') ^ hash(b')` sia pari a un valore noto (il ramo successivo verso la radice), il che è molto più difficile. +Attenzione: +La crittografia è più difficile di quanto sembri. +La versione iniziale di questo articolo aveva la funzione di hash `hash(a^b)`. +È stata una **pessima** idea perché significava che se si conoscevano i valori legittimi di `a` e `b` si poteva usare `b' = a^b^a'` per provare qualsiasi valore `a'` desiderato. +Con questa funzione dovresti calcolare `b'` in modo tale che `hash(a') ^ hash(b')` sia uguale a un valore noto (il ramo successivo sulla strada verso la radice), il che è molto più difficile. ```javascript -// The value to denote that a certain branch is empty, doesn't -// have a value +// Il valore per indicare che un certo ramo è vuoto, non +// ha un valore const empty = 0n ``` -Quando il numero di valori non è una potenza intera di due, dobbiamo gestire i rami vuoti. A tale scopo, questo programma inserisce zero come segnaposto. +Quando il numero di valori non è una potenza intera di due, dobbiamo gestire i rami vuoti. Il modo in cui questo programma lo fa è inserire zero come segnaposto. ![Albero di Merkle con rami mancanti](merkle-empty-hash.png) ```javascript -// Calculate one level up the tree of a hash array by taking the hash of -// each pair in sequence +// Calcola un livello superiore dell'albero di un array di hash prendendo l'hash di +// ogni coppia in sequenza const oneLevelUp = (inputArray) => { var result = [] - var inp = [...inputArray] // To avoid over writing the input // Add an empty value if necessary (we need all the leaves to be // paired) + var inp = [...inputArray] // Per evitare di sovrascrivere l'input // Aggiunge un valore vuoto se necessario (abbiamo bisogno che tutte le foglie siano // accoppiate) if (inp.length % 2 === 1) inp.push(empty) @@ -111,13 +114,13 @@ const oneLevelUp = (inputArray) => { } // oneLevelUp ``` -Questa funzione "scala" un livello nell'albero di Merkle eseguendo l'hashing di coppie di valori al livello corrente. Nota che questa non è l'implementazione più efficiente: avremmo potuto evitare di copiare l'input e aggiungere semplicemente `hashEmpty` nel punto appropriato del ciclo, ma questo codice è ottimizzato per migliorare la leggibilità. +Questa funzione "sale" di un livello nell'albero di Merkle eseguendo l'hash delle coppie di valori al livello corrente. Nota che questa non è l'implementazione più efficiente, avremmo potuto evitare di copiare l'input e aggiungere semplicemente `hashEmpty` quando appropriato nel ciclo, ma questo codice è ottimizzato per la leggibilità. ```javascript const getMerkleRoot = (inputArray) => { var result - result = [...inputArray] // Climb up the tree until there is only one value, that is the // root. // // If a layer has an odd number of entries the // code in oneLevelUp adds an empty value, so if we have, for example, // 10 leaves we'll have 5 branches in the second layer, 3 // branches in the third, 2 in the fourth and the root is the fifth + result = [...inputArray] // Risale l'albero finché non c'è un solo valore, ovvero la // radice. // // Se un livello ha un numero dispari di voci, il // codice in oneLevelUp aggiunge un valore vuoto, quindi se abbiamo, per esempio, // 10 foglie avremo 5 rami nel secondo livello, 3 // rami nel terzo, 2 nel quarto e la radice è il quinto while (result.length > 1) result = oneLevelUp(result) @@ -125,57 +128,57 @@ const getMerkleRoot = (inputArray) => { } ``` -Per ottenere la radice, scala finché non resta un solo valore. +Per ottenere la radice, sali finché non rimane un solo valore. -#### Creare una prova di Merkle {#creating-a-merkle-proof} +#### Creazione di una prova di Merkle {#creating-a-merkle-proof} -Una prova di Merkle è data dai valori da sottoporre all'hashing insieme al valore dimostrato in modo da ottenere nuovamente il root di Merkle. Il valore da provare spesso è ricavabile da altri dati, quindi preferisco fornirlo separatamente anziché come parte del codice. +Una prova di Merkle è costituita dai valori di cui eseguire l'hash insieme al valore da provare per riottenere la radice di Merkle. Il valore da provare è spesso disponibile da altri dati, quindi preferisco fornirlo separatamente piuttosto che come parte del codice. ```javascript -// A merkle proof consists of the value of the list of entries to -// hash with. Because we use a symmetrical hash function, we don't -// need the item's location to verify the proof, only to create it +// Una prova di merkle consiste nel valore della lista di voci da +// sottoporre a hash. Poiché usiamo una funzione di hash simmetrica, non +// abbiamo bisogno della posizione dell'elemento per verificare la prova, solo per crearla const getMerkleProof = (inputArray, n) => {     var result = [], currentLayer = [...inputArray], currentN = n -    // Until we reach the top +    // Finché non raggiungiamo la cima     while (currentLayer.length > 1) { -        // No odd length layers +        // Nessun livello di lunghezza dispari         if (currentLayer.length % 2)             currentLayer.push(empty)         result.push(currentN % 2 -               // If currentN is odd, add with the value before it to the proof +               // Se currentN è dispari, aggiungi con il valore che lo precede alla prova             ? currentLayer[currentN-1] -               // If it is even, add the value after it +               // Se è pari, aggiungi il valore che lo segue             : currentLayer[currentN+1]) ``` -Eseguiamo l'hashing di `(v[0],v[1])`, `(v[2],v[3])`, ecc. Quindi per i valori pari ci serve quello successivo, mentre per i valori dispari ci serve quello precedente. +Eseguiamo l'hash di `(v[0],v[1])`, `(v[2],v[3])`, ecc. Quindi per i valori pari abbiamo bisogno di quello successivo, per i valori dispari di quello precedente. ```javascript -        // Move to the next layer up +        // Passa al livello successivo superiore         currentN = Math.floor(currentN/2)         currentLayer = oneLevelUp(currentLayer) -    }   // while currentLayer.length > 1 +    } // while currentLayer.length > 1     return result -}   // getMerkleProof +} // getMerkleProof ``` -### Codice on-chain {#on-chain-code} +### Codice on-chain {#onchain-code} -Finalmente abbiamo il codice che verifica la prova. Il codice on-chain è scritto in [Solidity](https://docs.soliditylang.org/en/v0.8.11/). L'ottimizzazione è molto più importante qui, perché il gas è relativamente costoso. +Infine abbiamo il codice che controlla la prova. Il codice on-chain è scritto in [Solidity](https://docs.soliditylang.org/en/v0.8.11/). L'ottimizzazione è molto più importante qui perché il gas è relativamente costoso. ```solidity -//SPDX-License-Identifier: Public Domain +// SPDX-License-Identifier: Public Domain pragma solidity ^0.8.0; import "hardhat/console.sol"; ``` -L'ho scritto usando l'[ambiente di sviluppo Hardhat](https://hardhat.org/), che ci consente di avere l'[output della console da Solidity](https://hardhat.org/docs/cookbook/debug-logs) durante lo sviluppo. +L'ho scritto utilizzando l'[ambiente di sviluppo Hardhat](https://hardhat.org/), che ci consente di avere l'[output della console da Solidity](https://hardhat.org/docs/cookbook/debug-logs) durante lo sviluppo. ```solidity @@ -186,15 +189,15 @@ contract MerkleProof {       return merkleRoot;     } -    // Extremely insecure, in production code access to -    // this function MUST BE strictly limited, probably to an -    // owner +    // Estremamente insicuro, nel codice di produzione l'accesso a +    // questa funzione DEVE ESSERE strettamente limitato, probabilmente a un +    // proprietario     function setRoot(uint _merkleRoot) external {       merkleRoot = _merkleRoot; -    }   // setRoot +    } // setRoot ``` -Imposta e ottieni le funzioni per il root di Merkle. Consentire a chiunque di aggiornare il root di Merkle è un'_idea assolutamente pessima_ in un sistema di produzione. Qui lo faccio per motivi di semplicità del codice di esempio. **Sconsiglio di farlo su un sistema in cui l'integrità dei dati è importante**. +Funzioni set e get per la radice di Merkle. Lasciare che tutti aggiornino la radice di Merkle è un'_idea estremamente pessima_ in un sistema di produzione. Lo faccio qui per motivi di semplicità per il codice di esempio. **Non farlo su un sistema in cui l'integrità dei dati è davvero importante**. ```solidity     function hash(uint _a) internal pure returns(uint) { @@ -206,12 +209,12 @@ Imposta e ottieni le funzioni per il root di Merkle. Consentire a chiunque di ag     } ``` -Questa funzione genera l'hash di una coppia. È semplicemente la traduzione di Solidity del codice in JavaScript per `hash` e `pairHash`. +Questa funzione genera un hash di coppia. È solo la traduzione in Solidity del codice JavaScript per `hash` e `pairHash`. -**Nota:** Questo è un altro caso d'ottimizzazione per migliorare la leggibilità. In base alla [definizione della funzione](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), potrebbe essere possibile memorizzare i dati come valore [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) ed evitare le conversioni. +**Nota:** Questo è un altro caso di ottimizzazione per la leggibilità. In base alla [definizione della funzione](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), potrebbe essere possibile archiviare i dati come un valore [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) ed evitare le conversioni. ```solidity -    // Verify a Merkle proof +    // Verifica una prova di Merkle     function verifyProof(uint _value, uint[] calldata _proof)         public view returns (bool) {       uint temp = _value; @@ -224,19 +227,21 @@ Questa funzione genera l'hash di una coppia. È semplicemente la traduzione di S       return temp == merkleRoot;     } -}  // MarkleProof +} // MarkleProof ``` -Nella notazione matematica, la verifica della prova di Merkle somiglia a questa: `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(proof_1, H(proof_0, value))...)))`. Questo codice la implementa. +Nella notazione matematica la verifica della prova di Merkle si presenta così: `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(proof_1, H(proof_0, value))...)))`. Questo codice la implementa. -## Prove di Merkle e rollup non si mescolano {#merkle-proofs-and-rollups} +## Le prove di Merkle e i rollup non si mescolano {#merkle-proofs-and-rollups} -Le prove di Merkle non funzionano bene con i [rollup](/developers/docs/scaling/#rollups). Il motivo è che i rollup scrivono tutti i dati della transazione su L1, ma elaborano su L2. Il costo medio per inviare una prova di Merkle con una transazione è di 638 gas per livello (correntemente, un byte nei dati della chiamata costa 16 gas se non è zero, e 4 se è zero). Se abbiamo 1024 parole di dati, una prova di Merkle richiede dieci livelli, o un totale di 6380 gas. +Le prove di Merkle non funzionano bene con i [rollup](/developers/docs/scaling/#rollups). Il motivo è che i rollup scrivono tutti i dati della transazione sul livello 1 (L1), ma li elaborano sul livello 2 (L2). Il costo per inviare una prova di Merkle con una transazione è in media di 638 gas per livello (attualmente un byte nei dati di chiamata costa 16 gas se non è zero, e 4 se è zero). Se abbiamo 1024 parole di dati, una prova di Merkle richiede dieci livelli, o un totale di 6380 gas. -Ad esempio, guardando a [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), la scrittura del gas del L1 costa circa 100 gwei e del L2 circa 0,001 gwei (questo è il prezzo normale, può aumentare con la congestione). Quindi, per il costo di un gas del L1, possiamo consumare centomila gas sull'elaborazione del L2. Supponendo di non sovrascrivere l'archiviazione, ciò significa che possiamo scrivere circa cinque parole all'archiviazione sul L2, per il prezzo di un gas del L1. Per una singola prova di Merkle, possiamo scrivere tutte le 1024 parole all'archiviazione (supponendo innanzitutto che siano calcolabili sulla catena, piuttosto che fornite in una transazione) e comunque avere una rimanenza di gran parte del gas. +Guardando ad esempio a [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), la scrittura del gas su L1 costa circa 100 gwei e il gas su L2 costa 0,001 gwei (questo è il prezzo normale, può aumentare con la congestione). Quindi, per il costo di un gas su L1 possiamo spendere centomila gas per l'elaborazione su L2. Supponendo di non sovrascrivere l'archiviazione, ciò significa che possiamo scrivere circa cinque parole nell'archiviazione su L2 al prezzo di un gas su L1. Per una singola prova di Merkle possiamo scrivere l'intero blocco di 1024 parole nell'archiviazione (supponendo che possano essere calcolate on-chain in primo luogo, piuttosto che fornite in una transazione) e avere ancora la maggior parte del gas rimanente. ## Conclusione {#conclusion} -Nella vita reale potresti non trovarti mai a implementare alberi di Merkle per conto tuo. Esistono librerie ben note e controllate che puoi usare e, in generale, è meglio non implementare primitivi crittografici autonomamente. Ma spero che ora tu abbia compreso meglio le prove di Merkle e possa decidere quando vale la pena usarle. +Nella vita reale potresti non implementare mai gli alberi di Merkle da solo. Ci sono librerie ben note e controllate che puoi usare e, in generale, è meglio non implementare primitive crittografiche da soli. Ma spero che ora tu capisca meglio le prove di Merkle e possa decidere quando vale la pena usarle. -Nota che benché le prove di Merkle preservino l'_integrità_, non preservano la _disponibilità_. Sapere che nessun altro può prendere le tue risorse è una magra consolazione se la memoria dati decide di non consentire l'accesso e non puoi neanche costruire un albero di Merkle per accedervi. Quindi gli alberi di Merkle funzionano meglio con qualche tipo di memoria decentralizzata, come IPFS. +Nota che mentre le prove di Merkle preservano l'_integrità_, non preservano la _disponibilità_. Sapere che nessun altro può prendere i tuoi asset è una magra consolazione se l'archiviazione dei dati decide di negare l'accesso e non puoi nemmeno costruire un albero di Merkle per accedervi. Quindi gli alberi di Merkle sono usati al meglio con un qualche tipo di archiviazione decentralizzata, come IPFS. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/it/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md index fad1fc3e6b8..b2a69b08d7b 100644 --- a/public/content/translations/it/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md +++ b/public/content/translations/it/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -1,27 +1,25 @@ --- title: Monitorare Geth con InfluxDB e Grafana -description: +description: Configura il monitoraggio per il tuo nodo Geth usando InfluxDB e Grafana per tracciare le prestazioni e identificare i problemi. author: "Mario Havel" -tags: - - "client" - - "nodi" +tags: ["client", "nodi"] skill: intermediate -breadcrumb: "Monitorare Geth" +breadcrumb: Monitorare Geth lang: it published: 2021-01-13 --- -Questo tutorial ti aiuterà a configurare il monitoraggio per il tuo nodo di Geth così che tu possa meglio comprenderne le prestazioni e identificare i problemi potenziali. +Questo tutorial ti aiuterà a configurare il monitoraggio per il tuo nodo Geth, in modo da poterne comprendere meglio le prestazioni e identificare potenziali problemi. ## Prerequisiti {#prerequisites} - Dovresti avere già in esecuzione un'istanza di Geth. -- Gran parte dei passaggi ed esempi sono per l'ambiente Linux, è utile quindi una conoscenza di base della console. -- Dai un'occhiata a questa panoramica video della suite di metriche di Geth: [Monitoring an Ethereum infrastructure by Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). +- La maggior parte dei passaggi e degli esempi sono per ambiente Linux, sarà utile una conoscenza di base del terminale. +- Dai un'occhiata a questa panoramica video della suite di metriche di Geth: [Monitoring an Ethereum infrastructure di Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). ## Stack di monitoraggio {#monitoring-stack} -Un client di Ethereum raccoglie molti dati leggibili sotto forma di database cronologico. Per semplificare il monitoraggio, puoi alimentare i dati nel software di visualizzazione. Esistono numerose opzioni disponibili: +Un client di Ethereum raccoglie molti dati che possono essere letti sotto forma di database cronologico. Per semplificare il monitoraggio, puoi inserire questi dati in un software di visualizzazione dei dati. Ci sono diverse opzioni disponibili: - [Prometheus](https://prometheus.io/) (modello pull) - [InfluxDB](https://www.influxdata.com/get-influxdb/) (modello push) @@ -30,13 +28,14 @@ Un client di Ethereum raccoglie molti dati leggibili sotto forma di database cro - [Datadog](https://www.datadoghq.com/) - [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/) -Esiste anche [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), un'opzione preconfigurata con InfluxDB e Grafana. +C'è anche [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), un'opzione preconfigurata con InfluxDB e Grafana. -In questo tutorial, configureremo il tuo client di Geth per inviare i dati a InfluxDB per creare un database e Grafana per creare una visualizzazione grafica dei dati. Farlo manualmente ti aiuterà a comprendere meglio il processo e a distribuirlo in ambienti diversi. +In questo tutorial, configureremo il tuo client Geth per inviare i dati a InfluxDB per creare un database e a Grafana per creare una visualizzazione grafica dei dati. Farlo manualmente ti aiuterà a comprendere meglio il processo, a modificarlo e a distribuirlo in ambienti diversi. ## Configurare InfluxDB {#setting-up-influxdb} -Prima, scarichiamo e installiamo InfluxDB. Varie opzioni di download si possono trovare alla [pagina di release di Influxdata](https://portal.influxdata.com/downloads/). Seleziona quella che si adatta al tuo ambiente. Puoi anche installarla da una [repository](https://repos.influxdata.com/). Per esempio, nella distribuzione basata su Debian: +Per prima cosa, scarichiamo e installiamo InfluxDB. Varie opzioni di download possono essere trovate nella [pagina delle versioni di Influxdata](https://portal.influxdata.com/downloads/). Scegli quella più adatta al tuo ambiente. +Puoi anche installarlo da un [repository](https://repos.influxdata.com/). Ad esempio, in una distribuzione basata su Debian: ``` curl -tlsv1.3 --proto =https -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add @@ -49,13 +48,14 @@ sudo systemctl start influxdb sudo apt install influxdb-client ``` -Dopo aver installato correttamente InfluxDB, accertati che sia in esecuzione in background. Di default, è raggiungibile a `localhost:8086`. Prima di usare il client `influx`, devi creare un nuovo utente con privilegi d'amministratore. Questo utente servirà per l'amministrazione d'alto livello, la creazione di database e utenti. +Dopo aver installato con successo InfluxDB, assicurati che sia in esecuzione in background. Per impostazione predefinita, è raggiungibile su `localhost:8086`. +Prima di utilizzare il client `influx`, devi creare un nuovo utente con privilegi di amministratore. Questo utente servirà per la gestione di alto livello, la creazione di database e utenti. ``` curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" ``` -Ora puoi usare il client di influx per accedere alla [shell di InfluxDB](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) con questo utente. +Ora puoi usare il client influx per accedere alla [shell di InfluxDB](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) con questo utente. ``` influx -username 'username' -password 'password' @@ -81,19 +81,20 @@ Esci dalla shell di InfluxDB. exit ``` -InfluxDB è in esecuzione e configurato per memorizzare le metriche da Geth. +InfluxDB è in esecuzione e configurato per archiviare le metriche da Geth. ## Preparare Geth {#preparing-geth} -Dopo aver configurato il database, dobbiamo abilitare la raccolta di metriche su Geth. Presta attenzione a `METRICS AND STATS OPTIONS` in `geth --help`. Lì si possono trovare diverse opzioni, in questo caso vogliamo che Geth alimenti i dati in InfluxDB. La configurazione di base specifica l'endpoint dove InfluxDB è raggiungibile e l'autenticazione per il database. +Dopo aver configurato il database, dobbiamo abilitare la raccolta delle metriche in Geth. Presta attenzione a `METRICS AND STATS OPTIONS` in `geth --help`. Lì si possono trovare diverse opzioni, in questo caso vogliamo che Geth invii i dati a InfluxDB. +La configurazione di base specifica l'endpoint in cui InfluxDB è raggiungibile e l'autenticazione per il database. ``` geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" ``` -Questi flag possono essere accodati a un comando che avvia il client o salvati nel file di configurazione. +Questi flag possono essere aggiunti a un comando che avvia il client o salvati nel file di configurazione. -Puoi verificare che Geth stia inviando correttamente i dati, per esempio, elencando le metriche nel database. Nella shell di InfluxDB: +Puoi verificare che Geth stia inviando i dati con successo, ad esempio elencando le metriche nel database. Nella shell di InfluxDB: ``` use geth @@ -102,7 +103,8 @@ show measurements ## Configurare Grafana {#setting-up-grafana} -Il prossimo passo è installare Grafana, che interpreterà graficamente i dati. Segui il processo di installazione per il tuo ambiente nella documentazione di Grafana. Assicurati di installare la versione OSS, se non desideri un'altra versione. Esempio di fasi d'installazione per le distribuzioni di Debian usando il repository: +Il passaggio successivo è l'installazione di Grafana, che interpreterà i dati graficamente. Segui il processo di installazione per il tuo ambiente nella documentazione di Grafana. Assicurati di installare la versione OSS se non desideri diversamente. +Esempio di passaggi di installazione per distribuzioni Debian utilizzando il repository: ``` curl -tlsv1.3 --proto =https -sL https://packages.grafana.com/gpg.key | sudo apt-key add - @@ -113,36 +115,38 @@ sudo systemctl enable grafana-server sudo systemctl start grafana-server ``` -Quando Grafana è in esecuzione, dovrebbe esser raggiungibile a `localhost:3000`. Usa il tuo browser preferito per accedere a questo percorso, poi accedi con le credenziali predefinite (utente: `admin` e password: `admin`). Quando richiesto, modifica la password predefinita e salva. +Quando Grafana è in esecuzione, dovrebbe essere raggiungibile su `localhost:3000`. +Usa il tuo browser preferito per accedere a questo percorso, quindi accedi con le credenziali predefinite (utente: `admin` e password: `admin`). Quando richiesto, cambia la password predefinita e salva. -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 1)](./grafana1.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 1)](./grafana1.png) -Sarai reindirizzato alla pagina home di Grafana. Per prima cosa, configura i tuoi dati sorgente. Clicca sull'icona di configurazione nella barra a sinistra e seleziona "Sorgenti dati". +Verrai reindirizzato alla home page di Grafana. Per prima cosa, configura i tuoi dati di origine. Clicca sull'icona di configurazione nella barra di sinistra e seleziona "Data sources" (Origini dati). -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 2)](./grafana2.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 2)](./grafana2.png) -Se non sono ancora state create sorgenti di dati, clicca su "Aggiungi sorgente di dati" per definirne una. +Non ci sono ancora origini dati create, clicca su "Add data source" (Aggiungi origine dati) per definirne una. -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 3)](./grafana3.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 3)](./grafana3.png) Per questa configurazione, seleziona "InfluxDB" e procedi. -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 4)](./grafana4.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 4)](./grafana4.png) -La configurazione della sorgente di dati è abbastanza semplice se esegui gli strumenti sulla stessa macchina. Devi impostare l'indirizzo di InfluxDB e i dettagli per accedere al database. Fai riferimento alla seguente immagine. +La configurazione dell'origine dati è piuttosto semplice se stai eseguendo gli strumenti sulla stessa macchina. Devi impostare l'indirizzo di InfluxDB e i dettagli per accedere al database. Fai riferimento all'immagine sottostante. -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 5)](./grafana5.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 5)](./grafana5.png) -Se tutto è completo e InfluxDB è raggiungibile, clicca su "Salva e prova" e attendi che compaia la conferma. +Se tutto è completo e InfluxDB è raggiungibile, clicca su "Save and test" (Salva e testa) e attendi che appaia la conferma. -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 6)](./grafana6.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 6)](./grafana6.png) -Grafana è ora configurato per leggere i dati da InfluxDB. Ora devi creare una dashboard che li interpreterà e mostrerà. Le proprietà dei pannelli di controllo sono codificate nei file JSON, che possono essere creati da chiunque e sono facilmente importabili. Sulla barra sinistra, clicca su "Crea e Importa". +Grafana è ora configurato per leggere i dati da InfluxDB. Ora devi creare una dashboard che li interpreterà e li visualizzerà. Le proprietà delle dashboard sono codificate in file JSON che possono essere creati da chiunque e facilmente importati. Sulla barra di sinistra, clicca su "Create and Import" (Crea e importa). -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 7)](./grafana7.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 7)](./grafana7.png) -Per una dashboard di monitoraggio di Geth, copia l'ID di [questa dashboard](https://grafana.com/grafana/dashboards/13877/) e incollalo nella "Pagina d'importazione" su Grafana. Dopo aver salvato la dashboard, dovrebbe somigliare a questo: +Per una dashboard di monitoraggio di Geth, copia l'ID di [questa dashboard](https://grafana.com/grafana/dashboards/13877/) e incollalo nella "Import page" (Pagina di importazione) in Grafana. Dopo aver salvato la dashboard, dovrebbe apparire così: -![Screenshot della dashboard di Grafana per il monitoraggio dei Geth (pannello 8)](./grafana8.png) +![Screenshot della dashboard di Grafana per il monitoraggio di Geth (pannello 8)](./grafana8.png) -Puoi modificare i tuoi pannelli di controllo. Ogni pannello può essere modificato, spostato, rimosso o aggiunto. Puoi modificare le tue configurazioni. Sta a te! Per saperne di più su come funzionano i pannelli di controllo, fai riferimento alla [documentazione di Grafana](https://grafana.com/docs/grafana/latest/dashboards/). Potresti esser anche interessato agli [avvisi](https://grafana.com/docs/grafana/latest/alerting/), che ti consentono di configurare delle notifiche di avviso per quando le metriche raggiungono certi valori. Sono supportati diversi canali di comunicazione. +Puoi modificare le tue dashboard. Ogni pannello può essere modificato, spostato, rimosso o aggiunto. Puoi cambiare le tue configurazioni. Dipende da te! Per saperne di più su come funzionano le dashboard, fai riferimento alla [documentazione di Grafana](https://grafana.com/docs/grafana/latest/dashboards/). +Potresti anche essere interessato agli [Avvisi](https://grafana.com/docs/grafana/latest/alerting/). Questo ti permette di configurare notifiche di avviso per quando le metriche raggiungono determinati valori. Sono supportati vari canali di comunicazione. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/nft-minter/index.md b/public/content/translations/it/developers/tutorials/nft-minter/index.md index cf809e6af92..0224200590d 100644 --- a/public/content/translations/it/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/it/developers/tutorials/nft-minter/index.md @@ -1,104 +1,98 @@ --- -title: Tutorial del Coniatore di NFT -description: In questo tutorial, creerai un coniatore di NFT e imparerai come creare una dapp in full stack connettendo il tuo smart contract a un frontend di React usando gli strumenti di MetaMask e Web3. +title: Tutorial sul minter di NFT +description: In questo tutorial, costruirai un minter di NFT e imparerai come creare una dApp full stack collegando il tuo contratto intelligente a un frontend React utilizzando MetaMask e strumenti Web3. author: "smudgil" -tags: - - "solidity" - - "NFT" - - "alchemy" - - "contratti intelligenti" - - "frontend" - - "Pinata" +tags: ["Solidity", "NFT", "Alchemy", "contratti intelligenti", "frontend", "Pinata", "erc-721"] skill: intermediate -breadcrumb: "Dapp conio NFT" +breadcrumb: dApp per coniare NFT lang: it published: 2021-10-06 --- -Una delle più grandi sfide per gli sviluppatori provenienti da Web2 è comprendere come connettere il proprio smart contract a un progetto di frontend, e come interagire con esso. +Una delle sfide più grandi per gli sviluppatori provenienti da un background Web2 è capire come collegare il proprio contratto intelligente a un progetto frontend e interagirvi. -Creando un coniatore di NFT, una semplice UI in cui è possibile inserire un link alla risorsa digitale, un titolo e una descrizione, imparerai come: +Costruendo un minter di NFT — una semplice interfaccia utente in cui puoi inserire un link alla tua risorsa digitale, un titolo e una descrizione — imparerai come: -- Connetterti a MetaMask tramite il progetto del tuo frontend -- Chiamare i metodi dello smart contract dal tuo frontend +- Connetterti a MetaMask tramite il tuo progetto frontend +- Chiamare i metodi del contratto intelligente dal tuo frontend - Firmare le transazioni usando MetaMask -In questo tutorial, utilizzeremo [React](https://reactjs.org/) come framework di frontend. Poiché questo tutorial è incentrato principalmente sullo sviluppo di Web3, non dedicheremo molto tempo ad analizzare i fondamenti di React. Al contrario, ci concentreremo sul portare funzionalità al nostro progetto. +In questo tutorial, utilizzeremo [React](https://react.dev/) come nostro framework frontend. Poiché questo tutorial è incentrato principalmente sullo sviluppo Web3, non dedicheremo molto tempo ad analizzare i fondamenti di React. Ci concentreremo invece sull'aggiunta di funzionalità al nostro progetto. -Come prerequisito, dovresti avere conoscenze di base di React e sapere come funzionano i componenti, gli accessori, useState/useEffect e la chiamata delle funzioni di base. Se non hai mai sentito parlare di alcuno di questi termini prima d'ora, è consigliabile dare un'occhiata a questo [tutorial d'introduzione a React](https://reactjs.org/tutorial/tutorial.html). Per chi preferisce l'apprendimento visivo, consigliamo vivamente quest'eccellente serie di video [Tutorial moderno e completo su React](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) di Net Ninja. +Come prerequisito, dovresti avere una comprensione di livello base di React: sapere come funzionano i componenti, le prop, useState/useEffect e le chiamate di funzioni di base. Se non hai mai sentito nessuno di questi termini prima, potresti voler dare un'occhiata a questo [Tutorial introduttivo a React](https://react.dev/learn/tutorial-tic-tac-toe). Per chi apprende in modo più visivo, consigliamo vivamente questa eccellente serie di video [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) di Net Ninja. -E se non lo hai già fatto, necessiterai decisamente di un conto di Alchemy, per completare questo tutorial, nonché per creare qualsiasi cosa sulla blockchain. Registra gratuitamente un conto,[qui](https://alchemy.com/). +E se non lo hai già fatto, avrai sicuramente bisogno di un account Alchemy per completare questo tutorial e per costruire qualsiasi cosa sulla blockchain. Registrati per un account gratuito [qui](https://alchemy.com/). -Iniziamo quindi! +Senza ulteriori indugi, iniziamo! -## Guida alla Creazione di NFT {#making-nfts-101} +## Creare NFT 101 {#making-nfts-101} -Prima ancora d'iniziare ad esaminare qualsiasi codice, è importante comprendere come funziona la creazione di un NFT. Si articola in due fasi: +Prima ancora di iniziare a guardare il codice, è importante capire come funziona la creazione di un NFT. Prevede due passaggi: -### Pubblicare lo smart contract di un NFT sulla blockchain di Ethereum {#publish-nft} +### Pubblicare un contratto intelligente per NFT sulla blockchain di Ethereum {#publish-nft} -La più grande differenza tra i due standard di smart contract di NFT è che ERC-1155 è uno standard multi-token e comprende funzionalità batch, mentre ERC-721 è uno standard a token singolo, supporta dunque solo il trasferimento di un token per volta. +La più grande differenza tra i due standard di contratti intelligenti per NFT è che l'ERC-1155 è uno standard multi-token e include funzionalità in batch, mentre l'ERC-721 è uno standard a token singolo e pertanto supporta solo il trasferimento di un token alla volta. -### Chiamare la funzione di conio {#minting-function} +### Chiamare la funzione per coniare {#minting-function} -Solitamente, questa funzione di conio richiede di passare due variabili come parametri, prima `recipient`, che specifica l'indirizzo che riceverà il tuo NFT appena coniato e poi il `tokenURI` del NFT, una stringa che si risolve a un documento JSON che descrive i metadati del NFT. +Di solito, questa funzione per coniare richiede di passare due variabili come parametri: primo, il `recipient`, che specifica l'indirizzo che riceverà il tuo NFT appena coniato, e secondo, il `tokenURI` dell'NFT, una stringa che si risolve in un documento JSON che descrive i metadati dell'NFT. -I metadati di un NFT sono davvero ciò che lo porta in vita, consentendogli di avere proprietà, quali nome, descrizione, immagine (o altre risorse digitali) e altri attributi. Ecco [un esempio di un tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), contenente i metadati di un NFT. +I metadati di un NFT sono in realtà ciò che gli dà vita, consentendogli di avere proprietà, come un nome, una descrizione, un'immagine (o una diversa risorsa digitale) e altri attributi. Ecco [un esempio di tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), che contiene i metadati di un NFT. -In questo tutorial, ci concentreremo sulla parte 2: chiamare una funzione di conio dello smart contract del NFT esistente usando la nostra UI di React. +In questo tutorial, ci concentreremo sulla parte 2, chiamando la funzione per coniare di un contratto intelligente di un NFT esistente utilizzando la nostra interfaccia utente React. -[Ecco un link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) allo smart contract del NFT dell'ERC-721 che chiameremo in questo tutorial. Se sei interessato a imparare come lo abbiamo creato, consigliamo vivamente di dare un'occhiata al nostro tutorial, ["Come creare un NFT"](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). +[Ecco un link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) al contratto intelligente dell'NFT ERC-721 che chiameremo in questo tutorial. Se desideri imparare come lo abbiamo realizzato, ti consigliamo vivamente di dare un'occhiata al nostro altro tutorial, ["Come creare un NFT"](https://www.alchemy.com/docs/how-to-create-an-nft). -Forte! Ora che sappiamo come funziona la creazione di un NFT, cloniamo i nostri file iniziali! +Fantastico, ora che abbiamo capito come funziona la creazione di un NFT, cloniamo i nostri file di partenza! -## Clonare i file iniziali {#clone-the-starter-files} +## Clonare i file di partenza {#clone-the-starter-files} -Prima, vai al [repository di GitHub nft-minter-tutorial](https://github.com/alchemyplatform/nft-minter-tutorial) per ottenere i file iniziali per questo progetto. Clona questo repository nel tuo ambiente locale. +Per prima cosa, vai al [repository GitHub nft-minter-tutorial](https://github.com/alchemyplatform/nft-minter-tutorial) per ottenere i file di partenza per questo progetto. Clona questo repository nel tuo ambiente locale. Quando apri questo repository `nft-minter-tutorial` clonato, noterai che contiene due cartelle: `minter-starter-files` e `nft-minter`. -- `minter-starter-files` contiene i file iniziali (essenzialmente l'UI di React) per questo progetto. In questo tutorial, **lavoreremo in questa cartella**, mentre impari a dar vita a questa UI connettendola al tuo portafoglio di Ethereum e a uno smart contract di NFT. -- `nft-minter` contiene l'intero tutorial completato e serve come **riferimento** **se dovessi bloccarti.** +- `minter-starter-files` contiene i file di partenza (essenzialmente l'interfaccia utente React) per questo progetto. In questo tutorial, **lavoreremo in questa directory**, mentre impari come dare vita a questa interfaccia utente collegandola al tuo portafoglio Ethereum e a un contratto intelligente per NFT. +- `nft-minter` contiene l'intero tutorial completato ed è lì per te come **riferimento** **se rimani bloccato.** -Apri quindi la tua copia di `minter-starter-files` nel tuo editor di codice e poi vai alla cartella `src`. +Successivamente, apri la tua copia di `minter-starter-files` nel tuo editor di codice, e poi naviga nella tua cartella `src`. -Tutto il codice che scriveremo sarà sotto la cartella `src`. Modificheremo il componente `Minter.js` e scriveremo altri file in JavaScript per dare funzionalità al nostro progetto Web3. +Tutto il codice che scriveremo risiederà nella cartella `src`. Modificheremo il componente `Minter.js` e scriveremo file javascript aggiuntivi per dare al nostro progetto funzionalità Web3. -## Fase 2: dai un'occhiata ai nostri file iniziali {#step-2-check-out-our-starter-files} +## Passaggio 2: Dai un'occhiata ai nostri file di partenza {#step-2-check-out-our-starter-files} -Prima di iniziare a programmare, è importante dare un'occhiata a ciò che è già disponibile nei file iniziali. +Prima di iniziare a programmare, è importante dare un'occhiata a ciò che ci è già stato fornito nei file di partenza. -### Metti in funzione il tuo progetto di React {#get-your-react-project-running} +### Avviare il tuo progetto react {#get-your-react-project-running} -Iniziamo eseguendo il progetto di React nel browser. La bellezza di React è che una volta eseguito il nostro progetto nel browser, ogni modifica che salviamo sarà aggiornata dal vivo nel browser. +Iniziamo eseguendo il progetto React nel nostro browser. Il bello di React è che una volta che abbiamo il nostro progetto in esecuzione nel browser, qualsiasi modifica salvata verrà aggiornata in tempo reale nel browser. -Per mettere il progetto in funzione, vai alla cartella di root della cartella `minter-starter-files` ed esegui `npm install` nel terminale per installare le dipendenze del progetto: +Per avviare il progetto, naviga nella directory principale della cartella `minter-starter-files` ed esegui `npm install` nel tuo terminale per installare le dipendenze del progetto: ```bash cd minter-starter-files npm install ``` -Una volta terminata l'installazione, esegui `npm start` nel terminale: +Una volta terminata l'installazione, esegui `npm start` nel tuo terminale: ```bash npm start ``` -Così facendo, dovrebbe aprirsi http://localhost:3000/ nel browser, dove vedrai il frontend per il nostro progetto. Dovrebbe consistere in 3 campi: un luogo per inserire un link alla tua risorsa NFT, uno per inserire il nome e uno per fornire una descrizione. +Così facendo dovrebbe aprirsi http://localhost:3000/ nel tuo browser, dove vedrai il frontend per il nostro progetto. Dovrebbe consistere in 3 campi: un posto dove inserire un link alla risorsa del tuo NFT, inserire il nome del tuo NFT e fornire una descrizione. -Se provi a cliccare i pulsanti "Connetti Portafoglio" o "Conia NFT", noterai che non funzionano, questo perché devi ancora programmarne la funzionalità! :\) +Se provi a cliccare sui pulsanti "Connect Wallet" o "Mint NFT", noterai che non funzionano: questo perché dobbiamo ancora programmare la loro funzionalità! :\) ### Il componente Minter.js {#minter-js} **NOTA:** Assicurati di essere nella cartella `minter-starter-files` e non nella cartella `nft-minter`! -Torniamo alla cartella `src` nell'editor e apriamo il file `Minter.js`. È davvero importante comprendere tutto il contenuto di questo file, che è il componente principale di React su cui lavoreremo. +Torniamo nella cartella `src` nel nostro editor e apriamo il file `Minter.js`. È importantissimo comprendere tutto in questo file, poiché è il componente React principale su cui lavoreremo. -In cima al nostro file, abbiamo le nostre variabili di stato che aggiorneremo dopo eventi specifici. +All'inizio di questo file, abbiamo le nostre variabili di stato che aggiorneremo dopo eventi specifici. ```javascript -//State variables +// Variabili di stato const [walletAddress, setWallet] = useState("") const [status, setStatus] = useState("") const [name, setName] = useState("") @@ -106,42 +100,42 @@ const [description, setDescription] = useState("") const [url, setURL] = useState("") ``` -Mai sentito parlare di variabili di stato di React o di hook di stato? Dai un'occhiata a [questa](https://reactjs.org/docs/hooks-state.html) documentazione. +Mai sentito parlare di variabili di stato o hook di stato di React? Dai un'occhiata a [questa](https://legacy.reactjs.org/docs/hooks-state.html) documentazione. -Ecco cosa rappresenta ognuna delle variabili: +Ecco cosa rappresenta ciascuna delle variabili: - `walletAddress` - una stringa che memorizza l'indirizzo del portafoglio dell'utente -- `status` - una stringa contenente un messaggio da mostrare in fondo all'UI -- `name` - una stringa che memorizza il nome del NFT -- `description` - una stringa che memorizza la descrizione del NFT -- `url` - una stringa che rappresenta un link alla risorsa digitale del NFT +- `status` - una stringa che contiene un messaggio da visualizzare nella parte inferiore dell'interfaccia utente +- `name` - una stringa che memorizza il nome dell'NFT +- `description` - una stringa che memorizza la descrizione dell'NFT +- `url` - una stringa che è un link alla risorsa digitale dell'NFT -Dopo le variabili di stato, vedrai tre funzioni non implementate: `useEffect`, `connectWalletPressed` e `onMintPressed`. Noterai che tutte queste funzioni sono `async`, perché al loro interno effettueremo chiamate asincrone all'API! I nomi sono indicativi delle loro funzionalità: +Dopo le variabili di stato, vedrai tre funzioni non implementate: `useEffect`, `connectWalletPressed` e `onMintPressed`. Noterai che tutte queste funzioni sono `async`, questo perché effettueremo chiamate API asincrone al loro interno! I loro nomi sono eponimi delle loro funzionalità: ```javascript useEffect(async () => { - //TODO: implement + // TODO: implementare }, []) const connectWalletPressed = async () => { - //TODO: implement + // TODO: implementare } const onMintPressed = async () => { - //TODO: implement + // TODO: implementare } ``` -- [`useEffect`](https://reactjs.org/docs/hooks-effect.html) - questo è un hook di React chiamato dopo il rendering del tuo componente. Poiché in essa viene passato un array vuoto `[]` (vedi la riga 3), sarà chiamata solo al _primo_ rendering del componente. Qui chiameremo il listener del nostro portafoglio e un'altra funzione del portafoglio per aggiornare la nostra UI affinché rifletta se un portafoglio è già collegato. -- `connectWalletPressed` - questa funzione sarà chiamata per connettere il portafoglio di MetaMask dell'utente alla nostra dapp. -- `onMintPressed` - questa funzione sarà chiamata per coniare il NFT dell'utente. +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - questo è un hook di React che viene chiamato dopo il rendering del tuo componente. Poiché gli viene passata una prop array vuota `[]` (vedi riga 3), verrà chiamato solo al _primo_ rendering del componente. Qui chiameremo il nostro listener del portafoglio e un'altra funzione del portafoglio per aggiornare la nostra interfaccia utente in modo da riflettere se un portafoglio è già connesso. +- `connectWalletPressed` - questa funzione verrà chiamata per connettere il portafoglio MetaMask dell'utente alla nostra dApp. +- `onMintPressed` - questa funzione verrà chiamata per coniare l'NFT dell'utente. -Vicino alla fine di questo file, abbiamo l'UI del nostro componente. Se esamini attentamente questo codice, noterai che aggiorniamo le nostre variabili di stato `url`, `name` e `description`, quando l'input nei relativi campi di testo cambia. +Verso la fine di questo file, abbiamo l'interfaccia utente del nostro componente. Se esamini attentamente questo codice, noterai che aggiorniamo le nostre variabili di stato `url`, `name` e `description` quando cambia l'input nei rispettivi campi di testo. -Vedrai anche che `connectWalletPressed` e `onMintPressed` vengono chiamate rispettivamente quando viene fatto clic sui pulsanti con ID `mintButton` e `walletButton`. +Vedrai anche che `connectWalletPressed` e `onMintPressed` vengono chiamate quando si fa clic rispettivamente sui pulsanti con ID `mintButton` e `walletButton`. ```javascript -//the UI of our component +// la UI del nostro componente return (

{status}

-
+ ) ``` -Infine, vediamo dove viene aggiunto questo componente del Coniatore. +Infine, vediamo dove viene aggiunto questo componente Minter. -Se vai al file `App.js`, che è il componente principale su React e che agisce come contenitore per tutti gli altri componenti, vedrai che il nostro componente del Coniatore è inserito alla riga 7. +Se vai al file `App.js`, che è il componente principale in React che funge da contenitore per tutti gli altri componenti, vedrai che il nostro componente Minter è iniettato alla riga 7. -**In questo tutorial, modificheremo solo il file `Minter.js` e aggiungeremo i file alla nostra cartella `src`.** +**In questo tutorial, modificheremo solo il file `Minter.js` e aggiungeremo file nella nostra cartella `src`.** -Ora che ci è chiaro con cosa stiamo lavorando, configuriamo il portafoglio di Ethereum! +Ora che abbiamo capito con cosa stiamo lavorando, configuriamo il nostro portafoglio Ethereum! -## Configura il tuo wallet Ethereum {#set-up-your-ethereum-wallet} +## Configurare il tuo portafoglio Ethereum {#set-up-your-ethereum-wallet} -Per poter interagire con il tuo smart contract, gli utenti dovranno connettere il proprio portafoglio di Ethereum alla tua dapp. +Affinché gli utenti possano interagire con il tuo contratto intelligente, dovranno connettere il loro portafoglio Ethereum alla tua dApp. -### Scarica MetaMask {#download-metamask} +### Scaricare MetaMask {#download-metamask} -Per questo tutorial, utilizzeremo MetaMask, un portafoglio virtuale nel browser, utilizzato per gestire l'indirizzo del tuo conto di Ethereum. Se vuoi capire di più su come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/). +Per questo tutorial, useremo MetaMask, un portafoglio virtuale nel browser utilizzato per gestire l'indirizzo del tuo account Ethereum. Se vuoi capire meglio come funzionano le transazioni su Ethereum, dai un'occhiata a [questa pagina](/developers/docs/transactions/). -Puoi scaricare e creare gratuitamente un conto di MetaMask [qui](https://metamask.io/download). Quando stai creando un conto, o se ne hai già uno, assicurati di passare alla "Rete di Prova di Ropsten" in alto a destra \(così da non avere a che fare con denaro reale\). +Puoi scaricare e creare un account MetaMask gratuitamente [qui](https://metamask.io/download). Quando crei un account, o se ne hai già uno, assicurati di passare alla "Rete di test Ropsten" in alto a destra \(in modo da non avere a che fare con denaro reale\). -### Aggiungere ether da un Faucet {#add-ether-from-faucet} +### Aggiungere ether da un rubinetto {#add-ether-from-faucet} -Per coniare i nostri NFT (o firmare qualsiasi transazione sulla blockchain di Ethereum), avremo bisogno di qualche finto Eth. Per ottenere degli Eth puoi andare al [faucet di Ropsten](https://faucet.ropsten.be/) e inserire l'indirizzo del tuo conto di Ropsten, poi cliccare “Invia Eth a Ropsten.” Poco dopo, dovresti vedere gli Eth nel tuo conto di MetaMask! +Per coniare i nostri NFT (o firmare qualsiasi transazione sulla blockchain di Ethereum), avremo bisogno di alcuni ETH finti. Per ottenere ETH puoi andare al [rubinetto Ropsten](https://faucet.ropsten.be/) e inserire l'indirizzo del tuo account Ropsten, quindi cliccare su "Send Ropsten Eth". Dovresti vedere gli ETH nel tuo account MetaMask poco dopo! -### Controlla il tuo saldo {#check-your-balance} +### Controllare il tuo saldo {#check-your-balance} -Per ricontrollare che ci sia il saldo, facciamo una richiesta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando lo [strumento compositore di Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Questo restituirà l'importo di Eth nel tuo portafoglio. Dopo aver inserito l'indirizzo del tuo conto di MetaMask e aver cliccato "Invia Richiesta", dovresti visualizzare una risposta simile alla seguente: +Per verificare che il nostro saldo sia presente, facciamo una richiesta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) utilizzando lo [strumento composer di Alchemy](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D). Questo restituirà la quantità di ETH nel nostro portafoglio. Dopo aver inserito l'indirizzo del tuo account MetaMask e cliccato su "Send Request", dovresti vedere una risposta come questa: ```text {"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} ``` -**NOTA:** Questo risultato è in wei non in eth. Wei è usato come taglio più piccolo dell'ether. La conversione da wei a eth è: 1 eth = 10¹⁸ wei. Quindi se convertiamo 0xde0b6b3a7640000 in decimali, otteniamo 1\*10¹⁸, pari a 1 eth. +**NOTA:** Questo risultato è in wei, non in eth. Il wei è utilizzato come la più piccola denominazione di ether. La conversione da wei a eth è: 1 eth = 10¹⁸ wei. Quindi, se convertiamo 0xde0b6b3a7640000 in decimale, otteniamo 1\*10¹⁸ che equivale a 1 eth. -Meno male! I nostri soldi finti ci sono tutti! +Fiuu! I nostri soldi finti ci sono tutti! -## Connettere MetaMask alla UI {#connect-metamask-to-your-UI} +## Connettere MetaMask alla tua interfaccia utente {#connect-metamask-to-your-UI} -Ora che il nostro portafoglio di MetaMask è configurato, connettiamo la nostra dapp! +Ora che il nostro portafoglio MetaMask è configurato, connettiamo la nostra dApp ad esso! -Poiché vogliamo prescrivere al paradigma del [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), creeremo un file separato che contiene le nostre funzioni per gestire la logica, i dati e le regole della nostra dapp e poi passeremo tali funzioni al nostro frontend (il nostro componente Minter.js). +Poiché vogliamo attenerci al paradigma [MVC](https://it.wikipedia.org/wiki/Model-view-controller), creeremo un file separato che contiene le nostre funzioni per gestire la logica, i dati e le regole della nostra dApp, per poi passare quelle funzioni al nostro frontend (il nostro componente Minter.js). -### La funzione `connectWallet` {#connect-wallet-function} +### La funzione connectWallet {#connect-wallet-function} -Per farlo, creiamo una nuova cartella chiamata `utils` nella nostra cartella `src` e aggiungiamo al suo interno un file chiamato `interact.js`, che conterrà tutte le funzioni d'interazione del nostro portafoglio e del nostro smart contract. +Per farlo, creiamo una nuova cartella chiamata `utils` nella tua directory `src` e aggiungiamo un file chiamato `interact.js` al suo interno, che conterrà tutte le nostre funzioni di interazione con il portafoglio e il contratto intelligente. Nel nostro file `interact.js`, scriveremo una funzione `connectWallet`, che poi importeremo e chiameremo nel nostro componente `Minter.js`. @@ -275,26 +269,26 @@ export const connectWallet = async () => { Analizziamo cosa fa questo codice: -Per prima cosa, la nostra funzione verifica se `window.ethereum` è abilitato nel browser. +Per prima cosa, la nostra funzione controlla se `window.ethereum` è abilitato nel tuo browser. -`window.ethereum` è un'API globale, iniettata da MetaMask e altri fornitori di portafogli, che consente ai siti web di richiedere i conti di Ethereum degli utenti. Se approvata, può leggere i dati dalle blockchain a cui è connesso l'utente e suggerire all'utente di firmare messaggi e transazioni. Dai un'occhiata alla [documentazione di MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) per ulteriori informazioni! +`window.ethereum` è un'API globale iniettata da MetaMask e da altri provider di portafogli che consente ai siti web di richiedere gli account Ethereum degli utenti. Se approvata, può leggere i dati dalle blockchain a cui l'utente è connesso e suggerire all'utente di firmare messaggi e transazioni. Dai un'occhiata alla [documentazione di MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) per maggiori informazioni! -Se `window.ethereum` _non è_ presente, significa che MetaMask non è installato. Verrà quindi restituito un oggetto JSON in cui l'`address` restituito è una stringa vuota e l'oggetto JSX di `status` indica che l'utente deve installare MetaMask. +Se `window.ethereum` _non è_ presente, significa che MetaMask non è installato. Ciò si traduce nella restituzione di un oggetto JSON, in cui l'`address` restituito è una stringa vuota e l'oggetto JSX `status` comunica che l'utente deve installare MetaMask. -**Gran parte delle funzioni che scriveremo restituiranno oggetti JSON che possiamo usare per aggiornare le nostre variabili di stato e l'UI.** +**La maggior parte delle funzioni che scriveremo restituirà oggetti JSON che possiamo usare per aggiornare le nostre variabili di stato e l'interfaccia utente.** -Ora, se `window.ethereum` _è_ presente, le cose cominciano a farsi interessanti. +Ora, se `window.ethereum` _è_ presente, è qui che le cose si fanno interessanti. -Utilizzando un ciclo try/catch, proveremo a connetterci a MetaMask chiamando `[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`. Chiamare questa funzione aprirà MetaMask nel browser, dove sarà richiesto all'utente di connettere il proprio portafoglio alla tua dapp. +Utilizzando un blocco try/catch, proveremo a connetterci a MetaMask chiamando [`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). La chiamata a questa funzione aprirà MetaMask nel browser, per cui all'utente verrà richiesto di connettere il proprio portafoglio alla tua dApp. -- Se l'utente sceglie di connettersi, `method: "eth_requestAccounts"` restituirà un insieme contenente tutti gli indirizzi del conto dell'utente, connessi alla dapp. Nel complesso, la nostra funzione `connectWallet` restituirà un oggetto JSON contenente il _primo_ `address` in questo array \(vedi la riga 9\) e un messaggio di `status` che richiede all'utente di scrivere un messaggio nello smart contract. -- Se l'utente rifiuta la connessione, allora l'oggetto JSON conterrà una stringa vuota per l'`address` restituito e un messaggio di `status` che indica che l'utente ha rifiutato la connessione. +- Se l'utente sceglie di connettersi, `method: "eth_requestAccounts"` restituirà un array che contiene tutti gli indirizzi degli account dell'utente connessi alla dApp. Nel complesso, la nostra funzione `connectWallet` restituirà un oggetto JSON che contiene il _primo_ `address` in questo array \(vedi riga 9\) e un messaggio di `status` che invita l'utente a scrivere un messaggio al contratto intelligente. +- Se l'utente rifiuta la connessione, l'oggetto JSON conterrà una stringa vuota per l'`address` restituito e un messaggio di `status` che riflette il fatto che l'utente ha rifiutato la connessione. -### Aggiungi la funzione connectWallet al tuo componente UI Minter.js {#add-connect-wallet} +### Aggiungere la funzione connectWallet al tuo componente dell'interfaccia utente Minter.js {#add-connect-wallet} Ora che abbiamo scritto questa funzione `connectWallet`, connettiamola al nostro componente `Minter.js.`. -Prima, dovremo importare la nostra funzione nel file `Minter.js`, aggiungendo `import { connectWallet } from "./utils/interact.js";` in cima al file `Minter.js`. Le tue prime 11 righe di `Minter.js` dovrebbero somigliare a questo: +Per prima cosa, dovremo importare la nostra funzione nel nostro file `Minter.js` aggiungendo `import { connectWallet } from "./utils/interact.js";` all'inizio del file `Minter.js`. Le tue prime 11 righe di `Minter.js` dovrebbero ora apparire così: ```javascript import { useEffect, useState } from "react"; @@ -302,7 +296,7 @@ import { connectWallet } from "./utils/interact.js"; const Minter = (props) => { - //State variables + // Variabili di stato const [walletAddress, setWallet] = useState(""); const [status, setStatus] = useState(""); const [name, setName] = useState(""); @@ -310,7 +304,7 @@ const Minter = (props) => { const [url, setURL] = useState(""); ``` -Poi, nella nostra funzione `connectWalletPressed`, chiameremo la funzione `connectWallet` importata, come quella che segue: +Quindi, all'interno della nostra funzione `connectWalletPressed`, chiameremo la nostra funzione `connectWallet` importata, in questo modo: ```javascript const connectWalletPressed = async () => { @@ -320,25 +314,25 @@ const connectWalletPressed = async () => { } ``` -Nota come gran parte della nostra funzionalità è esterna al nostro componente `Minter.js` dal file `interact.js`? Questo perché stiamo seguendo il modello M-V-C! +Noti come la maggior parte delle nostre funzionalità sia astratta dal nostro componente `Minter.js` nel file `interact.js`? Questo per rispettare il paradigma M-V-C! -In `connectWalletPressed`, creiamo semplicemente una chiamata d'attesa alla nostra funzione `connectWallet` importata e, usando la sua risposta, aggiorniamo le nostre variabili `status` e `walletAddress` tramite i loro hook di stato. +In `connectWalletPressed`, effettuiamo semplicemente una chiamata await alla nostra funzione `connectWallet` importata e, utilizzando la sua risposta, aggiorniamo le nostre variabili `status` e `walletAddress` tramite i loro hook di stato. -Ora, salviamo entrambi i file `Minter.js` e `interact.js` e testiamo la nostra UI. +Ora, salviamo entrambi i file `Minter.js` e `interact.js` e testiamo la nostra interfaccia utente finora. -Apri il browser su localhost:3000 e premi il pulsante "Connetti Portafoglio" in alto a destra alla pagina. +Apri il tuo browser su localhost:3000 e premi il pulsante "Connect Wallet" in alto a destra nella pagina. -Se hai MetaMask installato, ti dovrebbe essere richiesto di connettere il tuo portafoglio alla tua dapp. Accetta l'invito a connetterti. +Se hai installato MetaMask, ti dovrebbe essere richiesto di connettere il tuo portafoglio alla tua dApp. Accetta l'invito a connetterti. -Dovresti vedere ora che il pulsante del portafoglio indica che l'indirizzo è connesso. +Dovresti vedere che il pulsante del portafoglio ora riflette che il tuo indirizzo è connesso. -Prova quindi a ricaricare la pagina... questo è strano. Il nostro pulsante del portafoglio ci sta richiedendo di connetterci a MetaMask, anche se è già connesso... +Successivamente, prova ad aggiornare la pagina... questo è strano. Il nostro pulsante del portafoglio ci chiede di connettere MetaMask, anche se è già connesso... -Non preoccuparti! Possiamo risolverlo facilmente implementando una funzione chiamata `getCurrentWalletConnected`, che verificherà se un indirizzo è già connesso alla nostra dapp e aggiornerà l'UI di conseguenza! +Non preoccuparti però! Possiamo risolverlo facilmente implementando una funzione chiamata `getCurrentWalletConnected`, che controllerà se un indirizzo è già connesso alla nostra dApp e aggiornerà la nostra interfaccia utente di conseguenza! ### La funzione getCurrentWalletConnected {#get-current-wallet} -Nel file `interact.js`, aggiungi la seguente funzione `getCurrentWalletConnected`: +Nel tuo file `interact.js`, aggiungi la seguente funzione `getCurrentWalletConnected`: ```javascript export const getCurrentWalletConnected = async () => { @@ -383,23 +377,23 @@ export const getCurrentWalletConnected = async () => { } ``` -Questo codice è _molto_ simile alla funzione `connectWallet` che abbiamo scritto poco fa. +Questo codice è _molto_ simile alla funzione `connectWallet` che abbiamo appena scritto in precedenza. -La differenza principale è che, invece di chiamare il metodo `eth_requestAccounts`, che apre MetaMask perché l'utente connetta il proprio portafoglio, qui chiamiamo il metodo `eth_accounts` che, semplicemente, restituisce un insieme contenente gli indirizzi di MetaMask correntemente connessi alla nostra dapp. +La differenza principale è che invece di chiamare il metodo `eth_requestAccounts`, che apre MetaMask affinché l'utente connetta il proprio portafoglio, qui chiamiamo il metodo `eth_accounts`, che restituisce semplicemente un array contenente gli indirizzi MetaMask attualmente connessi alla nostra dApp. Per vedere questa funzione in azione, chiamiamola nella funzione `useEffect` del nostro componente `Minter.js`. -Come abbiamo fatto per `connectWallet`, dobbiamo importare questa funzione dal file `interact.js` al file `Minter.js`, come segue: +Come abbiamo fatto per `connectWallet`, dobbiamo importare questa funzione dal nostro file `interact.js` nel nostro file `Minter.js` in questo modo: ```javascript import { useEffect, useState } from "react" import { connectWallet, - getCurrentWalletConnected, //import here + getCurrentWalletConnected, // importa qui } from "./utils/interact.js" ``` -Ora, semplicemente, chiamiamola nella nostra funzione `useEffect`: +Ora, la chiamiamo semplicemente nella nostra funzione `useEffect`: ```javascript useEffect(async () => { @@ -409,15 +403,15 @@ useEffect(async () => { }, []) ``` -Nota che stiamo usando la risposta alla nostra chiamata a `getCurrentWalletConnected` per aggiornare le nostre variabili di stato `walletAddress` e `status`. +Nota, usiamo la risposta della nostra chiamata a `getCurrentWalletConnected` per aggiornare le nostre variabili di stato `walletAddress` e `status`. -Una volta aggiunto questo codice, prova a ricaricare la nostra finestra del browser. Il pulsante dovrebbe dire che sei connesso e mostrare un'anteprima dell'indirizzo del tuo portafoglio connesso, anche dopo un refresh! +Una volta aggiunto questo codice, prova ad aggiornare la finestra del browser. Il pulsante dovrebbe dire che sei connesso e mostrare un'anteprima dell'indirizzo del tuo portafoglio connesso, anche dopo l'aggiornamento! ### Implementare addWalletListener {#implement-add-wallet-listener} -Il passaggio finale della configurazione del portafoglio della nostra dapp è implementare l'ascoltatore del portafoglio, così che la nostra UI si aggiorni al cambiamento dello stato del nostro portafoglio, ad esempio, quando l'utente si disconnette o cambia conto. +Il passaggio finale nella configurazione del portafoglio della nostra dApp è l'implementazione del listener del portafoglio in modo che la nostra interfaccia utente si aggiorni quando lo stato del nostro portafoglio cambia, ad esempio quando l'utente si disconnette o cambia account. -Nel file `Minter.js`, aggiungi una funzione `addWalletListener`, simile a quanto segue: +Nel tuo file `Minter.js`, aggiungi una funzione `addWalletListener` che assomigli alla seguente: ```javascript function addWalletListener() { @@ -444,13 +438,13 @@ function addWalletListener() { } ``` -Esaminiamo rapidamente cosa sta succedendo qui: +Analizziamo rapidamente cosa sta succedendo qui: -- Per prima cosa, la nostra funzione verifica se `window.ethereum` è abilitata \(cioè se MetaMask è installato\). - - Se non lo è, impostiamo semplicemente la nostra variabile di stato `status`a una stringa JSX che richiede all'utente di installare MetaMask. - - Se è abilitato, configuriamo l'ascoltatore `window.ethereum.on("accountsChanged")` alla riga 3, affinché ascolti i cambiamenti di stato nel portafoglio di MetaMask, tra cui, quando l'utente connette un ulteriore conto alla dapp, cambia conto, o ne disconnette uno. Se è connesso almeno un conto, la variabile di stato `walletAddress` è aggiornata come primo conto nell'insieme `accounts`, restituito dall'ascoltatore. Altrimenti, `walletAddress` è impostato come una stringa vuota. +- Per prima cosa, la nostra funzione controlla se `window.ethereum` è abilitato \(cioè, MetaMask è installato\). + - Se non lo è, impostiamo semplicemente la nostra variabile di stato `status` su una stringa JSX che invita l'utente a installare MetaMask. + - Se è abilitato, impostiamo il listener `window.ethereum.on("accountsChanged")` alla riga 3 che ascolta i cambiamenti di stato nel portafoglio MetaMask, che includono quando l'utente connette un account aggiuntivo alla dApp, cambia account o disconnette un account. Se c'è almeno un account connesso, la variabile di stato `walletAddress` viene aggiornata come il primo account nell'array `accounts` restituito dal listener. Altrimenti, `walletAddress` viene impostato come una stringa vuota. -Infine, dobbiamo chiamarlo nella nostra funzione `useEffect`: +Infine, dobbiamo chiamarla nella nostra funzione `useEffect`: ```javascript useEffect(async () => { @@ -462,66 +456,66 @@ useEffect(async () => { }, []) ``` -E voilà! Abbiamo completato la programmazione di tutte le funzionalità del nostro portafoglio! Ora che il nostro portafoglio è configurato, cerchiamo di capire come coniare il nostro NFT! +E voilà! Abbiamo completato la programmazione di tutte le funzionalità del nostro portafoglio! Ora che il nostro portafoglio è configurato, scopriamo come coniare il nostro NFT! -## Guida di base ai Metadati del NFT {#nft-metadata-101} +## Metadati NFT 101 {#nft-metadata-101} -Ricorda quindi che i metadati del NFT di cui abbiamo appena parlato al Passaggio 0 di questo tutorial, portano in vita un NFT, consentendogli di avere proprietà quali una risorsa digitale, un nome, una descrizione e altri attributi. +Quindi ricorda i metadati dell'NFT di cui abbiamo appena parlato nel Passaggio 0 di questo tutorial: danno vita a un NFT, consentendogli di avere proprietà, come una risorsa digitale, un nome, una descrizione e altri attributi. -Dovremo configurare questi metadati come un oggetto JSON e memorizzarli, quindi potremo passarli come parametro `tokenURI`, chiamando la nostra funzione `mintNFT` dello smart contract. +Dovremo configurare questi metadati come un oggetto JSON e memorizzarli, in modo da poterli passare come parametro `tokenURI` quando chiamiamo la funzione `mintNFT` del nostro contratto intelligente. -Il testo nei campi "Link to Asset", "Name", "Description" comprenderà le diverse proprietà dei metadati del nostro NFT. Formatteremo questi metadati come un oggetto JSON, ma esistono un paio di opzioni per dove possiamo memorizzare questo oggetto: +Il testo nei campi "Link to Asset", "Name", "Description" comprenderà le diverse proprietà dei metadati del nostro NFT. Formatteremo questi metadati come un oggetto JSON, ma ci sono un paio di opzioni su dove possiamo memorizzare questo oggetto JSON: -- Potremmo memorizzarlo sulla blockchain di Ethereum; ma farlo sarebbe molto costoso. -- Potremmo memorizzarlo su un server centralizzato, come AWS o Firebase. Ma questo sarebbe contrario alla nostra etica di decentralizzazione. -- Potremmo usare IPFS, un protocollo decentralizzato e rete peer-to-peer per memorizzare e condividere dati in un sistema di file distribuito. Poiché questo protocollo è decentralizzato e libero, è la nostra opzione preferita! +- Potremmo memorizzarlo sulla blockchain di Ethereum; tuttavia, farlo sarebbe molto costoso. +- Potremmo memorizzarlo su un server centralizzato, come AWS o Firebase. Ma ciò vanificherebbe la nostra etica di decentralizzazione. +- Potremmo usare IPFS, un protocollo decentralizzato e una rete peer-to-peer per l'archiviazione e la condivisione di dati in un file system distribuito. Poiché questo protocollo è decentralizzato e gratuito, è la nostra migliore opzione! -Per memorizzare i nostri metadati su IPFS, useremo [Pinata](https://pinata.cloud/), una comoda API e un toolkit per IPFS. Al prossimo passaggio, spiegheremo esattamente come farlo! +Per memorizzare i nostri metadati su IPFS, useremo [Pinata](https://pinata.cloud/), una comoda API e toolkit IPFS. Nel prossimo passaggio, spiegheremo esattamente come farlo! -## Utilizza Pinata per fissare i tuoi metadati su IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} +## Usare Pinata per fissare i tuoi metadati su IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} -Se non hai un conto di [Pinata](https://pinata.cloud/), registrane gratuitamente uno [qui](https://app.pinata.cloud/auth/signup) e completa i passaggi per verificare la tua email e il tuo conto. +Se non hai un account [Pinata](https://pinata.cloud/), registrati per un account gratuito [qui](https://app.pinata.cloud/auth/signup) e completa i passaggi per verificare la tua email e il tuo account. -### Crea la tua chiave API di Pinata {#create-pinata-api-key} +### Creare la tua chiave API Pinata {#create-pinata-api-key} -Vai alla pagina [https://pinata.cloud/keys](https://pinata.cloud/keys), quindi seleziona il pulsante "Nuova Chiave" in alto, abilita il widget Admin e assegna un nome alla tua chiave. +Naviga alla pagina [https://pinata.cloud/keys](https://pinata.cloud/keys), quindi seleziona il pulsante "New Key" in alto, imposta il widget Admin come abilitato e dai un nome alla tua chiave. -Ti sarà poi mostrato un popup con le informazioni sulla tua API. Assicurati di conservarle da qualche parte al sicuro. +Ti verrà quindi mostrato un popup con le informazioni della tua API. Assicurati di metterle in un posto sicuro. -Ora che la nostra chiave è configurata, aggiungiamola al nostro progetto così da poterla usare. +Ora che la nostra chiave è configurata, aggiungiamola al nostro progetto in modo da poterla usare. -### Crea un file .env {#create-a-env} +### Creare un file .env {#create-a-env} -Possiamo memorizzare in sicurezza la nostra chiave e il codice segreto di Pinata in un file di ambiente. Installiamo il [pacchetto dotenv](https://www.npmjs.com/package/dotenv) nella cartella del progetto. +Possiamo memorizzare in modo sicuro la nostra chiave e il segreto Pinata in un file di ambiente. Installiamo il [pacchetto dotenv](https://www.npmjs.com/package/dotenv) nella directory del tuo progetto. -Apri una nuova scheda nel terminale \(separata da quella che sta eseguendo l'host locale\) e assicurati di essere nella cartella `minter-starter-files`, poi esegui il seguente comando nel terminale: +Apri una nuova scheda nel tuo terminale \(separata da quella che esegue il localhost\) e assicurati di essere nella cartella `minter-starter-files`, quindi esegui il seguente comando nel tuo terminale: ```text npm install dotenv --save ``` -Crea quindi un file `.env` nella cartella di root del tuo `minter-starter-files` inserendo quanto segue a riga di comando: +Successivamente, crea un file `.env` nella directory principale dei tuoi `minter-starter-files` inserendo quanto segue nella riga di comando: ```javascript vim.env ``` -Questo aprirà il file `.env` in vim \(un editor di testo\). Per salvarlo, clicca "esc" + ":" + "q" sulla tua tastiera in questa sequenza. +Questo aprirà il tuo file `.env` in vim \(un editor di testo\). Per salvarlo premi "esc" + ":" + "q" sulla tua tastiera in quest'ordine. -Poi, su VSCode, vai al file `.env` e aggiungi al suo interno la tua chiave API di Pinata e il codice segreto dell'API, come segue: +Successivamente, in VSCode, naviga al tuo file `.env` e aggiungi la tua chiave API e il segreto API Pinata ad esso, in questo modo: ```text REACT_APP_PINATA_KEY = REACT_APP_PINATA_SECRET = ``` -Salva il file: sei pronto ora per scrivere la funzione per caricare i tuoi metadati di JSON su IPFS! +Salva il file e poi sei pronto per iniziare a scrivere la funzione per caricare i tuoi metadati JSON su IPFS! -### Implementa pinJSONToIPFS {#pin-json-to-ipfs} +### Implementare pinJSONToIPFS {#pin-json-to-ipfs} -Per nostra fortuna, Pinata ha un'[API specifica per caricare i dati JSON su IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) e un comodo JavaScript con esempio di axios che possiamo usare, con alcune lievi modifiche. +Fortunatamente per noi, Pinata ha un'[API specifica per caricare dati JSON su IPFS](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) e un comodo esempio JavaScript con axios che possiamo usare, con alcune lievi modifiche. -Nella cartella `utils` creiamo un altro file denominato `pinata.js` e poi importiamo il nostro codice segreto di Pinata e la chiave dal file .env, come segue: +Nella tua cartella `utils`, creiamo un altro file chiamato `pinata.js` e poi importiamo il nostro segreto e la chiave Pinata dal file .env in questo modo: ```javascript require("dotenv").config() @@ -529,7 +523,7 @@ const key = process.env.REACT_APP_PINATA_KEY const secret = process.env.REACT_APP_PINATA_SECRET ``` -Incolla quindi il codice aggiuntivo seguente nel file `pinata.js`. Non preoccuparti, analizzeremo per bene cosa significa! +Successivamente, incolla il codice aggiuntivo qui sotto nel tuo file `pinata.js`. Non preoccuparti, analizzeremo cosa significa tutto! ```javascript require("dotenv").config() @@ -540,7 +534,7 @@ const axios = require("axios") export const pinJSONToIPFS = async (JSONBody) => { const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS` - //making axios POST request to Pinata ⬇️ + // effettuando la richiesta POST con axios a Pinata ⬇️ return axios .post(url, JSONBody, { headers: { @@ -565,63 +559,63 @@ export const pinJSONToIPFS = async (JSONBody) => { } ``` -Quindi, cosa fa esattamente questo codice? +Quindi cosa fa esattamente questo codice? -Prima di tutto, importa [axios](https://www.npmjs.com/package/axios), un client HTTP basato su Promise per il browser e node.js, che useremo per creare una richiesta a Pinata. +Per prima cosa, importa [axios](https://www.npmjs.com/package/axios), un client HTTP basato su promise per il browser e node.js, che useremo per fare una richiesta a Pinata. -Poi abbiamo la nostra funzione asincrona `pinJSONToIPFS`, che prende un `JSONBody` come input e la chiave API e il codice segreto di Pinata nell'intestazione, tutto per creare una richiesta di POST all'API `pinJSONToIPFS`. +Poi abbiamo la nostra funzione asincrona `pinJSONToIPFS`, che prende un `JSONBody` come input e la chiave e il segreto api Pinata nel suo header, il tutto per fare una richiesta POST alla loro API `pinJSONToIPFS`. -- Se questa richiesta di POST riesce, allora la nostra funzione restituisce un oggetto JSON con il booleano `success` impostato a true e il `pinataUrl` in cui i nostri metadati sono stati fissati. Useremo il `pinataUrl` restituito come l'input del `tokenURI` alla funzione di conio del nostro smart contract. -- Se questa richiesta di POST fallisce, allora la nostra funzione restituisce un oggetto JSON con il booleano `success` impostato false e una stringa `message` che comunica l'errore. +- Se questa richiesta POST ha successo, la nostra funzione restituisce un oggetto JSON con il booleano `success` come true e il `pinataUrl` in cui sono stati fissati i nostri metadati. Useremo questo `pinataUrl` restituito come input `tokenURI` per la funzione per coniare del nostro contratto intelligente. +- Se questa richiesta post fallisce, la nostra funzione restituisce un oggetto JSON con il booleano `success` come false e una stringa `message` che comunica il nostro errore. -Come con i tipi restituiti dalla nostra funzione `connectWallet`, stiamo restituendo oggetti JSON, così da poterne usare i parametri per aggiornare le nostre variabili di stato e l'UI. +Come per i tipi di ritorno della nostra funzione `connectWallet`, stiamo restituendo oggetti JSON in modo da poter usare i loro parametri per aggiornare le nostre variabili di stato e l'interfaccia utente. -## Carica il tuo smart contract {#load-your-smart-contract} +## Caricare il tuo contratto intelligente {#load-your-smart-contract} -Ora che abbiamo un modo per caricare i metadati del nostro NFT su IPFS tramite la nostra funzione `pinJSONToIPFS`, avremo bisogno di un modo per caricare un'istanza del nostro smart contract, così da poterne chiamare la funzione `mintNFT`. +Ora che abbiamo un modo per caricare i metadati del nostro NFT su IPFS tramite la nostra funzione `pinJSONToIPFS`, avremo bisogno di un modo per caricare un'istanza del nostro contratto intelligente in modo da poter chiamare la sua funzione `mintNFT`. -Come menzionato prima, in questo tutorial useremo [questo smart contract NFT esistente](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE); se invece sei interessato a sapere come lo abbiamo creato, o se vuoi crearne uno tuo, consigliamo vivamente di dare un'occhiata all'altro nostro tutorial, ["Come Creare un NFT."](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). +Come abbiamo menzionato in precedenza, in questo tutorial useremo [questo contratto intelligente per NFT esistente](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE); tuttavia, se desideri imparare come lo abbiamo realizzato, o crearne uno tu stesso, ti consigliamo vivamente di dare un'occhiata al nostro altro tutorial, ["Come creare un NFT"](https://www.alchemy.com/docs/how-to-create-an-nft). ### L'ABI del contratto {#contract-abi} -Se hai esaminato attentamente i nostri file, avrai notato che nella nostra cartella `src` si trova un file `contract-abi.json`. Un'ABI serve per specificare quale funzione invocherà un contratto, oltre che per garantire che la funzione restituirà i dati nel formato previsto. +Se hai esaminato attentamente i nostri file, avrai notato che nella nostra directory `src` c'è un file `contract-abi.json`. Un'ABI è necessaria per specificare quale funzione invocherà un contratto, oltre a garantire che la funzione restituirà i dati nel formato che ti aspetti. -Avremo anche bisogno di una chiave API di Alchemy e dell'API Alchemy Web3 per connetterci alla blockchain di Ethereum e caricare il nostro smart contract. +Avremo anche bisogno di una chiave API Alchemy e dell'API Alchemy Web3 per connetterci alla blockchain di Ethereum e caricare il nostro contratto intelligente. -### Crea la tua chiave API di Alchemy {#create-alchemy-api} +### Creare la tua chiave API Alchemy {#create-alchemy-api} -Se non hai già un conto di Alchemy, [registrane gratuitamente uno qui.](https://alchemy.com/?a=eth-org-nft-minter) +Se non hai già un account Alchemy, [registrati gratuitamente qui.](https://alchemy.com/?a=eth-org-nft-minter) -Una volta creato un conto di Alchemy, puoi generare una chiave API creando un'app. Questo ci consentirà di effettuare richieste alla rete di prova di Ropsten. +Una volta creato un account Alchemy, puoi generare una chiave API creando un'app. Questo ci consentirà di fare richieste alla rete di test Ropsten. -Vai alla pagina “Crea App” nella tua dashboard di Alchemy passando su “App” nella barra di navigazione e cliccando “Crea App”. +Naviga alla pagina "Create App" nella tua Dashboard Alchemy passando il mouse su "Apps" nella barra di navigazione e cliccando su "Create App". -Dai un nome alla tua app (noi abbiamo scelto “Il mio primo NFT!", aggiungi una breve descrizione, seleziona “Staging” come Ambiente) serve per la contabilità della tua app e scegli "Ropsten" come rete. +Dai un nome alla tua app, noi abbiamo scelto "My First NFT!", offri una breve descrizione, seleziona "Staging" per l'Ambiente utilizzato per la contabilità della tua app e scegli "Ropsten" per la tua rete. -Clicca “Crea app” ed è tutto! La tua app dovrebbe apparire nella tabella seguente. +Clicca su "Create app" e il gioco è fatto! La tua app dovrebbe apparire nella tabella sottostante. -Fantastico, ora che abbiamo creato il nostro URL dell'API di Alchemy HTTP, copiamolo negli appunti... +Fantastico, quindi ora che abbiamo creato il nostro URL API HTTP Alchemy, copialo negli appunti... -…e poi aggiungiamolo al nostro file `.env`. Nel complesso, il file .env dovrebbe somigliare a questo: +…e poi aggiungiamolo al nostro file `.env`. Nel complesso, il tuo file .env dovrebbe apparire così: ```text REACT_APP_PINATA_KEY = REACT_APP_PINATA_SECRET = -REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +REACT_APP_ALCHEMY_KEY = https: // eth-ropsten.alchemyapi.io/v2/ ``` -Ora che abbiamo l'ABI del nostro contratto e la nostra chiave API di Alchemy, siamo pronti a caricare il nostro smart contract usando [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). +Ora che abbiamo l'ABI del nostro contratto e la nostra chiave API Alchemy, siamo pronti per caricare il nostro contratto intelligente utilizzando [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). -### Configura l'endpoint e il contratto di Web3 di Alchemy {#setup-alchemy-endpoint} +### Configurare il tuo endpoint Alchemy Web3 e il contratto {#setup-alchemy-endpoint} -Prima di tutto, se non lo hai già fatto, dovrai installare [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) navigando alla cartella home: `nft-minter-tutorial` nel terminale: +Per prima cosa, se non lo hai già, dovrai installare [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) navigando nella directory home: `nft-minter-tutorial` nel terminale: ```text cd .. npm install @alch/alchemy-web3 ``` -Torniamo quindi al nostro file `interact.js`. In cima al file, aggiungi il seguente codice per importare la tua chiave di Alchemy dal file .env e configurare il tuo endpoint di Alchemy Web3: +Successivamente torniamo al nostro file `interact.js`. All'inizio del file, aggiungi il seguente codice per importare la tua chiave Alchemy dal tuo file .env e configurare il tuo endpoint Alchemy Web3: ```javascript require("dotenv").config() @@ -630,9 +624,9 @@ const { createAlchemyWeb3 } = require("@alch/alchemy-web3") const web3 = createAlchemyWeb3(alchemyKey) ``` -[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) è un wrapper intorno a[Web3.js](https://docs.web3js.org/) che fornisce metodi API migliorati e altri benefici fondamentale per semplificare la tua vita a uno sviluppatore web3. È progettato per richiedere una configurazione minima, così da poter iniziare a usarlo immediatamente nella tua app! +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) è un wrapper attorno a [Web3.js](https://docs.web3js.org/), che fornisce metodi API migliorati e altri vantaggi cruciali per semplificarti la vita come sviluppatore web3. È progettato per richiedere una configurazione minima in modo da poter iniziare a usarlo subito nella tua app! -In seguito, aggiungiamo l'ABI del nostro contratto e l'indirizzo del contratto al nostro file. +Successivamente, aggiungiamo l'ABI del nostro contratto e l'indirizzo del contratto al nostro file. ```javascript require("dotenv").config() @@ -644,27 +638,27 @@ const contractABI = require("../contract-abi.json") const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE" ``` -Una volta che abbiamo entrambi, siamo pronti a iniziare a programmare la nostra funzione di conio! +Una volta che li abbiamo entrambi, siamo pronti per iniziare a programmare la nostra funzione per coniare! -## Implementa la funzione mintNFT {#implement-the-mintnft-function} +## Implementare la funzione mintNFT {#implement-the-mintnft-function} -Nel file `interact.js`, definiamo la nostra funzione, `mintNFT`, che conierà il nostro omonimo NFT. +All'interno del tuo file `interact.js`, definiamo la nostra funzione, `mintNFT`, che eponimamente conierà il nostro NFT. -Poiché effettueremo numerose chiamate asincrone \(a Pinata per fissare i nostri metadati su IPFS, a Alchemy Web3 per caricare il nostro smart contract e a MetaMask per firmare le nostre transazioni\), anche la nostra funzione sarà asincrona. +Poiché effettueremo numerose chiamate asincrone \(a Pinata per fissare i nostri metadati su IPFS, ad Alchemy Web3 per caricare il nostro contratto intelligente e a MetaMask per firmare le nostre transazioni\), anche la nostra funzione sarà asincrona. -I tre input alla nostra funzione saranno l'`url` della nostra risorsa digitale, il `name` e la `description`. Aggiungi la seguente firma della funzione sotto la funzione `connectWallet`: +I tre input per la nostra funzione saranno l'`url` della nostra risorsa digitale, il `name` e la `description`. Aggiungi la seguente firma della funzione sotto la funzione `connectWallet`: ```javascript export const mintNFT = async (url, name, description) => {} ``` -### Gestione degli errori d'input {#input-error-handling} +### Gestione degli errori di input {#input-error-handling} -Naturalmente, è utile avere una certa gestione degli errori di input all'inizio della funzione, uscendo dalla funzione se i nostri parametri di input sono errati. Nella nostra funzione, aggiungiamo il seguente codice: +Naturalmente, ha senso avere una sorta di gestione degli errori di input all'inizio della funzione, in modo da uscire da questa funzione se i nostri parametri di input non sono corretti. All'interno della nostra funzione, aggiungiamo il seguente codice: ```javascript export const mintNFT = async (url, name, description) => { - //error handling + // gestione degli errori if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, @@ -674,25 +668,25 @@ export const mintNFT = async (url, name, description) => { } ``` -Essenzialmente, se uno qualsiasi dei parametri d'input è una stringa vuota, restituiamo un oggetto JSON in cui il booleano `success` è false e la stringa `status` indica che tutti i campi nella nostra UI devono esser completi. +Essenzialmente, se uno qualsiasi dei parametri di input è una stringa vuota, restituiamo un oggetto JSON in cui il booleano `success` è false e la stringa `status` comunica che tutti i campi nella nostra interfaccia utente devono essere completati. -### Carica i metadati su IPFS {#upload-metadata-to-ipfs} +### Caricare i metadati su IPFS {#upload-metadata-to-ipfs} -Una volta che sappiamo che i nostri metadati sono correttamente formattati, il prossimo passaggio è avvolgerli in un oggetto JSON e caricarli su IPFS tramite il `pinJSONToIPFS` che abbiamo scritto! +Una volta che sappiamo che i nostri metadati sono formattati correttamente, il passaggio successivo è racchiuderli in un oggetto JSON e caricarli su IPFS tramite la funzione `pinJSONToIPFS` che abbiamo scritto! -Per farlo, prima dobbiamo importare la funzione `pinJSONToIPFS` nel nostro file `interact.js`. In cima al `interact.js`, aggiungiamo: +Per farlo, dobbiamo prima importare la funzione `pinJSONToIPFS` nel nostro file `interact.js`. Proprio all'inizio di `interact.js`, aggiungiamo: ```javascript import { pinJSONToIPFS } from "./pinata.js" ``` -Ricorda che `pinJSONToIPFS` riceve in un body JSON. Quindi, prima di effettuare una chiamata a esso, dovremo formattare i nostri parametri `url`, `name` e `description` in un oggetto JSON. +Ricorda che `pinJSONToIPFS` accetta un corpo JSON. Quindi, prima di effettuare una chiamata ad essa, dovremo formattare i nostri parametri `url`, `name` e `description` in un oggetto JSON. Aggiorniamo il nostro codice per creare un oggetto JSON chiamato `metadata` e poi effettuiamo una chiamata a `pinJSONToIPFS` con questo parametro `metadata`: ```javascript export const mintNFT = async (url, name, description) => { - //error handling + // gestione degli errori if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, @@ -700,13 +694,13 @@ export const mintNFT = async (url, name, description) => { } } - //make metadata + // crea i metadati const metadata = new Object() metadata.name = name metadata.image = url metadata.description = description - //make pinata call + // effettua la chiamata a pinata const pinataResponse = await pinJSONToIPFS(metadata) if (!pinataResponse.success) { return { @@ -718,29 +712,29 @@ export const mintNFT = async (url, name, description) => { } ``` -Nota che memorizziamo la risposta della nostra chiamata a `pinJSONToIPFS(metadata)` nell'oggetto `pinataResponse`. Analizziamo quindi questo oggetto alla ricerca di eventuali errori. +Nota, memorizziamo la risposta della nostra chiamata a `pinJSONToIPFS(metadata)` nell'oggetto `pinataResponse`. Quindi, analizziamo questo oggetto per eventuali errori. -Se è presente un errore, restituiamo un oggetto JSON in cui il booleano `success` è impostato a false e la nostra stringa `status` indica che la nostra chiamata non è andata a buon fine. Altrimenti, estraiamo `pinataURL` dal `pinataResponse` e lo memorizziamo come la nostra variabile `tokenURI`. +Se c'è un errore, restituiamo un oggetto JSON in cui il booleano `success` è false e la nostra stringa `status` comunica che la nostra chiamata è fallita. Altrimenti, estraiamo il `pinataURL` dalla `pinataResponse` e lo memorizziamo come nostra variabile `tokenURI`. -È arrivato il momento di caricare il nostro smart contract usando l'API Alchemy Web3 che abbiamo inizializzato in cima al nostro file. Aggiungi la seguente riga di codice in fondo alla funzione `mintNFT` per impostare il contratto alla variabile globale `window.contract`: +Ora è il momento di caricare il nostro contratto intelligente utilizzando l'API Alchemy Web3 che abbiamo inizializzato all'inizio del nostro file. Aggiungi la seguente riga di codice in fondo alla funzione `mintNFT` per impostare il contratto nella variabile globale `window.contract`: ```javascript window.contract = await new web3.eth.Contract(contractABI, contractAddress) ``` -L'ultima cosa da aggiungere alla nostra funzione `mintNFT` è la nostra transazione di Ethereum: +L'ultima cosa da aggiungere nella nostra funzione `mintNFT` è la nostra transazione Ethereum: ```javascript -//set up your Ethereum transaction +// imposta la tua transazione Ethereum const transactionParameters = { - to: contractAddress, // Required except during contract publications. - from: window.ethereum.selectedAddress, // must match user's active address. + to: contractAddress, // Obbligatorio tranne durante le pubblicazioni del contratto. + from: window.ethereum.selectedAddress, // deve corrispondere all'indirizzo attivo dell'utente. data: window.contract.methods .mintNFT(window.ethereum.selectedAddress, tokenURI) - .encodeABI(), //make call to NFT smart contract + .encodeABI(), // effettua la chiamata allo smart contract NFT } -//sign the transaction via MetaMask +// firma la transazione tramite MetaMask try { const txHash = await window.ethereum.request({ method: "eth_sendTransaction", @@ -760,21 +754,21 @@ try { } ``` -Se conosci già le transazioni di Ethereum, noterai che la struttura è abbastanza simile a quella che hai visto. +Se hai già familiarità con le transazioni Ethereum, noterai che la struttura è abbastanza simile a quella che hai visto. -- Prima, configuriamo i parametri delle nostre transazioni. - - `to` specifica l'indirizzo del destinatario \(il nostro smart contract\) +- Per prima cosa, impostiamo i parametri delle nostre transazioni. + - `to` specifica l'indirizzo del destinatario \(il nostro contratto intelligente\) - `from` specifica il firmatario della transazione \(l'indirizzo dell'utente connesso a MetaMask: `window.ethereum.selectedAddress`\) - - `data` contiene la chiamata al metodo `mintNFT` del nostro smart contract, che riceve come input il nostro `tokenURI` e l'indirizzo del portafoglio dell'utente, `window.ethereum.selectedAddress`. -- Creiamo quindi una chiamata d'attesa, `window.ethereum.request,` in cui chiediamo a MetaMask di firmare la transazione. Nota che, in questa richiesta, stiamo specificando il nostro metodo eth \(eth_SentTransaction\) e passando il nostro `transactionParameters`. A questo punto, MetaMask si aprirà nel browser e richiederà all'utente di firmare o rifiutare la transazione. - - Se la transazione va a buon fine, la funzione restituirà un oggetto JSON in cui il booleano `success` è impostato a true e la stringa `status` richiede all'utente di controllare Etherscan per ulteriori informazioni sulla sua transazione. - - Se la transazione non va a buon fine, la funzione restituirà un oggetto JSON in cui il booleano `success` è impostato a false e la stringa `status` trasmette il messaggio d'errore. + - `data` contiene la chiamata al metodo `mintNFT` del nostro contratto intelligente, che riceve il nostro `tokenURI` e l'indirizzo del portafoglio dell'utente, `window.ethereum.selectedAddress`, come input +- Quindi, effettuiamo una chiamata await, `window.ethereum.request,` in cui chiediamo a MetaMask di firmare la transazione. Nota, in questa richiesta, stiamo specificando il nostro metodo eth \(eth_SentTransaction\) e passando i nostri `transactionParameters`. A questo punto, MetaMask si aprirà nel browser e chiederà all'utente di firmare o rifiutare la transazione. + - Se la transazione ha successo, la funzione restituirà un oggetto JSON in cui il booleano `success` è impostato su true e la stringa `status` invita l'utente a controllare Etherscan per maggiori informazioni sulla sua transazione. + - Se la transazione fallisce, la funzione restituirà un oggetto JSON in cui il booleano `success` è impostato su false e la stringa `status` comunica il messaggio di errore. -Nel complesso, la nostra funzione `mintNFT` dovrebbe somigliare a questa: +Nel complesso, la nostra funzione `mintNFT` dovrebbe apparire così: ```javascript export const mintNFT = async (url, name, description) => { - //error handling + // gestione degli errori if (url.trim() == "" || name.trim() == "" || description.trim() == "") { return { success: false, @@ -782,13 +776,13 @@ export const mintNFT = async (url, name, description) => { } } - //make metadata + // crea i metadati const metadata = new Object() metadata.name = name metadata.image = url metadata.description = description - //pinata pin request + // richiesta di pin a pinata const pinataResponse = await pinJSONToIPFS(metadata) if (!pinataResponse.success) { return { @@ -798,19 +792,19 @@ export const mintNFT = async (url, name, description) => { } const tokenURI = pinataResponse.pinataUrl - //load smart contract - window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + // carica lo smart contract + window.contract = await new web3.eth.Contract(contractABI, contractAddress) // loadContract(); - //set up your Ethereum transaction + // imposta la tua transazione Ethereum const transactionParameters = { - to: contractAddress, // Required except during contract publications. - from: window.ethereum.selectedAddress, // must match user's active address. + to: contractAddress, // Obbligatorio tranne durante le pubblicazioni del contratto. + from: window.ethereum.selectedAddress, // deve corrispondere all'indirizzo attivo dell'utente. data: window.contract.methods .mintNFT(window.ethereum.selectedAddress, tokenURI) - .encodeABI(), //make call to NFT smart contract + .encodeABI(), // effettua la chiamata allo smart contract NFT } - //sign transaction via MetaMask + // firma la transazione tramite MetaMask try { const txHash = await window.ethereum.request({ method: "eth_sendTransaction", @@ -831,11 +825,11 @@ export const mintNFT = async (url, name, description) => { } ``` -Questa è una funzione gigante! Ora, dobbiamo solo connettere la nostra funzione `mintNFT` al nostro componente `Minter.js`... +È una funzione gigantesca! Ora, dobbiamo solo connettere la nostra funzione `mintNFT` al nostro componente `Minter.js`... -## Connetti mintNFT al nostro frontend di Minter.js {#connect-our-frontend} +## Connettere mintNFT al nostro frontend Minter.js {#connect-our-frontend} -Apri il file `Minter.js` e aggiorna la riga `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` in alto affinché sia: +Apri il tuo file `Minter.js` e aggiorna la riga `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` in alto in modo che sia: ```javascript import { @@ -845,7 +839,7 @@ import { } from "./utils/interact.js" ``` -Infine, implementa la funzione `onMintPressed` per effettuare la chiamata d'attesa alla tua funzione `mintNFT` importata e aggiornare la variabile di stato `status` affinché rifletta se la nostra transazione è andata o meno a buon fine: +Infine, implementa la funzione `onMintPressed` per effettuare una chiamata await alla tua funzione `mintNFT` importata e aggiornare la variabile di stato `status` per riflettere se la nostra transazione ha avuto successo o è fallita: ```javascript const onMintPressed = async () => { @@ -854,22 +848,22 @@ const onMintPressed = async () => { } ``` -## Distribuisci il tuo NFT a un sito web live {#deploy-your-NFT} +## Distribuire il tuo NFT su un sito web live {#deploy-your-NFT} -Pronto a portare in vita il tuo progetto affinché gli utenti vi interagiscano? Dai un'occhiata a [questo tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) per distribuire il tuo Coniatore su un sito web live. +Pronto a portare il tuo progetto live affinché gli utenti possano interagirvi? Dai un'occhiata a [questo tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) per distribuire il tuo Minter su un sito web live. Un ultimo passaggio... ## Prendi d'assalto il mondo della blockchain {#take-the-blockchain-world-by-storm} -Stiamo scherzando, sei arrivato alla fine del tutorial! +Scherzavo, sei arrivato alla fine del tutorial! -Per ricapitolare, creando un coniatore di NFT, hai imparato correttamente come: +Per riassumere, costruendo un minter di NFT, hai imparato con successo come: -- Connetterti a MetaMask tramite il progetto del tuo frontend -- Chiamare i metodi dello smart contract dal tuo frontend +- Connetterti a MetaMask tramite il tuo progetto frontend +- Chiamare i metodi del contratto intelligente dal tuo frontend - Firmare le transazioni usando MetaMask -Molto probabilmente vorrai mostrare gli NFT coniati tramite la tua dapp nel tuo portafoglio, dai quindi un'occhiata al nostro rapido tutorial [Come visualizzare il tuo NFT nel tuo Portafoglio](https://docs.alchemyapi.io/alchemy/tutorials/how-to-write-and-deploy-a-nft-smart-contract/how-to-view-your-nft-in-your-wallet)! +Presumibilmente, ti piacerebbe poter mostrare gli NFT coniati tramite la tua dApp nel tuo portafoglio — quindi assicurati di dare un'occhiata al nostro rapido tutorial [Come visualizzare il tuo NFT nel tuo portafoglio](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet)! -E, come sempre, se hai qualsiasi domanda, siamo qui per aiutare sul [Discord di Alchemy](https://discord.gg/gWuC7zB). Non vediamo l'ora di vedere come applicherai i concetti di questo tutorial ai tuoi progetti futuri! +E, come sempre, se hai domande, siamo qui per aiutarti nel [Discord di Alchemy](https://discord.gg/gWuC7zB). Non vediamo l'ora di vedere come applicherai i concetti di questo tutorial ai tuoi progetti futuri! \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md index e2d2f1cc106..f305196c91c 100644 --- a/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/it/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -1,22 +1,25 @@ --- -title: "Guida del ponte standard di Optimism per contratti" -description: Come funziona il ponte standard per Optimism? Perché funziona così? +title: "Panoramica del contratto del ponte standard di Optimism" +description: "Come funziona il ponte standard per Optimism? Perché funziona in questo modo?" author: Ori Pomerantz -tags: - - "solidity" - - "ponte" - - "livello 2" +tags: ["Solidity", "ponte", "livello 2"] skill: intermediate -breadcrumb: "Ponte Optimism" +breadcrumb: Ponte di Optimism published: 2022-03-30 lang: it --- -[Optimism](https://www.optimism.io/) è un [Rollup ottimistico](/developers/docs/scaling/optimistic-rollups/). I rollup ottimistici possono elaborare le transazioni a un prezzo molto più basso di quello della rete principale di Ethereum (nota anche come livello 1 o L1), poiché le transazioni sono elaborate solo da alcuni nodi, invece che da ogni nodo sulla rete. Allo stesso tempo, i dati vengono tutti scritti nel L1, così che tutto possa essere provato e ricostruito con le garanzie d'integrità e disponibilità della rete principale. +[Optimism](https://www.optimism.io/) è un [rollup ottimistico](/developers/docs/scaling/optimistic-rollups/). +I rollup ottimistici possono elaborare le transazioni a un prezzo molto inferiore rispetto alla rete principale di Ethereum (nota anche come livello 1 o L1) perché le transazioni vengono elaborate solo da pochi nodi, invece che da ogni nodo della rete. +Allo stesso tempo, i dati vengono tutti scritti su L1, in modo che tutto possa essere provato e ricostruito con tutte le garanzie di integrità e disponibilità della rete principale. -Per usare le risorse del L1 su Optimism (o su qualsiasi altro L2), le risorse devono essere collegate con un [ponte](/bridges/#prerequisites). Un modo per farlo è che gli utenti blocchino le risorse (ETH e [token ERC-20](/developers/docs/standards/tokens/erc-20/) sono le più comuni) nel L1 e ricevano le risorse equivalenti da usare nel L2. In definitiva, chiunque le riceva potrebbe volerle ricollegare al L1. Così facendo, le risorse sono bruciate nel L2 e poi rilasciate nuovamente all'utente nel L1. +Per utilizzare gli asset di L1 su Optimism (o su qualsiasi altro L2), gli asset devono essere trasferiti tramite un [ponte](/bridges/#prerequisites). +Un modo per ottenere questo risultato è che gli utenti blocchino gli asset (ETH e i [token ERC-20](/developers/docs/standards/tokens/erc-20/) sono i più comuni) su L1 e ricevano asset equivalenti da utilizzare su L2. +Alla fine, chiunque ne entri in possesso potrebbe volerli riportare su L1 tramite il ponte. +Quando si fa questo, gli asset vengono bruciati su L2 e poi rilasciati nuovamente all'utente su L1. -Questo è il modo in cui funziona il [ponte standard di Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge). In questo articolo esaminiamo il codice sorgente di quel ponte, per vedere come funziona e per studiarlo come un esempio di codice di Solidity ben scritto. +Questo è il modo in cui funziona il [ponte standard di Optimism](https://docs.optimism.io/app-developers/bridging/standard-bridge). +In questo articolo esaminiamo il codice sorgente di quel ponte per vedere come funziona e studiarlo come esempio di codice Solidity ben scritto. ## Flussi di controllo {#control-flows} @@ -29,78 +32,88 @@ Il ponte ha due flussi principali: #### Livello 1 {#deposit-flow-layer-1} -1. In caso di deposito di un ERC-20, il depositante concede al ponte un'indennità per spendere l'importo depositato -2. Il depositante chiama il ponte L1 (`depositERC20`, `depositERC20To`, `depositETH`, o `depositETHTo`) -3. Il ponte L1 prende possesso della risorsa collegata - - ETH: la risorsa è trasferita dal depositante all'interno della chiamata - - ERC-20: la risorsa è trasferita dal ponte a sé stessa, usando l'indennità fornita dal depositante -4. Il ponte L1 usa il meccanismo di messaggio interdominio per chiamare `finalizeDeposit` sul ponte L2 +1. Se si deposita un ERC-20, il depositante concede al ponte un'indennità (allowance) per spendere l'importo depositato +2. Il depositante chiama il ponte di L1 (`depositERC20`, `depositERC20To`, `depositETH` o `depositETHTo`) +3. Il ponte di L1 prende possesso dell'asset trasferito + - ETH: L'asset viene trasferito dal depositante come parte della chiamata + - ERC-20: L'asset viene trasferito dal ponte a se stesso utilizzando l'indennità fornita dal depositante +4. Il ponte di L1 utilizza il meccanismo di messaggistica tra domini per chiamare `finalizeDeposit` sul ponte di L2 #### Livello 2 {#deposit-flow-layer-2} -5. Il ponte L2 verifica che la chiamata a `finalizeDeposit` sia legittima: - - Proviene dal contratto di messaggistica interdominio - - Originariamente proveniva dal ponte su L1 -6. Il ponte L2 verifica se il contratto del token ERC-20 su L2 è quello corretto: - - Il contratto L2 segnala che la sua controparte del L1 è uguale a quella da cui i token provenivano su L1 - - Il contratto L2 segnala che supporta l'interfaccia corretta ([che usa ERC-165](https://eips.ethereum.org/EIPS/eip-165)). -7. Se il contratto L2 è quello corretto, chiamalo per coniare il numero di token appropriato all'indirizzo corretto. Altrimenti, avvia un processo di prelievo per consentire all'utente di rivendicare i token su L1. +5. Il ponte di L2 verifica che la chiamata a `finalizeDeposit` sia legittima: + - Proviene dal contratto di messaggistica tra domini + - Proviene originariamente dal ponte su L1 +6. Il ponte di L2 controlla se il contratto del token ERC-20 su L2 è quello corretto: + - Il contratto di L2 segnala che la sua controparte di L1 è la stessa da cui provengono i token su L1 + - Il contratto di L2 segnala che supporta l'interfaccia corretta ([utilizzando ERC-165](https://eips.ethereum.org/EIPS/eip-165)). +7. Se il contratto di L2 è quello corretto, lo chiama per coniare il numero appropriato di token all'indirizzo appropriato. In caso contrario, avvia un processo di prelievo per consentire all'utente di reclamare i token su L1. ### Flusso di prelievo {#withdrawal-flow} #### Livello 2 {#withdrawal-flow-layer-2} -1. Il prelevante chiama il ponte L2 (`withdraw` o `withdrawTo`) -2. Il ponte L2 brucia il giusto numero di token appartenente a `msg.sender` -3. Il ponte L2 usa il meccanismo di messaggio interdominio per chiamare `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` sul ponte L1 +1. Chi preleva chiama il ponte di L2 (`withdraw` o `withdrawTo`) +2. Il ponte di L2 brucia il numero appropriato di token appartenenti a `msg.sender` +3. Il ponte di L2 utilizza il meccanismo di messaggistica tra domini per chiamare `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` sul ponte di L1 #### Livello 1 {#withdrawal-flow-layer-1} -4. Il ponte L1 verifica che la chiamata a `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` sia legittima: - - Proviene dal meccanismo di messaggistica interdominio - - Originariamente proveniva dal ponte su L2 -5. Il ponte L1 trasferisce la risorsa appropriata (ETH o ERC-20) all'indirizzo appropriato +4. Il ponte di L1 verifica che la chiamata a `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` sia legittima: + - Proviene dal meccanismo di messaggistica tra domini + - Proviene originariamente dal ponte su L2 +5. Il ponte di L1 trasferisce l'asset appropriato (ETH o ERC-20) all'indirizzo appropriato -## Codice del Livello 1 {#layer-1-code} +## Codice di Livello 1 {#layer-1-code} -Questo è il codice eseguito su L1, la rete principale di Ethereum. +Questo è il codice che viene eseguito su L1, la rete principale di Ethereum. ### IL1ERC20Bridge {#IL1ERC20Bridge} -[Quest'interfaccia è definita qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). Include le funzioni e definizioni richieste per collegare i token ERC-20. +[Questa interfaccia è definita qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). +Include funzioni e definizioni necessarie per trasferire tramite ponte i token ERC-20. ```solidity // SPDX-License-Identifier: MIT ``` -[Gran parte del codice di Optimism è rilasciato sotto la licenza MIT](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). +[La maggior parte del codice di Optimism è rilasciata sotto licenza MIT](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). ```solidity pragma solidity >0.5.0 <0.9.0; ``` -Al momento della scrittura, l'ultima versione di Solidity è la 0.8.12. Fino al rilascio della versione 0.9.0, non sappiamo se questo codice è compatibile con esso o meno. +Al momento della stesura, l'ultima versione di Solidity è la 0.8.12. +Fino al rilascio della versione 0.9.0, non sappiamo se questo codice sarà compatibile o meno. ```solidity -/** - * @title IL1ERC20Bridge - */ +/* * + * @title IL1ERC20Bridge */ + + + interface IL1ERC20Bridge { - /********** - * Events * - **********/ + /* ********* + * Eventi * + ********* */ + + + event ERC20DepositInitiated( ``` -Nella terminologia del ponte di Optimism, _deposito_ indica un trasferimento da L1 a L2, e _prelievo_ indica un trasferimento da L2 a L1. +Nella terminologia del ponte di Optimism, _deposito_ significa trasferimento da L1 a L2, e _prelievo_ significa un trasferimento da L2 a L1. ```solidity address indexed _l1Token, address indexed _l2Token, ``` -Nella maggior parte dei casi, l'indirizzo di un ERC-20 su L1 non equivale all'indirizzo dell'ERC-20 equivalente su L2. [Puoi visualizzare l'elenco di indirizzi di token qui](https://static.optimism.io/optimism.tokenlist.json). L'indirizzo con `chainId` 1 è sul L1 (Mainnet) e l'indirizzo con `chainId` 10 è sul L2 (Optimism). Gli altri due valori di `chainId` sono per la rete di prova Kovan (42) e la rete di prova Kovan di Optimistic (69). +Nella maggior parte dei casi l'indirizzo di un ERC-20 su L1 non è lo stesso dell'indirizzo dell'ERC-20 equivalente su L2. +[Puoi vedere l'elenco degli indirizzi dei token qui](https://static.optimism.io/optimism.tokenlist.json). +L'indirizzo con `chainId` 1 è su L1 (rete principale) e l'indirizzo con `chainId` 10 è su L2 (Optimism). +Gli altri due valori di `chainId` sono per la rete di test Kovan (42) e la rete di test Optimistic Kovan (69). ```solidity address indexed _from, @@ -110,7 +123,7 @@ Nella maggior parte dei casi, l'indirizzo di un ERC-20 su L1 non equivale all'in ); ``` -È possibile aggiungere note ai trasferimenti, nel qual caso sono aggiunti agli eventi che li segnalano. +È possibile aggiungere note ai trasferimenti, nel qual caso vengono aggiunte agli eventi che li segnalano. ```solidity event ERC20WithdrawalFinalized( @@ -123,34 +136,51 @@ Nella maggior parte dei casi, l'indirizzo di un ERC-20 su L1 non equivale all'in ); ``` -Lo stesso contratto del ponte gestisce i trasferimenti in entrambe le direzioni. Nel caso del ponte L1, ciò indica l'inizializzazione dei depositi e la finalizzazione dei prelievi. +Lo stesso contratto del ponte gestisce i trasferimenti in entrambe le direzioni. +Nel caso del ponte di L1, questo significa l'inizializzazione dei depositi e la finalizzazione dei prelievi. ```solidity - /******************** - * Public Functions * - ********************/ + /* ******************* + * Funzioni Pubbliche * + ******************* */ + + + + + /* * + * @dev ottiene l'indirizzo del contratto ponte L2 corrispondente. + * @return Indirizzo del contratto ponte L2 corrispondente. */ + + + - /** - * @dev get the address of the corresponding L2 bridge contract. - * @return Address of the corresponding L2 bridge contract. - */ function l2TokenBridge() external returns (address); ``` -Questa funzione non è davvero necessaria, perché sul L2 è un contratto pre-distribuito, quindi è sempre all'indirizzo `0x4200000000000000000000000000000000000010`. Serve per simmetria con il ponte L2, perché _non_ è banale sapere l'indirizzo del ponte L1. +Questa funzione non è realmente necessaria, perché su L2 è un contratto pre-distribuito, quindi si trova sempre all'indirizzo `0x4200000000000000000000000000000000000010`. +È qui per simmetria con il ponte di L2, perché l'indirizzo del ponte di L1 _non_ è banale da conoscere. ```solidity - /** - * @dev deposit an amount of the ERC20 to the caller's balance on L2. - * @param _l1Token Address of the L1 ERC20 we are depositing - * @param _l2Token Address of the L1 respective L2 ERC20 - * @param _amount Amount of the ERC20 to deposit - * @param _l2Gas Gas limit required to complete the deposit on L2. - * @param _data Optional data to forward to L2. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + /* * + * @dev deposita un importo di ERC20 sul saldo del chiamante su L2. + * @param _l1Token Indirizzo dell'ERC20 L1 che stiamo depositando + * @param _l2Token Indirizzo del rispettivo ERC20 L2 di L1 + * @param _amount Importo di ERC20 da depositare + * @param _l2Gas Limite del gas richiesto per completare il deposito su L2. + * @param _data Dati opzionali da inoltrare a L2. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + function depositERC20( address _l1Token, address _l2Token, @@ -160,20 +190,32 @@ Questa funzione non è davvero necessaria, perché sul L2 è un contratto pre-di ) external; ``` -Il parametro `_l2Gas` è l'importo di gas del L2 che la transazione può spendere. [Fino a un certo limite (elevato), è gratuito](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), quindi, a meno che il contratto ERC-20 non faccia qualcosa di davvero strano durante il conio, non dovrebbe essere un problema. Questa funzione si occupa dello scenario comune, in cui un utente collega le risorse allo stesso indirizzo su una blockchain differente. +Il parametro `_l2Gas` è la quantità di gas di L2 che la transazione è autorizzata a spendere. +[Fino a un certo limite (elevato), questo è gratuito](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), quindi a meno che il contratto ERC-20 non faccia qualcosa di veramente strano durante il conio, non dovrebbe essere un problema. +Questa funzione si occupa dello scenario comune, in cui un utente trasferisce tramite ponte gli asset allo stesso indirizzo su una blockchain diversa. ```solidity - /** - * @dev deposit an amount of ERC20 to a recipient's balance on L2. - * @param _l1Token Address of the L1 ERC20 we are depositing - * @param _l2Token Address of the L1 respective L2 ERC20 - * @param _to L2 address to credit the withdrawal to. - * @param _amount Amount of the ERC20 to deposit. - * @param _l2Gas Gas limit required to complete the deposit on L2. - * @param _data Optional data to forward to L2. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + /* * + * @dev deposita un importo di ERC20 sul saldo di un destinatario su L2. + * @param _l1Token Indirizzo dell'ERC20 L1 che stiamo depositando + * @param _l2Token Indirizzo del rispettivo ERC20 L2 di L1 + * @param _to Indirizzo L2 a cui accreditare il prelievo. + * @param _amount Importo di ERC20 da depositare. + * @param _l2Gas Limite del gas richiesto per completare il deposito su L2. + * @param _data Dati opzionali da inoltrare a L2. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + + function depositERC20To( address _l1Token, address _l2Token, @@ -184,27 +226,43 @@ Il parametro `_l2Gas` è l'importo di gas del L2 che la transazione può spender ) external; ``` -Questa funzione è quasi identica a `depositERC20`, ma ti consente di inviare l'ERC-20 a un altro indirizzo. +Questa funzione è quasi identica a `depositERC20`, ma ti consente di inviare l'ERC-20 a un indirizzo diverso. ```solidity - /************************* - * Cross-chain Functions * - *************************/ + /* ************************ + * Funzioni Cross-chain * + ************************ */ + + - /** - * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the - * L1 ERC20 token. - * This call will fail if the initialized withdrawal from L2 has not been finalized. + + /* * + * @dev Completa un prelievo da L2 a L1 e accredita i fondi sul saldo del destinatario del + * token ERC20 L1. + * Questa chiamata fallirà se il prelievo inizializzato da L2 non è stato finalizzato. * - * @param _l1Token Address of L1 token to finalizeWithdrawal for. - * @param _l2Token Address of L2 token where withdrawal was initiated. - * @param _from L2 address initiating the transfer. - * @param _to L1 address to credit the withdrawal to. - * @param _amount Amount of the ERC20 to deposit. - * @param _data Data provided by the sender on L2. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + * @param _l1Token Indirizzo del token L1 per cui eseguire finalizeWithdrawal. + * @param _l2Token Indirizzo del token L2 in cui è stato avviato il prelievo. + * @param _from Indirizzo L2 che avvia il trasferimento. + * @param _to Indirizzo L1 a cui accreditare il prelievo. + * @param _amount Importo di ERC20 da depositare. + * @param _data Dati forniti dal mittente su L2. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + + + + + function finalizeERC20Withdrawal( address _l1Token, address _l2Token, @@ -216,16 +274,20 @@ Questa funzione è quasi identica a `depositERC20`, ma ti consente di inviare l' } ``` -I prelievi (e altri messaggi da L2 a L1) su Optimism sono processi in due fasi: +I prelievi (e altri messaggi da L2 a L1) in Optimism sono un processo in due fasi: 1. Una transazione di avvio su L2. -2. Una transazione di finalizzazione o rivendicazione su L1. Questa transazione deve verificarsi dopo il [periodo di contestazione dell'errore](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) perché la transazione di L2 termini. +2. Una transazione di finalizzazione o reclamo su L1. + Questa transazione deve avvenire dopo la fine del [periodo di contestazione dei guasti](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) per la transazione di L2. ### IL1StandardBridge {#il1standardbridge} -[Quest'interfaccia è definita qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). Questo file contiene le definizioni dell'evento e la funzione per ETH. Queste definizioni sono molto simili a quelle definite nel precedente `IL1ERC20Bridge` per ERC-20. +[Questa interfaccia è definita qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). +Questo file contiene le definizioni di eventi e funzioni per gli ETH. +Queste definizioni sono molto simili a quelle definite in `IL1ERC20Bridge` sopra per gli ERC-20. -L'interfaccia del ponte è divisa tra due file perché alcuni token ERC-20 richiedono un'elaborazione specifica e non possono esser gestiti dal ponte standard. Il ponte personalizzato che gestisce un token di questo tipo può quindi implementare `IL1ERC20Bridge` e non dover collegare anche ETH. +L'interfaccia del ponte è divisa in due file perché alcuni token ERC-20 richiedono un'elaborazione personalizzata e non possono essere gestiti dal ponte standard. +In questo modo il ponte personalizzato che gestisce tale token può implementare `IL1ERC20Bridge` e non dover trasferire anche gli ETH. ```solidity // SPDX-License-Identifier: MIT @@ -233,13 +295,18 @@ pragma solidity >0.5.0 <0.9.0; import "./IL1ERC20Bridge.sol"; -/** - * @title IL1StandardBridge - */ +/* * + * @title IL1StandardBridge */ + + + interface IL1StandardBridge is IL1ERC20Bridge { - /********** - * Events * - **********/ + /* ********* + * Eventi * + ********* */ + + + event ETHDepositInitiated( address indexed _from, address indexed _to, @@ -248,7 +315,8 @@ interface IL1StandardBridge is IL1ERC20Bridge { ); ``` -Questo evento è quasi identico alla versione di ERC-20 (`ERC20DepositInitiated`), salvo che mancano gli indirizzi del token di L1 e L2. Lo stesso vale per gli altri eventi e le altre funzioni. +Questo evento è quasi identico alla versione ERC-20 (`ERC20DepositInitiated`), tranne per l'assenza degli indirizzi dei token di L1 e L2. +Lo stesso vale per gli altri eventi e le funzioni. ```solidity event ETHWithdrawalFinalized( @@ -257,42 +325,65 @@ Questo evento è quasi identico alla versione di ERC-20 (`ERC20DepositInitiated` . ); - /******************** - * Public Functions * - ********************/ + /* ******************* + * Funzioni Pubbliche * + ******************* */ + - /** - * @dev Deposit an amount of the ETH to the caller's balance on L2. - . + + + /* * + * @dev Deposita un importo di ETH sul saldo del chiamante su L2. . . - */ + . */ + + + + + + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; - /** - * @dev Deposit an amount of ETH to a recipient's balance on L2. - . + /* * + * @dev Deposita un importo di ETH sul saldo di un destinatario su L2. . . - */ + . */ + + + + + + function depositETHTo( address _to, uint32 _l2Gas, bytes calldata _data ) external payable; - /************************* - * Cross-chain Functions * - *************************/ + /* ************************ + * Funzioni Cross-chain * + ************************ */ + - /** - * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the - * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called - * before the withdrawal is finalized. - . + + + /* * + * @dev Completa un prelievo da L2 a L1 e accredita i fondi sul saldo del destinatario del + * token ETH L1. Poiché solo xDomainMessenger può chiamare questa funzione, non verrà mai chiamata + * prima che il prelievo sia finalizzato. . . - */ + . */ + + + + + + + + function finalizeETHWithdrawal( address _from, address _to, @@ -304,62 +395,86 @@ Questo evento è quasi identico alla versione di ERC-20 (`ERC20DepositInitiated` ### CrossDomainEnabled {#crossdomainenabled} -[Questo contratto](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) è ereditato da entrambi i ponti ([L1](#the-l1-bridge-contract) e [L2](#the-l2-bridge-contract)) per inviare i messaggi all'altro livello. +[Questo contratto](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) viene ereditato da entrambi i ponti ([L1](#the-l1-bridge-contract) e [L2](#the-l2-bridge-contract)) per inviare messaggi all'altro livello. ```solidity // SPDX-License-Identifier: MIT pragma solidity >0.5.0 <0.9.0; +/* Importazioni di Interfacce */ /* Interface Imports */ import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; ``` -[Quest'interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) dice al contratto come inviare i messaggi all'altro livello, usando la messaggistica interdominio. Questa messaggistica interdominio è un sistema totalmente a sé, che merita il proprio articolo, che spero scriverò in futuro. +[Questa interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) indica al contratto come inviare messaggi all'altro livello, utilizzando il messaggero tra domini. +Questo messaggero tra domini è un sistema completamente diverso e merita un articolo a sé, che spero di scrivere in futuro. ```solidity -/** +/* * * @title CrossDomainEnabled - * @dev Helper contract for contracts performing cross-domain communications + * @dev Contratto di supporto per i contratti che eseguono comunicazioni cross-domain * - * Compiler used: defined by inheriting contract - */ + * Compilatore utilizzato: definito dal contratto che eredita */ + + + + + + contract CrossDomainEnabled { - /************* - * Variables * - *************/ + /* ************ + * Variabili * + ************ */ + + + - // Messenger contract used to send and receive messages from the other domain. + // Contratto Messenger utilizzato per inviare e ricevere messaggi dall'altro dominio. address public messenger; - /*************** - * Constructor * - ***************/ + /* ************** + * Costruttore * + ************** */ + + + + + /* * + * @param _messenger Indirizzo del CrossDomainMessenger sul livello corrente. */ + + - /** - * @param _messenger Address of the CrossDomainMessenger on the current layer. - */ constructor(address _messenger) { messenger = _messenger; } ``` -Il parametro che il contratto deve conoscere, l'indirizzo della messaggistica interdominio su questo livello. Questo parametro è impostato una volta, nel costruttore, e non cambia mai. +L'unico parametro che il contratto deve conoscere è l'indirizzo del messaggero tra domini su questo livello. +Questo parametro viene impostato una volta, nel costruttore, e non cambia mai. ```solidity - /********************** - * Function Modifiers * - **********************/ + /* ********************* + * Modificatori di Funzione * + ********************* */ + + + + + /* * + * Impone che la funzione modificata sia chiamabile solo da uno specifico account cross-domain. + * @param _sourceDomainAccount L'unico account sul dominio di origine che è + * autenticato per chiamare questa funzione. */ + + + + - /** - * Enforces that the modified function is only callable by a specific cross-domain account. - * @param _sourceDomainAccount The only account on the originating domain which is - * authenticated to call this function. - */ modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { ``` -La messaggistica interdominio è accessibile da qualsiasi contratto sulla blockchain mentre è in esecuzione (sulla mainnet di Ethereum o su Optimism). Ma per fidarsi _solo_ di certi messaggi, se provengono dal ponte dall'altra parte, serve il ponte su entrambi i lati. +La messaggistica tra domini è accessibile da qualsiasi contratto sulla blockchain in cui è in esecuzione (sia la rete principale di Ethereum che Optimism). +Ma abbiamo bisogno che il ponte su ciascun lato si fidi _solo_ di determinati messaggi se provengono dal ponte sull'altro lato. ```solidity require( @@ -368,7 +483,7 @@ La messaggistica interdominio è accessibile da qualsiasi contratto sulla blockc ); ``` -Solo i messaggi dalla messaggistica interdominio appropriata (`messenger`, come vedi di seguito) sono affidabili. +Ci si può fidare solo dei messaggi provenienti dal messaggero tra domini appropriato (`messenger`, come vedi di seguito). ```solidity @@ -378,7 +493,8 @@ Solo i messaggi dalla messaggistica interdominio appropriata (`messenger`, come ); ``` -Il modo in cui la messaggistica interdominio fornisce l'indirizzo che ha inviato un messaggio con l'altro livello è [la funzione `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). Se è chiamato nella transazione avviata dal messaggio, può fornire queste informazioni. +Il modo in cui il messaggero tra domini fornisce l'indirizzo che ha inviato un messaggio con l'altro livello è [la funzione `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). +Finché viene chiamata nella transazione avviata dal messaggio, può fornire queste informazioni. Dobbiamo assicurarci che il messaggio ricevuto provenga dall'altro ponte. @@ -387,31 +503,45 @@ Dobbiamo assicurarci che il messaggio ricevuto provenga dall'altro ponte. _; } - /********************** - * Internal Functions * - **********************/ + /* ********************* + * Funzioni Interne * + ********************* */ + + + + + /* * + * Ottiene il messenger, di solito dallo storage. Questa funzione è esposta nel caso in cui un contratto figlio + * debba sovrascriverla. + * @return L'indirizzo del contratto messenger cross-domain che dovrebbe essere utilizzato. */ + + + + - /** - * Gets the messenger, usually from storage. This function is exposed in case a child contract - * needs to override. - * @return The address of the cross-domain messenger contract which should be used. - */ function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { return ICrossDomainMessenger(messenger); } ``` -Questa funzione restituisce la messaggistica interdominio. Usiamo una funzione piuttosto che la variabile `messenger` per consentire ai contratti che ereditano da questa di usare un algoritmo per specificare quale messaggistica interdominio utilizzare. +Questa funzione restituisce il messaggero tra domini. +Utilizziamo una funzione anziché la variabile `messenger` per consentire ai contratti che ereditano da questo di utilizzare un algoritmo per specificare quale messaggero tra domini utilizzare. ```solidity - /** - * Sends a message to an account on another domain - * @param _crossDomainTarget The intended recipient on the destination domain - * @param _message The data to send to the target (usually calldata to a function with + /* * + * Invia un messaggio a un account su un altro dominio + * @param _crossDomainTarget Il destinatario previsto sul dominio di destinazione + * @param _message I dati da inviare al target (di solito calldata per una funzione con * `onlyFromCrossDomainAccount()`) - * @param _gasLimit The gasLimit for the receipt of the message on the target domain. - */ + * @param _gasLimit Il limite del gas per la ricezione del messaggio sul dominio di destinazione. */ + + + + + + + function sendCrossDomainMessage( address _crossDomainTarget, uint32 _gasLimit, @@ -425,7 +555,8 @@ Infine, la funzione che invia un messaggio all'altro livello. // slither-disable-next-line reentrancy-events, reentrancy-benign ``` -[Slither](https://github.com/crytic/slither) è un analizzatore statico che Optimism esegue su ogni contratto per cercare le vulnerabilità e altri problemi potenziali. In questo caso, la seguente riga innesca due vulnerabilità: +[Slither](https://github.com/crytic/slither) è un analizzatore statico che Optimism esegue su ogni contratto per cercare vulnerabilità e altri potenziali problemi. +In questo caso, la riga seguente innesca due vulnerabilità: 1. [Eventi di rientranza](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) 2. [Rientranza benigna](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) @@ -436,20 +567,22 @@ Infine, la funzione che invia un messaggio all'altro livello. } ``` -In questo caso, non ci preoccupiamo della rientranza, sappiamo che `getCrossDomainMessenger()` restituisce un indirizzo affidabile, anche se Slither non ha modo di saperlo. +In questo caso non ci preoccupiamo della rientranza, sappiamo che `getCrossDomainMessenger()` restituisce un indirizzo affidabile, anche se Slither non ha modo di saperlo. ### Il contratto del ponte di L1 {#the-l1-bridge-contract} -[Il codice sorgente di questo contratto è qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol). +[Il codice sorgente per questo contratto è qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol). ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; ``` -Le interfacce possono far parte di altri contratti, quindi devono supportare una vasta gamma di versioni di Solidity. Ma il ponte in sé è il nostro contratto, e possiamo essere rigidi sulla versione di Solidity utilizzata. +Le interfacce possono far parte di altri contratti, quindi devono supportare un'ampia gamma di versioni di Solidity. +Ma il ponte stesso è il nostro contratto e possiamo essere rigorosi su quale versione di Solidity utilizza. ```solidity +/* Importazioni di Interfacce */ /* Interface Imports */ import { IL1StandardBridge } from "./IL1StandardBridge.sol"; import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; @@ -461,65 +594,76 @@ import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; ``` -[Quest'interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ci consente di creare messaggi per controllare il ponte standard su L2. +[Questa interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ci consente di creare messaggi per controllare il ponte standard su L2. ```solidity import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; ``` -[Quest'interfaccia](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) ci consente di controllare i contratti ERC-20. [Puoi approfondire questo argomento qui](/developers/tutorials/erc20-annotated-code/#the-interface). +[Questa interfaccia](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) ci consente di controllare i contratti ERC-20. +[Puoi leggere di più a riguardo qui](/developers/tutorials/erc20-annotated-code/#the-interface). ```solidity +/* Importazioni di Librerie */ /* Library Imports */ import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; ``` -[Come spiegato sopra](#crossdomainenabled), questo contratto è usato per la messaggistica tra livelli. +[Come spiegato sopra](#crossdomainenabled), questo contratto viene utilizzato per la messaggistica tra livelli. ```solidity import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; ``` -[`Lib_PredeployAddresses`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol) contiene gli indirizzi per i contratti L2 che hanno sempre lo stesso indirizzo. Comprende il ponte standard su L2. +[`Lib_PredeployAddresses`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol) contiene gli indirizzi per i contratti di L2 che hanno sempre lo stesso indirizzo. Questo include il ponte standard su L2. ```solidity import { Address } from "@openzeppelin/contracts/utils/Address.sol"; ``` -[Utility per indirizzi di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Serve a distinguere tra gli indirizzi del contratto e quelli appartenenti a conti posseduti esternamente (EOA). +[Le utilità Address di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Vengono utilizzate per distinguere tra gli indirizzi dei contratti e quelli appartenenti agli account controllati esternamente (EOA). -Non è una soluzione perfetta, perché non esiste modo di distinguere tra chiamate dirette e chiamate effettuate dal costruttore di un contratto ma, quantomeno, ci consente di identificare ed evitare alcuni errori comuni dell'utente. +Nota che questa non è una soluzione perfetta, perché non c'è modo di distinguere tra chiamate dirette e chiamate effettuate dal costruttore di un contratto, ma almeno questo ci consente di identificare e prevenire alcuni errori comuni degli utenti. ```solidity import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; ``` -[Lo standard ERC-20](https://eips.ethereum.org/EIPS/eip-20) supporta due metodi di segnalazione del fallimento di un contratto: +[Lo standard ERC-20](https://eips.ethereum.org/EIPS/eip-20) supporta due modi per un contratto di segnalare un fallimento: -1. Ripristino -2. Restituzione di `false` +1. Revert (Annullamento) +2. Restituire `false` -Gestire entrambi i casi renderebbe il nostro codice più complicato, quindi, invece, usiamo [`SafeERC20` di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), che si assicura che [tutti i fallimenti portino a un ripristino](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). +Gestire entrambi i casi renderebbe il nostro codice più complicato, quindi utilizziamo invece [`SafeERC20` di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), che si assicura che [tutti i fallimenti si traducano in un annullamento](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). ```solidity -/** +/* * * @title L1StandardBridge - * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard - * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits - * and listening to it for newly finalized withdrawals. - * - */ + * @dev Il ponte L1 ETH e ERC20 è un contratto che memorizza i fondi L1 depositati e i token + * standard che sono in uso su L2. Sincronizza un ponte L2 corrispondente, informandolo dei depositi + * e ascoltandolo per i prelievi appena finalizzati. + * */ + + + + + + + contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { using SafeERC20 for IERC20; ``` -Questa riga specifica come usare il wrapper di `SafeERC20`, ogni volta che usiamo l'interfaccia di `IERC20`. +Questa riga è il modo in cui specifichiamo di utilizzare il wrapper `SafeERC20` ogni volta che utilizziamo l'interfaccia `IERC20`. ```solidity - /******************************** - * External Contract References * - ********************************/ + /* ******************************* + * Riferimenti a Contratti Esterni * + ******************************* */ + + + address public l2TokenBridge; ``` @@ -528,51 +672,75 @@ L'indirizzo di [L2StandardBridge](#the-l2-bridge-contract). ```solidity - // Maps L1 token to L2 token to balance of the L1 token deposited + // Mappa il token L1 al token L2 al saldo del token L1 depositato mapping(address => mapping(address => uint256)) public deposits; ``` -Una doppia [mappatura](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) come questa definisce un [array sparso bidimensionale](https://en.wikipedia.org/wiki/Sparse_matrix). I valori in questa struttura di dati sono identificati come `deposit[L1 token addr][L2 token addr]`. Il valore predefinito è zero. Solo le celle impostate a un valore differente sono scritte in memoria. +Una doppia [mappatura](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) come questa è il modo in cui si definisce un [array sparso bidimensionale](https://en.wikipedia.org/wiki/Sparse_matrix). +I valori in questa struttura dati sono identificati come `deposit[L1 token addr][L2 token addr]`. +Il valore predefinito è zero. +Solo le celle impostate su un valore diverso vengono scritte nell'archiviazione. ```solidity - /*************** - * Constructor * - ***************/ + /* ************** + * Costruttore * + ************** */ + + + - // This contract lives behind a proxy, so the constructor parameters will go unused. + // Questo contratto vive dietro un proxy, quindi i parametri del costruttore rimarranno inutilizzati. constructor() CrossDomainEnabled(address(0)) {} ``` -Per poter aggiornare questo contratto senza dover copiare tutte le variabili in memoria. Per farlo, usiamo un [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), un contratto che usa [`delegatecall`](https://solidity-by-example.org/delegatecall/) per trasferire le chiamate a un contratto distinto, il cui indirizzo è memorizzato dal contratto del proxy (quando aggiorni, dici al proxy di modificare tale indirizzo). Quando usi `delegatecall`, la memoria rimane quella del contratto _chiamante_, quindi non sono influenzati i valori di tutte le variabili di stato del contratto. +Vogliamo poter aggiornare questo contratto senza dover copiare tutte le variabili nell'archiviazione. +Per farlo utilizziamo un [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), un contratto che utilizza [`delegatecall`](https://solidity-by-example.org/delegatecall/) per trasferire le chiamate a un contratto separato il cui indirizzo è memorizzato dal contratto proxy (quando si esegue l'aggiornamento si dice al proxy di cambiare quell'indirizzo). +Quando si utilizza `delegatecall` l'archiviazione rimane quella del contratto _chiamante_, quindi i valori di tutte le variabili di stato del contratto non vengono influenzati. -Un effetto di questo schema è che l'archiviazione del contratto, ovvero la _chiamata_ di `delegatecall`, non è usata e dunque i valori del costruttore a esso passati non importano. Questo è il motivo per cui possiamo fornire un valore senza senso al costruttore di `CrossDomainEnabled`. È anche il motivo per cui l'inizializzazione di seguito è separata dal costruttore. +Un effetto di questo modello è che l'archiviazione del contratto che è il _chiamato_ di `delegatecall` non viene utilizzata e pertanto i valori del costruttore passati ad esso non hanno importanza. +Questo è il motivo per cui possiamo fornire un valore senza senso al costruttore `CrossDomainEnabled`. +È anche il motivo per cui l'inizializzazione di seguito è separata dal costruttore. ```solidity - /****************** - * Initialization * - ******************/ + /* ***************** + * Inizializzazione * + ***************** */ + + + + + /* * + * @param _l1messenger Indirizzo del Messenger L1 utilizzato per le comunicazioni cross-chain. + * @param _l2TokenBridge Indirizzo del ponte standard L2. */ + + + - /** - * @param _l1messenger L1 Messenger address being used for cross-chain communications. - * @param _l2TokenBridge L2 standard bridge address. - */ // slither-disable-next-line external-function ``` -Questo [test di Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external), identifica le funzioni non chiamate dal codice del contratto e che potrebbero dunque esser dichiarate `external` invece che `public`. Il costo del gas delle funzioni `external` può essere inferiore, perché possono contenere dei parametri nei dati della chiamata. Le funzioni dichiarate come `public` devono esser accessibili dall'interno del contratto. I contratti non possono modificare i propri dati di chiamata, quindi, i parametri devono essere in memoria. Quando una funzione simile è chiamata esternamente, è necessario copiare i dati della chiamata alla memoria, il che costa gas. In questo caso la funzione è chiamata solo una volta, quindi, non siamo interessati alla sua inefficienza. +Questo [test di Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifica le funzioni che non vengono chiamate dal codice del contratto e potrebbero quindi essere dichiarate `external` invece di `public`. +Il costo del gas delle funzioni `external` può essere inferiore, perché possono essere fornite con parametri nei calldata. +Le funzioni dichiarate `public` devono essere accessibili dall'interno del contratto. +I contratti non possono modificare i propri calldata, quindi i parametri devono essere in memoria. +Quando una tale funzione viene chiamata esternamente, è necessario copiare i calldata in memoria, il che costa gas. +In questo caso la funzione viene chiamata solo una volta, quindi l'inefficienza non ci importa. ```solidity function initialize(address _l1messenger, address _l2TokenBridge) public { require(messenger == address(0), "Contract has already been initialized."); ``` -La funzione `initialize` dovrebbe esser chiamata solo una volta. Se cambia l'indirizzo della messaggistica interdominio di L1 o del ponte del token L2, creiamo un nuovo proxy e un nuovo ponte che lo chiama. È improbabile che si verifichi, tranne quando viene aggiornato l'intero sistema, un evento molto raro. +La funzione `initialize` dovrebbe essere chiamata solo una volta. +Se l'indirizzo del messaggero tra domini di L1 o del ponte dei token di L2 cambia, creiamo un nuovo proxy e un nuovo ponte che lo chiama. +È improbabile che ciò accada, tranne quando l'intero sistema viene aggiornato, un evento molto raro. -Nota che questa funzione non ha alcun meccanismo che limiti _chi_ possa chiamarla. Questo significa che, in teoria, un malintenzionato potrebbe attendere la distribuzione del proxy e della prima versione del ponte e, poi, eseguire un [front running](https://solidity-by-example.org/hacks/front-running/) per ottenere la funzione `initialize`, prima dell'utente legittimo. Ma esistono due metodi per impedirlo: +Nota che questa funzione non ha alcun meccanismo che limiti _chi_ può chiamarla. +Ciò significa che in teoria un utente malintenzionato potrebbe aspettare fino a quando non distribuiamo il proxy e la prima versione del ponte e poi eseguire un [front-running](https://solidity-by-example.org/hacks/front-running/) per arrivare alla funzione `initialize` prima dell'utente legittimo. Ma ci sono due metodi per impedirlo: -1. Se i contratti sono distribuiti indirettamente da un conto EOA, ma [in una transazione avente un altro contratto che li crea](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), l'intero processo può esser atomico e terminare prima che ogni altra transazione sia eseguita. -2. Se la chiamata legittima a `initialize` fallisce, è sempre possibile ignorare il proxy e il ponte appena creato e crearne di nuovi. +1. Se i contratti non vengono distribuiti direttamente da un EOA ma [in una transazione in cui un altro contratto li crea](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595), l'intero processo può essere atomico e terminare prima che venga eseguita qualsiasi altra transazione. +2. Se la chiamata legittima a `initialize` fallisce, è sempre possibile ignorare il proxy e il ponte appena creati e crearne di nuovi. ```solidity messenger = _l1messenger; @@ -584,47 +752,62 @@ Questi sono i due parametri che il ponte deve conoscere. ```solidity - /************** - * Depositing * - **************/ + /* ************* + * Deposito * + ************* */ + + + + + /* * @dev Modificatore che richiede che il mittente sia un EOA. Questo controllo potrebbe essere aggirato da un contratto + * malevolo tramite initcode, ma si occupa dell'errore dell'utente che vogliamo evitare. */ + + - /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious - * contract via initcode, but it takes care of the user error we want to avoid. - */ modifier onlyEOA() { - // Used to stop deposits from contracts (avoid accidentally lost tokens) + // Utilizzato per fermare i depositi dai contratti (evitare token persi accidentalmente) require(!Address.isContract(msg.sender), "Account not EOA"); _; } ``` -Per questo abbiamo bisogno delle utility `Address` di OpenZeppelin. +Questo è il motivo per cui avevamo bisogno delle utilità `Address` di OpenZeppelin. ```solidity - /** - * @dev This function can be called with no data - * to deposit an amount of ETH to the caller's balance on L2. - * Since the receive function doesn't take data, a conservative - * default amount is forwarded to L2. - */ + /* * + * @dev Questa funzione può essere chiamata senza dati + * per depositare un importo di ETH sul saldo del chiamante su L2. + * Poiché la funzione receive non accetta dati, un importo + * predefinito conservativo viene inoltrato a L2. */ + + + + + + receive() external payable onlyEOA { _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); } ``` -Questa funzione serve per scopi di test. Non compare nelle definizioni dell'interfaccia: non è pensata per un uso ordinario. +Questa funzione esiste a scopo di test. +Nota che non appare nelle definizioni dell'interfaccia: non è per un uso normale. ```solidity - /** - * @inheritdoc IL1StandardBridge - */ + /* * + * @inheritdoc IL1StandardBridge */ + + + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA { _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data); } - /** - * @inheritdoc IL1StandardBridge - */ + /* * + * @inheritdoc IL1StandardBridge */ + + + function depositETHTo( address _to, uint32 _l2Gas, @@ -634,30 +817,41 @@ Questa funzione serve per scopi di test. Non compare nelle definizioni dell'inte } ``` -Queste due funzioni sono wrapper intorno a `_initiateETHDeposit`, la funzione che gestisce l'effettivo deposito di ETH. +Queste due funzioni sono wrapper attorno a `_initiateETHDeposit`, la funzione che gestisce l'effettivo deposito di ETH. ```solidity - /** - * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of - * the deposit. - * @param _from Account to pull the deposit from on L1. - * @param _to Account to give the deposit to on L2. - * @param _l2Gas Gas limit required to complete the deposit on L2. - * @param _data Optional data to forward to L2. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + /* * + * @dev Esegue la logica per i depositi memorizzando gli ETH e informando il Gateway ETH L2 del + * deposito. + * @param _from Account da cui prelevare il deposito su L1. + * @param _to Account a cui dare il deposito su L2. + * @param _l2Gas Limite del gas richiesto per completare il deposito su L2. + * @param _data Dati opzionali da inoltrare a L2. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + function _initiateETHDeposit( address _from, address _to, uint32 _l2Gas, bytes memory _data ) internal { - // Construct calldata for finalizeDeposit call + // Costruisce i calldata per la chiamata finalizeDeposit bytes memory message = abi.encodeWithSelector( ``` -I messaggi interdominio funzionano chiamando il contratto di destinazione passando il messaggio come dati di chiamata. I contratti in Solidity interpretano sempre i propri dati di chiamata secondo [le specifiche ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). La funzione di Solidity [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) crea questi dati di chiamata. +Il modo in cui funzionano i messaggi tra domini è che il contratto di destinazione viene chiamato con il messaggio come suoi calldata. +I contratti Solidity interpretano sempre i propri calldata in conformità con [le specifiche ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). +La funzione Solidity [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) crea quei calldata. ```solidity IL2ERC20Bridge.finalizeDeposit.selector, @@ -670,24 +864,24 @@ I messaggi interdominio funzionano chiamando il contratto di destinazione passan ); ``` -In questo caso il messaggio chiama [la funzione `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) con questi parametri: +Il messaggio qui è di chiamare [la funzione `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) con questi parametri: -| Parametro | Valore | Significato | -| ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| \_l1Token | address(0) | Valore speciale che sta per ETH (che non è un token ERC-20) su L1 | -| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Il contratto L2 che gestisce ETH su Optimism, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (questo contratto è solo per uso interno a Optimism) | -| \_from | \_from | L'indirizzo su L1 che invia gli ETH | -| \_to | \_to | L'indirizzo su L2 che riceve gli ETH | -| amount | msg.value | Importo di wei inviato (già inviato al ponte) | -| \_data | \_data | Data aggiuntiva da allegare al deposito | +| Parametro | Valore | Significato | +| --------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| \_l1Token | address(0) | Valore speciale per rappresentare gli ETH (che non sono un token ERC-20) su L1 | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Il contratto di L2 che gestisce gli ETH su Optimism, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (questo contratto è solo per uso interno di Optimism) | +| \_from | \_from | L'indirizzo su L1 che invia gli ETH | +| \_to | \_to | L'indirizzo su L2 che riceve gli ETH | +| amount | msg.value | Quantità di wei inviati (che sono già stati inviati al ponte) | +| \_data | \_data | Dati aggiuntivi da allegare al deposito | ```solidity - // Send calldata into L2 + // Invia i calldata in L2 // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); ``` -Invia il messaggio tramite la messaggistica interdominio. +Invia il messaggio tramite il messaggero tra domini. ```solidity // slither-disable-next-line reentrancy-events @@ -695,49 +889,66 @@ Invia il messaggio tramite la messaggistica interdominio. } ``` -Emette un evento per informare qualsiasi applicazione decentralizzata che ascolta questo trasferimento. +Emette un evento per informare qualsiasi applicazione decentralizzata in ascolto di questo trasferimento. ```solidity - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function depositERC20( - . - . - . + . + . + . ) external virtual onlyEOA { _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data); } - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function depositERC20To( - . - . - . + . + . + . ) external virtual { _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data); } ``` -Queste due funzioni sono wrapper intorno a `_initiateERC20Deposit`, la funzione che gestisce l'effettivo deposito ERC-20. +Queste due funzioni sono wrapper attorno a `_initiateERC20Deposit`, la funzione che gestisce l'effettivo deposito di ERC-20. ```solidity - /** - * @dev Performs the logic for deposits by informing the L2 Deposited Token - * contract of the deposit and calling a handler to lock the L1 funds. (e.g., transferFrom) + /* * + * @dev Esegue la logica per i depositi informando il contratto L2 Deposited Token + * del deposito e chiamando un gestore per bloccare i fondi L1. (es., transferFrom) * - * @param _l1Token Address of the L1 ERC20 we are depositing - * @param _l2Token Address of the L1 respective L2 ERC20 - * @param _from Account to pull the deposit from on L1 - * @param _to Account to give the deposit to on L2 - * @param _amount Amount of the ERC20 to deposit. - * @param _l2Gas Gas limit required to complete the deposit on L2. - * @param _data Optional data to forward to L2. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + * @param _l1Token Indirizzo dell'ERC20 L1 che stiamo depositando + * @param _l2Token Indirizzo del rispettivo ERC20 L2 di L1 + * @param _from Account da cui prelevare il deposito su L1 + * @param _to Account a cui dare il deposito su L2 + * @param _amount Importo di ERC20 da depositare. + * @param _l2Gas Limite del gas richiesto per completare il deposito su L2. + * @param _data Dati opzionali da inoltrare a L2. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + + + + + function _initiateERC20Deposit( address _l1Token, address _l2Token, @@ -749,26 +960,29 @@ Queste due funzioni sono wrapper intorno a `_initiateERC20Deposit`, la funzione ) internal { ``` -Questa funzione è simile a `_initiateETHDeposit` di cui sopra, con alcune importanti differenze. La prima differenza è che questa funzione riceve come parametri gli indirizzi del token e l'importo da trasferire. Nel caso degli ETH, la chiamata al ponte include il trasferimento della risorsa al conto del ponte (`msg.value`). +Questa funzione è simile a `_initiateETHDeposit` sopra, con alcune importanti differenze. +La prima differenza è che questa funzione riceve gli indirizzi dei token e l'importo da trasferire come parametri. +Nel caso degli ETH, la chiamata al ponte include già il trasferimento dell'asset all'account del ponte (`msg.value`). ```solidity - // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future - // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if - // _from is an EOA or address(0). + // Quando un deposito viene avviato su L1, il ponte L1 trasferisce i fondi a se stesso per futuri + // prelievi. safeTransferFrom controlla anche se il contratto ha del codice, quindi questo fallirà se + // _from è un EOA o address(0). // slither-disable-next-line reentrancy-events, reentrancy-benign IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); ``` -I trasferimenti di token ERC-20 seguono un processo differente rispetto agli ETH: +I trasferimenti di token ERC-20 seguono un processo diverso rispetto agli ETH: -1. L'utente (`_from`) dà un indennità al ponte per trasferire i token appropriati. -2. L'utente chiama il ponte con l'indirizzo del contratto del token, l'importo, etc. -3. Il ponte trasferisce i token (a sé stesso) nell'ambito del processo di deposito. +1. L'utente (`_from`) concede un'indennità al ponte per trasferire i token appropriati. +2. L'utente chiama il ponte con l'indirizzo del contratto del token, l'importo, ecc. +3. Il ponte trasferisce i token (a se stesso) come parte del processo di deposito. -Il primo passaggio potrebbe verificarsi in una transazione separata dalle ultime due. Tuttavia, il front running non è un problema perché le due funzioni che chiamano `_initiateERC20Deposit` (`depositERC20` e `depositERC20To`), chiamano questa funzione con `msg.sender` come solo parametro `_from`. +Il primo passaggio può avvenire in una transazione separata rispetto agli ultimi due. +Tuttavia, il front-running non è un problema perché le due funzioni che chiamano `_initiateERC20Deposit` (`depositERC20` e `depositERC20To`) chiamano questa funzione solo con `msg.sender` come parametro `_from`. ```solidity - // Construct calldata for _l2Token.finalizeDeposit(_to, _amount) + // Costruisce i calldata per _l2Token.finalizeDeposit(_to, _amount) bytes memory message = abi.encodeWithSelector( IL2ERC20Bridge.finalizeDeposit.selector, _l1Token, @@ -779,7 +993,7 @@ Il primo passaggio potrebbe verificarsi in una transazione separata dalle ultime _data ); - // Send calldata into L2 + // Invia i calldata in L2 // slither-disable-next-line reentrancy-events, reentrancy-benign sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); @@ -787,7 +1001,8 @@ Il primo passaggio potrebbe verificarsi in una transazione separata dalle ultime deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount; ``` -Aggiungi l'importo di token depositato alla struttura dei dati `deposits`. Potrebbero esistere diversi indirizzi su L2 corrispondenti allo stesso token L1 ERC-20, quindi non basta usare il saldo del ponte del token L1 ERC-20, per monitorare i depositi. +Aggiunge l'importo depositato di token alla struttura dati `deposits`. +Potrebbero esserci più indirizzi su L2 che corrispondono allo stesso token ERC-20 di L1, quindi non è sufficiente utilizzare il saldo del ponte del token ERC-20 di L1 per tenere traccia dei depositi. ```solidity @@ -795,13 +1010,18 @@ Aggiungi l'importo di token depositato alla struttura dei dati `deposits`. Potre emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); } - /************************* - * Cross-chain Functions * - *************************/ + /* ************************ + * Funzioni Cross-chain * + ************************ */ + + + + + /* * + * @inheritdoc IL1StandardBridge */ + + - /** - * @inheritdoc IL1StandardBridge - */ function finalizeETHWithdrawal( address _from, address _to, @@ -809,20 +1029,21 @@ Aggiungi l'importo di token depositato alla struttura dei dati `deposits`. Potre bytes calldata _data ``` -Il ponte L2 invia un messaggio alla messaggistica interdominio del L2, che fa sì che la messaggistica interdominio del L1 chiami questa funzione (una volta che la [transazione che finalizza il messaggio](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) è inviata al L1, ovviamente). +Il ponte di L2 invia un messaggio al messaggero tra domini di L2 che fa sì che il messaggero tra domini di L1 chiami questa funzione (una volta che la [transazione che finalizza il messaggio](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) viene inviata su L1, ovviamente). ```solidity ) external onlyFromCrossDomainAccount(l2TokenBridge) { ``` -Assicurati che questo sia un messaggio _legittimo_, proveniente dalla messaggistica interdominio e proveniente dal ponte del token del L2. Questa funzione è usata per prelevare ETH dal ponte, quindi dobbiamo assicurarci che sia chiamata solo dal chiamante autorizzato. +Si assicura che questo sia un messaggio _legittimo_, proveniente dal messaggero tra domini e originato dal ponte dei token di L2. +Questa funzione viene utilizzata per prelevare ETH dal ponte, quindi dobbiamo assicurarci che venga chiamata solo dal chiamante autorizzato. ```solidity // slither-disable-next-line reentrancy-events (bool success, ) = _to.call{ value: _amount }(new bytes(0)); ``` -Il metodo per trasferire ETH è chiamare il destinatario indicando l'importo di wei nel `msg.value`. +Il modo per trasferire ETH è chiamare il destinatario con la quantità di wei in `msg.value`. ```solidity require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); @@ -831,14 +1052,16 @@ Il metodo per trasferire ETH è chiamare il destinatario indicando l'importo di emit ETHWithdrawalFinalized(_from, _to, _amount, _data); ``` -Genera un evento riguardante il prelievo. +Emette un evento relativo al prelievo. ```solidity } - /** - * @inheritdoc IL1ERC20Bridge - */ + /* * + * @inheritdoc IL1ERC20Bridge */ + + + function finalizeERC20Withdrawal( address _l1Token, address _l2Token, @@ -849,17 +1072,17 @@ Genera un evento riguardante il prelievo. ) external onlyFromCrossDomainAccount(l2TokenBridge) { ``` -Questa funzione è simile al precedente `finalizeETHWithdrawal`, con le modifiche necessarie per i token ERC-20. +Questa funzione è simile a `finalizeETHWithdrawal` sopra, con le modifiche necessarie per i token ERC-20. ```solidity deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; ``` -Aggiorna la struttura dei dati di `deposits`. +Aggiorna la struttura dati `deposits`. ```solidity - // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer + // Quando un prelievo viene finalizzato su L1, il ponte L1 trasferisce i fondi a chi effettua il prelievo // slither-disable-next-line reentrancy-events IERC20(_l1Token).safeTransfer(_to, _amount); @@ -868,29 +1091,44 @@ Aggiorna la struttura dei dati di `deposits`. } - /***************************** - * Temporary - Migrating ETH * - *****************************/ + /* **************************** + * Temporaneo - Migrazione ETH * + **************************** */ + + + + + /* * + * @dev Aggiunge saldo ETH all'account. Questo ha lo scopo di consentire la migrazione + * degli ETH da un vecchio gateway a un nuovo gateway. + * NOTA: Questo viene lasciato solo per un aggiornamento in modo da poter ricevere gli ETH migrati dal + * vecchio contratto */ + + + + + - /** - * @dev Adds ETH balance to the account. This is meant to allow for ETH - * to be migrated from an old gateway to a new gateway. - * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the - * old contract - */ function donateETH() external payable {} } ``` -Vi è stata un'implementazione precedente del ponte. Quando ci siamo spostati a questa nuova implementazione, abbiamo dovuto spostare tutte le risorse. I token ERC-20 possono essere semplicemente spostati. Al contrario, per trasferire ETH a un contratto, serve l'approvazione di quel contratto, e proprio questo a cui serve `donateETH`. +C'era un'implementazione precedente del ponte. +Quando siamo passati da quell'implementazione a questa, abbiamo dovuto spostare tutti gli asset. +I token ERC-20 possono semplicemente essere spostati. +Tuttavia, per trasferire ETH a un contratto è necessaria l'approvazione di quel contratto, che è ciò che ci fornisce `donateETH`. -## Token ERC-20 sul L2 {#erc-20-tokens-on-l2} +## Token ERC-20 su L2 {#erc-20-tokens-on-l2} -Perché un token ERC-20 si adatti al ponte standard, deve consentire al ponte standard, e _solo_ al ponte standard, di coniare il token. Questo è necessario perché i ponti devono assicurare che il numero di token in circolazione su Optimism sia pari al numero di token bloccati nel contratto del ponte del L1. Se esistono troppi token su L2, alcuni utenti non potrebbero ricollegare le proprie risorse al L1. Invece di un ponte fidato, ricreeremmo essenzialmente la [riserva frazionaria bancaria](https://www.investopedia.com/terms/f/fractionalreservebanking.asp). Se esistono troppi token su L1, alcuni di questi rimarrebbero bloccati nel contratto del ponte per sempre, perché non esiste modo di rilasciarli senza bruciare token del L2. +Affinché un token ERC-20 si adatti al ponte standard, deve consentire al ponte standard, e _solo_ al ponte standard, di coniare token. +Questo è necessario perché i ponti devono garantire che il numero di token in circolazione su Optimism sia uguale al numero di token bloccati all'interno del contratto del ponte di L1. +Se ci sono troppi token su L2, alcuni utenti non sarebbero in grado di riportare i propri asset su L1 tramite il ponte. +Invece di un ponte affidabile, ricreeremmo essenzialmente il [sistema bancario a riserva frazionaria](https://www.investopedia.com/terms/f/fractionalreservebanking.asp). +Se ci sono troppi token su L1, alcuni di quei token rimarrebbero bloccati per sempre all'interno del contratto del ponte perché non c'è modo di rilasciarli senza bruciare i token di L2. ### IL2StandardERC20 {#il2standarderc20} -Ogni token ERC-20 sul L2 che usa il ponte standard deve presentare [quest'interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol), che ha le funzioni e gli eventi necessari al ponte standard. +Ogni token ERC-20 su L2 che utilizza il ponte standard deve fornire [questa interfaccia](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol), che ha le funzioni e gli eventi di cui il ponte standard ha bisogno. ```solidity // SPDX-License-Identifier: MIT @@ -899,20 +1137,24 @@ pragma solidity ^0.8.9; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; ``` -[L'interfaccia standard dell'ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) non include le funzioni `mint` e `burn`. Questi metodi non sono richiesti dallo [standard ERC-20](https://eips.ethereum.org/EIPS/eip-20), che non specifica i meccanismi per creare e distruggere i token. +[L'interfaccia ERC-20 standard](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) non include le funzioni `mint` e `burn`. +Questi metodi non sono richiesti dallo [standard ERC-20](https://eips.ethereum.org/EIPS/eip-20), che lascia non specificati i meccanismi per creare e distruggere i token. ```solidity import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; ``` -[L'interfaccia ERC-165](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) è usata per specificare quali funzioni sono fornite da un contratto. [Puoi leggere lo standard qui](https://eips.ethereum.org/EIPS/eip-165). +[L'interfaccia ERC-165](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) viene utilizzata per specificare quali funzioni fornisce un contratto. +[Puoi leggere lo standard qui](https://eips.ethereum.org/EIPS/eip-165). ```solidity interface IL2StandardERC20 is IERC20, IERC165 { function l1Token() external returns (address); ``` -Questa funzione fornisce l'indirizzo del token L1, collegato a questo contratto. Nota che non esiste una funzione simile nella direzione opposta. Dobbiamo poter collegare qualsiasi token del L1, indipendentemente dal fatto che il supporto a L2 sia stato o meno pianificato alla sua implementazione. +Questa funzione fornisce l'indirizzo del token di L1 che è collegato tramite ponte a questo contratto. +Nota che non abbiamo una funzione simile nella direzione opposta. +Dobbiamo essere in grado di trasferire tramite ponte qualsiasi token di L1, indipendentemente dal fatto che il supporto per L2 fosse previsto o meno al momento della sua implementazione. ```solidity @@ -925,11 +1167,13 @@ Questa funzione fornisce l'indirizzo del token L1, collegato a questo contratto. } ``` -Funzioni ed eventi per coniare (creare) e bruciare (distruggere) i token. Il ponte dovrebbe esser la sola entità capace d'eseguire queste funzioni per assicurare che il numero di token sia corretto (pari al numero di token bloccati su L1). +Funzioni ed eventi per coniare (creare) e bruciare (distruggere) i token. +Il ponte dovrebbe essere l'unica entità in grado di eseguire queste funzioni per garantire che il numero di token sia corretto (uguale al numero di token bloccati su L1). ### L2StandardERC20 {#L2StandardERC20} -[Questa è la nostra implementazione dell'interfaccia di `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). A meno che tu non necessiti di qualche tipo di logica personalizzata, dovresti usare questa. +[Questa è la nostra implementazione dell'interfaccia `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). +A meno che tu non abbia bisogno di qualche tipo di logica personalizzata, dovresti usare questa. ```solidity // SPDX-License-Identifier: MIT @@ -938,7 +1182,8 @@ pragma solidity ^0.8.9; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; ``` -[Il contratto ERC-20 di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). Optimism non vuole reinventare la ruota, specialmente quando questa è ben rodata e deve esser abbastanza affidabile da contenere delle risorse. +[Il contratto ERC-20 di OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). +Optimism non crede nel reinventare la ruota, specialmente quando la ruota è ben verificata e deve essere abbastanza affidabile da contenere asset. ```solidity import "./IL2StandardERC20.sol"; @@ -948,16 +1193,21 @@ contract L2StandardERC20 is IL2StandardERC20, ERC20 { address public l2Bridge; ``` -Questi sono due parametri di configurazione aggiuntivi che noi richiediamo e che invece ERC-20 normalmente non richiede. +Questi sono i due parametri di configurazione aggiuntivi che richiediamo e che l'ERC-20 normalmente non richiede. ```solidity - /** - * @param _l2Bridge Address of the L2 standard bridge. - * @param _l1Token Address of the corresponding L1 token. - * @param _name ERC20 name. - * @param _symbol ERC20 symbol. - */ + /* * + * @param _l2Bridge Indirizzo del ponte standard L2. + * @param _l1Token Indirizzo del token L1 corrispondente. + * @param _name Nome dell'ERC20. + * @param _symbol Simbolo dell'ERC20. */ + + + + + + constructor( address _l2Bridge, address _l1Token, @@ -969,7 +1219,7 @@ Questi sono due parametri di configurazione aggiuntivi che noi richiediamo e che } ``` -Per prima cosa, chiama il costruttore per il contratto da cui ereditiamo (`ERC20(_name, _symbol)`) e poi imposta le nostre variabili. +Prima chiama il costruttore per il contratto da cui ereditiamo (`ERC20(_name, _symbol)`) e poi imposta le nostre variabili. ```solidity @@ -989,11 +1239,12 @@ Per prima cosa, chiama il costruttore per il contratto da cui ereditiamo (`ERC20 } ``` -[ERC-165](https://eips.ethereum.org/EIPS/eip-165) funziona così. Ogni interfaccia è un numero di funzioni supportate ed è identificata come l'[OR esclusivo](https://en.wikipedia.org/wiki/Exclusive_or) dei [selettori della funzione ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) di queste funzioni. +Questo è il modo in cui funziona [ERC-165](https://eips.ethereum.org/EIPS/eip-165). +Ogni interfaccia è un numero di funzioni supportate ed è identificata come l'[or esclusivo](https://it.wikipedia.org/wiki/Disgiunzione_esclusiva) dei [selettori di funzione ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) di quelle funzioni. -Il ponte L2 usa ERC-165 come controllo di integrità per assicurarsi che il contratto ERC-20 a cui invia le risorse sia un `IL2StandardERC20`. +Il ponte di L2 utilizza ERC-165 come controllo di integrità per assicurarsi che il contratto ERC-20 a cui invia gli asset sia un `IL2StandardERC20`. -**Nota:** Non c'è nulla che impedisca che un contratto malevolo fornisca risposte false a `supportsInterface`, questo è quindi un meccanismo di controllo dell'integrità, _non_ un meccanismo di sicurezza. +**Nota:** Non c'è nulla che impedisca a un contratto malevolo di fornire risposte false a `supportsInterface`, quindi questo è un meccanismo di controllo dell'integrità, _non_ un meccanismo di sicurezza. ```solidity // slither-disable-next-line external-function @@ -1012,80 +1263,112 @@ Il ponte L2 usa ERC-165 come controllo di integrità per assicurarsi che il cont } ``` -Solo il ponte L2 può coniare e bruciare le risorse. +Solo il ponte di L2 è autorizzato a coniare e bruciare asset. -`_mint` e `_burn` sono in realtà definiti nel [contratto ERC-20 di OpenZeppelin](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn). Quel contratto non li espone esternamente, perché le condizioni per coniare e bruciare token sono tanto varie quanto il numero di metodi per usare ERC-20. +`_mint` e `_burn` sono in realtà definiti nel [contratto ERC-20 di OpenZeppelin](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn). +Quel contratto semplicemente non li espone esternamente, perché le condizioni per coniare e bruciare token sono tanto varie quanto il numero di modi per utilizzare l'ERC-20. ## Codice del ponte di L2 {#l2-bridge-code} -Questo è il codice che esegue il ponte su Optimism. [Il codice sorgente di questo contratto è qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol). +Questo è il codice che esegue il ponte su Optimism. +[Il sorgente per questo contratto è qui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol). ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; +/* Importazioni di Interfacce */ /* Interface Imports */ import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; ``` -L'interfaccia di [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) è molto simile all'[equivalente di L1](#IL1ERC20Bridge), visto in precedenza. Vi sono due differenze significative: +L'interfaccia [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) è molto simile all'[equivalente di L1](#IL1ERC20Bridge) che abbiamo visto sopra. +Ci sono due differenze significative: -1. Su L1, avvii i depositi e finalizzi i prelievi. Qui, avvii i prelievi e finalizzi i depositi. -2. Su L1 è necessario distinguere tra ETH e token ERC-20. Su L2 possiamo usare le stesse funzioni per entrambi perché, internamente, i saldi di ETH su Optimism sono gestiti come un token ERC-20 con l'indirizzo [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://optimistic.etherscan.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000). +1. Su L1 si avviano i depositi e si finalizzano i prelievi. + Qui si avviano i prelievi e si finalizzano i depositi. +2. Su L1 è necessario distinguere tra ETH e token ERC-20. + Su L2 possiamo utilizzare le stesse funzioni per entrambi perché internamente i saldi di ETH su Optimism sono gestiti come un token ERC-20 con l'indirizzo [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000). ```solidity +/* Importazioni di Librerie */ /* Library Imports */ import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; +/* Importazioni di Contratti */ /* Contract Imports */ import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; -/** +/* * * @title L2StandardBridge - * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to - * enable ETH and ERC20 transitions between L1 and L2. - * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard - * bridge. - * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 - * bridge to release L1 funds. - */ + * @dev Il ponte Standard L2 è un contratto che lavora insieme al ponte Standard L1 per + * abilitare le transizioni di ETH ed ERC20 tra L1 e L2. + * Questo contratto agisce per coniare nuovi token quando viene a conoscenza di depositi nel ponte + * Standard L1. + * Questo contratto agisce anche come bruciatore dei token destinati al prelievo, informando il ponte + * L1 di rilasciare i fondi L1. */ + + + + + + + + + contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { - /******************************** - * External Contract References * - ********************************/ + /* ******************************* + * Riferimenti a Contratti Esterni * + ******************************* */ + + + address public l1TokenBridge; ``` -Tieni traccia dell'indirizzo del ponte L1. Nota che, a differenza dell'equivalente L1, qui _serve_ questa variabile. L'indirizzo del ponte L1 non è noto preventivamente. +Tiene traccia dell'indirizzo del ponte di L1. +Nota che, a differenza dell'equivalente di L1, qui _abbiamo bisogno_ di questa variabile. +L'indirizzo del ponte di L1 non è noto in anticipo. ```solidity - /*************** - * Constructor * - ***************/ + /* ************** + * Costruttore * + ************** */ + + + + + /* * + * @param _l2CrossDomainMessenger Messenger cross-domain utilizzato da questo contratto. + * @param _l1TokenBridge Indirizzo del ponte L1 distribuito sulla catena principale. */ + + + - /** - * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract. - * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain. - */ constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) CrossDomainEnabled(_l2CrossDomainMessenger) { l1TokenBridge = _l1TokenBridge; } - /*************** - * Withdrawing * - ***************/ + /* ************** + * Prelievo * + ************** */ + + + + + /* * + * @inheritdoc IL2ERC20Bridge */ + + - /** - * @inheritdoc IL2ERC20Bridge - */ function withdraw( address _l2Token, uint256 _amount, @@ -1095,9 +1378,11 @@ Tieni traccia dell'indirizzo del ponte L1. Nota che, a differenza dell'equivalen _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data); } - /** - * @inheritdoc IL2ERC20Bridge - */ + /* * + * @inheritdoc IL2ERC20Bridge */ + + + function withdrawTo( address _l2Token, address _to, @@ -1109,22 +1394,35 @@ Tieni traccia dell'indirizzo del ponte L1. Nota che, a differenza dell'equivalen } ``` -Queste due funzioni avviano dei prelievi. Nota che non serve specificare l'indirizzo del token L1. I token L2 dovrebbero dirci l'indirizzo dell'equivalente L1. +Queste due funzioni avviano i prelievi. +Nota che non è necessario specificare l'indirizzo del token di L1. +Ci si aspetta che i token di L2 ci dicano l'indirizzo dell'equivalente di L1. ```solidity - /** - * @dev Performs the logic for withdrawals by burning the token and informing - * the L1 token Gateway of the withdrawal. - * @param _l2Token Address of L2 token where withdrawal is initiated. - * @param _from Account to pull the withdrawal from on L2. - * @param _to Account to give the withdrawal to on L1. - * @param _amount Amount of the token to withdraw. - * @param _l1Gas Unused, but included for potential forward compatibility considerations. - * @param _data Optional data to forward to L1. This data is provided - * solely as a convenience for external contracts. Aside from enforcing a maximum - * length, these contracts provide no guarantees about its content. - */ + /* * + * @dev Esegue la logica per i prelievi bruciando il token e informando + * il Gateway del token L1 del prelievo. + * @param _l2Token Indirizzo del token L2 in cui è stato avviato il prelievo. + * @param _from Account da cui prelevare il prelievo su L2. + * @param _to Account a cui dare il prelievo su L1. + * @param _amount Importo del token da prelevare. + * @param _l1Gas Inutilizzato, ma incluso per potenziali considerazioni di compatibilità futura. + * @param _data Dati opzionali da inoltrare a L1. Questi dati sono forniti + * esclusivamente per comodità dei contratti esterni. A parte l'imposizione di una + * lunghezza massima, questi contratti non forniscono alcuna garanzia sul loro contenuto. */ + + + + + + + + + + + + function _initiateWithdrawal( address _l2Token, address _from, @@ -1133,17 +1431,17 @@ Queste due funzioni avviano dei prelievi. Nota che non serve specificare l'indir uint32 _l1Gas, bytes calldata _data ) internal { - // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 - // usage + // Quando viene avviato un prelievo, bruciamo i fondi di chi effettua il prelievo per prevenire un successivo + // utilizzo su L2 // slither-disable-next-line reentrancy-events IL2StandardERC20(_l2Token).burn(msg.sender, _amount); ``` -Nota che _non_ ci stiamo affidando al parametro `_from`, ma su `msg.sender`, molto più difficile da falsificare (impossibile, per quanto ne so). +Nota che _non_ facciamo affidamento sul parametro `_from` ma su `msg.sender` che è molto più difficile da falsificare (impossibile, per quanto ne so). ```solidity - // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) + // Costruisce i calldata per l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) // slither-disable-next-line reentrancy-events address l1Token = IL2StandardERC20(_l2Token).l1Token(); bytes memory message; @@ -1173,7 +1471,7 @@ Su L1 è necessario distinguere tra ETH ed ERC-20. ); } - // Send message up to L1 bridge + // Invia il messaggio al ponte L1 // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l1TokenBridge, _l1Gas, message); @@ -1181,13 +1479,18 @@ Su L1 è necessario distinguere tra ETH ed ERC-20. emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data); } - /************************************ - * Cross-chain Function: Depositing * - ************************************/ + /* *********************************** + * Funzione Cross-chain: Deposito * + *********************************** */ + + + + + /* * + * @inheritdoc IL2ERC20Bridge */ + + - /** - * @inheritdoc IL2ERC20Bridge - */ function finalizeDeposit( address _l1Token, address _l2Token, @@ -1203,11 +1506,12 @@ Questa funzione è chiamata da `L1StandardBridge`. ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) { ``` -Assicurati che la fonte del messaggio sia legittima. Questo è importante perché questa funzione chiama `_mint` e potrebbe esser usata per dare token non coperti dai token posseduti dal ponte su L1. +Si assicura che la fonte del messaggio sia legittima. +Questo è importante perché questa funzione chiama `_mint` e potrebbe essere utilizzata per fornire token che non sono coperti dai token che il ponte possiede su L1. ```solidity - // Check the target token is compliant and - // verify the deposited token on L1 matches the L2 deposited token representation here + // Controlla che il token di destinazione sia conforme e + // verifica che il token depositato su L1 corrisponda alla rappresentazione del token depositato su L2 qui if ( // slither-disable-next-line reentrancy-events ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && @@ -1217,49 +1521,50 @@ Assicurati che la fonte del messaggio sia legittima. Questo è importante perch Controlli di integrità: 1. L'interfaccia corretta è supportata -2. L'indirizzo L1 del contratto ERC-20 del L2 corrisponde alla sorgente L1 dei token +2. L'indirizzo di L1 del contratto ERC-20 di L2 corrisponde alla fonte di L1 dei token ```solidity ) { - // When a deposit is finalized, we credit the account on L2 with the same amount of - // tokens. + // Quando un deposito viene finalizzato, accreditiamo sull'account su L2 la stessa quantità di + // token. // slither-disable-next-line reentrancy-events IL2StandardERC20(_l2Token).mint(_to, _amount); // slither-disable-next-line reentrancy-events emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data); ``` -Se il controllo di integrità riesce, finalizza il deposito: +Se i controlli di integrità vengono superati, finalizza il deposito: 1. Conia i token -2. Genera l'evento appropriato +2. Emette l'evento appropriato ```solidity } else { - // Either the L2 token which is being deposited-into disagrees about the correct address - // of its L1 token, or does not support the correct interface. - // This should only happen if there is a malicious L2 token, or if a user somehow - // specified the wrong L2 token address to deposit into. - // In either case, we stop the process here and construct a withdrawal - // message so that users can get their funds out in some cases. - // There is no way to prevent malicious token contracts altogether, but this does limit - // user error and mitigate some forms of malicious contract behavior. + // O il token L2 in cui si sta depositando non concorda sull'indirizzo corretto + // del suo token L1, oppure non supporta l'interfaccia corretta. + // Questo dovrebbe accadere solo se c'è un token L2 malevolo, o se un utente in qualche modo + // ha specificato l'indirizzo del token L2 sbagliato in cui depositare. + // In entrambi i casi, interrompiamo il processo qui e costruiamo un + // messaggio di prelievo in modo che gli utenti possano recuperare i propri fondi in alcuni casi. + // Non c'è modo di prevenire del tutto i contratti di token malevoli, ma questo limita + // l'errore dell'utente e mitiga alcune forme di comportamento malevolo del contratto. ``` -Se un utente ha commesso un errore rilevabile usando l'indirizzo del token L2 errato, dobbiamo annullare il deposito e restituire i token sul L1. Il solo modo in cui possiamo farlo da L2 è inviare un messaggio che dovrà attendere il periodo di contestazione dell'errore, ma è molto meglio per l'utente rispetto a perdere permanentemente i token. +Se un utente ha commesso un errore rilevabile utilizzando l'indirizzo del token di L2 sbagliato, vogliamo annullare il deposito e restituire i token su L1. +L'unico modo in cui possiamo farlo da L2 è inviare un messaggio che dovrà attendere il periodo di contestazione dei guasti, ma questo è molto meglio per l'utente rispetto alla perdita permanente dei token. ```solidity bytes memory message = abi.encodeWithSelector( IL1ERC20Bridge.finalizeERC20Withdrawal.selector, _l1Token, _l2Token, - _to, // switched the _to and _from here to bounce back the deposit to the sender + _to, // scambiati _to e _from qui per rimbalzare il deposito al mittente _from, _amount, _data ); - // Send message up to L1 bridge + // Invia il messaggio al ponte L1 // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l1TokenBridge, 0, message); // slither-disable-next-line reentrancy-events @@ -1269,10 +1574,15 @@ Se un utente ha commesso un errore rilevabile usando l'indirizzo del token L2 er } ``` -## Conclusioni {#conclusion} +## Conclusione {#conclusion} + +Il ponte standard è il meccanismo più flessibile per i trasferimenti di asset. +Tuttavia, essendo così generico, non è sempre il meccanismo più facile da usare. +Soprattutto per i prelievi, la maggior parte degli utenti preferisce utilizzare [ponti di terze parti](https://optimism.io/apps#bridge) che non attendono il periodo di contestazione e non richiedono una prova di Merkle per finalizzare il prelievo. -Il ponte standard è il meccanismo più flessibile per i trasferimenti di risorse. Tuttavia, essendo così generico, non è sempre il metodo più facile da usare. Specialmente per i prelievi, gran parte degli utenti preferisce usare [ponti di terze parti](https://optimism.io/apps#bridge) che non attendono il periodo di contestazione dell'errore e non richiedono una prova di Merkle per finalizzare il prelievo. +Questi ponti in genere funzionano avendo asset su L1, che forniscono immediatamente per una piccola commissione (spesso inferiore al costo del gas per un prelievo dal ponte standard). +Quando il ponte (o le persone che lo gestiscono) prevede di essere a corto di asset su L1, trasferisce asset sufficienti da L2. Poiché si tratta di prelievi molto grandi, il costo del prelievo viene ammortizzato su un importo elevato e rappresenta una percentuale molto più piccola. -Questi ponti funzionano tipicamente avendo delle risorse sul L1, che forniscono immediatamente per una ridotta commissione (spesso inferiore al costo del gas per un prelievo del ponte standard). Quando il ponte (o le persone che lo gestiscono) prevede di avere poche risorse su L1, trasferisce delle sufficienti risorse da L2. Poiché questi sono prelievi molto grandi, il costo di prelievo è ammortizzato su un grande importo e ha un'incidenza minore. +Speriamo che questo articolo ti abbia aiutato a capire meglio come funziona il livello 2 e come scrivere codice Solidity chiaro e sicuro. -Spero che questo articolo ti abbia aiutato a comprendere meglio come funziona il livello 2 e come scrivere un codice chiaro e sicuro in Solidity. +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md index f28ca094cf4..190029e9fbc 100644 --- a/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/it/developers/tutorials/reverse-engineering-a-contract/index.md @@ -1,311 +1,308 @@ --- -title: "Decompilare un contratto" -description: Come comprendere un contratto quando non hai il codice sorgente +title: "Reverse engineering di un contratto" +description: Come comprendere un contratto quando non si dispone del codice sorgente author: Ori Pomerantz lang: it -tags: - - "evm" - - "opcode" +tags: ["evm", "opcodes"] skill: advanced -breadcrumb: "Reverse engineering" +breadcrumb: Reverse engineering published: 2021-12-30 --- - ## Introduzione {#introduction} -_Non ci sono segreti sulla blockchain_: tutto ciò che si verifica è coerente, verificabile e disponibile pubblicamente. Idealmente, il codice sorgente dei [contratti dovrebbe essere pubblicato e verificato su Etherscan](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). Però [non sempre è così](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). In questo articolo imparerai come decompilare i contratti guardando un contratto privo del codice sorgente, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). +_Non ci sono segreti sulla blockchain_, tutto ciò che accade è coerente, verificabile e pubblicamente disponibile. Idealmente, [i contratti dovrebbero avere il loro codice sorgente pubblicato e verificato su Etherscan](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). Tuttavia, [non è sempre così](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). In questo articolo imparerai come fare il reverse engineering dei contratti esaminando un contratto senza codice sorgente, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). -Esistono dei decompilatori, ma non producono sempre [risultati utilizzabili](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). In questo articolo imparerai come decompilare manualmente e comprendere un contratto dagli [opcode](https://github.com/wolflo/evm-opcodes), nonché come interpretare i risultati di un decompilatore. +Esistono compilatori inversi, ma non sempre producono [risultati utilizzabili](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). In questo articolo imparerai come fare manualmente il reverse engineering e comprendere un contratto a partire [dagli opcode](https://github.com/wolflo/evm-opcodes), oltre a come interpretare i risultati di un decompilatore. -Per poter comprendere questo articolo dovresti già conoscere le basi dell'EVM ed avere una certa familiarità con l'assembler dell'EVM. [Puoi leggere articoli su questi argomenti qui](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). +Per poter comprendere questo articolo dovresti già conoscere le basi della EVM ed avere almeno una certa familiarità con l'assembler della EVM. [Puoi leggere di più su questi argomenti qui](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). ## Preparare il codice eseguibile {#prepare-the-executable-code} -Puoi ottenere gli opcode andando su Etherscan per il contratto, facendo clic sulla scheda **Contract** e poi **Switch to Opcodes View**. Ottieni una vista composta da un opcode per riga. +Puoi ottenere gli opcode andando su Etherscan per il contratto, cliccando sulla scheda **Contract** e poi su **Switch to Opcodes View**. Otterrai una visualizzazione con un opcode per riga. -![Vista dell'opcode da Etherscan](opcode-view.png) +![Visualizzazione degli opcode da Etherscan](opcode-view.png) -Per poter comprendere i salti, però, devi sapere dove si trova ogni opcode nel codice. Per farlo, un modo è aprire un Foglio di calcolo di Google e incollare gli opcode nella colonna C. [Puoi saltare i passaggi successivi creando una copia di questo foglio di calcolo già pronto](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). +Per poter comprendere i salti (jump), tuttavia, devi sapere dove si trova ciascun opcode nel codice. Per farlo, un modo è aprire un Foglio Google e incollare gli opcode nella colonna C. [Puoi saltare i passaggi seguenti creando una copia di questo foglio di calcolo già preparato](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). -Il prossimo passaggio è ottenere le posizioni corrette del codice, così da poter comprendere i salti. Inseriremo la dimensione dell'opcode nella colonna B e la posizione (in esadecimale) nella colonna A. Digita questa funzione nella cella `B1` e poi copiala e incollala per il resto della colonna B, fino alla fine del codice. Dopo averlo fatto, puoi nascondere la colonna B. +Il passaggio successivo è ottenere le posizioni corrette del codice in modo da poter comprendere i salti. Inseriremo la dimensione dell'opcode nella colonna B e la posizione (in esadecimale) nella colonna A. Digita questa funzione nella cella `B1` e poi copiala e incollala per il resto della colonna B, fino alla fine del codice. Dopo averlo fatto, puoi nascondere la colonna B. ``` =1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) ``` -Questa funzione aggiunge prima un byte per l'opcode stesso e poi cerca `PUSH`. Gli opcode push sono speciali perché hanno bisogno di byte aggiuntivi affinché venga eseguito il push del valore. Se l'opcode è un `PUSH`, estraiamo il numero di byte e lo aggiungiamo. +Innanzitutto questa funzione aggiunge un byte per l'opcode stesso, e poi cerca `PUSH`. Gli opcode push sono speciali perché devono avere byte aggiuntivi per il valore che viene inserito (pushed). Se l'opcode è un `PUSH`, estraiamo il numero di byte e lo aggiungiamo. -In `A1` inserisci il primo scostamento: zero. Poi, in `A2`, inserisci questa funzione e di nuovo copiala e incollala per il resto della colonna A: +In `A1` inserisci il primo offset, zero. Quindi, in `A2`, inserisci questa funzione e copiala e incollala di nuovo per il resto della colonna A: ``` =dec2hex(hex2dec(A1)+B1) ``` -Ci serve che questa funzione ci restituisca il valore esadecimale perché i valori su cui è stato eseguito il push prima dei salti (`JUMP` e `JUMPI`) ci vengono dati in esadecimali. +Abbiamo bisogno che questa funzione ci dia il valore esadecimale perché i valori che vengono inseriti prima dei salti (`JUMP` e `JUMPI`) ci vengono forniti in esadecimale. -## Il Punto d'accesso (0x00) {#the-entry-point-0x00} +## Il Punto di Ingresso (0x00) {#the-entry-point-0x00} -I contratti sono sempre eseguiti dal primo byte. Questa è la parte iniziale del codice: +I contratti vengono sempre eseguiti dal primo byte. Questa è la parte iniziale del codice: -| Offset | Opcode | Stack (dopo l'opcode) | -| ------:| ------------ | --------------------- | -| 0 | PUSH1 0x80 | 0x80 | -| 2 | PUSH1 0x40 | 0x40, 0x80 | -| 4 | MSTORE | Vuoto | -| 5 | PUSH1 0x04 | 0x04 | -| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | -| 8 | LT | CALLDATASIZE\<4 | -| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 | -| C | JUMPI | Vuoto | +| Offset | Opcode | Stack (dopo l'opcode) | +| -----: | ------------ | ------------------------ | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | Vuoto | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE\<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE\<4 | +| C | JUMPI | Vuoto | Questo codice fa due cose: -1. Scrive 0x80 come un valore a 32 byte nelle posizioni di memoria 0x40-0x5F (0x80 è memorizzato in 0x5F e 0x40-0x5E sono tutti zeri). -2. Legge la dimensione dei calldata. Normalmente i dati della chiamata per un contratto di Ethereum seguono [l'ABI (Application Binary Interface, interfaccia binaria dell'applicazione)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), che richiede come minimo quattro byte per il selettore della funzione. Se la dimensione dei dati della chiamata è inferiore a quattro, salta a 0x5E. +1. Scrive 0x80 come valore a 32 byte nelle posizioni di memoria 0x40-0x5F (0x80 è memorizzato in 0x5F e 0x40-0x5E sono tutti zeri). +2. Legge la dimensione dei calldata. Normalmente i dati di chiamata per un contratto di Ethereum seguono [l'ABI (interfaccia binaria dell'applicazione)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), che richiede come minimo quattro byte per il selettore di funzione. Se la dimensione dei dati di chiamata è inferiore a quattro, salta a 0x5E. -![Diagramma di flusso per questa parte](flowchart-entry.png) +![Diagramma di flusso per questa porzione](flowchart-entry.png) -### Il Gestore a 0x5E (per i dati della chiamata non ABI) {#the-handler-at-0x5e-for-non-abi-call-data} +### Il Gestore a 0x5E (per dati di chiamata non-ABI) {#the-handler-at-0x5e-for-non-abi-call-data} | Offset | Opcode | -| ------:| ------------ | +| -----: | ------------ | | 5E | JUMPDEST | | 5F | CALLDATASIZE | | 60 | PUSH2 0x007c | | 63 | JUMPI | -Questo frammento inizia con un `JUMPDEST`. I programmi dell'EVM (macchina virtuale di Ethereum) lanciano un'eccezione se salti a un opcode che non è `JUMPDEST`. Poi guarda la CALLDATASIZE e se è "true" (ovvero, non è zero) salta a 0x7C. Lo vedremo di seguito. +Questo frammento inizia con un `JUMPDEST`. I programmi della EVM (macchina virtuale di Ethereum) generano un'eccezione se si salta a un opcode che non è `JUMPDEST`. Poi guarda la CALLDATASIZE e, se è "vera" (cioè non zero), salta a 0x7C. Ci arriveremo più avanti. -| Offset | Opcode | Stack (dopo l'opcode) | -| ------:| ---------- | ------------------------------------------------------------------------------ | -| 64 | CALLVALUE | [Wei](/glossary/#wei) fornito dalla chiamata. Chiamato `msg.value` in Solidity | -| 65 | PUSH1 0x06 | 6 CALLVALUE | -| 67 | PUSH1 0x00 | 0 6 CALLVALUE | -| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | -| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | -| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | +| Offset | Opcode | Stack (dopo l'opcode) | +| -----: | ---------- | -------------------------------------------------------------------------- | +| 64 | CALLVALUE | [Wei](/glossary/#wei) forniti dalla chiamata. Chiamato `msg.value` in Solidity | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | -Quindi quando non ci sono dati della chiamata leggiamo il valore di Storage[6]. Non sappiamo ancora cosa sia questo valore, ma possiamo cercare delle transazioni ricevute dal contratto prive di dati della chiamata. Le transazioni che trasferiscono semplicemente ETH senza alcun dato della chiamata (e dunque senza metodo) contengono in Etherscan il metodo `Transfer`. Difatti, [la prima vera transazione ricevuta dal contratto](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) è un trasferimento. +Quindi, quando non ci sono dati di chiamata, leggiamo il valore di Storage[6]. Non sappiamo ancora quale sia questo valore, ma possiamo cercare le transazioni che il contratto ha ricevuto senza dati di chiamata. Le transazioni che trasferiscono semplicemente ETH senza alcun dato di chiamata (e quindi senza alcun metodo) hanno in Etherscan il metodo `Transfer`. Infatti, [la primissima transazione ricevuta dal contratto](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) è un trasferimento. -Se guardiamo in quella transazione e facciamo clic su **Click to see More**, vediamo che i dati della chiamata, detti dati di input, sono vuoti (`0x`). Nota anche che il valore è 1,559 ETH, che sarà rilevante in seguito. +Se guardiamo in quella transazione e clicchiamo su **Click to see More**, vediamo che i dati di chiamata, chiamati dati di input, sono effettivamente vuoti (`0x`). Si noti anche che il valore è di 1.559 ETH, il che sarà rilevante in seguito. -![I dati della chiamata sono vuoti](calldata-empty.png) +![I dati di chiamata sono vuoti](calldata-empty.png) -A questo punto, fai clic sulla scheda **State** ed espandi il contratto che stiamo decompilando (0x2510...). Puoi vedere che `Storage[6]` è cambiato durante la transazione e, passando da Hex a **Number**, vedrai che è diventato 1.559.000.000.000.000.000, il valore trasferito in wei (ho aggiunto i punti per chiarezza), corrispondente al valore del contratto successivo. +Successivamente, clicca sulla scheda **State** ed espandi il contratto di cui stiamo facendo il reverse engineering (0x2510...). Puoi vedere che `Storage[6]` è effettivamente cambiato durante la transazione e, se cambi Hex in **Number**, vedi che è diventato 1.559.000.000.000.000.000, il valore trasferito in wei (ho aggiunto le virgole per chiarezza), corrispondente al successivo valore del contratto. ![Il cambiamento in Storage[6]](storage6.png) -Se guardiamo i cambiamenti di stato causati da [altre transazioni `Transfer` dallo stesso periodo](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange), vediamo che `Storage[6]` ha monitorato il valore del contratto per un po'. Per ora lo chiameremo `Value*`. L'asterisco (`*`) ci ricorda che ancora non _sappiamo_ cosa faccia questa variabile, ma non può servire solo a tracciare il valore del contratto, poiché non è necessario utilizzare l'archiviazione, essendo molto costosa, quando si può ottenere il saldo dei conti utilizzando `ADDRESS BALANCE`. Il primo opcode effettua il push dell'indirizzo del contratto. Il secondo legge l'indirizzo in cima allo stack e lo sostituisce con il saldo di quell'indirizzo. +Se guardiamo i cambiamenti di stato causati da [altre transazioni `Transfer` dello stesso periodo](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) vediamo che `Storage[6]` ha tracciato il valore del contratto per un po'. Per ora lo chiameremo `Value*`. L'asterisco (`*`) ci ricorda che non _sappiamo_ ancora cosa faccia questa variabile, ma non può servire solo a tracciare il valore del contratto perché non c'è bisogno di usare l'archiviazione, che è molto costosa, quando puoi ottenere il saldo del tuo account usando `ADDRESS BALANCE`. Il primo opcode inserisce l'indirizzo stesso del contratto. Il secondo legge l'indirizzo in cima allo stack e lo sostituisce con il saldo di quell'indirizzo. -| Offset | Opcode | Stack | -| ------:| ------------ | --------------------------------------------- | +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------- | | 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | | 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | | 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -| 74 | JUMP | | +| 74 | JUMP | -Continueremo a monitorare questo codice alla destinazione del salto. +Continueremo a tracciare questo codice alla destinazione del salto. -| Offset | Opcode | Stack | -| ------:| ---------- | ------------------------------------------------------------- | +| Offset | Opcode | Stack | +| -----: | ---------- | ----------------------------------------------------------- | | 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -Il `NOT` opera su singoli bit, quindi annulla il valore di ogni bit nel valore della chiamata. +Il `NOT` è bit a bit, quindi inverte il valore di ogni bit nel valore della chiamata. -| Offset | Opcode | Stack | -| ------:| ------------ | ------------------------------------------------------------------------------- | +| Offset | Opcode | Stack | +| -----: | ------------ | --------------------------------------------------------------------------- | | 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AE | ISZERO | Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AF | PUSH2 0x01df | 0x01DF Value\*\<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1B2 | JUMPI | | +| 1B2 | JUMPI | -Saltiamo se `Value*` è inferiore o pari a 2^256-CALLVALUE-1. Questa sembra una logica per prevenire l'overflow. E in effetti vediamo che dopo alcune operazioni senza senso (la scrittura sulla memoria sta per essere eliminata, ad esempio), all'offset 0x01DE il contratto si annulla se viene rilevato l'overflow, il che è comportamento normale. +Saltiamo se `Value*` è minore di 2^256-CALLVALUE-1 o uguale ad esso. Questa sembra una logica per prevenire l'overflow. E in effetti, vediamo che dopo alcune operazioni senza senso (la scrittura in memoria sta per essere eliminata, ad esempio) all'offset 0x01DE il contratto si annulla se viene rilevato l'overflow, il che è un comportamento normale. -Nota che l'overflow è estremamente improbabile, perché richiederebbe che il valore della chiamata più `Value*` fosse comparabile a 2^256 wei, circa 10^59 ETH. [La quantità totale di ETH, al momento della scrittura, è inferiore a duecento milioni](https://etherscan.io/stat/supply). +Si noti che un tale overflow è estremamente improbabile, perché richiederebbe che il valore della chiamata più `Value*` fosse paragonabile a 2^256 wei, circa 10^59 ETH. [L'offerta totale di ETH, al momento della stesura, è inferiore a duecento milioni](https://etherscan.io/stat/supply). -| Offset | Opcode | Stack | -| ------:| -------- | ------------------------------------------- | +| Offset | Opcode | Stack | +| -----: | -------- | ----------------------------------------- | | 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | | 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | -| 1E3 | JUMP | | +| 1E3 | JUMP | -Se siamo arrivati qui, ottieni `Value* + CALLVALUE` e salta all'offset 0x75. +Se siamo arrivati fin qui, ottieni `Value* + CALLVALUE` e salta all'offset 0x75. -| Offset | Opcode | Stack | -| ------:| -------- | --------------------------------- | +| Offset | Opcode | Stack | +| -----: | -------- | ------------------------------- | | 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | | 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | | 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | -| 78 | SSTORE | 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | -Se siamo arrivati qui (che richiede che i dati della chiamata siano vuoti), aggiungiamo il valore della chiamata a `Value*`. Ciò è coerente con ciò che diciamo che facciano le transazioni `Transfer`. +Se arriviamo qui (il che richiede che i dati di chiamata siano vuoti) aggiungiamo a `Value*` il valore della chiamata. Questo è coerente con ciò che diciamo facciano le transazioni `Transfer`. | Offset | Opcode | -| ------:| ------ | +| -----: | ------ | | 79 | POP | | 7A | POP | | 7B | STOP | -Infine, cancelliamo lo stack (che non è necessario) e segnaliamo che la transazione è andata a buon fine. +Infine, svuota lo stack (il che non è necessario) e segnala la fine con successo della transazione. -Per riassumere tutto, ecco un diagramma di flusso per il codice iniziale. +Per riassumere il tutto, ecco un diagramma di flusso per il codice iniziale. -![Diagramma di flusso dei punti d'accesso](flowchart-entry.png) +![Diagramma di flusso del punto di ingresso](flowchart-entry.png) ## Il Gestore a 0x7C {#the-handler-at-0x7c} -Volutamente ho omesso di inserire nell'intestazione cosa fa questo gestore. Il punto non è insegnarti come funziona questo contratto specifico, ma come decompilare i contratti. Imparerai cosa faccia come ho fatto io, seguendo il codice. +Di proposito non ho inserito nell'intestazione cosa fa questo gestore. Il punto non è insegnarti come funziona questo specifico contratto, ma come fare ingegneria inversa sui contratti. Imparerai cosa fa nello stesso modo in cui l'ho fatto io, seguendo il codice. Arriviamo qui da diversi punti: -- Se ci sono dati della chiamata di 1, 2 o 3 byte (dall'offset 0x63) -- Se la firma del metodo non è nota (dagli offset 0x42 e 0x5D) +- Se ci sono dati di chiamata di 1, 2 o 3 byte (dall'offset 0x63) +- Se la firma del metodo è sconosciuta (dagli offset 0x42 e 0x5D) | Offset | Opcode | Stack | -| ------:| ------------ | -------------------- | -| 7C | JUMPDEST | | +| -----: | ------------ | -------------------- | +| 7C | JUMPDEST | | 7D | PUSH1 0x00 | 0x00 | | 7F | PUSH2 0x009d | 0x9D 0x00 | | 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | | 84 | SLOAD | Storage[3] 0x9D 0x00 | -Questa è un'altra cella di memoria; non riuscivo a trovarla in nessuna transazione quindi è più difficile sapere cosa significhi. Il codice seguente lo chiarirà. +Questa è un'altra cella di archiviazione, una che non sono riuscito a trovare in nessuna transazione, quindi è più difficile sapere cosa significhi. Il codice sottostante lo renderà più chiaro. | Offset | Opcode | Stack | -| ------:| ------------------------------------------------- | ------------------------------- | +| -----: | ------------------------------------------------- | ------------------------------- | | 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | | 9A | AND | Storage[3]-as-address 0x9D 0x00 | -Questi opcode troncano il valore che leggiamo da Storage[3] a 160 bit, la lunghezza di un indirizzo di Ethereum. +Questi opcode troncano il valore che leggiamo da Storage[3] a 160 bit, la lunghezza di un indirizzo Ethereum. | Offset | Opcode | Stack | -| ------:| ------ | ------------------------------- | +| -----: | ------ | ------------------------------- | | 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | | 9C | JUMP | Storage[3]-as-address 0x00 | -Questo salto è superfluo, poiché stiamo andando all'opcode successivo. Questo codice non è tanto efficiente a livello di gas, rispetto a quanto potrebbe. +Questo salto è superfluo, poiché stiamo andando all'opcode successivo. Questo codice non è minimamente efficiente in termini di gas quanto potrebbe esserlo. | Offset | Opcode | Stack | -| ------:| ---------- | ------------------------------- | +| -----: | ---------- | ------------------------------- | | 9D | JUMPDEST | Storage[3]-as-address 0x00 | | 9E | SWAP1 | 0x00 Storage[3]-as-address | | 9F | POP | Storage[3]-as-address | | A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address | | A2 | MLOAD | Mem[0x40] Storage[3]-as-address | -All'inizio del codice, impostiamo Mem[0x40] a 0x80. Se cerchiamo 0x40 in seguito, vediamo che non lo cambiamo, quindi supponiamo che sia 0x80. +All'inizio del codice impostiamo Mem[0x40] a 0x80. Se cerchiamo 0x40 in seguito, vediamo che non lo modifichiamo, quindi possiamo presumere che sia 0x80. | Offset | Opcode | Stack | -| ------:| ------------ | ------------------------------------------------- | +| -----: | ------------ | ------------------------------------------------- | | A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address | | A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | | A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | | A7 | CALLDATACOPY | 0x80 Storage[3]-as-address | -Copia tutti i dati della chiamata nella memoria, a partire da 0x80. +Copia tutti i dati di chiamata in memoria, a partire da 0x80. | Offset | Opcode | Stack | -| ------:| ------------- | -------------------------------------------------------------------------------- | +| -----: | ------------- | -------------------------------------------------------------------------------- | | A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address | | AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address | | AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | | AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | | AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | | AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | -| AF | DELEGATE_CALL | | +| AF | DELEGATE_CALL | -Ora le cose sono molto più chiare. Questo contratto può fungere da [proxy](https://blog.openzeppelin.com/proxy-patterns/), chiamando l'indirizzo in Storage[3] per compiere il vero lavoro. `DELEGATE_CALL` chiama un contratto separato, ma resta nella stessa memoria. Questo significa che il contratto delegato, quello per cui siamo un proxy, accede allo stesso spazio d'archiviazione. I parametri per la chiamata sono: +Ora le cose sono molto più chiare. Questo contratto può agire come un [proxy](https://blog.openzeppelin.com/proxy-patterns/), chiamando l'indirizzo in Storage[3] per fare il vero lavoro. `DELEGATE_CALL` chiama un contratto separato, ma rimane nello stesso spazio di archiviazione. Ciò significa che il contratto delegato, quello per cui fungiamo da proxy, accede allo stesso spazio di archiviazione. I parametri per la chiamata sono: - _Gas_: Tutto il gas rimanente - _Indirizzo chiamato_: Storage[3]-as-address -- _dati della chiamata_: i byte CALLDATASIZE che iniziano a 0x80, ovvero dove inseriamo i dati di chiamata originali -- _Dati restituiti_: nessuno (0x00 - 0x00) Otterremo i dati restituiti con altri mezzi (vedi di seguito) +- _Dati di chiamata_: I byte CALLDATASIZE a partire da 0x80, che è dove abbiamo inserito i dati di chiamata originali +- _Dati di ritorno_: Nessuno (0x00 - 0x00) Otterremo i dati di ritorno con altri mezzi (vedi sotto) -| Offset | Opcode | Stack | -| ------:| -------------- | --------------------------------------------------------------------------------------------- | -| B0 | RETURNDATASIZE | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B5 | RETURNDATACOPY | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| Offset | Opcode | Stack | +| -----: | -------------- | ------------------------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | -Qui copiamo tutti i dati restituiti al buffer di memoria partendo a 0x80. +Qui copiamo tutti i dati di ritorno nel buffer di memoria a partire da 0x80. -| Offset | Opcode | Stack | -| ------:| ------------ | ---------------------------------------------------------------------------------------------------------------------------- | -| B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B7 | DUP1 | (((call success/failure))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B8 | ISZERO | (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| B9 | PUSH2 0x00c0 | 0xC0 (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| BC | JUMPI | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| BD | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| BE | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| BF | RETURN | | +| Offset | Opcode | Stack | +| -----: | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B7 | DUP1 | (((successo/fallimento della chiamata))) (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B8 | ISZERO | (((la chiamata è fallita))) (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| B9 | PUSH2 0x00c0 | 0xC0 (((la chiamata è fallita))) (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| BC | JUMPI | (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| BD | DUP2 | RETURNDATASIZE (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| BE | DUP5 | 0x80 RETURNDATASIZE (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| BF | RETURN | | -Quindi, dopo la chiamata, copiamo i dati restituiti al buffer 0x80 - 0x80+RETURNDATASIZE, e se la chiamata è andata a buon fine `RETURN` esattamente con quel buffer. +Quindi, dopo la chiamata, copiamo i dati di ritorno nel buffer 0x80 - 0x80+RETURNDATASIZE e, se la chiamata ha esito positivo, eseguiamo un `RETURN` esattamente con quel buffer. -### DELEGATECALL fallita {#delegatecall-failed} +### DELEGATECALL Fallita {#delegatecall-failed} -Se arriviamo qui, a 0xC0, significa che il contratto che abbiamo chiamato è annullato. Poiché siamo solo un proxy per quel contratto, vogliamo restituire gli stessi dati e annullare a nostra volta. +Se arriviamo qui, a 0xC0, significa che il contratto che abbiamo chiamato è stato annullato. Poiché siamo solo un proxy per quel contratto, vogliamo restituire gli stessi dati e annullare a nostra volta. -| Offset | Opcode | Stack | -| ------:| -------- | ------------------------------------------------------------------------------------------------------------------- | -| C0 | JUMPDEST | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| C1 | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| C2 | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | -| C3 | REVERT | | +| Offset | Opcode | Stack | +| -----: | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| C1 | DUP2 | RETURNDATASIZE (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((successo/fallimento della chiamata))) RETURNDATASIZE (((successo/fallimento della chiamata))) 0x80 Storage[3]-as-address | +| C3 | REVERT | -Quindi noi `REVERT` con lo stesso buffer usato prima per `RETURN`: 0x80 - 0x80+RETURNDATASIZE +Quindi eseguiamo un `REVERT` con lo stesso buffer che abbiamo usato per il `RETURN` in precedenza: 0x80 - 0x80+RETURNDATASIZE -![Chiamata al diagramma di flusso del proxy](flowchart-proxy.png) +![Diagramma di flusso della chiamata al proxy](flowchart-proxy.png) ## Chiamate ABI {#abi-calls} -Se la dimensione dei dati della chiamata è di quattro byte o superiore, potrebbe essere una chiamata ABI valida. +Se la dimensione dei dati di chiamata è di quattro byte o più, questa potrebbe essere una chiamata ABI valida. -| Offset | Opcode | Stack | -| ------:| ------------ | ------------------------------------------------- | -| D | PUSH1 0x00 | 0x00 | -| F | CALLDATALOAD | (((First word (256 bits) of the call data))) | -| 10 | PUSH1 0xe0 | 0xE0 (((First word (256 bits) of the call data))) | -| 12 | SHR | (((first 32 bits (4 bytes) of the call data))) | - -Etherscan ci dice che `1C` è un opcode sconosciuto, perché [è stato aggiunto dopo che Etherscan aveva scritto questa funzionalità](https://eips.ethereum.org/EIPS/eip-145) e non l'ha aggiornata. Una [tabella degli opcode aggiornata](https://github.com/wolflo/evm-opcodes) ci indica che questo è lo spostamento a destra - -| Offset | Opcode | Stack | -| ------:| ---------------- | -------------------------------------------------------------------------------------------------------- | -| 13 | DUP1 | (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | -| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | -| 19 | GT | 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | -| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | -| 1D | JUMPI | (((first 32 bits (4 bytes) of the call data))) | - -Dividere le prove di corrispondenza della firma del metodo in due, in questo modo, permette di risparmiare in media metà delle prove. Il codice che segue immediatamente questo e il codice in 0x43 seguono lo stesso schema: `DUP1` i primi 32 bit dei dati della chiamata, `PUSH4 (((method signature>`, esegui `EQ` per verificare l'uguaglianza e poi `JUMPI` se la firma del metodo corrisponde. Ecco le firme del metodo, i loro indirizzi e, se nota, [la definizione del metodo corrispondente](https://www.4byte.directory/): - -| Metodo | Firma del metodo | Offset a cui saltare | -| -------------------------------------------------------------------------------------- | ---------------- | -------------------- | -| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | -| ??? | 0x81e580d3 | 0x0138 | -| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | -| ??? | 0x1f135823 | 0x00C4 | -| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | - -Se non è trovata alcuna corrispondenza, il codice salta al [gestore del proxy a 0x7C](#the-handler-at-0x7c), nella speranza che il contratto per cui siamo un proxy abbia una corrispondenza. +| Offset | Opcode | Stack | +| -----: | ------------ | ------------------------------------------------------------------ | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((Prima parola (256 bit) dei dati di chiamata))) | +| 10 | PUSH1 0xe0 | 0xE0 (((Prima parola (256 bit) dei dati di chiamata))) | +| 12 | SHR | (((primi 32 bit (4 byte) dei dati di chiamata))) | + +Etherscan ci dice che `1C` è un opcode sconosciuto, perché [è stato aggiunto dopo che Etherscan ha scritto questa funzionalità](https://eips.ethereum.org/EIPS/eip-145) e non l'hanno aggiornata. Una [tabella degli opcode aggiornata](https://github.com/wolflo/evm-opcodes) ci mostra che si tratta di uno scorrimento a destra (shift right) + +| Offset | Opcode | Stack | +| -----: | ---------------- | ---------------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((primi 32 bit (4 byte) dei dati di chiamata))) (((primi 32 bit (4 byte) dei dati di chiamata))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((primi 32 bit (4 byte) dei dati di chiamata))) (((primi 32 bit (4 byte) dei dati di chiamata))) | +| 19 | GT | 0x3CD8045E>primi-32-bit-dei-dati-di-chiamata (((primi 32 bit (4 byte) dei dati di chiamata))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>primi-32-bit-dei-dati-di-chiamata (((primi 32 bit (4 byte) dei dati di chiamata))) | +| 1D | JUMPI | (((primi 32 bit (4 byte) dei dati di chiamata))) | + +Dividere i test di corrispondenza della firma del metodo in due in questo modo fa risparmiare in media metà dei test. Il codice che segue immediatamente questo e il codice in `0x43` seguono lo stesso schema: `DUP1` dei primi 32 bit dei dati di chiamata, `PUSH4 (((firma del metodo>`, esecuzione di `EQ` per verificare l'uguaglianza, e poi `JUMPI` se la firma del metodo corrisponde. Ecco le firme dei metodi, i loro indirizzi e, se nota, [la definizione del metodo corrispondente](https://www.4byte.directory/): + +| Metodo | Firma del metodo | Offset in cui saltare | +| -------------------------------------------------------------------------------------- | ---------------- | --------------------- | +| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | +| ??? | 0x81e580d3 | 0x0138 | +| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | +| ??? | 0x1f135823 | 0x00C4 | +| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | + +Se non viene trovata alcuna corrispondenza, il codice salta al [gestore del proxy a 0x7C](#the-handler-at-0x7c), nella speranza che il contratto di cui siamo un proxy abbia una corrispondenza. ![Diagramma di flusso delle chiamate ABI](flowchart-abi.png) ## splitter() {#splitter} | Offset | Opcode | Stack | -| ------:| ------------ | ----------------------------- | -| 103 | JUMPDEST | | +| -----: | ------------ | ----------------------------- | +| 103 | JUMPDEST | | 104 | CALLVALUE | CALLVALUE | | 105 | DUP1 | CALLVALUE CALLVALUE | | 106 | ISZERO | CALLVALUE==0 CALLVALUE | @@ -313,40 +310,40 @@ Se non è trovata alcuna corrispondenza, il codice salta al [gestore del proxy a | 10A | JUMPI | CALLVALUE | | 10B | PUSH1 0x00 | 0x00 CALLVALUE | | 10D | DUP1 | 0x00 0x00 CALLVALUE | -| 10E | REVERT | | +| 10E | REVERT | -La prima cosa che fa questa funzione è controllare che la chiamata non abbia inviato alcun ETH. Questa funzione non è [`pagabile`](https://solidity-by-example.org/payable/). Se qualcuno ci ha invitato degli ETH, deve trattarsi di un errore e vogliamo `REVERT` (RIPRISTINARE) per evitare che tali ETH finiscano per essere irrecuperabili. +La prima cosa che fa questa funzione è controllare che la chiamata non abbia inviato alcun ETH. Questa funzione non è [`payable`](https://solidity-by-example.org/payable/). Se qualcuno ci ha inviato degli ETH deve trattarsi di un errore e vogliamo eseguire un `REVERT` per evitare di avere quegli ETH dove non possono essere recuperati. | Offset | Opcode | Stack | -| ------:| ------------------------------------------------- | --------------------------------------------------------------------------- | -| 10F | JUMPDEST | | -| 110 | POP | | +| -----: | ------------------------------------------------- | --------------------------------------------------------------------------- | +| 10F | JUMPDEST | +| 110 | POP | | 111 | PUSH1 0x03 | 0x03 | -| 113 | SLOAD | (((Storage[3] a.k.a the contract for which we are a proxy))) | -| 114 | PUSH1 0x40 | 0x40 (((Storage[3] a.k.a the contract for which we are a proxy))) | -| 116 | MLOAD | 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | -| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | -| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] a.k.a the contract for which we are a proxy))) | -| 12D | SWAP2 | (((Storage[3] a.k.a the contract for which we are a proxy))) 0xFF...FF 0x80 | +| 113 | SLOAD | (((Storage[3] alias il contratto per cui siamo un proxy))) | +| 114 | PUSH1 0x40 | 0x40 (((Storage[3] alias il contratto per cui siamo un proxy))) | +| 116 | MLOAD | 0x80 (((Storage[3] alias il contratto per cui siamo un proxy))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] alias il contratto per cui siamo un proxy))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] alias il contratto per cui siamo un proxy))) | +| 12D | SWAP2 | (((Storage[3] alias il contratto per cui siamo un proxy))) 0xFF...FF 0x80 | | 12E | AND | ProxyAddr 0x80 | | 12F | DUP2 | 0x80 ProxyAddr 0x80 | | 130 | MSTORE | 0x80 | -E ora 0x80 contiene l'indirizzo del proxy +E 0x80 ora contiene l'indirizzo del proxy | Offset | Opcode | Stack | -| ------:| ------------ | --------- | +| -----: | ------------ | --------- | | 131 | PUSH1 0x20 | 0x20 0x80 | | 133 | ADD | 0xA0 | | 134 | PUSH2 0x00e4 | 0xE4 0xA0 | | 137 | JUMP | 0xA0 | -### Il Codice E4 {#the-e4-code} +### Il codice E4 {#the-e4-code} -Questa è la prima volta che vediamo queste righe, ma sono condivise con altri metodi (vedi di seguito). Quindi chiameremo il valore nello stack X e ricorderemo semplicemente che in `splitter()` il valore di questa X è 0xA0. +Questa è la prima volta che vediamo queste righe, ma sono condivise con altri metodi (vedi sotto). Quindi chiameremo il valore nello stack X, e ricorderemo semplicemente che in `splitter()` il valore di questa X è 0xA0. | Offset | Opcode | Stack | -| ------:| ---------- | ----------- | +| -----: | ---------- | ----------- | | E4 | JUMPDEST | X | | E5 | PUSH1 0x40 | 0x40 X | | E7 | MLOAD | 0x80 X | @@ -354,20 +351,20 @@ Questa è la prima volta che vediamo queste righe, ma sono condivise con altri m | E9 | SWAP2 | X 0x80 0x80 | | EA | SUB | X-0x80 0x80 | | EB | SWAP1 | 0x80 X-0x80 | -| EC | RETURN | | +| EC | RETURN | -Quindi questo codice riceve un puntatore di memoria nello stack (X) e fa sì che il contratto dia `RETURN` con un buffer che sia 0x80 - X. +Quindi questo codice riceve un puntatore di memoria nello stack (X) e fa in modo che il contratto esegua un `RETURN` con un buffer che è 0x80 - X. -Nel caso di `splitter()`, ciò restituisce l'indirizzo per cui siamo un proxy. `RETURN` restituisce il buffer in 0x80-0x9F, ovvero dove abbiamo scritto questi dati (offset 0x130 sopra). +Nel caso di `splitter()`, questo restituisce l'indirizzo per cui siamo un proxy. `RETURN` restituisce il buffer in 0x80-0x9F, che è dove abbiamo scritto questi dati (offset 0x130 sopra). ## currentWindow() {#currentwindow} -Il codice negli offset 0x158-0x163 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (diverso dalla destinazione `JUMPI`), quindi sappiamo che neanche `currentWindow()` è `pagabile`. +Il codice negli offset 0x158-0x163 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (a parte la destinazione `JUMPI`), quindi sappiamo che anche `currentWindow()` non è `payable`. | Offset | Opcode | Stack | -| ------:| ------------ | -------------------- | -| 164 | JUMPDEST | | -| 165 | POP | | +| -----: | ------------ | -------------------- | +| 164 | JUMPDEST | +| 165 | POP | | 166 | PUSH2 0x00da | 0xDA | | 169 | PUSH1 0x01 | 0x01 0xDA | | 16B | SLOAD | Storage[1] 0xDA | @@ -376,10 +373,10 @@ Il codice negli offset 0x158-0x163 è identico a quello che abbiamo visto in 0x1 ### Il codice DA {#the-da-code} -Questo codice è condiviso anche con altri metodi. Quindi chiameremo il valore nello stack Y e ricorderemo semplicemente che in `currentWindow()` il valore di questa Y è Storage[1]. +Questo codice è condiviso anche con altri metodi. Quindi chiameremo il valore nello stack Y, e ricorderemo semplicemente che in `currentWindow()` il valore di questa Y è Storage[1]. | Offset | Opcode | Stack | -| ------:| ---------- | ---------------- | +| -----: | ---------- | ---------------- | | DA | JUMPDEST | Y 0xDA | | DB | PUSH1 0x40 | 0x40 Y 0xDA | | DD | MLOAD | 0x80 Y 0xDA | @@ -387,39 +384,39 @@ Questo codice è condiviso anche con altri metodi. Quindi chiameremo il valore n | DF | DUP2 | 0x80 Y 0x80 0xDA | | E0 | MSTORE | 0x80 0xDA | -Scrivi Y a 0x80-0x9F. +Scrive Y in 0x80-0x9F. | Offset | Opcode | Stack | -| ------:| ---------- | -------------- | +| -----: | ---------- | -------------- | | E1 | PUSH1 0x20 | 0x20 0x80 0xDA | | E3 | ADD | 0xA0 0xDA | -E il resto è già spiegato [sopra](#the-e4-code). Quindi salta a 0xDA, scrive la cima dello stack (Y) a 0x80-0x9F e restituisce quel valore. Nel caso di `currentWindow()`, restituisce Storage[1]. +E il resto è già stato spiegato [sopra](#the-e4-code). Quindi i salti a 0xDA scrivono la cima dello stack (Y) in 0x80-0x9F e restituiscono quel valore. Nel caso di `currentWindow()`, restituisce Storage[1]. ## merkleRoot() {#merkleroot} -Il codice negli offset 0xED-0xF8 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (diverso dalla destinazione `JUMPI`), quindi sappiamo che neanche `merkleRoot()` è `pagabile`. +Il codice negli offset 0xED-0xF8 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (a parte la destinazione `JUMPI`), quindi sappiamo che anche `merkleRoot()` non è `payable`. | Offset | Opcode | Stack | -| ------:| ------------ | -------------------- | -| F9 | JUMPDEST | | -| FA | POP | | +| -----: | ------------ | -------------------- | +| F9 | JUMPDEST | +| FA | POP | | FB | PUSH2 0x00da | 0xDA | | FE | PUSH1 0x00 | 0x00 0xDA | | 100 | SLOAD | Storage[0] 0xDA | | 101 | DUP2 | 0xDA Storage[0] 0xDA | | 102 | JUMP | Storage[0] 0xDA | -Cosa succede dopo il salto, [lo abbiamo già capito](#the-da-code). Quindi `merkleRoot()` restituisce Storage[0]. +Cosa succede dopo il salto [lo abbiamo già capito](#the-da-code). Quindi `merkleRoot()` restituisce Storage[0]. ## 0x81e580d3 {#0x81e580d3} -Il codice negli offset 0x138-0x143 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (diverso dalla destinazione `JUMPI`), quindi sappiamo che neanche questa funzione è `pagabile`. +Il codice negli offset 0x138-0x143 è identico a quello che abbiamo visto in 0x103-0x10E in `splitter()` (a parte la destinazione di `JUMPI`), quindi sappiamo che anche questa funzione non è `payable`. | Offset | Opcode | Stack | -| ------:| ------------ | ------------------------------------------------------------ | -| 144 | JUMPDEST | | -| 145 | POP | | +| -----: | ------------ | ------------------------------------------------------------ | +| 144 | JUMPDEST | +| 145 | POP | | 146 | PUSH2 0x00da | 0xDA | | 149 | PUSH2 0x0153 | 0x0153 0xDA | | 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA | @@ -437,28 +434,28 @@ Il codice negli offset 0x138-0x143 è identico a quello che abbiamo visto in 0x1 | 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -Sembra che questa funzione richieda almeno 32 byte (una parola) di dati della chiamata. +Sembra che questa funzione accetti almeno 32 byte (una word) di dati di chiamata. | Offset | Opcode | Stack | -| ------:| ------ | -------------------------------------------- | +| -----: | ------ | -------------------------------------------- | | 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | -| 19F | REVERT | | +| 19F | REVERT | -Se non ottiene i dati della chiamata, la transazione è annullata senza alcun dato restituito. +Se non riceve i dati di chiamata, la transazione viene annullata senza alcun dato di ritorno. -Vediamo cosa succede se la funzione _ottiene_ i dati della chiamata che necessita. +Vediamo cosa succede se la funzione riceve _effettivamente_ i dati di chiamata di cui ha bisogno. | Offset | Opcode | Stack | -| ------:| ------------ | ---------------------------------------- | +| -----: | ------------ | ---------------------------------------- | | 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | | 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | -`calldataload(4)` è la prima parola della dei dati della chiamata _dopo_ la firma del metodo +`calldataload(4)` è la prima word dei dati di chiamata _dopo_ la firma del metodo | Offset | Opcode | Stack | -| ------:| ------------ | ---------------------------------------------------------------------------- | +| -----: | ------------ | ---------------------------------------------------------------------------- | | 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA | | 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA | | 1A5 | POP | 0x0153 calldataload(4) 0xDA | @@ -476,28 +473,28 @@ Vediamo cosa succede se la funzione _ottiene_ i dati della chiamata che necessit | 176 | PUSH2 0x017e | 0x017EC calldataload(4)\)` e un altro è `isClaimed()`, quindi sembra un contratto airdrop. Invece di analizzare il resto opcode per opcode, possiamo [provare il decompilatore](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), che produce risultati utilizzabili per tre funzioni da questo contratto. La decompilazione degli altri viene lasciato come esercizio per il lettore. +Uno dei metodi rimanenti è `claim()`, e un altro è `isClaimed()`, quindi sembra un contratto di airdrop. Invece di esaminare il resto opcode per opcode, possiamo [provare il decompilatore](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), che produce risultati utilizzabili per tre funzioni di questo contratto. Il reverse engineering delle altre è lasciato come esercizio per il lettore. ### scaleAmountByPercentage {#scaleamountbypercentage} -Questo è ciò che il decompilatore ci restituisce per questa funzione: +Questo è ciò che il decompilatore ci fornisce per questa funzione: ```python def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: @@ -593,15 +590,15 @@ def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: return (_param1 * _param2 / 100 * 10^6) ``` -Il primo `require` testa che i dati della chiamata abbiano, oltre ai quattro byte della firma della funzione, almeno 64 byte. abbastanza per i due parametri. Altrimenti c'è ovviamente qualcosa di sbagliato. +Il primo `require` verifica che i dati della chiamata abbiano, oltre ai quattro byte della firma della funzione, almeno 64 byte, sufficienti per i due parametri. In caso contrario, c'è ovviamente qualcosa di sbagliato. -L'istruzione `if` sembra verificare che `_param1` non sia zero e che `_param1 * _param2` non sia negativo. Probabilmente serve a impedire casi di avvolgimento. +L'istruzione `if` sembra controllare che `_param1` non sia zero e che `_param1 * _param2` non sia negativo. Probabilmente serve a prevenire casi di wrap around (overflow). -Infine, la funzione restituisce un valore in scala. +Infine, la funzione restituisce un valore scalato. ### claim {#claim} -Il codice creato dal decompilatore è complesso, e non tutto è rilevante per noi. Ne salterò una parte per concentrarci sulle righe che ritengo forniscano informazioni utili +Il codice creato dal decompilatore è complesso e non tutto è rilevante per noi. Ne salterò una parte per concentrarmi sulle righe che ritengo forniscano informazioni utili ```python def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable: @@ -615,7 +612,7 @@ def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _pa Qui vediamo due cose importanti: - `_param2`, sebbene sia dichiarato come `uint256`, è in realtà un indirizzo -- `_param1` è la finestra rivendicata, che dev'essere `currentWindow` o precedente. +- `_param1` è la finestra che viene riscattata, che deve essere `currentWindow` o precedente. ```python ... @@ -623,7 +620,7 @@ Qui vediamo due cose importanti: revert with 0, 'Account already claimed the given window' ``` -Quindi ora sappiamo che Storage[5] è un array di finestre e indirizzi, e se l'indirizzo ha rivendicato la ricompensa per quella finestra. +Quindi ora sappiamo che Storage[5] è un array di finestre e indirizzi, e se l'indirizzo ha riscattato la ricompensa per quella finestra. ```python ... @@ -643,7 +640,7 @@ Quindi ora sappiamo che Storage[5] è un array di finestre e indirizzi, e se l'i revert with 0, 'Invalid proof' ``` -Sappiamo che `unknown2eb4a7ab` è in realtà la funzione `merkleRoot()`, quindi sembra che questo codice stia verificando una [prova di Merkle](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5). Ciò significa che `_param4` è una prova di Merkle. +Sappiamo che `unknown2eb4a7ab` è in realtà la funzione `merkleRoot()`, quindi questo codice sembra verificare una [prova di Merkle](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5). Ciò significa che `_param4` è una prova di Merkle. ```python call addr(_param2) with: @@ -651,7 +648,7 @@ Sappiamo che `unknown2eb4a7ab` è in realtà la funzione `merkleRoot()`, quindi gas 30000 wei ``` -Ecco come un contratto trasferisce i propri ETH a un altro indirizzo (contratto o posseduto esternamente). Lo chiama con un valore che è l'importo da trasferire. Quindi sembra che questo sia un airdrop di ETH. +Questo è il modo in cui un contratto trasferisce i propri ETH a un altro indirizzo (contratto o account controllato esternamente). Lo chiama con un valore che è l'importo da trasferire. Quindi sembra che si tratti di un airdrop di ETH. ```python if not return_data.size: @@ -661,22 +658,22 @@ Ecco come un contratto trasferisce i propri ETH a un altro indirizzo (contratto value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei ``` -Le ultime due righe ci dicono che anche Storage[2] è un contratto che chiamiamo. Se [guardiamo la transazione del costruttore](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), vediamo che questo contratto è [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), un contratto Wrapped Ether [il cui codice sorgente è stato caricato in Etherscan](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). +Le ultime due righe ci dicono che anche Storage[2] è un contratto che chiamiamo. Se [guardiamo la transazione del costruttore](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange) vediamo che questo contratto è [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), un contratto Wrapped Ether [il cui codice sorgente è stato caricato su Etherscan](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). -Quindi sembra che i contratti tentino di inviare ETH a `_param2`. Se riescono a farlo, ottimo. Altrimenti, tentano di inviare [WETH](https://weth.io/). Se `_param2` è un conto posseduto esternamente (EOA), allora può sempre ricevere ETH, ma i contratti possono rifiutarsi di ricevere ETH. Tuttavia, WETH è ERC-20 e i contratti non possono rifiutarsi di accettarlo. +Quindi sembra che il contratto tenti di inviare ETH a `_param2`. Se ci riesce, ottimo. Altrimenti, tenta di inviare [WETH](https://weth.tkn.eth.limo/). Se `_param2` è un account controllato esternamente (EOA), allora può sempre ricevere ETH, ma i contratti possono rifiutarsi di ricevere ETH. Tuttavia, WETH è ERC-20 e i contratti non possono rifiutarsi di accettarlo. ```python ... log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) ``` -Alla fine della funzione vediamo che viene generata una voce del registro. [Guarda le voci del registro generate](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) e filtra l'argomento che inizia per `0xdbd5...`. Se [clicchiamo su una delle transazioni che hanno generato tale voce](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), vediamo che sembra indubbiamente una rivendicazione: il conto ha inviato un messaggio al contratto che stiamo decompilando e, in cambio, ha ricevuto degli ETH. +Alla fine della funzione vediamo che viene generata una voce di log. [Guarda le voci di log generate](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) e filtra per l'argomento che inizia con `0xdbd5...`. Se [clicchiamo su una delle transazioni che ha generato tale voce](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274) vediamo che in effetti sembra un riscatto: l'account ha inviato un messaggio al contratto di cui stiamo facendo il reverse engineering e in cambio ha ottenuto ETH. -![Una transazione di rivendicazione](claim-tx.png) +![Una transazione di riscatto](claim-tx.png) ### 1e7df9d3 {#1e7df9d3} -Questa funzione è molto simile alla suddetta [`claim`](#claim). Verifica anche una prova di Merkle, tenta di trasferire ETH al primo e produce lo stesso tipo di voce del registro. +Questa funzione è molto simile a [`claim`](#claim) qui sopra. Controlla anch'essa una prova di Merkle, tenta di trasferire ETH al primo e produce lo stesso tipo di voce di log. ```python def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: @@ -709,7 +706,7 @@ def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: log 0xdbd5389f: addr(_param1), s, bool(ext_call.success) ``` -La differenza principale è che il primo parametro, la finestra per prelevare, non c'è. Invece, c'è un ciclo su tutte le finestre rivendicabili. +La differenza principale è che il primo parametro, la finestra da prelevare, non c'è. Invece, c'è un ciclo su tutte le finestre che potrebbero essere riscattate. ```python idx = 0 @@ -738,8 +735,10 @@ La differenza principale è che il primo parametro, la finestra per prelevare, n continue ``` -Quindi, sembra una variante di `claim` che rivendica tutte le finestre. +Quindi sembra una variante di `claim` che riscatta tutte le finestre. ## Conclusione {#conclusion} -A questo punto dovresti sapere come comprendere i contratti il cui codice sorgente non è disponibile usando gli opcode o (quando funziona) il decompilatore. Come è evidente dalla lunghezza di questo articolo, decompilare un contratto non è banale, ma in un sistema in cui la sicurezza è essenziale, poter verificare che i contratti operino come promesso è un'abilità importante. +A questo punto dovresti sapere come comprendere i contratti il cui codice sorgente non è disponibile, utilizzando gli opcode o (quando funziona) il decompilatore. Come è evidente dalla lunghezza di questo articolo, il reverse engineering di un contratto non è banale, ma in un sistema in cui la sicurezza è essenziale è una competenza importante per poter verificare che i contratti funzionino come promesso. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/it/developers/tutorials/run-node-raspberry-pi/index.md index f09d935c159..b51ce641e5f 100644 --- a/public/content/translations/it/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/it/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,136 +1,132 @@ --- -title: Come trasformare un Raspberry Pi 4 in un nodo eseguendo il flashing della scheda MicroSD -description: Esegui il flashing del Raspberry Pi 4, collega un cavo Ethernet, collega il disco SSD e accendi il dispositivo per trasformare Raspberry Pi 4 in un nodo completo di Ethereum + validatore +title: Esegui un nodo di Ethereum su Raspberry Pi 4 +description: Flasha il tuo Raspberry Pi 4, collega un cavo ethernet, connetti il disco SSD e accendi il dispositivo per trasformare il Raspberry Pi 4 in un nodo completo di Ethereum + validatore author: "EthereumOnArm" -tags: - - "client" - - "livello di esecuzione" - - "livello di consenso" - - "nodi" +tags: ["client", "livello di esecuzione", "livello di consenso", "nodi"] lang: it skill: intermediate -breadcrumb: "Nodo Raspberry Pi" +breadcrumb: Nodo Rasp Pi published: 2022-06-10 -source: Ethereum su ARM +source: Ethereum on ARM sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- **Ethereum on Arm è un'immagine Linux personalizzata che può trasformare un Raspberry Pi in un nodo di Ethereum.** -Per usare Ethereum on Arm per trasformare un Raspberry Pi in un nodo di Ethereum, si consiglia il seguente hardware: +Per utilizzare Ethereum on Arm per trasformare un Raspberry Pi in un nodo di Ethereum, si consiglia il seguente hardware: -- Raspberry 4 (modello B 8 GB), scheda Odroid M1 o Rock 5B (8 GB/16 GB RAM) -- Scheda MicroSD (almeno 16 GB Classe 10) -- SSD da minimo 2 TB, disco USB 3.0 o una SSD con un case USB a SATA. +- Scheda Raspberry 4 (modello B 8GB), Odroid M1 o Rock 5B (8GB/16GB RAM) +- Scheda MicroSD (minimo 16 GB Classe 10) +- Disco SSD USB 3.0 da minimo 2 TB o un SSD con un case da USB a SATA. - Alimentatore - Cavo Ethernet -- Port forwarding (vedi i client per maggiori informazioni) -- Un case con dissipatore di calore e ventola -- Tastiera USB, monitor e cavo HDMI (micro-HDMI) (opzionale) +- Inoltro delle porte (vedi i client per ulteriori informazioni) +- Un case con dissipatore e ventola +- Tastiera USB, monitor e cavo HDMI (micro-HDMI) (Opzionale) -## Perché eseguire Ethereum on ARM? {#why-run-ethereum-on-arm} +## Perché eseguire Ethereum su ARM? {#why-run-ethereum-on-arm} -Le schede ARM sono computer molto convenienti, flessibili e di dimensioni ridotte. Sono una buona scelta per eseguire i nodi di Ethereum perché sono economiche, possono essere configurate in modo che tutte le risorse si concentrino solo sul nodo, il che le rende efficienti, consumano quantità minime di energia e sono fisicamente piccole così da occupare poco spazio in qualsiasi casa. Inoltre è molto facile avviare i nodi perché il flashing della MicroSD del Raspberry Pi può essere eseguito in modo semplice con un'immagine pre-costruita, senza necessità di scaricare o creare software. +Le schede ARM sono computer molto convenienti, flessibili e di piccole dimensioni. Sono ottime scelte per eseguire i nodi di Ethereum perché possono essere acquistate a basso costo, configurate in modo che tutte le loro risorse si concentrino solo sul nodo, rendendole efficienti, consumano basse quantità di energia e sono fisicamente piccole, in modo da potersi adattare in modo discreto in qualsiasi casa. È anche molto facile avviare i nodi perché la MicroSD del Raspberry Pi può essere semplicemente flashata con un'immagine precompilata, senza dover scaricare o compilare alcun software. ## Come funziona? {#how-does-it-work} -Il flashing della scheda di memoria del Raspberry Pi è eseguito con un'immagine pre-costruita che contiene tutto il necessario per eseguire un nodo di Ethereum. Con una scheda su cui è stato eseguito il flashing, tutto ciò che l'utente deve fare è accendere il Raspberry Pi. Tutti i processi necessari per eseguire il nodo sono avviati automaticamente. Questo funziona perché la scheda di memoria contiene un sistema operativo (OS) basato su Linux su cui i processi a livello di sistema sono eseguiti automaticamente, trasformando l'unità in un nodo di Ethereum. +La scheda di memoria del Raspberry Pi viene flashata con un'immagine precompilata. Questa immagine contiene tutto il necessario per eseguire un nodo di Ethereum. Con una scheda flashata, tutto ciò che l'utente deve fare è accendere il Raspberry Pi. Tutti i processi necessari per eseguire il nodo vengono avviati automaticamente. Questo funziona perché la scheda di memoria contiene un sistema operativo (OS) basato su Linux su cui vengono eseguiti automaticamente processi a livello di sistema che trasformano l'unità in un nodo di Ethereum. -Ethereum non è eseguibile usando il popolare OS Linux per Raspberry Pi "Raspbian" poiché questo usa ancora un'architettura a 32 bit che causa agli utenti di Ethereum problemi di memoria, e i client di consenso non supportano i binari a 32 bit. Per superare ciò, il team di Ethereum on Arm è migrato a un OS a 64 bit nativo chiamato "Armbian". +Ethereum non può essere eseguito utilizzando il popolare sistema operativo Linux per Raspberry Pi "Raspbian" perché Raspbian utilizza ancora un'architettura a 32 bit che porta gli utenti di Ethereum a riscontrare problemi di memoria e i client di consenso non supportano i binari a 32 bit. Per superare questo problema, il team di Ethereum on Arm è migrato a un sistema operativo nativo a 64 bit chiamato "Armbian". -**Le immagini comprendono tutti i passaggi necessari**, dalla configurazione dell'ambiente, alla formattazione del disco SSD, dall'installazione ed esecuzione del software Ethereum fino all'avvio della sincronizzazione della blockchain. +**Le immagini si occupano di tutti i passaggi necessari**, dalla configurazione dell'ambiente e la formattazione del disco SSD all'installazione e all'esecuzione del software di Ethereum, nonché all'avvio della sincronizzazione della blockchain. ## Nota sui client di esecuzione e di consenso {#note-on-execution-and-consensus-clients} -L'immagine Ethereum su Arm include l'esecuzione precostruita e client di consenso come servizi. Un nodo Ethereum richiede che entrambi i client siano sincronizzati ed in esecuzione. È necessario solo scaricare e copiare l'immagine e quindi avviare i servizi. L'immagine è precaricata con i seguenti client di esecuzione: +L'immagine di Ethereum on Arm include client di esecuzione e client di consenso precompilati come servizi. Un nodo di Ethereum richiede che entrambi i client siano sincronizzati e in esecuzione. Ti è richiesto solo di scaricare e flashare l'immagine e poi avviare i servizi. L'immagine è precaricata con i seguenti client di esecuzione: - Geth - Nethermind - Besu -e i seguenti clienti di consenso: +e i seguenti client di consenso: - Lighthouse - Nimbus - Prysm - Teku -È necessario scegliere uno di ciascun gruppo da eseguire - tutti i client di esecuzione sono compatibili con tutti i client di consenso. Se non si seleziona esplicitamente un client, il nodo tornerà ai suoi valori predefiniti - Geth e Lighthouse - e li eseguirà automaticamente quando la scheda è accesa. È necessario aprire la porta 30303 sul router in modo che Geth possa trovare e connettersi ai pari. +Dovresti sceglierne uno per ciascun tipo da eseguire: tutti i client di esecuzione sono compatibili con tutti i client di consenso. Se non selezioni esplicitamente un client, il nodo ripiegherà sui suoi predefiniti - Geth e Lighthouse - e li eseguirà automaticamente all'accensione della scheda. Devi aprire la porta 30303 sul tuo router in modo che Geth possa trovare e connettersi ai peer. -## Download immagine {#downloading-the-image} +## Scaricare l'immagine {#downloading-the-image} -L'immagine Raspberry Pi 4 Ethereum è un'immagine "plug and play" che installa e imposta automaticamente sia i client di esecuzione che di consenso, configurarli per farli comunicare tra loro e connettersi alla rete Ethereum. Tutto ciò che l'utente deve fare è avviarne i processi usando un semplice comando. +L'immagine di Ethereum per Raspberry Pi 4 è un'immagine "plug and play" che installa e configura automaticamente sia il client di esecuzione che il client di consenso, configurandoli per comunicare tra loro e connettersi alla rete di Ethereum. Tutto ciò che l'utente deve fare è avviare i loro processi utilizzando un semplice comando. -Scarica l'immagine di Raspberry Pi da [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/ES56R_SuvaVFkiMO1Tgnf6kB7lEbBfla5c2c18E3WQRJzA?download=1) e verifica l'hash SHA256: +Scarica l'immagine per Raspberry Pi da [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) e verifica l'hash SHA256: ```sh -# From directory containing the downloaded image +# Dalla directory contenente l'immagine scaricata shasum -a 256 ethonarm_22.04.00.img.zip -# Hash should output: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f +# L'hash dovrebbe dare come output: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -Nota che le immagini per le schede Rock 5B e Odroid M1 sono disponibili alla [pagina di download](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) di Ethereum-su-Arm. +Nota che le immagini per le schede Rock 5B e Odroid M1 sono disponibili alla [pagina dei download](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) di Ethereum-on-Arm. -## Flashing della MicroSD {#flashing-the-microsd} +## Flashare la MicroSD {#flashing-the-microsd} -La scheda MicroSD che sarà usata per il Raspberry Pi dovrebbe innanzitutto essere inserita in un computer desktop o portatile, così da eseguirne la copia. Poi, i seguenti comandi del terminale eseguiranno la copia dell'immagine scaricata sulla scheda SD: +La scheda MicroSD che verrà utilizzata per il Raspberry Pi dovrebbe prima essere inserita in un computer desktop o laptop in modo che possa essere flashata. Quindi, i seguenti comandi da terminale flasheranno l'immagine scaricata sulla scheda SD: ```shell -# check the MicroSD card name +# controlla il nome della scheda MicroSD sudo fdisk -l >> sdxxx ``` -È davvero importante inserire il nome corretto, perché il prossimo comando include `dd`, che cancella completamente i contenuti esistenti della scheda prima di caricarvi l'immagine. Per continuare, naviga fino alla cartella contenente l'immagine compressa: +È davvero importante inserire il nome corretto perché il comando successivo include `dd` che cancella completamente il contenuto esistente della scheda prima di inserirvi l'immagine. Per continuare, naviga nella directory contenente l'immagine zippata: ```shell -# unzip and flash image +# decomprimi e flasha l'immagine unzip ethonarm_22.04.00.img.zip sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress ``` -Dopo aver eseguito la copia, la scheda può essere inserita nel Raspberry Pi. +La scheda è ora flashata, quindi può essere inserita nel Raspberry Pi. ## Avviare il nodo {#start-the-node} -Con la scheda SD inserita nel Raspberry Pi, connetti il cavo Ethernet e la SSD, poi accendilo. Il sistema operativo si avvierà e avvierà automaticamente l'esecuzione delle attività preconfigurate che trasformeranno il Raspberry Pi in un nodo Ethereum, compresa l'installazione e la creazione del software client. Ciò richiederà probabilmente da 10 a 15 minuti. +Con la scheda SD inserita nel Raspberry Pi, collega il cavo ethernet e l'SSD, quindi accendi l'alimentazione. Il sistema operativo si avvierà e inizierà automaticamente a eseguire le attività preconfigurate che trasformano il Raspberry Pi in un nodo di Ethereum, inclusa l'installazione e la compilazione del software del client. Questo richiederà probabilmente 10-15 minuti. -Una volta che tutto è installato e configurato, accedi al dispositivo tramite una connessione ssh o usando il terminale direttamente se alla scheda sono collegati uno schermo e una tastiera. Usa l'account `ethereum` per accedere, in quanto ha i permessi necessari per avviare il nodo. +Una volta che tutto è installato e configurato, accedi al dispositivo tramite una connessione ssh o utilizzando direttamente il terminale se un monitor e una tastiera sono collegati alla scheda. Usa l'account `ethereum` per accedere, poiché questo ha i permessi necessari per avviare il nodo. ```shell User: ethereum Password: ethereum ``` -Il client di esecuzione predefinito, Geth, verrà avviato automaticamente. È possibile confermarlo controllando i registri utilizzando il seguente comando terminale: +Il client di esecuzione predefinito, Geth, si avvierà automaticamente. Puoi confermarlo controllando i log utilizzando il seguente comando da terminale: ```sh sudo journalctl -u geth -f ``` -Il client di consenso deve essere avviato esplicitamente. Per fare questo, prima aprire la porta 9000 sul router in modo che Lighthouse possa trovare e connettersi ai pari. Quindi abilitare e avviare il servizio lighthouse: +Il client di consenso deve essere avviato esplicitamente. Per farlo, apri prima la porta 9000 sul tuo router in modo che Lighthouse possa trovare e connettersi ai peer. Quindi abilita e avvia il servizio lighthouse: ```sh sudo systemctl enable lighthouse-beacon sudo systemctl start lighthouse-beacon ``` -Controllare il client utilizzando i registri: +Controlla il client utilizzando i log: ```sh sudo journalctl -u lighthouse-beacon ``` -Si noti che il client di consenso si sincronizzerà in pochi minuti perché utilizza la sincronizzazione dei checkpoint. Il client di esecuzione richiederà più tempo, potenzialmente diverse ore, e si avvierà quando il client di consenso avrà già terminato la sincronizzazione (questo perché il client di esecuzione ha bisogno di un obiettivo per la sincronizzazione fornito dal client di consenso). +Nota che il client di consenso si sincronizzerà in pochi minuti perché utilizza la sincronizzazione dei checkpoint. Il client di esecuzione impiegherà più tempo - potenzialmente diverse ore, e non si avvierà finché il client di consenso non avrà già terminato la sincronizzazione (questo perché il client di esecuzione ha bisogno di un bersaglio a cui sincronizzarsi, che il client di consenso sincronizzato fornisce). -Con i servizi Geth e Lighthouse in esecuzione e sincronizzati, il tuo Raspberry Pi è ora un nodo Ethereum! È più comune interagire con la rete Ethereum utilizzando la console Javascript di Geth, che può essere collegata al client Geth sulla porta 8545. È anche possibile inviare comandi formattati come oggetti JSON utilizzando uno strumento di richiesta come Curl. Maggiori informazioni nella [documentazione di Geth](https://geth.ethereum.org/). +Con i servizi Geth e Lighthouse in esecuzione e sincronizzati, il tuo Raspberry Pi è ora un nodo di Ethereum! È molto comune interagire con la rete di Ethereum utilizzando la console Javascript di Geth, che può essere collegata al client Geth sulla porta 8545. È anche possibile inviare comandi formattati come oggetti JSON utilizzando uno strumento di richiesta come Curl. Vedi di più nella [documentazione di Geth](https://geth.ethereum.org/). -Geth è preconfigurato per segnalare le metriche a un pannello Grafana che può essere visualizzato nel browser. Gli utenti più avanzati potrebbero voler utilizzare questa funzione per monitorare lo stato di salute del loro nodo accedendo a `ipaddress:3000` con nome `utente: admin` e `passwd: ethereum`. +Geth è preconfigurato per segnalare le metriche a una dashboard di Grafana che può essere visualizzata nel browser. Gli utenti più avanzati potrebbero voler utilizzare questa funzione per monitorare lo stato di salute del loro nodo navigando su `ipaddress:3000`, passando `user: admin` e `passwd: ethereum`. ## Validatori {#validators} -Un validatore può anche essere aggiunto facoltativamente al client di consenso. Il software validatore consente al nodo di partecipare attivamente al consenso e fornisce alla rete sicurezza criptoeconomica. Per questo lavoro in ETH si viene ricompensati. Per poter eseguire un validatore, devi prima avere accesso a 32 ETH, che devono essere depositati nel contratto di deposito. **Questo è un impegno a lungo termine - non è ancora possibile ritirare questi ETH!**. Questo deposito può essere eseguito seguendo la guida passo-passo sul [Launchpad](https://launchpad.ethereum.org/). Fallo su un computer desktop/portatile, ma non generare chiavi - questo puoi farlo direttamente sul Raspberry Pi. +Un validatore può anche essere aggiunto opzionalmente al client di consenso. Il software del validatore consente al tuo nodo di partecipare attivamente al consenso e fornisce alla rete sicurezza criptoeconomica. Vieni ricompensato per questo lavoro in ETH. Per eseguire un validatore, devi prima avere 32 ETH, che devono essere depositati nel contratto di deposito. Il deposito può essere effettuato seguendo la guida passo-passo sul [Launchpad](https://launchpad.ethereum.org/). Fallo su un computer desktop/laptop, ma non generare le chiavi — questo può essere fatto direttamente sul Raspberry Pi. Apri un terminale sul Raspberry Pi ed esegui il seguente comando per generare le chiavi di deposito: @@ -140,32 +136,35 @@ sudo apt-get install staking-deposit-cli cd && deposit new-mnemonic --num_validators 1 ``` -Mantieni al sicuro la frase mnemonica! Il suddetto comando ha generato due file nel keystore del nodo: le chiavi del validatore e un file dei dati di deposito. I dati di deposito devono essere caricati nel launchpad, quindi devono esser copiati dal Raspberry Pi nel PC/portatile. Questo si può fare usando una connessione ssh o qualsiasi altro metodo copia/incolla. +(Oppure scarica la [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) per eseguirla su una macchina isolata dalla rete (airgapped), ed esegui il comando `deposit new-mnemnonic`) -Una volta che il file dei dati di deposito è disponibile sul computer che esegue il launchpad, può essere selezionato e trascinato sul `+` nella schermata del launchpad. Segui le istruzioni sullo schermo per inviare una transazione al contratto di deposito. +Tieni al sicuro la frase mnemonica! Il comando precedente ha generato due file nel keystore del nodo: le chiavi del validatore e un file dei dati di deposito. I dati di deposito devono essere caricati nel launchpad, quindi devono essere copiati dal Raspberry Pi al computer desktop/laptop. Questo può essere fatto utilizzando una connessione ssh o qualsiasi altro metodo di copia/incolla. -Tornando al Raspberry Pi, può essere avviato un validatore. Ciò richiede l'importazione delle chiavi del validatore, l'impostazione dell'indirizzo per incassare le ricompense e successivamente l'avvio del processo pre-configurato del validatore. Gli esempi seguenti sono per Lighthouse, le istruzioni per gli altri client di consenso sono disponibili nella [documentazione di Ethereum su Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/): +Una volta che il file dei dati di deposito è disponibile sul computer che esegue il launchpad, può essere trascinato e rilasciato sul `+` nella schermata del launchpad. Segui le istruzioni sullo schermo per inviare una transazione al contratto di deposito. + +Tornando al Raspberry Pi, può essere avviato un validatore. Questo richiede l'importazione delle chiavi del validatore, l'impostazione dell'indirizzo per raccogliere le ricompense e quindi l'avvio del processo del validatore preconfigurato. L'esempio seguente è per Lighthouse—le istruzioni per altri client di consenso sono disponibili nei [documenti di Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/): ```shell -# import the validator keys +# importa le chiavi del validatore lighthouse account validator import --directory=/home/ethereum/validator_keys -# set the reward address +# imposta l'indirizzo della ricompensa sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf -# start the validator +# avvia il validatore sudo systemctl start lighthouse-validator ``` -Congratulazioni, hai ora un nodo di Ethereum completo e un validatore in esecuzione su un Raspberry Pi! +Congratulazioni, ora hai un nodo completo di Ethereum e un validatore in esecuzione su un Raspberry Pi! ## Maggiori dettagli {#more-details} -Questa pagina ha fornito una panoramica di come configurare un nodo Geth-Lighthouse e validatore utilizzando Raspberry Pi. Istruzioni più dettagliate sono disponibili sul sito web [Ethereum-su-Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/). +Questa pagina ha fornito una panoramica su come configurare un nodo Geth-Lighthouse e un validatore utilizzando Raspberry Pi. Istruzioni più dettagliate sono disponibili sul [sito web di Ethereum-on-Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/). -## Ogni feedback è benvenuto {#feedback-appreciated} +## Feedback apprezzato {#feedback-appreciated} -Sappiamo che Raspberry Pi ha un'enorme base di utenti che potrebbe avere un impatto molto positivo sulla salute della rete di Ethereum. Sei pregato di approfondire i dettagli in questo tutorial, provare a eseguirlo su altre reti di prova, dare un'occhiata al GitHub di Ethereum su Arm, fornire feedback, creare ticket e richieste di pull e aiutare a far progredire la tecnologia e la documentazione! +Sappiamo che il Raspberry Pi ha un'enorme base di utenti che potrebbe avere un impatto molto positivo sulla salute della rete di Ethereum. +Approfondisci i dettagli in questo tutorial, prova a eseguire sulle reti di test, dai un'occhiata al GitHub di Ethereum on Arm, fornisci feedback, apri issue e pull request e aiuta a far progredire la tecnologia e la documentazione! ## Riferimenti {#references} @@ -183,4 +182,4 @@ Sappiamo che Raspberry Pi ha un'enorme base di utenti che potrebbe avere un impa 12. https://raiden.network 13. https://ipfs.io 14. https://status.im -15. https://vipnode.org +15. https://vipnode.org \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/it/developers/tutorials/scam-token-tricks/index.md new file mode 100644 index 00000000000..545e847bda3 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/scam-token-tricks/index.md @@ -0,0 +1,466 @@ +--- +title: "Alcuni trucchi usati dai token truffa e come rilevarli" +description: In questo tutorial analizziamo un token truffa per vedere alcuni dei trucchi usati dai truffatori, come li implementano e come possiamo rilevarli. +author: Ori Pomerantz +tags: ["truffa", "Solidity", "erc-20", "JavaScript", "TypeScript"] +skill: intermediate +breadcrumb: Trucchi dei token truffa +published: 2023-09-15 +lang: it +--- + +In questo tutorial analizziamo [un token truffa](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) per vedere alcuni dei trucchi usati dai truffatori e come li implementano. Alla fine del tutorial avrai una visione più completa dei contratti dei token ERC-20, delle loro capacità e del perché lo scetticismo è necessario. Successivamente esamineremo gli eventi emessi da quel token truffa e vedremo come possiamo identificare automaticamente che non è legittimo. + +## Token truffa: cosa sono, perché le persone li creano e come evitarli {#scam-tokens} + +Uno degli usi più comuni di Ethereum è la creazione di un token negoziabile da parte di un gruppo, in un certo senso la propria valuta. Tuttavia, ovunque ci siano casi d'uso legittimi che portano valore, ci sono anche criminali che cercano di rubare quel valore per sé stessi. + +Puoi leggere di più su questo argomento [altrove su ethereum.org](/guides/how-to-id-scam-tokens/) dal punto di vista dell'utente. Questo tutorial si concentra sull'analisi di un token truffa per vedere come viene realizzato e come può essere rilevato. + +### Come faccio a sapere che wARB è una truffa? {#warb-scam} + +Il token che analizziamo è [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), che finge di essere equivalente al legittimo [token ARB](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1). + +Il modo più semplice per sapere quale sia il token legittimo è guardare l'organizzazione di origine, [Arbitrum](https://arbitrum.foundation/). Gli indirizzi legittimi sono specificati [nella loro documentazione](https://docs.arbitrum.foundation/deployment-addresses#token). + +### Perché il codice sorgente è disponibile? {#why-source} + +Normalmente ci aspetteremmo che le persone che cercano di truffare gli altri siano reticenti, e in effetti molti token truffa non hanno il loro codice disponibile (ad esempio, [questo](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) e [questo](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code)). + +Tuttavia, i token legittimi di solito pubblicano il loro codice sorgente, quindi per apparire legittimi a volte gli autori dei token truffa fanno lo stesso. [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) è uno di quei token con codice sorgente disponibile, il che rende più facile comprenderlo. + +Sebbene i distributori dei contratti possano scegliere se pubblicare o meno il codice sorgente, _non possono_ pubblicare il codice sorgente sbagliato. L'esploratore di blocchi compila il codice sorgente fornito in modo indipendente e, se non ottiene l'esatto stesso bytecode, rifiuta quel codice sorgente. [Puoi leggere di più al riguardo sul sito di Etherscan](https://etherscan.io/verifyContract). + +## Confronto con i token ERC-20 legittimi {#compare-legit-erc20} + +Confronteremo questo token con i token ERC-20 legittimi. Se non hai familiarità con il modo in cui vengono tipicamente scritti i token ERC-20 legittimi, [consulta questo tutorial](/developers/tutorials/erc20-annotated-code/). + +### Costanti per gli indirizzi privilegiati {#constants-for-privileged-addresses} + +I contratti a volte necessitano di indirizzi privilegiati. I contratti progettati per un uso a lungo termine consentono ad alcuni indirizzi privilegiati di modificare tali indirizzi, ad esempio per abilitare l'uso di un nuovo contratto multifirma. Ci sono diversi modi per farlo. + +Il [contratto del token `HOP`](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) utilizza il pattern [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable). L'indirizzo privilegiato è conservato nell'archiviazione, in un campo chiamato `_owner` (vedi il terzo file, `Ownable.sol`). + +```solidity +abstract contract Ownable is Context { + address private _owner; + . + . + . +} +``` + +Il [contratto del token `ARB`](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) non ha direttamente un indirizzo privilegiato. Tuttavia, non ne ha bisogno. Si trova dietro un [`proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy) all'[indirizzo `0xb50721bcf8d664c30412cfbc6cf7a15145234ad1`](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code). Quel contratto ha un indirizzo privilegiato (vedi il quarto file, `ERC1967Upgrade.sol`) che può essere utilizzato per gli aggiornamenti. + +```solidity + /* * + * @dev Memorizza un nuovo indirizzo nello slot admin EIP1967. */ + + + + function _setAdmin(address newAdmin) private { + require(newAdmin != address(0), "ERC1967: new admin is the zero address"); + StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; + } +``` + +Al contrario, il contratto `wARB` ha un `contract_owner` hardcoded. + +```solidity +contract WrappedArbitrum is Context, IERC20 { + . + . + . + address deployer = 0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1; + address public contract_owner = 0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33; + . + . + . +} +``` + +[Questo proprietario del contratto](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) non è un contratto che potrebbe essere controllato da account diversi in momenti diversi, ma un [account controllato esternamente ](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs). Ciò significa che è probabilmente progettato per un uso a breve termine da parte di un individuo, piuttosto che come soluzione a lungo termine per controllare un ERC-20 che manterrà il suo valore. + +E in effetti, se guardiamo su Etherscan vediamo che il truffatore ha utilizzato questo contratto solo per 12 ore (dalla [prima transazione](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) all'[ultima transazione](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b)) durante il 19 maggio 2023. + +### La finta funzione `_transfer` {#the-fake-transfer-function} + +È standard che i trasferimenti effettivi avvengano utilizzando [una funzione interna `_transfer`](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer). + +In `wARB` questa funzione sembra quasi legittima: + +```solidity + function _transfer(address sender, address recipient, uint256 amount) internal virtual{ + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +La parte sospetta è: + +```solidity + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); +``` + +Se il proprietario del contratto invia token, perché l'evento `Transfer` mostra che provengono dal `deployer`? + +Tuttavia, c'è un problema più importante. Chi chiama questa funzione `_transfer`? Non può essere chiamata dall'esterno, è contrassegnata come `internal`. E il codice che abbiamo non include alcuna chiamata a `_transfer`. Chiaramente, è qui come esca. + +```solidity + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { + _f_(_msgSender(), recipient, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { + _f_(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +Quando guardiamo le funzioni che vengono chiamate per trasferire i token, `transfer` e `transferFrom`, vediamo che chiamano una funzione completamente diversa, `_f_`. + +### La vera funzione `_f_` {#the-real-f-function} + +```solidity + function _f_(address sender, address recipient, uint256 amount) internal _mod_(sender,recipient,amount) virtual { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +Ci sono due potenziali campanelli d'allarme in questa funzione. + +- L'uso del [modificatore di funzione](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`. Tuttavia, quando esaminiamo il codice sorgente vediamo che `_mod_` è in realtà innocuo. + + ```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } +``` + +- Lo stesso problema che abbiamo visto in `_transfer`, ovvero quando il `contract_owner` invia token, questi sembrano provenire dal `deployer`. + +### La finta funzione di eventi `dropNewTokens` {#the-fake-events-function-dropNewTokens} + +Ora arriviamo a qualcosa che sembra una vera e propria truffa. Ho modificato un po' la funzione per renderla più leggibile, ma è funzionalmente equivalente. + +```solidity +function dropNewTokens(address uPool, + address[] memory eReceiver, + uint256[] memory eAmounts) public auth() +``` + +Questa funzione ha il modificatore `auth()`, il che significa che può essere chiamata solo dal proprietario del contratto. + +```solidity +modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; +} +``` + +Questa restrizione ha perfettamente senso, perché non vorremmo che account casuali distribuissero token. Tuttavia, il resto della funzione è sospetto. + +```solidity +{ + for (uint256 i = 0; i < eReceiver.length; i++) { + emit Transfer(uPool, eReceiver[i], eAmounts[i]); + } +} +``` + +Una funzione per trasferire da un account pool a un array di destinatari un array di importi ha perfettamente senso. Ci sono molti casi d'uso in cui si desidera distribuire token da una singola fonte a più destinazioni, come buste paga, airdrop, ecc. È più economico (in termini di gas) farlo in una singola transazione invece di emettere più transazioni, o persino chiamare l'ERC-20 più volte da un contratto diverso come parte della stessa transazione. + +Tuttavia, `dropNewTokens` non fa questo. Emette [eventi `Transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer-1), ma in realtà non trasferisce alcun token. Non c'è alcun motivo legittimo per confondere le applicazioni fuori catena comunicando loro un trasferimento che non è realmente avvenuto. + +### La funzione `Approve` che brucia i token {#the-burning-approve-function} + +I contratti ERC-20 dovrebbero avere [una funzione `approve`](/developers/tutorials/erc20-annotated-code/#approve) per le indennità, e in effetti il nostro token truffa ha una tale funzione, ed è persino corretta. Tuttavia, poiché Solidity deriva dal C, fa distinzione tra maiuscole e minuscole. "Approve" e "approve" sono stringhe diverse. + +Inoltre, la funzionalità non è correlata ad `approve`. + +```solidity + function Approve( + address[] memory holders) +``` + +Questa funzione viene chiamata con un array di indirizzi per i detentori del token. + +```solidity + public approver() { +``` + +Il modificatore `approver()` si assicura che solo il `contract_owner` sia autorizzato a chiamare questa funzione (vedi sotto). + +```solidity + for (uint256 i = 0; i < holders.length; i++) { + uint256 amount = _balances[holders[i]]; + _beforeTokenTransfer(holders[i], 0x0000000000000000000000000000000000000001, amount); + _balances[holders[i]] = _balances[holders[i]].sub(amount, + "ERC20: burn amount exceeds balance"); + _balances[0x0000000000000000000000000000000000000001] = + _balances[0x0000000000000000000000000000000000000001].add(amount); + } + } + +``` + +Per ogni indirizzo del detentore, la funzione sposta l'intero saldo del detentore all'indirizzo `0x00...01`, di fatto bruciandolo (il vero `burn` nello standard modifica anche l'offerta totale e trasferisce i token a `0x00...00`). Ciò significa che il `contract_owner` può rimuovere gli asset di qualsiasi utente. Non sembra una funzionalità che vorresti in un token di governance. + +### Problemi di qualità del codice {#code-quality-issues} + +Questi problemi di qualità del codice non _provano_ che questo codice sia una truffa, ma lo fanno apparire sospetto. Le aziende organizzate come Arbitrum di solito non rilasciano codice così scadente. + +#### La funzione `mount` {#the-mount-function} + +Sebbene non sia specificato nello [standard](https://eips.ethereum.org/EIPS/eip-20), in generale la funzione che crea nuovi token è chiamata [`mint`](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) (coniare). + +Se guardiamo nel costruttore di `wARB`, vediamo che la funzione di conio è stata rinominata in `mount` per qualche motivo, e viene chiamata cinque volte con un quinto dell'offerta iniziale, invece di una volta per l'intero importo per efficienza. + +```solidity + constructor () public { + + _name = "Wrapped Arbitrum"; + _symbol = "wARB"; + _decimals = 18; + uint256 initialSupply = 1000000000000; + + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + } +``` + +Anche la funzione `mount` stessa è sospetta. + +```solidity + function mount(address account, uint256 amount) public { + require(msg.sender == contract_owner, "ERC20: mint to the zero address"); +``` + +Guardando il `require`, vediamo che solo il proprietario del contratto è autorizzato a coniare. Questo è legittimo. Ma il messaggio di errore dovrebbe essere _only owner is allowed to mint_ (solo il proprietario è autorizzato a coniare) o qualcosa del genere. Invece, è l'irrilevante _ERC20: mint to the zero address_ (ERC20: conio all'indirizzo zero). Il test corretto per il conio all'indirizzo zero è `require(account != address(0), "")`, che il contratto non si preoccupa mai di controllare. + +```solidity + _totalSupply = _totalSupply.add(amount); + _balances[contract_owner] = _balances[contract_owner].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +Ci sono altri due fatti sospetti, direttamente correlati al conio: + +- C'è un parametro `account`, che presumibilmente è l'account che dovrebbe ricevere l'importo coniato. Ma il saldo che aumenta è in realtà quello del `contract_owner`. + +- Sebbene il saldo aumentato appartenga al `contract_owner`, l'evento emesso mostra un trasferimento all'`account`. + +### Perché sia `auth` che `approver`? Perché il `mod` che non fa nulla? {#why-both-autho-and-approver-why-the-mod-that-does-nothing} + +Questo contratto contiene tre modificatori: `_mod_`, `auth` e `approver`. + +```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } +``` + +`_mod_` accetta tre parametri e non fa nulla con essi. Perché averlo? + +```solidity + modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } + + modifier approver() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } +``` + +`auth` e `approver` hanno più senso, perché controllano che il contratto sia stato chiamato dal `contract_owner`. Ci aspetteremmo che certe azioni privilegiate, come il conio, siano limitate a quell'account. Tuttavia, qual è lo scopo di avere due funzioni separate che fanno _esattamente la stessa cosa_? + +## Cosa possiamo rilevare automaticamente? {#what-can-we-detect-automatically} + +Possiamo vedere che `wARB` è un token truffa guardando su Etherscan. Tuttavia, questa è una soluzione centralizzata. In teoria, Etherscan potrebbe essere sovvertito o hackerato. È meglio essere in grado di capire in modo indipendente se un token è legittimo o meno. + +Ci sono alcuni trucchi che possiamo usare per identificare che un token ERC-20 è sospetto (che sia una truffa o scritto molto male), guardando gli eventi che emettono. + +## Eventi `Approval` sospetti {#suspicious-approval-events} + +Gli [eventi `Approval`](https://eips.ethereum.org/EIPS/eip-20#approval) dovrebbero verificarsi solo con una richiesta diretta (a differenza degli [eventi `Transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer-1) che possono verificarsi come risultato di un'indennità). [Consulta la documentazione di Solidity](https://docs.soliditylang.org/en/v0.8.20/security-considerations.html#tx-origin) per una spiegazione dettagliata di questo problema e del perché le richieste debbano essere dirette, piuttosto che mediate da un contratto. + +Ciò significa che gli eventi `Approval` che approvano la spesa da un [account controllato esternamente ](/developers/docs/accounts/#types-of-account) devono provenire da transazioni che hanno origine in quell'account e la cui destinazione è il contratto ERC-20. Qualsiasi altro tipo di approvazione da un account controllato esternamente è sospetto. + +Ecco [un programma che identifica questo tipo di evento](https://github.com/qbzzt/20230915-scam-token-detection), utilizzando [viem](https://viem.sh/) e [TypeScript](https://www.typescriptlang.org/docs/), una variante di JavaScript con sicurezza dei tipi. Per eseguirlo: + +1. Copia `.env.example` in `.env`. +2. Modifica `.env` per fornire l'URL a un nodo della rete principale di Ethereum. +3. Esegui `pnpm install` per installare i pacchetti necessari. +4. Esegui `pnpm susApproval` per cercare approvazioni sospette. + +Ecco una spiegazione riga per riga: + +```typescript +import { + Address, + TransactionReceipt, + createPublicClient, + http, + parseAbiItem, +} from "viem" +import { mainnet } from "viem/chains" +``` + +Importa le definizioni dei tipi, le funzioni e la definizione della catena da `viem`. + +```typescript +import { config } from "dotenv" +config() +``` + +Leggi `.env` per ottenere l'URL. + +```typescript +const client = createPublicClient({ + chain: mainnet, + transport: http(process.env.URL), +}) +``` + +Crea un client Viem. Dobbiamo solo leggere dalla blockchain, quindi questo client non ha bisogno di una chiave privata. + +```typescript +const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82" +const fromBlock = 16859812n +const toBlock = 16873372n +``` + +L'indirizzo del contratto ERC-20 sospetto e i blocchi all'interno dei quali cercheremo gli eventi. I fornitori di nodi in genere limitano la nostra capacità di leggere gli eventi perché la larghezza di banda può diventare costosa. Fortunatamente `wARB` non è stato in uso per un periodo di diciotto ore, quindi possiamo cercare tutti gli eventi (ce n'erano solo 13 in totale). + +```typescript +const approvalEvents = await client.getLogs({ + address: testedAddress, + fromBlock, + toBlock, + event: parseAbiItem( + "event Approval(address indexed _owner, address indexed _spender, uint256 _value)" + ), +}) +``` + +Questo è il modo per chiedere a Viem informazioni sugli eventi. Quando gli forniamo l'esatta firma dell'evento, inclusi i nomi dei campi, analizza l'evento per noi. + +```typescript +const isContract = async (addr: Address): boolean => + await client.getBytecode({ address: addr }) +``` + +Il nostro algoritmo è applicabile solo agli account controllati esternamente. Se c'è del bytecode restituito da `client.getBytecode` significa che si tratta di un contratto e dovremmo semplicemente saltarlo. + +Se non hai mai usato TypeScript prima, la definizione della funzione potrebbe sembrare un po' strana. Non gli diciamo solo che il primo (e unico) parametro si chiama `addr`, ma anche che è di tipo `Address`. Allo stesso modo, la parte `: boolean` dice a TypeScript che il valore di ritorno della funzione è un booleano. + +```typescript +const getEventTxn = async (ev: Event): TransactionReceipt => + await client.getTransactionReceipt({ hash: ev.transactionHash }) +``` + +Questa funzione ottiene la ricevuta della transazione da un evento. Abbiamo bisogno della ricevuta per assicurarci di sapere quale fosse la destinazione della transazione. + +```typescript +const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => { +``` + +Questa è la funzione più importante, quella che decide effettivamente se un evento è sospetto o meno. Il tipo di ritorno, `(Event | null)`, dice a TypeScript che questa funzione può restituire un `Event` o `null`. Restituiamo `null` se l'evento non è sospetto. + +```typescript +const owner = ev.args._owner +``` + +Viem ha i nomi dei campi, quindi ha analizzato l'evento per noi. `_owner` è il proprietario dei token da spendere. + +```typescript +// Le approvazioni da parte dei contratti non sono sospette +if (await isContract(owner)) return null +``` + +Se il proprietario è un contratto, supponiamo che questa approvazione non sia sospetta. Per verificare se l'approvazione di un contratto è sospetta o meno, dovremo tracciare l'intera esecuzione della transazione per vedere se è mai arrivata al contratto proprietario e se quel contratto ha chiamato direttamente il contratto ERC-20. Questo è molto più dispendioso in termini di risorse di quanto vorremmo fare. + +```typescript +const txn = await getEventTxn(ev) +``` + +Se l'approvazione proviene da un account controllato esternamente , ottieni la transazione che l'ha causata. + +```typescript +// L'approvazione è sospetta se proviene da un proprietario EOA che non è il `from` della transazione +if (owner.toLowerCase() != txn.from.toLowerCase()) return ev +``` + +Non possiamo semplicemente controllare l'uguaglianza delle stringhe perché gli indirizzi sono esadecimali, quindi contengono lettere. A volte, ad esempio in `txn.from`, quelle lettere sono tutte minuscole. In altri casi, come `ev.args._owner`, l'indirizzo è in [maiuscolo e minuscolo misto per l'identificazione degli errori](https://eips.ethereum.org/EIPS/eip-55). + +Ma se la transazione non proviene dal proprietario, e quel proprietario è controllato esternamente, allora abbiamo una transazione sospetta. + +```typescript +// È anche sospetta se la destinazione della transazione non è il contratto ERC-20 che stiamo +// indagando +if (txn.to.toLowerCase() != testedAddress) return ev +``` + +Allo stesso modo, se l'indirizzo `to` della transazione, il primo contratto chiamato, non è il contratto ERC-20 sotto indagine, allora è sospetto. + +```typescript + // Se non c'è motivo di sospettare, restituisci null. + return null +} +``` + +Se nessuna delle due condizioni è vera, l'evento `Approval` non è sospetto. + +```typescript +const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev)) +const testResults = (await Promise.all(testPromises)).filter((x) => x != null) + +console.log(testResults) +``` + +[Una funzione `async`](https://www.w3schools.com/js/js_async.asp) restituisce un oggetto `Promise`. Con la sintassi comune, `await x()`, aspettiamo che quella `Promise` venga soddisfatta prima di continuare l'elaborazione. Questo è semplice da programmare e seguire, ma è anche inefficiente. Mentre aspettiamo che la `Promise` per un evento specifico venga soddisfatta, possiamo già iniziare a lavorare sull'evento successivo. + +Qui usiamo [`map`](https://www.w3schools.com/jsref/jsref_map.asp) per creare un array di oggetti `Promise`. Quindi usiamo [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/) per aspettare che tutte quelle promesse vengano risolte. Successivamente usiamo [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp) su quei risultati per rimuovere gli eventi non sospetti. + +### Eventi `Transfer` sospetti {#suspicious-transfer-events} + +Un altro modo possibile per identificare i token truffa è vedere se hanno trasferimenti sospetti. Ad esempio, trasferimenti da account che non hanno così tanti token. Puoi vedere [come implementare questo test](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), ma `wARB` non ha questo problema. + +## Conclusione {#conclusion} + +Il rilevamento automatico delle truffe ERC-20 soffre di [falsi negativi](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error), perché una truffa può utilizzare un contratto di token ERC-20 perfettamente normale che semplicemente non rappresenta nulla di reale. Quindi dovresti sempre tentare di _ottenere l'indirizzo del token da una fonte attendibile_. + +Il rilevamento automatico può aiutare in certi casi, come nei componenti della DeFi, dove ci sono molti token e devono essere gestiti automaticamente. Ma come sempre [caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp), fai le tue ricerche e incoraggia i tuoi utenti a fare lo stesso. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/secret-state/index.md b/public/content/translations/it/developers/tutorials/secret-state/index.md new file mode 100644 index 00000000000..fbf00179f24 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/secret-state/index.md @@ -0,0 +1,732 @@ +--- +title: Utilizzare la conoscenza-zero per uno stato segreto +description: "I giochi on-chain sono limitati perché non possono mantenere alcuna informazione nascosta. Dopo aver letto questo tutorial, il lettore sarà in grado di combinare prove a conoscenza-zero e componenti server per creare giochi verificabili con un componente di stato segreto fuori catena. La tecnica per farlo sarà dimostrata creando un gioco di campo minato." +author: Ori Pomerantz +tags: ["server", "fuori catena", "centralizzato", "conoscenza-zero", "zokrates", "mud", "privacy"] +skill: advanced +breadcrumb: Stato segreto ZK +lang: it +published: 2025-03-15 +--- + +_Non ci sono segreti sulla blockchain_. Tutto ciò che viene pubblicato sulla blockchain è aperto alla lettura di tutti. Questo è necessario, perché la blockchain si basa sul fatto che chiunque possa verificarla. Tuttavia, i giochi spesso si basano su uno stato segreto. Ad esempio, il gioco del [campo minato]() non ha assolutamente senso se si può semplicemente andare su un esploratore di blocchi e vedere la mappa. + +La soluzione più semplice è utilizzare un [componente server](/developers/tutorials/server-components/) per mantenere lo stato segreto. Tuttavia, il motivo per cui utilizziamo la blockchain è prevenire i raggiri da parte dello sviluppatore del gioco. Dobbiamo garantire l'onestà del componente server. Il server può fornire un hash dello stato e utilizzare [prove a conoscenza-zero](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) per dimostrare che lo stato utilizzato per calcolare il risultato di una mossa è quello corretto. + +Dopo aver letto questo articolo saprai come creare questo tipo di server che mantiene uno stato segreto, un client per mostrare lo stato e un componente on-chain per la comunicazione tra i due. Gli strumenti principali che utilizzeremo saranno: + +| Strumento | Scopo | Verificato sulla versione | +| --------------------------------------------- | ------------------------------------------------------------------- | ------------------------: | +| [Zokrates](https://zokrates.github.io/) | Prove a conoscenza-zero e la loro verifica | 1.1.9 | +| [Typescript](https://www.typescriptlang.org/) | Linguaggio di programmazione sia per il server che per il client | 5.4.2 | +| [Node](https://nodejs.org/en) | Esecuzione del server | 20.18.2 | +| [Viem](https://viem.sh/) | Comunicazione con la Blockchain | 2.9.20 | +| [MUD](https://mud.dev/) | Gestione dei dati on-chain | 2.0.12 | +| [React](https://react.dev/) | Interfaccia utente del client | 18.2.0 | +| [Vite](https://vitejs.dev/) | Servire il codice del client | 4.2.1 | + +## Esempio del campo minato {#minesweeper} + +[Campo minato]() è un gioco che include una mappa segreta con un campo minato. Il giocatore sceglie di scavare in una posizione specifica. Se quella posizione ha una mina, il gioco finisce. Altrimenti, il giocatore ottiene il numero di mine negli otto quadrati che circondano quella posizione. + +Questa applicazione è scritta utilizzando [MUD](https://mud.dev/), un framework che ci consente di archiviare dati on-chain utilizzando un [database chiave-valore](https://aws.amazon.com/nosql/key-value/) e sincronizzare automaticamente quei dati con componenti fuori catena. Oltre alla sincronizzazione, MUD semplifica la fornitura del controllo degli accessi e consente ad altri utenti di [estendere](https://mud.dev/guides/extending-a-world) la nostra applicazione senza permessi. + +### Eseguire l'esempio del campo minato {#running-minesweeper-example} + +Per eseguire l'esempio del campo minato: + +1. Assicurati di [avere i prerequisiti installati](https://mud.dev/quickstart#prerequisites): [Node](https://mud.dev/quickstart#prerequisites), [Foundry](https://book.getfoundry.sh/getting-started/installation), [`git`](https://git-scm.com/downloads), [`pnpm`](https://git-scm.com/downloads) e [`mprocs`](https://github.com/pvolok/mprocs). + +2. Clona il repository. + + ```sh copy + git clone https://github.com/qbzzt/20240901-secret-state.git +``` + +3. Installa i pacchetti. + + ```sh copy + cd 20240901-secret-state/ + pnpm install + npm install -g mprocs +``` + + Se Foundry è stato installato come parte di `pnpm install`, devi riavviare la shell della riga di comando. + +4. Compila i contratti + + ```sh copy + cd packages/contracts + forge build + cd ../.. +``` + + +5. Avvia il programma (inclusa una blockchain [anvil](https://book.getfoundry.sh/anvil/)) e attendi. + + ```sh copy + mprocs +``` + + Nota che l'avvio richiede molto tempo. Per vedere i progressi, usa prima la freccia giù per scorrere fino alla scheda _contracts_ per vedere i contratti MUD in fase di distribuzione. Quando ricevi il messaggio _Waiting for file changes…_, i contratti sono distribuiti e gli ulteriori progressi avverranno nella scheda _server_. Lì, attendi fino a quando non ricevi il messaggio _Verifier address: 0x...._. + + Se questo passaggio ha esito positivo, vedrai la schermata `mprocs`, con i diversi processi a sinistra e l'output della console per il processo attualmente selezionato a destra. + + ![La schermata mprocs](./mprocs.png) + + Se c'è un problema con `mprocs`, puoi eseguire i quattro processi manualmente, ciascuno nella propria finestra della riga di comando: + + - **Anvil** + + ```sh + cd packages/contracts + anvil --base-fee 0 --block-time 2 +``` + + - **Contratti** + + ```sh + cd packages/contracts + pnpm mud dev-contracts --rpc http://127.0.0.1:8545 +``` + + - **Server** + + ```sh + cd packages/server + pnpm start +``` + + - **Client** + + ```sh + cd packages/client + pnpm run dev +``` + +6. Ora puoi navigare verso [il client](http://localhost:3000), cliccare su **New Game** e iniziare a giocare. + +### Tabelle {#tables} + +Abbiamo bisogno di [diverse tabelle](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) on-chain. + +- `Configuration`: Questa tabella è un singleton, non ha chiavi e ha un singolo record. È utilizzata per mantenere le informazioni di configurazione del gioco: + - `height`: L'altezza di un campo minato + - `width`: La larghezza di un campo minato + - `numberOfBombs`: Il numero di bombe in ogni campo minato +- `VerifierAddress`: Anche questa tabella è un singleton. È utilizzata per mantenere una parte della configurazione, l'indirizzo del contratto verificatore (`verifier`). Avremmo potuto inserire queste informazioni nella tabella `Configuration`, ma vengono impostate da un componente diverso, il server, quindi è più semplice inserirle in una tabella separata. + +- `PlayerGame`: La chiave è l'indirizzo del giocatore. I dati sono: + + - `gameId`: valore di 32 byte che è l'hash della mappa su cui il giocatore sta giocando (l'identificatore del gioco). + - `win`: un booleano che indica se il giocatore ha vinto la partita. + - `lose`: un booleano che indica se il giocatore ha perso la partita. + - `digNumber`: il numero di scavi riusciti nel gioco. + +- `GamePlayer`: Questa tabella mantiene la mappatura inversa, da `gameId` all'indirizzo del giocatore. + +- `Map`: La chiave è una tupla di tre valori: + + - `gameId`: valore di 32 byte che è l'hash della mappa su cui il giocatore sta giocando (l'identificatore del gioco). + - coordinata `x` + - coordinata `y` + + Il valore è un singolo numero. È 255 se è stata rilevata una bomba. Altrimenti, è il numero di bombe attorno a quella posizione più uno. Non possiamo semplicemente usare il numero di bombe, perché per impostazione predefinita tutta l'archiviazione nell'EVM e tutti i valori delle righe in MUD sono zero. Dobbiamo distinguere tra "il giocatore non ha ancora scavato qui" e "il giocatore ha scavato qui e ha scoperto che ci sono zero bombe intorno". + +Inoltre, la comunicazione tra il client e il server avviene tramite il componente on-chain. Anche questo è implementato utilizzando le tabelle. + +- `PendingGame`: Richieste non servite per iniziare una nuova partita. +- `PendingDig`: Richieste non servite per scavare in un luogo specifico in una partita specifica. Questa è una [tabella fuori catena](https://mud.dev/store/tables#types-of-tables), il che significa che non viene scritta nell'archiviazione dell'EVM, è leggibile solo fuori catena utilizzando gli eventi. + +### Flussi di esecuzione e dati {#execution-data-flows} + +Questi flussi coordinano l'esecuzione tra il client, il componente on-chain e il server. + +#### Inizializzazione {#initialization-flow} + +Quando esegui `mprocs`, si verificano questi passaggi: + +1. [`mprocs`](https://github.com/pvolok/mprocs) esegue quattro componenti: + + - [Anvil](https://book.getfoundry.sh/anvil/), che esegue una blockchain locale + - [Contratti](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts), che compila (se necessario) e distribuisce i contratti per MUD + - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client), che esegue [Vite](https://vitejs.dev/) per servire l'interfaccia utente e il codice del client ai browser web. + - [Server](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server), che esegue le azioni del server + +2. Il pacchetto `contracts` distribuisce i contratti MUD e poi esegue [lo script `PostDeploy.s.sol`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol). Questo script imposta la configurazione. Il codice da github specifica [un campo minato 10x5 con otto mine al suo interno](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23). + +3. [Il server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) inizia [configurando MUD](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6). Tra le altre cose, questo attiva la sincronizzazione dei dati, in modo che una copia delle tabelle rilevanti esista nella memoria del server. + +4. Il server iscrive una funzione da eseguire [quando la tabella `Configuration` cambia](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23). [Questa funzione](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) viene chiamata dopo che `PostDeploy.s.sol` viene eseguito e modifica la tabella. + +5. Quando la funzione di inizializzazione del server ha la configurazione, [chiama `zkFunctions`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35) per inizializzare [la parte a conoscenza-zero del server](#using-zokrates-from-typescript). Questo non può accadere finché non otteniamo la configurazione perché le funzioni a conoscenza-zero devono avere la larghezza e l'altezza del campo minato come costanti. + +6. Dopo che la parte a conoscenza-zero del server è stata inizializzata, il passaggio successivo è [distribuire il contratto di verifica a conoscenza-zero sulla blockchain](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) e impostare l'indirizzo del verificatore in MUD. + +7. Infine, ci iscriviamo agli aggiornamenti in modo da vedere quando un giocatore richiede [di iniziare una nuova partita](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) o di [scavare in una partita esistente](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108). + +#### Nuova partita {#new-game-flow} + +Questo è ciò che accade quando il giocatore richiede una nuova partita. + +1. Se non c'è nessuna partita in corso per questo giocatore, o ce n'è una ma con un gameId pari a zero, il client visualizza un [pulsante per una nuova partita](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175). Quando l'utente preme questo pulsante, [React esegue la funzione `newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96). + +2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) è una chiamata di `System`. In MUD tutte le chiamate vengono instradate attraverso il contratto `World` e nella maggior parte dei casi si chiama `__`. In questo caso, la chiamata è a `app__newGame`, che MUD instrada poi a [`newGame` in `GameSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22). + +3. La funzione on-chain verifica che il giocatore non abbia una partita in corso e, se non ce n'è una, [aggiunge la richiesta alla tabella `PendingGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21). + +4. Il server rileva la modifica in `PendingGame` ed [esegue la funzione iscritta](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71). Questa funzione chiama [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114), che a sua volta chiama [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144). + +5. La prima cosa che fa `createGame` è [creare una mappa casuale con il numero appropriato di mine](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135). Quindi, chiama [`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166) per creare una mappa con bordi vuoti, il che è necessario per Zokrates. Infine, `createGame` chiama [`calculateMapHash`](#calculateMapHash), per ottenere l'hash della mappa, che viene utilizzato come ID della partita. + +6. La funzione `newGame` aggiunge la nuova partita a `gamesInProgress`. + +7. L'ultima cosa che fa il server è chiamare [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43), che è on-chain. Questa funzione si trova in un `System` diverso, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol), per abilitare il controllo degli accessi. Il controllo degli accessi è definito nel [file di configurazione di MUD](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72). + + L'elenco degli accessi consente a un solo indirizzo di chiamare il `System`. Questo limita l'accesso alle funzioni del server a un singolo indirizzo, in modo che nessuno possa impersonare il server. + +8. Il componente on-chain aggiorna le tabelle rilevanti: + + - Crea la partita in `PlayerGame`. + - Imposta la mappatura inversa in `GamePlayer`. + - Rimuove la richiesta da `PendingGame`. + +9. Il server identifica la modifica in `PendingGame`, ma non fa nulla perché [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) è falso. + +10. Sul client [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) è impostato sulla voce `PlayerGame` per l'indirizzo del giocatore. Quando `PlayerGame` cambia, cambia anche `gameRecord`. + +11. Se c'è un valore in `gameRecord` e la partita non è stata vinta o persa, il client [visualizza la mappa](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190). + +#### Scavare {#dig-flow} + +1. Il giocatore [clicca sul pulsante della cella della mappa](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), che chiama [la funzione `dig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36). Questa funzione chiama [`dig` on-chain](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32). + +2. Il componente on-chain [esegue una serie di controlli di integrità](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30) e, se hanno esito positivo, aggiunge la richiesta di scavo a [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31). + +3. Il server [rileva la modifica in `PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73). [Se è valida](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), [chiama il codice a conoscenza-zero](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) (spiegato di seguito) per generare sia il risultato che una prova della sua validità. + +4. [Il server](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) chiama [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) on-chain. + +5. `digResponse` fa due cose. Innanzitutto, controlla [la prova a conoscenza-zero](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61). Quindi, se la prova è corretta, chiama [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) per elaborare effettivamente il risultato. + +6. `processDigResult` controlla se la partita è stata [persa](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) o [vinta](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86) e [aggiorna `Map`, la mappa on-chain](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80). + +7. Il client rileva automaticamente gli aggiornamenti e [aggiorna la mappa visualizzata al giocatore](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190) e, se applicabile, comunica al giocatore se si tratta di una vittoria o di una sconfitta. + +## Utilizzare Zokrates {#using-zokrates} + +Nei flussi spiegati sopra abbiamo saltato le parti a conoscenza-zero, trattandole come una scatola nera. Ora apriamola e vediamo come è scritto quel codice. + +### Eseguire l'hash della mappa {#hashing-map} + +Possiamo usare [questo codice JavaScript](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) per implementare [Poseidon](https://www.poseidon-hash.info), la funzione di hash di Zokrates che utilizziamo. Tuttavia, sebbene questo sarebbe più veloce, sarebbe anche più complicato rispetto al semplice utilizzo della funzione di hash di Zokrates per farlo. Questo è un tutorial, e quindi il codice è ottimizzato per la semplicità, non per le prestazioni. Pertanto, abbiamo bisogno di due diversi programmi Zokrates, uno per calcolare semplicemente l'hash di una mappa (`hash`) e uno per creare effettivamente una prova a conoscenza-zero del risultato dello scavo in una posizione sulla mappa (`dig`). + +### La funzione di hash {#hash-function} + +Questa è la funzione che calcola l'hash di una mappa. Esamineremo questo codice riga per riga. + +``` +import "hashes/poseidon/poseidon.zok" as poseidon; +import "utils/pack/bool/pack128.zok" as pack128; +``` + +Queste due righe importano due funzioni dalla [libreria standard di Zokrates](https://zokrates.github.io/toolbox/stdlib.html). [La prima funzione](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) è un [hash Poseidon](https://www.poseidon-hash.info/). Prende un array di [elementi `field`](https://zokrates.github.io/language/types.html#field) e restituisce un `field`. + +L'elemento field in Zokrates è in genere lungo meno di 256 bit, ma non di molto. Per semplificare il codice, limitiamo la mappa a un massimo di 512 bit ed eseguiamo l'hash di un array di quattro field, e in ogni field utilizziamo solo 128 bit. [La funzione `pack128`](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) trasforma un array di 128 bit in un `field` per questo scopo. + +``` + def hashMap(bool[${width+2}][${height+2}] map) -> field { +``` + +Questa riga inizia la definizione di una funzione. `hashMap` ottiene un singolo parametro chiamato `map`, un array `bool`(eano) bidimensionale. La dimensione della mappa è `width+2` per `height+2` per motivi che sono [spiegati di seguito](#why-map-border). + +Possiamo usare `${width+2}` e `${height+2}` perché i programmi Zokrates sono archiviati in questa applicazione come [stringhe template](https://www.w3schools.com/js/js_string_templates.asp). Il codice tra `${` e `}` viene valutato da JavaScript, e in questo modo il programma può essere utilizzato per diverse dimensioni della mappa. Il parametro della mappa ha un bordo largo una posizione tutto intorno senza alcuna bomba, motivo per cui dobbiamo aggiungere due alla larghezza e all'altezza. + +Il valore di ritorno è un `field` che contiene l'hash. + +``` + bool[512] mut map1d = [false; 512]; +``` + +La mappa è bidimensionale. Tuttavia, la funzione `pack128` non funziona con array bidimensionali. Quindi prima appiattiamo la mappa in un array di 512 byte, usando `map1d`. Per impostazione predefinita le variabili Zokrates sono costanti, ma dobbiamo assegnare valori a questo array in un ciclo, quindi lo definiamo come [`mut`](https://zokrates.github.io/language/variables.html#mutability). + +Dobbiamo inizializzare l'array perché Zokrates non ha `undefined`. L'espressione `[false; 512]` significa [un array di 512 valori `false`](https://zokrates.github.io/language/types.html#declaration-and-initialization). + +``` + u32 mut counter = 0; +``` + +Abbiamo anche bisogno di un contatore per distinguere tra i bit che abbiamo già riempito in `map1d` e quelli che non abbiamo riempito. + +``` + for u32 x in 0..${width+2} { +``` + +Ecco come si dichiara un [ciclo `for`](https://zokrates.github.io/language/control_flow.html#for-loops) in Zokrates. Un ciclo `for` in Zokrates deve avere limiti fissi, perché sebbene sembri un ciclo, il compilatore in realtà lo "srotola". L'espressione `${width+2}` è una costante a tempo di compilazione perché `width` è impostata dal codice TypeScript prima che chiami il compilatore. + +``` + for u32 y in 0..${height+2} { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } +``` + +Per ogni posizione nella mappa, inserisci quel valore nell'array `map1d` e incrementa il contatore. + +``` + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; +``` + +Il `pack128` per creare un array di quattro valori `field` da `map1d`. In Zokrates `array[a..b]` significa la porzione dell'array che inizia in `a` e finisce in `b-1`. + +``` + return poseidon(hashMe); +} +``` + +Usa `poseidon` per convertire questo array in un hash. + +### Il programma di hash {#hash-program} + +Il server deve chiamare direttamente `hashMap` per creare gli identificatori della partita. Tuttavia, Zokrates può chiamare solo la funzione `main` su un programma per iniziare, quindi creiamo un programma con un `main` che chiama la funzione di hash. + +``` +${hashFragment} + +def main(bool[${width+2}][${height+2}] map) -> field { + return hashMap(map); +} +``` + +### Il programma di scavo {#dig-program} + +Questo è il cuore della parte a conoscenza-zero dell'applicazione, dove produciamo le prove che vengono utilizzate per verificare i risultati dello scavo. + +``` +${hashFragment} + +// The number of mines in location (x,y) +def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; +} +``` + +#### Perché il bordo della mappa {#why-map-border} + +Le prove a conoscenza-zero utilizzano [circuiti aritmetici](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785), che non hanno un facile equivalente a un'istruzione `if`. Invece, utilizzano l'equivalente dell'[operatore condizionale](https://en.wikipedia.org/wiki/Ternary_conditional_operator). Se `a` può essere zero o uno, puoi calcolare `if a { b } else { c }` come `ab+(1-a)c`. + +Per questo motivo, un'istruzione `if` in Zokrates valuta sempre entrambi i rami. Ad esempio, se hai questo codice: + +``` +bool[5] arr = [false; 5]; +u32 index=10; +return if index>4 { 0 } else { arr[index] } +``` + +Genererà un errore, perché deve calcolare `arr[10]`, anche se quel valore verrà successivamente moltiplicato per zero. + +Questo è il motivo per cui abbiamo bisogno di un bordo largo una posizione tutto intorno alla mappa. Dobbiamo calcolare il numero totale di mine attorno a una posizione, e questo significa che dobbiamo vedere la posizione una riga sopra e sotto, a sinistra e a destra, della posizione in cui stiamo scavando. Il che significa che quelle posizioni devono esistere nell'array della mappa fornito a Zokrates. + +``` +def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) { +``` + +Per impostazione predefinita, le prove di Zokrates includono i loro input. Non serve a nulla sapere che ci sono cinque mine attorno a un punto a meno che tu non sappia effettivamente quale punto sia (e non puoi semplicemente abbinarlo alla tua richiesta, perché allora il prover potrebbe usare valori diversi e non dirtelo). Tuttavia, dobbiamo mantenere la mappa segreta, pur fornendola a Zokrates. La soluzione è utilizzare un parametro `private`, uno che _non_ viene rivelato dalla prova. + +Questo apre un'altra strada per gli abusi. Il prover potrebbe usare le coordinate corrette, ma creare una mappa con un numero qualsiasi di mine attorno alla posizione, e possibilmente nella posizione stessa. Per prevenire questo abuso, facciamo in modo che la prova a conoscenza-zero includa l'hash della mappa, che è l'identificatore della partita. + +``` + return (hashMap(map), +``` + +Il valore di ritorno qui è una tupla che include l'array dell'hash della mappa e il risultato dello scavo. + +``` + if map2mineCount(map, x, y) > 0 { 0xFF } else { +``` + +Usiamo 255 come valore speciale nel caso in cui la posizione stessa abbia una bomba. + +``` + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); +} +``` + +Se il giocatore non ha colpito una mina, aggiungi i conteggi delle mine per l'area attorno alla posizione e restituiscilo. + +### Utilizzare Zokrates da TypeScript {#using-zokrates-from-typescript} + +Zokrates ha un'interfaccia a riga di comando, ma in questo programma lo utilizziamo nel [codice TypeScript](https://zokrates.github.io/toolbox/zokrates_js.html). + +La libreria che contiene le definizioni di Zokrates si chiama [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts). + +```typescript +import { initialize as zokratesInitialize } from "zokrates-js" +``` + +Importa i [binding JavaScript di Zokrates](https://zokrates.github.io/toolbox/zokrates_js.html). Abbiamo bisogno solo della funzione [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize) perché restituisce una promessa che si risolve in tutte le definizioni di Zokrates. + +```typescript +export const zkFunctions = async (width: number, height: number) : Promise => { +``` + +Similmente a Zokrates stesso, esportiamo anche solo una funzione, che è anch'essa [asincrona](https://www.w3schools.com/js/js_async.asp). Quando alla fine ritorna, fornisce diverse funzioni come vedremo di seguito. + +```typescript +const zokrates = await zokratesInitialize() +``` + +Inizializza Zokrates, ottieni tutto ciò di cui abbiamo bisogno dalla libreria. + +```typescript +const hashFragment = ` + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + . + . + . + } + ` + +const hashProgram = ` + ${hashFragment} + . + . + . + ` + +const digProgram = ` + ${hashFragment} + . + . + . + ` +``` + +Successivamente abbiamo la funzione di hash e due programmi Zokrates che abbiamo visto sopra. + +```typescript +const digCompiled = zokrates.compile(digProgram) +const hashCompiled = zokrates.compile(hashProgram) +``` + +Qui compiliamo quei programmi. + +```typescript +// Crea le chiavi per la verifica a conoscenza-zero. +// In un sistema di produzione vorresti usare una cerimonia di setup. +// (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). +const keySetupResults = zokrates.setup(digCompiled.program, "") +const verifierKey = keySetupResults.vk +const proverKey = keySetupResults.pk +``` + +Su un sistema di produzione potremmo usare una [cerimonia di configurazione](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) più complicata, ma questo è sufficiente per una dimostrazione. Non è un problema che gli utenti possano conoscere la chiave del prover: non possono comunque usarla per dimostrare cose a meno che non siano vere. Poiché specifichiamo l'entropia (il secondo parametro, `""`), i risultati saranno sempre gli stessi. + +**Nota:** La compilazione dei programmi Zokrates e la creazione delle chiavi sono processi lenti. Non c'è bisogno di ripeterli ogni volta, solo quando cambia la dimensione della mappa. Su un sistema di produzione li faresti una volta e poi memorizzeresti l'output. L'unico motivo per cui non lo faccio qui è per motivi di semplicità. + +#### calculateMapHash {#calculateMapHash} + +```typescript +const calculateMapHash = function (hashMe: boolean[][]): string { + return ( + "0x" + + BigInt(zokrates.computeWitness(hashCompiled, [hashMe]).output.slice(1, -1)) + .toString(16) + .padStart(64, "0") + ) +} +``` + +La funzione [`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) esegue effettivamente il programma Zokrates. Restituisce una struttura con due campi: `output`, che è l'output del programma come stringa JSON, e `witness`, che sono le informazioni necessarie per creare una prova a conoscenza-zero del risultato. Qui abbiamo solo bisogno dell'output. + +L'output è una stringa della forma `"31337"`, un numero decimale racchiuso tra virgolette. Ma l'output di cui abbiamo bisogno per `viem` è un numero esadecimale della forma `0x60A7`. Quindi usiamo `.slice(1,-1)` per rimuovere le virgolette e poi `BigInt` per convertire la stringa rimanente, che è un numero decimale, in un [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt). `.toString(16)` converte questo `BigInt` in una stringa esadecimale e `"0x"+` aggiunge il marcatore per i numeri esadecimali. + +```typescript +// Scava e restituisci una prova a conoscenza-zero del risultato +// (codice lato server) +``` + +La prova a conoscenza-zero include gli input pubblici (`x` e `y`) e i risultati (hash della mappa e numero di bombe). + +```typescript + const zkDig = function(map: boolean[][], x: number, y: number) : any { + if (x<0 || x>=width || y<0 || y>=height) + throw new Error("Trying to dig outside the map") +``` + +È un problema controllare se un indice è fuori dai limiti in Zokrates, quindi lo facciamo qui. + +```typescript +const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`]) +``` + +Esegui il programma di scavo. + +```typescript + const proof = zokrates.generateProof( + digCompiled.program, + runResults.witness, + proverKey) + + return proof + } +``` + +Usa [`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.html#generateproofprogram-witness-provingkey-entropy) e restituisci la prova. + +```typescript +const solidityVerifier = ` + // Map size: ${width} x ${height} + \n${zokrates.exportSolidityVerifier(verifierKey)} + ` +``` + +Un verificatore Solidity, un contratto intelligente che possiamo distribuire sulla blockchain e utilizzare per verificare le prove generate da `digCompiled.program`. + +```typescript + return { + zkDig, + calculateMapHash, + solidityVerifier, + } +} +``` + +Infine, restituisci tutto ciò di cui altro codice potrebbe aver bisogno. + +## Test di sicurezza {#security-tests} + +I test di sicurezza sono importanti perché un bug di funzionalità prima o poi si rivelerà. Ma se l'applicazione è insicura, è probabile che rimanga nascosta per molto tempo prima di essere rivelata da qualcuno che imbroglia e se la cava con risorse che appartengono ad altri. + +### Permessi {#permissions} + +C'è un'entità privilegiata in questo gioco, il server. È l'unico utente autorizzato a chiamare le funzioni in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol). Possiamo usare [`cast`](https://book.getfoundry.sh/cast/) per verificare che le chiamate alle funzioni con permessi siano consentite solo come account del server. + +[La chiave privata del server è in `setupNetwork.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52). + +1. Sul computer che esegue `anvil` (la blockchain), imposta queste variabili d'ambiente. + + ```sh copy + WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b + UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a + AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d +``` + +2. Usa `cast` per tentare di impostare l'indirizzo del verificatore come un indirizzo non autorizzato. + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY +``` + + Non solo `cast` segnala un errore, ma puoi aprire **MUD Dev Tools** nel gioco sul browser, cliccare su **Tables** e selezionare **app\_\_VerifierAddress**. Vedrai che l'indirizzo non è zero. + +3. Imposta l'indirizzo del verificatore come indirizzo del server. + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY +``` + + L'indirizzo in **app\_\_VerifiedAddress** dovrebbe ora essere zero. + +Tutte le funzioni MUD nello stesso `System` passano attraverso lo stesso controllo degli accessi, quindi considero questo test sufficiente. Se non lo fai, puoi controllare le altre funzioni in [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol). + +### Abusi della conoscenza-zero {#zero-knowledge-abuses} + +La matematica per verificare Zokrates va oltre lo scopo di questo tutorial (e le mie capacità). Tuttavia, possiamo eseguire vari controlli sul codice a conoscenza-zero per verificare che se non viene eseguito correttamente fallisce. Tutti questi test richiederanno di modificare [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) e riavviare l'intera applicazione. Non è sufficiente riavviare il processo del server, perché mette l'applicazione in uno stato impossibile (il giocatore ha una partita in corso, ma la partita non è più disponibile per il server). + +#### Risposta sbagliata {#wrong-answer} + +La possibilità più semplice è fornire la risposta sbagliata nella prova a conoscenza-zero. Per farlo, andiamo all'interno di `zkDig` e [modifichiamo la riga 91](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L91): + +```ts +proof.inputs[3] = "0x" + "1".padStart(64, "0") +``` + +Questo significa che affermeremo sempre che c'è una bomba, indipendentemente dalla risposta corretta. Prova a giocare con questa versione e vedrai nella scheda **server** della schermata `pnpm dev` questo errore: + +``` + cause: { + code: 3, + message: 'execution reverted: revert: Zero knowledge verification fail', + data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000 +000000000000000000000000000000000000000000000000205a65726f206b6e6f776c6564676520766572696669636174696f6 +e206661696c' + }, +``` + +Quindi questo tipo di trucco fallisce. + +#### Prova sbagliata {#wrong-proof} + +Cosa succede se forniamo le informazioni corrette, ma abbiamo semplicemente i dati della prova sbagliati? Ora, sostituisci la riga 91 con: + +```ts +proof.proof = { + a: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + b: [ + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ], + c: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], +} +``` + +Fallisce ancora, ma ora fallisce senza motivo perché accade durante la chiamata del verificatore. + +### Come può un utente verificare il codice zero trust? {#user-verify-zero-trust} + +I contratti intelligenti sono relativamente facili da verificare. In genere, lo sviluppatore pubblica il codice sorgente su un esploratore di blocchi e l'esploratore di blocchi verifica che il codice sorgente venga compilato nel codice nella [transazione di distribuzione del contratto](/developers/docs/smart-contracts/deploying/). Nel caso dei `System` di MUD questo è [leggermente più complicato](https://mud.dev/cli/verify), ma non di molto. + +Questo è più difficile con la conoscenza-zero. Il verificatore include alcune costanti ed esegue alcuni calcoli su di esse. Questo non ti dice cosa viene dimostrato. + +```solidity + function verifyingKey() pure internal returns (VerifyingKey memory vk) { + vk.alpha = Pairing.G1Point(uint256(0x0f43f4fe7b5c2326fed4ac6ed2f4003ab9ab4ea6f667c2bdd77afb068617ee16), uint256(0x25a77832283f9726935219b5f4678842cda465631e72dbb24708a97ba5d0ce6f)); + vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]); +``` + +La soluzione, almeno finché gli esploratori di blocchi non aggiungeranno la verifica di Zokrates alle loro interfacce utente, è che gli sviluppatori dell'applicazione rendano disponibili i programmi Zokrates e che almeno alcuni utenti li compilino da soli con la chiave di verifica appropriata. + +Per farlo: + +1. [Installa Zokrates](https://zokrates.github.io/gettingstarted.html). +2. Crea un file, `dig.zok`, con il programma Zokrates. Il codice sottostante presuppone che tu abbia mantenuto la dimensione originale della mappa, 10x5. + + ```zokrates + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + + def hashMap(bool[12][7] map) -> field { + bool[512] mut map1d = [false; 512]; + u32 mut counter = 0; + + for u32 x in 0..12 { + for u32 y in 0..7 { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } + + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; + + return poseidon(hashMe); + } + + + // Il numero di mine nella posizione (x,y) + def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; + } + + def main(private bool[12][7] map, u32 x, u32 y) -> (field, u8) { + return (hashMap(map) , + if map2mineCount(map, x, y) > 0 { 0xFF } else { + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); + } +``` + +3. Compila il codice Zokrates e crea la chiave di verifica. La chiave di verifica deve essere creata con la stessa entropia utilizzata nel server originale, [in questo caso una stringa vuota](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67). + + ```sh copy + zokrates compile --input dig.zok + zokrates setup -e "" +``` + +4. Crea il verificatore Solidity da solo e verifica che sia funzionalmente identico a quello sulla blockchain (il server aggiunge un commento, ma non è importante). + + ```sh copy + zokrates export-verifier + diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol +``` + +## Decisioni di progettazione {#design} + +In qualsiasi applicazione sufficientemente complessa ci sono obiettivi di progettazione in competizione che richiedono compromessi. Diamo un'occhiata ad alcuni dei compromessi e al motivo per cui la soluzione attuale è preferibile ad altre opzioni. + +### Perché la conoscenza-zero {#why-zero-knowledge} + +Per il campo minato non hai davvero bisogno della conoscenza-zero. Il server può sempre mantenere la mappa e poi rivelarla tutta quando il gioco è finito. Quindi, alla fine del gioco, il contratto intelligente può calcolare l'hash della mappa, verificare che corrisponda e, in caso contrario, penalizzare il server o ignorare completamente la partita. + +Non ho usato questa soluzione più semplice perché funziona solo per giochi brevi con uno stato finale ben definito. Quando un gioco è potenzialmente infinito (come nel caso dei [mondi autonomi](https://0xparc.org/blog/autonomous-worlds)), hai bisogno di una soluzione che dimostri lo stato _senza_ rivelarlo. + +Come tutorial, questo articolo aveva bisogno di un gioco breve e facile da capire, ma questa tecnica è più utile per i giochi più lunghi. + +### Perché Zokrates? {#why-zokrates} + +[Zokrates](https://zokrates.github.io/) non è l'unica libreria a conoscenza-zero disponibile, ma è simile a un normale linguaggio di programmazione [imperativo](https://en.wikipedia.org/wiki/Imperative_programming) e supporta variabili booleane. + +Per la tua applicazione, con requisiti diversi, potresti preferire utilizzare [Circum](https://docs.circom.io/getting-started/installation/) o [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/). + +### Quando compilare Zokrates {#when-compile-zokrates} + +In questo programma compiliamo i programmi Zokrates [ogni volta che il server si avvia](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61). Questo è chiaramente uno spreco di risorse, ma questo è un tutorial, ottimizzato per la semplicità. + +Se stessi scrivendo un'applicazione a livello di produzione, controllerei se ho un file con i programmi Zokrates compilati a questa dimensione del campo minato e, in tal caso, lo userei. Lo stesso vale per la distribuzione di un contratto verificatore on-chain. + +### Creare le chiavi del verificatore e del prover {#key-creation} + +[La creazione delle chiavi](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) è un altro calcolo puro che non deve essere eseguito più di una volta per una determinata dimensione del campo minato. Ancora una volta, viene eseguito solo una volta per motivi di semplicità. + +Inoltre, potremmo usare [una cerimonia di configurazione](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). Il vantaggio di una cerimonia di configurazione è che hai bisogno dell'entropia o di qualche risultato intermedio da ogni partecipante per imbrogliare sulla prova a conoscenza-zero. Se almeno un partecipante alla cerimonia è onesto ed elimina quelle informazioni, le prove a conoscenza-zero sono al sicuro da determinati attacchi. Tuttavia, non esiste _alcun meccanismo_ per verificare che le informazioni siano state eliminate da ovunque. Se le prove a conoscenza-zero sono di fondamentale importanza, vorrai partecipare alla cerimonia di configurazione. + +Qui ci affidiamo a [perpetual powers of tau](https://github.com/privacy-scaling-explorations/perpetualpowersoftau), che ha avuto dozzine di partecipanti. È probabilmente abbastanza sicuro e molto più semplice. Inoltre, non aggiungiamo entropia durante la creazione della chiave, il che rende più facile per gli utenti [verificare la configurazione a conoscenza-zero](#user-verify-zero-trust). + +### Dove verificare {#where-verification} + +Possiamo verificare le prove a conoscenza-zero on-chain (il che costa gas) o nel client (usando [`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof)). Ho scelto la prima, perché questo ti consente di [verificare il verificatore](#user-verify-zero-trust) una volta e poi fidarti che non cambi finché l'indirizzo del contratto per esso rimane lo stesso. Se la verifica fosse eseguita sul client, dovresti verificare il codice che ricevi ogni volta che scarichi il client. + +Inoltre, sebbene questo gioco sia per giocatore singolo, molti giochi blockchain sono multigiocatore. La verifica on-chain significa che verifichi la prova a conoscenza-zero solo una volta. Farlo nel client richiederebbe a ciascun client di verificare in modo indipendente. + +### Appiattire la mappa in TypeScript o Zokrates? {#where-flatten} + +In generale, quando l'elaborazione può essere eseguita in TypeScript o Zokrates, è meglio farla in TypeScript, che è molto più veloce e non richiede prove a conoscenza-zero. Questo è il motivo, ad esempio, per cui non forniamo a Zokrates l'hash e gli facciamo verificare che sia corretto. L'hashing deve essere eseguito all'interno di Zokrates, ma la corrispondenza tra l'hash restituito e l'hash on-chain può avvenire all'esterno. + +Tuttavia, continuiamo ad [appiattire la mappa in Zokrates](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), mentre avremmo potuto farlo in TypeScript. Il motivo è che le altre opzioni sono, a mio parere, peggiori. + +- Fornire un array unidimensionale di booleani al codice Zokrates e utilizzare un'espressione come `x*(height+2)+y` per ottenere la mappa bidimensionale. Questo renderebbe [il codice](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) un po' più complicato, quindi ho deciso che il guadagno in termini di prestazioni non ne vale la pena per un tutorial. + +- Inviare a Zokrates sia l'array unidimensionale che l'array bidimensionale. Tuttavia, questa soluzione non ci fa guadagnare nulla. Il codice Zokrates dovrebbe verificare che l'array unidimensionale fornito sia davvero la rappresentazione corretta dell'array bidimensionale. Quindi non ci sarebbe alcun guadagno in termini di prestazioni. + +- Appiattire l'array bidimensionale in Zokrates. Questa è l'opzione più semplice, quindi l'ho scelta. + +### Dove archiviare le mappe {#where-store-maps} + +In questa applicazione [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) è semplicemente una variabile in memoria. Questo significa che se il tuo server muore e deve essere riavviato, tutte le informazioni che ha memorizzato vanno perse. Non solo i giocatori non sono in grado di continuare la loro partita, ma non possono nemmeno iniziare una nuova partita perché il componente on-chain pensa che abbiano ancora una partita in corso. + +Questo è chiaramente un cattivo design per un sistema di produzione, in cui memorizzeresti queste informazioni in un database. L'unico motivo per cui ho usato una variabile qui è perché questo è un tutorial e la semplicità è la considerazione principale. + +## Conclusione: In quali condizioni questa è la tecnica appropriata? {#conclusion} + +Quindi, ora sai come scrivere un gioco con un server che memorizza uno stato segreto che non appartiene on-chain. Ma in quali casi dovresti farlo? Ci sono due considerazioni principali. + +- _Gioco di lunga durata_: [Come menzionato sopra](#why-zero-knowledge), in un gioco breve puoi semplicemente pubblicare lo stato una volta che il gioco è finito e far verificare tutto in quel momento. Ma questa non è un'opzione quando il gioco richiede un tempo lungo o indefinito e lo stato deve rimanere segreto. + +- _Una certa centralizzazione accettabile_: Le prove a conoscenza-zero possono verificare l'integrità, ovvero che un'entità non stia falsificando i risultati. Quello che non possono fare è garantire che l'entità sarà ancora disponibile e risponderà ai messaggi. Nelle situazioni in cui anche la disponibilità deve essere decentralizzata, le prove a conoscenza-zero non sono una soluzione sufficiente e hai bisogno del [calcolo multipartecipante](https://en.wikipedia.org/wiki/Secure_multi-party_computation). + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). + +### Ringraziamenti {#acknowledgements} + +- Alvaro Alonso ha letto una bozza di questo articolo e ha chiarito alcuni dei miei malintesi su Zokrates. + +Eventuali errori rimanenti sono di mia responsabilità. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md index bfc48a68fb7..ac029ad8141 100644 --- a/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md +++ b/public/content/translations/it/developers/tutorials/secure-development-workflow/index.md @@ -1,56 +1,53 @@ --- -title: Elenco di controllo di sicurezza per gli smart contract -description: Un flusso di lavoro suggerito per scrivere smart contract sicuri +title: Lista di controllo per la sicurezza dei contratti intelligenti +description: Un flusso di lavoro suggerito per scrivere contratti intelligenti sicuri author: "Trailofbits" -tags: - - "smart Contract" - - "sicurezza" - - "Solidity" +tags: ["contratti intelligenti", "sicurezza", "Solidity"] skill: intermediate -breadcrumb: "Lista di sicurezza" +breadcrumb: Lista di controllo per la sicurezza lang: it published: 2020-09-07 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md --- -## Elenco di controllo per lo sviluppo di smart contract {#smart-contract-development-checklist} +## Lista di controllo per lo sviluppo di contratti intelligenti {#smart-contract-development-checklist} -Ecco un processo d'alto livello che consigliamo di seguire per la scrittura degli smart contract. +Ecco un processo ad alto livello che consigliamo di seguire durante la scrittura dei tuoi contratti intelligenti. -Verifica i problemi di sicurezza noti: +Controlla i problemi di sicurezza noti: -- Revisiona i tuoi contratti con [Slither](https://github.com/crytic/slither). Ha oltre 40 rilevatori integrati per le vulnerabilità comuni. Eseguilo a ogni check-in con il nuovo codice e assicurati di ottenere un report pulito (o usa la modalità triage per silenziare certi problemi). -- Revisiona i tuoi contratti con [Crytic](https://crytic.io/). Controlla 50 problemi non verificati da Slither. Crytic può aiutare il tuo team a prevenire problemi, facendo affiorare facilmente le questioni di sicurezza nelle richieste pull su GitHub. +- Esamina i tuoi contratti con [Slither](https://github.com/crytic/slither). Ha più di 40 rilevatori integrati per le vulnerabilità comuni. Eseguilo a ogni check-in con nuovo codice e assicurati che ottenga un rapporto pulito (o usa la modalità triage per silenziare determinati problemi). +- Esamina i tuoi contratti con [Crytic](https://crytic.io/). Controlla 50 problemi che Slither non rileva. Crytic può anche aiutare il tuo team a rimanere aggiornato, facendo emergere facilmente i problemi di sicurezza nelle Pull Request su GitHub. Considera le funzionalità speciali del tuo contratto: -- I tuoi contratti sono aggiornabili? Revisiona il tuo codice di aggiornabilità per i difetti con [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) o [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Abbiamo documentato 17 modi in cui gli aggiornamenti possono andare male. -- I tuoi contratti pretendono di esser conformi agli ERC? Controllali con [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Questo strumento identifica istantaneamente le deviazioni da sei specifiche comuni. -- Integri con token di terze parti? Revisiona il nostro [elenco di controllo di integrazione del token](/developers/tutorials/token-integration-checklist/) prima di affidarti a contratti esterni. +- I tuoi contratti sono aggiornabili? Esamina il tuo codice di aggiornabilità per individuare eventuali difetti con [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) o [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Abbiamo documentato 17 modi in cui gli aggiornamenti possono andare storti. +- I tuoi contratti pretendono di essere conformi agli ERC? Controllali con [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Questo strumento identifica istantaneamente le deviazioni da sei specifiche comuni. +- Ti integri con token di terze parti? Esamina la nostra [lista di controllo per l'integrazione dei token](/developers/tutorials/token-integration-checklist/) prima di fare affidamento su contratti esterni. Ispeziona visivamente le funzionalità di sicurezza critiche del tuo codice: -- Revisiona l'editore di Slither, [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph). Evita shadowing involontari e problemi di linearizzazione di C3. -- Revisiona l'editore di Slither, [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary). Segnala la visibilità della funzione e i controlli d'accesso. -- Revisiona l'editore di Slither, [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization). Segnala i controlli d'accesso sulle variabili di stato. +- Esamina lo stampatore [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) di Slither. Evita problemi di shadowing involontario e di linearizzazione C3. +- Esamina lo stampatore [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) di Slither. Segnala la visibilità delle funzioni e i controlli di accesso. +- Esamina lo stampatore [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) di Slither. Segnala i controlli di accesso sulle variabili di stato. Documenta le proprietà di sicurezza critiche e usa generatori di test automatizzati per valutarle: -- Impara a [documentare le proprietà di sicurezza per il tuo codice](/developers/tutorials/guide-to-smart-contract-security-tools/). All'inizio è difficile, ma è l'attività in assoluto più importante per ottenere un buon risultato. È anche un prerequisito per usare qualsiasi tecnica avanzata in questo tutorial. -- Definisci le proprietà di sicurezza in Solidity, per l'uso con [Echidna](https://github.com/crytic/echidna) e [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concentrati sulla tua macchina di stato, controlli d'accesso, operazioni aritmetiche, interazioni esterne e conformità agli standard. -- Definisci le proprietà di sicurezza con l'[API di Python di Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Concentrati su eredità, dipendenze della variabile, controlli d'accesso e altri problemi strutturali. -- Esegui i tuoi test di proprietà a ogni commit con [Crytic](https://crytic.io). Crytic può consumare e valutare i test di proprietà di sicurezza in modo che tutti nel team possano facilmente vedere che passano su GitHub. I testi falliti possono bloccare i commit. +- Impara a [documentare le proprietà di sicurezza per il tuo codice](/developers/tutorials/guide-to-smart-contract-security-tools/). All'inizio è difficile, ma è l'attività singola più importante per ottenere un buon risultato. È anche un prerequisito per usare una qualsiasi delle tecniche avanzate in questo tutorial. +- Definisci le proprietà di sicurezza in Solidity, per l'uso con [Echidna](https://github.com/crytic/echidna) e [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concentrati sulla tua macchina a stati, sui controlli di accesso, sulle operazioni aritmetiche, sulle interazioni esterne e sulla conformità agli standard. +- Definisci le proprietà di sicurezza con l'[API Python di Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Concentrati sull'ereditarietà, sulle dipendenze delle variabili, sui controlli di accesso e su altri problemi strutturali. +- Esegui i tuoi test delle proprietà a ogni commit con [Crytic](https://crytic.io). Crytic può consumare e valutare i test delle proprietà di sicurezza in modo che tutti nel tuo team possano facilmente vedere che passano su GitHub. I test falliti possono bloccare i commit. -Infine, ricordati dei problemi che gli strumenti automatizzati non possono facilmente trovare: +Infine, fai attenzione ai problemi che gli strumenti automatizzati non possono trovare facilmente: -- Mancanza di privacy: tutti gli altri possono vedere le tue transazioni mentre sono accodate nel pool -- Transazioni in esecuzione frontale +- Mancanza di privacy: tutti gli altri possono vedere le tue transazioni mentre sono in coda nel pool +- Transazioni di front-running - Operazioni crittografiche -- Interazioni rischiose con componenti esterni della DeFi +- Interazioni rischiose con componenti DeFi esterni ## Chiedi aiuto {#ask-for-help} -[Orari lavorativi di Ethereum](https://calendly.com/dan-trailofbits/office-hours): ogni martedì pomeriggio. Queste sessioni 1 a 1 di un'ora sono un'opportunità per farci domande sulla sicurezza, la risoluzione dei problemi usando i nostri strumenti e la ricezione di feedback dagli esperti sul tuo approccio corrente. Ti aiuteremo ad arrivare in fondo a questa guida. +Gli [orari di ricevimento di Ethereum](https://calendly.com/dan-trailofbits/office-hours) si tengono ogni martedì pomeriggio. Queste sessioni individuali di 1 ora sono un'opportunità per farci qualsiasi domanda tu abbia sulla sicurezza, risolvere problemi usando i nostri strumenti e ottenere feedback dagli esperti sul tuo approccio attuale. Ti aiuteremo a lavorare su questa guida. -Unisciti al nostro Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Siamo sempre disponibili nei canali #crytic ed #ethereum se hai domande. +Unisciti al nostro Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Siamo sempre disponibili nei canali #crytic ed #ethereum se hai domande. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/it/developers/tutorials/send-token-ethersjs/index.md index f463f014692..32c0a754c50 100644 --- a/public/content/translations/it/developers/tutorials/send-token-ethersjs/index.md +++ b/public/content/translations/it/developers/tutorials/send-token-ethersjs/index.md @@ -1,28 +1,26 @@ --- -title: Invio di token utilizzando ethers.js -description: Guida per principianti per l'invio di token utilizzando ethers.js. +title: Inviare token usando ethers.js +description: Guida per principianti all'invio di token usando ethers.js. author: Kim YongJun -tags: - - "ETHERS.JS" - - "ERC-20" - - "TOKEN" +tags: ["ETHERS.JS", "ERC-20", "token"] skill: beginner -breadcrumb: "Inviare token" +breadcrumb: Inviare token lang: it published: 2021-04-06 --- -## Invio di token utilizzando ethers.js(5.0) {#send-token} +## Inviare token usando ethers.js(5.0) {#send-token} ### In questo tutorial imparerai come {#you-learn-about} - Importare ethers.js - Trasferire token -- Imposta il prezzo del gas a seconda della situazione del traffico di rete +- Impostare il prezzo del gas in base alla situazione del traffico di rete ### Per iniziare {#to-get-started} -Per iniziare, dobbiamo prima importare la libreria di ethers.js nel nostro javascript. `Include ethers.js(5.0)` +Per iniziare, dobbiamo prima importare la libreria ethers.js nel nostro javascript +Includere ethers.js(5.0) ### Installazione {#install-ethersjs} @@ -35,7 +33,7 @@ ES6 nel browser ```html ``` @@ -50,59 +48,59 @@ ES3(UMD) nel browser ### Parametri {#param} -1. **`contract_address`**: Indirizzo del contratto del token (l'indirizzo del contratto è necessario quando il token che vuoi trasferire non è ether) -2. **`send_token_amount`**: L'importo che vuoi inviare al destinatario +1. **`contract_address`**: Indirizzo del contratto del token (l'indirizzo del contratto è necessario quando il token che si desidera trasferire non è ether) +2. **`send_token_amount`**: L'importo che si desidera inviare al destinatario 3. **`to_address`**: L'indirizzo del destinatario 4. **`send_account`**: L'indirizzo del mittente -5. **`private_key`**: La chiave privata del mittente per firmare la transazione e trasferire realmente i token +5. **`private_key`**: Chiave privata del mittente per firmare la transazione e trasferire effettivamente i token ## Avviso {#notice} -`signTransaction(tx)` è rimossa perché `sendTransaction()` lo fa internamente. +`signTransaction(tx)` è stato rimosso perché `sendTransaction()` lo fa internamente. -## Invio delle procedure {#procedure} +## Procedure di invio {#procedure} -### 1. Connettiti alla rete (rete di prova) {#connect-to-network} +### 1. Connettersi alla rete (rete di test) {#connect-to-network} -#### Imposta il provider (Infura) {#set-provider} +#### Impostare il Provider (Infura) {#set-provider} -Connettiti alla rete di prova di Ropsten +Connettersi alla rete di test Ropsten ```javascript window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") ``` -### 2. Crea il portafoglio {#create-wallet} +### 2. Creare il portafoglio {#create-wallet} ```javascript let wallet = new ethers.Wallet(private_key) ``` -### 3. Connetti il portafoglio alla rete {#connect-wallet-to-net} +### 3. Connettere il portafoglio alla rete {#connect-wallet-to-net} ```javascript let walletSigner = wallet.connect(window.ethersProvider) ``` -### 4. Ottieni il prezzo corrente del gas {#get-gas} +### 4. Ottenere il prezzo del gas attuale {#get-gas} ```javascript window.ethersProvider.getGasPrice() // gasPrice ``` -### 5. Definisci la transazione {#define-transaction} +### 5. Definire la transazione {#define-transaction} Queste variabili definite di seguito dipendono da `send_token()` ### Parametri della transazione {#transaction-params} -1. **`send_account`**: L'indirizzo del mittente del token +1. **`send_account`**: indirizzo del mittente del token 2. **`to_address`**: indirizzo del destinatario del token -3. **`send_token_amount`**: l'importo di token da inviare -4. **`gas_limit`**: limite di gas +3. **`send_token_amount`**: la quantità di token da inviare +4. **`gas_limit`**: limite del gas 5. **`gas_price`**: prezzo del gas -[Vedi sotto come usarli](#how-to-use) +[Vedi sotto per come usarlo](#how-to-use) ```javascript const tx = { @@ -147,9 +145,9 @@ send_token( ) ``` -### Fatto! {#success} +### Successo! {#success} -![immagine della transazione eseguita correttamente](./successful-transaction.png) +![immagine della transazione completata con successo](./successful-transaction.png) ## send_token() {#send-token-method} @@ -169,23 +167,23 @@ function send_token( console.log(`gas_price: ${gas_price}`) if (contract_address) { - // general token send + // invio generale di token let contract = new ethers.Contract( contract_address, send_abi, walletSigner ) - // How many tokens? + // Quanti token? let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) console.log(`numberOfTokens: ${numberOfTokens}`) - // Send tokens + // Invia token contract.transfer(to_address, numberOfTokens).then((transferResult) => { console.dir(transferResult) alert("sent token") }) - } // ether send + } // invio di ether else { const tx = { from: send_account, @@ -210,4 +208,4 @@ function send_token( } }) } -``` +``` \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/it/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md index 1858351794a..6b8cf311ff6 100644 --- a/public/content/translations/it/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md +++ b/public/content/translations/it/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -1,99 +1,96 @@ --- title: Inviare transazioni usando Web3 -description: "Questa è una guida per principianti per inviare transazioni di Ethereum usando Web3. Ci sono tre fasi principali per inviare una transazione alla blockchain di Ethereum: creare, firmare e trasmettere. Le vedremo tutte e tre." +description: "Questa è una guida per principianti su come inviare transazioni su Ethereum usando Web3. Ci sono tre passaggi principali per inviare una transazione alla blockchain di Ethereum: creare, firmare e trasmettere. Li esamineremo tutti e tre." author: "Elan Halpern" -tags: - - "transazioni" - - "web3.js" - - "alchemy" +tags: ["transazioni", "web3.js", "Alchemy"] skill: beginner -breadcrumb: "Inviare transazioni" +breadcrumb: Inviare transazioni lang: it published: 2020-11-04 -source: documentazione Alchemy +source: Alchemy docs sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum --- -Questa è una guida per principianti per inviare transazioni di Ethereum usando Web3. Esistono tre passaggi principali per poter inviare una transazione alla blockchain di Ethereum: creare, firmare e trasmettere. Le vedremo tutte e tre, sperando di rispondere a tutte le domande che potreste avere! In questo tutorial, useremo [Alchemy](https://www.alchemy.com/) per inviare le nostre transazioni alla catena di Ethereum. Puoi [creare qui un conto gratuito di Alchemy](https://auth.alchemyapi.io/signup). +Questa è una guida per principianti su come inviare transazioni su Ethereum usando Web3. Ci sono tre passaggi principali per inviare una transazione alla blockchain di Ethereum: creare, firmare e trasmettere. Li esamineremo tutti e tre, sperando di rispondere a qualsiasi domanda tu possa avere! In questo tutorial, useremo [Alchemy](https://www.alchemy.com/) per inviare le nostre transazioni alla catena di Ethereum. Puoi [creare un account Alchemy gratuito qui](https://auth.alchemyapi.io/signup). -**NOTA:** Questa guida è per firmare le tue transazioni sul _backend_ per la tua app. Se desideri integrare la firma delle tue transazioni sul frontend, dai un'occhiata all'integrazione di [Web3 con un fornitore del browser](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider). +**NOTA:** Questa guida serve per firmare le tue transazioni sul _backend_ per la tua app. Se vuoi integrare la firma delle tue transazioni sul frontend, dai un'occhiata all'integrazione di [Web3 con un provider del browser](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider). -## Le nozioni di base {#the-basics} +## Le basi {#the-basics} -Come gran parte degli sviluppatori di blockchain quando iniziano, potresti aver fatto delle ricerche su come inviare una transazione (il che dovrebbe essere abbastanza facile) e potresti essere incappato in una moltitudine di guide, ognuna con indicazioni diverse, che rischiano di lasciare sopraffatti e confusi. Se sei su quella barca, non preoccuparti; ci siamo passati tutti! Quindi, prima d'iniziare, mettiamo in chiaro alcune cose: +Come la maggior parte degli sviluppatori blockchain agli inizi, potresti aver fatto delle ricerche su come inviare una transazione (qualcosa che dovrebbe essere piuttosto semplice) e ti sei imbattuto in una pletora di guide, ognuna delle quali dice cose diverse lasciandoti un po' sopraffatto e confuso. Se sei in questa situazione, non preoccuparti; ci siamo passati tutti a un certo punto! Quindi, prima di iniziare, chiariamo alcune cose: ### 1\. Alchemy non memorizza le tue chiavi private {#alchemy-does-not-store-your-private-keys} -- Questo significa che Alchemy non può firmare e inviare transazioni per conto tuo. Il motivo di ciò è la sicurezza. Alchemy non ti chiederà mai di condividere la tua chiave privata e non dovresti mai condividerla con un nodo ospitato (o, se è per questo, con nessuno). -- Puoi leggere dalla blockchain usando l'API principale di Alchemy, ma per scrivere dovrai usare qualcos'altro per firmare le transazioni prima di inviarle tramite Alchemy (così come per ogni altro [servizio di nodo](/developers/docs/nodes-and-clients/nodes-as-a-service/)). +- Questo significa che Alchemy non può firmare e inviare transazioni per tuo conto. Il motivo è per scopi di sicurezza. Alchemy non ti chiederà mai di condividere la tua chiave privata, e non dovresti mai condividere la tua chiave privata con un nodo ospitato (o con chiunque altro, se è per questo). +- Puoi leggere dalla blockchain usando l'API principale di Alchemy, ma per scriverci dovrai usare qualcos'altro per firmare le tue transazioni prima di inviarle tramite Alchemy (questo vale per qualsiasi altro [servizio di nodi](/developers/docs/nodes-and-clients/nodes-as-a-service/)). -### 2\. Cos'è un "firmatario"? {#what-is-a-signer} +### 2\. Cos'è un "firmatario" (signer)? {#what-is-a-signer} -- I firmatari firmano le transazioni per te usando la tua chiave privata. In questo tutorial useremo [ web3 di Alchemy](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) per firmare la nostra transazione, ma puoi anche usare qualsiasi altra libreria di web3. -- Sul frontend, un buon esempio di firmatario sarebbe [MetaMask](https://metamask.io/), che firmerà e invierà le transazioni per conto tuo. +- I firmatari firmeranno le transazioni per te usando la tua chiave privata. In questo tutorial useremo [Alchemy web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) per firmare la nostra transazione, ma potresti anche usare qualsiasi altra libreria web3. +- Sul frontend, un buon esempio di firmatario sarebbe [MetaMask](https://metamask.io/), che firmerà e invierà transazioni per tuo conto. ### 3\. Perché devo firmare le mie transazioni? {#why-do-i-need-to-sign-my-transactions} -- Ogni utente che desidera inviare una transazione sulla rete di Ethereum deve firmare la transazione (usando la propria chiave privata), per poter convalidare che l'origine della transazione sia quella affermata. -- È davvero importante proteggere questa chiave privata, poiché avere accesso a essa concede il pieno controllo sul tuo conto privato, consentendoti (o a chiunque acceda) di eseguire transazioni per conto tuo. +- Ogni utente che vuole inviare una transazione sulla rete di Ethereum deve firmare la transazione (usando la propria chiave privata), al fine di convalidare che l'origine della transazione sia chi afferma di essere. +- È importantissimo proteggere questa chiave privata, poiché avervi accesso garantisce il pieno controllo sul tuo account Ethereum, consentendo a te (o a chiunque vi abbia accesso) di eseguire transazioni per tuo conto. ### 4\. Come proteggo la mia chiave privata? {#how-do-i-protect-my-private-key} -- Ci sono molti modi per proteggere la tua chiave privata e usarla per inviare le transazioni. In questo tutorial useremo un file `.env`. Tuttavia, potresti anche usare un provider separato che memorizzi le chiavi private, usare un file keystore o altre opzioni. +- Ci sono molti modi per proteggere la tua chiave privata e usarla per inviare transazioni. In questo tutorial useremo un file `.env`. Tuttavia, potresti anche usare un provider separato che memorizza le chiavi private, usare un file keystore o altre opzioni. -### 5\. Qual è la differenza tra `eth_sendTransaction` e `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} +### 5\. Qual è la differenza tra `eth_sendTransaction` ed `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} -`eth_sendTransaction` e `eth_sendRawTransaction` sono entrambe funzioni dell'API di Ethereum che trasmettono una transazione alla rete di Ethereum affinché venga aggiunta a un blocco futuro. Differiscono in come gestiscono la firma delle transazioni. +`eth_sendTransaction` ed `eth_sendRawTransaction` sono entrambe funzioni dell'API di Ethereum che trasmettono una transazione alla rete di Ethereum in modo che venga aggiunta a un blocco futuro. Differiscono nel modo in cui gestiscono la firma delle transazioni. -- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) è usato per inviare transazioni _non firmate_, il che significa che il nodo a cui stai inviando deve gestire la tua chiave privata in modo che tu possa firmare la transazione prima di trasmetterla alla catena. Poiché Alchemy non detiene le chiavi private dell'utente, non supportiamo questo metodo. -- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) è usato per trasmettere le transazioni che sono già state firmate. Ciò significa che devi prima usare [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), poi passare il risultato in `eth_sendRawTransaction`. +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) è usato per inviare transazioni _non firmate_, il che significa che il nodo a cui stai inviando deve gestire la tua chiave privata in modo da poter firmare la transazione prima di trasmetterla alla catena. Poiché Alchemy non detiene le chiavi private degli utenti, non supporta questo metodo. +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) è usato per trasmettere transazioni che sono già state firmate. Questo significa che devi prima usare [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), per poi passare il risultato a `eth_sendRawTransaction`. -Usando web3, l'accesso a `eth_sendRawTransaction` ha luogo chiamando la funzione [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction). +Quando si usa web3, si accede a `eth_sendRawTransaction` chiamando la funzione [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction). -Questo è ciò che useremo nel nostro tutorial. +Questo è ciò che useremo in questo tutorial. -### 6\. Cos'è la libreria di web3? {#what-is-the-web3-library} +### 6\. Cos'è la libreria web3? {#what-is-the-web3-library} -- Web3.js è una libreria di wrapper basata sulle chiamate JSON RPC standard, utilizzata abbastanza comunemente nello sviluppo di Ethereum. -- Esistono molte librerie web3 per diversi linguaggi. In questo tutorial useremo [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), scritto in JavaScript. Puoi consultare altre opzioni [qui](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries), come [ethers.js](https://docs.ethers.org/v5/). +- Web3.js è una libreria wrapper attorno alle chiamate JSON-RPC standard che è piuttosto comune da usare nello sviluppo su Ethereum. +- Ci sono molte librerie web3 per diversi linguaggi. In questo tutorial useremo [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) che è scritta in JavaScript. Puoi dare un'occhiata ad altre opzioni [qui](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) come [ethers.js](https://docs.ethers.org/v5/). -Okay, ora che ci siamo tolti alcune di queste domande, passiamo al tutorial. Sentiti libero di fare domande in qualsiasi momento su [Discord](https://discord.gg/gWuC7zB) di Alchemy! +Ok, ora che abbiamo tolto di mezzo alcune di queste domande, passiamo al tutorial. Sentiti libero di fare domande in qualsiasi momento nel [discord](https://discord.gg/gWuC7zB) di Alchemy! -### 7\. Come inviare transazioni sicure, ottimizzate a livello di gas e private? {#how-to-send-secure-gas-optimized-and-private-transactions} +### 7\. Come inviare transazioni sicure, ottimizzate per il gas e private? {#how-to-send-secure-gas-optimized-and-private-transactions} -- [Alchemy ha una suite di API di Transact](https://docs.alchemy.com/reference/transact-api-quickstart). Puoi utilizzarle per inviare delle transazioni reinforzate, simulare le transazioni prima che si verifichino, inviare transazioni private e inviare transazioni ottimizzate a livello di gas -- Inoltre, puoi utilizzare l'[API di Notify](https://docs.alchemy.com/docs/alchemy-notify) per essere avvisato quando la tua transazione è prelevata dal mempool ed è aggiunta alla catena +- [Alchemy ha una suite di API Transact](https://docs.alchemy.com/reference/transact-api-quickstart). Puoi usarle per inviare transazioni rinforzate, simulare transazioni prima che avvengano, inviare transazioni private e inviare transazioni ottimizzate per il gas. +- Puoi anche usare l'[API Notify](https://docs.alchemy.com/docs/alchemy-notify) per essere avvisato quando la tua transazione viene prelevata dalla mempool e aggiunta alla catena. -**NOTA:** Questa guida richiede un conto di Alchemy, un indirizzo di Ethereum o un portafoglio di Metamask, NodeJS e npm installato. Altrimenti, segui questi passaggi: +**NOTA:** Questa guida richiede un account Alchemy, un indirizzo Ethereum o un portafoglio MetaMask, NodeJs e npm installati. In caso contrario, segui questi passaggi: -1. [Crea un conto gratuito di Alchemy](https://auth.alchemyapi.io/signup) -2. [Crea un conto di MetaMask](https://metamask.io/) (od ottieni un indirizzo di Ethereum) +1. [Crea un account Alchemy gratuito](https://auth.alchemyapi.io/signup) +2. [Crea un account MetaMask](https://metamask.io/) (o ottieni un indirizzo Ethereum) 3. [Segui questi passaggi per installare NodeJs e NPM](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) -## Fasi per inviare la tua transazione {#steps-to-sending-your-transaction} +## Passaggi per inviare la tua transazione {#steps-to-sending-your-transaction} -### 1\. Crea un'app di Alchemy sulla rete di prova di Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet} +### 1\. Crea un'app Alchemy sulla rete di test Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet} -Accedi al tuo [pannello di controllo di Alchemy](https://dashboard.alchemyapi.io/) e crea una nuova app, scegliendo Sepolia (o qualsiasi altra rete di prova) per la tua rete. +Naviga nella tua [Dashboard di Alchemy](https://dashboard.alchemyapi.io/) e crea una nuova app, scegliendo Sepolia (o qualsiasi altra rete di test) per la tua rete. -### 2\. Richiedere ETH dal faucet di Sepolia {#request-eth-from-sepolia-faucet} +### 2\. Richiedi ETH dal rubinetto di Sepolia {#request-eth-from-sepolia-faucet} -Segui le istruzioni sul [faucet di Sepolia di Alchemy](https://www.sepoliafaucet.com/) per ricevere gli ETH. Assicurati di includere il tuo indirizzo di Ethereum di **Sepolia** (da MetaMask) e non di un'altra rete. Dopo aver seguito le istruzioni, ricontrolla di aver ricevuto gli ETH nel tuo portafoglio. +Segui le istruzioni sul [rubinetto Sepolia di Alchemy](https://www.sepoliafaucet.com/) per ricevere ETH. Assicurati di includere il tuo indirizzo Ethereum di **Sepolia** (da MetaMask) e non di un'altra rete. Dopo aver seguito le istruzioni, ricontrolla di aver ricevuto gli ETH nel tuo portafoglio. -### 3\. Crea la cartella di un nuovo progetto e `cd` al suo interno {#create-a-new-project-direction} +### 3\. Crea una nuova directory di progetto ed entraci con `cd` {#create-a-new-project-direction} -Crea una nuova cartella del progetto dalla riga di comando (terminale per mac) e naviga al suo interno: +Crea una nuova directory di progetto dalla riga di comando (terminale per Mac) e naviga al suo interno: ``` mkdir sendtx-example cd sendtx-example ``` -### 4\. Installa Alchemy Web3 (o altra libreria di web3) {#install-alchemy-web3} +### 4\. Installa Alchemy Web3 (o qualsiasi libreria web3) {#install-alchemy-web3} -Esegui il seguente comando nella cartella del tuo progetto per installare [Alchemy Web3](https://docs.alchemy.com/reference/api-overview): +Esegui il seguente comando nella tua directory di progetto per installare [Alchemy Web3](https://docs.alchemy.com/reference/api-overview): -Nota che per utilizzare la libreria di ethers.js, [devi seguire le istruzioni qui](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). +Nota, se desideri usare la libreria ethers.js, [segui le istruzioni qui](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). ``` npm install @alch/alchemy-web3 @@ -101,7 +98,7 @@ npm install @alch/alchemy-web3 ### 5\. Installa dotenv {#install-dotenv} -Useremo un file `.env` per memorizzare in sicurezza la nostra chiave API e la chiave privata. +Useremo un file `.env` per memorizzare in modo sicuro la nostra chiave API e la chiave privata. ``` npm install dotenv --save @@ -109,9 +106,9 @@ npm install dotenv --save ### 6\. Crea il file `.env` {#create-the-dotenv-file} -Crea un file `.env` nella cartella del tuo progetto e aggiungi quanto segue (sostituendo "`your-api-url`" e "`your-private-key`") +Crea un file `.env` nella tua directory di progetto e aggiungi quanto segue (sostituendo "`your-api-url`" e "`your-private-key`") -- Per trovare l'URL della tua API di Alchemy, accedi alla pagina dei dettagli dell'app che hai appena creato sul tuo pannello di controllo, clicca "Visualizza chiave" nell'angolo in alto a destra e individua l'URL HTTP. +- Per trovare l'URL della tua API di Alchemy, naviga nella pagina dei dettagli dell'app che hai appena creato sulla tua dashboard, clicca su "View Key" nell'angolo in alto a destra e prendi l'URL HTTP. - Per trovare la tua chiave privata usando MetaMask, dai un'occhiata a questa [guida](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). ``` @@ -122,16 +119,16 @@ PRIVATE_KEY = "your-private-key" -Non eseguire il commit di .env! Sei pregato di assicurarti di non condividere o esporre mai il tuo file .env con nessuno, poiché così facendo comprometteresti i tuoi segreti. Se stai usando il controllo della versione, aggiungi il tuo .env a un file gitignore. +Non committare .env! Assicurati di non condividere o esporre mai il tuo file .env a nessuno, poiché così facendo comprometti i tuoi segreti. Se stai usando il controllo di versione, aggiungi il tuo .env a un file gitignore. ### 7\. Crea il file `sendTx.js` {#create-sendtx-js} -Ottimo, ora che abbiamo protetto i nostri dati sensibili in un file `.env`, iniziamo a programmare. Per il nostro esempio di invio transazione, rinvieremo gli ETH al faucet di Sepolia. +Ottimo, ora che abbiamo i nostri dati sensibili protetti in un file `.env`, iniziamo a programmare. Per il nostro esempio di invio di transazione, invieremo ETH indietro al rubinetto di Sepolia. -Creare un file `sendTx.js`, dove configureremo e invieremo la nostra transazione d'esempio e aggiungere a esso le seguenti righe di codice: +Crea un file `sendTx.js`, che è dove configureremo e invieremo la nostra transazione di esempio, e aggiungi le seguenti righe di codice: ``` async function main() { @@ -167,45 +164,46 @@ main(); Assicurati di sostituire l'indirizzo alla **riga 6** con il tuo indirizzo pubblico. -Prima di passare all'esecuzione di questo codice, vediamo alcuni di questi componenti. +Ora, prima di passare all'esecuzione di questo codice, parliamo di alcuni dei componenti qui presenti. -- `nonce`: La specifica nonce è usata per tenere traccia del numero di transazioni inviate dal tuo indirizzo. Ci serve per motivi di sicurezza e per prevenire gli [attacchi di riproduzione](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Per ottenere il numero di transazioni inviate dal tuo indirizzo, usiamo [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). -- `transaction`: L'oggetto transazione ha alcuni aspetti che dobbiamo specificare - - `to`: Questo è l'indirizzo a cui vogliamo inviare ETH. In questo caso, stiamo rinviando degli ETH al [faucet di Sepolia](https://sepoliafaucet.com/), da cui li avevamo inizialmente richiesti. - - `value`: Questo è l'importo che desideriamo inviare, specificato in Wei, dove 10^18 Wei = 1 ETH - - `gas`: Esistono molti modi per determinare il giusto importo di gas da includere con la tua transazione. Alchemy ha persino un [webhook dei prezzi del gas](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1), per notificarti quando il prezzo del gas ricade entro una certa soglia. Per le transazioni di Mainnet, è buona pratica controllare uno strumento di stima del gas come [ETH Gas Station](https://ethgasstation.info/) per determinare il giusto importo di gas da includere. 21.000 è l'importo minimo di gas che un'operazione su Ethereum adopererà, quindi, per assicurarci che la nostra transazione sarà eseguita, inseriamo qui 30.000. - - `nonce`: vedi sopra la definizione di nonce. Nonce inizia a contare da zero. - - [OPTIONAL] dati: serve per inviare informazioni aggiuntive con il tuo trasferimento, o per chiamare un contratto intelligente, non serve per i trasferimenti di saldo; guarda la nota più avanti. -- `signedTx`: Per firmare il nostro oggetto di transazione, useremo il metodo `signTransaction` con la nostra `PRIVATE_KEY` -- `sendSignedTransaction`: Una volta che abbiamo una transazione firmata, possiamo inviarla per includerla in un blocco successivo usando `sendSignedTransaction` +- `nonce` : La specifica del nonce è usata per tenere traccia del numero di transazioni inviate dal tuo indirizzo. Ne abbiamo bisogno per scopi di sicurezza e per prevenire [attacchi di replay](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Per ottenere il numero di transazioni inviate dal tuo indirizzo usiamo [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +- `transaction`: L'oggetto della transazione ha alcuni aspetti che dobbiamo specificare + - `to`: Questo è l'indirizzo a cui vogliamo inviare ETH. In questo caso, stiamo inviando ETH indietro al [rubinetto di Sepolia](https://sepoliafaucet.com/) da cui li avevamo inizialmente richiesti. + - `value`: Questo è l'importo che desideriamo inviare, specificato in Wei dove 10^18 Wei = 1 ETH + - `gas`: Ci sono molti modi per determinare la giusta quantità di gas da includere nella tua transazione. Alchemy ha persino un [webhook per il prezzo del gas](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) per avvisarti quando il prezzo del gas scende entro una certa soglia. Per le transazioni sulla rete principale, è buona norma controllare uno stimatore di gas come [ETH Gas Station](https://ethgasstation.info/) per determinare la giusta quantità di gas da includere. 21000 è la quantità minima di gas che un'operazione su Ethereum userà, quindi per assicurarci che la nostra transazione venga eseguita mettiamo 30000 qui. + - `nonce`: vedi la definizione di nonce sopra. Il nonce inizia a contare da zero. + - [OPZIONALE] data: Usato per inviare informazioni aggiuntive con il tuo trasferimento, o per chiamare un contratto intelligente, non richiesto per i trasferimenti di saldo, dai un'occhiata alla nota qui sotto. +- `signedTx`: Per firmare il nostro oggetto transazione useremo il metodo `signTransaction` con la nostra `PRIVATE_KEY` +- `sendSignedTransaction`: Una volta che abbiamo una transazione firmata, possiamo inviarla per essere inclusa in un blocco successivo usando `sendSignedTransaction` -**Una Nota sui dati** Esistono due tipi principali di transazioni che è possibile inviare su Ethereum. +**Una nota sui dati (data)** +Ci sono due tipi principali di transazioni che possono essere inviate su Ethereum. -- Trasferimento del saldo: Invia ETH da un indirizzo a un altro. Non serve nessun campo di dati, ma se vuoi inviare ulteriori informazioni insieme alla tua transazione, puoi inserire queste informazioni nel formato HEX in questo campo. - - Ad esempio, ipotizziamo di voler scrivere l'hash di un documento IPFS per la catena di Ethereum per dargli una marca oraria immutabile. Il campo dei nostri dati dovrebbe essere così: dati: `web3.utils.toHex(‘IPFS hash‘)`. Ora tutti possono interrogare la catena e vedere quando quel documento è stato aggiunto. -- Transazione del contratto intelligente: esegui il codice di qualche contratto intelligente sulla catena. In questo caso, il campo di dati dovrebbe contenere la funzione intelligente che vorresti eseguire, insieme a eventuali parametri. - - Per un esempio pratico, dai un'occhiata alla fase 8 in questo [Tutorial Hello World](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). +- Trasferimento di saldo: Invia ETH da un indirizzo a un altro. Nessun campo dati richiesto, tuttavia, se desideri inviare informazioni aggiuntive insieme alla tua transazione, puoi includere tali informazioni in formato HEX in questo campo. + - Ad esempio, supponiamo di voler scrivere l'hash di un documento IPFS sulla catena di Ethereum al fine di dargli un timestamp immutabile. Il nostro campo dati dovrebbe quindi apparire come data: `web3.utils.toHex(‘IPFS hash‘)`. E ora chiunque può interrogare la catena e vedere quando quel documento è stato aggiunto. +- Transazione di contratto intelligente: Esegui del codice di un contratto intelligente sulla catena. In questo caso, il campo dati dovrebbe contenere la funzione intelligente che desideri eseguire, insieme a eventuali parametri. + - Per un esempio pratico, dai un'occhiata al Passaggio 8 in questo [Tutorial Hello World](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). ### 8\. Esegui il codice usando `node sendTx.js` {#run-the-code-using-node-sendtx-js} -Torna al terminale o alla riga di comando ed esegui: +Torna al tuo terminale o riga di comando ed esegui: ``` node sendTx.js ``` -### 9\. Visualizza la tua transazione nel Mempool {#see-your-transaction-in-the-mempool} +### 9\. Vedi la tua transazione nella Mempool {#see-your-transaction-in-the-mempool} -Apri la [pagina del Mempool](https://dashboard.alchemyapi.io/mempool) nel tuo pannello di controllo di Alchemy e filtra per l'app che hai creato per trovare la tua transazione. Qui possiamo visualizzare la transizione della nostra transazione dallo stato in sospeso allo stato minato (se andata a buon fine) o allo stato abbandonato (se non riuscita). Assicurati di mantenerlo su "Tutti" così da intercettare le transazioni "minate", "in sospeso" e "abbandonate". Puoi anche cercare la tua transazione tra le transazioni inviate all'indirizzo `0x31b98d14007bdee637298086988a0bbd31184523` . +Apri la [pagina Mempool](https://dashboard.alchemyapi.io/mempool) nella tua dashboard di Alchemy e filtra per l'app che hai creato per trovare la tua transazione. È qui che possiamo osservare la nostra transazione passare dallo stato in sospeso (pending) allo stato minato (mined) (se ha successo) o allo stato scartato (dropped) se non ha successo. Assicurati di mantenerlo su "All" in modo da catturare le transazioni "mined", "pending" e "dropped". Puoi anche cercare la tua transazione cercando le transazioni inviate all'indirizzo `0x31b98d14007bdee637298086988a0bbd31184523` . -Per visualizzare i dettagli della tua transazione, una volta trovata, seleziona l'hash tx, che dovrebbe portarti a una vista simile a questa: +Per visualizzare i dettagli della tua transazione una volta trovata, seleziona l'hash della transazione (tx hash), che dovrebbe portarti a una vista simile a questa: -![Screenshot del Mempool Watcher](./mempool.png) +![Screenshot del visualizzatore della mempool](./mempool.png) -Da qui puoi visualizzare la tua transazione su Etherscan, cliccando sull'icona cerchiata in rosso! +Da lì puoi visualizzare la tua transazione su Etherscan cliccando sull'icona cerchiata in rosso! -**Evviva! Hai appena inviato la tua prima transazione di Ethereum usando Alchemy** +**Evviva! Hai appena inviato la tua prima transazione su Ethereum usando Alchemy 🎉** -_Per feedback e suggerimenti su questa guida, puoi scrivere a Elan su [Discord](https://discord.gg/A39JVCM) di Alchemy!_ +_Per feedback e suggerimenti su questa guida, invia un messaggio a Elan sul [Discord](https://discord.gg/A39JVCM) di Alchemy!_ -_Originariamente pubblicato su [https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy](https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy)_ +_Pubblicato originariamente su [https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy](https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy)_ \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/server-components/index.md b/public/content/translations/it/developers/tutorials/server-components/index.md new file mode 100644 index 00000000000..2a4235758c7 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/server-components/index.md @@ -0,0 +1,296 @@ +--- +title: "Componenti server e agenti per app web3" +description: "Dopo aver letto questo tutorial, sarai in grado di scrivere server TypeScript che ascoltano gli eventi su una blockchain e rispondono di conseguenza con le proprie transazioni. Questo ti consentirà di scrivere applicazioni centralizzate (poiché il server è un punto di vulnerabilità), ma in grado di interagire con le entità web3. Le stesse tecniche possono essere utilizzate anche per scrivere un agente che risponde agli eventi on-chain senza l'intervento umano." + +author: Ori Pomerantz +lang: it +tags: ["agente", "server", "fuori catena", "dApp"] +skill: beginner +breadcrumb: Componenti server +published: 2024-07-15 +--- + +## Introduzione {#introduction} + +Nella maggior parte dei casi, un'app decentralizzata utilizza un server per distribuire il software, ma tutta l'interazione effettiva avviene tra il client (in genere, il browser web) e la blockchain. + +![Interazione normale tra server web, client e blockchain](./fig-1.svg) + +Tuttavia, ci sono alcuni casi in cui un'applicazione trarrebbe vantaggio dall'avere un componente server che viene eseguito in modo indipendente. Un tale server sarebbe in grado di rispondere agli eventi e alle richieste provenienti da altre fonti, come un'API, emettendo transazioni. + +![L'interazione con l'aggiunta di un server](./fig-2.svg) + +Ci sono diverse possibili attività che un tale server potrebbe svolgere. + +- Detentore di uno stato segreto. Nel gaming è spesso utile non avere tutte le informazioni note al gioco a disposizione dei giocatori. Tuttavia, _non ci sono segreti sulla blockchain_, qualsiasi informazione presente nella blockchain è facile da scoprire per chiunque. Pertanto, se parte dello stato del gioco deve essere mantenuta segreta, deve essere archiviata altrove (e possibilmente far verificare gli effetti di tale stato utilizzando [prove a conoscenza-zero](/zero-knowledge-proofs)). + +- Oracolo centralizzato. Se la posta in gioco è sufficientemente bassa, un server esterno che legge alcune informazioni online e poi le pubblica sulla catena potrebbe essere sufficiente per essere utilizzato come [oracolo](/developers/docs/oracles/). + +- Agente. Non succede nulla sulla blockchain senza una transazione che lo attivi. Un server può agire per conto di un utente per eseguire azioni come l'[arbitraggio](/developers/docs/mev/#mev-examples-dex-arbitrage) quando se ne presenta l'opportunità. + +## Programma di esempio {#sample-program} + +Puoi vedere un server di esempio [su github](https://github.com/qbzzt/20240715-server-component). Questo server ascolta gli eventi provenienti da [questo contratto](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=contract_code), una versione modificata del Greeter di Hardhat. Quando il saluto viene modificato, lo ripristina. + +Per eseguirlo: + +1. Clona il repository. + + ```sh copy + git clone https://github.com/qbzzt/20240715-server-component.git + cd 20240715-server-component +``` + +2. Installa i pacchetti necessari. Se non lo hai già fatto, [installa prima Node](https://nodejs.org/en/download/package-manager). + + ```sh copy + npm install +``` + +3. Modifica `.env` per specificare la chiave privata di un account che possiede ETH sulla rete di test Holesky. Se non hai ETH su Holesky, puoi [usare questo rubinetto](https://holesky-faucet.pk910.de/). + + ```sh filename=".env" copy + PRIVATE_KEY=0x +``` + +4. Avvia il server. + + ```sh copy + npm start +``` + +5. Vai su [un esploratore di blocchi](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract) e, utilizzando un indirizzo diverso da quello che possiede la chiave privata, modifica il saluto. Vedrai che il saluto viene automaticamente ripristinato. + +### Come funziona? {#how-it-works} + +Il modo più semplice per capire come scrivere un componente server è esaminare l'esempio riga per riga. + +#### `src/app.ts` {#src-app-ts} + +La stragrande maggioranza del programma è contenuta in [`src/app.ts`](https://github.com/qbzzt/20240715-server-component/blob/main/src/app.ts). + +##### Creazione degli oggetti prerequisiti + +```typescript +import { + createPublicClient, + createWalletClient, + getContract, + http, + Address, +} from "viem" +``` + +Queste sono le entità di [Viem](https://viem.sh/) di cui abbiamo bisogno, le funzioni e [il tipo `Address`](https://viem.sh/docs/glossary/types#address). Questo server è scritto in [TypeScript](https://www.typescriptlang.org/), che è un'estensione di JavaScript che lo rende [fortemente tipizzato](https://en.wikipedia.org/wiki/Strong_and_weak_typing). + +```typescript +import { privateKeyToAccount } from "viem/accounts" +``` + +[Questa funzione](https://viem.sh/docs/accounts/privateKey) ci consente di generare le informazioni del portafoglio, incluso l'indirizzo, corrispondenti a una chiave privata. + +```typescript +import { holesky } from "viem/chains" +``` + +Per utilizzare una blockchain in Viem è necessario importarne la definizione. In questo caso, vogliamo connetterci alla blockchain di test [Holesky](https://github.com/eth-clients/holesky). + +```typescript +// Ecco come aggiungiamo le definizioni in .env a process.env. +import * as dotenv from "dotenv" +dotenv.config() +``` + +Ecco come leggiamo `.env` nell'ambiente. Ne abbiamo bisogno per la chiave privata (vedi in seguito). + +```typescript +const greeterAddress : Address = "0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6" +const greeterABI = [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + . + . + . + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] as const +``` + +Per utilizzare un contratto abbiamo bisogno del suo indirizzo e della sua [ABI](/glossary/#abi). Li forniamo entrambi qui. + +In JavaScript (e quindi in TypeScript) non puoi assegnare un nuovo valore a una costante, ma _puoi_ modificare l'oggetto in essa memorizzato. Utilizzando il suffisso `as const` stiamo dicendo a TypeScript che l'elenco stesso è costante e non può essere modificato. + +```typescript +const publicClient = createPublicClient({ + chain: holesky, + transport: http(), +}) +``` + +Crea un [client pubblico](https://viem.sh/docs/clients/public.html) Viem. I client pubblici non hanno una chiave privata associata e pertanto non possono inviare transazioni. Possono chiamare [funzioni `view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm), leggere i saldi degli account, ecc. + +```typescript +const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) +``` + +Le variabili d'ambiente sono disponibili in [`process.env`](https://www.totaltypescript.com/how-to-strongly-type-process-env). Tuttavia, TypeScript è fortemente tipizzato. Una variabile d'ambiente può essere qualsiasi stringa, o vuota, quindi il tipo per una variabile d'ambiente è `string | undefined`. Tuttavia, una chiave è definita in Viem come `0x${string}` (`0x` seguito da una stringa). Qui diciamo a TypeScript che la variabile d'ambiente `PRIVATE_KEY` sarà di quel tipo. In caso contrario, otterremo un errore di runtime. + +La funzione [`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey) utilizza quindi questa chiave privata per creare un oggetto account completo. + +```typescript +const walletClient = createWalletClient({ + account, + chain: holesky, + transport: http(), +}) +``` + +Successivamente, utilizziamo l'oggetto account per creare un [client portafoglio](https://viem.sh/docs/clients/wallet). Questo client ha una chiave privata e un indirizzo, quindi può essere utilizzato per inviare transazioni. + +```typescript +const greeter = getContract({ + address: greeterAddress, + abi: greeterABI, + client: { public: publicClient, wallet: walletClient }, +}) +``` + +Ora che abbiamo tutti i prerequisiti, possiamo finalmente creare un'[istanza del contratto](https://viem.sh/docs/contract/getContract). Utilizzeremo questa istanza del contratto per comunicare con il contratto on-chain. + +##### Lettura dalla blockchain + +```typescript +console.log(`Current greeting:`, await greeter.read.greet()) +``` + +Le funzioni del contratto di sola lettura ([`view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) e [`pure`](https://www.tutorialspoint.com/solidity/solidity_pure_functions.htm)) sono disponibili sotto `read`. In questo caso, lo utilizziamo per accedere alla funzione [`greet`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=read_contract#cfae3217), che restituisce il saluto. + +JavaScript è a thread singolo, quindi quando avviamo un processo di lunga durata dobbiamo [specificare che lo facciamo in modo asincrono](https://eloquentjavascript.net/11_async.html#h-XvLsfAhtsE). Chiamare la blockchain, anche per un'operazione di sola lettura, richiede un viaggio di andata e ritorno tra il computer e un nodo della blockchain. Questo è il motivo per cui specifichiamo qui che il codice deve attendere (`await`) il risultato. + +Se sei interessato a come funziona, puoi [leggerlo qui](https://www.w3schools.com/js/js_promise.asp), ma in termini pratici tutto ciò che devi sapere è che devi usare `await` per i risultati se avvii un'operazione che richiede molto tempo, e che qualsiasi funzione che lo fa deve essere dichiarata come `async`. + +##### Emissione di transazioni + +```typescript +const setGreeting = async (greeting: string): Promise => { +``` + +Questa è la funzione che chiami per emettere una transazione che modifica il saluto. Poiché si tratta di un'operazione lunga, la funzione è dichiarata come `async`. A causa dell'implementazione interna, qualsiasi funzione `async` deve restituire un oggetto `Promise`. In questo caso, `Promise` significa che non specifichiamo cosa verrà esattamente restituito nella `Promise`. + +```typescript +const txHash = await greeter.write.setGreeting([greeting]) +``` + +Il campo `write` dell'istanza del contratto contiene tutte le funzioni che scrivono nello stato della blockchain (quelle che richiedono l'invio di una transazione), come [`setGreeting`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract#a4136862). I parametri, se presenti, vengono forniti come elenco e la funzione restituisce l'hash della transazione. + +```typescript + console.log(`Working on a fix, see https://eth-holesky.blockscout.com/tx/${txHash}`) + + return txHash +} +``` + +Segnala l'hash della transazione (come parte di un URL all'esploratore di blocchi per visualizzarlo) e restituiscilo. + +##### Rispondere agli eventi + +```typescript +greeter.watchEvent.SetGreeting({ +``` + +[La funzione `watchEvent`](https://viem.sh/docs/actions/public/watchEvent) ti consente di specificare che una funzione deve essere eseguita quando viene emesso un evento. Se ti interessa solo un tipo di evento (in questo caso, `SetGreeting`), puoi utilizzare questa sintassi per limitarti a quel tipo di evento. + +```typescript + onLogs: logs => { +``` + +La funzione `onLogs` viene chiamata quando ci sono voci di registro. In Ethereum "log" ed "evento" sono solitamente intercambiabili. + +```typescript +console.log( + `Address ${logs[0].args.sender} changed the greeting to ${logs[0].args.greeting}` +) +``` + +Potrebbero esserci più eventi, ma per semplicità ci interessa solo il primo. `logs[0].args` sono gli argomenti dell'evento, in questo caso `sender` e `greeting`. + +```typescript + if (logs[0].args.sender != account.address) + setGreeting(`${account.address} insists on it being Hello!`) + } +}) +``` + +Se il mittente _non_ è questo server, usa `setGreeting` per cambiare il saluto. + +#### `package.json` {#package-json} + +[Questo file](https://github.com/qbzzt/20240715-server-component/blob/main/package.json) controlla la configurazione di [Node.js](https://nodejs.org/en). Questo articolo spiega solo le definizioni importanti. + +```json +{ + "main": "dist/index.js", +``` + +Questa definizione specifica quale file JavaScript eseguire. + +```json + "scripts": { + "start": "tsc && node dist/app.js", + }, +``` + +Gli script sono varie azioni dell'applicazione. In questo caso, l'unico che abbiamo è `start`, che compila e poi esegue il server. Il comando `tsc` fa parte del pacchetto `typescript` e compila TypeScript in JavaScript. Se vuoi eseguirlo manualmente, si trova in `node_modules/.bin`. Il secondo comando esegue il server. + +```json + "type": "module", +``` + +Esistono diversi tipi di applicazioni node JavaScript. Il tipo `module` ci consente di avere `await` nel codice di livello superiore, il che è importante quando si eseguono operazioni lente (e quindi asincrone). + +```json + "devDependencies": { + "@types/node": "^20.14.2", + "typescript": "^5.4.5" + }, +``` + +Questi sono pacchetti richiesti solo per lo sviluppo. Qui abbiamo bisogno di `typescript` e, poiché lo stiamo utilizzando con Node.js, stiamo anche ottenendo i tipi per le variabili e gli oggetti di node, come `process`. [La notazione `^`](https://github.com/npm/node-semver?tab=readme-ov-file#caret-ranges-123-025-004) indica quella versione o una versione superiore che non presenta modifiche incompatibili. Vedi [qui](https://semver.org) per maggiori informazioni sul significato dei numeri di versione. + +```json + "dependencies": { + "dotenv": "^16.4.5", + "viem": "2.14.1" + } +} +``` + +Questi sono pacchetti richiesti in fase di esecuzione, quando si esegue `dist/app.js`. + +## Conclusione {#conclusion} + +Il server centralizzato che abbiamo creato qui fa il suo lavoro, ovvero agire come agente per un utente. Chiunque altro voglia che la dApp continui a funzionare e sia disposto a spendere il gas può eseguire una nuova istanza del server con il proprio indirizzo. + +Tuttavia, questo funziona solo quando le azioni del server centralizzato possono essere facilmente verificate. Se il server centralizzato ha informazioni di stato segrete o esegue calcoli difficili, è un'entità centralizzata di cui devi fidarti per utilizzare l'applicazione, che è esattamente ciò che le blockchain cercano di evitare. In un articolo futuro ho intenzione di mostrare come utilizzare le [prove a conoscenza-zero](/zero-knowledge-proofs) per aggirare questo problema. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/it/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md index dfa2b35e011..8fe243e2c3b 100644 --- a/public/content/translations/it/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md +++ b/public/content/translations/it/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -1,12 +1,10 @@ --- -title: Configura web3.js per usare la blockchain di Ethereum in JavaScript -description: Come usare uno Smart Contract per interagire con un token utilizzando il linguaggio Solidity +title: Configurare web3.js per usare la blockchain di Ethereum in JavaScript +description: Scopri come impostare e configurare la libreria web3.js per interagire con la blockchain di Ethereum dalle applicazioni JavaScript. author: "jdourlens" -tags: - - "web3.js" - - "javascript" +tags: ["web3.js", "JavaScript"] skill: beginner -breadcrumb: "Configurare web3.js" +breadcrumb: configurazione di web3.js lang: it published: 2020-04-11 source: EthereumDev @@ -14,39 +12,39 @@ sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" --- -In questo tutorial, vedremo come muovere i primi passi con [web3.js](https://web3js.readthedocs.io/) per interagire con la blockchain di Ethereum. Web3.js è utilizzabile sia in frontend che backend per leggere i dati dalla blockchain o effettuare transazioni e persino distribuire gli smart contract. +In questo tutorial, vedremo come iniziare con [web3.js](https://web3js.readthedocs.io/) per interagire con la blockchain di Ethereum. Web3.js può essere usato sia nei frontend che nei backend per leggere dati dalla blockchain o effettuare transazioni e persino distribuire contratti intelligenti. -Per prima cosa occorre includere web3.js nel progetto. Per usarlo in una pagina web, puoi importare la libreria direttamente usando un CDN come JSDeliver. +Il primo passo è includere web3.js nel tuo progetto. Per usarlo in una pagina web, puoi importare la libreria direttamente usando una CDN come JSDeliver. ```html ``` -Se preferisci installare la libreria da usare nel progetto di backend o frontend che usa build, puoi usare npm: +Se preferisci installare la libreria per usarla nel tuo backend o in un progetto frontend che usa build, puoi installarla usando npm: ```bash npm install web3 --save ``` -A questo punto, per importare Web3.js in uno script Node.js o un progetto frontend di Browserify, puoi usare la seguente riga di JavaScript: +Quindi, per importare Web3.js in uno script Node.js o in un progetto frontend Browserify, puoi usare la seguente riga di JavaScript: ```js const Web3 = require("web3") ``` -Ora che hai incluso la libreria nel progetto, dobbiamo inizializzarla. Il progetto deve poter comunicare con la blockchain. Gran parte delle librerie di Ethereum comunica con un [nodo](/developers/docs/nodes-and-clients/) tramite le chiamate RPC. Per avviare il nostro provider Web3, istanzieremo un'istanza di Web3 passando per il costruttore dell'URL del provider. Se hai un nodo o un'[istanza ganache in esecuzione sul tuo computer](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/), apparirà così: +Ora che abbiamo incluso la libreria nel progetto, dobbiamo inizializzarla. Il tuo progetto deve essere in grado di comunicare con la blockchain. La maggior parte delle librerie di Ethereum comunica con un [nodo](/developers/docs/nodes-and-clients/) tramite chiamate RPC. Per avviare il nostro provider Web3, istanzieremo un'istanza Web3 passando come costruttore l'URL del provider. Se hai un nodo o [un'istanza ganache in esecuzione sul tuo computer](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) apparirà così: ```js const web3 = new Web3("http://localhost:8545") ``` -Se vorresti avere accesso diretto a un nodo ospitato, puoi trovare le opzioni su [nodi come servizi](/developers/docs/nodes-and-clients/nodes-as-a-service). +Se desideri accedere direttamente a un nodo ospitato, puoi trovare delle opzioni su [nodi come servizio](/developers/docs/nodes-and-clients/nodes-as-a-service). ```js const web3 = new Web3("https://cloudflare-eth.com") ``` -Per verificare di aver configurato correttamente la nostra istanza di Web3, proveremo a recuperare il numero dell'ultimo blocco usando la funzione `getBlockNumber`. Questa funzione accetta un callback come parametro e restituisce il numero del blocco come un intero. +Per testare di aver configurato correttamente la nostra istanza Web3, proveremo a recuperare l'ultimo numero del blocco usando la funzione `getBlockNumber`. Questa funzione accetta un callback come parametro e restituisce il numero del blocco come intero. ```js var Web3 = require("web3") @@ -57,7 +55,7 @@ web3.eth.getBlockNumber(function (error, result) { }) ``` -Se viene eseguito, questo programma produrrà semplicemente il numero dell'ultimo blocco: la cima della blockchain. Puoi anche usare le chiamate della funzione `await/async` per evitare di annidare delle callback nel tuo codice: +Se esegui questo programma, stamperà semplicemente l'ultimo numero del blocco: la cima della blockchain. Puoi anche usare le chiamate di funzione `await/async` per evitare di annidare i callback nel tuo codice: ```js async function getBlockNumber() { @@ -69,27 +67,27 @@ async function getBlockNumber() { getBlockNumber() ``` -Puoi vedere tutte le funzioni disponibili sull'istanza di web3 nella [documentazione ufficiale di web3.js](https://docs.web3js.org/). +Puoi vedere tutte le funzioni disponibili sull'istanza Web3 nella [documentazione ufficiale di web3.js](https://docs.web3js.org/). -Gran parte delle librerie di Web3 sono asincrone perché, in background, la libreria effettua chiamate RPC di JSON al nodo, il quale restituisce il risultato. +La maggior parte delle librerie Web3 sono asincrone perché in background la libreria effettua chiamate JSON-RPC al nodo che restituisce il risultato. -Se lavori nel browser, alcuni portafogli iniettano direttamente un'istanza Web3 e dovresti provare a usarla appena possibile, specialmente se prevedi di interagire con l'indirizzo di Ethereum dell'utente per effettuare le transazioni. +Se stai lavorando nel browser, alcuni portafogli iniettano direttamente un'istanza Web3 e dovresti cercare di usarla ogni volta che è possibile, specialmente se prevedi di interagire con l'indirizzo Ethereum dell'utente per effettuare transazioni. -Qui riportiamo il frammento che permette di rilevare se è disponibile un portafoglio di MetaMask e, in tal caso, provare ad abilitarlo. In seguito, ti consentirà di leggere il saldo dell'utente e abilitarlo per convalidare le transazioni che vorresti effettuasse sulla blockchain di Ethereum: +Ecco lo snippet per rilevare se un portafoglio MetaMask è disponibile e provare ad abilitarlo se lo è. In seguito ti permetterà di leggere il saldo dell'utente e di abilitarlo a convalidare le transazioni che vorresti fargli fare sulla blockchain di Ethereum: ```js if (window.ethereum != null) { state.web3 = new Web3(window.ethereum) try { - // Request account access if needed + // Richiedi l'accesso all'account se necessario await window.ethereum.enable() - // Accounts now exposed + // Account ora esposti } catch (error) { - // User denied account access... + // L'utente ha negato l'accesso all'account... } } ``` -Alternative a web3.js come [Ethers.js](https://docs.ethers.io/) esistono e sono anche utilizzate comunemente. Nel prossimo tutorial vedremo [come ascoltare facilmente i nuovi blocchi in arrivo sulla blockchain e esaminarne il contenuto](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). +Esistono alternative a web3.js come [Ethers.js](https://docs.ethers.io/) e sono anch'esse comunemente usate. Nel prossimo tutorial vedremo [come ascoltare facilmente i nuovi blocchi in arrivo sulla blockchain e vedere cosa contengono](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/short-abi/index.md b/public/content/translations/it/developers/tutorials/short-abi/index.md index 928c6a18c6e..cd84321ff5a 100644 --- a/public/content/translations/it/developers/tutorials/short-abi/index.md +++ b/public/content/translations/it/developers/tutorials/short-abi/index.md @@ -1,96 +1,119 @@ --- title: "ABI brevi per l'ottimizzazione dei calldata" -description: Ottimizzare gli smart contract per i Rollup ottimistici +description: Ottimizzare i contratti intelligenti per i rollup ottimistici author: Ori Pomerantz lang: it -tags: - - "livello 2" +tags: ["livello 2"] skill: intermediate -breadcrumb: "ABI corti" +breadcrumb: ABI brevi published: 2022-04-01 --- ## Introduzione {#introduction} -In questo articolo conoscerai i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups), il costo delle transazioni su di essi e come tale diversa struttura di costo ci imponga di ottimizzare diversi aspetti rispetto alla Rete principale di Ethereum. Imparerai anche come implementare quest'ottimizzazione. +In questo articolo, imparerai a conoscere i [rollup ottimistici](/developers/docs/scaling/optimistic-rollups), il costo delle transazioni su di essi e come questa diversa struttura dei costi ci richieda di ottimizzare per cose diverse rispetto alla rete principale di Ethereum. +Imparerai anche come implementare questa ottimizzazione. -### Divulgazione completa {#full-disclosure} +### Piena trasparenza {#full-disclosure} -Sono un dipendente a tempo pieno di [Optimism](https://www.optimism.io/), quindi gli esempi in questo articolo saranno eseguiti su Optimism. Tuttavia la tecnica qui spiegata dovrebbe funzionare altrettanto bene per altri rollup. +Sono un dipendente a tempo pieno di [Optimism](https://www.optimism.io/), quindi gli esempi in questo articolo verranno eseguiti su Optimism. +Tuttavia, la tecnica spiegata qui dovrebbe funzionare altrettanto bene per altri rollup. ### Terminologia {#terminology} -Parlando di rollup, il termine "livello 1" (L1) è usato per la Rete principale, la rete di produzione di Ethereum. Il termine "livello 2" (L2) è usato per il rollup o qualsiasi altro sistema che si basa sul L1 per la sicurezza ma svolge gran parte della sua elaborazione al di fuori della catena. +Quando si discute dei rollup, il termine 'livello 1' (L1) è usato per la rete principale, la rete Ethereum di produzione. +Il termine 'livello 2' (L2) è usato per il rollup o qualsiasi altro sistema che si affida a L1 per la sicurezza ma esegue la maggior parte della sua elaborazione fuori catena. ## Come possiamo ridurre ulteriormente il costo delle transazioni su L2? {#how-can-we-further-reduce-the-cost-of-L2-transactions} -I [Rollup ottimistici](/developers/docs/scaling/optimistic-rollups) devono conservare un registro di ogni transazione storica, così che chiunque possa consultarlo e verificare che lo stato corrente sia corretto. Il metodo più economico per inserire dati nella Rete principale di Ethereum è scriverli come calldata. Questa soluzione è stata scelta sia da [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) che da [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups). +I [rollup ottimistici](/developers/docs/scaling/optimistic-rollups) devono conservare un registro di ogni transazione storica in modo che chiunque possa esaminarle e verificare che lo stato attuale sia corretto. +Il modo più economico per inserire dati nella rete principale di Ethereum è scriverli come calldata. +Questa soluzione è stata scelta sia da [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) che da [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups). ### Costo delle transazioni su L2 {#cost-of-l2-transactions} -Il costo delle transazioni su L2 ha due componenti: +Il costo delle transazioni su L2 è composto da due componenti: -1. Elaborazione su L2, solitamente estremamente economica -2. Archiviazione sul L1, legata ai costi del gas della Rete Principale +1. Elaborazione su L2, che di solito è estremamente economica +2. Archiviazione su L1, che è legata ai costi del gas della rete principale -Al momento della redazione, su Optimism il costo del gas del L2 è 0,001 [Gwei](/developers/docs/gas/#pre-london). Il costo del gas del L1, d'altra parte, è approssimativamente di 40 gwei. [Puoi visualizzare i prezzi correnti qui](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). +Nel momento in cui scrivo, su Optimism il costo del gas su L2 è di 0,001 [Gwei](/developers/docs/gas/#pre-london). +Il costo del gas su L1, d'altra parte, è di circa 40 gwei. +[Puoi vedere i prezzi attuali qui](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). -Un byte di dati di chiamata costa 4 gas (se è zero) o 16 gas (se ha qualsiasi altro valore). Una delle operazioni più costose sull'EVM è scrivere in memoria. Il costo massimo della scrittura di una parola di 32 byte all'archiviazione sul L2, è di 22.100 gas. Attualmente, ciò equivale a 22,1 gwei. Quindi, se possiamo risparmiare un singolo byte zero di calldata, potremo scrivere circa 200 byte in memoria e ne usciremo comunque bene. +Un byte di calldata costa 4 gas (se è zero) o 16 gas (se è qualsiasi altro valore). +Una delle operazioni più costose sulla macchina virtuale di Ethereum è la scrittura nell'archiviazione. +Il costo massimo per scrivere una parola di 32 byte nell'archiviazione su L2 è di 22100 gas. Attualmente, questo equivale a 22,1 gwei. +Quindi, se riusciamo a risparmiare un singolo byte zero di calldata, saremo in grado di scrivere circa 200 byte nell'archiviazione e trarne comunque vantaggio. ### L'ABI {#the-abi} -La stragrande maggioranza delle transazioni, accede a un contratto da un conto posseduto esternamente. Gran parte dei contratti è scritta in Solidity e interpreta il proprio campo dei dati secondo [l'interfaccia binaria dell'applicazione (Application Binary Interface – ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). +La stragrande maggioranza delle transazioni accede a un contratto da un account controllato esternamente. +La maggior parte dei contratti è scritta in Solidity e interpreta il proprio campo dati secondo [l'interfaccia binaria dell'applicazione (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). -Tuttavia, l'ABI è stata progettata per il L1, dove un byte di calldata costa approssimativamente quanto quattro operazioni aritmetiche, non per il L2 dove un byte di calldata costa più di un migliaio di operazioni aritmetiche. Ad esempio, [ecco una transazione di trasferimento ERC-20](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998). I calldata sono divisi come segue: +Tuttavia, l'ABI è stata progettata per L1, dove un byte di calldata costa all'incirca quanto quattro operazioni aritmetiche, non per L2 dove un byte di calldata costa più di mille operazioni aritmetiche. +I calldata sono divisi in questo modo: -| Sezione | Lunghezza | Byte | Byte sprecati | Gas sprecato | Byte necessari | Gas necessario | -| ------------------------- | ---------:| -----:| -------------:| ------------:| --------------:| --------------:| -| Selettore della funzione | 4 | 0-3 | 3 | 48 | 1 | 16 | -| Zeri | 12 | 4-15 | 12 | 48 | 0 | 0 | -| Indirizzo di destinazione | 20 | 16-35 | 0 | 0 | 20 | 320 | -| Importo | 32 | 36-67 | 17 | 64 | 15 | 240 | -| Totale | 68 | | | 160 | | 576 | +| Sezione | Lunghezza | Byte | Byte sprecati | Gas sprecato | Byte necessari | Gas necessario | +| ------------------- | -----: | ----: | -----------: | ---------: | --------------: | ------------: | +| Selettore di funzione | 4 | 0-3 | 3 | 48 | 1 | 16 | +| Zeri | 12 | 4-15 | 12 | 48 | 0 | 0 | +| Indirizzo di destinazione | 20 | 16-35 | 0 | 0 | 20 | 320 | +| Importo | 32 | 36-67 | 17 | 64 | 15 | 240 | +| Totale | 68 | | | 160 | | 576 | Spiegazione: -- **Selettore della funzione**: il contratto ha meno di 256 funzioni, quindi, possiamo distinguerle con un solo byte. Questi byte sono tipicamente diversi da zero e, dunque, [costano sedici gas](https://eips.ethereum.org/EIPS/eip-2028). -- **Zeri**: questi byte sono sempre zero perché un indirizzo di venti byte non richiede una parola di trentadue byte. I byte contenenti zero costano quattro gas ([vedi lo yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), Appendice G, p. 27, il valore per `G``txdatazero`). -- **Importo**: se supponiamo che in questo contratto, `decimals` sia diciotto (il valore normale) e l'importo massimo di token che trasferiamo sarà 1018, otteniamo un importo massimo di 1036. 25615 > 1036, quindi quindici byte sono sufficienti. +- **Selettore di funzione**: Il contratto ha meno di 256 funzioni, quindi possiamo distinguerle con un singolo byte. + Questi byte sono tipicamente diversi da zero e pertanto [costano sedici gas](https://eips.ethereum.org/EIPS/eip-2028). +- **Zeri**: Questi byte sono sempre zero perché un indirizzo di venti byte non richiede una parola di trentadue byte per contenerlo. + I byte che contengono zero costano quattro gas ([vedi lo yellow paper](https://ethereum.github.io/yellowpaper/paper.pdf), Appendice G, + p. 27, il valore per `G``txdatazero`). +- **Importo**: Se supponiamo che in questo contratto i `decimals` siano diciotto (il valore normale) e l'importo massimo di token che trasferiremo sarà 1018, otteniamo un importo massimo di 1036. + 25615 > 1036, quindi quindici byte sono sufficienti. -Uno spreco di 160 gas sul L1 è di norma trascurabile. Una transazione costa almeno [21.000 gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), quindi un ulteriore 0,8% non conta. Tuttavia, sul L2 le cose sono diverse. Quasi l'intero costo della transazione deriva dalla scrittura sul L1. Oltre ai calldata della transazione, ci sono 109 byte di intestazione della transazione (indirizzo di destinazione, firma, ecc.). Il costo totale è dunque `109*16+576+160=2480`, e ne stiamo sprecando circa il 6,5%. +Uno spreco di 160 gas su L1 è normalmente trascurabile. Una transazione costa almeno [21.000 gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), quindi uno 0,8% in più non ha importanza. +Tuttavia, su L2, le cose sono diverse. Quasi l'intero costo della transazione è scriverla su L1. +Oltre ai calldata della transazione, ci sono 109 byte di intestazione della transazione (indirizzo di destinazione, firma, ecc.). +Il costo totale è quindi `109*16+576+160=2480`, e ne stiamo sprecando circa il 6,5%. -## Ridurre i costi quando non controlli la destinazione {#reducing-costs-when-you-dont-control-the-destination} +## Ridurre i costi quando non si controlla la destinazione {#reducing-costs-when-you-dont-control-the-destination} -Supponendo di non avere il controllo sul contratto di destinazione, puoi comunque usare una soluzione simile a [questa](https://github.com/qbzzt/ethereum.org-20220330-shortABI). Vediamo i file pertinenti. +Supponendo che tu non abbia il controllo sul contratto di destinazione, puoi comunque utilizzare una soluzione simile a [questa](https://github.com/qbzzt/ethereum.org-20220330-shortABI). +Esaminiamo i file rilevanti. ### Token.sol {#token-sol} -[Questo è il contratto di destinazione](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). È un contratto ERC-20 standard, con una funzionalità aggiuntiva. Questa funzione `faucet` consente a qualsiasi utente di ottenere dei token da usare. Renderebbe inutile una produzione del contratto ERC-20, ma semplifica la vita quando l'ERC-20 esiste solo per facilitare i test. +[Questo è il contratto di destinazione](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). +È un contratto ERC-20 standard, con una funzionalità aggiuntiva. +Questa funzione `faucet` consente a qualsiasi utente di ottenere dei token da utilizzare. +Renderebbe inutile un contratto ERC-20 di produzione, ma semplifica la vita quando un ERC-20 esiste solo per facilitare i test. ```solidity - /** - * @dev Gives the caller 1000 tokens to play with - */ + /* * + * @dev Fornisce al chiamante 1000 token con cui giocare */ + + + function faucet() external { _mint(msg.sender, 1000); - } // function faucet + } // function faucet ``` -[Puoi vedere un esempio di questo contratto distribuito qui](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). - ### CalldataInterpreter.sol {#calldatainterpreter-sol} -[Questo è il contratto che le transazioni dovrebbero chiamare con calldata più brevi](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). Analizziamolo riga per riga. +[Questo è il contratto che le transazioni dovrebbero chiamare con calldata più brevi](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). +Esaminiamolo riga per riga. ```solidity -//SPDX-License-Identifier: Unlicense +// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import { OrisUselessToken } from "./Token.sol"; ``` -Ci serve la funzione del token per sapere come chiamarla. +Abbiamo bisogno della funzione del token per sapere come chiamarla. ```solidity contract CalldataInterpreter { @@ -98,19 +121,22 @@ contract CalldataInterpreter { OrisUselessToken public immutable token; ``` -L'indirizzo del token per cui siamo un proxy. +L'indirizzo del token per il quale fungiamo da proxy. ```solidity - /** - * @dev Specify the token address - * @param tokenAddr_ ERC-20 contract address - */ + /* * + * @dev Specifica l'indirizzo del token + * @param tokenAddr_ Indirizzo del contratto ERC-20 */ + + + + constructor( address tokenAddr_ ) { token = OrisUselessToken(tokenAddr_); - } // constructor + } // constructor ``` L'indirizzo del token è l'unico parametro che dobbiamo specificare. @@ -120,7 +146,7 @@ L'indirizzo del token è l'unico parametro che dobbiamo specificare. private pure returns (uint) { ``` -Leggi un valore dai calldata. +Leggere un valore dai calldata. ```solidity uint _retVal; @@ -132,7 +158,9 @@ Leggi un valore dai calldata. "calldataVal trying to read beyond calldatasize"); ``` -Caricheremo in memoria un'unica parola da 32 byte (256 bit) e rimuoveremo i byte che non fanno parte del campo che vogliamo. Questo algoritmo non funziona per valori più lunghi di 32 byte e, ovviamente, non possiamo leggere oltre il termine dei calldata. Sul L1, potrebbe esser necessario saltare questi test per risparmiare sul gas, ma sul L2, il gas è estremamente economico, consentendo qualsiasi controllo d'integrità immaginabile. +Caricheremo una singola parola di 32 byte (256 bit) in memoria e rimuoveremo i byte che non fanno parte del campo che desideriamo. +Questo algoritmo non funziona per valori più lunghi di 32 byte e, naturalmente, non possiamo leggere oltre la fine dei calldata. +Su L1 potrebbe essere necessario saltare questi test per risparmiare sul gas, ma su L2 il gas è estremamente economico, il che consente qualsiasi controllo di integrità ci venga in mente. ```solidity assembly { @@ -140,16 +168,18 @@ Caricheremo in memoria un'unica parola da 32 byte (256 bit) e rimuoveremo i byte } ``` -Potremmo aver copiato i dati dalla chiamata a `fallback()` (vedi sotto), ma è più facile usare [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), il linguaggio assembly dell'EVM. +Avremmo potuto copiare i dati dalla chiamata a `fallback()` (vedi sotto), ma è più facile usare [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), il linguaggio assembly della macchina virtuale di Ethereum. -Qui usiamo [l'opcode CALLDATALOAD](https://www.evm.codes/#35) per leggere i byte da `startByte` a `startByte+31` nello stack. In generale, la sintassi di un opcode su Yul è `(,...)`. +Qui usiamo [l'opcode CALLDATALOAD](https://www.evm.codes/#35) per leggere i byte da `startByte` a `startByte+31` nello stack. +In generale, la sintassi di un opcode in Yul è `(,...)`. ```solidity _retVal = _retVal >> (256-length*8); ``` -Solo i byte `length` più significativi fanno parte del campo, quindi effettuiamo uno [spostamento a destra](https://en.wikipedia.org/wiki/Logical_shift) per liberarci degli altri valori. Questo ha il vantaggio aggiuntivo di spostare il valore a destra del campo, quindi è il valore stesso invece del valore moltiplicato per 256qualcosa. +Solo i byte di `length` più significativi fanno parte del campo, quindi eseguiamo uno [scorrimento a destra](https://en.wikipedia.org/wiki/Logical_shift) per sbarazzarci degli altri valori. +Questo ha l'ulteriore vantaggio di spostare il valore a destra del campo, in modo che sia il valore stesso piuttosto che il valore moltiplicato per 256qualcosa. ```solidity @@ -160,7 +190,8 @@ Solo i byte `length` più significativi fanno parte del campo, quindi effettuiam fallback() external { ``` -Quando una chiamata a un contratto in Solidity non corrisponde ad alcuna delle firme della funzione, chiama [la funzione `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (supponendo che ne esista una). Nel caso di `CalldataInterpreter`, _qualsiasi_ chiamata arriva qui perché non vi sono altre funzioni `external` o `public`. +Quando una chiamata a un contratto Solidity non corrisponde a nessuna delle firme delle funzioni, chiama [la funzione `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (supponendo che ce ne sia una). +Nel caso di `CalldataInterpreter`, _qualsiasi_ chiamata arriva qui perché non ci sono altre funzioni `external` o `public`. ```solidity uint _func; @@ -168,23 +199,27 @@ Quando una chiamata a un contratto in Solidity non corrisponde ad alcuna delle f _func = calldataVal(0, 1); ``` -Leggi il primo byte dei calldata, che ci dice la funzione. Ci sono due motivi per cui una funzione potrebbe non essere disponibile qui: +Legge il primo byte dei calldata, che ci indica la funzione. +Ci sono due motivi per cui una funzione non sarebbe disponibile qui: -1. Le funzioni che sono `pure` o `view` non cambiano lo stato e non costano gas (quando chiamate al di fuori della catena). Non ha senso provare a ridurne il loro costo del gas. -2. Le funzioni che si affidano a [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties). Il valore del `msg.sender` sarà l'indirizzo `CalldataInterpreter`, non il chiamante. +1. Le funzioni che sono `pure` o `view` non cambiano lo stato e non costano gas (quando chiamate fuori catena). + Non ha senso cercare di ridurre il loro costo del gas. +2. Le funzioni che si basano su [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties). + Il valore di `msg.sender` sarà l'indirizzo di `CalldataInterpreter`, non il chiamante. -Sfortunatamente, [guardando alle specifiche dell'ERC-20](https://eips.ethereum.org/EIPS/eip-20), questo lascia solo una funzione: `transfer`. Questo ci lascia con soltanto due funzioni: `transfer` (poiché possiamo chiamare `transferFrom`) e `faucet` (poiché possiamo ritrasferire i token a chiunque ci abbia chiamati). +Sfortunatamente, [guardando le specifiche ERC-20](https://eips.ethereum.org/EIPS/eip-20), questo lascia solo una funzione, `transfer`. +Questo ci lascia con solo due funzioni: `transfer` (perché possiamo chiamare `transferFrom`) e `faucet` (perché possiamo trasferire i token indietro a chi ci ha chiamato). ```solidity - // Call the state changing methods of token using - // information from the calldata + // Chiama i metodi che modificano lo stato del token utilizzando + // le informazioni dal calldata // faucet if (_func == 1) { ``` -Una chiamata a `faucet()`, priva di parametri. +Una chiamata a `faucet()`, che non ha parametri. ```solidity token.faucet(); @@ -193,56 +228,60 @@ Una chiamata a `faucet()`, priva di parametri. } ``` -Dopo aver chiamato `token.faucet()` otteniamo i token. Tuttavia, come contratto proxy, non **necessitiamo** di token. L'EOA (conto posseduto esternamente) o il contratto che ci ha chiamati, sì. Quindi trasferiamo tutti i nostri token a chiunque ci abbia chiamati. +Dopo aver chiamato `token.faucet()` otteniamo dei token. Tuttavia, come contratto proxy, non abbiamo **bisogno** di token. +L'account controllato esternamente (EOA) o il contratto che ci ha chiamato ne ha bisogno. +Quindi trasferiamo tutti i nostri token a chi ci ha chiamato. ```solidity - // transfer (assume we have an allowance for it) + // transfer (supponiamo di avere un'allowance per questo) if (_func == 2) { ``` -Il trasferimento dei token richiede due parametri: l'indirizzo di destinazione e l'importo. +Il trasferimento di token richiede due parametri: l'indirizzo di destinazione e l'importo. ```solidity token.transferFrom( msg.sender, ``` -Consentiamo solo ai chiamanti di trasferire i token che possiedono +Consentiamo ai chiamanti di trasferire solo i token che possiedono ```solidity address(uint160(calldataVal(1, 20))), ``` -L'indirizzo di destinazione inizia al byte #1 (il byte #0 è la funzione). Come indirizzo, è lungo 20 byte. +L'indirizzo di destinazione inizia al byte #1 (il byte #0 è la funzione). +Come indirizzo, è lungo 20 byte. ```solidity calldataVal(21, 2) ``` -Per questo contratto specifico supponiamo che il numero massimo di token che chiunque voglia trasferire entri in due byte (meno di 65536). +Per questo particolare contratto supponiamo che il numero massimo di token che chiunque vorrebbe trasferire stia in due byte (meno di 65536). ```solidity ); } ``` -In generale, un trasferimento richiede 35 byte di calldata: +Nel complesso, un trasferimento richiede 35 byte di calldata: -| Sezione | Lunghezza | Byte | -| ------------------------- | ---------:| -----:| -| Selettore della funzione | 1 | 0 | -| Indirizzo di destinazione | 32 | 1-32 | -| Importo | 2 | 33-34 | +| Sezione | Lunghezza | Byte | +| ------------------- | -----: | ----: | +| Selettore di funzione | 1 | 0 | +| Indirizzo di destinazione | 32 | 1-32 | +| Importo | 2 | 33-34 | ```solidity - } // fallback + } // fallback -} // contract CalldataInterpreter +} // contract CalldataInterpreter ``` ### test.js {#test-js} -[Questo test unitario di JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) ci mostra come usare questo meccanismo (e come verificare che funzioni correttamente). Partirò dal presupposto che tu comprenda [chai](https://www.chaijs.com/) ed [ether](https://docs.ethers.io/v5/) e spiegherò solo le parti che si applicano nello specifico al contratto. +[Questo test unitario in JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) ci mostra come utilizzare questo meccanismo (e come verificare che funzioni correttamente). +Supporrò che tu conosca [chai](https://www.chaijs.com/) ed [ethers](https://docs.ethers.io/v5/) e spiegherò solo le parti che si applicano specificamente al contratto. ```js const { expect } = require("chai"); @@ -265,11 +304,12 @@ describe("CalldataInterpreter", function () { Iniziamo distribuendo entrambi i contratti. ```javascript - // Get tokens to play with + // Ottieni token con cui giocare const faucetTx = { ``` -Non possiamo usare le funzioni di alto livello che useremmo normalmente (come `token.faucet()`) per creare le transazioni, perché non seguiamo l'ABI. Invece, dobbiamo costruire noi stessi la transazione e poi inviarla. +Non possiamo usare le funzioni di alto livello che useremmo normalmente (come `token.faucet()`) per creare transazioni, perché non seguiamo l'ABI. +Invece, dobbiamo costruire la transazione noi stessi e poi inviarla. ```javascript to: cdi.address, @@ -278,8 +318,10 @@ Non possiamo usare le funzioni di alto livello che useremmo normalmente (come `t Ci sono due parametri che dobbiamo fornire per la transazione: -1. `to`, l'indirizzo di destinazione. Questo è il contratto dell'interprete dei calldata. -2. `data`, i calldata da inviare. Nel caso di una chiamata al faucet, i dati sono in un singolo byte, `0x01`. +1. `to`, l'indirizzo di destinazione. + Questo è il contratto dell'interprete dei calldata. +2. `data`, i calldata da inviare. + Nel caso di una chiamata al rubinetto, i dati sono un singolo byte, `0x01`. ```javascript @@ -287,26 +329,27 @@ Ci sono due parametri che dobbiamo fornire per la transazione: await (await signer.sendTransaction(faucetTx)).wait() ``` -Chiamiamo [il metodo `sendTransaction` del firmatario](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) perché abbiamo già specificato la destinazione (`faucetTx.to`) e ci serve che la transazione sia firmata. +Chiamiamo [il metodo `sendTransaction` del firmatario](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) perché abbiamo già specificato la destinazione (`faucetTx.to`) e abbiamo bisogno che la transazione sia firmata. ```javascript -// Check the faucet provides the tokens correctly +// Verifica che il faucet fornisca i token correttamente expect(await token.balanceOf(signer.address)).to.equal(1000) ``` -Qui verifichiamo il saldo. Non serve risparmiare gas sulle funzioni `view`, quindi le eseguiamo normalmente. +Qui verifichiamo il saldo. +Non c'è bisogno di risparmiare gas sulle funzioni `view`, quindi le eseguiamo normalmente. ```javascript -// Give the CDI an allowance (approvals cannot be proxied) +// Fornisci un'allowance al CDI (le approvazioni non possono essere gestite tramite proxy) const approveTX = await token.approve(cdi.address, 10000) await approveTX.wait() expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) ``` -Dà all'interprete dei calldata un'indennità per poter effettuare trasferimenti. +Fornisce all'interprete dei calldata un'autorizzazione per poter effettuare trasferimenti. ```javascript -// Transfer tokens +// Trasferisci token const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" const transferTx = { to: cdi.address, @@ -314,54 +357,53 @@ const transferTx = { } ``` -Crea una transazione di trasferimento. Il primo byte è "0x02", seguito dall'indirizzo di destinazione e infine dall'importo (0x0100, ovvero 256 in decimale). +Crea una transazione di trasferimento. Il primo byte è "0x02", seguito dall'indirizzo di destinazione e infine dall'importo (0x0100, che è 256 in decimale). ```javascript await (await signer.sendTransaction(transferTx)).wait() - // Check that we have 256 tokens less + // Verifica che abbiamo 256 token in meno expect (await token.balanceOf(signer.address)).to.equal(1000-256) - // And that our destination got them + // E che la nostra destinazione li abbia ricevuti expect (await token.balanceOf(destAddr)).to.equal(256) - }) // it -}) // describe + }) // it +}) // describe ``` -### Esempio {#example} - -Se desideri vedere questi file in azione senza eseguirli tu stesso, segui questi link: - -1. [Distribuzione di`OrisUselessToken`](https://kovan-optimistic.etherscan.io/tx/1410744) all'[indirizzo `0x950c753c0edbde44a74d3793db738a318e9c8ce8`](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). -2. [Distribuzione di `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1410745) all'[indirizzo `0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55`](https://kovan-optimistic.etherscan.io/address/0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55). -3. [Chiamata a `faucet()`](https://kovan-optimistic.etherscan.io/tx/1410746). -4. [Chiamata a `OrisUselessToken.approve()`](https://kovan-optimistic.etherscan.io/tx/1410747). Questa chiamata deve andare direttamente al contratto del token, poiché l'elaborazione si affida al `msg.sender`. -5. [Chiamata a `transfer()`](https://kovan-optimistic.etherscan.io/tx/1410748). +## Ridurre il costo quando si controlla il contratto di destinazione {#reducing-the-cost-when-you-do-control-the-destination-contract} -## Ridurre il costo quando hai il controllo del contratto di destinazione {#reducing-the-cost-when-you-do-control-the-destination-contract} +Se hai il controllo sul contratto di destinazione, puoi creare funzioni che aggirano i controlli di `msg.sender` perché si fidano dell'interprete dei calldata. +[Puoi vedere un esempio di come funziona qui, nel ramo `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). -Se hai il controllo sul contratto di destinazione, puoi creare funzioni che bypassano i controlli `msg.sender` poiché si fidano dell'interprete dei calldata. [Puoi vedere un esempio di come funziona qui, nel ramo `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). - -Se il contratto rispondesse solo alle transazioni esterne, potremmo riuscirsi con un solo contratto. Tuttavia, questo spezzerebbe la [componibilità](/developers/docs/smart-contracts/composability/). È molto meglio avere un contratto che risponda alle normali chiamate ERC-20 e un altro che risponda alle transazioni con dati della chiamata brevi. +Se il contratto rispondesse solo a transazioni esterne, potremmo cavarcela con un solo contratto. +Tuttavia, ciò interromperebbe la [componibilità](/developers/docs/smart-contracts/composability/). +È molto meglio avere un contratto che risponde alle normali chiamate ERC-20 e un altro contratto che risponde alle transazioni con dati di chiamata brevi. ### Token.sol {#token-sol-2} -In questo esempio, possiamo modificare `Token.sol`. Questo ci permette di avere un numero di funzioni che solo il proxy può chiamare. Ecco le nuove parti: +In questo esempio possiamo modificare `Token.sol`. +Questo ci permette di avere una serie di funzioni che solo il proxy può chiamare. +Ecco le nuove parti: ```solidity - // The only address allowed to specify the CalldataInterpreter address + // L'unico indirizzo autorizzato a specificare l'indirizzo del CalldataInterpreter address owner; - // The CalldataInterpreter address + // L'indirizzo del CalldataInterpreter address proxy = address(0); ``` -Il contratto ERC-20 deve conoscere l'identità del proxy autorizzato. Tuttavia, non possiamo impostare questa variabile nel costruttore, perché non conosciamo ancora il valore. Questo contratto è stato istanziato subito poiché il proxy si aspetta che l'indirizzo del token sia nel suo costruttore. +Il contratto ERC-20 deve conoscere l'identità del proxy autorizzato. +Tuttavia, non possiamo impostare questa variabile nel costruttore, perché non ne conosciamo ancora il valore. +Questo contratto viene istanziato per primo perché il proxy si aspetta l'indirizzo del token nel suo costruttore. ```solidity - /** - * @dev Calls the ERC20 constructor. - */ + /* * + * @dev Chiama il costruttore ERC20. */ + + + constructor( ) ERC20("Oris useless token-2", "OUT-2") { owner = msg.sender; @@ -371,43 +413,52 @@ Il contratto ERC-20 deve conoscere l'identità del proxy autorizzato. Tuttavia, L'indirizzo del creatore (chiamato `owner`) è memorizzato qui perché è l'unico indirizzo autorizzato a impostare il proxy. ```solidity - /** - * @dev set the address for the proxy (the CalldataInterpreter). - * Can only be called once by the owner - */ + /* * + * @dev imposta l'indirizzo per il proxy (il CalldataInterpreter). + * Può essere chiamato solo una volta dal proprietario */ + + + + function setProxy(address _proxy) external { require(msg.sender == owner, "Can only be called by owner"); require(proxy == address(0), "Proxy is already set"); proxy = _proxy; - } // function setProxy + } // function setProxy ``` -Il proxy ha accesso privilegiato, perché può bypassare i controlli di sicurezza. Per essere certi di poterci fidare del proxy, l'unico che può chiamare questa funzione è l'`owner`, e solo una volta. Una volta che `proxy` ha un valore reale (non zero), quel valore non può cambiare, quindi anche se il proprietario diventa malevolo, o la sua mnemonica viene rivelata, siamo comunque al sicuro. +Il proxy ha un accesso privilegiato, perché può aggirare i controlli di sicurezza. +Per assicurarci di potercene fidare, permettiamo solo a `owner` di chiamare questa funzione, e solo una volta. +Una volta che `proxy` ha un valore reale (diverso da zero), quel valore non può cambiare, quindi anche se il proprietario decide di diventare disonesto, o la sua frase mnemonica viene rivelata, siamo comunque al sicuro. ```solidity - /** - * @dev Some functions may only be called by the proxy. - */ + /* * + * @dev Alcune funzioni possono essere chiamate solo dal proxy. */ + + + modifier onlyProxy { ``` -Questa è una [funzione `modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), ossia modifica come funzionano le altre funzioni. +Questa è una [funzione `modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), modifica il modo in cui funzionano le altre funzioni. ```solidity require(msg.sender == proxy); ``` -In primo luogo, verifica che siamo stati chiamati dal proxy e da nessun altro. Altrimenti, `revert`. +Per prima cosa, verifica che siamo stati chiamati dal proxy e da nessun altro. +In caso contrario, esegue un `revert`. ```solidity _; } ``` -Se è così, esegui la funzione che modifichiamo. +In caso affermativo, esegue la funzione che modifichiamo. ```solidity + /* Funzioni che consentono al proxy di fungere effettivamente da proxy per gli account */ /* Functions that allow the proxy to actually proxy for accounts */ function transferProxy(address from, address to, uint256 amount) @@ -437,17 +488,18 @@ Se è così, esegui la funzione che modifichiamo. } ``` -Queste sono tre operazioni che normalmente richiedono che il messaggio provenga direttamente dall'entità che sta trasferendo token o approvando un'indennità. Qui abbiamo una versione del proxy di queste operazioni che: +Queste sono tre operazioni che normalmente richiedono che il messaggio provenga direttamente dall'entità che trasferisce i token o che approva un'autorizzazione. +Qui abbiamo una versione proxy di queste operazioni che: -1. È modificata da `onlyProxy()`, così che nessun altro possa controllarla. -2. Ottiene l'indirizzo che sarebbe normalmente `msg.sender` come un parametro aggiuntivo. +1. È modificata da `onlyProxy()` in modo che a nessun altro sia permesso controllarle. +2. Ottiene l'indirizzo che normalmente sarebbe `msg.sender` come parametro aggiuntivo. ### CalldataInterpreter.sol {#calldatainterpreter-sol-2} -L'interprete dei dati della chiamata è praticamente identico a quello precedente, tranne che le funzioni in proxy ricevono un parametro `msg.sender` e non è necessaria un'indennità per `transfer`. +L'interprete dei calldata è quasi identico a quello precedente, tranne per il fatto che le funzioni proxy ricevono un parametro `msg.sender` e non c'è bisogno di un'autorizzazione per il `transfer`. ```solidity - // transfer (no need for allowance) + // transfer (nessun bisogno di allowance) if (_func == 2) { token.transferProxy( msg.sender, @@ -492,16 +544,17 @@ Dobbiamo dire al contratto ERC-20 di quale proxy fidarsi ```js console.log("CalldataInterpreter addr:", cdi.address) -// Need two signers to verify allowances +// Sono necessari due firmatari per verificare le allowance const signers = await ethers.getSigners() const signer = signers[0] const poorSigner = signers[1] ``` -Per verificare `approve()` e `transferFrom()`, ci serve un secondo firmatario. Lo chiamiamo `poorSigner` perché non riceve nessuno dei nostri token (deve avere degli ETH, ovviamente). +Per controllare `approve()` e `transferFrom()` abbiamo bisogno di un secondo firmatario. +Lo chiamiamo `poorSigner` perché non ottiene nessuno dei nostri token (deve avere ETH, ovviamente). ```js -// Transfer tokens +// Trasferisci token const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" const transferTx = { to: cdi.address, @@ -510,10 +563,10 @@ const transferTx = { await (await signer.sendTransaction(transferTx)).wait() ``` -Poiché il contratto ERC-20 si fida del proxy (`cdi`), non ci serve un'indennità per inoltrare i trasferimenti. +Poiché il contratto ERC-20 si fida del proxy (`cdi`), non abbiamo bisogno di un'autorizzazione per inoltrare i trasferimenti. ```js -// approval and transferFrom +// approval e transferFrom const approveTx = { to: cdi.address, data: "0x03" + poorSigner.address.slice(2, 42) + "00FF", @@ -528,24 +581,18 @@ const transferFromTx = { } await (await poorSigner.sendTransaction(transferFromTx)).wait() -// Check the approve / transferFrom combo was done correctly +// Verifica che la combinazione approve / transferFrom sia stata eseguita correttamente expect(await token.balanceOf(destAddr2)).to.equal(255) ``` -Testa le due nuove funzioni. Nota che `transferFromTx` richiede due parametri dell'indirizzo: l'autore dell'indennità e il destinatario. - -### Esempio {#example-2} - -Se desideri vedere questi file in azione senza eseguirli tu stesso, segui questi link: - -1. [Distribuzione di `OrisUselessToken-2`](https://kovan-optimistic.etherscan.io/tx/1475397) all'indirizzo [`0xb47c1f550d8af70b339970c673bbdb2594011696`](https://kovan-optimistic.etherscan.io/address/0xb47c1f550d8af70b339970c673bbdb2594011696). -2. [Distribuzione di `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1475400) all'indirizzo [`0x0dccfd03e3aaba2f8c4ea4008487fd0380815892`](https://kovan-optimistic.etherscan.io/address/0x0dccfd03e3aaba2f8c4ea4008487fd0380815892). -3. [Chiamata a `setProxy()`](https://kovan-optimistic.etherscan.io/tx/1475402). -4. [Chiamata a `faucet()`](https://kovan-optimistic.etherscan.io/tx/1475409). -5. [Chiamata a `transferProxy()`](https://kovan-optimistic.etherscan.io/tx/1475416). -6. [Chiamata a `approveProxy()`](https://kovan-optimistic.etherscan.io/tx/1475419). -7. [Chiamata a `transferFromProxy()`](https://kovan-optimistic.etherscan.io/tx/1475421). Nota che questa chiamata proviene da un indirizzo diverso dagli altri, `poorSigner` invece di `signer`. +Testa le due nuove funzioni. +Nota che `transferFromTx` richiede due parametri di indirizzo: chi fornisce l'autorizzazione e il destinatario. ## Conclusione {#conclusion} -Sia [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) che [Arbitrum](https://developer.offchainlabs.com/docs/special_features) stanno cercando modi per ridurre le dimensioni dei calldata scritti al L1 e dunque per ridurre il costo delle transazioni. Tuttavia, come fornitori di infrastruttura alla ricerca di soluzioni generiche, le nostre capacità sono limitate. Come sviluppatore di dapp, hai conoscenze specifiche per l'applicazione che ti consentono di ottimizzare i tuoi calldata molto meglio di quanto potremmo fare noi in una soluzione generica. Speriamo che questo articolo ti aiuti a trovare la soluzione ideale per le tue esigenze. +Sia [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) che [Arbitrum](https://developer.offchainlabs.com/docs/special_features) stanno cercando modi per ridurre le dimensioni dei calldata scritti su L1 e quindi il costo delle transazioni. +Tuttavia, come fornitori di infrastrutture alla ricerca di soluzioni generiche, le nostre capacità sono limitate. +Come sviluppatore di dApp, hai una conoscenza specifica dell'applicazione, che ti consente di ottimizzare i tuoi calldata molto meglio di quanto potremmo fare noi in una soluzione generica. +Speriamo che questo articolo ti aiuti a trovare la soluzione ideale per le tue esigenze. + +[Vedi qui per altri miei lavori](https://cryptodocguy.pro/). \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/it/developers/tutorials/smart-contract-security-guidelines/index.md index e74be72019e..c595bfa9466 100644 --- a/public/content/translations/it/developers/tutorials/smart-contract-security-guidelines/index.md +++ b/public/content/translations/it/developers/tutorials/smart-contract-security-guidelines/index.md @@ -1,95 +1,92 @@ --- -title: Linee guida di sicurezza per gli Smart Contract -description: Elenco di controllo con le linee guida di sicurezza da tenere presenti per la creazione di una dapp +title: Linee guida per la sicurezza dei contratti intelligenti +description: Una lista di controllo delle linee guida per la sicurezza da considerare quando si crea la propria dApp author: "Trailofbits" -tags: - - "solidity" - - "smart contract" - - "sicurezza" +tags: ["Solidity", "contratti intelligenti", "sicurezza"] skill: intermediate -breadcrumb: "Linee guida sicurezza" +breadcrumb: Linee guida per la sicurezza lang: it published: 2020-09-06 -source: Creare contratti sicuri +source: Building secure contracts sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md --- -Segui questi consigli di alto livello per creare Smart Contract più sicuri. +Segui queste raccomandazioni di alto livello per creare contratti intelligenti più sicuri. -## Linee guida di progettazione {#design-guidelines} +## Linee guida per la progettazione {#design-guidelines} -La progettazione del contratto deve essere discussa in anticipo, prima di scrivere la prima riga di codice. +La progettazione del contratto dovrebbe essere discussa in anticipo, prima di scrivere qualsiasi riga di codice. ### Documentazione e specifiche {#documentation-and-specifications} -La documentazione può essere scritta su diversi livelli e deve essere aggiornata durante l'implementazione dei contratti: +La documentazione può essere scritta a diversi livelli e dovrebbe essere aggiornata durante l'implementazione dei contratti: -- **Una descrizione semplice in inglese del sistema**, che descriva cosa fanno i contratti e tutte le ipotesi sulla base di codice. -- **Schema e diagrammi architettonici**, incluse le interazioni del contratto e la macchina a stati del sistema. Le [stampanti Slither](https://github.com/crytic/slither/wiki/Printer-documentation) possono aiutare a generare questi schemi. -- **Documentazione approfondita sul codice**, il [formato Natspec](https://solidity.readthedocs.io/en/develop/natspec-format.html) si può usare per Solidity. +- **Una descrizione in linguaggio semplice del sistema**, che descriva cosa fanno i contratti e qualsiasi presupposto sulla base di codice. +- **Schemi e diagrammi architetturali**, incluse le interazioni del contratto e la macchina a stati del sistema. Le [stampanti di Slither](https://github.com/crytic/slither/wiki/Printer-documentation) possono aiutare a generare questi schemi. +- **Documentazione approfondita del codice**, il [formato Natspec](https://docs.soliditylang.org/en/develop/natspec-format.html) può essere utilizzato per Solidity. -### Calcolo sulla catena ed esterno alla catena {#on-chain-vs-off-chain-computation} +### Calcolo on-chain vs fuori catena {#onchain-vs-offchain-computation} -- **Mantieni quanto più codice possibile al di fuori della catena.** Il livello sulla catena deve essere il più ridotto possibile. Elabora anticipatamente i dati con il codice esternamente alla catena così che la verifica su di essa sia semplice. Ti serve un elenco ordinato? Ordina l'elenco esternamente alla catena, poi controlla solo l'ordine sulla catena. +- **Mantieni quanto più codice possibile fuori catena.** Mantieni piccolo il livello on-chain. Pre-elabora i dati con codice fuori catena in modo tale che la verifica on-chain sia semplice. Hai bisogno di un elenco ordinato? Ordina l'elenco fuori catena, quindi controlla solo il suo ordine on-chain. ### Aggiornabilità {#upgradeability} -Abbiamo discusso le diverse soluzioni di aggiornabilità nel [nostro post di blog](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Fai una scelta deliberata per supportare l'aggiornabilità o non prima di scrivere codice. La decisione influirà su come strutturi il tuo codice. In generale, consigliamo: +Abbiamo discusso le diverse soluzioni di aggiornabilità nel [nostro post sul blog](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Fai una scelta deliberata se supportare o meno l'aggiornabilità prima di scrivere qualsiasi codice. La decisione influenzerà il modo in cui strutturi il tuo codice. In generale, raccomandiamo: -- **Prediligere la [migrazione del contratto](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) rispetto all'aggiornabilità.** I sistemi di migrazione presentano molti vantaggi identici a quelli aggiornabili, senza i loro svantaggi. -- **Usare lo schema di separazione dei dati rispetto a quello delegatecallproxy.** Se il progetto ha una chiara separazione dell'astrazione, l'aggiornabilità che usa la separazione dei dati necessiterà solo di poche modifiche. delegatecallproxy richiede esperienza con l'EVM ed è altamente incline a errori. -- **Documentare la procedura di migrazione/aggiornamento prima della distribuzione.** Se dovrai reagire sotto pressione senza linee guida, commetterai degli errori. Scrivi in anticipo la procedura da seguire. Deve includere: - - Le chiamate che inizializzano i nuovi contratti - - Dove sono memorizzate le chiavi e come accedervi - - Come controllare la distribuzione. Sviluppa e testa uno script post-distribuzione. +- **Privilegiare la [migrazione del contratto](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) rispetto all'aggiornabilità.** I sistemi di migrazione hanno molti degli stessi vantaggi di quelli aggiornabili, senza i loro svantaggi. +- **Utilizzare il modello di separazione dei dati rispetto a quello delegatecallproxy.** Se il tuo progetto ha una chiara separazione dell'astrazione, l'aggiornabilità utilizzando la separazione dei dati richiederà solo pochi aggiustamenti. Il delegatecallproxy richiede esperienza con l'EVM ed è altamente soggetto a errori. +- **Documentare la procedura di migrazione/aggiornamento prima della distribuzione.** Se devi reagire sotto stress senza alcuna linea guida, commetterai degli errori. Scrivi in anticipo la procedura da seguire. Dovrebbe includere: + - Le chiamate che avviano i nuovi contratti + - Dove sono archiviate le chiavi e come accedervi + - Come controllare la distribuzione! Sviluppa e testa uno script post-distribuzione. ## Linee guida per l'implementazione {#implementation-guidelines} -**Punta alla semplicità.** Usa sempre la soluzione più semplice adatta al tuo scopo. Tutti i membri del team devono essere in grado di comprendere la tua soluzione. +**Punta alla semplicità.** Usa sempre la soluzione più semplice che si adatta al tuo scopo. Qualsiasi membro del tuo team dovrebbe essere in grado di comprendere la tua soluzione. -### Composizione della funzione {#function-composition} +### Composizione delle funzioni {#function-composition} -L'architettura della base di codice deve rendere il codice semplice da controllare. Evita le scelte architettoniche che riducono la capacità di ragionare sulla sua correttezza. +L'architettura della tua base di codice dovrebbe rendere il tuo codice facile da revisionare. Evita scelte architetturali che riducono la capacità di ragionare sulla sua correttezza. -- **Dividi la logica del tuo sistema**, tramite più contratti o raggruppando le funzioni simili (ad esempio, autenticazione, aritmetica, ...). -- **Scrivi funzioni piccole, con uno scopo chiaro.** Questo faciliterà il controllo e consentirà di testare singoli componenti. +- **Dividi la logica del tuo sistema**, tramite più contratti o raggruppando funzioni simili (ad esempio, autenticazione, aritmetica, ...). +- **Scrivi funzioni piccole, con uno scopo chiaro.** Questo faciliterà la revisione e consentirà il test dei singoli componenti. ### Ereditarietà {#inheritance} -- **Rendi gestibile l'ereditarietà.** L'ereditarietà deve essere usata per dividere la logica, tuttavia, il progetto deve puntare a ridurre la profondità e la larghezza dell'albero d'ereditarietà. -- **Usa la [stampante dell'ereditarietà](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) di Slither per verificare la gerarchia dei contratti.** La stampante dell'ereditarietà ti aiuterà a controllare la dimensione della gerarchia. +- **Mantieni l'ereditarietà gestibile.** L'ereditarietà dovrebbe essere utilizzata per dividere la logica, tuttavia, il tuo progetto dovrebbe mirare a ridurre al minimo la profondità e l'ampiezza dell'albero di ereditarietà. +- **Usa la [stampante di ereditarietà](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) di Slither per controllare la gerarchia dei contratti.** La stampante di ereditarietà ti aiuterà a revisionare le dimensioni della gerarchia. ### Eventi {#events} -- **Registra tutte le operazioni cruciali.** Gli eventi aiuteranno ad eseguire il debug del contratto durante lo sviluppo e a monitorarlo dopo la distribuzione. +- **Registra tutte le operazioni cruciali.** Gli eventi aiuteranno a eseguire il debug del contratto durante lo sviluppo e a monitorarlo dopo la distribuzione. -### Evita trappole note {#avoid-known-pitfalls} +### Evita le insidie note {#avoid-known-pitfalls} -- **Sii consapevole dei problemi di sicurezza più comuni.** Ci sono molte risorse online per saperne di più sui problemi più comuni, come [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/), o [Not so Smart Contract](https://github.com/crytic/not-so-smart-contracts/). -- **Sii consapevole delle sezioni di avviso nella [documentazione di Solidity](https://solidity.readthedocs.io/en/latest/).**Le sezioni di avviso ti informeranno del comportamento non ovvio del linguaggio. +- **Sii consapevole dei problemi di sicurezza più comuni.** Ci sono molte risorse online per conoscere i problemi comuni, come [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/) o [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/). +- **Presta attenzione alle sezioni di avvertenza nella [documentazione di Solidity](https://docs.soliditylang.org/en/latest/).** Le sezioni di avvertenza ti informeranno sui comportamenti non ovvi del linguaggio. ### Dipendenze {#dependencies} -- **Usa librerie ben testate.** Importare il codice da librerie ben testate ridurrà la possibilità di scrivere codici con bug. Se vuoi scrivere un contratto ERC20, usa [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). -- **Usa un gestore di dipendenze; evita il copia-incolla del codice.** Se ti basi su un'origine esterna, mantieni sempre il codice aggiornato rispetto all'origine. +- **Usa librerie ben testate.** Importare codice da librerie ben testate ridurrà la probabilità di scrivere codice con bug. Se vuoi scrivere un contratto ERC20, usa [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). +- **Usa un gestore di dipendenze; evita di copiare e incollare il codice.** Se ti affidi a una fonte esterna, devi mantenerla aggiornata con la fonte originale. ### Test e verifica {#testing-and-verification} -- **Scrivi test unitari approfonditi.** Un'ampia serie di test è cruciale per craare software di alta qualità. -- **Scrivi controlli e proprietà personalizzati in [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) e [Manticore](https://github.com/trailofbits/manticore).** Gli strumenti automatizzati contribuiranno a garantire la sicurezza del contratto. Consulta il resto di questa guida per imparare a scrivere controlli e proprietà efficienti. -- **Usa [crytic.io](https://crytic.io/).** Crytic si integra con GitHub, fornisce accesso a rilevatori privati di Slither ed esegue controlli personalizzati delle proprietà da Echidna. +- **Scrivi test unitari approfonditi.** Una suite di test estesa è fondamentale per creare software di alta qualità. +- **Scrivi controlli e proprietà personalizzati per [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) e [Manticore](https://github.com/trailofbits/manticore).** Gli strumenti automatizzati aiuteranno a garantire che il tuo contratto sia sicuro. Rivedi il resto di questa guida per imparare a scrivere controlli e proprietà efficienti. +- **Usa [crytic.io](https://crytic.io/).** Crytic si integra con GitHub, fornisce accesso ai rilevatori privati di Slither ed esegue controlli di proprietà personalizzati da Echidna. ### Solidity {#solidity} -- **Preferisci Solidity 0.5 rispetto a 0.4 e 0.6.** Secondo noi, Solidity 0.5 è più sicuro e contiene prassi meglio integrate rispetto a 0.4. Solidity 0.6 si è dimostrato troppo instabile per la produzione e ha bisogno ancora di tempo per maturare. -- **Usa una versione stabile per compilare; usa l'ultima versione per controllare gli avvisi.** Controlla che per il tuo codice non vengano segnalati problemi con l'ultima versione del compiler. Solidity però ha un ciclo di rilascio veloce e una lunga cronologia di bug del compilatore, quindi non consigliamo l'ultima versione per la distribuzione (vedi i [consigli sulla versione solc](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) di Slither). -- **Non usare l'assembly inline.** Assembly richiede esperienza con l'EVM. Non scrivere il codice dell'EVM se non ha una _conoscenza approfondita_ dello yellow paper. +- **Privilegia Solidity 0.5 rispetto a 0.4 e 0.6.** Secondo noi, Solidity 0.5 è più sicuro e ha migliori pratiche integrate rispetto a 0.4. Solidity 0.6 si è dimostrato troppo instabile per la produzione e ha bisogno di tempo per maturare. +- **Usa una versione stabile per compilare; usa l'ultima versione per controllare gli avvisi.** Verifica che il tuo codice non abbia problemi segnalati con l'ultima versione del compilatore. Tuttavia, Solidity ha un ciclo di rilascio rapido e una storia di bug del compilatore, quindi non raccomandiamo l'ultima versione per la distribuzione (vedi la [raccomandazione sulla versione di solc](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) di Slither). +- **Non usare l'assembly inline.** L'assembly richiede esperienza con l'EVM. Non scrivere codice EVM se non hai _padroneggiato_ lo yellow paper. -## Linee guida di distribuzione {#deployment-guidelines} +## Linee guida per la distribuzione {#deployment-guidelines} -Una volta sviluppato e distribuito il contratto: +Una volta che il contratto è stato sviluppato e distribuito: -- **Monitora i contratti.** Guarda i registri e reagisci con prontezza in caso di compromissione del contratto o del portafoglio. -- **Aggiungi le tue informazioni di contatto in [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Questo elenco aiuta terze parti a contattarti se viene scoperto un difetto nella sicurezza. -- **Proteggi i portafogli degli utenti privilegiati.** Segui le nostre [best practice](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) se memorizzi chiavi in portafogli hardware. -- **Prepara una risposta con un piano per gli incidenti.** Tieni presente che gli Smart Contract che crei possono essere compromessi. Anche se i contratti sono privi di bug, un aggressore potrebbe assumere il controllo delle chiavi del proprietario del contratto. +- **Monitora i tuoi contratti.** Osserva i log e tieniti pronto a reagire in caso di compromissione del contratto o del portafoglio. +- **Aggiungi le tue informazioni di contatto a [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Questo elenco aiuta le terze parti a contattarti se viene scoperta una falla di sicurezza. +- **Metti al sicuro i portafogli degli utenti privilegiati.** Segui le nostre [migliori pratiche](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) se archivi le chiavi in portafogli hardware. +- **Avere un piano di risposta agli incidenti.** Considera che i tuoi contratti intelligenti possono essere compromessi. Anche se i tuoi contratti sono privi di bug, un utente malintenzionato potrebbe prendere il controllo delle chiavi del proprietario del contratto. \ No newline at end of file diff --git a/public/content/translations/it/developers/tutorials/stealth-addr/index.md b/public/content/translations/it/developers/tutorials/stealth-addr/index.md new file mode 100644 index 00000000000..45ad6a85e12 --- /dev/null +++ b/public/content/translations/it/developers/tutorials/stealth-addr/index.md @@ -0,0 +1,437 @@ +--- +title: "Usare gli indirizzi stealth" +description: "Gli indirizzi stealth consentono agli utenti di trasferire asset in modo anonimo. Dopo aver letto questo articolo, sarai in grado di: spiegare cosa sono gli indirizzi stealth e come funzionano, capire come usare gli indirizzi stealth in modo da preservare l'anonimato e scrivere un'applicazione basata sul web che utilizza gli indirizzi stealth." +author: Ori Pomerantz +tags: ["Indirizzo stealth", "privacy", "crittografia", "Rust", "wasm"] +skill: intermediate +breadcrumb: Indirizzi stealth +published: 2025-11-30 +lang: it +sidebarDepth: 3 +--- + +Sei Bill. Per ragioni in cui non entreremo, vuoi donare alla campagna "Alice Regina del Mondo" e far sapere ad Alice che hai donato, in modo che ti ricompensi se vince. Sfortunatamente, la sua vittoria non è garantita. C'è una campagna concorrente, "Carol Imperatrice del Sistema Solare". Se Carol vince e scopre che hai donato ad Alice, sarai nei guai. Quindi non puoi semplicemente trasferire 200 ETH dal tuo account a quello di Alice. + +[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) ha la soluzione. Questo ERC spiega come utilizzare gli [indirizzi stealth](https://nerolation.github.io/stealth-utils) per i trasferimenti anonimi. + +**Attenzione**: La crittografia alla base degli indirizzi stealth è, per quanto ne sappiamo, solida. Tuttavia, ci sono potenziali attacchi side-channel (a canale laterale). [Di seguito](#go-wrong), vedrai cosa puoi fare per ridurre questo rischio. + +## Come funzionano gli indirizzi stealth {#how} + +Questo articolo cercherà di spiegare gli indirizzi stealth in due modi. Il primo è [come usarli](#how-use). Questa parte è sufficiente per comprendere il resto dell'articolo. Poi, c'è [una spiegazione della matematica che c'è dietro](#how-math). Se ti interessa la crittografia, leggi anche questa parte. + +### La versione semplice (come usare gli indirizzi stealth) {#how-use} + +Alice crea due chiavi private e pubblica le chiavi pubbliche corrispondenti (che possono essere combinate in un singolo meta-indirizzo a doppia lunghezza). Anche Bill crea una chiave privata e pubblica la chiave pubblica corrispondente. + +Usando la chiave pubblica di una parte e la chiave privata dell'altra, è possibile derivare un segreto condiviso noto solo ad Alice e Bill (non può essere derivato solo dalle chiavi pubbliche). Usando questo segreto condiviso, Bill ottiene l'indirizzo stealth e può inviarvi degli asset. + +Anche Alice ottiene l'indirizzo dal segreto condiviso, ma poiché conosce le chiavi private delle chiavi pubbliche che ha pubblicato, può anche ottenere la chiave privata che le permette di prelevare da quell'indirizzo. + +### La matematica (perché gli indirizzi stealth funzionano così) {#how-math} + +Gli indirizzi stealth standard utilizzano la [crittografia a curva ellittica (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) per ottenere prestazioni migliori con meno bit di chiave, pur mantenendo lo stesso livello di sicurezza. Ma per la maggior parte possiamo ignorarlo e fingere di usare l'aritmetica normale. + +C'è un numero che tutti conoscono, *G*. Puoi moltiplicare per *G*. Ma a causa della natura dell'ECC, è praticamente impossibile dividere per *G*. Il modo in cui la crittografia a chiave pubblica funziona generalmente in Ethereum è che puoi usare una chiave privata, *Ppriv*, per firmare le transazioni che vengono poi verificate da una chiave pubblica, *Ppub = GPpriv*. + +Alice crea due chiavi private, *Kpriv* e *Vpriv*. *Kpriv* verrà utilizzata per spendere denaro dall'indirizzo stealth, e *Vpriv* per visualizzare gli indirizzi che appartengono ad Alice. Alice pubblica quindi le chiavi pubbliche: *Kpub = GKpriv* e *Vpub = GVpriv* + +Bill crea una terza chiave privata, *Rpriv*, e pubblica *Rpub = GRpriv* in un registro centrale (Bill avrebbe anche potuto inviarla ad Alice, ma supponiamo che Carol stia ascoltando). + +Bill calcola *RprivVpub = GRprivVpriv*, che si aspetta che anche Alice conosca (spiegato di seguito). Questo valore è chiamato *S*, il segreto condiviso. Questo dà a Bill una chiave pubblica, *Ppub = Kpub+G\*hash(S)*. Da questa chiave pubblica, può calcolare un indirizzo e inviarvi tutte le risorse che desidera. In futuro, se Alice vince, Bill può dirle *Rpriv* per dimostrare che le risorse provenivano da lui. + +Alice calcola *RpubVpriv = GRprivVpriv*. Questo le dà lo stesso segreto condiviso, *S*. Poiché conosce la chiave privata, *Kpriv*, può calcolare *Ppriv = Kpriv+hash(S)*. Questa chiave le permette di accedere agli asset nell'indirizzo risultante da *Ppub = GPpriv = GKpriv+G\*hash(S) = Kpub+G\*hash(S)*. + +Abbiamo una chiave di visualizzazione separata per consentire ad Alice di subappaltare ai Servizi per la Campagna di Dominio del Mondo di Dave. Alice è disposta a far conoscere a Dave gli indirizzi pubblici e a farsi informare quando c'è più denaro disponibile, ma non vuole che lui spenda i soldi della sua campagna. + +Poiché la visualizzazione e la spesa utilizzano chiavi separate, Alice può dare a Dave *Vpriv*. Quindi Dave può calcolare *S = RpubVpriv = GRprivVpriv* e in questo modo ottenere le chiavi pubbliche (*Ppub = Kpub+G\*hash(S)*). Ma senza *Kpriv* Dave non può ottenere la chiave privata. + +Per riassumere, questi sono i valori conosciuti dai diversi partecipanti. + +| Alice | Pubblicato | Bill | Dave | +| - | - | - | - | +| G | G | G | G | +| *Kpriv* | - | - | - | +| *Vpriv* | - | - | *Vpriv* | +| *Kpub = GKpriv* | *Kpub* | *Kpub* | *Kpub* | +| *Vpub = GVpriv* | *Vpub* | *Vpub* | *Vpub* | +| - | - | *Rpriv* | - | +| *Rpub* | *Rpub* | *Rpub = GRpriv* | *Rpub* | +| *S = RpubVpriv = GRprivVpriv* | - | *S = RprivVpub = GRprivVpriv* | *S = *RpubVpriv* = GRprivVpriv* | +| *Ppub = Kpub+G\*hash(S)* | - | *Ppub = Kpub+G\*hash(S)* | *Ppub = Kpub+G\*hash(S)* | +| *Address=f(Ppub)* | - | *Address=f(Ppub)* | *Address=f(Ppub)* | *Address=f(Ppub)* +| *Ppriv = Kpriv+hash(S)* | - | - | - | + +## Quando gli indirizzi stealth falliscono {#go-wrong} + +*Non ci sono segreti sulla blockchain*. Sebbene gli indirizzi stealth possano fornirti privacy, tale privacy è suscettibile all'analisi del traffico. Per fare un esempio banale, immagina che Bill finanzi un indirizzo e invii immediatamente una transazione per pubblicare un valore *Rpub*. Senza la *Vpriv* di Alice, non possiamo essere sicuri che si tratti di un indirizzo stealth, ma è molto probabile. Poi, vediamo un'altra transazione che trasferisce tutti gli ETH da quell'indirizzo all'indirizzo del fondo della campagna di Alice. Potremmo non essere in grado di dimostrarlo, ma è probabile che Bill abbia appena donato alla campagna di Alice. Carol lo penserebbe sicuramente. + +È facile per Bill separare la pubblicazione di *Rpub* dal finanziamento dell'indirizzo stealth (farli in momenti diversi, da indirizzi diversi). Tuttavia, questo è insufficiente. Il modello che Carol cerca è che Bill finanzi un indirizzo, e poi il fondo della campagna di Alice prelevi da esso. + +Una soluzione è che la campagna di Alice non prelevi i soldi direttamente, ma li usi per pagare una terza parte. Se la campagna di Alice invia 10 ETH ai Servizi per la Campagna di Dominio del Mondo di Dave, Carol sa solo che Bill ha donato a uno dei clienti di Dave. Se Dave ha abbastanza clienti, Carol non sarebbe in grado di sapere se Bill ha donato ad Alice, che compete con lei, o ad Adam, Albert o Abigail, di cui a Carol non importa nulla. Alice può includere un valore hash con il pagamento, e poi fornire a Dave la preimmagine, per dimostrare che si trattava della sua donazione. In alternativa, come notato sopra, se Alice dà a Dave la sua *Vpriv*, lui sa già da chi proveniva il pagamento. + +Il problema principale di questa soluzione è che richiede ad Alice di preoccuparsi della segretezza quando tale segretezza va a vantaggio di Bill. Alice potrebbe voler mantenere la sua reputazione in modo che anche l'amico di Bill, Bob, le faccia una donazione. Ma è anche possibile che non le dispiaccia esporre Bill, perché allora lui avrà paura di cosa succederà se Carol vince. Bill potrebbe finire per fornire ad Alice ancora più supporto. + +### Usare più livelli stealth {#multi-layer} + +Invece di fare affidamento su Alice per preservare la privacy di Bill, Bill può farlo da solo. Può generare più meta-indirizzi per persone fittizie, Bob e Bella. Bill invia quindi ETH a Bob, e "Bob" (che in realtà è Bill) li invia a Bella. "Bella" (sempre Bill) li invia ad Alice. + +Carol può ancora fare l'analisi del traffico e vedere la pipeline Bill-a-Bob-a-Bella-ad-Alice. Tuttavia, se "Bob" e "Bella" usano ETH anche per altri scopi, non sembrerà che Bill abbia trasferito nulla ad Alice, anche se Alice preleva immediatamente dall'indirizzo stealth al suo indirizzo noto della campagna. + +## Scrivere un'applicazione per indirizzi stealth {#write-app} + +Questo articolo spiega un'applicazione per indirizzi stealth [disponibile su GitHub](https://github.com/qbzzt/251022-stealth-addresses.git). + +### Strumenti {#tools} + +C'è [una libreria typescript per indirizzi stealth](https://github.com/ScopeLift/stealth-address-sdk) che potremmo usare. Tuttavia, le operazioni crittografiche possono essere intensive per la CPU. Preferisco implementarle in un linguaggio compilato, come [Rust](https://rust-lang.org/), e usare [WASM](https://webassembly.org/) per eseguire il codice nel browser. + +Useremo [Vite](https://vite.dev/) e [React](https://react.dev/). Questi sono strumenti standard del settore; se non hai familiarità con essi, puoi usare [questo tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Per usare Vite, abbiamo bisogno di Node. + +### Vedere gli indirizzi stealth in azione {#in-action} + +1. Installa gli strumenti necessari: [Rust](https://rust-lang.org/tools/install/) e [Node](https://nodejs.org/en/download). + +2. Clona il repository GitHub. + + ```sh + git clone https://github.com/qbzzt/251022-stealth-addresses.git + cd 251022-stealth-addresses +``` + +3. Installa i prerequisiti e compila il codice Rust. + + ```sh + cd src/rust-wasm + rustup target add wasm32-unknown-unknown + cargo install wasm-pack + wasm-pack build --target web +``` + +4. Avvia il server web. + + ```sh + cd ../.. + npm install + npm run dev +``` + +5. Vai all'[applicazione](http://localhost:5173/). Questa pagina dell'applicazione ha due frame: uno per l'interfaccia utente di Alice e l'altro per quella di Bill. I due frame non comunicano; si trovano sulla stessa pagina solo per comodità. + +6. Come Alice, fai clic su **Generate a Stealth Meta-Address** (Genera un meta-indirizzo stealth). Questo mostrerà il nuovo indirizzo stealth e le chiavi private corrispondenti. Copia il meta-indirizzo stealth negli appunti. + +7. Come Bill, incolla il nuovo meta-indirizzo stealth e fai clic su **Generate an address** (Genera un indirizzo). Questo ti dà l'indirizzo da finanziare per Alice. + +8. Copia l'indirizzo e la chiave pubblica di Bill e incollali nell'area "Private key for address generated by Bill" (Chiave privata per l'indirizzo generato da Bill) dell'interfaccia utente di Alice. Una volta compilati questi campi, vedrai la chiave privata per accedere agli asset a quell'indirizzo. + +9. Puoi usare [un calcolatore online](https://iancoleman.net/ethereum-private-key-to-address/) per assicurarti che la chiave privata corrisponda all'indirizzo. + +### Come funziona il programma {#how-the-program-works} + +#### Il componente WASM {#wasm} + +Il codice sorgente che viene compilato in WASM è scritto in [Rust](https://rust-lang.org/). Puoi vederlo in [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs). Questo codice è principalmente un'interfaccia tra il codice JavaScript e [la libreria `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses). + +**`Cargo.toml`** + +[`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) in Rust è analogo a [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) in JavaScript. Contiene informazioni sul pacchetto, dichiarazioni delle dipendenze, ecc. + +```toml +[package] +name = "rust-wasm" +version = "0.1.0" +edition = "2024" + +[dependencies] +eth-stealth-addresses = "0.1.0" +hex = "0.4.3" +wasm-bindgen = "0.2.104" +getrandom = { version = "0.2", features = ["js"] } +``` + +Il pacchetto [`getrandom`](https://docs.rs/getrandom/latest/getrandom/) ha bisogno di generare valori casuali. Questo non può essere fatto con mezzi puramente algoritmici; richiede l'accesso a un processo fisico come fonte di entropia. Questa definizione specifica che otterremo quell'entropia chiedendola al browser in cui siamo in esecuzione. + +```toml +console_error_panic_hook = "0.1.7" +``` + +[Questa libreria](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) ci fornisce messaggi di errore più significativi quando il codice WASM va in panico e non può continuare. + +```toml +[lib] +crate-type = ["cdylib", "rlib"] +``` + +Il tipo di output richiesto per produrre codice WASM. + +**`lib.rs`** + +Questo è il codice Rust vero e proprio. + +```rust +use wasm_bindgen::prelude::*; +``` + +Le definizioni per creare un pacchetto WASM da Rust. Sono documentate [qui](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html). + +```rust +use eth_stealth_addresses::{ + generate_stealth_meta_address, + generate_stealth_address, + compute_stealth_key +}; +``` + +Le funzioni di cui abbiamo bisogno dalla [libreria `eth-stealth-addresses`](https://github.com/kassandraoftroy/eth-stealth-addresses). + +```rust +use hex::{decode,encode}; +``` + +Rust utilizza tipicamente [array](https://doc.rust-lang.org/std/primitive.array.html) di byte (`[u8; ]`) per i valori. Ma in JavaScript, utilizziamo tipicamente stringhe esadecimali. [La libreria `hex`](https://docs.rs/hex/latest/hex/) traduce per noi da una rappresentazione all'altra. + +```rust +#[wasm_bindgen] +``` + +Genera i binding WASM per poter chiamare questa funzione da JavaScript. + +```rust +pub fn wasm_generate_stealth_meta_address() -> String { +``` + +Il modo più semplice per restituire un oggetto con più campi è restituire una stringa JSON. + +```rust + let (address, spend_private_key, view_private_key) = + generate_stealth_meta_address(); +``` + +La funzione [`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) restituisce tre campi: + +- Il meta-indirizzo (*Kpub* e *Vpub*) +- La chiave privata di visualizzazione (*Vpriv*) +- La chiave privata di spesa (*Kpriv*) + +La sintassi della [tupla](https://doc.rust-lang.org/std/primitive.tuple.html) ci permette di separare nuovamente quei valori. + +```rust + format!("{{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}}", + encode(address), + encode(view_private_key), + encode(spend_private_key) + ) +} +``` + +Usa la macro [`format!`](https://doc.rust-lang.org/std/fmt/index.html) per generare la stringa codificata in JSON. Usa [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html) per cambiare gli array in stringhe esadecimali. + +```rust +fn str_to_array(s: &str) -> Option<[u8; N]> { +``` + +Questa funzione trasforma una stringa esadecimale (fornita da JavaScript) in un array di byte. La usiamo per analizzare i valori forniti dal codice JavaScript. Questa funzione è complicata a causa di come Rust gestisce array e vettori. + +L'espressione `` è chiamata [generico](https://doc.rust-lang.org/book/ch10-01-syntax.html). `N` è un parametro che controlla la lunghezza dell'array restituito. La funzione si chiama in realtà `str_to_array::`, dove `n` è la lunghezza dell'array. + +Il valore di ritorno è `Option<[u8; N]>`, il che significa che l'array restituito è [opzionale](https://doc.rust-lang.org/std/option/). Questo è un pattern tipico in Rust per le funzioni che potrebbero fallire. + +Ad esempio, se chiamiamo `str_to_array::10("bad060a7")`, la funzione dovrebbe restituire un array di dieci valori, ma l'input è di soli quattro byte. La funzione deve fallire, e lo fa restituendo `None`. Il valore di ritorno per `str_to_array::4("bad060a7")` sarebbe `Some<[0xba, 0xd0, 0x60, 0xa7]>`. + +```rust + // decode restituisce Result, _> + let vec = decode(s).ok()?; +``` + +La funzione [`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) restituisce un `Result, FromHexError>`. Il tipo [`Result`](https://doc.rust-lang.org/std/result/) può contenere un risultato positivo (`Ok(value)`) o un errore (`Err(error)`). + +Il metodo `.ok()` trasforma il `Result` in un `Option`, il cui valore è il valore `Ok()` se ha successo o `None` in caso contrario. Infine, l'[operatore punto interrogativo](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) interrompe le funzioni correnti e restituisce un `None` se l'`Option` è vuoto. Altrimenti, estrae il valore e lo restituisce (in questo caso, per assegnare un valore a `vec`). + +Questo sembra un metodo stranamente contorto per gestire gli errori, ma `Result` e `Option` assicurano che tutti gli errori vengano gestiti, in un modo o nell'altro. + +```rust + if vec.len() != N { return None; } +``` + +Se il numero di byte non è corretto, si tratta di un fallimento e restituiamo `None`. + +```rust + // try_into consuma vec e tenta di creare [u8; N] + let array: [u8; N] = vec.try_into().ok()?; +``` + +Rust ha due tipi di array. Gli [array](https://doc.rust-lang.org/std/primitive.array.html) hanno una dimensione fissa. I [vettori](https://doc.rust-lang.org/std/vec/index.html) possono crescere e ridursi. `hex::decode` restituisce un vettore, ma la libreria `eth_stealth_addresses` vuole ricevere array. [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) converte un valore in un altro tipo, ad esempio, un vettore in un array. + +```rust + Some(array) +} +``` + +Rust non richiede l'uso della parola chiave [`return`](https://doc.rust-lang.org/std/keyword.return.html) quando si restituisce un valore alla fine di una funzione. + +```rust +#[wasm_bindgen] +pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option { +``` + +Questa funzione riceve un meta-indirizzo pubblico, che include sia *Vpub* che *Kpub*. Restituisce l'indirizzo stealth, la chiave pubblica da pubblicare (*Rpub*) e un valore di scansione di un byte che accelera l'identificazione di quali indirizzi pubblicati potrebbero appartenere ad Alice. + +Il valore di scansione fa parte del segreto condiviso (*S = GRprivVpriv*). Questo valore è disponibile per Alice, e controllarlo è molto più veloce che controllare se *f(Kpub+G\*hash(S))* è uguale all'indirizzo pubblicato. + +```rust + let (address, r_pub, scan) = + generate_stealth_address(&str_to_array::<66>(stealth_address)?); +``` + +Usiamo la funzione [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) della libreria. + +```rust + format!("{{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}}", + encode(address), + encode(r_pub), + encode(&[scan]) + ).into() +} +``` + +Prepara la stringa di output codificata in JSON. + +```rust +#[wasm_bindgen] +pub fn wasm_compute_stealth_key( + address: &str, + bill_pub_key: &str, + view_private_key: &str, + spend_private_key: &str +) -> Option { + . + . + . +} +``` + +Questa funzione usa la funzione [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) della libreria per calcolare la chiave privata per prelevare dall'indirizzo (*Rpriv*). Questo calcolo richiede questi valori: + +- L'indirizzo (*Address=f(Ppub)*) +- La chiave pubblica generata da Bill (*Rpub*) +- La chiave privata di visualizzazione (*Vpriv*) +- La chiave privata di spesa (*Kpriv*) + +```rust +#[wasm_bindgen(start)] +``` + +[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) specifica che la funzione viene eseguita quando il codice WASM viene inizializzato. + +```rust +pub fn main() { + console_error_panic_hook::set_once(); +} +``` + +Questo codice specifica che l'output di panico venga inviato alla console JavaScript. Per vederlo in azione, usa l'applicazione e dai a Bill un meta-indirizzo non valido (basta cambiare una cifra esadecimale). Vedrai questo errore nella console JavaScript: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9: +assertion `left == right` failed + left: 0 + right: 1 +``` + +Seguito da un'analisi dello stack (stack trace). Quindi dai a Bill il meta-indirizzo valido e dai ad Alice un indirizzo non valido o una chiave pubblica non valida. Vedrai questo errore: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9: +keys do not generate stealth address +``` + +Di nuovo, seguito da un'analisi dello stack. + +#### L'interfaccia utente {#ui} + +L'interfaccia utente è scritta usando [React](https://react.dev/) e servita da [Vite](https://vite.dev/). Puoi imparare a conoscerli usando [questo tutorial](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/). Non c'è bisogno di [WAGMI](https://wagmi.sh/) qui perché non interagiamo direttamente con una blockchain o un portafoglio. + +L'unica parte non ovvia dell'interfaccia utente è la connettività WASM. Ecco come funziona. + +**`vite.config.js`** + +Questo file contiene [la configurazione di Vite](https://vite.dev/config/). + +```js +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import wasm from "vite-plugin-wasm"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), wasm()], +}) +``` + +Abbiamo bisogno di due plugin Vite: [react](https://www.npmjs.com/package/@vitejs/plugin-react) e [wasm](https://github.com/Menci/vite-plugin-wasm#readme). + +**`App.jsx`** + +Questo file è il componente principale dell'applicazione. È un contenitore che include due componenti: `Alice` e `Bill`, le interfacce utente per quegli utenti. La parte rilevante per WASM è il codice di inizializzazione. + +```jsx +import init from './rust-wasm/pkg/rust_wasm.js' +``` + +Quando usiamo [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/), crea due file che usiamo qui: un file wasm con il codice vero e proprio (qui, `src/rust-wasm/pkg/rust_wasm_bg.wasm`) e un file JavaScript con le definizioni per usarlo (qui, `src/rust_wasm/pkg/rust_wasm.js`). L'esportazione predefinita di quel file JavaScript è il codice che deve essere eseguito per avviare WASM. + +```jsx +function App() { + . + . + . + useEffect(() => { + const loadWasm = async () => { + try { + await init(); + setWasmReady(true) + } catch (err) { + console.error('Error loading wasm:', err) + alert("Wasm error: " + err) + } + } + + loadWasm() + }, [] + ) +``` + +L'[`hook useEffect`](https://react.dev/reference/react/useEffect) ti permette di specificare una funzione che viene eseguita quando le variabili di stato cambiano. Qui, l'elenco delle variabili di stato è vuoto (`[]`), quindi questa funzione viene eseguita solo una volta al caricamento della pagina. + +La funzione dell'effetto deve restituire immediatamente. Per usare codice asincrono, come l'`init` di WASM (che deve caricare il file `.wasm` e quindi richiede tempo) definiamo una funzione [`async`](https://en.wikipedia.org/wiki/Async/await) interna e la eseguiamo senza un `await`. + +**`Bill.jsx`** + +Questa è l'interfaccia utente per Bill. Ha una singola azione, creare un indirizzo basato sul meta-indirizzo stealth fornito da Alice. + +```jsx +import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js' +``` + +Oltre all'esportazione predefinita, il codice JavaScript generato da `wasm-pack` esporta una funzione per ogni funzione nel codice WASM. + +```jsx +