Silkaj : Installation, virements automatiques et multi-destinataires


#1

Petit précis pour réaliser des virements automatiques à l’aide de Silkaj.

Objectif

Réaliser un virement automatique à une liste de bénéficiaires dont on connaît les clés publiques.

Exemple : réaliser le virement mensuel aux contributeurs de Duniter, soit 13 clés publiques, 200 Ğ1 chacun.

Prérequis

:warning: Attention ! Ce tutoriel utilise une fonction de Silkaj en cours d’approbation : l’envoi de monnaie à de multiples destinataires. Une Merge Request a été soumise afin d’intégrer ce développement dans la release officielle.

  • Compiler Silkaj ;
  • Posséder une machine avec un Linux récent (Ubuntu 18.04 ou Fedora 28) ;
  • Disposer d’un compte alimenté en Ğ1 :slight_smile:

Compiler Silkaj

Je vais vous copier ici les commandes que j’ai dû lancer sur une Ubuntu 18.04 fraîchement installée :

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

Ajouter à la fin de votre ~/.bashrc les lignes suivantes :

# Load pyenv automatically by adding
# the following to ~/.bash_profile:

export PATH="/home/cgeek/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Puis rouvrez un nouveau terminal :

pyenv install 3.6.0
pyenv shell 3.6.0
pyenv virtualenv silkaj-env

Ouvrez encore un nouveau terminal :

git clone https://github.com/duniter/silkaj.git
cd silkaj
pip install -r requirements.txt --upgrade
pyenv rehash
pyenv activate silkaj-env

Vérifiez que Silkaj fonctionne :

./silkaj -h

Cette commande devrait vous afficher l’aide de Silkaj.

Créer un fichier des destinataires

Vous devez préalablement aller récupérer la liste des clés publiques des personnes à qui vous souhaitez faire le virement.

Exemple : ici, je souhaite faire un virement aux clés publiques des personnes considérées « contributeurs » au logiciel Duniter et à ses outils.

Créer un fichier destinataires.txt contenant la liste des clés destinataires. Vous pouvez récupérer celles-ci par le moyen qui vous conviendra, personnellement je suis passé par Cesium en tapant les pseudos des individus à qui je souhaitais réaliser le virement.

Exemple :

2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ
FEkbc4BfJukSWnCU6Hed6dgwwTuPFTVdgz5LpL4iHr9J
D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx
HbTqJ1Ts3RhJ8Rx4XkNyh1oSKmoZL1kY5U7t9mKTSjAB
38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE
5cnvo5bmR8QbtyNVnkDXWq6n5My6oNLd1o6auJApGCsv
GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP
7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ
CRBxCJrTA6tmHsgt9cQh9SHcCc8w8q95YTp38CPHx2Uk
2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT
4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj
55oM6F9ZE2MGi642GGjhCzHhdDdWwU6KchTjPzW7g3bp
BH8ZqCsp4sbHeDPPHpto53ukLLA4oMy4fXC5JpLZtB2f

Créer un fichier d’authentification

Afin de réaliser un paiement automatique qui ne nécessiterait pas de saisie de notre part, Silkaj doit avoir accès à un fichier d’authentification permettant de dépenser des Ğ1.

Pour créer ce fichier, munissez-vous des identifiants secrets d’un compte portefeuille puis exécutez la commande suivante :

$ silkaj generate_auth_file --auth-scrypt
Requested default node: <g1.duniter.org:443>
Please enter your Scrypt Salt (Secret identifier): 
Please enter your Scrypt password (masked): 
Using default values. Scrypt parameters not specified or wrong format
Scrypt parameters used: N: 4096, r: 16, p: 1
Authfile generated for the public key:  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Vous obtiendrez alors un fichier authfile dans le répertoire courant.

Exécuter le virement

Finalement, il ne vous reste plus qu’à exécuter la commande suivante :

silkaj tx --auth-file --file authfile --amount 200 --output `cat destinataires.txt | tr '\n' ':' | sed -e 's/:*$//'`

Pour un virement permanent

Si vous souhaitez réaliser ce virement le 1er de chaque mois, vous pouvez ajouter un crontab sur votre machine (un serveur allumé 24h/24h de préférence) :

0 0 1 * * silkaj tx --auth-file --file authfile --yes --amount 200 --output `cat destinataires.txt | tr '\n' ':' | sed -e 's/:*$//'`

#2

Note importante : sur ma machine Silkaj n’accepte pas de traiter avec des nœuds Duniter en HTTPS, j’obtiens une erreur :

Requested default node: <g1.duniter.org:443>
Traceback (most recent call last):
File "urllib/request.py", line 1318, in do_open
File "http/client.py", line 1239, in request
File "http/client.py", line 1285, in _send_request
File "http/client.py", line 1234, in endheaders
File "http/client.py", line 1026, in _send_output
File "http/client.py", line 964, in send
File "http/client.py", line 1400, in connect
File "ssl.py", line 401, in wrap_socket
File "ssl.py", line 808, in __init__
File "ssl.py", line 1061, in do_handshake
File "ssl.py", line 683, in do_handshake
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)

Je ne sais pas d’où ça vient, étant donné que mon navigateur n’affiche pas de tel problème avec g1.duniter.org en HTTPS.

Mais peu importe car vous pouvez contourner : Silkaj propose l’option -p noeud:port, ce qui vous permet d’envoyer la transaction à un nœud non-HTTPS. Exemple :

silkaj -p cgeek.fr:10901

#3

#4

#5

J’ai corrigé le tutoriel, je pensais que Silkaj pouvait faire de l’envoi à de multiples destinataires nativement, mais en fait non.

Donc j’ai développé cette fonction et proposé une Merge Request, en attendant le tutoriel est alourdi des étapes de compilation.


#6

Et enfin le résultat concernant la rémunération des développeurs de Duniter pour Juin 2018 :

$ ./silkaj tx --auth-file --file authfile --amount 200 -p cgeek.fr:10901 --output `cat pubkeys | tr '\n' ':' | sed -e 's/:*$//'` --comment DEV-DUNITER-06-2018
╒════════════════╤══════════════════════════════════════════════╕
│ amount (Ğ1)    │ 2600.0                                       │
├────────────────┼──────────────────────────────────────────────┤
│ amount (UD Ğ1) │ 19.960079840319363                           │
├────────────────┼──────────────────────────────────────────────┤
│ from           │ 78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8 │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ FEkbc4BfJukSWnCU6Hed6dgwwTuPFTVdgz5LpL4iHr9J │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ HbTqJ1Ts3RhJ8Rx4XkNyh1oSKmoZL1kY5U7t9mKTSjAB │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 5cnvo5bmR8QbtyNVnkDXWq6n5My6oNLd1o6auJApGCsv │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ CRBxCJrTA6tmHsgt9cQh9SHcCc8w8q95YTp38CPHx2Uk │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ 55oM6F9ZE2MGi642GGjhCzHhdDdWwU6KchTjPzW7g3bp │
├────────────────┼──────────────────────────────────────────────┤
│ to             │ BH8ZqCsp4sbHeDPPHpto53ukLLA4oMy4fXC5JpLZtB2f │
├────────────────┼──────────────────────────────────────────────┤
│ comment        │ DEV-DUNITER-06-2018                          │
╘════════════════╧══════════════════════════════════════════════╛
Do you confirm sending this transaction? [yes/no]: yes
Generate Transaction:
- From:    78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8
- To:      2ny7YAdmzReQxAayyJZsyVYwYhVyax2thKcGknmQy5nQ
- To:      FEkbc4BfJukSWnCU6Hed6dgwwTuPFTVdgz5LpL4iHr9J
- To:      D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx
- To:      HbTqJ1Ts3RhJ8Rx4XkNyh1oSKmoZL1kY5U7t9mKTSjAB
- To:      38MEAZN68Pz1DTvT3tqgxx4yQP6snJCQhPqEFxbDk4aE
- To:      5cnvo5bmR8QbtyNVnkDXWq6n5My6oNLd1o6auJApGCsv
- To:      GfKERHnJTYzKhKUma5h1uWhetbA8yHKymhVH2raf2aCP
- To:      7F6oyFQywURCACWZZGtG97Girh9EL1kg2WBwftEZxDoJ
- To:      CRBxCJrTA6tmHsgt9cQh9SHcCc8w8q95YTp38CPHx2Uk
- To:      2sZF6j2PkxBDNAqUde7Dgo5x3crkerZpQ4rBqqJGn8QT
- To:      4FgeWzpWDQ2Vp38wJa2PfShLLKXyFGRLwAHA44koEhQj
- To:      55oM6F9ZE2MGi642GGjhCzHhdDdWwU6KchTjPzW7g3bp
- To:      BH8ZqCsp4sbHeDPPHpto53ukLLA4oMy4fXC5JpLZtB2f
- Amount:  2600.0
Transaction successfully sent.

#7

Joli ! Silkaj a un bel avenir devant lui :slight_smile:


#8

Est-ce qu’Il vaudrait pas mieux le faire avec un python 3.6.5 qui est la dernière version stable ? il devrait y avoir moins de bugs


#9

Aucune idée, j’ai simplement suivi le README de Silkaj.


#10

Pour le problème de certificats, je crois que Python ne vérifie pas que les certificats soient conformes, c’est intégré dans un paquet pip “certifi”.

Il faut modifier un peu silkaj pour prendre ce truc en compte, ou alors remplacer urllib par requests.

@Moul a fait une issue là dessus : https://git.duniter.org/clients/python/silkaj/issues/32

J’ai rajouté un commentaire.


#11

Merci à toi pour tout ça !

Cette version de Python n’est pas exécutée par Silkaj. Elle sert juste à installer pipenv pour les distributions qui embarquent des versions obscolètes de Python.

Cependant, tu peux constater que la dernière version de Python 3.6.x est exécutée pour Silkaj.
C’est verrouillé dans Pipfile.lock :

        "requires": {
            "python_version": "3.6"
        },

Qu’est-ce qui te fait penser ça ? Sinon, je pense que cette erreur ne serait pas apparue.

J’ai déjà fait des expérimentations avec requests qui est une magnifique bibliothèque. Mais, ça ralentit très fortement silkaj. Elle est très grosse et le temps d’importation est vraiment énorme. Ça fait perdre à silkaj son côté performance que je ne souhaite pas lui faire perdre.


#12

Ah, j’avoue que je comprends pas encore très bien comment fonctionne pyenv, j’utilise plutôt virtualenv. Je vais regarder ça.


#13

Autant pour moi, je viens de faire quelques tests et effectivement il décode bien le certificat, et lance une exception si le domaine du cerificat ne match pas celui de la requête.

D’ailleurs, j’ai pas le problème sur g1.duniter.org, mais celui sandbox.si7v.fr plante souvent. Je crois que quand silkaj établie la connexion avec le noeud, il utilise l’ip v6, puis ipv4 puis le nom de domaine. Sauf que en https, il faut le nom de domaine (sinon c’est pas la peine de vérifier le certificats, ça marchera pas).

J’ai essaye de corriger mais maintenant ça plante pour g1.nemsia.org qui est en HTTP sur le port 80 donc je sais pas pourquoi il tente la connexion en https…


#14

En effet

C’est surement lié à ça.


#15

D’après les curl, la machine nemsia fait un redirect en https, mais le certificat est pas bon: yunohost.org, www.yunohost.org, ns.yunohost.org.

Ok respect urllib :wink: je m’en servais pas mais elle remonte dans mon estime !

Je voulait ignorer la connexion par certificat si on n’est pas en HTTPS (un peu comme tu propose dans l’issue gitlab), mais il vaudrait mieux intercepter l’erreur, afficher un résultat “erreur” pour cet utilisateur mais continuer le traitement ?


#17

Top ! J’avais commencé avec cette lib sans connaissance des libs HTTP en la découvrant sur StackOverflow pour savoir comment faire une requête lors de la création de silkaj. J’avoue qu’elle n’est pas hyper top. Mais, elle est légère.


#18

Ah, c’est un certificat auto-signé avec le domaine YunoHost. C’est pas idéal ça.


#19

Ben, Firefox a un message bien particulier pour les certificats auto-signés, là on dirait que Yunohost a intégré un certificat valide dans son image, pas top du tout.

Je sais pas si dans la blockchain, on vérifie que la machine a qui on parle est vraiment la machine qui est annoncé. Si c’est le cas on peut ignorer le certificats.

Si c’est pas le cas, ben on peut utiliser le certificats https pour ça => on ignore le serveur mal configuré.


#20

Non la partie réseau est hors blockchain, il n’y a pas de vérification de ce point de vue.


#21

En revanche l’API client pourrait signer toute ses réponse, ce qui permettrait au client de s’assurer qu’il parle bien au bon noeud sans avoir besoin de dépendre du système pyramidal des certificats SSL !