Quiero agradecer a los compañeros que han aportado conocimiento al hilo, por ahora son, aTg, elbill, Coradan y mrgambino
Pregunta:
De donde se descarga el hash que hay que calcular?
Respuesta 1
El bloque que se acaba de crear con las transacciones lo reciben todos los mineros que minan en SoloMining a través del cliente bitcoind en modo servidor (esto incluye por supuesto a los pools), los hash que tu envías hacia la red para solicitar la recompensa son totalmente aleatorios, no tienes que calcular nada, simplemente el minero crea combinaciones aleatoriamente partiendo de una dificultad y lo envías, si tienes la potra de que coincide con el mismo hash de un bloque que todavía no ha resuelto nadie pues te quedas la recompensa, es exactamente una lotería.
Respuesta 2
Apartir del bloque génesis todas las transacciones pendientes se almacenan en un bloque candidato, cuando un nodo publica una nueva transacción esta se transmite de unos nodos a otros (se descarga de la red) y cada minero la incluye en el bloque candidato según la prioridad...etc y ordenadas según el timestamp "sello de tiempo".
Entonces cada minero busca el hash del bloque candidato (que contiene también el hash del bloque anterior) partiendo de determinada dificultad debe contener un número determinado de ceros (ahora 15) empezando por el bit más significativo para resolver el bloque.
Algo asi: 00000000000000015cf4d30e3244cae6537b59e1c2ca136071ead43faf52e7cc
Resuelve el bloque el primer minero que "encuentre" un hash valido (hay varios hashes validos posibles) con las características anteriores. Una vez consigues un hash valido lo publicas, el resto de nodos lo verifican y lo aceptan y se ponen al siguiente bloque. Es simplemente "fuerza bruta" ó prueba / error, suerte, como quieras llamarlo.
La primera transacción (y en algunas alts la única) de un bloque resuelto siempre es la recompensa (25 btc)
¿Porqué tarda 10 minutos?
Si yo te pido que tires un dado hasta sacar un seis, sé que de media tardaras 6 tiradas en sacar un 6. Del mismo modo la dificultad de la red se ajusta periódicamente y de media se tarda 10 minutos en que alguien resuelva un bloque nuevo. Aveces más, aveces menos.
Pregunta:
Como se añaden los códigos de transferencias al nuevo hash?
Respuesta 1
Las transferencias se van registrando en los nuevos bloques que se lanzan a la red, se reúnen todas las transferencias solicitadas y se meten dentro de un bloque, estas no serán confirmadas hasta que el bloque se resuelva por algún minero, este se distribuye entonces entre todos los nodos y se anuncia que un nuevo bloque ha sido creado.
Respuesta 2
Supongo que te refieres a las transacciones, las añaden los mineros según su prioridad (comision, timestamp) al bloque candidato, si una transacción por cualquier motivo no desean incluirla (doble gasto, o lo que fuere), no lo hacen y esta nunca se confirma.
Pregunta:
Cual es el algoritmo que guarda bitcoin para calcular el hash?
Respuesta 1
El algoritmo de BTC es SHA256D, fue desarrollado por la NSA (Agencia de Seguridad Nacional USA) con eso ya hay tema para rato para los mas conspiranoicos...
Ahí va una calculadora que te hace un hash:
http://www.xorbin.com/tools/sha256-hash-calculator
En BTC se utiliza doblemente siguiendo esta operación (SHA256x(SHA256xDATOS)) por eso tiene una D al final.
Respuesta 2
Sha256... no sé si es lo que preguntas porque me parece muy sencillo, pero es ese.
Pregunta:
Supongamos que la red tiene 10 nodos (o mineros en este caso) y que como mencionan antes, todos están trabajando tratando de encontrar el hash que cumple con la dificultad del bloque actual, cuando uno de los 10 nodos resuelve el bloque, que pasa con el trabajo que han realizado los otros 9 nodos, se pierde?, o los otros 9 pueden reutilizar esos cálculos para el siguiente bloque?
Respuesta
Si, todo se pierde y no es reutilizable, es como preguntar si un numero de la lotería de la semana pasada te sirve para el sorteo de este viernes, hazte a la idea que no estas calculando complejos problemas matemáticos, solo estas jugando a la lotto !!!
Pregunta:
¿Cómo logra saber un nodo que IPs tienen otros nodos de la red para conectarse a ellos y comenzar a intercambiar información?
Respuesta
Hay varios métodos, tenéis detalles de los mismos aquí: https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery
Me centraré en explicar el método de descubrimiento llamado dnsseed. Para hacer este tipo de descubrimiento el nodo hace consultas dns a Servidores DNS que están incluidos en el código del nodo, por ejemplo, los que hay en el código de Fastcoin-Qt versión 0.8.5.1:
Code:
static const char *strMainNetDNSSeed[][2] = {
{"u2.fastcoin.ca","a2.fastcoin.ca"},
{"u2.fastcoin.ws","u2.fastcoin.ws"},
{"a1.fastcoinfor.me","u1.fastcoinfor.me"},
{"a1.fastcoin.ca","u1.fastcoin.ca"},
{"a1.fastcoin.ws","u1.fastcoin.ws"},
{NULL, NULL}
};
Como podéis ver se trata de una matriz. En la primera columna se han de especificar los servidores DNS y en la segunda el host A por el que se ha de preguntar y que apunta a IPs que son nodos estables o fijos de la red. Con lo que el cliente una vez tiene las IPs se conecta a ellos recibe ya información de otros, y así va estableciendo diferentes conexiones...
El problema que tiene esto en la versión actual de Fastcoin es que los nombres que hay en la primera columna no son servidores DNS y por eso se produce el fallo. Para la siguiente versión lo hemos dejado así:
Code:
static const char *strMainNetDNSSeed[][2] = {
{"ns-1470.awsdns-55.org","u2.fastcoin.ws"},
{"ns-1470.awsdns-55.org","a1.fastcoin.ws"},
{"ns1.netfirms.com","a2.fastcoin.ca"},
{NULL, NULL}
};
Ahora los primeros si son servers DNSs de los dominios fastcoin.ws y fastcoin.ca respectivamente que alojan los registros Host A de los nombres de la segunda columna, y de esta forma ya si funciona de manera correcta el descubrimiento. También valdría así:
Code:
static const char *strMainNetDNSSeed[][2] = {
{"ns-1470.awsdns-55.org","dnsseed.fastcoin.ws"},
{"ns1.netfirms.com","a2.fastcoin.ca"},
{NULL, NULL}
};
Si en el servidor ns-1470.awsdns-55.org se crean dos host A para dnsseed.fastcoin.ws: uno apuntado uno a la IP a la que apunta actualmente u2.fastcoin.ws y otro a la IP a la que apunta actualmente a1.fastcoin.ws. Pero bueno esto es un tema de detalle técnico que tampoco tiene importancia en lo que nos ocupa...
Aquí podéis ver los dnsseed que tiene Bitcoin-Qt 0.8.6: https://github.com/bitcoin/bitcoin/blob/0.8.6/src/net.cpp
Code:
static const char *strMainNetDNSSeed[][2] = {
{"bitcoin.sipa.be", "seed.bitcoin.sipa.be"},
{"bluematt.me", "dnsseed.bluematt.me"},
{"dashjr.org", "dnsseed.bitcoin.dashjr.org"},
{"xf2.org", "bitseed.xf2.org"},
{NULL, NULL}
};
Resumiendo...
Conocemos algo más de que es lo primero que hace un nodo de la red Bitcoin cuando se inicia. Busca desesperadamente otros nodos con los que comunicarse... Si no los logra encontrar, no podrá hacer nada. Cualquiera que se haya bajado el cliente de Fastcoin v0.8.5.1 sabrá lo que es.
Por el momento conocemos dos formas de descubrimiento de nodos:
1.- DNSseed: mediante consultas a servidores DNS que están en el propio código compilado en una variable que se llama strMainNetDSNSeed.
2.- Especificando los nodos directamente en el archivo de texto .conf de %appdata%\fastcoin con unas líneas como estas:
addnode=208.72.104.70
addnode=108.20.183.67
addnode=81.56.104.39
addnode=90.190.237.233
En este listado manual, logicamente, es interesante poner nodos fijos, o si se va a minar con el cliente en modo server para SOLO mining, poner la IP del nodo de algún pool grande de cara a reducir el descubrimiento de bloques que se queden luego huérfanos. Dado que ese pool tendrá la información más actualizada de la cadena de bloques y así te llegará de primera mano cual ha sido el último bloque descubierto...
Para alguien que mina en modo SOLO es una pena descubrir, y luego quedarse sin la recompensa porque el bloque se haya quedado huérfano...