[8],[6],[4]
[1],[2],[3],[4]
[9]
MEUCIQDBKn1Uly8m0UyzETObUSL4wYdBfd4ejvtoQfVcNCIK4AIgZmMsXNQWHvo6KDd2Tu6euEl13VTC3ihl6XUlhcU+fM4=
2. Transformer en hexadecimal cela donne
3045022100c12a7d54972f26d14cb311339b5122f8c187417dde1e8efb6841f55c34220ae0022066632c5cd4161efa3a2837764eee9eb84975dd54c2de2865e9752585c53e7cce
3. Signature que l'on retrouve dans la BlockChain..
[7]
Algorithme de signature d'une transaction Bitcoin et d'un message :
Même algorithme = duperies de Craig Wright.
Celui ci ne nous montre pas le prétendu message car supposé trop long, il nous donne seulement le hash de celui ci.
Il est allé cherché dans la BlockChain une transaction de Satoshi inconnu, qui contient une signature d'une transaction.
Il a recalculé le Hash de cette transaction, et a prétendu que son fichier avait le même hash...
La cryptographie, discipline mathématique
Le problème de la signature des noms de domaine
Comment la BlockChain propose un remède à ce problème ?
Le PageRank comme solution contre les "squatters"
Implémentation
Test et Questions
Bibliograhie
Origine de la cryptographie
Le cryptosystème RSA
Attaquer RSA
Test de primalité : Test de Miller Rabin
Permet de savoir pour p et q très grands s'ils sont premiers.
Principe général de Miller Rabin
Le certificat S peut être générée avec des clés RSA
S^e = Message % n
// e : exposant publique (souvent 65537)
// n : le module de la clé publique
[3]
[1],[2]
... Nous prendrons comme exemple la chaine de bloc du réseau Bitcoin
Un Bloc est composé de
[1]
Un arbre de hachage est une structure de données contenant un résumé d'information d'un volume de données, généralement grand
Arbre de Merkle pour un nombre de transactions impaires
Leur utilisation dans la crypto monnaie
permet à certains noeuds du réseau
de ne pas maintenir une copie complète de la BlockChain en locale, on appelle cela
[2]
void Block::BuildMerkleRoot()
{
// To get a even number of transactions
if (transactions.size() & 1) {
transactions.push_back(transactions.at(transactions.size() - 1)); nombreTransaction++;
}
int N = transactions.size();
vector<string> hashTree;
hashTree.resize(2 * N - 1);
for (int i = 0; i < N; i++)
hashTree.at(2 * N - 2 - i) = transactions.at(i);
for (int i = N - 2; i > -1; i--)
{
hashTree.at(i) = SHA25::sha256(SHA25::sha256(hashTree.at(2 * i + 1) + hashTree.at(2 * i + 2)));
}
header.setHashMerkleRoot(hashTree.at(0));
header.setTime(boost::posix_time::second_clock::local_time());
blockHash = SHA25::sha256(SHA25::sha256(header.get_HashMerkleRoot()));
}
Trouver un nonce n pour un Bloc B pour une difficulté X tel que : SHA256(SHA256(headerHash(B) + n)) < 0.(X zeros)..01000000
int Block::solveProofofWork(bool& stop)
{
unsigned long long nonce = 0;
unsigned long long const limit = std::numeric_limits<unsigned long long>::max();
string sol(Constante::DIFFICULTY_MINING, '0');
while (true) {
string hash = SHA25::sha256(SHA25::sha256(
string(header.get_HashMerkleRoot() +
std::to_string(nonce))));
if (hash.substr(0, Constante::DIFFICULTY_MINING) == sol)
break;
else
++nonce;
}
header.setNonce(nonce);
return nonce;
}
Distribution du HashRate et resultat du minage des blocs de 410533 à 410541
1. Un fork apparaît lorsque deux mineurs résolvent la preuve de travail en même temps !
2. Ils partagent leur nonce trouvé avec le réseau. Chaque noeud recevant le nouveau Bloc le vérifie avant de l'ajouter dans sa BlockChain
3. Le réseau est coupé en deux puisque les deux blocs se propagent à une vitesse différente
4. Une partie des mineurs vont miner "au dessus" du bloc vert, et l'autre au dessus du bloc rouge.
Conclusion :Comme les mineurs minent toujours au dessus de la plus longue chaîne, alors un consensus commun s'établit au delà d'une certaine profondeur
5. Un nouveau bloc a été trouvé chez les "verts". Les noeuds minant le bloc rouge vont recevoir un bloc qui a été miné sur le bloc vert, ils vont donc suspendre leur bloc miné, et passer sur la plus haute chaine de bloc
Une réflexion sur le problème des squatters
[3]
Idée pour le problème précédent: Affecter à chaque page un prix fonction de son PageRank pour repousser les squatteurs de noms de domaine populaire
Idée de PageRank : Une page est d'autant importante que d'autres pages importantes ont des liens vers elle
Calculer une matrice H creuse. Puis à l'aide de la méthode de la puissance itérée, trouvez un vecteur r tel que
De plus la matrice H peut être vu comme une matrice de transition d'une chaine de Markov. Ainsi pour que la méthode de la puissance itérée converge, il faut que la la matrice H soit stochastique, apériodique, et irréductible
Solution 1
Exemple !
Propriétés de cette matrice :
Matrice de transition d'une chaîne de Markov !
Xn : Variable aléatoire à valeurs dans E après n étapes.
E : Espace d'état {A,B,C,D,E}
Probabilité indépendante de n : chaîne de markov sans mémoire !
Probabilité d'être à la page i, sachant que l'on était à la page j après deux étapes (Démonstration)
Probabilité d'être sur une page est indépendante du point de départ ( ici n>32 ) !
La ième coordonnée de ce vecteur = la probabilité d'être sur la page i à l'instant n
Problèmes :
Une matrice P sans problèmes est dite régulière
Résolution du problème :
Matrice P non régulière ? Déformons la !
while (!stop)
{
nombre_iteration++;
j = 0;
long float sum2 = 0;
long float sum3 = 0;
auto end = outgoing_link_null.end();
i = 0;
std::for_each(PR.begin(), PR.end(), [&sum2,&end,&i,&outgoing_link_null,&sum3](const auto& n) {
sum2 += n;
if (outgoing_link_null.find(i) != end)
sum3 += n;
i++;
});
for (i = 0; i < N; i++)
{
res = 0;
std::for_each(in_degree.at(i).begin(), in_degree.at(i).end(), [&res,&PR,&out_degree](const auto& x) {
res += alpha*(1 / static_cast<long float>(out_degree.at(x).size()))* PR.at(x);
});
res += (alpha / static_cast<long float>(N))*sum3;
res += sum2*coeff2;
buffer.at(i) = res;
}
i = 0;
for (const auto& x : buffer)
{
if (std::abs(x - PR.at(i++)) > convergence)
{
PR = buffer;
break;
}
if (i == N)
stop = true;
}
}
Bibliographie