RECENT CHANGES: * (18 Dec 2015) Update explanations to resolve FAQs * (12 Oct 2015) Revise blinding method for notification transactions * (21 Sep 2015) Correct base58check version byte
BIP: 47 Title: Reusable Payment Codes for Hierarchical Deterministic Wallets Author: Justus Ranvier==Abstract== This BIP defines a technique for creating a payment code which can be publicly advertised and associated with a real-life identity without creating the loss of security or privacy inherent to P2PKH address reuse. This BIP is a particular application of BIP43 and is intended to supplement HD wallets which implement BIP44. 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. ==Motivation== Payment codes add identity information to transactions which is useful in a merchant-customer interaction while protecting the privacy of users. Payment codes provide the privacy benefits of Darkwallet-style Stealth Addresses to SPV clients without requiring the assistance of a trusted full node and while greatly reducing reliance on blockchain storage. ==Path levels== We define the following 3 levels in BIP32 path:Status: Draft Type: Informational Created: 2015-04-24
m / purpose' / coin_type' / identity'
The child keys derived from an identity are used in different ways:
m / purpose' / coin_type' / identity' / 0
The 0th (non-hardened) child is the notification key.
m / purpose' / coin_type' / identity' / 0 through 2147483647
These (non-hardened) keypairs are used for ECDH to generate deposit addresses.
m / purpose' / coin_type' / identity' / 0' through 2147483647'
These (hardened) keypairs are ephemeral payment codes.
Apostrophe in the path indicates that BIP32 hardened derivation is used.
Each level has a special meaning, described in the chapters below.
===Purpose===
Purpose is a constant set to 47' (or 0x8000002F) following the BIP43 recommendation. It indicates that the subtree of this node is used according to this specification.
===Coin type===
The coin type field is identical to the same field in BIP44
Hardened derivation is used at this level.
===Identity===
The identity derivation level produces an extended public key and its associated extended private key.
When the extended public key at this level is combined with the metadata specified in the Representation section below, the resulting entity is called a "payment code."
This derivation level is equivalent to the Account level in BIP-44. Wallets SHOULD treat payment codes as intrinsically part of the BIP-44 account at the same index and create payment codes and accounts as pairs.
For example, the payment code created represented by (m / 47' / 0' / 0') is part of the account represented by (m / 44' / 0' / 0').
The second account in a wallet consists of the new account/payment code pair created by using an index of 1 in as the account/identity level of both paths.
Incoming payments received via this specification are equivalent to payments received to BIP-44 addresses, and unspent outputs from both types of addresses can be used as inputs in the same outgoing transaction.
Hardened derivation is used at this level.
Except where noted, all keys derived from a payment code use the public derivation method.
==Standard Payment Codes (v1)==
===Representation===
====Binary Serialization====
A payment code contains the following elements:
* Byte 0: version. required value: 0x01
* Byte 1: features bit field. All bits must be zero except where specified elsewhere in this specification
** Bit 0: Bitmessage notification
** Bits 1-7: reserved
* Byte 2: sign. required value: 0x02 or 0x03
* Bytes 3 - 34: x value, must be a member of the secp256k1 group
* Bytes 35 - 66: chain code
* Bytes 67 - 79: reserved for future expansion, zero-filled unless otherwise noted
====Base58 Serialization====
When a payment code is presented to the user, it SHOULD be presented encoded in Base58Check form.
* The version byte is: 0x47 (produces a "P" as the first character of the serialized form)
* The payload is the binary serialization of the payment code
===Protocol===
In the following examples, Alice and Bob are identities with a corresponding payment codes. Alice initiates a Bitcoin transaction, and Bob is the recipient of the transaction.
It is assumed that Alice can easily obtain Bob's payment code via a suitable method outside the scope of the payment code protocol.
====Definitions====
* Payment code: an extended public key and associated metadata which is associated with a particular identity/account
* Notification address: the P2PKH address associated with the 0th public key derived from a payment code
* Notification transaction: a transaction which sends an output to a notification address which includes an embedded payment code
====Notification Transaction====
Prior to the first time Alice initiates a transaction to Bob, Alice MUST inform Bob of her payment code via the following procedure:
# Alice constructs a transaction which sends a small quantity of bitcoins to Bob's notification address (notification transaction)
## The inputs selected for this transaction MUST NOT be easily associated with Alice's notification address
# Alice derives a unique shared secret using ECDH:
## Alice selects the private key corresponding to the first exposed public key, of the first pubkey-exposing input, of the transaction: a## Alice selects the public key associated with Bob's notification address:
B, where B = bG## Alice calculates a secret point:
S = aB## Alice calculates a 64 byte blinding factor:
s = HMAC-SHA512(x, o)### "x" is the x value of the secret point ### "o" is the outpoint being spent by the first pubkey-exposing input of the transaction. # Alice serializes her payment code in binary form. # Alice renders her payment code (P) unreadable to anyone except Bob: ## Replace the x value with x':
x' = x XOR (first 32 bytes of s)## Replace the chain code with c':
c' = c XOR (last 32 bytes of s)# Alice adds an OP_RETURN output to her transaction which consists of P.
A, where A = aG## Bob selects the private key associated with his notification address:
b## Bob calculates a secret point:
S = bA## Bob calculates the binding factor:
s = HMAC-SHA512(x, o)### "x" is the x value of the secret point ### "o" is the outpoint being spent by the first pubkey-exposing input of the transaction. ## Bob interprets the 80 byte payload as a payment code, except: ### Replace the x value with x':
x' = x XOR (first 32 bytes of s)### Replace the chain code with c':
c' = c XOR (last 32 bytes of s)## If the updated x value is a member of the secp256k1 group, the payment code is valid. ## If the updated x value is not a member of the secp256k1 group, the payment code is ignored. Now that Bob's client has received Alice's payment code, it is possible for Alice to send payments (up to 232 payments) to Bob. Alice will never again need to send a notification transaction to Bob. Bitcoins received via notification transactions require special handling in order to avoid privacy leaks: # The value of outputs received to notification addresses MUST NOT be displayed to the user as part of their spendable balance. # Outputs received to notification addresses MUST NOT be used as inputs for any transaction that involve ECDH calculations using any of the user's payment codes. # Outputs received to notification addresses MAY be passed through a mixing service before being added to the user's spendable balance. # Outputs received to notification addresses MAY be donated to miners using dust-b-gone or an equivalent procedure. =====Standard Notification Transaction Scripts===== Alice SHOULD use an input script in one of the following standard forms to expose a public key, and compliant applications SHOULD recognize all of these forms. * P2PK (pay to pubkey) * P2PKH (pay to pubkey hash) * Multisig (bare multisig, without P2SH) * a script which spends any of the above script forms via P2SH (pay to script hash) Compatible wallets MAY provide a method for a user to manually specify the public key associated with a notification transaction in order to recover payment codes sent via non-standard notification transactions. ====Sending==== # Each time Alice wants to initiate a transaction to Bob, Alice derives a unique P2PKH address for the transaction using ECDH follows: ## Alice selects the 0th private key derived from her payment code:
a## Alice selects the next unused public key derived from Bob's payment code, starting from zero:
B, where B = bG### The "next unused" public key is based on an index specific to the Alice-Bob context, not global to either Alice or Bob ## Alice calculates a secret point:
S = aB## Alice calculates a scalar shared secret using the x value of S:
s = SHA256(Sx)### If the value of s is not in the secp256k1 group, Alice MUST increment the index used to derive Bob's public key and try again. ## Alice uses the scalar shared secret to calculate the ephemeral public key used to generate the P2PKH address for this transaction:
B' = B + sG
B' = B + sG## Bob calculate the private key for each ephemeral address as:
b' = b + s
B = payment code / 0 / 0# Initialize a counter at 1:
n# Derive a candidate encryption key as:
B' = payment code / 0 / n# If the combination of B and B` do not form a valid Bitmessage address, increment n by one and try again # Use the address version, signing key, encryption key, and stream number to construct a Bitmessage address per the Bitmessage protocol The sender transmits their payment code in base58 form to the calculated Bitmessage address. In order to use Bitmessage notification, the recipient must have a Bitmessage client which listens at the address which the senders will derive and is capable of relaying received payment codes to the Bitcoin wallet. ==Test Vectors== * [[https://gist.github.com/SamouraiDev/6aad669604c5930864bd|BIP47 Reusable Payment Codes Test Vectors]] ==Reference== * [[bip-0032.mediawiki|BIP32 - Hierarchical Deterministic Wallets]] * [[bip-0043.mediawiki|BIP43 - Purpose Field for Deterministic Wallets]] * [[bip-0044.mediawiki|BIP44 - Multi-Account Hierarchy for Deterministic Wallets]] * [[https://bitcoin.org/en/glossary/outpoint|Outpoint]] * [[https://github.com/petertodd/dust-b-gone|dust-b-gone]] * [[https://en.bitcoin.it/wiki/Base58Check_encoding|Base58Check encoding]] * [[https://bitmessage.org/bitmessage.pdf|Bitmessage]] * [[https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2015-April/007812.html|Mailing list discussion]]