Vistas predefinidas

Oracle Blockchain Platform Digital Assets Edition proporciona las siguientes vistas de base de datos predefinidas.

ACCOUNT_TRANSACTION_VIEW
Esta vista proporciona un historial de transacciones unificado por cuenta, que captura los lados de débito (from_account_id) y crédito (to_account_id) de una transacción. Puede utilizar esta vista para consultar todas las transacciones vinculadas a una cuenta sin escanear datos de estado de código de cadena sin procesar.
Consulta SQL confidencial, propietario del sistema:
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

Orígenes de datos: <obpInstanceName>_<channelName>_state, la tabla de estado principal que contiene datos de código de cadena en formato JSON

Lógica clave:
  • Incluye solo las filas en las que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY no empieza por _obp2pc_
    • transaction_type no es EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ni CREATE_ACCOUNT
  • Extrae la participación de la cuenta tanto de las transacciones salientes (from_account_id) como de las transacciones entrantes (to_account_id).
  • Utiliza COALESCE para garantizar un orden consistente de las columnas (ORDER_BLOCKNO, ORDER_TXNNO) incluso si faltan valores JSON.
  • Combina tanto las transacciones salientes como las entrantes con UNION ALL.
Columnas de Salida:
  • KEY: ID de cuenta asociado a la transacción (emisor o receptor).
  • TRANSACTION_ID: identificador único de la transacción.
  • TRANSACTION_DETAILS: objeto JSON completo de la transacción.
  • ORDER_BLOCKNO: número de bloque utilizado para ordenar (de JSON si está disponible, de lo contrario, los metadatos de bloque).
  • ORDER_TXNNO: número de transacción en el bloque (de JSON si está disponible, de lo contrario, los metadatos del bloque).
Datos SourcesConfidential Consulta SQL, banco participante:
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

Orígenes de datos: <obpInstanceName>_<channelName>_state, la tabla de estado principal que contiene datos de código de cadena en formato JSON

Lógica clave:
  • Incluye solo las filas en las que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY no empieza por _obp2pc_
    • transaction_type no es EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ni CREATE_ACCOUNT
  • Extrae la participación de la cuenta tanto de las transacciones salientes (from_account_id) como de las transacciones entrantes (to_account_id).
  • Utiliza COALESCE para garantizar un orden consistente de las columnas (ORDER_BLOCKNO, ORDER_TXNNO) incluso si faltan valores JSON.
  • Combina tanto las transacciones salientes como las entrantes con UNION ALL.
Columnas de Salida:
  • KEY: ID de cuenta asociado a la transacción (emisor o receptor).
  • TRANSACTION_ID: identificador único de la transacción.
  • TRANSACTION_DETAILS: objeto JSON completo de la transacción.
  • ORDER_BLOCKNO: número de bloque utilizado para ordenar (de JSON si está disponible, de lo contrario, los metadatos de bloque).
  • ORDER_TXNNO: número de transacción en el bloque (de JSON si está disponible, de lo contrario, los metadatos del bloque).
TRANSACTION_PDC_VIEW
Esta vista proporciona detalles de importe y saldo a nivel de transacción de la recopilación de datos privados. Garantiza que solo se recupere el último registro por transacción.
Consulta SQL confidencial, propietario del sistema:
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

Objetivo: agrega datos en toda la organización a través de enlaces de base de datos.

Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: tabla de datos de código de cadena histórico que contiene registros de recopilación de datos privados
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK: vista remota desde la organización 1 a la que se accede a través del enlace de base de datos.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK: vista remota desde la organización 2 a la que se accede a través del enlace de base de datos.
Lógica clave:
  • Filtra solo los registros en los que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY no empieza por _obp2pc_staged_.
  • Utiliza la función de ventana ROW_NUMBER().
    • Particiones por transaction_id.
    • Pedidos a más tardar TXNTIMESTAMP DESC.
    • Mantiene solo el último registro (rn = 1).
  • Combina datos de la tabla de historial de recopilación de datos privada local, la vista de recopilación de datos privada de la organización 1 (mediante enlace de base de datos) y la vista de recopilación de datos privada de la organización 2 (mediante enlace de base de datos).
Columnas de Salida:
  • TRANSACTION_ID: identificador único de la transacción.
  • CHAINCODEID: identificador del código de cadena asociado al registro de cheque posdatado.
  • QUANTITY: importe o cantidad de la transacción transferida.
  • FROM_ACCOUNT_BALANCE: saldo de la cuenta del remitente después de la transacción.
  • FROM_ACCOUNT_ONHOLD_BALANCE: saldo retenido de la cuenta del remitente después de la transacción.
  • TO_ACCOUNT_BALANCE: saldo de la cuenta del receptor después de la transacción.
  • TO_ACCOUNT_ONHOLD_BALANCE: saldo retenido de la cuenta del receptor después de la transacción.
Consulta SQL confidencial, banco de participantes:
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
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: tabla de datos de código de cadena histórico que contiene registros de recopilación de datos privados
Lógica clave:
  • Filtra solo los registros en los que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY no empieza por _obp2pc_staged_.
  • Utiliza la función de ventana ROW_NUMBER().
    • Particiones por transaction_id.
    • Pedidos a más tardar TXNTIMESTAMP DESC.
    • Mantiene solo el último registro (rn = 1).
Columnas de Salida:
  • TRANSACTION_ID: identificador único de la transacción.
  • CHAINCODEID: identificador del código de cadena asociado al registro de cheque posdatado.
  • QUANTITY: importe o cantidad de la transacción transferida.
  • FROM_ACCOUNT_BALANCE: saldo de la cuenta del remitente después de la transacción.
  • FROM_ACCOUNT_ONHOLD_BALANCE: saldo retenido de la cuenta del remitente después de la transacción.
  • TO_ACCOUNT_BALANCE: saldo de la cuenta del receptor después de la transacción.
  • TO_ACCOUNT_ONHOLD_BALANCE: saldo retenido de la cuenta del receptor después de la transacción.
ACCOUNTS_VIEW
Esta vista proporciona una vista consolidada de las cuentas en todas las organizaciones.
Consulta SQL confidencial, propietario del sistema:
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
Objetivo: Esta vista proporciona una vista consolidada de las cuentas en todas las organizaciones, combinando la siguiente información.
  • Estado de cuenta corriente
  • Últimos datos privados relacionados con la cuenta (recopilación de datos privados)
  • Metadatos de token como la precisión decimal
  • Detalles de cuenta entre organizaciones mediante enlaces de base de datos
Esta información permite consultar metadatos de nivel de cuenta (organización, usuario, token, decimales) en una sola vista.
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: datos históricos de código de cadena, que se utilizan para recuperar la entrada de recopilación de datos privados de la cuenta más reciente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: datos del estado actual de las cuentas (oaccount) y tokens (otoken).
  • ACCOUNTS_VIEW@<org1Name>_LINK: vista remota desde la organización 1.
  • ACCOUNTS_VIEW@<org2Name>_LINK: vista remota desde la organización 2.
Lógica clave:
  • hist_ranked CTE: obtiene el último registro de recopilación de datos privados por account_id mediante ROW_NUMBER() con ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: selecciona cuentas (oaccount) de la tabla de estados.
  • token_details CTE: recupera los detalles del token (otoken) con precisión decimal (valor por defecto 0 si falta).
  • Uniones de selección final: estado de cuenta (state_filtered) con los últimos detalles de recopilación de datos privados (hist_ranked) y metadatos de token (token_details).
  • Garantiza solo cuentas con recopilación de datos privados asociados (WHERE h.valuejson IS NOT NULL).
  • Amplía los datos de cuenta con sindicatos de enlaces de base de datos de otras organizaciones.
Columnas de Salida:
  • ACCOUNT_ID: identificador único de la cuenta.
  • ORG_ID: ID de organización asociado a la cuenta.
  • USER_ID: ID de usuario enlazado a la cuenta (de la recopilación de datos privados).
  • CUSTOM_ACCOUNT_ID: identificador de cuenta definido por el usuario personalizado.
  • TOKEN_ID: identificador de token asociado a la cuenta.
  • DECIMAL_VALUE: precisión decimal de token (el valor por defecto es 0 si falta).
Consulta SQL confidencial, banco de participantes:
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
Objetivo: Esta vista proporciona una vista consolidada de las cuentas en todas las organizaciones, combinando la siguiente información.
  • Estado de cuenta corriente
  • Últimos datos privados relacionados con la cuenta (recopilación de datos privados)
  • Metadatos de token como la precisión decimal
Esta información permite consultar metadatos de nivel de cuenta (organización, usuario, token, decimales) en una sola vista.
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: datos históricos de código de cadena, que se utilizan para recuperar la entrada de recopilación de datos privados de la cuenta más reciente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: datos del estado actual de las cuentas (oaccount) y tokens (otoken).
Lógica clave:
  • hist_ranked CTE: obtiene el último registro de recopilación de datos privados por account_id mediante ROW_NUMBER() con ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: selecciona cuentas (oaccount) de la tabla de estados.
  • token_details CTE: recupera los detalles del token (otoken) con precisión decimal (valor por defecto 0 si falta).
  • Uniones de selección final: estado de cuenta (state_filtered) con los últimos detalles de recopilación de datos privados (hist_ranked) y metadatos de token (token_details).
  • Garantiza solo cuentas con recopilación de datos privados asociados (WHERE h.valuejson IS NOT NULL).
Columnas de Salida:
  • ACCOUNT_ID: identificador único de la cuenta.
  • ORG_ID: ID de organización asociado a la cuenta.
  • USER_ID: ID de usuario enlazado a la cuenta (de la recopilación de datos privados).
  • CUSTOM_ACCOUNT_ID: identificador de cuenta definido por el usuario personalizado.
  • TOKEN_ID: identificador de token asociado a la cuenta.
  • DECIMAL_VALUE: precisión decimal de token (el valor por defecto es 0 si falta).
ACCOUNTS_MOD
Esta vista proporciona una representación estructurada de los datos de registro de tokens fungibles, asignando organizaciones y usuarios a sus cuentas y tokens fungibles asociados. Simplifica el acceso a las relaciones de token de cuenta almacenadas en el estado de código de cadena simplificando las matrices JSON anidadas, lo que facilita el consumo de las aplicaciones y las consultas de análisis.
Consulta SQL Genérica, 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`
Orígenes de datos:
  • <obpInstanceName>_<channelName>_state: tabla de estado principal que contiene datos de código de cadena en formato JSON.
Lógica clave:
  • Filtrar por clave de registro: incluye solo registros en los que la clave contiene oftregistry.
  • Filtrar por código de cadena: restringe los resultados al código de cadena especificado (<chaincodeName>).
  • Simplificar JSON anidado: utiliza JSON_TABLE para ampliar la matriz associated_ft_accounts en filas independientes para cada par de token de cuenta.
    • account_id: identificador de cuenta de token fungible.
    • token_id: token enlazado a la cuenta.
    • lng_number: ordinalidad (utilizada internamente para realizar un seguimiento del orden de la matriz).
  • Ordenación: los resultados se ordenan por número de bloque (blockno) y número de transacción (txnno) en orden descendente, lo que garantiza que las asociaciones más recientes se muestren primero.
Columnas de Salida:
  • BLOCKNO: número de bloque en el que se registró la actualización del registro.
  • TXNNO: número de transacción en el bloque.
  • KEY: clave de estado que representa la entrada de registro de token fungible.
  • ASSETTYPE: tipo de activo (esperado: oftregistry).
  • ORG_ID: identificador de organización del JSON.
  • USER_ID: identificador de usuario asociado al registro de registro.
  • ACCOUNT_ID: ID de cuenta de token fungible extraído de la matriz anidada.
  • TOKEN_ID: ID de token extraído enlazado a la cuenta de token fungible.
Consulta SQL Genérica, Ir:
`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`
Esta vista es la misma que la consulta SQL genérica, vista TypeScript. La única diferencia está en la convención de nomenclatura de campos JSON, que utiliza mayúsculas y minúsculas en Pascal en lugar de minúsculas.
  • AssetType: anteriormente assetType
  • OrgId: anteriormente org_id
  • UserId: anteriormente user_id
  • AssociatedFtAccounts: anteriormente associated_ft_accounts
  • AccountId: anteriormente account_id
  • TokenId: anteriormente token_id
El alias se aplica (por ejemplo, OrgId AS org_id) para mantener los nombres de columna de salida consistentes en todas las vistas.
Consulta SQL confidencial, propietario del sistema:
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;
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: tabla de historial que almacena los cambios cronológicos de los datos privados de la cuenta (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: tabla de estado que contiene el estado del código de cadena actual en formato JSON, que se utiliza para los detalles oaccount y otoken.
  • Vistas de organización remota: se incluyen datos adicionales de las vistas ACCOUNTS_MOD en otras organizaciones mediante enlaces de base de datos:
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Lógica clave:
  • Clasificar registros históricos: utiliza ROW_NUMBER() para seleccionar el último registro oaccountpdc para cada ID de cuenta de la tabla de historial.
  • Filtrar cuentas actuales: recupera solo los registros con assetType = 'oaccount' de la tabla de estado.
  • Metadatos de token de unión: agrega precisión de token (decimal_value) mediante la unión con entradas otoken en la tabla de estado.
  • Combinar detalles de cuenta: une registros de cuenta filtrados con su entrada de historial más reciente y detalles de token. Garantiza que solo se incluyan las cuentas con datos históricos válidos (h.valuejson IS NOT NULL).
  • Unión de varias organizaciones: utiliza UNION ALL para fusionar los datos de la cuenta de la organización local con varias organizaciones remotas mediante enlaces de base de datos. Esto permite que una sola consulta unificada recupere todas las cuentas de la red.
Columnas de Salida:
  • ACCOUNT_ID: identificador único de la cuenta.
  • ORG_ID: ID de organización propietaria de la cuenta.
  • USER_ID: ID de usuario enlazado a la cuenta (del último registro histórico).
  • CUSTOM_ACCOUNT_ID: identificador de cuenta personalizado opcional definido por el usuario.
  • TOKEN_ID: identificador de token asociado a la cuenta.
  • DECIMAL_VALUE: precisión decimal de token (el valor por defecto es 0 si falta).

Generación dinámica: la parte multiorganización no está codificada. En el script, las uniones adicionales se generan dinámicamente en función del archivo Participant_orgs_list.yml. Esto garantiza que la vista se adapte automáticamente en función de cuántas organizaciones estén configuradas en la red. La consulta de ejemplo muestra tres organizaciones para mayor claridad, pero en la práctica el número de uniones depende del tamaño de orgsList. Para obtener más información, consulte la información anterior sobre el archivo Participant_orgs_list.yml en este tema.

Consulta SQL confidencial, banco de participantes:
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;
Esta vista es la misma que la Consulta SQL Confidencial, Propietario del Sistema, pero solo recupera datos para la organización local. Las principales diferencias son las siguientes:
  • No se utiliza UNION ALL con enlaces de base de datos.
  • La salida incluye cuentas sólo de las tablas de estado e historial de la organización actual.
  • La vista proporciona un registro de cuentas de una sola organización, a diferencia de la variante de varias organizaciones que consolida las cuentas en varias organizaciones.
TRANSACTION_MOD
Esta vista proporciona un registro detallado de todas las transacciones de cadena de bloques, capturando metadatos, participantes, importes y saldos resultantes. Simplifica el acceso al historial de transacciones mediante la extracción de campos estructurados directamente de la tabla de historial, lo que elimina la necesidad de analizar manualmente el JSON no procesado.
Consulta SQL Genérica, 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`

Orígenes de datos: <obpInstanceName>_<channelName>_hist, la tabla de historial que contiene todos los eventos de transacción en formato JSON. Incluye tanto los detalles de la transacción como los metadatos asociados (bloque, número de transacción, registro de hora).

Lógica clave:
  • Incluye solo las filas en las que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = <chaincodeName>
    • KEY contiene otransaction (filtros para registros relacionados con transacciones)
  • Las indicaciones dan como resultado lo siguiente.
    • blockno DESC (el último bloque primero)
    • txnno DESC (la última transacción dentro del bloque primero)
Columnas de Salida:
  • BLOCKNO: número de bloque en el que se registró la transacción.
  • TXNNO: número de transacción en el bloque.
  • KEY: identificador único de la entrada de transacción.
  • TXNTIMESTAMP: registro de hora cuando se completó la transacción.
  • ASSETTYPE: tipo de activo para la transacción (por ejemplo, otransaction).
  • TRANSACTION_ID: identificador único de la transacción.
  • FROM_ACCOUNT_ID: ID de cuenta de la que se originó el activo/valor.
  • TO_ACCOUNT_ID: ID de cuenta al que se ha transferido el activo/valor.
  • TRANSACTION_TYPE: tipo de transacción (por ejemplo, transferencia, débito, crédito).
  • AMOUNT: importe implicado en la transacción.
  • TRANSACTION_EARMARK: categoría o marcador de la transacción.
  • FROM_ACCOUNT_BALANCE: saldo de la cuenta de origen después de la transacción.
  • TO_ACCOUNT_BALANCE: saldo de la cuenta de destino después de la transacción.
Consulta SQL Genérica, Ir:
`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`
Esta vista es la misma que la consulta SQL genérica, vista TypeScript. La única diferencia está en la convención de nomenclatura de campos JSON, que utiliza mayúsculas y minúsculas en Pascal en lugar de minúsculas.
  • AssetType: anteriormente assetType
  • TransactionId: anteriormente transaction_id
  • FromAccountId: anteriormente from_account_id
  • ToAccountId: anteriormente to_account_id
  • TransactionType: anteriormente transaction_type
  • Amount: anteriormente amount
  • Category: anteriormente category
  • FromAccountBalance: anteriormente from_account_balance
  • ToAccountBalance: anteriormente to_account_balance
El alias se aplica (por ejemplo, TransactionId AS transaction_id) para mantener los nombres de columna de salida consistentes en todas las vistas, independientemente de la convención de nomenclatura de campos JSON.
Consulta SQL confidencial, propietario del sistema:
`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`
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: tabla de código de cadena histórica que almacena todas las versiones de transacción.
  • <transactionPDCViewName>: vista que contiene los detalles de la transacción de recopilación de datos privada, unida para enriquecer los registros de transacción.
  • ACCOUNTS_MOD: vista de referencia utilizada para recuperar el valor decimal_value correcto para los saldos de cuenta y los importes de transacción.
Lógica clave:
  • Filtra solo las filas en las que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY no empieza por _obp2pc_staged_
  • Utiliza ROW_NUMBER() particionado por transaction_id (ordenado por txntimestamp DESC) para garantizar que solo se incluya el último registro por transacción.
  • Recupera dinámicamente decimal_value de ACCOUNTS_MOD, en función de si la transacción implica from_account_id o to_account_id.
  • Los importes y saldos (amount, from_account_balance, to_account_balance) se escalan con precisión decimal mediante: value / POWER(10, decimal_value)
  • Utiliza COALESCE en blockNo y txnNo para garantizar que las columnas de ordenación siempre estén presentes, incluso si faltan en JSON.
Columnas de Salida:
  • BLOCKNO: número de bloque para ordenar (de JSON si está disponible, de lo contrario de los metadatos).
  • TXNNO: número de transacción en el bloque (de JSON si está disponible; de lo contrario, de los metadatos).
  • KEY: identificador de clave de transacción.
  • TXNTIMESTAMP: registro de hora de la transacción.
  • ASSETTYPE: tipo de activo (otransaction).
  • TRANSACTION_ID: identificador único de la transacción.
  • FROM_ACCOUNT_ID: ID de cuenta desde el que se enviaron los tokens.
  • TO_ACCOUNT_ID: ID de cuenta al que se enviaron los tokens.
  • TRANSACTION_TYPE: tipo de transacción (por ejemplo, transferencia, retención, liberación).
  • AMOUNT: importe de transacción, escalado por precisión decimal de token.
  • TRANSACTION_EARMARK: categoría u objeto de la transacción.
  • FROM_ACCOUNT_BALANCE: saldo de la cuenta del remitente después de la transacción, escalado por precisión.
  • TO_ACCOUNT_BALANCE: saldo de la cuenta del receptor después de la transacción, escalado por precisión.
Consulta SQL confidencial, banco de participantes:
`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`
Orígenes de datos:
  • <obpInstanceName>_<channelName>_hist: tabla de código de cadena histórico que contiene todas las versiones de transacción en formato JSON.
  • <transactionPDCViewName>: vista de recopilación de datos privada que contiene datos privados a nivel de transacción. Se une al historial para enriquecer el registro de transacción.
  • ACCOUNTS_MOD: vista utilizada para recuperar la precisión decimal de token correcta (decimal_value) para las cuentas implicadas en transacciones.
Lógica clave:
  • Filtra solo las filas en las que las siguientes afirmaciones son verdaderas.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Excluye las transacciones en ubicación temporal (KEY NOT LIKE '_obp2pc_staged_%')
  • Escala decimal: recupera decimal_value de forma dinámica desde ACCOUNTS_MOD, según from_account_id o to_account_id. Aplica la escala a amount, from_account_balance y to_account_balance mediante: value / POWER(10, decimal_value)
  • Selección de registros: utiliza ROW_NUMBER() particionado por transaction_id (el último por TXNTIMESTAMP) para asegurarse de que solo se devuelve la última versión de cada transacción.
  • Normalización de datos: COALESCE se aplica en blockNo y txnNo para garantizar la coherencia incluso si faltan los valores en la carga útil de JSON.
Columnas de Salida:
  • BLOCKNO: número de bloque utilizado para ordenar (de JSON si está disponible, de lo contrario de los metadatos).
  • TXNNO: número de transacción en el bloque (de JSON si está disponible; de lo contrario, de los metadatos).
  • KEY: identificador de clave de transacción.
  • TXNTIMESTAMP: registro de hora de la transacción.
  • ASSETTYPE: tipo de activo (otransaction).
  • TRANSACTION_ID: identificador único de la transacción.
  • FROM_ACCOUNT_ID: ID de cuenta que envía tokens.
  • TO_ACCOUNT_ID: ID de cuenta que recibe tokens.
  • TRANSACTION_TYPE: tipo de transacción (por ejemplo, transferencia, retención, liberación).
  • AMOUNT: importe de transacción, normalizado con precisión decimal de token.
  • TRANSACTION_EARMARK: categoría o marcador de la transacción.
  • FROM_ACCOUNT_BALANCE: saldo de la cuenta de emisor después de la transacción (ajustado por precisión).
  • TO_ACCOUNT_BALANCE: saldo de la cuenta del receptor después de la transacción (ajustado por precisión).
ACCOUNTS_TRANSACTION_MOD
Esta vista amplía el historial de transacciones mediante la asociación de cada transacción con los IDs de organización de las cuentas participantes. Admite aprobaciones de consumo, aprobaciones de menta y transferencias regulares, lo que garantiza que las transacciones incluyan tanto el contexto de nivel de cuenta como el de organización.
Consulta SQL Genérica, TypeScript e Ir:
`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`
Orígenes de datos:
  • <transactionViewName> (A): proporciona detalles básicos de la transacción, como ID, números de bloque, cuentas, importes y registros de hora.
  • <accountsViewName> (B, C): asigna cuentas (ACCOUNT_ID) a organizaciones (ORG_ID) tanto para el remitente como para el receptor.
Lógica clave: la vista se crea mediante un UNION de tres casos:
  1. APPROVE_BURN
    • Únase a FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Asigne B.ORG_ID a FROM_ORG_ID y TO_ORG_ID.
  2. APPROVE_MINT
    • Únase a TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Asigne C.ORG_ID a FROM_ORG_ID y TO_ORG_ID.
  3. Transferencias regulares
    • Únase a FROM_ACCOUNT_ID = B.ACCOUNT_ID y TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Asigne B.ORG_ID como FROM_ORG_ID y C.ORG_ID como TO_ORG_ID.
Por último, los resultados se ordenan por BLOCKNO DESC para priorizar las últimas transacciones.
Columnas de Salida:
  • TRANSACTION_ID: identificador único de la transacción.
  • BLOCKNO: número de bloque en el que se registró la transacción.
  • FROM_ACCOUNT_ID: ID de cuenta del remitente.
  • TO_ACCOUNT_ID: ID de cuenta del receptor.
  • EARMARK: categoría de referencia de transacción (alias TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID de organización de la cuenta del remitente (o igual que TO para grabación).
  • TO_ORG_ID: ID de organización de la cuenta del receptor (o igual que FROM para la moneda).
  • TRANSACTION_TYPE: tipo de transacción (APPROVE_BURN, APPROVE_MINT o transferencia).
  • AMOUNT: importe de la transacción.
  • CRDATE: fecha de creación de la transacción (desde TXNTIMESTAMP).
Consulta SQL confidencial, propietario del sistema y banco de participantes:
`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
Orígenes de datos:
  • <transactionViewName> (A): proporciona datos de nivel de transacción (ID, números de bloque, referencias de cuenta, importes, registros de hora).
  • <accountsViewName> (B, C): proporciona una asignación entre ACCOUNT_ID y ORG_ID.
Lógica clave: la vista utiliza UNION para fusionar los resultados de tres patrones de transacción:
  1. Transacciones de solo remitente (por ejemplo, casos salientes o similares a los de consumo)
    • Condición: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID y A.TO_ACCOUNT_ID IS NULL.
    • Excluye el tipo de transacción CREATE_ACCOUNT.
    • Tanto FROM_ORG_ID como TO_ORG_ID se derivan de la organización del remitente (B.ORG_ID).
  2. Transacciones de solo receptor (por ejemplo, casos entrantes o similares a menta)
    • Condición: A.TO_ACCOUNT_ID = C.ACCOUNT_ID y A.FROM_ACCOUNT_ID IS NULL.
    • Tanto FROM_ORG_ID como TO_ORG_ID proceden de la organización del receptor (C.ORG_ID).
  3. Transferencias estándar (transacciones con remitente y receptor)
    • Condición: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID y A.TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • FROM_ORG_ID procede de la organización del remitente (B.ORG_ID), TO_ORG_ID de la organización del destinatario (C.ORG_ID).
Por último, los resultados se ordenan en orden descendente por BLOCKNO para priorizar las últimas transacciones.
Columnas de Salida:
  • TRANSACTION_ID: identificador único de la transacción.
  • BLOCKNO: número de bloque en el que se registra la transacción.
  • FROM_ACCOUNT_ID: ID de cuenta del remitente (puede ser NULL para la menta).
  • TO_ACCOUNT_ID: ID de cuenta del receptor (puede ser NULL para grabación).
  • EARMARK: referencia de transacción (alias TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID de organización del remitente (o igual que el receptor si el remitente es NULL).
  • TO_ORG_ID: ID de organización del receptor (o el mismo que el emisor si el receptor es NULL).
  • TRANSACTION_TYPE: tipo de transacción (por ejemplo, transferencia, menta, grabación, etc.).
  • AMOUNT: importe de la transacción.
  • CRDATE: registro de hora de creación de transacción (TXNTIMESTAMP).