Monedero determinista y generación de direcciones

Tengo una billetera ledger nano hd y utilicé activamente el complemento de Google Chrome para recibir algunas transacciones. Después de eso, vinculé la billetera HD a mi aplicación de tableta mycelium.

Si recibo más transacciones usando la aplicación para tableta, ¿cómo puede el complemento de Chrome permanecer sincronizado y crear una nueva dirección pública desde el punto de inicio correcto?

¿Cómo pueden varias instancias de carteras deterministas que se refieren a la misma cartera saber por dónde empezar a crear nuevas direcciones?

Supongo que no se sincronizan y la reutilización de direcciones parece inevitable.

Supongo que HD ledger nano usa una billetera determinista

Respuestas (2)

Aquí hay una respuesta de KISS.

The Ledger utiliza la tecnología BIP 32, 39, 44 al igual que muchos otros dispositivos de cartera de hardware similares, por ejemplo, Trezor, Keepkey. Debería tener la libertad de usar su billetera de hardware en múltiples implementaciones de software genéticamente independientes en la misma computadora o en varias computadoras con interfaces USB.

Funciona simplemente porque cada aplicación de billetera puede reconstruirse cada vez que se instancia como proceso o subproceso. Usando una semilla de billetera HD (típicamente 12, 15 o 24 BIP 39 palabras), una aplicación de billetera HD consulta efectivamente con un nodo completo (existe localmente o remotamente cuando se usa la tecnología SPV) y alterna secuencialmente a través de un conjunto de índices BIP 44 enteros hasta que no vea más publicaciones de transacciones relacionadas algorítmicamente en una cadena de bloques o se puedan detectar transacciones pendientes relacionadas en el grupo de transacciones de la cadena de bloques. Algunas billeteras web HD sin estado (p. ej., mytrezor.com puede lograrlas) tenderán a hacer esto y se iniciarán más lentamente, mientras que otras aplicaciones de billetera HD con estado (p. ej., Electrum) guardarán el estado localmente y se iniciarán más rápido.

Bueno, es una billetera determinista. Existe una función f que por cada n∈ℕ devuelve la n-ésima dirección que se producirá.

Una dirección es básicamente un hash de una clave pública (podemos ignorar el resto que la compone, pero también es determinista).

Puede obtener una clave pública de una clave privada de forma determinista.

Cada número de 256 bits es una clave privada.

Entonces, su billetera solo necesita hacer números de 256 bits de manera determinista y hacer cálculos para llegar a las direcciones de manera determinista.

Esto se puede hacer fácilmente eligiendo una función hash que genere 256 bits (elijamos sha256) y una sal λ. Una sal es solo algo que se agrega a la entrada de una función hash.

Si su billetera conoce λ, puede generar una cantidad prácticamente arbitraria de direcciones de bitcoin.

g(n) para cada n∈ℕ se puede definir como g(n) := sha256sum(λ.n) donde .es el operador de concatenación. g(n) es la enésima clave privada.

Si usa una computadora con Linux, simplemente abra la terminal y escriba:

echo "aR3Ba9raAi1" | sha256sum
echo "aR3Ba9raAi2" | sha256sum
echo "aR3Ba9raAi3" | sha256sum
echo "aR3Ba9raAi4" | sha256sum
echo "aR3Ba9raAi5" | sha256sum
echo "aR3Ba9raAi6" | sha256sum
.
.
.

aR3Ba9raAies λ. El último dígito del parámetro echoobtenido es n pero, por supuesto, puede tener más de 1 dígito.

A través de la salida obtienes:

g(1) = 49fc13b53bf8cbc8607c121066a974f5c803aee04629e11696946f93b16825a6
g(2) = 9462e18f435684eb8bf5008f8e7c717729fbfa505554ef4b3325a3eccc807519
g(3) = d7bde9e8c19959b0abaa5c476a3fc7a4eacf713fe78c9e2a66ac202419ddbf6f
g(4) = d08ddf753bb37b853407f1451334bb042d93ee2179c01244a019229a32fe9c03
g(5) = 4291513728b1a0d96b72df35bafa1f78db1ceaf135d874a3d8e5353aa9408893
g(6) = e04aba61558daaa532d252397e5d5467c8dd64552f987e54245ab759dd0517cb
.
.
.

Esas serían las claves privadas. Son los mismos en todas las máquinas siempre que λ permanezca igual. No es necesario entre sus máquinas después de que todas sepan λ. g(n) es determinista y también lo es todo lo demás en la forma de generar una dirección. Entonces f(n) se puede calcular a partir de g(n).

Por supuesto, ese es solo un ejemplo para mostrarle el principio básico detrás de la generación de direcciones deterministas. Está muy simplificado y se omiten los pasos principales para generar direcciones. Esta respuesta solo debería mostrarle que algo se puede calcular de la misma manera en diferentes máquinas sin necesidad de que puedan comunicarse entre sí.

Esto también es genial porque todo lo que necesitas para recuperar una billetera HD es una semilla. No necesita el historial completo de lo que se generó a partir de la semilla porque se puede generar exactamente de la misma manera nuevamente.

Entonces, si, como mencionó el OP, usa una billetera de hardware. ¿Cómo sabe el software de la billetera cómo generar estas direcciones si ya no tiene acceso a la clave privada? Otra forma de preguntar: si nunca volvió a conectar la billetera de hardware a la computadora, ¿el software de la billetera aún podría crear nuevas direcciones?
"si ya no tiene acceso a la clave privada" ¿Qué quieres decir con eso? Una billetera HD crea una cantidad prácticamente arbitraria de claves privadas. Esos son los valores de retorno de la función g en mi respuesta. Las diferentes billeteras solo necesitan el mismo λ. "Si nunca volviera a conectar la billetera de hardware a la computadora, ¿el software de la billetera aún podría crear nuevas direcciones?" Sí. Y podrían crear exactamente las mismas direcciones que la instancia de la billetera HD en la mesa de @Gianluca en una computadora diferente. La billetera HD produce más direcciones hasta que encuentra algunas que no se han utilizado.
Si esto responde a su pregunta, haga clic en la marca del lado izquierdo para mostrar que esta pregunta ha sido respondida.
En realidad no. Probablemente es mi inglés roto. Tengo dos aplicaciones vinculadas en la misma billetera hd. Creo una nueva dirección de recepción en la primera. Si ahora voy a la segunda aplicación y pido una nueva dirección de recepción, obtengo la anterior, ¿no es así? Básicamente estoy reutilizando la misma dirección
Ese es el caso si las billeteras no buscan en la cadena de bloques o preguntan a un servidor si ya se ha utilizado una determinada dirección. Luego tienen un contador interno que guarda su n actual. La dirección que le dará la billetera es f(n+1) e incrementará su n en uno. La otra billetera, sin embargo, no lo sabe. Produce la misma dirección para su n que no se ha incrementado, por lo que se produce la misma dirección dos veces. Hay monederos que solucionan esto, por ejemplo Electrum. Electrum pregunta a un servidor si se ha utilizado una dirección e incrementa su n hasta que se encuentra una sin usar.
Por "ya no tiene acceso a las claves privadas" quiero decir exactamente eso. Mi entendimiento de cómo funcionaba una billetera de hardware (como trezor) es que contenía las claves privadas y nunca las comparte con la billetera de software (como electrum). Puedo ver que mientras la billetera de hardware está conectada, la billetera de software puede solicitar una cantidad de direcciones. Pero después de desconectar la billetera de hardware, ¿cómo puede la billetera de software generar nuevas direcciones sin las claves privadas? ¿Supongo que no puede?