public void ECDsaSign(string currency, BigInteger privateKey) { int chainId = GetChainId(currency); m_v = new BigInteger(chainId); m_r = new BigInteger(0); m_s = new BigInteger(0); byte[] e = BouncyCastle.Keccak(EncodeRLP()); byte[] sig = EllipticCurve.ECDsaSignHash(privateKey, e); BigInteger publicKeyX; BigInteger publicKeyY; BouncyCastle.ECPrivateKeyToPublicKey(privateKey, out publicKeyX, out publicKeyY); int recoveryId = BouncyCastle.ECCalcRecoveryId(sig.Take(32).ToArray(), sig.Skip(32).ToArray(), e, publicKeyX, publicKeyY); m_v = new BigInteger(chainId * 2 + 35 + recoveryId); m_r = Encode.BytesToBigInteger(sig.Take(32).ToArray()); m_s = Encode.BytesToBigInteger(sig.Skip(32).ToArray()); }