This public repository is read-only and no longer maintained. For the latest sample code repositories, visit the SAP Samples organization.
The Hyperledger Fabric gateway example application for SAP Cloud Platform provides a convenient REST-API to interact with Hyperledger Fabric chaincode. Therefore, it uses the Hyperledger Fabric client component of the SAP Cloud SDK.
Instead of using a REST-gateway we highly recommend using the official Hyperledger Fabric SDKs directly to invoke or query chaincode. This avoids the need of a runtime component and thus increases performance and failure safety. See Hyperledger Fabric Gateway SDK for Java and Hyperledger Fabric Gateway SDK for Node.js. To easily instantiate those SDKs via a user-provided service on Cloud Foundry use the Hyperledger Fabric client component in the SAP Cloud SDK. This SAP Cloud SDK component and the official Hyperledger Fabric Gateway SDK for Java are also used in this example application to reduce the code to a minimum.
In order to use this example application, a Hyperledger Fabric network or service instance is required.
Additionally, the application should be run in a Cloud Foundry environment on SAP Cloud Platform, or the Cloud Foundry environment variable VCAP_SERVICES
must be set manually.
This example application is intended to be used on a per-channel basis, not per chaincode. In order for the application to successfully connect to the Hyperledger Fabric network and the specific channel, it requires certain credentials. These credentials consist of a username (can be freely chosen), the user's organization (mspid) and the public and private key of the user. For most purposes this should be a technical user that has the permissions to execute chaincode on the channel (read and write). Moreover, the credentials contain a common connection profile that provides all necessary information for the application to connect to the Hyperledger Fabric network. The connection profile, the user certificate and the private key are Base64 encoded so they can be stored in a JSON object. Last but not least, it also includes the name of the channel that has the instantiated chaincodes.
# Edit and insert your own credentials!
{
"type": "hyperledger-fabric",
"mspid": "Org1MSP",
"username": "admin",
"channelname": "mychannel",
"connectionprofile": "LS0tCm5hbWU6IGZhYnJpYy1uZXR3b3JrLW9yZzEKdmVyc2lvbjogMS4wLjAKY2xpZW50OgogIG9yZ2FuaXphdGlvbjogT3JnMQpvcmdhbml6YXRpb25zOgogIE9yZzE6CiAgICBtc3BpZDogT3JnMU1TUAogICAgY3J5cHRvUGF0aDogLgogICAgcGVlcnM6CiAgICAtIHBlZXIwLm9yZzEuZXhhbXBsZS5jb206NzA1MQogICAgLSBwZWVyMS5vcmcxLmV4YW1wbGUuY29tOjgwNTEKY2hhbm5lbHM6CiAgbXljaGFubmVsOgogICAgb3JkZXJlcnM6CiAgICAgICAgLSBvcmRlcmVyLmV4YW1wbGUuY29tCiAgICBwZWVyczoKICAgICAgcGVlcjAub3JnMS5leGFtcGxlLmNvbTo3MDUxOgogICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUKICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZQogICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlCiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUKICAgICAgICBkaXNjb3ZlcjogZmFsc2UKICAgICAgcGVlcjEub3JnMS5leGFtcGxlLmNvbTo4MDUxOgogICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUKICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZQogICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlCiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUKICAgICAgICBkaXNjb3ZlcjogZmFsc2UKcGVlcnM6CiAgcGVlcjAub3JnMS5leGFtcGxlLmNvbTo3MDUxOgogICAgdXJsOiBncnBjczovL2xvY2FsaG9zdDo3MDUxCiAgICB0bHNDQUNlcnRzOgogICAgICBwZW06IHwKICAgICAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgICAgICBNSUlDVnpDQ0FmNmdBd0lCQWdJUkFLa3FWb0Q4UXhOWk5TcXBLSWw2VGM0d0NnWUlLb1pJemowRUF3SXdkakVMCiAgICAgICAgTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwogICAgICAgIGNtRnVZMmx6WTI4eEdUQVhCZ05WQkFvVEVHOXlaekV1WlhoaGJYQnNaUzVqYjIweEh6QWRCZ05WQkFNVEZuUnMKICAgICAgICBjMk5oTG05eVp6RXVaWGhoYlhCc1pTNWpiMjB3SGhjTk1qQXdOREF5TURneU1qQXdXaGNOTXpBd016TXhNRGd5CiAgICAgICAgTWpBd1dqQjJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRQogICAgICAgIEJ4TU5VMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NUzVsZUdGdGNHeGxMbU52YlRFZk1CMEcKICAgICAgICBBMVVFQXhNV2RHeHpZMkV1YjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CiAgICAgICAgQXdFSEEwSUFCRXc2SDM4V2ZvY3FXN0xCalFKdjA0TCtVS2owdjRhbGdDV2RLNmsvYXRJQjhTNmJ5UE5GS2NIawogICAgICAgIC9rMWFXY1dhVTRmTkhTanYwSVI5d2k4YnpoekVEd2VqYlRCck1BNEdBMVVkRHdFQi93UUVBd0lCcGpBZEJnTlYKICAgICAgICBIU1VFRmpBVUJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSEF3RXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXBCZ05WCiAgICAgICAgSFE0RUlnUWdXTm9mM2lWYmlMTEJRazRjbW1FdWRIUFhhbExXeFhvZUZZNU12K1JmVGxzd0NnWUlLb1pJemowRQogICAgICAgIEF3SURSd0F3UkFJZ1ZSeXVnTFNUQjlGZ0xZRlJ4TnlDMlh6a2IvV0wybUJNU3RJZDNsN3lJNndDSUQwR0xyQmoKICAgICAgICBhSkU4anF3cmJtNnpmQWRyZk14Uk5Rc0hXVVh6bExocm5KU24KICAgICAgICAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiAgICAgICAgCiAgICBncnBjT3B0aW9uczoKICAgICAgc3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlOiBwZWVyMC5vcmcxLmV4YW1wbGUuY29tCiAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IHBlZXIwLm9yZzEuZXhhbXBsZS5jb20KICBwZWVyMS5vcmcxLmV4YW1wbGUuY29tOjgwNTE6CiAgICB1cmw6IGdycGNzOi8vbG9jYWxob3N0OjgwNTEKICAgIHRsc0NBQ2VydHM6CiAgICAgIHBlbTogfAogICAgICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgICAgIE1JSUNWekNDQWY2Z0F3SUJBZ0lSQUtrcVZvRDhReE5aTlNxcEtJbDZUYzR3Q2dZSUtvWkl6ajBFQXdJd2RqRUwKICAgICAgICBNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHCiAgICAgICAgY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SHpBZEJnTlZCQU1URm5ScwogICAgICAgIGMyTmhMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTWpBd05EQXlNRGd5TWpBd1doY05NekF3TXpNeE1EZ3kKICAgICAgICBNakF3V2pCMk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFCiAgICAgICAgQnhNTlUyRnVJRVp5WVc1amFYTmpiekVaTUJjR0ExVUVDaE1RYjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEVmTUIwRwogICAgICAgIEExVUVBeE1XZEd4elkyRXViM0puTVM1bGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKICAgICAgICBBd0VIQTBJQUJFdzZIMzhXZm9jcVc3TEJqUUp2MDRMK1VLajB2NGFsZ0NXZEs2ay9hdElCOFM2YnlQTkZLY0hrCiAgICAgICAgL2sxYVdjV2FVNGZOSFNqdjBJUjl3aThiemh6RUR3ZWpiVEJyTUE0R0ExVWREd0VCL3dRRUF3SUJwakFkQmdOVgogICAgICAgIEhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlYKICAgICAgICBIUTRFSWdRZ1dOb2YzaVZiaUxMQlFrNGNtbUV1ZEhQWGFsTFd4WG9lRlk1TXYrUmZUbHN3Q2dZSUtvWkl6ajBFCiAgICAgICAgQXdJRFJ3QXdSQUlnVlJ5dWdMU1RCOUZnTFlGUnhOeUMyWHprYi9XTDJtQk1TdElkM2w3eUk2d0NJRDBHTHJCagogICAgICAgIGFKRThqcXdyYm02emZBZHJmTXhSTlFzSFdVWHpsTGhybkpTbgogICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgICAgICAKICAgIGdycGNPcHRpb25zOgogICAgICBzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGU6IHBlZXIxLm9yZzEuZXhhbXBsZS5jb20KICAgICAgaG9zdG5hbWVPdmVycmlkZTogcGVlcjEub3JnMS5leGFtcGxlLmNvbQpvcmRlcmVyczoKICBvcmRlcmVyLmV4YW1wbGUuY29tOgogICAgdXJsOiBncnBjczovL2xvY2FsaG9zdDo3MDUwCiAgICB0bHNDQUNlcnRzOgogICAgICBwZW06IHwKICAgICAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgICAgICBNSUlDUWpDQ0FlbWdBd0lCQWdJUWFHS1k5djkrdXZKZmszYXg5eG1jK3pBS0JnZ3Foa2pPUFFRREFqQnNNUXN3CiAgICAgICAgQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQogICAgICAgIFlXNWphWE5qYnpFVU1CSUdBMVVFQ2hNTFpYaGhiWEJzWlM1amIyMHhHakFZQmdOVkJBTVRFWFJzYzJOaExtVjQKICAgICAgICBZVzF3YkdVdVkyOXRNQjRYRFRJd01EUXdNakE0TWpJd01Gb1hEVE13TURNek1UQTRNakl3TUZvd2JERUxNQWtHCiAgICAgICAgQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdQogICAgICAgIFkybHpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1Sb3dHQVlEVlFRREV4RjBiSE5qWVM1bGVHRnQKICAgICAgICBjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJOaEJyWW9DdEN3aDhPakZrMnFICiAgICAgICAgQUxQVjNhVjZWVGJDZWxjV1RqYVpnTkZMdkpab05xc3VxTlFXd0FFdzdIZVZJVnAwODdpcDk0Q3RQcmtYbG5oaAogICAgICAgIHZ3cWpiVEJyTUE0R0ExVWREd0VCL3dRRUF3SUJwakFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUIKICAgICAgICBCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZ3BjYkJ1WUpwOGtyb0lyeC96NURzCiAgICAgICAgQnljNDVRYi9ML2M3bmpSdEVGcktzZGN3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnS1pZVUpmMTRXdkhHSUhWbgogICAgICAgIGVzaU5xT0s4bXRlRjJVdUJKZEU1YVJsazVGb0NJQk1tQ2xXUWtpR21pUmxWTkFuV1U2NGZvS1dUT3ovZ2pJV2YKICAgICAgICB6aGdqd3gxawogICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgICAgICAKICAgIGdycGNPcHRpb25zOgogICAgICBzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGU6IG9yZGVyZXIuZXhhbXBsZS5jb20KICAgICAgaG9zdG5hbWVPdmVycmlkZTogb3JkZXJlci5leGFtcGxlLmNvbQo=",
"certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLVENDQWMrZ0F3SUJBZ0lRYmc0RnRmQmhLSGZkVklNWWVLRGx5REFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHlNREEwTURJd09ESXlNREJhRncwek1EQXpNekV3T0RJeU1EQmEKTUdzeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVE0d0RBWURWUVFMRXdWaFpHMXBiakVmTUIwR0ExVUVBd3dXUVdSdGFXNUFiM0puCk1TNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSklXbkNhUStTR3IKQ2dHNENyTE1qekZveW5zSy9JNDVtaWZPVk5EcjNpM1k2WDN0OUlCYTVMNWtNTlNRczYxUGg4dHJjL2twOExFcgpZVVJTejB1S0wyeWpUVEJMTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkCkl3UWtNQ0tBSUZnQS95cEpjaG8rWUUrZmhiWjJMQ3VWcWNrTTBjc1Z0dEZyTlRweHlyTkVNQW9HQ0NxR1NNNDkKQkFNQ0EwZ0FNRVVDSVFDeVBjbXNnS0RaZVU0d3pGK1dxbWF1eHFVek8wM2JzNWxjckVoWFd4OThTZ0lnU2pHNgplSmU1RGVLc0xPR0ttbGYrNTVVc1M1V2FVcnRlblBFeVVGSE9lUTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
"privatekey": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ1FrZXpsaVhjb0lNa0htOVgKcStFcWhZcG1FTzdsQXpDZE1xc0NUL0J4NW1TaFJBTkNBQVNTRnB3bWtQa2hxd29CdUFxeXpJOHhhTXA3Q3Z5TwpPWm9uemxUUTY5NHQyT2w5N2ZTQVd1UytaRERVa0xPdFQ0ZkxhM1A1S2ZDeEsyRkVVczlMaWk5cwotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg=="
}
The above credentials must be provided via a Cloud Foundry user-provided service. To deploy this user-provided service to your Cloud Foundry space log in to Cloud Foundry via the Cloud Foundry CLI:
cf login
After selecting your organization and space run:
# Edit and insert your own credentials!
cf cups gateway-example-credentials -p '{
"type": "hyperledger-fabric",
"mspid": "Org1MSP",
"username": "admin",
"channelname": "mychannel",
"connectionprofile": "LS0tCm5hbWU6IGZhYnJpYy1uZXR3b3JrLW9yZzEKdmVyc2lvbjogMS4wLjAKY2xpZW50OgogIG9yZ2FuaXphdGlvbjogT3JnMQpvcmdhbml6YXRpb25zOgogIE9yZzE6CiAgICBtc3BpZDogT3JnMU1TUAogICAgY3J5cHRvUGF0aDogLgogICAgcGVlcnM6CiAgICAtIHBlZXIwLm9yZzEuZXhhbXBsZS5jb206NzA1MQogICAgLSBwZWVyMS5vcmcxLmV4YW1wbGUuY29tOjgwNTEKY2hhbm5lbHM6CiAgbXljaGFubmVsOgogICAgb3JkZXJlcnM6CiAgICAgICAgLSBvcmRlcmVyLmV4YW1wbGUuY29tCiAgICBwZWVyczoKICAgICAgcGVlcjAub3JnMS5leGFtcGxlLmNvbTo3MDUxOgogICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUKICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZQogICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlCiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUKICAgICAgICBkaXNjb3ZlcjogZmFsc2UKICAgICAgcGVlcjEub3JnMS5leGFtcGxlLmNvbTo4MDUxOgogICAgICAgIGVuZG9yc2luZ1BlZXI6IHRydWUKICAgICAgICBjaGFpbmNvZGVRdWVyeTogdHJ1ZQogICAgICAgIGxlZGdlclF1ZXJ5OiB0cnVlCiAgICAgICAgZXZlbnRTb3VyY2U6IHRydWUKICAgICAgICBkaXNjb3ZlcjogZmFsc2UKcGVlcnM6CiAgcGVlcjAub3JnMS5leGFtcGxlLmNvbTo3MDUxOgogICAgdXJsOiBncnBjczovL2xvY2FsaG9zdDo3MDUxCiAgICB0bHNDQUNlcnRzOgogICAgICBwZW06IHwKICAgICAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgICAgICBNSUlDVnpDQ0FmNmdBd0lCQWdJUkFLa3FWb0Q4UXhOWk5TcXBLSWw2VGM0d0NnWUlLb1pJemowRUF3SXdkakVMCiAgICAgICAgTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnVENrTmhiR2xtYjNKdWFXRXhGakFVQmdOVkJBY1REVk5oYmlCRwogICAgICAgIGNtRnVZMmx6WTI4eEdUQVhCZ05WQkFvVEVHOXlaekV1WlhoaGJYQnNaUzVqYjIweEh6QWRCZ05WQkFNVEZuUnMKICAgICAgICBjMk5oTG05eVp6RXVaWGhoYlhCc1pTNWpiMjB3SGhjTk1qQXdOREF5TURneU1qQXdXaGNOTXpBd016TXhNRGd5CiAgICAgICAgTWpBd1dqQjJNUXN3Q1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRQogICAgICAgIEJ4TU5VMkZ1SUVaeVlXNWphWE5qYnpFWk1CY0dBMVVFQ2hNUWIzSm5NUzVsZUdGdGNHeGxMbU52YlRFZk1CMEcKICAgICAgICBBMVVFQXhNV2RHeHpZMkV1YjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5CiAgICAgICAgQXdFSEEwSUFCRXc2SDM4V2ZvY3FXN0xCalFKdjA0TCtVS2owdjRhbGdDV2RLNmsvYXRJQjhTNmJ5UE5GS2NIawogICAgICAgIC9rMWFXY1dhVTRmTkhTanYwSVI5d2k4YnpoekVEd2VqYlRCck1BNEdBMVVkRHdFQi93UUVBd0lCcGpBZEJnTlYKICAgICAgICBIU1VFRmpBVUJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSEF3RXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QXBCZ05WCiAgICAgICAgSFE0RUlnUWdXTm9mM2lWYmlMTEJRazRjbW1FdWRIUFhhbExXeFhvZUZZNU12K1JmVGxzd0NnWUlLb1pJemowRQogICAgICAgIEF3SURSd0F3UkFJZ1ZSeXVnTFNUQjlGZ0xZRlJ4TnlDMlh6a2IvV0wybUJNU3RJZDNsN3lJNndDSUQwR0xyQmoKICAgICAgICBhSkU4anF3cmJtNnpmQWRyZk14Uk5Rc0hXVVh6bExocm5KU24KICAgICAgICAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiAgICAgICAgCiAgICBncnBjT3B0aW9uczoKICAgICAgc3NsLXRhcmdldC1uYW1lLW92ZXJyaWRlOiBwZWVyMC5vcmcxLmV4YW1wbGUuY29tCiAgICAgIGhvc3RuYW1lT3ZlcnJpZGU6IHBlZXIwLm9yZzEuZXhhbXBsZS5jb20KICBwZWVyMS5vcmcxLmV4YW1wbGUuY29tOjgwNTE6CiAgICB1cmw6IGdycGNzOi8vbG9jYWxob3N0OjgwNTEKICAgIHRsc0NBQ2VydHM6CiAgICAgIHBlbTogfAogICAgICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgICAgIE1JSUNWekNDQWY2Z0F3SUJBZ0lSQUtrcVZvRDhReE5aTlNxcEtJbDZUYzR3Q2dZSUtvWkl6ajBFQXdJd2RqRUwKICAgICAgICBNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHCiAgICAgICAgY21GdVkybHpZMjh4R1RBWEJnTlZCQW9URUc5eVp6RXVaWGhoYlhCc1pTNWpiMjB4SHpBZEJnTlZCQU1URm5ScwogICAgICAgIGMyTmhMbTl5WnpFdVpYaGhiWEJzWlM1amIyMHdIaGNOTWpBd05EQXlNRGd5TWpBd1doY05NekF3TXpNeE1EZ3kKICAgICAgICBNakF3V2pCMk1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFR0ExVUVDQk1LUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFCiAgICAgICAgQnhNTlUyRnVJRVp5WVc1amFYTmpiekVaTUJjR0ExVUVDaE1RYjNKbk1TNWxlR0Z0Y0d4bExtTnZiVEVmTUIwRwogICAgICAgIEExVUVBeE1XZEd4elkyRXViM0puTVM1bGVHRnRjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDkKICAgICAgICBBd0VIQTBJQUJFdzZIMzhXZm9jcVc3TEJqUUp2MDRMK1VLajB2NGFsZ0NXZEs2ay9hdElCOFM2YnlQTkZLY0hrCiAgICAgICAgL2sxYVdjV2FVNGZOSFNqdjBJUjl3aThiemh6RUR3ZWpiVEJyTUE0R0ExVWREd0VCL3dRRUF3SUJwakFkQmdOVgogICAgICAgIEhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlYKICAgICAgICBIUTRFSWdRZ1dOb2YzaVZiaUxMQlFrNGNtbUV1ZEhQWGFsTFd4WG9lRlk1TXYrUmZUbHN3Q2dZSUtvWkl6ajBFCiAgICAgICAgQXdJRFJ3QXdSQUlnVlJ5dWdMU1RCOUZnTFlGUnhOeUMyWHprYi9XTDJtQk1TdElkM2w3eUk2d0NJRDBHTHJCagogICAgICAgIGFKRThqcXdyYm02emZBZHJmTXhSTlFzSFdVWHpsTGhybkpTbgogICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgICAgICAKICAgIGdycGNPcHRpb25zOgogICAgICBzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGU6IHBlZXIxLm9yZzEuZXhhbXBsZS5jb20KICAgICAgaG9zdG5hbWVPdmVycmlkZTogcGVlcjEub3JnMS5leGFtcGxlLmNvbQpvcmRlcmVyczoKICBvcmRlcmVyLmV4YW1wbGUuY29tOgogICAgdXJsOiBncnBjczovL2xvY2FsaG9zdDo3MDUwCiAgICB0bHNDQUNlcnRzOgogICAgICBwZW06IHwKICAgICAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgICAgICBNSUlDUWpDQ0FlbWdBd0lCQWdJUWFHS1k5djkrdXZKZmszYXg5eG1jK3pBS0JnZ3Foa2pPUFFRREFqQnNNUXN3CiAgICAgICAgQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQogICAgICAgIFlXNWphWE5qYnpFVU1CSUdBMVVFQ2hNTFpYaGhiWEJzWlM1amIyMHhHakFZQmdOVkJBTVRFWFJzYzJOaExtVjQKICAgICAgICBZVzF3YkdVdVkyOXRNQjRYRFRJd01EUXdNakE0TWpJd01Gb1hEVE13TURNek1UQTRNakl3TUZvd2JERUxNQWtHCiAgICAgICAgQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjVERWTmhiaUJHY21GdQogICAgICAgIFkybHpZMjh4RkRBU0JnTlZCQW9UQzJWNFlXMXdiR1V1WTI5dE1Sb3dHQVlEVlFRREV4RjBiSE5qWVM1bGVHRnQKICAgICAgICBjR3hsTG1OdmJUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJOaEJyWW9DdEN3aDhPakZrMnFICiAgICAgICAgQUxQVjNhVjZWVGJDZWxjV1RqYVpnTkZMdkpab05xc3VxTlFXd0FFdzdIZVZJVnAwODdpcDk0Q3RQcmtYbG5oaAogICAgICAgIHZ3cWpiVEJyTUE0R0ExVWREd0VCL3dRRUF3SUJwakFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUIKICAgICAgICBCUVVIQXdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBcEJnTlZIUTRFSWdRZ3BjYkJ1WUpwOGtyb0lyeC96NURzCiAgICAgICAgQnljNDVRYi9ML2M3bmpSdEVGcktzZGN3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnS1pZVUpmMTRXdkhHSUhWbgogICAgICAgIGVzaU5xT0s4bXRlRjJVdUJKZEU1YVJsazVGb0NJQk1tQ2xXUWtpR21pUmxWTkFuV1U2NGZvS1dUT3ovZ2pJV2YKICAgICAgICB6aGdqd3gxawogICAgICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgICAgICAKICAgIGdycGNPcHRpb25zOgogICAgICBzc2wtdGFyZ2V0LW5hbWUtb3ZlcnJpZGU6IG9yZGVyZXIuZXhhbXBsZS5jb20KICAgICAgaG9zdG5hbWVPdmVycmlkZTogb3JkZXJlci5leGFtcGxlLmNvbQo=",
"certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNLVENDQWMrZ0F3SUJBZ0lRYmc0RnRmQmhLSGZkVklNWWVLRGx5REFLQmdncWhrak9QUVFEQWpCek1Rc3cKQ1FZRFZRUUdFd0pWVXpFVE1CRUdBMVVFQ0JNS1EyRnNhV1p2Y201cFlURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeQpZVzVqYVhOamJ6RVpNQmNHQTFVRUNoTVFiM0puTVM1bGVHRnRjR3hsTG1OdmJURWNNQm9HQTFVRUF4TVRZMkV1CmIzSm5NUzVsZUdGdGNHeGxMbU52YlRBZUZ3MHlNREEwTURJd09ESXlNREJhRncwek1EQXpNekV3T0RJeU1EQmEKTUdzeEN6QUpCZ05WQkFZVEFsVlRNUk13RVFZRFZRUUlFd3BEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIRXcxVApZVzRnUm5KaGJtTnBjMk52TVE0d0RBWURWUVFMRXdWaFpHMXBiakVmTUIwR0ExVUVBd3dXUVdSdGFXNUFiM0puCk1TNWxlR0Z0Y0d4bExtTnZiVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSklXbkNhUStTR3IKQ2dHNENyTE1qekZveW5zSy9JNDVtaWZPVk5EcjNpM1k2WDN0OUlCYTVMNWtNTlNRczYxUGg4dHJjL2twOExFcgpZVVJTejB1S0wyeWpUVEJMTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1Dc0dBMVVkCkl3UWtNQ0tBSUZnQS95cEpjaG8rWUUrZmhiWjJMQ3VWcWNrTTBjc1Z0dEZyTlRweHlyTkVNQW9HQ0NxR1NNNDkKQkFNQ0EwZ0FNRVVDSVFDeVBjbXNnS0RaZVU0d3pGK1dxbWF1eHFVek8wM2JzNWxjckVoWFd4OThTZ0lnU2pHNgplSmU1RGVLc0xPR0ttbGYrNTVVc1M1V2FVcnRlblBFeVVGSE9lUTA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K",
"privatekey": "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ1FrZXpsaVhjb0lNa0htOVgKcStFcWhZcG1FTzdsQXpDZE1xc0NUL0J4NW1TaFJBTkNBQVNTRnB3bWtQa2hxd29CdUFxeXpJOHhhTXA3Q3Z5TwpPWm9uemxUUTY5NHQyT2w5N2ZTQVd1UytaRERVa0xPdFQ0ZkxhM1A1S2ZDeEsyRkVVczlMaWk5cwotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg=="
}'
Or edit and use the cups.sh file:
./cups.sh
After deploying the user-provided service you are ready to deploy the application itself. Therefore, build the application using maven by running the following command in the application folder:
mvn clean package
To deploy the application make sure you have selected the same organization and space via the Cloud Foundry CLI and the run:
cf push
The REST-API provides the endpoints /{chaincode_name}/query and /{chaincode_name}/invoke. Both endpoints expect the same request body. Example request:
curl -X POST \
https://com-sap-icn-gateway-example.cfapps.sap.hana.ondemand.com/crud/invoke \
-H 'Content-Type: application/json' \
-d '{
"function": "write",
"arguments": ["data"]
}'
function specifies the name of the function in the chaincode (string) and arguments can be an array of string arguments for the chaincode function.
Since the application is stateless and completely relies only on the data of the user-provided service, the application can be scaled easily. If the application is under high load or traffic it should be scaled horizontally by adding more instances to the Cloud Foundry application. This can be done via the command:
cf scale com-sap-icn-gateway-example -i 5
After applying these changes, all incoming traffic is automatically load-balanced between all instances of the Cloud Foundry application.
This gateway example application does not support private data.
There are no known issues at this time.
This project is provided "as-is" without support.
Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This project is licensed under the Apache Software License, version 2.0 except as noted otherwise in the LICENSE file.