def _pack_v5(cmd_id: int, payload: Tuple[Any, ...], privkey: datatypes.PrivateKey) -> bytes: """Create and sign a discovery v5 UDP message to be sent to a remote node.""" cmd_id = to_bytes(cmd_id) encoded_data = cmd_id + rlp.encode(payload) signature = privkey.sign_msg(encoded_data) return signature.to_bytes() + encoded_data
def as_signed_transaction(self, private_key: PrivateKey) -> 'TypedTransaction': message = self.get_message_for_signing() signature = private_key.sign_msg(message) y_parity, r, s = signature.vrs signed_transaction = DynamicFeeTransaction( self.chain_id, self.nonce, self.max_priority_fee_per_gas, self.max_fee_per_gas, self.gas, self.to, self.value, self.data, self.access_list, y_parity, r, s) return LondonTypedTransaction(self._type_id, signed_transaction)
def _pack(cmd_id: int, payload: List[Any], privkey: datatypes.PrivateKey) -> bytes: """Create and sign a UDP message to be sent to a remote node. See https://github.com/ethereum/devp2p/blob/master/rlpx.md#node-discovery for information on how UDP packets are structured. """ cmd_id = to_bytes(cmd_id) expiration = rlp.sedes.big_endian_int.serialize(int(time.time() + EXPIRATION)) encoded_data = cmd_id + rlp.encode(payload + [expiration]) signature = privkey.sign_msg(encoded_data) message_hash = keccak(signature.to_bytes() + encoded_data) return message_hash + signature.to_bytes() + encoded_data
def as_signed_transaction(self, private_key: PrivateKey) -> 'TypedTransaction': message = self.get_message_for_signing() signature = private_key.sign_msg(message) y_parity, r, s = signature.vrs signed_transaction = AccessListTransaction(self.chain_id, self.nonce, self.gas_price, self.gas, self.to, self.value, self.data, self.access_list, y_parity, r, s) return TypedTransaction(self._type_id, signed_transaction)
def _pack_v4(cmd_id: int, payload: Sequence[Any], privkey: datatypes.PrivateKey) -> bytes: """Create and sign a UDP message to be sent to a remote node. See https://github.com/ethereum/devp2p/blob/master/rlpx.md#node-discovery for information on how UDP packets are structured. """ cmd_id_bytes = to_bytes(cmd_id) encoded_data = cmd_id_bytes + rlp.encode(payload) signature = privkey.sign_msg(encoded_data) message_hash = keccak(signature.to_bytes() + encoded_data) return message_hash + signature.to_bytes() + encoded_data
def test_playbet(): lastBlock = 100 reveal = 99 commitLastBlock = unhexlify('%010x' % lastBlock) # 和uint40对应 commit = keccak(unhexlify('%064x' % reveal)) print('0x' + commit.hex()) privateKey = unhexlify( 'dbbad2a5682517e4ff095f948f721563231282ca4179ae0dfea1c76143ba9607') # r, s, v, sig = ecsign(h, privateKey) # sig = new_sign(privkey=privateKey, msg_hash=h) pk = PrivateKey(privateKey, CoinCurveECCBackend) sig = pk.sign_msg(message=commitLastBlock + commit) # return sig print('"0x' + sig.to_bytes()[:32].hex() + '"') print('"0x' + sig.to_bytes()[32:-1].hex() + '"') print(sig.to_bytes()[-1]) pass
def create_transaction_signature(unsigned_txn: BaseTransaction, private_key: datatypes.PrivateKey, chain_id: int = None) -> VRS: transaction_parts = rlp.decode(rlp.encode(unsigned_txn)) if chain_id: transaction_parts_for_signature = ( transaction_parts + [int_to_big_endian(chain_id), b'', b'']) else: transaction_parts_for_signature = transaction_parts message = rlp.encode(transaction_parts_for_signature) signature = private_key.sign_msg(message) canonical_v, r, s = signature.vrs if chain_id: v = canonical_v + chain_id * 2 + EIP155_CHAIN_ID_OFFSET else: v = canonical_v + V_OFFSET return VRS((v, r, s))
b'\x12\x34\x56\x78\x12\x34\x56\x78\x12\x34\x56\x78\x12\x34\x56\x78' b'\x12\x34\x56\x78\x12\x34\x56\x78\x12\x34\x56\x78\x12\x34\x56\x78') pby = PrivateKey( b'\x23\x45\x67\x89\x23\x45\x67\x89\x23\x45\x67\x89\x23\x45\x67\x89' b'\x23\x45\x67\x89\x23\x45\x67\x89\x23\x45\x67\x89\x23\x45\x67\x89') content = [ json.dumps({ "from": "0x12345678", "to": "0x87654321", "data": "..." }, sort_keys=True).encode('utf-8'), b'\x01', b'\x02', b'\x03' ] print("time used: ", time.time() - beg) signaturex = [ pbx.sign_msg(ETHSIGN_HEADER + b'\x33\x32' + keccak(rlp.encode([content, []]))).to_bytes(), pbx.public_key.to_address() ] rlped_datax = rlp.encode([content, [signaturex]]) attex = Attestation.create_attestation(content, signaturex) print("time used: ", time.time() - beg) # print(attex.content, attex.signatures) # print(attex.encode() == rlped_datax) attex.sign_and_encode([ pby.sign_msg(ETHSIGN_HEADER + b'\x33\x32' + attex.hash()), pby.public_key.to_address() ]) rlped_datay = attex.encode() attey = Attestation(rlped_datay) # print(attey.content, attey.signatures) # print(attey.encode() == rlped_datay)
def ecdsa_sign(private_key: bytes, message: bytes) -> bytes: signer = PrivateKey(private_key) return signer.sign_msg(message).to_bytes()