| Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation.
| 85 豊富なREST API Framework – Transactions/Queries/Events Transactions and Queries Events • Get version (of REST proxy) • Query chaincode function • Get transaction ID • Invoke transaction synchronously • Invoke transaction asynchronously • Subscribe to event, event type: “transaction”: concerned with events on a particular transaction ID “txOnChannel”: returns a transaction object for every new transaction on a particular channel “txOnNetwork”: returns a transaction object for every new transaction in the entire network “blockOnChannel”: returns a block header for every new block on a particular channel “blockOnNetwork”: returns a block header on creation of a new block in the entire network “chaincodeEvent”: returns custom events emitted from chaincode • Unsubscribe event
| 86 豊富なREST API Framework – Admin/DevOps Channels Statistics Chaincodes Nodes Organizations • Create channel • Get channel list • Get channel list for chaincode • Get channel list for a peer • Update channel configuration • Get channel info • Get ledger block by block ID • Get blocks by ID range • Get blocks by time range • nodeResUsage (CPU, Mem, Disk) • nodeHealth • channelInfo • channelsJoined • chaincodeInstalled • chaincodeInstantiated • userTrans • billableTrans • Endorsements • Commits • Blocks • proxySyncInvocation • proxyAsyncInvocation • proxyConfiguredCC • Get list of installed cc’s • Get a list of chaincodes on a specific peer • Get list of chaincodes on a channel • Install chaincode • Instantiate chaincode • Get chaincode info • Get node list • Get a list of peers on a channel • Get a list of peers for a specific chaincode • Add a peer node • Start/Stop a peer node • Remove a peer node • Get/Set a peer node’s attributes • Join a peer to a channel • Export/Import peers • Start/Stop an orderer • Get/Set an orderer’s attributes • Start/Stop a CA node • Get/Set a CA’s attributes • Start/Stop REST proxy • Get/Set REST proxy’s configuration • Get org certificates • Get org admin credentials • Get ordering service setting in a founder org • Join a new org to a founder org • Set ordering service to a participant org
| CouchDBのPhantom Read問題:事象の例② • まずCarolの持ち物をすべてAliceに譲渡したのちにAliceの持ち物をすべてBobに 譲渡したいので、Tx1 とTx2 の実行後の期待される結果は以下 109 • しかしCouchDBではPhantom Read問題により以下の結果になる場合がある Item ID 初期状態 中間状態(Tx1後) 結果(Tx2後) Item1 Alice Alice Bob Item2 Bob Bob Bob Item3 Carol Alice Bob Item ID 初期状態 中間状態(Tx1後) 意図しない結果 Item1 Alice Alice Bob Item2 Bob Bob Bob Item3 Carol Alice Alice 取りこぼし
| CouchDBのPhantom Read問題:事象の例③ • トランザクションが以下の時系列で処理されると意図しない結果が発生する – Tx1 のEndorsementをE1 、ValidationをV1、 Tx2 も同様にE2 とV2 とし、OrderingをOと表記 110 E1 E2 O V2 V1 Item ID 初期状態~V1前まで V1後 V2後 Item1 Alice Alice Bob Item2 Bob Bob Bob Item3 Carol Alice Alice
| CouchDBのPhantom Read問題:事象の例④ • V2 でAliceの持ち物であるにもかかわらず、Item3の取りこぼしが生じている • 更新レコードを決定するE2 時点でAliceの持ち物ではなかったため 111 E1 E2 O V2 V1 Item ID 初期状態~V1前まで V1後 V2後 Item1 Alice Alice Bob Item2 Bob Bob Bob Item3 Carol Alice Alice
| CouchDBのPhantom Read問題:事象の例⑤ • Tx2 での更新対象はItem1のみであり、Item3はTx2 の更新対象ではないため、 V2 でのRWセットの検証にはItem3は含まれず「取りこぼし」は検知できない 112 E1 E2 O V2 V1 Item ID 初期状態~V1前まで V1後 V2後 Item1 Alice Alice Bob Item2 Bob Bob Bob Item3 Carol Alice Alice V2 Validation
| 非-決定論的なロジックの例 • GUIDの生成などのためにランダムな値を生成する処理(UUID ver4など)を 使いたくなるが、当然複数ノード間で一致しなくなるのでNG • 代替としてステート内にシードを用意しておき、そこから決定論的に生成する処 理を利用する(UUID ver3など)、あるいはクライアント側で生成してから渡す 119 ランダムな値の生成 P L CC P L CC ≠
| 非-決定論的なロジックの例 • Chaincode内でノードのローカル日時を取得して利用するのは、 他のノードと必ずしも一致しなくなるのでNG – 時刻同期が不完全なことによるズレ – Chaincodeの実行タイミングのズレ • 「現在」の日時はクライアント側で決定してから渡すしかない • これはつまり、特別な手段を講じない限り「現在」日時はコンセンサスの外部とい うこと 120 ノードのローカル日時の利用 P L CC P L CC ≠ 12:00:00 12:01:23
| 非-決定論的なロジックの例 • Chaincodeから台帳の外部にある情報を取得しようとすると、各ノードで個別に 取得した結果が一致することを保証するのは困難 – Chaincodeの実行タイミングによって違う値が返ってくる、あるいは取得できない可能性 – 外部ハッキングあるいはノード所有者によって不正な値を取得させられてしまう可能性 • なお、ノードのローカル時刻も「台帳の外部に存在する情報」の一種 122 (クライアントから渡される値以外の)台帳の外部に存在する情報の利用 P L CC P L CC ≠ 天気予報 60% 40% 明日の降水確率
| Chaincode Tips • 単一チャネル上で複数Chaincodeを稼働させることが可能 • あるChaincodeが台帳に書き込んだレコードは、そのChaincodeからしかアク セスできない – Chaincode A on Channel Xが書き込んだレコードは、Chaincode B on Channel Xからは アクセスできない – State DB上の現在ステートおよびブロックチェーン上のキー履歴、トランザクション履歴のいず れにもこの制約がある • Chaincodeから同一チャネル内の別のChaincodeを呼び出すことは可能 – Chaincode A on Channel X⇒Chaincode B on Channel Xは可能 • 単一トランザクションとなり、ステート、RWSetも共有している 124 単一チャネル上での複数Chaincodeの相互呼び出し