A simplified implementation of OpenCBDC for learning and experimentation. We left out all the complex distributed application pieces to focus on the basics of how it works.
This implementation primarily shows the 2pc architecture. You can read more about that here: MIT-DCI
- Transaction: Opencbdc uses a UTXO vs. an Account model, along with a compacted version for storage.
- Wallet: simple self-custody wallet to interact with the UHS. Note: for simplicity we use ed25519 for signatures instead of the secp256k1 (schnorr) used in the real implementation.
- UHS: a very simplified version to demonstrate some of the key logic that lives across 3 (sentinel, coordinator, locking shard) separate parts of the system.
Example of sending money between 2 wallets:
from cbdc.wallet import Wallet
from cbdc.uhs import UhsController
def run():
# create wallets
bob = Wallet()
dave = Wallet()
# create the UHS
uhs = UhsController()
assert dave.balance == 0
assert bob.balance == 0
# Mint money to populate the UHS. You don't normally get to do this (unfortunately)
# Create 3 coins, each worth $5
minted = dave.mint_new_coins(3, 5)
uhs.mint(minted)
# update dave's wallet
dave.receive_transfer(minted)
assert dave.balance == 15
# Send $12 to bob
tx1 = dave.transfer(12, bob.address)
# execute the tx against the UHS
tx2 = uhs.execute_transaction(tx1, True)
# Bob loads the tx into his wallet
bob.receive_transfer(tx2)
# Bob and Dave's updated balances...
assert dave.balance == 3
assert bob.balance == 12
if __name__ == "__main__":
run()
Running the code gives you some output to show what's happening to
transaction in the UHS. Note how there's no information about the money spent!
*** MINT ***
This is the result of the mint call
[ txid: 87b99b2f45a828e5d0715ed3ecbafd547ba406dfa9b8cad86a9f7cf0f570f8bf ]
spending:
creating:
-> afc0400e53ad4fcd633d2c4ebfcfc7891605f17d49e452fa1f75000b75f2b736
-> 1b515292c552cd257bf29ab4dd2f53bb452c752e68208e257ca3a8d799bc5744
-> e03b15c0e545ce77da1d6afcda92b716fa6fb5bb6ad57e69ad2031258fe42b22
This is the result of the transaction between Dave andd Bob. The
3 minted are consumed and there are now 2 new outputs: 1 for Bob and
change back to Dave
[ txid: 850fcfda81ed52bce00e42a5746dd33f8e916113205d9472174afcdfb1634516 ]
spending:
↑ afc0400e53ad4fcd633d2c4ebfcfc7891605f17d49e452fa1f75000b75f2b736
↑ 1b515292c552cd257bf29ab4dd2f53bb452c752e68208e257ca3a8d799bc5744
↑ e03b15c0e545ce77da1d6afcda92b716fa6fb5bb6ad57e69ad2031258fe42b22
creating:
-> ac162d3a34b44bc86b0a9925a7b21b60a9f0c3a68a1ff6790306057aeb6af7f0
-> 04350b13ed9648060d56febef9e0bc66352a29f99887dbb00e27adfc6d96c374