Jeton d'authentification d'erreur de manipulation

Selon la documentation sur bitcoin.org et le Mastering Bitcoin livre, vous pouvez utiliser la clé publique à créer de l'enfant les clés publiques de HD portefeuilles en combinant le côté gauche de la table de hachage de sortie de la chaîne parent code + parent clé publique + indice:

L'apparemment aléatoire de 256 bits sur le côté gauche de la table de hachage de sortie sont utilisés comme la valeur de l'entier pour être combiné avec le parent clé privée ou d'un parent de la clé publique à, respectivement, créez un enfant de la clé privée ou de l'enfant à clé publique

Je comprends bien ce côté gauche de la sortie peut être combiné avec le parent privé de la clé pour générer de l'enfant de la clé privée, qui à son tour peut être utilisé pour générer un enfant valide la clé publique.

Comment est-il possible que l'enfant de la clé publique générée par la combinaison de la valeur de hachage de sortie avec le parent clé publique correspond à l'enfant de la clé privée générée séparément en combinant le même hachage de sortie avec le parent de la clé privée?

Je pensais que c'était impossible de générer une clé publique, sans savoir exactement ce que la clé privée a été. Quelle est la relation entre l'enfant les clés privées et publiques (K = k*G) maintenu lorsqu'ils sont générés séparément de cette façon?.

+783
Virolaynen 3 avr. 2015, 17:15:41
15 réponses

Quelques exemples qui semble logique pour moi, mais ne doit être pris à titre d'exemples:

Un gouvernement qui est sensible au lobbying commercial est probablement plus susceptibles de subir des pressions par les banques pour rejeter la concurrence avec leurs services.

Les gouvernements qui ont un problème de corruption peut également être tranquillement soudoyé pour légiférer contre une monnaie qui est en concurrence avec l'officiel.

Les pays qui prennent en charge les logiciels open source ont tendance à avoir un "pour le bien de la communauté attitude", qui correspond à la philosophie de Bitcoins.

Pour cette question, il est sans doute important de fournir des références/exemples (telles que des informations sur qui est d'essayer d'arrêter l'utilisation de bitcoins, et pourquoi).

Je vois la nécessité de poser cette question pour aider à fournir une base pour celle-ci: existe t il une liste de pays qui ne sont pas susceptibles de persécuter bitcoin entreprises?

+971
Kathy Welch 03 февр. '09 в 4:24

Le délai de drapeau définit la quantité de temps d'attente lors d'une tentative de connexion à un noeud. La valeur par défaut est de 5000 ms. C'est la connexion à d'autres pairs du réseau pour la synchronisation de la blockchain, la réception et l'envoi de nouvelles transactions au mempool, etc.

A suivre la question est, ne serait qu'un nœud avec 15 secondes de délai d'expiration du mal à la pièce de monnaie de réseau avec une vitesse de bloc de temps, par exemple, de 45 secondes?

Plus rapide blocktimes dire que le réseau a moins de temps pour 1 - propager les transactions et 2 - les valider avant le prochain bloc. C'est certainement quelque chose à prendre en compte lors de la réflexion sur les blocs-temps. Un ralentissement de nœud (à la fois en termes de latence du réseau pour la synchronisation et de la puissance cpu pour validation) peuvent ne pas être en mesure de confirmer de nouveaux blocs assez rapide, mais le plus gros problème est que si une majorité de nœuds sont lentes par rapport au bloc de temps.

+892
Elizabeth Reiher 13 nov. 2010, 16:22:09
Autres réponses

Questions connexes


Questions connexes

2013-07-09 00:46:43.467000 P2Pool: 17468 actions en chaîne (17472 vérifié/17472 total) Pairs: 9 (3 entrant)
2013-07-09 00:46:43.467000 Local: 0H/s dans le dernier 0.0 secondes Local morts à l'arrivée: ??? Attendre un temps de partage: ???
2013-07-09 00:46:43.468000 Actions: 0 (0 orphelin, 0 morts) Vicié taux: ??? Efficacité: ??? De remboursement actuel: 0.0000 BTC
2013-07-09 00:46:43.468000 Piscine: 1202GH/s Rassis taux: de 16,9%, on s'Attend à ce bloc: 21.2 heures

Pourquoi un tas de valeurs, juste "???".

+836
lava37 23 févr. 2023, 08:21:59

Est-il un site où je peux voir la taille du pool de mémoire au fil du temps, ou le nombre moyen de transactions par bloc?

+735
Amit Khanna 8 sept. 2020, 23:47:08

Où puis-je vérifier combien l'ASIC, l'exploitation minière, le pouvoir a été livré, ce qui a été pré-commandés, quand il sera livré, et à ce que les taux et les délais de plus d'unités sera expédié?

+655
lewiatan 15 avr. 2018, 00:25:18

J'ai eu le même problème et pour moi, il a travaillé pour définir le TERME de variable pour rien directement avant d'exécuter cgminer. Comme cela dans la cmd shell:

DURÉE=
cgminer-nogpu.exe ........

Si vous le réglez sur "" (sens rien) dans les paramètres du système, il va utiliser la valeur par défaut "c:\windows\system32\cmd.exe". Vous pouvez consulter la variable dans la coque avec:

echo %DURÉE%

J'espère que cela va vous aider :)

+589
Gelo Mabait 25 janv. 2022, 03:14:20

Ce qui arrive à une personne bitcoins si elles se produisent à mourir prématurément? Les pièces de monnaie perdues à jamais si on ne sait pas que la personne porte-monnaie info?

+512
user7008 27 janv. 2011, 03:19:52

La réponse courte à votre question est "oui".

Des Efforts sont en cours pour mettre au point des mécanismes qui permettent de collectifs d'exploration sans le gestionnaire de pool d'être en mesure de contrôler ce que les transactions vont dans la piscine de blocs, laissant cette décision (ainsi que de la chaîne d'étendre, tant que c'est raisonnable) à la personne de mineurs. Tous les la piscine a vraiment besoin est une preuve que le mineur est l'exploitation minière, pour la piscine.

+362
Dhia 31 août 2012, 03:32:07

J'ai un 2012 Macbook Pro minière Litecoins (CPU&GPU à un combiné 80kHash/s) et un iMac 2011 (71MHash/s sur son HD5670) exploration de la CTB. Ils ont tous les deux tourner toute la nuit et le week-end, je tourne le logiciel d'exploration sur le jour de la semaine. Faire ce depuis des mois maintenant.

Jusqu'à présent, il n'y avait pas de problèmes de surchauffe, mais j'ai un supplément de support de refroidissement pour le Macbook, que je recommande.

Encore, je m'attends à du matériel de mourir plus tôt. La gestion de la chaleur dans les machines Apple est très délicate en raison de la conception de cas, et j'ai entendu des gens se réveiller un mort iMac.

+302
criptovigilante 20 déc. 2013, 11:31:06

L'exploitation minière fournit un moyen de parvenir à un consensus sur ce que les transactions du grand livre et de savoir que personne ne triche.

C'est la non-définition technique de l'exploitation minière.

L ' "autorité" pour doubler les dépenses est la blockchain. La blockchain se compose de l'histoire de tous les blocs dans la blockchain plus le prochain bloc de transactions. La récompense subvention actuellement est de 25 BTC à la partie qui soumet le prochain bloc. Mais bon ...vous voulez que 25 BTC (vaut actuellement environ 825$) que serais-je comme tout le monde. Alors, comment faire en sorte que je ne peut pas tricher et de réclamer le bloc de moi-même?

Eh bien, vous mettre dans un système que vous et moi avons à la concurrence. C'est ce que la preuve de travail fait-il qu'il fait en sorte que lorsque je demande la récompense, il est facile de prouver que j'ai vraiment fait le travail. Donc, pour moi, d'avoir 2% de chance de résoudre un bloc que je dois mettre dans 2% des de la des travaux d'exploitation. Il n'y a aucun moyen pour moi de mettre en moins de 2% de tout le travail et encore résoudre des blocs d'au moins 2% du temps (en moyenne).

Donc en conséquence, lors d'une transaction de bloc est soumis, tous les pairs de vérifier qu'il n'y avait pas de double dépense, que le bon montant de subvention a été demandée, et que le demandeur vraiment dépensé le travail nécessaire pour cette solution. Avec ces trois règles, alors il n'a pas besoin d'être une autorité centrale chargée de gérer le processus ou en mesure de contrôler le résultat.

+300
psubsee2003 24 févr. 2017, 02:36:48

Voici un script Python qui fait la conversion. Vous pouvez le vérifier son travail en le comparant à la saisie de votre clé privée comme le "Secret de l'Exposant" à Brainwallet. J'ai pris le script de cette Bitcointalk fil et dépouillé inutile (comme le code pour utiliser la clé publique pour signer un message et de vérifier que la signature).

La conversion de l'Python instructions pour un homme est laissé comme exercice au lecteur (bien que je dirais que, dans un tel scénario, le code Python, avec la documentation appropriée, c'est très bien que les instructions pour l'homme). Notez qu'il est tout à fait possible pour le calcul de ce avec un stylo et du papier, mais il pourrait prendre un certain temps, et vous êtes susceptible de faire une erreur, en raison d'avoir à faire face à de tels chiffres énormes.

Notez également qu'il n'y a pas d'opérations individuelles ici beaucoup plus compliqué qu'on apprend en primaire/école élémentaire. Il y a de base des comparaisons < > ==arithmétiques + - *, de la division où vous vous souciez du quotient /, reste %, ou les deux divmod, et au niveau du bit (&, ce qui est assez facile si vous travaillez dans l'hex; ou peuvent être reproduits avec l'arithmétique).

Je ne pense pas qu'une (non-génie) de 5 ans pourrait le faire (désolé, la méchante sorcière gagne ce tour), mais je pense qu'un adulte de taille moyenne avec suffisamment de patience pourrait apprendre les mathématiques nécessaires dans presque pas de temps (avec le script Python comme un..bien..script, à suivre). En fait, le calcul même une clé publique sans l'aide de l'électronique des appareils pourrait prendre un temps très long, cependant (à deviner: ans).

#! /usr/bin/env python
# python 2.x

classe CurveFp( objet ):
 def __init__( self, p, a, b ):
 self.__p = p
 self.__a = a
 self.__b = b

 def p( self ):
 retour auto.__p

 def a( auto ):
 retour auto.__un

 def b( auto ):
 retour auto.__b

 def contains_point( self, x, y ):
 de retour ( y * y - ( x * x * x + self.__a * x + self.__b ) ) % self.__p == 0

la classe Point( objet ):
 def __init__( self, courbe, x, y, commande = None ):
 self.__courbe = courbe
 self.__x = x
 self.__y = y
 self.__order = ordre
 si l'auto.__courbe: affirmer soi-même.__de la courbe.contains_point( x, y )
 si la commande: affirmer l'autonomie * commande == INFINI

 def __add__( self, autre ):
 si d'autres == l'INFINI: le retour de l'auto
 si l' == l'INFINI: au retour de l'
 affirmer soi-même.__courbe == autres.__courbe
 si l'auto.__x == autres.__x:
 if ( self.__y + autres.__y ) % self.__de la courbe.p() == 0:
 retour INFINI
autre chose:
 retour auto.double()

 p = self.__de la courbe.p()
 l = ( ( d'autres.__y - auto.__y ) * \
 inverse_mod( d'autres.__x - auto.__x, p ) ) % p
 x3 = ( l * l - auto.__x - autres.__x ) % p
 y3 = ( l * ( self.__x - x3 ) - auto.__y ) % p
 Point de retour( self.__courbe, x3, y3 )

 def __mul__( self, autre ):
 def leftmost_bit( x ):
 assert x > 0
 résultat = 1L
 tout résultat <= x: résultat = 2 * résultat
 résultat de retour / 2

 e = autres
 si l'auto.__ordre: e = e % self.__afin
 si e == 0: return INFINI
 si l' == INFINI: retour INFINI
 affirmer e > 0
 e3 = 3 * e
 negative_self = Point( self.__courbe, self.__x, -auto.__y, self.__commande )
 i = leftmost_bit( e3 ) / 2
 résultat = auto
 tout i > 1:
 résultat = résultat.double()
 si e3 (&i ) != 0 et ( e & i ) == 0: result = result + auto
 si e3 (&i ) == 0 et ( e & i ) != 0: result = result + negative_self
 i = i / 2
 résultat de retour

 def __rmul__( self, autre ):
 retour auto * autres

 def __str__( self ):
 si l' == INFINI: de retour de "l'infini"
 retour "(%d,%d)" % ( self.__x, self.__y )

 def double( self ):
 si l' == l'INFINI:
 retour INFINI

 p = self.__de la courbe.p()
 a = self.__de la courbe.un()
 l = ( ( 3 * self.__x * self.__x + a ) * \
 inverse_mod( 2 * self.__y, p ) ) % p
 x3 = ( l * l - 2 * self.__x ) % p
 y3 = ( l * ( self.__x - x3 ) - auto.__y ) % p
 Point de retour( self.__courbe, x3, y3 )

 def x( self ):
 retour auto.__x

 def y( self ):
 retour auto.__y

 def courbe( self ):
 retour auto.__courbe

 def commande( self ):
 retour auto.__afin

L'INFINI = Point( None, None, None )

def inverse_mod( a, m ):
 si a < 0 ou m <= a: a = a % m
 c, d = a, m
 uc, vc, ud, vd = 1, 0, 0, 1
 tandis que le c != 0:
 q, c, d = divmod( d, c ) + ( c, )
 uc, vc, ud, vd = ud - q*communications unifiées, vd - q*vc, uc, vc
 affirmer d == 1
 si ud > 0: retour ud
 autre chose: le retour ud + m

# secp256k1
_p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFfffffffffffffffffffffffffefffffc2fl
_r = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFfebaaedce6af48a03bbfd25e8cd0364141l
_b = 0x0000000000000000000000000000000000000000000000000000000000000007l
_a = 0x0000000000000000000000000000000000000000000000000000000000000000l
_Gx = 0x79BE667EF9DCBBAC55A06295CE870B07029bfcdb2dce28d959f2815b16f81798l
_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8l

classe Public_key( objet ):
 def __init__( self, générateur, point ):
 auto.courbe = générateur.la courbe()
 auto.générateur = générateur
 auto.point = point
 n = générateur.commande()
 si pas de n:
 soulever RuntimeError, "Générateur de point doit avoir de l'ordre."
 si pas de n * point == l'INFINI:
 soulever RuntimeError, "Générateur de point de commande est mauvais."
 si le point.x() < 0 ou n <= point.x() ou d'un point.y() < 0 ou n <= point.y():
 soulever RuntimeError, "Générateur de point a de x ou y de gamme."

curve_256 = CurveFp( _p, _a, _b )
generator_256 = Point( curve_256, _Gx, _Gy, _r )
g = generator_256

si __name__ == "__principaux__":
 imprimer '======================================================================='
 ### set privkey
 # wiki
 #secret = 0xE9873D79C6D87DC0FB6A5778633389f4453213303da61f20bd67fc233aa33262l
 # question
 secret = 0x18E14A7B6A307F426A94F8114701E7c8e774e7f9a47e2c2035db29a206321725l

 ### print privkey
 print "secret", hex(secret)
 ### générer pubkey
 pubkey = Public_key( g, g * secret )
 ### print pubkey
 imprimer pubkey', hex(pubkey.point.x()), hex(pubkey.point.y())
 imprimer '======================================================================='

Voir aussi du même-plus-stripped-down version écrite en C#.

classe CalcPub
{
 public static void main()
{
 var p = BigInteger.Parse("0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", NumberStyles.HexNumber);
 var b = (BigInteger)7;
 var a = BigInteger.Zéro;
 var Gx = BigInteger.Parse("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", NumberStyles.HexNumber);
 var Gy = BigInteger.Parse("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", NumberStyles.HexNumber);

 CurveFp curve256 = new CurveFp(p, a, b);
 Point generator256 = new Point(curve256, Gx, Gy);

 var secret = BigInteger.Parse("18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725", NumberStyles.HexNumber);

 Console.WriteLine("secret {0}", secret.ToString("X"));
 var pubkeyPoint = generator256 * secret;
 Console.WriteLine("pubkey {0}{1}", pubkeyPoint.X.ToString("X"), pubkeyPoint.Y.ToString("X"));
}
}
la classe Point
{
 public static readonly Point de l'INFINI = new Point(null par défaut(BigInteger), par défaut(BigInteger));
 public CurveFp Courbe { get; private set; }
 public BigInteger X { get; private set; }
 public BigInteger Y { get; private set; }

 public Point(CurveFp courbe, BigInteger x, BigInteger y)
{
 c'.Courbe = courbe;
 c'.X = x;
 c'.Y = y;
}
 public Point Double()
{
 si (ce == INFINI)
 retour INFINI;

 BigInteger p = ce.De la courbe.p;
 BigInteger a = ce.De la courbe.une;
 BigInteger l = ((3 * ce.X * ce.X + a) * InverseMod(2 * ce.Y, p)) % p;
 BigInteger x3 = (l * l - 2 * ce.X) % p;
 BigInteger y3 = (l * (ce.X - x3) - cette.Y) % p;
 de retour de new Point(ce.Courbe, x3, y3);
}
 public override string ToString()
{
 si (ce == INFINI)
 de retour de "l'infini";
 chaîne de retour.Format("({0},{1})", c'.X, cette.Y);
}
 public static Point operator +(Point, Point à droite)
{
 si (droite == INFINI)
 retour à gauche;
 si (gauche == INFINI)
 droit de retour;
 si (de gauche.X == droite.X)
{
 si ((de gauche.Y + droite.Y) % à gauche.De la courbe.p == 0)
 retour INFINI;
d'autre
 retour à gauche.Double();
}

 var p = gauche.De la courbe.p;
 var l = ((de droite.Y - gauche.Y) * InverseMod(à droite.X - gauche.X, p)) % p;
 var x3 = (l * l - gauche.X - droit.X) % p;
 var y3 = (l * (de gauche.X - x3) - gauche.Y) % p;
 de retour de new Point(de gauche.Courbe, x3, y3);
}
 public static Point de l'opérateur *(Point à gauche, BigInteger à droite)
{
 var e = droite;
 if (e == 0 || gauche == INFINI)
 retour INFINI;
 var e3 = 3 * e;
 var negativeLeft = new Point(de gauche.Courbe, à gauche.X, gauche.Y);
 var i = LeftmostBit(e3) / 2;
 var resultat = gauche;
 while (i > 1)
{
 résultat = résultat.Double();
 si ((e3 & i) != 0 && (e & i) == 0)
 résultat += gauche;
 si ((e3 & i) == 0 && (e & i) != 0)
 résultat += negativeLeft;
 i /= 2;
}
 résultat de retour;
}

 private static BigInteger LeftmostBit(BigInteger x)
{
 BigInteger result = 1;
 while (result <= x)
 résultat = 2 * résultat;
 résultat de retour / 2;
}
 private static BigInteger InverseMod(BigInteger un, BigInteger m)
{
 while (a < 0) a += m;
 si (a < 0 || m <= a)
 a = a % m;
 BigInteger c = a;
 BigInteger d = m;

 BigInteger uc = 1;
 BigInteger vc = 0;
 BigInteger ud = 0;
 BigInteger vd = 1;

 while (c != 0)
{
 BigInteger r;
 //q, c, d = divmod( d, c ) + ( c, );
 var q = BigInteger.DivRem(d, c, r);
 d = c;
 c = r;

 //uc, vc, ud, vd = ud - q*communications unifiées, vd - q*vc, uc, vc;
 var uct = uc;
 var cdv = vc;
 var udt = ud;
 var vdt = vd;
 uc = udt - q * uct;
 vc = vdt - q * cdv;
 ud = uct;
 vd = vct;
}
 si (ud > 0) return ud;
 else return ud + m;
}
}
classe CurveFp
{
 public BigInteger p { get; private set; }
 public BigInteger un { get; private set; }
 public BigInteger b { get; private set; }
 public CurveFp(BigInteger p, BigInteger un, BigInteger b)
{
 c'.p = p;
 c'.a = a;
 c'.b = b;
}
}
+267
wilson Liu 1 août 2018, 15:54:31

Vous êtes à la recherche de moyens d'améliorer l'protections contre les défauts?

Voici une liste de ses protections:

+167
katie654 31 mars 2010, 14:45:09

erreur: contrôle de l'annuaire a de mauvaises permissions 777 (doit être >=0755 et <=0775)

Pourrait-il être un problème de permissions?

+105
modular 3 mars 2010, 16:03:31

Yuma père Yugo a travaillé avec des Frontières quand il a été fondé, il a donc dû Déclencher la technologie de l'époque. Alors, quand Yuma abord utilisé une Frontière Déclencher ans, lorsque son père, le Trion corps et uniforme conçu pour lui est venu de la frontière vieux jours. Pour lui, il utilise la même Trion corps maintenant avec le noir uniforme, plutôt que de faire un nouveau Trion corps avec de la Frontière actuelle de blanc.

Un exemple de ce que je veux dire, c'est Konami Yuma mentor, a dit qu'elle a été en Bordure même avant de Jin. Elle avait les cheveux courts dans ses premières années, de sorte que même si elle a les cheveux longs maintenant. Elle lui permet de Trion corps à maintenir les cheveux courts, elle a l'habitude d'avoir, parce que son corps réel les cheveux longs n'est pas adapté pour la bataille. Fondamentalement, à moins que Yuma fait une nouvelle Frontière du Déclencheur, Trion corps, il aura le noir uniforme.

+59
user2215 11 mars 2014, 14:10:05

La citation ci-dessous est extrait de ma réponse à la Façon de mettre en œuvre un jeu comme SatoshiDice? Ce que vous cherchez est abordé dans cette partie de ma réponse ci-dessous.

Obtenez le client du montant et de l'adresse de paiement

  1. Appel bitcoind getrawtransaction [Les transactions entrantes ID] 1. Le 1 à la fin vous devrez renvoyer les données en "mode verbose", qui essentiellement les données brutes dans un format JSON.

  2. Les matières les détails de la transaction, prendre la txid et vout du vin de l'objet. Avec cette transaction, de nouveau appel bitcoind getrawtransaction sur le txid.

  3. À partir de ces premières détails de la transaction trouver le vout objet référencé par le vout index à partir de l'étape #2. Dans ce vout objet, il devrait y avoir une liste de paiement les adresses des destinataires. Prendre et de stocker la première adresse.

Il vaut la peine de mentionner que d'un reçu de paiement peut être une sommation de nombreuses, ex de transactions à plusieurs adresses de destinataire. Obtenir un initiateurs de l'adresse n'est pas toujours simple parce que le paiement initial pourrait consister en plusieurs versements, à partir de l'envoi de plusieurs adresses.

C'est pourquoi dans ma réponse à la SatoshiDice question que je mentionne la prise de la première adresse de la deuxième vout résultat.

Vous pouvez déduire sans risque que, si quelqu'un vous envoie un paiement provenant de plusieurs comptes, ils contrôlent tous les comptes. Ergo, la cueillette de la première de la liste va vous donner la bonne adresse.

+14
Media 2 juin 2010, 07:02:56

Afficher les questions avec l'étiquette