Skip to content
Snippets Groups Projects
Commit bb015a71 authored by Pascal Engélibert's avatar Pascal Engélibert :bicyclist:
Browse files

Install doc in README & type doc in utils.py

parent 5bac3b47
No related branches found
No related tags found
No related merge requests found
Pipeline #5632 passed
...@@ -3,32 +3,22 @@ ...@@ -3,32 +3,22 @@
ĞMixer is a Duniter currency mixer to anonymize transactions. This implementation can ĞMixer is a Duniter currency mixer to anonymize transactions. This implementation can
run in an onion network, guaranteeing a strong anonymity. run in an onion network, guaranteeing a strong anonymity.
## Contribute
There is a lot of things to do. You also can create a client, for exemple in JS.
It would be great to have a logo (maybe with a mixer blade and an onion in a Ğ), and schemas to explain the protocol.
## How to install it ## How to install it
You can install the gmixer with the script install_gmixer.sh (works on Debian derivated system for the moment) ### ➤ Debian (Ubuntu, Mint, etc.)
sh install_gmixer.sh
## List of gmixer instances (real time updated) ### ➤ Archlinux
You will find a list of gmixer instances here : sudo pacman -S python python-pip leveldb python-plyvel libsodium
sudo pip install --upgrade libnacl duniterpy silkaj py-ubjson plyvel PySocks
[List 1 of gmixer instances](http://zettascript.org/tux/g1/gmixer-webui.html) ### ➤ Other Linux
[List 2 of gmixer instances](http://185.193.38.231/gmixer-instances.html)
## How to use it
Install dependances: Install dependencies:
sudo cp lib/libleveldb.a /usr/lib/libleveldb.a `libleveldb-dev=>1.20` is required for `plyvel`. If you can only get an older version with your package manager, [build it by hand](https://github.com/google/leveldb/releases). (currently it it the case for Debian Stretch, not for Archlinux)
`libleveldb-dev=>1.20` is required for `plyvel`. You can copy it from this repository with the command above. You can also build it: If you can only get an older version with your package manager, [build it by hand](https://github.com/google/leveldb/releases). (currently it it the case for Debian Stretch, not for Archlinux)
Install the following packages: `libleveldb-dev` `libsodium-dev` `python3` `python3-pip` Install the following packages: `libleveldb-dev` `libsodium-dev` `python3` `python3-pip`
...@@ -38,6 +28,8 @@ Install the following packages: `libleveldb-dev` `libsodium-dev` `python3` `pyth ...@@ -38,6 +28,8 @@ Install the following packages: `libleveldb-dev` `libsodium-dev` `python3` `pyth
# If Python < 3.6: # If Python < 3.6:
sudo pip3 install python2_secrets sudo pip3 install python2_secrets
## How to use it
Create config & data dir: (change `~/.gmixer-g1`, so you can run different Create config & data dir: (change `~/.gmixer-g1`, so you can run different
servers with different configs) (note that each server must have different dir) servers with different configs) (note that each server must have different dir)
...@@ -46,13 +38,17 @@ servers with different configs) (note that each server must have different dir) ...@@ -46,13 +38,17 @@ servers with different configs) (note that each server must have different dir)
Edit config and set your values. If you are not using any proxy, `bind_` and `public_` addresses should be the same. Edit config and set your values. If you are not using any proxy, `bind_` and `public_` addresses should be the same.
If `salt` or `password` are empty, they will be asked at runtime. For security reasons, it is not a good idea to write them in commandline. If `salt` or `password` are empty, they will be asked at runtime. For security reasons, it is not a good idea to write them in commandline.
The server must know other nodes on the network. You can find here the list refreshed in real-time and the content to put into your `peers` file:
* [ĞMixer web client](http://zettascript.org/tux/g1/gmixer-webclient/)
* [List of ĞMixer instances](http://185.193.38.231/gmixer-instances.html)
Now, start the server: Now, start the server:
python3 server.py -s python3 server.py -s
# Use -d if using a different dir than default # Use -d if using a different dir than default
# Use -P for automatic fetch of public IP address # Use -P for automatic fetch of public IP address
### Proxy ### Configure a proxy
To use a SOCKS5 proxy for client connections, set the `client.proxy` value in `config.json` as following: To use a SOCKS5 proxy for client connections, set the `client.proxy` value in `config.json` as following:
...@@ -88,6 +84,8 @@ Example: ...@@ -88,6 +84,8 @@ Example:
### HTTP API ### HTTP API
**Warning**: This doc is outdated!
URL is used like commandline arguments. Arguments are separated by slashes. Different commands can be set in the same request. URL is used like commandline arguments. Arguments are separated by slashes. Different commands can be set in the same request.
Command: **/list** list known peers (excluding itself) Command: **/list** list known peers (excluding itself)
......
...@@ -28,18 +28,18 @@ sys.argv = _argv ...@@ -28,18 +28,18 @@ sys.argv = _argv
#-------- DATA #-------- DATA
# Decode binary int (Big Endian) # Decode binary int (Big Endian)
def bin_to_int(b): def bin_to_int(b:bytes) -> int:
return sum([b[i]*256**i for i in range(len(b))]) return sum([b[i]*256**i for i in range(len(b))])
# Encode int into bin (Big Endian) # Encode int into bin (Big Endian)
# n: number ; b: bytes # n: number ; b: bytes
def int_to_bin(n, b=4): def int_to_bin(n:int, b:int=4) -> bytes:
return bytes([(n>>(i*8))&255 for i in range(b)]) return bytes([(n>>(i*8))&255 for i in range(b)])
def gen_keys(): def gen_keys() -> (str, str):
return secrets.token_urlsafe(), secrets.token_urlsafe() return secrets.token_urlsafe(), secrets.token_urlsafe()
def gen_comment(seeds): def gen_comment(seeds:[bytes, bytes, bytes]) -> str:
return socks.b64encode(hashlib.sha512(b"".join(seeds)).digest()).decode() return socks.b64encode(hashlib.sha512(b"".join(seeds)).digest()).decode()
#-------- NETWORK #-------- NETWORK
...@@ -48,7 +48,7 @@ RECBUF = 1024 ...@@ -48,7 +48,7 @@ RECBUF = 1024
p_clen = re.compile("\r?\ncontent-length: *(\d+)\r?\n?", re.IGNORECASE) p_clen = re.compile("\r?\ncontent-length: *(\d+)\r?\n?", re.IGNORECASE)
def sdata(host, mode, url="/", data=b"", uagent="GMixer-py", proxy=None, proxy_onion_only=False): def sdata(host:(str, int), mode:str, url:str="/", data:bytes=b"", uagent:str="GMixer-py", proxy:(str, int)=None, proxy_onion_only:bool=False) -> (bytes, bytes):
tsocket = socket.socket tsocket = socket.socket
if proxy and (not proxy_onion_only or re.match("^.+\.onion$", host[0])): if proxy and (not proxy_onion_only or re.match("^.+\.onion$", host[0])):
socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, proxy[0], proxy[1]) socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, proxy[0], proxy[1])
...@@ -109,11 +109,11 @@ LOG_ERROR = 8 ...@@ -109,11 +109,11 @@ LOG_ERROR = 8
LOGMSG_TYPES = {LOG_INFO:"\033[96minfo\033[0m", LOG_TRACE:"\033[39mtrace\033[0m", LOG_WARN:"\033[93mwarn\033[0m", LOG_ERROR:"\033[91merror\033[0m"} LOGMSG_TYPES = {LOG_INFO:"\033[96minfo\033[0m", LOG_TRACE:"\033[39mtrace\033[0m", LOG_WARN:"\033[93mwarn\033[0m", LOG_ERROR:"\033[91merror\033[0m"}
VERBOSITY = LOG_INFO | LOG_WARN | LOG_ERROR VERBOSITY = LOG_INFO | LOG_WARN | LOG_ERROR
def logPrint(msg, msgtype): def logPrint(msg:str, msgtype:int):
if msgtype & VERBOSITY: if msgtype & VERBOSITY:
print(time.strftime("%Y-%m-%d %H:%M:%S")+" ["+LOGMSG_TYPES[msgtype]+"] "+msg) print(time.strftime("%Y-%m-%d %H:%M:%S")+" ["+LOGMSG_TYPES[msgtype]+"] "+msg)
def getargv(arg, default="", n=1, args=sys.argv): def getargv(arg:str, default:str="", n:int=1, args:list=sys.argv) -> str:
if arg in args and len(args) > args.index(arg)+n: if arg in args and len(args) > args.index(arg)+n:
return args[args.index(arg)+n] return args[args.index(arg)+n]
else: else:
...@@ -123,7 +123,7 @@ def getargv(arg, default="", n=1, args=sys.argv): ...@@ -123,7 +123,7 @@ def getargv(arg, default="", n=1, args=sys.argv):
#-------- ĞMixer #-------- ĞMixer
class Peer: class Peer:
def __init__(self, pubkey, host, port, up): def __init__(self, pubkey:str, host:str, port:int, up:bool):
self.pubkey = pubkey self.pubkey = pubkey
self.host = host self.host = host
self.port = int(port) self.port = int(port)
...@@ -131,20 +131,20 @@ class Peer: ...@@ -131,20 +131,20 @@ class Peer:
self.keys = PublicKey(pubkey) self.keys = PublicKey(pubkey)
def __str__(self): def __str__(self) -> str:
return self.pubkey[:8] + "@" + self.host + ":" + str(self.port) return self.pubkey[:8] + "@" + self.host + ":" + str(self.port)
def export_str(self): def export_str(self) -> str:
return self.pubkey + " " + self.host + " " + str(self.port) return self.pubkey + " " + self.host + " " + str(self.port)
# Read peers list # Read peers list
def readPeers(dir): def readPeers(cdir:str) -> (list, dict):
if not os.path.isfile(dir+"/peers"): if not os.path.isfile(cdir+"/peers"):
open(dir+"/peers", "w").close() open(cdir+"/peers", "w").close()
peers = [] peers = []
peers_index = {} peers_index = {}
peersfile = open(dir+"/peers", "r") peersfile = open(cdir+"/peers", "r")
while True: while True:
line = peersfile.readline() line = peersfile.readline()
if len(line) <= 1: if len(line) <= 1:
...@@ -158,13 +158,13 @@ def readPeers(dir): ...@@ -158,13 +158,13 @@ def readPeers(dir):
return peers, peers_index return peers, peers_index
# Save peers list # Save peers list
def writePeers(dir, peers): def writePeers(cdir:str, peers:list):
peersfile = open(dir+"/peers", "w") peersfile = open(cdir+"/peers", "w")
for peer in peers: for peer in peers:
peersfile.write(peer.export_str()+"\n") peersfile.write(peer.export_str()+"\n")
peersfile.close() peersfile.close()
def sendTransaction(sender_keys, receiver_pubkey, amount, comment): def sendTransaction(sender_keys:SigningKey, receiver_pubkey:str, amount:int, comment:str):
sender_amount = silkaj.money.get_amount_from_pubkey(sender_keys.pubkey)[0] sender_amount = silkaj.money.get_amount_from_pubkey(sender_keys.pubkey)[0]
assert sender_amount >= amount, "not enough money" assert sender_amount >= amount, "not enough money"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment