Name Server protocol
The protocol used by Jami to query and register a name is based on an HTTP REST API answering requests with JSON documents and regular HTTP status codes.
The public name server is hosted at ns.jami.net
. Another implementation could use any other database
or directory service making the name server protocol reusable.
If you run your own name server, looking up a username in the form of
username@example.com
will look up the name username
with the
name server at example.com
(there is no need to add @ns.jami.net
to use the default name server).
Rules on name formatting
Usernames are checked by a regex to ensure some rules about their format:
Length must be between 3 and 32 characters
Those characters must be alphanumerical with dashes
-
being also accepted.
Querying a name
This is the main service provided by a name server. It enables getting the Jami ID corresponding to a username.
Request name
A request for the name foobar
is a GET
request with /name/foobar
* as the URI.
Response name (Success)
If the name is found, a response with status code 200 OK
must be
sent to the client with a Content-type
field set as
application/json
.
The body is a JSON documents with 2 string attributes : name
and
addr
. name
is equal to the one requested and addr
is a
hexadecimal representation of the Jami ID prefixed with 0x
.
In our example, the JSON answer would be:
{
"name":"foobar",
"addr":"0x29347542eb07159f316577e1ae16243d152f6b7b"
}
Response name (Not found)
If the name is not found, a response with status code 404 Not Found
must be sent to the client with a Content-type
field set as
application/json
.
The body is a JSON documents with 1 string attribute : error
. This
attribute is filled with an error message that explains the error (and
could be displayed in the client in the future).
On the reference implementation, the returned document is:
{
"error":"name not registred"
}
Querying an address
This service is a reverse lookup. You query for an address and a username is returned if one is registered on the name server.
Request address
A request for the ID jami:29347542eb07159f316577e1ae16243d152f6b7b
is a GET
request with
/addr/29347542eb07159f316577e1ae16243d152f6b7b
as the URI.
Response address (Success)
If the address corresponds to a username, a response with status code
200 OK
must be sent to the client with a Content-type
field set
as application/json
.
The body is a JSON documents with 1 string attribute : name
. The
value of this field is the name registered to this address
In our example, the JSON answer would be:
{
"name":"foobar"
}
Response address (Not found)
If the address is not found, a response with status code 404 Not Found
must be sent to the client with a Content-type
field set as
application/json
.
The body is a JSON documents with 1 string attribute : error
. This
attribute is filled with an error message that explains the error (and
could be displayed in the client in the future).
On the reference implementation, the returned document is:
{
"error":"address not registred"
}
Registering a name
This part of the protocol is used to register a new name/address pair. It is used on the main public registry but may be optional in a custom implementation.
Request register
A request for registering the name foobar
is a POST
request with
/name/
foobar
as the URI. The header attribute Content-type
must
be set to application/json
.
The body of the request is a JSON document with 2 string attributes:
addr
and owner
. addr
contains the Jami ID prefixed with 0x
and owner
is the name to be registered.
An example for foobar
could be:
{
"addr":"0x29347542eb07159f316577e1ae16243d152f6b7b",
"owner":"foobar"
}
Response register (Success)
If the name/address pair is successfully registered, a response with
status code 200 OK
must be sent to the client with a Content-type
field set as application/json
.
The body contain a JSON document with 1 boolean attribute success
set
to true
.
As an example:
{
"success":true
}
Further attempts to query the name or the address should then be successful.
Response register (Bad request)
If the registration cannot be achieved because of an error in the
request (formatting, missing attribute, etc.), a response with status
code 400 Bad Request
must be sent to the client with a
Content-type
field set as application/json
.
The body is a JSON documents with 2 attributes: success
which is a
boolean and error
which is a string. success
is set to false
and error
is filled with an error message that explains the error
(and could be displayed in the client in the future).
For an invalid formatting of the username, the body could be:
{
"success": false,
"error": "invalid name"
}
Response register (Forbidden)
If the registration cannot be achieved because the name is already
taken, a response with status code 403 Forbidden
must be sent to
the client with a Content-type
field set as application/json
.
The body is a JSON documents with 3 attributes: success
which is a
boolean set to false
, name
and addr
which are both strings
replicated from the original request.
Registering foobar
, with it being already registered, would lead to
the following response:
{
"success": false,
"name":"foobar",
"addr":"0x29347542eb07159fdeadbeefae16243d152f6b7b"
}
Some links
gitlab:jami-nameservice: reference NodeJS implementation used by
ns.jami.net
and querying an Ethereum node.