Azimuth.eth is used for storing all
data related to Azimuth points and their ownership, and should be considered to
be the ledger for Azimuth. This contract is just a data store - it only contains
the bare minimum of business logic. See Ecliptic.eth
for the contract containing the business logic for this ledger. Azimuth.eth
cannot be modified directly by galaxy vote - they are
only eligible to modify the Ecliptic.
Global state
The global state of Azimuth.eth
is given by the following.
// points: per point, general network-relevant point state
//
mapping(uint32 => Point) public points;
// rights: per point, on-chain ownership and permissions
//
mapping(uint32 => Deed) public rights;
// operators: per owner, per address, has the right to transfer ownership
// of all the owner's points (ERC721)
//
mapping(address => mapping(address => bool)) public operators;
// dnsDomains: base domains for contacting galaxies
//
// dnsDomains[0] is primary, the others are used as fallbacks
//
string[3] public dnsDomains;
Urbit ID's are formalized as ERC-721 non-fungible
tokens and are indexed by a number
between 0
and 2^32-1
, e.g. a uint32
. There are two data structures
associated to a given uint32
: a Point
and a Deed
.
Point
s
A Point
contains data about networking keys and sponsorship status, arranged
in the following struct
:
struct Point
{
// encryptionKey: (curve25519) encryption public key, or 0 for none
//
bytes32 encryptionKey;
//
// authenticationKey: (ed25519) authentication public key, or 0 for none
//
bytes32 authenticationKey;
//
// spawned: for stars and galaxies, all :active children
//
uint32[] spawned;
//
// hasSponsor: true if the sponsor still supports the point
//
bool hasSponsor;
// active: whether point can be linked
//
// false: point belongs to prefix, cannot be configured or linked
// true: point no longer belongs to prefix, can be configured and linked
//
bool active;
// escapeRequested: true if the point has requested to change sponsors
//
bool escapeRequested;
// sponsor: the point that supports this one on the network, or,
// if :hasSponsor is false, the last point that supported it.
// (by default, the point's half-width prefix)
//
uint32 sponsor;
// escapeRequestedTo: if :escapeRequested is true, new sponsor requested
//
uint32 escapeRequestedTo;
// cryptoSuiteVersion: version of the crypto suite used for the pubkeys
//
uint32 cryptoSuiteVersion;
// keyRevisionNumber: incremented every time the public keys change
//
uint32 keyRevisionNumber;
// continuityNumber: incremented to indicate network-side state loss
//
uint32 continuityNumber;
}
Deed
s
A Deed
says which Ethereum address owns a given Point
as well as several
proxies for that Point
.
struct Deed
{
// owner: address that owns this point
//
address owner;
// managementProxy: 0, or another address with the right to perform
// low-impact, managerial operations on this point
//
address managementProxy;
// spawnProxy: 0, or another address with the right to spawn children
// of this point
//
address spawnProxy;
// votingProxy: 0, or another address with the right to vote as this point
//
address votingProxy;
// transferProxy: 0, or another address with the right to transfer
// ownership of this point
//
address transferProxy;
}
Other state
Finally, each Ethereum address may set for itself a number of operators
, as
defined and required by the ERC-721
standard.
These are for third party brokers/wallets/auctioneers/etc such as
OpenSea, which facilitate exchange of ERC-721 tokens.
Azimuth.eth
also contains some other state—dnsDomains
—which are domain names by
which the IP address of a galaxy may be looked up, e.g. zod.urbit.org
resolves
to 35.247.119.159
. This is used for bootstrapping the network from DNS. Three
domains may be listed here, but as of today they are all urbit.org
. This may
only be updated by the owner of Ecliptic, but arguably each galaxy ought to be
able to set its own domain name and so we do not expect this to remain the case
forever.
All data in this ledger is stored and processed locally on your ship by the
%azimuth
Gall agent, including layer
2 data. Because state transitions resulting from layer 2
transactions are not included in this ledger, in general the local store will
differ from what is kept in Azimuth.eth
.