Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Blockchain Platformを用いたHyperledger Fabricアプリケーション開発 / Developing Hyperledger Fabric application with Oracle Blockchain Platform

gakumura
November 01, 2022

Oracle Blockchain Platformを用いたHyperledger Fabricアプリケーション開発 / Developing Hyperledger Fabric application with Oracle Blockchain Platform

2022/11/1 Blockchain GIG特別編 HLF集中講義#4 Oracle Blockchain Platformを用いたHLFアプリ開発 で話した内容
・Hyperledger FabricベースのBlockchain as a Service(BaaS)であるOracle Blockchain Platformを用いたシステム、アプリ、Chaincodeの開発について
・Oracle Blockchain Platformを利用すると素のHyperledger Fabricに比べてどのようなメリットがあるのか?何が楽になるのか?こんなこともできるようになる!など、エンタープライズブロックチェーンの本格的な実践にあたっての魅力

gakumura

November 01, 2022
Tweet

More Decks by gakumura

Other Decks in Technology

Transcript

  1. Oracle Blockchain Platformを
    用いたHLFアプリケーション開発
    Blockchain GIG特別編 HLF集中講義#4
    中村 岳
    クラウド事業統括/クラウド・エンジニアリング統括/ソリューション・アーキテクト本部
    2022/11/1

    View Slide

  2. Copyright © 2022, Oracle and/or its affiliates
    2
    中村 岳
    Twitter @gakumura
    はてなブログ @gakumura
    …主にHyperledger Fabric関連
    • 現職:ソリューションエンジニア@日本オラクル
    • 担当:Oracle Blockchain Platform、
    Blockchain Table
    • 前職:金融決済系SIerでパッケージ開発
    • SWIFT、CLS、日銀ネット関連の銀行間決済システム

    View Slide

  3. • 10/11(火): Hyperledger Fabric(再)入門
    • コンポーネントやトランザクションフローなど基本を解説
    • 10/18(火):Hyperledger Fabricのネットワーク設計
    • ブロックチェーンネットワークの設計の考え方、進め方を解説
    • 10/25(火):Hyperledger FabricアプリとChaincodeの開発
    • クライアントアプリケーションとChaincodeの開発方法を解説
    • 11/1(火):Oracle Blockchain Platformを用いたHLFアプリ開発
    • Oracle Blockchain Platformならではのメリット、開発方法を解説
    集中講義シリーズ
    Copyright © 2022, Oracle and/or its affiliates
    3

    View Slide

  4. 内容
    • Oracle Blockchain Platform概要
    • Oracle Blockchain Platformを用いたChaincodeの開発
    • Fine Grained Access Controlライブラリ
    • Blockchain App Builder
    • Fungible Tokenのトランザクション最適化
    • State DBにBerkeley DBを使用
    • Oracle Blockchain Platformを用いたアプリケーションの開発
    • REST Proxy
    • リッチヒストリーDB
    • Channelまたぎのアトミックトランザクション
    • XAサポート
    4 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  5. Oracle Blockchain Platform概要
    Copyright © 2022, Oracle and/or its affiliates
    5

    View Slide

  6. Hyperledger Fabricをベースにエンタープライズ利用向けPaaSとオンプレミスで提供
    • 数ステップで構築完了、GUIコンソールで管理・運用も容易
    • エンタープライズグレードの耐障害制、堅牢性
    • マルチクラウド、ハイブリッドクラウド、
    オープンなネットワーク構成が可能
    • Oracle独自の付加価値:
    • State DBとしてBerkeley DBを利用:パフォーマンスとクエリ利便性向上
    • 多機能なREST API:スマートコントラクトの利用を容易に
    • 台帳のデータをRDBに複製:大量照会、分析、データ統合
    • スマートコントラクトを容易に開発:付属の開発ツールでアセット仕様からコードを自動生成
    • 複数ChannelのアトミックトランザクションとXA対応:複数Channelでの更新のアトミックな実行
    や、ローカルのDB、MQなどとのグローバルトランザクションをサポート
    Oracle Blockchain Platform
    Copyright © 2022, Oracle and/or its affiliates
    東京DCからも
    サービス提供中
    6

    View Slide

  7. • 数ステップ、数分で構築完了
    • 必要なブロックチェーンネットワーク構成要素は自動でセットアップ
    • 構築後すぐにコンソール画面の利用やスマートコントラクトのデプロイが可能
    Pre-Assembled:簡単、高速に高機能なインフラを構築
    Copyright © 2022, Oracle and/or its affiliates
    7
    7

    View Slide

  8. 使いやすいコンソール画面と多機能なサービスAPIで運用、管理をサポート
    • 運用、監視、管理のための使いやすいコンソール画面および多機能なサービスAPIを提供
    • 必要となる運用、管理タスクをコンソール画面とAPI両方でカバー:
    …Hyperledger Fabricの難解な設定ファイル、コマンド、手順は習得不要
    • ノードの起動/停止
    • 設定の変更
    • ブロックチェーンネットワークのメンバー追加
    • 監視とトラブルシューティングも:
    • ネットワークの視覚化
    • リソース使用状況やノード死活情報
    • トランザクション処理状況
    Easy to Use:運用、管理の手間を削減
    Copyright © 2022, Oracle and/or its affiliates
    8
    8

    View Slide

  9. • Oracle Blockchain Platformだけでなく、
    他のHyperledger Fabricとのオープンなネットワーク構成が可能
    • オンプレミスバージョンの提供:
    Oracle Blockchain Platform Enterprise Edition(OBPEE)
    • 自社データセンターやOracle以外のクラウド(IaaS)上にOBPを構築
    • ブロックチェーン環境に必要な機能を事前定義、数クリックで環境構築
    • サポートするVM基盤:Oracle VirtualBoxとVMware vSphere
    • Oracle Blockchain Platform Cloud Service (OBPCS) と同等の機能を提供
    • APIは共通、アプリケーション移植性あり
    • アップデートもOBPCSと足並みを揃えて提供
    Open:オープンで柔軟なネットワーク
    Copyright © 2022, Oracle and/or its affiliates
    9
    9

    View Slide

  10. オンプレミス、マルチクラウド、ハイブリッドクラウドでの構成が可能
    Open:オープンで柔軟なネットワーク
    Copyright © 2022, Oracle and/or its affiliates
    オンプレミスベースの
    ブロックチェーンネットワーク
    3rd Party Cloud 3rd Party Cloud 3rd Party Cloud
    マルチクラウドの
    ブロックチェーンネットワーク
    ハイブリッドクラウドの
    ブロックチェーンネットワーク
    Oracle Blockchain Platform Cloud Service (クラウドサービス)
    Oracle Blockchain Platform EE (オンプレミス)
    オープンソースのHyperledger Fabric (手組ベース)
    10
    10

    View Slide

  11. Chaincodeとクライアントアプリケーションの開発に役立つ
    Oracle Blockchain Platformの独自の強み(素のHLFとの差分)
    Copyright © 2022, Oracle and/or its affiliates
    11
    Chaincode開発
    Fine Grained Access Controlライブラリ Chaincode内の細かな権限制御をオンチェーンで行うためのライブラリを提供
    Blockchain App Builder アセット仕様からのコード生成、デプロイ、テストまでカバーする開発補助ツールで
    Chaincodeの開発を容易に
    Fungible Tokenのトランザクション最適化 HLFの同一レコード更新のスループット制約を回避し、Fungible Tokenでの同一口座
    への高頻度な入出金のユースケースを扱うことが可能に
    State DBにBerkeley DBを使用 並列実行性向上によりスループットを改善し、加えてCouchDB互換のJSONリッチクエ
    リに加え、SQLリッチクエリが利用可能でクエリ表現力も向上
    クライアントアプリケーション開発
    REST Proxy クライアントアプリケーションはREST APIでChaincodeを呼び出すことができ、Fabric
    SDKの組み込みは不要に
    リッチヒストリーDB ブロックチェーン台帳上のデータをRDB(Oracle)に複製し、集計や分析、データ統合
    などのデータ活用性を向上
    Channelまたぎのアトミックトランザクション 別々のChannelでの複数トランザクションをアトミックに実行可能に(REST Proxyの利
    用が必要)
    XAサポート アプリケーションに組み込み、外部のトランザクションマネージャーを用いることで複数
    Channel間、およびOBPと他のXAリソース(DB、キューなど)間のグローバル分散トラ
    ンザクションが利用可能になるJavaライブラリを提供

    View Slide

  12. Oracle Blockchain Platformを用いた
    Chaincodeの開発
    Copyright © 2022, Oracle and/or its affiliates
    12

    View Slide

  13. Oracle Blockchain Platform内のサンプルChaincode
    Copyright © 2022, Oracle and/or its affiliates
    Balance Transfer
    • AとBのふたつの口座間での残高のやり取りを表現する最もシンプルなサンプル
    • 現在残高のクエリとA⇔B間の移転のみの機能で、Chaincodeの基礎の学習に最適
    Car Dealer
    • サプライチェーンのトレーサビリティを表現したサンプル
    • 自動車メーカーとディーラーの間でのパーツおよび自動車のやり取りが題材
    • パーツから自動車の組み立て(アセットの含有関係)もデータ構造として表現
    Marbles
    • Marble(おはじき)を題材としたNFT(Non-Fungible Token)のサンプル
    • 各MarbleはIDと色や大きさ、所有者などの属性を持つ
    • 台帳の範囲クエリやリッチクエリなど、Chaincodeの基本として覚えておくべきひととおりの操
    作が含まれる
    Marbles with
    Fine Grained ACLs
    • MarblesにFine-Grained Access Control Libraryを用いたアクセス制御を追加
    したサンプル
    Fiat Money Token
    • 複数の口座間、複数種類のトークンの残高のやり取りを表現するサンプル
    • 口座の作成、複数種類のトークンの発行と残高管理(照会、移転)など、Balance
    Transferよりも多機能な、Fungible Tokenの本格的サンプル
    13

    View Slide

  14. Chaincode内・オンチェーンでのアクセス制御を容易に実装するためのライブラリを提供
    • ブロックチェーン台帳上のデータへのアクセス権限を
    ブロックチェーン台帳上に記述して管理
    • Hyperledger Fabricの標準機能よりも細かく、かつ、
    扱いやすいアクセス権限制御を容易に実現
    以下の要素で権限を制御
    • リソース:アクセスを制御する対象
    • アイデンティティ:アクセスする企業やユーザー
    • グループ:アイデンティティのグループ
    • アクセス制御リスト:
    • どのアイデンティティ/グループに
    • どのリソースに対し
    • どのような操作(CREATE、READ、UPDATE、DELETE、etc.)を
    • 許可する/しない
    Fine-Grained Access Controlライブラリ
    Copyright © 2022, Oracle and/or its affiliates
    14
    詳細は以下のドキュメントを参照:
    https://docs.oracle.com/en/cloud/paas/blockchain-cloud/usingoci/using-fine-grained-access-control-library.html
    14

    View Slide

  15. Fine-Grained Access Controlライブラリの利用イメージ
    Copyright © 2022, Oracle and/or its affiliates
    Ledger
    Chaincode Identity: O=OrgA,
    CN=UserA1
    業務関数
    ACLチェック
    FGAC





    ACL管理
    関数
    業務データ
    ACL関連データ
    リソース グループ
    ACL
    Identity: O=OrgB,
    CN=UserB1
    アクセス権限制御のための
    データを台帳上で管理
    Chaincode関数内で
    権限チェックを実施
    Chaincode呼び出しの
    Identity(証明書)を組
    織レベルやユーザーレベルで
    グループ化して制御
    ACLの管理に関わる機能も関数として実装し、
    ACL管理関数の権限もACLで管理
    15
    15

    View Slide

  16. スマートコントラクトのローコード開発ツール
    • 一連のライフサイクル(開発、パッケージング、デプロイ、アップデート)に対応
    • ローカルなHyperledger Fabricネットワークを自動構成してデプロイ、テスト
    • リモートのOracle Blockchain Platformにデプロイ、テストも可
    • アセット仕様からプログラムを自動生成
    • 宣言的に記述したアセットの属性と振る舞いをもとにコードを自動生成
    • トークンの開発を強力にサポート
    • Fungible Token(FT)…金額やポイントの残高などを扱うユースケース
    • Non-Fungible Token(NFT)…唯一性を持ったモノに紐づくトークン
    例:サプライチェーンの物品の追跡、デジタルコンテンツ
    Blockchain App Builder:スマートコントラクト開発にかける時間を短縮
    Copyright © 2022, Oracle and/or its affiliates
    詳細は以下のドキュメントを参照:
    https://docs.oracle.com/en/cloud/paas/blockchain-cloud/usingoci/using-chaincode-development-tools.html
    16
    16

    View Slide

  17. Blockchain App Builderのトークン開発サポート
    • TTF(Token Taxonomy Framework)およびERCをベースとした標準に
    基づいたトークン仕様からコードとAPIを自動生成
    • トークンのメタモデル(例:Fungible)と振る舞い(例:Mintable、
    Transferable、Burnable)、カスタムメソッドをテンプレートに記述する
    ことでそれに合わせたコードとSDK(カスタムコード内で再利用可能)
    を生成
    • 30種類以上のトークンラッパー関数
    • ビルトインのロールベースドセキュリティ、アクセス制御機能を利用可能
    17 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  18. • Hyperledger Fabricは同一口座への高頻度の入出金が含まれるFungible Tokenのユースケー
    スが苦手
    • トランザクションフローのMVCCの仕組み上、台帳上の同一レコードの更新トランザクションを高頻度
    で実行するとRead Conflictエラーが多発し、結果的にスループットが低下する
    • Fungible Tokenの「同一口座への高頻度な入出金」がこれに該当
    • Oracle Blockchain Platformでは独自の改善によりこの課題を解決
    • Blockchain App BuilderでChaincodeを生成する際、専用のオプションを有効化しておくとその
    ChaincodeのトランザクションのMVCC(Multi-Version Concurrency Control)を最適化
    • オリジナルHyperledger Fabricでは苦手だった、同一口座の高頻度の入出金を含むユースケー
    スを扱うことが可能に
    • 最適化の詳細は以下のブログを参照:
    https://blogs.oracle.com/blockchain/post/obptokenoptimization
    独自のFungible Tokenトランザクション最適化
    Copyright © 2022, Oracle and/or its affiliates
    18
    18

    View Slide

  19. 例:同一口座へのほぼ同時の入金が片方Read Conflictエラーになるケース
    Copyright © 2022, Oracle and/or its affiliates
    19
    レコード:口座A残高
    初期残高value=0
    初期version=n
    Tx1
    口座Aに70送金
    Simulate(A)
    Simulate(x)
    RS-V (A) Commit(A)
    RS-V(x)
    Read Set:
    version=n
    Write Set:
    value=70
    version=n?
    OK
    version=n?
    NG
    Endorsement Ordering Validation
    Endorsement Ordering Validation
    version=n+1
    value=70
    Tx2
    口座Aに30送金
    Read Set:
    version=n
    Write Set:
    value=30

    View Slide

  20. OBPのFungible Tokenトランザクション最適化を適用した場合(単純化して記載)
    Copyright © 2022, Oracle and/or its affiliates
    20
    レコード:口座A残高
    初期残高value=0
    初期version=n
    Tx1
    口座Aに70送金
    Simulate(A)
    Simulate(x)
    Validate (A) Commit(A)
    Read Set:
    version=n
    Write Set:
    delta=+70
    version=n?
    ?Static Rule
    OK
    OK
    Endorsement Ordering Validation
    Endorsement Ordering Validation
    version=n+1
    value=0+70
    →70
    Tx2
    口座Aに30送金
    Read Set:
    version=n
    Write Set:
    delta=+30
    version=n?
    ?Static Rule
    Validate (A) Commit(A)
    version=n+2
    value=70+30
    →100

    View Slide

  21. OBPのFungible Tokenトランザクション最適化を適用した場合(単純化して記載)
    Copyright © 2022, Oracle and/or its affiliates
    21
    レコード:口座A残高
    初期残高value=0
    初期version=n
    Tx1
    口座Aに70送金
    Simulate(A)
    Simulate(x)
    Validate (A) Commit(A)
    Read Set:
    version=n
    Write Set:
    delta=+70
    version=n?
    ?Static Rule
    OK
    OK
    Endorsement Ordering Validation
    Endorsement Ordering Validation
    version=n+1
    value=0+70
    →70
    Tx2
    口座Aに30送金
    Read Set:
    version=n
    Write Set:
    delta=+30
    version=n?
    ?Static Rule
    Validate (A) Commit(A)
    version=n+2
    value=70+30
    →100
    Write Setに
    値そのものではなく
    差分(delta)を保持
    ValidationではRead Setのバージョン一致チェックを行わず、
    定義したStatic Ruleに
    照らしてチェック(例:残高がマイナスにならないか)
    Commit時、
    差分(delta)を
    Valueに反映

    View Slide

  22. 台帳に保存される「現在の値(ステート)」とそれを保持するデータベース
    World StateはKey-Valueストアで、Valueには任意の文字列やバイナリを格納可能
    • ChaincodeはWorld StateからKeyのValueを読み出し、書き込むことで
    台帳上のデータに対してのビジネスロジックを表現する
    • State DBと呼ばれるデータベースに保持される
    通常のHLFではState DBにはLevelDBかCouchDBを選択可能
    • LevelDB:シンプルなデータ構造を扱う場合向き(例:口座番号がKey/残高がValue)
    • Keyを指定するステート検索しかできない(単一指定or範囲指定)
    • CouchDB:複数の属性を持つValueを扱いやすい
    • JSON形式でValueを格納すると、Attributeを条件に指定して検索できる(リッチクエリ)
    • LevelDBに比べると低速な点、Phantom Read問題に係る制約には留意
    復習: HLFのWorld StateとState DB
    22 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  23. ある程度柔軟なデータ構造を扱え、State DBによる検索の表現能力もそこそこ
    復習:HLFのWorld Stateで扱うデータ構造の例
    Copyright © 2022, Oracle and/or its affiliates
    23
    Key:口座番号 Value:残高
    1020345 10,000,000
    1020346 56,400
    Key:アセット種別とID Value:アセット情報
    car^aaa111 {“color”:”red”, “price”:10000, “owner”:”Bob”, “drive”:”front”}
    car^bbb222 {“color”:”blue”, “price”:30000, owner”:”Alice”, “drive”:”AWD’}
    bike^xyz345 {“color”:”green”, “price”:30000, owner”:”Alice”, “CC”:”1800’}
    シンプルなKey-Value構造:口座
    複合キーとJSONを用いたKey-Value構造:アセット台帳
    Keyの値を指定してValueを読み取る/書き込む
    複合キーの利用や
    Key値の範囲指定のクエリも可
    State DBにCouchDBを使いValueをJSONにしておくと
    リッチクエリが使える
    (例:ownerがAliceのアセットを全件取得)

    View Slide

  24. State DBとしてBerkeley DBを採用、パフォーマンス&ロジック表現力を強化
    パフォーマンスの向上
    • スマートコントラクトの同時実行性の強化
    SQLリッチクエリのサポート
    • (値がJSONであれば)JSONの属性を指定してのSQL-
    Likeクエリが可能
    • COUNT,SUM,AVG,MIN,MAXなどの集計関数も利用可
    CouchDB互換のJSONリッチクエリも利用可能
    Enterprise Grade:エンタープライズ要件を満たす
    Copyright © 2022, Oracle and/or its affiliates

    ブロックチェーン:
    トランザクションと
    値の履歴を格納
    State DB
    (World State):
    現在の値を格納する
    データベース
    Hyperledger Fabricにおける
    台帳(Ledger)構成
    ※通常のHyperledger Fabricでは、
    State DBはLevelDBかCouchDB
    24
    24

    View Slide

  25. リッチクエリの例(JSON/SQL)
    Copyright © 2022, Oracle and/or its affiliates
    25
    {
    "fields": ["model", "manufacturer"],
    "selector": {
    "docType" : "vehicle",
    "owner" : "Sam Dealer“
    }
    }
    SELECT json_extract(valueJson, '$.model') AS model,
    json_extract(valueJson, '$.manufacturer') AS manufacturer FROM
    WHERE json_extract(valueJson, '$.docType') = 'vehicle’
    AND json_extract(valueJson, '$.owner') = 'Sam Dealer'
    SELECT COUNT(*) AS Count FROM WHERE
    json_extract(valueJson, '$.docType') = 'vehicle' AND
    json_extract(valueJson, '$.owner') = 'Sam Dealer'
    SELECT AVG(json_extract(valueJson, '$.price')) AS AveragePrice FROM
    WHERE json_extract(valueJson, '$.docType') = 'vehicle’
    AND json_extract(valueJson, '$.owner') = 'Sam Dealer'
    JSONリッチクエリ
    SQLリッチクエリ
    集合関数の利用例

    View Slide

  26. Blockchain App Builder(BAP)を用いた典型的なChaincode開発のフロー
    Copyright © 2022, Oracle and/or its affiliates
    26
    アセット仕様を記述
    しコードを生成
    OBPサンプルやHLF公式サンプルなどをベース、
    またはスクラッチでコードを記述
    生成したコードを
    カスタマイズ
    BAPの
    ローカルHLF環境で
    単体テスト
    OBP(テスト環境)
    上にデプロイ
    BAP or
    コンソール or
    REST API
    OBP(テスト環境)上でテスト
    BAP or RESTクライアントアプリケーション or
    Fabric SDKクライアントアプリケーション
    OBP(本番環境)
    上にデプロイ
    本番運用

    View Slide

  27. デモ①
    BAPでコードを生成してパッケージ
    Copyright © 2022, Oracle and/or its affiliates
    27

    View Slide

  28. Chaincodeの品質、生産性、ロジック表現力を向上
    Copyright © 2022, Oracle and/or its affiliates
    28
    Chaincode開発
    Fine Grained Access Controlライブラリ Chaincode内の細かな権限制御をオンチェーンで行うためのライブラリを提供
    Blockchain App Builder アセット仕様からのコード生成、デプロイ、テストまでカバーする開発補助ツールで
    Chaincodeの開発を容易に
    Fungible Tokenのトランザクション最適化 HLFの同一レコード更新のスループット制約を回避し、Fungible Tokenでの同一口座
    への高頻度な入出金のユースケースを扱うことが可能に
    State DBにBerkeley DBを使用 並列実行性向上によりスループットを改善し、加えてCouchDB互換のJSONリッチクエ
    リに加え、SQLリッチクエリが利用可能でクエリ表現力も向上
    クライアントアプリケーション開発
    REST Proxy クライアントアプリケーションはREST APIでChaincodeを呼び出すことができ、Fabric
    SDKの組み込みは不要に
    リッチヒストリーDB ブロックチェーン台帳上のデータをRDB(Oracle)に複製し、集計や分析、データ統合
    などのデータ活用性を向上
    +OBP上でテストがしやすく

    View Slide

  29. Oracle Blockchain Platformを用いた
    クライアントアプリケーションの開発
    Copyright © 2022, Oracle and/or its affiliates
    29

    View Slide

  30. Oracle Blockchain Platform(OBP)のコンポーネント
    Hyperledger Fabricのコンポーネント…HLFのアイデンティティでの認証
    • Peer
    • Orderer
    • Fabric CA
    独自のコンポーネント…Oracle Cloudのクラウドユーザーアカウントでの認証
    • コンソール:ユーザー向けにサービスとしてのUI(操作画面)とREST APIでコンポーネントや設定などの管理、運用、
    監視などの機能を提供
    • REST Proxy:Chaincode実行を仲介(後述)
    (補足)インスタンス
    • サービスとしての利用/デプロイ単位
    • インスタンスの中に上述のコンポーネントが含まれる
    • ひとつのOBPインスタンスはひとつの(HLFの)Organizationに対応する
    • インスタンス名はそのままOrganization名として使われる
    30 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  31. Peer
    Peer
    Orderer
    Orderer
    Node ID
    アイデンティティと認証(REST Proxy以外)
    • コンソール(UI/REST API)に対してはOracle Cloudの
    ユーザーアカウントで認証される
    • OBPインスタンス作成時、Administratorロールのユーザー用
    のHLFアイデンティティが作成される
    • インスタンス作成者のクラウドユーザーID名義
    • 秘密鍵&証明書はコンソールからダウンロード可能
    • コンソールから行うHLFオペレーション(Channel作成、
    Chaincodeデプロイなど)にはこのAdministratorアイデ
    ンティティが使われる
    • 各PeerやOrdererノードには自動的にCAから発行された
    HLFアイデンティティが付与される
    • ユーザー用のHLFアイデンティティは付属のFabric CAに対し
    てFabric CA Clientツールを用いることで作成も可能
    (素のHLFと同様)
    31 Copyright © 2022, Oracle and/or its affiliates
    コンソール
    Peer
    Orderer
    Fabric
    CA
    UI REST API
    Node ID
    Node ID
    Administrator ID
    ユーザー アプリ
    Cloud
    Identity
    管理
    クラウドID クラウドID
    OBPインスタンス
    クラウドユーザーIDとして認証

    View Slide

  32. REST APIでのブロックチェーン利用でアプリケーション開発が容易に
    REST Proxy概要
    Copyright © 2022, Oracle and/or its affiliates
    Oracle Blockchain
    Platform
    Fabric Peerノード
    台帳
    Chaincode
    アプリケーション
    Fabric SDK
    Fabric Peerノード
    台帳
    Chaincode
    RESTプロキシー
    Fabric SDK
    アプリケーション
    gRPC
    REST API
    32
    FabricのIdentity
    FabricのIdentity
    gRPC
    Oracle CloudのID管理
    サービスを利用して認証
    • Fabric SDKの
    組み込みが必須
    • アプリで管理する秘密
    鍵&証明書で認証
    ⇨アプリケーション開発者
    はFabricアプリ開発の習
    熟が必須
    通常のFabric利用アプリ開発 Oracle Blockchain Platform利用アプリ開発
    • アプリはREST APIで
    ブロックチェーンを容易
    に利用可能
    • クラウドのIDを用いて容
    易&セキュアに認証・認

    ⇨Webアプリ開発の一般
    的なスキルがあればOK
    32

    View Slide

  33. Peer
    Peer
    REST Proxy経由でのChaincode実行でのアイデンティティ
    • REST Proxyの抱えているHLFアイデンティティが使われる
    • デフォルトでは”{Organization名}_defaultuser”というID
    • REST Proxyに対してはOracle Cloudユーザーアカウントで認証される(Basic認証またはOAuth2トークン認証)
    33 Copyright © 2022, Oracle and/or its affiliates
    クライアントアプリ
    Cloud
    Identity
    管理
    クラウドID
    RESTプロキシー
    Fabric SDK
    XXX_defaultuser
    REST API
    認証/認可
    を確認
    Peer
    Peer
    Peer
    Peer
    自身のインスタンス内の
    (自身のOrgの)
    ノード
    Peer
    Peer
    Orderer
    Peer
    Peer
    Orderer
    他Orgの
    ノード

    View Slide

  34. REST APIでのChaincode実行に使われるHLFアイデンティティの変更
    • REST ProxyにはXXX_defaultuser以外のHLFアイデンティティの追加が可能
    • REST APIを呼ぶクラウドユーザーアカウントごとに異なるHLFアイデンティティを使わせることが可能
    • クラウドユーザーアカウント→HLFアイデンティティのマッピングを設定しておく
    • 該当しない場合XXX_defaultuserが利用される
    34 Copyright © 2022, Oracle and/or its affiliates
    RESTプロキシー内の
    クラウド→HLFのIDマッピング
    XXX_defaultuser
    [email protected]
    [email protected]
    [email protected]
    user1
    user2
    その他のユーザー
    クライアントアプリ
    クラウドID Peer
    Peer
    Peer
    Peer
    Peer
    Orderer

    View Slide

  35. 凡例
    D社
    C社
    B社
    A社
    ノード
    コンソーシアム型ブロックチェーンの一般的な概観
    Copyright © 2022, Oracle and/or its affiliates
    SC L
    ノード
    SC L
    ノード
    SC L
    ノード
    SC L
    アプリ
    ブロックチェーン
    プラットフォーム
    アプリ
    オペレーター
    他システム
    SC スマート
    コントラクト
    L 台帳
    A社の所管するシステムの範囲
    アプリ
    アプリ
    35
    ブロックチェーンノードは
    コンソーシアム内で分散して
    所有/管理/運用

    View Slide

  36. ノード
    ノード
    ブロックチェーンノード
    エンタープライズでのブロックチェーンを利用したシステムのイメージ
    Copyright © 2022, Oracle and/or its affiliates
    36
    台帳
    スマート
    コントラクト
    アプリ
    ケーション
    データベース
    既存
    データベース
    ユーザー
    アプリ連携
    データ統合
    ブロックチェーンと同内容
    のデータをDBに複製
    BIツール
    ERP、SCM等
    基幹システム
    ERP、SCM等
    基幹システム
    ERP、SCM等の
    基幹システムや
    他アプリケーション
    既存
    データベース
    既存
    データベース
    トランザクション発行
    36

    View Slide

  37. Quick Integration:他システムとの連携を迅速に実現
    RESTプロキシー+Oracle Integration Cloudを利用してのシステム連携
    37 Copyright © 2022, Oracle and/or its affiliates
    37
    Oracle Blockchain Platform
    ノード
    ノード
    ブロックチェーンノード
    台帳
    Chaincode
    (スマート
    コントラクト)
    REST
    プロキシー
    既存
    データベース
    ERP、SCM

    基幹システ

    ERP、SCM

    基幹システ

    ERP、SCM等の
    基幹システムや
    他アプリケーショ

    既存
    データベース
    既存
    データベース
    Oracle
    Integration
    Cloud
    Oracle Integration Cloud:ERP、SCMなどの基幹システムや
    各種SaaSとの連携を短期間で効率的に開発
    • Oracleはもちろん、他社のクラウド/オンプレミスのソフトウェアとの
    豊富なアダプターを利用(例:SAP、Salesforce、 NetSuite、
    Oracle SCM Cloud、各種データベース)
    • 申請→承認などのワークフローの作りこみや、 API管理も可能
    RESTプロキシーを通じて
    Oracle Integration Cloudを
    はじめとした様々なREST API
    対応の連携ツールを活用可能

    View Slide

  38. リッチヒストリーデータベース:Oracleデータベースにブロックチェーンのデータを複製
    • 台帳のデータをブロックチェーン外部のリレーショナルデータベースに複製
    • ブロックチェーンが苦手とする複雑な参照処理(集計、分析)を、
    データベース側で実装可能に
    • 多くの開発者が慣れ親しんでいるOracleデータベースでの開発
    • Oracle Analytics Cloudをはじめとした多種多様なBIツールの利用
    • 他システムとのデータ統合も一般的なツールとノウハウで容易に実現可能
    • ERP、SCMなどの基幹システムとブロックチェーンのデータを
    統合することで、データの価値を最大限に活用
    Quick Integration:他システムとの連携を迅速に実現
    Copyright © 2022, Oracle and/or its affiliates

    ブロックチェーン:
    トランザクション
    と値の履歴を格納
    State DB
    (World State):
    現在の値を格納
    台帳(Ledger)
    複製
    38

    View Slide

  39. 現在および過去のデータを複製することで、様々な用途と角度で利用可能
    リッチヒストリーデータベースによるブロックチェーン上のデータの複製
    Copyright © 2022, Oracle and/or its affiliates
    ブロックチェーン
    台帳
    対象のチャネルごとに以下のテーブルを作成し、
    ブロックチェーンのデータをほぼリアルタイム複製:
    • State:台帳上のレコード(Key-Valueセット)の現在の
    値を格納するテーブル
    ※内容は台帳上のWorld State/State DBと一致する
    • History:台帳上およびPrivate Dataのレコードの値の履
    歴(過去バージョン~現在バージョン)、更新トランザクション
    情報を格納するテーブル
    • Transaction Details:台帳上のトランザクションの履歴
    を格納するテーブル
    +内部用の連携セーブポイントを保存するテーブル(Lastテーブル)
    alphaのHistory
    alphaのState
    betaのState
    betaのHistory
    alpha
    チャネル
    beta
    チャネル


    betaの
    Transaction Details
    alphaの
    Transaction Details
    詳細は以下のドキュメントを参照:
    https://docs.oracle.com/en/cloud/paas/blockchain-cloud/usingoci/create-rich-history-database.html
    39
    39

    View Slide

  40. 台帳上のレコード(Key-Valueセット)の現在の値を格納
    リッチヒストリーデータベースのテーブル:State
    カラム データ種別 説明
    chaincodeId VARCHAR2(256) レコードを書き込んだChaincodeのID
    key VARCHAR2(1024) レコードのKey
    value VARCHAR2(4000) レコードのValue(JSON型でない場合にこちらのカラムに格納)
    valueJson CLOB レコードのValue(JSON型の場合にこちらのカラムに格納)
    blockNo NUMBER 更新トランザクションが何番目のブロックに格納されたか
    txnNo NUMBER 更新トランザクションがブロック内の何番目の位置に格納されたか
    40 Copyright © 2022, Oracle and/or its affiliates
    40

    View Slide

  41. 台帳上のレコードの値の履歴(過去バージョン~現在バージョン)を格納
    リッチヒストリーデータベースのテーブル:History
    台帳のレコードの値の履歴および更新トランザクション情報を格納
    カラム データ種別 説明
    chaincodeId VARCHAR2(256) レコードを書き込んだChaincodeのID
    key VARCHAR2(1024) レコードのKey
    txnIsValid NUMBER(1) 更新トランザクションが有効だったか
    value VARCHAR2(4000) レコードのValue(JSON型でない場合にこちらのカラムに格納)
    valueJson CLOB レコードのValue(JSON型の場合にこちらのカラムに格納)
    blockNo NUMBER 更新トランザクションが何番目のブロックに格納されたか
    txnNo NUMBER 更新トランザクションがブロック内の何番目の位置に格納されたか
    (⇒blockNo+txnNoでバージョン情報として機能)
    txnId VARCHAR2(128) 更新トランザクションのトランザクションID
    txnTimestamp TIMESTAMP 更新トランザクションのタイムスタンプ
    txnIsDelete NUMBER(1) レコードを消去するトランザクションかどうか
    41 Copyright © 2022, Oracle and/or its affiliates
    41

    View Slide

  42. 台帳上のトランザクションの履歴を格納
    リッチヒストリーデータベースのテーブル:Transaction Details①
    台帳のレコードの値の履歴および更新トランザクション情報を格納
    カラム データ種別 説明
    CHAINCODEID VARCHAR2(256) トランザクションのChaincodeのID
    BLOCKNO NUMBER トランザクションが何番目のブロックに格納されたか
    TXNNO NUMBER トランザクションがブロック内の何番目の位置に格納されたか
    TXNID VARCHAR2(128) トランザクションID
    TXNTIMESTAMP TIMESTAMP トランザクションのタイムスタンプ
    SUBMITTERCN,
    SUBMITTERORG,
    SUBMITTEROU
    VARCHAR2(512),
    VARCHAR2(512),
    VARCHAR2(512)
    トランザクション送信者の識別情報
    CHAINCODETYPE VARCHAR2(32) Chaincodeの記述言語(Go、Java、JavaScript)
    VALIDATIONCOD
    ENAME
    VARCHAR2(32) トランザクションのValidation結果のコード(VALID or INVALID+理由コード)
    ENDORSEMENTS CLOB トランザクションにEndorseしたPeerノードの識別情報
    INPUTS CLOB Chaincodeに引き渡された入力パラメーター
    EVENTS CLOB Chaincodeから発出したカスタムイベント名
    42 Copyright © 2022, Oracle and/or its affiliates
    42

    View Slide

  43. 台帳上のトランザクションの履歴を格納
    リッチヒストリーデータベースのテーブル:Transaction Details②
    台帳のレコードの値の履歴および更新トランザクション情報を格納
    カラム データ種別 説明
    RESPONSESTATUS NUMBER(0) Chaincodeが返却したレスポンスのステータス
    RESPONSEPAYLOAD VARCHAR2(1024
    )
    Chaincodeが返却したレスポンスのペイロード
    RWSET CLOB トランザクションのRWSet(Read-Write Set…読み書きした台帳上のレコードのKeyとバー
    ジョンやValueの値)
    BLOCKCREATORCN,
    BLOCKCREATORORG,
    BLOCKCREATOROU
    VARCHAR2(512),
    VARCHAR2(512),
    VARCHAR2(512)
    ブロックを生成したOrdererノードの識別情報
    CONFIGBLOCKNUMBER NUMBER(0) トランザクション時点で有効となっていたConfig Blockのブロックナンバー
    CONFIGBLOCKCREATO
    RCN,
    CONFIGBLOCKCREATO
    RORG,
    CONFIGBLOCKCREATO
    ROU
    VARCHAR2(512),
    VARCHAR2(512),
    VARCHAR2(512)
    トランザクション時点で有効となっていたConfig Blockを生成したOrdererノードの識別情報
    43 Copyright © 2022, Oracle and/or its affiliates
    43

    View Slide

  44. データベースに複製されたデータの利活用イメージ
    Copyright © 2022, Oracle and/or its affiliates
    44
    ブロックチェーン:
    トランザクション
    と値の履歴を格納
    State DB
    (World State):
    現在の値を格納
    JSON 単純型
    • Key-Value型でデータ
    を保持
    • ValueはJSONや単純
    データ型(文字列、数
    値など)
    スマート
    コントラクト
    ブロックチェーン データベース 各種ツール
    • 現在のState
    • 過去バージョンのState
    • トランザクション履歴
    の情報をテーブルとして保持
    データベース向けの様々なツールも利用し、
    高度、高速なデータ利活用
    • スマートコントラクトの代替としてアプリケー
    ションからテーブル上のデータをクエリ
    • JSONの内容を別テーブルにコピーしカラム
    に展開
    • 高度な集計や分析の実行
    • 他のシステムやデータベースとのデータ統合
    Data
    Integration
    GoldenGate
    Analytics
    Visual Builder
    APEX
    アプリ開発
    Graph
    データ統合
    分析
    ERP、SCM、CRM
    アプリ連携
    Integrations
    複製

    View Slide

  45. グラフ分析×ブロックチェーン上のデータ ユースケースの例
    • 資金の移動元と移動先を分析
    • マネーロンダリングや不正などが疑
    われる支払いを検出
    • 製品、部品、サプライヤーの関係
    を可視化/分析
    • トレーサビリティを実現するとともに、
    よりリスクに強く最適なサプライ
    チェーンを構築
    • ユーザー同士、ユーザーと店舗、
    ブランドの関係を分析
    • ユーザープロファイルの構築とリコメ
    ンデーションなどへの応用
    45 Copyright © 2022, Oracle and/or its affiliates
    デジタル通貨/ペイメント サプライチェーン マーケットプレイス/コミュニティ

    View Slide

  46. デモ②
    コンソールで
    Chaincodeをデプロイして
    REST APIで実行
    &RDBに複製
    Copyright © 2022, Oracle and/or its affiliates
    46

    View Slide

  47. 復習:アプリケーションはしばしば複数のデータストアを扱う
    アプリ自身のデータベース、社内の別システム、複数のChannelなどなど……
    • 単独Channelでの更新トランザクションはHLFの機能で整合性を保護できる
    • しかし、アプリケーションから見て以下のようなケースで複数データストアを扱っている場合、それらの間の整合性保護は
    HLFでは担保できないので、アプリケーション側で作りこむ必要がある
    • アプリケーションが個別に持つデータストアと台帳を同時に更新したい場合
    • 複数Channelの台帳を同時に更新したい場合
    47 Copyright © 2022, Oracle and/or its affiliates
    アプリ
    RDB
    社内の
    別システム
    Peer
    他参加者
    アプリ
    Peer
    他参加者
    アプリ
    Peer
    Channel X
    Channel Y
    Channel Z

    View Slide

  48. REST Proxyによる複数Channel間アトミックトランザクションのサポート
    • 2フェーズコミットを用いたアトミックトランザクションをサポート
    • セットに含めた全てのトランザクションが揃ってコミット(反映)、
    またはロールバック(撤回)される
    • Chaincodeロジックの改修は不要
    • Hyperledger Fabricを用いるうえで課題となりがちな
    複数Channel間での更新の整合性担保を容易に
    • 例:Channel1でNFTの所有者を更新しつつ、
    Channel2で代金としてコインの残高を移転
    • REST ProxyのatomicTransactionsエンドポイントを使用
    • Fabric SDK/gRPCでアトミックトランザクションを行いたい
    場合は、後述のXAライブラリを利用
    詳細は以下の記事を参照
    https://blogs.oracle.com/oracle4engineer/post/introducing-atomic-cross-channel-
    updates-in-oracle-blockchain-jp
    48 Copyright © 2022, Oracle and/or its affiliates
    クライアント
    アプリケーション
    REST Proxy
    Channel 1
    REST API:
    atomicTransactions [
    {Ch1でのTx1},
    {Ch2でのTx2}
    ]
    {Ch1でのTx1}
    Channel 2
    {Ch2でのTx2}
    アトミック
    Blockchain

    View Slide

  49. 2フェーズコミット(2PC)とは?
    • 分散トランザクションの手法のひとつ
    • 複数の独立したシステムが参加するトランザクションの結
    果の整合性を保つ
    • 全参加者が揃って{反映する | 撤回する}のどちらかにし、
    一部の参加者のみが反映する状況を防ぐ
    …トランザクションの原子性(atomicity)
    • 準備フェーズと確定フェーズのふたつのフェーズでトランザクショ
    ンを行う
    • 準備フェーズでは参加者にそれぞれの部分トランザクション
    がコミット可能か問い合わせる(→Prepare要求)
    • すべての参加者がコミット可能と回答した場合、確定
    フェーズで全参加者にコミットさせる(→Commit要求)
    49 Copyright © 2022, Oracle and/or its affiliates
    準備
    フェーズ
    確定
    フェーズ

    View Slide

  50. 2PCでのロールバック
    • 準備フェーズで参加者のうちひとつでもOK以外になった
    (NG回答あるいは応答なし)場合には確定フェーズで
    全員にコミットではなくロールバックさせる
    • したがって、ロールバックできない参加者に対しては2PCの
    仕組みを使えない
    • ブロックチェーン一般にはロールバックという仕組みがない
    ので2PCは基本的に適用できない
    50 Copyright © 2022, Oracle and/or its affiliates
    準備
    フェーズ
    確定
    フェーズ

    View Slide

  51. REST ProxyのatomicTransactionエンドポイントへのリクエスト例
    • アトミックに行いたい複数のトランザクションを配列に含めて送付
    • それぞれにChannel名、Chaincode名、引数などを指定
    51 Copyright © 2022, Oracle and/or its affiliates
    {
    "transactions": [
    {"chaincode":"obcs-marbles","args":["transferMarble", "marble1", "smith"],"timeout":0,
    "channel":"goods"},
    {"chaincode":"obcs-example02","args":["pay", "smith", "garcia", "50"],"timeout":0,
    "channel":"wallet"}
    ],

    }

    View Slide

  52. REST Proxyによる2PC(ベースのモデル)の仕組み概要
    • REST Proxyが受け取ったリクエストに含まれるトランザクションそれぞれについて、ふたつのフェーズのHLFトランザクション
    に分解し、コーディネートして実行
    1. PrepareフェーズのHLFトランザクション
    2. Commit(Prepare失敗時はRollback)フェーズのHLFトランザクション
    52 Copyright © 2022, Oracle and/or its affiliates
    クライアントアプリ
    transactions [
    {Ch1でのTx1},
    {Ch2でのTx2}
    ]
    REST Proxy
    Tx1のPrepare
    Tx2のPrepare
    Tx1のCommit
    Tx2のCommit
    atomicTransaction
    Prepareフェーズ
    Commitフェーズ

    View Slide

  53. OBPの2PCモデルにおけるHLFトランザクション
    独自改善により、PeerがPrepare/Commit/RollbackフェーズのトランザクションについてはEndorsementと
    Validation/Commitでの処理を分岐
    • Prepareフェーズ:
    • (更新対象のKey-Valueを直接更新するのではなく)
    更新内容をステージするKey-Value(→staged_kv)を別に追加する
    • 更新対象のKVのロックを表すデータを追加する
    • Commitフェーズ:
    • staged_kvとして保存されている更新内容を更新対象のKVに反映し、staged_kvは削除する
    • ロックを削除する
    • Rollbackフェーズ:staged_kvとロックを削除する
    詳細は以下の記事を参照
    https://blogs.oracle.com/oracle4engineer/post/introducing-atomic-cross-channel-updates-in-oracle-blockchain-jp
    53 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  54. atomicTransactionエンドポイントのレスポンス例(成功パターン)
    {
    "returnCode": "Success",
    "result": {
    "transactions": [
    {
    "channel": "goods",
    "chaincode": "obcs-marbles",
    "txstatus": "Committed",
    "prepare": {
    "txid": "fe262233"
    },
    "commit": {
    "txid": "badcb3b4"
    },
    "rollback": {}
    },
    (↗に続く)
    {
    "channel": "wallet",
    "chaincode": "obcs-example02",
    "txstatus": "Committed",
    "prepare": {
    "txid": "9caf809c"
    },
    "commit": {
    "txid": "1594d0ab"
    },
    "rollback": {}
    }
    ],
    "globalStatus": "Success",
    "globalTxid": "259910a26006",

    54 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  55. atomicTransactionエンドポイントのレスポンス例(失敗パターン)
    {
    "returnCode": "Failure",
    "result": {
    "transactions": [
    {
    "channel": "goods",
    "chaincode": "obcs-marbles",
    "txstatus": "Rolledback",
    "prepare": {
    "txid": "fe262233"
    },
    "commit": {},
    "rollback": {
    "txid": "badcb3b4"
    },
    },
    (↗に続く)
    {
    "channel": "wallet",
    "chaincode": "obcs-example02",
    "txstatus": "FailedPrepare",
    "prepare": {
    "error": "failed to invoke chaincode. 'smith'
    doesn’t have enough tokens to pay 'garcia'"
    },
    "commit": {},
    "rollback": {
    "error":"skipping rollback since prepare stage
    has failed or was skipped"
    }
    }
    ],
    "globalStatus": "Failure",
    "globalTxid": "259910a26006",

    55 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  56. 外部トランザクションマネージャによるXAグローバル分散トランザクションのサポート
    • 分散トランザクションの標準であるX/Open XAに対応し、
    Oracle Blockchain PlatformをXAリソースとして扱えるように
    • 分散トランザクションの一部としてブロックチェーンのトランザクションを
    実行することが可能
    • 2フェーズコミットにより、セットでのコミットまたはロールバック
    • エンタープライズで求められるデータ整合性の担保が容易に実装可能
    • 複数Channel間でのアトミックトランザクション
    • データベース、メッセージキューなど他のXA対応リソースとのアト
    ミックなトランザクション
    • クライアントアプリケーションをJavaで実装し、OBPXAResource、
    OBPXADataSource、OBPXAConnectionなどのライブラリを用いるこ
    とで利用可能
    56 Copyright © 2022, Oracle and/or its affiliates
    Ch1 Ch2 MQ DB
    Blockchain 他のXAリソース
    クライアントアプリケーション
    Tx Managerライブラリ
    OBP XA
    ライブラリ
    他XAリソース
    ライブラリ
    トランザクションマネージャ
    Tx Tx Tx Tx
    アトミック

    View Slide

  57. まとめ
    Copyright © 2022, Oracle and/or its affiliates
    57

    View Slide

  58. Hyperledger Fabricをベースにエンタープライズ利用向けPaaSとオンプレミスで提供
    • 数ステップで構築完了、GUIコンソールで管理・運用も容易
    • エンタープライズグレードの耐障害制、堅牢性
    • マルチクラウド、ハイブリッドクラウド、
    オープンなネットワーク構成が可能
    • Oracle独自の付加価値:
    • State DBとしてBerkeley DBを利用:パフォーマンスとクエリ利便性向上
    • 多機能なREST API:スマートコントラクトの利用を容易に
    • 台帳のデータをRDBに複製:大量照会、分析、データ統合
    • スマートコントラクトを容易に開発:付属の開発ツールでアセット仕様からコードを自動生成
    • 複数ChannelのアトミックトランザクションとXA対応:複数Channelでの更新のアトミックな実行
    や、ローカルのDB、MQなどとのグローバルトランザクションをサポート
    Oracle Blockchain Platform
    Copyright © 2022, Oracle and/or its affiliates
    東京DCからも
    サービス提供中
    58

    View Slide

  59. • 10/11(火): Hyperledger Fabric(再)入門
    • コンポーネントやトランザクションフローなど基本を解説
    • 10/18(火):Hyperledger Fabricのネットワーク設計
    • ブロックチェーンネットワークの設計の考え方、進め方を解説
    • 10/25(火):Hyperledger FabricアプリとChaincodeの開発
    • クライアントアプリケーションとChaincodeの開発方法を解説
    • 11/1(火):Oracle Blockchain Platformを用いたHLFアプリ開発
    • Oracle Blockchain Platformならではのメリット、開発方法を解説
    集中講義シリーズ
    Copyright © 2022, Oracle and/or its affiliates
    59

    View Slide

  60. Thank you
    60 Copyright © 2022, Oracle and/or its affiliates

    View Slide

  61. Copyright © 2022, Oracle and/or its affiliates

    View Slide