Um endereço ethereum são os últimos 20 bytes do keccack256 da chave pública. O algoritmo de chave pública é o secp256k1, o mesmo usado no bitcoin.
Por ser um algoritmo de curva elíptica, a chave pública é um par (x, y) que corresponde a um ponto na curva elíptica.
A chave pública é a concatenação de x e y, e é dela que extraímos o hash.
O código é fornecido abaixo.
from ecpy.curves import Curve from ecpy.keys import ECPublicKey, ECPrivateKey from sha3 import keccak_256 private_key = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 cv = Curve.get_curve('secp256k1') pv_key = ECPrivateKey(private_key, cv) pu_key = pv_key.get_public_key() # equivalent alternative for illustration: # concat_x_y = bytes.fromhex(hex(pu_key.Wx)[2:] + hex(pu_key.Wy)[2:]) concat_x_y = pu_key.Wxto_bytes(32, byteorder='big') + pu_key.Wyto_bytes(32, byteorder='big') eth_addr = '0x' + keccak_256(concat_x_y).digest()[-20:].hex() print('private key: ', hex(private_key)) print('eth_address: ', eth_addr)
A biblioteca ecpy está aqui https://github.com/cslashm/ECPy . Esta biblioteca implementa a matemática da curva elíptica em python, então não será tão rápida quanto um wrapper em torno da implementação bitcoin C, que é usada pela biblioteca coincurve .
No entanto, a implementação do python permite que você veja passo a passo a matemática da curva elíptica usada para derivar a chave pública.
Você pode usar este código para gerar um endereço virtual ethereum com força bruta, mas lembre-se de que, se sua fonte de aleatoriedade não for segura ou tiver aleatoriedade insuficiente, você poderá ser vítima de um hack semelhante a este .
Você mesmo pode gerar um endereço Ethereum a partir de uma chave privada jogando uma moeda 256 vezes e escrevendo em uma string um 1 se for cara e 0 se for coroa.
Digamos que você obtenha o seguinte resultado
result = b'1100001011001101010001001100101000001111101101111011001000110001101100011101101011010001011000101111100110010101001001101110111011001000100001010101111100001100100110010010111110110100000010011111100000110101001110000101100101011111001101010001100001000'
Você pode converter isso em uma chave privada usando o seguinte código python
# 2 means base 2 for binary private_key = hex(int(result, 2)) # private key is 0x1859a89941f6f646363b5a2c5f32a4ddd910abe19325f6813f06a70b2be6a308
Em seguida, insira essa chave privada no código da seção acima e você gerou seu endereço com sua própria aleatoriedade.
A mesma coisa pode ser realizada mais rapidamente jogando um dado de 16 lados 64 vezes e escrevendo a sequência hexadecimal que é produzida caractere por caractere. Esteja ciente de que a maioria dos dados não tem uma representação para o número zero, então você terá que subtrair 1 de cada resultado.
Se você tiver apenas seis lados tradicionais, poderá escrever uma string na base 6 (não se esqueça de subtrair 1 de cada rolo) e fazer uma conversão de base para binário. Você precisará continuar rolando até ter pelo menos 256 bits para sua chave privada. Se você é particularmente paranóico com a aleatoriedade, pode usar dados de nível de cassino.
Seja cauteloso ao usar a biblioteca de números aleatórios integrada para Python. Não se destina a ser criptograficamente seguro. Recomendamos familiarizar-se com a aleatoriedade criptograficamente segura se você for novo no assunto.
Geralmente, você não pode inicializar uma carteira de hardware usando este método porque a frase de recuperação de 24 palavras que eles usam não é a mesma coisa que uma chave privada usada para assinar transações. A frase de recuperação de 24 palavras é usada para derivar várias chaves privadas para diferentes tipos de criptografia que a carteira possui.
Já existe muito material on-line descrevendo como é visualmente a adição de curvas , portanto, vamos descrevê-lo em um nível inferior aqui.
Secp256k1 define a forma da curva elíptica y^2 = x^3 + y (mod p) onde p é o número primo 115792089237316195423570985008687907853269984665640564039457584007908834671663
ou 2^256 – 2^32 – 977
O primo p não deve ser confundido com a ordem da curva. Nem todo valor 0 < n < p satisfaz a equação acima. No entanto, as operações na curva são garantidas como fechadas . Ou seja, se dois pontos válidos forem somados ou multiplicados, o resultado será um número válido na curva.
O outro parâmetro importante em secp256k1 é o ponto inicial G. Como G é um ponto na curva elíptica, ele é bidimensional e tem os parâmetros
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
Para ver que G é um ponto válido, podemos inserir os números em python
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424 p = 115792089237316195423570985008687907853269984665640564039457584007908834671663 assert pow(y, 2, p) == (pow(x, 3) + 7) % p
Para criar um par de chaves pública/privada, um número aleatório s é criado (essa é a chave secreta). O ponto G é adicionado a si mesmo s vezes e o novo ponto (x, y) é a chave pública. Não é possível derivar s de G.
Adicionar G a si mesmo s vezes é o mesmo que multiplicar s * G. Na verdade, podemos ver essa operação em um nível inferior removendo algumas das abstrações que a biblioteca está fornecendo.
from ecpy.curves import Curve from sha3 import keccak_256 private_key = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 cv = Curve.get_curve('secp256k1') pu_key = private_key * cv.generator # just multiplying the private key by generator point (EC multiplication) concat_x_y = pu_key.x.to_bytes(32, byteorder='big') + pu_key.y.to_bytes(32, byteorder='big') eth_addr = '0x' + keccak_256(concat_x_y).digest()[-20:].hex() print('private key: ', hex(private_key)) print('eth_address: ', eth_addr)
A chave pública é simplesmente a chave privada multiplicada pelo ponto G na curva elíptica secp256k1. É isso.
Confira nosso bootcamp de blockchain avançado hoje e torne-se um desenvolvedor de blockchain que conhece as coisas difíceis que outros codificadores não conhecem.
Publicado também aqui .