accounts icon indicating copy to clipboard operation
accounts copied to clipboard

Make Accounts Easier To Use

Open opticyclic opened this issue 5 years ago • 7 comments

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

opticyclic avatar Dec 11 '19 20:12 opticyclic

Seems like a good idea - thanks!

roger-that-dev avatar Dec 19 '19 16:12 roger-that-dev

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

dezzeus avatar Jan 15 '20 15:01 dezzeus

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

roger-that-dev avatar Jan 15 '20 16:01 roger-that-dev

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)

dezzeus avatar Jan 15 '20 16:01 dezzeus

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.

roger-that-dev avatar Jan 15 '20 16:01 roger-that-dev

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 avatar Jan 15 '20 16:01 dezzeus

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

  • It's not associated to an account.
  • The node is not the host of the associated account.
  • Something else that I may haven't thinked about…

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

dezzeus avatar Jan 15 '20 17:01 dezzeus