I’d like to propose a new BIP for universal, multi-currency addresses. Until a
BIP number is assigned, we can substitute it with ${BIPNUM} wherever it is
used. In the examples, I’ll use 3301 as the value for ${BIPNUM} when required
to demonstrate BIP32 derivation.
```
BIP: ${BIPNUM}
Layer: Applications
Title: Universal Addresses
Author: Ty Everett <[email protected]>
Status: Draft
Type: Informational
Created: 2019-12-23
License: BSD-2-Clause
Requires: 32, 43, 44
```
Abstract
A universally recognized and accepted cryptocurrency address format would allow
merchants, exchanges and users to more easily coordinate transactions and
conduct business. I propose a new address format not specific to any
cryptocurrency that provides strong cryptographic security while maintaining or
improving the level of transactional privacy specific to each underlying
currency. BIP32 derivation permits compatibility with existing HD wallets,
reducing implementational friction across the ecosystem. BIP44 numberings at
the coin-selection level allow new coins to be used with the same Universal
Addresses, while URL-style query parameters dictate which currencies a user
prefers to receive.
As the Bitcoin and wider cryptocurrency community has matured, numerous address
formats have been devised. Some projects use their own format, while others use
base-58 or hex-encoded strings. Some even have identical addresses, creating
confusion for users and a potential for the loss of funds. While each format
has its unique set of advantages and disadvantages, they all have one thing in
common: they are specific to a single currency and not to the user, who may or
may not use and accept a great many currencies. I propose the use of BIP32
extended public key nodes as a Universal Address format, because no
cryptocurrency project exists in a vacuum.
Copyright
This BIP is licensed under the BSD 2-Clause License.
Specification
Pre-requisite Knowledge
This BIP draws on concepts from BIP32, BIP43 and BIP44. The reader is
encouraged to familiarize themselves with those BIPs before attempting to read
and understand this BIP.
A Note on Annotations and Rationale in this BIP
Design decisions have been made with regard to many respects of this BIP. Where
appropriate, annotations[1] have been added. Justifications can be found in the
“Rationale” section, along with a few explanatory Q&A-style points about
potential implementation concerns.
A Note on Terminology Used In This BIP
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", “SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in RFC 2119.
Derivation Path Levels for Universal Addresses
Implementers of BIP${BIPNUM} MUST use the below BIP32 derivation path levels
for Universal Addresses; apostrophe denotes hardened BIP32 derivation:
```
m / ${BIPNUM}’ / entity / coin / shield
```
Level 1: Denotes Use with Universal Addresses
The top-level derivation simply denotes the use of this node with Universal
Addresses. Primarily, it’s purpose is to isolate this use-case from other uses
of the same BIP32 node (notably BIP44 wallets).
Level 2: Recipient Determines Index of Address to Share
This is the level at which the Universal Addresses allocated by a recipient's
wallet are to be split off; one for each sender to whom the recipient has given
an address. Starting at index 1 (0 is reserved for future use), each Universal
Address SHOULD be generated canonically. The keys generated at this level are
the ones to be shared from the sender to the recipient. The recipient may then
derive a level 3 key based on this key and the currency they wish to send.
There is no need for the sender to obtain a new Universal Address from the
recipient for each of their subsequent transactions.
Level 3: Sender Selects and Derives Address for the Currency They Wish to Send
The sender receives the level 2 key from the recipient formatted as a Universal
Address (see Serialization Format section below). Based on the BIP44 coin
assignment number for the coin the sender would like to send (maintained by
Satoshi Labs as SLIP44), the sender makes the appropriate derivation at this
level.
Level 4: Sender Increments Shield Counter to Improve Privacy (“Enhanced Privacy
Mode”)
The shield counter starts at child #1 (#0 is reserved for future use). If a
higher level of privacy is desired, the sender MAY increment the shield counter
once per transaction. In this way, individual addresses are not re-used.
Additionally, the sender MAY split a payment into multiple separate
transactions, each destined for a different blockchain-level address[2]. If the
sender does not increment the shield counter for every transaction, the sender
MUST always use child #1 as the public key component of the blockchain-level
address.
Reservation of ${BIPNUM} as a BIP43 Purpose
I define that the first level of BIP32 derivation to be used in Universal
Address allocation from the root BIP32 node SHALL be ${BIPNUM}, which conforms
to the BIP43 recommendation that top-level derivations be based on the number
assigned to a BIP. The BIP43 purpose for this BIP is “Universal Addresses.”
Serialization Format
The serialized address format for BIP${BIPNUM} Universal Addresses SHALL be the
same format described in the “Serialization Format” subsection of the
“Specification: key derivation” section of BIP32, subject to the following
considerations:
- Implementers of BIP${BIPNUM} Universal Addresses MUST encode Universal
Addresses using the same base58 format as current extended public keys for
interoperability with existing software.
- For additional privacy, implementers of BIP${BIPNUM} Universal Addresses
SHOULD substitute the 32-bit “parent key fingerprint” with 0x00000000 before
disclosing the Universal Address to the sender. In these cases, the recipient
has the sole responsibility of keeping track of the true parent key fingerprint
if they find it useful.
- For additional privacy, implementers of BIP${BIPNUM} Universal Addresses
SHOULD substitute the 32-bit “child number” with 0x00000000 before disclosing
the Universal Address to the sender. In these cases, the recipient has the sole
responsibility of keeping track of the true child number if they find it useful.
URL-Style Query Parameters for Denotability of Recipient-Specified Currency
Acceptance Preferences
When the recipient wishes to specify which currencies it prefers to receive, a
URL-style query parameter MAY be appended to the end of the Universal Address.
If provided, the query parameter MUST have the property of lowercase “accept”
and its value MUST be a comma-delimited list of one or more SLIP44 currency
symbols. Future BIPs MAY propose new query parameters that can also be
appended. All such parameters are strictly OPTIONAL in this specification.
Universal addresses with no appended query parameters MUST be regarded as valid.
When a sender wallet encounters a Universal Address with an appended “accept”
URL-style query parameter, it SHOULD show a list of currencies in its user
interface that correspond to the ones denoted by the value of the parameter.
The sending wallet SHOULD also remove currencies from the list that it does not
support.
The sender wallet MAY auto-select a currency for the sender if there is only
one common currency between the “accept” list and the “supported currencies”
list of the sender wallet. Auto-selection based on the sender’s balance or
other factors MAY also be performed.
Future Possibilities for Backwards-Compatible Improvements to Universal
Addresses
A future BIP MAY specify a URI-style format (e.g. “pay:…”) and, if a URI-style
format for Universal Addresses is proposed, the proposing BIP SHOULD consider
removing unnecessary fields (version bytes, depth, parent key fingerprint and
child index) from the base58-encoded string. However, to reduce the friction
for adoption of Universal Addresses by the community and to promote
compatibility with existing software, those changes are not proposed as part of
this BIP. BIP${BIPNUM} Universal Addresses can be converted to a new, shorter
format in the future[6]. Libraries, wallets and BIPs building on top of and
claiming support for BIP${BIPNUM} Universal Addresses MUST maintain seamless
backwards-compatible support for the use of standard BIP32-serialized extended
public keys as BIP${BIPNUM} Universal Addresses.
BIP${BIPNUM} Universal Address Validity Checks
A serialized BIP32 extended public key string that is encoded in base58 format
with a valid 32-bit checksum SHALL be regarded as a valid BIP${BIPNUM}
Universal Address if the following are true:
1). The string meets the BIP32 requirement that the specified point lies on the
secp256k1 curve, and is otherwise representative of a valid BIP32 public node.
2). The version bytes are equal to 0x0488B21E for the key[3].
3). The depth byte is equal to 0x02.
4). Notwithstanding the above, validity assertions SHALL NOT take into account
the contents of the 32-bit parent key fingerprint or the 32-bit child number,
except that these fields MUST be present in some form and that the final
double-sha256 checksum MUST be correct.
Implementation Notes
BIP44-compliant wallet Implementers SHOULD use the same BIP32 root node as is
presently in use for each of their users. This generally reduces complexity and
maintains compatibility with existing software.
This BIP mandates that it is absolutely REQUIRED that the community agree on
SLIP44 designations for each coin. Project leaders MUST apply for SLIP44
allocations if they have yet to do so and want their projects to be compatible
with this BIP[4].
Universal Address Sharing
Universal Addresses SHOULD be viewed as having two possible security models:
they can be fully public or they can be kept secret between the recipient and
exactly one sender. Fully public addresses are OK, because Universal Addresses
do not claim to provide confidentiality about the amounts and currencies
received by the recipient. Fully private addresses, where the recipient
allocates a new address for every sender (such that each sender has their own
designated Universal Address for the recipient, but no sender may learn the
Universal Address of any other senders to the recipient) are also secure and
have other benefits[2]. However, other security models have inherent
weaknesses[5] and SHOULD definitely be avoided.
Balance Calculation Algorithm
Similar to current extended public key-based wallets, inquiring about the
balance of a Universal Address involves querying for transactions related to
the blockchain-level addresses derived from the root node. The only difference
with Universal Addresses is that wallets SHOULD query all blockchains for which
a known balance is desired. Higher zero-use gap toleration decreases the
likelihood of missing coins. Wallets SHOULD keep track of the Universal
Addresses they allocate.
Examples
Three situations that utilize Universal Addresses will be described; the first
from the perspective of a recipient and the second two from the perspective of
senders.
Example 1: Recipient Usage
A user generates a BIP32 private root node and wants to give out a Universal
Address:
```
xprv9s21ZrQH143K2eR2vYd9i6YvrFUojaL3ecK2hY4zfabMgu6okTk2s6WxnQmPYA45apCKWiUnHrQsdvh6ER4Leaaa7ehDx5KZtDUbAcgfGBy
```
The user will perform a hardened level 1 derivation to find private child
#${BIPNUM} of their root node:
```
xprv9umttUfc6MFTxANAkz8fWE4hHN99xra5GwiP9Er91M69mBso9hAhAgYu2tXfvXaAs5AHWAPwZCSUT4SzkgBqtuNYdHLcp1tSsPDGmAg9ugW
```
The user will perform a public derivation to arrive at the #1 child, as this is
their first Universal Address:
```
xpub6A6MPF2tU1tML7JJa98pzmSgDr7V8JuaKCrYu4tjgq4ZLFKTvF4eW7y3c28ye3db9nk3XVvPBTwDA7VB7hch4aj1aQKrCj7FoW78vTJw8zj
```
This is the Universal Address. Assuming the user is OK with accepting any
SLIP44 cryptocurrency, they can share the Universal Address with any sender or
publish it online.
Optionally, they can append URL-style query parameters to denote one or more
currencies they prefer to accept with this address. Other query string
parameters may be proposed by future BIPs. This BIP only reserves the “accept”
parameter for use as a comma-delimited list of SLIP44 currency symbols, as
defined in the “URL-Style Query Parameters for Denotability of
Recipient-Specified Currency Acceptance Preferences” subsection of the
“Specification” section above.
Example 2: Multi-currency Wallet
A user sees a BIP${BIPNUM} Universal Address on a website:
```
xpub6A6MPF2tU1tMQXuhyAAXLDWKMuw3GRwZEFUAXXwHuykZoUcyUn24gN7RPuy5xZXj6zSqWXFcVjTJEnnX5Qh4pjJMnGbjZkuXHFKFy4U22AX?accept=BTC,LTC
```
The user’s wallet notices that the address indicates a preference for either
Bitcoin or Litecoin, so the UI presents a choice. The user selects Litecoin, so
the wallet searches for LTC in the SLIP44 currency list and therefore derives
the #2 child node of the Universal Address:
```
xpub6D76wrzT2eTJH5EaMdcK8Wkej36nBakXFwMr79HLJMxga4giaehK8RLFiCTiAkBt9W8saivsX4n2ot9reUt4ePbSUhEFHK1NGkKiPhWhQZH
```
This particular wallet does not support "Enhanced Privacy Mode", so it will
simply derive the #1 child of the Litecoin node instead of calculating the
correct shield value:
```
xpub6E9man3MPJXdrgjHDqhkJuSjG3j9TBfESbxppRA1fF5pq9KEDCQegPfa76e9BT3Nnhwpy9krXrLTRsYx8ccFXrMKTuz6hH2ZEanhG1tC59a
```
The Litecoin address corresponding to the derived node is:
```
LXDxiYDVosUg3hKwJ4yP24EfdkRuNumLs5
```
The user completes their transaction with Litecoin.
Example 3: "Enhanced Privacy Mode" and Universal Address Reuse
In a (semi)-private chat, a user receives a Universal Address:
```
xpub6AJUhNSZRaZS7d9eJ2jyyuNMbkMWQgHNEgDt9rC3WJfkXvQDAKu9LZLhMhVkeot66EtEtBJK48Ca3qNfrjBH1otkBc2CNPwaTMeHSh3TvL1
```
The user received this particular Universal Address some months ago[7], and has
used to for 17 previous Bitcoin transactions and 2 Litecoin transactions to
this recipient.
The user wants to send 2 BTC to the recipient. The user’s wallet has two
unspent outputs in different places; the first for 1.5 BTC and the second for 1
BTC.
The wallet notices that the recipient’s Universal Address indicates no
preference for which currency to receive. Thus, the UI presents a list of all
supported currencies for which the sender has a balance. The sender selects
Bitcoin, so the wallet searches for BTC in the SLIP44 currency list and
therefore derives the #0 child node of the Universal Address:
```
xpub6CUu5jU1UVXsB3zstbr6MDZcmZy9SAEfsTtm81iR2foAtRZ34cb9jnr4D1jcQxKG9y9fMhVeqYy9kC3j4jidyhbrRuX6nXiYgSdQSwZmzVi
```
Since the sender’s wallet supports "Enhanced Privacy Mode", it will increment
the Bitcoin shield counter starting at child #1 and querying the blockchain for
each shielded address to see if it has ever been used[8]. The wallet sees that
the shield counter is at #17[9]. Since the wallet uses “Enhanced Privacy Mode”,
it MUST NOT use shielded children less than child #18. For privacy, the wallet
MAY also split the payment into two or more transactions[11]. The wallet will
now derive the #18 and #19 children of the Bitcoin node:
```
xpub6EvkmcciNXPHVoiSP4sV21mgAWi3MAzJtvwRFXoNuUusADN1KU9eZ9REkuD7PgtRDR1ggKRSvci8L6uhegmcoNwSP8QDfSqRH66iC6oGYWs
-> 1F2idiEsCTBN6ZrzkLE7JTddaJPubYet5m
```
and
```
xpub6EvkmcciNXPHWR7ZLh8XJz74CZh8NDszKBzEBMS7xFDgTB7aoLbJwtzwV1CdKM6JvwrGowU1FoMpf1uZuUfBqX4BpHqMGQocTPev98qZ3Wf
-> 1PpcyFv46NvqJusLwfrv6dkw3K9z434hJV
```
The wallet will now spend the first of its outputs (1.5 BTC) entirely to child
#18, and 0.5 BTC from the second output will be spent to child #19. The
remaining 0.5 BTC from the second output will be sent back to a change address.
In this way, it is impossible for an observer to correlate that the two outputs
originally belonged to the same sender or were part of the same payment[10].
Motivation
Addresses are a tedious part of living in the cryptocurrency-enabled world.
With hundreds of contacts and dozens of popular currencies, keeping track of
which people provided which addresses for which coins makes life all the more
difficult. Widespread adoption of a Universal Addressing format would allow
users to share one address and accept many cryptocurrencies in the same wallet.
As merchants and exchanges support and use new currencies, new addresses do not
need to be exchanged among users. When sender wallets support “Enhanced Privacy
Mode”, a substantial gain in transactional privacy is also obtained by the use
of Universal Addresses.
Rationale
References from the above text:
[1]: This is the example annotation appearing in the “A Note on Annotations and
Rationale in this BIP” subsection of the “Specification” section.
[2]: For certain blockchains that do not implement transactional “inputs and
outputs”, this permits transactions to be made in a way that permits single-use
addressing. For these coins, when the original recipient wishes to spend the
received coins which are in multiple addresses, they may do so in one of two
ways:
1). If the original recipient wishes to send all received coins out as one
blockchain-level transaction and from one blockchain-level address, they may
first create many blockchain-level transactions collecting the coins into a
single “change address” and then spend the coins all at once from that address
to the next recipient.
2). If the original recipient wishes to spend using multiple addresses (i.e.
the next recipient also uses Universal Addresses), the original recipient may
simply empty each of the addresses they would like to spend from; the original
recipient may either choose to forward all coins in a given address to the next
recipient, or to forward some of the coins to the next recipient and the rest
to a new “change address.” This same model can apply to Bitcoin. In any case,
the advantage is that it makes for better privacy because multi-transactional
payments do not permit correlation of any of the outputs to any single user. It
is also possible to send one transaction on blockchain A and another
transaction on blockchain B as part of the same payment.
[3]: Private keys are never used, and since the Bitcoin Testnet (normally
0x043587CF) is covered by level 3 SLIP44 derivation, no other version prefixes
are needed.
[4]: Not all cryptocurrency projects will be initially compatible with
BIP${BIPNUM} Universal Addresses out of the box. Does that make these addresses
non-universal? How non-universal is UPnP? This BIP defines a standard that
works for most use-cases and most currencies most of the time. If enough people
adopt it, non-compliant projects MAY find a way to join the standard.
[5]: In particular, situations where a group of entities know a single
Universal Address for a member, and where the transactions of the members of
the group which involve the known Universal Address are not intended to be
public should be avoided. By publishing the known Universal Address, a single
member of the group can compromise the privacy of the transactions of all group
members involving the known Universal Address. Each recipient SHOULD take care
to allocate new Universal Addresses for each entity with whom they intend to
transact business; even if an allocated address never gets used by a sender, a
completely new address SHOULD be allocated by the recipient for each potential
sender when privacy is strictly required because the previously-designated
sender can learn the transactional activity between the newly-designated sender
and the recipient if addresses are reused.
[6]: Conversion can occur by simply deserializing the string, removing the
unnecessary fields and re-serializing to the new format.
[7]: Since Universal Addresses can be reused, the user’s wallet could keep an
associative list mapping names to Universal Addresses. Wallets MAY consider
making this look like an address book, where the user can add their associates
as contacts.
[8]: Wallets MAY use a binary search-style querying strategy to speed up this
process as opposed to a linear search of the blockchain. The wallet MAY also
cache the highest known-to-be-used shield counter for each previously-checked
currency of each Universal Address it has seen in the past.
[9]: Wallets SHOULD always check shield counters even if cached data exists,
because a publicly-known Universal Address could have been used by another
sender. However, caching speeds up future checks because the wallet knows that
the shield value is not less than the cached value.
[10]: In typical Bitcoin transactions, such correlations are possible and are
widely used for “blockchain forensics.” This new mode of wallet operation
represents a substantial privacy improvement for Bitcoin and for all
compliant[4] SLIP44 cryptocurrencies.
[11]: It is also possible for the sender to conduct a multi-blockchain payment.
For example, the sender might send one Bitcoin transaction and two Litecoin
transactions. The sender SHOULD only attempt this with communication and
coordination with the recipient to avoid confusion. The sender always has an
incentive to ensure the recipient properly receives the payment.
Other considerations:
The final set of design decisions made with regard to this BIP are documented
below in a Q&A/interview-style format:
Q: Will it be easy to lose coins since an address is no longer associated with
a single cryptocurrency?
A: This is a valid concern, but there are quite a large number of projects
without unique address formats. Specifically, ERC20 coins use hex strings while
Bitcoin SV and Bitcoin both use base58. Universal Addresses will be a net
benefit because each project gets its own pool of address space. Additionally,
the “accept” parameter might only contain a single SLIP44 symbol, making
Universal Addresses the de facto address format for many projects.
Wallets implementing Universal Addresses SHOULD append the “accept” parameter,
and senders SHOULD NOT send coins that are not listed by the “accept” header
when specified. Also, the money wouldn't actually be lost in these situations.
Assuming the root private node is safe, derivation of the right path will make
recovering coins fairly straightforward. Additionally, high quality
multi-currency wallet implementations should consider scanning popular
blockchains for transactions even if those chains are otherwise unsupported.
This can alert the user in cases where unsupported coins were received.
Q: For split transaction payments, no single TXID exists. This makes accounting
harder.
A: In the vast majority of cases, the sender should get the recipient to simply
come up with an invoice number or “payment ID” that can be communicated to the
sender for their records. Listing all relevant TXIDs is another possible
solution. Calculating the bitwise XOR of all relevant TXIDs to create a single
“MTXID” is also possible and could be the subject for a future BIP. In any
case, it is a valid concern that “Enhanced Privacy Mode” deviates from the
standard transactional model. If a single TXID is strictly required, a
multi-transactional payment should not be used.
Q: It is the sender’s choice whether to use a split payment or “Enhanced
Privacy Mode”. If they choose not to do so, can’t the recipient’s privacy be
harmed?
A: In existing implementations, the sender can breach their own privacy in many
ways by revealing participation in a transaction. The onus is always on the
sender of a transaction to ensure that their privacy is protected since the
recipient does not control whether the sender uses “Enhanced Privacy Mode."
With Universal Addresses, each sender makes their own choice about privacy and
their decision does not effect the privacy of the recipient or any other
senders. In any case, future BIPs might also propose recipient-controlled
preferences for privacy modes using additional URL-like query parameters.
Q: Can’t a sender publish the recipient’s non-public Universal Address to
compromise the recipient's privacy?
A: Recipients should only share the same non-public Universal Address with one
sender. Thus, the impact of such a disclosure is limited to transactions
strictly involving this particular sender. Refer to the “Universal Address
Sharing“ subsection of the “Specification” section and [5] for further details.
It is also worth noting that by revealing the non-public Universal Address, the
sender explicitly notifies the recipient that they have breached the
recipient's implicit trust relationship. Since the recipient gave the
non-public Universal Address solely to this sender and since the recipient
knows that they were not the one to have published it, the recipient can be
certain that the sender published the address. The sender will lose the
implicit trust of the recipient to maintain privacy.
Q: Suppose a recipient publishes their own previously-undisclosed non-public
Universal Address. Would this reveal that two or more spent outputs were from
the same sender?
A: Even if the Universal Address is publicly revealed, it does not prove that
any two transactions sent from different source addresses are part of the same
payment or even that they came from the same sender. Notwithstanding the above,
the sender should understand that their privacy is determined by their own
actions, not the actions of the recipient. If the sender failed to re-use
addresses and then the recipient published the Universal Address revealing a
pattern of the sender’s single-address activity, the recipient is not liable
for the sender’s negligence.
Q: Universal Addresses are long. What can be done to shorten them?
A: Elimination of version bytes, parent fingerprint, child number and node
depth in combination with the creation of a URI prefix would decrease length
and would also make for another great BIP.
Q: Is it likely that people will get Universal Addresses mixed up with normal
BIP32 extended public keys?
A: As they are currently used, extended keys are generally distributed at the
root level. People may attempt to differentiate them because the node depth
will always be 2 for Universal Addresses. Additionally, an extended public key
is probably a Universal Address if its parent fingerprint and child index have
been zeroed, but Universal Addresses may also exist with these values
populated. A future BIP proposing a URI-denoted identifier (“pay:…”) would also
solve this problem. Ideally such a BIP would also reduce the length of
Universal Addresses. In any case, the likelihood for mistakes is small
considering that BIP32 extended public keys are typically only used by advanced
users.
Q: Should the version bytes defined in BIP32 be removed or changed for use with
this BIP?
A: BIP43 recommends that version bytes do not change across use-cases. If a new
URI scheme is proposed for Universal Addresses in a future BIP, the effective
result would be that such an identifier could replace the version bytes,
because it would serve to identify the resource as a Universal Address. Version
bytes are maintained by this BIP to create full backwards-compatibility with
BIP32 extended public keys.
Q: XYZCoin is incompatible with this BIP because BIP32 derivation will not work
with Ed25519 or some other cryptography
A: BIP${BIPNUM} Universal Addresses were designed to work well for most people
and most cryptocurrency projects most of the time. Since anyone is free to
start a new project, it is entirely possible that existing or future projects
are non-compliant with this BIP. Consideration should be given to past projects
which existed before this BIP’s publication, since they could not have known
about this BIP at the time of their inception. However, the benefits to users
and the wider cryptocurrency ecosystem in implementing a standard address
format MUST NOT be underestimated.
References
- BIP32
- BIP43
- BIP44
- SLIP44
- RFC-2119
_______________________________________________
bitcoin-dev mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev