Vues prédéfinies

Oracle Blockchain Platform Digital Assets Edition fournit les vues de base de données prédéfinies suivantes.

ACCOUNT_TRANSACTION_VIEW
Cette vue fournit un historique des transactions unifié par compte, en saisissant les côtés débit (from_account_id) et crédit (to_account_id) d'une transaction. Vous pouvez utiliser cette vue pour interroger toutes les transactions liées à un compte sans balayer les données d'état brutes de code de chaîne.
Interrogation SQL confidentielle, responsable du système :
CREATE VIEW ACCOUNT_TRANSACTION_VIEW as
        SELECT
            tx."VALUEJSON".from_account_id AS "KEY",
            tx."VALUEJSON".transaction_id AS "TRANSACTION_ID",
            tx."VALUEJSON" AS "TRANSACTION_DETAILS",
            COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO,
            COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO
        FROM "<obpInstanceName>_<channelName>_state" tx
        WHERE tx."CHAINCODEID" = '<chaincodeName>'
        AND tx."VALUEJSON".assetType = 'otransaction'
        AND tx.KEY NOT LIKE '_obp2pc_'
        AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_RECEIVER', 'CREATE_ACCOUNT')
        AND tx."VALUEJSON".from_account_id IS NOT NULL
         
        UNION ALL
        SELECT
            tx."VALUEJSON".to_account_id AS "KEY",
            tx."VALUEJSON".transaction_id AS "TRANSACTION_ID",
            tx."VALUEJSON" AS "TRANSACTION_DETAILS",
            COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO,
            COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO
        FROM "<obpInstanceName>_<channelName>_state" tx
        WHERE tx."CHAINCODEID" = '<chaincodeName>'
        AND tx."VALUEJSON".assetType = 'otransaction'
        AND tx.KEY NOT LIKE '_obp2pc_'
        AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_SENDER', 'CREATE_ACCOUNT')
        AND tx."VALUEJSON".to_account_id IS NOT NULL

Sources de données : <obpInstanceName>_<channelName>_state, la table d'état principale contenant les données de code de chaîne au format JSON

Logique de clé :
  • Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY ne commence pas par _obp2pc_
    • transaction_type n'est pas EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ou CREATE_ACCOUNT
  • Extrait l'implication du compte à la fois des transactions sortantes (from_account_id) et des transactions entrantes (to_account_id).
  • Utilise COALESCE pour garantir un ordre cohérent des colonnes (ORDER_BLOCKNO, ORDER_TXNNO) même si des valeurs JSON sont manquantes.
  • Combine les transactions sortantes et entrantes avec un UNION ALL.
Colonnes de sortie :
  • KEY : ID compte associé à la transaction (expéditeur ou destinataire).
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • TRANSACTION_DETAILS : Objet JSON complet de la transaction.
  • ORDER_BLOCKNO : Numéro de bloc utilisé pour le tri (à partir de JSON, si disponible, sinon métadonnées de bloc).
  • ORDER_TXNNO : Numéro de transaction dans le bloc (à partir de JSON, si disponible, sinon métadonnées de bloc).
Données SourcesConfidential Interrogation SQL, Banque du participant :
CREATE VIEW ACCOUNT_TRANSACTION_VIEW AS
        SELECT
            tx."VALUEJSON".from_account_id AS "KEY",
            tx."VALUEJSON".transaction_id AS "TRANSACTION_ID",
            tx."VALUEJSON" AS "TRANSACTION_DETAILS",
            COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO,
            COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO
        FROM "<obpInstanceName>_<channelName>_state" tx
        WHERE tx."CHAINCODEID" = '<chaincodeName>'
        AND tx."VALUEJSON".assetType = 'otransaction'
        AND tx.KEY NOT LIKE '_obp2pc_'
        AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_RECEIVER', 'CREATE_ACCOUNT')
        AND tx."VALUEJSON".from_account_id IS NOT NULL
         
        UNION ALL
        SELECT
            tx."VALUEJSON".to_account_id AS "KEY",
            tx."VALUEJSON".transaction_id AS "TRANSACTION_ID",
            tx."VALUEJSON" AS "TRANSACTION_DETAILS",
            COALESCE(CAST(tx."VALUEJSON".blockNo AS NUMBER), tx."BLOCKNO") AS ORDER_BLOCKNO,
            COALESCE(CAST(tx."VALUEJSON".txnNo AS NUMBER), tx."TXNNO") AS ORDER_TXNNO
        FROM "<obpInstanceName>_<channelName>_state" tx
        WHERE tx."CHAINCODEID" = '<chaincodeName>'
        AND tx."VALUEJSON".assetType = 'otransaction'
        AND tx.KEY NOT LIKE '_obp2pc_'
        AND tx."VALUEJSON".transaction_type NOT IN ('EXECUTE_HOLD_SENDER', 'CREATE_ACCOUNT')
        AND tx."VALUEJSON".to_account_id IS NOT NULL

Sources de données : <obpInstanceName>_<channelName>_state, la table d'état principale contenant les données de code de chaîne au format JSON

Logique de clé :
  • Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY ne commence pas par _obp2pc_
    • transaction_type n'est pas EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ou CREATE_ACCOUNT
  • Extrait l'implication du compte à la fois des transactions sortantes (from_account_id) et des transactions entrantes (to_account_id).
  • Utilise COALESCE pour garantir un ordre cohérent des colonnes (ORDER_BLOCKNO, ORDER_TXNNO) même si des valeurs JSON sont manquantes.
  • Combine les transactions sortantes et entrantes avec un UNION ALL.
Colonnes de sortie :
  • KEY : ID compte associé à la transaction (expéditeur ou destinataire).
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • TRANSACTION_DETAILS : Objet JSON complet de la transaction.
  • ORDER_BLOCKNO : Numéro de bloc utilisé pour le tri (à partir de JSON, si disponible, sinon métadonnées de bloc).
  • ORDER_TXNNO : Numéro de transaction dans le bloc (à partir de JSON, si disponible, sinon métadonnées de bloc).
TRANSACTION_PDC_VIEW
Cette vue fournit des détails sur le solde et le montant au niveau de la transaction à partir de la collecte de données privée. Il garantit que seul le dernier enregistrement par transaction est extrait.
Interrogation SQL confidentielle, responsable du système :
CREATE VIEW TRANSACTION_PDC_VIEW as
        SELECT
            sub."VALUEJSON".transaction_id AS transaction_id,
            sub."CHAINCODEID",
            sub."VALUEJSON".amount AS quantity,
            sub."VALUEJSON".from_account_balance AS from_account_balance,
            sub."VALUEJSON".from_account_onhold_balance AS from_account_onhold_balance,
            sub."VALUEJSON".to_account_balance AS to_account_balance,
            sub."VALUEJSON".to_account_onhold_balance AS to_account_onhold_balance
        FROM (
            SELECT
                hist."VALUEJSON",
                hist."CHAINCODEID",
                ROW_NUMBER() OVER (
                    PARTITION BY hist."VALUEJSON".transaction_id
                    ORDER BY hist.TXNTIMESTAMP DESC
                ) AS rn
            FROM "<obpInstanceName>_<channelName>_hist" hist
            WHERE hist."CHAINCODEID" = '${implicitPDCName}'
            AND hist."VALUEJSON".assetType = 'otransactionpdc'
            AND hist."KEY" NOT LIKE '_obp2pc_staged_%'
        ) sub
        where rn = 1
UNION ALL
SELECT "TRANSACTION_ID","CHAINCODEID","QUANTITY","FROM_ACCOUNT_BALANCE","FROM_ACCOUNT_ONHOLD_BALANCE","TO_ACCOUNT_BALANCE","TO_ACCOUNT_ONHOLD_BALANCE" FROM "$TRANSACTION_PDC_VIEW"@${org1Name}_LINK
UNION ALL
SELECT "TRANSACTION_ID","CHAINCODEID","QUANTITY","FROM_ACCOUNT_BALANCE","FROM_ACCOUNT_ONHOLD_BALANCE","TO_ACCOUNT_BALANCE","TO_ACCOUNT_ONHOLD_BALANCE" FROM "$TRANSACTION_PDC_VIEW"@${org2Name}_LINK

Objectif : Agréger les données dans l'ensemble de l'organisation au moyen de liens de base de données.

Sources de données :
  • <obpInstanceName>_<channelName>_hist : le tableau de données du code de chaîne historique contenant les enregistrements de collecte de données privée
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK : Vue distante de l'organisation 1 accessible au moyen du lien de base de données.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK : Vue distante de l'organisation 2 accessible au moyen du lien de base de données.
Logique de clé :
  • Filtre uniquement les enregistrements pour lesquels les énoncés suivants sont vrais.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY ne commence pas par _obp2pc_staged_.
  • Utilise la fonction de fenêtre ROW_NUMBER().
    • Partitions par transaction_id.
    • Commandes d'ici le TXNTIMESTAMP DESC.
    • Conserve uniquement le dernier enregistrement (rn = 1).
  • Combine les données de la table d'historique de collecte de données privée locale, de la vue de collecte de données privée de l'organisation 1 (via un lien de base de données) et de la vue de collecte de données privée de l'organisation 2 (via un lien de base de données).
Colonnes de sortie :
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • CHAINCODEID : Identificateur du code de chaîne associé à l'enregistrement PDC.
  • QUANTITY : Montant ou quantité de la transaction transférée.
  • FROM_ACCOUNT_BALANCE : Solde du compte de l'expéditeur après la transaction.
  • FROM_ACCOUNT_ONHOLD_BALANCE : Solde bloqué du compte de l'expéditeur après la transaction.
  • TO_ACCOUNT_BALANCE : Solde du compte destinataire après la transaction.
  • TO_ACCOUNT_ONHOLD_BALANCE : Solde bloqué du compte destinataire après la transaction.
Interrogation SQL confidentielle, banque du participant :
CREATE VIEW TRANSACTION_PDC_VIEW as
        SELECT
            sub."VALUEJSON".transaction_id AS transaction_id,
            sub."CHAINCODEID",
            sub."VALUEJSON".amount AS quantity,
            sub."VALUEJSON".from_account_balance AS from_account_balance,
            sub."VALUEJSON".from_account_onhold_balance AS from_account_onhold_balance,
            sub."VALUEJSON".to_account_balance AS to_account_balance,
            sub."VALUEJSON".to_account_onhold_balance AS to_account_onhold_balance
        FROM (
            SELECT
                hist."VALUEJSON",
                hist."CHAINCODEID",
                ROW_NUMBER() OVER (
                    PARTITION BY hist."VALUEJSON".transaction_id
                    ORDER BY hist.TXNTIMESTAMP DESC
                ) AS rn
            FROM "<obpInstanceName>_<channelName>_hist" hist
            WHERE hist."CHAINCODEID" = '<implicitPDCName>'
            AND hist."VALUEJSON".assetType = 'otransactionpdc'
            AND hist."KEY" NOT LIKE '_obp2pc_staged_%'
        ) sub
        where rn = 1
Sources de données :
  • <obpInstanceName>_<channelName>_hist : le tableau de données du code de chaîne historique contenant les enregistrements de collecte de données privée
Logique de clé :
  • Filtre uniquement les enregistrements pour lesquels les énoncés suivants sont vrais.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY ne commence pas par _obp2pc_staged_.
  • Utilise la fonction de fenêtre ROW_NUMBER().
    • Partitions par transaction_id.
    • Commandes d'ici le TXNTIMESTAMP DESC.
    • Conserve uniquement le dernier enregistrement (rn = 1).
Colonnes de sortie :
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • CHAINCODEID : Identificateur du code de chaîne associé à l'enregistrement PDC.
  • QUANTITY : Montant ou quantité de la transaction transférée.
  • FROM_ACCOUNT_BALANCE : Solde du compte de l'expéditeur après la transaction.
  • FROM_ACCOUNT_ONHOLD_BALANCE : Solde bloqué du compte de l'expéditeur après la transaction.
  • TO_ACCOUNT_BALANCE : Solde du compte destinataire après la transaction.
  • TO_ACCOUNT_ONHOLD_BALANCE : Solde bloqué du compte destinataire après la transaction.
ACCOUNTS_VIEW
Cette vue fournit une vue consolidée des comptes dans toutes les organisations.
Interrogation SQL confidentielle, responsable du système :
CREATE VIEW ACCOUNTS_VIEW as
          WITH hist_ranked AS (
      SELECT
          hist.valuejson,
          hist."VALUEJSON".account_id AS account_id,
          ROW_NUMBER() OVER (
              PARTITION BY hist."VALUEJSON".account_id
              ORDER BY hist.TXNTIMESTAMP DESC
          ) AS rn
      FROM "<obpInstanceName>_<channelName>_hist" hist
      WHERE hist."CHAINCODEID" = '<implicitPDCName>'
        AND hist."VALUEJSON".assetType = 'oaccountpdc'
      ),
      state_filtered AS (
          SELECT
              state.key,
              state.valueJSON
          FROM "<obpInstanceName>_<channelName>_state" state
          WHERE state."CHAINCODEID" = '${chaincodeName}'
          AND state."VALUEJSON".assetType = 'oaccount'
      ),
      token_details AS (
          SELECT
              state.key,
              state.valueJson,
              COALESCE ( TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0) AS decimal_value
          FROM "<obpInstanceName>_<channelName>_state" state
          WHERE state."CHAINCODEID" = '<chaincodeName>'
          AND state."VALUEJSON".assetType = 'otoken'
      )
      SELECT
          s.key as account_id,
          s.valueJSON.org_id AS org_id,
          h.valuejson.user_id AS user_id,
          h.valuejson.custom_account_id AS custom_account_id,
          s.valueJSON.token_id AS token_id,
          t.decimal_value
      FROM state_filtered s
      LEFT JOIN hist_ranked h
          ON h.account_id = s.key
      AND h.rn = 1
      LEFT JOIN token_details t
          ON s.valueJSON.token_id = t.key
      WHERE h.valuejson is not null
UNION ALL
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID", "TOKEN_ID", "DECIMAL_VALUE" FROM "ACCOUNTS_VIEW"@<org1Name>_LINK WHERE "USER_ID" IS NOT NULL
UNION ALL
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID", "TOKEN_ID", "DECIMAL_VALUE" FROM "ACCOUNTS_VIEW"@$<org2Name>_LINK WHERE "USER_ID" IS NOT NULL
Objet : Cette vue fournit une vue consolidée des comptes de toutes les organisations, combinant les informations suivantes.
  • État du compte courant
  • Dernières données privées liées au compte (collecte de données privées)
  • Métadonnées de jeton telles que la précision décimale
  • Détails des comptes interorganisations au moyen de liens de base de données
Ces informations permettent d'interroger les métadonnées au niveau du compte (organisation, utilisateur, jeton, décimales) dans une seule vue.
Sources de données :
  • <obpInstanceName>_<channelName>_hist : Données du code de chaîne historique utilisées pour extraire l'entrée de collecte de données privée du compte la plus récente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : Données d'état courantes pour les comptes (oaccount) et les jetons (otoken).
  • ACCOUNTS_VIEW@<org1Name>_LINK : Vue distante de l'organisation 1.
  • ACCOUNTS_VIEW@<org2Name>_LINK : Vue distante de l'organisation 2.
Logique de clé :
  • hist_ranked CTE : Obtient le dernier enregistrement de collecte de données privée par account_id à l'aide de ROW_NUMBER() avec ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE : Sélectionne les comptes (oaccount) dans la table d'états.
  • token_details CTE : Extrait les détails du jeton (otoken) avec une précision décimale (par défaut, 0 s'il est manquant).
  • Jointures de sélection finale : État du compte (state_filtered) avec les derniers détails de la collecte de données privée (hist_ranked) et métadonnées de jeton (token_details).
  • Garantit uniquement les comptes avec la collecte de données privée associée (WHERE h.valuejson IS NOT NULL).
  • Étend les données de compte avec des associations de liens de base de données d'autres organisations.
Colonnes de sortie :
  • ACCOUNT_ID : Identificateur unique du compte.
  • ORG_ID : ID organisation associé au compte.
  • USER_ID : ID utilisateur lié au compte (à partir de la collecte de données privée).
  • CUSTOM_ACCOUNT_ID : Identificateur de compte personnalisé défini par l'utilisateur.
  • TOKEN_ID : Identificateur de jeton associé au compte.
  • DECIMAL_VALUE : Précision décimale du jeton (par défaut, 0 s'il est manquant).
Interrogation SQL confidentielle, banque du participant :
CREATE VIEW ACCOUNTS_VIEW AS
        WITH hist_ranked AS (
            SELECT
                hist.valuejson,
                hist."VALUEJSON".account_id AS account_id,
                ROW_NUMBER() OVER (
                    PARTITION BY hist."VALUEJSON".account_id
                    ORDER BY hist.TXNTIMESTAMP DESC
                ) AS rn
            FROM "<obpInstanceName>_<channelName>_hist" hist
            WHERE hist."CHAINCODEID" = '<implicitPDCName>'
            AND hist."VALUEJSON".assetType = 'oaccountpdc'
        ),
        state_filtered AS (
            SELECT
                state.key,
                state.valueJSON
            FROM "<obpInstanceName>_<channelName>_state" state
            WHERE state."CHAINCODEID" = '<chaincodeName>'
            AND state."VALUEJSON".assetType = 'oaccount'
        ),
        token_details AS (
            SELECT
                state.key,
                COALESCE (TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)), 0) AS decimal_value
            FROM "<obpInstanceName>_<channelName>_state" state
            WHERE state."CHAINCODEID" = '<chaincodeName>'
            AND state."VALUEJSON".assetType = 'otoken'
        )
        SELECT
            s.key AS account_id,
            s.valueJSON.org_id AS org_id,
            h.valuejson.user_id AS user_id,
            h.valuejson.custom_account_id AS custom_account_id,
            s.valueJSON.token_id AS token_id,
            t.decimal_value
        FROM state_filtered s
        LEFT JOIN hist_ranked h
            ON h.account_id = s.key
        AND h.rn = 1
        LEFT JOIN token_details t
            ON s.valueJSON.token_id = t.key
Objet : Cette vue fournit une vue consolidée des comptes de toutes les organisations, combinant les informations suivantes.
  • État du compte courant
  • Dernières données privées liées au compte (collecte de données privées)
  • Métadonnées de jeton telles que la précision décimale
Ces informations permettent d'interroger les métadonnées au niveau du compte (organisation, utilisateur, jeton, décimales) dans une seule vue.
Sources de données :
  • <obpInstanceName>_<channelName>_hist : Données du code de chaîne historique utilisées pour extraire l'entrée de collecte de données privée du compte la plus récente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : Données d'état courantes pour les comptes (oaccount) et les jetons (otoken).
Logique de clé :
  • hist_ranked CTE : Obtient le dernier enregistrement de collecte de données privée par account_id à l'aide de ROW_NUMBER() avec ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE : Sélectionne les comptes (oaccount) dans la table d'états.
  • token_details CTE : Extrait les détails du jeton (otoken) avec une précision décimale (par défaut, 0 s'il est manquant).
  • Jointures de sélection finale : État du compte (state_filtered) avec les derniers détails de la collecte de données privée (hist_ranked) et métadonnées de jeton (token_details).
  • Garantit uniquement les comptes avec la collecte de données privée associée (WHERE h.valuejson IS NOT NULL).
Colonnes de sortie :
  • ACCOUNT_ID : Identificateur unique du compte.
  • ORG_ID : ID organisation associé au compte.
  • USER_ID : ID utilisateur lié au compte (à partir de la collecte de données privée).
  • CUSTOM_ACCOUNT_ID : Identificateur de compte personnalisé défini par l'utilisateur.
  • TOKEN_ID : Identificateur de jeton associé au compte.
  • DECIMAL_VALUE : Précision décimale du jeton (par défaut, 0 s'il est manquant).
ACCOUNTS_MOD
Cette vue fournit une représentation structurée des données du registre de jetons fongibles, en mappant les organisations et les utilisateurs avec leurs comptes de jetons fongibles et jetons associés. Ce service simplifie l'accès aux relations de jeton de compte stockées dans l'état du code de chaîne en aplanissant les baies JSON imbriquées, ce qui facilite la consommation des interrogations d'application et d'analyse.
Interrogation SQL générique, TypeScript :
`create view ACCOUNTS_MOD as SELECT s.blockno, s.txnno, s.key,
                s.valuejson.assetType, s.valueJson.org_id, s.valueJson.user_id,
                ft.account_id, ft.token_id
     
                FROM "<obpInstanceName>_<channelName>_state" s,
     
                json_table(s.valuejson, '$.associated_ft_accounts[*]'
                Columns(lng_number FOR ORDINALITY,
                account_id varchar2 (1000) Path '$.account_id' null on empty,
                token_id varchar2 (16) Path '$.token_id' null on empty)) ft
     
                where
                s.key like '%oftregistry%' AND s.chaincodeid = '<chaincodeName>'
     
                order by s.blockno DESC, s.txnno DESC`
Sources de données :
  • <obpInstanceName>_<channelName>_state : Table d'états principale contenant les données de code de chaîne au format JSON.
Logique de clé :
  • Filtrer par clé de registre : Inclut uniquement les enregistrements où la clé contient oftregistry.
  • Filtrer par code de chaîne : Restreint les résultats au code de chaîne spécifié (<chaincodeName>).
  • Aplanir le JSON imbriqué : Utilise JSON_TABLE pour développer le tableau associated_ft_accounts en rangées distinctes pour chaque paire compte-jeton.
    • account_id : Identificateur de compte de jeton fongible.
    • token_id : Jeton lié au compte.
    • lng_number : Ordinalité (utilisée en interne pour suivre l'ordre des baies).
  • Tri : Les résultats sont triés par numéro de bloc (blockno) et par numéro de transaction (txnno) par ordre décroissant, ce qui garantit que les associations les plus récentes sont affichées en premier.
Colonnes de sortie :
  • BLOCKNO : Numéro de bloc où la mise à jour du registre a été enregistrée.
  • TXNNO : Numéro de transaction dans le bloc.
  • KEY : Clé d'état représentant l'entrée de registre de jeton fongible.
  • ASSETTYPE : Type de ressource (attendu : oftregistry).
  • ORG_ID : Identificateur d'organisation à partir du fichier JSON.
  • USER_ID : Identificateur d'utilisateur associé à l'enregistrement de registre.
  • ACCOUNT_ID : ID compte de jeton fongible extrait du tableau imbriqué.
  • TOKEN_ID : ID jeton extrait lié au compte de jeton fongible.
Interrogation SQL générique, Aller :
`create view ACCOUNTS_MOD as SELECT s.blockno, s.txnno, s.key,
                s.valuejson.AssetType, s.valueJson.OrgId as org_id, s.valueJson.UserId as user_id,
                ft.account_id, ft.token_id
     
                FROM "<obpInstanceName>_<channelName>_state" s,
     
                json_table(s.valuejson, '$.AssociatedFtAccounts[*]'
                Columns(lng_number FOR ORDINALITY,
                account_id varchar2 (1000) Path '$.AccountId' null on empty,
                token_id varchar2 (16) Path '$.TokenId' null on empty)) ft
     
                where
                s.key like '%oftregistry%' AND s.chaincodeid = '<chaincodeName>'
     
                order by s.blockno DESC, s.txnno DESC`
Cette vue est la même que l'interrogation SQL générique, la vue TypeScript. La seule différence réside dans la convention d'attribution de nom de champ JSON, qui utilise la casse Pascal au lieu de minuscules.
  • AssetType : assetType précédent
  • OrgId : org_id précédent
  • UserId : user_id précédent
  • AssociatedFtAccounts : associated_ft_accounts précédent
  • AccountId : account_id précédent
  • TokenId : token_id précédent
L'alias est appliqué (par exemple, OrgId AS org_id) pour assurer la cohérence des noms de colonne de sortie entre les vues.
Interrogation SQL confidentielle, responsable du système :
CREATE VIEW ACCOUNTS_MOD AS
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE"
FROM (
    WITH hist_ranked AS (
        SELECT
            hist.valuejson,
            hist."VALUEJSON".account_id AS account_id,
            ROW_NUMBER() OVER (
                PARTITION BY hist."VALUEJSON".account_id
                ORDER BY hist.TXNTIMESTAMP DESC
            ) AS rn
        FROM "<obpInstanceName>_<channelName>_hist" hist
        WHERE hist."CHAINCODEID" = '<implicitPDCName>'
          AND hist."VALUEJSON".assetType = 'oaccountpdc'
    ),
    state_filtered AS (
        SELECT
            state.key,
            state.valueJSON
        FROM "<obpInstanceName>_<channelName>_state" state
        WHERE state."CHAINCODEID" = '<chaincodeName>'
          AND state."VALUEJSON".assetType = 'oaccount'
    ),
    token_details AS (
        SELECT
            state.key,
            state.valueJson,
            COALESCE(
                TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)),
                0
            ) AS decimal_value
        FROM "<obpInstanceName>_<channelName>_state" state
        WHERE state."CHAINCODEID" = '<chaincodeName>'
          AND state."VALUEJSON".assetType = 'otoken'
    )
    SELECT
        s.key AS account_id,
        s.valueJSON.org_id AS org_id,
        h.valuejson.user_id AS user_id,
        h.valuejson.custom_account_id AS custom_account_id,
        s.valueJSON.token_id AS token_id,
        t.decimal_value
    FROM state_filtered s
    LEFT JOIN hist_ranked h
        ON h.account_id = s.key
       AND h.rn = 1
    LEFT JOIN token_details t
        ON s.valueJSON.token_id = t.key
    WHERE h.valuejson IS NOT NULL
)
UNION ALL
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE"
FROM "ACCOUNTS_MOD"@<org1Name>_LINK
UNION ALL
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE"
FROM "ACCOUNTS_MOD"@<org2Name>_LINK
UNION ALL
SELECT "ACCOUNT_ID","ORG_ID","USER_ID","CUSTOM_ACCOUNT_ID","TOKEN_ID","DECIMAL_VALUE"
FROM "ACCOUNTS_MOD"@<org3Name>_LINK;
Sources de données :
  • <obpInstanceName>_<channelName>_hist : Table d'historique stockant les modifications chronologiques des données privées du compte (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : Table d'états contenant l'état courant du code de chaîne au format JSON, utilisée pour les détails oaccount et otoken.
  • Vues d'organisation distante : Les données supplémentaires des vues ACCOUNTS_MOD d'autres organisations sont incluses à l'aide des liens de base de données :
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Logique de clé :
  • Classer les enregistrements historiques : Utilise ROW_NUMBER() pour sélectionner le dernier enregistrement oaccountpdc pour chaque ID compte dans la table d'historique.
  • Filtrer les comptes courants : Extrait uniquement les enregistrements avec assetType = 'oaccount' de la table d'états.
  • Jointure des métadonnées de jeton : Ajoute la précision du jeton (decimal_value) en se joignant aux entrées otoken de la table d'état.
  • Combiner les détails du compte : Joint les enregistrements de compte filtrés avec leur entrée d'historique la plus récente et les détails du jeton. S'assure que seuls les comptes avec des données historiques valides (h.valuejson IS NOT NULL) sont inclus.
  • Union multi-organisations : Utilise UNION ALL pour fusionner les données de compte de l'organisation locale avec plusieurs organisations distantes au moyen de liens de base de données. Cela permet à une seule interrogation unifiée d'extraire tous les comptes sur le réseau.
Colonnes de sortie :
  • ACCOUNT_ID : Identificateur unique du compte.
  • ORG_ID : ID organisation responsable du compte.
  • USER_ID : ID utilisateur lié au compte (à partir du dernier enregistrement historique).
  • CUSTOM_ACCOUNT_ID : Identificateur de compte personnalisé facultatif défini par l'utilisateur.
  • TOKEN_ID : Identificateur de jeton associé au compte.
  • DECIMAL_VALUE : Précision décimale du jeton (par défaut, 0 s'il est manquant).

Génération dynamique : La partie multiorganisation n'est pas codée en dur. Dans le script, les unions supplémentaires sont générées dynamiquement en fonction du fichier Participant_orgs_list.yml. Cela garantit que la vue s'adapte automatiquement en fonction du nombre d'organisations configurées dans le réseau. L'exemple d'interrogation montre trois organisations pour plus de clarté, mais dans la pratique, le nombre de syndicats dépend de la taille de orgsList. Pour plus de détails, voir les informations précédentes sur le fichier Participant_orgs_list.yml dans cette rubrique.

Interrogation SQL confidentielle, banque du participant :
CREATE VIEW ACCOUNTS_MOD AS
    WITH hist_ranked AS (
        SELECT
            hist.valuejson,
            hist."VALUEJSON".account_id AS account_id,
            ROW_NUMBER() OVER (
                PARTITION BY hist."VALUEJSON".account_id
                ORDER BY hist.TXNTIMESTAMP DESC
            ) AS rn
        FROM "<obpInstanceName>_<channelName>_hist" hist
        WHERE hist."CHAINCODEID" = '<implicitPDCName>'
          AND hist."VALUEJSON".assetType = 'oaccountpdc'
    ),
    state_filtered AS (
        SELECT
            state.key,
            state.valueJSON
        FROM "$<obpInstanceName>_<channelName>_state" state
        WHERE state."CHAINCODEID" = '<chaincodeName>'
          AND state."VALUEJSON".assetType = 'oaccount'
    ),
    token_details AS (
        SELECT
            state.key,
            COALESCE(
                TO_NUMBER(JSON_VALUE(valuejson, '$.divisible.decimal' RETURNING VARCHAR2)),
                0
            ) AS decimal_value
        FROM "${stateTableName}" state
        WHERE state."CHAINCODEID" = '${chaincodeName}'
          AND state."VALUEJSON".assetType = 'otoken'
    )
    SELECT
        s.key AS account_id,
        s.valueJSON.org_id AS org_id,
        h.valuejson.user_id AS user_id,
        h.valuejson.custom_account_id AS custom_account_id,
        s.valueJSON.token_id AS token_id,
        t.decimal_value
    FROM state_filtered s
    LEFT JOIN hist_ranked h
        ON h.account_id = s.key
       AND h.rn = 1
    LEFT JOIN token_details t
        ON s.valueJSON.token_id = t.key
    WHERE h.valuejson IS NOT NULL;
Cette vue est identique à l'interrogation SQL confidentielle, propriétaire du système, mais elle extrait les données uniquement pour l'organisation locale. Les principales différences sont les suivantes :
  • Aucun UNION ALL avec des liens de base de données n'est utilisé.
  • La sortie inclut uniquement les comptes provenant des tables d'état et d'historique de l'organisation courante.
  • La vue fournit un registre de comptes à organisation unique, contrairement à la variante à organisations multiples qui regroupe les comptes de plusieurs organisations.
TRANSACTION_MOD
Cette vue fournit un enregistrement détaillé de toutes les transactions de la chaîne de blocs, en saisissant les métadonnées, les participants, les montants et les soldes résultants. Il simplifie l'accès à l'historique des transactions en extrayant des champs structurés directement à partir de la table d'historique, éliminant ainsi la nécessité d'analyser manuellement le code JSON brut.
Interrogation SQL générique, TypeScript :
`create view TRANSACTION_MOD as SELECT h.blockno, h.txnno, h.key, h.txntimestamp,
            h.valuejson.assetType, h.valuejson.transaction_id,
            h.valuejson.from_account_id, h.valuejson.to_account_id,
            h.valuejson.transaction_type, h.valuejson.amount,
            h.valuejson.category as transaction_earmark,
            h.valuejson.from_account_balance, h.valuejson.to_account_balance
     
            FROM "<obpInstanceName>_<channelName>_hist" h
     
            where
            h.key like '%otransaction%' AND h.chaincodeid = '<chaincodeName>'
     
            order by h.blockno DESC, h.txnno DESC`

Sources de données : <obpInstanceName>_<channelName>_hist, la table d'historique contenant tous les événements de transaction au format JSON. Comprend à la fois les détails de la transaction et les métadonnées associées (bloc, numéro de transaction, horodatage).

Logique de clé :
  • Inclut uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
    • CHAINCODEID = <chaincodeName>
    • KEY contient otransaction (filtres pour les enregistrements liés aux transactions)
  • Les commandes sont exécutées de la manière suivante.
    • blockno DESC (dernier bloc en premier)
    • txnno DESC (dernière transaction dans le bloc en premier)
Colonnes de sortie :
  • BLOCKNO : Numéro de bloc dans lequel la transaction a été enregistrée.
  • TXNNO : Numéro de transaction dans le bloc.
  • KEY : Identificateur unique de l'entrée de transaction.
  • TXNTIMESTAMP : Horodatage de la fin de la transaction.
  • ASSETTYPE : Type de ressource pour la transaction (par exemple, otransaction).
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • FROM_ACCOUNT_ID : ID compte d'où provient la ressource/valeur.
  • TO_ACCOUNT_ID : ID compte dans lequel l'immobilisation/valeur a été transférée.
  • TRANSACTION_TYPE : Type de transaction (par exemple, transfert, débit, crédit).
  • AMOUNT : Montant impliqué dans la transaction.
  • TRANSACTION_EARMARK : Catégorie ou affectation pour la transaction.
  • FROM_ACCOUNT_BALANCE : Solde du compte source après la transaction.
  • TO_ACCOUNT_BALANCE : Solde du compte de destination après la transaction.
Interrogation SQL générique, Aller :
`create view TRANSACTION_MOD as SELECT h.blockno, h.txnno, h.key, h.txntimestamp,
            h.valuejson.AssetType, h.valuejson.TransactionId as transaction_id,
            h.valuejson.FromAccountId as from_account_id, h.valuejson.ToAccountId as to_account_id,
            h.valuejson.TransactionType as transaction_type, h.valuejson.Amount,
            h.valuejson.Category as transaction_earmark,
            h.valuejson.FromAccountBalance as from_account_balance, h.valuejson.ToAccountBalance as to_account_balance
     
            FROM "<obpInstanceName>_<channelName>_hist" h
     
            where
            h.key like '%otransaction%' AND h.chaincodeid = '<chaincodeName>'
     
            order by h.blockno DESC, h.txnno DESC`
Cette vue est la même que l'interrogation SQL générique, la vue TypeScript. La seule différence réside dans la convention d'attribution de nom de champ JSON, qui utilise la casse Pascal au lieu de minuscules.
  • AssetType : assetType précédent
  • TransactionId : transaction_id précédent
  • FromAccountId : from_account_id précédent
  • ToAccountId : to_account_id précédent
  • TransactionType : transaction_type précédent
  • Amount : amount précédent
  • Category : category précédent
  • FromAccountBalance : from_account_balance précédent
  • ToAccountBalance : to_account_balance précédent
L'alias est appliqué (par exemple, TransactionId AS transaction_id) pour assurer la cohérence des noms de colonne de sortie entre les vues, quelle que soit la convention d'attribution de nom de champ JSON.
Interrogation SQL confidentielle, responsable du système :
`CREATE VIEW TRANSACTION_MOD AS
        SELECT
            COALESCE(CAST(sub."VALUEJSON".blockNo AS NUMBER), sub."BLOCKNO") AS BLOCKNO,
            COALESCE(CAST(sub."VALUEJSON".txnNo AS NUMBER), sub."TXNNO") AS TXNNO,
            sub.key,
            sub.txntimestamp,
            sub.valuejson.assetType,
            sub.valuejson.transaction_id,
            sub.valuejson.from_account_id,
            sub.valuejson.to_account_id,
            sub.valuejson.transaction_type,
            (TO_NUMBER(sub.quantity) / POWER(10, sub.decimal_value)) as amount,
            sub.valuejson.category as transaction_earmark,
            (TO_NUMBER(sub.from_account_balance) / POWER(10, sub.decimal_value)) as from_account_balance,
            (TO_NUMBER(sub.to_account_balance) / POWER(10, sub.decimal_value)) as to_account_balance
        from (
            SELECT
                hist.*,
                pdc.*,
                CASE
                    WHEN hist."VALUEJSON".from_account_id IS NOT NULL
                        THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".from_account_id FETCH FIRST 1 ROW ONLY)
                    WHEN hist."VALUEJSON".to_account_id IS NOT NULL
                        THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".to_account_id FETCH FIRST 1 ROW ONLY)
                    ELSE 0
                END AS decimal_value,
                ROW_NUMBER() OVER (
                    PARTITION BY hist."VALUEJSON".transaction_id
                    ORDER BY hist.TXNTIMESTAMP DESC
                ) AS rn
            FROM "<obpInstanceName>_<channelName>_hist" hist
            LEFT JOIN "<transactionPDCViewName>" pdc
                ON hist.key = pdc.TRANSACTION_ID
            WHERE hist."CHAINCODEID" = '<chaincodeName>'
            AND hist."VALUEJSON".assetType = 'otransaction'
            AND hist."KEY" NOT LIKE '_obp2pc_staged_%'
        ) sub
        where rn = 1`
Sources de données :
  • <obpInstanceName>_<channelName>_hist : Tableau de code de chaîne historique stockant toutes les versions de transaction.
  • <transactionPDCViewName> : Vue contenant les détails de transaction de collecte de données privée, jointe pour enrichir les enregistrements de transaction.
  • ACCOUNTS_MOD : Vue de référence utilisée pour extraire la valeur decimal_value correcte pour les soldes de compte et les montants de transaction.
Logique de clé :
  • Filtre uniquement les rangées pour lesquelles les énoncés suivants sont vrais.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY ne commence pas par _obp2pc_staged_
  • Utilise ROW_NUMBER() partitionné par transaction_id (ordonné par txntimestamp DESC) pour garantir que seul le dernier enregistrement par transaction est inclus.
  • Extrait dynamiquement decimal_value à partir de ACCOUNTS_MOD, selon que la transaction implique from_account_id ou to_account_id.
  • Les montants et les soldes (amount, from_account_balance, to_account_balance) sont mis à l'échelle par précision décimale à l'aide de : value / POWER(10, decimal_value)
  • Utilise COALESCE sur blockNo et txnNo pour garantir que les colonnes de tri sont toujours présentes, même si elles sont manquantes dans JSON.
Colonnes de sortie :
  • BLOCKNO : Numéro de bloc pour la commande (à partir de JSON, si disponible, sinon à partir des métadonnées).
  • TXNNO : Numéro de transaction dans le bloc (à partir de JSON, si disponible, sinon à partir des métadonnées).
  • KEY : Identificateur de clé de transaction.
  • TXNTIMESTAMP : Horodatage de la transaction.
  • ASSETTYPE : Type de ressource (otransaction).
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • FROM_ACCOUNT_ID : ID compte à partir duquel les jetons ont été envoyés.
  • TO_ACCOUNT_ID : ID compte auquel les jetons ont été envoyés.
  • TRANSACTION_TYPE : Type de transaction (par exemple, transfert, blocage, déblocage).
  • AMOUNT : Montant de la transaction, mis à l'échelle par précision décimale du jeton.
  • TRANSACTION_EARMARK : Catégorie ou attribution de la transaction.
  • FROM_ACCOUNT_BALANCE : Solde du compte de l'expéditeur après transaction, mis à l'échelle par précision.
  • TO_ACCOUNT_BALANCE : Solde du compte du destinataire après transaction, mis à l'échelle par précision.
Interrogation SQL confidentielle, banque du participant :
`CREATE VIEW TRANSACTION_MOD AS
        SELECT
            COALESCE(CAST(sub."VALUEJSON".blockNo AS NUMBER), sub."BLOCKNO") AS BLOCKNO,
            COALESCE(CAST(sub."VALUEJSON".txnNo AS NUMBER), sub."TXNNO") AS TXNNO,
            sub.key,
            sub.txntimestamp,
            sub.valuejson.assetType,
            sub.valuejson.transaction_id,
            sub.valuejson.from_account_id,
            sub.valuejson.to_account_id,
            sub.valuejson.transaction_type,
            (TO_NUMBER(sub.quantity) / POWER(10, sub.decimal_value)) as amount,
            sub.valuejson.category as transaction_earmark,
            (TO_NUMBER(sub.from_account_balance) / POWER(10, sub.decimal_value)) as from_account_balance,
            (TO_NUMBER(sub.to_account_balance) / POWER(10, sub.decimal_value)) as to_account_balance
        from (
            SELECT
                hist.*,
                pdc.*,
                CASE
                    WHEN hist."VALUEJSON".from_account_id IS NOT NULL
                        THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".from_account_id FETCH FIRST 1 ROW ONLY)
                    WHEN hist."VALUEJSON".to_account_id IS NOT NULL
                        THEN (SELECT DECIMAL_VALUE FROM "ACCOUNTS_MOD" WHERE ACCOUNT_ID = hist."VALUEJSON".to_account_id FETCH FIRST 1 ROW ONLY)
                    ELSE 0
                END AS decimal_value,
                ROW_NUMBER() OVER (
                    PARTITION BY hist."VALUEJSON".transaction_id
                    ORDER BY hist.TXNTIMESTAMP DESC
                ) AS rn
            FROM "<obpInstanceName>_<channelName>_hist" hist
            LEFT JOIN "<transactionPDCViewName>" pdc
                ON hist.key = pdc.TRANSACTION_ID
            WHERE hist."CHAINCODEID" = '<chaincodeName>'
            AND hist."VALUEJSON".assetType = 'otransaction'
            AND hist."KEY" NOT LIKE '_obp2pc_staged_%'
        ) sub
        where rn = 1`
Sources de données :
  • <obpInstanceName>_<channelName>_hist : Tableau de code de chaîne historique contenant toutes les versions de transaction au format JSON.
  • <transactionPDCViewName> : Vue de collecte de données privée qui contient les données privées au niveau de la transaction. Il est joint à l'historique pour enrichir l'enregistrement de transaction.
  • ACCOUNTS_MOD : Vue utilisée pour extraire la précision décimale correcte du jeton (decimal_value) pour les comptes impliqués dans des transactions.
Logique de clé :
  • Filtre uniquement les rangées pour lesquelles les énoncés suivants sont vrais.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Exclut les transactions en zone de préparation (KEY NOT LIKE '_obp2pc_staged_%')
  • Ajustement décimal : Extrait decimal_value dynamiquement à partir de ACCOUNTS_MOD, en fonction de from_account_id ou to_account_id. Applique l'ajustement à amount, from_account_balance et to_account_balance à l'aide de : value / POWER(10, decimal_value)
  • Sélection d'enregistrement : Utilise ROW_NUMBER() partitionné par transaction_id (la plus récente par TXNTIMESTAMP) pour garantir que seule la dernière version de chaque transaction est retournée.
  • Normalisation des données : COALESCE est appliqué sur blockNo et txnNo pour assurer la cohérence même si les valeurs sont manquantes dans les données utiles JSON.
Colonnes de sortie :
  • BLOCKNO : Numéro de bloc utilisé pour la commande (à partir de JSON, si disponible, sinon à partir des métadonnées).
  • TXNNO : Numéro de transaction dans le bloc (à partir de JSON, si disponible, sinon à partir des métadonnées).
  • KEY : Identificateur de clé de transaction.
  • TXNTIMESTAMP : Horodatage de la transaction.
  • ASSETTYPE : Type de ressource (otransaction).
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • FROM_ACCOUNT_ID : ID compte envoyant des jetons.
  • TO_ACCOUNT_ID : ID compte recevant les jetons.
  • TRANSACTION_TYPE : Type de transaction (par exemple, transfert, blocage, déblocage).
  • AMOUNT : Montant de la transaction, normalisé à l'aide de la précision décimale du jeton.
  • TRANSACTION_EARMARK : Catégorie ou affectation pour la transaction.
  • FROM_ACCOUNT_BALANCE : Solde du compte de l'expéditeur après la transaction (ajusté avec précision).
  • TO_ACCOUNT_BALANCE : Solde du compte destinataire après la transaction (ajusté avec précision).
ACCOUNTS_TRANSACTION_MOD
Cette vue prolonge l'historique des transactions en associant chaque transaction aux codes d'organisation des comptes participants. Il prend en charge les approbations de consommation, les approbations de mentalité et les transferts réguliers, en veillant à ce que les transactions incluent à la fois un contexte au niveau du compte et au niveau de l'organisation.
Interrogation SQL générique, TypeScript et Go :
`create view ACCOUNTS_TRANSACTION_MOD as SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            B.ORG_ID FROM_ORG_ID,
            B.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
            <transactionViewName> A, <accountsViewName> B
            WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TRANSACTION_TYPE='APPROVE_BURN'
        UNION
        SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            C.ORG_ID FROM_ORG_ID,
            C.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
            <transactionViewName> A, <accountsViewName> C
            WHERE A.TO_ACCOUNT_ID=C.ACCOUNT_ID AND A.TRANSACTION_TYPE='APPROVE_MINT'
        UNION
        SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            B.ORG_ID FROM_ORG_ID,
            C.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
            <transactionViewName> A, <accountsViewName> B, <accountsViewName> C
            WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID=C.ACCOUNT_ID
        ORDER BY BLOCKNO DESC`
Sources de données :
  • <transactionViewName> (A) : Fournit des détails de transaction de base tels que les ID, les numéros de bloc, les comptes, les montants et les horodatages.
  • <accountsViewName> (B, C) : Mappe les comptes (ACCOUNT_ID) aux organisations (ORG_ID) pour l'expéditeur et le destinataire.
Key Logic : La vue est créée à l'aide d'un UNION de trois cas :
  1. APPROVE_BURN
    • Joignez-vous à FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Affectez B.ORG_ID à FROM_ORG_ID et TO_ORG_ID.
  2. APPROVE_MINT
    • Joignez-vous à TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Affectez C.ORG_ID à FROM_ORG_ID et TO_ORG_ID.
  3. Transferts réguliers
    • Rejoignez-nous sur FROM_ACCOUNT_ID = B.ACCOUNT_ID et TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Affectez B.ORG_ID en tant que FROM_ORG_ID et C.ORG_ID en tant que TO_ORG_ID.
Enfin, les résultats sont triés par BLOCKNO DESC pour prioriser les dernières transactions.
Colonnes de sortie :
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • BLOCKNO : Numéro de bloc dans lequel la transaction a été enregistrée.
  • FROM_ACCOUNT_ID : ID compte de l'expéditeur.
  • TO_ACCOUNT_ID : ID compte du destinataire.
  • EARMARK : Catégorie d'affectation de transaction (alias de TRANSACTION_EARMARK).
  • FROM_ORG_ID : ID organisation du compte de l'expéditeur (ou identique à TO pour gravure).
  • TO_ORG_ID : ID organisation du compte du destinataire (ou identique à FROM pour mint).
  • TRANSACTION_TYPE : Type de la transaction (APPROVE_BURN, APPROVE_MINT ou transfert).
  • AMOUNT : Montant de la transaction.
  • CRDATE : Date de création de la transaction (à partir de TXNTIMESTAMP).
Interrogation SQL confidentielle, responsable du système et banque du participant :
`CREATE VIEW ACCOUNTS_TRANSACTION_MOD AS
        SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            B.ORG_ID FROM_ORG_ID,
            B.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
            "<transactionViewName>" A, "<accountsViewName>" B
            WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID IS NULL AND A.TRANSACTION_TYPE != 'CREATE_ACCOUNT'
        UNION
        SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            C.ORG_ID FROM_ORG_ID,
            C.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
            "<transactionViewName>" A, "<accountsViewName>" C
            WHERE A.TO_ACCOUNT_ID=C.ACCOUNT_ID AND A.FROM_ACCOUNT_ID IS NULL
        UNION
        SELECT DISTINCT
            TRANSACTION_ID,
            A.BLOCKNO,
            FROM_ACCOUNT_ID,
            TO_ACCOUNT_ID,
            A.TRANSACTION_EARMARK EARMARK,
            B.ORG_ID FROM_ORG_ID,
            C.ORG_ID TO_ORG_ID,
            TRANSACTION_TYPE,
            AMOUNT,
            A.TXNTIMESTAMP CRDATE
        FROM
        "<transactionViewName>" A, "<accountsViewName>" B, "<accountsViewName>" C
            WHERE A.FROM_ACCOUNT_ID=B.ACCOUNT_ID AND A.TO_ACCOUNT_ID=C.ACCOUNT_ID
        ORDER BY BLOCKNO DESC
Sources de données :
  • <transactionViewName> (A) : Fournit des données au niveau des transactions (ID, numéros de bloc, références de compte, montants, horodatages).
  • <accountsViewName> (B, C) : Fournit un mappage entre ACCOUNT_ID et ORG_ID.
Logique clé : La vue utilise UNION pour fusionner les résultats de trois modèles de transaction :
  1. Transactions destinées uniquement à l'expéditeur (par exemple, cas sortants ou similaires à un traitement)
    • Condition : A.FROM_ACCOUNT_ID = B.ACCOUNT_ID et A.TO_ACCOUNT_ID IS NULL.
    • Exclut le type de transaction CREATE_ACCOUNT.
    • FROM_ORG_ID et TO_ORG_ID sont tous deux dérivés de l'organisation de l'expéditeur (B.ORG_ID).
  2. Transactions destinées uniquement aux destinataires (par exemple, cas entrants ou de type menthe)
    • Condition : A.TO_ACCOUNT_ID = C.ACCOUNT_ID et A.FROM_ACCOUNT_ID IS NULL.
    • FROM_ORG_ID et TO_ORG_ID sont tous deux dérivés de l'organisation du destinataire (C.ORG_ID).
  3. Transferts standard (transactions avec l'expéditeur et le destinataire)
    • Condition : A.FROM_ACCOUNT_ID = B.ACCOUNT_ID et A.TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • FROM_ORG_ID provient de l'organisation de l'expéditeur (B.ORG_ID), TO_ORG_ID de l'organisation du destinataire (C.ORG_ID).
Enfin, les résultats sont triés par ordre décroissant de BLOCKNO pour prioriser les dernières transactions.
Colonnes de sortie :
  • TRANSACTION_ID : Identificateur unique de la transaction.
  • BLOCKNO : Numéro de bloc où la transaction est enregistrée.
  • FROM_ACCOUNT_ID : ID compte de l'expéditeur (peut être NULL pour mint).
  • TO_ACCOUNT_ID : ID compte du destinataire (peut être NULL pour gravure).
  • EARMARK : Affectation de transaction (alias de TRANSACTION_EARMARK).
  • FROM_ORG_ID : ID organisation de l'expéditeur (ou identique au destinataire si l'expéditeur est NULL).
  • TO_ORG_ID : ID organisation du destinataire (ou identique à l'expéditeur si le destinataire est NULL).
  • TRANSACTION_TYPE : Type de transaction (par exemple, transfert, menthe, gravure, etc.).
  • AMOUNT : Montant de la transaction.
  • CRDATE : Horodatage de création de transaction (TXNTIMESTAMP).