#!/usr/bin/python3 # Eth ECDSA key generator for web3 hacking # Author: six # require(owner() == ecrecover(keccak256(abi.encodePacked(this, tokenId)), v, r, s), "Should be signed correctly"); # https://privatekeys.pw/keys/ethereum/1 from web3.auto import w3 from eth_account.messages import encode_defunct #def sign_mint(): msg = "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf" msg = "1" msg = "1659023558XXX" # unix time private_key = "0000000000000000000000000000000000000000000000000000000000000001" # <- hex | pub -> 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf message = encode_defunct(text=msg) signed_message = w3.eth.account.sign_message(message, private_key=private_key) print("Public key: 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf") print("Private key: 0000000000000000000000000000000000000000000000000000000000000001") print(msg) print("Signed message: ") #print(type(signed_message)) print(signed_message) print("\n Recovered message: ") print(w3.eth.account.recover_message(message, signature=signed_message.signature)) #sign_mint() from web3 import Web3 # ecrecover in Solidity expects v as a native uint8, but r and s as left-padded bytes32 # Remix / web3.js expect r and s to be encoded to hex # This convenience method will do the pad & hex for us: def to_32byte_hex(val): return Web3.toHex(Web3.toBytes(val).rjust(32, b'\0')) ec_recover_args = (msghash, v, r, s) = ( Web3.toHex(signed_message.messageHash), signed_message.v, to_32byte_hex(signed_message.r), to_32byte_hex(signed_message.s),) print("\n Recovered args (msghash, v, r, s):") print(ec_recover_args) # https://privatekeys.pw/keys/ethereum/1 # https://web3py.readthedocs.io/en/stable/web3.eth.account.html?highlight=sign#sign-a-message # w3.eth.account.recover_message(message, signature=signed_message.signature) #'0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E' from flask import Flask, request app = Flask(__name__) @app.route('/') def hello(): return 'Lets play a game... move to /verify and ? is the private key if: ' @app.route('/verify', methods=['GET']) def search(): args = request.args args.get("v", default="", type=str) print(args) #0000000000000000000000000000000000000000000000000000000000000001 return args #if __name__ == '__main__': # app.run(debug=False)