In this post, I'll describe a feature of Flex which allows you to send and receive bitcoins with some degree of privacy - private deposit addresses.
Using private deposit addresses is almost as simple for the user as using normal deposit addresses.
Suppose that Alice wants to send 0.01 bitcoins to Bob, and both Alice and Bob are happily connected to the Flex network with electrum connected as described above.
Alice then does:
Code: Select all
alice@host1$ flex-cli requestprivateaddress BTC
Then she waits for a few minutes (so that the request can be encoded into the chain) and does:
Code: Select all
alice@host1$ flex-cli listdepositaddresses BTC
[
{
"address" : "13KSehmmk43DDt8VrJJv2GvqYv7mPDWM4a",
"balance" : "0.00000000",
"private" : true
}
]
As you can see, Alice now has a deposit address with no bitcoins in it. It says that "private" is "true", which means that nobody apart from Alice (and later, whoever she transfers it to) knows the address.
Alice's software achieved this by choosing a random number and using that as an offset for the deposit address that she received from the network. The address shown above was not the address that the network generated (which we could call the public address). Instead, it shows (to Alice) the result of adding the secret offset to the public address.
Alice can then send bitcoins to this address using her favorite bitcoin wallet.
It's important to realize that when Alice does this, the address shown above becomes visible on the bitcoin network, and everybody who knows that Alice controls the originating address knows that Alice sent 0.01 to
someone. In fact, you can look at blockchain.info and see the transaction for yourself.
What they don't know is that she sent it to a private deposit address that she generated using the Flex network. The way that private addresses on the Flex network differ from regular deposit addresses is that nobody who is recording traffic on the Flex network will be able to see which bitcoin transaction funded Alice's private deposit address.
If Alice had used "requestdepositaddress" instead of "requestprivateaddress", then anybody recording all Flex network traffic would see which deposit address was generated in response to Alice's request, and could then watch for bitcoin payments to that address. Upon seeing a payment, they would know that 0.01 BTC had been sent to a Flex deposit address, and if they knew that Alice controlled the address that sent the funds, they would know that Alice is using Flex to transmit bitcoins.
With the private deposit address, it just looks like Alice sent some bitcoins
somewhere.
Now Alice can send the coins untraceably to Bob. For this, she needs to know a public key for one of Bob's Flex addresses.
Bob can generate one by doing:
Code: Select all
bob@host2$ flex-cli getnewaddress
1J4jmVW6dCgrhAjivHNme3nb4xtMpzkmm6
bob@host2$ flex-cli getpubkey 1J4jmVW6dCgrhAjivHNme3nb4xtMpzkmm6
0102B0068DC04B97CE17B295A3DDC528BCFDB488AA22958E2CA3571BBC32500829D5
That long string of hex is a public key. Bob gives it to Alice in the same way that he would normally give her a bitcoin address. Then Alice can do:
Code: Select all
alice@host1$ flex-cli transferprivateaddress 13KSehmmk43DDt8VrJJv2GvqYv7mPDWM4a 0102B0068DC0...BC32500829D5
d09d6a50aa4867899badfca4cf1ad04d63d21860
Eight seconds later, Bob can list his BTC deposit addresses, and he'll have the private address that Alice created:
Code: Select all
bob@host2$ flex-cli listdepositaddresses BTC
[
{
"address" : "13KSehmmk43DDt8VrJJv2GvqYv7mPDWM4a",
"balance" : "0.01000000",
"private" : true
}
]
and Alice won't have it any more:
Code: Select all
alice@host1$ flex-cli listdepositaddresses BTC
[
]
Bob can then send the deposit on to a third recipient within 8 seconds or withdraw the bitcoins to his bitcoin wallet and spend them immediately.
From the point of view of somebody who is watching only the bitcoin blockchain, no transaction has taken place at all. Alice sent the 0.01 BTC to the address 13KSehmmk43DDt8VrJJv2GvqYv7mPDWM4a and they stayed there.
From the point of view of somebody watching the Flex network only, a deposit address was generated, and no funds were sent to the public address. Then the address was transferred. If Bob has pasted his public key on a public website, then somebody who sees that public key and monitors the Flex network will see that Bob has received
something. They won't know who sent him something and they won't know how much was sent.
For somebody monitoring both the bitcoin blockchain and the Flex network, they will see that Alice sent 0.01 BTC somewhere and they will see that Bob received something, but there will be no way for them to make the connection between Alice and Bob,
even if they know both the public key that Bob uses to receive private deposits on the Flex network and that the address which sent the 0.01 BTC was Alice's.
It's also worth noting that Flex doesn't keep a record of deposit transfers in a blockchain, so anybody who wants to know that Bob received something will need to be listening at the very time it occurs.
So somebody monitoring all traffic on both networks will fail to make the connection between Alice and Bob. This is to be contrasted with the situation in bitcoin, in which the fact that Alice's key paid bitcoins to Bob's key is public knowledge for all time.
I think it's worth pointing out that this software is available and works right now, and lets you send bitcoins with this degree of privacy in seconds.
What doesn't exist yet is an always-on Flex network which everybody can connect to and be on the same network. You can try it out on your own computer, or make a network with friends and send coins between yourselves. Soon, though, I'll post IP addresses of seed nodes for the Flex network and then everybody can connect, mine, trade and send coins in seconds to one another.
It's still experimental software and comes with no warranty, though. You can consider it a testnet, even though it's capable of transmitting real coins. It may restart or crash due a bug at any time, possibly while your coins are at a deposit address, so don't put any coins into it that you aren't prepared to lose. You can use the native currency, FLX, in deposit addresses to experiment with peer-to-peer transfers, or CBF if you're doing your testing all on one machine. This will allow you to avoid the risk of losing bitcoins in a computer mishap.
After it's been through enough testing, it will be launched as a live network. Then fast, private bitcoin transactions will be available to all.
