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. Gere a chave pública da 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 . 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 . https://github.com/cslashm/ECPy 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 Gere chave privada com python e cara ou coroa ou dados 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 se você for novo no assunto. a aleatoriedade criptograficamente segura 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. Matemática: Sobre secp256k1: Chave pública da chave privada Já existe muito material on-line descrevendo como é a adição de curvas , portanto, vamos descrevê-lo em um nível inferior aqui. visualmente A forma da curva 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 não deve ser confundido com a da curva. Nem todo valor 0 < n < p satisfaz a equação acima. No entanto, as operações na curva são garantidas como . Ou seja, se dois pontos válidos forem somados ou multiplicados, o resultado será um número válido na curva. p ordem fechadas O ponto de partida 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 é criado (essa é a chave secreta). O ponto G é adicionado a si mesmo vezes e o novo ponto (x, y) é a chave pública. Não é possível derivar de G. s s s 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. Saber mais Confira nosso avançado hoje e torne-se um desenvolvedor de blockchain que conhece as coisas difíceis que outros codificadores não conhecem. bootcamp de blockchain Publicado também . aqui