Author

Topic: Conocer bitcoin en profundidad. (Read 2304 times)

hero member
Activity: 924
Merit: 503
January 18, 2014, 10:30:28 AM
#17
Respuestas actualizadas.

 Grin Grin Grin Grin Grin Grin Grin
hero member
Activity: 518
Merit: 503
January 01, 2014, 03:31:36 AM
#16
Interesante Hilo este, en la medida que el tiempo me lo permita iré aportando lo que pueda a él.  

Estoy colaborando con el proyecto de Fastcoin y estoy analizando el código con lo que imagino que iré descubriendo cosas interesantes del funcionamiento de las monedas electrónicas.  Es muy similar al de Bitcoin, así es que creo que puede valernos para ir entrando en el bajo nivel...

El primer asunto del que me he ocupado es de solucionar un bug que había, que si alguno tenéis el cliente de Fastcoin-Qt 0.8.5.1 lo habréis sufrido, era que al iniciarlo no conectaba a ningún nodo y no era capaz de descargarse la cadena de bloques para comenzar a funcionar como un nodo de la red haciendo lo que se ha comentado anteriormente, exceptuando lógicamente el minado.  El cliente Bitcoin o Fastcoin no mina de entrada, pero si retransmite información a los otros nodos de lo que le llega o de lo que él mismo genera.  Para solucionar el asunto y que se conecte, hay que crearse un archivo .conf y poner ahí los nodos con addnode y tal...

El caso es que a raíz de este problema surge la siguiente 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?

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.  Smiley

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...

En fins, interesantes temas...

Feliz Año a todos!!!
aTg
legendary
Activity: 1358
Merit: 1000
December 29, 2013, 06:20:21 PM
#15
Bueno yo siempre he tenido dos dudas:

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 !!!
hero member
Activity: 632
Merit: 500
December 29, 2013, 06:06:18 PM
#14
Hola gracias por el hilo, muy informativo e interesante!

Bueno yo siempre he tenido dos dudas:

1. 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?

2. Suponiendo que la respuesta a la primera pregunta, es que los cálculos de los otros 9 nodos se pueden reutilizar para  resolver el nuevo bloque, vamos a imaginar que los mismos nodos están trabajando tratando de resolver un bloque, de nuevo uno de los nodos lo resuelve y coincide que en ese momento cambia la dificultad, ya que justo con ese bloque cambiaba la dificultad, que pasa con los cálculos de los otros nodos?, se pueden reutilizar o en este caso ya no sirven?.
Gracias
full member
Activity: 210
Merit: 100
設定你的目標
December 28, 2013, 02:21:11 PM
#13
y para mi no hay nada? mira que yo soy el que trajo la biblia jajaja

a don atg le encanto  Cheesy

Justo debajo de la biblia te agradezco el esfuerzo.

 Grin Grin Grin Grin Grin Grin Grin

Ah! ahora si no lo habia visto  Wink

bromeaba igualmente. saludos sr
hero member
Activity: 924
Merit: 503
December 28, 2013, 02:18:23 PM
#12
y para mi no hay nada? mira que yo soy el que trajo la biblia jajaja

a don atg le encanto  Cheesy

Justo debajo de la biblia te agradezco el esfuerzo.

Por favor si alguien se anima y quiere postear algo diferente a lo expuesto o quiere añadir alguna cuestión o ve que hay algo necesario para la total comprensión del funcionamiento del bitcoin que no dude en postear.

Una vez entendido el funcionamiento habrá que dar el salto al siguiente escalón.

 Grin Grin Grin Grin Grin Grin Grin
full member
Activity: 210
Merit: 100
設定你的目標
December 28, 2013, 02:11:49 PM
#11
y para mi no hay nada? mira que yo soy el que trajo la biblia jajaja

a don atg le encanto  Cheesy
hero member
Activity: 924
Merit: 503
December 28, 2013, 02:02:40 PM
#10
Muchas gracias aTg y elbill por las contestaciones.

 Grin Grin Grin Grin Grin Grin Grin
hero member
Activity: 952
Merit: 1005
frantorres_995 at socialmedia
December 28, 2013, 01:45:08 PM
#9
que es lo que hace que una tarjeta gráfica pueda llevar a cabo esos cálculos matemáticos que resuelven los hashes


Un CPU es la parte "ejecutiva" que toma decisiones dirigida por el software, la GPU es digamos la parte más obrera, más mecánica que solo realiza determinados cálculos, y es cientos de veces más rápida que una CPU en cuanto a esos determinados cálculos generalmente matemáticos. Por eso es capaz de resolver hashes y es mas rápida que tu CPU.

Ahora intentaré responderte a las preguntas iniciales aunque no estoy muy seguro sí es lo que preguntas porque en parte esta explicado en el post de mrgambino.


1- De donde se descarga el hash que hay que calcular?

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.

Resuelto sería 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.  

2- Como se añaden los códigos de transferencias al nuevo hash?

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.

3- Cual es el algoritmo que guarda bitcoin para calcular el hash?

Sha256... no sé si es lo que preguntas porque me parece muy sencillo, pero es ese.
aTg
legendary
Activity: 1358
Merit: 1000
December 28, 2013, 12:19:41 PM
#8
No quería postear nada porque con una busqueda en internet en un rato encuentras toda la información pero visto el nivelazo de las contestaciones de copy&paste de algunos prefiero que queden las cosas claras para el que le interesa el tema de verdad.

Cambio el orden de las respuestas para que se entienda mejor:

3. 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.

2. 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.

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.
hero member
Activity: 924
Merit: 503
December 28, 2013, 11:20:13 AM
#7
Agradezco mucho tu interes pero la info que has posteado ya la conocia, de hecho es esta misma, http://elbauldelprogramador.com/articulos/security-now-articulos/como-funciona-el-bitcoin-la-cripto-moneda/.

Lo que me interesa saber es el funcionamiento interior de la moneda, que es lo que hace que una tarjeta gráfica pueda llevar a cabo esos cálculos matemáticos que resuelven los hashes, que cálculos tengo que hacer para poder encontrar el próximo bloque a partir del actual? en definitiva responder a las preguntas planteadas en el post 1.

Saludos

 Grin Grin Grin Grin Grin Grin Grin
full member
Activity: 210
Merit: 100
設定你的目標
December 28, 2013, 03:51:17 AM
#6
A ver, vamos a intentar esclarecer la mayor parte de las dudas con un tsunami de info (y en cristiano basico  Cheesy).. Leer con paciencia que hay referencias a todas las dudas..


Hace mucho tiempo que se empezó a hablar sobre el bitcoin y su futuro como moneda digital. Bicoin fue creado por el criptógrafo Japonés "Satoshi Nakamoto" y es open source.

La idea del bitcoin es ofrecer una moneda basada en internet, con fuerza industrial, en la que se haga uso del peer-to-peer donde se pueda intercambiar dinero entre dos partes

sin necesidad de un intermediario. Esto último es uno de los mayores problemas porque..




¿Qué crea la moneda?

¿Cuanta cantidad fluye a través del sistema?

¿Cómo la monitorizas y la regulas?

¿Cómo se previene que se produzca inflación?

¿Cómo previenes que la gente cree la moneda de forma fraudulenta?

¿Cómo evitas que alguien, en caso de disponer de monedas, reutilice la misma moneda?




Todas estas preguntas se han resuelto en el sistema de una manera muy inteligente e innovadora.


Pero, ¿Cómo se inventa una moneda?

En realidad, una moneda no es más que un acuerdo entre partes que establecen que esa ‘cosa’ sintética tiene valor. Cuando el dólar se regía a los estándares del oro, la idea era que debía haber oro salvaguardando

los dólares. De manera que cuando recibías los llamados ‘pagarés’, eran equivalentes a una cantidad X de oro. El problema fue que se necesitaba más dinero del que oro se disponía, así que se dejó de salvaguardar el

dólar con el oro.


Una vez desconectada la moneda del oro, en cierta manera se tiene una moneda virtual (Dólares, Euros etc). Así pues, BitCoin tiene todos los atributos de una moneda. El concepto de bitcoin (BTC) y el sistema que

genera la moneda. Puedes dirigirte a la página de bitcoin, descargar el programa, instalarlo y empezar a generar bitcoins. Tal como suena, empiezas a generar dinero.



La forma en la que se crea dinero es mediante el procesamiento de transacciones en el sistema bitcoin. Es complicado, pero así debe ser para obtener un sistema robusto y seguro. En la FAQ de bitcoin.org

hay un PDF que escribío Satoshi describiendo el funcionamiento del sistema.
http://bitcoin.org/bitcoin.pdf



La idea es que cada usuario quiere un rastro de cada transacción que se haya producido en el sistema, y se producen transacciones todo el tiempo. A pesar de que la moneda sea virtual, se ha anclado a monedas

reales. Los bitcoin se generan cuando un nodo — Si estás ejecutando el programa, tú mismo eres un nodo — encuentra la solución a un problema complejo. Es una manera muy inteligente de generar monedas, ya

que impide que la gente pueda crear monedas a su antojo.



A modo de continuar con la explicación de cómo funciona bitcoin, hay que remontarse al año 97.



En dicho año, un tal Adam Back propuso un concepto para luchar contra el spam. Lo llamó ‘proof of work’ (Prueba de trabajo). La idea era que los spammers funcionan debido a que pueden enviar cantidades

muy grandes de emails a un coste virtual 0. No les cuesta nada enviar un email. Como consecuencia nuestras bandejas de entrada se ven inundadas con email que a nosotros nos es caro de recibir, y para ellos

enviarlos tiene un coste 0. Así que Adam dijo, ¿Y si encontramos la forma de hacer que a alguien le resulte caro enviar un email?



La forma que encontraron fue esta: Crear una carga computacional para la cual no tenemos la suficiente tecnología, en la que los spammers tengan que realizar una cantidad sustancial de trabajo a fin de validar el

email. Aquí es donde aparecen las funciones de hashing. Crear el hash de algo es una técnica valida para este concepto, ya que dado una entrada de longitud arbitrária crea el comúnmente llamado ‘digest’.

El cual tiene longitud fija. Es decir, imagina la función criptográfica SHA-256, que produce hashes de 256 bits. Para poder enviar el email, por ejemplo, se podría calcular el hash de la

cabecera de tal manera que alguno de los primeros números de los 256 sean cero. De modo que si calculas el hash de una cabecera de email aleatoria, el bit más significativo tiene una probabilidad del 50% de ser 0

ó 1. Con este método se tendría que aplicar el hash a la cabecera hasta que el primer bit sea 0 para poder enviar el email.



Pero digamos que para validar la cabecera ha de tener un hash donde los 20 primeros bits, por ejemplo, sean cero. Esto requerirá de 2*20 operaciones. La idea es que esto obliga a realizar una cantidad muy grande

 de trabajo estimando la cabecera para obtener los X primeros bits del hash a cero. En la práctica, se puede establecer la dificultad para que tome, por ejemplo, dos segundos en realizar el cálculo. Eso significaría al

spammer perder dos segundor por email, lo cual es un tiempo computacional mucho mayor de lo que les cuesta en la actualidad. El concepto de Adam no llegó a utilizarse, ya que hay servicios de envío de mails

masivos que no son spamers. Como boletines de notícias. Sin embargo Satoshi usó el concepto propuesto por Adam en el 97, implementándolo de la siguiente manera:




Imagina que entre todos los integrantes que componen el sistema, hay gente intercambiando bitcoins. Todo el sistema funciona con un sistema de claves asimétricas, en el que existe el par de claves

pública y privada. Una de las partes coge su clave pública y le asocia una cantidad de bitcoins, de igual manera, el destinatario de la transacción proporciona su clave pública. Luego, se firman con la clave privada

de cada uno.





Así se crea una transacción que solo ellos pueden haber creado ya que son los únicos que poseen sus claves privadas. Esa transacción se emite a todos los nodos de la red P2P (Peer-to-Peer). Como ésta, todas las

 transacciones que se producen en el sistema se transmiten a la red. De este modo, es muy fácil que cualquiera pueda verificar dicha transacción, ya que conocen la clave pública del firmante, pudiendo así verificar

la firma. Hecho esto, el siguiente paso es asegurarse de que dicha persona que acaba de enviar cierta cantidad de bitcoins, no pueda volver a enviarlos de nuevo. Esta es una de las tareas más difíciles de resolver.



Antes de pasar a explicar cómo se resuelve el problema de no permitir el reenvio de los mismos bitcoins, es necesario dar a conocer otro concepto.



Dentro del sistema existen bloques, que son colecciones de transacciones en la red. Siguiendo el método de Adam, aquí los bloques son una analogía a lo que era calcular el hash de la cabecera del email. Luego los

 bloques son los que requieren el trabajo computacional en el sistema bitcoin. Dicho trabajo lo proporcionan los nodos conectados a la red.



Cada bloque está enlazado con todos los anteriores mediante el hash del bloque anterior como parte del siguiente. Lo que significa que se tiene una cadena de bloques que se va moviendo hacia delante, todas

enlazadas con el hash del bloque inmediatamente anterior. Existe el denominado bloque génesis, creado el 3 de Enero del 2009. Cuando descargas el programa y lo ejecutas, éste entra en una sala IRC, de la cual

recibirá toda la historia de los bloques generados hasta el momento. Como puedes estar pensando, conforme vaya pasando el tiempo, la cadena de bloques irá aumentando en tamaño y puede exigir de una cantidad

te tiempo importante obtenerla. Sin embargo, de nuevo se resuelve otro problema muy inteligentemente. Una vez que los bloques son lo suficientemente antiguos, se comprimen, ya que no es necesario preocuparse

de ellos debido al tiempo que ha transcurrido desde que se produzco la transacción.



Conocido el concepto de la cadena de bloques, lo que hacen los nodos es competir entre todos para crear el siguiente bloque. El nodo que gana, el que realiza la cantidad de trabajo necesaria para

crear el siguiente bloque recibe 50 bitcoins.





Los nodos reciben todas las transacciones que aún no se han encapsulado en un bloque, calculan el hash de todo junto con el hash del bloque anterior. Con lo cual se está anclando dicho bloque a la cadena,

evitando así que puedas crear un bloque que no esté enlazado con el anterior. Además, existe cierta dificultad la cual consiste en encontrar un bloque con las características que se mencionaron anteriormente,

disponer de un número determinado de ceros en el hash empezando por el bit más significativo. “número de ceros debía ser 12”, actualmente van por 14. Con lo cual los nodos

intentan crear hashes con este número de ceros, cuando lo consiguen, marcan el bloque como válido y lo transmiten a la red.

Hay páginas web que permiten ver la cadena de bloques, como bitcoinchain.info o bitcoinexplorer.com, y puedes comprobar cómo los primeros 14 bits son cero, . Un ejemplo de bloque que proporcionaría 50 bitcoins

al nodo que lo calculó sería este, con el hash: 000000000000003a0e9b642d627fbfe8e07d8b946680c5dadc070dcacb754a29




Ahora bien, puede que estés preguntándote que, si todo esto es público, cualquiera puede ver cuanto dinero gastas o recibes. De nuevo, el sistema está bien pensado y es totalmente anónimo. Lo único que se sabe

 de tí es la clave pública, ésta clave es la que proporcionas al público para que realicen transacciones contigo. No hay forma conocer quién hay detrás de la clave pública. Además, puedes crear tantos pares de

claves privadas/públicas como quieras. Así que no es posible seguir la pista a una determinada clave, ya que puedes crear sin ningún problema tantas como quieras.

Como en estos momentos se puede ganar bastante dinero por el hecho de calcular los hashes, hay gente que tiene ordenadores exclusivamente dedicados a calcular hashes usando GPUs. Pero el sistema tenía

previsto esto y automáticamente va cambiando la dificultad del problema para establecer el ratio al que se genera la moneda.




En realidad, nunca jamás se crearán más de 21 millones de bitcoins (A la fecha hay 11 millones aprox.), como estaba previsto, a los 4 años de lanzarse la mitad de del total se habrían creado, de

hecho hace poco que se cumplieron los 4 añós del lanzamiento del sistema. En los proximos 4 años se crearán la mitad de la mitad, 5.250.000. De nuevo, en los siguientes 4 años a esos (Del año 8 al 12 contando

desde el lanzamiento), la mitad de 5.250.000 y así hasta completar los 21 millones. Como ves, el orden de creación de la moneda va decreciendo exponencialmente.

De esta manera se dispone de un ratio controlado de inflación dentro del sistema. Lo cual tiene sentido porque, inicialmente, conforme el sistema vaya usandose y se hagan disponibles bienes y servicios que

comercien con el sistema, se quiere que se inserte más dinero a la red para tener bitcoins con los que comerciar. Pero no quieres que se vayan creando sin cesar.




El problema sería, por supuesto, que dejaramos ese número en 21 millones para siempre y existiera una demanda mucho mayor, la tendencia sería querer más. Sin embargo, la solución es que no estás obligado a

comerciar con valores enteros de bitcoins. Puedes usar hasta 8 dígitos decimales. Lo cual permite que haya deflación con el tiempo, ya que estamos estableciendo el número total de monedas a 21 millones. Se sabe

que irá descendiendo a lo largo del tiempo, así que no importa cuanta potencia de GPUs se introduzca en el sistema. El sistema se ajusta de forma que el problema computacional a resolver sea a escala — la

dificultad escala hasta equilibrar la cantidad de potencia de procesamiento en la totalidad de la red.




Para ir terminando, lo que se ha conseguido crear con este sistema es una moneda virtual que es capaz de mantenerse por sí misma.

Para que te hagas una idea de la capacidad total de procesamiento de la red. Puedes ver estadísticas en blockchain. la fuerza total de hashing es de 10,000.00 GH/s, eso son 100 billones de

operaciones de hash por segundo.




Puedes consultar el gráfico aquí https://blockchain.info/charts/hash-rate?showDataPoints=false&show_header=true&daysAverageString=1×pan=all&scale=0&address=.



El que consigue resolver el hash gana 50 bitcoins, pero ese valor también decrece con el tiempo. Para los primeros 210.000 bloques son 50, luego va decrementando a la mitad.

Así que, el sistema está diseñado para escalar correctamente y crear una moneda segura y estable, con valor real. En el PDF que enlacé al principio, el autor habla del único ataque que podría realizarse contra el

sistema, que consistiría en spoofear la cadena de bloques, ya que es ésta la que proporciona la integridad del sistema. Sin embargo, conforme la cadena se vuelve más grande y más nodos haya, se hace

practicamente imposible que alguien con capacidad computacional masiva pueda atacar la cadena.



Si has conseguido llegar hasta aquí leyendo, espero que te haya quedado más claro cómo funciona el bitcoin.   Cheesy

P.D. el algoritmo de encriptacion se encuentra escondido en la tumba de satoshi  Cheesy
hero member
Activity: 924
Merit: 503
December 27, 2013, 09:11:46 PM
#5
Ala ya me has puesto rojo,  Cheesy

Pues si, tienes toda la razón, muchos no ponemos mucho entusiasmo en averiguar como funcionan las cosas muy en profundidad, pero creo que el bitcoin merece la pena el esfuerzo. Yo sigo indagando por la red y googleando a ver si voy encajando piezas.

La verdad es que la idea del hilo es acercar llanamente a los no instruidos en la materia, ya sea criptografia o algoritmos de seguridad y demás disciplinas.

En cuanto un par o tres de foreros ilustres e ilustrados se pasen por aquí montamos un buen debate y nos ponemos al día rápidamente.

Un abrazo David y gracias por tus palabras.

 Grin Grin Grin Grin Grin Grin Grin
hero member
Activity: 868
Merit: 1009
Dave
December 27, 2013, 08:52:13 PM
#4
Puede ser un muy buen hilo amigo LKABSVERIGE, como ya nos tienes acostumbrados.
Generalmente somos de tomar las cosas y "usarlas" sin muchos planteamientos, hablo en general, en la vida hacemos eso. No nos preguntamos mucho como funciona lo que nos rodea, solo procuramos aprender a manejalos para sacarles provecho y en algunos casos ni eso, ja ja. Por ejemplo yo nunca aprendí todas las funciones de la videograbadora (ya obsoleta), menos como funciona ja ja.
Y es verdad, no saber interpretar bien el idioma de shakespeare es una barrera.
Estaré esperando ansioso como se desarrolla este hilo.

Pd: gracias Lkabsverige por tu compromiso con el foro.
Felicidades
legendary
Activity: 1512
Merit: 1001
Bitcoin - Resistance is futile
December 27, 2013, 04:19:22 PM
#3
Reservo para seguimiento del tema Wink

Otro no acaba de entender los "intringulis" dentro del Bitcoin.
hero member
Activity: 924
Merit: 503
December 26, 2013, 05:52:51 PM
#2
Este post lo iré actualizando según se vayan posteando respuestas o se planteen otras preguntas y se respondan.

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.  Smiley

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...

 Grin Grin Grin Grin Grin Grin Grin
hero member
Activity: 924
Merit: 503
December 26, 2013, 02:23:59 PM
#1
Imagino que no seran muchos en el foro los que tengan unos conocimientos precisos de que es en su interior bitcoin, yo soy uno de los que tiene mucho que aprender todavia y en ello estamos, a ver si con la ayuda de algun buen samaritano sacamos algo en claro y en castellano.

Antes de nada agradecer a Luiscar por intentar responder a mis preguntas mediante este link https://en.bitcoin.it/wiki/Protocol_specification, pero me supera tanto el ingles como los conocimientos tecnicos que este alberga.

Imagino que habra mas gente como yo asi que lanzo aqui las cuestiones de nuevo:

1- De donde se descarga el hash que hay que calcular?

2- Como se añaden los códigos de transferencias al nuevo hash?

3- Cual es el algoritmo que guarda bitcoin para calcular el hash?

Si hay algún error y las preguntas no son correctas, pues lo siento pero parto de cero así que no seáis muy duros.

Bueno un saludo.

 Grin Grin Grin Grin Grin Grin Grin
Jump to: