Forum Discussion
ABW - Obtaining the Contract Id (or LedgerIdentifier) on a newly created contract via Rest API?
Although I understand that a new contract will be written asynchronously (although a contract record is immediately written to Sql Server with a pending ledger identifier once it is pulled off the queue by the Worker node Docker endpoint), it seems there isn't currently a reliable way to tie up the contract back to the caller who created it.
The closest I've gotten thus far is to use the https://docs.microsoft.com/en-us/rest/api/azure-blockchain-workbench/contracts/contractsget to query all contracts written for the given workflow by the given userId, and find the latest one by timestamp - this is obviously prone to latency and concurrency issues under load.
It seems to me that it would be a good idea to allow the caller to also specify a reference correlation identifier to be stored on the Contract record
Have I perhaps missed something else obvious?
3 Replies
- Zeyad RajabiFormer Employee
Calling POST /api/v1/contracts should return back the ID of the contract, which you can use to query with GET.
- Stuart CorransCopper Contributor
You're right, thanks, it's the GatewayApi sample code which is discarding the contractid:
https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/rest-api-samples/dotnet/GatewayApi.cs#L460
Replacing string.Empty with await msg.Content.ReadAsStringAsync() returns the newly allocated contract id as a raw string
- Stuart CorransCopper Contributor
For anyone interested, ABW 1.5 and hopefully onward now DO allow for asynchronous tie-ups of the Request and Response on the Messaging API : https://docs.microsoft.com/en-us/azure/blockchain/workbench/messages-overview
The user-supplied `requestId` that Contract and Contract Action requests accept is then echoed back on the ABW EventGrid (and I think also on the egress Service Bus topic), along with the assigned ContractId ContractAddress (Contract Creates) and ContractActionId / TransactionId (Contract Actions)