- #Cjdns Domain Name System
- *The unnamable is the eternally real. Naming is the origin of all particular things.*
- ##Requirements
- r0: *must not fork* this is of critical importance, if a wxyz goes to 1.2.3.4 here it must
- also goto 1.2.3.4 over there. We must have an anti-fork logic, in simple terms, all honest nodes
- must be able to come to agreement on the truth even if that truth is wrong.
- There have been some suggestions of "trust based systems" and also people talked about just
- dishonering ICE/US.gov dns takedowns. Those things were never implemented because they violate
- the fundamental rule of names, they must always be the same.
- r1: Name hijacking must be impossible (or as close to it as is feasible)
- We can't have people going around taking someone else's name because they don't like them, by
- technical means (haxxors), or by social/political means (government, angry.com, etc)
- 21:57 <@ircerr> did you miss r2?
- 21:57 <@cjd> indeed
- 21:57 <@cjd> we'll leave it for extensibility
- r3: it needs to be fast if it's not fast then people will not use it. Fast is sub-100-milliseconds.
- cjdns network code will improve but we must not rely on underlying technologies improving,
- this needs to be fast out of the box or it's dead in the water.
- r4: It must be difficult to take more domains than you need but easy to take enough for your needs.
- Problem with bitcoin/dns is that it's fixed rate so at first noone wants it because it's all
- experimental and it costs money because telling a geek to pay money for the privilege of fooling
- around with a new system is like telling him to kill a kitten. Once it gets off the ground,
- all the sudden it doesn't cost enough and people are scrambling to vacuum up all of the domains.
- r5: Any "hot" signing key which needs to be on a live server must be revokable and replaceable
- using an offline key. TLDs should be able to have multiple offline keys which need a quorum to
- change the hot key.
- r6: Simplicity of installation and configuration. It is a lot to ask the user "who do you trust",
- asking "how do I find X" is too much.
- ##Implementation Proposal
- I propose a system whereby each TLD is a root signing key, users install the key for a TLD thus
- trusting the TLD (similar to how users trust certificate authorities). Each TLD is a central
- authority which has the power to intelligently fulfill r4. In order to best provide for r1 despite
- central authorities, we must make these central authorities as powerless as possible.
- I propose domain signatures be notarized using spam BTC transactions so that the world knows they
- are there and nobody, even the TLD, can "ninja transfer" them (see: [Security Considerations]).
- All registrations should expire after a set amount of time which can conveniently be measured in
- BTC blocks so everyone can agree on when the change occurs.
- r3 means there will need to be a lot of caches, like the clients, these must only accept domains
- for the TLDs which are authorized by the cache owner.
- To fulfill r3, clients must be able to prove validity of information given to them from a cache
- with a minimum of stored data. By making clients hold only the block headers back from the current
- one to the last one which could possibly hold a valid domain registration, the cache can show proof
- of the registration's validity through a merkle branch. A year of headers occupies about 5MB of
- space.
- In order to intelligently implement r5, it makes sense that TLD operators should hold multiple
- keys and a quorum of signatures should be required to make a change to the TLD's hot domain
- signing key. TLD operators must *not* be able to add or remove other keys for their TLD.
- The idea of TLD operators being able to maintain their TLD master keys for perpetuity is
- intoxicating but the prospect of feuds inside of the group is devastating whereas the need to
- remove a lost key or add a new member to the group is relatively small and in the worst cases
- (50% of the keys are lost or compromised), new updates can be advertized which authorize new keys.
- r6 requires that there be as little manual configuration as possible. I propose a peer-to-peer
- design where cache nodes gossip new BTC block headers and domains amongst each other and introduce
- clients and caches to other caches.
- ##Domain Lifecycle
- 1. Webmaster registers a domain linking a name to one or more ip addresses of his nameservers
- and authorizing a master key to make changes to that domain.
- 2. Webmaster maintains domain by re-registering using master key to sign the registration.
- 3. Webmaster changes nameserver ip addresses linked to the name by way of re-registration.
- 4. Webmaster abandons domain by not re-registering it, after a dormant period, the domain becomes
- available to new registrations.
- 5. Webmaster loses his master key and applies to the TLD operator to be able to re-register his
- domain. When expires and becomes registrable by anyone, TLD operator holds out allowing others to
- register it in order to get webmaster's domain back. Webmaster's domain is down for the 7 day
- blackout period.
- 6. Webmaster forgets about maintaining his domain, domain enters blackout period, webmaster
- has some time to re-register before domain becomes registrable by anyone.
- ##Details
- After a per-TLD defined amount of time following the time when a domain was registered, the
- domain will become inaccessible, this amount of time is defined by `Domain Validity Period` in
- the TLD META Information. After a second amount of time, known as `Domain Blackout Period` the
- domain may be registered by parties other than it's original owner.
- (See: [TLD Identifier and META Information] )
- Registering a domain happens by hashing a domain entry and having the TLD operator sign the hash.
- This allows the TLD operator to choose to remain ignorant of the actual domain so they can ensure
- that if external pressure is placed on them to not re-register a particular domain, it is obvious
- as they are forced to abandon the hash signing policy.
- To register a domain, a TLD operator signs a hash of the domain entry then from a batch of entries,
- creates a Merkle tree and makes a trivially small Bitcoin payment to a Bitcoin wallet address
- derived from root of the Merkle tree thus notarizing the entry.
- A domain is valid if all of the following are true:
- 1. Contains a valid signature from TLD operators key.
- 2. A Merkle branch is known which hashes back to an accepted Bitcoin block header.
- 3. Domain is less than `Domain Validity Period` BTC blocks old.
- 4. No known valid domain with the same name is older by less than `Domain Validity Period`
- PLUS `Domain Blackout Period` blocks unless it's key is the one which signed this domain entry.
- 5. No known valid domain with the same name is newer.
- ##Domain entry
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | |
- + +
- 4 | First 12 bytes of SHA-256 of domain name |
- + +
- 8 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 12 | Version | Entry Metadata (version specific) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | |
- + +
- 20 | |
- + +
- 24 | |
- + +
- 28 | 32 Byte Entry Body |
- + Content is version specific +
- 32 | |
- + +
- 36 | |
- + +
- 40 | |
- + +
- 44 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 48 | |
- + +
- 52 | |
- + +
- 56 | |
- + +
- 60 | 32 Byte Re-Registration/Transfer Signing Key |
- + +
- 64 | |
- + +
- 68 | |
- + +
- 72 | |
- + +
- 76 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 80 | |
- + +
- 84 | |
- + +
- 88 | |
- + +
- 92 | Re-Registration/Transfer Signature |
- + Undefined if not applicable. +
- 96 | |
- + +
- 100 | |
- + +
- 104 | |
- + +
- 108 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 112 | |
- + +
- 116 | |
- + +
- 120 | |
- + +
- 124 | TLD Operator's Signature |
- + +
- 128 | |
- + +
- 132 | |
- + +
- 136 | |
- + +
- 140 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ###Notes
- 12 bytes of SHA-256 of domain name is plenty, collisions are not a security risk.
- Caches must keep a separate namespace for each TLD, lest a TLD operator allow registration of
- 2^96 domains.
- Signatures and signing keys are Edwards-curve25519-SHA-512
- As described here: http://ed25519.cr.yp.to/software.html
- There is no global version number as I know of no case where a cryptographic break
- in a large scale system such as DNS was solvable with any measure of backward compatibility.
- TLD Operator's Signature is a signature on the SHA-256 of the first 112 bytes of the entry
- (everything up to it). TLD operators do not need the entry in order to sign, only the SHA-256.
- ###Domain entry version 0 - metadata
- Bytes 12-15 of the domain entry shall be as follows:
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 12 | Zero | Zero | Body Type |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `Body Type` field shall denote the format of the content in the `Entry Body` field.
- Bytes one and two may be used with different `Body Types`.
- Nodes must treat as invalid any domain entry of `Body Type` 0-2 where these bytes are non-zero.
- ####Body Type 0
- This type is intended for pointing to authoritative nameservers in the IPv4 space.
- Bytes 16-47 of the domain entry shall be as follows. If less than 8 nameservers are
- provided, the high entries shall be `0.0.0.0`. Any entry containing the address
- `0.0.0.0` and a non-zero address following it must be regarded as invalid. If there
- is not at least 1 non-zero entry, the body is invalid.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 20 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 24 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 28 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 32 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 36 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 40 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 44 | IPv4 Address of Nameserver |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ####Body Type 1
- This type is intended for pointing to authoritative nameservers in the IPv6 space.
- Bytes 16-47 of the domain entry shall be as follows. The second entry may be all
- zeros to indicate that there is only one entry, the first entry may not be or else
- the body is invalid.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | |
- + +
- 20 | |
- + IPv6 Address of Nameserver +
- 24 | |
- + +
- 28 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 32 | |
- + +
- 36 | |
- + IPv6 Address of Nameserver +
- 40 | |
- + +
- 44 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ####Body Type 2
- This type is intended for pointing to a single authoritative nameserver in a cjdns network.
- Bytes 16-47 of the domain entry shall be as follows.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | |
- + +
- 20 | |
- + +
- 24 | |
- + +
- 28 | |
- + Nameserver's cjdns Public Key +
- 32 | |
- + +
- 36 | |
- + +
- 40 | |
- + +
- 44 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- #####Notes
- Caching subdomains is out of scope, it requires more signatures and creates more risk of
- out-of-date data and new attacks. if caching is required, it should use an entirely different
- protocol.
- ##Notarization process
- Once the domain entry has been created, the TLD operators will sign the hash of it, RIPEMD-160 the
- hash which they signed, Base-53 encode the RIPEMD-160 hash, creating a valid Bitcoin address, then
- make a micropayment to that address such that the address will be included in the Bitcoin chain.
- The reference implementation will make an RPC call against a companion Bitcoin daemon in order to
- avoid implementing the vast majority of the Bitcoin algorithm.
- Any transaction which is larger than 1020 bytes cannot be fit into a 1024 byte UDP packet and is
- thus not usable. Unfortunately, the Bitcoin engine makes it's own decisions about how to create a
- transaction so it is possible to make a tiny payment only to find it has used many sources and thus
- has a large transaction. In practice this seems not to be an issue, the average transaction length
- is 449 bytes [Average Bitcoin Transaction Size] and excluding intentionally large transactions,
- they are usually 259 bytes. In the short term, it is probably acceptable to simply check for
- oversized transactions and fail if there are any, if this ever proves to be an actual problem,
- the Bitcoin code could be patched to shuffle money around internally in order to prevent this from
- ever happening.
- To support registering as many as 8192 domains in a batch (using one Bitcoin transaction), TLD
- operators may create a SHA-256 Merkle tree from the hashes and only RIPEMD-160 the root of the
- tree. In order to fit inside of a 1024 byte response packet, a batch can contain only at most 13
- nodes in the Merkle branch, thus limiting a batch to 8192 domains.
- ##On Wire Protocol
- Content shall be sent in UDP packets.
- All nodes must regard packets with content larger than 1024 bytes as invalid.
- Each packet begins with a single byte indicating what type of message it is.
- ###Lookup cycle
- A client will receive "legacy" DNS lookups from the programs in the operating system and must make
- requests in the DNS system. It is the responsibility of the client to convert all names to
- lowercase such that registering "WEBSITE.DOM", while valid, will not trap users who happen to type
- the domain in all caps.
- If the client has no key for the TLD installed, it must respond with "unauthorized for zone" DNS
- response, allowing the program to choose the next DNS server in resolv.conf.
- To resolve a domain, a client will begin by sending a request to a cache which is known to support
- the domain's TLD. A lookup request is defined by it's first byte which is zero, following three
- bytes which must also be zero, following 12 first bytes of the hash of the domain, and finally the
- 32 byte TLD identifier.
- ####Message Zero The Request
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Zero | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + +
- 8 | First 12 bytes of SHA-256 of domain name |
- + +
- 12 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | |
- + +
- 20 | |
- + +
- 24 | |
- + +
- 28 | |
- + TLD Identifier +
- 32 | |
- + +
- 36 | |
- + +
- 40 | |
- + +
- 44 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Caches must regard requests which are of the wrong length or whose first 4 bytes are
- not zero as invalid.
- The cache will send back the 144 byte domain entry, a buffer of pairs of SHA-256 hashes, comprising
- the Merkle branch leading back to the Bitcoin transaction, the content of the Bitcoin transaction
- in Bitcoin's on-wire transaction serialization format, the Double-SHA-256 hash entries comprising
- the Merkle branch leading from the transaction back to the block header, and finally the 8 byte
- index of the block header in the chain.
- ####Message One: The Response
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | One | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + +
- 8 | |
- + +
- --- 144 Byte Domain Entry ---
- --- ---
- + +
- 136 | |
- + +
- 140 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 16 | |
- + +
- --- 0 to 13, 64 byte Merkle nodes ---
- --- ---
- + +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + +
- ?? | Proof of validity |
- + +
- ?? | |
- ........
- #####Notes
- The 144 byte Domain Entry and Merkle nodes leading back to the root which is in the Bitcoin
- transaction are mandatory, the proof of validity may be excluded to prevent the packet growing
- larger than 1024 bytes. Clients must regard as invalid, any response for which bytes 1, 2, or 3
- are not zero.
- ####Proof of validity
- A proof of validity is the data which is needed to link the root of a Merkle tree from a response
- back to a Bitcoin block header. This includes the serialized Bitcoin transaction, and the Merkle
- branch leading back to the block header.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Transaction Length | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
- 4 | |
- + +
- 8 | |
- + +
- --- Bitcoin Transaction ---
- --- ---
- + +
- ?? | |
- + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | | Zero Padded to next 4 byte Boundary |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + +
- ?? | |
- + +
- --- Bitcoin Merkle Nodes Leading Back to Block Header ---
- --- ---
- + +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + 8 Byte Block Header Index +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `Transaction Length` is a Big Endian number representing the number of bytes in the Bitcoin
- transaction. Any entry for which this number is not between 80 and 1020 (inclusive) must be
- discarded as invalid, 80 is the size of the transaction structure with one output containing
- only 20 bytes (the size of a RIPEMD-160 hash). 1020 is the max size that a transaction can be.
- Since Bitcoin transaction structures sizes are only determinable by parsing out a number of size
- values which are sprinkled through the transaction, the Bitcoin transaction shall be searched for
- the RIPEMD-160 of the Merkle root using `memmem()` or equivalent, skipping the first 59 bytes of
- the transaction and ignoring last 4. These are the minimum sizes for the header and footer data
- in the transaction which cannot possibly contain the hash.
- Following the transaction are 0 to 3 bytes of zero padding such that the data which follows is
- 4 byte aligned, assuming the beginning of the message which contains the proof of validity is.
- If a message extends past the end of the Bitcoin transaction but does not contain required zero
- padding, clients must regard it as invalid. If a message extends past the end of the Bitcoin
- transaction and the length of the data which follows the zero padding is not 8 bytes longer than
- a multiple of 64, clients must regard it as invalid.
- Following the zero padding is an array of 64 byte Merkle branch nodes from the branch which links
- the transaction back to the Bitcoin block header. The final 8 bytes is the Big Endian index of the
- header in the block chain. If the response is larger than 1024 bytes, the response shall be
- truncated to the end of the transaction.
- ####Message Two: Request for Proof
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Two | Txid | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + +
- 8 | |
- + +
- 12 | |
- + +
- 16 | SHA-256 |
- + +
- 20 | |
- + +
- 24 | |
- + +
- 28 | |
- + +
- 32 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- A Request for Proof (RFP) is a message which a client sends to a cache, asking the cache to
- complete the Merkle branch back to the block header. Caches must regard as invalid any RFP
- whose bytes 2, or 3 are not zero or which is the wrong length. Byte 1 is an opaque
- transaction ID which allows a client to send multiple Requests for Proof to the same cache at
- the same time. The value of this byte is of no significance to the cache and should be
- reflected back to the client in the response Txid.
- The hash in the RFP may be a (single) SHA-256 of a domain batch Merkle root, or the
- Double-SHA-256 of a Bitcoin transaction. If the hash is of a Merkle root, the response will
- contain the Proof of Validity, abridged at the end of the Bitcoin transaction if necessary to
- prevent the packet from growing larger than 1024 bytes. If the hash is of a Bitcoin transaction,
- the response will contain second part of the Proof of Validity, IE: the Bitcoin Merkle nodes
- spanning back to the header and finally the header index.
- ####Message Three: Proof (containing Transaction)
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Three | Txid | Transaction Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + +
- 8 | |
- + +
- --- Bitcoin Transaction ---
- --- ---
- + +
- ?? | |
- + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | | Zero Padded to next 4 byte Boundary |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + +
- --- Bitcoin Merkle Nodes Leading Back to Block Header ---
- --- ---
- + +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + 8 Byte Block Header Index +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- #####Notes
- Everything past the end of the transaction, including the zero padding, shall be ommitted
- if including it would cause the packet to grow over 1024 bytes.
- ####Message Three: Proof (proving validity of Transaction)
- This will be sent if the client asks for proof and sends the Double-SHA-256 of the transaction.
- The client must regard this message as invalid if the value of `Zero` is not zero. A client must
- also regard this message as invalid if it's length is not 12 plus a multiple of 64. 12 being the
- header and footer and 64 being the size of a SHA-256 Merkle node.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Three | Txid | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + +
- 8 | |
- + +
- --- Bitcoin Merkle Nodes Leading Back to Block Header ---
- --- ---
- + +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ?? | |
- + 8 Byte Block Header Index +
- ?? | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ####Message Four: Get Header
- This message is used when a node discovers a block header index which is higher than it's
- highest known header.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Four | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + 8 Byte Block Header Index +
- 8 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- ####Message Five: Response with header
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Five | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + 8 Byte Block Header Index +
- 8 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 12 | |
- + +
- 16 | |
- + +
- 20 | |
- + +
- 24 | |
- + +
- 28 | |
- + +
- 32 | |
- + +
- 36 | |
- + +
- 40 | |
- + +
- 44 | |
- + +
- 48 | 81 Byte Block Header |
- + +
- 51 | |
- + +
- 56 | |
- + +
- 60 | |
- + +
- 64 | |
- + +
- 68 | |
- + +
- 72 | |
- + +
- 76 | |
- + +
- 80 | |
- + +
- 84 | |
- + +
- 88 | |
- + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 92 | | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- #####Notes
- This message must be regarded as invalid if either of the `Zero` fields are not zero or
- if the length is incorrect.
- ####Message Six: New Domains
- This message is used by one cache to advertize domains to other caches. The caches can then use
- requests to get all other necessary information about domains. If the length of the message length
- is not 44 plus a multiple of 12, the message must be regarded as invalid.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Six | Zero |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | |
- + 8 Byte Block Header Index +
- 8 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 12 | |
- + +
- 16 | |
- + +
- 20 | |
- + +
- 24 | |
- + TLD Identifier +
- 28 | |
- + +
- 32 | |
- + +
- 36 | |
- + +
- 40 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 44 | |
- + +
- 48 | First Altered Domain |
- + +
- 51 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 56 | |
- + +
- 60 | Second Altered Domain |
- + +
- 64 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 68 | |
- + Third Altered Domain +
- 72 | |
- + ............
- ##Validating Block Headers
- TODO:
- ##TLD Identifier and META Information
- The TLD Identifier is a SHA-256 hash of the TLD Meta Information.
- The TLD Meta Information contains a list of master keys for the TLD operators, these keys are
- valid only for signing changes to the hot key which signs domains.
- 1 2 3
- 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 0 | Key Count | Sigs Required | Domain Blackout Period |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 4 | Domain Validity Period |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 8 | |
- + +
- 12 | |
- + +
- 16 | |
- + +
- 20 | |
- + Key 1 +
- 24 | |
- + +
- 28 | |
- + +
- 32 | |
- + +
- 36 | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- 40 | |
- + Key 2 +
- 44 | |
- + ........
- If `Key Count`, `Sigs Required`, or `Domain Validity Period` is 0, or the length of the
- meta data is not equal to `32 * KeyCount + 8`, or if `Sigs Required` is greater than
- `Key Count`, the meta data is invalid.
- `Sigs Required` is a number of keys which must sign a change to the hot key and `Key Count`
- is the number of keys which are authorized to sign. `Domain Validity Period` is a Big Endian
- value representing the number of BTC blocks after the domain is created before it enters
- blackout period. `Domain Blackout Period` is the number of blocks before a domain becomes
- registrable by other parties.
- If my.dom is hashed in to a transaction in block 7 and `Domain Validity Period` for .dom is
- 10, my.dom will become unreachable when block 17 is announced. If the `Domain Blackout Period`
- for .dom is 4, my.dom will be registrable by other entities after block 21 is announced.
- There is no provision made to transfer the TLD Meta Information over the wire, it is expected
- that the user will install this information when they choose to trust a TLD.
- ##Security Considerations
- As pointed out by Stefan Buehler, a cache and a TLD operator can collude to fool a client
- into thinking that a DNS entry has been changed when they were not authorized to change it.
- The TLD operator signs a new domain despite an old one existing and the cache "forgets"
- about the old one, giving the client only the poison. This attack is very difficult to
- execute covertly as the "client" may in actuality be another cache which is looking to
- update it's records. Once the TLD operator signs poison and hashes it into the block chain,
- if anyone identifies it, it can be proven that they have acted against the specification.
- Finally, caches may choose not to introduce other caches or clients to any cache which has
- been known to participate in such a scheme.
- [Average Bitcoin Transaction Size]: http://blockexplorer.com/q/avgtxsize