Minicash
A cryptocurrency without blockchain
What is Minicash?
As the title says Minicash is a cryptocurrency that doesn't use blockchain but instead uses a ledger of addresses and balances. It uses GPG asymmetric cryptography for secure communication and "voting". Voting occurs on two cases, first when a new key requests to be introduced to the ledger and second when a transaction is requested. For a key to be valid to enter the ledger a proof of work must be provided. This needs many sha256 calculations and regulates the difficulty of key creation. When a key enters the ledger, 10 new coins are created and assigned to this key.
Why to choose Minicash?
Most of the current cryptocurrencies use the blockchain which requires huge free space to dedicate in your hard disk. Running a full node is important and one way road for the security. Minicash doesn't have this problem as the ledger and GPG key's size is not big enough to be noticed. Also Minicash concentrates on simplicity. Without a blockchain no resource hungry calculations need to be done.
The big picture
Bob (as every other peer) has a ledger with the balances of all the peers in the network. How does he send 5 coins to Alice?
- Bob takes a copy of the ledger.
- Makes the appropriate balance change.
- Signs it with his private key and sends it to all the peers.
- Each peer checks for the validity of the transcaction and if he finds it valid signs the whole message with his private key and sends it back to Bob.
- Bob collects all the data from the peers and puts them together in a new message.
- Sends this message back to all the peers.
- Each peer checks if the block received contains signatures from more than 66% of the total peers and if yes then the transaction is valid so the peer renews his ledger according to the transcation.
How are coins created?
There is no mining. Coins are born every time a new GPG key fingerprint is introduced in the legder together with a proof of work. The proof of work is an integer that when sticked to the end of the fingerprint with a _ between them creates a string that its sha256 hash starts with a specified number of zeros. For example: fingerprint_proofOfWork. So each time a new key fingerprint, accompanied with proof of work, enters the ledger 10 fresh coins are added on its balance.
How to install?
Minicash has been tested working on Linux with Python 3.5 and Python 3.6
- You can download it from Pypi. Decompress the file in a folder and run
python setup.py install
from that folder. - Alternatively you can download it straight from pip running
pip3 install Minicash
- There are alse portable executable files to use here. Download the portable zip archive and extract the binary files inside it to the
/usr/local/bin
folder.
Important notes:
- Using a virtualenv is strongly adviced.
- When
gpg
command is invoked gpg2 should run rather than gpg1. - Requires dirmngr to be installed from your Linux distribution's repositories for Minicash to be able to download/upload keys to/from keyservers.
- Minicash uses the specific MinicashPeerServer software for network peer discovery. You will need it if you intend to use Minicash on local networks.
Components
=============
minicashd (The node's server - daemon)
(minicashPy3-5Env) aris@adesk MinicashWorld-> minicashd -h
usage: minicashd [-h] [--loglevel LOGLEVEL] [--peerserver PEERSERVER]
[--homedir HOMEDIR] [--nopid]
password
positional arguments:
password Common password for all the GNUPG keys
optional arguments:
-h, --help show this help message and exit
--loglevel LOGLEVEL Level of logging in file minicash.log
--peerserver PEERSERVER
IP of the peer discovery server
--homedir HOMEDIR Directory inside which .minicash should be located
minicash (The node's command line client)
(minicashPy3-5Env) aris@adesk MinicashWorld-> minicash -h
usage: minicash [-h]
{listpeers,getledger,introducekeytoledger,listlocalkeys,gen-pow,add-key,getbalances,getallbalances,stop,send}
...
positional arguments:
{listpeers,getledger,introducekeytoledger,listlocalkeys,gen-pow,add-key,getbalances,getallbalances,stop,send}
listpeers List all online nodes in the network
getledger Print the current ledger
introducekeytoledger
Introduce the key to the ledger
listlocalkeys List all local keys fingerprints
gen-pow Create proof of work
add-key Add existing key in the node
getbalances Get the balances
getallbalances Get the balances of all the nodes
stop Stop the server
send Pay to other key
optional arguments:
-h, --help show this help message and exit
quickDataGen (A script for easy and fast keys and configuration generation)
(minicashPy3-5Env) aris@adesk MinicashWorld-> quickDataGen -h
usage: quickDataGen [-h] keysnum difficulty password homedir [homedir ...]
positional arguments:
keysnum Number of keys to create
difficulty Number of zeros hash start
password The gpg private key password
homedir Directory inside which .minicash folder should be created
optional arguments:
-h, --help show this help message and exit
How to use?
Prerequisites:
- Decide a common password that you'll be always using for every new gpg key you will create. Let's call it "mypassword"
- Decide inside which folder you want the ".minicash" configuration folder to be placed. Let's name it "myinstallationfolderpath" (default is the linux user home folder).
- You need to do port forwarding at your router so that it sends all port 2222 incoming data to your node.
- If you run a peer discovery server on the same computer you run a server node make sure to pass the --peerserver argument with the IP and not just "localhost".
- Attention: Every path you pass to the command line must be the full path.
The hard way:
- Make sure you are connected to the Internet.
- Run
minicashd --homedir <myinstallationfolderpath> <mypassword>
to boot the daemon. - Create a GPG key pair:
gpg --homedir <myinstallationfolderpath>/.minicash/.gnupg --gen-key
using "mypassword" when asked for password. - Run
gpg --homedir <myinstallationfolderpath>/.minicash/.gnupg --list-keys --keyid-format long | grep -Po 'pub rsa2048/\K[A-Z0-9]*'
and note down the 16 character public key fingerprint of the output. Let's call it "myfingerprint". - Create proof of work running
minicash gen-pow 7 <myfingerprint>
. Wait for a while and let's name the output "proof". - Add the key with the proof to minicash running
minicash add-key <myfingerprint> <proof>
. - Introduce the key to the global ledger running
minicash introducekeytoledger <myfingerprint>
. - Now you are ready to do your first transaction. You have 10 coins since your key was introduced to the ledger. Say you want to send 1.504 coins to the fingerpint 1559CBEBCB7E72B6. Run
minicash send <myfingerprint> 1559CBEBCB7E72B6 1.504
. - Congratulations! You've done your first transaction!
The lazy way:
- Run
quickDataGen 1 7 <mypassword> <myinstallationfolderpath>
- Run
minicashd --homedir <myinstallationfolderpath> <mypassword>
to boot the daemon. - Run
minicash listlocalkeys
and note down your 16 character fingerprint. Let's call it "myfingerprint" - Follow the "The hard way" above from step 7 until the end.
Help
On every case you can run minicash -h
to list the available options.
Don't hesitate to email me on arisgold29@gmail.com with "minicash" as title in case you have any questions.