I'm trying to sign my raw transaction and each time I'm getting a different signature (r, s). Please help me how to sign transactions properly in C++ OpenSSL. I'm trying the following way but Etherscan doesn't push this transaction because of invalid sender or insufficient funds (I'm sure this is because the signature is invalid). I have a NodeJs example that calculates signatures and for one hash it generates the same signature each time. And one more question - how to get a RecoveryID from the signature to set V variable properly? Thank you


const unsigned char* privKey = /* Private Key 32 bytes */;
const char* rlpTx = /* nonce, gas limit etc encoded to RLP */;

const uint8_t c_chainID = 1; // Mainnet

BIGNUM* bn  = BN_bin2bn(privKey, 32, nullptr);
EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp256k1);

EC_KEY_set_private_key(key, bn);

unsigned char* hash = nullptr;
int size = 0;

Keccak256::calcHash(rlpTx, hash, &size);

ECDSA_SIG* sign = ECDSA_do_sign(hash, key);

unsigned char* r = new unsigned char[BN_num_bytes(sign->r)];
unsigned char* s = new unsigned char[BN_num_bytes(sign->s)];
uint8_t        v = c_chainID * 2 + 35;

BN_bn2bin(sign->r, r);
BN_bn2bin(sign->s, s);


delete[] s;
delete[] r;
  • Are you using a library for RLP encoding?
    – onepix
    Feb 3 '20 at 16:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.