corda / accounts

Accounts on Corda
Other
36 stars 38 forks source link

Make Accounts Easier To Use #80

Open opticyclic opened 4 years ago

opticyclic commented 4 years ago

Discussion before adding a pull request:

In my test code I have a few extension functions to make using the accounts SDK easier. e.g. this:

val StateAndRef<AccountInfo>.uuid: UUID get() = state.data.linearId.id

fun VaultService.accountStates(accountId:UUID): List<StateAndRef<ContractState>> {
    return this.queryBy<ContractState>(QueryCriteria.VaultQueryCriteria(externalIds = listOf(accountId))).states
}

allows me to do this:

banks.services.vaultService.accountStates(bank1.uuid)

Instead of this:

banks.services.vaultService.queryBy<ContractState>(QueryCriteria.VaultQueryCriteria(externalIds = listOf(bank1.state.data.linearId.id))).states

However, calling kotlin extension functions from Java is tricky.

Would this and other similar helper functions be better in AccountService/KeyManagementBackedAccountService?

See also https://github.com/corda/accounts/issues/37

roger-that-dev commented 4 years ago

Seems like a good idea - thanks!

dezzeus commented 4 years ago

I'm questioning if we can also let the accountService.accountInfo(...) helpers just return the AccountInfo object instead of StateAndRef

roger-that-dev commented 4 years ago

We can't change them as it would break backwards compatibility but we can add new methods that do what you describe.

dezzeus commented 4 years ago

Good point. It's not really needed, but promotes cleaner code (IMHO); maybe we can break that behaviour with v2.0 :P (and introduce new methods for those who may need the stateAndRef)

roger-that-dev commented 4 years ago

Yeah fair point. Reason for returning StateAndRef was that then you can then build transactions with it. With just the AccountInfo you can't use it as an input or reference in a transaction.

dezzeus commented 4 years ago

Makes sense to have such an helper, even thought I'm not sure about the direct use of AccountInfo in transactions (i.e. accounts are handled with flows, while states refers to AnonymousParty, not LinearPointer of AccountInfo)

dezzeus commented 4 years ago

Another idea for an helper: something to use in the SignTransactionFlow::checkTransaction that, given an AnonymousParty / PublicKey, throws an exception if:

Again, it's not needed, but can by handy. :)