silkaj issueshttps://git.duniter.org/clients/python/silkaj/-/issues2021-03-13T13:33:05+01:00https://git.duniter.org/clients/python/silkaj/-/issues/356Useless change transactions2021-03-13T13:33:05+01:00matograineUseless change transactionsWhile using Silkaj on GTest on a member account, I encountered a strange behavior. A lot of change transactions happened before my actual tx was sent. Each of these change txs gathered the necessary amount for the TX, .
To reproduce : s...While using Silkaj on GTest on a member account, I encountered a strange behavior. A lot of change transactions happened before my actual tx was sent. Each of these change txs gathered the necessary amount for the TX, .
To reproduce : send more than 40 UD from a member account. I have done it once, and you can observe on block [660862](https://g1-test.duniter.org/blockchain/block/660862) : 2 change txs ; only the 1st one is used in the final tx.
**Reason** :
* the result of tx/sources/<pubkey> is ordered as so :
* UDs first
* TX after
* the [get_sources()](https://git.duniter.org/clients/python/silkaj/-/blob/dev/silkaj/money.py#L113) function respects this order, and adds the pending transactions **after**.
**Solution(s)**
three solutions. What we want is that pending transactions should be considered first after a change transaction.
1. make money.get_sources add pending transaction **at the beginning of the sources list**. (not tested, just guessing)(needs few line change in the code)
2. make tx.get_list_input_for_transaction() reverse the list of inputs, in order to have pendings first.
3. call get_sources only once ; then write change txs and final tx we need ; then send it all to the node. (needs a lot of refactoring to the code)
___
* Solution 1 is easiest and for short-term. I plan to use it for #281. This means we use sources in this order : 1- pending, 2-UD, 3- TX on blockchain.
* I can use solution 2 as well if (for any reason) we don't want to change get_source() behavior. The source would be used as so : 1-pending, 2-TX on BC, 3- UD.
* Solution 3 is part of #172 : if we want to request sources only once, we will have to compute all txs before sending them.0.9.0matograinematograinehttps://git.duniter.org/clients/python/silkaj/-/issues/349authfile command: use general instead of specific option to specify the auth ...2022-03-29T11:16:49+02:00Moulauthfile command: use general instead of specific option to specify the auth file path?The advantage is using a common system: `click` context.
The downside is that it doesn't get obvious, since it's not longer suggested in the command specific help.
The help of the command could specify that.The advantage is using a common system: `click` context.
The downside is that it doesn't get obvious, since it's not longer suggested in the command specific help.
The help of the command could specify that.Backloghttps://git.duniter.org/clients/python/silkaj/-/issues/343Allow smaller base58 pubkeys2022-06-27T18:31:02+02:00matograineAllow smaller base58 pubkeysSee forum post : https://forum.duniter.org/t/clefs-publiques-commencant-par-1/7607/11
Conclusions are :
* base58 ed25519 pubkeys can be {41-44} characters long, maybe {40, 44}, maybe less. Silkaj handles {43, 44} long pubkeys : this is...See forum post : https://forum.duniter.org/t/clefs-publiques-commencant-par-1/7607/11
Conclusions are :
* base58 ed25519 pubkeys can be {41-44} characters long, maybe {40, 44}, maybe less. Silkaj handles {43, 44} long pubkeys : this is a bug, and should be addressed in 0.8.x.
* Duniter handles pubkeys with a "leading 1" differently from the same pubkey without the "leading 1", but they have the same binary representation. When this problem will be resolved on Duniter, I think we should agree with the devs of all clients to remove the "leading 1" when the clients produces such a pubkey.https://git.duniter.org/clients/python/silkaj/-/issues/337forbid any BMA call during tests2020-09-06T14:23:39+02:00matograineforbid any BMA call during testsIt seems that opening and closing a BMA session during tests (pytest) forbids any further opening of any BMA session.
As a consequence, I think it should be written in CONTRIBUTING.md that any opening/closing of BMA sessions in tests is...It seems that opening and closing a BMA session during tests (pytest) forbids any further opening of any BMA session.
As a consequence, I think it should be written in CONTRIBUTING.md that any opening/closing of BMA sessions in tests is forbidden, and that related functions should be patched.0.9.0https://git.duniter.org/clients/python/silkaj/-/issues/327limit recipients number for 0.8 (discussion)2021-03-25T20:25:14+01:00matograinelimit recipients number for 0.8 (discussion)For 0.8, we plan to release the feature "multiple recipients". However, this feature introduces a possible bug (#281). With max 40 inputs, the created transaction document may be too big if there are more than 15 outputs = 14 receivers +...For 0.8, we plan to release the feature "multiple recipients". However, this feature introduces a possible bug (#281). With max 40 inputs, the created transaction document may be too big if there are more than 15 outputs = 14 receivers + 1 backchange. This bug is not harmful, no money is sent when it happens.
`max_outputs = 100 - 3 - 2 x SENDERS - 2 x MAX_OUTPUTS = 100-3-(2x1)-(2x40) = 15`
Should we :
* leave this bug open (it never happened with the developpers funding account, which seems to be the only one exceeding the limit of 15)
* add a MAX_RECEIVERS = 14 limit, with an error message telling the user to spend the money with littler receivers list.
Since 0.8 is to be released in Debian repos, I would rather add the MAX_RECEIVERS limit to avoid this bug ; and go on fixing it on 0.8.x if we have time, or 0.9+ if not.0.8.xmatograinematograinehttps://git.duniter.org/clients/python/silkaj/-/issues/310wot: 'outdistanced' provides a wrong information?2022-06-28T18:21:02+02:00matograinewot: 'outdistanced' provides a wrong information?The member Maria44 should enter the wot in a few days, according to WotWizard. (see [forum](https://forum.duniter.org/t/maria44-bug-pour-certifications/7039/3))
```
silkaj wot Maria44
Maria44 (HXSSj…) from block #300354-0000049C…
receiv...The member Maria44 should enter the wot in a few days, according to WotWizard. (see [forum](https://forum.duniter.org/t/maria44-bug-pour-certifications/7039/3))
```
silkaj wot Maria44
Maria44 (HXSSj…) from block #300354-0000049C…
received 7 and sent 0/100 certifications:
| received_expire | received | sent | sent_expire |
|-------------------+--------------------+--------+---------------|
| 2022-01-31 | Claire666 ✔ | | |
| 2022-01-31 | carinecoxi ✔ | | |
| 2022-01-31 | TristanG1 | | |
| 2022-01-31 | Michellecuyer26 | | |
| 2022-01-31 | ChristineWilloth26 | | |
| 2022-02-06 | ChristineWilloth26 | | |
| 2022-02-06 | Michellecuyer26 | | |
✔: Certifications written into the blockchain
Membership expiration due to certification expirations: 2022-01-31
member: False
outdistanced: True
```
All pending certifications are correctly displayed.
What does "outdistanced" mean ? I understand that the member is out of the minimum distance, and should not enter the blockchain. Is it a bug or an unclear TUI ?https://git.duniter.org/clients/python/silkaj/-/issues/253Use authfile instead of salt password prompt to make TX2020-02-21T23:48:31+01:00FredUse authfile instead of salt password prompt to make TXIn order to make batch TX, could it be possible to add
`--authfile ./source_autfile` instead of prompting for salt/password?
```
silkaj -p g1.le-sou.org:443 tx --amount 10 --auth-file ./g1sms.priv.key --output DsEx1pS33vzYZg4MroyBV9hCw...In order to make batch TX, could it be possible to add
`--authfile ./source_autfile` instead of prompting for salt/password?
```
silkaj -p g1.le-sou.org:443 tx --amount 10 --auth-file ./g1sms.priv.key --output DsEx1pS33vzYZg4MroyBV9hCw98j1gtHEhwiZ5tK7ech
Usage: silkaj tx [OPTIONS]
Try "silkaj tx --help" for help.
Error: no such option: --auth-file
```
```
silkaj -p g1.le-sou.org:443 tx --amount 10 --output DsEx1pS33vzYZg4MroyBV9hCw98j1gtHEhwiZ5tK7ech
Please enter your Scrypt Salt (Secret identifier):
```0.7.xhttps://git.duniter.org/clients/python/silkaj/-/issues/227Failed building wheel for cffi2019-06-06T23:32:58+02:00FredFailed building wheel for cffiI am trying to install silkaj on Raspberry Pi 3B+ with Raspbian Stretch. But I have an error doing so...
pip3 install silkaj --user
```
Collecting silkaj
Using cached https://files.pythonhosted.org/packages/66/09/0a3e8d716924bd3d469d...I am trying to install silkaj on Raspberry Pi 3B+ with Raspbian Stretch. But I have an error doing so...
pip3 install silkaj --user
```
Collecting silkaj
Using cached https://files.pythonhosted.org/packages/66/09/0a3e8d716924bd3d469dd3c2874f5c5269fed3d74d38b9191216d424deb5/silkaj-0.6.2-py3-none-any.whl
Collecting pyaes (from silkaj)
Using cached https://www.piwheels.org/simple/pyaes/pyaes-1.6.1-py3-none-any.whl
Collecting pynacl (from silkaj)
Using cached https://www.piwheels.org/simple/pynacl/PyNaCl-1.3.0-cp35-cp35m-linux_armv7l.whl
Collecting commandlines (from silkaj)
Using cached https://files.pythonhosted.org/packages/92/20/9fdf2c639119447ac03246ed3a04beb3c24aaf88d38f348e8c24375ec4aa/commandlines-0.4.1-py2.py3-none-any.whl
Collecting scrypt (from silkaj)
Using cached https://www.piwheels.org/simple/scrypt/scrypt-0.8.13-cp35-cp35m-linux_armv7l.whl
Collecting ipaddress (from silkaj)
Using cached https://files.pythonhosted.org/packages/fc/d0/7fc3a811e011d4b388be48a0e381db8d990042df54aa4ef4599a31d39853/ipaddress-1.0.22-py2.py3-none-any.whl
Collecting tabulate (from silkaj)
Using cached https://www.piwheels.org/simple/tabulate/tabulate-0.8.3-py3-none-any.whl
Collecting six (from pynacl->silkaj)
Using cached https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl
Collecting cffi>=1.4.1 (from pynacl->silkaj)
Using cached https://files.pythonhosted.org/packages/93/1a/ab8c62b5838722f29f3daffcc8d4bd61844aa9b5f437341cc890ceee483b/cffi-1.12.3.tar.gz
Collecting pycparser (from cffi>=1.4.1->pynacl->silkaj)
Using cached https://www.piwheels.org/simple/pycparser/pycparser-2.19-py2.py3-none-any.whl
Building wheels for collected packages: cffi
Running setup.py bdist_wheel for cffi ... error
Complete output from command /usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-0k8cfpyv/cffi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmp28756jt5pip-wheel- --python-tag cp35:
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-armv7l-3.5
creating build/lib.linux-armv7l-3.5/cffi
copying cffi/cparser.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/lock.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/cffi_opcode.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/ffiplatform.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/recompiler.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/verifier.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/__init__.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/pkgconfig.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/api.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/commontypes.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/backend_ctypes.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/vengine_cpy.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/model.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/error.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/setuptools_ext.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/vengine_gen.py -> build/lib.linux-armv7l-3.5/cffi
copying cffi/_cffi_include.h -> build/lib.linux-armv7l-3.5/cffi
copying cffi/parse_c_type.h -> build/lib.linux-armv7l-3.5/cffi
copying cffi/_embedding.h -> build/lib.linux-armv7l-3.5/cffi
copying cffi/_cffi_errors.h -> build/lib.linux-armv7l-3.5/cffi
running build_ext
building '_cffi_backend' extension
creating build/temp.linux-armv7l-3.5
creating build/temp.linux-armv7l-3.5/c
arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fdebug-prefix-map=/build/python3.5-6waWnr/python3.5-3.5.3=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python3.5m -c c/_cffi_backend.c -o build/temp.linux-armv7l-3.5/c/_cffi_backend.o
c/_cffi_backend.c:15:17: fatal error: ffi.h: No such file or directory
#include <ffi.h>
^
compilation terminated.
error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
----------------------------------------
Failed building wheel for cffi
Running setup.py clean for cffi
Failed to build cffi
```0.7.0https://git.duniter.org/clients/python/silkaj/-/issues/24fail to install silkaj2018-04-09T20:13:55+02:00Moulfail to install silkaj*Created by: galuel*
Probably missing Python3 installation in requirements !? -> not clear how to...
```bash
$ sudo pip3 install -r requirements.txt
Collecting commandlines (from -r requirements.txt (line 1))
Downloading command...*Created by: galuel*
Probably missing Python3 installation in requirements !? -> not clear how to...
```bash
$ sudo pip3 install -r requirements.txt
Collecting commandlines (from -r requirements.txt (line 1))
Downloading commandlines-0.4.1-py2.py3-none-any.whl
Collecting ipaddress (from -r requirements.txt (line 2))
Downloading ipaddress-1.0.18.tar.gz
Collecting tabulate (from -r requirements.txt (line 3))
Downloading tabulate-0.7.7-py2.py3-none-any.whl
Collecting pynacl (from -r requirements.txt (line 4))
Downloading PyNaCl-1.1.1.tar.gz (3.1MB)
100% |████████████████████████████████| 3.1MB 311kB/s
Complete output from command python setup.py egg_info:
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
Package libffi was not found in the pkg-config search path.
Perhaps you should add the directory containing `libffi.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libffi' found
c/_cffi_backend.c:15:17: fatal error: ffi.h: Aucun fichier ou dossier de ce type
compilation terminated.
Traceback (most recent call last):
File "/usr/lib/python3.5/distutils/unixccompiler.py", line 118, in _compile
extra_postargs)
File "/usr/lib/python3.5/distutils/ccompiler.py", line 909, in spawn
spawn(cmd, dry_run=self.dry_run)
File "/usr/lib/python3.5/distutils/spawn.py", line 36, in spawn
_spawn_posix(cmd, search_path, dry_run=dry_run)
File "/usr/lib/python3.5/distutils/spawn.py", line 159, in _spawn_posix
% (cmd, exit_status))
distutils.errors.DistutilsExecError: command 'x86_64-linux-gnu-gcc' failed with exit status 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.5/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/lib/python3.5/distutils/dist.py", line 955, in run_commands
self.run_command(cmd)
File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 161, in run
cmd = self.call_command('install_lib', warn_dir=0)
File "/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py", line 147, in call_command
self.run_command(cmdname)
File "/usr/lib/python3.5/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/install_lib.py", line 23, in run
self.build()
File "/usr/lib/python3.5/distutils/command/install_lib.py", line 109, in build
self.run_command('build_ext')
File "/usr/lib/python3.5/distutils/cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
cmd_obj.run()
File "/usr/lib/python3/dist-packages/setuptools/command/build_ext.py", line 49, in run
_build_ext.run(self)
File "/usr/lib/python3.5/distutils/command/build_ext.py", line 338, in run
self.build_extensions()
File "/usr/lib/python3.5/distutils/command/build_ext.py", line 447, in build_extensions
self._build_extensions_serial()
File "/usr/lib/python3.5/distutils/command/build_ext.py", line 472, in _build_extensions_serial
self.build_extension(ext)
File "/usr/lib/python3/dist-packages/setuptools/command/build_ext.py", line 174, in build_extension
_build_ext.build_extension(self, ext)
File "/usr/lib/python3.5/distutils/command/build_ext.py", line 532, in build_extension
depends=ext.depends)
File "/usr/lib/python3.5/distutils/ccompiler.py", line 574, in compile
self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
File "/usr/lib/python3.5/distutils/unixccompiler.py", line 120, in _compile
raise CompileError(msg)
distutils.errors.CompileError: command 'x86_64-linux-gnu-gcc' failed with exit status 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 243, in run_setup
DirectorySandbox(setup_dir).run(runner)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 273, in run
return func()
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 242, in runner
_execfile(setup_script, ns)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 46, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-aalxnj4m/cffi-1.10.0/setup.py", line 232, in <module>
"Programming Language :: Python :: 3.6",
File "/usr/lib/python3.5/distutils/core.py", line 163, in setup
raise SystemExit("error: " + str(msg))
SystemExit: error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1087, in run_setup
run_setup(setup_script, args)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 246, in run_setup
raise
File "/usr/lib/python3.5/contextlib.py", line 77, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/lib/python3.5/contextlib.py", line 77, in __exit__
self.gen.throw(type, value, traceback)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 166, in save_modules
saved_exc.resume()
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 141, in resume
six.reraise(type, exc, self._tb)
File "/usr/lib/python3/dist-packages/pkg_resources/_vendor/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 154, in save_modules
yield saved
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 195, in setup_context
yield
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 243, in run_setup
DirectorySandbox(setup_dir).run(runner)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 273, in run
return func()
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 242, in runner
_execfile(setup_script, ns)
File "/usr/lib/python3/dist-packages/setuptools/sandbox.py", line 46, in _execfile
exec(code, globals, locals)
File "/tmp/easy_install-aalxnj4m/cffi-1.10.0/setup.py", line 232, in <module>
"Programming Language :: Python :: 3.6",
File "/usr/lib/python3.5/distutils/core.py", line 163, in setup
raise SystemExit("error: " + str(msg))
SystemExit: error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-6798m6u9/pynacl/setup.py", line 232, in <module>
"Programming Language :: Python :: 3.6",
File "/usr/lib/python3.5/distutils/core.py", line 108, in setup
_setup_distribution = dist = klass(attrs)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 269, in __init__
self.fetch_build_eggs(attrs['setup_requires'])
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 313, in fetch_build_eggs
replace_conflicting=True,
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 826, in resolve
dist = best[req.key] = env.best_match(req, ws, installer)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1092, in best_match
return self.obtain(req, installer)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1104, in obtain
return installer(requirement)
File "/usr/lib/python3/dist-packages/setuptools/dist.py", line 380, in fetch_build_egg
return cmd.easy_install(req)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 663, in easy_install
return self.install_item(spec, dist.location, tmpdir, deps)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 693, in install_item
dists = self.install_eggs(spec, download, tmpdir)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 873, in install_eggs
return self.build_and_install(setup_script, setup_base)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1101, in build_and_install
self.run_setup(setup_script, setup_base, args)
File "/usr/lib/python3/dist-packages/setuptools/command/easy_install.py", line 1089, in run_setup
raise DistutilsError("Setup script exited with %s" % (v.args[0],))
distutils.errors.DistutilsError: Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6798m6u9/pynacl/
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```0.3.0MoulMoul