Application Authorization
Registering Applications to receive admin service events
Applications need to receive notifications for events so that they can react appropriately to circuit proposal events and other admin events.
To see these events, an application must register an application authorization handler for circuits with a specific circuit management type. This handler manages the voting strategy for the application and notifies the application of any events received from the admin service on the local Splinter node.
As part of the event registration, the application authorization handler must
specify the circuit management type. The circuit_management_type
string in
the circuit definition briefly describes the purpose of the circuit. For
example, the Grid application uses the type grid
for its circuits.
When an event occurs (such as a new circuit proposal or vote), each admin service uses a WebSocket connection to notify its application authorization handlers about the event. In order to receive WebSocket notifications, each application authorization handler must send a registration request to its Splinter node’s REST API.
For example, the Grid daemon would send this registration request:
GET /ws/admin/register/grid
Admin Service Events
A registered application authorization handler receives messages (via a WebSocket connection) about circuit proposal events.
-
The application authorization handler sends a request to the Splinter REST API. The request is a WebSocket handshake request that looks like this:
HttpRequest HTTP/1.1 GET:/ws/admin/register/grid headers: "SplinterProtocolVersion": "2" "upgrade": "websocket" "connection": "Upgrade" "sec-websocket-key": "13" "sec-websocket-version": "13" "authorization": "Bearer Cylinder:CYLINDER_JWT"
SplinterProtocolVersion can be set to “1” to receive Splinter 0.4 compatible AdminEvents. If not supplied, defaults to “2”.
-
If the request is successful, the server sends a response indicating that the protocol will change from HTTP to WebSocket. The response looks like this:
Response HTTP/1.1 101 Switching Protocols headers: "upgrade": "websocket" "transfer-encoding": "chunked" "sec-websocket-accept": "qRuMdykMYGEyIrjwimgOGL79D68=" body: Stream
-
After the protocol has been upgraded, the handler receives messages (via the WebSocket connection) about admin service events related to the Grid application. The event types include:
ProposalSubmitted
ProposalVote
ProposalRejected
ProposalAccepted
CircuitReady
CircuitDisbanded
These event messages are serialized JSON.
ProposalSubmitted
event
The serialized JSON message for a ProposalSubmitted
event looks like this:
{
"timestamp": 1636139918642,
"eventType": "ProposalSubmitted",
"message": {
"proposal_type": "Create",
"circuit_id": "blLHA-eDHvC",
"circuit_hash": "c939e0cd15c1ccec1dc1d2360658598db3bf3e63d3a0cc094f72939cf6c0af6b",
"circuit": {
"circuit_id": "blLHA-eDHvC",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
[
"version",
"2"
],
[
"peer_services",
"[\"a000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": null
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": null
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 1,
"circuit_status": "Active"
},
"votes": [],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n20959"
},
"event_id": 4
}
ProposalVote
event
The serialized JSON message for a ProposalVote
event looks like this:
{
"timestamp": 1636141093695,
"eventType": "ProposalVote",
"message": [
{
"proposal_type": "Create",
"circuit_id": "GUKtC-8q3x0",
"circuit_hash": "46283320452466eeb42c823673e01fcca36e99fe720ee11c90ccc580150235f4",
"circuit": {
"circuit_id": "GUKtC-8q3x0",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\", \"c000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\", \"c000\"]"
]
]
},
{
"service_id": "c000",
"service_type": "scabbard",
"allowed_nodes": [
"n3198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\", \"b000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": [3, .., 221]
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": [2, .., 164]
},
{
"node_id": "n3198",
"endpoints": [
"tcp://127.0.0.1:38044"
],
"public_key": [ 2, .., 194]
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 2,
"circuit_status": "Active"
},
"votes": [
{
"public_key": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"vote": "Accept",
"voter_node_id": "n8198"
}
],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n20959"
},
[3, .., 3]
],
"event_id": 16
}
ProposalRejected
event
The serialized JSON message for a ProposalRejected
event looks like this:
{
"timestamp": 1636140441149,
"eventType": "ProposalRejected",
"message": [
{
"proposal_type": "Create",
"circuit_id": "V9704-1UBvL",
"circuit_hash": "567b65c6eb1a4443f49a1b881a4b8b4fa3fa3e4df0974b842978e6f500975dd3",
"circuit": {
"circuit_id": "V9704-1UBvL",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": [3, .., 221]
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": [2, .., 164]
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 2,
"circuit_status": "Active"
},
"votes": [
{
"public_key": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"vote": "Reject",
"voter_node_id": "n8198"
}
],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n20959"
},
[3, .., 3]
],
"event_id": 12
}
ProposalAccepted
event
The serialized JSON message for a ProposalAccepted
event looks like this:
{
"timestamp": 1636140018589,
"eventType": "ProposalAccepted",
"message": [
{
"proposal_type": "Create",
"circuit_id": "blLHA-eDHvC",
"circuit_hash": "c939e0cd15c1ccec1dc1d2360658598db3bf3e63d3a0cc094f72939cf6c0af6b",
"circuit": {
"circuit_id": "blLHA-eDHvC",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": [3, .., 221]
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": [2, .., 164]
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 2,
"circuit_status": "Active"
},
"votes": [
{
"public_key": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"vote": "Accept",
"voter_node_id": "n8198"
}
],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n20959"
},
[3, .., 3]
],
"event_id": 5
}
CircuitReady
event
The serialized JSON message for a CircuitReady
event looks like this:
{
"timestamp": 1636140018602,
"eventType": "CircuitReady",
"message": {
"proposal_type": "Create",
"circuit_id": "blLHA-eDHvC",
"circuit_hash": "c939e0cd15c1ccec1dc1d2360658598db3bf3e63d3a0cc094f72939cf6c0af6b",
"circuit": {
"circuit_id": "blLHA-eDHvC",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": [ 3, .., 221]
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": [2, .., 164]
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 2,
"circuit_status": "Active"
},
"votes": [
{
"public_key": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"vote": "Accept",
"voter_node_id": "n8198"
}
],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n20959"
},
"event_id": 6
}
CircuitDisbanded
event
The serialized JSON message for a CircuitDisbanded
event looks like this:
{
"timestamp": 1636140320112,
"eventType": "CircuitDisbanded",
"message": {
"proposal_type": "Disband",
"circuit_id": "blLHA-eDHvC",
"circuit_hash": "89675159f2e5c0cd48d08f33ae63d446e26cbcd6c93d74eb6d449e24af7f8744",
"circuit": {
"circuit_id": "blLHA-eDHvC",
"roster": [
{
"service_id": "a000",
"service_type": "scabbard",
"allowed_nodes": [
"n20959"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03,038684ef88607ca0e5175fe31b7d94f65b30dc27ef838845f0496eb9c1126c8c82"
],
[
"version",
"2"
],
[
"peer_services",
"[\"b000\"]"
]
]
},
{
"service_id": "b000",
"service_type": "scabbard",
"allowed_nodes": [
"n8198"
],
"arguments": [
[
"admin_keys",
"03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
],
[
"version",
"2"
],
[
"peer_services",
"[\"a000\"]"
]
]
}
],
"members": [
{
"node_id": "n20959",
"endpoints": [
"tcp://127.0.0.1:18044"
],
"public_key": [3, .., 221]
},
{
"node_id": "n8198",
"endpoints": [
"tcp://127.0.0.1:28044"
],
"public_key": [ 2, .., 164]
}
],
"authorization_type": "Challenge",
"persistence": "Any",
"durability": "NoDurability",
"routes": "Any",
"circuit_management_type": "grid",
"application_metadata": "",
"comments": null,
"display_name": "circuit01",
"circuit_version": 2,
"circuit_status": "Disbanded"
},
"votes": [
{
"public_key": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"vote": "Accept",
"voter_node_id": "n20959"
}
],
"requester": "03f91f722329b99234be43f962e7ce33bbd4f2e72634a1a68f12ad908ca5693f03",
"requester_node_id": "n8198"
},
"event_id": 9
}