从ethers.js和secp256k1中相同的私钥中,我得到相同的eth地址。但是如果我在一条消息上签名,我会在ethers.js中得到一个不同的(错误)签名。我的密码怎么了?
import { createKeyPair, sign } from '@erebos/secp256k1'
import { pubKeyToAddress } from '@erebos/keccak256'
import { ethers, Wallet } from 'ethers';
async function testsig(message){
// ethers:
var ethersprivateKey = '0x0123456789012345678901234567890123456789012345678901234567890123';
var etherswallet = new ethers.Wallet(ethersprivateKey);
console.log(etherswallet.address)
//0x14791697260E4c9A71f18484C9f997B308e59325
var s_ethers= await etherswallet.signMessage(message)
console.log( ethers.utils.arrayify(s_ethers) )
//int8Array(65) [166, 122, 63, 76, 122, 170, 175, 139, 106, 144, 156, 80, 245, 237, 145, 126, 24, 132, 20, 93, 157, 42, 208, 8, 158, 115, 23, 196, 253, 183, 157, 249, 8, 20, 82, 203, 147, 90, 139, 78, 10, 22, 10, 133, 199, 161, 228, 217, 234, 204, 197, 207, 9, 37, 149, 16, 151, 230, 159, 30, 25, 171, 24, 176, 27]
// secp256k1:
var secp256k1privateKey = '0123456789012345678901234567890123456789012345678901234567890123';
let secp256k1keyPair = createKeyPair(secp256k1privateKey);
const secp256k1user = pubKeyToAddress(secp256k1keyPair.getPublic('array'))
console.log(secp256k1user)
//0x14791697260e4c9a71f18484c9f997b308e59325
var s_secp256k1=sign(message, secp256k1keyPair)
console.log( s_secp256k1)
//(65) [93, 182, 197, 217, 33, 175, 143, 115, 43, 243, 207, 2, 160, 182, 26, 117, 218, 181, 239, 132, 22, 133, 182, 155, 86, 25, 151, 186, 76, 167, 48, 228, 23, 78, 253, 193, 86, 243, 164, 96, 149, 68, 209, 43, 122, 6, 186, 68, 147, 74, 110, 71, 175, 197, 222, 132, 208, 223, 168, 84, 46, 81, 141, 73, 1]
}
testsig("abc")发布于 2020-09-24 18:51:04
Ethers.js在签名前以\x19Ethereum Signed Message:\n<message length>作为签名的前缀,并对消息的散列进行签名。这相当于personal_sign JSON方法。要将Ethers.js的行为与secp256k1库相匹配,您必须:
e获取消息( Keccak256(message) )的散列。e,使用Keccak256("\x19Ethereum Signed Message:\n32" + e)。我们可以在这里硬编码32长度,因为Keccak-256散列总是32字节(= 256位)长。签名{r, s, v}应该是一个有效的Ethereum签名,其中r和s分别是前32个字节和第二个32个字节,v是最后一个字节(也称为恢复ID)。请注意,您可能必须将27添加到v参数中,才能获得27或28的v (如Ethereum所用)。
https://ethereum.stackexchange.com/questions/87743
复制相似问题