About
This is on open source project which aims to make easy solution with timestamping data on blockchain
Swagger
https://history.bankex.team:3001/
Backend handlers
[POST]
Authentication: Basic Auth
Route: a/new/:assetId/:hash
Description: Allow to create new AssetID with Hash.
Return: JSON
{
"assetId": Id of current asset chaid
"hash": hash of file what we've got from product server
"merkleRoot": root of merkle tree at Ethereum
"timestamp": UNIX format time when server got hash of file
"txNumber": Number of asset from assetId
}
Return: JSON if Error
{
"Answer": "This assetId is already created"
}
It's a POST request btw
Example: http://history.bankex.team:8080/a/new/testAsset/0293a80682dc2a192c683baf434dd67343cedd70
[POST]
Authentication: Basic Auth
Route: /update/:assetId/:hash
Description: Allow to add new asset to assetId. Returns txNumber of this hash, timesamp
Return: JSON
{
"assetId": Id of current asset chaid
"timestamp": UNIX format time when server got hash of file
"txNumber": Number of asset from assetId
}
It's a POST request btw
Example: http://history.bankex.team:8080/a/update/testAsset/0293a80682dc2a192c683baf434dd67343cedd70
[GET]
Route: /get/:assetId/:txNumber
Description: Return asset hash by assetId and txNumber
Return: JSON
{
"assets": current asset
}
Example: http://history.bankex.team:8080/get/testAsset/0
[GET]
Route: /proof/:assetId/:txNumber/:hash/:timestamp
Description: Return list of merkle proofs by assetId, txNumber, hash, timestamp
Return: JSON
More about return: Merkle proof for assetId, txNumber, hash, timestamp (Actually send a JSON File with two arrays Data and Info
Data is a list of merkle proofs leaves from end to start (256 Hashes of type Buffer)
Info has parameters:
- Key - array key
- Hash - array value
- Root - current merkle tree Root Hash
Response looks like:
{
{
"Data": [
{
"Hash": "QGTfJZ5sF0U5U0nwQDI0q+FXE7p+87DGZ1bhijbapPU="
},
{
"Hash": "hBp5I5E3E57YRPCIRziHXVdlPSF3nWCNKmRRcS+nQZc="
},
{
"Hash": "SZEJoTogdMeznCpdpIIqXM+ztBfXnLxnFCOUYTl4Jm4="
}
],
"Info": {
"Key": "VCRbbhhUHqe//lRV3RDBawTnATBTeZNsm9FQtwR9JMw=",
"Hash": "2TmoNwyUYfmxtInasAyC9xyKM7hcZq9MokNwAoQxwek=",
"Root": "5JX8dfEibcncG2fGp0YcG5UTY9LgrNdQoq4TWL8WpUs="
}
}
Example: http://history.bankex.team:8080/proof/a/0/0293a80682dc2a192c683baf434dd67343cedd70/1210000000
[GET]
Route: /list
Description: Return all assets info
Return: JSON
{
{
"assets": [
{
"_id": "5b869ee5ca2985e06552a49d",
"data": "",
"hash": "qNCllA0uMdgEPSVQBYzD4JESEECY2NyjbJgGjy0NP6c=",
"created_on": 1535549157514,
"updated_on": 1535549157514,
"assetId": "bf",
"txNumber": 0,
"assets": {
"0": "ludYELf+UZ3ZL2o/chcLAMCoqVU/nHZaPMaB6vfuqzg="
},
"assetsTimestamp": {
"0": 1535549157514
}
}
]
}
}
Example: http://history.bankex.team:8080/list
DevOps
There are 3 servers here
Product server: works with MongoDb and is working on port 3001
Blockchain server: works with MongoDb and is working on port 8080
Client server: works with 2 servers on port 7070
NOTE:
It's better to use more than 1 domain for project.
Blockchain server is just a tool, so there is no point to change it.
But product and client servers can be different. You can only run Blokchain server and make you own product and client server.
You just need to have a Verify Function implemented in client part to verify merkle proofs.
It's here https://github.com/BANKEX/poa-history/blob/client/assets/download/index.js
About ENV
PVT_KEY: Private key at Rinkeby network
CONTRACT_ADDRESS: target contract address
LOGIN_DB: Login of Mongo
PASSWORD_DB: Password of Mongo
IP: IP/URL of Mongo
LOGIN: Login for basic auth from users
PASSWORD: Password for basic auth from users
Deploying
mkdir docker
cd docker
sudo nano docker-compose.yml
docker swarm init
docker stack deploy -c docker-compose.yml poa_hist
FAQ
How to proof that file was uploaded with hash N and timestamp T Upload:
- Make a Sparse Merkle tree, where the value is (N, T) (Before all, it's important to save N, T, Id of the file)
- Put Merkle root to Ethereum server Proove:
- Download the file and get N and T
- Check that N = N saved before uploading
- Do the same for T
- Ask for Merkle proof from server
- Get Merkle root from Ethereum contract
- Check that Merkle proof is correct ( it's a function with inputs: Hash file, timestamp file, assetId, txNumber - all these parameters client at the beginning)