¿Con qué frecuencia debo llamar a getblocktemplate?

Estoy construyendo un cliente Bitcoin básico en C# para comprender mejor el protocolo de minería. Necesito ayuda para entender Getblocktemplate. He leído la wiki de Getblocktemplate, pero todavía tengo problemas para entender el protocolo. El wiki dice "Dado que está haciendo todos los bloques usted mismo, realmente nunca necesita obtener otra plantilla ... hasta que no sea válida". ¿Cuándo se considera que la plantilla no es válida? ¿Con qué frecuencia debo llamar a Getblocktemplate? Si se extrae un bloque nuevo cada 10 minutos, con algunas monedas cada 1 minuto, ¿debo llamar a Getblocktemplate cada 10 minutos (1 minuto dependiendo de la moneda) para tener el último "hash de bloque anterior"?

Los pasos que estoy usando:

  1. Realice una llamada rpc al servidor bicoind para Getblocktemplate.

  2. Analice los datos y cree una raíz Merkle.

  3. Cree un encabezado de bloque (versión, anteriorblockhash, merkleroot, curtime, bits, nonce).

  4. Obtenga un hash de encabezado. headerHash = Hash(versión, anteriorblockhash, merkleroot, curtime, bits, nonce).

  5. Repita el paso 4 en incrementos de 2^32 de nonce.

  6. Entiendo que luego puedo incrementar el "tiempo de ejecución" (¿que no tiene que ser preciso?), así que incremente el tiempo de ejecución y luego repita el paso 5.

¿Es esto correcto?

¿Cuánto tiempo puedo seguir incrementando el "tiempo de ejecución" antes de tener que volver a llamar a getblocktemplate?

¿En qué momento necesito un nuevo bloque (es decir, un nuevo hash de bloque anterior y una nueva raíz de merkle)?

Respuestas (2)

Una forma fundamental y esperada de invalidar una plantilla válida: alguien más encuentra un bloque y es hora de cambiar.

Técnicamente, puede seguir incrementando el "tiempo de atención" hasta que sean 2 horas en el futuro, aunque mi instinto me dice que debería tratar de evitar empujar el "tiempo de atención" en cualquier lugar cercano a ese futuro hasta que haya agotado todo lo demás. No he pasado demasiado tiempo investigando GBT, pero debería poder hacer al menos algunos cambios en los datos de la base de monedas en la transacción de generación (probablemente no tendrá total libertad, ya que supongo que hay una manera de el grupo para obligar a cosas como /P2SH/ a aparecer allí, por ejemplo) para obtener una raíz de Merkle diferente. La gente a menudo llama a esto " extranonce ".

En cuanto a cuándo debe solicitar una nueva plantilla, inmediatamente después del lugar que citó en el wiki de bitcoin , dice esto:

Si su plantilla incluía una clave "longpollid", puede poner en cola una solicitud para que se ejecute una nueva plantilla tan pronto como el grupo decida que debe cambiar. Esto es lo mismo que cualquier otra solicitud de plantilla, excepto que incluye el parámetro "longpollid" que el grupo proporcionó en su solicitud. Si ya hay una nueva plantilla, el grupo puede responder de inmediato, ¡así que asegúrese de no depender de un retraso!

En otras palabras, debería poder realizar una solicitud de "encuesta larga" que no devolverá ningún dato hasta que el servidor del grupo decida por usted que es hora de una nueva plantilla. Definitivamente no debe confiar en adivinar que el "intervalo de bloque deseado" debería ser lo suficientemente bueno.

Para agregar a la respuesta de Joe:

"Se mina un bloque cada 10 minutos" es un malentendido. Los bloques se encuentran al azar y se puede encontrar uno nuevo en cualquier momento. Podrían ser 3 segundos después del último, o 3 horas. 10 minutos es un objetivo; el plan es que, en una gran cantidad de bloques, el tiempo promedio entre ellos se acerque a los 10 minutos. Pero esto no te dice nada sobre ningún bloque individual. Entonces, si no tiene una encuesta larga, querrá solicitar una nueva plantilla con mucha más frecuencia, tal vez cada pocos segundos.