我目前正在用java中的ECDSASignature规范进行签名,但是我注意到从签名中获取v值是ethereum的自定义规范。
我的代码:
public static void main(String[] args) throws Exception
{
byte[] offer = {
0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
};
System.out.print(getAgreementFromAdmin(offer));
}
//TODO port to android
//TODO get v value
private static JSONObject getAgreementFromAdmin(byte[] offer) throws Exception
{
//no need for address, from ecrecover you can take the token.
System.out.println("offer: " + offer.length);
// sign() returns r, s but not v
// org.web3j.crypto.ECDSASignature
ECDSASignature signature = TransactionQueue.getAdminKeyPair().sign(offer);
BigInteger r = signature.r;
BigInteger s = signature.s;
int v = 27; // minimum value of v, if not working try with 28
JSONObject agreementJSON = new JSONObject();
agreementJSON.put("offer", "0x" + bytesToHex(offer));
agreementJSON.put("v", v);
agreementJSON.put("r", r);
agreementJSON.put("s", s);
return agreementJSON;
}符号方法被定义为:
public ECDSASignature sign(byte[] transactionHash) {
ECDSASigner signer = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest()));
ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(privateKey, Sign.CURVE);
signer.init(true, privKey);
BigInteger[] components = signer.generateSignature(transactionHash);
return new ECDSASignature(components[0], components[1]).toCanonicalised();
}发布于 2018-01-15 11:41:09
发布于 2018-01-10 17:36:33
要计算v,您需要知道对应于r的y坐标,您可能需要访问库的内部。
请看这个问题R,S,V ECDSA数据包签名
R是曲线上点的x坐标的函数。X坐标可以对应于椭圆曲线上的2y坐标,椭圆曲线在x轴上是对称的。V指定使用两个y坐标中的哪个来帮助进行公钥验证。
https://ethereum.stackexchange.com/questions/35481
复制相似问题