Oracle CloudのAlways FreeのATPのAPEXを使って作った我が家の体重管理アプリを、Blockchain Tablesで改ざんできないようにした

#背景
以前、[「Oracle CloudのAlways FreeのAPEX環境を使って、我が家の体重管理アプリを作ってみた」](https://qiita.com/maato/items/2a69b364a224eb2422b4)という記事で、Oracle Cloudの無料環境のAlways Freeを使って、我が家の体重管理をするアプリを作成しましたが、息子が過去の体重データを改ざんしていることが判明。「このままではサンタのプレゼントの査定に影響があるぞ」と話したところ、「管理者のパパが勝手にデータを変えているのじゃないか？」と疑念をつきつけられてしまったので、改ざんできないデータベースである、「Blockchain Tables」を使って、改ざんできない体重管理アプリを作成しました。

#Blockchain Tablesとは
Oracle Database 21cで正式にリリースされたテーブル機能です。テーブルに挿入された行が暗号化ハッシュ化され、前の行とチェーンでつながっています。これにより、挿入のみのテーブルが作成され、ユーザーはブロックチェーン表の行を更新したり削除したり、テーブルの削除ができません。つまり、Insert-Onlyで改ざんができないテーブルとなります。詳細は下記参考文献を参照ください。

#参考文献
###実施に参考になるリンク
####APEX、Always Free、Autonomous Database関連
- [Qiita記事： Oracle CloudのAlways FreeのAPEX環境を使って、我が家の体重管理アプリを作ってみた](https://qiita.com/maato/items/2a69b364a224eb2422b4)

####Blockchain Tables関連
- [Blockchain TablesによるOracle Databaseのコンバージドデータベースの拡張](https://blogs.oracle.com/oracle4engineer/blockchain-table)
- [Blockchain Tablesドキュメント](https://docs.oracle.com/en/database/oracle/oracle-database/21/admin/managing-tables.html#GUID-43470B0C-DE4A-4640-9278-B066901C3926)
- [Oracle CloudでOracle Database 20c(プレビュー)のBlockchain Tableを使ってみた話](https://miyacle.com/2020/07/oracle-cloud%E3%81%A7oracle-database-20c%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AEblockchain-table%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E8%A9%B1/)
- [Oracle Database 21cのご紹介](https://blogs.oracle.com/oracle4engineer/column_db21c)

####Blockchain関連
- [複数組織間のデータ持ち寄り、共有とエンタープライズブロックチェーン](https://gakumura.hatenablog.com/entry/Why-Enterprise-Blockchain)

#作成手順
以下のような手順で実施します。
1.Oracle Always Free環境を入手する
2.Oracle Autonomous Transaction Processing(ATP) を構築、起動する
3.APEX セットアップ（Work Spaceの作成）
4.APEXを使ってアプリケーションを作成する
　4-0.作りたいものをデザインする
　4-1.必要なテーブルを作る（含むBlockchain Tables）
　4-2.アプリケーションを作る
　4-3.アプリケーションを修正する
5.アプリを確認する
＊今回はレイアウトや機能を絞り込み、Blockchain Tablesの動作を確認できる、最低限のアプリを作成しました。その他の詳細は、参考文献にあるQiita記事を参照ください。

###1.Oracle Always Free環境を入手する
上記参考文献のQiita記事を参考に、Oracle CloudのFree Tierにアカウントを登録し、Oracle Cloudの環境を使えるようにします。参考文献「Oracle Database 21cのご紹介」に記載のあるとおり、2020/12現在で、Always Free ServiceのAutonomous Databaseで21cが使えるのは、ホームリージョンがAshburn、Phoenix、Frankfurt、Londonリージョンのみとなりますのでご注意ください。今回はAshburnで作成しています。

###2.Oracle Autonomous Transaction Processing(ATP) を構築、起動する
ATPを作成します。データベースのバージョンは21cを選択してください。Always Free環境は１コア限定ですが、我が家の体重管理アプリなので、十分ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/88a0078e-c979-5817-7493-b131fc351126.png)

###3.APEX セットアップ（Work Spaceの作成）
上記参考文献のQiita記事を参考に、APEX用のユーザーとWorkSpaceを作成します。

###4.APEXを使ってアプリケーションを作成する
いよいよアプリケーションを作ります。

####4-0.作りたいものをデザインする
今回も前回と同様なものを作ります。が、今回はレイアウトなどは最低限とします。

####4-1.必要なテーブルを作る
今回も2つのテーブルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/5b1e349a-b1ae-7535-1259-5d395f0f5f07.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/8d7f4c04-95cf-4748-b8b5-3a62525df75f.png)

この「WEIGHT」表を、Blockchain Tablesとして、Insert-Onlyのテーブルとします。
今回はAPEXの、「SQLワークショップ」の中にある、「SQLコマンド」機能を使ってスクリプトで作成しました。

```sql
CREATE TABLE USERS (
	user_id number not null constraint users_id_pk primary key,
	NAME varchar2(20),
	Password varchar2(20)
);

CREATE BLOCKCHAIN TABLE WEIGHT (
	user_id number not null,
	measured_date date,
	weight number,
	memo varchar2(4000)
)
	NO DROP UNTIL 31 DAYS IDLE
	NO DELETE LOCKED
	HASHING USING "SHA2_512" VERSION "v1"
;
```
このようにBlockchain Tablesは最低限3つの必須項目があります。
　NO DROP：Dropを禁止するか、可能となる最後の更新からの最低日数を指定します。
　NO DELETE：削除を禁止するか、可能となる行の挿入からの最低日数を指定します。
　HASHING USING： 行のハッシュ計算にSHA2アルゴリズムを512bitの出力長で用いることを指定しています。
データ入力前はDrop Tableもできるのですが、入力後はDropできません。またALTER TABLEによる変更もほとんどできないので、最初にきちんと設計することをおすすめします。

####4-2.アプリケーションを作る
新規アプリケーションの作成からアプリケーションを作成します。

####4-3.アプリケーションを修正する
作ったアプリケーションにページを追加したり、修正します。
今回も「ホーム画面（グラフ表示）」、「ユーザーの登録画面」、「体重の入力画面」の3つを作ります。

#####1）ユーザーの登録画面の作成
今回は「フォーム付きレポート」で作成しています。
USERS表を指定し、主キーはROWIDとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/3d6b37fa-4457-b7f1-6603-62b67664e889.png)

#####2）体重の入力画面の作成
ユーザーの登録画面と同様に、「フォーム付きレポート」で作成しています。
WEIGHT表を指定し、主キーはROWIDとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/68beed7d-01cb-fc8b-d4da-302f40b7c67a.png)

体重の入力画面のID入力は、USERS表からSQL分を使ったLOVを設定し、名前を選択することで入力できるようにします。LOVの設定は、前回の参考資料のQiita記事を参照ください。

#####3）ホーム画面にグラフを表示する
ホーム画面にグラフを表示します。こちらも前回の参考資料のQiita記事を参照ください。
なお、この時グラフを作成するために使用するSQLは下記です。
普通のデータベーステーブルと、Blockchain TablesをJoinする形になっているところがポイントです。

```sql
Select u.name, w.measured_date, w.weight
From weight w join users u on w.user_id=u.user_id
```

###5.アプリを確認する
ケータイでアプリにログインし、画面を確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/531a819d-20fd-dff5-c8ad-e47191c8e0b0.png)

また、WEIGHT表はこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/8bdfcbeb-7b6e-9c45-830e-f3e88463e262.png)
作成を押すと下の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/414b738c-e8cb-c383-38a6-21c3c8cd2707.png)


#改ざんテスト
本当に更新や削除ができないか、テストを実施します。
1.アプリ画面から確認
2.SQL文で確認
###1.アプリ画面から確認
Blockchain TablesはWEIGHT表なので、入力した体重を更新し、「変更の適用」を押すと下記エラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/94ff9fe9-a00b-edeb-b64b-8ebb0cf13fd5.png)
行の削除でも同様のエラーが表示されます。

###2.SQL文で確認
テーブルを作成したときと同様に、「SQLワークショップ」の中にある、「SQLコマンド」機能を使って下記スクリプトで行の削除、行のUpdate、テーブルの削除を実施します。

```sql
delete from weight where user_id=200
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/08ed2456-af94-9836-a935-0c4635379ec4.png)

```sql
UPDATE WEIGHT SET weight = 1000 WHERE user_id=100;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/08ed2456-af94-9836-a935-0c4635379ec4.png)


```sql
drop table weight
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109157/0af86365-d489-c953-38bc-2dddbae0553a.png)



確かに、変更、削除、テーブルの削除ができません。
地味。。。。

#Blockchain Tablesを使ってみて
Blockchain Tablesを使ってみての感想です。
・Oracle Databaseの一部なため、構築、利用がとても楽
・既存アプリやアーキテクチャを有効活用できる
・SQLはもちろん、APEXからも普通のテーブルのように利用でき、また他の通常のテーブルと組合わせたクエリも全く違和感なく普通にできる

耐改ざん性を求められ、単一の企業または複数組織で使うが中立機関が存在して運営する場合は、圧倒的に楽で便利ですね。
まさに「Insert-Onlyな（中央集権な）データベース」です。
一方、複数組織による、非中央集権なデータの持ち寄り、は従来のいわゆるブロックチェーンの活用になるかと思います。これについては、参考文献「複数組織間のデータ持ち寄り、共有とエンタープライズブロックチェーン」が非常に深く、わかりやすいかと思います。

あと、やっぱり、APEXでのローコード開発、楽だなあ


#今後の展開
今回はOracle CloudのAlways FreeのATPのAPEXとOracle Database 21cの機能の、Blockchain Tablesを使って、改ざんできない家庭用の体重管理アプリを作成してみましたが、多少の修正を加えながら、アイデア次第で、使用用途の可能性は無限大にありそうです。

例えば家庭用途だと、
　・家族でそこまで耐改ざん性を求められるものって、あるだろうか。。
例えば業務だと、
　・法律上確実な保存が要求される契約などの文章管理
　・アクセスログ管理、操作管理、監査証跡のログ保存、フォレンジック対応
　・内部監査のための会計データ、台帳データ、財務データ、勤怠情報、コンプライアンスデータの保存
　・クリアリングハウスやSaaSソリューションでの耐改ざん性や、データ照合
今までも「管理者ですら更新や削除ができないデータベース」のニーズは多かったのではないでしょうか。主に一企業内/一組織内での内部不正、改ざん防止、監査対応、など、ユースケースは広いと思います。

なお、今回利用しているAPEXおよびBlockchain Tablesは、ExadataベースのAutonomous Database上で起動しています。

**Exadataで我が家の改ざんできない体重管理！
いよいよ、一家にExadata一台とブロックチェーン、の時代がやってきました！**


#最後に
まあ確かに「そこまで家庭で耐改ざん性を求める必要なくね？」っていう意見もあるかと思います。

だけど、こんな時代ですし、せっかくある機能を、**まず自分でやってみる**、というのも重要なんじゃないでしょうか。
それがクラウドの醍醐味ですし、今回のAlways Free環境だと、なんと無料で始めることもできます。始めるためのハードルは、確実に下がってきています。

**何より、インフラレベルで耐改ざん性を高めることで、少しでも家庭や社会の「正当性を確認する」ための手間暇、ストレス、不安が削減されて、お互いに安泰な生活ができて、ぐっすり寝れて、素敵なクリスマスを迎えるって、とっても素敵なことだと思いませんか！**

#### ぜひ皆さんも、Let's Enjoy Development! & Merry X'mas!!



--------
（修正）
・グラフ作成のSQLを追加しました
・SQL文でのDelete、Update、Drop Tableのログ画面を追加しました