Quellcode durchsuchen

Rajout d'un article 20190308

develop
MEUNIER Thibaud vor 6 Jahren
Ursprung
Commit
7a66157bd9
4 geänderte Dateien mit 219 neuen und 32 gelöschten Zeilen
  1. +147
    -0
      articles/20190308/content.html
  2. +33
    -0
      articles/20190308/header.html
  3. +1
    -1
      index.php
  4. +38
    -31
      js/blockexplorer.js

+ 147
- 0
articles/20190308/content.html Datei anzeigen

@ -0,0 +1,147 @@
<style>
blockquote {
font-size: 14px !important;
font-style: italic !important;
}
h5 {
font-size: 17px !important;
text-decoration: underline !important;
padding-top: 15px;
}
</style>
<div class="container-fluid bg-grey">
<div class="row">
<div class="col-sm-12">
<h4>Cas d’usage n°1 : une gestion des identités.</h4>
<h5>La technologie</h5>
<p class="text-justify">
Nous commencerons par attirer l’attention sur un avantage peu mis en avant de l’usage d’adresses BTC comme identités.<br/>
Dans un réseau cryptographique, chacun est identifié par un couple de clé publique / clé privée.<br/>
La clé privée doit rester secrète et la clé publique à vocation à être communiquée aux interlocuteurs du réseau.<br/>
Il est évidemment impossible de déduire la clé privée à partir de la clé publique.<br/>
Les clés sont en fait des très grands nombres mathématiques, peu faciles à manipuler.<br/>
L’adresse est une représentation (un peu) plus simple de la clé publique.<br/>
<br/>
Le schéma est donc le suivant : <b>clé privée</b> | <b>clé publique</b> => <b>adresse</b><br/>
<br/>
Il suffit de connaître l’adresse d’une personne pour accéder à la balance comptable de son compte.<br/>
On est alors également en capacité d’envoyer des fonds sur cette adresse.<br/>
Il suffit de connaître la clé privée d’une personne pour être capable de dépenser les fonds qu’elle possède.<br/>
<br/>
Le registre des transactions (la blockchain) est publique.<br/>
Chaque transaction est un échange de fond entre (au moins) deux adresses publiques.<br/>
La traçabilité est donc totale.<br/>
<br/>
Les portes monnaies cryptographiques sont en fait des trousseaux de clés.<br/>
En simplifiant à l’extrême, un porte monnaie n’a besoin de retenir qu’une seule information : la clé privée.<br/>
Cette information étant ultra sensible, elle doit faire l’objet d’une sécurisation absolue.<br/>
Il faut en assurer la confidentialité ainsi que la sauvegarde.<br/>
<br/>
Mais rien n’empêche un même porte monnaie de contenir plusieurs couples de clés.<br/>
L’utilisateur possède alors plusieurs identités sur le réseau puisqu’il utilise plusieurs adresses publiques.<br/>
Techniquement, il est très facile de créer un couple de clés.<br/>
Chacun peut donc en théorie posséder des milliers d’adresses, sa fortune est alors composée de la somme des balances de chacune des adresses.<br/>
Mais nous avons vu que la sécurité d’une identité repose sur la connaissance de sa clé privée.<br/>
Lorsqu’on se met à utiliser des milliers d’adresses, tout l’enjeu réside donc dans la gestion des milliers de clés privées.<br/>
Cela peut rapidement devenir laborieux …<br/>
<br/>
Heureusement, les trousseaux de clés modernes utilisent un système d’héritage entre les adresses.<br/>
Grâce aux suggestions des BIP 32, 43 et 44, on peut dériver une adresse d’une autre adresse.<br/>
Une relation mathématique lie l’adresse mère à son adresse fille.<br/>
Mais il est impossible de remonter de l’adresse fille vers son adresse mère.<br/>
Du point de vue du réseau, ces deux adresses sont complètement indépendantes.<br/>
Seul le trousseau peut faire la relation entre les deux adresses.<br/>
En fait, il est possible de déduire un grand nombre de filles à partir d’une mère, de l’ordre de deux milliards.<br/>
Et il est impossible pour le réseau de savoir que deux adresses sont sœurs.<br/>
Mieux encore, chaque fille peut elle-même être la mère d’autres adresses, et ce sur une profondeur illimitée.<br/>
Ainsi donc, un trousseau n’a à sécuriser qu’une seule information : la clé privée de l’adresse racine.<br/>
Toutes les autres clés peuvent en être déduites …<br/>
</p>
<h5>L'usage</h5>
<p class="text-justify">
On peut donc concevoir qu’un &Eacute;tat puisse distribuer des adresses certifiées par ses soins à ses citoyens.<br/>
Chacun dispose donc d’une adresse publique, certifiée par l’&Eacute;tat.<br/>
Mais à partir de celle-ci, chacun est libre de décliner cette adresse en autant de filles qu’il le souhaite.<br/>
Même dans les relations avec les services de l’&Eacute;tat, il peut choisir de décliner une nouvelle identité à chaque fois :<br/>
Une identité pour la CAF, une autre pour la Sécu, les impôts, etc.<br/>
De même dans ses relations privées ou commerciales :<br/>
Une identité vis-à-vis de la banque, une autre vis-à-vis d’un réseau social, du boulanger, etc.<br/>
<br/>
Je pense qu’à ce stade, le lecteur aura compris l’idée générale de ce cas d’usage.<br/>
Le principe de respect de la vie privée devient compatible avec la nécessaire traçabilité des transactions.<br/>
<br/>
On pourrait par exemple imaginer une blockchain parallèle à celle hébergeant les transactions, utilisant les mêmes adresses que le réseau mais dont le token aurait pour seul objet de signifier la validité d’une adresse. Une adresse y ayant un solde positif, même d’un Satoshi, serait d’une adresse valide.<br/>
<br/>
L’&Eacute;tat certifie une identité en envoyant un jeton sur l’adresse de cette personne. Chacun peut ensuite émettre et révoquer ses propres adresses filles. Chacun peut vérifier la validité d’une adresse, la blockchain en question étant publique. Eventuellement, l’&Eacute;tat révoque l’identité certifiée de l’individu au moment de son décès (selon des modalités à définir). <br/>
<br/>
Pour garantir la confidentialité, cette blockchain pourrait être du type Monero ou ZCash dont la technologie permet de masquer l’origine des fonds présents sur une adresse. Ainsi on ne pourrait pas non plus déduire la filiation des adresses en traçant les échanges de tokens<br/>
<br/>
Enfin, le type des transactions y serait particulier dans le sens où pour envoyer un token à une adresse, il faudrait en être le propriétaire, c'est à dire détenir sa clé privée.<br/>
<br/>
Cela laisse des options quant à la certification des adresses par l'&Eacute;tat.<br/>
- Soit les adresses certifiées sont des filles de celles de l'&Eacute;tat, dans ce cas ce dernier a un contrôle total de toutes les adresses.<br/>
Cela lui permet de révoquer une identité et toutes ses filles, au moment du décès de la personne par exemple.<br/>
- Soit le script de transaction fait une exception qui permet aux adresses de l'&Eacute;tat de verser des tokens sur une adresse dont il n'est pas propriétaire.<br/>
On notera que ces deux types de solution peuvent cohabiter dans uen même blockchain.<br/>
<br/>
Il y a donc sans doute matière à satisfaire les plus libertaires d'entre-vous, qui auront également noté que dans ce système, rien n'empêche d'échanger des fonds sur la blockchain principale sur des adresses non certifiées par la deuxième blockchain. Chacun reste libre ...
</p>
<br/>
Je m’arrête là pour ce premier cas d’usage.La discussion est ouverte, les bases de l'identité sont posées, on peut passer à la<br/>
Rendez-vous pour le second cas d'usage ...<br/>
</div>
</div>
<a id="lafin"></a>

+ 33
- 0
articles/20190308/header.html Datei anzeigen

@ -0,0 +1,33 @@
<div class="container-fluid bg-grey">
<div class="row">
<div class="col-sm-4">
<br><img id="logo_ARTICLE" src="images/block_image.php" width="100%; height: auto"></img>
<br><p>ARTICLE</p>
</div>
<div class="col-sm-8">
<h2>Des cas d'usages des technos crypto pour l'&Eacute;tat</h2>
<p class="text-justify">
Le site Bitcoin.fr proposait ces derniers jours une <a href="https://bitcoin.fr/video-pierre-person-reunit-les-acteurs-auditionnes-par-la-mission-parlementaire-sur-les-monnaies-virtuelles/#more-39254">vidéo</a> tournée à l’occasion d’une réunion organisée par <a href="http://www2.assemblee-nationale.fr/deputes/fiche/OMC_PA721568">le député Pierre PERSON</a> à l’occasion de la publication du rapport de la mission parlementaire sur les monnaies virtuelles.<br/>
Dans son discours, le député nous invitait à "bousculer" l’administration sur ces sujets en proposant à la personne publique des modèles qui permettent d’améliorer le fonctionnement de nos services publics et le fonctionnement de notre société en général.
Je me lance donc dans une modeste contribution, en proposant quelques cas d’usages.
Spontannément, j'ai 4 cas d'usage qui me viennent en tête.
<ul>
<li>
Une gestion des identités, conciliant traçabilité et confidentialité.<br/>
</li>
<li>
Une crypto monnaie d'Etat.<br/>
</li>
<li>
Des transactions multisignatures pour fluidifier l’organisation ordonnateur/payeur.<br/>
</li>
<li>
Des smartcontracts pour les marchés publics.<br/>
</li>
</ul>
</p>
####BUTTON####
<br/><br/>
</div>
</div>
</div>

+ 1
- 1
index.php Datei anzeigen

@ -113,7 +113,7 @@
$('#img_explorer').attr('src', 'images/loading.gif');
block_name = $('#blockSelector').val();
block_url = 'data/getBlockInfo.php';
if (block_name != 'LAST') block_url += '?block_hash='+getblocHashFromName(block_name);
if (block_name != 'LAST') block_url += '?block_hash='+blockchainExplorer.getblocHashFromName(block_name);
$.getJSON(block_url, function( data ) {
changeExploreBlockDrawing(data);
});

+ 38
- 31
js/blockexplorer.js Datei anzeigen

@ -9,13 +9,13 @@ blockchainExplorer = function(){
var cur_methode = 'hasard';
var isInitSelector = false;
function precisionRound(number) {
function _ precisionRound(number) {
var precision = 4;
var factor = Math.pow(10, precision);
return Math.round((number/100000000) * factor) / factor;
}
function getblockNameFromHash(hash)
function _ getblockNameFromHash(hash)
{
var retour = '';
liste_blocks.forEach(function(item){
@ -24,7 +24,7 @@ blockchainExplorer = function(){
return retour;
}
function getblocHashFromName(name)
function _ getblocHashFromName(name)
{
var retour = '';
liste_blocks.forEach(function(item){
@ -33,7 +33,7 @@ blockchainExplorer = function(){
return retour;
}
function addInfoForBlock(block)
function _ addInfoForBlock(block)
{
var height = '300px';
var contenu = '';
@ -43,7 +43,7 @@ blockchainExplorer = function(){
cur_class = 1 - cur_class;
blockName = getblockNameFromHash(block.hash);
blockName = _ getblockNameFromHash(block.hash);
if (blockName != '') blockName = ' ( '+blockName+' )';
contenu += ' <h2> <span style="font-size:12px">block</span> '+block.height+blockName+'</h2>';
@ -53,10 +53,10 @@ blockchainExplorer = function(){
contenu += ' <tr><td>timestamp</td><td align="right"><b>'+block.time+'</b></td></tr>';
contenu += ' <tr><td>nonce</td><td align="right"><b>'+block.nonce+'</b></td></tr>';
contenu += ' <tr><td>nb tx</td><td align="right"><b>'+block.n_tx+'</b></td></tr>';
contenu += ' <tr><td>outputs</td><td align="right"><b>'+ precisionRound(block.topisto_outputs).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>inputs</td><td align="right"><b>'+ precisionRound(block.topisto_inputs).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>fees</td><td align="right"><b>'+ precisionRound(block.topisto_fees).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>reward</td><td align="right"><b>'+ precisionRound(block.topisto_reward).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>outputs</td><td align="right"><b>'+ _ precisionRound(block.topisto_outputs).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>inputs</td><td align="right"><b>'+ _ precisionRound(block.topisto_inputs).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>fees</td><td align="right"><b>'+ _ precisionRound(block.topisto_fees).toFixed(4)+'</b></td></tr>';
contenu += ' <tr><td>reward</td><td align="right"><b>'+ _ precisionRound(block.topisto_reward).toFixed(4)+'</b></td></tr>';
contenu += ' </table>';
$('#info_'+block.height).html(contenu);
@ -72,7 +72,7 @@ blockchainExplorer = function(){
return true;
}
function addDivForBlock(block_height)
function _ addDivForBlock(block_height)
{
var contenu = '';
@ -94,7 +94,7 @@ blockchainExplorer = function(){
return true;
}
function addDivForVoid()
function _ addDivForVoid()
{
var contenu = '';
@ -116,7 +116,7 @@ blockchainExplorer = function(){
return true;
}
function toggleForwardBtn()
function _ toggleForwardBtn()
{
if (cur_height.length < 3)
{
@ -133,7 +133,7 @@ blockchainExplorer = function(){
return true;
}
function gotoBlock(block_name)
function _ gotoBlock(block_name)
{
$(document).scrollTop( $("#explorer").offset().top );
// Bloquer la navigation pendant le calcul
@ -158,7 +158,7 @@ blockchainExplorer = function(){
liste_blocks['PREVIOUS'] = liste_blocks['BLOCK_'+cur_height[cur_height.length-1]];
cur_height.pop();
toggleForwardBtn();
_ toggleForwardBtn();
$('#block_'+cur_height[cur_height.length-2]).slideDown(400, function() {
// Animation complete.
@ -168,7 +168,7 @@ blockchainExplorer = function(){
} else {
// Ajouter un block
addDivForBlock(cur_height[cur_height.length-1] - 1);
_ addDivForBlock(cur_height[cur_height.length-1] - 1);
// Décaler d'un block vers le haut
if (cur_height.length > 1) $('#block_'+cur_height[cur_height.length-2]).slideUp();
@ -178,9 +178,9 @@ blockchainExplorer = function(){
$.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
liste_blocks['PREVIOUS'] = data.prev;
liste_blocks['BLOCK_'+data.height] = data.hash;
addInfoForBlock(data);
_ addInfoForBlock(data);
toggleForwardBtn();
_ toggleForwardBtn();
});
}
@ -194,17 +194,18 @@ blockchainExplorer = function(){
flag_nav = false;
// Ajouter un div
addDivForBlock(cur_height[cur_height.length-1] - 1);
_addDivForBlock(cur_height[cur_height.length-1] - 1);
// Mettre les infos du
block_hash = '?block_hash='+liste_blocks['PREVIOUS'];
$.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
liste_blocks['PREVIOUS'] = data.prev;
liste_blocks['BLOCK_'+data.height] = data.hash;
addInfoForBlock(data);
_ addInfoForBlock(data);
});
}
function initBlockchain(block_name)
function _ initBlockchain(block_name)
{
$(document).scrollTop( $("#explorer").offset().top );
$('#blockchain').html('');
@ -213,28 +214,28 @@ blockchainExplorer = function(){
flag_nav = true;
block_hash = '';
if (block_name != 'LAST') block_hash = '?block_hash='+ getblocHashFromName(block_name);
if (block_name != 'LAST') block_hash = '?block_hash='+ _ getblocHashFromName(block_name);
$.getJSON('data/getBlockInfo.php'+block_hash, function( data ) {
addDivForBlock(data.height);
addInfoForBlock(data);
_ addDivForBlock(data.height);
_ addInfoForBlock(data);
liste_blocks['PREVIOUS'] = data.prev;
if (data.prev != '0000000000000000000000000000000000000000000000000000000000000000')
gotoBlock('PREVIOUS');
_ gotoBlock('PREVIOUS');
else
addDivForVoid();
_ addDivForVoid();
});
return true;
}
function blockSelectorChange()
function _ blockSelectorChange()
{
initBlockchain($('#blockSelector').val());
_ initBlockchain($('#blockSelector').val());
$('#fast_forward_btn').attr('data-original-title', $('#blockSelector').val());
}
function initBlockSelector()
function _ initBlockSelector()
{
if (!isInitSelector)
{
@ -253,13 +254,19 @@ blockchainExplorer = function(){
{
$.getJSON('data/getKnownBlocksList.php', function( data ) {
liste_blocks = data;
initBlockSelector();
if (cur_height.length == 0) initBlockchain('LAST');
_ initBlockSelector();
if (cur_height.length == 0) _ initBlockchain('LAST');
return true;
});
}
return {init: _init, ajouterPreviousBlock: _ajouterPreviousBlock};
return {
ajouterPreviousBlock: _ajouterPreviousBlock,
getblocHashFromName: _getblocHashFromName,
init: _init
};
}();
$(document).ready(function(){

Laden…
Abbrechen
Speichern