<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <u><b>Goal</b></u>:&nbsp; An alternative address format made possible by
    BIP 32, which allows one to specify a "Wallet ID" and "One-time
    payment" code, instead of the standard one-use Base58-Hash160
    addresses.&nbsp;&nbsp; This allows parties with a persistent relationship to
    be able to prove that payment addresses they provide each other are
    linked to a particular wallet, reducing exposure to MitM attacks
    without the need for SSL or a web of trust, and without compromising
    the privacy of either party.&nbsp;&nbsp;&nbsp; For instance, this could be used
    between businesses that frequently do business, by exchanging and
    verifying public keys beforehand, or could be used by an exchange to
    identify if a customer withdrawal address is related to their last
    deposit address, and if not enforce extra authentication measures.<br>
    <br>
    <u><b>Background</b></u><u>:</u><br>
    I haven't been following the payment protocol
    discussions/development much, so I apologize if this has already
    been addressed.&nbsp;&nbsp; I'm calling it "wallet-linkable" addresses, which
    would be an optional second form for sending someone your address.&nbsp;&nbsp;
    With BIP 32, the address is computed by the payee (the person
    sending the address to receive money):<br>
    <br>
    &nbsp;&nbsp; Standard Address ~ Base58(0x00 || hash160(<font color="#3333ff">PubKeyParent
      * Multiplier[i]</font>) || checksum)<br>
    <br>
    What I'd like to do is have the option, when specifying an address
    through the payment protocol, to send *just* the {<font
      color="#3333ff">PublicKeyParent, Multiplier[i]</font>} and let the
    receiver of that address compute the address on their own.&nbsp; This is
    no significant burden on the receiver, but it does provide the
    useful property that they can recognize when addresses specified in
    this way come from the same wallet -- because the PubKeyParent will
    be the same.&nbsp; Remember, this is <u>optional</u> for the person
    providing the address.<br>
    <br>
    One nice, accidental feature of BIP 32 is that the Multiplier[i]
    used above does not actually reveal the "chaincode" (I think Pieter
    started calling it the "tweak").&nbsp;&nbsp; It is derived from the chaincode
    but doesn't reveal it.&nbsp; Therefore, the payer sees the parent public
    key, but that's not useful to derive any of the other addresses
    unless they also have the chaincode.&nbsp; But they can verify that the
    PublicKeyParent is identical between transactions, and thus is
    accessible only to that wallet.&nbsp; It allows them validate a specific
    address provided by the payee, but not generate or identify any
    other addresses.<br>
    <br>
    <b><u>Use Cases:</u></b><br>
    (1)&nbsp; So, just like with PGP/GPG, when two parties decide they will
    start a relationship, they can start by exchanging the public keys
    of their wallet and verify them in a reliable manner.&nbsp; After that,
    when one party requests a payment address from the other, they can
    optionally send {PubKey, Multiplier}, and the payer's software will
    identify the owner of that address, or let you select who you think
    the address belongs to and it will verify it.&nbsp; If the payee's system
    is compromised and address is replaced, the address received by the
    payer won't validate.&nbsp; This doesn't help if the side sending the
    money is compromised.<br>
    <br>
    (2)&nbsp; When a customer first provides a deposit to an exchange, it
    will send money from an address in their wallet and the software
    will provide the exchange the {PubKey,Mult}.&nbsp; When the customer
    later provides a withdrawal address, the site can automatically
    trust the address as long it is provided in the alternate form and
    the public keys match.&nbsp; If they don't, it might be the same customer
    just requesting a withdrawal to a different wallet, which is fine,
    but they'll have to go through an extra verification step to do so.&nbsp;
    <br>
    <br>
    <br>
    <u><b>Downsides:</b></u>&nbsp; <br>
    Multi-sig/P2SH&nbsp; - The only way this works with P2SH, violates one of
    the goals of P2SH slightly, but may not matter much if it's all done
    under the hood by the software.&nbsp; Instead of providing a 20-byte hash
    of a script, you provide all the public keys and multipliers for the
    individual addresses.&nbsp; The payer's software automatically verifies
    all addresses and creates the P2SH script itself (after a divine
    decree that public keys will always be sorted lexicographically in
    the multi-sig script).&nbsp; The blockchain still benefits from the
    "compression" of moving the bulky scripts to the TxIn, but it does
    require revealing more information than is necessary for the payer
    to pay the payee.&nbsp; But it may not <i>really</i> be a problem, given
    the benefits.&nbsp; It might just be slightly longer strings to exchange
    during initialization and for each transaction.<br>
    <br>
    I have various reasons I'd like to use this, and it'd be nice to
    have some community backing, so I don't have to twist anyone's arm
    to trust me that it's legit.<br>
    <br>
    -Alan<br>
    <br>
    <br>
    <br>
    <br>
  </body>
</html>