Views Predefinidas

O Oracle Blockchain Platform Digital Assets Edition fornece as seguintes views predefinidas do banco de dados.

ACCOUNT_TRANSACTION_VIEW
Essa exibição fornece um histórico de transações unificado por conta, capturando os lados de débito (from_account_id) e crédito (to_account_id) de uma transação. É possível usar essa visualização para consultar todas as transações vinculadas a uma conta sem digitalizar dados brutos do estado do chaincode.
Consulta SQL Confidencial, Proprietário do 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

Origens de Dados: <obpInstanceName>_<channelName>_state, a tabela de estado principal que contém dados de chaincode no formato JSON

Lógica da Chave:
  • Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY não começa com _obp2pc_
    • transaction_type não é EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ou CREATE_ACCOUNT
  • Extrai o envolvimento da conta de transações de saída (from_account_id) e de entrada (to_account_id).
  • Usa COALESCE para garantir a ordenação consistente de colunas (ORDER_BLOCKNO, ORDER_TXNNO), mesmo que valores JSON estejam ausentes.
  • Combina transações de saída e de entrada com um UNION ALL.
Colunas de Saída:
  • KEY: ID da Conta associado à transação (remetente ou recebedor).
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • TRANSACTION_DETAILS: Objeto JSON completo da transação.
  • ORDER_BLOCKNO: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, bloquear metadados).
  • ORDER_TXNNO: Número da transação no bloco (de JSON, se disponível, caso contrário, metadados do bloco).
Consulta SQL de Dados SourcesConfidential, Banco do 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

Origens de Dados: <obpInstanceName>_<channelName>_state, a tabela de estado principal que contém dados de chaincode no formato JSON

Lógica da Chave:
  • Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY não começa com _obp2pc_
    • transaction_type não é EXECUTE_HOLD_RECEIVER, EXECUTE_HOLD_SENDER ou CREATE_ACCOUNT
  • Extrai o envolvimento da conta de transações de saída (from_account_id) e de entrada (to_account_id).
  • Usa COALESCE para garantir a ordenação consistente de colunas (ORDER_BLOCKNO, ORDER_TXNNO), mesmo que valores JSON estejam ausentes.
  • Combina transações de saída e de entrada com um UNION ALL.
Colunas de Saída:
  • KEY: ID da Conta associado à transação (remetente ou recebedor).
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • TRANSACTION_DETAILS: Objeto JSON completo da transação.
  • ORDER_BLOCKNO: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, bloquear metadados).
  • ORDER_TXNNO: Número da transação no bloco (de JSON, se disponível, caso contrário, metadados do bloco).
TRANSACTION_PDC_VIEW
Esta exibição fornece detalhes de saldo e valor no nível da transação da coleta de dados privada. Ele garante que somente o registro mais recente por transação seja recuperado.
Consulta SQL Confidencial, Proprietário do 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

Finalidade: Agrega dados em toda a organização por meio de vínculos de banco de dados.

Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: a tabela de dados chaincode histórica que contém registros privados de coleta de dados
  • $TRANSACTION_PDC_VIEW@${org1Name}_LINK: View remota da organização 1 acessada por meio do link do banco de dados.
  • $TRANSACTION_PDC_VIEW@${org2Name}_LINK: View remota da organização 2 acessada por meio do link do banco de dados.
Lógica da Chave:
  • Filtra somente registros em que as seguintes afirmações são verdadeiras.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY não começa com _obp2pc_staged_.
  • Usa a função de janela ROW_NUMBER().
    • Partições por transaction_id.
    • Pedidos por TXNTIMESTAMP DESC.
    • Mantém apenas o registro mais recente (rn = 1).
  • Combina dados da tabela de histórico de coleta de dados privada local, da view de coleta de dados privada da organização 1 (via link de banco de dados) e da view de coleta de dados privada da organização 2 (via link de banco de dados).
Colunas de Saída:
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • CHAINCODEID: Identificador do chaincode associado ao registro do PDC.
  • QUANTITY: Valor ou quantidade da transação transferida.
  • FROM_ACCOUNT_BALANCE: Saldo da conta do remetente após a transação.
  • FROM_ACCOUNT_ONHOLD_BALANCE: Saldo em retenção da conta do remetente após a transação.
  • TO_ACCOUNT_BALANCE: Saldo da conta do recebedor após a transação.
  • TO_ACCOUNT_ONHOLD_BALANCE: Saldo em retenção da conta do recebedor após a transação.
Consulta SQL Confidencial, Banco do Participante:
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
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: a tabela de dados chaincode histórica que contém registros privados de coleta de dados
Lógica da Chave:
  • Filtra somente registros em que as seguintes afirmações são verdadeiras.
    • CHAINCODEID = ${implicitPDCName}
    • assetType = 'otransactionpdc'
    • KEY não começa com _obp2pc_staged_.
  • Usa a função de janela ROW_NUMBER().
    • Partições por transaction_id.
    • Pedidos por TXNTIMESTAMP DESC.
    • Mantém apenas o registro mais recente (rn = 1).
Colunas de Saída:
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • CHAINCODEID: Identificador do chaincode associado ao registro do PDC.
  • QUANTITY: Valor ou quantidade da transação transferida.
  • FROM_ACCOUNT_BALANCE: Saldo da conta do remetente após a transação.
  • FROM_ACCOUNT_ONHOLD_BALANCE: Saldo em retenção da conta do remetente após a transação.
  • TO_ACCOUNT_BALANCE: Saldo da conta do recebedor após a transação.
  • TO_ACCOUNT_ONHOLD_BALANCE: Saldo em retenção da conta do recebedor após a transação.
ACCOUNTS_VIEW
Esta exibição fornece uma exibição consolidada de contas entre organizações.
Consulta SQL Confidencial, Proprietário do 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 exibição fornece uma exibição consolidada de contas entre organizações, combinando as seguintes informações.
  • Estado da conta atual
  • Dados privados relacionados à conta mais recentes (coleta de dados privados)
  • Metadados de token, como precisão decimal
  • Detalhes da conta entre organizações por meio de links de banco de dados
Essas informações permitem consultar metadados no nível da conta (organização, usuário, token, decimais) em uma única exibição.
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: dados históricos de chaincode, usados para extrair a entrada de coleta de dados privada da conta mais recente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Dados de estado atuais para contas (oaccount) e tokens (otoken).
  • ACCOUNTS_VIEW@<org1Name>_LINK: Exibição remota da organização 1.
  • ACCOUNTS_VIEW@<org2Name>_LINK: Exibição remota da organização 2.
Lógica da Chave:
  • hist_ranked CTE: Obtém o registro de coleta de dados privados mais recente por account_id usando ROW_NUMBER() com ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: Seleciona contas (oaccount) na tabela de estado.
  • token_details CTE: Recupera os detalhes do token (otoken) com precisão decimal (o padrão é 0 se estiver ausente).
  • Junções de seleção finais: Estado da conta (state_filtered) com detalhes da coleta de dados privada mais recentes (hist_ranked) e metadados de token (token_details).
  • Garante apenas contas com coleta de dados privada associada (WHERE h.valuejson IS NOT NULL).
  • Estende os dados da conta com uniões de vínculo de banco de dados de outras organizações.
Colunas de Saída:
  • ACCOUNT_ID: Identificador exclusivo do conta.
  • ORG_ID: ID da Organização associado à conta.
  • USER_ID: ID do Usuário vinculado à conta (da coleta de dados privada).
  • CUSTOM_ACCOUNT_ID: Identificador de conta personalizado definido pelo usuário.
  • TOKEN_ID: Identificador de token associado à conta.
  • DECIMAL_VALUE: Precisão decimal do token (o padrão será 0 se estiver ausente).
Consulta SQL Confidencial, Banco do Participante:
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 exibição fornece uma exibição consolidada de contas entre organizações, combinando as seguintes informações.
  • Estado da conta atual
  • Dados privados relacionados à conta mais recentes (coleta de dados privados)
  • Metadados de token, como precisão decimal
Essas informações permitem consultar metadados no nível da conta (organização, usuário, token, decimais) em uma única exibição.
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: dados históricos de chaincode, usados para extrair a entrada de coleta de dados privada da conta mais recente (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Dados de estado atuais para contas (oaccount) e tokens (otoken).
Lógica da Chave:
  • hist_ranked CTE: Obtém o registro de coleta de dados privados mais recente por account_id usando ROW_NUMBER() com ORDER BY TXNTIMESTAMP DESC.
  • state_filtered CTE: Seleciona contas (oaccount) na tabela de estado.
  • token_details CTE: Recupera os detalhes do token (otoken) com precisão decimal (o padrão é 0 se estiver ausente).
  • Junções de seleção finais: Estado da conta (state_filtered) com detalhes da coleta de dados privada mais recentes (hist_ranked) e metadados de token (token_details).
  • Garante apenas contas com coleta de dados privada associada (WHERE h.valuejson IS NOT NULL).
Colunas de Saída:
  • ACCOUNT_ID: Identificador exclusivo do conta.
  • ORG_ID: ID da Organização associado à conta.
  • USER_ID: ID do Usuário vinculado à conta (da coleta de dados privada).
  • CUSTOM_ACCOUNT_ID: Identificador de conta personalizado definido pelo usuário.
  • TOKEN_ID: Identificador de token associado à conta.
  • DECIMAL_VALUE: Precisão decimal do token (o padrão será 0 se estiver ausente).
ACCOUNTS_MOD
Esta exibição fornece uma representação estruturada de dados de registro de token fungível, mapeando organizações e usuários para suas contas e tokens de token fungíveis associados. Ele simplifica o acesso a relacionamentos de token de conta armazenados no estado do chaincode ao nivelar matrizes JSON aninhadas, facilitando o consumo de consultas de aplicativos e análises.
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`
Origens de Dados:
  • <obpInstanceName>_<channelName>_state: A tabela de estado principal que contém dados de chaincode no formato JSON.
Lógica da Chave:
  • Filtrar por chave de registro: Inclui somente registros em que a chave contém oftregistry.
  • Filtrar por chaincode: Restringe os resultados ao chaincode especificado (<chaincodeName>).
  • JSON aninhado nivelado: Usa JSON_TABLE para expandir o array associated_ft_accounts em linhas separadas para cada par de token de conta.
    • account_id: Identificador de conta de token fungível.
    • token_id: Token vinculado à conta.
    • lng_number: Ordinalidade (usada internamente para rastrear a ordem do array).
  • Ordenação: Os resultados são classificados por número de bloco (blockno) e número de transação (txnno) em ordem decrescente, garantindo que as associações mais recentes sejam exibidas primeiro.
Colunas de Saída:
  • BLOCKNO: Número do bloco em que a atualização do registro foi registrada.
  • TXNNO: Número da transação no bloco.
  • KEY: Chave de estado que representa a entrada de registro de token fungível.
  • ASSETTYPE: Tipo de ativo (esperado: oftregistry).
  • ORG_ID: Identificador da organização do JSON.
  • USER_ID: Identificador do usuário associado ao registro do registro.
  • ACCOUNT_ID: ID da conta do token fungível extraído do array aninhado.
  • TOKEN_ID: ID do token extraído vinculado à conta do token fungível.
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`
Essa view é igual à Consulta SQL Genérica, view TypeScript. A única diferença está na convenção de nomenclatura do campo JSON, que usa maiúsculas e minúsculas do Pascal em vez 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
O alias é aplicado (por exemplo, OrgId AS org_id) para manter os nomes das colunas de saída consistentes entre as views.
Consulta SQL Confidencial, Proprietário do 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;
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: Tabela de histórico que armazena as alterações cronológicas dos dados privados da conta (oaccountpdc).
  • <obpInstanceName>_<channelName>_state: Tabela de estado que contém o estado do chaincode atual no formato JSON, usada para detalhes de oaccount e otoken.
  • Visualizações de organização remota: Dados adicionais das visualizações ACCOUNTS_MOD em outras organizações são incluídos usando links de banco de dados:
    • "ACCOUNTS_MOD"@<org1Name>_LINK
    • "ACCOUNTS_MOD"@<org2Name>_LINK
    • "ACCOUNTS_MOD"@<org3Name>_LINK
Lógica da Chave:
  • Classificar Registros Históricos: Usa ROW_NUMBER() para selecionar o registro oaccountpdc mais recente para cada ID de conta na tabela de histórico.
  • Filtrar Contas Atuais: Recupera somente registros com assetType = 'oaccount' da tabela de estado.
  • Metadados de Token de Junção: Adiciona a precisão do token (decimal_value) unindo-se às entradas otoken na tabela de estado.
  • Combinar Detalhes da Conta: junta registros de conta filtrados com sua entrada de histórico mais recente e detalhes de token. Garante que somente contas com dados históricos válidos (h.valuejson IS NOT NULL) sejam incluídas.
  • União Multiorg.: Usa UNION ALL para mesclar dados da conta da organização local com várias organizações remotas por meio de links de banco de dados. Isso permite que uma única consulta unificada recupere todas as contas na rede.
Colunas de Saída:
  • ACCOUNT_ID: Identificador exclusivo do conta.
  • ORG_ID: ID da Organização que possui a conta.
  • USER_ID: ID do Usuário vinculado à conta (do registro histórico mais recente).
  • CUSTOM_ACCOUNT_ID: Identificador de conta personalizado opcional definido pelo usuário.
  • TOKEN_ID: Identificador de token associado à conta.
  • DECIMAL_VALUE: Precisão decimal do token (o padrão será 0 se estiver ausente).

Geração Dinâmica: A parte de várias organizações não está codificada. No script, os sindicatos extras são gerados dinamicamente com base no arquivo Participant_orgs_list.yml. Isso garante que a visualização se adapte automaticamente, dependendo de quantas organizações estão configuradas na rede. O exemplo de consulta mostra três organizações para maior clareza, mas na prática o número de uniões depende do tamanho de orgsList. Para obter detalhes adicionais, consulte as informações anteriores sobre o arquivo Participant_orgs_list.yml neste tópico.

Consulta SQL Confidencial, Banco do Participante:
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;
Essa visualização é igual à Consulta SQL Confidencial, Proprietário do Sistema, mas recupera dados apenas para a organização local. As principais diferenças são as seguintes:
  • Não é usado nenhum UNION ALL com links de banco de dados.
  • A saída inclui contas somente das tabelas de estado e histórico da organização atual.
  • A view fornece um registro de conta de organização única, ao contrário da variante de várias organizações que consolida contas em várias organizações.
TRANSACTION_MOD
Essa exibição fornece um registro detalhado de todas as transações de blockchain, capturando metadados, participantes, valores e saldos resultantes. Ele simplifica o acesso ao histórico de transações extraindo campos estruturados diretamente da tabela de histórico, eliminando a necessidade de analisar manualmente o JSON bruto.
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`

Origens de Dados: <obpInstanceName>_<channelName>_hist, a tabela de histórico que contém todos os eventos de transação no formato JSON. Inclui os detalhes da transação e os metadados associados (bloco, número da transação, timestamp).

Lógica da Chave:
  • Inclui apenas linhas em que as seguintes instruções sejam verdadeiras.
    • CHAINCODEID = <chaincodeName>
    • KEY contém otransaction (filtros para registros relacionados à transação)
  • As prescrições resultam da seguinte maneira.
    • blockno DESC (bloco mais recente primeiro)
    • txnno DESC (transação mais recente no bloco primeiro)
Colunas de Saída:
  • BLOCKNO: Número do bloco no qual a transação foi registrada.
  • TXNNO: Número da transação no bloco.
  • KEY: Identificador exclusivo da entrada da transação.
  • TXNTIMESTAMP: Data e hora em que a transação foi concluída.
  • ASSETTYPE: Tipo de ativo para a transação (por exemplo, otransaction).
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • FROM_ACCOUNT_ID: ID da Conta da qual o ativo/valor se originou.
  • TO_ACCOUNT_ID: ID da Conta para a qual o ativo/valor foi transferido.
  • TRANSACTION_TYPE: Tipo da transação (por exemplo, transferência, débito, crédito).
  • AMOUNT: Valor envolvido na transação.
  • TRANSACTION_EARMARK: Categoria ou marca para a transação.
  • FROM_ACCOUNT_BALANCE: Saldo da conta de origem após a transação.
  • TO_ACCOUNT_BALANCE: Saldo da conta de destino após a transação.
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`
Essa view é igual à Consulta SQL Genérica, view TypeScript. A única diferença está na convenção de nomenclatura do campo JSON, que usa maiúsculas e minúsculas do Pascal em vez 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
O alias é aplicado (por exemplo, TransactionId AS transaction_id) para manter os nomes das colunas de saída consistentes entre as views, independentemente da convenção de nomenclatura do campo JSON.
Consulta SQL Confidencial, Proprietário do 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`
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: Tabela de chaincode histórica que armazena todas as versões de transação.
  • <transactionPDCViewName>: Exibir contendo detalhes da transação de coleta de dados privados, unidos para enriquecer registros de transação.
  • ACCOUNTS_MOD: View de referência usada para extrair o decimal_value correto para saldos de conta e valores de transação.
Lógica da Chave:
  • Filtra somente as linhas nas quais as instruções a seguir são verdadeiras.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • KEY não começa com _obp2pc_staged_
  • Usa o ROW_NUMBER() particionado por transaction_id (ordenado por txntimestamp DESC) para garantir que apenas o registro mais recente por transação seja incluído.
  • Extrai dinamicamente decimal_value de ACCOUNTS_MOD, com base no fato de a transação envolver um from_account_id ou to_account_id.
  • Quantias e saldos (amount, from_account_balance, to_account_balance) são dimensionados por precisão decimal usando: value / POWER(10, decimal_value)
  • Usa COALESCE em blockNo e txnNo para garantir que as colunas de ordenação estejam sempre presentes, mesmo que não estejam no JSON.
Colunas de Saída:
  • BLOCKNO: Número do bloco para ordenação (de JSON, se disponível; caso contrário, de metadados).
  • TXNNO: Número da transação no bloco (do JSON, se disponível, caso contrário, dos metadados).
  • KEY: Identificador da chave da transação.
  • TXNTIMESTAMP: Carimbo de data e hora da transação.
  • ASSETTYPE: Tipo de ativo (otransaction).
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • FROM_ACCOUNT_ID: ID da Conta da qual os tokens foram enviados.
  • TO_ACCOUNT_ID: ID da Conta para a qual os tokens foram enviados.
  • TRANSACTION_TYPE: Tipo da transação (por exemplo, transferência, retenção, liberação).
  • AMOUNT: Valor da transação, dimensionado pela precisão decimal do token.
  • TRANSACTION_EARMARK: Categoria ou marca da transação.
  • FROM_ACCOUNT_BALANCE: Saldo da conta do remetente após a transação, dimensionado por precisão.
  • TO_ACCOUNT_BALANCE: Saldo da conta do recebedor após a transação, dimensionado por precisão.
Consulta SQL Confidencial, Banco do Participante:
`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`
Origens de Dados:
  • <obpInstanceName>_<channelName>_hist: Tabela chaincode histórica contendo todas as versões de transação no formato JSON.
  • <transactionPDCViewName>: View de coleta de dados privada que contém dados privados no nível da transação. Ele é unido ao histórico para enriquecer o registro de transação.
  • ACCOUNTS_MOD: View usada para recuperar a precisão decimal do token correto (decimal_value) para contas envolvidas em transações.
Lógica da Chave:
  • Filtra somente as linhas nas quais as instruções a seguir são verdadeiras.
    • CHAINCODEID = <chaincodeName>
    • assetType = 'otransaction'
    • Exclui transações preparadas (KEY NOT LIKE '_obp2pc_staged_%')
  • Dimensionamento decimal: Extrai decimal_value dinamicamente de ACCOUNTS_MOD, com base em from_account_id ou to_account_id. Aplica o dimensionamento a amount, from_account_balance e to_account_balance usando: value / POWER(10, decimal_value)
  • Seleção de registro: Usa ROW_NUMBER() particionado por transaction_id (o mais recente por TXNTIMESTAMP) para garantir que apenas a versão mais recente de cada transação seja retornada.
  • Normalização de dados: COALESCE é aplicado em blockNo e txnNo para garantir a consistência, mesmo que os valores estejam ausentes no payload JSON.
Colunas de Saída:
  • BLOCKNO: Número do bloco usado para ordenação (de JSON, se disponível; caso contrário, de metadados).
  • TXNNO: Número da transação no bloco (do JSON, se disponível, caso contrário, dos metadados).
  • KEY: Identificador da chave da transação.
  • TXNTIMESTAMP: Carimbo de data e hora da transação.
  • ASSETTYPE: Tipo de ativo (otransaction).
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • FROM_ACCOUNT_ID: ID da Conta que está enviando tokens.
  • TO_ACCOUNT_ID: ID da Conta que está recebendo tokens.
  • TRANSACTION_TYPE: Tipo da transação (por exemplo, transferência, retenção, liberação).
  • AMOUNT: Valor da transação, normalizado usando a precisão decimal do token.
  • TRANSACTION_EARMARK: Categoria ou marca para a transação.
  • FROM_ACCOUNT_BALANCE: Saldo da conta do remetente após a transação (ajustado à precisão).
  • TO_ACCOUNT_BALANCE: Saldo da conta do recebedor após a transação (ajustado à precisão).
ACCOUNTS_TRANSACTION_MOD
Essa visualização estende o histórico de transações associando cada transação aos IDs de organização das contas participantes. Ele oferece suporte a aprovações de queima, aprovações de hortelã e transferências regulares, garantindo que as transações incluam contexto no nível da conta e da organização.
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`
Origens de Dados:
  • <transactionViewName> (A): Fornece detalhes da transação principal, como IDs, números de bloco, contas, valores e timestamps.
  • <accountsViewName> (B, C): Mapeia contas (ACCOUNT_ID) para organizações (ORG_ID) para remetente e recebedor.
Lógica Chave: A view é criada usando um UNION de três casos:
  1. APPROVE_BURN
    • Participe do FROM_ACCOUNT_ID = B.ACCOUNT_ID.
    • Atribua B.ORG_ID a FROM_ORG_ID e TO_ORG_ID.
  2. APPROVE_MINT
    • Participe do TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Atribua C.ORG_ID a FROM_ORG_ID e TO_ORG_ID.
  3. Transferências Regulares
    • Junte-se a FROM_ACCOUNT_ID = B.ACCOUNT_ID e TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • Atribua B.ORG_ID como FROM_ORG_ID e C.ORG_ID como TO_ORG_ID.
Por fim, os resultados são ordenados por BLOCKNO DESC para priorizar as transações mais recentes.
Colunas de Saída:
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • BLOCKNO: Número do bloco no qual a transação foi registrada.
  • FROM_ACCOUNT_ID: ID da Conta do remetente.
  • TO_ACCOUNT_ID: ID da Conta do recebedor.
  • EARMARK: Categoria de marcação de operações (também conhecida por TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID da organização da conta do remetente (ou o mesmo que TO para gravação).
  • TO_ORG_ID: ID da Organização da conta do recebedor (ou igual a FROM para hortelã).
  • TRANSACTION_TYPE: Tipo da transação (APPROVE_BURN, APPROVE_MINT ou transferência).
  • AMOUNT: Valor da transação.
  • CRDATE: Data de criação da transação (de TXNTIMESTAMP).
Consulta SQL Confidencial, Proprietário do Sistema e Banco do Participante:
`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
Origens de Dados:
  • <transactionViewName> (A): Fornece dados no nível da transação (IDs, números de bloco, referências de conta, valores, timestamps).
  • <accountsViewName> (B, C): Fornece mapeamento entre ACCOUNT_ID e ORG_ID.
Key Logic: A view usa UNION para mesclar resultados de três padrões de transação:
  1. Transações somente do remetente (por exemplo, casos de saída ou de gravação)
    • Condição: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID e A.TO_ACCOUNT_ID IS NULL.
    • Exclui o tipo de transação CREATE_ACCOUNT.
    • FROM_ORG_ID e TO_ORG_ID são derivados da organização do remetente (B.ORG_ID).
  2. Transações somente para receptor (por exemplo, casos de entrada ou semelhantes a hortelã)
    • Condição: A.TO_ACCOUNT_ID = C.ACCOUNT_ID e A.FROM_ACCOUNT_ID IS NULL.
    • FROM_ORG_ID e TO_ORG_ID são derivados da organização do recebedor (C.ORG_ID).
  3. Transferências Padrão (transações com remetente e destinatário)
    • Condição: A.FROM_ACCOUNT_ID = B.ACCOUNT_ID e A.TO_ACCOUNT_ID = C.ACCOUNT_ID.
    • FROM_ORG_ID vem da organização do remetente (B.ORG_ID), TO_ORG_ID da organização do recebedor (C.ORG_ID).
Por fim, os resultados são classificados em ordem decrescente de BLOCKNO para priorizar as transações mais recentes.
Colunas de Saída:
  • TRANSACTION_ID: Identificador exclusivo da transação.
  • BLOCKNO: Número do bloco em que a transação é registrada.
  • FROM_ACCOUNT_ID: ID da Conta do remetente (pode ser NULL para hortelã).
  • TO_ACCOUNT_ID: ID da Conta do receptor (pode ser NULL para gravação).
  • EARMARK: Marca de transação (também conhecido por TRANSACTION_EARMARK).
  • FROM_ORG_ID: ID da organização do remetente (ou o mesmo que o destinatário se o remetente for NULL).
  • TO_ORG_ID: ID da Organização do recebedor (ou igual ao remetente se o recebedor for NULL).
  • TRANSACTION_TYPE: Tipo de transação (por exemplo, transferência, hortelã, queima, etc.).
  • AMOUNT: Valor da transação.
  • CRDATE: Timestamp de criação da transação (TXNTIMESTAMP).