Mô hình sử dụng Blockchain table trong Oracle

Khi bạn nghe từ “blockchain”, chúng ta thường nghĩ đến các thuộc tính liên quan đến thông tin chống giả mạo, với các thuật ngữ như “immutability”, “cryptographic digests”, “cryptographic signatures”, v.v.
Do đó, khi nói đến các bảng blockchain trong database, chúng ta cần một cơ chế để lưu trữ siêu dữ liệu bổ sung đó với các hàng được lưu trữ trong bảng blockchain.

SQL>
SQL> CREATE blockchain TABLE bc1 (c1 char(10), c2 char(10))
  2  no drop until 0 days idle no delete until 31 days after insert hashing using "sha2_512" version v1;

Table created.

SQL>
SQL> insert into bc1 values ('x','x');

1 row created.

SQL> select * from bc1;

C1         C2
---------- ----------
x          x

SQL> commit;

Commit complete.

Khi đó, DESCRIBE hoặc là truy vấn các bảng XXX_TAB_COLS không trả về thông tin gì khác lạ

SQL> desc bc1
 Name                          Null?    Type
 ----------------------------- -------- -------------
 C1                                     CHAR(10)
 C2                                     CHAR(10)

SQL> select column_name,data_type,data_length
  2  from   user_tab_columns
  3  where  table_name = 'BC1';

COLUMN_NAME                    DATA_TYPE                      DATA_LENGTH
------------------------------ ------------------------------ -----------
C1                             CHAR                                    10
C2                             CHAR                                    10

nhưng danh sách thực sự của các cột cho bảng blockchain có thể được truy vấn qua USER_TAB_COLS.

SQL> select column_name,data_type,data_length
  2  from   user_tab_cols
  3  where  table_name = 'BC1';

COLUMN_NAME                    DATA_TYPE                      DATA_LENGTH
------------------------------ ------------------------------ -----------
C1                             CHAR                                    10
C2                             CHAR                                    10
ORABCTAB_INST_ID$              NUMBER                                  22
ORABCTAB_CHAIN_ID$             NUMBER                                  22
ORABCTAB_SEQ_NUM$              NUMBER                                  22
ORABCTAB_CREATION_TIME$        TIMESTAMP(6) WITH TIME ZONE             13
ORABCTAB_USER_NUMBER$          NUMBER                                  22
ORABCTAB_HASH$                 RAW                                   2000
ORABCTAB_SIGNATURE$            RAW                                   2000
ORABCTAB_SIGNATURE_ALG$        NUMBER                                  22
ORABCTAB_SIGNATURE_CERT$       RAW                                     16
ORABCTAB_SPARE$                RAW                                   2000

Các bảng blockchain sẽ cho hiệu suất hoàn toàn tốt giống như bất kỳ bảng heap nào khác trong cơ sở dữ liệu Oracle.
Chúng ta hãy bắt đầu thử với một bảng blockchain như sau:

SQL> CREATE blockchain TABLE bc1 (c1 char(10), c2 char(10))
  2  no drop until 0 days idle no delete until 31 days after insert hashing using "sha2_512" version v1;

Table created.

SQL> insert into bc1 values ('x','y');

1 row created.

Không giống như các cột thông thường, các cột dữ liệu blockchain không được insert dữ liệu vào

SQL> select
  2   ORABCTAB_SEQ_NUM$
  3  ,ORABCTAB_SPARE$
  4  ,ORABCTAB_USER_NUMBER$
  5  ,ORABCTAB_HASH$
  6  ,ORABCTAB_SIGNATURE$
  7  ,ORABCTAB_SIGNATURE_ALG$
  8  ,ORABCTAB_SIGNATURE_CERT$
  9  ,ORABCTAB_CHAIN_ID$
 10  ,ORABCTAB_INST_ID$
 11  ,ORABCTAB_CREATION_TIME$
 12  from bc1
 13  @pr
==============================
ORABCTAB_SEQ_NUM$             :
ORABCTAB_SPARE$               :
ORABCTAB_USER_NUMBER$         :
ORABCTAB_HASH$                :
ORABCTAB_SIGNATURE$           :
ORABCTAB_SIGNATURE_ALG$       :
ORABCTAB_SIGNATURE_CERT$      :
ORABCTAB_CHAIN_ID$            :
ORABCTAB_INST_ID$             :
ORABCTAB_CREATION_TIME$       :

PL/SQL procedure successfully completed.

Các cột này chỉ được điền khi kết thúc giao dịch:

SQL> commit;

Commit complete.

SQL> select
  2   ORABCTAB_SEQ_NUM$
  3  ,ORABCTAB_SPARE$
  4  ,ORABCTAB_USER_NUMBER$
  5  ,ORABCTAB_HASH$
  6  ,ORABCTAB_SIGNATURE$
  7  ,ORABCTAB_SIGNATURE_ALG$
  8  ,ORABCTAB_SIGNATURE_CERT$
  9  ,ORABCTAB_CHAIN_ID$
 10  ,ORABCTAB_INST_ID$
 11  ,ORABCTAB_CREATION_TIME$
 12  from bc1
 13  @pr
==============================
ORABCTAB_SEQ_NUM$             : 1
ORABCTAB_SPARE$               :
ORABCTAB_USER_NUMBER$         : 107
ORABCTAB_HASH$                :
0924C163458DE1FA3A7FFEA38ADA1852A409ADBF859A453E83A429BE3DB9F119C28828FFDB7BD101C5695C9CFCD82364F0B933B1E442B3CFCDE037D20CFDB631
ORABCTAB_SIGNATURE$           :
ORABCTAB_SIGNATURE_ALG$       :
ORABCTAB_SIGNATURE_CERT$      :
ORABCTAB_CHAIN_ID$            : 18
ORABCTAB_INST_ID$             : 1
ORABCTAB_CREATION_TIME$       : 30-JUL-21 06.04.12.738166 AM +00:00

PL/SQL procedure successfully completed.

Đây là điều mà bạn có thể sẽ không bao giờ nhận thấy vì phần lớn các trường hợp sử dụng cho các bảng blockchain là kiểu hoạt động điển hình của OLTP nơi các giao dịch có thời lượng nhỏ và tần suất cao.