我有一个软件系统,其中签名ETH事务发生在黑匣子中。我给出所需的信息,它会返回给我一个数字签名(30倍
现在我知道了签名V值,对于EIP-155事务来说,它以前是recId + (2 * chainId + 35)。我用以下代码使用web3.js和@ethereumjs/tx库确定了这一点:
const ethAddress = '0x123ba3f3.....3a4f1d8';
ethjsTx.v = recId + 35 + 2 * chainId;
const rawTx = ethjsTx.serialize().toString(16);
const recoveredAddress = this.web3.accounts.recoverTransaction(rawTx);
return recoveredAddress === ethAddress;我只需对两个不同的recId值(0,1)重复此操作,直到返回true为止,然后我将知道V-值。
对于EIP-1559,chainId不再与V值相关.V就是签名的Y-奇偶。现在我的问题是如何从一个更好的签名中找出这个Y值。
在这个存储库@第290行中:
https://github.com/ethereum/go-ethereum/blob/master/crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h
是以下代码:
if (recid) {
/* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log
* of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria.
*/
*recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0);
}他们检查r.y是否是奇数,这是我需要的值。问题是,我的R是一个32字节的十六进制,而在该代码中,r是一个具有独立y属性的对象。我的问题是:
const ethAddress = '0x123ba3f3.....3a4f1d8';
ethjsTx.v = 0 or 1;
const rawTx = ethjsTx.serialize().toString(16);
const recoveredAddress = this.web3.accounts.recoverTransaction(rawTx);
return recoveredAddress === ethAddress;然后用这个代替?只是有点低效。
发布于 2022-01-20 15:55:22
我在寻找一些方法来直接获得Y-平价,而不是在事实发生后恢复它。在发布了这个问题之后进行了一些研究,特别是在本文中:
我还问了一个关于密码栈交换的问题,得到了一个明确的答案:
很明显,R和S是用几个不同的数值计算出来的。其中一个值是椭圆曲线上随机选取的点的X坐标.这个随机选取的点也有一个Y坐标,但在计算中没有用到它。不过,这一点是我们需要的。但是要提取它,您需要修改签名代码来返回这个y-奇偶点,这在我的例子中是不值得的。也许,如果你想要微观优化,你可以采取这一行动方针。
在此基础上,Ethereum的“黄色文件”指定了实体中使用的erecover()函数,用于检查签名对于给定的发送地址是否有效。因此,从签名的事务中提取地址是有意的行为,因此,我认为我原来的方法,即尝试0和1并检查公钥,对我来说已经足够好了。
https://ethereum.stackexchange.com/questions/118931
复制相似问题