Cesium+ Pod offer RESTfull HTTP access:
ES CORE API: BlockChain indexation and statistics;ES USER API: User data indexation, such as: profiles, private messages, encrypted settings;ES SUBSCRIPTION API: User service subscription, such as: email notification service;Data is made accessible through an HTTP API :
http[s]://node[:port]/...
|-- <currency>/
| |-- block
| |-- blockstat
| |-- peer
| |-- movement
| `-- pending
|-- document/
| `-- stats
|-- message/
| |-- inbox
| `-- outbox
|-- invitation/
| `-- certification
`-- subscription/
`-- record
All stored documents use a JSON format.
Every document have the following mandatory fields:
version : The document's version.issuer : The document's emitterhash: the document's hashsignature: the signature emitted by the issuer. Since version: 2, only the hash is signed.Document deletion use a document with this mandatory fields:
index : The document's indextype : The document's typeissuer: The deletion issuer. Should correspond to the document's issuer, or the recipient in some special case (inbox message or invitation)time: the current timehashsignatureFor instance, a deletion on message/inbox should send this document:
{
"version" : 2,
"index" : "message",
"type" : "inbox",
"id" : "AV9VOeOuTvXJwYisNfU6",
"issuer" : "F13aXKWQPGCjSQAxxTyJYyRyPm5SqzFSsYYWSDEQGi2A",
"time" : 1509806623,
"hash" : "61EBBFBCA630E8B715C360DDE1CD6CABD92B9267CA4B724A2F1F36F0FF7E3455",
"signature" : "FOkYCX1b05LTAbtz72F/LMWZb8F8zhQKEqcvbuiQy1N6AXtCUC5Xmjcn+NeO9sCLdcmA0HxsJx42GnWZOmKCDA=="
}
node/*node/summaryGet software version of the pod (using the format defined by Duniter BMA API);
{
"duniter" : {
"software" : "cesium-plus-pod",
"version" : "1.6.1",
"status" : 200
}
}
node/statsGet statistics on the pod:
{
"stats" : {
"listeners" : [ {
"source" : "subscription/execution,record",
"count" : 1
}, {
"source" : "user/event",
"count" : 1
}, {
"source" : "group/comment",
"count" : 1
},{
"source" : "page/comment",
"count" : 1
}, {
"source" : "*/block",
"count" : 2
}, {
"source" : "g1/block/current",
"count" : 1
} ],
"cluster" : {
"timestamp" : 1583310606941,
"cluster_name" : "g1-es-data",
"status" : "yellow",
"indices" : {
"count" : 12
}
}
}
}
node/moderatorsGet pubkeys of node moderators. Moderators can delete document (profiles, etc.) on pod;
{
"moderators": [
"38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE",
"47JpfrGkoHJWtumeu7f67fbAxkvaHYVQBNo5GszNs61Z",
"HmH5beJqKGMeotcQUrSW7Wo5tKvAksHmfYXfiSQ9EbWz"
]
}
<currency>/block/current<currency>/block/<number><currency>/block/_search (POST or GET)<currency>/blockstatSearch on blocks, with count of each parts of a block: certCount, memberCount, txCount, txAmount, etc.
(using the ElasticSearch search API): <currency>/blockstat/_search (POST or GET)
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"failed" : 0
},
"hits" : {
"total" : 302494,
"max_score" : 1.0,
"hits" : [ {
"_index" : "g1",
"_type" : "blockstat",
"_id" : "29003",
"_score" : 1.0,
"_source" : {
"version" : 10,
"currency" : "g1",
"number" : 29003,
"issuer" : "H1yTj77m946f52u64FvR36o9SmD38Ye2j1H4XCvwBFXK",
"hash" : "0000024FD141E2DA5E3BCAC15CD558EF47BD9CB38DE022F2E0E8727AA885FCD4",
"medianTime" : 1498016342,
"membersCount" : 161,
"monetaryMass" : 10533000,
"unitbase" : 0,
"dividend" : null,
"txCount" : 1,
"txAmount" : 2500,
"txChangeCount" : 0,
"certCount" : 0
}
}
}
}
<currency>/peerSearch on peers by endpoint and API, with a status (UP, DOWN) and other stats on blockchain (main consensus, …)
(using the ElasticSearch search API): <currency>/peer/_search (POST or GET)
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"failed" : 0
},
"hits" : {
"total" : 691,
"max_score" : 1.0,
"hits" : [ {
"_index" : "g1",
"_type" : "peer",
"_id" : "54F93B092CAA3A4B287F39517C7B446A2D010BE4DD0E2FDBC76E0920B3714532",
"_score" : 1.0,
"_source" : {
"api" : "BASIC_MERKLED_API",
"dns" : null,
"ipv4" : "91.160.74.131",
"ipv6" : "2a01:e0a:12:a0c0:4951:28fb:745a:9ec9",
"epId" : null,
"pubkey" : "8dyDUH4KCMgpHkzAS9uu4NWPSf2xBmrp6D6S7d37A8M7",
"hash" : "54F93B092CAA3A4B287F39517C7B446A2D010BE4DD0E2FDBC76E0920B3714532",
"currency" : "g1",
"stats" : {
"version" : "1.5.9",
"status" : "DOWN",
"blockNumber" : 76834,
"blockHash" : "000005D2162A8ECDC3A1268FC76D1F42AC3DEAE0479640D56D877796EB6F4968",
"error" : null,
"medianTime" : 1512998820,
"hardshipLevel" : null,
"consensusPct" : 77.77777777777777,
"uid" : null,
"lastUpTime" : 1513002789,
"mainConsensus" : true,
"forkConsensus" : false,
"firstDownTime" : 1564882432
},
"port" : 10901,
"useSsl" : false
}
}
}
}
<currency>/movementAllow to search on all blockchain transactions, but split by issuer.
(using the ElasticSearch search API): <currency>/movement/_search (POST or GET):
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"failed" : 0
},
"hits" : {
"total" : 67237,
"max_score" : 1.0,
"hits" : [ {
"_index" : "g1",
"_type" : "movement",
"_id" : "AWAsh08ZeZsmCDV2GYit",
"_score" : 1.0,
"_source" : {
"currency" : "g1",
"medianTime" : 1498016342,
"version" : 10,
"issuer" : "TENGx7WtzFsTXwnbrPEvb6odX2WnqYcnnrjiiLvp1mS",
"recipient" : "D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx",
"amount" : 320,
"unitbase" : 0,
"comment" : "REMU:28501:29000",
"reference" : {
"index" : "g1",
"type" : "block",
"id" : "29003",
"anchor" : null,
"hash" : "0000024FD141E2DA5E3BCAC15CD558EF47BD9CB38DE022F2E0E8727AA885FCD4"
},
"ud" : false
}
}
}
<currency>/pendingAll pending membership, collected from Duniter peers (selected randomly, each hour);
Allow to search on pending memberships (including old memberships), using <currency>/pending/_search (using ES search API);
Output as Duniter BMA format, using <currency>/pending:
{
"memberships" : [ {
"pubkey" : "C59xaJfBXLpn9YhKet64KS3geTV9UQjvkLqpcTDy6dcK",
"uid" : "JacquesDupond",
"version" : "10",
"currency" : "g1",
"membership" : "IN",
"blockNumber" : 302423,
"blockHash" : "0000038FD71F131B76FF76F3E1D0CBA08901DD350551867CE5611DDAA1C1E057",
"written" : null
}, {
"pubkey" : "GhicsNYYPrMvp1inmgxKUjww1s9PLnuzSV8CGtHrjUbq",
"uid" : "MikeHorn",
"version" : "10",
"currency" : "g1",
"membership" : "IN",
"blockNumber" : 302376,
"blockHash" : "000000F466B3BE9E93B1C19FF7A6A5556D9CD750D84458B660FEA1B81BA406B2",
"written" : null
}]
}
user/*user/eventuser/event/_search?q=issuer:<pubkey> (GET)user/event/_search (POST or GET)user/profileuser/profile/<pubkey>user/profile (POST)
user/profile/_update (POST)
invitation/certification/_delete (POST)user/profile/_search (POST or GET)A profile document is a JSON document. Mandatory fields are:
title: user name (Lastanem, firstname…)time: submission time, in seconds (UTC unixtime)issuer: user public keyhash: hash of the JSON document (without fields hash and signature)signature: signature of the JSON document (without fields hash and signature)Example with only mandatory fields:
{
"version" : 2,
"title" : "Pecquot Ludovic",
"description" : "Développeur Java et techno client-serveur\nParticipation aux #RML7, #EIS et #Sou",
"time" : 1488359903,
"issuer" : "2v6tXNxGC1BWaJtUFyPJ1wJ8rbz9v1ZVU1E1LEV2v4ss",
"hash" : "F66D43ECD4D38785F424ADB68B3EA13DD56DABDE275BBE780E81E8D4E1D0C5FA",
"signature" : "3CWxdLtyY8dky97RZBFLfP6axnfW8KUmhlkiaXC7BN98yg6xE9CkijRBGmuyrx3llPx5HeoGLG99DyvVIKZuCg=="
}
Some additional fields are description, socials, tags and avatar :
{
"version" : 2,
"title" : "My profile name",
"description" : "#developer",
"city" : "Rennes",
"socials" : [ {
"type" : "diaspora",
"url" : "https://diaspora-fr.org/people/f9d13420f9ssqzq97aa01beea1f31e2"
} ],
"time" : 1487422234,
"tags" : [ "developer" ],
"issuer" : "2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ",
"avatar" : {
"_content_type" : "image/png",
"_content" : "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkC(...)" // base 64 encoding
}
"hash" : "85F527077D060E03ECAC6D1AE38A74CCC900ACAF5D52F194BA34F5A5E8A55139",
"signature" : "WeP7JEwttAoSkHcuiFwo6N4SM0uVakTYBQ09H1+K8/nPFyxO3ak1U9EQ6qaQFoAx9IdDp5qO2EX662wP/pcEAg==",
}
user/settingsuser/settings/<pubkey>user/settings (POST)user/settings/_delete (POST)user/settings/_search (POST or GET)Some additional fields are content (the settings content, but encrypted) and nonce (required for an optimal encryption security level) :
{
"hash" : "58ECD135719628AA6DCE6DEFE1C2B328B04047B836BC478D0CF9E6F5A515896EC",
"signature" : "3zP/mOgwnTj6EAfhb9vNfSUoPLZLqMwTP9QDk4wShTXlWnFPmPl2To3VTAoS3aHbLQAKDAWZa6EeVfsYCDVoDg==",
"issuer" : "EtmXYFdh6WjgKyX3D6s2fXphCDv7jRPRnqnkKFTdMwNr",
"nonce" : "Lfv5wXbLKF3RY9qbQVgv914ZKbsVi1sAm",
"time" : 1516311640,
"content" : "4bW4cL075bLWuTrHRuo69P0glmZJiVKF/AOtRt1e3trcm+Es/E77cYdAL00TCQw8N1kVU6fznCmZyVxtD8gfxpZwcoipWjWeTZTu21SxtPDxTxEvAV4gxbmOk/Li9oMy04WOmpkbsKawmdYW2oaKzz3psJXn4C4/jFQZIL/X863R9sQDGWPHm8MRvCaP7xQT+MMSpb8/1lIgf5443PKBixQbcY4fcqDRK3365xG2jDZEJ/uVZ/bRPJyjclKgBEd8xariJUV+zdh31f/qHhnQlcg/kLmdQ4sja2L/BWE5kTFlajRqOJDGrtuRafWTFamoUKZDE8C9YeivvFR7oGwY0zPE0uFnuZCGAvm3xC13ekpsqDv9YtBmZhou7AZAtw9JV81QuHoorWrka7C3LW12YuOSBKxkZNCi0tPHmF2ArI5WJl7W",
"version" : 2
}
message/*message/inboxLimited to 50 messages every day, per IP address
Some additional fields are recipient (the message recipient), title (the encrypted message's title), content (the encrypted message's body) and nonce (required for an optimal encryption security level) :
{
"issuer" : "DMwEdBiWuCGkPvtfvGs7fAoyaqbiA3ZXeX5grcNsg5x8",
"recipient" : "FbvRnCM8gQdDig614qR1y1QY7x7sUN2RzXr3a9D9Rzw4",
"title" : "jBhFV2kDyUvDxmYtodsO1D9ZpbX+j2vyOjVuMkgWa4vTyvM6VCqZWhutwYpMmXr1vdA=",
"content" : "sX5/XOwcZe2RUIM2jd7Wlz9NoLTvgxPbNXZtNU8Qa4vT2qApB2rHFloNFdk+mHHo+NOfwk6RZjU3gnmUN0yi3eyUIOr2FYAoltdhx6C4Zmd9JQy5jVMzKg1HfD6K7daYbtN72ZTLfIxwlnAXG8z1+Rf9hZcmRNSIpFJ6lC2IUFcrFbulE8EsZuMPtrfuLlzNoW8HButmBlfbkMlALKcOcGYhVUCFhVAiL5FSgF+sHsUZe9CtubeGPlNT9m1y2joNZ8B4/rBn97XGV5odsaZZBO5gqcRQN4Y9SJSaNEbNFdaeWIFaO4NPT0r48eXKP4OGhYeQl4vCUQGG21U+GmcJiT4hiYJm41Xwp+qyjePlJ+om",
"time" : 1504199349,
"nonce" : "CWKAtBXqXu2ZuifeHnRBePw15e36gw3v9",
"hash" : "965E9C4693C0B63C6F4CC6924A93354F0CE2B16F91BF0243FB5A355B4222D502",
"signature" : "f0sPHFKukSbIahwkrYzPis9T5fP73QuH6UB76IdXN0JeWfg3Gh9A0oUc/YL78QmcKaM0FrD8JoK8BqYZNd1YAQ=="
}
content and title are encrypted for the issuer box public key.
Only the message issuer will be able to decrypt this fields.
message/outboxLimited to 50 messages every day, per IP address
content and title are encrypted for the recipient box public key.
Only the message recipient will be able to decrypt this fields.
invitation/*invitation/certificationinvitation/certification/<id>invitation/certification (POST)invitation/certification/_delete (POST)invitation/certification/_search (POST or GET)like/*like/recordAll documents stored in this index have a mandatory kind attribute, with one of the following values:
Only record with VIEW kind can be anonymous (no issuer and signature attributes).
This index allow you to:
Count like records by kind, on any document (e.g. number of stars on a profile): /<doc_index>/<doc_type>/_likes, <doc_index>/<doc_type>/_abuses, etc.
/user/profile/<pubkey>/_likesAdd a new like record: like/record (POST)
To delete a existing like record, use: history/delete (POST)
subscription/*subscription/recordsubscription/record/<id>subscription/record (POST)subscription/record/_delete (POST)subscription/record/_search (POST or GET)