By Vin Armani
CTO and Lead Developer – cointext.io
It has become clear, through our private beta release of CoinText, that our product represents an unfamiliar paradigm for many in the crypto community. Although financial transactions over SMS are already quite popular worldwide – M-Pesa alone registered 6 Billion SMS transactions in 10 African nations in 2016 – the SMS user interface has never had significant market share. Coinapult was an early project that used SMS to transact Bitcoin, but the vast majority of cryptocurrency users have never even heard of Coinapult, let alone used the service. I’ve spent considerable time on social media answering questions about CoinText’s design as well as addressing concerns about our product’s privacy and security features. As should be expected, there were common questions and concerns which will, no doubt, continue to be raised as more and more users are onboarded to our platform. This is a resource for answering those common questions.
How is CoinText a wallet?
All cryptocurrency wallets are fundamentally just a string of numbers and letters called a “private key.” From that private key is derived a “public key.” The private and public key, together, are called a “keypair.” From that public key is derived your address (to which funds can be sent). The cryptographic algorithm (a series of mathematical equations) that converts a private key to a public key and then to an address only works in one direction. This means that a private key, put through the algorithm, ALWAYS gives the same public key and address.
However, you cannot “decode” an address or public key and get back to the private key. This is incredibly useful. When creating a transaction, the owner of the private key associated with a particular address can cryptographically “sign” the transaction in a manner that proves he or she knows the private key but doesn’t reveal the private key in the process. This allows a node receiving a broadcasted transaction to verify the transaction’s validity and queue it up for addition into a future block. This is how Bitcoin transactions move through the system. If that concept still seems murky, you can think of your address as the number printed on your debit card and your private key as your PIN number.
So long as you possess (or know) a private key, you have access to the funds in the address associated with that private key. You can print that key and write it down and then store it offline in a safe place. This is traditionally called a “paper wallet” and is one of the safest ways to store cryptocurrency.
If you then want to spend your funds by sending them to another address, you need to give access to that private key to a software wallet – often called a “hot wallet.”
Software wallets are familiar to all cryptocurrency users. These are the apps you download onto your phone or desktop, like Jaxx or Blockchain Wallet. Those wallets “know” your private key(s) and also have the algorithms necessary to convert your private key to a public key and valid address. This allows the app to check your balance, create addresses that others can use to send you funds, and to sign transactions and broadcast them to nodes (allowing you to send funds to others). The wallet software and the necessary algorithms are the same, no matter your private key.
I must make a quick and very important note here. Most cryptocurrency users have never seen an actual private key. There is a broad misconception that the “backup phrase” that you receive from multi-currency Hierarchical Deterministic (HD) wallets, like Jaxx, is a private key. While, to a certain degree, that assertion is functionally true, it is technically false. That backup phrase is technically known as a mnemonic phrase or mnemonic seed. It was integrated into the Bitcoin protocol in 2013 with BIP39. It is honestly one of the greatest innovations in cryptocurrency and the developers who proposed it – Marek Palatinus, Pavel Rusnak, Aaron Voisine, and Sean Bowe – deserve to be celebrated. This awesome innovation allowed an unlimited number of keypairs to be generated from a single, randomly generated phrase consisting of, generally, 7 to 12 words. This allows for maximum privacy since each transaction in a single software wallet can take place on a different address. If you use an HD wallet, you will probably note that your address changes every time you send funds. You will also notice that funds sent to any address you have previously used are available in your wallet. That’s HD in full effect.
Now, here is where your Jaxx backup phrase and CoinText are connected. Your backup phrase is randomly generated. You can load up Jaxx to a new wallet thousands of times and you will never get the same phrase twice. That’s SUPER important! Imagine if you opened a brand new Jaxx wallet and your phrase happened to randomly land on the same phrase as my wallet. Jackpot for you, heartbreak for me, since you could empty out all of my funds. That means that the algorithm that creates the backup phrases must, metaphorically, be a dice with so many sides that you can never roll the same number twice. Rolling the same number twice is referred to as “a collision,” and that’s REALLY BAD. The process needs to have a high level of randomness (referred to as “entropy” in the cryptography world)… or does it? After all, the entire point of the randomness is to ensure that you “never roll the same number twice.” What if there was another way to be sure that no two numbers would ever be rolled twice? What if there was some system where specific numbers were assigned to specific people (or devices)? Do you see where I’m going with this?
There are literally billions of mobile phones connected to the global telecom network at this very moment. However, if I send a text to your phone number (country code + number), there is, for all practical purposes, no chance of that text ending up on any phone but yours. We take this for granted, but c’mon, that’s pretty amazing! It also represents a unique opportunity. CoinText uses your phone number, and our ability to verify which phone number our system is communicating with, to create a unique keypair… for every phone in the world. We use your phone number much like Jaxx uses your backup phrase. Instead of using the algorithm from BIP39 to generate a keypair from your phone number, we have a proprietary algorithm that we use. This algorithm assigns a unique, secure address to every phone number on earth. Most importantly, it does everything on-the-fly.
I keep hearing that CoinText does everything “on-the-fly.” What does that mean and why is that important?
An easy way to envision CoinText’s technology is as a software wallet, functionally identical to a wallet app on your phone. The CoinText wallet, however, lives in the cloud, and instead of controlling it with your phone’s touch screen, you control your wallet via SMS commands. Because the logic layer of the software is not on a machine over which you have complete control, there are reasonable privacy, security, and regulatory concerns that savvy cryptocurrency users very rightly have regarding CoinText. I will detail the primary concerns and explain how CoinText addresses them.
The first (and most important concern) is in regards to control of private keys. As I explained above, any individual in possession of a private key has full access to the funds in a given address. When you use a legitimate wallet app on your phone, the private keys are stored only on your device. The CoinText wallet has to generate your key pair every time you access the service. We do this by running the incoming phone number, as verified by the telephone company associated with the local access number with which you are communicating, through our proprietary algorithm and the executing the requested function (SEND, RECEIVE, BALANCE). This entire process takes only a fraction of a second and, once the action has completed, all trace of the private key in question is wiped from memory. At no time are private keys, addresses, or any record of a transaction written to disk.
There are several reasons why CoinText doesn’t store logs of key pairs, incoming numbers, or transactions. The first reason is because, quite simply, there is no technical or business reason for us to do so. Our system is made incredibly efficient by running without a database layer constantly reading and writing data. Excluding that database layer allows us to scale at a fraction of the cost (and significantly less technical complexity) of a system that stored such information. The second reason is for security. Quite a few exchanges and large custodial wallet services have been hacked. Scammers have also sold hardware wallets that utilized private keys known to the scammers – a sort of trap for the end user. In all cases (but particularly damaging in the case of the exchanges), the fraudsters gained access to the private keys for large stashes of cryptocurrency that were being held in custody for end users. CoinText has no record of private keys (we are completely non-custodial), so we eliminate an attack vector and temptation for would-be hackers. The fewer points of failure or possible attack vectors a system has, the easier that system is to secure.
From a privacy standpoint, particularly on the global stage, we realize that part of the power of cryptocurrency is to provide a means of doing peaceful voluntary transactions outside of the grasp of corrupt governments and the banking cartel. Too many cryptocurrency exchanges are demanding personal financial information from their users, creating a paper trail that governments can use to threaten peaceful people. We are ideologically opposed to such violent coercion, so it is important to us to provide the most financial privacy possible. This is yet another reason that we do not store any information about who is transacting on our system.
One of the most important reasons that we do not store private keys, addresses, or any information that could be used to regenerate such information is regulatory. If we had access to private keys – the ability to access funds of users – our project would be considered, for regulatory purposes, a custodian of those funds. This would make us subject to Money Service Business regulations. Such laws vary broadly across jurisdictions (national, provincial, etc) but virtually all of them require strict tracking of user activity. CoinText is purely non-custodial.
CoinText users are merely interacting with our software, in the cloud, via SMS messages. In exchange for CoinText’s software signing and broadcasting a user transaction to the BCH network, that user pays CoinText, as of this writing, a fee of 10 Satoshis (.0000001 BCH) per byte, in addition to the 1 Sat/byte standard BCH mining fee, based on the file size of the transaction. Transaction file size will vary based on how many unspent outputs (UTXOs) are used to create the transaction. This means that the typical fee to send any amount of BCH via CoinText is about 3300 Satoshis (around 3 cents USD worth of Bitcoin Cash at the time of writing). The fee paid to CoinText is included in the transaction as an additional output. These fees are subject to change on a per-country basis and will likely be reduced over time as overall volume increases. BALANCE, RECEIVE, and HELP commands are complimentary (no fee).
What are the security concerns with using CoinText?
There are many different options for storing and transacting cryptocurrency. I personally use paper wallets, hardware wallets, exchanges, and software wallets in addition to CoinText. CoinText is fast and easy. It’s a convenient tool for casual spending, international transfers, and for sending Bitcoin Cash to people who are new to cryptocurrency or don’t have a wallet. The great economist Thomas Sowell has said, “In economics, there are no solutions… only trade offs.” This is true with cryptocurrency as well. Because your CoinText wallet is controlled via SMS, anyone who can send a text message from your phone has access to your funds. That means that if your phone is unsecured (no password, fingerprint or facial recognition lock) and your phone falls into someone else’s hands, they potentially have access to your funds (if they know how to use CoinText).
Another vulnerability for users in countries with less developed telecom regulations and infrastructure (US and Canada don’t have this issue) is that a malicious user might be able to “spoof” an SMS message to a local access number that appears to come from your number. Of course they would have to know your number and know that you were using CoinText and had funds in your account. Luckily, a spoofer would not be able to see any response that CoinText sent back to you, and we are implementing additional security features such as Two-Factor Authentication (2FA) that will completely mitigate this vulnerability. Significantly less likely, but still possible, is that someone who has the ability to clone your SIM card or convince your mobile phone provider to reassign your phone number to a SIM card they control, would also potentially have access to your funds. But this tactic is a threat to any financial app on your phone, not just CoinText. I suspect mobile carriers will tighten security if SIM cloning continues.
It goes without saying that keeping your mobile phone secure is a good practice whether or not you are using CoinText. Simply requiring a PIN in order to unlock and use your mobile phone will be enough to secure your CoinText funds associated with your phone number (associated key pair) in the case that your phone is lost or stolen. Once your phone is reported lost, your number is unassigned from that device and it will be unable to access your CoinText wallet.
With all that said, I feel the same security with my CoinText wallet balance as I feel for the paper fiat I carry in my wallet. I leave enough cash at any given time to use for casual spending, refilling it from a software wallet when the funds in my CoinText address get low.
CoinText is an ever-evolving project. We love being a part of the Bitcoin Cash community and our entire team is looking forward to the adventure of improving CoinText and making it a valuable part of a new global, liberated financial system. We appreciate all of the support of our beta users and love getting your feedback on how we can improve the product.