Ethereum : Premiers pas sur la blockchain

La blockchain est un mot à la mode ces derniers temps, d’autant plus après les annonces d’IBM de Canonical et de Samsung, et avec le développement de solutions comme Rubix ou Ethereum, ce nom cache pourtant une technologie qui pourrait autant révolutionner la société que ne l’ont fait la démocratisation d’Internet ou de l’avènement de la base de données.

Qu’est-ce que la blockchain ?

Comme déjà décrite dans mon article sur les cryptomonnaies, la blockchain est une succession d’ensembles de transactions, appelés blocs, où chaque bloc s’ajoutant apporte une somme de contrôle relative aux blocs le précédant. Ainsi, plus le temps passe, plus les vieilles transactions sont considérées comme authentiques, car la moindre modification à leur niveau engendrerait une toute autre blockchain, contenant des sommes de contrôle radicalement différentes.
La distribution pair-à-pair de ces blocs vient enfin partager l’information entre les nœuds, afin d’assurer une résilience et une sécurité véritablement démocratique.

La blockchain est donc la technologie au cœur des cryptomonnaies, comme le Bitcoin, et le caractère immuable et irréfutable des ses transactions en font un modèle unique pour le stockage d’informations authentiques.

Pourquoi la blockchain ?

En effet, la blockchain n’a pas pour but premier l’efficacité de son modèle, ni la confidentialité. Il n’est donc pas question ici de stocker des documents professionnels, ou des programmes gourmands en ressource. Cependant, ces documents peuvent être signés par des applications de la blockchain, et les programmes peuvent déporter une fraction critique de leur exécution ici également.

Un document signé de cette façon disposera d’une preuve mathématique de cette signature, tout comme le résultat d’une fonction exécutée par la blockchain sera validé par l’intégralité de ses nœuds. La blockchain se mue ainsi d’une série de transactions en une longue file d’informations et procédures se sécurisant les unes après les autres.

Ethereum : Rendre la blockchain intelligente

La première application de la blockchain a été le Bitcoin. Les instructions déployées sur la blockchain se limitaient à des transactions.

Ethereum est un projet ambitieux, qui dispose d’une cryptomonnaie propre (l’Ether), mais qui vise également à développer une blockchain programmable. Il est ainsi possible d’exécuter tout type de programme au sein de la blockchain, celui-ci étant alors exécuté quasi simultanément sur tous les nœuds. Attention, il ne s’agit pas ici d’un programme découpé pour être exécute sur plusieurs processeurs pour le rendre plus rapide ; chaque instruction du programme est exécuté sur l’ensemble des nœuds de la blockchain, dans une machine virtuelle appelée EVM (Ethereum Virtual Machine).

Bien entendu, la monopolisation d’une telle quantité de ressources ne se fait pas gratuitement, il est nécessaire de rétribuer les mineurs qui vont sécuriser l’exécution pour nous. Cela se fait en leur envoyant du Gas (Essence en anglais). Le Gas est une jeton dont la valeur est directement convertie en Ether lors de l’utilisation (on ne stocke donc pas de Gas), mais dont la valeur est ajustée afin d’éviter des coûts de fonctionnement trop variables par rapport à la vie réelle.

La consommation en Gas d’un programme sera directement liée à son coût en temps de processeur dans l’EVM, à son utilisation de la mémoire, ainsi qu’a la quantité d’informations stockées dans la blockchain.

Le Gas dispose d’une limite haute, que l’on ne peut pas dépasser pour une seule transaction. Cela permet ainsi d’empêcher une personne très riche de monopoliser la blockchain, ou encore à un attaquant de tenter d’envoyer une boucle infinie qui paralyserait tout le réseau. Cette limite est variable et dépend de la puissance de calcul fournie par le réseau de mineurs.

Une estimation de la consommation en Gas d’une transaction ainsi qu’une limite maximale permettent d’évaluer le coût réel et de garantir qu’une transaction sur la blockchain ne dépassera pas un certain montant en Ether, auquel cas, la transaction sera annulée et les sommes engagées rendues.

Programmer la blockchain

Les programmes au sein d’Ethereum porte le nom de Contract. Chaque contrat dispose de son propre code EVM. Ce code peut cependant être compilé depuis:

  • un langage derivé de JavaScript : Solidity, il est le plus couramment utilisé, je ne m’intéresserai qu’à celui-ci dans cet article
  • un autre dérivé de Python : Serpent
  • ou encore depuis du LISP : LLL

Un contrat est considéré comme un compte (il dispose ainsi de sa propre balance d’Ether) qui peut être administré par un autre compte. Les contrats sont publiques : tout le monde peut voir leur code et leur solde, et il est également possible de leur appliquer des fonctions.

Une fois déployé au travers de la blockchain d’Ethereum, les contrats peuvent recevoir des transactions (de l’Ether) ou des messages (des appels aux fonctions).

Ses messages peuvent être envoyés non seulement au travers d’un porte-feuille (Wallet), mais également au travers de la ligne de commande (geth) ou encore d’applications (Đapps) au travers d’une API JavaScript.

Des applications infinies

L’engouement que suscite la blockchain vient en grande partie de la variété d’applications que celle-ci peut supporter, avec un investissement en infrastructure nul et un coût d’utilisation très modeste.

Voici quelques exemples:

  • La blockchain pourrait remplacer facilement un réseau de notaires, ou chaque bien serait un jeton que des utilisateurs pourraient s’échanger. La transaction est ainsi inviolable et perenne : impossible de revendre un bien plusieurs fois ou de tricher sur sa propriété comme un notaire peu scrupuleux pourrait l’envisager (je ne vise absolument personne, je ne fais qu’imaginer un exemple).
  • On pourrait entièrement dématérialisé les passeports, ceci pourraient être communiquer verbalement à l’agent des douanes sous la forme d’un nom, prénom, date et lieu de naissance, ainsi qu’une clef. Ces informations seraient « hashées » sous la forme d’une somme de contrôle, qui accèderait ainsi à un fichier de photos et d’empreintes digitales stocké dans la blockchain. Ces enregistrements dans ce fichier seraient signés par un bureau de citoyenneté (mairie, préfecture, …) auquel le bureau des douanes choisirait de faire confiance ou non. Un passeport volé serait ainsi facilement repéré, et les passeports issus de bureaux compromis pourraient être interceptés très facilement. Enfin, un voyageur pourrait s’identifier sans document, ou tout au plus avec un simple QR-code.
  • Une organisation très répartie sur un territoire (parti politique, coopérative, …) pourrait organiser des élections très facilement, en autorisant les comptes de ses membres à utiliser un contrat de la blockchain. Les résultats sont ainsi infalsifiables, et chacun peut vérifier les méthodes d’accès au vote et de calcul dans le code, tout en garantissant l’anonymat des participants.
  • Un service de noms de domaines pourraient être implémentés très facilement. Sa décentralisation accorderait une haute résilience au service, et il serait possible de gérer la réservation et l’expiration sans aucune intervention humaine.

Cet article s’est surtout intéressé à une blockchain publique, mais il est toujours possible de créer sa propre blockchain. Il sera alors nécessaire de fournir soi-même des mineurs, et l’infrastructure aura un coût que la vente d’Ether ne pourra pas amortir (l’Ether privé n’intéressera personne, contrairement à la blockchain publique). Cependant la robustesse de cette technologie en fait une candidate toute trouvée pour de nombreuses applications dans les domaines financiers.

Bilan de la première semaine de sommeil «biphasique»

Voilà une semaine que l’experience a démarrer. Je vais donc commencer par un petit bilan positif/négatif:

Positif :

  • Je me sens moins fatigué en début de journée
  • Je ressens beaucoup moins de difficultés à me lever, mnais ce n’est pas encore parfait
  • Prendre la route du retour aussi tôt permet d’éviter beaucoup de bouchons

Négatif :

  • Hormis pour le weekend, je n’ai fait qu’une soirée au-dela de 22:00
  • Je n’ai reussi que deux siestes jusqu’ici, et elles ont duré trop longtemps (plus d’une heure et demie)
  • La route le matin à 6h n’est pas moins chargée qu’à 9h

J’ai réussi lundi après-midi à faire une vraie sieste, et pas seulement à tourner en rond dans mon lit en attendant le sommeil.
Il faut dire que je conditionne l’heure du coucher de nuit en fonction de la durée et de la qualité de la sieste.

Ainsi, vu que les jours précedents ne contenaient pas de sieste, je n’ai pas voulu tenter de veiller trop tard, afin de disposer de suffisement de sommeil pour ne pas louper le reveil.

Pour le moment je ne touche à rien concernant les heures de lever et coucher.

Experimentation de sommeil «biphasique»

Depuis une dizaine d’années déjà, je peine à équilibrer mon sommeil correctement. Plus  précisément, j’éprouve beaucoup de difficultés à me réveiller le matin. Je n’ai jamais conscience que mon réveil a sonné et que je dois, à ce moment, me lever. Au lieu de ça, j’ai «appris» à éteindre mon réveil pendant qu’il sonne, allant jusqu’à résoudre des puzzles ou des calculs mentaux sans jamais en avoir conscience une fois réveillé.

J’ai pourtant essayé toute sorte de dispositifs : applications, réveil-lumière, musique préférée, son infâme, douce mélodie ; rien n’y fait.

La faute à quoi ?

Aux trop nombreuses heures passées à bricoler, jouer, glander ? Aux nuits blanches arrosées du week-end qui transforment mes dimanches en siestes comateuses et mes lundis en sombres retours au quotidien ? Aux écrans qui embrasent ma vue à toute heure ? Au stress du trafic, du travail et de la performance permanente ?

Il doit y avoir de tout cela, oui.

J’ai essayé déjà quelques remèdes de grand-mère :

  • Ne penser à rien pour s’en dormir (authentique)
  • Manger très léger le soir, pour se réveiller affamé le matin (non, vraiment)
  • Changer d’heure de réveil de façon aléatoire, quitte à complétement oublier l’heure fatidique (cela n’amène que du stress, le cerveau adore calculer le nombre d’heures de sommeil restantes)
  • Traquer le sommeil par une application sur smartphone (qui va se transformer en véritable morceau de lave le matin)

Mais cela ne s’arrange pas

Le stress amenant le stress, je me retrouve maintenant à tourner en rond dans mon lit, attendant que le sommeil m’assaille, parfois plusieurs heures. Alors je traîne, je joue, je tente de me détendre. Mais voilà quelques mois que des raideurs parcourent mon cou, d’abord éphémères, elles provoquent maintenant des céphalées, comme si quelque chose essayait d’extraire mes yeux par la nuque.

Bref, aux problèmes de réveil s’ajoutent maintenant les tracas pour m’endormir, ce qui n’aide pas à passer des journées épanouissantes et réjouissantes.

La suite va vous étonner (ou pas)

Je suis actuellement dans une phase de transition au niveau professionnel. Je viens de terminer une longue mission, et je dois retrouver un emploi plus diversifié et moins orienté vers la performance. Il y a donc une «fenêtre de tir» pendant laquelle j’espère trouver la paix intérieure corriger ma gestion de sommeil catastrophique.

Par ailleurs, ce problème me pesant depuis un certain nombre d’années, j’ai eu le temps de glaner quelques méthodes, parfois exotiques, pour améliorer l’expérience utilisateur du sommeil.

Pour des modalités pratiques, je me suis mis d’accord avec mon employeur afin de travailler avec des horaires décalées, sauf en cas d’impératif extérieur.

J’ai donc entrepris d’adapter mes horaires de sommeil, de travail et de sieste, afin de trouver un cycle plus réparateur et plus régulier.

Et pour être sûr d’y arriver, j’ai décidé de

  • traquer mes heures de sommeil, trajets, travail et sieste
  • noter la qualité de mon repos
  • calculer ma «dette de sommeil», en prenant en compte l’accumulation sur quinze jours
  • faire un retour d’expérience (vous êtes en plein dedans), ceci afin de partager mon ressenti, mais surtout pour me motiver. Si quelqu’un lit un jour ces lignes, je suis sûr qu’il ou elle voudra connaitre la suite.
  • poursuivre cette expérience pendant tout le mois de mars 2016, et la renouveler si cela est concluant.

Dans les faits, ma journée ressemblera à cela :

  • 5:20 : levé, douche et départ pour le travail
  • 7:00 : arrivée au travail
  • 12:00 : pause déjeuner
  • 15:30 : fin de la journée de travail
  • 16:30 : sieste
  • 17:00 : réveil
  • 21:30 : coucher

Je n’ai pas encore décidé à quoi ressembleront mes weekends.

J’écris cet article au troisième jour de l’adaptation de ces cycles. La nuit dernière ne s’est pas bien déroulée (fièvre, cauchemar, nausée). Cela s’est calmé pendant la journée.

J’essaie de faire un point dans le courant de la semaine prochaine.

La plaie des fuses mal réglés dans la communication

Il m’est arrivé un problème très bête, mais qui guette quiconque tente de travailler avec une interface de communication. Dans mon cas, il s’agissait d’un port série, que j’avais déjà réussi à faire fonctionner mille fois.

L’enfer du débogage

Cependant, ici, ça ne marchait pas. J’étais dans une nouvelle configuration par rapport à mon habitude. En effet, j’ai tendance à utiliser la même tension (5V) sur tout mon circuit, et vu que mes montages consomment peu, je n’ai aucun problème à utiliser une alimentation provenant d’un port USB, et qui plus est, à utiliser l’alimentation proposée par une clef USB de communication série TTL.

Mais dans le cas présent, j’avais dans l’idée de faire communiquer un montage, utilisant sa propre source d’énergie (tirée depuis une alimentation 12V, laquelle était abattue ensuite par un régulateur de tension à 5V), avec une clef USB identique au montage précédent. Pas moyen.

Je met tout d’abord en cause ma nouvelle installation (j’ai porté tout mes scripts et Makefile sous Linux, étant bien plus à l’aise avec ce système). Je reprend donc tout sur Windows 8. Ça ne fonctionne pas.

On va essayer plus simple

Alors, c’est mon projet qui doit être douteux. Je sors donc des cartons le premier projet que j’ai déployé avec une connexion série. Je le compile, et l’envoie sur le microcontrôleur. Boum, ça ne marche pas. Petit coup de stress.

Je doute maintenant de mon montage, et je commence à chercher un peu de détails sur le net. J’ouvre les spécifications série TTL et tout me semble correct. Je me résous donc à faire un montage plus simple, identique à mon premier essai concluant, et là, cela ne marche pas.

Le même montage, le même code, la même clef, sur la même machine.

J’abandonne ce soir là. Je rumine, je cherche sur Internet, je ne trouve rien relatif à ce problème. Je prend même un ATMega tout neuf pour tester le code ; même problème.

Mais bordel !

Dépité, Je démarre un terminal série un peu plus poussé afin de voir ce qui se passe en bas niveau (binaire). Les caractères sont indéchiffrables, mais quelque chose attire mon attention : Les codes hexadécimaux reçus ne sont que des 0x00 et 0x80. Et enfin je comprend !

Dans l’entête de mon code je précise la cadence de l’horloge, qui n’est pas celle par défaut. Or, j’utilisais dans mes tests des microcontrôleurs neufs ! Ceux-ci fonctionnaient à la fréquence d’usine, et lors de la mise en route, la configuration de la communication série s’établit avec celle que je donne en entête. Le microcontrôleur communique donc à une vitesse différente de celle attendue, et bien entendu, il n’y a aucun moyen de le déterminer.

Il y a deux solutions dans mon cas :

  • changer la cadence au niveau de mon code, pour utiliser la fréquence d’usine
  • reprogrammer les registres « fuses » du microcontrôleur afin d’utiliser la fréquence définit en entête (ce que j’ai fait).

Soulagé !

Et tout de suite, cela marche beaucoup mieux ! Ainsi, si vous vous sentez bloquer lors de l’utilisation d’une fonctionnalité dépendant d’une base de temps (communication, synchronisation, … tout en fait !), pensez à vérifier ces foutus registres !

Fabriquer un programmeur (ISP) AVR hybride pour ATTiny et ATMega

Pour la programmation de mes microcontrôleurs, j’ai toujours trouvé plus commode de disposer d’une plaque sur laquelle sont soudés quelques broches et un support ZIF pour faciliter les manipulations. Il est aisé ensuite de brancher cette plaque sur un Arduino.

Au début, j’avais simplement soudé ces broches avec un support à  8 pattes, ce qui me permettait de programmer les microcontrôleurs de ce format (ATTiny85 ou ATTiny45).

Puis je suis passé à l’ATMega, et j’ai donc fabriquer un nouveau support avec les broches adéquates, sur 28 pattes. J’étais néanmoins obligé de changer de plaque à chaque fois que je passais d’un ATMega à un ATTiny.

Il y a peu, j’ai reçu des ATTiny4313. Ce microcontrôleur utilise un nouveau format, à 20 broches, ce qui aurait impliqué de fabriquer une nouvelle plaque dédiée.

C’est quand même bien foutu !

J’ai décidé de réfléchir un peu et je me suis rendu compte d’une chose : les broches utilisées pour la programmation sont placées exactement de la même façon. Seule la position des broches d’alimentation et de réinitialisation (RESET) varie.

ATMEGA168details
Broches d’un ATMega168
attiny85details
Broches d’un ATTiny85
ATTINY4313details

Broches d’un ATTiny4313

En rouge, les broches SCK (Horloge), MISO et MOSI (entrée/sortie du mode SPI), sont positionnées toutes 3 dans le même ordre pour chacun des microcontrôleurs.

Les broches en vert sont mobiles, mais on retrouve cependant les mêmes positions des VCC et RESET pour les deux versions d’ATTiny.

Factorisons tout ça !

Maintenant que nous avons la position des broches, on peut rapidement comparer ce qui se passe si on superpose les 3 microcontrôleurs. Magie ! Aucune broche « sous-tension » (VCC ou GND) n’interfère avec les broches RESET, SCK, MISO ou MOSI. Ce qui veut dire que l’on peut  brancher le tout comme ceci :

universalisp_bbPour rappel, voici les branchements à faire avec un Arduino :

Microcontrôleur Arduino
VCC VCC
SCK 13
MISO 12
MOSI 11
RESET 10
GND GND

Introduction aux crypto-monnaies

Depuis quelques années maintenant, Internet puis les médias se sont emparés d’un sujet intéressant : les crypto-monnaies.

En quoi cela consiste ?

Il s’agit de monnaie établie non pas au sein d’une banque centrale (comme peuvent l’être l’euro, le dollar, et toutes les autres monnaies officielles), mais de « jetons » et transactions que s’échangent les nœuds d’un réseau. Les transactions s’effectuent grâce à la cryptographie asymétrique.

Pour saisir les avantages et inconvénients, voici quelques schémas.

 Comment fonctionne une transaction traditionnelle ?

Dans notre économie actuelle, les banques sont le maillon de confiance qui permet d’effectuer des transactions en toute sérénité. Voici un exemple simple, où une transaction à lieu entre un émetteur E et un bénéficiaire B, d’un montant de 5 M (monnaie arbitraire).

cryptomonnaie-Diapositive1

  1. E et B se mettent d’accord sur l’échange d’un bien ou d’un service d’une valeur de 5M.
  2. E envoie une demande de transaction à sa banque. Celle-ci peut prendre plusieurs formes :
    • un virement bancaire (par Internet par exemple)
    • un paiement par carte (par terminal de paiement électronique)
  3. La banque de E valide ou refuse la transaction, en fonction du contrat qui la lie avec son client (autorisation de découvert, …). Si elle la valide, elle débitera le compte de la somme de 5M.
  4. Une fois la transaction validée, la banque de E envoie une transaction à la banque de B, qui lui retournera un accusé de réception (notez que  cette étape n’est pas forcement synchrone et peut avoir lieu plus tard, dans des « lots » de transactions entre les deux banques).
  5. La banque de E transmet ainsi une preuve de transaction, à B ou à E suivant la forme de celle-ci :
    • pour un paiement par carte, il s’agira d’un ticket
    • pour un virement bancaire, d’un numéro de transaction
  6. Parallèlement, la banque de B créditera le compte de B de 5M.
  7. B pourra faire valoir sa preuve de transaction auprès de sa banque, afin de s’assurer que la transaction s’est bien réalisée.
  8. Dans le cas où tout s’est bien passé, B pourra profiter de la somme de 5M envoyée par E.

La transaction complète peut durer entre 2 jours et plusieurs mois suivant la somme et le mode utilisée. Par ailleurs, celle-ci peut être mise à mal par plusieurs facteurs :

  • Carte bancaire corrompue ou détournée
  • Banque douteuse
  • etc.

Je ne vais pas faire ici un cours complet sur les méthodes qui permettent d’affaiblir ce système, je ne crois pas en avoir la compétence et ce n’est absolument pas le but de cet article.

Étudions maintenant le fonctionnement d’une crypto-monnaie

Pour pouvoir effectuer une transaction, il est nécessaire de disposer d’un couple clef publique/clef privée. La clef publique est utilisée comme adresse lors de la transaction.

cryptomonnaie-Diapositive2

  1. E et B se mettent d’accord sur l’échange d’un bien ou d’un service d’une valeur de 5C. Ils échangent leur adresse (clef publique).
  2. E émet une transaction, qu’il signe avec sa clef privée. Étant le seul en possession de cette clef, il est l’unique personne sur le réseau à pouvoir signer une transaction, qui correspondra à sa clef publique (son adresse).
  3. Cette transaction est ensuite diffusée sur le réseau, en pair-à-pair (P2P ou peer-to-peer). Le réseau agit ainsi comme un livre de compte gigantesque, où chaque transaction du réseau est enregistrée sur chaque nœud du réseau.
  4. La transaction se réplique sur le réseau, tour à tour, les nœuds ont vent de celle-ci et l’enregistre. Ainsi, F, G, H et I enregistrent la transaction, et la mettent à disposition. Chaque nœud « valide » ainsi la transaction.
  5. Finalement, la transaction arrive chez B, et la somme est créditée par le logiciel sur son portefeuille bbbbbbb.

La réalisation de ces étapes prend entre quelques secondes et plusieurs heures, en fonction du nombre de nœuds sur le réseau (plus il y a de nœuds, plus il est performant). La plupart du temps, une transaction n’est considérée comme sûre qu’après un certain nombre de validations (entre 4 et 200 pour les plus paranoïaques).

Mettre en défaut une crypto-monnaie est un exploit presque impossible à réaliser, puisque pour cela, il est nécessaire de « casser » la clef privée d’un portefeuille pour émettre des transactions en son nom et ainsi récupérer son contenu.

Les crypto-monnaies face au système actuel

Quels sont les avantages des crypto-monnaies sur les transactions traditionnelles ?

  • La mise à disposition d’un portefeuille est immédiate, ne nécessite aucun contrat et n’engendre aucun frais direct (contrairement à l’établissement d’un compte bancaire).
  • Il est possible de disposer d’autant d’adresses qu’on le désire, chacune étant liée à une clef privée distincte. Ceci permet d’augmenter la sécurité de vos transactions, et de réduire leur traçabilité.
  • Les transactions sont beaucoup plus rapides.
  • En cas de panne d’un nœud, le réseau n’est pas altéré et continue de fonctionner. Le nœud rattrapera son retard lors de sa reconnexion, contrairement à une panne d’un élément de la chaine d’une transaction traditionnelle (panne de courant, indisponibilité du terminal de paiement électronique, indisponibilité de la banque, …).
  • Il est possible d’imprimer sa crypto-monnaie sous la forme d’une adresse à usage unique, rendant la transaction indépendante de la présence d’un réseau.
  • En chiffrant son portefeuille, il est impossible de « voler » la monnaie, même en étant un proche (sauf dans le cas des sites hébergeant des portefeuilles). Rien n’empêche techniquement un banquier de vider votre compte et de s’en servir comme il l’entend (néanmoins, un cadre légal très strict prévient ces pratiques en Europe).

Et quels sont les inconvénients ?

  • Aucune autorité légale (comme une banque centrale) ne régule le marché de la crypto-monnaie. Elle est donc susceptible de connaitre des variations violentes, à la hausse comme à la baisse.
  • Aucune loi ne protège l’épargnant ou l’utilisateur d’une crypto-monnaie. Il est ainsi très facile de créer un service en ligne pour former un système de Ponzi ou simplement une loterie truquée. La crypto-monnaie n’ayant aucune valeur légale, peut-on continuer à parler d’arnaque ?
  • La perte de votre clef privée entraîne la perte pure et simple de tous les revenus attachés. Il n’y a aucun moyen de récupérer un clef privée autrement qu’en restaurant une sauvegarde.
  • Le vol de votre clef privée entraîne la possibilité d’émettre des transaction en votre nom. Ainsi, en volant un téléphone disposant de ces clefs privés, il est possible de vider votre portefeuille ! Bien entendu, aucune banque, assurance ou autorité ne couvrira la perte de ces revenus, et je suis certain qu’aucune enquête ne sera officiellement demandée pour trouver le voleur et recouvrer vos biens. Cependant, il est possible est surtout vivement recommandé de chiffrer sa clef privée en utilisant un mot de passe complexe.
  • La sécurité, et donc la valeur de la crypto-monnaie résident dans la force de son algorithme de chiffrement. Si celui-ci venait à être cassé ou simplement à montrer des faiblesses, le cours de la crypto-monnaie pourrait s’effondrer, là où une banque serait couverte par une assurance ou par l’État. Ce scénario est toutefois improbable puisque les algorithmes couramment utilisés sont réputés sûrs, et leur code source est disponible librement.

Attention à ces fausses vérités à propos des crypto-monnaies

  • Il est faux de croire que les transactions réalisées sur le réseau d’une crypto-monnaie sont anonymes. Comme dit plus tôt, la transaction est réalisée entre deux adresses, et est publiquement disponible sur l’ensemble du réseau. Il existe même pour chaque crypto-monnaie des sites permettant de suivre à la trace chaque transaction entre chaque adresse. Si vous utilisez la même adresse pour commander votre journal ou pour louer un botnet, soyez sûrs que les autorités finiront par mettre la main sur vous, si vous êtes amené à réaliser l’attaque du siècle avec ledit botnet.
  • Il est dangereux de croire que votre portefeuille est en sécurité si vous l’hébergez sur un serveur distant. Gardez à l’esprit qu’avoir accès à votre clef privée donne l’accès à vos revenus. Je vous déconseille donc fortement l’utilisation de plateformes en ligne, quelque soit leur réputation, et quelque soit le rendement d’épargne qu’elles peuvent proposer. Évitez ainsi de stocker de la crypto-monnaie sur une machine dont vous n’avez pas le contrôle absolu et exclusif. Les cas de serveurs qui disparaissent dans la nature avec les clefs privées des utilisateurs se multiplient, et il est difficile de déterminer s’il s’agit de piratages, ou d’actions délibérées de la part des administrateurs. Bien entendu, les autorités, si elles daignent s’y intéresser, n’auront un champ d’actions que très limité.
  • Jusqu’à maintenant, aucune crypto-monnaie n’a montré de faiblesse dans sa sécurité. Beaucoup d’articles relatent des cas de « piratage » de crypto-monnaies. En fait, il s’agit de vols ou de pertes de portefeuilles, que les utilisateurs ont mis en ligne, ignorant les avertissements quant aux dangers de cette pratique. Encore une fois : les crypto-monnaies ne sont pas conçues pour être utilisées depuis des serveurs distants. Il est important de considérer votre portefeuille comme vos clefs de voiture. Aussi, si vous confiez celles-ci à un tiers, ne vous plaignez pas si celui-ci se fait voler votre voiture ou s’il disparait avec.
  • Il est impossible d’annuler une transaction réalisée en crypto-monnaie. En effet, une fois diffusée sur le réseau, si celle-ci est validée, elle sera répliquée de nœud en nœud et gravée pour toujours. Ceci lui donne un caractère irrévocable, ce qui est une bonne chose, car avec la vitesse à laquelle est diffusée la transaction, il pourrait être gênant de pouvoir l’annuler aussi rapidement. Ceci permettrait d’acheter un bien ou un service, d’attendre la confirmation de son expédition, et d’annuler son paiement.
  • Les tentatives de régulations sur ces monnaies sont vaines. Un état qui chercherait à établir la liste des revenus d’un citoyen pour lui réclamer des impôts pourrait se heurter à d’énormes difficultés, tant sur un plan technique que juridique. Il lui est en effet totalement impossible de faire geler un avoir, comme pourrait le réaliser une banque lors d’une suspicion de fraude ou de blanchiment. Un individu inquiété par l’origine de ses revenus pourrait aisément séparer son solde sur plusieurs centaines voire milliers de portefeuilles, rendant toute investigation fastidieuse et pratiquement impossible à démêler.

Comment obtient-on de la crypto-monnaie ?

Quelque soit la crypto-monnaie désirée, il existe deux façons de l’obtenir :

  • l’échanger contre une autre crypto-monnaie ou une monnaie traditionnelle
  • l’extraire (ou la « miner »)

L’échange

Pour l’échanger, il existe une multitude de plateforme d’échanges (appelés Exchange en anglais). Il suffit de chercher « Exchange » avec le nom de la monnaie qui vous intéresse pour trouver votre bonheur.

Les plateformes d’échange « Exchanges »

Évidemment, ces services ne sont pas gratuits, et chaque transaction se voit agrémentée de frais à payer (entre 0,01% et 5%). Dans l’ensemble, cela fonctionne comme une place d’échange classique. Vous devez faire un versement initial qui doit être confirmer par un nombre important de pairs (au moins 10) et vous pourrez ensuite faire vos achats. Des adresses de portefeuilles temporaires vous seront fournies, cependant, ne laissez pas de sommes importantes dormir sur ces comptes.

Attention aux annonces en ligne !

Par ailleurs, vous trouverez sur beaucoup de forums spécialisés, ou même sur des sites d’enchères en ligne, des annonces d’achat ou de vente. Si les tarifs sont souvent alléchants (vente en dessous du prix du marché, ou achat surévalué), il est important de se méfier de ces annonces ; en effet le caractère irrévocable d’une transaction en crypto-monnaie n’est pas compatible avec les moyens de paiement garantis par des banques ou des entreprises.

Ainsi, si je réponds à une offre d’achat d’une quantité importante de crypto-monnaie contre de l’argent réel, à un prix qui me semble intéressant, il est fort possible qu’une fois la transaction effectuée, la personne annule son paiement, ou dénonce un achat frauduleux. Les crypto-monnaies n’ayant pas vraiment la cote auprès des établissements traditionnels, il est fort probable que le paiement ne soit jamais honoré. Cette plainte sera d’autant plus valable qu’elle aura lieu quelques heures voire quelques minutes après la transaction, appuyant l’argument d’un achat non autorisé.

L’extraction « Mining »

Extraire une crypto-monnaie est une tâche fastidieuse, qui demande un investissement continu à mesure que la monnaie prend de la maturité. Certaines crypto-monnaies sont pré-extraites en partie, afin d’en distribuer les montants suivants des règles précises.

L’analogie avec les métaux précieux

La grande particularité des crypto-monnaies est qu’elles sont construites sur le modèle des métaux précieux :

  • Au tout début, personne ne les connait, et à fortiori, personne n’en veut. La valeur est donc nulle.
  • Les premiers prospecteurs s’y intéressent et en trouvent en relative abondance, puisque personne n’y a touché jusqu’ici.
  • Ceux-ci en parlent à leurs proches, et une fraction de ceux-ci vont s’y intéresser également, grossissant petit à petit le nombre de personnes concernées. Cette nouvelle ressource s’échange modestement car personne n’a conscience de sa rareté.
  • La popularité croissante provoque une fièvre qui incite chacun à extraire plus que ses pairs, accélérant ainsi l’appauvrissement des gisements.
  • La quantité de ressources faciles d’accès étant épuisée, il devient nécessaire de s’équiper en conséquence pour continuer l’enrichissement. De la même façon, la ressource devenant difficile à obtenir pousse les prix à la hausse.
  • De nouvelles techniques apparaissent, permettant de chercher plus loin et donc de ramener plus de ressources. Le prix de celles-ci freine les plus modestes à s’équiper. En même temps, ces techniques toujours plus performantes réduisent de façon exponentielle la quantité de ressources disponibles.
  • Une fois tous les gisements épuisés, cette ressource atteint une valeur élevée relativement stable.

Petit lexique du mineur débutant

l’empreinte « hash »

Le hash est le résultat d’un algorithme de somme de contrôle particulier. Cet algorithme permet de calculer une empreinte propre à une série de données. Ainsi, si on calcule deux fois l’empreinte pour la même série de données, celle-ci sera identique. Si on change ne serait-ce qu’un bit de ces données, quelque soit la taille, l’empreinte deviendra radicalement différente. Ceci rend totalement imprévisible le résultat de la fonction à la seule vue des données. Par ailleurs, il n’est pas possible de retrouver les données depuis une empreinte. Cette fonction est primordiale dans beaucoup de domaines en informatique (cryptographie, vérification d’authenticité, …).

Pour l’extraction, lorsque l’on réalise un hash, on calcule l’empreinte d’un ensemble de données, comprenant l’entête du dernier bloc établi, et des données arbitraires. Si ce hash est « gagnant » ( plus petit qu’une valeur cible « target »), alors un nouveau bloc est établi. Le reste des hashes est « jeté ».

L’extraction est donc une sorte de loterie, où on parie à chaque hash que le résultat sera inférieur à la cible.

le bloc « block »

C’est un ensemble de transactions, qui une fois que le bloc suivant est établi, valide définitivement les transactions qu’il contient. Un bloc est identifié par le hash « gagnant »

la cible « target »

La cible est un nombre dépendant de la difficulté du réseau. Celle-ci représente la valeur maximale d’un hash pour qu’il soit considéré comme « gagnant » et qu’un nouveau bloc commence. Plus la difficulté augmente, plus la cible sera petite.

la difficulté « difficulty »

Il s’agit d’un ajustement qui garantit une extraction à vitesse constante dans le temps. Plus il y a de hash, plus la probabilité qu’un hash « gagnant » soit trouvé rapidement augmente, et plus la difficulté augmente. Un peu comme pour la recherche de métaux précieux : plus on est nombreux à chercher au même endroit, et plus il est difficile d’en trouver.

La difficulté augmente généralement, mais peut aussi se réduire, lorsque le nombre de mineurs diminue.

la chaîne de blocs « blockchain »

La blockchain est la liste complète des blocs trouvés, rangés dans un ordre précis. Chaque blocs contenant les transactions, on peut ainsi déterminer l’historique et donc le solde de chaque compte de la crypto-monnaie.

le taux d’empreintes « hashrate »

Le taux d’empreintes permet de calculer les performances d’un équipement. Il existe différentes organisations pour extraire de la crypto-monnaie. La difficulté augmentant avec le nombre de mineurs, le hashrate doit suivre la cadence pour pouvoir rester profitable. Il est généralement exprimé en kilohash/s, megahash/s, gigahash/s voire terahash/s et exahash/s. En ordre de grandeur voici les performances que l’on peut attendre des différents équipements :

Équipement hashrate
Processeur 0-50 khash/s
Carte graphique 100khash/s – 1Mhash/s
Puce ASIC 300khash/s – 5Ghash/s

Si certaines monnaies sont encore au stade des cartes graphiques, d’autres sont déjà passées aux puces ASIC (Application Specific Integrated Circuit : circuit intégré pour application dédiée). Il s’agit de puces spécialement conçues pour l’extraction de crypto-monnaie. Celles-ci sont pour la plupart très chères, et ont donc eu pour effet d’exclure les mineurs les plus modestes.

un pool

Un pool est un rassemblement de mineurs dans le but de trouver des blocs plus facilement. Il existe différents types de pool, mais la plupart proposent de partager la crypto-monnaie issue de ces blocs au prorata de la quantité de hashes générés par chacun.

le round

Un round est une période entre deux blocs. Généralement, une difficulté s’applique à un round entier. L’ajustement de la difficulté permet d’assurer une durée globalement constante au round.

 

Fonctionnement et émulation USB d’une télécommande infrarouge pour LED RGB (Partie 2)

Dans l’épisode précédent, nous avons vu comment récupérer les codes émis par une télécommande, pour les implémenter dans un micro-contrôleur.

L’idée est maintenant de transformer ce montage en clef USB, puis de la lier à un web-service pour pouvoir utiliser la télécommande depuis n’importe où.

Dans mon article sur l’USB, je décris en détail les étapes qui permettent d’utiliser la bibliothèque V-USB. Voici le montage à faire :

ir_rgb_schémaLe code est disponible ici : RGB remote.7z.

Compiler et installer la commande

Dans le chapitre sur l’utilisation de l’USB, on réalise une commande  send  qui envoie des commande au micro-contrôleur. Nous allons nous servir de cette commande, que nous placeront dans  /usr/local/bin  et que nous appellerons set-led .

Créer le web service

Je vais créer deux pages en PHP (je n’aime pas trop ce langage, mais c’est pratique pour faire des petites pages rapidement) :

  • index.php  contiendra les boutons de la télécommande
  • command.php  sera appelé dès qu’un bouton sera appuyé

N’utilisez pas ce code sur une machine accessible depuis Internet ; je n’ai pas assaini les entrées GET et POST, et il est probablement possible d’injecter du code à une invite de commandes.

J’utilise Bootstrap et JQuery dedans. Il y a surement moyen de faire plus simple et plus propre, mais il s’agit d’un simple test alors ne soyez pas trop regardant sur la qualité de mon code.

Les sources du web-service sont disponibles ici : rgbremote-ws.tar.gz.

Compilation croisée d’un noyau pour Raspberry Pi

Pourquoi compiler un noyau, et pourquoi faire une compilation croisée ?

Il arrive parfois que l’on ait besoin d’ajouter le support d’un protocole, ou d’un périphérique, et il n’est pas toujours possible d’utiliser un module pour cela (besoin de ressource spécifique, …). Il n’y a d’autre choix alors que de compiler un noyau.

La compilation d’un noyau Linux est une étape qui demande une bonne quantité de ressources, notamment en temps d’exécution. Je me rappelle avoir laisser une machine compiler un noyau pendant toute une nuit lorsque j’étais étudiant.

Les processeurs ont bien changé depuis, et il est maintenant possible de compiler un noyau en quelques minutes, surtout en s’aidant des nouveaux processeurs à plusieurs cœurs.

Mais toutes nos machines n’ont pas cette puissance ; le Raspberry Pi est capable de compiler ses propres noyaux, mais cela prend un temps abominable lorsque l’on veut exécuter une série de tests par la suite. Il est frustrant d’attendre plusieurs heures que la compilation se termine, pour échouer lamentablement à un test trivial.

Alors pour accélérer cette tâche nous allons avoir recours à la compilation croisée (Cross-compilation en anglais).

Installer les bons outils

Je me sers ici d’une distribution Fedora (version 19, je pense qu’il n’y aura que très peu de variations pour une version plus récente). Je l’ai installé avec l’assistant par défaut, avec le mode « Infrastructure Server » ; il s’agit d’une configuration minimaliste, sans interface graphique ni service particulier (sauf SSH). Veillez cependant à disposer de quelques gigaoctets d’espace libre, et d’un gigaoctet de RAM.

J’installe les outils dont j’ai besoin ici : le compilateur (gcc), le gestionnaire de sources (git) et un outil sympathique pour exécuter des commandes en tâches de fond (screen).

[cce_bash]yum install -y gcc-arm-linux-gnu screen git ncurses-devel[/cce_bash]

Télécharger les sources pour Raspberry Pi

Les sources du noyau Linux destiné au Raspberry Pi sont hébergées dans un depôt Git. Il s’agit d’un gestionnaire de version, capable de fonctionner de façon décentralisée. Dans un premier temps il est nécessaire de cloner ce dépôt.

[cce_bash]
mkdir -p ~/rpikernel/
cd ~/rpikernel/
git  clone http://github.com/raspberrypi/linux.git
cd linux
[/cce_bash]

Le téléchargement des sources commence et peut prendre un long moment (~1 gigaoctet de données).

La commande [cci]git branch[/cci] vous donnera la version actuelle des sources du noyau (à cette date, 3.10). Si cette version vous satisfait, vous pouvez continuer le tutoriel ; sinon, [cci]git branch -r[/cci] vous indiquera les versions disponibles. Si la 3.12 vous intéresse, entrez alors ces commandes :

[cce_bash]git branch rpi-3.12.y origin/rpi-3.12.y
git checkout rpi-3.12.y[/cce_bash]

Une fois votre version choisie, nous pouvons passer à l’étape de la configuration de la compilation.

Générer sa configuration

Il y a trois moyens de générer la configuration de la compilation :

  • depuis zéro, en saisissant un à un les choix proposés par l’assistant [cci]make config[/cci] (non recommandé)
  • en utilisant le fichier de configuration par défaut, que l’on trouve dans arch/arm/configs/bcmrpi_defconfig dans le répertoire des sources. Il suffit de copier ce fichier à la racine, et de le renommer « .config ». On utilisera ensuite l’assistant de configuration de la compilation (voir plus loin).
  • en exploitant un fichier de configuration existant, que l’on peut extraire avec la commande [ccie]zcat /proc/config.gz > .config[/ccie] (sur un Raspberry Pi). On copie ensuite ce fichier à la racine du répertoire des sources (fichier nommé .config). C’est la façon la plus correcte lorsque l’on sait précisément ce que l’on souhaite modifier.

Pour éditer ce fichier de configuration, il est plus confortable d’utiliser l’assistant dédié :

[cce_bash]make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnu- menuconfig[/cce_bash]

Notez l’ajout des termes ARCH=arm (pour spécifier l’architecture cible) et CROSS_COMPILE=/usr/bin/arm-linux-gnu- (pour spécifier les outils de compilation à utiliser). Ces déclarations sont indispensables pour indiquer au compilateur que l’on est en train de compiler un noyau pour une autre architecture.

En exécutant la commande menuconfig, vous découvrirez un menu permettant de configurer votre noyau à votre guise. Libre à vous de le modifier.

Enfin, vous pouvez donner un petit nom à votre noyau, en renseignant les variables EXTRAVERSION et NAME du Makefile à la racine. EXTRAVERSION sera notamment visible à l’aide de la commande [cci]uname -r[/cci].

Lancer la compilation

Ici, il n’y a rien de plus simple :

[cce_bash]make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnu-[/cce_bash]

Vous pouvez profiter même des capacités multi-coeurs de votre machine avec l’option -j pour indiquer le nombre de coeurs à utiliser

[cce_bash]make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnu- -j 4[/cce_bash]

Et n’oubliez pas de compiler les modules ensuite !

[cce_bash]make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnu- modules[/cce_bash]

Installer votre nouveau noyau

Pour ne pas trop se fatiguer, on va utiliser SSHFS pour monter le noyau fraichement compiler, et ainsi installer les modules très facilement. Installons d’abord SSHFS sur le Raspberry Pi (je suppose que vous utilisez une Raspbian, vous trouverez aisément la façon de le faire si ce n’est pas le cas) :

[cce_bash]sudo su –
aptitude install -y sshfs[/cce_bash]

Puis, toujours depuis le Raspberry Pi, montons les sources du noyau (remplacez crosscompilemachine par l’IP de votre machine qui sert pour la compilation) :

[cce_bash]mkdir -p /mnt/rpikernel
sshfs root@crosscompilemachine:~/rpikernel /mnt/rpikernel[/cce_bash]

Rendons nous maintenant dans ce répertoire et installons les modules ainsi que le noyau :

[cce_bash]cd /mnt/rpikernel/linux
make modules_install
cp arch/arm/boot/Image /boot/kernel.img
[/cce_bash]

Après un redémarrage de votre Raspberry Pi, vous devriez avoir un noyau tout neuf !

Cet article est inspiré de celui-ci, en anglais.

Annexe – Tutoriel sur les opérations arithmétiques courantes en électronique

Comme je l’ai dit lors de mon introduction pour ces tutoriels, la programmation de microcontrôleur nécessite de connaitre les opérations arithmétiques binaires. Celles-ci ne se comportent pas comme les opérations usuels d’addition et de soustraction.

Les opérations booléennes

Vous le savez déjà, le binaire est une base où chaque chiffre ne peut avoir que deux valeurs : 0 ou 1. Nous allons nous intéresser aux opérations que l’on peut effectuer sur un bit. Cette partie des mathématiques s’appelle l’algèbre de Boole.

La conjonction : le «et» logique

La conjonction est l’opération qui prend pour valeur la vérification de ses deux opérandes. En C, on utilise deux esperluettes [ccie]&&[/ccie] comme opérateur. Pour vous aider à mieux comprendre, voici la liste des 4 valeurs que peut prendre cette opération :

  • [ccie]0 && 0 = 0[/ccie]
  • [ccie]0 && 1 = 0[/ccie]
  • [ccie]1 && 0 = 0[/ccie]
  • [ccie]1 && 1 = 1[/ccie]

La disjonction : le «ou» logique

La disjonction se vérifie si au moins un de ses deux opérandes se vérifie. Le symbole que l’on utilisera ici est le tuyau, deux fois [cci]||[/cci] que l’on obtient en pressant [cci]Alt Gr[/cci] avec la touche [cci]6[/cci] sur un clavier français. Voici les valeurs :

  • [cci]0 || 0=0[/cci]
  • [cci]0 || 1=1[/cci]
  • [cci]1 || 0=1[/cci]
  • [cci]1 || 1=1[/cci]

La négation

La négation est une opération qui prend la valeur opposée à son unique opérande. En C, on utilise le point d’exclamation [cci]![/cci], qui va précéder l’opérande. En toute logique, ses valeurs possibles sont :

  • [cci]!0 = 1[/cci]
  • [cci]!1 = 0[/cci]

Ces 3 opérations sont la base de toute l’algèbre de Boole. Elles cumulent diverses propriétés mathématiques (idempotence, commutativité, distributivité, etc.). Pour plus d’informations, je vous suggère la page Wikipédia de l’algèbre de Boole.

Les opérations bit à bit

À part pour gérer des conditions, il est rare d’utiliser le booléen sous sa forme brute. On utilisera plutôt des entiers, de 8 ou 16 bits, auxquels on appliquera des opérations logiques dédiées.

L’affectation directe

Plutôt que d’écrire des opérations compliquées, il est parfois plus simple d’initialiser un entier avec sa valeur binaire ou hexadécimale. En C, on fera comme ceci :

  • [cci]int i = 0xFF; // les 8 premiers bits à 1[/cci]
  • [cci]int i = 0x0F; // les 4 premiers bits à 1[/cci]
  • [cci]int i = 0b10101010; // un bit sur deux[/cci]
  • [cci]int i = 0b10000001; // seulement le premier et le dernier bits[/cci]

La négation

L’opérateur de négation bit à bit n’est pas un point d’exclamation, mais le tilde [cci]~[/cci]. La négation bit à bit se contente de changer chaque valeur de bit par l’opposée. Le résultat final dépendra de la taille de l’entier (8 ou 16 bits). On ne travaille pour le moment qu’en 8 bits. Aussi, on aura les valeurs suivantes :

  • [cci] ~(0x0F) = 0xF0 [/cci]
  • [cci] ~(0b00000111) = 0xb11111000 [/cci]
  • [cci] ~(0b0000000) = 0xb11111111 = 0xFF = 255 [/cci]

Cette opération est parfois utilisée pour basculer une série de valeurs.

Le «et» bit à bit

On parcours deux nombres en même temps, bit par bit, et on réalise l’opération «et» logique vue plus haut. On utilise comme opérateur l’esperluette simple [ccie]&[/ccie]. Exemples :

  • [ccie] 0xF8 & 0x1F = 0b11111000 & 0b00011111 = 0b00011000 = 0x18  [/ccie]
  • [ccie] 0x3F & 0xAA = 0b00111111 & 0b10101010 = 0b00101010 = 0x2A [/ccie]
  • [ccie] 0x47 & 0x2E = 0b01000111 & 0b00101110 = 0b00000110 = 0x06 [/ccie]

Il faut s’habituer à ce genre d’opérations, car elles sont courantes.

Le «ou» bit à bit

Comme pour l’opération précédente, sauf qu’à chaque pair de bits, on utilise l’opération «ou» logique. L’opérateur ici est le tuyau simple [cci]|[/cci]. Reprenons les mêmes exemples :

  • [cci] 0xF8 | 0x1F = 0b11111000 | 0b00011111 = 0b11111111 = 0xFF  [/cci]
  • [cci] 0x3F | 0xAA = 0b00111111 | 0b10101010 = 0b10111111 = 0xBF [/cci]
  • [cci] 0x47 | 0x2E = 0b01000111 | 0b00101110 = 0b01101111 = 0x6F [/cci]

Le «ou» exclusif bit à bit

L’opération fonctionne de la même manière, sauf qu’ici, si dans une pair, les deux bits sont à 1, alors le résultat sera 0. L’opérateur utilisé est l’accent circonflexe [cci]^[/cci].

  • [cci] 0xF8 ^ 0x1F = 0b11111000 ^ 0b00011111 = 0b11100111 = 0xE7  [/cci]
  • [cci] 0x3F ^ 0xAA = 0b00111111 ^ 0b10101010 = 0b10010101 = 0x95 [/cci]
  • [cci] 0x47 ^ 0x2E = 0b01000111 ^ 0b00101110 = 0b01101001 = 0x69 [/cci]

Le décalage à gauche

Cette opération consiste à décaler l’ensemble des bits vers la gauche. Ce qui entre par la droite à pour valeur 0. Elle est très souvent utilisé. Ici on doit préciser un opérande, et un nombre de bits à décaler. L’opérateur sera le double chevron vers la gauche (signe inférieur) [ccie]<<[/ccie]. Tout ce qui dépasse la taille de l’entier est perdu (au delà de 8 bits ici).

  • [ccie] 0xF8 << 1 = 0b11111000 << 1 = 0b11110000 = 0xF0  [/ccie]
  • [ccie] 0x3F << 2 = 0b00111111 << 2 = 0b11111100 = 0xFC  [/ccie]
  • [ccie] 0x47 << 2 = 0b01000111 << 2 = 0b00011100 = 0x1C [/ccie]

Le décalage à droite

Cette opération fonctionne de façon similaire à celle-ci dessus, mais elle est beaucoup moins utilisée. On utilise le double chevron vers la droite (signe supérieur) [ccie]>>[/ccie].

  • [ccie] 0xF8 >> 1 = 0b11111000 >> 1 = 0b00111100 = 0x3C  [/ccie]
  • [ccie] 0x3F >> 2 = 0b00111111 >> 2 = 0b00001111 = 0x0F  [/ccie]
  • [ccie] 0x47 >> 2 = 0b01000111 >> 2 = 0b00010001 = 0x11 [/ccie]

Leur utilisation au travers du C

Maintenant que vous connaissez ces opérations, voici comment les utiliser et surtout pourquoi les utiliser.

Dans mes tutoriels AVR, vous trouverez souvent ces opérations sous forme abrégée ; voici les équivalence :

  • [cci]a  ^= b[/cci]  équivaut à [cci]a = a ^ b[/cci]
  • [ccie]a  &= b[/ccie]  équivaut à [ccie]a = a & b[/ccie]
  • [cci]a  |= b[/cci]  équivaut à [cci]a = a | b[/cci]
  • [ccie]a  <<= b[/ccie]  équivaut à [ccie]a = a << b[/ccie]
  • [ccie]a  >>= b[/ccie]  équivaut à [ccie]a = a >> b[/ccie]

Vous pourrez maintenant vous familiarisez à ce genre d’opérations :

  • [ccie]PINB & (1<<PINB1)[/ccie] : on vérifie que le registre entrée ait bien le bit numéro PINB1 d’actif. Cela équivaut à ne chercher que le bit qui nous intéresse dans le registre.
  • [ccie]PORTB ^= (1<<PORTB0)[/ccie] : on bascule l’état de la broche 0 du port B

Il vous faudra surement de l’entrainement pour réussir à déchiffrer le code. Mais une fois que vous aurez compris, vous ne pourrez plus vous passer de ce genre d’astuces !