Update and Transfer Operations in BigchainDB Part 2
Posted By : Himanshu Bhatt | 25-Sep-2019
Hi, today in this blog I will demonstrate how to perform the transfer operations of assets and adding of metadata and we will look at the details of the transaction, in the previous blog, I showed how to setup BigchainDB and send the data to it. Whenever we update the metadata of the assets or we transfer the assets that operation is called transfer operation in BigchainDB.
Transfer operations:
Let’s make an API to update the metadata of the same user, we have to add another API in our controller class:
@RestController public class BigChainController { @Autowired private BigChainDbService bigChainDbService; @PostMapping("setBigChainData") public ResponseEntity<Object>postBigChainData(@RequestBody MetaDataDto metaDataDto){ return ResponseHandler.response(bigChainDbService.updateBigchainDataToDb(metaDataDto),"data saved"); } @PutMapping("updateBigchainData") public ResponseEntity<Object>updateBigchainData(@RequestParam("assetId") Long assetId,@RequestBody MetaDataDto metaDataDto){ return ResponseHandler.response(bigChainDbService.saveBigchainDataToDb(metaDataDto),"data saved"); } }
Here we are retrieving the bigchaindb data on the basis of the asset id.
Let’s make the service class for this which will retrieve the data from the bigchaindb.
public Map<String, Object> updateBigchainDataToDb(String assetId, MetaDataDto metaDataDto) { Map<String, Object> result = new HashMap<>(); BigchainDbConfigBuilder.baseUrl(EnvVariables.BIGCHAIN_DB_URL).setup(); PublicKey publicKey = getPublicKey(bigChainDbDetails.getPublicKey()); BigChainDbGenericCallback callback = new BigChainDbGenericCallback(); Transaction transferTransaction = null; try { transferTransaction = BigchainDbTransactionBuilder.init() .addMetaData(metaDataDto) .addInput(null, getSpendFrom(bigChainDbDetails.getTransactionId()), (EdDSAPublicKey) publicKey) .addOutput("1", (EdDSAPublicKey) publicKey) .addAssets(bigChainDbDetails.getAssetId(), String.class) .operation(Operations.TRANSFER) .buildAndSign((EdDSAPublicKey) publicKey, (EdDSAPrivateKey) getPrivateKey(bigChainDbDetails.getPrivateKey())) .sendTransaction(callback.getCallBack()); logger.info("checking the call back {} in while loop ", callback.isDone()); while (!callback.isDone()) { } if (!callback.isSuccess()) { result.put("transactionId", transferTransaction.getId()); result.put("callBack", callback.isSuccess()); return result; } } catch (Exception e) { logger.error("exceptioon from transfer Transaction : {}", e.getMessage()); } logger.info("updated transaction:::{}", transferTransaction.getId()); result.put("transactionId", transferTransaction.getId()); result.put("callBack", callback.isSuccess()); return result; }
We will add this function to the service class to update the metadata of a user in blockchain this type of operation is transfer operation.
Viewing the transactions:
Let’s view the transaction on the basis of the assetId, we have to make an API on the basis of which we will get all the user transactions we will write the following function in the controller class:
@GetMapping("getTransactions") public ResponseEntity<Object> getBigChainDetails(@RequestParam("assetId") Long assetId) { return ResponseHandler.response(bigChainDbService.getBigChainDetails(assetId), LocaleService.toLocale("data.fetched")); }
Let’s write the service class for getting the details of the user:
public List getUsersBigChainDetails(String assetId) { Optional<BigChainDbDetails> bigChainDbDetails = bigChainDbRepo.findByAssetId(assetId); if (!bigChainDbDetails.isPresent()) { throw new DataException(LocaleService.toLocale("Invalid Id")); } ObjectMapper objectMapper = new ObjectMapper(); try { List<UserBigChainDto> bigchainDbTransactions = objectMapper.readValue(getAllTransactionOnAsset(bigChainDbDetails.get().getAssetId()), new TypeReference<List<UserBigChainDto>>() { }); return bigchainDbTransactions; } catch (IOException e) { e.printStackTrace(); } return null; }
public String getAllTransactionOnAsset(String assetId) { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); HttpEntity<String> entity = new HttpEntity<>("parameters", headers); String uri = EnvVariables.BIGCHAIN_DB_URL + "/transactions?asset_id=" + assetId; ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class); JSONArray transaction = null; try { transaction = new JSONArray(result.getBody()); } catch (JSONException e) { e.printStackTrace(); } return transaction.toString(); }
Conclusion
Hence we have successfully demonstrated how BigchainDB works and how to set up this blockchain can be used in many applications.
Cookies are important to the proper functioning of a site. To improve your experience, we use cookies to remember log-in details and provide secure log-in, collect statistics to optimize site functionality, and deliver content tailored to your interests. Click Agree and Proceed to accept cookies and go directly to the site or click on View Cookie Settings to see detailed descriptions of the types of cookies and choose whether to accept certain cookies while on the site.
About Author
Himanshu Bhatt
Himanshu is a bright java developer. He is keen to learn new technologies. His hobbies are to travel and listen music.