Minka Ledger Docs

Managing wallet access

Ensuring only the wallet owner has the control over the wallet


Now that we demonstrated how things should not work, let's see how we can improve our clearinghouse Ledger system.

Removing all access

Only clearinghouse signer that created the ledger record should have complete control over that entire ledger.

While we were creating the ledger record we were presented with these JSON access rules:

[
  {
    "action": "any",
    "record": "any"
  }
]

These rules allowed anyone to do anything (and this helped us simplify the tutorial).

But now we will only grant full access to the clearinghouse signer and everyone else will have zero access.

This way we're setting up our system with maximum security and then we'll slowly add permissions to others.

We can edit access rules using the update command:

$ minka ledger update 
 
Ledger summary:
---------------------------------------------------------------------------
Handle: tutorial-ledger
 
Intent expiry threshold (minutes): 60
Wallet required before creating an anchor: true
Schedule policy processor enabled: false
 
Access rules:
#0
  - Action: any
  - Record: any
 
Status: created
 
 
Updates:
------------------------------------------
? Select the field to update, select Finish to save changes. 
  Finish 
  Config 
  Custom 
❯ Access 

Select Access and update the JSON rules so that only clearinghouse signer can have total control.

[
  {
    "action": "any",
    "record": "any",
    "signer": {
      "public": "eIHlrG0Wr5vl3pDi5Vgqzu5WGE7q/60jsysBmehYKtg="
    }
  }
]

public is actually signer's public key which you can get using the following command:

$ minka signer show clearinghouse
 
Signer summary:
---------------------------------------------------------------------------
Handle: clearinghouse
Public: eIHlrG0Wr5vl3pDi5Vgqzu5WGE7q/60jsysBmehYKtg=
 
 
⚠️  WARNING::  Secret or private key is critical data that should be handled
with care. Private keys are used to modify balances and it is important to
understand that anyone who has access to that key can perform sensitive
ledger operations.

Now, aside from clearinghouse signer no one can do anything.

Testing clearinghouse access

Let's start with any command. For example, listing all wallets:

$ minka wallet list
 
Reason: auth.forbidden
Cannot query wallet.

Since access is no longer open to everyone, the Ledger system needs to verify the identity of the signer before allowing any kind of access or modification.

To do that, we will login using our clearinghouse signer:

$ minka ledger login
! Remote signers not available.
? Signer: clearinghouse
? Signer password for clearinghouse [hidden]
 
✅ Logged in as clearinghouse.

Now when we repeat the previous command we will see the list of all the wallets in the ledger:

$ minka wallet list
 
╔═════════════════════╤══════════╤══════════╤══════════╗
║  Handle             │  Bridge  │  Custom  │  Routes  ║
╟─────────────────────┼──────────┼──────────┼──────────╢
║  demo-bank-wallet   │  None    │          │  None    ║
╟─────────────────────┼──────────┼──────────┼──────────╢
║  settlement-wallet  │  None    │          │  None    ║
╚═════════════════════╧══════════╧══════════╧══════════╝
 
Showing page 1 (additional pages may be available.).

Adding access

Having completely restricted rules (below) makes the Ledger useless because no one can access it or use it (except the clearinghouse).

{
  "action": "any",
  "record": "any",
  "signer": {
    "public": "eIHlrG0Wr5vl3pDi5Vgqzu5WGE7q/60jsysBmehYKtg="
  }
}

So let's start by editing ledger rules once again and allow each signer to access its own data:

{
  "action": "access"
}

And also, let's allow owners of the wallet to change wallet balance:

{
  "action": "spend",
  "record": "wallet",
  "signer": {
    "$record": "owner"
  }
}

And finally, let's allow demo-bank signer to create intents/transactions (using its public key):

{
  "action": "create",
  "record": "intent",
  "signer": {
    "public": "demo-bank-signer-public-key-..."
  }
}

Here is how the full ledger access rules look like:

[
  {
    "action": "any",
    "record": "any",
    "signer": {
      "public": "eIHlrG0Wr5vl3pDi5Vgqzu5WGE7q/60jsysBmehYKtg="
    }
  },
  {
    "action": "access"
  },
  {
    "action": "spend",
    "record": "wallet",
    "signer": {
      "$record": "owner"
    }
  },
  {
    "action": "create",
    "record": "intent",
    "signer": {
      "public": "RiQu4adTcR1elbgSSSOW84rviHLofGhXJQpOYdvHcQc="
    }
  }
]

Use minka ledger update command to set these new access rules.

Testing demo bank access

First we need to logout from our clearinghouse signer using minka ledger logout command.

Now, let's say we just want to list wallets in the ledger:

$ minka wallet list
 
Reason: auth.forbidden
Cannot query wallet.

As expected we cannot see the wallets without a proper signer.

So let's login with our demo-bank signer:

minka ledger login
! Remote signers not available.
? Signer: demo-bank
? Signer password for demo-bank [hidden]
 
✅ Logged in as demo-bank.

Now when we list the wallets, demo-bank can only see the records that belong to it:

minka wallet list
 
╔════════════════════╤══════════╤══════════╤══════════╗
║  Handle            │  Bridge  │  Custom  │  Routes  ║
╟────────────────────┼──────────┼──────────┼──────────╢
║  demo-bank-wallet  │  None    │          │  None    ║
╚════════════════════╧══════════╧══════════╧══════════╝
 
Showing page 1 (additional pages may be available.).

Notice how we were able to see all the wallets when we were logged in as a clearinghouse.

Testing balance transfer (fail)

We will again try to make a transfer from settlement-wallet that doesn't belong to demo-bank and see if it goes through:

$ minka intent create
? Handle: 5usjn3eBuqu8X431DGgHa
? Action: transfer
? Source: settlement-wallet
? Target: demo-bank-wallet
? Symbol: usd
? Amount: 20
? Add another action? No
? Add custom data for this intent? No
? Signers: demo-bank
? Signer password for demo-bank [hidden]
 
Intent summary:
---------------------------------------------------------------------------
Handle: 5usjn3eBuqu8X431DGgHa
 
Action: transfer
 - Source: settlement-wallet
 - Target: demo-bank-wallet
 - Symbol: usd
 - Amount: $20
 
 
? Sign this intent using signer demo-bank? Yes
 
✅ Intent signed and sent to ledger tutorial-ledger-2
 
Intent summary:
---------------------------------------------------------------------------
Handle: 5usjn3eBuqu8X431DGgHa
 
Action: transfer
 - Source: settlement-wallet
 - Target: demo-bank-wallet
 - Symbol: usd
 - Amount: $20
 
 
Access rules:
#0
  - Action: any
  - Signer:
    - public: RiQu4adTcR1elbgSSSOW84rviHLofGhXJQpOYdvHcQc=
Luid: $int.-089ChY4ocQFyZWIr

As you can see, demo-bank wallet managed to create intent but that doesn't mean the balance was transferred.

If we list the intents, we can see it's pending and will eventually timeout without making a transfer.

minka intent list
 
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║  Handle                     Action               Source               Target        Amount         Status    ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  5usjn3eBuqu8X431DGgHa    Transfer    settlement-wallet     demo-bank-wallet        $20    usd     pending   ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  BJgB1yDLFKnfHIGnlVKnR    Transfer    settlement-wallet     demo-bank-wallet       $100    usd    completed  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  qz30sjjHv5ti7wjuAgYrS    Transfer     demo-bank-wallet    settlement-wallet       $200    usd    completed  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  uslP0M2CUwxtTiaKIQspr    Transfer     demo-bank-wallet    settlement-wallet       $300    usd    completed  ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

This means, demo-bank no longer controls the settlement-wallet balance and we successfully limited the access that was previously completely unrestricted.

$ minka wallet balances demo-bank-wallet
Balances:
$600.00 (usd)

Testing balance transfer (success)

Another case we need to verify is whether the demo-bank signer can transfer balance from its own demo-bank-wallet:

minka intent create                    
? Handle: JCWiBS823cKzXTU6MQqoG
? Action: transfer
? Source: demo-bank-wallet
? Target: settlement-wallet
? Symbol: usd
? Amount: 30
? Add another action? No
? Add custom data for this intent? No
? Signers: demo-bank
? Signer password for demo-bank [hidden]
 
Intent summary:
---------------------------------------------------------------------------
Handle: JCWiBS823cKzXTU6MQqoG
 
Action: transfer
 - Source: demo-bank-wallet
 - Target: settlement-wallet
 - Symbol: usd
 - Amount: $30
 
 
? Sign this intent using signer demo-bank? Yes
 
✅ Intent signed and sent to ledger tutorial-ledger-2
 
Intent summary:
---------------------------------------------------------------------------
Handle: JCWiBS823cKzXTU6MQqoG
 
Action: transfer
 - Source: demo-bank-wallet
 - Target: settlement-wallet
 - Symbol: usd
 - Amount: $30
 
 
Access rules:
#0
  - Action: any
  - Signer:
    - public: RiQu4adTcR1elbgSSSOW84rviHLofGhXJQpOYdvHcQc=
Luid: $int.-089ExLCSdwyalJOv

If we take a look at intents, we can see that this transfer was successful:

$ minka intent list                      
 
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║  Handle                     Action               Source               Target        Amount         Status    ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  JCWiBS823cKzXTU6MQqoG    Transfer     demo-bank-wallet    settlement-wallet        $30    usd    completed  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  5usjn3eBuqu8X431DGgHa    Transfer    settlement-wallet     demo-bank-wallet        $20    usd     pending   ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  BJgB1yDLFKnfHIGnlVKnR    Transfer    settlement-wallet     demo-bank-wallet       $100    usd    completed  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  qz30sjjHv5ti7wjuAgYrS    Transfer     demo-bank-wallet    settlement-wallet       $200    usd    completed  ║
╟──────────────────────────────────────────────────────────────────────────────────────────────────────────────╢
║  uslP0M2CUwxtTiaKIQspr    Transfer     demo-bank-wallet    settlement-wallet       $300    usd    completed  ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

And we can also see that demo-bank-wallet balance is now changed:

$ minka wallet balances demo-bank-wallet 
Balances:
$570.00 (usd)

On this page