Creare il database Rich History

Questo argomento contiene informazioni utili per specificare una connessione al database Oracle e scegliere i canali per creare il database Rich History. Questo database verrà utilizzato per creare report di analisi e visualizzazioni delle attività del libro contabile.

Cos'è il Rich History Database?

Il ricco database di cronologia è esterno a Oracle Blockchain Platform e contiene dati sulle transazioni del libro contabile della blockchain nei canali selezionati. Utilizzare questo database per creare report di analisi e visualizzazione sulle attività del libro contabile.

Ad esempio, utilizzando il database della cronologia completa, è possibile creare analisi per conoscere il saldo medio di tutti i clienti della banca in un determinato intervallo di tempo o il tempo necessario per spedire merce da un grossista a un rivenditore.

Internamente, Oracle Blockchain Platform utilizza il database di cronologia di Hyperledger Fabric per gestire il libro contabile e presentare le informazioni sulle transazioni del libro contabile nella console. Solo i codici concatenati possono accedere a questo database della cronologia e non è possibile esporre il database della cronologia di Hyperledger Fabric come origine dati per le query analitiche. Il database della cronologia completa utilizza un database Oracle esterno e contiene molti dettagli su ogni transazione di cui è stato eseguito il commit su un canale. Questo livello di raccolta dei dati rende il database della cronologia avanzata una fonte di dati eccellente per l'analitica. Per informazioni sui dati raccolti dal database Rich History, vedere Tabelle e colonne del database Rich History.

Puoi utilizzare solo un database Oracle come Oracle Autonomous Data Warehouse o Oracle Database Classic Cloud Service con Oracle Cloud Infrastructure per creare il tuo database con una cronologia completa. Utilizzare la console di Oracle Blockchain Platform per fornire la stringa di connessione e le credenziali per accedere e scrivere nel database Oracle. Tenere presente che le credenziali fornite sono le credenziali del database e che Oracle Blockchain Platform non le gestisce. Dopo aver creato la connessione, si selezioneranno i canali che contengono i dati del libro contabile che si desidera includere nel database della cronologia avanzata. Vedere Abilitazione e configurazione del database Rich History.

È possibile utilizzare tabelle standard o tabelle blockchain per memorizzare il database Rich History. Le tabelle blockchain sono tabelle di sola aggiunta a prova di manomissione, che possono essere utilizzate come libro contabile sicuro pur essendo disponibili per transazioni e query con altre tabelle. Per ulteriori informazioni, vedere Tabella di Oracle Blockchain.

È possibile utilizzare qualsiasi strumento di analitica, ad esempio Oracle Analytics Cloud o Oracle Data Visualization Cloud Service, per accedere al database della cronologia avanzata e creare report di analitica o visualizzazioni dati.

Creare la stringa di connessione Oracle Database Classic Cloud Service

È necessario raccogliere informazioni da Oracle Database Classic Cloud Service distribuito su Oracle Cloud Infrastructure per creare la stringa di connessione richiesta dal database della cronologia avanzata. È inoltre necessario abilitare l'accesso al database tramite la porta 1521.

Trova e registra informazioni su Oracle Database Classic Cloud Service

Le informazioni necessarie per creare una connessione a Oracle Database Classic Cloud Service sono disponibili nella console di Oracle Cloud Infrastructure.

  1. Nella console dell'infrastruttura fare clic sul menu di navigazione nell'angolo in alto a sinistra, quindi fare clic su Database.

  2. Individuare il database a cui si desidera connettersi e registrare l'indirizzo IP pubblico.

  3. Fare clic sul nome del database a cui si desidera connettersi e registrare i valori nei seguenti campi:

    • Nome univoco del database

    • Nome dominio host

    • Porta

  4. Trovare un nome utente e una password di un utente del database con le autorizzazioni per la lettura da questo database e prendere nota di questi. Ad esempio, l'utente SYSTEM.

Abilita accesso al database tramite la porta 1521

Aggiungere una regola di entrata che consenta al database Rich History di accedere al database tramite la porta 1521.

  1. Nella home page di Oracle Cloud Infrastructure fare clic sull'icona di navigazione, quindi in Database fare clic su Sistemi DB.

  2. Fare clic sul database a cui si desidera connettersi.

  3. Fare clic sul collegamento Rete cloud virtuale.

  4. Passare alla subnet appropriata, quindi in Elenchi di sicurezza fare clic su Elenco di sicurezza predefinito per <Database di destinazione>.

    Viene visualizzata la pagina Lista di sicurezza.

  5. Fare clic su Modifica tutte le regole.

  6. Aggiungere una regola di entrata per consentire a qualsiasi traffico in entrata dalla rete Internet pubblica di raggiungere la porta 1521 su questo nodo del database, con le impostazioni riportate di seguito.

    • CIDR DI ORIGINE: 0.0.0.0/0

    • PROTOCOLLO IP: TCP

    • GAMMA PORTA ORIGINE: tutto

    • INTERVALLO DI PORTE DI DESTINAZIONE: 1521

    • Consenti: traffico TCP per le porte: 1521

Generare la stringa di connessione

Dopo aver abilitato l'accesso al database Oracle, utilizzare le informazioni raccolte per creare la stringa di connessione nella finestra di dialogo Configura cronologia avanzata.

Costruire la stringa di connessione utilizzando la seguente sintassi: <publicIP>:<portNumber>/<database unique name>.<host domain name>

Ad esempio, 192.0.2.0:1521/CustDB_iad1vm.sub05031027070.customervcnwith.oraclevcn.example.com

Assicurarsi che l'utente del database disponga di privilegi corretti

Affinché la funzionalità avanzata della cronologia sia in grado di gestire le sessioni del database e di eseguire il recupero dai tempi di inattività temporanei del database o della rete, assicurarsi che l'utente del database registrato con Oracle Blockchain Platform disponga dei due privilegi riportati di seguito.
grant select on v_$session to <user>;
grant alter system to <user>;
Inoltre, se il rich history database utilizza Oracle Autonomous Data Warehouse, l'utente del database deve disporre del privilegio seguente:
grant unlimited tablespace to <user>;
Se l'utente del database non dispone già di tali privilegi, questi devono essere concessi dall'amministratore del database di sistema.

Senza questi privilegi Oracle Blockchain Platform può replicarsi nel database, ma non può essere recuperata da situazioni che portano a una sessione del database danneggiata, il che impedisce alla cronologia completa di recuperare il ritardo con le transazioni recenti per un periodo prolungato. Senza questi privilegi su Oracle Autonomous Data Warehouse, non vengono salvati dati di cronologia avanzata.

Abilitare e configurare il database Rich History

Utilizzare la console per fornire informazioni sulla connessione al database e selezionare i canali con i dati del libro contabile del codice concatenato che si desidera scrivere nel database della cronologia avanzata. Per impostazione predefinita, i canali non sono abilitati a scrivere dati nel database Rich History.

Tenere presenti le informazioni riportate di seguito.

  • Ogni membro della rete blockchain configura il proprio database ricco di storia.

  • È necessario utilizzare un database Oracle. Non sono supportati altri tipi di database.

  • Ogni canale che scrive nel database Rich History deve contenere almeno un nodo peer.

  1. Immettere le informazioni di connessione e le credenziali per il database Oracle che si desidera utilizzare per memorizzare le informazioni della cronologia avanzata.
    1. Andare alla console e fare clic sul pulsante Opzioni, quindi fare clic su Configura cronologia avanzata. Questo pulsante si trova sopra la barra che contiene le schede utilizzate per accedere a nodi, canali e codici concatenati.
      Viene visualizzata la finestra di dialogo Configura cronologia avanzata.
    2. Immettere il nome utente e la password necessari per accedere al database Oracle.
    3. Nel campo Stringa di connessione, immettere la stringa di connessione per il database che verrà utilizzato per memorizzare i dati della cronologia avanzata. L'immissione dipende dal database Oracle in uso.
      • Se si utilizza Oracle Autonomous Data Warehouse, immettere un valore simile a <username>adw_high. Per trovare le informazioni di connessione di Oracle Autonomous Data Warehouse, andare al relativo file ZIP del wallet delle credenziali e aprire il relativo file TNS.
      • Se si utilizza Oracle Database Classic Cloud Service con Oracle Cloud Infrastructure, vedere Creare la stringa di connessione a Oracle Database Classic Cloud Service.
      • Se si utilizza un database Oracle non autonomo (un database che non utilizza un wallet delle credenziali) e si desidera utilizzare l'utente sys per connettersi al database, è necessario aggiungere ?as=sys[dba|asm|oper] alla stringa di connessione. Ad esempio, 123.123.123.123:1521/example.oraclevcn.com?as=sysdba
    4. Se si utilizza un'istanza di Oracle Cloud Autonomous Database (ad esempio, Oracle Autonomous Data Warehouse o Oracle Autonomous Transaction Processing), utilizzare il campo File package wallet per caricare il file ZIP del wallet delle credenziali richiesto. Questo file contiene le credenziali client e viene generato dal database autonomo Oracle.

      Nota

      Quando si apre di nuovo la finestra di dialogo Configura cronologia avanzata dopo aver configurato la cronologia avanzata, il nome del file wallet non viene visualizzato. Se si aggiornano altre impostazioni, è necessario caricare di nuovo il file ZIP del wallet prima di fare clic su Salva. Se si fa clic su Salva mentre non viene visualizzato alcun nome di file wallet, la configurazione viene aggiornata per non utilizzare un file wallet.
    5. Per utilizzare le tabelle blockchain per memorizzare il database Rich History, selezionare Usa tabella blockchain database.
      Il database sottostante deve supportare le tabelle blockchain. Per ulteriori informazioni, vedere Tabella di Oracle Blockchain.
      • Per specificare il numero di giorni per la conservazione di tabelle e righe, selezionare Configurazione di base, quindi immettere il numero di giorni per la conservazione di tabelle e righe. Inserire 0 per conservare in modo permanente tabelle o righe. Per evitare ulteriori modifiche ai valori di conservazione, selezionare Bloccato.
      • Per specificare la conservazione della tabella e delle righe utilizzando un'istruzione DDL (Data Definition Language), selezionare Query di configurazione avanzata, quindi immettere l'istruzione DDL.
    6. Fare clic su Save.
  2. Abilita una cronologia completa sui canali che contengono i dati del codice concatenato che si desidera scrivere nel database Rich History.
    1. Andare alla console e selezionare la scheda Canali.
    2. Individuare il canale contenente i dati del codice concatenato che si desidera scrivere nel database Rich History. Fare clic sul relativo pulsante Altre opzioni e selezionare Configura cronologia avanzata.
      Viene visualizzata la finestra di dialogo Configura cronologia avanzata.
    3. Fare clic sulla casella di controllo Abilita cronologia avanzata. Per memorizzare le raccolte dati private nel database Rich History, immettere una lista di nomi di raccolta dati privati separati da virgole. Per ulteriori informazioni sulle raccolte di dati private, vedere Informazioni sulle raccolte di dati private. Per aggiungere i dettagli delle transazioni al database Rich History, selezionare i dettagli che si desidera aggiungere. Fare clic su Save.
Il database della cronologia avanzata è configurato, ma le tabelle non vengono create immediatamente nel database. Quando si verifica la successiva modifica pertinente della transazione o del libro contabile, le tabelle vengono create nel database della cronologia completa.

Modificare la connessione al database Rich History

È possibile modificare le informazioni di connessione del database Rich History.

Dopo aver creato le tabelle nel database per un canale, la modifica della configurazione della cronologia completa per il canale non ha alcun effetto, anche dopo aver fatto clic su Salva, a meno che non si modifichino il nome utente e la password o la stringa di connessione. Se si modificano il nome utente e la password, le tabelle vengono create nello stesso database. Se si modificano la stringa di connessione e le credenziali, viene configurato un database diverso e le tabelle vengono create dopo la successiva modifica pertinente della transazione o del libro contabile. Non è possibile modificare un database Rich History da tabelle standard a tabelle blockchain e non è possibile modificare i tempi di conservazione, a meno che non si modifichino anche le credenziali o la stringa di connessione.
  1. Andare alla console e fare clic sul pulsante Opzioni, quindi fare clic su Configura cronologia avanzata. Questo pulsante si trova sopra la barra che contiene le schede utilizzate per accedere a nodi, canali e codici concatenati.
  2. Se necessario, aggiornare il nome utente e la password necessari per accedere al database Oracle.
  3. Se necessario, nel campo Stringa di connessione modificare la stringa di connessione per il database che verrà utilizzato per memorizzare i dati della cronologia avanzata. L'immissione dipende dal database Oracle in uso.
    • Se si utilizza Oracle Autonomous Data Warehouse, immettere un valore simile a <username>adw_high. Per trovare le informazioni di connessione di Oracle Autonomous Data Warehouse, andare al relativo file ZIP del wallet delle credenziali e aprire il relativo file TNS.
    • Se si utilizza Oracle Database Classic Cloud Service con Oracle Cloud Infrastructure, vedere Creare la stringa di connessione a Oracle Database Classic Cloud Service.
    • Se si utilizza un database Oracle non autonomo (un database che non utilizza un wallet delle credenziali) e si desidera utilizzare l'utente sys per connettersi al database, è necessario aggiungere ?as=sys[dba|asm|oper] alla stringa di connessione. Ad esempio, 123.123.123.123:1521/example.oraclevcn.com?as=sysdba
  4. Se si utilizza un'istanza di Oracle Cloud Autonomous Database (ad esempio, Oracle Autonomous Data Warehouse o Oracle Autonomous Transaction Processing), utilizzare il campo File package wallet per caricare o ricaricare il file wallet delle credenziali richiesto. Questo file contiene le credenziali client e viene generato dal database autonomo Oracle.

    Nota

    Quando si apre di nuovo la finestra di dialogo Configura cronologia avanzata dopo aver configurato la cronologia avanzata, il nome del file wallet non viene visualizzato. Se si aggiornano altre impostazioni, è necessario caricare di nuovo il file ZIP del wallet prima di fare clic su Salva. Se si fa clic su Salva mentre non viene visualizzato alcun nome di file wallet, la configurazione viene aggiornata per non utilizzare un file wallet.
  5. Per utilizzare le tabelle blockchain per memorizzare il database Rich History, selezionare Usa tabella blockchain database.
    Il database sottostante deve supportare le tabelle blockchain.
    • Per specificare il numero di giorni per la conservazione di tabelle e righe, selezionare Configurazione di base, quindi immettere il numero di giorni per la conservazione di tabelle e righe. Inserire 0 per conservare in modo permanente tabelle o righe. Per evitare ulteriori modifiche ai valori di conservazione, selezionare Bloccato.
    • Per specificare la conservazione della tabella e delle righe utilizzando un'istruzione DDL (Data Definition Language), selezionare Query di configurazione avanzata, quindi immettere l'istruzione DDL.
  6. Fare clic su Save.

Configurare i canali che scrivono i dati nel database Rich History

È possibile abilitare i canali per scrivere i dati del libro contabile del codice concatenato nel database della cronologia avanzata ed è possibile impedire ai canali di scrivere i dati nel database della cronologia avanzata. È inoltre possibile configurare un singolo canale in modo che utilizzi una configurazione del database Rich History diversa da quella dell'impostazione globale.

È necessario specificare le informazioni globali per connettersi al database Rich History prima di poter selezionare i canali che scrivono nel database Rich History. Vedere Abilitazione e configurazione del database Rich History.

Dopo aver creato le tabelle nel database per un canale, la modifica della configurazione della cronologia completa per il canale non ha alcun effetto, anche dopo aver fatto clic su Salva, a meno che non si modifichino il nome utente e la password o la stringa di connessione. Se si modificano il nome utente e la password, le tabelle vengono create nello stesso database. Se si modificano la stringa di connessione e le credenziali, viene configurato un database diverso e le tabelle vengono create dopo la successiva modifica pertinente della transazione o del libro contabile. Non è possibile modificare un database Rich History da tabelle standard a tabelle blockchain e non è possibile modificare i tempi di conservazione, a meno che non si modifichino anche le credenziali o la stringa di connessione.

  1. Andare alla console e selezionare la scheda Canali.
  2. Individuare il canale per il quale si desidera modificare l'accesso. Fare clic sul relativo pulsante Altre opzioni e selezionare Configura cronologia avanzata.
    Viene visualizzata la finestra di dialogo Configura cronologia avanzata.
  3. Per abilitare la raccolta di dati della cronologia avanzata per il canale, selezionare la casella di controllo Abilita cronologia avanzata. Per disabilitare la raccolta dei dati della cronologia RTF per il canale, deselezionare la casella di controllo Abilita cronologia RTF.
  4. Per configurare il canale per la raccolta dei dati della cronologia RTF utilizzando un database diverso o impostazioni diverse, selezionare Usa configurazione a livello di canale, quindi specificare le impostazioni da utilizzare.
    Per ulteriori informazioni sulle impostazioni della cronologia avanzata, vedere Abilita e configura il database della cronologia avanzata.
  5. Fare clic su Save.

Monitoraggio dello stato della cronologia avanzata

Dopo aver configurato il database Rich History, è possibile utilizzare la console per monitorare lo stato di replica Rich History.

  1. Andare alla console e selezionare la scheda Canali.
  2. Nella tabella dei canali, fare clic sul pulsante Altre azioni relativo al canale che si desidera monitorare, quindi fare clic su Stato cronologia ricca.
    Viene visualizzata la finestra di dialogo Stato cronologia ricca, che include i dettagli relativi alla replica e allo stato della configurazione.
  3. Fare clic su Aggiorna per visualizzare lo stato più recente.

Limita accesso a Rich History

È possibile utilizzare i criteri di canale e le liste di controllo dell'accesso (ACL, Access Control List) per limitare le organizzazioni che possono configurare il database Rich History e recuperare lo stato della cronologia avanzata o le informazioni di configurazione.

Per impostazione predefinita, tutte le organizzazioni che dispongono dell'accesso amministrativo a un canale possono configurare la raccolta della cronologia avanzata e recuperare lo stato della cronologia avanzata e i dettagli di configurazione. Per limitare questo accesso, ad esempio all'organizzazione fondatrice, è necessario creare un criterio canale e applicarlo alle risorse che controllano l'accesso.
  1. Andare alla console e selezionare la scheda Canali.
    Viene visualizzata la scheda Canali. La tabella dei canali contiene un elenco di tutti i canali della rete.
  2. Nella tabella dei canali, fare clic sul nome del canale in cui si desidera limitare l'accesso.
  3. Fare clic su Criteri canale, quindi creare un criterio di firma che includa i membri dell'organizzazione che accederanno alle funzioni Rich History.
    Per ulteriori informazioni sui criteri di canale, vedere Gestione dei criteri di canale e delle ACL.
    Ad esempio, creare un criterio che includa solo l'identità dell'organizzazione fondatrice, non l'identità di qualsiasi organizzazione partecipante.
  4. Fare clic su ACL.
  5. Nella tabella Risorse individuare la risorsa che si desidera aggiornare per utilizzare il nuovo criterio. Fare clic su Espandi per la risorsa, quindi selezionare il criterio da assegnare alla risorsa
    La tabella seguente mostra le risorse che controllano l'accesso alla cronologia avanzata.
    Risorsa Controllo accesso
    obpadmin/ConfigureRichHistoryChannel Controlla la configurazione, l'abilitazione e la disabilitazione della cronologia avanzata per un canale.
    obpadmin/GetRichHistoryChannelStatus Controlla il recupero dello stato di replica della cronologia avanzata per un canale.
    obpadmin/GetRichHistoryChannelConfig Controlla il recupero della configurazione della cronologia avanzata corrente per un canale.
  6. Fare clic su Aggiorna ACL.
L'accesso alla ricca storia è ora controllato dalla nuova politica. I membri dell'organizzazione non inclusi nel nuovo criterio riceveranno un messaggio di errore quando tentano di accedere a una risorsa controllata dal criterio.

Tabelle e colonne del database Rich History

Il database della cronologia completa contiene tre tabelle per ogni canale: cronologia, stato e altezza più recente. Quando si creano analisi sulle transazioni libro contabile dei codici concatenati, verrà eseguita una query sulle tabelle di cronologia e stato. Se si è scelto di selezionare uno qualsiasi dei dettagli della transazione quando si abilita la cronologia avanzata, verrà creata una tabella aggiuntiva con i dettagli della transazione.

Tabella Cronologia

La tabella <instanceName><channelName>_storia contiene la cronologia del libro contabile. I dati di questa tabella indicano l'ID codice concatenato, la chiave utilizzata, se la transazione era valida, il valore assegnato alla chiave e così via.

Si noti che le colonne valore e valueJson vengono utilizzate ad esclusione reciproca. In altre parole, quando un valore chiave è json valido, il valore viene impostato nella colonna valueJson. In caso contrario, il valore viene impostato nella colonna valore. La colonna valueJson viene impostata come colonna json nel database, il che significa che gli utenti possono eseguire query su tale colonna utilizzando le solite estensioni specifiche di Oracle JSON.

Se configurato, in questa tabella vengono memorizzati anche i dati privati. Per i dati privati, l'ID codice concatenato utilizza il seguente formato: <chaincodeName>$$<collectionName>.

A colonne Tipo di dati
chaincodeId VARCHAR2 (256)
chiave VARCHAR2 (1024)
txnIsValid     NUMERO (1)
value VARCHAR2 (4000)
valueJson CLOB
blockNo NUMERO NON NULLO
NUMERO txnNo NOT NULL
txnId VARCHAR2 (128)  
txnTimestamp TIMESTAMP
txnIsDelete NUMERO (1)

Tabella stato

La tabella <instanceName><channelName>_state contiene valori di dati replicati dal database di stato. Quando si crea l'analitica sullo stato del libro contabile, verrà eseguita una query sulla tabella di stato.

Si noti che le colonne valore e valueJson vengono utilizzate ad esclusione reciproca. In altre parole, quando un valore chiave è json valido, il valore viene impostato nella colonna valueJson. In caso contrario, il valore viene impostato nella colonna valore. La colonna valueJson viene impostata come colonna json nel database, il che significa che gli utenti possono eseguire query su tale colonna utilizzando le solite estensioni specifiche di Oracle JSON.

A colonne Tipo di dati
chaincodeId VARCHAR2 (256)
chiave VARCHAR2 (1024)
value VARCHAR2 (4000) 
valueJson CLOB
blockNo NUMBER
txnNo NUMBER

Tabella Altezza più recente

L'ultima tabella <instanceName><channelName> viene utilizzata internamente da Oracle Blockchain Platform per tenere traccia dell'altezza del blocco registrata nel database Rich History. Determina l'attuale database della cronologia completa e se tutte le transazioni con codice concatenato sono state registrate nel database della cronologia completa. Impossibile eseguire query su questo database per l'analitica.

Tabella Dettagli transazione

La tabella <instanceName><channelName> contiene attributi correlati alle transazioni sottoposte a commit. Quando si abilita il database Rich History, è possibile selezionare quali di questi attributi si desidera registrare in questa tabella. La tabella dei dettagli delle transazioni acquisisce solo le informazioni sulle transazioni dell'autore approvazione, non le transazioni di configurazione o qualsiasi altro tipo di transazioni Hyperledger Fabric.

A colonne Tipo di dati
CODICE CONCATENATO VARCHAR2 (256)
BLOCCO NUMBER
Provincia di TXN NUMBER
ID transazione VARCHAR2(128)
INDICATORE ORARIO TRANSAZIONE TIMESTAMP
AUTORE SOTTOMISSIONE VARCHAR2(512)
AUTORE SOTTOMISSIONE VARCHAR2(512)
AUTORE SOTTOMISSIONE VARCHAR2(512)
TIPO DI CODICE CONCATENATO VARCHAR2(32)
NOME CODICE CONVALIDA VARCHAR2(32)
GIRATE CLOB
INPUT CLOB
EVENTI CLOB
STATO RESPONSABILE NUMERO(0)
RESPONSEPAYLOAD VARCHAR2(1024)
RWSET CLOB
BLOCCO VARCHAR2(512)
BLOCCO CREATORE VARCHAR2(512)
BLOCCO-CREATORE VARCHAR2(512)
NUMERO BLOCCO CONFIGURAZIONE NUMERO(0)
CONFIGBLOCKCREATORCN VARCHAR2(512)
CONFIGBLOCKCREATORORG VARCHAR2(512)
CONFIGBLOCKCREATOROU VARCHAR2(512)

Nota

  • L'organizzazione (ORG) e l'unità organizzativa (OU) sono guidate da certificati di identità, il che implica che possono essere assegnati a più valori. Vengono acquisiti sotto forma di elenco separato da virgole nei valori della tabella.
  • Per le identità, la tabella include solo informazioni sulla parte "Oggetto" dei certificati, non quella "Emittente".
  • La colonna RWSET contiene operazioni su tutti i codici concatenati (nello stesso libro contabile) eseguiti durante la dichiarazione a sostegno. Di conseguenza, in genere vengono visualizzate sia le operazioni di lettura lscc che le operazioni effettive dello spazio di nomi del codice concatenato.