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, capturant à la fois 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 analyser les données d'état de code chaîne brutes.
Requête SQL confidentielle, propriétaire 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, table d'état principale contenant les données de code chaîne au format JSON

Logique de la 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 la participation des comptes des transactions sortantes (from_account_id) et 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 une valeur UNION ALL.
Colonnes de sortie:
  • KEY : ID de compte associé à la transaction (expéditeur ou destinataire).
  • TRANSACTION_ID : identificateur unique du mouvement.
  • 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 du format JSON si disponible, sinon métadonnées de bloc).
Requête SQL SourcesConfidential de données, 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, table d'état principale contenant les données de code chaîne au format JSON

Logique de la 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 la participation des comptes des transactions sortantes (from_account_id) et 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 une valeur UNION ALL.
Colonnes de sortie:
  • KEY : ID de compte associé à la transaction (expéditeur ou destinataire).
  • TRANSACTION_ID : identificateur unique du mouvement.
  • 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 du format 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.
Requête SQL confidentielle, propriétaire 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 au sein de l'organisation via des liens de base de données.

Sources de données:
  • <obpInstanceName>_<channelName>_hist : table de données de code chaîne historique contenant des enregistrements de collecte de données privés
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK : vue distante de l'organisation 1 accessible via le lien de base de données.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK : vue distante de l'organisation 2 accessible via le lien de base de données.
Logique de la clé :
  • Filtre uniquement les enregistrements pour lesquels les affirmations suivantes sont vraies.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY ne commence pas par _obp2pc_staged_.
  • Utilise la fonction de fenêtre ROW_NUMBER().
    • Partitions par transaction_id.
    • Commandes par 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 le lien de base de données) et de la vue de collecte de données privée de l'organisation 2 (via le lien de base de données).
Colonnes de sortie:
  • TRANSACTION_ID : identificateur unique du mouvement.
  • CHAINCODEID : identificateur du code chaîne associé à l'enregistrement PDC.
  • QUANTITY : montant ou quantité de la transaction transférée.
  • FROM_ACCOUNT_BALANCE : solde du compte expéditeur après la transaction.
  • FROM_ACCOUNT_ONHOLD_BALANCE : solde retenu du compte de l'expéditeur après la transaction.
  • TO_ACCOUNT_BALANCE : solde du compte bénéficiaire après la transaction.
  • TO_ACCOUNT_ONHOLD_BALANCE : solde retenu du compte bénéficiaire après la transaction.
Requête SQL confidentielle, Banque des participants :
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 : table de données de code chaîne historique contenant des enregistrements de collecte de données privés
Logique de la clé :
  • Filtre uniquement les enregistrements pour lesquels les affirmations suivantes sont vraies.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY ne commence pas par _obp2pc_staged_.
  • Utilise la fonction de fenêtre ROW_NUMBER().
    • Partitions par transaction_id.
    • Commandes par TXNTIMESTAMP DESC.
    • Conserve uniquement le dernier enregistrement (rn = 1).
Colonnes de sortie:
  • TRANSACTION_ID : identificateur unique du mouvement.
  • CHAINCODEID : identificateur du code chaîne associé à l'enregistrement PDC.
  • QUANTITY : montant ou quantité de la transaction transférée.
  • FROM_ACCOUNT_BALANCE : solde du compte expéditeur après la transaction.
  • FROM_ACCOUNT_ONHOLD_BALANCE : solde retenu du compte de l'expéditeur après la transaction.
  • TO_ACCOUNT_BALANCE : solde du compte bénéficiaire après la transaction.
  • TO_ACCOUNT_ONHOLD_BALANCE : solde retenu du compte bénéficiaire après la transaction.
ACCOUNTS_VIEW
Cette vue fournit une vue consolidée des comptes de toutes les organisations.
Requête SQL confidentielle, propriétaire 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
Objectif : Cette vue fournit une vue consolidée des comptes de toutes les organisations, en combinant les informations suivantes.
  • Etat du compte actuel
  • 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 via des liens de base de données
Ces informations permettent d'interroger les métadonnées de niveau compte (organisation, utilisateur, jeton, décimales) dans une vue unique.
Sources de données:
  • <obpInstanceName>_<channelName>_hist : données de code chaîne historiques, utilisées pour extraire l'entrée de collecte de données privée de compte la plus récente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : données d'état en cours 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 la 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'état.
  • token_details CTE : extrait les détails de jeton (otoken) avec une précision décimale (0 par défaut s'il est manquant).
  • Jointures de sélection finale : état du compte (state_filtered) avec les derniers détails de collecte de données privées (hist_ranked) et métadonnées de jeton (token_details).
  • Garantit uniquement les comptes associés à une collecte de données privée (WHERE h.valuejson IS NOT NULL).
  • Etend les données de compte avec les syndicats de liens de base de données d'autres organisations.
Colonnes de sortie:
  • ACCOUNT_ID : identificateur unique du compte.
  • ORG_ID : ID d'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 (valeur par défaut : 0 s'il est manquant).
Requête SQL confidentielle, Banque des participants :
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
Objectif : Cette vue fournit une vue consolidée des comptes de toutes les organisations, en combinant les informations suivantes.
  • Etat du compte actuel
  • 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 de niveau compte (organisation, utilisateur, jeton, décimales) dans une vue unique.
Sources de données:
  • <obpInstanceName>_<channelName>_hist : données de code chaîne historiques, utilisées pour extraire l'entrée de collecte de données privée de compte la plus récente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : données d'état en cours pour les comptes (oaccount) et les jetons (otoken).
Logique de la 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'état.
  • token_details CTE : extrait les détails de jeton (otoken) avec une précision décimale (0 par défaut s'il est manquant).
  • Jointures de sélection finale : état du compte (state_filtered) avec les derniers détails de collecte de données privées (hist_ranked) et métadonnées de jeton (token_details).
  • Garantit uniquement les comptes associés à une collecte de données privée (WHERE h.valuejson IS NOT NULL).
Colonnes de sortie:
  • ACCOUNT_ID : identificateur unique du compte.
  • ORG_ID : ID d'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 (valeur par défaut : 0 s'il est manquant).
ACCOUNTS_MOD
Cette vue fournit une représentation structurée des données de registre de jetons fongibles, mettant en correspondance les organisations et les utilisateurs avec leurs comptes et jetons de jetons fongibles associés. Elle simplifie l'accès aux relations compte-jeton stockées à l'état de code chaîne en mettant à plat les tableaux JSON imbriqués, ce qui facilite l'utilisation des applications et des requêtes d'analyse.
Requête 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'état principale contenant les données de code chaîne au format JSON.
Logique de la clé :
  • Filtrer par clé de registre : inclut uniquement les enregistrements où la clé contient oftregistry.
  • Filtrer par code chaîne : limite les résultats au code chaîne indiqué (<chaincodeName>).
  • Aplatir le fichier JSON imbriqué : utilise JSON_TABLE pour développer le tableau associated_ft_accounts en lignes 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 tableaux).
  • 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 dans lequel 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 jetons fongibles.
  • ASSETTYPE : type de ressource (attendu : oftregistry).
  • ORG_ID : identificateur d'organisation à partir du fichier JSON.
  • USER_ID : identificateur utilisateur associé à l'enregistrement de registre.
  • ACCOUNT_ID : ID de compte de jeton fongible extrait du tableau imbriqué.
  • TOKEN_ID : ID de jeton extrait lié au compte de jeton fongible.
Requête 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 identique à la vue TypeScript de la requête SQL générique. La seule différence réside dans la convention de dénomination des champs JSON, qui utilise la casse Pascal au lieu de la minuscule.
  • AssetType : précédemment assetType
  • OrgId : précédemment org_id
  • UserId : précédemment user_id
  • AssociatedFtAccounts : précédemment associated_ft_accounts
  • AccountId : précédemment account_id
  • TokenId : précédemment token_id
L'alias est appliqué (par exemple, OrgId AS org_id) pour maintenir la cohérence des noms de colonne de sortie entre les vues.
Requête SQL confidentielle, propriétaire 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 de compte (oaccountpdc).
  • <obpInstanceName>_<channelName>_state : table d'état contenant l'état de code chaîne en cours au format JSON, utilisée pour les détails oaccount et otoken.
  • Vues d'organisation distantes : des données supplémentaires provenant des vues ACCOUNTS_MOD d'autres organisations sont incluses à l'aide de liens de base de données :
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Logique de la clé :
  • Classer les enregistrements historiques : utilise ROW_NUMBER() pour sélectionner le dernier enregistrement oaccountpdc pour chaque ID de compte dans la table d'historique.
  • Filtrer les comptes en cours : extrait uniquement les enregistrements avec assetType = 'oaccount' de la table des états.
  • Rejoindre les métadonnées de jeton : ajoute la précision de jeton (decimal_value) en effectuant une jointure par rapport aux entrées otoken de la table d'état.
  • Combiner les détails de compte : joint les enregistrements de compte filtrés à l'entrée d'historique et aux détails de jeton les plus récents. Garantit que seuls les comptes avec des données historiques valides (h.valuejson IS NOT NULL) sont inclus.
  • Union multiorganisation : utilise UNION ALL pour fusionner les données de compte de l'organisation locale avec plusieurs organisations distantes via des liens de base de données. Cela permet à une seule requête unifiée d'extraire tous les comptes sur le réseau.
Colonnes de sortie:
  • ACCOUNT_ID : identificateur unique du compte.
  • ORG_ID : ID organisation propriétaire 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 (valeur 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 de requête montre trois organisations pour plus de clarté, mais dans la pratique, le nombre d'organisations dépend de la taille de orgsList. Pour plus d'informations, reportez-vous aux informations précédentes sur le fichier Participant_orgs_list.yml dans cette rubrique.

Requête SQL confidentielle, Banque des participants :
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 à la requête SQL confidentielle, propriétaire système, mais elle extrait uniquement les données de l'organisation locale. Les principales différences sont les suivantes :
  • Aucune valeur UNION ALL avec des liens de base de données n'est utilisée.
  • La sortie inclut uniquement les comptes des tables d'état et d'historique de l'organisation actuelle.
  • La vue fournit un registre de comptes à organisation unique, contrairement à la variante multiorganisation qui consolide les comptes dans plusieurs organisations.
TRANSACTION_MOD
Cette vue fournit un enregistrement détaillé de toutes les transactions de chaîne de blocs, capturant les métadonnées, les participants, les montants et les soldes résultants. Elle simplifie l'accès à l'historique des transactions en extrayant les champs structurés directement de la table d'historique, ce qui évite d'avoir à analyser manuellement le JSON brut.
Requête 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, table d'historique contenant tous les événements de transaction au format JSON. Inclut les détails de la transaction et les métadonnées associées (bloc, numéro de transaction, horodatage).

Logique de la 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 résultats des prescriptions sont les suivants.
    • blockno DESC (dernier bloc en premier)
    • txnno DESC (dernière transaction du 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 : identifiant unique d'une 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 du mouvement.
  • FROM_ACCOUNT_ID : ID de compte d'où provient la ressource/valeur.
  • TO_ACCOUNT_ID : ID de compte vers lequel la ressource/valeur a été transférée.
  • TRANSACTION_TYPE : type de la transaction (par exemple, transfert, débit, crédit).
  • AMOUNT : montant impliqué dans la transaction.
  • TRANSACTION_EARMARK : catégorie ou affectation de 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.
Requête 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 identique à la vue TypeScript de la requête SQL générique. La seule différence réside dans la convention de dénomination des champs JSON, qui utilise la casse Pascal au lieu de la minuscule.
  • AssetType : précédemment assetType
  • TransactionId : précédemment transaction_id
  • FromAccountId : précédemment from_account_id
  • ToAccountId : précédemment to_account_id
  • TransactionType : précédemment transaction_type
  • Amount : précédemment amount
  • Category : précédemment category
  • FromAccountBalance : précédemment from_account_balance
  • ToAccountBalance : précédemment to_account_balance
L'alias est appliqué (par exemple, TransactionId AS transaction_id) pour maintenir la cohérence des noms de colonne de sortie entre les vues, quelle que soit la convention de dénomination des champs JSON.
Requête SQL confidentielle, propriétaire 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 : table historique de codes chaîne 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 le fichier decimal_value correct pour les soldes de compte et les montants de transaction.
Logique de la clé :
  • Filtre uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
    • 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 une valeur 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 s'assurer 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 le tri (à partir de JSON si disponible, sinon à partir des métadonnées).
  • TXNNO : numéro de transaction dans le bloc (à partir du format 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 du mouvement.
  • FROM_ACCOUNT_ID : ID de compte à partir duquel les jetons ont été envoyés.
  • TO_ACCOUNT_ID : ID de compte auquel les jetons ont été envoyés.
  • TRANSACTION_TYPE : type de la transaction (par exemple, transfert, blocage, déblocage).
  • AMOUNT : montant de transaction, mis à l'échelle par précision décimale de jeton.
  • TRANSACTION_EARMARK : catégorie ou affectation de la transaction.
  • FROM_ACCOUNT_BALANCE : solde du compte de l'expéditeur après la transaction, mis à l'échelle par précision.
  • TO_ACCOUNT_BALANCE : solde du compte du destinataire après la transaction, mis à l'échelle par précision.
Requête SQL confidentielle, Banque des participants :
`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 : table de codes 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 de niveau transaction. Il est joint à l'historique pour enrichir l'enregistrement de transaction.
  • ACCOUNTS_MOD : vue utilisée pour extraire la précision décimale de jeton correcte (decimal_value) pour les comptes impliqués dans des transactions.
Logique de la clé :
  • Filtre uniquement les lignes pour lesquelles les instructions suivantes sont vraies.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Exclut les transactions intermédiaires (KEY NOT LIKE '_obp2pc_staged_%')
  • Redimensionnement décimal : extrait decimal_value de façon dynamique à partir de ACCOUNTS_MOD, en fonction de from_account_id ou to_account_id. Applique le redimensionnement à 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 (dernière version par TXNTIMESTAMP) pour garantir que seule la dernière version de chaque transaction est renvoyé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 la charge utile JSON.
Colonnes de sortie:
  • BLOCKNO : numéro de bloc utilisé pour le tri (à partir de JSON si disponible, sinon à partir des métadonnées).
  • TXNNO : numéro de transaction dans le bloc (à partir du format 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 du mouvement.
  • FROM_ACCOUNT_ID : ID de compte envoyant des jetons.
  • TO_ACCOUNT_ID : ID de compte recevant des jetons.
  • TRANSACTION_TYPE : type de la transaction (par exemple, transfert, blocage, déblocage).
  • AMOUNT : montant de transaction normalisé à l'aide de la précision décimale du jeton.
  • TRANSACTION_EARMARK : catégorie ou affectation de la transaction.
  • FROM_ACCOUNT_BALANCE : solde du compte expéditeur après la transaction (ajusté à la précision).
  • TO_ACCOUNT_BALANCE : solde du compte bénéficiaire après la transaction (ajusté à la précision).
ACCOUNTS_TRANSACTION_MOD
Cette vue étend l'historique des transactions en associant chaque transaction aux ID organisation des comptes participants. Il prend en charge les approbations d'utilisation, les approbations d'utilisation et les transferts réguliers, ce qui garantit que les transactions incluent à la fois le contexte au niveau du compte et au niveau de l'organisation.
Requête 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) avec les organisations (ORG_ID) pour l'expéditeur et le destinataire.
Logique de la clé : la vue est créée à l'aide d'un UNION de trois cas :
  1. APPROVE_BURN
    • Rejoignez FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Affectez B.ORG_ID à la fois à FROM_ORG_ID et à TO_ORG_ID.
  2. APPROVE_MINT
    • Rejoignez TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Affectez C.ORG_ID à la fois à FROM_ORG_ID et à TO_ORG_ID.
  3. Transferts réguliers
    • Rejoignez 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 hiérarchiser les dernières transactions.
Colonnes de sortie:
  • TRANSACTION_ID : identificateur unique du mouvement.
  • BLOCKNO : numéro de bloc dans lequel la transaction a été enregistrée.
  • FROM_ACCOUNT_ID : ID de compte de l'expéditeur.
  • TO_ACCOUNT_ID : ID de compte du destinataire.
  • EARMARK : catégorie d'espace réservé aux transactions (alias de TRANSACTION_EARMARK).
  • FROM_ORG_ID : ID d'organisation du compte de l'expéditeur (ou identique à TO pour Burn).
  • TO_ORG_ID : ID d'organisation du compte du destinataire (ou identique à FROM pour mint).
  • TRANSACTION_TYPE : type de la transaction (APPROVE_BURN, APPROVE_MINT ou transfert).
  • AMOUNT : montant des transactions.
  • CRDATE : date de création de la transaction (à partir de TXNTIMESTAMP).
Requête SQL confidentielle, propriétaire 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 de niveau transaction (ID, numéros de bloc, références de compte, montants, horodatages).
  • <accountsViewName> (B, C) : fournit un mapping 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 de l'expéditeur uniquement (par exemple, caisses sortantes ou de type brûlure)
    • 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 dérivés de l'organisation de l'expéditeur (B.ORG_ID).
  2. Transactions destinées au destinataire uniquement (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 expéditeur et 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 hiérarchiser les dernières transactions.
Colonnes de sortie:
  • TRANSACTION_ID : identificateur unique du mouvement.
  • BLOCKNO : numéro de bloc dans lequel la transaction est enregistrée.
  • FROM_ACCOUNT_ID : ID de compte de l'expéditeur (peut être NULL pour mint).
  • TO_ACCOUNT_ID : ID de compte du destinataire (peut être NULL pour burn).
  • 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 d'organisation du destinataire (ou identique à l'expéditeur si le destinataire est NULL).
  • TRANSACTION_TYPE : type de la transaction (par exemple, transfert, menthe, gravure, etc.).
  • AMOUNT : montant des transactions.
  • CRDATE : horodatage de création de transaction (TXNTIMESTAMP).