Vordefinierte Ansichten

Die Oracle Blockchain Platform Digital Assets Edition bietet die folgenden vordefinierten Datenbankansichten.

ACCOUNT_TRANSACTION_VIEW
Diese Ansicht bietet eine einheitliche Transaktionshistorie pro Konto und erfasst sowohl Soll- (from_account_id) als auch Haben- (to_account_id) Seiten einer Transaktion. Mit dieser Ansicht können Sie alle Transaktionen abfragen, die mit einem Konto verknüpft sind, ohne Raw Chaincode-Statusdaten zu scannen.
Vertrauliche SQL-Abfrage, Systemeigentümer:
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

Datenquellen: <obpInstanceName>_<channelName>_state, die primäre Statustabelle mit Chaincode-Daten im JSON-Format

Schlüssellogik:
  • Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY beginnt nicht mit _obp2pc_
    • transaction_type ist nicht EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER oder CREATE_ACCOUNT
  • Extrahiert die Kontobeteiligung aus ausgehenden Transaktionen (from_account_id) und eingehenden Transaktionen (to_account_id).
  • Verwendet COALESCE, um eine konsistente Sortierung von Spalten (ORDER_BLOCKNO, ORDER_TXNNO) sicherzustellen, auch wenn JSON-Werte fehlen.
  • Kombiniert ausgehende und eingehende Transaktionen mit einer UNION ALL.
Ausgabespalten:
  • KEY: Konto-ID, die der Transaktion zugeordnet ist (Absender oder Empfänger).
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • TRANSACTION_DETAILS: Vollständiges JSON-Objekt der Transaktion.
  • ORDER_BLOCKNO: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst Blockmetadaten).
  • ORDER_TXNNO: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst Blockmetadaten).
Daten SourcesConfidential SQL-Abfrage, Teilnehmerbank:
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

Datenquellen: <obpInstanceName>_<channelName>_state, die primäre Statustabelle mit Chaincode-Daten im JSON-Format

Schlüssellogik:
  • Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY beginnt nicht mit _obp2pc_
    • transaction_type ist nicht EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER oder CREATE_ACCOUNT
  • Extrahiert die Kontobeteiligung aus ausgehenden Transaktionen (from_account_id) und eingehenden Transaktionen (to_account_id).
  • Verwendet COALESCE, um eine konsistente Sortierung von Spalten (ORDER_BLOCKNO, ORDER_TXNNO) sicherzustellen, auch wenn JSON-Werte fehlen.
  • Kombiniert ausgehende und eingehende Transaktionen mit einer UNION ALL.
Ausgabespalten:
  • KEY: Konto-ID, die der Transaktion zugeordnet ist (Absender oder Empfänger).
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • TRANSACTION_DETAILS: Vollständiges JSON-Objekt der Transaktion.
  • ORDER_BLOCKNO: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst Blockmetadaten).
  • ORDER_TXNNO: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst Blockmetadaten).
TRANSACTION_PDC_VIEW
Diese Ansicht bietet Salden- und Betragsdetails auf Transaktionsebene aus der privaten Datenerfassung. Dadurch wird sichergestellt, dass nur der letzte Datensatz pro Transaktion abgerufen wird.
Vertrauliche SQL-Abfrage, Systemeigentümer:
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

Zweck: Aggregiert Daten im gesamten Unternehmen über Datenbanklinks.

Datenquellen:
  • <obpInstanceName>_<channelName>_hist: die historische Chaincode-Datentabelle mit privaten Datenerfassungsdatensätzen
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK: Remoteansicht von Organisation 1, auf die über Datenbanklink zugegriffen wird.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK: Remoteansicht von Organisation 2, auf die über Datenbanklink zugegriffen wird.
Schlüssellogik:
  • Filtert nur Datensätze, bei denen die folgenden Aussagen wahr sind.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY beginnt nicht mit _obp2pc_staged_.
  • Verwendet die Fensterfunktion ROW_NUMBER().
    • Partitionen nach transaction_id.
    • Bestellungen über TXNTIMESTAMP DESC.
    • Behält nur den letzten Datensatz (rn = 1) bei.
  • Kombiniert Daten aus der Historientabelle der lokalen privaten Datenerfassung, der privaten Datenerfassungsansicht der Organisation 1 (über Datenbanklink) und der privaten Datenerfassungsansicht der Organisation 2 (über Datenbanklink).
Ausgabespalten:
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • CHAINCODEID: ID des Chaincodes, der dem PDC-Datensatz zugeordnet ist.
  • QUANTITY: Transaktionsbetrag oder übertragene Menge.
  • FROM_ACCOUNT_BALANCE: Saldo des Absenderkontos nach der Transaktion.
  • FROM_ACCOUNT_ONHOLD_BALANCE: Saldo des Absenderkontos nach der Transaktion gesperrt.
  • TO_ACCOUNT_BALANCE: Saldo des Empfängerkontos nach der Transaktion.
  • TO_ACCOUNT_ONHOLD_BALANCE: Der Saldo des Empfängerkontos nach der Transaktion.
Vertrauliche SQL-Abfrage, Teilnehmerbank:
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
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: die historische Chaincode-Datentabelle mit privaten Datenerfassungsdatensätzen
Schlüssellogik:
  • Filtert nur Datensätze, bei denen die folgenden Aussagen wahr sind.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY beginnt nicht mit _obp2pc_staged_.
  • Verwendet die Fensterfunktion ROW_NUMBER().
    • Partitionen nach transaction_id.
    • Bestellungen über TXNTIMESTAMP DESC.
    • Behält nur den letzten Datensatz (rn = 1) bei.
Ausgabespalten:
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • CHAINCODEID: ID des Chaincodes, der dem PDC-Datensatz zugeordnet ist.
  • QUANTITY: Transaktionsbetrag oder übertragene Menge.
  • FROM_ACCOUNT_BALANCE: Saldo des Absenderkontos nach der Transaktion.
  • FROM_ACCOUNT_ONHOLD_BALANCE: Saldo des Absenderkontos nach der Transaktion gesperrt.
  • TO_ACCOUNT_BALANCE: Saldo des Empfängerkontos nach der Transaktion.
  • TO_ACCOUNT_ONHOLD_BALANCE: Der Saldo des Empfängerkontos nach der Transaktion.
ACCOUNTS_VIEW
Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg.
Vertrauliche SQL-Abfrage, Systemeigentümer:
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
Zweck: Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg und kombiniert die folgenden Informationen.
  • Aktueller Kontostand
  • Letzte kontoverwandte private Daten (private Datenerfassung)
  • Tokenmetadaten wie Dezimalstellen
  • Unternehmensübergreifende Kontodetails über Datenbanklinks
Diese Informationen ermöglichen die Abfrage von Metadaten auf Kontoebene (Organisation, Benutzer, Token, Dezimalstellen) in einer einzigen Ansicht.
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: historische Chaincode-Daten, die zum Abrufen des letzten privaten Datenerfassungseintrags des Accounts verwendet werden (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Aktuelle Statusdaten für Accounts (oaccount) und Token (otoken).
  • ACCOUNTS_VIEW@<org1Name>_LINK: Remoteansicht aus Organisation 1.
  • ACCOUNTS_VIEW@<org2Name>_LINK: Remoteansicht aus Organisation 2.
Schlüssellogik:
  • hist_ranked CTE: Ruft den neuesten privaten Datenerfassungsdatensatz pro account_id mit ROW_NUMBER() und ORDER BY TXNTIMESTAMP DESC ab.
  • state_filtered CTE: Wählt Accounts (oaccount) aus der Statustabelle aus.
  • token_details CTE: Ruft Tokendetails (otoken) mit Dezimalstellen ab (Standardwert 0, falls fehlt).
  • Endgültige Auswahl verknüpft: Accountstatus (state_filtered) mit den neuesten Details zur privaten Datenerfassung (hist_ranked) und Tokenmetadaten (token_details).
  • Stellt nur Accounts mit zugehöriger privater Datenerfassung sicher (WHERE h.valuejson IS NOT NULL).
  • Erweitert Account-Daten um Datenbank-Link-Gewerkschaften anderer Organisationen.
Ausgabespalten:
  • ACCOUNT_ID: Eindeutige ID des Accounts.
  • ORG_ID: Organisations-ID, die dem Account zugeordnet ist.
  • USER_ID: Mit dem Konto verknüpfte Benutzer-ID (aus privater Datenerfassung).
  • CUSTOM_ACCOUNT_ID: Benutzerdefinierte Account-ID.
  • TOKEN_ID: Token-ID, die mit dem Account verknüpft ist.
  • DECIMAL_VALUE: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).
Vertrauliche SQL-Abfrage, Teilnehmerbank:
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
Zweck: Diese Ansicht bietet eine konsolidierte Ansicht der Konten über Organisationen hinweg und kombiniert die folgenden Informationen.
  • Aktueller Kontostand
  • Letzte kontoverwandte private Daten (private Datenerfassung)
  • Tokenmetadaten wie Dezimalstellen
Diese Informationen ermöglichen die Abfrage von Metadaten auf Kontoebene (Organisation, Benutzer, Token, Dezimalstellen) in einer einzigen Ansicht.
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: historische Chaincode-Daten, die zum Abrufen des letzten privaten Datenerfassungseintrags des Accounts verwendet werden (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Aktuelle Statusdaten für Accounts (oaccount) und Token (otoken).
Schlüssellogik:
  • hist_ranked CTE: Ruft den neuesten privaten Datenerfassungsdatensatz pro account_id mit ROW_NUMBER() und ORDER BY TXNTIMESTAMP DESC ab.
  • state_filtered CTE: Wählt Accounts (oaccount) aus der Statustabelle aus.
  • token_details CTE: Ruft Tokendetails (otoken) mit Dezimalstellen ab (Standardwert 0, falls fehlt).
  • Endgültige Auswahl verknüpft: Accountstatus (state_filtered) mit den neuesten Details zur privaten Datenerfassung (hist_ranked) und Tokenmetadaten (token_details).
  • Stellt nur Accounts mit zugehöriger privater Datenerfassung sicher (WHERE h.valuejson IS NOT NULL).
Ausgabespalten:
  • ACCOUNT_ID: Eindeutige ID des Kontos.
  • ORG_ID: Organisations-ID, die dem Account zugeordnet ist.
  • USER_ID: Mit dem Konto verknüpfte Benutzer-ID (aus privater Datenerfassung).
  • CUSTOM_ACCOUNT_ID: Benutzerdefinierte Account-ID.
  • TOKEN_ID: Token-ID, die mit dem Account verknüpft ist.
  • DECIMAL_VALUE: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).
ACCOUNTS_MOD
Diese Ansicht bietet eine strukturierte Darstellung von fungiblen Token-Registry-Daten, die Organisationen und Benutzer den zugehörigen fungiblen Tokenaccounts und Token zuordnen. Es vereinfacht den Zugriff auf Account-Token-Beziehungen, die im Chaincode-Status gespeichert sind, indem verschachtelte JSON-Arrays vereinfacht werden, sodass Anwendungen und Analyseabfragen einfacher konsumiert werden können.
Allgemeine SQL-Abfrage, 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`
Datenquellen:
  • <obpInstanceName>_<channelName>_state: Die primäre Statustabelle mit Chaincode-Daten im JSON-Format.
Schlüssellogik:
  • Nach Registry-Schlüssel filtern: Enthält nur Datensätze, in denen der Schlüssel oftregistry enthält.
  • Filtern nach Chaincode: Schränkt die Ergebnisse auf den angegebenen Chaincode ein (<chaincodeName>).
  • Verschachteltes JSON vereinfachen: Verwendet JSON_TABLE, um das Array associated_ft_accounts in separate Zeilen für jedes Account-Tokenpaar einzublenden.
    • account_id: Fungible Token-Account-ID.
    • token_id: Mit dem Account verknüpftes Token.
    • lng_number: Ordinalität (wird intern zum Verfolgen der Arrayreihenfolge verwendet).
  • Reihenfolge: Die Ergebnisse werden nach Blocknummer (blockno) und Transaktionsnummer (txnno) in absteigender Reihenfolge sortiert, um sicherzustellen, dass die neuesten Zuordnungen zuerst angezeigt werden.
Ausgabespalten:
  • BLOCKNO: Blocknummer, in der die Registry-Aktualisierung aufgezeichnet wurde.
  • TXNNO: Transaktionsnummer im Block.
  • KEY: Statusschlüssel, der den Eintrag der fungiblen Token-Registry darstellt.
  • ASSETTYPE: Typ des Assets (erwartet: oftregistry).
  • ORG_ID: Organisations-ID aus der JSON.
  • USER_ID: Mit dem Registrierungsdatensatz verknüpfte Benutzer-ID.
  • ACCOUNT_ID: Fungible Token-Account-ID aus dem verschachtelten Array extrahiert.
  • TOKEN_ID: Extrahierte Token-ID, die mit dem fungiblen Tokenaccount verknüpft ist.
Allgemeine SQL-Abfrage, Los:
`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`
Diese View entspricht der allgemeinen SQL-Abfrage TypeScript-View. Der einzige Unterschied besteht in der JSON-Feldbenennungskonvention, die Pascal-Kleinschreibung anstelle von Kleinbuchstaben verwendet.
  • AssetType: vorher assetType
  • OrgId: vorher org_id
  • UserId: vorher user_id
  • AssociatedFtAccounts: vorher associated_ft_accounts
  • AccountId: vorher account_id
  • TokenId: vorher token_id
Aliasing wird angewendet (z.B. OrgId AS org_id), um die Konsistenz der Ausgabespaltennamen über Ansichten hinweg zu gewährleisten.
Vertrauliche SQL-Abfrage, Systemeigentümer:
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;
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: Historientabelle, in der die chronologischen Änderungen der privaten Accountdaten gespeichert werden (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Statustabelle mit dem aktuellen Chaincode-Status im JSON-Format, die für oaccount- und otoken-Details verwendet wird.
  • Remote-Organisationsansichten: Zusätzliche Daten aus ACCOUNTS_MOD-Ansichten in anderen Organisationen werden über Datenbanklinks eingeschlossen:
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Schlüssellogik:
  • Historische Datensätze einstufen: Verwendet ROW_NUMBER(), um den letzten oaccountpdc-Datensatz für jede Konto-ID aus der Historientabelle auszuwählen.
  • Aktuelle Konten filtern: Ruft nur Datensätze mit assetType = 'oaccount' aus der Statustabelle ab.
  • Join-Tokenmetadaten: Fügt die Tokengenauigkeit (decimal_value) hinzu, indem sie mit otoken-Einträgen in der Statustabelle verknüpft wird.
  • Kontodetails kombinieren: Verknüpft gefilterte Kontodatensätze mit dem letzten Historieneintrag und den Tokendetails. Stellt sicher, dass nur Konten mit gültigen historischen Daten (h.valuejson IS NOT NULL) eingeschlossen werden.
  • MultiOrg-Gewerkschaft: Verwendet UNION ALL, um Kontodaten aus der lokalen Organisation mit mehreren Remote-Organisationen über Datenbanklinks zusammenzuführen. Dadurch kann eine einzige einheitliche Abfrage alle Konten im gesamten Netzwerk abrufen.
Ausgabespalten:
  • ACCOUNT_ID: Eindeutige ID des Kontos.
  • ORG_ID: Organisations-ID, die Eigentümer des Accounts ist.
  • USER_ID: Mit dem Konto verknüpfte Benutzer-ID (aus dem letzten historischen Datensatz).
  • CUSTOM_ACCOUNT_ID: Optionale benutzerdefinierte Account-ID.
  • TOKEN_ID: Token-ID, die mit dem Account verknüpft ist.
  • DECIMAL_VALUE: Dezimalstellen für Token (standardmäßig 0, wenn fehlt).

Dynamische Generierung: Das Multiorganisationsteil ist nicht fest codiert. Im Skript werden die zusätzlichen Gewerkschaften basierend auf der Datei Participant_orgs_list.yml dynamisch generiert. Dadurch wird sichergestellt, dass sich die Ansicht automatisch anpasst, je nachdem, wie viele Organisationen im Netzwerk konfiguriert sind. Die Beispielabfrage zeigt aus Gründen der Übersichtlichkeit drei Organisationen, in der Praxis hängt die Anzahl der Gewerkschaften jedoch von der Größe von orgsList ab. Weitere Details finden Sie in den vorherigen Informationen zur Datei Participant_orgs_list.yml in diesem Thema.

Vertrauliche SQL-Abfrage, Teilnehmerbank:
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;
Diese View entspricht der vertraulichen SQL-Abfrage und dem Systemeigentümer, ruft jedoch nur Daten für die lokale Organisation ab. Die Hauptunterschiede sind:
  • Es wird kein UNION ALL mit Datenbanklinks verwendet.
  • Die Ausgabe enthält nur Konten aus den Status- und Historientabellen der aktuellen Organisation.
  • Die Ansicht bietet eine Kontenregistrierung mit einer Organisation, im Gegensatz zu der Variante mit mehreren Organisationen, bei der Konten über mehrere Organisationen hinweg konsolidiert werden.
TRANSACTION_MOD
Diese Ansicht enthält einen detaillierten Datensatz aller Blockchain-Transaktionen, in dem Metadaten, Teilnehmer, Beträge und daraus resultierende Salden erfasst werden. Es vereinfacht den Zugriff auf die Transaktionshistorie, indem strukturierte Felder direkt aus der Historientabelle extrahiert werden, sodass Raw-JSON nicht mehr manuell geparst werden muss.
Allgemeine SQL-Abfrage, 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`

Datenquellen: <obpInstanceName>_<channelName>_hist, die Historientabelle mit allen Transaktionsereignissen im JSON-Format. Umfasst sowohl die Transaktionsdetails als auch die zugehörigen Metadaten (Block, Transaktionsnummer, Zeitstempel).

Schlüssellogik:
  • Enthält nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
    • CHAINCODEID = <chaincodeName>
    • KEY enthält otransaction (Filter für transaktionsbezogene Datensätze)
  • Anforderungen führen zu folgenden Ergebnissen:
    • blockno DESC (letzter Block zuerst)
    • txnno DESC (letzte Transaktion innerhalb des Blocks zuerst)
Ausgabespalten:
  • BLOCKNO: Blocknummer, in der die Transaktion aufgezeichnet wurde.
  • TXNNO: Transaktionsnummer im Block.
  • KEY: Eindeutige Kennung der Transaktionseingabe.
  • TXNTIMESTAMP: Zeitstempel, als die Transaktion abgeschlossen wurde.
  • ASSETTYPE: Typ des Vermögensgegenstands für die Transaktion (Beispiel: otransaction).
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • FROM_ACCOUNT_ID: Konto-ID, von der der Vermögensgegenstand/Wert stammt.
  • TO_ACCOUNT_ID: Konto-ID, auf die der Vermögensgegenstand/Wert transferiert wurde.
  • TRANSACTION_TYPE: Typ der Transaktion (z.B. Überweisung, Lastschrift, Gutschrift).
  • AMOUNT: Der an der Transaktion beteiligte Betrag.
  • TRANSACTION_EARMARK: Kategorie oder Zweckmarke für die Transaktion.
  • FROM_ACCOUNT_BALANCE: Saldo des Quellkontos nach der Transaktion.
  • TO_ACCOUNT_BALANCE: Saldo des Zielkontos nach der Transaktion.
Allgemeine SQL-Abfrage, Los:
`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`
Diese View entspricht der allgemeinen SQL-Abfrage TypeScript-View. Der einzige Unterschied besteht in der JSON-Feldbenennungskonvention, die Pascal-Kleinschreibung anstelle von Kleinbuchstaben verwendet.
  • AssetType: vorher assetType
  • TransactionId: vorher transaction_id
  • FromAccountId: vorher from_account_id
  • ToAccountId: vorher to_account_id
  • TransactionType: vorher transaction_type
  • Amount: vorher amount
  • Category: vorher category
  • FromAccountBalance: vorher from_account_balance
  • ToAccountBalance: vorher to_account_balance
Die Aliaserstellung wird angewendet (z.B. TransactionId AS transaction_id), um Ausgabenspaltennamen unabhängig von der Benennungskonvention für das JSON-Feld in allen Ansichten konsistent zu halten.
Vertrauliche SQL-Abfrage, Systemeigentümer:
`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`
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: Historische Chaincode-Tabelle, in der alle Transaktionsversionen gespeichert sind.
  • <transactionPDCViewName>: Ansicht mit Transaktionsdetails für die private Datenerfassung, die zur Anreicherung von Transaktionsdatensätzen verknüpft sind.
  • ACCOUNTS_MOD: Referenzansicht zum Abrufen der korrekten decimal_value für Kontensalden und Transaktionsbeträge.
Schlüssellogik:
  • Filtert nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY beginnt nicht mit _obp2pc_staged_
  • Verwendet ROW_NUMBER(), partitioniert durch transaction_id (angeordnet durch txntimestamp DESC), um sicherzustellen, dass nur der letzte Datensatz pro Transaktion enthalten ist.
  • Ruft decimal_value dynamisch aus ACCOUNTS_MOD ab, je nachdem, ob die Transaktion eine from_account_id oder to_account_id umfasst.
  • Beträge und Salden (amount, from_account_balance, to_account_balance) werden mit folgenden Dezimalstellen skaliert: value / POWER(10, decimal_value)
  • Verwendet COALESCE auf blockNo und txnNo, um sicherzustellen, dass Sortierspalten immer vorhanden sind, auch wenn sie in JSON fehlen.
Ausgabespalten:
  • BLOCKNO: Blocknummer für die Bestellung (falls verfügbar aus JSON, sonst aus Metadaten).
  • TXNNO: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst aus Metadaten).
  • KEY: Transaktionsschlüssel-ID.
  • TXNTIMESTAMP: Zeitstempel der Transaktion.
  • ASSETTYPE: Assettyp (otransaction).
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • FROM_ACCOUNT_ID: Konto-ID, von der Token gesendet wurden.
  • TO_ACCOUNT_ID: Account-ID, an die Token gesendet wurden.
  • TRANSACTION_TYPE: Typ der Transaktion (z.B. Transfer, Sperre, Freigabe).
  • AMOUNT: Transaktionsbetrag, skaliert nach Dezimalstellen für Token.
  • TRANSACTION_EARMARK: Kategorie oder Zweck der Transaktion.
  • FROM_ACCOUNT_BALANCE: Saldo des Absenderkontos nach Transaktion, skaliert nach Nachkommastellen.
  • TO_ACCOUNT_BALANCE: Saldo des Kontos des Empfängers nach Transaktion, skaliert nach Nachkommastellen.
Vertrauliche SQL-Abfrage, Teilnehmerbank:
`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`
Datenquellen:
  • <obpInstanceName>_<channelName>_hist: Historische Chaincode-Tabelle mit allen Transaktionsversionen im JSON-Format.
  • <transactionPDCViewName>: Private Datenerfassungsansicht, die private Daten auf Transaktionsebene enthält. Es wird mit der Historie verknüpft, um den Transaktionsdatensatz anzureichern.
  • ACCOUNTS_MOD: Ansicht zum Abrufen der korrekten Dezimalstellen für Token (decimal_value) für Konten, die an Transaktionen beteiligt sind.
Schlüssellogik:
  • Filtert nur Zeilen, bei denen die folgenden Anweisungen wahr sind.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Schließt zwischengespeicherte Transaktionen aus (KEY NOT LIKE '_obp2pc_staged_%')
  • Dezimalskalierung: Ruft decimal_value dynamisch aus ACCOUNTS_MOD ab, basierend auf from_account_id oder to_account_id. Wendet die Skalierung mit value / POWER(10, decimal_value) auf amount, from_account_balance und to_account_balance an
  • Datensatzauswahl: Verwendet ROW_NUMBER(), partitioniert durch transaction_id (letzte durch TXNTIMESTAMP), um sicherzustellen, dass nur die neueste Version jeder Transaktion zurückgegeben wird.
  • Datennormalisierung: COALESCE wird auf blockNo und txnNo angewendet, um Konsistenz sicherzustellen, auch wenn die Werte in der JSON-Payload fehlen.
Ausgabespalten:
  • BLOCKNO: Für die Bestellung verwendete Blocknummer (falls verfügbar aus JSON, sonst aus Metadaten).
  • TXNNO: Transaktionsnummer im Block (falls verfügbar aus JSON, sonst aus Metadaten).
  • KEY: Transaktionsschlüssel-ID.
  • TXNTIMESTAMP: Zeitstempel der Transaktion.
  • ASSETTYPE: Assettyp (otransaction).
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • FROM_ACCOUNT_ID: Account-ID, die Token sendet.
  • TO_ACCOUNT_ID: Konto-ID, die Token empfängt.
  • TRANSACTION_TYPE: Typ der Transaktion (z.B. Transfer, Sperre, Freigabe).
  • AMOUNT: Transaktionsbetrag, normalisiert mit Dezimalstellen für Token.
  • TRANSACTION_EARMARK: Kategorie oder Zweckmarke für die Transaktion.
  • FROM_ACCOUNT_BALANCE: Saldo des Absenderkontos nach der Transaktion (genau angepasst).
  • TO_ACCOUNT_BALANCE: Saldo des Empfängerkontos nach der Transaktion (genau angepasst).
ACCOUNTS_TRANSACTION_MOD
Diese Ansicht erweitert die Transaktionshistorie, indem jede Transaktion mit den Organisationskennungen der teilnehmenden Konten verknüpft wird. Es unterstützt Burn-Genehmigungen, Mint-Genehmigungen und regelmäßige Transfers und stellt sicher, dass Transaktionen sowohl Kontext auf Kontoebene als auch auf Organisationsebene enthalten.
Allgemeine SQL-Abfrage, TypeScript und Los:
`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`
Datenquellen:
  • <transactionViewName> (A): Stellt wichtige Transaktionsdetails wie IDs, Blocknummern, Konten, Beträge und Zeitstempel bereit.
  • <accountsViewName> (B, C): Ordnet Konten (ACCOUNT_ID) Organisationen (ORG_ID) für Absender und Empfänger zu.
Schlüssellogik: Die Ansicht wird mit einer UNION von drei Fällen erstellt:
  1. APPROVE_BURN
    • Join auf FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Weisen Sie B.ORG_ID sowohl FROM_ORG_ID als auch TO_ORG_ID zu.
  2. APPROVE_MINT
    • Join auf TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Weisen Sie C.ORG_ID sowohl FROM_ORG_ID als auch TO_ORG_ID zu.
  3. Reguläre Transfers
    • Join auf FROM_ACCOUNT_ID = B.ACCOUNT_ID und TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Weisen Sie B.ORG_ID als FROM_ORG_ID und C.ORG_ID als TO_ORG_ID zu.
Schließlich werden die Ergebnisse nach BLOCKNO DESC sortiert, um die neuesten Transaktionen zu priorisieren.
Ausgabespalten:
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • BLOCKNO: Blocknummer, in der die Transaktion aufgezeichnet wurde.
  • FROM_ACCOUNT_ID: Konto-ID des Absenders.
  • TO_ACCOUNT_ID: Konto-ID des Empfängers.
  • EARMARK: Kategorie des Transaktionsziels (Alias TRANSACTION_EARMARK).
  • FROM_ORG_ID: Organisations-ID des Absenderkontos (oder gleich TO für Burn).
  • TO_ORG_ID: Organisations-ID des Kontos des Empfängers (oder identisch mit FROM für Mint).
  • TRANSACTION_TYPE: Typ der Transaktion (APPROVE_BURN, APPROVE_MINT oder Übertragung).
  • AMOUNT: Transaktionsbetrag.
  • CRDATE: Erstellungsdatum der Transaktion (ab TXNTIMESTAMP).
Vertrauliche SQL-Abfrage, Systemeigentümer und Teilnehmerbank:
`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
Datenquellen:
  • <transactionViewName> (A): Stellt Daten auf Transaktionsebene bereit (IDs, Blocknummern, Kontoreferenzen, Beträge, Zeitstempel).
  • <accountsViewName> (B, C): Stellt die Zuordnung zwischen ACCOUNT_ID und ORG_ID bereit.
Schlüssellogik: Die Ansicht verwendet UNION, um Ergebnisse aus drei Transaktionsmustern zusammenzuführen:
  1. Nur-Absender-Transaktionen (z. B. ausgehende oder brennende Fälle)
    • Bedingung: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID und A.TO_ACCOUNT_ID IS NULL.
    • Schließt den Transaktionstyp CREATE_ACCOUNT aus.
    • Sowohl FROM_ORG_ID als auch TO_ORG_ID werden von der Organisation des Absenders abgeleitet (B.ORG_ID).
  2. Nur-Empfänger-Transaktionen (z.B. eingehende oder mintähnliche Fälle)
    • Bedingung: A.TO_ACCOUNT_ID = C.ACCOUNT_ID und A.FROM_ACCOUNT_ID IS NULL.
    • Sowohl FROM_ORG_ID als auch TO_ORG_ID werden von der Organisation des Empfängers (C.ORG_ID) abgeleitet.
  3. Standardtransfers (Transaktionen mit Absender und Empfänger)
    • Bedingung: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID und A.TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • FROM_ORG_ID stammt aus der Organisation des Absenders (B.ORG_ID), TO_ORG_ID aus der Organisation des Empfängers (C.ORG_ID).
Schließlich werden die Ergebnisse in absteigender Reihenfolge von BLOCKNO sortiert, um die letzten Transaktionen zu priorisieren.
Ausgabespalten:
  • TRANSACTION_ID: Eindeutige Kennung der Transaktion.
  • BLOCKNO: Blocknummer, in der die Transaktion aufgezeichnet wird.
  • FROM_ACCOUNT_ID: Konto-ID des Absenders (kann NULL für mint sein).
  • TO_ACCOUNT_ID: Konto-ID des Empfängers (kann NULL für Burn sein).
  • EARMARK: Transaktionsziel (Alias TRANSACTION_EARMARK).
  • FROM_ORG_ID: Organisations-ID des Absenders (oder identisch mit Empfänger, wenn Absender NULL ist).
  • TO_ORG_ID: Organisations-ID des Empfängers (oder mit Absender identisch, wenn Empfänger NULL ist).
  • TRANSACTION_TYPE: Typ der Transaktion (z.B. Transfer, Mint, Burn usw.).
  • AMOUNT: Transaktionsbetrag.
  • CRDATE: Zeitstempel der Transaktionserstellung (TXNTIMESTAMP).