Confidential Wholesale CBDC Application Workflow
The confidential wholesale central bank digital currency (CBDC) scenario represents currency that is distributed through a structured financial institution hierarchy, with sensitive information stored privately.
The confidential version of the wholesale CBDC scenario differs in how transaction data is handled. Non-sensitive information such as basic transaction details and organizational account information is stored on the public ledger. Sensitive information (such as user IDs, actual balance values, and blinding factors) is stored in each organization's private data collection and passed to the chaincode via a transient map, so that it is never written to the public ledger. Account balances and on-hold balances are represented as Pedersen commitment values on the public ledger, allowing public verification through zero-knowledge proofs without exposing the underlying amounts. At the central bank level, hold transfers use a two-phase commit process for an atomic transaction that requires simultaneous execution of both the executeHoldTokensSender and executeHoldTokensReceiver APIs, which maintains confidentiality throughout the transfer. Transfers at the financial institution level use the standard single executeHoldTokens API.
| Operation/Data | Non-Confidential CBDC | Confidential CBDC |
|---|---|---|
| Inter-Organization Transfer (central bank approver executes hold) | executeHoldTokens API (single call)
|
executeHoldTokensSender and executeHoldTokensReceiver APIs (two simultaneous calls done in two-phase commit)
|
| Intra-Organization Transfer (financial institution approver executes hold) | executeHoldTokens API (single call)
|
executeHoldTokens API (single call, no difference)
|
| Transaction Data on Ledger | All data stored in plain form on the public ledger, no data separation | Non-sensitive data on public ledger, sensitive data (user IDs, actual balances, blinding factors) stored in each organization's private data collection |
| Balance Representation | Actual balance values stored directly | Balances represented as Pedersen commitment values, actual amounts not exposed on the public ledger |
| Verification Method | Direct: values are readable on the ledger | Zero-knowledge proofs enable public verification without revealing underlying amounts |
| Sensitive Data Handling | Stored on public ledger | Passed via transient map to chaincode, not written to the public ledger |
Note:
TheexecuteHoldTokensSender and executeHoldTokensReceiver APIs must be called simultaneously as part of a two-phase commit process. Calling only one without the other results in an error.
| Actor | Role | Description |
|---|---|---|
| Administrator | Token Admin | Initializes the system, assigns roles. |
| Creator | Minter | Requests minting of tokens and receives minted tokens. |
| Central Bank Approver | Notary | Approves all operations at the central bank level. |
| Issuer | none | Receives tokens from the creator, routes tokens to the financial institution officer or retirer. |
| Financial Institution Officer | none | Receives tokens from the issuer, distributes tokens to financial institution users. |
| Financial Institution Approver | Notary | Approves hold transfers from financial institution officer to financial institution users. |
| Financial Institution User | none | Final recipient of transferred tokens at a financial institution. |
| Retirer | Burner | Receives tokens from the issuer and sends burn requests to the central bank approver. |
- Initialize the CBDC system by using the
initializeCBDCTokenAPI. - Register organizations by using the
registerOrgAPI. - Create accounts by using the
createAccountAPI. - Associate the token to accounts by using the
associateTokenToAccountAPI. - Assign the minter role to the creator, the notary role to the central bank approver, and the burner role to the retirer by using the
addRoleAPI.
- Mint currency.
- The token creator uses the
requestMintAPI to submit a request to mint deposit tokens. - The central bank approver uses the
approveMintAPI to review and approve the mint request. The tokens are credited to the creator's account. Alternately, the central bank approver can userejectMintAPI to deny the request.
- The token creator uses the
- Transfer tokens to the issuer.
- The creator uses the
transferTokensAPI send tokens to the issuer.
- The creator uses the
- Transfer tokens to financial officers.
- The issuer uses the
holdTokensAPI send tokens to a financial institution officer. - The central bank approver uses the
executeHoldTokensSenderandexecuteHoldTokensReceiverAPIs as part of a two-phase commit to validate and approve the transfer request. Alternately, the central bank approver can use thereleaseHoldAPI to reject the transfer.
- The issuer uses the
- Issue tokens to users.
- The financial institution officer uses the
holdTokensAPI send tokens to a financial institution user. - The financial institution approver uses the
executeHoldTokensAPI to validate and approve the transfer request. Alternately, the financial institution approver can use thereleaseHoldAPI to reject the transfer.
- The financial institution officer uses the
- Burn tokens.
- The issuer uses the
transferTokensAPI to transfer tokens to the retirer. - The retirer uses the
requestBurnAPI to send a burn request to the central bank approver. - The central bank approver uses the
approveBurnAPI to approve the burn request, and the tokens are destroyed. Alternately, the central bank approver can use therejectBurnAPI to reject the request.
- The issuer uses the
- Verify token balance.
- Users can use the
getAccountBalanceAPI to get the total number of currency they hold.
- Users can use the